commit b484e522e82c38a066be18e40269a0c530b2a71c Author: 6543 <6543@obermui.de> Date: Wed Jul 17 22:08:50 2019 +0200 import v1.0.0-RC4 | 2009-05-20 diff --git a/Acl.php b/Acl.php new file mode 100755 index 0000000..0b4631e --- /dev/null +++ b/Acl.php @@ -0,0 +1,111 @@ +addRole(new Zend_Acl_Role(User::ROLE_GUEST)) + ->addRole(new Zend_Acl_Role(User::ROLE_REGISTERED), User::ROLE_GUEST) + ->addRole(new Zend_Acl_Role(User::ROLE_ADMIN), User::ROLE_REGISTERED); + +/************************** +* ACTION CONTROLLER PRIVILEGES +* +* format: $privileges[module][controller][action] = role; +**************************/ +$privileges['default']['index']['index'] = User::ROLE_GUEST; +$privileges['default']['identity']['index'] = User::ROLE_GUEST; +$privileges['default']['identity']['id'] = User::ROLE_GUEST; + +$privileges['default']['error']['error'] = User::ROLE_GUEST; + +$privileges['default']['openid']['provider'] = User::ROLE_GUEST; +$privileges['default']['openid']['login'] = User::ROLE_GUEST; +$privileges['default']['openid']['authenticate'] = User::ROLE_GUEST; +$privileges['default']['openid']['trust'] = User::ROLE_GUEST; + +$privileges['default']['sites']['index'] = User::ROLE_REGISTERED; +$privileges['default']['sites']['list'] = User::ROLE_REGISTERED; +$privileges['default']['sites']['deny'] = User::ROLE_REGISTERED; +$privileges['default']['sites']['allow'] = User::ROLE_REGISTERED; +$privileges['default']['sites']['delete'] = User::ROLE_REGISTERED; + +$privileges['default']['history']['index'] = User::ROLE_REGISTERED; +$privileges['default']['history']['list'] = User::ROLE_REGISTERED; +$privileges['default']['history']['clear'] = User::ROLE_REGISTERED; + +$privileges['default']['messageusers']['index'] = User::ROLE_ADMIN; +$privileges['default']['messageusers']['send'] = User::ROLE_ADMIN; + +$privileges['default']['maintenancemode']['enable'] = User::ROLE_ADMIN; +$privileges['default']['maintenancemode']['disable'] = User::ROLE_ADMIN; + +$privileges['default']['feedback']['index'] = User::ROLE_GUEST; +$privileges['default']['feedback']['send'] = User::ROLE_GUEST; + +$privileges['default']['privacy']['index'] = User::ROLE_GUEST; + +$privileges['default']['about']['index'] = User::ROLE_GUEST; + +$privileges['default']['learnmore']['index'] = User::ROLE_GUEST; + +$privileges['install']['index']['index'] = User::ROLE_GUEST; +$privileges['install']['permissions']['index'] = User::ROLE_GUEST; +$privileges['install']['credentials']['index'] = User::ROLE_GUEST; +$privileges['install']['credentials']['save'] = User::ROLE_GUEST; +$privileges['install']['complete']['index'] = User::ROLE_GUEST; + +$privileges['users']['login']['index'] = User::ROLE_GUEST; +$privileges['users']['login']['logout'] = User::ROLE_GUEST; +$privileges['users']['login']['authenticate'] = User::ROLE_GUEST; + +$privileges['users']['userlist']['index'] = User::ROLE_ADMIN; + +$privileges['users']['register']['index'] = User::ROLE_GUEST; +$privileges['users']['register']['save'] = User::ROLE_GUEST; +$privileges['users']['register']['eula'] = User::ROLE_GUEST; +$privileges['users']['register']['declineeula'] = User::ROLE_GUEST; +$privileges['users']['register']['accepteula'] = User::ROLE_GUEST; + +$privileges['users']['profile']['index'] = User::ROLE_REGISTERED; +$privileges['users']['profile']['edit'] = User::ROLE_REGISTERED; +$privileges['users']['profile']['save'] = User::ROLE_REGISTERED; + +$privileges['users']['personalinfo']['index'] = User::ROLE_REGISTERED; +$privileges['users']['personalinfo']['show'] = User::ROLE_REGISTERED; +$privileges['users']['personalinfo']['edit'] = User::ROLE_REGISTERED; +$privileges['users']['personalinfo']['save'] = User::ROLE_REGISTERED; + +$privileges['users']['profilegeneral']['accountinfo'] = User::ROLE_REGISTERED; +$privileges['users']['profilegeneral']['editaccountinfo'] = User::ROLE_REGISTERED; +$privileges['users']['profilegeneral']['saveaccountinfo'] = User::ROLE_REGISTERED; +$privileges['users']['profilegeneral']['changepassword'] = User::ROLE_REGISTERED; +$privileges['users']['profilegeneral']['savepassword'] = User::ROLE_REGISTERED; +$privileges['users']['profilegeneral']['confirmdelete'] = User::ROLE_REGISTERED; +$privileges['users']['profilegeneral']['delete'] = User::ROLE_REGISTERED; + +$privileges['users']['recoverpassword']['index'] = User::ROLE_GUEST; +$privileges['users']['recoverpassword']['send'] = User::ROLE_GUEST; +$privileges['users']['recoverpassword']['reset'] = User::ROLE_GUEST; + +$privileges['users']['manageusers']['index'] = User::ROLE_ADMIN; +$privileges['users']['manageusers']['delete'] = User::ROLE_ADMIN; +$privileges['users']['manageusers']['deleteunconfirmed'] = User::ROLE_ADMIN; + +$privileges['users']['userslist']['index'] = User::ROLE_ADMIN; + +$privileges['stats']['index']['index'] = User::ROLE_ADMIN; +$privileges['stats']['registrations']['index'] = User::ROLE_ADMIN; +$privileges['stats']['registrations']['graph'] = User::ROLE_ADMIN; +$privileges['stats']['authorizations']['index'] = User::ROLE_ADMIN; +$privileges['stats']['authorizations']['graph'] = User::ROLE_ADMIN; +$privileges['stats']['sites']['index'] = User::ROLE_ADMIN; +$privileges['stats']['sites']['graph'] = User::ROLE_ADMIN; +$privileges['stats']['top']['index'] = User::ROLE_ADMIN; +$privileges['stats']['top']['graph'] = User::ROLE_ADMIN; diff --git a/BUGS b/BUGS new file mode 100644 index 0000000..e69de29 diff --git a/CHANGELOG b/CHANGELOG new file mode 100644 index 0000000..30930a0 --- /dev/null +++ b/CHANGELOG @@ -0,0 +1,16 @@ +2009-04-21 Reiner Jung + +New features: +- Added configuration directives to support OpenID URLs using subdomains. +- Add a configuration directives to set the number of news items to show. +- When in maintenance mode, have a warning message explaining, and disable the login section. +- Improved installation procedure. +- Improved error handling and logging. +- Return 404 and 401 status on page not found and access denied scenarios, respectively. +- Don't send email on Access Denied Exceptions, as these may be caused by session timeouts. +- Check if set_include_path() is supported by the current PHP configuration. +- Moved from PDO Mysql to MySQLi database back-end, to avoid problems under Windows servers. + +Bug fixes: +- Was throwing an exception when logging in during an openid authentication. +- Wasn't showing 'denied' or 'authorized' in the history list diff --git a/CONTRIBUTORS b/CONTRIBUTORS new file mode 100644 index 0000000..f5bbd7f --- /dev/null +++ b/CONTRIBUTORS @@ -0,0 +1,19 @@ +Contributors to Community-ID development + +Main developers + + * Keyboard Monkeys Ltd. + +Patch contribution + + * Florian Eibeck (C-ID 1.0.0 RC3) + +Translations + + * Polish Translation from Piotr Baranowski + * Dutch Translation from Stanley Westerveld + +Testing + + + diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..4350db5 --- /dev/null +++ b/INSTALL @@ -0,0 +1,5 @@ +This is the initial Install file for Community-ID. We will work on this file soon. + +For more information how to install Community-ID please have a look at the projekt wiki: + +http://source.keyboard-monkeys.org/wiki/communityid/How_to_install_Community-ID_under_Linux diff --git a/README b/README new file mode 100644 index 0000000..9333cc1 --- /dev/null +++ b/README @@ -0,0 +1 @@ +import things form https://sourceforge.net/projects/communityid/files/ diff --git a/Setup.php b/Setup.php new file mode 100755 index 0000000..b80e3fb --- /dev/null +++ b/Setup.php @@ -0,0 +1,261 @@ + 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); + } + + public static function setErrorReporting() + { + ini_set('log_errors', 'Off'); + if (self::$config->environment->production) { + error_reporting(E_ALL & E_NOTICE); + ini_set('display_errors', 'Off'); + } else { + error_reporting(E_ALL); + ini_set('display_errors', 'On'); + } + } + + public static function setLogger($addMockWriter = false) + { + self::$logger = new Zend_Log(); + if (self::$config->logging->level == 0) { + self::$logger->addWriter(new Zend_Log_Writer_Null(APP_DIR . '/log.txt')); + } else { + if (is_writable(self::$config->logging->location)) { + $file = self::$config->logging->location; + } else if (!is_writable(APP_DIR . DIRECTORY_SEPARATOR . self::$config->logging->location)) { + throw new Exception('Couldn\'t find log file, or maybe it\'s not writable'); + } else { + $file = APP_DIR . DIRECTORY_SEPARATOR . self::$config->logging->location; + } + + self::$logger->addWriter(new Zend_Log_Writer_Stream($file)); + if ($addMockWriter) { + self::$mockLogger = new Zend_Log_Writer_Mock(); + self::$logger->addWriter(self::$mockLogger); + } + } + self::$logger->addFilter(new Zend_Log_Filter_Priority((int)self::$config->logging->level)); + Zend_Registry::set('logger', self::$logger); + } + + public static function logRequest() + { + if (isset($_SERVER['REQUEST_URI'])) { + self::$logger->log('REQUESTED URI: ' . $_SERVER['REQUEST_URI'], Zend_Log::INFO); + } else { + self::$logger->log('REQUESTED THROUGH CLI: ' . $GLOBALS['argv'][0], Zend_Log::INFO); + } + + if (isset($_POST) && $_POST) { + self::$logger->log('POST payload: ' . print_r($_POST, 1), Zend_Log::INFO); + } + } + + public static function setDatabase() + { + 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) { + $profiler = new Monkeys_Db_Profiler(); + $db->setProfiler($profiler); + } + Zend_Db_Table_Abstract::setDefaultAdapter($db); + Zend_Registry::set('db', $db); + + try { + $db->getConnection(); + return true; + } catch (Zend_Db_Adapter_Exception $e) { + return false; + } + } + + public static function setSession() + { + // The framework doesn't provide yet a clean way of doing this + if (isset($_POST['rememberme'])) { + Zend_Session::rememberMe(); + } + + // ZF still doesn't have facilities for session_name(). + session_name(self::$config->environment->session_name); + + $appSession = new Zend_Session_Namespace('Default'); + if (is_null($appSession->messages)) { + $appSession->messages = array(); + } + Zend_Registry::set('appSession', $appSession); + } + + public static function setAcl() + { + self::$acl = new Zend_Acl(); + require 'Acl.php'; + + foreach ($privileges as $module => $moduleConfig) { + foreach ($moduleConfig as $controller => $controllerConfig) { + self::$acl->add(new Zend_Acl_Resource($module . '_' . $controller)); + foreach ($controllerConfig as $action => $role) { + self::$acl->allow($role, $module . '_' . $controller, $action); + } + } + } + Zend_Registry::set('acl', self::$acl); + } + + public static function setI18N() + { + if (self::$config->environment->locale == 'auto') { + $locale = new Zend_Locale(Zend_Locale::BROWSER); + } else { + $locale = new Zend_Locale(self::$config->environment->locale); + } + Zend_Registry::set('Zend_Locale', $locale); + $translate = new Zend_Translate('gettext', + APP_DIR . '/languages', + $locale->toString(), + array( + 'scan' => Zend_Translate::LOCALE_DIRECTORY, + 'disableNotices' => true)); + Zend_Registry::set('Zend_Translate', $translate); + + return $translate; + } + + public static function setLayout() + { + $template = self::$config->environment->template; + + // Hack: Explicitly add the ViewRenderer, so that when an exception is thrown, + // the layout is not shown (should be better handled in ZF 1.6) + // @see http://framework.zend.com/issues/browse/ZF-2993?focusedCommentId=23121#action_23121 + Zend_Controller_Action_HelperBroker::addHelper(new Zend_Controller_Action_Helper_ViewRenderer()); + + Zend_Layout::startMvc(array( + 'layoutPath' => $template == 'default'? APP_DIR.'/views/layouts' : APP_DIR."/views/layouts_$template", + )); + } + + public static function setFrontController() + { + self::$front = Zend_Controller_Front::getInstance(); + self::$front->registerPlugin(new Monkeys_Controller_Plugin_Auth(self::$acl)); + self::$front->addModuleDirectory(APP_DIR.'/modules'); + + $router = self::$front->getRouter(); + + if (self::$config->subdomain->enabled) { + if (self::$config->subdomain->use_www) { + $reqs = array('username' => '([^w]|w[^w][^w]|ww[^w]|www.+).*'); + } else { + $reqs = array(); + } + $hostNameRoute = new Zend_Controller_Router_Route_Hostname( + ':username.' . self::$config->subdomain->hostname, + array( + 'module' => 'default', + 'controller' => 'identity', + 'action' => 'id', + ), + $reqs + ); + $router->addRoute('hostNameRoute', $hostNameRoute); + } + + $route = new Zend_Controller_Router_Route( + 'identity/:userid', + array( + 'module' => 'default', + 'controller' => 'identity', + 'action' => 'id', + ), + array('userid' => '[\w-]*') + ); + $router->addRoute('identityRoute', $route); + } + + public static function dispatch() + { + self::$front->dispatch(); + } +} + +/** +* this is just a global function used to mark translations +*/ +function translate() {} diff --git a/bootstrap.php b/bootstrap.php new file mode 100755 index 0000000..fa59987 --- /dev/null +++ b/bootstrap.php @@ -0,0 +1,26 @@ + + + + + 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/languages/de/lang.mo b/languages/de/lang.mo new file mode 100644 index 0000000..8d5c8cf Binary files /dev/null and b/languages/de/lang.mo differ diff --git a/languages/de/lang.po b/languages/de/lang.po new file mode 100644 index 0000000..fb2fbd0 --- /dev/null +++ b/languages/de/lang.po @@ -0,0 +1,887 @@ +msgid "" +msgstr "" +"Project-Id-Version: Community-ID English translation\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-05-15 00:13+0100\n" +"PO-Revision-Date: 2009-05-15 00:21+0100\n" +"Last-Translator: Reiner Jung \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-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-3: libs/Monkeys\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/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/default/forms/ErrorMessages.php:22 +msgid "Captcha value is wrong" +msgstr "Captcha-Wert ist falsch" + +#: modules/default/forms/ErrorMessages.php:23 +msgid "Password confirmation does not match" +msgstr "Das eingegebene Password stimmt nicht überein " + +#: modules/default/forms/FeedbackForm.php:25 +msgid "Enter your name" +msgstr "Geben Sie Ihren Namen ein" + +#: modules/default/forms/FeedbackForm.php:30 +msgid "Enter your E-mail" +msgstr "Geben Sie ihre E-Mail Adresse ein" + +#: modules/default/forms/FeedbackForm.php:37 +msgid "Enter your questions or comments" +msgstr "Geben Sie Ihre Fragen oder Kommentare ein" + +#: modules/default/forms/FeedbackForm.php:44 +msgid "Please enter the text below" +msgstr "Bitte geben Sie den folgenden Text ein" + +#: modules/default/forms/OpenidLoginForm.php:17 +msgid "Username" +msgstr "Benutzername" + +#: modules/default/forms/OpenidLoginForm.php:22 +msgid "Password" +msgstr "Passwort" + +#: modules/default/forms/MessageUsersForm.php:17 +msgid "Subject:" +msgstr "Betreff:" + +#: modules/default/forms/MessageUsersForm.php:22 +msgid "CC:" +msgstr "CC:" + +#: modules/default/forms/MessageUsersForm.php:26 +msgid "Body:" +msgstr "Body:" + +#: modules/default/models/Field.php:39 +msgid "Male" +msgstr "Mann" + +#: modules/default/models/Field.php:40 +msgid "Female" +msgstr "Frau" + +#: modules/default/models/Fields.php:32 +msgid "Nickname" +msgstr "Spitzname" + +#: modules/default/models/Fields.php:33 +msgid "E-mail" +msgstr "E-mail" + +#: modules/default/models/Fields.php:34 +msgid "Full Name" +msgstr "Kompletter Name" + +#: modules/default/models/Fields.php:35 +msgid "Date of Birth" +msgstr "Geburtsdatum" + +#: modules/default/models/Fields.php:36 +msgid "Gender" +msgstr "Geschlecht" + +#: modules/default/models/Fields.php:37 +msgid "Postal Code" +msgstr "Postleitzahl" + +#: modules/default/models/Fields.php:38 +msgid "Country" +msgstr "Land" + +#: modules/default/models/Fields.php:39 +msgid "Language" +msgstr "Sprache" + +#: modules/default/models/Fields.php:40 +msgid "Time Zone" +msgstr "Zeitzone" + +#: modules/default/controllers/IndexController.php:50 +msgid "Could not retrieve news items" +msgstr "Neue Nachrichten konnten nicht abgerufen werden" + +#: modules/default/controllers/IndexController.php:65 +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/stats/controllers/SitesController.php:68 +msgid "Trusted sites" +msgstr "Vertrauenswürdige Seiten" + +#: modules/stats/controllers/SitesController.php:75 +msgid "Sites per user" +msgstr "Seiten pro Benutzer" + +#: 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 "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:188 +#, 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/users/forms/ChangePasswordForm.php:18 +#: modules/users/forms/AccountInfoForm.php:50 +msgid "Enter password" +msgstr "Passwort eingeben" + +#: modules/users/forms/ChangePasswordForm.php:24 +#: modules/users/forms/AccountInfoForm.php:56 +#: modules/users/forms/RegisterForm.php:54 +msgid "Enter password again" +msgstr "Passwort erneut eingeben" + +#: modules/users/forms/AccountInfoForm.php:30 +#: modules/users/forms/RegisterForm.php:26 +msgid "First Name" +msgstr "Vorname" + +#: modules/users/forms/AccountInfoForm.php:35 +#: modules/users/forms/RegisterForm.php:31 +msgid "Last Name" +msgstr "Nachname" + +#: modules/users/forms/LoginForm.php:8 +msgid "USERNAME" +msgstr "BENUTZERNAME" + +#: modules/users/forms/LoginForm.php:13 +msgid "PASSWORD" +msgstr "PASSWORT" + +#: modules/users/forms/RegisterForm.php:48 +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/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:243 +msgid "Your acccount has been successfully deleted" +msgstr "Ihr Benutzerkonto wurde erfolgreich gelöscht" + +#: modules/users/controllers/UserslistController.php:50 +msgid "admin" +msgstr "Administrator" + +#: modules/users/controllers/UserslistController.php:52 +msgid "confirmed" +msgstr "bestätigt" + +#: modules/users/controllers/UserslistController.php:54 +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: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:222 +msgid "Community-ID registration confirmation" +msgstr "Bestätigung der Community-ID Registrierung" + +#: 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 +msgid "Name" +msgstr "Name" + +#: webdir/javascript/language.php:31 +msgid "Registration" +msgstr "Anmeldung" + +#: 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 "löschen" + +#: webdir/javascript/language.php:35 +msgid "Site" +msgstr "Seite" + +#: webdir/javascript/language.php:36 +msgid "view info exchanged" +msgstr "Ausgetauschte Informationen ansehen" + +#: webdir/javascript/language.php:37 +msgid "deny" +msgstr "verbieten" + +#: webdir/javascript/language.php:38 +msgid "allow" +msgstr "erlauben" + +#: webdir/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 +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 +msgid "operation failed" +msgstr "Operation fehlgeschlagen" + +#: webdir/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 +msgid "Trust the following site has been denied:" +msgstr "Die Vertrauensstellung mit dieser Seite wurde verweigert:" + +#: webdir/javascript/language.php:44 +msgid "ERROR. The server returned:" +msgstr "FEHLER: Der Server antwortet: " + +#: webdir/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 +msgid "The history log has been cleared" +msgstr "Die Historie wurde gelöscht" + +#: webdir/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 +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 +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 +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 +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 +msgid "Date" +msgstr "Datum" + +#: webdir/javascript/language.php:53 +msgid "Result" +msgstr "Ergebnisse" + +#: webdir/javascript/language.php:54 +msgid "No records found." +msgstr "Keine Einträge gefunden." + +#: webdir/javascript/language.php:55 +msgid "Loading..." +msgstr "Lade..." + +#: webdir/javascript/language.php:56 +msgid "Data error." +msgstr "Datenfehler." + +#: webdir/javascript/language.php:57 +msgid "Click to sort ascending" +msgstr "Klicken Sie, um aufsteigend zu sortieren" + +#: webdir/javascript/language.php:58 +msgid "Click to sort descending" +msgstr "Klicken Sie, um absteigend zu sortieren " + +#: webdir/javascript/language.php:59 +msgid "Authorized" +msgstr "autorisiert" + +#: webdir/javascript/language.php:60 +msgid "Denied" +msgstr "Verweigert" + +#: webdir/javascript/language.php:61 +msgid "of" +msgstr "von" + +#: webdir/javascript/language.php:62 +msgid "next" +msgstr "nächste" + +#: webdir/javascript/language.php:63 +msgid "prev" +msgstr "vorherige" + +#: webdir/javascript/language.php:64 +msgid "IP" +msgstr "IP" + +#: libs/Monkeys/Form/Element/Country.php:36 +msgid "-- Select a Country --" +msgstr "-- Wählen Sie ein Land --" + +#: libs/Monkeys/Form/Element/Timezone.php:48 +msgid "-- Select a Timezone --" +msgstr "-- Wählen Sie eine Zeitzone -- " + +#: libs/Monkeys/Form/Element/Language.php:36 +msgid "-- Select a Language --" +msgstr "-- Wählen Sie eine Sprache --" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:267 +msgid "January" +msgstr "Januar" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:268 +msgid "February" +msgstr "Februar " + +#: libs/Monkeys/View/Helper/FormDateSelects.php:269 +msgid "March" +msgstr "März " + +#: libs/Monkeys/View/Helper/FormDateSelects.php:270 +msgid "April" +msgstr "April" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:271 +msgid "May" +msgstr "Mai" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:272 +msgid "June" +msgstr "Juni" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:273 +msgid "July" +msgstr "Juli " + +#: libs/Monkeys/View/Helper/FormDateSelects.php:274 +msgid "August" +msgstr "August" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:275 +msgid "Septembre" +msgstr "September" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:276 +msgid "October" +msgstr "Oktober" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:277 +msgid "November" +msgstr "November" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:278 +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:39 +msgid "Send" +msgstr "Senden" + +#: 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:18 +msgid "switch to Plain-Text" +msgstr "Zu Plain-Text umschalten" + +#: modules/default/views/scripts/messageusers/index.phtml:21 +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/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:5 +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/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 "Starting" + +#: modules/default/views/scripts_monkeys/index/subheader.phtml:4 +msgid "Starting today
you'll only have to remember one" +msgstr "Von heute an müssen
Sie sich nur noch eins erinnern" + +#: modules/stats/views/scripts/authorizations/index.phtml:1 +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 +msgid "Trusted Sites" +msgstr "Vertraute Seiten" + +#: modules/stats/views/scripts/top/index.phtml:1 +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" + +#: 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:10 +msgid "Finish" +msgstr "Beenden " + +#: modules/install/views/scripts/credentials/index.phtml:2 +msgid "Database and E-mail information" +msgstr "Datenbank und E-Mail informationen" + +#: 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/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/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 "Benutzerkonto" + +#: modules/users/views/scripts/login/index.phtml:10 +msgid "Personal Info" +msgstr "Persönliche Informationen " + +#: modules/users/views/scripts/login/index.phtml:13 +msgid "Sites database" +msgstr "Gespeicherte Seiten" + +#: modules/users/views/scripts/login/index.phtml:16 +msgid "History Log" +msgstr "Historie" + +#: modules/users/views/scripts/login/index.phtml:19 +msgid "Logout" +msgstr "Abmelden" + +#: modules/users/views/scripts/login/index.phtml:24 +msgid "Admin options" +msgstr "Administration " + +#: modules/users/views/scripts/login/index.phtml:27 +msgid "Manage Users" +msgstr "Benutzer verwalten" + +#: modules/users/views/scripts/login/index.phtml:30 +msgid "Message Users" +msgstr "Nachricht an Benutzer" + +#: modules/users/views/scripts/login/index.phtml:34 +msgid "Disable Maintenance Mode" +msgstr "Wartungsmodus deaktivieren " + +#: modules/users/views/scripts/login/index.phtml:36 +msgid "Enable Maintenance Mode" +msgstr "Wartungsmodus aktivieren" + +#: modules/users/views/scripts/login/index.phtml:40 +msgid "Statistics" +msgstr "Statistiken" + +#: modules/users/views/scripts/login/index.phtml:47 +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:58 +msgid "Remember me" +msgstr "An mich erinnern " + +#: modules/users/views/scripts/login/index.phtml:61 +msgid "Log in" +msgstr "Anmelden" + +#: modules/users/views/scripts/login/index.phtml:67 +msgid "Forgot you password?" +msgstr "Passwort vergessen?" + +#: modules/users/views/scripts/login/index.phtml:73 +msgid "You don't have an account?" +msgstr "Sie haben noch keine Benutzerkonto?" + +#: modules/users/views/scripts/login/index.phtml:75 +msgid "REGISTER NOW!" +msgstr "JETZT ANMELDEN!" + +#: modules/users/views/scripts/manageusers/index.phtml:11 +msgid "All" +msgstr "Alle" + +#: modules/users/views/scripts/manageusers/index.phtml:14 +msgid "Confirmed" +msgstr "Bestätigt" + +#: modules/users/views/scripts/manageusers/index.phtml:17 +msgid "Unconfirmed" +msgstr "Nicht bestätigt" + +#: modules/users/views/scripts/manageusers/index.phtml:24 +msgid "Total users:" +msgstr "Benutzer gesamt:" + +#: modules/users/views/scripts/manageusers/index.phtml:25 +msgid "Total confirmed users:" +msgstr "Anzahl bestätigter Benutzer" + +#: modules/users/views/scripts/manageusers/index.phtml:26 +msgid "Total unconfirmed users:" +msgstr "Anzahl unbestätigter Benutzer" + +#: modules/users/views/scripts/manageusers/index.phtml:29 +msgid "Add User" +msgstr "Benutzer hinzufügen" + +#: modules/users/views/scripts/manageusers/index.phtml:31 +msgid "Delete Unconfirmed Users" +msgstr "Nicht bestätigte Benutzer löschen" + +#: modules/users/views/scripts/profile/index.phtml:13 +msgid "Account info" +msgstr "Benutzerkonto Details" + +#: modules/users/views/scripts/profile/index.phtml:17 +msgid "Edit" +msgstr "Bearbeiten" + +#: modules/users/views/scripts/profile/index.phtml:20 +msgid "Change Password" +msgstr "Passwort ändern" + +#: modules/users/views/scripts/profile/index.phtml:38 +msgid "Delete Account" +msgstr "Konto löschen" + +#: modules/users/views/scripts/profilegeneral/accountinfo.phtml:28 +msgid "OpenID" +msgstr "OpenID" + +#: modules/users/views/scripts/profilegeneral/editaccountinfo.phtml:13 +#: modules/users/views/scripts/profilegeneral/changepassword.phtml:36 +#: modules/users/views/scripts/personalinfo/edit.phtml:42 +msgid "Save" +msgstr "Speichern" + +#: modules/users/views/scripts/profilegeneral/editaccountinfo.phtml:14 +#: modules/users/views/scripts/profilegeneral/changepassword.phtml:37 +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:23 +#: modules/users/views/scripts/personalinfo/edit.phtml:43 +msgid "Cancel" +msgstr "Abbrechen" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:3 +msgid "Why do you want to delete your Community-ID account?" +msgstr "Warum beabsichtigen Sie Ihr Community-ID Benutzerkonto zu löschen?" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:4 +msgid "Please check all that apply:" +msgstr "Bitte wählen Sie aus was zutrifft:" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:8 +msgid "This was just a test account" +msgstr "Dies war nur ein Test Account " + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:11 +msgid "I found a better service" +msgstr "Ich habe einen besseren Service gefunden" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:14 +msgid "Service lacked some key features I needed" +msgstr "Wichtige Funktionen welche ich benötige waren nicht vorhanden" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:17 +msgid "No particular reason" +msgstr "Kein besondere Grund" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:20 +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/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/register/index.phtml:1 +msgid "Registration Form" +msgstr "Anmeldeformular" + +#: modules/users/views/scripts/personalinfo/show.phtml:8 +msgid "Not Entered" +msgstr "Nicht eingegeben" + +#: 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" + +#: views/layouts_monkeys/layout.phtml:32 +#: views/layouts/layout.phtml:32 +msgid "Home" +msgstr "Home" + +#: views/layouts_monkeys/layout.phtml:35 +#: views/layouts/layout.phtml:35 +msgid "Feedback" +msgstr "Feedback" + +#: views/layouts_monkeys/layout.phtml:38 +msgid "Help and Support" +msgstr "Hilfe und Support" + +#: views/layouts_monkeys/layout.phtml:55 +#: views/layouts/layout.phtml:52 +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:75 +msgid "Privacy" +msgstr "Datenschutz " + +#: views/layouts_monkeys/layout.phtml:78 +msgid "About Us" +msgstr "Über uns " + +#: views/layouts_monkeys/layout.phtml:81 +msgid "Contact Us" +msgstr "Kontakt " + +#~ msgid "OPEN AN ACCOUNT NOW" +#~ msgstr "EIN BENUTZERKONTO ERSTELLEN" +#~ msgid "Latest News" +#~ msgstr "Letzte News" +#~ msgid "Arabic" +#~ msgstr "Arabisch" +#~ msgid "Bulgarian" +#~ msgstr "Bulgarisch" +#~ msgid "Danish" +#~ msgstr "Dänisch " +#~ msgid "German" +#~ msgstr "Deutsch" +#~ msgid "Greek" +#~ msgstr "Griechisch" +#~ msgid "English" +#~ msgstr "Englisch" +#~ msgid "Esperanto" +#~ msgstr "Esperanto" +#~ msgid "Spanish" +#~ msgstr "Spanisch" + +#, fuzzy +#~ msgid "Fiji" +#~ msgstr "Beenden" + +#, fuzzy +#~ msgid "Yiddish" +#~ msgstr "Beenden" + +#, fuzzy +#~ msgid "Georgian" +#~ msgstr "Einloggen" + +#, fuzzy +#~ msgid "Latin" +#~ msgstr "Administrator" + +#, fuzzy +#~ msgid "Laothian" +#~ msgstr "Einloggen" + +#, fuzzy +#~ msgid "Sindhi" +#~ msgstr "Senden" + +#, fuzzy +#~ msgid "Tamil" +#~ msgstr "Administrator" +#~ msgid "Username:" +#~ msgstr "Benutzername:" +#~ msgid "E-mail:" +#~ msgstr "E-Mail:" +#~ msgid "LOGIN" +#~ msgstr "ANMELDEN" +#~ msgid "LOG IN" +#~ msgstr "ANMELDEN" + diff --git a/languages/en/lang.mo b/languages/en/lang.mo new file mode 100644 index 0000000..27dd1f1 Binary files /dev/null and b/languages/en/lang.mo differ diff --git a/languages/en/lang.po b/languages/en/lang.po new file mode 100644 index 0000000..853ca7d --- /dev/null +++ b/languages/en/lang.po @@ -0,0 +1,764 @@ +msgid "" +msgstr "" +"Project-Id-Version: Community-ID English translation\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-05-12 16:08-0500\n" +"PO-Revision-Date: 2009-05-12 16:09-0500\n" +"Last-Translator: Alejandro Pedraza \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 "Nickname" + +#: 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 "Full Name" + +#: modules/default/models/Fields.php:35 +msgid "Date of Birth" +msgstr "Date of Birth" + +#: modules/default/models/Fields.php:36 +msgid "Gender" +msgstr "Gender" + +#: modules/default/models/Fields.php:37 +msgid "Postal Code" +msgstr "Postal Code" + +#: modules/default/models/Fields.php:38 +msgid "Country" +msgstr "Country" + +#: modules/default/models/Fields.php:39 +msgid "Language" +msgstr "Language" + +#: modules/default/models/Fields.php:40 +msgid "Time Zone" +msgstr "Time Zone" + +#: modules/default/models/Field.php:39 +msgid "Male" +msgstr "Male" + +#: modules/default/models/Field.php:40 +msgid "Female" +msgstr "Female" + +#: modules/default/controllers/IndexController.php:27 +msgid "Could not retrieve news items" +msgstr "Could not retrieve news items" + +#: modules/default/controllers/IndexController.php:42 +msgid "Read More" +msgstr "Read More" + +#: 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/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 "Username" + +#: modules/default/forms/OpenidLoginForm.php:22 +msgid "Password" +msgstr "Password" + +#: modules/default/forms/MessageUsersForm.php:17 +msgid "Subject:" +msgstr "Subject:" + +#: 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 "Body:" + +#: modules/default/forms/FeedbackForm.php:25 +msgid "Enter your name" +msgstr "Enter your name" + +#: modules/default/forms/FeedbackForm.php:30 +msgid "Enter your E-mail" +msgstr "Enter your E-mail" + +#: modules/default/forms/FeedbackForm.php:37 +msgid "Enter your questions or comments" +msgstr "Enter your questions or comments" + +#: modules/default/forms/FeedbackForm.php:44 +#: modules/users/forms/RegisterForm.php:59 +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/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/default/forms/ErrorMessages.php:22 +msgid "Captcha value is wrong" +msgstr "Captcha value is wrong" + +#: modules/default/forms/ErrorMessages.php:23 +msgid "Password confirmation does not match" +msgstr "Password confirmation does not match" + +#: 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/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 "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:188 +#, 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/users/controllers/UserslistController.php:50 +msgid "admin" +msgstr "admin" + +#: modules/users/controllers/UserslistController.php:52 +msgid "confirmed" +msgstr "confirmed" + +#: modules/users/controllers/UserslistController.php:54 +msgid "unconfirmed" +msgstr "unconfirmed" + +#: 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/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/users/controllers/ProfilegeneralController.php:243 +msgid "Your acccount has been successfully deleted" +msgstr "Your acccount has been successfully deleted" + +#: modules/users/controllers/RegisterController.php:26 +msgid "Sorry, registrations are currently disabled" +msgstr "Sorry, registrations are currently disabled" + +#: modules/users/controllers/ManageusersController.php:25 +msgid "User has been deleted successfully" +msgstr "User has been deleted successfully" + +#: modules/users/forms/AccountInfoForm.php:30 +#: modules/users/forms/RegisterForm.php:26 +msgid "First Name" +msgstr "First Name" + +#: modules/users/forms/AccountInfoForm.php:35 +#: modules/users/forms/RegisterForm.php:31 +msgid "Last Name" +msgstr "Last Name" + +#: modules/users/forms/AccountInfoForm.php:50 +#: modules/users/forms/ChangePasswordForm.php:18 +msgid "Enter password" +msgstr "Enter password" + +#: modules/users/forms/AccountInfoForm.php:56 +#: modules/users/forms/RegisterForm.php:54 +#: modules/users/forms/ChangePasswordForm.php:24 +msgid "Enter password again" +msgstr "Enter password again" + +#: modules/users/forms/LoginForm.php:8 +msgid "USERNAME" +msgstr "USERNAME" + +#: modules/users/forms/LoginForm.php:13 +msgid "PASSWORD" +msgstr "PASSWORD" + +#: modules/users/forms/RegisterForm.php:48 +msgid "Enter desired password" +msgstr "Enter desired password" + +#: webdir/javascript/language.php:30 +#: modules/users/views/scripts/profilegeneral/accountinfo.phtml:12 +msgid "Name" +msgstr "Name" + +#: webdir/javascript/language.php:31 +msgid "Registration" +msgstr "Registration" + +#: webdir/javascript/language.php:32 +msgid "Status" +msgstr "Status" + +#: webdir/javascript/language.php:33 +msgid "profile" +msgstr "profile" + +#: webdir/javascript/language.php:34 +msgid "delete" +msgstr "delete" + +#: webdir/javascript/language.php:35 +msgid "Site" +msgstr "Site" + +#: webdir/javascript/language.php:36 +msgid "view info exchanged" +msgstr "view info exchanged" + +#: webdir/javascript/language.php:37 +msgid "deny" +msgstr "deny" + +#: webdir/javascript/language.php:38 +msgid "allow" +msgstr "allow" + +#: webdir/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 +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 +msgid "operation failed" +msgstr "operation failed" + +#: webdir/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 +msgid "Trust the following site has been denied:" +msgstr "Trust the following site has been denied:" + +#: webdir/javascript/language.php:44 +msgid "ERROR. The server returned:" +msgstr "ERROR. The server returned:" + +#: webdir/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 +msgid "The history log has been cleared" +msgstr "The history log has been cleared" + +#: webdir/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 +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 +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 +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 +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 +msgid "Date" +msgstr "Date" + +#: webdir/javascript/language.php:53 +msgid "Result" +msgstr "Result" + +#: webdir/javascript/language.php:54 +msgid "No records found." +msgstr "No records found." + +#: webdir/javascript/language.php:55 +msgid "Loading..." +msgstr "Loading..." + +#: webdir/javascript/language.php:56 +msgid "Data error." +msgstr "Data error." + +#: webdir/javascript/language.php:57 +msgid "Click to sort ascending" +msgstr "Click to sort ascending" + +#: webdir/javascript/language.php:58 +msgid "Click to sort descending" +msgstr "Click to sort descending" + +#: webdir/javascript/language.php:59 +msgid "Authorized" +msgstr "Authorized" + +#: webdir/javascript/language.php:60 +msgid "Denied" +msgstr "Denied" + +#: webdir/javascript/language.php:61 +msgid "of" +msgstr "of" + +#: webdir/javascript/language.php:62 +msgid "next" +msgstr "next" + +#: webdir/javascript/language.php:63 +msgid "prev" +msgstr "prev" + +#: webdir/javascript/language.php:64 +msgid "IP" +msgstr "IP" + +#: modules/default/views/scripts/privacy/index.phtml:1 +msgid "Privacy Policy" +msgstr "Privacy Policy" + +#: 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:18 +msgid "switch to Plain-Text" +msgstr "switch to Plain-Text" + +#: modules/default/views/scripts/messageusers/index.phtml:21 +msgid "switch to Rich-Text (HTML)" +msgstr "switch to 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 "Send" + +#: 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/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." + +#: 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/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/default/views/scripts/openid/trust.phtml:11 +msgid "Fields marked with * are required." +msgstr "Fields marked with * are required." + +#: 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" + +#: modules/default/views/scripts/openid/trust.phtml:24 +msgid "Forever" +msgstr "Forever" + +#: modules/default/views/scripts/openid/trust.phtml:27 +msgid "Allow" +msgstr "Allow" + +#: modules/default/views/scripts/openid/trust.phtml:28 +msgid "Deny" +msgstr "Deny" + +#: 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 "OPEN AN ACCOUNT NOW" + +#: modules/default/views/scripts/index/index.phtml:22 +msgid "Latest News" +msgstr "Latest News" + +#: modules/default/views/scripts/sites/index.phtml:15 +msgid "Information Exchanged" +msgstr "Information Exchanged" + +#: modules/default/views/scripts/sites/index.phtml:17 +msgid "Information exchanged with:" +msgstr "Information exchanged with:" + +#: modules/default/views/scripts/sites/index.phtml:21 +msgid "OK" +msgstr "OK" + +#: modules/default/views/scripts/history/index.phtml:13 +msgid "Clear History" +msgstr "Clear History" + +#: 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 "Fed up with having to remember dozens of
usernames and passwords
for your favorite websites?" + +#: modules/default/views/scripts_monkeys/index/subheader.phtml:4 +msgid "Starting today
you'll only have to remember one" +msgstr "Starting today
you'll only have to remember one" + +#: modules/stats/views/scripts/authorizations/index.phtml:1 +msgid "Authorizations per day" +msgstr "Authorizations per day" + +#: 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 "Select view" + +#: 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 "Last 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 "Last Year" + +#: modules/stats/views/scripts/registrations/index.phtml:1 +msgid "Registrations per day" +msgstr "Registrations per day" + +#: modules/stats/views/scripts/registrations/index.phtml:6 +msgid "Last Month" +msgstr "Last Month" + +#: 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 +#, php-format +msgid "%s users" +msgstr "%s users" + +#: modules/stats/views/scripts/sites/index.phtml:1 +msgid "Trusted Sites" +msgstr "Trusted Sites" + +#: 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:10 +msgid "Finish" +msgstr "Finish" + +#: 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/credentials/index.phtml:2 +msgid "Database and E-mail information" +msgstr "Database and E-mail information" + +#: 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/users/views/scripts/register/index.phtml:1 +msgid "Registration Form" +msgstr "Registration Form" + +#: 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 "Save" + +#: 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 "Cancel" + +#: modules/users/views/scripts/personalinfo/show.phtml:8 +msgid "Not Entered" +msgstr "Not Entered" + +#: 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 "Personal Info" + +#: modules/users/views/scripts/personalinfo/index.phtml:16 +#: modules/users/views/scripts/profile/index.phtml:17 +msgid "Edit" +msgstr "Edit" + +#: 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/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/profile/index.phtml:20 +msgid "Change Password" +msgstr "Change Password" + +#: modules/users/views/scripts/profile/index.phtml:38 +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:22 +msgid "Delete Account" +msgstr "Delete Account" + +#: 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?" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:4 +msgid "Please check all that apply:" +msgstr "Please check all that apply:" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:8 +msgid "This was just a test account" +msgstr "This was just a test account" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:11 +msgid "I found a better service" +msgstr "I found a better service" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:14 +msgid "Service lacked some key features I needed" +msgstr "Service lacked some key features I needed" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:17 +msgid "No particular reason" +msgstr "No particular reason" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:20 +msgid "Additional comments:" +msgstr "Additional comments:" + +#: modules/users/views/scripts/profilegeneral/accountinfo.phtml:28 +msgid "OpenID" +msgstr "OpenID" + +#: modules/users/views/scripts/login/index.phtml:3 +#: modules/users/views/scripts_monkeys/login/index.phtml:3 +#, php-format +msgid "Hello, %s" +msgstr "Hello, %s" + +#: modules/users/views/scripts/login/index.phtml:7 +#: modules/users/views/scripts_monkeys/login/index.phtml:7 +msgid "Account" +msgstr "Account" + +#: modules/users/views/scripts/login/index.phtml:13 +#: modules/users/views/scripts_monkeys/login/index.phtml:13 +msgid "Sites database" +msgstr "Sites database" + +#: modules/users/views/scripts/login/index.phtml:16 +#: modules/users/views/scripts_monkeys/login/index.phtml:16 +msgid "History Log" +msgstr "History Log" + +#: modules/users/views/scripts/login/index.phtml:19 +#: modules/users/views/scripts_monkeys/login/index.phtml:19 +msgid "Logout" +msgstr "Logout" + +#: modules/users/views/scripts/login/index.phtml:24 +#: modules/users/views/scripts_monkeys/login/index.phtml:24 +msgid "Admin options" +msgstr "Admin options" + +#: modules/users/views/scripts/login/index.phtml:27 +#: modules/users/views/scripts_monkeys/login/index.phtml:27 +msgid "Manage Users" +msgstr "Manage Users" + +#: modules/users/views/scripts/login/index.phtml:30 +#: modules/users/views/scripts_monkeys/login/index.phtml:30 +msgid "Message Users" +msgstr "Message Users" + +#: modules/users/views/scripts/login/index.phtml:34 +#: modules/users/views/scripts_monkeys/login/index.phtml:34 +msgid "Disable Maintenance Mode" +msgstr "Disable Maintenance Mode" + +#: modules/users/views/scripts/login/index.phtml:36 +#: modules/users/views/scripts_monkeys/login/index.phtml:36 +msgid "Enable Maintenance Mode" +msgstr "Enable Maintenance Mode" + +#: modules/users/views/scripts/login/index.phtml:40 +#: modules/users/views/scripts_monkeys/login/index.phtml:40 +msgid "Statistics" +msgstr "Statistics" + +#: 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 "User access is currently disabled for system maintenance.
Please try again later" + +#: modules/users/views/scripts/login/index.phtml:58 +#: modules/users/views/scripts_monkeys/login/index.phtml:61 +msgid "Remember me" +msgstr "Remember me" + +#: modules/users/views/scripts/login/index.phtml:61 +#: modules/users/views/scripts_monkeys/login/index.phtml:64 +msgid "Log in" +msgstr "Log in" + +#: modules/users/views/scripts/login/index.phtml:67 +#: modules/users/views/scripts_monkeys/login/index.phtml:70 +msgid "Forgot you password?" +msgstr "Forgot you password?" + +#: 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 "You don't have an account?" + +#: modules/users/views/scripts/login/index.phtml:75 +#: modules/users/views/scripts_monkeys/login/index.phtml:78 +msgid "REGISTER NOW!" +msgstr "REGISTER NOW!" + +#: modules/users/views/scripts/manageusers/index.phtml:11 +msgid "All" +msgstr "All" + +#: modules/users/views/scripts/manageusers/index.phtml:14 +msgid "Confirmed" +msgstr "Confirmed" + +#: modules/users/views/scripts/manageusers/index.phtml:17 +msgid "Unconfirmed" +msgstr "Unconfirmed" + +#: modules/users/views/scripts/manageusers/index.phtml:24 +msgid "Total users:" +msgstr "Total users:" + +#: modules/users/views/scripts/manageusers/index.phtml:25 +msgid "Total confirmed users:" +msgstr "Total confirmed users:" + +#: modules/users/views/scripts/manageusers/index.phtml:26 +msgid "Total unconfirmed users:" +msgstr "Total unconfirmed users:" + +#: modules/users/views/scripts/manageusers/index.phtml:29 +msgid "Add User" +msgstr "Add User" + +#: modules/users/views/scripts/manageusers/index.phtml:31 +msgid "Delete Unconfirmed Users" +msgstr "Delete Unconfirmed Users" + +#: views/layouts_monkeys/layout.phtml:32 +#: views/layouts/layout.phtml:32 +msgid "Home" +msgstr "Home" + +#: views/layouts_monkeys/layout.phtml:35 +#: views/layouts/layout.phtml:35 +msgid "Feedback" +msgstr "Feedback" + +#: views/layouts_monkeys/layout.phtml:38 +msgid "Help and Support" +msgstr "Help and Support" + +#: views/layouts_monkeys/layout.phtml:55 +#: views/layouts/layout.phtml:52 +msgid "Maintenance mode is enabled: user access is restricted" +msgstr "Maintenance mode is enabled: user access is restricted" + +#: views/layouts_monkeys/layout.phtml:75 +msgid "Privacy" +msgstr "Privacy" + +#: views/layouts_monkeys/layout.phtml:78 +msgid "About Us" +msgstr "About Us" + +#: views/layouts_monkeys/layout.phtml:81 +msgid "Contact Us" +msgstr "Contact Us" + diff --git a/languages/es/lang.mo b/languages/es/lang.mo new file mode 100644 index 0000000..db6ef76 Binary files /dev/null and b/languages/es/lang.mo differ diff --git a/languages/es/lang.po b/languages/es/lang.po new file mode 100644 index 0000000..79d26e5 --- /dev/null +++ b/languages/es/lang.po @@ -0,0 +1,871 @@ +msgid "" +msgstr "" +"Project-Id-Version: Community-ID Spanish translation\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-05-13 11:41-0500\n" +"PO-Revision-Date: 2009-05-13 11:42-0500\n" +"Last-Translator: Alejandro Pedraza \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: Spanish\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: webdir/javascript\n" +"X-Poedit-SearchPath-3: libs/Monkeys\n" + +#: modules/default/models/Fields.php:32 +msgid "Nickname" +msgstr "Sobrenombre" + +#: 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 "Correo electrónico" + +#: modules/default/models/Fields.php:34 +msgid "Full Name" +msgstr "Nombre Completo" + +#: modules/default/models/Fields.php:35 +msgid "Date of Birth" +msgstr "Fecha de Nacimiento" + +#: modules/default/models/Fields.php:36 +msgid "Gender" +msgstr "Género" + +#: modules/default/models/Fields.php:37 +msgid "Postal Code" +msgstr "Código Postal" + +#: modules/default/models/Fields.php:38 +msgid "Country" +msgstr "País" + +#: modules/default/models/Fields.php:39 +msgid "Language" +msgstr "Idioma" + +#: modules/default/models/Fields.php:40 +msgid "Time Zone" +msgstr "Zona Horaria" + +#: modules/default/models/Field.php:39 +msgid "Male" +msgstr "Hombre" + +#: modules/default/models/Field.php:40 +msgid "Female" +msgstr "Mujer" + +#: modules/default/controllers/IndexController.php:27 +msgid "Could not retrieve news items" +msgstr "No fue posible extraer las noticias" + +#: modules/default/controllers/IndexController.php:42 +msgid "Read More" +msgstr "Leer Más" + +#: modules/default/controllers/MessageusersController.php:46 +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/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 "Nombre de usuario" + +#: modules/default/forms/OpenidLoginForm.php:22 +msgid "Password" +msgstr "Contraseña" + +#: modules/default/forms/MessageUsersForm.php:17 +msgid "Subject:" +msgstr "Asunto:" + +#: 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 "Contenido:" + +#: modules/default/forms/FeedbackForm.php:25 +msgid "Enter your name" +msgstr "Ingrese su nombre" + +#: modules/default/forms/FeedbackForm.php:30 +msgid "Enter your E-mail" +msgstr "Ingrese su correo electrónico" + +#: modules/default/forms/FeedbackForm.php:37 +msgid "Enter your questions or comments" +msgstr "Ingrese sus preguntas o comentarios" + +#: modules/default/forms/FeedbackForm.php:44 +#: modules/users/forms/RegisterForm.php:59 +msgid "Please enter the text below" +msgstr "Por favor ingrese el siguiente texto" + +#: modules/default/forms/ErrorMessages.php:20 +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 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 +msgid "Captcha value is wrong" +msgstr "El valor del texto está errado" + +#: modules/default/forms/ErrorMessages.php:23 +msgid "Password confirmation does not match" +msgstr "Las contraseñas no coinciden" + +#: 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/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 "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:188 +#, 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/users/controllers/UserslistController.php:50 +msgid "admin" +msgstr "admin" + +#: modules/users/controllers/UserslistController.php:52 +msgid "confirmed" +msgstr "confirmado" + +#: modules/users/controllers/UserslistController.php:54 +msgid "unconfirmed" +msgstr "no confirmado" + +#: modules/users/controllers/ProfilegeneralController.php:76 +#: modules/users/controllers/RegisterController.php:59 +msgid "This username is already in use" +msgstr "Este nombre de usuario ya está en uso" + +#: modules/users/controllers/ProfilegeneralController.php:85 +#: modules/users/controllers/RegisterController.php:66 +msgid "This E-mail is already in use" +msgstr "Este correo electrónico ya está en uso" + +#: modules/users/controllers/ProfilegeneralController.php:243 +msgid "Your acccount has been successfully deleted" +msgstr "Su cuenta ha sido borrada con éxito" + +#: 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:104 +msgid "Thank you." +msgstr "Gracias." + +#: modules/users/controllers/RegisterController.php:105 +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 +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:222 +msgid "Community-ID registration confirmation" +msgstr "Community-ID confirmación de registro" + +#: 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 +msgid "Community-ID password reset" +msgstr "Community-ID restablecimiento de contraseña" + +#: modules/users/controllers/RecoverpasswordController.php:84 +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 +msgid "You'll receive your new password via E-mail" +msgstr "Recibirá la nueva contraseña por correo electrónico" + +#: modules/users/controllers/ManageusersController.php:25 +msgid "User has been deleted successfully" +msgstr "El usuario ha sido borrado con éxito" + +#: modules/users/forms/AccountInfoForm.php:30 +#: modules/users/forms/RegisterForm.php:26 +msgid "First Name" +msgstr "Nombre" + +#: modules/users/forms/AccountInfoForm.php:35 +#: modules/users/forms/RegisterForm.php:31 +msgid "Last Name" +msgstr "Apellido" + +#: modules/users/forms/AccountInfoForm.php:50 +#: modules/users/forms/ChangePasswordForm.php:18 +msgid "Enter password" +msgstr "Ingrese contraseña" + +#: modules/users/forms/AccountInfoForm.php:56 +#: modules/users/forms/RegisterForm.php:54 +#: modules/users/forms/ChangePasswordForm.php:24 +msgid "Enter password again" +msgstr "Ingrese contraseña de nuevo" + +#: modules/users/forms/LoginForm.php:8 +msgid "USERNAME" +msgstr "NOMBRE DE USUARIO" + +#: modules/users/forms/LoginForm.php:13 +msgid "PASSWORD" +msgstr "CONTRASEÑA" + +#: modules/users/forms/RegisterForm.php:48 +msgid "Enter desired password" +msgstr "Ingrese contraseña deseada" + +#: webdir/javascript/language.php:30 +#: modules/users/views/scripts/profilegeneral/accountinfo.phtml:12 +msgid "Name" +msgstr "Nombre" + +#: webdir/javascript/language.php:31 +msgid "Registration" +msgstr "Registro" + +#: webdir/javascript/language.php:32 +msgid "Status" +msgstr "Estado" + +#: webdir/javascript/language.php:33 +msgid "profile" +msgstr "perfil" + +#: webdir/javascript/language.php:34 +msgid "delete" +msgstr "eliminar" + +#: webdir/javascript/language.php:35 +msgid "Site" +msgstr "Sitio" + +#: webdir/javascript/language.php:36 +msgid "view info exchanged" +msgstr "ver información intercambiada" + +#: webdir/javascript/language.php:37 +msgid "deny" +msgstr "denegar" + +#: webdir/javascript/language.php:38 +msgid "allow" +msgstr "permitir" + +#: webdir/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 +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 +msgid "operation failed" +msgstr "la operación ha fallado" + +#: webdir/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 +msgid "Trust the following site has been denied:" +msgstr "Confianza para el siguiente sitio ha sido denegada:" + +#: webdir/javascript/language.php:44 +msgid "ERROR. The server returned:" +msgstr "ERROR. El servidor retornó:" + +#: webdir/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 +msgid "The history log has been cleared" +msgstr "El historial ha sido borrado" + +#: webdir/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 +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 +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 +msgid "Are you sure you wish to delete the user" +msgstr "Está seguro de querer eliminar el usuario" + +#: webdir/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 +msgid "Date" +msgstr "Fecha" + +#: webdir/javascript/language.php:53 +msgid "Result" +msgstr "Resultado" + +#: webdir/javascript/language.php:54 +msgid "No records found." +msgstr "No se encontraron registros." + +#: webdir/javascript/language.php:55 +msgid "Loading..." +msgstr "Cargando..." + +#: webdir/javascript/language.php:56 +msgid "Data error." +msgstr "Error de datos." + +#: webdir/javascript/language.php:57 +msgid "Click to sort ascending" +msgstr "Haga click para ordenar ascendentemente" + +#: webdir/javascript/language.php:58 +msgid "Click to sort descending" +msgstr "Haga click para ordenar descendentemente" + +#: webdir/javascript/language.php:59 +msgid "Authorized" +msgstr "Autorizado" + +#: webdir/javascript/language.php:60 +msgid "Denied" +msgstr "Denegado" + +#: webdir/javascript/language.php:61 +msgid "of" +msgstr "de" + +#: webdir/javascript/language.php:62 +msgid "next" +msgstr "sig" + +#: webdir/javascript/language.php:63 +msgid "prev" +msgstr "ant" + +#: webdir/javascript/language.php:64 +msgid "IP" +msgstr "IP" + +#: libs/Monkeys/Form/Element/Language.php:36 +msgid "-- Select a Language --" +msgstr "-- Seleccione un Idioma --" + +#: libs/Monkeys/Form/Element/Timezone.php:48 +msgid "-- Select a Timezone --" +msgstr "-- Seleccione una zona horaria --" + +#: libs/Monkeys/Form/Element/Country.php:36 +msgid "-- Select a Country --" +msgstr "-- Seleccione un País --" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:267 +msgid "January" +msgstr "Enero" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:268 +msgid "February" +msgstr "Febrero" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:269 +msgid "March" +msgstr "Marzo" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:270 +msgid "April" +msgstr "Abrilperfil" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:271 +msgid "May" +msgstr "Mayo" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:272 +msgid "June" +msgstr "Junio" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:273 +msgid "July" +msgstr "Julio" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:274 +msgid "August" +msgstr "Agosto" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:275 +msgid "Septembre" +msgstr "Septiembre" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:276 +msgid "October" +msgstr "Octubre" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:277 +msgid "November" +msgstr "Noviembre" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:278 +msgid "December" +msgstr "Diciembre" + +#: 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" + +#: modules/default/views/scripts/messageusers/index.phtml:18 +msgid "switch to Plain-Text" +msgstr "cambiar a texto plano" + +#: modules/default/views/scripts/messageusers/index.phtml:21 +msgid "switch to Rich-Text (HTML)" +msgstr "cambiar a texto enriquecido (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 "Enviar" + +#: 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 "Para poder servirle mejor, hemos creado el formulario a continuación para sus preguntas y comentarios" + +#: 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 sitio identificado como %s a pedido confirmación de que %s es la URL de su identidad" + +#: modules/default/views/scripts/openid/trust.phtml:9 +msgid "It also requests this additional information about you:" +msgstr "También se requiere la siguiente información adicional:" + +#: 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ón 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: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:24 +msgid "Forever" +msgstr "Para siempre" + +#: modules/default/views/scripts/openid/trust.phtml:27 +msgid "Allow" +msgstr "Permitir" + +#: modules/default/views/scripts/openid/trust.phtml:28 +msgid "Deny" +msgstr "Denegar" + +#: modules/default/views/scripts/openid/login.phtml:5 +msgid "Login" +msgstr "Ingresar" + +#: modules/default/views/scripts/index/index.phtml:17 +msgid "OPEN AN ACCOUNT NOW" +msgstr "ABRA UNA CUENTA AHORA" + +#: modules/default/views/scripts/index/index.phtml:22 +msgid "Latest News" +msgstr "Ultimas Noticias" + +#: modules/default/views/scripts/sites/index.phtml:15 +msgid "Information Exchanged" +msgstr "Información Intercambiada" + +#: modules/default/views/scripts/sites/index.phtml:17 +msgid "Information exchanged with:" +msgstr "Información intercambiada con:" + +#: modules/default/views/scripts/sites/index.phtml:21 +msgid "OK" +msgstr "OK" + +#: modules/default/views/scripts/history/index.phtml:13 +msgid "Clear History" +msgstr "Borra Historial" + +#: 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 "Está cansado de tener que recordar docenas de
nombres de usuario y contraseñas
para sus sitios favoritos?" + +#: modules/default/views/scripts_monkeys/index/subheader.phtml:4 +msgid "Starting today
you'll only have to remember one" +msgstr "A partir de hoy
solo tendrá que recordar una" + +#: 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/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/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/sites/index.phtml:1 +msgid "Trusted Sites" +msgstr "Sitios de confianza" + +#: modules/install/views/scripts/complete/index.phtml:2 +msgid "The installation was performed successfully" +msgstr "La instalación fue exitosa" + +#: modules/install/views/scripts/complete/index.phtml:10 +msgid "Finish" +msgstr "Terminar" + +#: modules/install/views/scripts/permissions/index.phtml:2 +msgid "Please correct the following problems before proceeding:" +msgstr "Por favor corrija los siguientes problemas antes de proceder:" + +#: modules/install/views/scripts/permissions/index.phtml:10 +msgid "Check again" +msgstr "Chequear de nuevo" + +#: modules/install/views/scripts/credentials/index.phtml:2 +msgid "Database and E-mail information" +msgstr "Información de la base de datos y correo electrónico" + +#: 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 "Proceder con la instalación" + +#: modules/users/views/scripts/register/eula.phtml:1 +msgid "Please read the following EULA in order to continue" +msgstr "Por favor lea los siguientes Terminos de Uso para 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/register/index.phtml:1 +msgid "Registration Form" +msgstr "Formulario de Registro" + +#: 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 "Guardar" + +#: 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 "Cancelar" + +#: modules/users/views/scripts/personalinfo/show.phtml:8 +msgid "Not Entered" +msgstr "No Ingresado" + +#: 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 "Información Personal" + +#: modules/users/views/scripts/personalinfo/index.phtml:16 +#: modules/users/views/scripts/profile/index.phtml:17 +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/recoverpassword/index.phtml:1 +msgid "Please enter your E-mail below to receive a link to reset your password" +msgstr "Por favor ingrese su correo electrónico para recibir un enlace para restablecer su contraseña" + +#: modules/users/views/scripts/profile/index.phtml:13 +msgid "Account info" +msgstr "Información de la Cuenta" + +#: modules/users/views/scripts/profile/index.phtml:20 +msgid "Change Password" +msgstr "Cambiar contraseña" + +#: modules/users/views/scripts/profile/index.phtml:38 +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:22 +msgid "Delete Account" +msgstr "Eliminar Cuenta" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:3 +msgid "Why do you want to delete your Community-ID account?" +msgstr "¿Por qué desea eliminar su cuenta de Community-ID?" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:4 +msgid "Please check all that apply:" +msgstr "Por favor chequee todo lo que aplique:" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:8 +msgid "This was just a test account" +msgstr "Esta era solo una cuenta de prueba" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:11 +msgid "I found a better service" +msgstr "Encontré otro servicio mejor" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:14 +msgid "Service lacked some key features I needed" +msgstr "El servico carece de funcionalidades clave que requiero" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:17 +msgid "No particular reason" +msgstr "Ninguna razón en particular" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:20 +msgid "Additional comments:" +msgstr "Comentarios adicionales:" + +#: modules/users/views/scripts/profilegeneral/accountinfo.phtml:28 +msgid "OpenID" +msgstr "OpenID" + +#: modules/users/views/scripts/login/index.phtml:3 +#: modules/users/views/scripts_monkeys/login/index.phtml:3 +#, php-format +msgid "Hello, %s" +msgstr "Hola, %s" + +#: modules/users/views/scripts/login/index.phtml:7 +#: modules/users/views/scripts_monkeys/login/index.phtml:7 +msgid "Account" +msgstr "Cuenta" + +#: modules/users/views/scripts/login/index.phtml:13 +#: modules/users/views/scripts_monkeys/login/index.phtml:13 +msgid "Sites database" +msgstr "Base de datos de Sitios" + +#: modules/users/views/scripts/login/index.phtml:16 +#: modules/users/views/scripts_monkeys/login/index.phtml:16 +msgid "History Log" +msgstr "Historial" + +#: modules/users/views/scripts/login/index.phtml:19 +#: modules/users/views/scripts_monkeys/login/index.phtml:19 +msgid "Logout" +msgstr "Salir" + +#: modules/users/views/scripts/login/index.phtml:24 +#: modules/users/views/scripts_monkeys/login/index.phtml:24 +msgid "Admin options" +msgstr "Opciones de Adminstración" + +#: modules/users/views/scripts/login/index.phtml:27 +#: modules/users/views/scripts_monkeys/login/index.phtml:27 +msgid "Manage Users" +msgstr "Manejar Usuarios" + +#: modules/users/views/scripts/login/index.phtml:30 +#: modules/users/views/scripts_monkeys/login/index.phtml:30 +msgid "Message Users" +msgstr "Enviar Mensaje a Usuarios" + +#: modules/users/views/scripts/login/index.phtml:34 +#: modules/users/views/scripts_monkeys/login/index.phtml:34 +msgid "Disable Maintenance Mode" +msgstr "Deshabilitar Modo de Mantenimiento" + +#: modules/users/views/scripts/login/index.phtml:36 +#: modules/users/views/scripts_monkeys/login/index.phtml:36 +msgid "Enable Maintenance Mode" +msgstr "Habilitar Modo de Mantenimiento" + +#: modules/users/views/scripts/login/index.phtml:40 +#: modules/users/views/scripts_monkeys/login/index.phtml:40 +msgid "Statistics" +msgstr "Estadísticas" + +#: 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 "El acceso está actualmente deshabilitado debido a mantenimiento del sistema.
Por favor intente más tarde" + +#: modules/users/views/scripts/login/index.phtml:58 +#: modules/users/views/scripts_monkeys/login/index.phtml:61 +msgid "Remember me" +msgstr "Recuérdeme" + +#: modules/users/views/scripts/login/index.phtml:61 +#: modules/users/views/scripts_monkeys/login/index.phtml:64 +msgid "Log in" +msgstr "Ingresar" + +#: modules/users/views/scripts/login/index.phtml:67 +#: modules/users/views/scripts_monkeys/login/index.phtml:70 +msgid "Forgot you password?" +msgstr "¿Olvidó su contraseñ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 "¿No tiene una cuenta?" + +#: modules/users/views/scripts/login/index.phtml:75 +#: modules/users/views/scripts_monkeys/login/index.phtml:78 +msgid "REGISTER NOW!" +msgstr "¡REGISTRESE AHORA!" + +#: modules/users/views/scripts/manageusers/index.phtml:11 +msgid "All" +msgstr "Todos" + +#: modules/users/views/scripts/manageusers/index.phtml:14 +msgid "Confirmed" +msgstr "Confirmados" + +#: modules/users/views/scripts/manageusers/index.phtml:17 +msgid "Unconfirmed" +msgstr "No confirmados" + +#: modules/users/views/scripts/manageusers/index.phtml:24 +msgid "Total users:" +msgstr "Total usuarios:" + +#: modules/users/views/scripts/manageusers/index.phtml:25 +msgid "Total confirmed users:" +msgstr "Total usuarios confirmados:" + +#: modules/users/views/scripts/manageusers/index.phtml:26 +msgid "Total unconfirmed users:" +msgstr "Total usuarios no confirmados:" + +#: modules/users/views/scripts/manageusers/index.phtml:29 +msgid "Add User" +msgstr "Agregar Usuario" + +#: modules/users/views/scripts/manageusers/index.phtml:31 +msgid "Delete Unconfirmed Users" +msgstr "Eliminar Usuarios no Confirmados" + +#: views/layouts_monkeys/layout.phtml:32 +#: views/layouts/layout.phtml:32 +msgid "Home" +msgstr "Inicio" + +#: views/layouts_monkeys/layout.phtml:35 +#: views/layouts/layout.phtml:35 +msgid "Feedback" +msgstr "Retroalimentación" + +#: views/layouts_monkeys/layout.phtml:38 +msgid "Help and Support" +msgstr "Ayuda y Soporte" + +#: views/layouts_monkeys/layout.phtml:55 +#: views/layouts/layout.phtml:52 +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:75 +msgid "Privacy" +msgstr "Privacidad" + +#: views/layouts_monkeys/layout.phtml:78 +msgid "About Us" +msgstr "Sobre Nosotros" + +#: views/layouts_monkeys/layout.phtml:81 +msgid "Contact Us" +msgstr "Contáctenos" + diff --git a/languages/nl/lang.mo b/languages/nl/lang.mo new file mode 100644 index 0000000..027d55a Binary files /dev/null and b/languages/nl/lang.mo differ diff --git a/languages/nl/lang.po b/languages/nl/lang.po new file mode 100644 index 0000000..4810e98 --- /dev/null +++ b/languages/nl/lang.po @@ -0,0 +1,722 @@ +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/lang.mo b/languages/pl/lang.mo new file mode 100644 index 0000000..ee4bd98 Binary files /dev/null and b/languages/pl/lang.mo differ diff --git a/languages/pl/lang.po b/languages/pl/lang.po new file mode 100644 index 0000000..a21583b --- /dev/null +++ b/languages/pl/lang.po @@ -0,0 +1,774 @@ +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/libs/MODIFICATIONS.txt b/libs/MODIFICATIONS.txt new file mode 100644 index 0000000..37b5207 --- /dev/null +++ b/libs/MODIFICATIONS.txt @@ -0,0 +1,5 @@ +Modifications to the jpgraph lib: + - this is just the src directory + - copied the README, VERSION and QPL.txt files + - removed the Examples dir + - removed the flags* files diff --git a/libs/Monkeys/AccessDeniedException.php b/libs/Monkeys/AccessDeniedException.php new file mode 100644 index 0000000..0b0f879 --- /dev/null +++ b/libs/Monkeys/AccessDeniedException.php @@ -0,0 +1,18 @@ +getWordLen(); + $vowels = $this->_useNumbers ? self::$VN : self::$V; + $consonants = $this->_useNumbers ? self::$CN : self::$C; + + for ($i=0; $i < $wordLen; $i = $i + 2) { + // generate word with mix of vowels and consonants + $consonant = $consonants[array_rand($consonants)]; + $vowel = $vowels[array_rand($vowels)]; + $word .= $consonant . $vowel; + } + + if (strlen($word) > $wordLen) { + $word = substr($word, 0, $wordLen); + } + + return $word; + } + + /** + * Set captcha word + * + * @param string $word + * @return Zend_Captcha_Word + */ + protected function _setWord($word) + { + $word = strtoupper($word); + $session = $this->getSession(); + $session->word = $word; + $this->_word = $word; + return $this; + } + + /** + * Validate the word + * + * Overriden to handle on in uppercase for better readability + * + * @see Zend_Validate_Interface::isValid() + * @param mixed $value + * @return boolean + */ + public function isValid($value, $context = null) + { + $name = $this->getName(); + if (!isset($context[$name]['input'])) { + $this->_error(self::MISSING_VALUE); + return false; + } + $value = strtoupper($context[$name]['input']); + $this->_setValue($value); + + if (!isset($context[$name]['id'])) { + $this->_error(self::MISSING_ID); + return false; + } + + $this->_id = $context[$name]['id']; + if ($value !== $this->getWord()) { + $this->_error(self::BAD_CAPTCHA); + return false; + } + + return true; + } +} diff --git a/libs/Monkeys/Controller/Action.php b/libs/Monkeys/Controller/Action.php new file mode 100755 index 0000000..8d3b58d --- /dev/null +++ b/libs/Monkeys/Controller/Action.php @@ -0,0 +1,163 @@ +createRow(); + Zend_Registry::set('user', $user); + } + + $this->_config = Zend_Registry::get('config'); + + $this->user = Zend_Registry::get('user'); + $this->view->user = $this->user; + + $this->_validateTargetUser(); + $this->_checkMaintenanceMode(); + + $this->view->controller = $this; + + $this->view->addHelperPath('libs/Monkeys/View/Helper', 'Monkeys_View_Helper'); + $this->_setScriptPaths(); + $this->_setBase(); + $this->view->numCols = $this->_numCols; + + if ($this->getRequest()->isXmlHttpRequest()) { + $slowdown = $this->_config->environment->ajax_slowdown; + if ($slowdown > 0) { + sleep($slowdown); + } + $this->_helper->layout->disableLayout(); + } else { + $this->view->version = Setup::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.6.0/build/' + : $this->view->base . '/javascript/yui/'; + } + } + + private function _setScriptPaths() + { + if (($template = $this->_config->environment->template) == 'default') { + return; + } + + $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer'); + $view = $viewRenderer->view; + $scriptPaths = $view->getScriptPaths(); + $oldPath = $scriptPaths[0]; + $newPath = substr($oldPath, 0, strrpos($oldPath, DIRECTORY_SEPARATOR, -2) + 1) . "scripts_$template" . DIRECTORY_SEPARATOR; + $view->addScriptPath($newPath); + } + + private function _setBase() + { + if ($this->_config->subdomain->enabled) { + $protocol = $this->_getProtocol(); + + $this->view->base = "$protocol://" + . ($this->_config->subdomain->use_www? 'www.' : '') + . $this->_config->subdomain->hostname; + } else { + $this->view->base = $this->view->getBase(); + } + } + + private function _validateTargetUser() + { + if (Zend_Registry::isRegistered('targetUser')) { + // used by unit tests to inject the target user + $this->targetUser = Zend_Registry::get('targetUser'); + } else { + $userId = $this->_getParam('userid'); + + if (is_null($userId)) { + $this->targetUser = $this->user; + } elseif ($this->_getParam('userid') == 0) { + $users = new Users(); + $this->targetUser = $users->createRow(); + } else { + if ($userId != $this->user->id && $this->user->role != User::ROLE_ADMIN) { + $this->_helper->FlashMessenger->addMessage('Error: Invalid user id'); + $this->_redirect('profile/edit'); + } + $users = new Users(); + $this->targetUser = $users->getRowInstance($userId); + } + } + + $this->view->targetUser = $this->targetUser; + } + + protected function _checkMaintenanceMode() + { + if (!$this->_config->environment->installed) { + $this->underMaintenance = true; + $this->view->underMaintenance = false; + return; + } + + $settings = new Settings(); + $this->underMaintenance = $settings->isMaintenanceMode(); + $this->view->underMaintenance = $this->underMaintenance; + } + + protected function _redirectToNormalConnection() + { + if ($this->_config->SSL->enable_mixed_mode) { + $this->_redirect('http://' . $_SERVER['HTTP_HOST'] . $this->view->base); + } else { + $this->_redirect(''); + } + } + + protected function _redirectForMaintenance($backToNormalConnection = false) + { + if ($backToNormalConnection) { + $this->_redirectToNormalConnection(''); + } else { + $this->_redirect(''); + } + } + + protected function _redirect($url, $options = array()) + { + Zend_Registry::get('logger')->log("redirected to '$url'", Zend_Log::DEBUG); + + return parent::_redirect($url, $options); + } + + protected function _getProtocol() + { + if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') { + return 'https'; + } else { + return 'http'; + } + } +} diff --git a/libs/Monkeys/Controller/Error.php b/libs/Monkeys/Controller/Error.php new file mode 100644 index 0000000..84ac3ad --- /dev/null +++ b/libs/Monkeys/Controller/Error.php @@ -0,0 +1,118 @@ +_getParam('error_handler'); + + if (!$this->_config->environment->production) { + echo "

"; + Zend_Debug::Dump($errors); + } + + $exceptionClass = get_class($errors->exception); + + Zend_Registry::get('logger')->log( + "Exception $exceptionClass\nMessage: ".$errors->exception->getMessage()."\nStack: \n" . print_r($errors->exception->getTraceAsString(), true), + Zend_Log::ERR + ); + + switch ($exceptionClass) { + case 'Monkeys_BadUrlException'; + $this->getResponse()->setRawHeader('HTTP/1.1 404 Not Found'); + + $this->view->message = 'The URL you entered is incorrect. Please correct and try again.'; + 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.'; + break; + default: + $this->view->message = get_class($errors->exception) . '
' . $errors->exception->getMessage(); + if (!$this->_config->environment->production) { + $this->view->trace = $errors->exception->getTraceAsString(); + } 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.'; + } + break; + } + + $this->getResponse()->clearBody(); + } + + /** + * @return Zend_Mail + * @throws Zend_Mail_Protocol_Exception + */ + public static function getMail(Exception $ex, User $user, $errors) + { + $exceptionClass = get_class($ex); + $stack = $ex->getTraceAsString(); + $stackDetail = print_r($errors, true); + $currentUrl = Zend_OpenId::selfURL(); + if ($user->role = ROLE_GUEST) { + $userLabel = 'Anonymous'; + } else { + $userLabel = $user->getFullName() . '(' . $user->username . ')'; + } + + $body = <<email; + + switch (strtolower($configEmail->transport)) { + case 'smtp': + Zend_Mail::setDefaultTransport( + new Zend_Mail_Transport_Smtp( + $configEmail->host, + $configEmail->toArray() + ) + ); + break; + case 'mock': + Zend_Mail::setDefaultTransport(new Zend_Mail_Transport_Mock()); + break; + default: + Zend_Mail::setDefaultTransport(new Zend_Mail_Transport_Sendmail()); + } + + $mail = new Zend_Mail(); + $mail->setBodyText($body); + $mail->setFrom('support@community-id.org'); + $mail->addTo($configEmail->adminemail); + $mail->setSubject('Community-ID error report'); + + return $mail; + } +} diff --git a/libs/Monkeys/Controller/Plugin/Auth.php b/libs/Monkeys/Controller/Plugin/Auth.php new file mode 100755 index 0000000..5dd04ec --- /dev/null +++ b/libs/Monkeys/Controller/Plugin/Auth.php @@ -0,0 +1,72 @@ +_acl = $acl; + } + + public function preDispatch($request) + { + if (!Zend_Registry::get('config')->environment->installed + && $request->getModuleName() != 'install' + && $request->getControllerName() != 'error') + { + $request->setModuleName('install'); + $request->setControllerName('index'); + $request->setActionName('index'); + + return; + } + + if (Zend_Registry::isRegistered('user')) { + // used by unit tests to inject the logged-in user + $user= Zend_Registry::get('user'); + } else { + $auth = Zend_Auth::getInstance(); + $users = new Users(); + if ($auth->hasIdentity()) { + $user = $auth->getStorage()->read(); + $user->init(); + + // reactivate row as live data + $user->setTable($users); + } else { + // guest user + $user = $users->createRow(); + } + + Zend_Registry::set('user', $user); + } + + $resource = $request->getModuleName() . '_' . $request->getControllerName(); + + if (!$this->_acl->has($resource)) { + //echo "role: " . $user->role . " - resource: $resource - privilege: " . $request->getActionName() . "
\n"; + 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(User::ROLE_ADMIN, $resource, $request->getActionName())) { + //echo "role: " . $user->role . " - resource: $resource - privilege: " . $request->getActionName() . "
\n"; + 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"; + throw new Monkeys_AccessDeniedException(); + } + } +} diff --git a/libs/Monkeys/Db/Profiler.php b/libs/Monkeys/Db/Profiler.php new file mode 100755 index 0000000..cc363d8 --- /dev/null +++ b/libs/Monkeys/Db/Profiler.php @@ -0,0 +1,24 @@ +log("DB QUERY: $queryText", Zend_Log::DEBUG); + return parent::queryStart($queryText, $queryType); + } +} diff --git a/libs/Monkeys/Db/Table/Gateway.php b/libs/Monkeys/Db/Table/Gateway.php new file mode 100755 index 0000000..c8fecc0 --- /dev/null +++ b/libs/Monkeys/Db/Table/Gateway.php @@ -0,0 +1,18 @@ +fetchRow($this->select()->where('id = ?', $id)); + } +} diff --git a/libs/Monkeys/Form/Decorator/Composite.php b/libs/Monkeys/Form/Decorator/Composite.php new file mode 100644 index 0000000..94cc352 --- /dev/null +++ b/libs/Monkeys/Form/Decorator/Composite.php @@ -0,0 +1,136 @@ +getElement(); + $label = $element->getLabel(); + if ($translator = $element->getTranslator()) { + $label = $translator->translate($label); + } + if ($element->isRequired()) { + $label .= '*'; + } + + return $label . ':'; + /*return $element->getView() + ->formLabel($element->getName(), $label);*/ + } + + public function buildInput($content = '') + { + $element = $this->getElement(); + $helper = $element->helper; + $attribs = $element->getAttribs(); + if ($this->getOption('bottom')) { + $attribs = array_merge($attribs, array('style' => 'top:0; width:auto')); + } + + if ($element instanceof Monkeys_Form_Element_Captcha) { + return $content; + } + + $input = $element->getView()->$helper( + $element->getName(), + $element->getValue(), + $attribs, + $element->options, + $this->getSeparator() + ); + + if ($element instanceof Monkeys_Form_Element_Radio) { + return "
$input
"; + } + + return $input; + } + + public function buildErrors() + { + $element = $this->getElement(); + $messages = $element->getMessages(); + if (empty($messages)) { + return ''; + } + + return $element->getView()->formErrors($messages); + /*return '
' . + $element->getView()->formErrors($messages) . '
';*/ + } + + public function buildDescription() + { + $element = $this->getElement(); + $desc = $element->getDescription(); + if (empty($desc)) { + return ''; + } + if ($translator = $element->getTranslator()) { + $desc = $translator->translate($desc); + } + + return $desc; + } + + public function render($content) + { + $element = $this->getElement(); + if (!$element instanceof Zend_Form_Element) { + return $content; + } + if (null === $element->getView()) { + return $content; + } + + $placement = $this->getPlacement(); + $label = $this->buildLabel(); + $input = $this->buildInput($content); + $errors = $this->buildErrors(); + $desc = $this->buildDescription(); + + if ($desc && $errors) { + $desc = "
$desc
"; + } else if ($desc && !$errors) { + $desc = "
$desc
"; + } + + if ($this->getOption('yuiGridType')) { + $yuiGridType = $this->getOption('yuiGridType'); + } else { + $yuiGridType = 'gf'; + } + + if ($this->getOption('wideLabel')) { + $output = "
\n" + ."
$label
\n" + ."
 
\n" + ."
\n" + ." $input\n" + ." $desc\n" + . ($errors? "
$errors
\n" : "") + ."
\n" + ."
\n"; + } else if ($this->getOption('continuous')) { + $output = "
\n" + ." $label $input" + ."
\n" + ." $desc\n" + . ($errors? "
$errors
\n" : "") + ."
\n" + ."
\n"; + } else { + $output = "
\n" + ."
$label
\n" + ."
\n" + ." $input\n" + ." $desc\n" + . ($errors? "
$errors
\n" : "") + ."
\n" + ."
\n"; + } + + return $output; + } +} + diff --git a/libs/Monkeys/Form/Element/Captcha.php b/libs/Monkeys/Form/Element/Captcha.php new file mode 100644 index 0000000..f2f55cd --- /dev/null +++ b/libs/Monkeys/Form/Element/Captcha.php @@ -0,0 +1,38 @@ +addPrefixPath('Monkeys_Captcha', 'Monkeys/Captcha/', 'captcha'); + $options = array_merge($options, array('disableLoadDefaultDecorators' =>true)); + parent::__construct($spec, $options); + + $this->_decorator = new Monkeys_Form_Decorator_Composite(); + $this->addDecorator($this->_decorator); + } + + public function setDecoratorOptions(array $options) + { + $this->_decorator->setOptions($options); + + return $this; + } +} diff --git a/libs/Monkeys/Form/Element/Checkbox.php b/libs/Monkeys/Form/Element/Checkbox.php new file mode 100644 index 0000000..2040b73 --- /dev/null +++ b/libs/Monkeys/Form/Element/Checkbox.php @@ -0,0 +1,23 @@ +true)); + parent::__construct($spec, $options); + + $this->_decorator = new Monkeys_Form_Decorator_Composite(); + $this->addDecorator($this->_decorator); + } + + public function setDecoratorOptions(array $options) + { + $this->_decorator->setOptions($options); + + return $this; + } +} + diff --git a/libs/Monkeys/Form/Element/Country.php b/libs/Monkeys/Form/Element/Country.php new file mode 100644 index 0000000..116b9fe --- /dev/null +++ b/libs/Monkeys/Form/Element/Country.php @@ -0,0 +1,41 @@ +true)); + parent::__construct($spec, $options); + + $this->_decorator = new Monkeys_Form_Decorator_Composite(); + $this->addDecorator($this->_decorator); + } + + public function setDecoratorOptions(array $options) + { + $this->_decorator->setOptions($options); + + return $this; + } + + public function init() + { + parent::init(); + + translate('-- Select a Country --'); + $this->addMultiOption(0, '-- Select a Country --'); + $this->addMultiOptions(Zend_Locale::getCountryTranslationList(Zend_Registry::get('Zend_Locale'))); + asort($this->options); + } +} diff --git a/libs/Monkeys/Form/Element/Date.php b/libs/Monkeys/Form/Element/Date.php new file mode 100644 index 0000000..4da65e6 --- /dev/null +++ b/libs/Monkeys/Form/Element/Date.php @@ -0,0 +1,164 @@ +true)); + parent::__construct($spec, $options); + + $this->_decorator = new Monkeys_Form_Decorator_Composite(); + $this->addDecorator($this->_decorator); + } + + public function setDecoratorOptions(array $options) + { + $this->_decorator->setOptions($options); + + return $this; + } + + public function init() + { + $this->options['showEmpty'] = true; + $this->options['startYear'] = 1900; + $this->options['endYear'] = (int) date("Y"); + $this->options['reverseYears'] = false; + } + + public function setShowEmptyValues($value) + { + $this->options['showEmpty'] = (bool) $value; + return $this; + } + + public function setStartEndYear($start = null, $end = null) + { + if ($start) + { + $this->options['startYear'] = (int) $start; + } + + if ($end) + { + $this->options['endYear'] = (int) $end; + } + return $this; + } + + public function setReverseYears($value) + { + $this->options['reverseYears'] = (bool) $value; + return $this; + } + + + /** + * We want to get the date from our auxiliary fields here + * + * @param mixed $value + * @param mixed $context + * @return boolean + */ + public function isValid($value, $context = null) + { + $fieldName = $this->getName(); + $auxiliaryFieldsNames = $this->getDayMonthYearFieldNames($fieldName); + if (isset($context[$auxiliaryFieldsNames['day']]) && isset($context[$auxiliaryFieldsNames['month']]) + && isset($context[$auxiliaryFieldsNames['year']])) + { + if ($context[$auxiliaryFieldsNames['year']] == '-' + || $context[$auxiliaryFieldsNames['month']] == '-' + || $context[$auxiliaryFieldsNames['day']] == '-') + { + $value = null; + } + else + { + $value = str_pad($context[$auxiliaryFieldsNames['year']], 4, '0', STR_PAD_LEFT) . '-' + . str_pad($context[$auxiliaryFieldsNames['month']], 2, '0', STR_PAD_LEFT) . '-' + . str_pad($context[$auxiliaryFieldsNames['day']], 2, '0', STR_PAD_LEFT); + } + + $this->setValue($value); + } + + return parent::isValid($value, $context); + } + + /** + * Makes day, month and year names from given element name. Special case is array notation. + * + * Given a value such as foo[bar][baz], the generated names will be + * foo[bar][baz_day], foo[bar][baz_month] and foo[bar][baz_year] + * I know it is bad design to have this function here and in the View Helper, + * but I really can't think of other way + * + * @param string $value + * @return array + */ + protected function getDayMonthYearFieldNames($value) + { + if (empty($value) || !is_string($value)) { + return $value; + } + + $ret = array( + 'day' => $value . '_day', + 'month' => $value . '_month', + 'year' => $value . '_year' + ); + + if (strstr($value, '[')) + { + $endPos = strlen($value) - 1; + if (']' != $value[$endPos]) { + return $ret; + } + + $start = strrpos($value, '[') + 1; + $name = substr($value, $start, $endPos - $start); + $arrayName = substr($value, 0, $start-1); + $ret = array( + 'day' => $arrayName . '[' . $name . '_day' . ']', + 'month' => $arrayName . '[' . $name . '_month' . ']', + 'year' => $arrayName . '[' . $name . '_year' . ']' + ); + } + return $ret; + } +} diff --git a/libs/Monkeys/Form/Element/File.php b/libs/Monkeys/Form/Element/File.php new file mode 100644 index 0000000..eb9733d --- /dev/null +++ b/libs/Monkeys/Form/Element/File.php @@ -0,0 +1,23 @@ +true)); + parent::__construct($spec, $options); + + $this->_decorator = new Monkeys_Form_Decorator_Composite(); + $this->addDecorator($this->_decorator); + } + + public function setDecoratorOptions(array $options) + { + $this->_decorator->setOptions($options); + + return $this; + } +} + diff --git a/libs/Monkeys/Form/Element/Language.php b/libs/Monkeys/Form/Element/Language.php new file mode 100644 index 0000000..b440a5d --- /dev/null +++ b/libs/Monkeys/Form/Element/Language.php @@ -0,0 +1,41 @@ +true)); + parent::__construct($spec, $options); + + $this->_decorator = new Monkeys_Form_Decorator_Composite(); + $this->addDecorator($this->_decorator); + } + + public function setDecoratorOptions(array $options) + { + $this->_decorator->setOptions($options); + + return $this; + } + + public function init() + { + parent::init(); + + translate('-- Select a Language --'); + $this->addMultiOption(0, '-- Select a Language --'); + $this->addMultiOptions(Zend_Locale::getLanguageTranslationList(Zend_Registry::get('Zend_Locale'))); + asort($this->options); + } +} diff --git a/libs/Monkeys/Form/Element/Password.php b/libs/Monkeys/Form/Element/Password.php new file mode 100644 index 0000000..9050611 --- /dev/null +++ b/libs/Monkeys/Form/Element/Password.php @@ -0,0 +1,13 @@ +true)); + parent::__construct($spec, $options); + + $this->addDecorator(new Monkeys_Form_Decorator_Composite()); + } +} + diff --git a/libs/Monkeys/Form/Element/Radio.php b/libs/Monkeys/Form/Element/Radio.php new file mode 100644 index 0000000..cf78d85 --- /dev/null +++ b/libs/Monkeys/Form/Element/Radio.php @@ -0,0 +1,23 @@ +true)); + parent::__construct($spec, $options); + + $this->_decorator = new Monkeys_Form_Decorator_Composite(); + $this->addDecorator($this->_decorator); + } + + public function setDecoratorOptions(array $options) + { + $this->_decorator->setOptions($options); + + return $this; + } +} + diff --git a/libs/Monkeys/Form/Element/Text.php b/libs/Monkeys/Form/Element/Text.php new file mode 100644 index 0000000..7e08e3d --- /dev/null +++ b/libs/Monkeys/Form/Element/Text.php @@ -0,0 +1,22 @@ +true)); + parent::__construct($spec, $options); + + $this->_decorator = new Monkeys_Form_Decorator_Composite(); + $this->addDecorator($this->_decorator); + } + + public function setDecoratorOptions(array $options) + { + $this->_decorator->setOptions($options); + + return $this; + } +} diff --git a/libs/Monkeys/Form/Element/Textarea.php b/libs/Monkeys/Form/Element/Textarea.php new file mode 100644 index 0000000..ca6eb1f --- /dev/null +++ b/libs/Monkeys/Form/Element/Textarea.php @@ -0,0 +1,23 @@ +true)); + parent::__construct($spec, $options); + + $this->_decorator = new Monkeys_Form_Decorator_Composite(); + $this->addDecorator($this->_decorator); + } + + public function setDecoratorOptions(array $options) + { + $this->_decorator->setOptions($options); + + return $this; + } +} + diff --git a/libs/Monkeys/Form/Element/Timezone.php b/libs/Monkeys/Form/Element/Timezone.php new file mode 100644 index 0000000..085107d --- /dev/null +++ b/libs/Monkeys/Form/Element/Timezone.php @@ -0,0 +1,54 @@ +true)); + parent::__construct($spec, $options); + + $this->_decorator = new Monkeys_Form_Decorator_Composite(); + $this->addDecorator($this->_decorator); + } + + public function setDecoratorOptions(array $options) + { + $this->_decorator->setOptions($options); + + return $this; + } + + public function init() + { + parent::init(); + + $fp = fopen(dirname(__FILE__) . '/zone.tab', 'r'); + $timezones = array(); + while ($row = fgets($fp)) { + if ($row[0] == '#') { + continue; + } + + $elements = explode("\t", $row); + $timezones[trim($elements[2])] = trim(strtr($elements[2], '_', ' ')); + } + ksort($timezones); + + translate('-- Select a Timezone --'); + $this->addMultiOption(0, '-- Select a Timezone --'); + foreach ($timezones as $key => $value) { + $this->addMultiOption($key, $value); + } + } +} diff --git a/libs/Monkeys/Form/Element/zone.tab b/libs/Monkeys/Form/Element/zone.tab new file mode 100644 index 0000000..7513b0e --- /dev/null +++ b/libs/Monkeys/Form/Element/zone.tab @@ -0,0 +1,425 @@ +# @(#)zone.tab 8.21 +# +# TZ zone descriptions +# +# From Paul Eggert (1996-08-05): +# +# This file contains a table with the following columns: +# 1. ISO 3166 2-character country code. See the file `iso3166.tab'. +# 2. Latitude and longitude of the zone's principal location +# in ISO 6709 sign-degrees-minutes-seconds format, +# either +-DDMM+-DDDMM or +-DDMMSS+-DDDMMSS, +# first latitude (+ is north), then longitude (+ is east). +# 3. Zone name used in value of TZ environment variable. +# 4. Comments; present if and only if the country has multiple rows. +# +# Columns are separated by a single tab. +# The table is sorted first by country, then an order within the country that +# (1) makes some geographical sense, and +# (2) puts the most populous zones first, where that does not contradict (1). +# +# Lines beginning with `#' are comments. +# +#country- +#code coordinates TZ comments +AD +4230+00131 Europe/Andorra +AE +2518+05518 Asia/Dubai +AF +3431+06912 Asia/Kabul +AG +1703-06148 America/Antigua +AI +1812-06304 America/Anguilla +AL +4120+01950 Europe/Tirane +AM +4011+04430 Asia/Yerevan +AN +1211-06900 America/Curacao +AO -0848+01314 Africa/Luanda +AQ -7750+16636 Antarctica/McMurdo McMurdo Station, Ross Island +AQ -9000+00000 Antarctica/South_Pole Amundsen-Scott Station, South Pole +AQ -6734-06808 Antarctica/Rothera Rothera Station, Adelaide Island +AQ -6448-06406 Antarctica/Palmer Palmer Station, Anvers Island +AQ -6736+06253 Antarctica/Mawson Mawson Station, Holme Bay +AQ -6835+07758 Antarctica/Davis Davis Station, Vestfold Hills +AQ -6617+11031 Antarctica/Casey Casey Station, Bailey Peninsula +AQ -7824+10654 Antarctica/Vostok Vostok Station, S Magnetic Pole +AQ -6640+14001 Antarctica/DumontDUrville Dumont-d'Urville Station, Terre Adelie +AQ -690022+0393524 Antarctica/Syowa Syowa Station, E Ongul I +AR -3436-05827 America/Argentina/Buenos_Aires Buenos Aires (BA, CF) +AR -3124-06411 America/Argentina/Cordoba most locations (CB, CC, CN, ER, FM, MN, SE, SF) +AR -2447-06525 America/Argentina/Salta (SA, LP, NQ, RN) +AR -2411-06518 America/Argentina/Jujuy Jujuy (JY) +AR -2649-06513 America/Argentina/Tucuman Tucuman (TM) +AR -2828-06547 America/Argentina/Catamarca Catamarca (CT), Chubut (CH) +AR -2926-06651 America/Argentina/La_Rioja La Rioja (LR) +AR -3132-06831 America/Argentina/San_Juan San Juan (SJ) +AR -3253-06849 America/Argentina/Mendoza Mendoza (MZ) +AR -3319-06621 America/Argentina/San_Luis San Luis (SL) +AR -5138-06913 America/Argentina/Rio_Gallegos Santa Cruz (SC) +AR -5448-06818 America/Argentina/Ushuaia Tierra del Fuego (TF) +AS -1416-17042 Pacific/Pago_Pago +AT +4813+01620 Europe/Vienna +AU -3133+15905 Australia/Lord_Howe Lord Howe Island +AU -4253+14719 Australia/Hobart Tasmania - most locations +AU -3956+14352 Australia/Currie Tasmania - King Island +AU -3749+14458 Australia/Melbourne Victoria +AU -3352+15113 Australia/Sydney New South Wales - most locations +AU -3157+14127 Australia/Broken_Hill New South Wales - Yancowinna +AU -2728+15302 Australia/Brisbane Queensland - most locations +AU -2016+14900 Australia/Lindeman Queensland - Holiday Islands +AU -3455+13835 Australia/Adelaide South Australia +AU -1228+13050 Australia/Darwin Northern Territory +AU -3157+11551 Australia/Perth Western Australia - most locations +AU -3143+12852 Australia/Eucla Western Australia - Eucla area +AW +1230-06958 America/Aruba +AX +6006+01957 Europe/Mariehamn +AZ +4023+04951 Asia/Baku +BA +4352+01825 Europe/Sarajevo +BB +1306-05937 America/Barbados +BD +2343+09025 Asia/Dhaka +BE +5050+00420 Europe/Brussels +BF +1222-00131 Africa/Ouagadougou +BG +4241+02319 Europe/Sofia +BH +2623+05035 Asia/Bahrain +BI -0323+02922 Africa/Bujumbura +BJ +0629+00237 Africa/Porto-Novo +BL +1753-06251 America/St_Barthelemy +BM +3217-06446 Atlantic/Bermuda +BN +0456+11455 Asia/Brunei +BO -1630-06809 America/La_Paz +BR -0351-03225 America/Noronha Atlantic islands +BR -0127-04829 America/Belem Amapa, E Para +BR -0343-03830 America/Fortaleza NE Brazil (MA, PI, CE, RN, PB) +BR -0803-03454 America/Recife Pernambuco +BR -0712-04812 America/Araguaina Tocantins +BR -0940-03543 America/Maceio Alagoas, Sergipe +BR -1259-03831 America/Bahia Bahia +BR -2332-04637 America/Sao_Paulo S & SE Brazil (GO, DF, MG, ES, RJ, SP, PR, SC, RS) +BR -2027-05437 America/Campo_Grande Mato Grosso do Sul +BR -1535-05605 America/Cuiaba Mato Grosso +BR -0226-05452 America/Santarem W Para +BR -0846-06354 America/Porto_Velho Rondonia +BR +0249-06040 America/Boa_Vista Roraima +BR -0308-06001 America/Manaus E Amazonas +BR -0640-06952 America/Eirunepe W Amazonas +BR -0958-06748 America/Rio_Branco Acre +BS +2505-07721 America/Nassau +BT +2728+08939 Asia/Thimphu +BW -2545+02555 Africa/Gaborone +BY +5354+02734 Europe/Minsk +BZ +1730-08812 America/Belize +CA +4734-05243 America/St_Johns Newfoundland Time, including SE Labrador +CA +4439-06336 America/Halifax Atlantic Time - Nova Scotia (most places), PEI +CA +4612-05957 America/Glace_Bay Atlantic Time - Nova Scotia - places that did not observe DST 1966-1971 +CA +4606-06447 America/Moncton Atlantic Time - New Brunswick +CA +5320-06025 America/Goose_Bay Atlantic Time - Labrador - most locations +CA +5125-05707 America/Blanc-Sablon Atlantic Standard Time - Quebec - Lower North Shore +CA +4531-07334 America/Montreal Eastern Time - Quebec - most locations +CA +4339-07923 America/Toronto Eastern Time - Ontario - most locations +CA +4901-08816 America/Nipigon Eastern Time - Ontario & Quebec - places that did not observe DST 1967-1973 +CA +4823-08915 America/Thunder_Bay Eastern Time - Thunder Bay, Ontario +CA +6344-06828 America/Iqaluit Eastern Time - east Nunavut - most locations +CA +6608-06544 America/Pangnirtung Eastern Time - Pangnirtung, Nunavut +CA +744144-0944945 America/Resolute Eastern Time - Resolute, Nunavut +CA +484531-0913718 America/Atikokan Eastern Standard Time - Atikokan, Ontario and Southampton I, Nunavut +CA +624900-0920459 America/Rankin_Inlet Central Time - central Nunavut +CA +4953-09709 America/Winnipeg Central Time - Manitoba & west Ontario +CA +4843-09434 America/Rainy_River Central Time - Rainy River & Fort Frances, Ontario +CA +5024-10439 America/Regina Central Standard Time - Saskatchewan - most locations +CA +5017-10750 America/Swift_Current Central Standard Time - Saskatchewan - midwest +CA +5333-11328 America/Edmonton Mountain Time - Alberta, east British Columbia & west Saskatchewan +CA +690650-1050310 America/Cambridge_Bay Mountain Time - west Nunavut +CA +6227-11421 America/Yellowknife Mountain Time - central Northwest Territories +CA +682059-1334300 America/Inuvik Mountain Time - west Northwest Territories +CA +5946-12014 America/Dawson_Creek Mountain Standard Time - Dawson Creek & Fort Saint John, British Columbia +CA +4916-12307 America/Vancouver Pacific Time - west British Columbia +CA +6043-13503 America/Whitehorse Pacific Time - south Yukon +CA +6404-13925 America/Dawson Pacific Time - north Yukon +CC -1210+09655 Indian/Cocos +CD -0418+01518 Africa/Kinshasa west Dem. Rep. of Congo +CD -1140+02728 Africa/Lubumbashi east Dem. Rep. of Congo +CF +0422+01835 Africa/Bangui +CG -0416+01517 Africa/Brazzaville +CH +4723+00832 Europe/Zurich +CI +0519-00402 Africa/Abidjan +CK -2114-15946 Pacific/Rarotonga +CL -3327-07040 America/Santiago most locations +CL -2709-10926 Pacific/Easter Easter Island & Sala y Gomez +CM +0403+00942 Africa/Douala +CN +3114+12128 Asia/Shanghai east China - Beijing, Guangdong, Shanghai, etc. +CN +4545+12641 Asia/Harbin Heilongjiang (except Mohe), Jilin +CN +2934+10635 Asia/Chongqing central China - Sichuan, Yunnan, Guangxi, Shaanxi, Guizhou, etc. +CN +4348+08735 Asia/Urumqi most of Tibet & Xinjiang +CN +3929+07559 Asia/Kashgar west Tibet & Xinjiang +CO +0436-07405 America/Bogota +CR +0956-08405 America/Costa_Rica +CU +2308-08222 America/Havana +CV +1455-02331 Atlantic/Cape_Verde +CX -1025+10543 Indian/Christmas +CY +3510+03322 Asia/Nicosia +CZ +5005+01426 Europe/Prague +DE +5230+01322 Europe/Berlin +DJ +1136+04309 Africa/Djibouti +DK +5540+01235 Europe/Copenhagen +DM +1518-06124 America/Dominica +DO +1828-06954 America/Santo_Domingo +DZ +3647+00303 Africa/Algiers +EC -0210-07950 America/Guayaquil mainland +EC -0054-08936 Pacific/Galapagos Galapagos Islands +EE +5925+02445 Europe/Tallinn +EG +3003+03115 Africa/Cairo +EH +2709-01312 Africa/El_Aaiun +ER +1520+03853 Africa/Asmara +ES +4024-00341 Europe/Madrid mainland +ES +3553-00519 Africa/Ceuta Ceuta & Melilla +ES +2806-01524 Atlantic/Canary Canary Islands +ET +0902+03842 Africa/Addis_Ababa +FI +6010+02458 Europe/Helsinki +FJ -1808+17825 Pacific/Fiji +FK -5142-05751 Atlantic/Stanley +FM +0725+15147 Pacific/Truk Truk (Chuuk) and Yap +FM +0658+15813 Pacific/Ponape Ponape (Pohnpei) +FM +0519+16259 Pacific/Kosrae Kosrae +FO +6201-00646 Atlantic/Faroe +FR +4852+00220 Europe/Paris +GA +0023+00927 Africa/Libreville +GB +513030-0000731 Europe/London +GD +1203-06145 America/Grenada +GE +4143+04449 Asia/Tbilisi +GF +0456-05220 America/Cayenne +GG +4927-00232 Europe/Guernsey +GH +0533-00013 Africa/Accra +GI +3608-00521 Europe/Gibraltar +GL +6411-05144 America/Godthab most locations +GL +7646-01840 America/Danmarkshavn east coast, north of Scoresbysund +GL +7029-02158 America/Scoresbysund Scoresbysund / Ittoqqortoormiit +GL +7634-06847 America/Thule Thule / Pituffik +GM +1328-01639 Africa/Banjul +GN +0931-01343 Africa/Conakry +GP +1614-06132 America/Guadeloupe +GQ +0345+00847 Africa/Malabo +GR +3758+02343 Europe/Athens +GS -5416-03632 Atlantic/South_Georgia +GT +1438-09031 America/Guatemala +GU +1328+14445 Pacific/Guam +GW +1151-01535 Africa/Bissau +GY +0648-05810 America/Guyana +HK +2217+11409 Asia/Hong_Kong +HN +1406-08713 America/Tegucigalpa +HR +4548+01558 Europe/Zagreb +HT +1832-07220 America/Port-au-Prince +HU +4730+01905 Europe/Budapest +ID -0610+10648 Asia/Jakarta Java & Sumatra +ID -0002+10920 Asia/Pontianak west & central Borneo +ID -0507+11924 Asia/Makassar east & south Borneo, Celebes, Bali, Nusa Tengarra, west Timor +ID -0232+14042 Asia/Jayapura Irian Jaya & the Moluccas +IE +5320-00615 Europe/Dublin +IL +3146+03514 Asia/Jerusalem +IM +5409-00428 Europe/Isle_of_Man +IN +2232+08822 Asia/Kolkata +IO -0720+07225 Indian/Chagos +IQ +3321+04425 Asia/Baghdad +IR +3540+05126 Asia/Tehran +IS +6409-02151 Atlantic/Reykjavik +IT +4154+01229 Europe/Rome +JE +4912-00207 Europe/Jersey +JM +1800-07648 America/Jamaica +JO +3157+03556 Asia/Amman +JP +353916+1394441 Asia/Tokyo +KE -0117+03649 Africa/Nairobi +KG +4254+07436 Asia/Bishkek +KH +1133+10455 Asia/Phnom_Penh +KI +0125+17300 Pacific/Tarawa Gilbert Islands +KI -0308-17105 Pacific/Enderbury Phoenix Islands +KI +0152-15720 Pacific/Kiritimati Line Islands +KM -1141+04316 Indian/Comoro +KN +1718-06243 America/St_Kitts +KP +3901+12545 Asia/Pyongyang +KR +3733+12658 Asia/Seoul +KW +2920+04759 Asia/Kuwait +KY +1918-08123 America/Cayman +KZ +4315+07657 Asia/Almaty most locations +KZ +4448+06528 Asia/Qyzylorda Qyzylorda (Kyzylorda, Kzyl-Orda) +KZ +5017+05710 Asia/Aqtobe Aqtobe (Aktobe) +KZ +4431+05016 Asia/Aqtau Atyrau (Atirau, Gur'yev), Mangghystau (Mankistau) +KZ +5113+05121 Asia/Oral West Kazakhstan +LA +1758+10236 Asia/Vientiane +LB +3353+03530 Asia/Beirut +LC +1401-06100 America/St_Lucia +LI +4709+00931 Europe/Vaduz +LK +0656+07951 Asia/Colombo +LR +0618-01047 Africa/Monrovia +LS -2928+02730 Africa/Maseru +LT +5441+02519 Europe/Vilnius +LU +4936+00609 Europe/Luxembourg +LV +5657+02406 Europe/Riga +LY +3254+01311 Africa/Tripoli +MA +3339-00735 Africa/Casablanca +MC +4342+00723 Europe/Monaco +MD +4700+02850 Europe/Chisinau +ME +4226+01916 Europe/Podgorica +MF +1804-06305 America/Marigot +MG -1855+04731 Indian/Antananarivo +MH +0709+17112 Pacific/Majuro most locations +MH +0905+16720 Pacific/Kwajalein Kwajalein +MK +4159+02126 Europe/Skopje +ML +1239-00800 Africa/Bamako +MM +1647+09610 Asia/Rangoon +MN +4755+10653 Asia/Ulaanbaatar most locations +MN +4801+09139 Asia/Hovd Bayan-Olgiy, Govi-Altai, Hovd, Uvs, Zavkhan +MN +4804+11430 Asia/Choibalsan Dornod, Sukhbaatar +MO +2214+11335 Asia/Macau +MP +1512+14545 Pacific/Saipan +MQ +1436-06105 America/Martinique +MR +1806-01557 Africa/Nouakchott +MS +1643-06213 America/Montserrat +MT +3554+01431 Europe/Malta +MU -2010+05730 Indian/Mauritius +MV +0410+07330 Indian/Maldives +MW -1547+03500 Africa/Blantyre +MX +1924-09909 America/Mexico_City Central Time - most locations +MX +2105-08646 America/Cancun Central Time - Quintana Roo +MX +2058-08937 America/Merida Central Time - Campeche, Yucatan +MX +2540-10019 America/Monterrey Central Time - Coahuila, Durango, Nuevo Leon, Tamaulipas +MX +2313-10625 America/Mazatlan Mountain Time - S Baja, Nayarit, Sinaloa +MX +2838-10605 America/Chihuahua Mountain Time - Chihuahua +MX +2904-11058 America/Hermosillo Mountain Standard Time - Sonora +MX +3232-11701 America/Tijuana Pacific Time +MY +0310+10142 Asia/Kuala_Lumpur peninsular Malaysia +MY +0133+11020 Asia/Kuching Sabah & Sarawak +MZ -2558+03235 Africa/Maputo +NA -2234+01706 Africa/Windhoek +NC -2216+16530 Pacific/Noumea +NE +1331+00207 Africa/Niamey +NF -2903+16758 Pacific/Norfolk +NG +0627+00324 Africa/Lagos +NI +1209-08617 America/Managua +NL +5222+00454 Europe/Amsterdam +NO +5955+01045 Europe/Oslo +NP +2743+08519 Asia/Katmandu +NR -0031+16655 Pacific/Nauru +NU -1901-16955 Pacific/Niue +NZ -3652+17446 Pacific/Auckland most locations +NZ -4357-17633 Pacific/Chatham Chatham Islands +OM +2336+05835 Asia/Muscat +PA +0858-07932 America/Panama +PE -1203-07703 America/Lima +PF -1732-14934 Pacific/Tahiti Society Islands +PF -0900-13930 Pacific/Marquesas Marquesas Islands +PF -2308-13457 Pacific/Gambier Gambier Islands +PG -0930+14710 Pacific/Port_Moresby +PH +1435+12100 Asia/Manila +PK +2452+06703 Asia/Karachi +PL +5215+02100 Europe/Warsaw +PM +4703-05620 America/Miquelon +PN -2504-13005 Pacific/Pitcairn +PR +182806-0660622 America/Puerto_Rico +PS +3130+03428 Asia/Gaza +PT +3843-00908 Europe/Lisbon mainland +PT +3238-01654 Atlantic/Madeira Madeira Islands +PT +3744-02540 Atlantic/Azores Azores +PW +0720+13429 Pacific/Palau +PY -2516-05740 America/Asuncion +QA +2517+05132 Asia/Qatar +RE -2052+05528 Indian/Reunion +RO +4426+02606 Europe/Bucharest +RS +4450+02030 Europe/Belgrade +RU +5443+02030 Europe/Kaliningrad Moscow-01 - Kaliningrad +RU +5545+03735 Europe/Moscow Moscow+00 - west Russia +RU +4844+04425 Europe/Volgograd Moscow+00 - Caspian Sea +RU +5312+05009 Europe/Samara Moscow+01 - Samara, Udmurtia +RU +5651+06036 Asia/Yekaterinburg Moscow+02 - Urals +RU +5500+07324 Asia/Omsk Moscow+03 - west Siberia +RU +5502+08255 Asia/Novosibirsk Moscow+03 - Novosibirsk +RU +5601+09250 Asia/Krasnoyarsk Moscow+04 - Yenisei River +RU +5216+10420 Asia/Irkutsk Moscow+05 - Lake Baikal +RU +6200+12940 Asia/Yakutsk Moscow+06 - Lena River +RU +4310+13156 Asia/Vladivostok Moscow+07 - Amur River +RU +4658+14242 Asia/Sakhalin Moscow+07 - Sakhalin Island +RU +5934+15048 Asia/Magadan Moscow+08 - Magadan +RU +5301+15839 Asia/Kamchatka Moscow+09 - Kamchatka +RU +6445+17729 Asia/Anadyr Moscow+10 - Bering Sea +RW -0157+03004 Africa/Kigali +SA +2438+04643 Asia/Riyadh +SB -0932+16012 Pacific/Guadalcanal +SC -0440+05528 Indian/Mahe +SD +1536+03232 Africa/Khartoum +SE +5920+01803 Europe/Stockholm +SG +0117+10351 Asia/Singapore +SH -1555-00542 Atlantic/St_Helena +SI +4603+01431 Europe/Ljubljana +SJ +7800+01600 Arctic/Longyearbyen +SK +4809+01707 Europe/Bratislava +SL +0830-01315 Africa/Freetown +SM +4355+01228 Europe/San_Marino +SN +1440-01726 Africa/Dakar +SO +0204+04522 Africa/Mogadishu +SR +0550-05510 America/Paramaribo +ST +0020+00644 Africa/Sao_Tome +SV +1342-08912 America/El_Salvador +SY +3330+03618 Asia/Damascus +SZ -2618+03106 Africa/Mbabane +TC +2128-07108 America/Grand_Turk +TD +1207+01503 Africa/Ndjamena +TF -492110+0701303 Indian/Kerguelen +TG +0608+00113 Africa/Lome +TH +1345+10031 Asia/Bangkok +TJ +3835+06848 Asia/Dushanbe +TK -0922-17114 Pacific/Fakaofo +TL -0833+12535 Asia/Dili +TM +3757+05823 Asia/Ashgabat +TN +3648+01011 Africa/Tunis +TO -2110+17510 Pacific/Tongatapu +TR +4101+02858 Europe/Istanbul +TT +1039-06131 America/Port_of_Spain +TV -0831+17913 Pacific/Funafuti +TW +2503+12130 Asia/Taipei +TZ -0648+03917 Africa/Dar_es_Salaam +UA +5026+03031 Europe/Kiev most locations +UA +4837+02218 Europe/Uzhgorod Ruthenia +UA +4750+03510 Europe/Zaporozhye Zaporozh'ye, E Lugansk / Zaporizhia, E Luhansk +UA +4457+03406 Europe/Simferopol central Crimea +UG +0019+03225 Africa/Kampala +UM +1645-16931 Pacific/Johnston Johnston Atoll +UM +2813-17722 Pacific/Midway Midway Islands +UM +1917+16637 Pacific/Wake Wake Island +US +404251-0740023 America/New_York Eastern Time +US +421953-0830245 America/Detroit Eastern Time - Michigan - most locations +US +381515-0854534 America/Kentucky/Louisville Eastern Time - Kentucky - Louisville area +US +364947-0845057 America/Kentucky/Monticello Eastern Time - Kentucky - Wayne County +US +394606-0860929 America/Indiana/Indianapolis Eastern Time - Indiana - most locations +US +384038-0873143 America/Indiana/Vincennes Eastern Time - Indiana - Daviess, Dubois, Knox & Martin Counties +US +410305-0863611 America/Indiana/Winamac Eastern Time - Indiana - Pulaski County +US +382232-0862041 America/Indiana/Marengo Eastern Time - Indiana - Crawford County +US +382931-0871643 America/Indiana/Petersburg Eastern Time - Indiana - Pike County +US +384452-0850402 America/Indiana/Vevay Eastern Time - Indiana - Switzerland County +US +415100-0873900 America/Chicago Central Time +US +375711-0864541 America/Indiana/Tell_City Central Time - Indiana - Perry County +US +411745-0863730 America/Indiana/Knox Central Time - Indiana - Starke County +US +450628-0873651 America/Menominee Central Time - Michigan - Dickinson, Gogebic, Iron & Menominee Counties +US +470659-1011757 America/North_Dakota/Center Central Time - North Dakota - Oliver County +US +465042-1012439 America/North_Dakota/New_Salem Central Time - North Dakota - Morton County (except Mandan area) +US +394421-1045903 America/Denver Mountain Time +US +433649-1161209 America/Boise Mountain Time - south Idaho & east Oregon +US +364708-1084111 America/Shiprock Mountain Time - Navajo +US +332654-1120424 America/Phoenix Mountain Standard Time - Arizona +US +340308-1181434 America/Los_Angeles Pacific Time +US +611305-1495401 America/Anchorage Alaska Time +US +581807-1342511 America/Juneau Alaska Time - Alaska panhandle +US +593249-1394338 America/Yakutat Alaska Time - Alaska panhandle neck +US +643004-1652423 America/Nome Alaska Time - west Alaska +US +515248-1763929 America/Adak Aleutian Islands +US +211825-1575130 Pacific/Honolulu Hawaii +UY -3453-05611 America/Montevideo +UZ +3940+06648 Asia/Samarkand west Uzbekistan +UZ +4120+06918 Asia/Tashkent east Uzbekistan +VA +4154+01227 Europe/Vatican +VC +1309-06114 America/St_Vincent +VE +1030-06656 America/Caracas +VG +1827-06437 America/Tortola +VI +1821-06456 America/St_Thomas +VN +1045+10640 Asia/Ho_Chi_Minh +VU -1740+16825 Pacific/Efate +WF -1318-17610 Pacific/Wallis +WS -1350-17144 Pacific/Apia +YE +1245+04512 Asia/Aden +YT -1247+04514 Indian/Mayotte +ZA -2615+02800 Africa/Johannesburg +ZM -1525+02817 Africa/Lusaka +ZW -1750+03103 Africa/Harare diff --git a/libs/Monkeys/OpenId/Provider/Storage/Database.php b/libs/Monkeys/OpenId/Provider/Storage/Database.php new file mode 100644 index 0000000..fb7a70d --- /dev/null +++ b/libs/Monkeys/OpenId/Provider/Storage/Database.php @@ -0,0 +1,129 @@ +createRow(); + $association->handle = $handle; + $association->macfunc = $macFunc; + $association->secret = $secret; + $association->expires = $expires; + $association->save(); + + return true; + } + + public function getAssociation($handle, &$macFunc, &$secret, &$expires) + { + $associations = new Associations(); + $association = $associations->getAssociationGivenHandle($handle); + if (!$association) { + return false; + } + if ($association->expires < time()) { + return false; + } + + $macFunc = $association->macfunc; + $secret = $association->secret; + $expires = $association->expires; + + return true; + } + + /** + * Always returns false, since we'll be adding user through the GUI interface only + */ + public function addUser($id, $password) + { + return false; + } + + public function hasUser($id) + { + $users = new Users(); + $user = $users->getUserWithOpenId($id); + + return $user? true : false; + } + + public function checkUser($id, $password) + { + $auth = Zend_Auth::getInstance(); + $db = Zend_Db::factory(Zend_Registry::get('config')->database); + $authAdapter = new Zend_Auth_Adapter_DbTable($db, 'users', 'openid', 'password'); + $authAdapter->setIdentity($id); + $authAdapter->setCredential($password); + $result = $auth->authenticate($authAdapter); + + if ($result->isValid()) { + // we don't wanna login into community-id + Zend_Auth::getInstance()->clearIdentity(); + + return true; + } + + return false; + } + + /** + * Returns array of all trusted/untrusted sites for given user identified + * by $id + * + * @param string $id user identity URL + * @return array + */ + public function getTrustedSites($id) + { + $users = new Users(); + $user = $users->getUserWithOpenId($id); + + $sites = new Sites(); + + $trustedSites = array(); + foreach ($sites->getTrusted($user) as $site) { + $trustedSites[$site->site] = unserialize($site->trusted); + } + + return $trustedSites; + } + + /** + * Stores information about trusted/untrusted site for given user + * + * @param string $id user identity URL + * @param string $site site URL + * @param mixed $trusted trust data from extension or just a boolean value. If null, delete site. I know, bad desing. Blame it on ZF. + * @return bool + */ + public function addSite($id, $site, $trusted) + { + $users = new Users(); + $user = $users->getUserWithOpenId($id); + + $sites = new Sites(); + $sites->deleteForUserSite($user, $site); + + if (!is_null($trusted)) { + $siteObj = $sites->createRow(); + $siteObj->user_id = $user->id; + $siteObj->site = $site; + $siteObj->creation_date = date('Y-m-d'); + $siteObj->trusted = serialize($trusted); + $siteObj->save(); + } + + return true; + } +} diff --git a/libs/Monkeys/Validate/PasswordConfirmation.php b/libs/Monkeys/Validate/PasswordConfirmation.php new file mode 100644 index 0000000..47cb185 --- /dev/null +++ b/libs/Monkeys/Validate/PasswordConfirmation.php @@ -0,0 +1,38 @@ + 'Password confirmation does not match' + ); + + public function isValid($value, $context = null) + { + $value = (string) $value; + $this->_setValue($value); + + if (is_array($context)) { + if (isset($context['password2']) + && ($value == $context['password2'])) + { + return true; + } + } elseif (is_string($context) && ($value == $context)) { + return true; + } + + $this->_error(self::NOT_MATCH); + return false; + } +} diff --git a/libs/Monkeys/View/Helper/FormDateSelects.php b/libs/Monkeys/View/Helper/FormDateSelects.php new file mode 100644 index 0000000..6ba209b --- /dev/null +++ b/libs/Monkeys/View/Helper/FormDateSelects.php @@ -0,0 +1,281 @@ + 'January', + 2 => 'February', + 3 => 'March', + 4 => 'April', + 5 => 'May', + 6 => 'June', + 7 => 'July', + 8 => 'August', + 9 => 'Septembre', + 10 => 'October', + 11 => 'November', + 12 => 'December' + ); + + /** + * Translation object + * + * @var Zend_Translate_Adapter + */ + protected $_translator; + + public function formDateSelects($name, $value = null, $attribs = null, + $options = null, $listsep = "
\n") + { + $info = $this->_getInfo($name, $value, $attribs, $options, $listsep); + extract($info); // name, id, value, attribs, options, listsep, disable + + // now start building the XHTML. + $disabled = ''; + if (true === $disable) { + $disabled = ' disabled="disabled"'; + } + + $elementNamesArray = $this->getDayMonthYearFieldNames($name); + $valueDay = $valueMonth = $valueYear = null; + + if ($value !== null) + { + $valueExploded = explode('-', $value); + if (!isset($valueExploded[2])) + $value = null; + else + { + $valueDay = (int) $valueExploded[2]; + $valueMonth = (int) $valueExploded[1]; + $valueYear = (int) $valueExploded[0]; + } + } + + // Build the surrounding day element first. + $xhtml = '"; + + // Build the month next + $xhtml .= ' "; + + + // Build the years next + $xhtml .= ' "; + + return $xhtml; + } + + + /** + * Makes day, month and year names from given element name. Special case is array notation. + * + * Given a value such as foo[bar][baz], the generated names will be + * foo[bar][baz_day], foo[bar][baz_month] and foo[bar][baz_year] + * + * @param string $value + * @return array + */ + protected function getDayMonthYearFieldNames($value) + { + if (empty($value) || !is_string($value)) { + return $value; + } + + $ret = array( + 'day' => $value . '_day', + 'month' => $value . '_month', + 'year' => $value . '_year' + ); + + if (strstr($value, '[')) + { + $endPos = strlen($value) - 1; + if (']' != $value[$endPos]) { + return $ret; + } + + $start = strrpos($value, '[') + 1; + $name = substr($value, $start, $endPos - $start); + $arrayName = substr($value, 0, $start-1); + $ret = array( + 'day' => $arrayName . '[' . $name . '_day' . ']', + 'month' => $arrayName . '[' . $name . '_month' . ']', + 'year' => $arrayName . '[' . $name . '_year' . ']' + ); + } + return $ret; + } + + /** + * Borrowed from multi option value's _translateValue() + * + * @param string $value + * @return string + */ + protected function _translateValue($value) + { + if (is_array($value)) { + foreach ($value as $key => $val) { + $value[$key] = $this->_translateValue($val); + } + return $value; + } else { + if (null !== ($translator = $this->getTranslator())) { + if ($translator->isTranslated($value)) { + return $translator->translate($value); + } + } + return $value; + } + } + + /* + * Retrieve translation object (borrowed from Zend_View_Helper_HeadTitle) + * + * If none is currently registered, attempts to pull it from the registry + * using the key 'Zend_Translate'. + * + * @return Zend_Translate_Adapter|null + */ + public function getTranslator() + { + if (null === $this->_translator) { + require_once 'Zend/Registry.php'; + if (Zend_Registry::isRegistered('Zend_Translate')) { + $this->setTranslator(Zend_Registry::get('Zend_Translate')); + } + } + return $this->_translator; + } + + /** + * Sets a translation Adapter for translation (borrowed from Zend_View_Helper_HeadTitle) + * + * @param Zend_Translate|Zend_Translate_Adapter $translate + * @return Zend_View_Helper_HeadTitle + */ + public function setTranslator($translate) + { + if ($translate instanceof Zend_Translate_Adapter) { + $this->_translator = $translate; + } elseif ($translate instanceof Zend_Translate) { + $this->_translator = $translate->getAdapter(); + } else { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception("You must set an instance of Zend_Translate or Zend_Translate_Adapter"); + } + return $this; + } + + private function _translationsHolder() + { + translate('January'); + translate('February'); + translate('March'); + translate('April'); + translate('May'); + translate('June'); + translate('July'); + translate('August'); + translate('Septembre'); + translate('October'); + translate('November'); + translate('December'); + } + +} diff --git a/libs/Monkeys/View/Helper/GetBase.php b/libs/Monkeys/View/Helper/GetBase.php new file mode 100755 index 0000000..769ce95 --- /dev/null +++ b/libs/Monkeys/View/Helper/GetBase.php @@ -0,0 +1,26 @@ +getBaseUrl(); + $url = rtrim($baseUrl, '/'); + + if (substr($baseUrl, strlen($baseUrl) - 9) == 'index.php') { + $url = substr($baseUrl, 0, strlen($baseUrl) - 10); + } + + return $url; + } +} diff --git a/libs/Monkeys/fonts/Verdana.ttf b/libs/Monkeys/fonts/Verdana.ttf new file mode 100644 index 0000000..754a9b7 Binary files /dev/null and b/libs/Monkeys/fonts/Verdana.ttf differ diff --git a/libs/Monkeys/tests/names.txt b/libs/Monkeys/tests/names.txt new file mode 100755 index 0000000..0d1327b --- /dev/null +++ b/libs/Monkeys/tests/names.txt @@ -0,0 +1,14371 @@ +A'Hearn +AAS +AAVSO +AMOS +ANS +APL +ARLT +ASCII +ASP +Aakashshah +Aaltje +Aarhus +Aaronburrows +Aarongolden +Aaronhakim +Aaronritter +Aaronrogers +Aaronrozon +Aaronson +Aarseth +Aaryn +Aase +Aavasaksa +Abai +Abalakin +Abanderada +Abante +Abashiri +Abastumani +Abbe +Abbott +Abderhalden +Abdulla +Abdulrasool +Abehiroshi +Abell +Abemasanao +Abeosamu +Aberdonia +Abetadashi +Abetti +Abhramu +Abifraeman +Abigailhines +Abilunon +Abkhazia +Ables +Abnoba +Abramcoley +Abramenko +Abramov +Abshir +Abstracta +Abt +Abu-Rmaileh +Abukumado +Abulghazi +Abundantia +Acacia +Acaciacoleman +Academia +Acadiau +Acamas +Acapulco +Acer +Achaemenides +Achaia +Achandran +Achates +Achilles +Achosyx +Achristou +Aci +Aconcagua +Acosta +Actor +Ada +Adachi +Adalberta +Adamcarolla +Adamchauvin +Adamcrandall +Adamcurry +Adamfields +Adamkrafft +Adammalin +Adamovich +Adamquade +Adamries +Adams +Adamsidman +Adamsmith +Adamsolomon +Adamtazi +Adamwohl +Addibischoff +Addicott +Adelaide +Adele +Adelgunde +Adelheid +Adelinda +Adelka +Adeona +Aditi +Adkerson +Adler +Admete +Admetos +Adolfborn +Adolfine +Adolfneckar +Adolftrager +Adonis +Adorea +Adrastea +Adria +Adriana +Adrianveres +Adry +Aduatiques +Advincula +Adzhimushkaj +Adzic +Aedouglass +Aegina +Aegle +Aehlita +Aemilia +Aenna +Aenona +Aeolia +Aeria +Aeschylus +Aesculapia +Aeternitas +Aethra +Aethusa +Aetolia +Aferrari +Aflorsch +Afra +Africa +Africano +Agafonikov +Agafonov +Agamemnon +Agapenor +Agassiz +Agasthenes +Agasvar +Agata +Agathe +Agekian +Agelaos +Agematsu +Agenor +Ageo +Agita +Aglaja +Agnes +Agnesi +Agnesraab +Agnia +Agostino +Agrawain +Agricola +Agrigento +Agrippina +Agrius +Aguilar +Aguntina +Ahantonioli +Aharon +Ahau +Ahdout +Ahmed +Ahn +Ahnert +Aho +Ahrensa +Ahti +Aichi +Aida +Aidamina +Aigoual +Aiguillon +Aigyptios +Aimeemcarthy +Ainonai +Airion +Aisakos +Aisha +Aisleen +Aitken +Aivazovskij +Aizman +Aizuyaichi +Ajax +Ajburnetti +Ajiki +Ajscheetz +Ajstewart +Akagi +Akaishidake +Akan +Akasegawa +Akashi +Akenside +Akhmatova +Akhmerov +Akie +Akihikoito +Akihikotago +Akihiro +Akikinoshita +Akiko +Akim +Akimasa +Akimotohiro +Akimov +Akiraabe +Akirafujii +Akirafujiwara +Akiramisawa +Akiramizuno +Akiraohta +Akiratakao +Akita +Akitsushima +Akiyama +Akiyamatakashi +Akiyoshidai +Akka +Ako +Akosipov +Akplatonov +Akran +Aksenov +Aksnes +Aktsynovia +Akusekijima +Al-Biruni +Al-Khwarismi +Alagasta +Alain +Alamosa +Alananderson +Alanboss +Alanburdick +Alandreev +Alanhale +Alanhoffman +Alanholmes +Alanrubin +Alanschorn +Alanstack +Alascattalo +Alaska +Alauda +Alba Regia +Albanese +Albee +Albellus +Albeniz +Albert +Albertacentenary +Albertine +Albertjansen +Albertjarvis +Albertoalonso +Albertofilho +Albertsao +Albertshieh +Albertus Magnus +Albertwu +Albifrons +Albina +Albinadubois +Albinoni +Albis +Albitskij +Albrecht +Alcaeus +Alcathous +Alchata +Alcide +Alcinoos +Alcock +Aldana +Alden +Aldeobaldia +Aldo +Aldrin +Alechinsky +Alefranz +Alekfursenko +Alekhin +Alekperov +Aleksandrov +Alekseev +Aleksejleonov +Aleksola +Alekto +Alemannia +Alena +Alenashort +Alenasolcova +Alepieri +Alerossi +Aleserpieri +Aletesi +Aletheia +Aletta +Alex +Alexacarey +Alexacourtis +Alexandra +Alexandrinus +Alexanduribe +Alexblank +Alexchernyak +Alexcrook +Alexejtolstoj +Alexeybaran +Alexhuang +Alexisrodrz +Alexkardon +Alexlevin +Alexosipov +Alexramek +Alexroberts +Alexveselkov +Alfandmedina +Alfaterna +Alferov +Alfilipenko +Alfreda +Alfredfowler +Alfredhaar +Alfredjoy +Alfredsturm +Alfven +Algeria +Algoa +Algunde +Alhambra +Alhazen +Aliadler +Aliante +Alice +Alicechai +Alicelandis +Alicelindner +Alicemanning +Alicemonet +Aliciaclaire +Aliciahall +Aliciaworley +Alikoski +Alilienthal +Alimov +Alinafiocca +Alinda +Aline +Alineraynal +Alir +Alisahamilton +Alisary +Alisonliu +Alisonyee +Alisterling +Alkeste +Alkimos +Alkissia +Alkmene +Alkon +Alku +Allanchu +Allancook +Alleghenia +Allegra +Allen +Allen-Beach +Allenjanes +Allentran +Alleven +Alley +Allihewlett +Allilandstrom +Allisonmae +Allisontjong +Allisowilson +Alliswheeler +Allodd +Allygoldberg +Alma +Almamater +Almary +Almeida +Almeria +Alois +Alona +Alonso +Alouette +Alpaidze +Alpes Maritimes +Alphonsina +Alprokhorov +Alps +Alsabti +Alsatia +Alschmitt +Alstede +Alsufi +Altaj +Altamira +Altdorfer +Altenburg +Altenrath +Altgamia +Althaea +Altona +Altschwendt +Alu +Alupka +Alva +Alvarez +Alvema +Alvensleben +Alvin +Alvsjo +Alwine +Alwoods +Alyono +Alyssachan +Alyssacook +Alyssaovaitt +Amadora +Amahartman +Amalasuntha +Amalia +Amalthea +Amanda +Amandahatton +Amandajane +Amandalu +Amandanagy +Amandarusso +Amandashaw +Amandugan +Amanogawa +Amanolivere +Amaravella +Amaryllis +Amasis +Amastrinc +Amata +Amaterasu +Amati +Amazone +Ambartsumian +Amber +Amberhess +Ambiorix +Ambrofogar +Ambrosesoehn +Ambrosia +Amelia +Ameliachang +Amelin +Amend +Amenemhet +Amenhotep +Amenouzume +America +Ametkhan +Amfortas +Amherstia +Amiamini +Amici +Amicitia +Ammannito +Amneris +Amnestia +Amor +Amosov +Ampella +Ampere +Amphiaraos +Amphilochos +Amphimachus +Amphios +Amphitrite +Amritdas +Amsterdam +Amun +Amundsenia +Amy +Amycus +Amydavid +Amylovell +Amymilne +Amymoffett +Amytang +Amytis +An-Eefje +Anacardium +Anacostia +Anacreon +Anagaribaldi +Anahita +Anahtar +Analucia +Analyons +Anand +Anantpatel +Anastasia +Anastroda +Anatolefrance +Anatoliya +Anaverdu +Anaxagoras +Anaximandros +Anaximenes +Ancerl +Anchialos +Anchises +Ancus +Andamar +Andanike +Andenne +Anders +Andersen +Anderserikson +Ando +Andraimon +Andranada +Andrea Doria +Andreasdoppler +Andreashofer +Andree +Andreev +Andreilevin +Andreivanov +Andrejka +Andrejkiselev +Andrekuipers +Andremaeder +Andres Bello +Andrewalday +Andrewarren +Andrewcook +Andrewdavis +Andrewhager +Andrewherron +Andrewlenoir +Andrewnowell +Andrewpearce +Andrewsong +Andrewulff +Andriana +Andrillat +Andrisani +Andrle +Androgeos +Andromache +Andronikov +Andronov +Andrushivka +Andycheng +Andysanto +Aneas +Anechka +Aneeshvenkat +Anezka +Anfimov +Anga +Angara +Angekauffmann +Angel +Angelakim +Angelalewis +Angelalouise +Angelawilson +Angelica +Angelicaliu +Angelina +Angerhofer +Angola +Angrilli +Angrogna +Angstrom +Anguita +Angustirostris +Anhalt +Anhui +Ani +Anikushin +Animoo +Anitra +Anius +Anjandersen +Ankaios +Ankara +Anna +Annafreud +Annagekker +Annagerman +Annalaura +Annantalova +Annapavlova +Annasante +Annchi +Anndavgui +Anne-Marie +Annebronte +Annefrank +Anneila +Annekeschwob +Annekoupal +Annelemaitre +Anneliese +Annenskij +Anneraugh +Anneres +Annette +Annettelee +Anngower +Annika +Annjudge +Annmoriarty +Annona +Annschnell +Anoelsuri +Anokhin +Anomalocaris +Anouck +Anpanman +Anselmo +Anser +Anshan +Ansonsylva +Antal +Antarctica +Antenor +Anteros +Anthennig +Anthonypalma +Antielus +Antigone +Antikleia +Antilochus +Antimachos +Antinous +Antiope +Antiphanes +Antiphos +Antisthenes +Antoku +Antonella +Antongraff +Antonhajduk +Antonia +Antonini +Antonioleone +Antoniromanya +Antoniucci +Antonov +Antonschraut +Antwerpia +Anubelshunu +Anubis +Anupamakotha +Anyuta +Anza +Aoba +Aoki +Aoluta +Aoraki +Aoshima +Aotearoa +Aoyagi +Aoyama +Aparicio +Apatheia +Apeldoorn +Aphrodite +Apian +Apisaon +Apollinaire +Apollo +Apollonia +Apophis +Aposhanskij +Apostel +Appella +Appennino +Appenzella +Apta +Apuleius +Aquamarine +Aquifolium +Aquilegia +Aquincum +Aquitania +Ara +Araas +Arabella +Arabia +Arabis +Arachne +Arago +Arai +Araimasaru +Araki +Arakihiroshi +Aralia +Aransio +Ararat +Arayhamilton +Arcadia +Arcetri +Archaeopteryx +Archenhold +Archeptolemos +Archieroy +Archilochos +Archimedes +Archinal +Archipenko +Archivestef +Archytas +Arcimboldo +Arctica +Arctictern +Ardenne +Arditkroni +Ardmacha +Ardre +Arduina +Arecibo +Arenda +Arequipa +Aretaon +Arete +Arethusa +Argelander +Argentina +Argoli +Ariadne +Ariane +Aribeda +Arieso +Arifawan +Arii-SooHoo +Arina +Aristaeus +Aristarchus +Aristides +Aristophanes +Aristoteles +Arizona +Arizorcas +Arjunsuri +Arkajitdey +Arkesilaos +Arkhipova +Arlenewolfe +Arlington +Arlon +Arlot +Armaghobs +Armandhammer +Armando +Armellini +Armenia +Armida +Armisticia +Armor +Armstrong +Arndt +Arne +Arnenordheim +Arnica +Arnim +Arnolda +Arnoschmidt +Arnstadt +Arosa +Arpetito +Arpigny +Arpola +Arrhenius +Arrius +Arroyo +Arsenewenger +Arsinoe +Artaxerxes +Artek +Artemis +Arthur +Arthuradel +Arthurcox +Arthurdent +Arthurkraus +Arthurmiller +Arthurpetron +Artin +Artmane +Arturoromer +Aruna +Arundinaceus +Arzamas +Asada +Asadagouryu +Asagiri +Asahi +Asahina +Asam +Asamayama +Asaph +Asaramas +Asaro +Asbolus +Ascanios +Aschera +Ascione +Asclepius +Asemo +Ash +Ashbrook +Asher +Ashishbakshi +Ashitaka +Ashizuri +Ashkova +Ashlevi +Ashley +Ashleyamini +Ashurbanipal +Asia +Asiago +Asimov +Asios +Ask +Askaci +Askalaphus +Askania +Aslog +Asmitakumar +Asmodeus +Aspasia +Asphaug +Asplinda +Asporina +Assesse +Assirelli +Assisi +Asta +Astaf'ev +Astapovich +Astarte +Aster +Asteraude +Asteria +Asterix +Asteropaios +Asterope +Astraea +Astrakhan +Astrid +Astrometria +Astronautica +Astronomia +Astropis +Astrowizard +Astyanax +Asuka +Atacama +Atahualpa +Atala +Atalante +Atami +Atanasoff +Atapuerca +Ate +Aten +Aterui +Athabasca +Athalia +Athamantis +Athanasia +Athene +Athiviraham +Athor +Athreya +Atira +Atkinson +Atlantis +Atluri +Atossa +Atreus +Atropos +Atsukadou +Atsuko +Atsushi +Atsushimori +Attenborough +Atthis +Attica +Attila +Aubignan +Aubriet +Auckland +Auclair +Aude +Audrey +Audrey-Lucienne +Audreymeyer +Audubon +Aue +Augeias +Augusta +Augustepiccard +Augustesen +Augusthermann +Augusthorch +Augustinus +Augustzatka +Aunus +Aura +Aurapenenta +Auravictrix +Aurelia +Aurelianora +Auricula +Aurochs +Aurora +Ausonia +Auster +Austinminor +Australia +Austrasia +Austria +Automedon +Autonoma +Autumn +Auwers +Avatcha +Aventini +Averroes +Avery +Avicenna +Avidzba +Avignon +Aviscardi +Avogadro +Avosetta +Avramkottke +Avsyuk +Awa +Awaji +Awanoyumi +Axford +Ayashi +Aynrand +Ayonsen +Ayyubguliev +Azabu +Azalea +Azerbajdzhan +Azumayama +Azumayasan +Azumino +Azusa +Azusienis +BAM +Baade +Baalke +Babadzhanov +Babadzhanyan +Babazadeh +Babbage +Babcock +Babel' +Babelsberg +Babicka +Babinkova +Babkina +Baboquivari +Babote +Babuska +Babylon +Bacampbell +Bacchus +Bach +Backlunda +Bacon +Badenia +Badger +Badillo +Baedeker +Baehr +Baekeland +Baerbel +Baetsle +Bagdasarian +Bagehot +Baggaley +Baggesen +Baghdad +Bagration +Bagrov +Bagryana +Bahner +Bahuffman +Bahyl +Baikal +Baikonur +Baillauda +Baily +Baize +Bajaja +Bajin +Baker +Bakerhansen +Bakharev +Bakhchisaraj +Bakhchivandji +Bakhrakh +Bakich +Bakulev +Bal +Bal'mont +Balakirev +Balaklava +Balakrishnan +Balam +Balasridhar +Balaton +Balazs +Balbastre +Balder +Balduinus +Baldwin +Balears +Bali +Balindblad +Balios +Ballaero +Ballard +Balmer +Balodis +Balseiro +Balster +Baltimore +Baltuck +Balzac +Bamberga +Bambery +Bambi +Bambinidipraga +Banach +Banachiewicza +Banat +Bancilhon +Bandaisan +Bandersnatch +Bandusia +Banerjee +Banic +Banks +Banno +Banthonytwarog +Banting +Banzan +Baptistina +Barabashov +Barbagallo +Barbara +Barbaradixon +Barbaradoore +Barbarapener +Barbarawood +Barbaresco +Barbarossa +Barbatus +Barbcohen +Barbfriedman +Barbieri +Barbifrank +Barbjewett +Barcelona +Bardot +Bardwell +Bareges +Barentine +Barish +Barker +Barkhatova +Barklajdetolli +Barks +Barlach +Barlow +Barmen +Barnardiana +Barney +Barnowl +Barolo +Baroni +Barrande +Barrera +Barrett +Barrettduff +Barringer +Barry +Barryburke +Barrycarole +Barryhaase +Barrylasker +Barrysimon +Barshannon +Barsig +Bartbenjamin +Bartels +Barth +Barthibbs +Bartini +Bartkevicius +Barto +Bartok +Bartolini +Bartolucci +Barucci +Baschek +Bascom +Basfifty +Basheehan +Bashkiria +Basilea +Basilevsky +Basner +Basov +Bassano +Basso +Bastei +Bastian +Bata +Batalden +Batalov +Batchelor +Bateman +Batens +Bateson +Bathilde +Bathompson +Bathseba +Batllo +Baton Rouge +Batrakov +Battaglini +Batteas +Batten +Batth +Battiato +Battisti +Baucis +Baudot +Bauersfelda +Bauhaus +Bauhinia +Baumanka +Baumann +Baume +Baumeia +Baumeler +Baumhauer +Baur +Bauschinger +Bautzen +Bavaria +Bayefsky-Anand +Bayle +Bazhenov +Beadell +Beagle +Beals +Beamueller +Bean +Beate +Beatles +Beaton +Beatrice Tinsley +Beatrix +Beatty +Beaufort +Beauge +Beauvoir +Bec-Borsenberger +Beccaria +Bechini +Bechmann +Bechstein +Bechtereva +Bechuana +Beck +Becker +Beckman +Becquerel +Becvar +Bede +Bedini +Beegees +Beer +Beet +Beethoven +Begemann +Begonia +Begues +Beguin +Begzhigitova +Behounek +Behrens +Behring +Beiderbecke +Beiglbock +Beiguan +Beijingdaxue +Beira +Beishida +Beishizhang +Bej +Beksha +Belczyk +Belenus +Beletic +Beletskij +Belgica +Belgirate +Belgorod +Belgrano +Belinskij +Belisana +Beljawskya +Belkin +Bella +Bellagio +Bellerophon +Bellevanzuylen +Bellier +Bellingshausen +Bellmore +Bellona +Belloves +Belnika +Belo Horizonte +Belopolskya +Belskaya +Belton +Beltramemass +Beltrami +Beltrovata +Belyaev +Belyakina +Ben Mayer +Benackova +Benbaillaud +Benbilby +Benbohn +Benbrewer +Benckert +Benclark +Benda +Bendjoya +Benedix +Benfranklin +Benglass +Bengt +Benguella +Benhughes +Benigni +Benita +Benjamina +Benjaminlu +Benjaminpeirce +Benjaminsong +Benjaminsteele +Benjamueller +Benkhoff +Benkoela +Benner +Bennett +Bensaur +Benson +Bentengahama +Benua +Beny +Benzenberg +Beograd +Beowulf +Bepicolombo +Beppebianchi +Beppechiara +Beppeforti +Beranek +Berbericia +Berdyayev +Berdychiv +Beregovoj +Berendeya +Berenike +Berenyi +Beresford +Berezov +Berg +Bergengruen +Berger +Bergholz +Bergstralh +Bergvall +Berkeley +Berkhuijsen +Berko +Berlage +Berlioz +Bermarmi +Berna +Bernardburke +Bernardi +Bernardina +Bernardlovell +Bernardus +Bernasconi +Bernero +Berners-Lee +Bernert +Bernes +Bernhard +Bernheim +Bernicla +Bernie +Bernolak +Bernoulli +Bernstein +Berolina +Berounka +Berrevoets +Berry +Bertaud +Bertelli +Bertha +Berthier +Bertholda +Berthollet +Bertilpettersson +Bertin +Bertola +Bertorighini +Bertram +Bertuch +Beruti +Berwald +Beryl +Besicovitch +Besixdouze +Beslan +Bessel +Betankur +Bethanylynne +Bethbell +Bethcochran +Bethe +Bethellen +Bethemmons +Bethgea +Betlem +Betsill +Betsyglass +Betsywelsh +Bettadotto +Bettarini +Betti +Bettina +Bettypalermiti +Betulapendula +Betulia +Bevilacqua +Bexa +Beyer +Bezdek +Bezout +Bezovec +Bezruc +Bezuglyj +Bhagwat +Bharat +Bhasin +Bhat +Bialystock +Bianca +Bianchini +Biandepei +Bianucci +Biarmia +Biarmicus +Bibee +Biblialexa +Biblioran +Bibring +Bicak +Bickerton +Bickley +Bidelman +Bidstrup +Biela +Bienor +Biermann +Bierstadt +Biezenzo +Bifukumonin +Bignonia +Bihoro +Bijaoui +Bijemarks +Bikki +Bilal +Bilbo +Bilk +Bilkis +Billallen +Billbaum +Billboyle +Billburrows +Billcollin +Billcooke +Billevans +Billfyfe +Billgibson +Billgray +Billhaley +Billhamilton +Billharper +Billings +Billjackson +Billmclaughlin +Billmerline +Billochbull +Billowen +Billpickering +Billputnam +Billramsey +Billschaefer +Billward +Bilzingsleben +Bingham +Binomi +Binzel +Birch +Birgit +Birgitta +Birkhoff +Birkle +Birlan +Birtwhistle +Biryukov +Bisei +Bishop +Bismarck +Bisque +Bistro +Bitias +Bittesini +Bittner +Biver +Bivoj +Biwako +Biyo +Blaauw +Black +Blaeu +Blaga +Blaha +Blakee +Blanchard +Blanco +Blanik +Blankenship +Blansky les +Blarney +Blaschke +Blazhko +Bleeker +Bleibtreu +Blennert +Bleriot +Bleuler +Bleustein +Blewett +Bligh +Bliskunov +Blixen +Bloembergen +Blok +Blondelet +Blouke +Blow +Blueglass +Bluepeter +Blume +Blumenthal +Bluthner +Blythe +Boattini +Bobbell +Bobbievaile +Bobbiolson +Bobbyfisher +Bobbywilliams +Bobeggleton +Bobestelle +Bobgent +Bobhawkes +Bobhazel +Bobhope +Bobjoseph +Bobkepple +Bobkoff +Bobone +Bobross +Bobrov +Bobrovnikoff +Bobstefanik +Bobstephens +Bobweber +Bobwoolley +Boccaccio +Bochkarev +Bochner +Bochnicek +Bocklin +Boda +Bodea +Bodelschwingh +Boden +Bodensee +Bodil +Boduognat +Boerhaave +Boesgaard +Boethius +Bogado +Bogaevskij +Bogard +Bogatikov +Bogdanovich +Bogie +Bogorodskij +Bogoslovskij +Bogustafson +Bohemia +Bohlinia +Bohmia +Bohnenblust +Bohnhardt +Bohr +Bohrmann +Bohsternberk +Bohuska +Bohyunsan +Boitsov +Bojeva +Bok +Bokhan +Boksenberg +Bokusui +Bolander +Boliviana +Boll +Bologna +Bolotov +Bolsche +Bolshoi +Boltwood +Boltzmann +Bolyai +Bolzano +Bombelli +Bomben +Bombieri +Bonata +Bonazzoli +Bonch-Bruevich +Boncompagni +Bondar +Bondia +Bonestell +Bongiovanni +Bonham +Bonhoeffer +Bonifatius +Bonini +Bonk +Bonnie +Bononia +Bonpland +Bonsdorffia +Bontekoe +Bonucci +Bonus +Boole +Booth +Bopp +Bora-Bora +Borasisi +Borbona +Borchert +Borden +Bordovitsyna +Boreas +Borel +Borges +Borgman +Borisalexeev +Borishanin +Borisivanov +Borisov +Borispetrov +Boriszaitsev +Bormio +Born +Borngen +Bornholm +Bornmann +Borodin +Borodino +Boroson +Borovitskia +Borovsky +Borrelly +Bortle +Borzacchini +Bosch +Boschetti +Boscovich +Bosque Alegre +Bosret +Bosse +Botchan +Botha +Botnick +Botolphia +Bottger +Bottke +Boubin +Bouchet +Boucolion +Bougainville +Bougeret +Bouguer +Bouillabaisse +Boulainvilliers +Boulanger +Boulder +Bouligny +Bouma +Bounty +Bourge +Bourgeois +Bourvil +Boury +Bouska +Bouzareah +Bowell +Bowen +Bower +Bowman +Boyan +Boyarchuk +Boyce +Boyden +Boyer +Boyle +Boynton +Bozar +Bozek +Bozeman +Bozhenkova +Boznemcova +Brabantia +Brac +Brace +Brachiosaurus +Brachyrhynchus +Bracker +Brackett +Bradbury +Bradfield +Bradley +Bradman +Bradshaw +Bradsmith +Bradwood +Brady +Braes +Bragaria +Brage +Bragg +Brahic +Brahms +Braille +Brainard +Brambilla +Brancusi +Brandenburg +Brandia +Brandonimber +Brandonshih +Brandoreavis +Brandstrom +Brandt +Brangane +Branham +Brantanica +Braschi +Brashear +Brasilia +Brassens +Bratfest +Bratijchuk +Bratislava +Bratton +Braude +Brauna +Braunerova +Bray +Brayton +Brazelton +Brazos Bend +Brecher +Brecht +Bredehoft +Bredichina +Bredthauer +Bregenz +Brehm +Breimer +Brel +Bremen +Brenda +Brendalee +Brendandwyer +Brendelia +Brennan +Brentano +Bressi +Bressler +Bressole +Brest +Bretagnon +Bretharrison +Brett +Breuer +Brevard +Brewer +Brewington +Brewster +Breysacher +Brian +Brianbeyt +Brianfisher +Briangrazer +Brianking +Brianmason +Brianmcarthy +Brianmcfar +Brianreavis +Brianrice +Briantaylor +Brianwilson +Brianza +Briccialdi +Bridges +Briede +Briekugler +Briggs +Bright Spring +Brighton +Brigidsavage +Brigitta +Brilawrence +Briseis +Brita +Britastra +Britbaker +Britta +Brittajones +Brittany +Brittanyanderson +Britten +Brittrusso +Brixia +Brlka +Brno +Bro +Brocken +Brockhaus +Brockman +Broderick +Brodersen +Brody +Broederstroom +Broglio +Brokoff +Broman +Bronislawa +Bronner +Bronnina +Bronshten +Brontosaurus +Brookebowers +Brooks +Brooktaylor +Brorfelde +Brorsen +Brosche +Broughton +Brouwer +Brown +Brownlee +Broz +Brubeck +Brubrew +Brucato +Bruce Helin +Brucebaker +Brucegary +Brucegoldberg +Brucekoehn +Brucemurray +Bruch +Bruchsalia +Brucia +Bruckner +Brueghel +Bruges +Bruhns +Brumberg +Bruna +Brunelleschi +Brunet +Brungardt +Brunhild +Brunier +Brunini +Brunk +Brunnow +Brunofunk +Brunonia +Brunowalter +Brunsandrej +Brunsia +Brusin +Bruwer +Bruxelles +Bryan +Bryanhoran +Bryantsev +Bryce Canyon +Brycemelton +Brychristian +Bryleen +Brzezinska +Buber +Buchar +Buchroeder +Buchwald +Buckjean +Buckmaster +Buczynski +Buda +Buddy +Budejicky +Budinger +Budovicium +Budrosa +Budstewart +Buenos Aires +Buffon +Buhrmester +Buie +Buil +Buklad +Bukovanska +Bulgakov +Bulgaria +Buncher +Bunichi +Bunin +Bunjisuzuki +Bunke +Bunsen +Bunting +Buonanno +Buraliforti +Buratti +Burbidge +Burbine +Burckhalter +Burdenko +Burdett +Burdigala +Bure +Burgel +Burgi +Burgoyne +Burgundia +Burian +Burkam +Burke +Burkhardt +Burkhead +Burnaby +Burnashev +Burnett +Burney +Burnhamia +Burnim +Burns +Burov +Burrell +Burroughs +Burs +Burt +Burton +Buryatia +Bus +Busch +Buschur +Busdicker +Bushmarinov +Bussolini +Bustelli +Bustersikes +Bustos +Butakov +Buthiers +Butler +Butov +Butsuen +Buxtehude +Buxus +Buysballot +Buzinov +Buzios +Buzzi +Byblis +Bychkov +Bydzovsky +Byelorussia +Bykov +Byrd +Byron +Bystritskaya +CCD +CERGA +COBE +Caballo +Cabot +Cabrera +Caccin +Caccioppoli +Cacus +Cadmus +Caecilia +Caelumnoctu +Caesar +Cagney +Cagnoli +Cahill +Caia +Cailletet +Cajigal +Calandra +Calandrelli +Caldeira +Caldentey +Caldeyro +Calevoet +Calgary +California +Caligiuri +Calingasta +Calinger +Caliumi +Callahan +Calpurnia +Caltech +Calvinia +Camarillo +Cambier +Cambridge +Camdenmiller +Camelbeeck +Camelia +Camelot +Cameron +Camibarnett +Camierickson +Camilla +Camillejordan +Camillo +Camley +Camoes +Campai +Campania +Campanula +Campbell +Campestris +Campins +Campobagatin +Camus +Canaletto +Candace +Candy +Caniff +Cannonia +Canova +Cantabia +Cantagalli +Canterbury +Cantor +Canup +Capaccioni +Capdepera +Capek +Capen +Cappellaro +Cappi +Caprara +Caprera +Caracas +Carachang +Caracol +Caralexander +Carandrews +Caravelli +Carbonaro +Carcich +Cardano +Carelia +Carestia +Carfrekahl +Cari +Carina +Caripito +Carla +Carlbaeker +Carletonmoore +Carlin +Carlisle +Carlkirby +Carlmurray +Carloo +Carloshernandez +Carlosporter +Carlostorres +Carlova +Carlpilcher +Carlrogers +Carlsberg +Carlscheele +Carlturner +Carlvesely +Carlwirtz +Carlyrosser +Carmagnola +Carmelita +Carmelmaria +Carmen +Carnegia +Carnot +Carodulaney +Carol +Carolalbert +Carolejordan +Carolhersh +Carolientje +Carolina +Carolinakou +Carolinelang +Carolinelau +Carolpercy +Carolsmyth +Carolsuh +Caroltolin +Carolus Quartus +Carolyn +Carolyndiane +Caropietsch +Carora +Carp +Carpenter +Carpi +Carpino +Carr +Carrasco +Carrera +Carret +Carriemiller +Carrieshaw +Carsenty +Carson +Cartan +Carter +Carusi +Carver +Carygrant +Casablanca +Casacci +Casagrande +Casals +Casanova +Casarini +Casca +Caseyfreeman +Caseylipp +Caseylisse +Caseynicole +Caseyvaughn +Caslavska +Casleo +Caspar +Cassatt +Cassidy +Cassini +Castafiore +Castagna +Castalia +Castellaz +Castelldefels +Castellion +Castillo +Casulli +Catalina +Catalonia +Catanach +Catcheller +Cathsoto +Cathybennett +Cathyfowler +Catriona +Caubeta +Cauchy +Caupolican +Caussols +Cava +Cavadore +Cavagna +Cavaille-Coll +Cavaillon +Cavalieri +Cavaradossi +Cavell +Cavendish +Caverni +Cavezzo +Cayley +Caysvesterby +Ceadams +Cebriones +Ceccano +Cecchini +Cech +Cecilgreen +Ceciliejulie +Cedrus +Celastrus +Celemorrow +Celentano +Celestia +Celik +Celisaucier +Cellarius +Celle +Celletti +Cellino +Celsius +Celso +Celuta +Cenaceneri +Centenaria +Centesima +Ceplecha +Ceragioli +Ceraskia +Cerberus +Cercidiphyllum +Ceres +Cernan +Cernohlavek +Cernovice +Cerreto +Cervantes +Cesarann +Cesarebarbieri +Cesarechiosi +Cesaro +Cesco +Cesi +Ceskafilharmonie +Ceske Budejovice +Cesky Krumlov +Cetacea +Ceto +Ceva +Cevennes +Cevenola +Cevolani +Cezanne +Chabot +Chacornac +Chacos +Chagall +Chagas +Chahine +Chaika +Chaikin +Chajnantor +Chaka +Chaldaea +Chaliapin +Chaliubieju +Chalonge +Chamberlin +Chambers +Chamisso +Champigneulles +Champion +Champollion +Chanal +Chanarich +Chandra +Chang +Chang'E +Changchun +Changshi +Chanmatchun +Chanmugam +Chant +Chantal +Chanyikhei +Chao +Chaokuangpiu +Chaonis +Chaos +Chaoyichi +Chaozhou +Chaplin +Chaplygin +Chapman +Chappe +Chapront +Chapuis +Charconley +Charcot +Chariklo +Charis +Charlene +Charlesgreen +Charlespicard +Charlesvest +Charleville +Charlieparker +Charlier +Charlierouse +Charlois +Charlotte +Charlottebronte +Charmaine +Charmartell +Charmawidor +Charpentier +Charton +Charybdis +Chasles +Chassagne +Chastellux +Chaucer +Chauhan +Chaumont +Chaussidon +Chebotarev +Chebyshev +Chee +Chekhov +Chelomey +Chelsagloria +Chemin +Chemnitz +Chen Jiageng +Chenfangyun +Chengdu +Chengmaolan +Chengyuhsuan +Chenhungjen +Chenier +Chenjiansheng +Chenjingrun +Chenkegong +Chenqian +Chentsaiwei +Cheonghapark +Chephren +Chepurova +Cherednichenko +Cherepashchuk +Cherkashin +Cherkasov +Chern +Chernega +Chernetenko +Chernoby +Chernova +Chernykh +Chernyshevskij +Cherryh +Cherson +Chertok +Cheruskia +Cheshirecat +Chesley +Chetaev +Chetgervais +Chiakitanaka +Chiara +Chiarabarbara +Chiardola +Chiarini +Chiayi +Chicago +Chichibu +Chicomendez +Chigorin +Chijagerbs +Chikako +Chikurinji +Chikushi +Child +Chile +Chillicothe +Chilton +Chimaera +Chimay +Chimikeppuko +Chiminello +China +Chinaroonchai +Chinesewilson +Ching-Sung Yu +Chingzhu +Chinmoy +Chiny +Chione +Chirayath +Chirman +Chiron +Chirotenmondai +Chivilikhin +Chiyonoura +Chizhevskij +Chkalov +Chladni +Chleborad +Chloe +Chloris +Chlosinde +Choate +Chodas +Choemuseon +Choi +Choikaiyau +Choiseungjae +Chongqing +Chopin +Choseikomori +Choukai +Choukyongchol +Choustnik +Chowmeeyee +Chribrenmark +Chrimatthews +Chrisbondi +Chrisclark +Chrisfaust +Chrisfleming +Chrisharriot +Chriskraft +Chriskuyu +Chrismessick +Chrismith +Chrisnell +Chrisodom +Chrispollas +Christa +Christabel +Christagunt +Christen +Christiansen +Christihaas +Christijohns +Christine +Christineli +Christoffel +Christophe +Christopynn +Christy Carol +Chriswalker +Chromios +Chryseis +Chrysothemis +Chubko +Chuckjones +Chugainov +Chughtai +Chujkovia +Chukokkala +Chukotka +Chumakov +Chungchiyung +Chunkaikao +Churanta +Church +Church Stretton +Churivannia +Churyumov +Chushayashi +Chushuho +Chuvaev +Chuvashia +Chuwinghung +Chyan +Chyba +Chynov +Cialucy +Ciarabarr +Ciaurro +Cibronen +Cicero +Cichocki +Ciconia +Cieletespace +Cielobuio +Cilla +Cima Ekar +Cimbria +Cimmeria +Cincinnati +Cindijon +Cindyfulton +Ciney +Cinodapistoia +Ciociaria +Cioffi +Cioni +Cipolla +Circe +Cirou +Ciske +Cisneros +Citfiftythree +Citrinella +Citron +Ciurlionis +Clairaut +Clairearmstrong +Clanga +Clapas +Clapies +Clapton +Clara +Clarissa +Clarke +Clasien +Claudia +Claudiomaccone +Claudius +Clausbaader +Clausewitz +Clausius +Clavel +Clay +Clayton +Claytonsmith +Clematis +Clemence +Clemenssimmer +Clementina +Cleobulus +Cleveland +Clifford +Cliffordkim +Climenhaga +Clinch +Cline +Clingan +Clintford +Clintkelly +Clivia +Cloanthus +Clocke Roeland +Cloelia +Clorinde +Close +Cloutis +Cloyd +Clube +Clusius +Cochran +Coco +Coconino +Codina +Coelestina +Coelum +Cofer +Coggie +Cogshall +Cohen +Cohnia +Colanduno +Colas +Colbert +Colby +Colchagua +Colchis +Cole +Colemanhawkins +Colgrove +Collier +Collinarnold +Collins +Collurio +Colocolo +Colombatti +Colombini +Colpa +Coltrane +Columbia +Columbianus +Comacina +Comas Sola +Comba +Combes +Comello +Comeniana +Commerson +Commontern +Compassion +Compton +Comrie +Conae +Conandoyle +Concordia +Condillac +Condorcet +Condruses +Conedera +Confucius +Conlin +Connelly +Conniewalker +Connorivens +Connormcarty +Connors +Conrada +Conradferdinand +Conradhirsh +Consadole +Conscience +Consolmagno +Constable +Constantia +Cook +Coonabarabran +Cooney +Copito +Copland +Coppelia +Coppens +Coppernicus +Cora +Coradini +Corax +Corbett +Corbin +Cordelia +Cordellorenz +Cordie +Corduba +Cordwell +Cori +Coriolis +Cornelia +Cornell +Corneville +Corning +Cornus +Corot +Corradolamberti +Correggia +Cortesi +Cortina +Cortland +Cortusa +Corvan +Corvina +Cosette +Cosicosi +Cosima +Cossard +Costello +Coster +Costitx +Cottrell +Cotur +Coubertin +Coudenberghe +Coudray +Coughlin +Coulomb +Coulter +Counselman +Couperin +Courant +Courbet +Courtemanche +Coustenis +Couteau +Couturier +Covadonga +Coventry +Covington +Cowell +Cowenbrown +Cowenco +Cox +Coxeter +Coyne +CrAO +Crabbegat +Crabeels +Crabtree +Cragg +Craigpeters +Craigwallace +Craigwright +Cranach +Cranbrook +Crane +Crantor +Crawford +Credo +Cremaschini +Cremona +Crescentia +Crespo +Crespodasilva +Crex +Crick +Crikey +Crimea +Crisser +Cristata +Criswick +Crivello +Croatia +Crocco +Crocus +Crombecq +Cromer +Crommelin +Cronin +Cronkite +Crosby +Crouch +Crovisier +Cruikshank +Cruithne +Crutzen +Csere +Cslewis +Cuba +Cucula +Cucullia +Cuffey +Cuillandre +Cuirongfeng +Cuitlahuac +Cullers +Cummings +Cuney +Cunitza +Cunningham +Cuno +Cupido +Cuppy +Cupressus +Cureau +Curie +Curlewis +Curly +Curtharris +Curtis +Cusinato +Cuvier +Cuyo +Cuzco +Cyane +Cyaneus +Cyannaskye +Cybele +Cycnos +Cydonia +Cyllarus +Cynthia +Cynthialang +Cyrano +Cyrenagoodrich +Cyrene +Cyriltyson +Cyrus +Czechoslovakia +Czerny +D'Haveloose +DNA +Dabramo +Dabu +Dacke +Daedalus +Daens +Daghestan +Dagmar +Daguerre +Dahart +Dahir +Dahl +Dahlgren +Dahlstrom +Daibosatsu +Daihoji +Dainty +Daisakyu +Daisetsuzan +Daishi +Daitarabochi +Daiwensai +Dajcic +Dajowestrich +Dalem +Dalera +Dalgarno +Dali +Dalian +Daliya +Dall +Dallago +Dallas +Dalleave +Dallolmo +Dalmatin +Dalton +Damiaan +Damir +Damocles +Danae +Danahy +Danboice +Danbritt +Danby +Dancey +Danco +Dangoldin +Dangrania +Dangreen +Dangrieser +Daniebutler +Daniel +Danieladucato +Danielang +Danielappel +Danielberger +Danielbetten +Danielchoi +Danielcook +Danielgude +Daniellitt +Daniellozano +Danielmiller +Danielson +Danielsteck +Danieltse +Danilevskij +Danimatter +Danjon +Danmacdonald +Danmark +Danoconnell +Danpeterson +Dansealey +Dansolander +Dante +Danubia +Danwelcher +Danwinegar +Danyellelee +Danzig +Danzl +Daphne +Daphne Plane +Darboux +Darbydyar +Darbywoodard +Darcydiegel +Darcyhampton +Dardanos +Dares +Dariozanetti +Darius +Darmstrong +Darrellparnell +Darwin +Dascoli +Dasha +Dashkova +Datemasamune +Dato +Datura +Daudet +Daumier +Daun-Eifel +Dauria +Davasobel +Davebracy +Davebrin +Daveclark +Davederrick +Davehiggins +Davemckay +Davemonet +Davepierce +Daverichards +Daveross +Daveturner +Davewilliams +David Bender +David Hughes +Davida +Davidacomba +Davidalex +Davidallen +Davidbaltimore +Davidbauer +Davidbriggs +Davidbrown +Davidcohn +Davidedwards +Davidfreedman +Davidgauthier +Davidgill +Davidgreen +Davidhardy +Davidhartley +Davidhernandez +Davidhoover +Davidixon +Davidjohn +Davidkaufman +Davidkeith +Davidkelley +Davidkulka +Davidlean +Davidnelson +Davidoconnor +Davidpatterson +Davidprice +Davidschlag +Davidscott +Davidsson +Davidtao +Davidvito +Davidwang +Davidweilla +Davidying +Davidyoung +Davis +Davy +Davydov +Davykim +Dawe +Dawkins +Dawn +Dawson +Dayanli +Dazapata +De Boo +De Gasparis +De Jong +De Meis +De Rop +De Ruyter +De Sanctis +De Sitter +De Young +DeLaeter +DeVeny +Debehogne +Debenedictis +Debennett +Debetencourt +Deborah +Deborahsmall +Debrecen +Debussy +Debye +Decabrina +Decampos +Decaro +Decatur +Decines +Declercq +Decoen +Deconihout +Dedekind +Dedeyn +Defelice +Defi +Deflotte +Deforest +Defoy +Degas +Degewij +Degraaff +Dehant +Dehio +Deikoon +Deineka +Deiphobus +Deipylos +Deira +Dejaiffe +Dejan +Dejanira +Dejopeja +Delacroix +Delahodde +Delambre +Delamere +Delaney +Delasalle +Delaunay +Delbarrio +Delbo +Delbruck +Delcano +Delemont +Deleon +Delgado +Delia +Delila +Delisle +Deliso +Deliyannis +Dellen +Dellinger +Delloro +Dellorusso +Delmary +Delmas +Delores +Delp +Delphine +Delpino +Delportia +Delrosso +Delsemme +Deluise +Delvaux +Demalia +Demanet +Demariotte +Demaziere +Dembowska +Demeautis +Demeter +Demiddelaer +Demin +Deming +Demodokus +Demokritos +Demophon +Demottoni +Demoulina +Denali +Dence +Denduluri +Deni +Denise +Deniselivon +Denisyuk +Denjoy +Denlea +Denneau +Dennispalm +Dennisreuter +Denny +Denoyelle +Denso +Denversmith +Denzilrobert +Deprez +Derdenye +Derevskaya +Derevyanko +Derice +Derichardson +Deridder +Dermott +Dersu-Uzala +Derzhavin +Desagneauxa +Descamisada +Descamps +Descartes +Descour +Desdemona +Desforges +Deshpande +Desiderata +Deslandres +Desngai +Desnoux +Destinn +Dethury +Detre +Deucalion +Devanssay +Devience +Devine +Devosa +Devota +Dewar +Dezhnev +Dezso +Dhotel +Di Martino +DiMaggio +DiNovis +Diana +Dianaeheart +Dianecaplain +Dianemurray +Dianepark +Dianesipiera +Dibaj +Dibucci +Dicicco +Dick +Dickens +Dickinson +Dickjoyce +Dicksmith +Dickwalker +Diclemente +Diderot +Didkovskij +Dido +Didymos +Diebel +Dieckvoss +Diehl +Dientzenhofer +Diesel +Diethelm +Dietz +Digerhuvud +Digerrojr +Digne +Dijon +Dikan'ka +Dike +Dillard +Dillon +Diluca +Dimai +Dimashchegolev +Dimitrov +Dimpna +Dinah +Dinant +Dinotina +Diomedes +Dione +Dionysus +Dioretsa +Diotima +Dipaola +Dirac +Dirichlet +Dirikis +Disa +Disanti +Discovery +Disneya +Disora +Distler +Distratis +Ditte +Divari +Divis +Dix +Dixon +Dizzy +Dmitrienko +Dobereiner +Dobermann +Dobi +Doblin +Dobrichovice +Dobronravin +Dobrovoleva +Dobrovolsky +Dobrovsky +Dobrynya +Dobson +Doctorwatson +Dodaira +Dodo +Dodoens +Dodona +Doga +Dogen +Doggett +Dogo Onsen +Dohmoto +Doi +Doikazunori +Dolby +Dolecek +Dolero +Dolezal +Dolgorukij +Dolios +Dollfus +Dolmatovskij +Dolomiten +Dolon +Dolores +Doloreshill +Dolyniuk +Domatthews +Domegge +Domeyko +Dominguez +Dominikhasek +Dominiona +Dominique +Dommanget +Domon +Don Quixote +Donaldavies +Donaldeng +Donaldhowk +Donaldpray +Donaldyoung +Donalu +Donar +Donasharma +Donatello +Donati +Donbacky +Donbass +Doncampbell +Doncarpenter +Dondavis +Dondelia +Dongguan +Donhoff +Donici +Donizetti +Donjohnson +Donmccarthy +Donn +Donna +Donnablaney +Donnadean +Donnajones +Donnamooney +Donnanderson +Donnashirley +Donnera +Donnison +Donpettit +Donskoj +Doppelmayr +Doppler +Dora +Dorchester +Doreen +Doressoundiram +Dorffel +Doris +Dorisbillings +Dorismcmillan +Dorminy +Dornburg +Doroguntsov +Doronina +Dorothea +Dorristaylor +Dorrit +Dorschner +Dorsey +Dortmund +Dossobuono +Dostal +Dostoevsky +Doty +Doudantsutsuji +Doudleby +Dougallii +Doughamilton +Douglas +Douglasadams +Dougsimons +Dougskinner +Dougweinberg +Doumergua +Dovgyj +Dovzhenko +Dow +Dower +Dowling +Downs +Doyanrose +Doylehall +Dozier +Dr. G. +Dragesco +Drake +Drakonia +Drava +Drebach +Drejsl +Dresda +Dresden +Drew +Drewpinsky +Dreyfus +Drobyshevskij +Drossart +Droste-Hulshoff +Drozdov +Drtikol +Drukar +Drummen +Drummond +Drunina +Druyan +Druzhba +Drymas +DuBridge +Duanenichols +Dubiago +Dubinin +Duboshin +Duccio +Ducentesima +Ducrosa +Ducuroir +Dudarova +Duden +Dudinskaya +Dudley +Dudleymoore +Dudu +Duerbeck +Dufek +Duffell +Dufour +Dugan +Duhamel +Duke +Dulcinea +Dulov +Dumas +Dumlupinar +Dumont +Duna +Dunaevskij +Dunant +Dunbar +Duncan +Duncombe +Dunham +Dunhuang +Dunkelman +Dunkerley +Dunlap +Dunn +Dunphy +Duongtuyenvu +Duponta +Duras +Durbin +Durda +Durer +Durisen +Durkheim +Durrell +Durrenmatt +Dusek +Dustinshea +Duyha +Duyingsewa +Dvorak +Dvorets Pionerov +Dvorsky +Dwingeloo +Dworetsky +Dwornik +Dyagilev +Dyer +Dylanyoung +Dynamene +Dysona +Dyukov +Dzhalil +Dzhangar +Dzhanibekov +Dzus +EMP +ESA +Eades +Eamonlittle +Earhart +Easterwood +Ebella +Ebenum +Ebicykl +Ebilson +Ebisuzaki +Ebre +Echeclus +Echemmon +Echepolos +Echion +Echnaton +Echo +Echternach +Eckert +Eckhout +Ecuador +Edburga +Edda +Eddieozawa +Eddington +Eddywally +Edebono +Edgerton +Edgeworth +Edhenderson +Edisona +Edith +Edithlevy +Edithmuller +Edithrand +Edlu +Edmee +Edmond +Edmondson +Edmonton +Edna +Edo +Edoardo +Edolsen +Edpatvega +Edschneider +Edscott +Edshay +Edstolper +Eduarda +Eduardreznik +Educatio +Edvardsson +Edwardolson +Edwardsu +Edwelda +Edwin +Edyalge +Efimov +Efremiana +Efremov +Eger +Egeria +Egisto +Egleston +Egorov +Ehdita +Ehime +Ehrdni +Ehrenberg +Ehrenfreund +Ehrlich +Ehrsson +Eichendorff +Eicher +Eichhorn +Eichsfeldia +Eijikato +Eijkman +Eileen +Eileenreed +Einer +Einhardress +Einstein +Eisenach +Eisenhart +Eisenstein +Eisinga +Eitarodate +Ekard +Ekaterina +Ekaterinburg +Ekers +Ekholm +Ekladyous +Ekman +Ekrutt +El Djezair +El Goresy +El Leoncito +Elachi +Elaeagnus +Elainemccall +Elainepappas +Elaisponton +Elatus +Elba +Elbsteel +Elektra +Elenaumberto +Eleonora +Elephenor +Eleutheria +Elford +Elfriede +Elfriederwin +Elgar +Eliane +Elias +Eliason +Elidoro +Elijahmena +Elineke +Elinor +Eliotyoung +Elisa +Elisabetha +Eliscolombini +Eliseadcock +Elizabethann +Elizabethbaker +Elizabethsears +Elizacollins +Elizaheller +Elizateel +Elizawoolard +Elizkolod +Elko +Ella +Ellen +Ellenbeth +Ellendoane +Ellenmacarthur +Ellenoei +Ellensburg +Ellicott +Ellington +Elliot +Ellis +Ellison +Elly +Ellyett +Elmer +Elmerreese +Elnapoul +Elois +Elowitz +Elpis +Elsa +Elsasser +Elsschot +Elst +Elst-Pizarro +Eltigen +Eluard +Elvira +Elvis +Elyna +Elysehope +Elysiasegal +Elyu-Ene +Emanuela +Emanuelli +Embla +Emel'yanov +Emelyanenko +Emerson +Emicka +Emiko +Emilemathieu +Emileschweitzer +Emilevasseur +Emilezola +Emilhaury +Emilkowalski +Emilybronte +Emilykraft +Emilystoll +Emimar +Eminescu +Emita +Emma +Emmacall +Emmarochelle +Emmermann +Emmons +Empedocles +Emuno +Encke +Encrenaz +Endate +Endo +Endres +Endymion +Eneev +Enescu +Engelhardt +Engstrom +Enid +Enirac +Ennomos +Enricobernardi +Enricocaruso +Enricoprosperi +Enriques +Ensab +Ensor +Enterprise +Entsuji +Entwisle +Enver +Enya +Enzomora +Eos +Eotvos +Epeigeus +Epeios +Ependes +Epetersen +Epikouros +Epimetheus +Epistrophos +Epona +Epops +Eppard +Epstein +Epyaxa +Eranyavneh +Erasmus +Erato +Eratosthenes +Erb +Erben +Erbisbuhl +Ercilla +Ercolepoli +Erda +Erdmannsdorff +Erfordia +Eri +Eric +Ericaburden +Ericadavid +Ericberne +Erichmeyer +Erichthonios +Ericidle +Ericlinton +Ericpearce +Ericsands +Ericsterken +Ericstrege +Erictemplebell +Erida +Eriepa +Erigone +Erika +Erikgustafson +Erikhog +Erikhovland +Erikson +Eriksorensen +Erimomisaki +Erin +Erinedwards +Erinfrey +Erinriley +Erinwhite +Eriphyla +Eris +Ermak +Ermalmquist +Erman +Erminia +Ermolova +Erna +Erneschiller +Ernestina +Ernestmaes +Ernestocorte +Ernsting +Ernstweber +Eros +Erwingroten +Eryan +Erynia +Erzgebirge +Esaki +Esambaev +Esashi +Escalante +Eschenbach +Escher +Esclangona +Eshinjolly +Esipov +Esner +Espenak +Esperanto +Espinette +Esquerdo +Esquibel +Essjayess +Esteban +Estelleweber +Estens +Esterhuysen +Esther +Estonia +Estrella +Estremadoyro +Ethanroth +Ethel +Etheridgea +Ethiopia +Etiennemarey +Etna +Etrepigny +Etsuko +Etter +Euaimon +Eubanks +Euboea +Eucharis +Euchenor +Euclides +Eucommia +Eucryphia +Eudora +Eudoxos +Euforbo +Eugenia +Eugenishmidt +Eugenisis +Eugster +Eukrate +Eulalia +Eulenspiegel +Euler +Eumaios +Eumelos +Euneus +Eunike +Eunomia +Euphemia +Euphrates +Euphrosyne +Eupraksia +Eureka +Euripides +Europa +Europaeus +Euryalos +Euryanthe +Eurybates +Eurydike +Eurykleia +Eurymachos +Eurymedon +Eurynome +Eurypylos +Eurysaces +Euterpe +Eva +Evamarkova +Evanfrank +Evanmirts +Evanmorikawa +Evans +Evdokiya +Evelyn +Evenkia +Everett +Everhart +Evgalvasil'ev +Evgenifedorov +Evgenij +Evgenilebedev +Evgenyamosov +Evita +Evpatoria +Evtushenko +Ewen +Ewers +Excalibur +Excubitor +Eymann +Ezaki +Ezratty +Fabbri +Fabini +Fabiodolfi +Fabiola +Fabiomuzzi +Fabre +Fabribudweis +Facchini +Fagioli +Fagnes +Fagus +Fahrenheit +Faina +Fairbank +Fairhurst +Faithchang +Falce +Falcinelli +Falk +Fallada +Fallersleben +Fallowfield +Falorni +Falta +Falz-Fein +Fama +Fanale +Fanatica +Fandly +Fangfen +Fanny +Fannyhensel +Fantasia +Fantin-Latour +Fanyang +Fanynka +Faraday +Farinella +Farmer +Farnham +Faro +Farpoint +Farquhar +Farra +Farzan-Kashani +Fassel +Fast +Fatherwilliam +Fatme +Fatou +Fatyanov +Faulkes +Faure +Fauvel +Favaloro +Fay +Fayeta +Fazio +Feast +Fechner +Fechtig +Fedchenko +Federer +Federica +Federicotosi +Fedorshpig +Fedoseev +Fedotov +Fedynskij +Feeny +Fehrenbach +Feierberg +Feijth +Feijunlong +Feinberg +Feingold +Feininger +Feiniqu +Feldberg +Feldman +Feliceierman +Felicia +Feliciaplatt +Feliciayen +Felicienrops +Felicitas +Feliksobolev +Felix +Felixdejager +Felixhormuth +Feller +Fellini +Fennia +Fennimore +Fenska +Feodosia +Ferdinandbraun +Ferenczi +Ferguson +Fermat +Fermi +Fermilab +Fernand-Roland +Fernandel +Fernandonido +Fernandus +Fernhildebrandt +Fernie +Feronia +Ferrando +Ferrari +Ferraz-Mello +Ferreri +Ferri +Ferrini +Ferris +Feruglio +Fesenkov +Fessenden +Festin +Festou +Fetisov +Feuchtwanger +Feuerbach +Feuerbacher +Feynman +Fiala +Fibonacci +Fichte +Fichtelberg +Fichtelgebirge +Fichtelman +Fidelio +Fideoja +Fides +Fiducia +Field +Fienga +Fievez +Figneria +Filatov +Filipenko +Filipoff +Filipportera +Filopanti +Fini +Fink +Finkelstein +Finsen +Fiorenza +Fireman +Firneis +Fischer-Dieskau +Fisher +Fisher-Ives +Fisico +Fitzgerald +Fitzroy +Fitzsimmons +Fivesparks +Fixlmuller +Flacourtia +Flagstaff +Flagsymphony +Flamini +Flammario +Flammeus +Flamsteed +Flandrau +Flaubert +Flavia +Flegel +Fleischer +Fleming +Flensburg +Fleringe +Fletcher +Flinders +Floirac +Flood +Flora +Florena +Florence +Florentina +Florey +Floris-Jan +Florya +Floss +Flynn +Fodera +Foerster +Fogelin +Fogelquist +Fogh +Foglar +Foglia +Folco +Fole +Folsom +Fongyunwah +Fontane +Fontenelle +Foo +Forbes +Ford +Forestamartin +Forman +Formigine +Fornasier +Foros +Forsius +Forsytia +Fort Bend +Fortov +Fortran +Fortuna +Foshan +Fossett +Fossey +Foucault +Fountain +Fountainhills +Fourcroy +Fourier +Fowler +Fox +Fracastoro +Fraethi +Fragaria +Fragonard +Fraknoi +Francelinda +Francespearl +Franceswright +Francette +Francini +Francis +Franciscuszeno +Franciseveritt +Francislee +Francismuir +Franck +Franck-Hertz +Francois-Xavier +Francomallia +Francopacini +Francylemp +Franfrost +Frankblock +Frankchuang +Frankconrad +Franke +Frankenwald +Frankherbert +Frankhill +Frankhubbard +Franklin-Adams +Franklina +Franklinken +Franklow +Frankmartin +Frankshu +Frankwasser +Franlainsher +Franpelrine +Fransaris +Franscini +Franspost +Franz Schubert +Franzia +Franziska +Franzkaiser +Franzmarc +Franzrosenzweig +Frappa +Fraschetti +Frasso Sabino +Fraternitas +Fraunhofer +Frazer +Frechet +Freda +Fredegundis +Frederickoby +Fredfranklin +Fredharris +Fredholm +Fredrick +Fredrikbruhn +Fredrikson +Fredseares +Fredtreasure +Fredwatson +Fredwhitaker +Freeman +Frege +Freia +Freilich +Freiligrath +French +Frerebasile +Freret +Frescobaldi +Fresnel +Freuchen +Freud +Freudenthal +Frevert +Fricke +Fridakahlo +Fridolin +Frieda +Frieden +Friederike +Friedman +Friedrich +Frigga +Frigyesriesz +Frimout +Fringilla +Frisch +Frisia +Friskop +Fristephenson +Fritzheide +Fritzperls +Fro +Frobel +Frobenius +Froberger +Froding +Froeschle +Frojel +Frolova +Fromm +Frostia +Frouard +Fruge +Fruits +Frydek-Mistek +Fubini +Fuchie +Fuchitatsuo +Fuchs +Fucik +Fugaku +Fugate +Fuglesang +Fuji +Fujian +Fujiiekio +Fujimori +Fujioka +Fujita +Fujiwara +Fukaya +Fukuchan +Fukuhara +Fukui +Fukunaga +Fukuoka +Fukushima +Fulchignoni +Fullerton +Fullmer +Fulton +Fultonwright +Fulvia +Fumi +Funada +Funakoshi +Funke +Furmanov +Fursenko +Furusho +Furuya +Furuyama +Fuser +Fuss +Fuuren +Fuzhougezhi +Fyodorov +GAISH +GNU +GOI +GONG +Gabemendoza +Gabor +Gabreta +Gabriella +Gabriellacoli +Gabrova +Gaby +Gabzdyl +Gadabird +Gadberry +Gaddi +Gadolin +Gadsden +Gaea +Gaede +Gaertner +Gaffey +Gagarin +Gaglani +Gagnereau +Gahm +Gaiavettori +Gaidai +Gaika +Gaillard +Gaily +Gaimar +Gainsborough +Gaithersburg +Gajdariya +Gajdusek +Gakutensoku +Galahad +Galante +Galanthus +Galapagos +Galatea +Galbraith +Galchyn +Galegant +Galene +Galenmaly +Galeotti +Galerkin +Galiani +Galibina +Galilea +Galina +Galinaryabova +Galindo +Galinskij +Gallagher +Gallaj +Gallardo +Galle +Gallia +Gallinago +Galois +Galvani +Galvarino +Galya +Gamalski +Gammelmaja +Gamow +Gamzatov +Ganesa +Ganghofer +Ganguly +Gansu +Gantrisch +Ganymed +Gaoshiqi +Gaoyaojie +Garber +Garcia +Gardner +Garecynthia +Garibaldi +Garlena +Garnavich +Garneau +Garossino +Garradd +Garretyazzie +Garrison +Garrone +Garuda +Garumna +Gary +Garyhuss +Garymyers +Garynadler +Gasbarini +Gase +Gaskin +Gaspari +Gaspra +Gasprinskij +Gassan +Gassendi +Gaudi +Gaudium +Gauguin +Gault +Gaussia +Gautier +Gavini +Gaviola +Gavioliremo +Gavrilin +Gavrilov +Gawain +Gawlik +Gay-Lussac +Gaylefarrar +Geake +Geballe +Gedania +Geddylee +Geeraerts +Geertruida +Geffert +Gefion +Geflorsch +Gehrels +Gehrig +Gehringer +Geichenko +Geiger +Geisei +Geisha +Geiss +Gekko +Geldonia +Gelfond +Gellivara +Gellner +Gelria +Gembloux +Gemoore +Genecampbell +Genelucas +Geneparker +Genevieve +Geng +Genichesk +Genoveva +Genta +Gentelec +Gentileschi +Genua +Genzel +Geoffburbidge +Geoffcollyer +Geoffjames +Geoffperry +Geoffreycopland +Geoffreywoo +Geoffroy +Geographos +Geometria +Georgbohm +George +Georgealexander +Georgebaldo +Georgebeekman +Georgecarroll +Georgechen +Georgehotz +Georgekaplan +Georgemiley +Georgesand +Georgesmith +Georgia +Georgpeuerbach +Geowilliams +Geraldina +Geramtina +Geranium +Gerarda +Gerardfaure +Gerasimenko +Gerasimovich +Gerbefremov +Gerda +Gerdatschira +Gerdlehmann +Gergana +Gerhard +Gerhardiser +Gerhardmuller +Gerla +Gerlinde +Germania +Germantitov +Gerokurat +Geroldrichter +Gershberg +Gershwin +Gerstner +Gersuind +Gertfinger +Gerti +Gertrud +Gertrudolf +Gervais +Gesner +Gessler +Gevaert +Geyang +Geyer +Gezelle +Ghaben +Ghent +Ghiberti +Ghislaine +Ghoshal +Ghoshchoudhury +Giacconi +Giacobini +Giacomelli +Giacometti +Giada +Giampieri +Gianelli +Giannigalli +Gianrix +Gibbon +Gibbs +Giblin +Gibson +Giclas +Gide +Gielgud +Giessenburg +Gifford +Gifu +Gigli +Gilbertofranco +Gilclark +Gilgamesh +Gilhutton +Giliberti +Gillett +Gilmore +Gilson +Gilyarovskij +Ginagallant +Ginestra +Ginevra +Gingasen +Gingerich +Gingold +Ginkgo +Ginkogino +Ginoloria +Ginsberg +Gio +Giocasilli +Giomus +Giono +Giordano +Giorgini +Giotto +Giovannianselmi +Giovannisilva +Giovarduino +Giovine +Girardiwanda +Giraudon +Girraween +Gisela +Gisellarubini +Gismonda +Gispen +Gitakresakova +Giupalazzolo +Giuseppina +Giza +Gladman +Gladys +Glarnisch +Glarona +Glasenappia +Glasgow +Glass +Glasser +Glassman +Glauke +Glaukos +Glazebrook +Glazunov +Gleason +Glebov +Gleim +Glennford +Glenngould +Glennmiller +Gletorrence +Glewitsky +Glia +Gliese +Glikson +Glinka +Glinos +Glo +Gloyna +Gluck +Glukhovsky +Glushko +Glynjones +Gmelin +Gnadig +Gnedin +Gobbi-Belcredi +Goberta +Godaisan +Godart +Goddard +Godel +Godfreyhardy +Godin +Godiva +Godwin +Goerdeler +Goethe +Goethe Link +Goetzoertel +Goff +Goffin +Gogol +Gohnaumann +Gokcay +Gokulk +Golant +Golay +Gold +Goldberger +Golden +Goldfinger +Goldhaber +Goldinaaron +Goldman +Goldreich +Goldschmidt +Goldstein +Goldstone +Golevka +Golia +Golitsyn +Golombek +Goloseevo +Golovanov +Golson +Gomes +Gomezdonet +Gomi +Goncharov +Gonczi +Gondola +Gondolatsch +Gongmyunglee +Gongyi +Gonnessia +Gonzales +Goodall +Goode +Goodhue +Goodman +Goodricke +Gooley +Gopalan +Gopasyuk +Gor'kavyj +Gorbatskij +Gorchakov +Gordonia +Gordonmoore +Gordonsu +Goretti +Gorgasali +Gorgo +Gorgythion +Gorin +Gorizia +Gorjup +Gorky +Gorlitsa +Gorodnitskij +Gorshkov +Goryachev +Gosal +Gosemeijer +Goshi +Goshirakawa +Gosset +Gostin +Goteborg +Gotenba +Gotha +Gothard +Gothlandia +Gotho +Goto +Gotouhideo +Gotoyukichi +Gottesman +Gottfried +Gottfriedkeller +Gottfriedkirch +Gotz +Goudsmit +Gouka +Gounelle +Goursat +Goven +Govert +Govorukhin +Gowlandhopkins +Goya +Gracehsu +Gracekelly +Grachevka +Graculus +Gradie +Graetz +Graff +Graham +Grahamchapman +Grahamryder +Grahamsmith +Gramigna +Gramme +Gran Sasso +Granada +Grandprism +Grange +Grano +Grant +Grantelliott +Grantjudy +Grantlewis +Grantstokes +Granule +Grass +Gratia +Graubunden +Grauer +Graun +Gravanschaik +Graves +Gravesande +Grayzeck +Graz +Grebel +Grebenikov +Grechko +Greeley +Green +Greenancy +Greenberg +Greensleeves +Greenstein +Greenwich +Gregaria +Gregbryant +Gregnorman +Gregoriana +Gregorianik +Gregory +Greifswald +Grenoble +Grenville +Gressmann +Gretabetteo +Gretadevries +Gretamills +Gretia +Gretry +Griboedov +Grieg +Grier +Griesser +Grietje +Grieve +Griffin +Griffioen +Griffis +Grigery +Grignard +Grigor'ev +Grillparzer +Grimm +Grinevia +Gringauz +Griqua +Griseldis +Grishanin +Grissom +Grochowski +Groeneveld +Groeselenberg +Grogler +Gromov +Gronchi +Grondahl +Groom +Gropius +Gross +Grossman +Grote +Grotecloss +Grotius +Grotlingbo +Groussin +Grover +Grubaugh +Grubba +Grueber +Grumiaux +Grun +Grundy +Grunewald +Gruppetta +Gruss +Grygar +Gryll +Gryphia +Gryphon +Guacolda +Guangcaishiye +Guangdong +Guangxi +Guangzhou +Guardamano +Guardi +Guarneri +Guatemala +Gubarev +Gubbio +Guccini +Gudiachvili +Gudjonson +Gudrun +Gudula +Gudy +Guericke +Guernica +Guerriero +Guest +Guettard +Guetter +Gueymard +Guhagilford +Guido +Guidoni +Guidotti +Guillaume +Guillaumebude +Guillermina +Guinevere +Guiraudon +Guisan +Guisard +Guizhou +Gulak +Gulati +Gulkis +Gulyaev +Gumilyov +Guneus +Gunhild +Gunila +Gunlod +Gunma +Gunn +Gunnarsson +Gunnie +Gunter +Gunterseeber +Gunvor +Guo +Guo Shou-Jing +Gurij +Gurnemanz +Gurtler +Gurzhij +Gurzuf +Gussalli +Gustafsson +Gustavbrom +Gutbezahl +Gutemberga +Guth +Gutman +Guyhurst +Guyunusa +Guyuzhou +Gvishiani +Gwangju +Gwendolen +Gyas +Gyldenia +Gyldenkerne +Gyoda +Gyptis +Gyssens +Gywilliams +HASI +Hafez +Haapavesi +Haas +Haber +Habermas +Habing +Habsburg +Hachigoroh +Hachimantai +Hachinohe +Hachioji +Hack +Hackel +Hadamard +Hadano +Hadfield +Hadinger +Hadrianus +Hadwiger +Haffner +Hagar +Hagfors +Hagi +Hagihara +Hagino +Haginoshinji +Hahn +Haidea +Haigha +Haignere +Haiku +Hainan +Haines +Hajdu +Hajdukova +Hajek +Haken +Hakkaisan +Hakkoda +Hakoila +Hakone +Hakuhou +Hal +Halaesus +Halawe +Haldancohn +Haldane +Hale +Halimzeidan +Halitherses +Hall +Halleria +Hallerstein +Halley +Halliday +Hallstrom +Halorentz +Halperin +Halpov +Halstead +Haltia +Halverson +Halweaver +Hamabe +Hamamelis +Hamatonbetsu +Hambach +Hamburga +Hameenlinna +Hamiltonia +Hamina +Hammel +Hammer-Purgstall +Hammonia +Hammurabi +Hampfreeman +Hampton +Hamra +Hamsasridhar +Hamsun +Hamura +Hamzabari +Hanaki +Hanakusa +Hanamigahara +Hanamiyama +Hancock +Handahl +Handel +Handley +Handlin +Handsberry +Haneda +Hanff +Hangtianyuan +Hanick +Hank +Hanko +Hanna +Hannadam +Hannaharendt +Hannahwolf +Hanner +Hannibal +Hannieschaft +Hannu Olavi +Hanoi +Hansa +Hansderijk +Hansen +Hansfriedeman +Hanshintigers +Hanskya +Hansrott +Hansschmidt +Hansuess +Hanuman +Hanus +Hanzelkazikmund +Hanzlik +Hapag +Hapke +Happelia +Happer +Hara +Harada +Haraguchi +Haramura +Harbin +Harch +Harding +Hardister +Hardy +Harel +Haremari +Hargrave +Harig +Harimaya-Bashi +Harish-Chandra +Harlansmith +Harleyzhang +Harmonia +Haroldbier +Haroldconnolly +Haroldlarson +Harper +Harperclark +Harriet +Harrington +Harris +Harrison +Harryatkinson +Harryford +Hartbeespoortdam +Hartley +Hartmann +Hartmut +Hartwick +Harumi +Haruna +Harunaga +Harunasan +Haruomukai +Harutoriko +Harvard +Harvey +Harvill +Harwit +Harwood +Haryou +Harz +Haseda +Hasegawa +Hasek +Haseyuji +Hashimoto +Hashitatsu +Hasler +Hasse +Hasslacher +Hastrup +Hasuo +Haswell +Hatanaka +Hathor +Hatshepsut +Hatta +Hattori +Hattyhong +Haug +Haupt +Hauptmann +Hausdorff +Hauserova +Hausmann +Haute-Provence +Havana +Havnia +Hawaii +Hawass +Hawke +Hawking +Hawley +Haworth +Hay +Hayachine +Hayakawa +Hayamiyu +Hayamizu +Hayashi +Haydeephelps +Haydn +Haynes +Hayward +Hazamashigetomi +Hazard +Hazel +Healy +Heard +Hearnshaw +Heasley +Heath +Heather +Heatherenae +Heatherhall +Heatherholt +Heathermaria +Hebe +Hebei +Hecht +Heckmann +Hecuba +Hedberg +Hedda +Hedera +Hedin +Hedwig +Hefele +Hefter +Hegel +Heidelberga +Heidi +Heidigraf +Heidimanning +Heike +Heilongjiang +Heimdal +Heimlich +Heindl +Heine +Heinemann +Heinlein +Heinrich +Heinrichkayser +Heisei +Heisenberg +Heishu +Heiskanen +Heitifer +Heizman +Hekate +Hekatostos +Hekigoto +Hektor +Hel +Hela +Helamuda +Helena +Helenejacq +Helenorman +Helenos +Helensailer +Helensteel +Helenzier +Helewalda +Helfenstein +Helffrich +Helga +Helgoland +Heliaca +Helibrochier +Helina +Helio +Helionape +Hella +Hellahaasse +Helma +Helmholtz +Helsingborg +Helsinki +Helvetia +Helvetius +Helwerthia +Hemera +Hemerijckx +Hemingway +Hemmerechts +Hemmick +Hempel +Hemse +Henan +Hencke +Henden +Henderson +Hendricks +Hendrickson +Hendrie +Hendrika +Henja +Hennigar +Henning +Henninghaack +Hennyadmoni +Henrard +Henrietta +Henrika +Henry +Henryfong +Henrymarr +Henrymoore +Henseling +Henyey +Heojun +Hephaistos +Heppenheim +Hera +Heracles +Herakleitos +Herald +Herba +Herbelin +Herbelliott +Herberta +Herbertpalme +Herbhauptman +Herbig +Herbwindolf +Herculina +Hercynia +Herder +Heremon +Herero +Herfordia +Herge +Hergenrother +Herget +Hergiani +Herluga +Hermainkhan +Hermann +Hermannbondi +Hermanngrassmann +Hermannhesse +Hermannweyl +Hermentaria +Hermes +Hermia +Herminefranz +Hermione +Hermitage +Hermite +Hermod +Hernandez +Hernius +Herodias +Herodotus +Herran +Herreweghe +Herrick +Herriot +Herschel +Hershey +Hersilia +Hersman +Hertha +Hertz +Hertzsprung +Herzberg +Herzen +Hesburgh +Hesiodos +Hesperia +Hess +Hessen +Hestia +Hestroffer +Hetherington +Heuberger +Heudier +Heureka +Heussinger +Hevelius +Hexlein +Heyerdahl +Heyler +Heyman +Heyrovsky +Heyuan +Hezimmermann +Hiaticula +Hibbs +Hibiki +Hicklen +Hicks +Hidalgo +Hideakianno +Hideo +Hideoasada +Hideomitani +Hideosugai +Hidesan +Hideyonoguchi +Hiei +Hieizan +Hiera +Hieronymus +Hifleischer +Higashichichibu +Higson +Hikarusato +Hiketaon +Hikonejyo +Hilana +Hilaritas +Hilbert +Hilda +Hildburg +Hildebrand +Hildegard +Hildehan +Hildrun +Hill +Hillary +Hillaryfultz +Hillaryoas +Hilliard +Hiltner +Himuka +Hind +Hindemith +Hinderer +Hinkle +Hioki +Hippalgaonkar +Hipparchus +Hippasos +Hippo +Hippocastanum +Hippocrene +Hippodamia +Hippokoon +Hippokrates +Hippolochos +Hippolyta +Hipsman +Hirabayashi +Hiragagennai +Hirai +Hiraimasa +Hiramperkins +Hiraoka +Hirasawa +Hirayama +Hiroaki +Hiroakiohno +Hirohatagaoka +Hirohisasato +Hirokimatsuo +Hiroko +Hirokun +Hiromi +Hiromiyuki +Hironaka +Hirons +Hirose +Hirosetanso +Hiroshi +Hiroshikanai +Hiroshima +Hiroshimanabe +Hirotamasao +Hirsch +Hirst +Hirundo +Hirzo +Hisako +Hisayo +Hispania +Hissao +Hitchcock +Hitomi +Hitoshi +Hitsuzan +Hittmair +Hiuchigatake +Hiwatashi +Hjorter +Hjorth +Hladiuk +Hlawka +Hluboka +Hoag +Hobbes +Hobetsu +Hobson +Hoburgsgubben +Hochlehnert +Hocking +Hoder +Hodge +Hodgkin +Hodgson +Hodierna +Hodios +Hodler +Hoepli +Hoffmann +Hoffmeister +Hofmannsthal +Hogarth +Hohe Meissner +Hohensteina +Hohenzollern +Hoher List +Hohhot +Hohmann +Hokema +Hokkaido +Hokule'a +Hokusai +Hokutosei +Holasovice +Holbach +Holbaek +Holbein +Holda +Holden +Holderlin +Holdridge +Holeungholee +Holger +Hollandia +Hollar +Hollilydrury +Holliman +Hollis +Hollisjohnson +Hollows +Holly +Holman +Holmberg +Holmesacourt +Holmhallar +Holmia +Holst +Holstein +Holt +Holubov +Holvorcem +Homerus +Honda +Honduras +Honegger +Honeycutt +Hong +Hong Kong +Hongdaeyong +Honig +Honkasalo +Honoria +Honzavesely +Hooghoudt +Hooke +Hooveria +Hopemeraengus +Hopf +Hopi +Hopkins +Hopmann +Hoppe +Horatius +Horbatt +Horemheb +Horgos +Hori +Horikawa +Horimasato +Horkheimer +Horky +Hormuthia +Horn-d'Arturo +Horne +Hornstein +Horodyskyj +Horohata +Horrigan +Horrocks +Horta +Hortensia +Horton +Hortulana +Hortulus +Horus +Hosamu +Hoshi-no-ie +Hoshi-no-mura +Hoshide +Hoshigakubo +Hoshikawa +Hoshino +Hoshinohiroba +Hoshinosato +Hoshizawa +Hoskin +Hosty +Hotakadake +Hotellasilla +Houffalize +Houkidaisen +Houlahan +House +Housinger +Houssay +Houston +Houtgast +Houtman +Houzeau +Hovland +Howard +Howardmoore +Howell +Hoyin +Hoyle +Hoyt +Hrabal +Hrazany +Hrozny +Hruska +Hsieh +Hsingpenyuan +Huachucaclub +Huanghuang +Huangpu +Huangsushu +Huangweikang +Hubbard +Hubble +Hube +Hubei +Huberta +Hubertreeves +Huch +Huckins +Hudec +Hudson +Huebner +Huenna +Huertas +Hufeland +Huggins +Hughdowns +Hughes +Hughgrant +Hughmaclean +Hugo +Hugoclaus +Hugowolf +Huhunglick +Huia +Huichiming +Huikilolani +Huisjen +Hukeller +Hukvaldy +Hulbert +Hulkower +Humason +Humboldt +Hume +Humecronyn +Humeln +Hummel +Humperdinck +Humphreys +Humptydumpty +Hunan +Hundertwasser +Hungaria +Hunker +Hunnia +Hunsruck +Hunstead +Hunt +Hunten +Huntress +Hurban +Hurless +Hurnik +Huruhata +Hurukawa +Hurvinek +Hurwitz +Hus +Huskvarna +Hutchison +Huth +Hutsebaut +Hutton +Huya +Huygens +Huynh-Le +Huziak +Hveen +Hviezdoslav +Hyakkai +Hyakumangoku +Hyakutake +Hybris +Hyde +Hyeyeonchoi +Hygiea +Hylonome +Hynek +Hyogo +Hyoichi +Hyojiyun +Hypatia +Hyperborea +Hyperenor +Hypnos +Hypsipyle +Hyunseop +IAU +INAG +IRAS +IRTF +ISO +ITA +Iafe +Ialmenus +Ianfleming +Ianmorison +Iannini +Ianrees +Ianthe +Iasky +Iatteri +Ibadinov +Ibarruri +Ibramohammed +Ibsen +Icarion +Icarus +Ichikawa +Ichikawakazuo +Ichinohe +Ichiroshimizu +Icke +Iclea +Ida +Idaios +Idamiyoshi +Idelsonia +Idomeneus +Iduberga +Iduna +Idzerda +Iga +Igaueno +Iglika +Ignace +Ignaciorod +Ignatenko +Ignatius +Ignazgunther +Igorfedorov +Igormakarov +Iguanodon +Iguassu +Iguchi +Iidesan +Iisalmi +Ike +Ikeda +Ikedamai +Ikeguchi +Ikemura +Ikenozenni +Ikeuchisatoru +Ikeya +Iku-Turso +Ikufumi +Ikumadan +Ikuookamoto +Ilanramon +Ildo +Ilfpetrov +Ilias +Ilinsky +Ilioneus +Iliya +Ilizarov +Illapa +Illyria +Ilmari +Ilmatar +Ilona +Ilos +Ilse +Ilsebill +Ilsewa +Imabari +Imada +Imago +Imakiire +Imatra +Imelda +Imhilde +Imhotep +Immanuelfuchs +Immo +Impala +Imperatrix +Imprinetta +Imranakperov +Inagaki +Inanda +Inari +Inarradas +Inasan +Inastronoviny +Inca +Incidentia +Indaram +Indiana +Indiawadkins +Indulgentia +Industria +Ingalls +Inge +Ingeborg +Ingelehmann +Ingmarbergman +Ingram +Ingres +Ingrid +Ingstad +Ingwelde +Inkeri +Inna +Innanen +Innes +Innsbruck +Ino +Inoda +Inohara +Inokuchihiroo +Inoue +Inouehideo +Inouetakeshi +Inoutadataka +Inselsberg +Intel +Interamnia +Interkosmos +Interposita +Inti +Inuyama +Invernizzi +Io +Ioannisiani +Ioffe +Iolanda +Ipatov +Iphidamas +Iphigenia +Iphiklos +Irakli +Irani +Iranmanesh +Irazaitseva +Ireentje +Ireland +Irenaea +Irene +Irenesun +Iriki +Irina +Irinara +Irinyi +Iris +Irishmccalla +Irizarry +Irkutsk +Irma +Irmabonham +Irmela +Irmgard +Irmina +Irmintraud +Irokawa +Irpedina +Irtish +Iruma +Irus +Irvine +Irvpatterson +Irwin +Isa +Isaac Newton +Isabelallende +Isabelhawkins +Isabella +Isaev +Isakovskij +Isala +Isamu +Isaosato +Isara +Isberga +Isergina +Ishajain +Ishibashi +Ishidagoro +Ishidatakaki +Ishigaki +Ishiguro +Ishihara +Ishii +Ishikawakiyoshi +Ishitsuka +Ishizaki +Ishizuchisan +Ishkov +Ishtar +Isis +Iskander +Isko +Islandica +Ismene +Iso-Heikkila +Isobe +Isobelthompson +Isoda +Isogai +Isolda +Isonzo +Isora +Ispahan +Israel +Isseroff +Issunboushi +Istria +Istropolitana +Itagaki +Italia +Italocalvino +Itha +Ithaka +Itoh +Itokawa +Itsukushima +Itthipanyanan +Itting-Enke +Itzigsohn +Iva +Ivanbella +Ivandanilov +Ivanka +Ivanobertini +Ivanopaci +Ivanova +Ivanovsky +Ivantsvetaev +Ivar +Ivarsson +Ivashov +Ivavladis +Ivens +Ivobenko +Ivobudil +Ivory +Iwaizumi +Iwaki +Iwakisan +Iwamori +Iwamoto +Iwamura +Iwan +Iwano +Iwaokusano +Iwasaki +Iwatesan +Iwayaji +Ixion +Iye +Izabelyuria +Izanaki +Izanami +Izenberg +Izett +Izhdubar +Izsak +Izu +Izumi +Izvekov +JPL +Jabberwock +Jablunka +Jacchia +Jachowski +Jack London +Jackalice +Jackgrundy +Jackierobinson +Jackschmitt +Jackson +Jacliff +Jaclifford +Jacobhurwitz +Jacobi +Jacoblemaire +Jacobperry +Jacobrucker +Jacobshapiro +Jacobson +Jacqueline +Jacquescassini +Jacquescousteau +Jacqueslaskar +Jacquey +Jaffe +Jagras +Jahn +Jahreiss +Jaimeflores +Jaimenomen +Jakoba +Jakobstaude +Jakobsteiner +Jakpor +Jakubisin +Jalopez +James +James Bond +James Bradley +Jamesblanc +Jamescox +Jamescronk +Jamesdaniel +Jamesdunlop +Jamesearly +Jameshesser +Jamesjones +Jamesmcdanell +Jameswatt +Jameswu +Jamierubin +Jana +Janacek +Janapittichova +Jancis +Jandl +Jandlsmith +Janeausten +Janebell +Janegann +Janeirabloom +Janejacobs +Janelcoulson +Janelle +Janemojo +Janequeo +Janesick +Janestrohm +Janetfender +Janetsong +Janfischer +Jangyeongsil +Janhoet +Janice +Janina +Janinedavis +Janjosefric +Jankollar +Jankonke +Jankovich +Jannuzi +Jansje +Jansky +Jansmit +Janvanparadijs +Janwillempel +Janzajic +Japellegrino +Jaracimrman +Jargoldman +Jarmila +Jarnefelt +Jarnik +Jaroff +Jarosewich +Jaroslawa +Jarre +Jarrydlevine +Jarvis +Jas +Jaschek +Jasniewicz +Jasnorzewska +Jason +Jasonclain +Jasonelloyd +Jasonmorrow +Jasonschuler +Jasonwheeler +Jaspers +Jaucourt +Javid +Jawilliamson +Jaworski +Jayallen +Jayanderson +Jayardee +Jayewinkler +Jayleno +Jaynethomp +Jaytee +Jean-Claude +Jean-Jacques +Jean-Loup +Jean-Luc +Jeanhugues +Jeanli +Jeanlucjosset +Jeanmarcmari +Jeanne +Jeanneacker +Jeanpaul +Jeanperrin +Jeans +Jeansimon +Jedicke +Jeffbaughman +Jeffbell +Jeffers +Jeffgrossman +Jeffjenny +Jefflarsen +Jeffreyklus +Jeffreyxing +Jefftaylor +Jeffthompson +Jeffwynn +Jefholley +Jekabsons +Jekhovsky +Jemasalomon +Jena +Jengordinier +Jeniferevans +Jenik +Jenikhollan +Jenkinson +Jennabelle +Jennalewis +Jennamarie +Jenner +Jenngoedhart +Jennibell +Jennifer +Jenniferchoy +Jenniferfritz +Jenniferharris +Jenniferling +Jennifersass +Jenniharper +Jennings +Jennipolakis +Jenniskens +Jennivirta +Jenny +Jennyblank +Jennytaylor +Jenowigner +Jens +Jensallit +Jensch +Jensen +Jenskandler +Jensmartin +Jeon +Jepejacobsen +Jerahalpern +Jeremias +Jeremyblum +Jeremygasper +Jerne +Jerold +Jerome +Jerryguo +Jerrylewis +Jerusalem +Jerzyneyman +Jesmalmquist +Jessberger +Jessedouglas +Jessenius +Jesseowens +Jessicabaker +Jessicamiles +Jessicapearl +Jessicarnold +Jessicastahl +Jessiecheng +Jessonda +Jessop +Jeter +Jetta +Jewitt +Jezek +Jhongda +Jia-xiang +Jiangxi +Jihcesmuzeum +Jihlava +Jilin +Jillburnett +Jillhirsch +Jilltucker +Jim Young +Jimarnold +Jimbell +Jimchamberlin +Jimcornell +Jimdarwin +Jimkennedy +Jimmiller +Jimmyhom +Jimmypage +Jimmysimms +Jimrichardson +Jimstratton +Jimwestphal +Jimyang +Jindra +Jindrasilhan +Jindrawalter +Jindrichuvhradec +Jingyuanluo +Jinjuyi +Jinxiuzhonghua +Jinyong +Jinzeman +Jiranek +Jiri +Jirimrazek +Jiritrnka +Jirkahorn +Jitka +Jizera +Jizni Cechy +Jo-Ann +Joan +Joannaguy +Joannehsieh +Joannelee +Joanoro +Joanrho +Joaquinescrig +Jocelynbell +Jodiefoster +Jododaira +Jody +Joeferguson +Joegoldstein +Joeharms +Joeharrington +Joella +Joelle-gilles +Joellewis +Joeloic +Joelparker +Joemontani +Joensuu +Joetaylor +Joevellone +Jogolehmann +Johanmaurits +Johanmohr +Johanna +Johannatang +Johannes +Johannesgmunden +Johannforster +Johannhuth +Johannlowe +Johannpeter +Johannwalter +Johconnell +Johnadams +Johnayres +Johnbackus +Johnbarnes +Johnbauer +Johnbird +Johnbolton +Johnbrooks +Johnbrownlee +Johnbutler +Johnchapman +Johncleese +Johncox +Johndavies +Johnen +Johnerogers +Johneuller +Johngee +Johngenereid +Johnhagen +Johnharmon +Johnharrison +Johnharvey +Johnhault +Johnheise +Johnjames +Johnjones +Johnlambert +Johnmahoney +Johnmason +Johnmills +Johnmoore +Johnmuir +Johnny +Johnpardon +Johnpauljones +Johnpearse +Johnpenna +Johnpercy +Johnprince +Johnrather +Johnreid +Johnrichard +Johnscherrer +Johnschutt +Johnson +Johnsophie +Johnspencer +Johnstone +Johnthurmon +Johnwallis +Johnwarren +Johnwood +Johnzhou +Jokaste +Jole +Jolinefan +Jonan +Jonasz +Jonathan Murray +Jonathuggins +Jonbach +Jonchristo +Joneberhart +Jones +Jongastel +Jonhodge +Jonjoseph +Jonleake +Jonlii +Jonmunoz +Jonquet +Jonsellon +Jonstewart +Jonsujatha +Jordaens +Jorgegarcia +Jorgensen +Jorvik +Jos +Jose +Josefa +Josefcapek +Josefhlavka +Josefhudec +Joseflada +Josephbarone +Josephchurch +Josephhenry +Josephina +Josephmeyer +Josephschmidt +Josephthurn +Josephus Flavius +Josevega +Joshuaegan +Joshuahammer +Joshuajones +Joshualevine +Joshuaturner +Josse +Josties +Jostjahn +Jotwani +Joule +Jouve +Jovita +Joya +Joyce +Joyhines +Jozkakubik +Jozsef +Juanclaria +Juanvictoria +Jubilatrix +Jubjubbird +Juchnovski +Jucunda +Judilegault +Judith +Judithblack +Judson +Judycrystal +Juels +Juewa +Jugaku +Juglans +Jugta +Jugurtha +Juhani +Jujo +Julesbordet +Julgeerts +Julia +Juliabaldwin +Juliabryant +Juliafanning +Julian Loewe +Juliana +Julianhong +Julie-Melissa +Juliegrady +Juliekrugler +Julietta +Julioangel +Juliusbreza +Junehokim +Junepatterson +Jung +Jungfrun +Jungmann +Junichi +Junili +Junkobiwaki +Juno +Junsaito +Junttura +Jura +Jurafrance +Jureskvarc +Jurgen +Jurgens +Jurgenstock +Jurijvega +Jussieu +Justinbecker +Justinehenin +Justiniano +Justinkoh +Justinkovac +Justitia +Justsolomon +Justus +Juterkilian +Jutta +Juvenalis +Juvisia +Juza +Juzoitami +Jyoumon +Jyuro +Jyvaskyla +KIAM +KLENOT +Kaali +Kaarethode +Kaarina +Kaasalainen +Kabashima +Kabelac +Kabinoff +Kaborchardt +Kabtamu +Kabudari +Kaburaki +Kacenka +Kacha +Kachmokiam +Kachuevskaya +Kacivelia +Kaddoura +Kadlu +Kadota +Kadyrsizova +Kaendler +Kafka +Kagamigawa +Kaganovich +Kagawa +Kagayayutaka +Kagekatu +Kagesuke +Kageyasu +Kagiroino-Oka +Kagoshima +Kaguyahime +Kahnia +Kaho +Kahrstedt +Kaibab +Kaidanovskij +Kaifu +Kainar +Kairen +Kaiser +Kaiserman +Kaiserstuhl +Kaitduncan +Kaitlinmaria +Kaizuka +Kajaani +Kajov +Kakabadze +Kakegawa +Kakhovka +Kakinchan +Kakkuri +Kakogawa +Kalahari +Kalalova +Kalatajean +Kalaymoodley +Kalbaugh +Kalchas +Kaler +Kalevala +Kalinenkov +Kalinga +Kalinin +Kallavesi +Kalle +Kallestroetzel +Kalliope +Kallisto +Kalm +Kalman +Kalmancok +Kalmykia +Kalocsa +Kalou +Kalpanachawla +Kaltenegger +Kaluga +Kalygeringer +Kalypso +Kama +Kambic +Kamchatka +Kamegamori +Kamel +Kamen +Kamenka +Kamenny Ujezd +Kamenrider +Kamenyar +Kameoka +Kamihayashi +Kamikouchi +Kamil +Kamimachi +Kaminokuni +Kamiokanatsu +Kamisaibara +Kamitaki +Kamiyama +Kamler +Kammerer +Kamo +Kamogata +Kamogawa +Kamoun +Kampala +Kamuimintara +Kana +Kanagawa +Kanaikiyotaka +Kanaimitsuo +Kaname +Kanata +Kanatsu +Kanaya +Kanazawashi +Kanba +Kanchi +Kanda +Kandakurenai +Kandatai +Kandinsky +Kandokalman +Kandrup +Kaneko +Kanetugu +Kani +Kaningher +Kanipe +Kankelborg +Kanpuzan +Kanroku +Kansas +Kansazan +Kant +Kaokuen +Kaoru +Kap'bos +Kapaneus +Kapitsa +Kaplan +Kapps +Kapteynia +Kapur +Karachentsov +Karachkina +Karajan +Karamanov +Karamzin +Karayusuf +Karbyshev +Karel +Karelandel +Karelbosscha +Karelzeman +Karen +Karencilevitz +Karenedbal +Kareness +Karenharvey +Karenhowell +Karenlamb +Karenlemmon +Karetnikov +Karge +Kariba +Karijanberg +Karin +Karinthy +Karitskaya +Kariya +Karkoschka +Karl Marx +Karl-Ontjes +Karlheinz +Karlin +Karljosephine +Karlmay +Karlplank +Karlsorensen +Karlsson +Karlstad +Karlstejn +Karlvalentin +Karma +Karmadiraju +Karnik +Karnten +Karoji +Karolinum +Karpov +Karst +Karttunen +Kartvelia +Kasahara +Kasan +Kaseda +Kashcheev +Kashirina +Kashiwagi +Kashiwagura +Kashkashian +Kasmith +Kassandra +Kastalia +Kastel +Kastner +Kasuga +Kataev +Katanga +Kataoka +Katarinawitt +Katayama +Kate +Katelowry +Katgert +Kathanson +Katharina +Kathartman +Katharvard +Kathbarnhart +Katherinrose +Kathermann +Katheynix +Kathleen +Kathleenmartin +Kathmandu +Kathryn +Kathrynblair +Kathwallace +Kathy +Kathydouglas +Kathyfinch +Kathywhaler +Katiaottani +Katiedavis +Katja +Kato +Katoizumi +Katrianne +Katrinaminck +Katschwarz +Katsuhiko +Katsuno +Katsurahama +Katterfeld +Katuhikoikeda +Katumaru +Katygord +Katyusha +Katz +Kaufmann +Kaula +Kaulbach +Kaunas +Kavasch +Kavelaars +Kaverin +Kaverznev +Kawabata +Kawada +Kawaguchi +Kawaguchijun +Kawakami +Kawakita +Kawamura +Kawane +Kawasaki +Kawasato +Kawazoe +Kayala +Kaye +Kayfurman +Kaylacornale +Kayor +Kaysonconlin +Kazak +Kazakhstania +Kazakov +Kazanuniversity +Kazbegi +Kazi +Kazo +Kazuhiko +Kazuhisa +Kazukin +Kazukitakahashi +Kazuko +Kazukoichikawa +Kazutaka +Kazuya +Kazuyuki +Kazuyukihanda +Keaton +Keats +Keay +Keck +Keeler +Keenanferar +Keeney +Keesey +Keesom +Keet Seel +Kegler +Keiko +Keikonakamura +Keil +Keithnoll +Keithtritton +Keizan +Kejosmith +Keldysh +Kelindsey +Kellaway +Keller +Kellerman +Kelleyharris +Kelly +Kellychacon +Kellyday +Kelsey +Kelseykay +Kelvin +Kemble +Kemcook +Kemeisha +Kemeny +Kemerovo +Kemi +Kempchinsky +Kempelen +Kempowski +Kemstach +Kemurdzhian +Kendriddle +Keneke +Kenfreeman +Kenjitanabe +Kenjitoba +Kenkaplan +Kenlarner +Kenmitchell +Kenmotsu +Kennajeannet +Kennedy +Kennethott +Kenny +Kenos +Kenphillips +Kenreimonin +Kenrussell +Kensiequade +Kent +Kenway +Kenwill +Kenya +Kenzaburo +Kenzo +Kenzokohno +Kenzotange +Kepler +Kepping +Kerch +Keremane +Kerkhoven +Kerstin +Kervin +Kessler +Ketelsen +Ketover +Kettering +Kevinclaytor +Kevingao +Kevinkuo +Kevinlane +Kevinrighter +Kevinwang +Kevinwelsh +Kevinyang +Kevo +Kevola +Keyaki +Kezmoh +Khachatryan +Khadzhinov +Khaki +Khama +Khandrika +Khanina +Kharadze +Kharasterteam +Khariton +Kharkiv +Kharkivuniver +Kharlamov +Kharms +Khatchaturian +Khege +Kholshevnikov +Khotinok +Khrennikov +Khromchenko +Khryses +Khture +Khufu +Khvorostovsky +Kianafrank +Kiang +Kiangsu +Kibeshigemaro +Kibi +Kibirev +Kibo +Kida +Kieffer +Kienle +Kierkegaard +Kiess +Kiev +Kievtech +Kigoyama +Kihara +Kikuchi +Kikuoka +Kiladze +Kilia +Kiliaan +Kilkis +Kilmartin +Kilopi +Kimamos +Kimberscott +Kimclijsters +Kimcochran +Kimgyehyun +Kimhansell +Kimihiro +Kimjeongho +Kimnovak +Kimperkins +Kimrichards +Kimshin +Kimura +Kimuranaoto +Kimuraseiji +Kimuratakeshi +Kimwallin +Kindleberger +Kineyayasuyo +King +Kingsford Smith +Kinkowan +Kinney +Kinoshita +Kinoshitamasao +Kinpu +Kintaikyo +Kintanar +Kinugasa +Kippenhahn +Kippes +Kira +Kirchhoff +Kirchner +Kirfrieda +Kirghizia +Kirian +Kirigamine +Kirik +Kiriko Matsuri +Kiril-Metodi +Kirillavrov +Kirkdouglas +Kirkland +Kirkpatrick +Kirkwood +Kirov +Kirsan +Kirsanov +Kirschvink +Kirstinemeyer +Kiruna +Kiryu +Kisala +Kiselev +Kishine +Kishon +Kiso +Kisohinoki +Kissel +Kissling +Kita-Kyushu +Kitahiroshima +Kitami +Kitao +Kitezh +Kitt Peak +Kittappa +Kittisvaara +Kitty +Kiuchi +Kivi +Kiyohira +Kiyomori +Kiyosato +Kiyose +Kjeriksson +Klaasen +Klagenfurt +Klages-Mundt +Klaipeda +Klarasmi +Klare +Klass +Klausheide +Klaustschira +Klavetter +Kleczek +Klee +Kleewyck +Klein +Kleinrichert +Kleist +Klement'ev +Klementinum +Klemola +Klemperer +Kleopatra +Klepesta +Klepper +Klet +Klimcak +Kliment Ohridski +Klimesh +Klimishin +Klimt +Klinger +Klingsor +Klinkenberg +Klinkerfues +Klio +Klondike +Klonios +Klopsteg +Klopstock +Klostermann +Klotho +Klotilde +Klotz +Kluesing +Kluk +Klumpkea +Klyazma +Klymene +Klytaemnestra +Klythios +Klytia +Klyuchevskij +Knacke +Kneipp +Knezevic +Kniertje +Knigge +Knight +Knobelsdorff +Knofel +Knopfia +Knud +Knushevia +Knuth +Knutsson +Knyr +Knysna +Ko +Kobayashi +Kobe +Kobedaitenken +Kobolda +Kobori +Kobresia +Kobuchizawa +Kobushi +Kobzar +Kobzon +Koch +Kochera +Kocherpeter +Kochi +Kochibunkyo +Kochiny +Kodaihasu +Kodaira +Kodaly +Kodomonomori +Koeberl +Koen +Kogo +Kogure +Koharumi +Kohler +Kohlhase +Kohman +Kohno +Kohoutek +Kohsai +Koichiyuko +Koikeda +Koirala +Koishikawa +Kojiki +Kojima +Kojiroharada +Kojitaku +Kokkola +Kokoschka +Koktebelia +Kol'tsovo +Kolbe +Koldewey +Kolesnikov +Kolga +Kollaa +Kollontai +Kollwitz +Kolokolova +Kolya +Komaki +Komarov +Komatsubara +Komatsusakyo +Komendantov +Komensky +Kominers +Komiyama +Komm +Komoda +Komori +Komppa +Komsomolia +Komurotoru +Koncek +Kondakov +Kondratyuk +Konermann +Konetskiy +Konig +Konigstuhl +Konko +Konkohekisui +Konkolya +Konnai +Kononovich +Konopleva +Konoshenkova +Konovalenko +Konradbenes +Konradin +Konradzuse +Konstantin +Konstfrolov +Konstitutsiya +Konyukhov +Koon +Kopal +Kopff +Koppeschaar +Koptelov +Kopylov +Korado +Koranna +Korbokkur +Korczak +Kordula +Koremori +Korhonen +Korinthos +Kornev +Korolenko +Korolev +Korolirina +Koromhazi +Koronis +Korsor +Korsten +Korsunia +Korteweg +Koschny +Koskenniemi +Kosmaczewski +Kosmodemyanskaya +Kosovichia +Kostinsky +Kostyukova +Kotelnikov +Kothen +Kotka +Kotogahama +Kotov +Kottapalli +Kottler +Kouji +Koujounotsuki +Koukolik +Kourakuen +Kourovka +Koussa +Koussevitzky +Kouzel +Kovacia +Kovalevskaya +Kovarik +Kowalinski +Kowalski +Koyama +Koyo +Kozai +Kozelsky +Kozlov +Kozlovskij +Kozuki +Kozyrev +Kraft +Kraklingbo +Kramer +Kramlik +Kranjc +Krasetin +Krasheninnikov +Krasinsky +Kraske +Krasnogolovets +Krasnoyarsk +Krat +Kratzer +Kraus +Krautter +Kravtsov +Krcin +Kreil +Kreisau +Krejci +Kremenia +Kremsmunster +Kremze +Kreppein +Kresak +Kresilas +Kressida +Kressmannia +Krethon +Kretlow +Kreusa +Kreutz +Kridsadaporn +Kriegh +Kriemhild +Krikalev +Krimigis +Kring +Krinov +Krisbarons +Krishnan +Kristensen +Kristianpedersen +Kristibutler +Kristina +Kristinaufer +Krivan +Krivsky +Krizik +Kroemer +Krok +Kroll +Kromeriz +Kron +Kronecker +Kronk +Kronstadt +Krosigk +Krugly +Krumeich +Kryl +Krylania +Krylov +Krystofharant +Krystosek +Ksana +Ksenborisova +Ksoari +Kuan +Kubacek +Kuber +Kubik +Kubisova +Kubokawa +Kubota +Kubrick +Kudara +Kudohmichiko +Kuffner +Kuga +Kugelgen +Kugultinov +Kuiper +Kukai +Kukarkin +Kukkamaki +Kuklov +Kukucin +Kulawik +Kuldiga +Kulibin +Kulik +Kulikov +Kulikovskij +Kulin +Kullander +Kuma +Kumagaya +Kumakiri +Kumamori +Kumamoto +Kumanodake +Kumiko +Kummer +Kumon +Kumotori +Kuncham +Kundera +Kundry +Kunigunde +Kuniharu +Kunihiko +Kuniji +Kuniko +Kunikov +Kunilraval +Kunimoto +Kunishimakoto +Kunisuke +Kunitomoikkansai +Kunitsugu +Kuniwake +Kunlun +Kunming +Kunz-Hallstein +Kunzak +Kuopio +Kuotzuhao +Kupe +Kuperus +Kupka +Kuprin +Kuragano +Kurashiki +Kuratani +Kuratowski +Kurchatov +Kurchenko +Kuritariku +Kurland +Kurobe +Kuroda +Kurohone +Kuroiwa +Kurokawa +Kursk +Kurtbachmann +Kurtlindstrom +Kurtwahl +Kurtz +Kusaji +Kusaka +Kusatao +Kuscynskyj +Kushalnaik +Kushida +Kushinadahime +Kushiro +Kusnierkiewicz +Kustaanheimo +Kutafin +Kutaissi +Kutsak +Kutuzov +Kuwabara +Kuwana +Kuwano +Kuzbass +Kuznetsov +Kvasnica +Kvicala +Kvistaberg +Kviz +Kwak +Kwasan +Kwee +Kwiatkowski +Kyivphysfak +Kylebeighle +Kyleyawn +Kyogoku +Kyoko +Kyoshi +Kyoto +Kypria +Kyrobinson +Kyte +Kythera +Kyusakamoto +L'Aquila +L'Encyclopedie +L'Obel +LINEAR +LONEOS +La Billardiere +La Canada +La Condamine +La Harpe +La Orotava +La Paz +La Perouse +La Plata +La Sagra +La Serena +La Silla +La Spezia +Laban +Labeyrie +Labnow +Labrecque +Labs +Lac d'Orient +Lacadiera +Lacaille +Lachat +Lachesis +Lacrimosa +Lacroute +Lacrowder +Lada +Ladegast +Ladislavschmied +Ladoga +Laertes +Laetitia +Lafcadio +Lafer-Sousa +Laffan +Lafiascaia +Lafontaine +Lagarini +Lagerkvist +Lagerlof +Lagerros +Lagia +Lagillespie +Lagrangea +Lagrula +Laguerre +Lahti +Lahulla +Lai +Laichunju +Laird +Laitsaita +Lake Placid +Lala +Lalage +Lalande +Lalchandani +Lalitpatel +Lallaward +Lallement +Lamarck +Lamb +Lamberta +Lambertini +Lamberton +Lambey +Lambrecht +Lameia +Lamettrie +Lampedusa +Lampetia +Lampland +Lampos +Lamy +Lancearmstrong +Lancelot +Lancetaylor +Landau +Landfermann +Landgraf +Landi +Landolt +Landstreet +Lane +Lane-Cline +Lanejackson +Langberg +Langevin +Langley +Langres +Lanna +Lanning +Lanthrum +Lanzerotti +Lanzia +Laocoon +Laodamia +Laodica +Laomedon +Laon +Laotse +Lapalma +Lapko +Laplace +Lapovok +Lappajarvi +Lappeenranta +Lapponica +Laputa +Laques +Larashelton +Larbro +Larimer +Larink +Larion +Larissa +Larry +Larrybartel +Larryhu +Larryrobinson +Larryscherr +Larrysmith +Larrywalker +Larrywilson +Larson +Las Casas +Las Cruces +Las Vegas +Laska +Laskerschueler +Lasorda +Lassell +Lassine +Lassovszky +Lasswitz +Lastrucci +Lasvergnas +Laszkowska +Latham +Latimer +Latona +Lattu +Latvia +Lau +Laubernasconi +Lauer +Laugier +Laupheim +Laura +Laurajohnson +Laurajones +Laurake +Laurawong +Laurel +Laurelclark +Laurensmith +Laurentblind +Laurentia +Lauretta +Lauriefletch +Laurielee +Laurierumker +Laurisiren +Lausanna +Lautaro +Laval +Lavanture +Lavater +Laver +Laverna +Lavilledemirmont +Lavins +Laviolette +Lavoisier +Lavonne +Lavoratti +Lavrentina +Lavrov +Lavrovsky +Lawrence +Lawson +Laynrichards +Lazarev +Lazaridis +Lazenby +Lazio +Lazzaro +Le Creusot +Le Gentil +Le Poole +Leahmarie +Leakey +Leal +Leani +Leatherman +Leavitt +Lebedev +Lebedev-Kumach +Lebedinskij +Lebesgue +Lebofsky +Lebon +Lebreton +Lecacheux +Lecar +Lecointe +Lecorbusier +Leda +Lederle +Ledouanier +Lee +Leeannragasa +Leechaohsi +Leeperry +Leesuikwan +Leetsungdao +Leeuwenhoek +Leewonchul +Lefort +Lefschetz +Legault +Legendre +Legg +Legia +Lehar +Lehigh +Lehky +Lehmbruck +Leibacher +Leibniz +Leiden +Leifandersson +Leifer +Leiferman +Leipzig +Lejsturojr +Lellouch +Leloir +Lem +Lemaire +Lemaitre +Lemay +Lemeshev +Lemke +Lemonnier +Lemp +Lemus +Lena +Lenagoryunova +Lenau +Lencarter +Lene +Lenham +Leningrad +Lenka +Lennon +Leobaeck +Leocadia +Leoconnolly +Leogoldberg +Leona +Leonardmartin +Leonardo +Leonce +Leonfridman +Leonhardt +Leonidakimov +Leonidarosino +Leonidas +Leonisis +Leonmis +Leonora +Leonov +Leonpascal +Leonteus +Leontina +Leontovich +Leopardi +Leopoldina +Lepage +Lepaute +Lepsius +Lergrav +Lermontov +Leroy +Leshin +Leskov +Lesleymartin +Lesliebeh +Lesliegreen +Leslieyoung +Leslijohnson +Lesnaya +Lessing +Lester +Lestermackey +Lestone +Lesya +Letaba +Letianzhang +Leto +Letunov +Letzel +Leucocephala +Leucopsis +Leucorodia +Leucura +Leukippos +Leukothea +Leung +Leuschneria +Lev Tolstoj +Levary +Levasseur +Leverrier +Levi-Civita +Leviathan +Levin +Levison +Levitan +Levy +Lew Allen +Lewasserman +Lewicki +Lewis +Lewiscarroll +Lewislove +Lewispearce +Lewit +Lewkopelew +Lewotsky +Lexcen +Lexell +Lexington +Leyla +Lhasa +Lhenice +Li +Liadawley +Liaoning +Liaoyenting +Libby +Libenice +Libera +Liberati +Liberatore +Liberatrix +Liberia +Libitina +Libussa +Libya +Licandro +Licchelli +Licht +Lichtenberg +Lichtman +Liciniotoso +Licitra +Lick +Lictoria +Lidaksum +Liddell +Lidiya +Lidov +Lie +Liebe +Liebermann +Lieblich +Liechty +Liedeke +Lieske +Lievetruwant +Lifeson +Lightdonovan +Liguria +Liia +Lijiang +Likhachev +Lilaea +Lilienthal +Lilio +Lilith +Lilium +Liller +Lilliana +Lilliantsai +Lilliputia +Lilofee +Liloketai +Lima +Limburgia +Limorenko +Limosa +Limpopo +Limporyen +Lina +Linapucci +Linchen +Linchinghsia +Lincoln +Linda +Linda Susan +Lindaweiland +Lindawilliams +Lindbladia +Lindbloom +Lindelof +Lindemannia +Lindenau +Lindgren +Lindner +Lindperkins +Lindsayleona +Lindstrom +Lindwestrick +Linenschmidt +Linfrederick +Lingas +Lingchen +Lingpan +Linie +Link +Linmichaels +Linnaea +Linnaeus +Linnankoski +Linsley +Lintingnien +Linux +Linzerag +Linzexu +Linzia +Lioba +Lion-Stoppato +Lionel +Liouville +Lipno +Lipovetsky +Lippens +Lipperta +Lipschutz +Liriope +Liroma +Lisann +Lisatate +Lisauckis +Lisbeth +Lise +Liselotte +Lisitsa +List'ev +Liszt +Litke +Litomysl +Littlewood +Litva +Liu +Liutingchun +Liuxiaofeng +Liuzongli +Livadia +Liverdun +Livesey +Liviogratton +Livius +Lixiaohua +Liyuan +Liyulin +Ljuba +Llano +Llapasset +Llull +Lobachevskij +Lobelia +Locarno +Locatelli +Locke +Loden +Loder +Lodewijk +Lodewijkberg +Lodovicoferrari +Loehde +Loeillet +Loewenstein +Lofgren +Logos +Loharu +Lohengrin +Lohja +Lohmann +Lohrmann +Lois +Loke +Lokrume +Lola +Lombardi +Lomberg +Lomia +Lomnicky Stit +Lomonosowa +London +Londontario +Longmire +Longo +Longtom +Lonnielinda +Lonnrot +Lons +Loos +Lopez +Lopez-Moreno +Loral +Lorbach +Lorcia +Loreley +Lorenz +Lorenzalevy +Loretta +Lorgat +Loribragg +Loriehutch +Lorifini +Lorifritz +Loripaul +Loripryor +Loriskopp +Lorraine +Lorre +Lorsolomon +Lortzing +Losaka +Loschmidt +Lossignol +Lothar +Lotis +Lottie +Loubna +Louchheim +Louhi +Louisburg +Louise +Louisgarcia +Louispharailda +Louisspohr +Louvre +Louwman +Lova +Lovas +Lovejoy +Lovi +Loviisa +Lowe +Lowell +Lowellgreen +Lowengrub +Lowman +Lowry +Loyola +Lozere +Lozino-Lozinskij +Luanda +Lub +Lubarsky +Lubeck +Lubenow +Lubin +Lubomir +Lubos Perek +Lubosluka +Lucafini +Lucas +Lucascavin +Lucashof +Lucaslara +Lucasmoller +Lucca +Luce +Lucenec +Lucerna +Luchernandez +Lucia +Lucianotesi +Lucidor +Lucienne +Lucifer +Lucina +Lucretia +Lucretius Carus +Lucubratio +Luda +Ludekpesek +Luderic +Ludibunda +Ludkewycz +Ludmilla +Ludolfschultz +Ludolph +Ludovica +Ludwigbechstein +Ludwighesse +Ludwigrichter +Luga +Lugano +Lugduna +Lugger +Luginbuhl +Lugmair +Lugo +Lugosi +Luguhu +Luichewoo +Luigibussolino +Luigimartella +Luisa +Luisapla +Luisapolli +Lujiaxi +Lukasiewicz +Lukaszewski +Lulea +Lulin +Lully +Lumen +Lumiere +Luminet +Lumme +Lummelunda +Lunacharsky +Lunaria +Lundia +Lundmarka +Lundstrom +Luneburg +Lunn +Luoxiahong +Lupishko +Lupo +Luscinia +Luscinioides +Lust +Luteolson +Lutetia +Luthera +Lutskij +Luttrell +Lutz +Luu +Luxembourg +Luyajia +Luyi +Luyten +Luzin +Luznice +Lyalya +Lyanzuridi +Lyapidevskij +Lyapunov +Lycomedes +Lydia +Lydina +Lyka +Lykaon +Lyman +Lynch +Lynden-Bell +Lynette +Lynn +Lynnecox +Lynnejohnson +Lynnrice +Lynnta +Lynzielinski +Lyon +Lyot +Lyrahaas +Lysa hora +Lysippus +Lysistrata +Lytvynenko +Lyubamoroz +Lyubimets +Lyubov +Lyudvasilia +Lyyli +Lyzenga +MACEK +MIT +MOTESS +MPC +Maartje +Mabella +MacChnoic +MacCready +MacGillivray +MacGregor +MacKenzie +MacLean +MacPherson +MacRobert +Maca +Macalintal +Macao +Maccacaro +Mach +Machado +Machar +Machiavelli +Machielalberts +Machin +Machu-Picchu +Mackerras +Mackey +Macocha +Macon +Macreid +Madeline +Madelynho +Madenberg +Madhatter +Madicampbell +Madiraju +Madler +Madresplazamayo +Madreteresa +Madrid +Maehara +Maehata +Maestlin +Maeva +Maffei +Magarach +Magdalena +Magdeburg +Magee-Sauer +Magellan +Maggiedelano +Magion +Magnanimity +Magni +Magnitka +Magnitskij +Magnolia +Magnusson +Magnya +Magoeba +Magomaev +Magri +Magritte +Mahadik +Mahakala +Mahalia +Mahalingam +Mahler +Maichin +Maik +Maillen +Maillol +Mainfranken +Mairepercy +Maisica +Maiztegui +Maja +Majella +Majoni +Majsterrojr +Majuba +Mak +Makarenko +Makarij +Makarov +Makhaon +Makharadze +Maki +Makibi +Makimiyamoto +Makino +Makio +Maklaj +Makoto +Makotoirie +Makotomasako +Makover +Maksutov +Malabar +Malanin +Malaparte +Malaren +Malashchuk +Malautra +Malbil +Malchiodi +Malerba +Malhotra +Mali Losinj +Malin +Malinsmith +Mallard +Mallorca +Mallory +Mally +Malmo +Malmquista +Malovany +Malpais +Malpighi +Malse +Malus +Malva +Malvina +Malyshev +Malytheatre +Malzovia +Mameli +Mamesser +Mameta +Mamiya +Mammuthus +Mamontov +Mamoru +Manabe +Manara +Manas +Manaslu +Manca +Mancunia +Mandelbrot +Mandelshtam +Mandeville +Mando +Mandryka +Manek +Manfredi +Manfredstoll +Manfro +Mang +Manhattan +Manicolas +Maniewski +Manjiro +Manjitludher +Mann +Manning +Mannucci +Manosque +Manpreetkaur +Mans +Mansour +Mansurova +Mantl +Manto +Manu +Manuboccuni +Manuel +Manuilova +Manulis +Manwell +Manyousyu +Manzano +Maoyisheng +Marakessler +Marani +Marashwhitman +Marathon +Marbachia +Marc +Marcallen +Marcelgoffin +Marcelgrun +Marceline +Marcelle +Marcelriesz +Marcgraf +Marchais +Marchare +Marchetti +Marchis +Marchuk +Marci +Marcinkiewicz +Marcks +Marconcini +Marconia +Marcopolo +Marcosbosso +Marcospontes +Marcusaurelius +Marcustacitus +Marcyeager +Maren +Marenka +Maresjev +Mareverett +Marg Edmondson +Margalida +Margaretmiller +Margarita +Margarshain +Marghanna +Margo +Margolin +Margot +Margret +Marhalpern +Maria +Mariacapria +Mariacristina +Mariadina +Mariafelix +Mariagodinez +Mariagorodnitsky +Mariagriffin +Mariahines +Mariakirch +Mariangela +Marianna +Marichardson +Mariealoia +Marieladislav +Marielukac +Marieoertle +Marietta +Marik +Marila +Marilpeters +Marilyn +Marilytedja +Marimo +Marina +Marinmarais +Mario +Mariobotta +Marioferrero +Mariola +Marion +Mariotti +Mariovalori +Marisandoz +Maritima +Marjaleena +Marjorie +Marjoriika +Mark Twain +Markcroce +Markeev +Marker +Markert +Markhavel +Markhobbs +Markidger +Markjarnyk +Markov +Markrees +Markrobinson +Marksaunders +Markthiemens +Markzakharov +Marlamoore +Marlene +Marlu +Marmara +Marmulla +Marnix +Marov +Marschwarzschild +Marsden +Marshafolger +Marshak +Marshasega +Marshburrows +Marsland +Marsupilami +Martak +Martaprincipe +Martebo +Martelli +Martes +Martha +Marthahazen +Marthanalexander +Martin Luther +Martina +Martinbeech +Martindavid +Martinduncan +Martinez +Martinfierro +Martinhoffmann +Martinoli +Martinryle +Martinsolc +Martinuboh +Martir +Martschmidt +Martynov +Maruseppu +Marutesser +Maruyama +Marvin +Mary +Maryam +Maryanning +Marybrown +Marybuda +Marychristie +Marycole +Marycragg +Maryellen +Marygardner +Maryhedberg +Marylea +Marymartha +Marymohammed +Marzari +Masa +Masaharu +Masajisaito +Masakatsu +Masakichi +Masako +Masamifuruya +Masamika +Masamitsu +Masamotonasu +Masamura +Masanori +Masaru +Masaryk +Masatomi +Masatoshi +Masayo +Masayuki +Mascharak +Mascheroni +Mashona +Mashu +Masi +Maslachkova +Maslov +Maslovets +Maslyakov +Mason-Dixon +Massachusetts +Massalia +Massandra +Massar +Massevitch +Massey +Massimocalvani +Massinga +Masterby +Masterman +Mastrodemos +Masuisakura +Masumi +Masumoto +Masursky +Masuzawa +Matarazzo +Matejbel +Mateo +Mather +Mathesis +Mathiasbraun +Mathieu +Mathilde +Matisse +Matjazbone +Matjazhumar +Matogawa +Matossian +Matra +Matrosov +Mats +Matson +Matsuda +Matsue +Matsuki +Matsumoto +Matsumotomas +Matsumura +Matsuo +Matsushima +Matsuura +Matsuyama +Mattblythe +Mattbrenner +Mattdawson +Mattei +Matterania +Mattgenge +Matthewage +Matthewdavis +Matthewhall +Matthewkroll +Matthewlepow +Matthewnanni +Matthias +Matti +Mattiaca +Mattiaorsi +Mattmiller +Mattmooney +Mattmuehler +Mattweegman +Matusovskij +Matvienko +Matzner +Mauderli +Mauersberger +Maungakiekie +Maupertuis +Mauratombelli +Maureenanne +Maureenbell +Maurilia +Mauritia +Maurivicoli +Maury +Mavis +Mawson +Maxaub +Maxbeckmann +Maxfrisch +Maxhell +Maximiliana +Maximova +Maxine +Maxinehelin +Maxwell +May +Mayakovsky +Mayall +Mayeda +Mayhan +Maymelou +Maymie +Maynard +Mayo +Mayre +Mayremartinez +Mayrhofer +Maysunhasan +Mayuminarita +Mazumder +Mazurkiewicz +Mazurova +Mazzucato +McAdams +McAliley +McAllister +McAlpine +McArthur +McAuliffe +McBride +McCall +McCann +McCarron +McCarter +McCarthy +McCartney +McCauley +McCleese +McClintock +McCloskey +McClure +McConnell +McCord +McCoy +McCrosky +McCuskey +McDonalda +McDonnell +McDowell +McElroy +McEwen +McFadden +McGaha +McGarvey +McGee +McGetchin +McGill +McGivney +McGlasson +McGlothlin +McGlynn +McGraw-Hill +McHone +McIntosh +McKay +McKeegan +McKenna +McKennon +McLaughlin +McMath +McMillan +McNair +McNally +McNaught +McQuarrie +McSween +McVittie +Mcalanis +Mcdavid +Mcdermott +Mcfarland +Mckim +Mcneeley +Mcpainter +Meadows +Meagmessina +Mebailey +Mechain +Mechthild +Meckbach +Mecklenburg +Medea +Medeobaldia +Medi +Medkeff +Medlock +Medmondson +Medon +Meduna +Medusa +Medvedev +Meech +Meesters +Meeus +Megaira +Megangross +Megantic +Meges +Meglass +Mego +Megryan +Megumi +Mehltretter +Meibom +Meiden +Meigooni +Meileawertz +Meinel +Meistereckhart +Meitner +Meizhou +Mekistheus +Melaas +Melakabinoff +Melancholia +Melanchton +Melanie +Melanthios +Melchior +Melete +Meliboea +Melindakim +Meliselinger +Melitta +Mellena +Melnikov +Melosh +Melpomene +Melusina +Memamis +Memling +Memnon +Memoria +Memphis +Menabrea +Menaechmus +Menchu +Mendel +Mendeleev +Mendelssohn +Mendillo +Mendoza +Menelaus +Menestheus +Menge +Menghuan +Menichelli +Menippe +Menkaure +Menottigalli +Menshikov +Mentall +Mentha +Mentor +Menzel +Mera +Merapi +Mercado +Mercatali +Mercator +Mercedes +Mergler +Merian +Merida +Merignac +Meriones +Merkley +Merkord +Merlin +Merman +Merope +Merrill +Mersenne +Merta +Mertona +Merxia +Meslier +Mesopotamia +Messalina +Messenger +Messerschmidt +Messiaen +Messick +Messier +Messina +Messner +Mesyats +Meta +Metcalfia +Metelli +Metis +Metsahovi +Mette +Metz +Metzger +Metzler +Meunier +Meuse +Mexico +Meyer +Meyermann +Meyerowitz +Mezzarco +Miahelena +Micahtoll +Michaelallen +Michaelbarber +Michaelcarr +Michaelding +Michaelesser +Michaeljager +Michaeljames +Michaelklein +Michaellane +Michaelmi +Michaelolson +Michaelpalin +Michaelpizer +Michaelrice +Michaelroche +Michaelsegal +Michageffert +Michalowski +Michanikos +Michard +Michel +Michela +Michelangelo +Michelblanc +Michelcombes +Michelebianda +Michelepatt +Michelle +Michellouie +Michelory +Michelson +Michielford +Michiko +Michinari +Michiokuga +Michkovitch +Michta +Mickiewicz +Midas +Midavaine +Midgekimble +Midori +Midsomer Norton +Mie +Mieke +Miekerouppe +Mielikki +Mien +Miesvanrohe +Mifischer +Migaic +Migaki +Migirenko +Migliardi +Migliorini +Mignard +Migomueller +Mihika +Miho +Mihonoseki +Mijacobsen +Mijerbarany +Mika +Mikawa +Mikeanderson +Mikebrown +Mikecombi +Mikecosta +Mikehagler +Mikemagee +Mikemorton +Mikeoates +Mikepenston +Mikeread +Mikesandras +Mikeshepard +Mikewagner +Mikhailgrinev +Mikhailmil' +Mikhailov +Mikhalkov +Mikhel'son +Mikkeli +Mikkelkocha +Mikkilineni +Mikko +Mikkola +Miklenov +Mikolaichuk +Mikula +Mikulasek +Mila +Milani +Milankovitch +Milanstefanik +Milbourn +Mildred +Milenajesenska +Miles +Milesdavis +Milesovka +Milet +Milicevic +Milkey +Millan +Miller +Milligan +Millis +Millman +Millosevich +Milne +Milone +Milos +Milstein +Miltiades +Milton +Mimatsu +Mimi +Miminko +Mimistrobell +Mimosa +Minakata +Minamioda +Minano-machi +Minas Gerais +Mineosaito +Minerva +Mineura +Mingantu +Minin +Minitti +Minkowski +Minnaert +Minnesang +Minor +Minoruoda +Minorushimizu +Minos +Minowa +Minox +Minoyama +Minsk +Minutus +Mira +Mirabeau +Mirano +Mireille +Mirellabreschi +Mirellalilli +Miretti +Miriam +Mirimao +Mirna +Mirnaya +Miron +Mironov +Miroshnikov +Miroslavholub +Mirotsin +Mirstation +Misa +Misakatouge +Misawa +Miselli +Misenus +Mishima +Mispagel +Missacarvell +Mission Valley +Misterrogers +Misto +Mistral +Misuzu +Mitaka +Mitake-mura +Mitalithakor +Mitamasahiro +Mitani +Mitau +Mitchella +Mitchfourman +Mitchweegman +Mithra +Mitidika +Mitlincoln +Mitsuko +Mitsumata +Mitsunori +Mitsuroohba +Mitsuru +Mittag-Leffler +Mittal +Mittlefehldt +Mitton +Mitukurigen +Miune +Miura +Miviscardi +Miwa +Miwablock +Miyagino +Miyairi +Miyaji +Miyajima +Miyama +Miyamoto +Miyamotoatsushi +Miyamotoyohko +Miyasaka +Miyazaki +Miyazakihayao +Miyazawakenji +Miyazawaseiroku +Mizrahi +Mizser +Mizugaki +Mizugatsuka +Mizuho +Mizuno +Mizunohiroshi +Mizunotakao +Mizunuma +Mizusawa +Mizushima +Mizutani +Mjolnir +Mnemosyne +Mnesthus +Mobberley +Moberg +Mobius +Mochihito-o +Mochizuki +Mocia +Mockturtle +Mocz +Modena +Modestia +Modra +Modugno +Moe +Moehorgan +Moeller +Moesta +Moffatt +Mogamigawa +Moguntia +Mohler +Mohorovicic +Mohr +Mohr-Gruber +Moira +Moisseiev +Moivre +Moiwa +Mojmir +Mokotoyama +Molchan +Moldavia +Moldun +Moletai +Molfino +Moliere +Molina +Mollissima +Mollypettit +Molster +Mombasa +Mommsen +Momotaro +Momoyo +Monachia +Monari +Monchicourt +Monella +Monet +Monge +Mongmanwai +Monica +Monicagrady +Monicalazzarin +Monier +Monikohl +Monitoma +Monnig +Monod +Monrad +Monroe +Mons Naklethi +Monsummano +Mont Blanc +Montague +Montaigne +Montana +Montanari +Montebugnoli +Montecorvino +Montefiore +Montelimar +Montelongo +Montelupo +Monterosa +Montesquieu +Monteverdi +Montevideo +Montezuma +Montgolfier +Montigiani +Montreal +Montviloff +Monty +Monty Python +Mony +Moons +Moore +Moore-Sitterly +Mora +Morabito +Moraes +Moran +Morando +Morata +Moravia +Morbidelli +Mordell +Morden +Moreau +Morecambewise +Morellet +Morgan +Morganmonroe +Morgenstern +Mori +Moriarty +Morihiroshi +Morike +Morikubo +Morimoto +Morisot +Morita +Moriyama +Mork +Morkolab +Morogues +Moroso +Morosovia +Moroz +Morpurgo +Morricone +Morris +Morrison +Morrow +Morse +Morstadt +Mortensen +Morton +Morvan +Moseley +Mosigkau +Moskva +Moskvina +Mossbauer +Mossotti +Motaeno +Motegi +Mott +Mottola +Mould +Moulding +Moultona +Mount Banzan +Mount Kent +Mount Locke +Mount Stromlo +Mourao +Mousa +Moutier +Mowers +Moyanodeburt +Moynahan +Mozartia +Mozhaiskij +Mr. Spock +Mr. Tompkins +Mravinskij +Mrinalini +Mrkos +Msecke Zehrovice +Mshatka +Mtskheta +Muazzez +Mubdirahman +Mucha +Muchachos +Muckea +Mueller +Mufson +Muhlhausen +Muinonen +Muirhead +Mukai +Mukaitadashi +Mukhopadhyay +Mulhall +Mulisch +Mullo +Multatuli +Mumma +Munari +Munch +Munchhausen +Mundaca +Munday +Mundleria +Munguia +Munizbarreto +Munkanber +Munoz +Munteanu +Munyan +Muonio +Murakami +Muralidhar +Muramatsu +Muraoka +Muraviov +Murayama +Murchie +Murdoch +Murdochorne +Murgas +Muriel +Murikabushi +Murillo +Murmansk +Murom +Muroski +Muroto +Murray +Musa +Musamurahigashi +Musashino +Musashitomiyo +Musaus +Muschi +Muskau +Musschenbroek +Mussorgskia +Mustel +Mutchler +Mutsaers +Mutsumi +Muzzio +Mycerinos +Mychajliw +Myers +Myersdavis +Myougi +Myra +Myriostos +Myron +Myrrha +Myrtus +Myslbek +Myslivecek +NANTEN +NASA +NEAT +NOT +Naantali +Nabelek +Nabokov +Nabrown +Nachbaur +Nacogdoches +Nada +Nadeev +Nadezhda +Nadherna +Nadiavittor +Naef +Naegeli +Naema +Naerum +Naeve +Naftz +Nagahama +Nagai +Nagamori +Nagamoto +Naganuma +Nagaomasami +Nagasaki +Nagatayuji +Nagler +Nagoya +Nairc +Nakai +Nakamura +Nakanishi +Nakano +Nakanomakoto +Nakanoshima +Nakanotadao +Nakashima +Nakhimovskaya +Nakhodkin +Namaqua +Namarkarian +Namatjira +Namba +Namibia +Namiki +Namikoshi +Namur +Namuratakao +Nanavisitor +Nancita +Nancy +Nancy-Lorraine +Nancycarter +Nancychabot +Nancygreen +Nancymarie +Nancynoblitt +Nancyowen +Nancyruth +Nancyworden +Nancywright +Nandinisarma +Nanette +Naniwa +Nanjingdaxue +Nankichi +Nanking +Nankivell +Nanna +Nanon +Nansenia +Nansmith +Nantong +Nantucket +Nanwoodward +Nanyang +Nanyotenmondai +Nanyou +Nao +Naoko +Naomi +Naomipasachoff +Naoshigetani +Naotosato +Naoya +Naoyaimae +Naoyayano +Naozane +Napier +Napolitania +Nara +Narahara +Narbut +Narendra +Narmanskij +Narrenschiff +Naruke +Nash +Nasi +Nassau +Nassovia +Nasu +Nata +Nataliavella +Natalie +Nataliehale +Natascha +Natashaowen +Nathaniel +Nathues +Natori +Natrees +Natsoderblom +Natspasoc +Nauchnyj +Naudts +Nauheima +Nauplius +Nausikaa +Nautilus +Navajo +Navashin +Navinbrian +Nayana +Nayoro +Ndola +Ndolaprata +Nealgalt +Nealley +Nealwadhwa +Neander +Nebra +Nebraska +Nechvile +Neckar +Nedbal +Nedzel +Needham +Neely +Neese +Nefedov +Nefertiti +Neff +Neglinka +Negrelli +Nehalennia +Nei Monggol +Neilpeart +Neith +Nekrasov +Nele +Nellysachs +Nelsonia +Nemausa +Nemeghaire +Nemesis +Nemiro +Nemirovskij +Nemo +Nemsu +Nenetta +Nengshun +Neoptolemus +Nephele +Nephthys +Nepoti +Nepryadva +Nereus +Nerina +Nernst +Nerthus +Neruda +Nespoli +Nessus +Nesterov +Nestor +Nesvorny +Nettarufina +Nettimi +Netto +Neubauer +Neufang +Neugebauer +Neuhauser +Neujmina +Neukum +Neumann +Neumayer +Neunkirchen +Neuvo +Neuwirth +Neva +Nevanlinna +Neverland +Nevezice +Nevskij +Newburn +Newcombia +Newell +Newman +Newtonia +Neyachenko +Nezarka +Nezhdanova +Nguyen +Nguyen-McCarty +Ngwaikin +Nha +Nhannguyen +Niagara Falls +Nibutani +Niccolo +Nicholasrapp +Nichols +Nicholson +Nicjachowski +Nickaiser +Nickanthony +Nickel +Nickerson +Nickjames +Nickschneider +Nickthomas +Nicky +Nicobrenner +Nicolaia +Nicolapozio +Nicole +Nicolewen +Nicolini +Nicollier +Nicomachus +Nicovincenti +Niebuhr +Niedermeyer +Niehaisheng +Niels +Nielsabel +Nielsen +Niemela +Niemeyer +Niepce +Nietzsche +Nieuwenhuis +Nigel +Nigelreuel +Niger +Nigricollis +Nihon Uchu Forum +Nihondaira +Nihonsyoki +Niijima +Niilo +Niim +Niinoama +Nijhawan +Nijisseiki +Nijo +Nikdollezhal' +Nike +Nikhilas +Nikhilgupta +Nikhilshukla +Nikitamikhalkov +Nikitibotania +Nikitin +Nikko +Niklauswirth +Niknesterov +Nikol'skij +Nikolaev +Nikolaimedtner +Nikolajivanov +Nikolajvasil'ev +Nikolova +Nikonov +Nikulin +Nileshraval +Nilrem +Nilstamm +Nilus +Nina +Ninahuffman +Ningbo +Ningxia +Ningzhou +Ninian +Ninigi +Ninina +Nininger +Ninkasi +Ninnemann +Ninomanfredi +Nintanlena +Niobe +Nipponia +Nirajnathan +Nirenberg +Nireus +Nishashah +Nishi-koen +Nishiharima +Nishiinoue +Nishiizumi +Nishimoto +Nishimura +Nishimurajun +Nishio +Nishiyama +Nissaschmidt +Nissen +Nisyros +Nitardy +Nitra +Nittler +Niven +Niyodogawa +Niyomsatian +Nizami +Nizhnij Novgorod +Njord +Noailles +Nobel +Nobeoka +Nobeyama +Noblitt +Noboru +Nobuhisa +Nobuyuki +Noctua +Nocturna +Noel +Noelleoas +Noemi +Noether +Nofretete +Noguchi +Nohavica +Nojiri +Nolan +Nolanreis +Nolde +Nolli +Nomura +Nongoma +Nonie +Nonna +Noordung +Nora +Noragal' +Noraxu +Nord +Nordenmarkia +Nordenskiold +Nordlingen +Nordlund +Noreen +Norge +Norihiro +Norikura +Norizuki +Norma +Normannia +Normanrockwell +Normanwisdom +Norris +Northcott +Nortia +Norton +Norvell +Norwan +Nostalgia +Notburga +Noto +Notskas +Nouda +Nouet +Novalis +Nove Hrady +Novgorod +Novichkova +Novikov +Noviomagum +Novobranets +Novorossijsk +Novosibirsk +Novotna +Novotroitskoe +Noymer +Nozdrachev +Nriag +Nucciomula +Nuest +Nukariya +Nuki +Numa +Numaguti +Numazawa +Numerowia +Numidia +Nummela +Nunes +Nuredduna +Nurmela +Nurnberg +Nusamaibashi +Nusl +Nusslein-Volhard +Nuwa +Nyanza +Nyberg +Nycticorax +Nyctimene +Nye +Nymphe +Nyquist +Nyrola +Nysa +Nyukasayama +Nyx +O'Connell +O'Connor +O'Higgins +O'Keefe +O'Meara +O'Steen +OAFA +ODAS +OISCA +OLRAP +ORO +Oaxaca +Ob +Obaid +Obatomoyuki +Obelix +Oberammergau +Oberkochen +Obermair +Oberndorfer +Oberpfalz +Oberth +Obi +Obrant +Obraztsova +Obruchev +Obsfabra +Obu +Obukhova +Oburka +Ocasio-Cortez +Ocastron +Occhialini +Occidental +Oceana +Oceax +Ocenasek +Ochanomizu +Ochinero +Ockeghem +Ockels +Ocllo +Octavia +Oda +Odenwald +Odessa +Odin +Odishaw +Odorico +Odysseus +Oechsle +Oedicnemus +Oenanthe +Oenone +Oertli +Oetken +Ofeliaguilar +Offenbach +Offutt +Oflynn +Ogarev +Ogasawara +Ogatakoan +Ogawa +Ogawamachi +Ogden +Ogea +Ogilsbie +Ogilvie +Ogiria +Ogiwara +Ogunimachi +Ogyalla +Ohboke +Ohdohrikouen +Ohio +Ohkuma +Ohm +Ohmura +Ohnishi +Ohnishitaka +Ohno +Ohre +Ohsaki +Ohshimaosamu +Ohshimatake +Ohsugi +Ohta +Ohtaki +Ohtanihiroshi +Oikawa +Oileus +Oineus +Oishi +Oistrach +Oiunskij +Oizumi +Oja +Ojima +Oka +Okabayashi +Okada +Okadanoboru +Okamoto +Okamura +Okamuraosamu +Okasaki +Okavango +Okayama +Oken +Okhotsk +Okhotsymskij +Okiko +Oklahoma +Okuda +Okudzhava +Okugi +Okunev +Okuni +Okunokeno +Okushiri +Okutama +Okyrhoe +Okyudo +Olaheszter +Olathe +Olaus Magnus +Olausgutho +Olbersia +Old Joe +Oldfield +Ole Romer +Olea +Olegbykov +Olegefremov +Olegiya +Oleshko +Oleyuria +Olga +Olgagermani +Olieslagers +Olihainaut +Olinwilson +Oliver +Olivercabasa +Olivermorton +Olivia +Oliviahu +Oljato +Olmos +Olmstead +Olofsson +Olomouc +Olshaniya +Olson +Olympia +Olympiada +Omarkhayyam +Omodaka +Omogokei +Omsk +Ondaatje +Onderlicka +Ondrejov +Oneill +Onioshidashi +Onizaki +Onizuka +Onken +Onnetoh +Onnie +Onoda +Onodajunjiro +Onomichi +Onotomoko +Ontake +Oobayashiarata +Oodaigahara +Oohira +Ookuninushi +Oomine +Oongaq +Oort +Oosterhoff +Oozora +Opekushin +Ophelia +Opik +Oppavia +Oppenheimer +Oppolzer +Opportunity +Ops +Orangia +Oranienstein +Oranje-Nassau +Orchis +Orcus +Orelskaya +Orenbrecher +Orenburg +Oreshek +Oresme +Orestes +Orff +Oriani +Oribe +Oriola +Orlenok +Orlik +Orlov +Orma +Ornamenta +Ornicar +Ornskoldsvik +Orosei +Orosz +Orpheus +Orsilocus +Orth +Orthos +Ortigao +Ortigara +Ortrud +Ortutay +Oruki +Orvillewright +Orwell +Oryo +Osaka +Osaki +Osamu +Osawa +Osawatakaomi +Oscarwilde +Oshima +Oshu +Osip +Osipovia +Osipovyurij +Osiris +Osita +Oskar +Ossakajusto +Ossietzky +Ostanina +Ostankino +Ostapbender +Ostara +Ostend +Ostenia +Osterbrock +Ostersund +Ostozhenka +Ostralegus +Ostravia +Ostro +Ostrovskij +Ostwald +Oswaldthomas +Otakemayumi +Otani +Otaru +Otashi +Otauchunokai +Otava +Otawara +Otaynang +Oterma +Otero +Otila +Otokar +Otomo +Otonkucera +Ots +Ottegebe +Otthild +Ottilia +Ottmarsheim +Otto +Otto Schmidt +Otto Struve +Ottoburkard +Ottofranz +Ottohahn +Otukyo +Otzi +Oujianquan +Oukawamine +Oulu +Oumu +Ounas +Ourinhos +Ouro Preto +Outeniqua +Ouzan +Ovaitt +Oveges +Overbeek +Ovidius +Owa +Owens +Owensby +Oya +Oyatoshiyuki +Oye +Oze +Ozegahara +Ozeki +Ozenuma +Paavo Nurmi +Pacheco +Pachelbel +Paclements +Paczynski +Paddock +Padmanabhan +Padua +Paech +Paeonia +Pafuri +Paganetti +Paganini +Page +Pagels +Pagliarini +Pagnol +Paigerin +Paijanne +Paine +Painleva +Pajdusakova +Pajka +Pakhmutova +Pal'chikov +Pala +Palach +Palacky +Palala +Palamedes +Palaniappan +Palatia +Palazzolo +Palepu +Palermiti +Palermo +Pales +Palestrina +Palinurus +Palisana +Palitzsch +Pallas +Palma +Palmaria +Palmen +Palomaa +Paloque +Palorapavy +Paludicola +Palus +Palva +Palzer +Pamal +Pamela +Pamelasobey +Pamelatsai +Pamina +Pamjones +Pampaloni +Pan +Panacea +Pancaldi +Panchamia +Pancratz +Pandarus +Pandora +Pang +Panizon +Pankonin +Pannekoek +Pannonia +Panopaea +Pansecchi +Panthera +Panthoos +Panticapaeon +Panuzzo +Paola +Paolaferrari +Paolapaolini +Paolicchi +Paolofrisi +Paoloruffini +Paolotesi +Papacosmas +Papagena +Papaloizou +Papanov +Paperetti +Papike +Pappalardo +Pappos +Papymarcel +Paquet +Paquifrutos +Paracelsus +Paradise +Paradzhanov +Parana +Paranal +Paraskevopoulos +Parchomenko +Pardina +Parenago +Parfenov +Pariana +Parihar +Parijskij +Paris +Pariser +Parker +Parkinson +Parks +Parlakgul +Parler +Parmenides +Paronelli +Parsa +Parsec +Parsifal +Part +Parthenope +Partizanske +Partridge +Parvamenon +Parvati +Parvulesco +Parysatis +Pasacentennium +Pasachoff +Pasadena +Pasasymphonia +Pascal +Pascalepinner +Pascalscholl +Paschen +Paskvic +Pasricha +Passargea +Passau +Pasternak +Pasteur +Patashnick +Patcassen +Patersonewen +Pathak +Patientia +Patil +Patjohnson +Patmiller +Paton +Patria +Patrice +Patricia +Patriciann +Patrick Gene +Patrickchen +Patrickdufour +Patrickgeer +Patrickjones +Patrickmartin +Patrickmichel +Patricorbett +Patroclus +Patry +Patsayev +Patsy +Pattazhy +Patterson +Pattillo +Patwalker +Paul +Paul-Andre +Paula +Paulallen +Paulandrew +Paulcook +Pauldavies +Pauldelvaux +Paulflora +Paulgerhardt +Paulgordan +Paulharris +Paulina +Paulinehiga +Pauling +Pauljaniczek +Paulkling +Paulmyers +Paulpaino +Paulpellas +Paulroeder +Paulscherrer +Paulsydney +Pauluckas +Paulwarren +Pauly +Paulze +Paustovskij +Pauwels +Pavan +Pavarotti +Pavelaleksandrov +Pavelchvykov +Pavlica +Pavlov +Pawlowia +Pawona +Pax +Payette +Payne-Gaposchkin +Pazden +Peacock +Peaker +Peale +Peano +Pearce +Pearson +Pebronstein +Pechstein +Pecker +Peckova +Pecorelli +Pedersen +Pedrajo +Pedroduque +Peebles +Pegconnolly +Peggythomson +Peilisheng +Peiraios +Peiresc +Peirithoos +Peiroos +Peiser +Peitho +Peking +Pelagia +Pelcak +Pele +Peleus +Pelhrimov +Pelion +Pellegrini +Pellesvanslos +Pels +Peltan +Peltier +Pelzer +Pemba +Penco +Penderecki +Pendleton +Pendri +Peneleos +Penelope +Penghuanwu +Penkala +Pennell +Penney +Penninger +Penthesilea +Penza +Penzel +Pepawlowski +Pepibican +Pepita +Pepper +Pepping +Per Brahe +Peraga +Perdix +Perec +Peregrina +Perelman +Perepadin +Pergolesi +Periphas +Perkin +Perlmutter +Perolof +Perona +Perotto +Perovskaya +Perozzi +Perrenot +Perrett +Perrine +Perrotin +Perry +Perryman +Perryrose +Persephone +Perseverantia +Persson +Perth +Perth Amboy +Pertile +Peru +Peruindiana +Perun +Pervictoralex +Pesch +Peshekhonov +Pest +Pestafrantisek +Pestalozzi +Petach +Petaev +Petekirkland +Peter +Peterbluhm +Peterborden +Peterbrooks +Peterbroughton +Peterbrown +Peterburgtrista +Petercook +Peterhof +Petermrva +Peternorton +Peterpatricia +Peterpau +Petersmith +Peterson +Peterthomas +Peteschultz +Petesullivan +Petewilliams +Petiska +Petit +Petofi +Petra-Pepi +Petrarca +Petrbondy +Petrginz +Petrie +Petrina +Petrinpragensis +Petrjakes +Petronius +Petropolitana +Petrov +Petrovedomosti +Petrovic +Petrovskaya +Petrpetrov +Petrpravec +Petruskoning +Petsimpallas +Pettarin +Pettengill +Petunia +Petzval +Pevsner +Peyo +Pezinok +Pfaff +Pfau +Pfund +Phaedra +Phaeo +Phaethon +Phaetusa +Pharrams +Phegeus +Pheidippos +Phelps +Phemios +Phereclos +Phidias +Philagoria +Philbland +Phildavis +Phildeutsch +Philia +Philipdejager +Philipmocz +Philipmunoz +Philippa +Philippina +Philkeenan +Phillipadams +Philnicholson +Philnicolai +Philoctetes +Philomela +Philosophia +Philplait +Philveron +Phinney +Phocaea +Phoeberounds +Phoinix +Pholus +Photographica +Phryne +Phthia +Phyleus +Phyllis +Phystech +Pia +Piaf +Piani +Pianoro +Piazzia +Pic-du-Midi +Picander +Picasso +Piccolo +Picha +Picka +Pickard +Pickeringia +Pickhardt +Piedade +Pieksamaki +Pielinen +Piemonte +Pien +Pieri +Pieroangela +Pierostroppa +Pierralba +Pierre +Pierrehenry +Pierretta +Piestany +Pieters +Piethut +Pietkeyser +Pignata +Pignedoli +Pigott +Piironen +Pikelner +Pikovskaya +Pikulia +Pilachowski +Pilcher +Pilishvili +Pillinger +Pillmore +Pilyugin +Pimdouglas +Pina +Pinakibose +Pindarus +Pineda +Pinelli +Pinet +Pingouin +Pingre +Pinigin +Pink Floyd +Pinkham +Pinney +Pino Torinese +Pinocchio +Pinotti +Pinsky +Pinson +Pintar +Piotrovsky +Pippa +Pirandello +Pire +Pirogov +Pirola +Pisano +Pisarenko +Pisek +Pises +Piskunov +Piso +Pistoria +Piszkesteto +Piteglio +Pitman +Pitter +Pittich +Pittosporum +Pittsburghia +Pitz +Piyashiriyama +Pizarro +Pizzarello +Plachinda +Plancius +Planckia +Planman +Plantade +Plantin +Plaskett +Platanus +Plate +Plateau +Plato +Platonov +Platzeck +Plaut +Plavec +Plavsk +Plekhanov +Plescia +Plesetsk +Plevitskaya +Pleyel +Plinius +Plisetskaya +Plitchenko +Plotinos +Plotkin +Plovdiv +Plucker +Pluis +Plutarchos +Pluto +Plzen +Pobeda +Pocahontas +Pocatky +Pochaina +Podalirius +Podarkes +Podjavorinska +Podobed +Podosek +Poe +Poelchau +Poerink +Poesia +Pogrebetskij +Pogson +Pohjola +Pohl +Poincare +Poisson +Pokorny +Pokrovska +Pokryshkin +Polakis +Polana +Poldimeri +Polenov +Polepeddi +Polesny +Poleungkuk +Polina +Polingloh +Polino +Polit +Polites +Pollack +Pollath +Pollock +Polly +Polmear +Polonia +Polonskaya +Poltava +Polya +Polyakhova +Polybius +Polydoros +Polyhymnia +Polykletus +Polyneikes +Polynesia +Polypoites +Polytech +Polyxena +Polyxenos +Polyxo +Polzunov +Pomona +Pompeja +Poncelet +Pondicherry +Pongola +Ponomarev +Ponomarevalya +Ponrepo +Pons +Ponsen +Pontremoli +Pontryagin +Poor +Popastro +Popelin +Popov +Popovich +Poppelmann +Populus +Porco +Pordenone +Porec +Pori +Porphyro +Porrentruy +Porta Coeli +Porter +Porthan +Portlandia +Portugal +Portule +Porubcan +Porvoo +Porzana +Porzia +Poseidon +Posnania +Post +Postma +Postrema +Potanin +Potapov +Potemkin +Potentino +Pothier +Potomac +Potsdam +Pottasch +Potter +Poulanderson +Poulydamas +Pounds +Pourkaviani +Poutanen +Povalyaeva +Povenmire +Povolny +Powell +Poynting +Pozharskij +Prabakaran +Prachatice +Pradun +Praetorius +Praha +Prast +Pratincola +Prato +Pravdo +Praxedis +Praxiteles +Predappia +Preiss +Preller +Premt +Premysl +Prendergast +Presbrey +Presov +Presque Isle +Pressberger +Prestinenza +Preston +Prestonreeves +Pretoria +Preussen +Prevert +Prey +Preygel +Preziosa +Prialnik +Priamus +Pribina +Pribram +Prieska +Priestley +Prieurblanc +Prigogine +Prihoda +Prilepina +Prime +Primula +Princetonia +Principia +Prinz +Priscilla +Priscio +Priscus +Prishvin +Priska +Prisma +Prisymendoza +Pritchet +Pritsak +Probitas +Procol Harum +Prokhorov +Prokne +Prokof'ev +Prokofeana +Prokopovich +Prometheus +Pronik +Proserpina +Proskurin +Prosperin +Protea +Protesilaos +Prothoenor +Prothoon +Prothous +Protitch +Protogeneia +Protos +Proust +Prudentia +Prutkov +Prylis +Prymachenko +Prymno +Pryor +Pshenichka +Pskov +Psyche +Ptah +Ptolemaeus +Puccini +Puchnarova +Puckett +Puckler +Pugh +Pugnax +Pugovkin +Puijo +Pulcova +Pulido +Pullen +Pumma +Punahou +Punkaharju +Punkin +Puntel +Purcari +Purcell +Purgathofer +Purifoy +Purkyne +Purple Mountain +Purpurea +Pusateri +Pushkin +Puskas +Putignano +Putilin +Putnam +Puttachi +Putzi +Pyatigoriya +Pyatiletka +Pyatnitskij +Pygargus +Pyotr Pervyj +Pyramus +Pyrrha +Pyrrhus +Pythagoras +Pythia +Qiansanqiang +Qianxuesen +Qiaochuyuan +Qileihang +Qinghai +Quadea +Quadri +Quaide +Qualytemocrina +Quantz +Quanzhou +Quaoar +Quarenghi +Quebec +Queen's +Quercus +Querquedula +Quesnay +Queteleta +Quetzalcoatl +Quigley +Quincy +Quine +Quintenmatsijs +Quintilla +Quirk +Quirrenbach +Quito +Qumran +Quqinyue +Qwerty +Ra-Shalom +Raab +Raahe +Rabe +Rabeaton +Rabelais +Rabinowitz +Rachaelscott +Racharles +Rachele +Rachelmarie +Rachmaninoff +Rachnareddy +Racine +Racollier +Racquetball +Radaly +Radcliffe +Radebeul +Radegast +Radek +Radiocommunicata +Radishchev +Radmall +Radonezhskij +Radzievskij +Raes +Rafaelnadal +Rafaelta +Rafes +Raffaellosanti +Raffinetti +Rafita +Ragazza +Raghavan +Raghvendra +Rahaelgupta +Rahua +Raiatea +Raikin +Raimonda +Rainer +Rainerwieler +Raisanyo +Raissa +Rajdev +Rajivgupta +Rakhat +Rakos +Raksha +Rakuyou +Ralph +Ralpharvey +Ramachandran +Raman +Ramanlal +Ramanujan +Ramasesh +Ramaswami +Rambaldo +Rambhia +Ramboehm +Ramchandani +Rameau +Ramirez +Ramjeawan +Rammstein +Ramondiaz +Ramonycajal +Rampazzi +Rampo +Ramsden +Ramses +Ranald +Randa +Randi +Randiiwessen +Randoross +Randygroth +Randyray +Randyrose +Ranevskaya +Ranfagni +Ranjan +Ranke +Ransome +Rantaseppa +Raoulbehrend +Raphaela +Rapoport +Rara +Rarahu +Rasa +Rascana +Raschroder +Rastrelli +Ratai +Rathbun +Ratisbona +Ratliff +Ratte +Ratzinger +Rauch +Rauer +Rauma +Raumurthy +Raup +Rauracia +Rausal +Raushenbakh +Rausudake +Rauthgundis +Ravel +Rawat +Rawls +Rawson +Rayakazakova +Raybatson +Raybrown +Rayhe +Rayleigh +Rayman +Raymondavid +Raymundto +Raynal +Raywhite +Raywilson +Reasoner +Reaumur +Reaves +Rebeccachan +Rebeccajohns +Rebeccawatson +Rebeckaufman +Rebekka +Rebentrost +Recha +Recogne +Records +Reddish +Redman +Redqueen +Rees +Refugium +Reger +Regge +Regidufour +Regina +Reginaldglenice +Reginamiller +Reginhild +Reginita +Regiomontanus +Rehoboth +Reichardt +Reichenbach +Reichwein +Reid +Reighard +Reiji +Reiki +Reikotosa +Reiland +Reimers +Reims +Reincken +Reinerstoss +Reingard +Reinhardt +Reinhold +Reinholdbien +Reinmuthia +Reipurth +Reiss +Reitsema +Reiz +Reizoutoyoko +Rektorys +Rem +Remanzacco +Remarque +Rembaut +Rembrandt +Remek +Remigio +Remillieux +Remo +Remocorti +Remsberg +Remy +Renaldowebb +Renate +Renauxa +Rencin +Rendtel +Renemichelsen +Reneracine +Rengarajan +Reni +Rennes +Rennsteig +Renoir +Rentaro +Renzetti +Renzia +Rephiltim +Repin +Repsolda +Repunit +Requiem +Reseda +Reshetnev +Resi +Resnik +Respighi +Restitutum +Retopezzoli +Retsina +Rettig +Reunerta +Reuter +Revelle +Rey +Reyes +Reynek +Reynolds +Reynoso +Rezia +Rezvanian +Rhadamanthus +Rhaeticus +Rhamnus +Rhea +Rheinland +Rhesus +Rhianjones +Rhiannon +Rhines +Rhoads +Rhoda +Rhodesia +Rhodia +Rhodope +Rhon +Rhoneranger +Ricarda +Riccardi +Riccati +Ricci +Ricco +Riceia +Richard +Richardbaum +Richardcook +Richardcruz +Richardlarson +Richardlee +Richardlis +Richardregan +Richardromeo +Richardschwartz +Richardson +Richarnold +Richelen +Richilde +Richlawrence +Richlee +Richnelson +Richoffman +Richoliver +Richter +Richthammer +Rickblakley +Ricker +Rickfienberg +Rickgardner +Rickhusband +Rickline +Rickman +Rickschaffer +Ricmccutchen +Ricouxa +Ride +Ridley +Riehl +Riema +Riemann +Riemenschneider +Ries +Rietschel +Riga +Righi +Righini +Rigonistern +Riheijyaya +Rika +Rikhill +Rikurtz +Rikwouters +Rilke +Rimavska Sobota +Rimbaud +Rimito +Rimskij-Korsakov +Rinaketty +Rinako +Rinckart +Ringuelet +Rinner +Rio de Janeiro +Rionuevo +Rios +Rip +Riparia +Ripero +Risehvezd +Rishinbehl +Risoldi +Ristenpart +Ristiina +Rita +Ritabo +Ritageorge +Ritaschulz +Ritina +Ritter +Riverside +Riviera +Rivkin +Roachapproach +Robbennett +Robbia +Robbiesh +Robbynaish +Robcastillo +Robcrawford +Robel +Robelmonte +Robenzing +Roberbauxa +Robersomma +Roberta +Robertball +Robertbloch +Robertcox +Roberteunice +Robertfranz +Robertfrazer +Roberthargraves +Robertmayer +Robertmiller +Robertmoore +Robertobacci +Robertocarlos +Robertohaver +Robertovittori +Robertpaul +Robertpepin +Roberts +Robeson +Robheinlein +Robinhood +Robinson +Robinvaughan +Robinwilliams +Robkoldewey +Robleonard +Robmanning +Robmatson +Robmedrano +Robminehart +Roborosa +Robot +Robschum +Robson +Roburnham +Robutel +Robwhiteley +Robwilliams +Robyn +Roche +Rochefort +Rocher +Rockchic +Rockefellia +Rockholt +Rocknroll +Rockwell Kent +Rodari +Roddenberry +Roddy +Roderick +Rodin +Rodionta +Rodita +Rodnyanskaya +Rodrick +Rodriguez +Roehla +Roemera +Roentgen +Roerich +Roero +Rogerbacon +Rogerbourke +Rogerburns +Rogerbyrd +Rogeria +Rogerpeeters +Rogers +Rogerssmith +Rohatgi +Rohenderson +Rohitkamat +Rohloff +Rohret +Roig +Roka +Rokoske +Rolandmeier +Rolcik +Rolfriekher +Rollandia +Rolling Stones +Roma +Romagnani +Roman +Romanenko +Romaneskue +Romanoserra +Romanozen +Romanskaya +Romaplanetario +Romilda +Romulus +Ron Helin +Ronaldhsu +Ronaldsayer +Ronan +Rone +Ronmiller +Ronneuman +Ronsard +Ronsawyer +Ronstone +Rontaylor +Roquebrune +Roques +Rosa +Rosahemphill +Rosalia +Rosalinde +Rosamunde +Rosario +Rosavestal +Rosegger +Rosema +Rosemary +Rosenauer +Rosenbauer +Rosenbergerezek +Rosenbush +Rosengard +Rosenkavalier +Rosenstein +Rosenthal +Rosenzweig +Roser +Rosfranklin +Roshchina +Rosina +Rosing +Rosner +Rosniblett +Rosoff +Rosscoleman +Rosseland +Rosselia +Rosseven +Rossi +Rossini +Rossirosina +Rosstaylor +Rostia +Rostovdon +Rostropovich +Roswitha +Rosymccloskey +Rotanner +Rotarysusa +Rote Kapelle +Roth +Rothenberg +Rotraut +Rottman-Yang +Rottmann +Rou +Roucarie +Roudebush +Rountree +Rousseau +Rovaniemi +Roversimonaco +Rowan +Rowanatkinson +Rowberry +Rowland +Rowling +Roxane +Roy +Roybishop +Royclarke +Royer +Roygross +Roytraver +Rozenblyum +Rozgaj +Rozhdestvenskij +Rozhen +Rozhkovskij +Rozov +Ruanda +Rubbia +Rubendario +Rubens +Rubetra +Rubezahl +Rubicon +Rubin +Rublyov +Rubtsov +Ruby +Rubyroe +Ruckers +Rudaux +Rudbelia +Rudigerkollar +Rudneva +Rudolf +Rudolfinum +Rudolfsteiner +Rudominkowski +Rudra +Rudruna +Ruff +Ruficollis +Rufino +Rugen +Ruggieri +Ruhmann +Ruhmkorff +Ruianzhongxue +Ruikou +Ruima +Ruiwang +Rukl +Rumery +Rumoi +Rumpelstilz +Rumsey +Rumyantsev +Runcorn +Rundetaarn +Runge +Runk +Runrun Shaw +Ruperto-Carola +Rupertwildt +Ruppina +Ruriko +Ruscannon +Rusheva +Rusin +Rusjan +Ruslanova +Russell +Russellbabb +Russellburrows +Russellmark +Russia +Russrobb +Rusthawelia +Rustichelli +Rusty +Ruta +Rutberg +Rutenberg +Rutger +Ruth +Ruth Wolfe +Ruthaellis +Ruthanna +Rutherfordia +Rutllant +Ruvuma +Ruzena +Ryabov +Ryan +Ryanharrison +Ryanlee +Ryanolson +Ryanwisnoski +Ryazanov +Ryba +Rybalka +Rydberg +Rykerwatts +Rykhlova +Ryojiro +Ryokami +Ryokan +Ryoma +Ryomichico +Ryozo +Rypatterson +Ryugado +Ryugatake +Ryuichiro +Ryzhov +SAF +SIMBAD +SLAS +SNO +SURF +Saale +Saaremaa +Saarland +Sabadell +Sabauda +Sabena +Sabine +Sabinin +Sabrina +Sabrina-John +Sacajawea +Sachiko +Sachs +Sachsen +Sackler +Sadakane +Sadako +Sadanori +Saddlemyer +Sadegh +Sadeya +Sado +Sadovnichij +Sadowski +Safara +Safarik +Safi +Safronov +Saga +Sagamihara +Sagan +Sagarmehta +Sagot +Sahade +Saheki +Sahlia +Saigusa +Saijo +Saijokeiichi +Saimaa +Saint Michel +Saint-Aignan +Saint-Exupery +Saint-Marys +Saint-Saens +Saitama +Saito +Saji +Sajigawasuiseki +Sakabe +Sakaetamura +Sakaguchi +Sakaihoikuen +Sakaino +Sakamoto +Sakanoue +Sakanouenokumo +Sakenova +Sakharov +Sakiko +Sakitama +Sakka +Sakuma +Sakuntala +Sakurai +Sakurajima +Sakuranosyou +Salamony +Salanave +Salavat +Salazar +Saldanha +Saletore +Salgari +Salimbeni +Salix +Salli +Salmon +Salome +Salonta +Salopia +Salpeter +Salpetriere +Saltis +Saltykov +Salvadorsanchez +Salvia +Salvo +Salzburg +Samaan +Samabates +Samadhi +Samagonzalez +Samantha +Samara +Samarasinha +Samaschneid +Sambre +Sameergupta +Samirsur +Samitchell +Samkova +Samo +Samoilov +Sampo +Samra +Samsagan +Samthurman +Samuele +Samuelhowell +Samus' +Samwestfall +San Diego +San Jose +San Juan +San Marcello +San Martin +San Pedro +Sanchez +Sandage +Sanders +Sandler +Sandra +Sandraderosa +Sandrine +Sandro +Sanduleak +Sandvicensis +Sandyryan +Sanenobufukui +Sanford +Sangerhausen +Sanguin +Sankt-Stephan +Sannaimura +Sanner +Sano +Sanpoloamosciano +Sansaturio +Sanshui +Sansyu-Asuke +Santa +Santagata +Santana +Santaro +Santhikodali +Santiago +Santini +Santini-Aichl +Santoka +Santomurakami +Santorini +Sanvito +Saotome +Sapientia +Sappho +Sapphozoe +Sapporo +Sara +Sarabhai +Saraburger +Saraclark +Saragamine +Sarahbates +Sarahbounds +Sarahgerin +Sarahgutman +Sarahill +Sarahmarzen +Sarahmousa +Sarahocken +Sarahpierz +Sarahrapo +Sarakirsch +Saramagrin +Sarapul +Sararussell +Sarastro +Sarema +Sargent +Sariancel +Saris +Sarita +Sarkisov +Sarmiento +Saroma +Saroun +Sarov +Sarpedon +Sarton +Sartre +Sarutahiko +Sasagamine +Sasaki +Sasandford +Sasha +Sashakrot +Saskia +Sassi +Satake +Satchmo +Sather +Satie +Satinsky +Sato-Norio +Satomimura +Satoru +Satoshi +Satoshimiki +Satotoshio +Satpaev +Sats +Satterwhite +Sattler +Saucier +Sauer +Sauerbruch +Sauerland +Saunders +Saurodonati +Sauval +Savage +Savalle +Savanov +Saville +Savinykh +Savitskij +Savo +Savonlinna +Sawa +Sawaishujiro +Sawamura +Sawilliams +Sawyer Hogg +Sax +Sayama +Sayany +Sayers +Saylor +Sayo +Sazava +Scabiosa +Scagell +Scaltriti +Scania +Scanlon +Scardia +Scarfe +Scarlatti +Schaber +Schadow +Schaefer +Schaifers +Schalen +Schalkenmehren +Schamp +Schatzman +Schaumasse +Schawlow +Schedios +Scheeres +Scheffler +Scheherezade +Scheidt +Scheila +Schelling +Scherer +Schiaparelli +Schickler +Schieferdecker +Schiele +Schiff +Schikowski +Schiller +Schilowa +Schilt +Schimenti +Schindler +Schinkel +Schirra +Schlaun +Schlecht +Schlegel +Schleicher +Schleiden +Schleiermacher +Schlesinger +Schleswig +Schliemann +Schlingheyde +Schloerb +Schlottmann +Schluter +Schlutia +Schmadel +Schmeidler +Schmidgall +Schmidt +Schmiedmayer +Schmoll +Schneider +Schneller +Schnitger +Schnittke +Schober +Schoch +Schoenberg +Schoenmaker +Schoenobaenus +Scholl +Schommer +Schonbein +Schonfeld +Schoninger +Schoof +Schopenhauer +Schorria +Schott +Schouten +Schrade +Schrodinger +Schroeder +Schroeteria +Schroter +Schrutka +Schubart +Schulhof +Schulman +Schulz +Schumacher +Schumann +Schumi +Schupmann +Schurer +Schuster +Schutz +Schuyler +Schwaar +Schwaben +Schwabhausen +Schwall +Schwambraniya +Schwank +Schwartz +Schwarzschilda +Schwarzwald +Schwassmannia +Schwehm +Schweikarda +Schweitzer +Schwekendiek +Schwob +Sciam +Sciannameo +Sciascia +Scientia +Sciurus +Scobee +Scobuchanan +Scoon +Scorzelli +Scott +Scottbirney +Scotti +Scottmccord +Scottmichael +Scottroberts +Scottsheppard +Scottsmith +Scottstuart +Scottyoung +Scottyu +Scylla +Scythia +Seaborg +Sean +Seanconnery +Seanokeefe +Seanraj +Seanwahl +Searfoss +Sears +Sebastiana +Secchi +Sechenov +Secinaro +Secombe +Sedna +Sedov +Sedransk +Seeberg +Seehaus +Seeligeria +Seelos +Segal +Segenthau +Seggewiss +Segner +Segorbe +Segoves +Segovia +Segre +Sehnal +Seidelmann +Seifert +Seiichisato +Seijin-Sanso +Seilandfarm +Seili +Seillier +Seimei +Seinajoki +Seira +Seishika +Seishitakeuchi +Seitter +Seitz +Seiwa +Seiyauyeda +Sejna +Sejong +Sekanina +Sekhmet +Sekhsaria +Seki +Sekihokutouge +Sekine +Sekitakakazu +Sekora +Sel'vinskij +Selene +Seleucus +Selinur +Sellers +Sellin +Selqet +Selwyn +Semafor +Semashko +Semele +Semenchur +Semenkovich +Semenov +Seminozhenko +Semiramis +Semirot +Semmelweis +Semper +Semphyra +Senator +Sendai +Seneca +Seneferu +Senftenberg +Senigalliesi +Senjikan +Senkevich +Senna +Senrikyu +Senta +Senthalir +Sephton +Sepkoski +Seppina +Sequoia +Serafinozani +Seraphina +Serasin +Serendip +Serganov +Sergebaudo +Sergeev-Censkij +Sergej +Sergerasimov +Sergestus +Sergiolozano +Sergivanov +Serio +Serkowski +Serov +Serpieri +Serra +Sersic +Servet +Servius +Seryozha +Sesostris +Sessai +Sessyu +Sethanne +Sethmurray +Sethos +Setouchi +Setsuko +Sette +Setvak +Seurat +Sevastopol +Severi +Severina +Severny +Severochoa +Sevnatu +Sevre +Sewanee +Sewell +Seydler +Sezimovo Usti +Sfasu +Sfranke +Sgarbini +Shaanxi +Shabas +Shadfan +Shaftesbury +Shaim +Shair +Shajna +Shakespeare +Shakhovskoj +Shaklan +Shakura +Shalamov +Shalilabaena +Shanawolff +Shandong +Shandongdaxue +Shane +Shanegould +Shanghai +Shanhuang +Shankar +Shannon +Shannonbabb +Shantanugaur +Shantou +Shao +Shapiro +Shapleya +Shaposhnikov +Sharaf +Sharanya +Sharidake +Sharkov +Sharon +Sharonov +Sharp +Sharples +Shashlov +Shavarsh +Shawna +Shayestorm +Shchedrin +Shcheglov +Shcherbakovia +Shcherban' +Shearer +Sheba +Shedletsky +Sheehan +Sheena +Sheenahayes +Sheikh +Sheilawolfman +Shekhtelia +Sheldonmarks +Shelly +Shellyhynes +Shelton +Shelus +Shemp +Shen Guo +Shenzhen +Shenzhou +Shepherd +Sheragul +Sheridanlamp +Sherlock +Sherman +Shermanschultz +Sherrigerten +Sherrod +Sherwoodrowland +Shestaka +Shevchenko +Shibakoukan +Shibata +Shibayasuo +Shibecha +Shibuya +Shifutsu +Shigefumi +Shigehisa +Shigei +Shigekimurakami +Shigemasa +Shigemi +Shigemori +Shigeno +Shigeru +Shijimi +Shikanosima +Shiki +Shikoku +Shikokutenkyo +Shilov +Shimada +Shimanamikaido +Shimanto +Shimizu +Shimizumasahiro +Shimomoto +Shimose +Shimoyama +Shinagawa +Shindo +Shinkawakami +Shinkenwada +Shinkoyama +Shinonaga +Shinsaku +Shinseiko +Shinsengumi +Shiomidake +Shiota +Shipka +Shirakawa +Shirao +Shirase +Shireendhir +Shiretoko +Shirley +Shirleymarinus +Shirvindt +Shishkin +Shivanisud +Shiwaku +Shizu-Mao +Shizukagozen +Shizutani-Kou +Shklovskij +Shkodrov +Shkuratov +Shmakova +Shnollia +Shoemaker +Shoin +Shojikato +Shoko +Shokoyukako +Sholokhov +Shor +Shorland +Shosasaki +Shoshanatell +Shostakovich +Shotaro +Shotwell +Shouichi +Shoumen +Showa +Showashinzan +Shoyo +Shozosato +Shpak +Shravanimikk +Shridhar +Shrylmiles +Shtokolov +Shuji +Shukla +Shukshin +Shul'zhenko +Shulnazaria +Shumarinaiko +Shunda +Shunkai +Shunsuke +Shura +Shuryanka +Shustov +Shuttleworth +Shuvalov +Shuwan +Shuya +Sibatahosimi +Sibelius +Siberia +Sibylla +Sicardy +Sichuan +Sicilia +Sicoli +Sidi +Siding Spring +Sidneywolff +Sidonia +Sidorova +Sidorovsky +Sidwell +Siebohme +Siebold +Siedentopf +Siegbahn +Siegena +Siegfried +Siegma +Siegwarth +Sierra +Sif +Sigeki +Sigelinde +Sigenori +Sigmund +Sigmundjahn +Signac +Signe +Sigrid +Sigune +Sigurd +Sigyn +Sijthoff +Sikorsky +Silbermann +Silcher +Silentium +Silesia +Siljan +Silke +Sillanpaa +Sillis +Silly +Silva Nortica +Silvain +Silver +Silvialonso +Silvo +Silvretta +Simaqian +Simbirsk +Simcmillan +Simeisa +Simek +Simferopol +Simmons +Simoeisios +Simohiro +Simon-Garfunkel +Simona +Simonek +Simonelli +Simonemarchi +Simonenko +Simonetta +Simongreen +Simonida +Simonov +Simonsen +Simpkins +Simpson +Sims +Sinachopoulos +Sinatra +Sinay +Sinchanban +Sindbad +Sindel +Sinden +Singhal +Sinha +Sinkevich +Sinnott +Sinon +Sinton +Sinuhe +Sinyavskaya +Sinzi +Sinzot +Siperstein +Sipiera +Siran +Sirataka +Siratakayama +Sirene +Siri +Sirichelson +Siriwon +Sirona +Sirrah +Sisichen +Sisigambis +Sisiliang +Sisley +Sissons +Sisyphus +Sita +Sitarski +Sitensky +Siva +Siwa +Sixtygarden +Siyaxuza +Siyuanliu +Siyueguo +Sjolander +Skadiang +Skalnate Pleso +Skarupa +Skepticus +Skiff +Skinner +Skip +Skoglov +Skorina +Skovoroda +Skrabal +Skripnichenko +Skryabin +Skuld +Skurat +Skvorecky +Skvortsov +Skytel +Slade +Sladkovic +Slaven +Slavia +Slavicky +Slavka +Slavonice +Slavov +Slettebak +Slipher +Slivan +Sloop +Slotin +Slouka +Slovakia +Slovenija +Slovtsov +Smaklosa +Smale +Smalley +Smetana +Smilevskia +Smiley +Smirnova +Smith +Smither +Smithsonian +Smoktunovskij +Smolders +Smolensk +Smoluchowski +Smuts +Smyslov +Snell +Snelling +Sniadeckia +Snowdonia +Snyder +Sobers +Sobey +Sobinov +Sobolev +Sobotiste +Sodankyla +Soderblom +Soejima +Sofala +Sofievka +Sofiyavarzar +Sofue +Sohlman +Sokolov +Sokolsky +Sokrates +Solc +Soldan +Solf +Solidarity +Sollenberger +Solnhofen +Solokhin +Solomin +Solon +Solov'yanenko +Solovaya +Solovjev-Sedoj +Solovjova +Solti +Solvay +Solvejg +Solzhenitsyn +Soma +Somalia +Somanah +Sombart +Somekawa +Somerville +Sommerfeld +Somnium +Somov +Somville +Sonet +Songyuan +Soniaterk +Sonisenia +Sonja +Sonneberga +Sonnenborgh +Sonodamasaki +Soomana +Sooner +Sootan +Sootiyo +Sophia +Sophiecai +Sophocles +Sophrosyne +Sor +Sorachi +Sorada +Soren +Sorga +Sorin +Sorm +Sormano +Soroban +Soromundi +Soros +Sostero +Sosva +Souchay +Soulie +Souseki +Souten +South Dakota +Sova +Soyuz-Apollo +Spacewatch +Spadolini +Spahr +Spallanzani +Sparks +Sparrman +Spartacus +Spassky +Speckman +Spector +Spegorlarson +Spejbl +Spellmann +Spencer +Spencer Jones +Spessart +Sphinx +Spicer +Spiegel +Spielberg +Spilliaert +Spinoy +Spinoza +Spinrad +Spiraea +Spiridonia +Spirit +Spitzer +Spitzweg +Spivakov +Spoelhof +Sposetti +Sprattia +Sprigg +Springsteen +Sprowls +Spudis +Spurny +Sputnik +Squyres +Srbija +Sriner +Srinivasan +Srivastava +St. Veran +Stacey +Staceyraw +Stackpole +Staehle +Stahl +Stainbrook +Stalingrad +Stalle +Stallman +Stamitz +Stampfer +Stana +Stanchiang +Standing Bear +Standish +Stanga +Stanislav +Stankonyukhov +Stanley +Stanshapiro +Stansill +Stanthorpe +Starchik +Stargazer +Stark +Starkenburg +Starodub +Starr +Starrfield +Startek +Stashis +Stasik +Stateira +Stattmayer +Staudt +Stauffenberg +Stavropolis +Stearns +Stebbins +Stebrehmer +Steed +Steel +Stefanheutz +Stefani +Stefanmuller +Stefanovalentini +Stefanozafka +Stefanzweig +Steffl +Stefuller +Stegosaurus +Steiermark +Steigmeyer +Steina +Steinberg +Steinheil +Steinheim +Steinmetz +Steins +Stekramer +Stelguerrero +Stellafane +Stellaris +Steller +Stelzhamer +Stenflo +Stenhammar +Stenholm +Stenkyrka +Stenmark +Stentor +Stepanian +Stepanmakarov +Stepanov +Stepciechan +Stephania +Stephaniehass +Stephbecca +Stephengould +Stephenhonan +Stephenmaran +Stephenshulz +Stephensmith +Stephenstrauss +Stephicks +Stephwerner +Stepling +Stereoskopia +Sterken +Stern +Sternberga +Sterner +Sterpin +Steshenko +Stesullivan +Stevebabcock +Stevebaker +Stevedberg +Stevedodson +Stevegauthier +Stevelia +Stevenbyrnes +Stevencondie +Stevendodds +Stevengordon +Stevenlee +Stevens +Stevensimpson +Stevenson +Stevenzeiher +Steverin +Steverumsey +Stevesynnott +Stevin +Steward +Steyaert +Sthenelos +Stiavnica +Stieltjes +Stifter +Still +Stimson +Stirling +Stjerneborg +Stobbe +Stockholm +Stodola +Stoffler +Stohl +Stokes +Stolte +Stolzova +Stonarov +Stone +Stonehenge +Stony Ridge +Stoops +Storeria +Storm +Storrs +Stoss +Stout +Stovall +Stowers +Strabo +Strackea +Straczynski +Stradivari +Stradonice +Strahlenberg +Straizys +Strakonice +Strand +Strasbourg +Strassmann +Strattonia +Straub +Strauss +Stravinsky +Strazzulla +Streator +Street +Streich +Strekov +Stremchovi +Strenua +Streuvels +Strindberg +Strittmatter +Strnad +Strobel +Stroganov +Strogen +Strom +Stromboli +Stromgrenia +Stromholm +Stromvil +Stroncone +Strong +Stroobantia +Stropek +Strouhal +Strube +Struchkova +Strugatskia +Struveana +Stuart +Stubbs +Stuber +Stucky +Studnicka +Stull +Stulpner +Stumegan +Stumpff +Stunzi +Stur +Sturm +Stuwe +Stverak +Sualan +Suarez +Subamara +Subashiri +Subbotina +Subinmin +Subirachs +Subramanian +Succi +Suchan +Sudbury +Sudek +Sudo +Sudongpo +Suesong +Suess +Suevia +Sugano +Sugawa +Suggs +Sugie +Sugihara +Sugiyama +Suhanli +Suiqizhong +Suiseki +Sujaytyle +Sukagawa +Sukunabikona +Sulamitis +Suleika +Sullivan +Sulzer +Sumatijain +Sumaura +Sumava +Sumeria +Sumerkin +Sumiana +Sumida +Sumiko +Suminao +Suminov +Sumizihara +Summa +Summerfield +Summerscience +Sumoto +Suncar +Sundmania +Sundre +Sundsvall +Sunflower +Sunkel +Sunshine +Sunyaev +Suomi +Supasternak +Superbus +Supokaivanich +Surgut +Surikov +Surkov +Suruga +Susa +Susanjohnson +Susanlederer +Susanna +Susannemond +Susanoo +Susanragan +Susanreed +Susanring +Susanruder +Susansmith +Susanstoker +Susanvictoria +Susi +Susieclary +Susiestevens +Susil +Susilva +Susono +Sussenbach +Sussman +Susumu +Susumuimoto +Sutoku +Sutton +Suvanto +Suvorov +Suwanasri +Suyumbika +Suzamur +Suzhou +Suzhousanzhong +Suzuki +Suzukiseiji +Suzuko +Suzyamamoto +Svanberg +Svanetia +Svarna +Svatopluk +Svea +Svecica +Svejcar +Svejk +Svenders +Sverige +Svestka +Sveta +Svetlanov +Svetlov +Svirelia +Sviridov +Svoboda +Svojsik +Svoren +Svyatorichter +Svyatylivka +Svyaztie +Swain +Swann +Swanson +Swasey +Swedenborg +Sweelinck +Sweeney +Sweet +Sweitzer +Swetlana +Swift +Swindle +Swings +Swissair +Swope +Sy +Syang +Sybil +Sychamberlin +Sydney +Sykes +Sylvania +Sylvatica +Sylvester +Sylvia +Sylviecoyaud +Symmetria +Syoyou +Syringa +Syrinx +Syuji +Syukumeguri +Szechenyi +Szeged +Szeidl +Szentmartoni +Szilard +Szmytowna +Szpilman +Szukalski +TARDIS +TRIUMF +Tabei +Tabeisshi +Table Mountain +Tabora +Taborsko +Tacchini +Tachibana +Tachikawa +Tacitus +Taco +Tadamori +Tadjikistan +Taeve +Taga +Tagaharue +Tagore +Taguacipa +Taguchi +Tahiti +Taichikato +Taihaku +Taiko +Tainai +Tairov +Taiwan +Taiyonoto +Taiyuan +Taizaburo +Taize +Taizomuta +Tajimi +Takabatake +Takachiho +Takagi +Takagitakeo +Takahashi +Takahata +Takaji +Takakura +Takamagahara +Takamatsuda +Takamizawa +Takane +Takanochoei +Takanotoshi +Takao +Takaoakihiro +Takarajima +Takase +Takashimizuno +Takatahiro +Takatsuguyoshida +Takatsuki +Takayamada +Takayanagi +Takayuki +Takeda +Takei +Takeishi +Takenouchi +Takeshima +Takeshisato +Takeuchiyukou +Takeyama +Takeyamamoto +Takiguchi +Takihiroi +Takimoto +Takimotokoso +Takinemachi +Takoyaki +Taku +Takuboku +Takuma +Takumadan +Takumi +Takushi +Takuya +Talbot +Talent +Talich +Talima +Tallinn +Talos +Talthybius +Tama +Tamaga +Tamagawa +Tamakasuga +Tamao +Tamara +Tamarakate +Tamariwa +Tamashima +Tamblyn +Tambov +Tamines +Tammann +Tammy +Tammydickinson +Tammytam +Tamotsu +Tampere +Tamriko +Tamsendrew +Tamyeunleung +Tana +Tanabe +Tanais +Tanaka +Tanakadate +Tanakami +Tanakawataru +Tanchozuru +Tanchunghee +Tancredi +Tanegashima +Tanemahuta +Tanete +Tanga +Tangshan +Tanigawadake +Taniguchi +Tanikawa +Tanina +Tanith +Tanjiazhen +Tanner +Tantalus +Tanuki +Tanya +Tanzi +Taormina +Tapio +Tapolca +Tara +Taranis +Taratuta +Tarendo +Tarka +Tarkovskij +Taro +Taroubou +Tarrega +Tarroni +Tarry +Tarsila +Tarski +Tartakahashi +Tarter +Tartois +Tartu +Tarumi +Tarxien +Tasaka +Tashikuergan +Tasman +Tassantal +Tasso +Tata +Tataria +Tatarinov +Tatebayashi +Tateshina +Tati +Tatianicheva +Tatianina +Tatishchev +Tatjana +Tatry +Tatsuo +Tatulian +Tatum +Tauntonia +Taunus +Taurinensis +Tauris +Tautenburg +Tautvaisiene +Tavastia +Tawadros +Taylor +Taylorjones +Tazieff +Tchaikovsky +Tchantches +Tea +Tealeoni +Tebbutt +Teckman +Tecleveland +Tedbunch +Teddunham +Tedesco +Tedflint +Tedkooser +Tegler +Teharonhiawako +Teika +Tejima +Tekaridake +Tekmessa +Telamon +Telc +Telegramia +Telemachus +Telemann +Telephus +Telesio +Tell +Teller +Tellervo +Telramund +Temirkanov +Tempel +Templehe +Tenagra +Tenchi +Teneriffa +Tengstrom +Tengukogen +Tenmu +Tennyo +Tenojoki +Tenpyou +Tensho-kan +Tentaikojo +Tenzing +Tenzinyama +Teodorescu +Teply +Terakado +Terakawa +Terao +Terasako +Terbruggen +Terbunkley +Tercidina +Terebizh +Terentia +Teresa +Teresajentz +Teresaswiger +Tergeste +Terikdaly +Terkan +Terlingen +Termain +Terni +Terpsichore +Terradas +Terrell +Terresadodge +Terry +Terrycole +Terryfarrell +Terrygilliam +Terryjones +Terryschmidt +Terumikazumi +Teruo +Tesinsko +Tesla +Testa +Teta +Tetrix +Tetruashvily +Tetsufuse +Tetsujiyamada +Tetsumasakamoto +Tetsuokojima +Tetsuya +Teucer +Teutoburgerwald +Teutonia +Tevelde +Tewksbury +Texas +Texereau +Texstapa +Textorisova +Tezcatlipoca +Tezuka +Thagnesland +Thais +Thakur +Thales +Thalia +Thalpius +Thangada +The +The NORC +Thebault +Theberge +Thekla +Thelmaruby +Thelonious +Themis +Theobalda +Theodora +Theojones +Theoklymenos +Theotes +Therberens +Thereluzia +Theresaoei +Theresia +Thereus +Thernoe +Thersander +Thersilochos +Thersites +Thessalia +Thessandrus +Thetis +Thewrewk +Thia +Thiagoolson +Thicksten +Thiele +Thielemann +Thionville +Thirsk +Thisbe +Thoas +Tholen +Thoma +Thomana +Thomas +Thomas Aquinas +Thomasjohnson +Thomaslynch +Thomasmuller +Thomayer +Thomgregory +Thomjansen +Thomsen +Thooft +Thora +Thoreau +Thorenia +Thorvaldsen +Thottumkara +Thouvay +Thraen +Thrasymedes +Thucydides +Thuillot +Thule +Thulin +Thumper +Thunberg +Thuringer Wald +Thuringia +Thurmann +Thusnelda +Thyestes +Thygesen +Thymoitos +Thyra +Tiamorrison +Tianhuili +Tianjin +Tianyahaijiao +Tiburcio +Ticha +Ticino +Tickell +Tieck +Tienchanglin +Tiepolo +Tieproject +Tietjen +Tiffanyko +Tiffanylin +Tiffanyswann +Tiflis +Tigerlily +Tigris +Tikhonov +Tikhov +Tilgner +Tilia +Tillandz +Tillmannmohr +Tillysmith +Timandra +Timchuk +Timdong +Timerskine +Timherder +Timhunter +Timiryazev +Timjull +Timossi +Timothychang +Timresovia +Timwarner +Tina +Tinagal +Tinaliu +Tinbergen +Tinchen +Tinette +Tingstade +Tinkaping +Tinker +Tintoretto +Tipografiyanauka +Tippett +Tirela +Tirion +Tirol +Tirza +Tischendorf +Tisiphone +Tisserand +Tisza +Titania +Tithonus +Titicaca +Titius +Tito +Titulaer +Titurel +Tiziano +Tjeerd +Tjilaki +Tjossem +Tlepolemos +Tmutarakania +Toaldo +Toastmasters +Toatenmongakkai +Tobata +Tobiaswolf +Tobolsk +Toda +Toddblumberg +Toepperwein +Togashi +Tognelli +Tokai +Tokara +Tokeidai +Tokigawa +Tokikonaruko +Tokio +Tokitada +Tokiwagozen +Tokunaga +Tokunai +Tokushima +Tokyogiants +Toland +Toldy +Tolerantia +Tolkien +Tololo +Tolosa +Tolstikov +Tomahrens +Tomatic +Tombaugh +Tombecka +Tombickler +Tomburns +Tomcarr +Tomcave +Tomcowling +Tomeileen +Tomeko +Tomhanks +Tomioka +Tomita +Tomizo +Tomjones +Tomkaye +Tomlindstom +Tomlinson +Tommaso +Tommorgan +Tommygrav +Tomoegozen +Tomohiro +Tomohisa +Tomonaga +Tomsk +Tomswift +Tomvandijk +Tomyris +Tone +Tonegawa +Tongil +Tongkexue +Tongling +Toni +Tonimoore +Tonivanov +Toniwest +Tonucci +Tonyhoffman +Tonyspear +Tooting +Topeka +Torahiko +Toravere +Tornio +Toro +Torode +Toronto +Torquata +Torquilla +Torrence +Torresduarte +Torricelli +Tortali +Torun +Torvalds +Tosa +Tosamakoto +Toscanos +Toshie +Toshifukushima +Toshihanda +Toshiharu +Toshihiko +Toshimayeda +Toshiohino +Toshitanaka +Toshitsumita +Tosimatumoto +Tosiyasu +Tost +Totanus +Totoro +Tottori +Totziens +Toulouse-Lautrec +Tournefort +Toussaint +Toutatis +Toutoumi +Tovarishch +Tove +Tovinder +Tovstonogov +Towen +Townsend +Toya +Toyen +Toynbee +Toyohiro +Toyokawa +Toyomasu +Toyota +Tozzi +Tracicarter +Tracie +Trajanus +Tramuntana +Transvaalia +Transylvania +Trauger +Traversa +Trebon +Trebur +Trefftz +Trelleborg +Tremaine +Trenker +Trentman +Treshnikov +Tresini +Tret'yakov +Trettenero +Trevanvoorth +Trevino +Trevires +Trevorcorbin +Trevorpowers +Triathlon +Triberga +Triceratops +Tricomi +Triconia +Triglav +Trimberger +Trinh +Trinkle +Tripaxeptalis +Tripuraneni +Trisov +Tristan +Trogrlic +Troilus +Troja +Trombka +Tros +Troska +Trubetskaya +Trucpham +Trudel +Trudie +Trueblood +Trujillo +Truong +Trusanda +Tryggvason +Tsai +Tsanghinchi +Tsap +Tsarevsky +Tscharnuter +Tselina +Tsenaat'a'i +Tsereteli +Tsesevich +Tsia +Tsiolkovskaja +Tsoj +Tsubaki +Tsubame +Tsubetsu +Tsuboimasaki +Tsubokawa +Tsuchiyama +Tsuda +Tsuihark +Tsuji +Tsujimura +Tsujitsuka +Tsukada +Tsukamoto +Tsuko +Tsukuba +Tsukuyomi +Tsumura +Tsunemi +Tsunemori +Tsunenaga +Tsuneyoshi +Tsurugisan +Tsurui +Tsutomu +Tsuyashima +Tsvet +Tsvetaeva +Tsvetkova +Tsykalyuk +Tubbiolo +Tubingia +Tucapel +Tuchkova +Tucholsky +Tucker +Tuckia +Tucson +Tugela +Tugendhat +Tula +Tulikov +Tulipa +Tullius +Tumaneng +Tumilty +Tunder +Tunguska +Tunica +Tunis +Tuominen +Tuorla +Tupolev +Turandot +Turchina +Turgenev +Turgot +Turing +Turkmenia +Turku +Turnbull +Turnera +Turney +Turnov +Turonclavere +Tursachan +Turtlestar +Tuscia +Tusi +Tutenchamun +Tuterov +Tuthmosis +Tutte +Tuttle +Tuulikki +Tuva +Tvardovskij +Tvaren +Tvaruzkova +Tvashtri +Twarog +Tweedledee +Tweedledum +Twilley +Tyagi +Tyche +Tycho Brahe +Tydeus +Tyjorgenson +Tyle +Tylerlyon +Tyn nad Vltavou +Tyndall +Tyndareus +Tynka +Typhon +Tyr +Tyrannosaurus +Tyson +Tytgat +Tyumenia +Tyutchev +UKSTU +Ubasti +Ube +Ucaronia +Ucciocontin +Ucclia +Uchikawa +Uchino +Uchinoura +Ucka +Udine +Udinsk +Uedasatoshi +Uedaseiji +Uedashoji +Ueferji +Uemura +Uenohara +Ueta +Ufa +Uganda +Uggarde +Uhland +Uhlenbeck +Uhlherr +Ukalegon +Ukichiro +Ukko +Ukraina +Ukyounodaibu +Ul +Ul'yanin +Ulanova +Ulfbirgitta +Ulissedini +Ulla +Ullacharles +Ullery +Ullischwarz +Ulm +Ulmerspatz +Ulrike +Ultrajectum +Ulugbek +Ulula +Uluru +Ulyanov +Ulysses +Umtata +Una +Underhill +Underwood +Undina +Undset +Unilandes +Union +Unitas +United Nations +Univbalttech +Univermoscow +Universitas +Univinnitsa +Univsima +Unno +Unojonsson +Unruh +Unsold +Unstrut +Uofalberta +Upgren +Upice +Uppenkamp +Uppsala +Upupa +Ur +Uradowan +Ural +Urania +Urata +Urda +Urey +Urgenta +Urhixidur +Urquiza +Urrutia +Ursa +Ursina +Ursula +Urumqi +Urysohn +Urzidil +Ushakov +Ussery +Ustinov +Ute +Utemorrah +Utesov +Utewindolf +Uthmann +Utkin +Utley +Utopia +Utra +Utrecht +Utsumikazuhiko +Utsunomiya +Utting +Uvic +Uwetreske +Uwontario +Uyttenhove +Uzbekistania +V'yus +VOC +Vaasa +Vaccariello +Vacchi +Vaclav +Vaclavhubner +Vaclavneumann +Vaculik +Vadimsimona +Vagnozzi +Vaimaca +Vaino +Vaintrob +Vainu Bappu +Vaisala +Vaissiere +Vala +Valadon +Valborg +Valcourt +Valda +Valdaj +Valdivia +Valencia +Valenlebedev +Valentine +Valeria +Valerienataf +Valeska +Valetti +Valfriedmann +Valgrirasp +Valina +Vallenar +Vallerani +Valmez +Valmiera +Valpertile +Valsecchi +Valtikhonov +Valujki +Valusha +Valyaev +Vamlingbo +Vampilov +Van Biesbroeck +Van Citters +Van Damme +Van Dijck +Van Gaal +Van Lierde +Van Ness +Van Rompaey +Van Straten +Van den Eijnde +Vanadis +Vanavara +Vanderlinden +Vandervelden +Vanessa-Mae +Vanessaspini +Vangelis +Vanlindt +Vanphilos +Vanschaik +Vanverst +Vanvinckenroye +Vanysek +Vardhana +Varela +Vargas +Varnhagen +Varsavia +Vartiovuori +Vartovka +Varuna +Vasadze +Vasarely +Vasifedoseev +Vasilev +Vasilevskis +Vasilij +Vasilkarazin +Vasishtha +Vasks +Vasnetsov +Vassar +Vasylshev +Vaticana +Vauban +Vaucluse +Vaughan +Vauriot +Vavilov +Vavra +Vaxjo +Veblen +Vecernicek +Vecherka +Vedernikov +Veeder +Vehrenberg +Veillet +Veisberg +Vejvoda +Velasco +Velehrad +Velenia +Velez +Velichko +Velikhov +Velikij Ustyug +Velimir +Vellamo +Velleda +Veltman +Vencill +Venetia +Venezuela +Veniakaverin +Veniamina +Venikagan +Venkatachalam +Venkatraman +Ventoux +Ventura +Venturelli +Venusia +Venvolkov +Vera +Veracini +Veralynn +Veratar +Verbaandert +Verbano +Verbiest +Verbitskaya +Verdaguer +Verdenet +Verdi +Verdun +Verenia +Vereshchagin +Vergilius +Verhaeren +Verish +Veritas +Verkhivnya +Verkhodanov +Verlaine +Verlinden +Vermeer +Vermeesch +Vernadskij +Verne +Vernon +Verolacqua +Verona +Veronicaduys +Veronika +Verrocchio +Versailles +Vertinskij +Verulamium +Verveer +Veryuslaviya +Vesale +Veseli +Veselov +Vesevlada +Vesmir +Vesnina +Vespa +Vesta +Vesuvius +Vet +Veteraniya +Veverka +Vian +Vibeke +Vibert-Douglas +Vibilia +Vicars +Vicent +Vicia +Vicjen +Vickyhamilton +Victor Jara +Victorblanco +Victorchang +Victoria +Victoriahibbs +Victoriahsu +Victorlevine +Victorplatt +Victorshia +Videnom +Vieira +Vienna +Viete +Vietoris +Vigdis +Viget +Viggh +Vigo +Vihuri +Viipuri +Vijayjain +Vika +Vikchernov +Vikrymov +Viktorbykov +Viktorfischl +Viktorov +Vikuznetsov +Vilas +Vilen +Vilho +Viljev +Villa-Lobos +Villarreal +Villecroze +Villedepompey +Villeneuve +Villigera +Villon +Vilnius +Vilyujsk +Vinata +Vinay +Vincentina +Vinceteri +Vindobona +Vinhoward +Vinifera +Vinissac +Vinjamoori +Vinterhansenia +Viola +Violaumayer +Violetta +Violilla +Viot +Vipera +Viracocha +Virchow +Vireday +Virgiliofos +Virgiliomarcon +Virgilsmith +Virginia +Virginiaterese +Virgiugum +Viridis +Virtanen +Virton +Virtus +Visby +Viscardy +Vischer +Viscome +Viseggi +Vishnevskaya +Visnjan +Vistula +Viswanathan +Vitagliano +Vitalijzakharov +Vitaris +Vitek +Vitginzburg +Vitja +Vittore +Vittorio +Vitusbering +Vityazev +Viv +Vivaldi +Vivekbuch +Vives +Vivian +Vivianhoette +Vizbor +Vladalekseev +Vladarnolda +Vladbarmin +Vladheinrich +Vladichaika +Vladifedorov +Vladimir +Vladimirov +Vladimirskij +Vladishukhov +Vladisvyat +Vladvasil'ev +Vladvysotskij +Vladzakharov +Vltava +Vodop'yanova +Voegtli +Vogel +Vogelsberg +Vogelweide +Vogtia +Vogtland +Voigt +Voitkevich +Vojislava +Vojno-Yasenetsky +Vojtech +Vokrouhlicky +Volfango +Volga +Volgo-Don +Volk +Volkonskaya +Volkov +Volland +Volodia +Volodshevchenko +Volodymyr +Volonte +Voloshchuk +Voloshina +Volta +Voltaire +Volterra +Vondel +Vonderheydt +Vondracek +Vondrak +Vonnegut +Vonsecker +Vonsiemens +Vonzielonka +Vorarlberg +Vorgebirge +Voronezh +Voronikhin +Vorontsova +Voronveliya +Vorovich +Vosges +Voskovec-Werich +Voss +Voytkevych +Voznesenskij +Vrba +Vredevoogd +Vrishikpatil +Vsekhsvyatskij +Vsetin +Vsevoivanov +Vsevustinov +Vulcano +Vulkaneifel +Vulpius +Vundtia +Vydra +Vysheslavia +Vysochinska +Vyssotsky +WIYN +Wabash +Wabi-Sabi +Wachholz +Wachmann +Wacker +Wade +Wadhwa +Wafakhalil +Wage +Wagman +Wagner +Wakabayashi +Wakamatsu +Wakata +Wake +Wakenokiyomaro +Wakiya +Wakkanai +Waland +Walbeck +Wald +Waldman +Walesdymond +Walford +Walhalla +Walinskia +Walker +Walkure +Wallace +Wallach +Wallenbergia +Wallenquist +Wallia +Wallin +Wallmuth +Wallonia +Walpurga +Walraven +Walsh +Walstein +Waltari +Walter +Walter Adams +Walteranderson +Walterbothe +Walterhorn +Walterkroll +Waltherschmadel +Waltimyer +Waltraut +Wambsganss +Wanach +Wanambi +Wanda +Wanders +Wangchaohao +Wangdaheng +Wangganchang +Wangler +Wangshouguan +Wangxuan +Wangyiran +Wangzhaoxin +Wanke +Warchal +Warck +Ward +Warell +Warhol +Warner +Warot +Warren +Warrener +Wartburg +Waseda +Washi +Washingtonia +Washioyama +Wassenbergh +Wasserburg +Wasserkuppe +Wasserman +Wasson +Wasyuzan +Watanabe +Waterfield +Waterman +Waterwayuni +Watsonia +Watts +Wawel +Wayneanderson +Waynebrown +Waynerichie +Wayneseyfert +Wearydunlop +Weathers +Weaver +Webb +Weber +Webern +Webster +Weckmann +Weerstra +Wegener +Wehinger +Weidenschilling +Weierstrass +Weigan +Weigel +Weihenmayer +Weill +Weimar +Weinberg +Weinek +Weir +Weirather +Weisell +Weiser +Weiskopf +Weisse Rose +Weissflog +Weissman +Weizsacker +Welch +Welcker +Weller +Wellnitz +Wells +Wellton-Persson +Welther +Welty +Welzenbach +Welzl +Wempe +Wendeesther +Wendeline +Wendy +Wendycalvin +Wendyfreedman +Wenlingshuguang +Wentworth +Wenyicai +Wenzel +Werdandi +Werfel +Weringia +Werner +Werntz +Werra +Werth +Wesleyfuller +Wesselink +Wesson +West +Westerbork +Westerhout +Westerlund +Westerwald +Westlane +Westphalia +Westrich +Wetherill +Wettin +Weymouth +Whalen +Wheeler +Whipple +Whitaker +White +Whitehorne +Whitehouse +Whiteknight +Whiteley +Whiterabbit +Whitfield +Whitford +Whither +Whitley +Whitney +Whitson +Whittemora +Whittle +Wiberg +Wichterle +Wickwar +Widmanstatten +Widorn +Wieck +Wiegert +Wieland +Wielen +Wiener +Wiesendangen +Wiesenthal +Wiesloch +Wigeon +Wiggins +Wightman +Wikberg +Wikrent +Wil +Wilber +Wilburwright +Wild +Wildberg +Wildcat +Wiles +Wilfredwong +Wilhelmina +Wilhelmraabe +Wilhelms +Wilhelmwien +Wilke +Wilkens +Wilkerson +Wilkickia +Willacather +Willaert +Willemkolff +Willhayes +Williamartin +Williamcaleb +Williamcarl +Williamcooke +Williamhodge +Williamholden +Williamkuhn +Williamon +Williams +Williams Bay +Williamturner +Williamweber +Williefowler +Williemccool +Willipete +Willis +Williwaw +Willnelson +Willpatrick +Wilson +Wilson-Harrington +Wimberly +Wimfroger +Winchester +Winckelmann +Winer +Wingolfia +Winifred +Winigleason +Winkler +Winmesser +Winokur +Winslow +Winters +Winterthur +Winton +Wirt +Wisdom +Wisibada +Wislicenus +Wisniewski +Wisse +Wissnergross +Witsen +Witt +Wittelsbach +Witten +Wittig +Wladilena +Wlodekofman +Wodan +Wodehouse +Wodetzky +Woerlitz +Wojakowski +Wolbern +Wolfernst +Wolff +Wolfgangmattig +Wolfgangpauli +Wolfiana +Wolflojewski +Wolfson +Wolkenstein +Wollstonecraft +Wolpert +Woltjer +Wombat +Wongkwancheng +Wood +Woodall +Woodard +Wooden +Woodney +Woolston +Woolum +Woomera +Wootensmith +Workman +Worley +Worpswede +Woszczyk +Wotho +Wratislavia +Wray +Wren +Wright +Wronski +Wrubel +Wu +Wu Chien-Shiung +Wuhan +Wuheng +Wujek +Wuminchun +Wunderlich +Wundt +Wurm +Wurttemberg +Wuwenjun +Wuyeesun +Wyeth +Wygoda +Wykrota +Wylie +Wysner +Xanthe +Xanthippe +Xanthomalitia +Xanthus +Xenia +Xenocrates +Xenophanes +Xenophon +Xerxes +Xi'an +Xiajunchao +Xianglupeak +Xiaomengzeng +Xiaoyunyin +Xingmingzhou +Xinjiang +Xinwang +Xiuyanyu +Xiwanggongcheng +Xizang +Xizezong +Xlendi +Xosa +Xuyi +YORP +Yabu +Yabuki +Yabuuti +Yachibozu +Yadoumaru +Yaji +Yakage +Yakedake +Yakhontovia +Yakiimo +Yakovlev +Yakowitz +Yakubovich +Yakushimaru +Yakutia +Yalemichaels +Yalow +Yalta +Yamada +Yamada-Houkoku +Yamagata +Yamagatashi +Yamaguchi +Yamakawa +Yamamohammed +Yamamoto +Yamamotoshinobu +Yamanaka +Yamanashi +Yamaneko +Yamanishi +Yamaoka +Yamasaki +Yamasakimakoto +Yamatai +Yamatano-orochi +Yamatotakeru +Yamaura +Yamehoshinokawa +Yan'an +Yanagida +Yanai +Yanaikeizo +Yanaka +Yanamadala +Yanase +Yancey +Yanfernandez +Yangchenning +Yangel +Yangjiachi +Yangli +Yangliqing +Yangliwei +Yangzhou +Yanhua +Yano +Yanzhong +Yarigatake +Yarilo +Yarkovsky +Yaronika +Yaroshenko +Yaroslavl' +Yashin +Yasuda +Yasue +Yasuhidefujita +Yasuhiko +Yasunori +Yasuofukui +Yasuoyoneda +Yasushi +Yasutani +Yatagarasu +Yatescup +Yatskiv +Yatsugatake +Yatsuka +Yauza +Yavapai +Yayoi +Yazhi +Yeates +Yebes +Yen +Yenisei +Yenuanchen +Yeomans +Yepeiyu +Yerkes +Yes +Yesenin +Yeshuhua +Yeti +Yeungchuchiu +Yeuseyenka +Yezo +Yi Xing +Yichenzhang +Yicheon +Yidaeam +Yihedong +Yiliuchen +Yingfan +Yingling +Yingqiuqilei +Yinhai +Yinyinwu +Yisun +Yisunji +Yiyideng +Ylppo +Yocum +Yoder +Yogeshwar +Yoichi +Yojikondo +Yoko +Yokokurayama +Yokonomura +Yokootakeo +Yokosugano +Yokota +Yokotatakao +Yonematsu +Yoneta +Yonezawa +Yonosuke +Yorii +Yorimasa +Yoritomo +York +Yosakoi +Yoshiaki +Yoshiakifuse +Yoshidamichi +Yoshidatadahiko +Yoshigeru +Yoshihiro +Yoshii +Yoshikawa +Yoshikazu +Yoshiko +Yoshimi +Yoshimitsu +Yoshinaka +Yoshino +Yoshinogawa +Yoshinori +Yoshioba +Yoshiokayayoi +Yoshiosakai +Yoshisada +Yoshitanaka +Yoshitoki +Yoshitomo +Yoshitsune +Yoshiwatiso +Yoshiya +Yoshiyuki +Yoshkar-Ola +Yosukeyoshida +Yotsubashi +Youjiazhong +Young +Yourcenar +Yousyozan +Yozan +Ypres +Yrjo +Yrsa +Ysaye +Yualexandrov +Yuanlongping +Yuanzhang +Yubangtaek +Yucatan +Yudovich +Yugan +Yugoslavia +Yugra +Yuji +Yukar +Yukawa +Yukihiro +Yukihisa +Yukiniall +Yukio +Yukiotanaka +Yukitsuna +Yule +Yulong +Yumi +Yumiko +Yumikoitahana +Yungchieh +Yunnan +Yunxiangchu +Yurigulyaev +Yurijgromov +Yuriko +Yurilvovia +Yuriosipov +Yurka +Yurkanin +Yurlov +Yusaku +Yuudurunosato +Yuuko +Yuyinchen +Yvette +Yvonne +Yvonneroe +Ywain +Zabadak +Zacharyrice +Zachia +Zachopkins +Zachotin +Zachozer +Zachpenn +Zachulett +Zadornov +Zadunaisky +Zafar +Zagar +Zahller +Zahnle +Zahradnik +Zahringia +Zajic +Zajonc +Zajtsev +Zakharchenko +Zakharchenya +Zambesia +Zambujal +Zamenhof +Zanda +Zane +Zanotta +Zanstra +Zao +Zapesotskij +Zappa +Zappafrank +Zappala +Zarabeth +Zaragoza +Zarnecki +Zashikiwarashi +Zatopek +Zauberflote +Zavist +Zavolokin +Zdenekhorsky +Zdenekmatyas +Zdenekmiler +Zdenka +Zdenkaplavcova +Zdiksima +Zdislava +Zech +Zeelandia +Zeeman +Zeeshansayed +Zeglin +Zeilinger +Zeissia +Zeldovich +Zeletava +Zelezny +Zelia +Zelima +Zelinda +Zelinsky +Zelkowitz +Zellner +Zelter +Zembsch-Schreve +Zemka +Zenbei +Zengguoshou +Zenisek +Zenkert +Zenobia +Zenocolo +Zenon +Zephyr +Zerbinetta +Zerin +Zerlina +Zermelo +Zernike +Zero +Zeus +Zeuxo +Zguridi +Zhang Heng +Zhangdaning +Zhangguoxi +Zhangjiajie +Zhangyi +Zhangyizhong +Zhaojiuzhang +Zhejiang +Zhenya +Zhiganov +Zhilyaev +Zhongguo +Zhongkeda +Zhongkeyuan +Zhongolovich +Zhongyuechen +Zhouguangzhao +Zhuguangya +Zhuhai +Zhukov +Zhuruochen +Zhuyuanchen +Zhuzhirui +Zhvanetskij +Zhytomyr +Zibeline +Zibiturtle +Zichichi +Zidek +Zilkha +Zille +Ziminski +Zimmer +Zimmerman +Zimmerwald +Zinner +Zinzendorf +Zipfel +Zirankexuejijin +Zissell +Zita +Zizza +Zlata Koruna +Znannya +Znojil +Znokai +Zoccoli +Zolensky +Zolotov +Zoltowski +Zomba +Zook +Zoser +Zoshchenko +Zoya +Zoyamironova +Zreda +Zrzavy +Zu Chong-Zhi +Zubaida +Zuber +Zubitskia +Zubov +Zuckmayer +Zuev +Zulu +Zurakowski +Zurbriggen +Zurich +Zverev +Zvezdara +Zvezdotchet +Zvikov +Zwaan +Zwerling +Zwetana +Zwicky +Zwiers +Zwin +Zwingli +Zykina +Zyskin diff --git a/libs/Monkeys/tests/words.txt b/libs/Monkeys/tests/words.txt new file mode 100755 index 0000000..de9e696 --- /dev/null +++ b/libs/Monkeys/tests/words.txt @@ -0,0 +1,234935 @@ +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 +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/Zend/Acl.php b/libs/Zend/Acl.php new file mode 100644 index 0000000..c6a19ec --- /dev/null +++ b/libs/Zend/Acl.php @@ -0,0 +1,1036 @@ + array( + 'allRoles' => array( + 'allPrivileges' => array( + 'type' => self::TYPE_DENY, + 'assert' => null + ), + 'byPrivilegeId' => array() + ), + 'byRoleId' => array() + ), + 'byResourceId' => array() + ); + + /** + * Adds a Role having an identifier unique to the registry + * + * The $parents parameter may be a reference to, or the string identifier for, + * a Role existing in the registry, or $parents may be passed as an array of + * these - mixing string identifiers and objects is ok - to indicate the Roles + * from which the newly added Role will directly inherit. + * + * In order to resolve potential ambiguities with conflicting rules inherited + * from different parents, the most recently added parent takes precedence over + * parents that were previously added. In other words, the first parent added + * will have the least priority, and the last parent added will have the + * highest priority. + * + * @param Zend_Acl_Role_Interface $role + * @param Zend_Acl_Role_Interface|string|array $parents + * @uses Zend_Acl_Role_Registry::add() + * @return Zend_Acl Provides a fluent interface + */ + public function addRole(Zend_Acl_Role_Interface $role, $parents = null) + { + $this->_getRoleRegistry()->add($role, $parents); + + return $this; + } + + /** + * Returns the identified Role + * + * The $role parameter can either be a Role or Role identifier. + * + * @param Zend_Acl_Role_Interface|string $role + * @uses Zend_Acl_Role_Registry::get() + * @return Zend_Acl_Role_Interface + */ + public function getRole($role) + { + return $this->_getRoleRegistry()->get($role); + } + + /** + * Returns true if and only if the Role exists in the registry + * + * The $role parameter can either be a Role or a Role identifier. + * + * @param Zend_Acl_Role_Interface|string $role + * @uses Zend_Acl_Role_Registry::has() + * @return boolean + */ + public function hasRole($role) + { + return $this->_getRoleRegistry()->has($role); + } + + /** + * Returns true if and only if $role inherits from $inherit + * + * Both parameters may be either a Role or a Role identifier. If + * $onlyParents is true, then $role must inherit directly from + * $inherit in order to return true. By default, this method looks + * through the entire inheritance DAG to determine whether $role + * inherits from $inherit through its ancestor Roles. + * + * @param Zend_Acl_Role_Interface|string $role + * @param Zend_Acl_Role_Interface|string $inherit + * @param boolean $onlyParents + * @uses Zend_Acl_Role_Registry::inherits() + * @return boolean + */ + public function inheritsRole($role, $inherit, $onlyParents = false) + { + return $this->_getRoleRegistry()->inherits($role, $inherit, $onlyParents); + } + + /** + * Removes the Role from the registry + * + * The $role parameter can either be a Role or a Role identifier. + * + * @param Zend_Acl_Role_Interface|string $role + * @uses Zend_Acl_Role_Registry::remove() + * @return Zend_Acl Provides a fluent interface + */ + public function removeRole($role) + { + $this->_getRoleRegistry()->remove($role); + + if ($role instanceof Zend_Acl_Role_Interface) { + $roleId = $role->getRoleId(); + } else { + $roleId = $role; + } + + foreach ($this->_rules['allResources']['byRoleId'] as $roleIdCurrent => $rules) { + if ($roleId === $roleIdCurrent) { + unset($this->_rules['allResources']['byRoleId'][$roleIdCurrent]); + } + } + foreach ($this->_rules['byResourceId'] as $resourceIdCurrent => $visitor) { + foreach ($visitor['byRoleId'] as $roleIdCurrent => $rules) { + if ($roleId === $roleIdCurrent) { + unset($this->_rules['byResourceId'][$resourceIdCurrent]['byRoleId'][$roleIdCurrent]); + } + } + } + + return $this; + } + + /** + * Removes all Roles from the registry + * + * @uses Zend_Acl_Role_Registry::removeAll() + * @return Zend_Acl Provides a fluent interface + */ + public function removeRoleAll() + { + $this->_getRoleRegistry()->removeAll(); + + foreach ($this->_rules['allResources']['byRoleId'] as $roleIdCurrent => $rules) { + unset($this->_rules['allResources']['byRoleId'][$roleIdCurrent]); + } + foreach ($this->_rules['byResourceId'] as $resourceIdCurrent => $visitor) { + foreach ($visitor['byRoleId'] as $roleIdCurrent => $rules) { + unset($this->_rules['byResourceId'][$resourceIdCurrent]['byRoleId'][$roleIdCurrent]); + } + } + + return $this; + } + + /** + * Adds a Resource having an identifier unique to the ACL + * + * The $parent parameter may be a reference to, or the string identifier for, + * the existing Resource from which the newly added Resource will inherit. + * + * @param Zend_Acl_Resource_Interface $resource + * @param Zend_Acl_Resource_Interface|string $parent + * @throws Zend_Acl_Exception + * @return Zend_Acl Provides a fluent interface + */ + public function add(Zend_Acl_Resource_Interface $resource, $parent = null) + { + $resourceId = $resource->getResourceId(); + + if ($this->has($resourceId)) { + require_once 'Zend/Acl/Exception.php'; + throw new Zend_Acl_Exception("Resource id '$resourceId' already exists in the ACL"); + } + + $resourceParent = null; + + if (null !== $parent) { + try { + if ($parent instanceof Zend_Acl_Resource_Interface) { + $resourceParentId = $parent->getResourceId(); + } else { + $resourceParentId = $parent; + } + $resourceParent = $this->get($resourceParentId); + } catch (Zend_Acl_Exception $e) { + throw new Zend_Acl_Exception("Parent Resource id '$resourceParentId' does not exist"); + } + $this->_resources[$resourceParentId]['children'][$resourceId] = $resource; + } + + $this->_resources[$resourceId] = array( + 'instance' => $resource, + 'parent' => $resourceParent, + 'children' => array() + ); + + return $this; + } + + /** + * Returns the identified Resource + * + * The $resource parameter can either be a Resource or a Resource identifier. + * + * @param Zend_Acl_Resource_Interface|string $resource + * @throws Zend_Acl_Exception + * @return Zend_Acl_Resource_Interface + */ + public function get($resource) + { + if ($resource instanceof Zend_Acl_Resource_Interface) { + $resourceId = $resource->getResourceId(); + } else { + $resourceId = (string) $resource; + } + + if (!$this->has($resource)) { + require_once 'Zend/Acl/Exception.php'; + throw new Zend_Acl_Exception("Resource '$resourceId' not found"); + } + + return $this->_resources[$resourceId]['instance']; + } + + /** + * Returns true if and only if the Resource exists in the ACL + * + * The $resource parameter can either be a Resource or a Resource identifier. + * + * @param Zend_Acl_Resource_Interface|string $resource + * @return boolean + */ + public function has($resource) + { + if ($resource instanceof Zend_Acl_Resource_Interface) { + $resourceId = $resource->getResourceId(); + } else { + $resourceId = (string) $resource; + } + + return isset($this->_resources[$resourceId]); + } + + /** + * Returns true if and only if $resource inherits from $inherit + * + * Both parameters may be either a Resource or a Resource identifier. If + * $onlyParent is true, then $resource must inherit directly from + * $inherit in order to return true. By default, this method looks + * through the entire inheritance tree to determine whether $resource + * inherits from $inherit through its ancestor Resources. + * + * @param Zend_Acl_Resource_Interface|string $resource + * @param Zend_Acl_Resource_Interface|string $inherit + * @param boolean $onlyParent + * @throws Zend_Acl_Resource_Registry_Exception + * @return boolean + */ + public function inherits($resource, $inherit, $onlyParent = false) + { + try { + $resourceId = $this->get($resource)->getResourceId(); + $inheritId = $this->get($inherit)->getResourceId(); + } catch (Zend_Acl_Exception $e) { + throw $e; + } + + if (null !== $this->_resources[$resourceId]['parent']) { + $parentId = $this->_resources[$resourceId]['parent']->getResourceId(); + if ($inheritId === $parentId) { + return true; + } else if ($onlyParent) { + return false; + } + } else { + return false; + } + + while (null !== $this->_resources[$parentId]['parent']) { + $parentId = $this->_resources[$parentId]['parent']->getResourceId(); + if ($inheritId === $parentId) { + return true; + } + } + + return false; + } + + /** + * Removes a Resource and all of its children + * + * The $resource parameter can either be a Resource or a Resource identifier. + * + * @param Zend_Acl_Resource_Interface|string $resource + * @throws Zend_Acl_Exception + * @return Zend_Acl Provides a fluent interface + */ + public function remove($resource) + { + try { + $resourceId = $this->get($resource)->getResourceId(); + } catch (Zend_Acl_Exception $e) { + throw $e; + } + + $resourcesRemoved = array($resourceId); + if (null !== ($resourceParent = $this->_resources[$resourceId]['parent'])) { + unset($this->_resources[$resourceParent->getResourceId()]['children'][$resourceId]); + } + foreach ($this->_resources[$resourceId]['children'] as $childId => $child) { + $this->remove($childId); + $resourcesRemoved[] = $childId; + } + + foreach ($resourcesRemoved as $resourceIdRemoved) { + foreach ($this->_rules['byResourceId'] as $resourceIdCurrent => $rules) { + if ($resourceIdRemoved === $resourceIdCurrent) { + unset($this->_rules['byResourceId'][$resourceIdCurrent]); + } + } + } + + unset($this->_resources[$resourceId]); + + return $this; + } + + /** + * Removes all Resources + * + * @return Zend_Acl Provides a fluent interface + */ + public function removeAll() + { + foreach ($this->_resources as $resourceId => $resource) { + foreach ($this->_rules['byResourceId'] as $resourceIdCurrent => $rules) { + if ($resourceId === $resourceIdCurrent) { + unset($this->_rules['byResourceId'][$resourceIdCurrent]); + } + } + } + + $this->_resources = array(); + + return $this; + } + + /** + * Adds an "allow" rule to the ACL + * + * @param Zend_Acl_Role_Interface|string|array $roles + * @param Zend_Acl_Resource_Interface|string|array $resources + * @param string|array $privileges + * @param Zend_Acl_Assert_Interface $assert + * @uses Zend_Acl::setRule() + * @return Zend_Acl Provides a fluent interface + */ + public function allow($roles = null, $resources = null, $privileges = null, Zend_Acl_Assert_Interface $assert = null) + { + return $this->setRule(self::OP_ADD, self::TYPE_ALLOW, $roles, $resources, $privileges, $assert); + } + + /** + * Adds a "deny" rule to the ACL + * + * @param Zend_Acl_Role_Interface|string|array $roles + * @param Zend_Acl_Resource_Interface|string|array $resources + * @param string|array $privileges + * @param Zend_Acl_Assert_Interface $assert + * @uses Zend_Acl::setRule() + * @return Zend_Acl Provides a fluent interface + */ + public function deny($roles = null, $resources = null, $privileges = null, Zend_Acl_Assert_Interface $assert = null) + { + return $this->setRule(self::OP_ADD, self::TYPE_DENY, $roles, $resources, $privileges, $assert); + } + + /** + * Removes "allow" permissions from the ACL + * + * @param Zend_Acl_Role_Interface|string|array $roles + * @param Zend_Acl_Resource_Interface|string|array $resources + * @param string|array $privileges + * @uses Zend_Acl::setRule() + * @return Zend_Acl Provides a fluent interface + */ + public function removeAllow($roles = null, $resources = null, $privileges = null) + { + return $this->setRule(self::OP_REMOVE, self::TYPE_ALLOW, $roles, $resources, $privileges); + } + + /** + * Removes "deny" restrictions from the ACL + * + * @param Zend_Acl_Role_Interface|string|array $roles + * @param Zend_Acl_Resource_Interface|string|array $resources + * @param string|array $privileges + * @uses Zend_Acl::setRule() + * @return Zend_Acl Provides a fluent interface + */ + public function removeDeny($roles = null, $resources = null, $privileges = null) + { + return $this->setRule(self::OP_REMOVE, self::TYPE_DENY, $roles, $resources, $privileges); + } + + /** + * Performs operations on ACL rules + * + * The $operation parameter may be either OP_ADD or OP_REMOVE, depending on whether the + * user wants to add or remove a rule, respectively: + * + * OP_ADD specifics: + * + * A rule is added that would allow one or more Roles access to [certain $privileges + * upon] the specified Resource(s). + * + * OP_REMOVE specifics: + * + * The rule is removed only in the context of the given Roles, Resources, and privileges. + * Existing rules to which the remove operation does not apply would remain in the + * ACL. + * + * The $type parameter may be either TYPE_ALLOW or TYPE_DENY, depending on whether the + * rule is intended to allow or deny permission, respectively. + * + * The $roles and $resources parameters may be references to, or the string identifiers for, + * existing Resources/Roles, or they may be passed as arrays of these - mixing string identifiers + * and objects is ok - to indicate the Resources and Roles to which the rule applies. If either + * $roles or $resources is null, then the rule applies to all Roles or all Resources, respectively. + * Both may be null in order to work with the default rule of the ACL. + * + * The $privileges parameter may be used to further specify that the rule applies only + * to certain privileges upon the Resource(s) in question. This may be specified to be a single + * privilege with a string, and multiple privileges may be specified as an array of strings. + * + * If $assert is provided, then its assert() method must return true in order for + * the rule to apply. If $assert is provided with $roles, $resources, and $privileges all + * equal to null, then a rule having a type of: + * + * TYPE_ALLOW will imply a type of TYPE_DENY, and + * + * TYPE_DENY will imply a type of TYPE_ALLOW + * + * when the rule's assertion fails. This is because the ACL needs to provide expected + * behavior when an assertion upon the default ACL rule fails. + * + * @param string $operation + * @param string $type + * @param Zend_Acl_Role_Interface|string|array $roles + * @param Zend_Acl_Resource_Interface|string|array $resources + * @param string|array $privileges + * @param Zend_Acl_Assert_Interface $assert + * @throws Zend_Acl_Exception + * @uses Zend_Acl_Role_Registry::get() + * @uses Zend_Acl::get() + * @return Zend_Acl Provides a fluent interface + */ + public function setRule($operation, $type, $roles = null, $resources = null, $privileges = null, + Zend_Acl_Assert_Interface $assert = null) + { + // ensure that the rule type is valid; normalize input to uppercase + $type = strtoupper($type); + if (self::TYPE_ALLOW !== $type && self::TYPE_DENY !== $type) { + require_once 'Zend/Acl/Exception.php'; + throw new Zend_Acl_Exception("Unsupported rule type; must be either '" . self::TYPE_ALLOW . "' or '" + . self::TYPE_DENY . "'"); + } + + // ensure that all specified Roles exist; normalize input to array of Role objects or null + if (!is_array($roles)) { + $roles = array($roles); + } else if (0 === count($roles)) { + $roles = array(null); + } + $rolesTemp = $roles; + $roles = array(); + foreach ($rolesTemp as $role) { + if (null !== $role) { + $roles[] = $this->_getRoleRegistry()->get($role); + } else { + $roles[] = null; + } + } + unset($rolesTemp); + + // ensure that all specified Resources exist; normalize input to array of Resource objects or null + if (!is_array($resources)) { + $resources = array($resources); + } else if (0 === count($resources)) { + $resources = array(null); + } + $resourcesTemp = $resources; + $resources = array(); + foreach ($resourcesTemp as $resource) { + if (null !== $resource) { + $resources[] = $this->get($resource); + } else { + $resources[] = null; + } + } + unset($resourcesTemp); + + // normalize privileges to array + if (null === $privileges) { + $privileges = array(); + } else if (!is_array($privileges)) { + $privileges = array($privileges); + } + + switch ($operation) { + + // add to the rules + case self::OP_ADD: + foreach ($resources as $resource) { + foreach ($roles as $role) { + $rules =& $this->_getRules($resource, $role, true); + if (0 === count($privileges)) { + $rules['allPrivileges']['type'] = $type; + $rules['allPrivileges']['assert'] = $assert; + if (!isset($rules['byPrivilegeId'])) { + $rules['byPrivilegeId'] = array(); + } + } else { + foreach ($privileges as $privilege) { + $rules['byPrivilegeId'][$privilege]['type'] = $type; + $rules['byPrivilegeId'][$privilege]['assert'] = $assert; + } + } + } + } + break; + + // remove from the rules + case self::OP_REMOVE: + foreach ($resources as $resource) { + foreach ($roles as $role) { + $rules =& $this->_getRules($resource, $role); + if (null === $rules) { + continue; + } + if (0 === count($privileges)) { + if (null === $resource && null === $role) { + if ($type === $rules['allPrivileges']['type']) { + $rules = array( + 'allPrivileges' => array( + 'type' => self::TYPE_DENY, + 'assert' => null + ), + 'byPrivilegeId' => array() + ); + } + continue; + } + if ($type === $rules['allPrivileges']['type']) { + unset($rules['allPrivileges']); + } + } else { + foreach ($privileges as $privilege) { + if (isset($rules['byPrivilegeId'][$privilege]) && + $type === $rules['byPrivilegeId'][$privilege]['type']) { + unset($rules['byPrivilegeId'][$privilege]); + } + } + } + } + } + break; + + default: + require_once 'Zend/Acl/Exception.php'; + throw new Zend_Acl_Exception("Unsupported operation; must be either '" . self::OP_ADD . "' or '" + . self::OP_REMOVE . "'"); + } + + return $this; + } + + /** + * Returns true if and only if the Role has access to the Resource + * + * The $role and $resource parameters may be references to, or the string identifiers for, + * an existing Resource and Role combination. + * + * If either $role or $resource is null, then the query applies to all Roles or all Resources, + * respectively. Both may be null to query whether the ACL has a "blacklist" rule + * (allow everything to all). By default, Zend_Acl creates a "whitelist" rule (deny + * everything to all), and this method would return false unless this default has + * been overridden (i.e., by executing $acl->allow()). + * + * If a $privilege is not provided, then this method returns false if and only if the + * Role is denied access to at least one privilege upon the Resource. In other words, this + * method returns true if and only if the Role is allowed all privileges on the Resource. + * + * This method checks Role inheritance using a depth-first traversal of the Role registry. + * The highest priority parent (i.e., the parent most recently added) is checked first, + * and its respective parents are checked similarly before the lower-priority parents of + * the Role are checked. + * + * @param Zend_Acl_Role_Interface|string $role + * @param Zend_Acl_Resource_Interface|string $resource + * @param string $privilege + * @uses Zend_Acl::get() + * @uses Zend_Acl_Role_Registry::get() + * @return boolean + */ + public function isAllowed($role = null, $resource = null, $privilege = null) + { + if (null !== $role) { + $role = $this->_getRoleRegistry()->get($role); + } + + if (null !== $resource) { + $resource = $this->get($resource); + } + + if (null === $privilege) { + // query on all privileges + do { + // depth-first search on $role if it is not 'allRoles' pseudo-parent + if (null !== $role && null !== ($result = $this->_roleDFSAllPrivileges($role, $resource, $privilege))) { + return $result; + } + + // look for rule on 'allRoles' psuedo-parent + if (null !== ($rules = $this->_getRules($resource, null))) { + foreach ($rules['byPrivilegeId'] as $privilege => $rule) { + if (self::TYPE_DENY === ($ruleTypeOnePrivilege = $this->_getRuleType($resource, null, $privilege))) { + return false; + } + } + if (null !== ($ruleTypeAllPrivileges = $this->_getRuleType($resource, null, null))) { + return self::TYPE_ALLOW === $ruleTypeAllPrivileges; + } + } + + // try next Resource + $resource = $this->_resources[$resource->getResourceId()]['parent']; + + } while (true); // loop terminates at 'allResources' pseudo-parent + } else { + // query on one privilege + do { + // depth-first search on $role if it is not 'allRoles' pseudo-parent + if (null !== $role && null !== ($result = $this->_roleDFSOnePrivilege($role, $resource, $privilege))) { + return $result; + } + + // look for rule on 'allRoles' pseudo-parent + if (null !== ($ruleType = $this->_getRuleType($resource, null, $privilege))) { + return self::TYPE_ALLOW === $ruleType; + } else if (null !== ($ruleTypeAllPrivileges = $this->_getRuleType($resource, null, null))) { + return self::TYPE_ALLOW === $ruleTypeAllPrivileges; + } + + // try next Resource + $resource = $this->_resources[$resource->getResourceId()]['parent']; + + } while (true); // loop terminates at 'allResources' pseudo-parent + } + } + + /** + * Returns the Role registry for this ACL + * + * If no Role registry has been created yet, a new default Role registry + * is created and returned. + * + * @return Zend_Acl_Role_Registry + */ + protected function _getRoleRegistry() + { + if (null === $this->_roleRegistry) { + $this->_roleRegistry = new Zend_Acl_Role_Registry(); + } + return $this->_roleRegistry; + } + + /** + * Performs a depth-first search of the Role DAG, starting at $role, in order to find a rule + * allowing/denying $role access to all privileges upon $resource + * + * This method returns true if a rule is found and allows access. If a rule exists and denies access, + * then this method returns false. If no applicable rule is found, then this method returns null. + * + * @param Zend_Acl_Role_Interface $role + * @param Zend_Acl_Resource_Interface $resource + * @return boolean|null + */ + protected function _roleDFSAllPrivileges(Zend_Acl_Role_Interface $role, Zend_Acl_Resource_Interface $resource = null) + { + $dfs = array( + 'visited' => array(), + 'stack' => array() + ); + + if (null !== ($result = $this->_roleDFSVisitAllPrivileges($role, $resource, $dfs))) { + return $result; + } + + while (null !== ($role = array_pop($dfs['stack']))) { + if (!isset($dfs['visited'][$role->getRoleId()])) { + if (null !== ($result = $this->_roleDFSVisitAllPrivileges($role, $resource, $dfs))) { + return $result; + } + } + } + + return null; + } + + /** + * Visits an $role in order to look for a rule allowing/denying $role access to all privileges upon $resource + * + * This method returns true if a rule is found and allows access. If a rule exists and denies access, + * then this method returns false. If no applicable rule is found, then this method returns null. + * + * This method is used by the internal depth-first search algorithm and may modify the DFS data structure. + * + * @param Zend_Acl_Role_Interface $role + * @param Zend_Acl_Resource_Interface $resource + * @param array $dfs + * @return boolean|null + * @throws Zend_Acl_Exception + */ + protected function _roleDFSVisitAllPrivileges(Zend_Acl_Role_Interface $role, Zend_Acl_Resource_Interface $resource = null, + &$dfs = null) + { + if (null === $dfs) { + /** + * @see Zend_Acl_Exception + */ + require_once 'Zend/Acl/Exception.php'; + throw new Zend_Acl_Exception('$dfs parameter may not be null'); + } + + if (null !== ($rules = $this->_getRules($resource, $role))) { + foreach ($rules['byPrivilegeId'] as $privilege => $rule) { + if (self::TYPE_DENY === ($ruleTypeOnePrivilege = $this->_getRuleType($resource, $role, $privilege))) { + return false; + } + } + if (null !== ($ruleTypeAllPrivileges = $this->_getRuleType($resource, $role, null))) { + return self::TYPE_ALLOW === $ruleTypeAllPrivileges; + } + } + + $dfs['visited'][$role->getRoleId()] = true; + foreach ($this->_getRoleRegistry()->getParents($role) as $roleParentId => $roleParent) { + $dfs['stack'][] = $roleParent; + } + + return null; + } + + /** + * Performs a depth-first search of the Role DAG, starting at $role, in order to find a rule + * allowing/denying $role access to a $privilege upon $resource + * + * This method returns true if a rule is found and allows access. If a rule exists and denies access, + * then this method returns false. If no applicable rule is found, then this method returns null. + * + * @param Zend_Acl_Role_Interface $role + * @param Zend_Acl_Resource_Interface $resource + * @param string $privilege + * @return boolean|null + * @throws Zend_Acl_Exception + */ + protected function _roleDFSOnePrivilege(Zend_Acl_Role_Interface $role, Zend_Acl_Resource_Interface $resource = null, + $privilege = null) + { + if (null === $privilege) { + /** + * @see Zend_Acl_Exception + */ + require_once 'Zend/Acl/Exception.php'; + throw new Zend_Acl_Exception('$privilege parameter may not be null'); + } + + $dfs = array( + 'visited' => array(), + 'stack' => array() + ); + + if (null !== ($result = $this->_roleDFSVisitOnePrivilege($role, $resource, $privilege, $dfs))) { + return $result; + } + + while (null !== ($role = array_pop($dfs['stack']))) { + if (!isset($dfs['visited'][$role->getRoleId()])) { + if (null !== ($result = $this->_roleDFSVisitOnePrivilege($role, $resource, $privilege, $dfs))) { + return $result; + } + } + } + + return null; + } + + /** + * Visits an $role in order to look for a rule allowing/denying $role access to a $privilege upon $resource + * + * This method returns true if a rule is found and allows access. If a rule exists and denies access, + * then this method returns false. If no applicable rule is found, then this method returns null. + * + * This method is used by the internal depth-first search algorithm and may modify the DFS data structure. + * + * @param Zend_Acl_Role_Interface $role + * @param Zend_Acl_Resource_Interface $resource + * @param string $privilege + * @param array $dfs + * @return boolean|null + * @throws Zend_Acl_Exception + */ + protected function _roleDFSVisitOnePrivilege(Zend_Acl_Role_Interface $role, Zend_Acl_Resource_Interface $resource = null, + $privilege = null, &$dfs = null) + { + if (null === $privilege) { + /** + * @see Zend_Acl_Exception + */ + require_once 'Zend/Acl/Exception.php'; + throw new Zend_Acl_Exception('$privilege parameter may not be null'); + } + + if (null === $dfs) { + /** + * @see Zend_Acl_Exception + */ + require_once 'Zend/Acl/Exception.php'; + throw new Zend_Acl_Exception('$dfs parameter may not be null'); + } + + if (null !== ($ruleTypeOnePrivilege = $this->_getRuleType($resource, $role, $privilege))) { + return self::TYPE_ALLOW === $ruleTypeOnePrivilege; + } else if (null !== ($ruleTypeAllPrivileges = $this->_getRuleType($resource, $role, null))) { + return self::TYPE_ALLOW === $ruleTypeAllPrivileges; + } + + $dfs['visited'][$role->getRoleId()] = true; + foreach ($this->_getRoleRegistry()->getParents($role) as $roleParentId => $roleParent) { + $dfs['stack'][] = $roleParent; + } + + return null; + } + + /** + * Returns the rule type associated with the specified Resource, Role, and privilege + * combination. + * + * If a rule does not exist or its attached assertion fails, which means that + * the rule is not applicable, then this method returns null. Otherwise, the + * rule type applies and is returned as either TYPE_ALLOW or TYPE_DENY. + * + * If $resource or $role is null, then this means that the rule must apply to + * all Resources or Roles, respectively. + * + * If $privilege is null, then the rule must apply to all privileges. + * + * If all three parameters are null, then the default ACL rule type is returned, + * based on whether its assertion method passes. + * + * @param Zend_Acl_Resource_Interface $resource + * @param Zend_Acl_Role_Interface $role + * @param string $privilege + * @return string|null + */ + protected function _getRuleType(Zend_Acl_Resource_Interface $resource = null, Zend_Acl_Role_Interface $role = null, + $privilege = null) + { + // get the rules for the $resource and $role + if (null === ($rules = $this->_getRules($resource, $role))) { + return null; + } + + // follow $privilege + if (null === $privilege) { + if (isset($rules['allPrivileges'])) { + $rule = $rules['allPrivileges']; + } else { + return null; + } + } else if (!isset($rules['byPrivilegeId'][$privilege])) { + return null; + } else { + $rule = $rules['byPrivilegeId'][$privilege]; + } + + // check assertion if necessary + if (null === $rule['assert'] || $rule['assert']->assert($this, $role, $resource, $privilege)) { + return $rule['type']; + } else if (null !== $resource || null !== $role || null !== $privilege) { + return null; + } else if (self::TYPE_ALLOW === $rule['type']) { + return self::TYPE_DENY; + } else { + return self::TYPE_ALLOW; + } + } + + /** + * Returns the rules associated with a Resource and a Role, or null if no such rules exist + * + * If either $resource or $role is null, this means that the rules returned are for all Resources or all Roles, + * respectively. Both can be null to return the default rule set for all Resources and all Roles. + * + * If the $create parameter is true, then a rule set is first created and then returned to the caller. + * + * @param Zend_Acl_Resource_Interface $resource + * @param Zend_Acl_Role_Interface $role + * @param boolean $create + * @return array|null + */ + protected function &_getRules(Zend_Acl_Resource_Interface $resource = null, Zend_Acl_Role_Interface $role = null, + $create = false) + { + // create a reference to null + $null = null; + $nullRef =& $null; + + // follow $resource + do { + if (null === $resource) { + $visitor =& $this->_rules['allResources']; + break; + } + $resourceId = $resource->getResourceId(); + if (!isset($this->_rules['byResourceId'][$resourceId])) { + if (!$create) { + return $nullRef; + } + $this->_rules['byResourceId'][$resourceId] = array(); + } + $visitor =& $this->_rules['byResourceId'][$resourceId]; + } while (false); + + + // follow $role + if (null === $role) { + if (!isset($visitor['allRoles'])) { + if (!$create) { + return $nullRef; + } + $visitor['allRoles']['byPrivilegeId'] = array(); + } + return $visitor['allRoles']; + } + $roleId = $role->getRoleId(); + if (!isset($visitor['byRoleId'][$roleId])) { + if (!$create) { + return $nullRef; + } + $visitor['byRoleId'][$roleId]['byPrivilegeId'] = array(); + } + return $visitor['byRoleId'][$roleId]; + } + +} diff --git a/libs/Zend/Acl/Assert/Interface.php b/libs/Zend/Acl/Assert/Interface.php new file mode 100644 index 0000000..892df7f --- /dev/null +++ b/libs/Zend/Acl/Assert/Interface.php @@ -0,0 +1,64 @@ +_resourceId = (string) $resourceId; + } + + /** + * Defined by Zend_Acl_Resource_Interface; returns the Resource identifier + * + * @return string + */ + public function getResourceId() + { + return $this->_resourceId; + } + +} diff --git a/libs/Zend/Acl/Resource/Interface.php b/libs/Zend/Acl/Resource/Interface.php new file mode 100644 index 0000000..090cf85 --- /dev/null +++ b/libs/Zend/Acl/Resource/Interface.php @@ -0,0 +1,37 @@ +_roleId = (string) $roleId; + } + + /** + * Defined by Zend_Acl_Role_Interface; returns the Role identifier + * + * @return string + */ + public function getRoleId() + { + return $this->_roleId; + } + +} diff --git a/libs/Zend/Acl/Role/Interface.php b/libs/Zend/Acl/Role/Interface.php new file mode 100644 index 0000000..c8e4ba7 --- /dev/null +++ b/libs/Zend/Acl/Role/Interface.php @@ -0,0 +1,37 @@ +getRoleId(); + + if ($this->has($roleId)) { + /** + * @see Zend_Acl_Role_Registry_Exception + */ + require_once 'Zend/Acl/Role/Registry/Exception.php'; + throw new Zend_Acl_Role_Registry_Exception("Role id '$roleId' already exists in the registry"); + } + + $roleParents = array(); + + if (null !== $parents) { + if (!is_array($parents)) { + $parents = array($parents); + } + /** + * @see Zend_Acl_Role_Registry_Exception + */ + require_once 'Zend/Acl/Role/Registry/Exception.php'; + foreach ($parents as $parent) { + try { + if ($parent instanceof Zend_Acl_Role_Interface) { + $roleParentId = $parent->getRoleId(); + } else { + $roleParentId = $parent; + } + $roleParent = $this->get($roleParentId); + } catch (Zend_Acl_Role_Registry_Exception $e) { + throw new Zend_Acl_Role_Registry_Exception("Parent Role id '$roleParentId' does not exist"); + } + $roleParents[$roleParentId] = $roleParent; + $this->_roles[$roleParentId]['children'][$roleId] = $role; + } + } + + $this->_roles[$roleId] = array( + 'instance' => $role, + 'parents' => $roleParents, + 'children' => array() + ); + + return $this; + } + + /** + * Returns the identified Role + * + * The $role parameter can either be a Role or a Role identifier. + * + * @param Zend_Acl_Role_Interface|string $role + * @throws Zend_Acl_Role_Registry_Exception + * @return Zend_Acl_Role_Interface + */ + public function get($role) + { + if ($role instanceof Zend_Acl_Role_Interface) { + $roleId = $role->getRoleId(); + } else { + $roleId = (string) $role; + } + + if (!$this->has($role)) { + /** + * @see Zend_Acl_Role_Registry_Exception + */ + require_once 'Zend/Acl/Role/Registry/Exception.php'; + throw new Zend_Acl_Role_Registry_Exception("Role '$roleId' not found"); + } + + return $this->_roles[$roleId]['instance']; + } + + /** + * Returns true if and only if the Role exists in the registry + * + * The $role parameter can either be a Role or a Role identifier. + * + * @param Zend_Acl_Role_Interface|string $role + * @return boolean + */ + public function has($role) + { + if ($role instanceof Zend_Acl_Role_Interface) { + $roleId = $role->getRoleId(); + } else { + $roleId = (string) $role; + } + + return isset($this->_roles[$roleId]); + } + + /** + * Returns an array of an existing Role's parents + * + * The array keys are the identifiers of the parent Roles, and the values are + * the parent Role instances. The parent Roles are ordered in this array by + * ascending priority. The highest priority parent Role, last in the array, + * corresponds with the parent Role most recently added. + * + * If the Role does not have any parents, then an empty array is returned. + * + * @param Zend_Acl_Role_Interface|string $role + * @uses Zend_Acl_Role_Registry::get() + * @return array + */ + public function getParents($role) + { + $roleId = $this->get($role)->getRoleId(); + + return $this->_roles[$roleId]['parents']; + } + + /** + * Returns true if and only if $role inherits from $inherit + * + * Both parameters may be either a Role or a Role identifier. If + * $onlyParents is true, then $role must inherit directly from + * $inherit in order to return true. By default, this method looks + * through the entire inheritance DAG to determine whether $role + * inherits from $inherit through its ancestor Roles. + * + * @param Zend_Acl_Role_Interface|string $role + * @param Zend_Acl_Role_Interface|string $inherit + * @param boolean $onlyParents + * @throws Zend_Acl_Role_Registry_Exception + * @return boolean + */ + public function inherits($role, $inherit, $onlyParents = false) + { + /** + * @see Zend_Acl_Role_Registry_Exception + */ + require_once 'Zend/Acl/Role/Registry/Exception.php'; + try { + $roleId = $this->get($role)->getRoleId(); + $inheritId = $this->get($inherit)->getRoleId(); + } catch (Zend_Acl_Role_Registry_Exception $e) { + throw $e; + } + + $inherits = isset($this->_roles[$roleId]['parents'][$inheritId]); + + if ($inherits || $onlyParents) { + return $inherits; + } + + foreach ($this->_roles[$roleId]['parents'] as $parentId => $parent) { + if ($this->inherits($parentId, $inheritId)) { + return true; + } + } + + return false; + } + + /** + * Removes the Role from the registry + * + * The $role parameter can either be a Role or a Role identifier. + * + * @param Zend_Acl_Role_Interface|string $role + * @throws Zend_Acl_Role_Registry_Exception + * @return Zend_Acl_Role_Registry Provides a fluent interface + */ + public function remove($role) + { + /** + * @see Zend_Acl_Role_Registry_Exception + */ + require_once 'Zend/Acl/Role/Registry/Exception.php'; + try { + $roleId = $this->get($role)->getRoleId(); + } catch (Zend_Acl_Role_Registry_Exception $e) { + throw $e; + } + + foreach ($this->_roles[$roleId]['children'] as $childId => $child) { + unset($this->_roles[$childId]['parents'][$roleId]); + } + foreach ($this->_roles[$roleId]['parents'] as $parentId => $parent) { + unset($this->_roles[$parentId]['children'][$roleId]); + } + + unset($this->_roles[$roleId]); + + return $this; + } + + /** + * Removes all Roles from the registry + * + * @return Zend_Acl_Role_Registry Provides a fluent interface + */ + public function removeAll() + { + $this->_roles = array(); + + return $this; + } + +} diff --git a/libs/Zend/Acl/Role/Registry/Exception.php b/libs/Zend/Acl/Role/Registry/Exception.php new file mode 100644 index 0000000..cd60747 --- /dev/null +++ b/libs/Zend/Acl/Role/Registry/Exception.php @@ -0,0 +1,36 @@ +_stream->readByte(); + } + + switch($typeMarker) { + // number + case Zend_Amf_Constants::AMF0_NUMBER: + return $this->_stream->readDouble(); + + // boolean + case Zend_Amf_Constants::AMF0_BOOLEAN: + return (boolean) $this->_stream->readByte(); + + // string + case Zend_Amf_Constants::AMF0_STRING: + return $this->_stream->readUTF(); + + // object + case Zend_Amf_Constants::AMF0_OBJECT: + return $this->readObject(); + + // null + case Zend_Amf_Constants::AMF0_NULL: + return null; + + // undefined + case Zend_Amf_Constants::AMF0_UNDEFINED: + return null; + + // Circular references are returned here + case Zend_Amf_Constants::AMF0_REFERENCE: + return $this->readReference(); + + // mixed array with numeric and string keys + case Zend_Amf_Constants::AMF0_MIXEDARRAY: + return $this->readMixedArray(); + + // array + case Zend_Amf_Constants::AMF0_ARRAY: + return $this->readArray(); + + // date + case Zend_Amf_Constants::AMF0_DATE: + return $this->readDate(); + + // longString strlen(string) > 2^16 + case Zend_Amf_Constants::AMF0_LONGSTRING: + return $this->_stream->readLongUTF(); + + //internal AS object, not supported + case Zend_Amf_Constants::AMF0_UNSUPPORTED: + return null; + + // XML + case Zend_Amf_Constants::AMF0_XML: + return $this->readXmlString(); + + // typed object ie Custom Class + case Zend_Amf_Constants::AMF0_TYPEDOBJECT: + return $this->readTypedObject(); + + //AMF3-specific + case Zend_Amf_Constants::AMF0_AMF3: + return $this->readAmf3TypeMarker(); + + default: + require_once 'Zend/Amf/Exception.php'; + throw new Zend_Amf_Exception('Unsupported marker type: ' . $typeMarker); + } + } + + /** + * Read AMF objects and convert to PHP objects + * + * Read the name value pair objects form the php message and convert them to + * a php object class. + * + * Called when the marker type is 3. + * + * @param array|null $object + * @return object + */ + public function readObject($object = null) + { + if (is_null($object)) { + $object = array(); + } + + while (true) { + $key = $this->_stream->readUTF(); + $typeMarker = $this->_stream->readByte(); + if ($typeMarker != Zend_Amf_Constants::AMF0_OBJECTTERM ){ + //Recursivly call readTypeMarker to get the types of properties in the object + $object[$key] = $this->readTypeMarker($typeMarker); + } else { + //encountered AMF object terminator + break; + } + } + $this->_reference[] = $object; + return (object) $object; + } + + /** + * Read reference objects + * + * Used to gain access to the private array of refrence objects. + * Called when marker type is 7. + * + * @return object + * @throws Zend_Amf_Exception for invalid reference keys + */ + public function readReference() + { + $key = $this->_stream->readInt(); + if (!array_key_exists($key, $this->_reference)) { + require_once 'Zend/Amf/Exception.php'; + throw new Zend_Amf_Exception('Invalid reference key: '. $key); + } + return $this->_reference[$key]; + } + + /** + * Reads an array with numeric and string indexes. + * + * Called when marker type is 8 + * + * @todo As of Flash Player 9 there is not support for mixed typed arrays + * so we handle this as an object. With the introduction of vectors + * in Flash Player 10 this may need to be reconsidered. + * @return array + */ + public function readMixedArray() + { + $length = $this->_stream->readLong(); + return $this->readObject(); + } + + /** + * Converts numberically indexed actiosncript arrays into php arrays. + * + * Called when marker type is 10 + * + * @return array + */ + public function readArray() + { + $length = $this->_stream->readLong(); + $array = array(); + while ($length--) { + $array[] = $this->readTypeMarker(); + } + return $array; + } + + /** + * Convert AS Date to Zend_Date + * + * @return Zend_Date + */ + public function readDate() + { + // get the unix time stamp. Not sure why ActionScript does not use + // milliseconds + $timestamp = floor($this->_stream->readDouble() / 1000); + + // The timezone offset is never returned to the server; it is always 0, + // so read and ignore. + $offset = $this->_stream->readInt(); + + require_once 'Zend/Date.php'; + $date = new Zend_Date($timestamp); + return $date; + } + + /** + * Convert XML to SimpleXml + * If user wants DomDocument they can use dom_import_simplexml + * + * @return SimpleXml Object + */ + public function readXmlString() + { + $string = $this->_stream->readLongUTF(); + return simplexml_load_string($string); + } + + /** + * Read Class that is to be mapped to a server class. + * + * Commonly used for Value Objects on the server + * + * @todo implement Typed Class mapping + * @return object + * @throws Zend_Amf_Exception if unable to load type + */ + public function readTypedObject() + { + require_once 'Zend/Amf/Parse/TypeLoader.php'; + // get the remote class name + $className = $this->_stream->readUTF(); + $loader = Zend_Amf_Parse_TypeLoader::loadType($className); + $returnObject = new $loader(); + $properties = get_object_vars($this->readObject()); + foreach($properties as $key=>$value) { + if($key) { + $returnObject->$key = $value; + } + } + + return $returnObject; + } + + /** + * AMF3 data type encountered load AMF3 Deserializer to handle + * type markers. + * + * @return string + */ + public function readAmf3TypeMarker() + { + $deserializer = $this->getDeserializer(); + $this->_objectEncoding = Zend_Amf_Constants::AMF3_OBJECT_ENCODING; + return $deserializer->readTypeMarker(); + } + + /** + * Return the object encoding to check if an AMF3 object + * is going to be return. + * + * @return int + */ + public function getObjectEncoding() + { + return $this->_objectEncoding; + } + + /** + * Get deserializer + * + * @return Zend_Amf_Parse_Amf3_Deserializer + */ + public function getDeserializer() + { + if (null === $this->_deserializer) { + require_once 'Zend/Amf/Parse/Amf3/Deserializer.php'; + $this->_deserializer = new Zend_Amf_Parse_Amf3_Deserializer($this->_stream); + } + return $this->_deserializer; + } +} diff --git a/libs/Zend/Amf/Parse/Amf0/Serializer.php b/libs/Zend/Amf/Parse/Amf0/Serializer.php new file mode 100644 index 0000000..9d2fa5f --- /dev/null +++ b/libs/Zend/Amf/Parse/Amf0/Serializer.php @@ -0,0 +1,289 @@ +_stream->writeByte($markerType); + switch($markerType) { + case Zend_Amf_Constants::AMF0_NUMBER: + $this->_stream->writeDouble($data); + break; + case Zend_Amf_Constants::AMF0_BOOLEAN: + $this->_stream->writeByte($data); + break; + case Zend_Amf_Constants::AMF0_STRING: + $this->_stream->writeUTF($data); + break; + case Zend_Amf_Constants::AMF0_OBJECT: + $this->writeObject($data); + break; + case Zend_Amf_Constants::AMF0_NULL: + break; + case Zend_Amf_Constants::AMF0_MIXEDARRAY: + // Write length of numeric keys as zero. + $this->_stream->writeLong(0); + $this->writeObject($data); + break; + case Zend_Amf_Constants::AMF0_ARRAY: + $this->writeArray($data); + break; + case Zend_Amf_Constants::AMF0_DATE: + $this->writeDate($data); + break; + case Zend_Amf_Constants::AMF0_LONGSTRING: + $this->_stream->writeLongUTF($data); + break; + case Zend_Amf_Constants::AMF0_TYPEDOBJECT: + $this->writeTypedObject($data); + break; + case Zend_Amf_Constants::AMF0_AMF3: + $this->writeAmf3TypeMarker($data); + break; + default: + require_once 'Zend/Amf/Exception.php'; + throw new Zend_Amf_Exception("Unknown Type Marker: " . $markerType); + } + } else { + switch (true) { + case (is_int($data) || is_float($data)): + $markerType = Zend_Amf_Constants::AMF0_NUMBER; + break; + case (is_bool($data)): + $markerType = Zend_Amf_Constants::AMF0_BOOLEAN; + break; + case (is_string($data) && (strlen($data) > 65536)): + $markerType = Zend_Amf_Constants::AMF0_LONGSTRING; + break; + case (is_string($data)): + $markerType = Zend_Amf_Constants::AMF0_STRING; + break; + case (is_object($data)): + if (($data instanceof DateTime) || ($data instanceof Zend_Date)) { + $markerType = Zend_Amf_Constants::AMF0_DATE; + } else { + + if($className = $this->getClassName($data)){ + //Object is a Typed object set classname + $markerType = Zend_Amf_Constants::AMF0_TYPEDOBJECT; + $this->_className = $className; + } else { + // Object is a generic classname + $markerType = Zend_Amf_Constants::AMF0_OBJECT; + } + break; + } + break; + case (null === $data): + $markerType = Zend_Amf_Constants::AMF0_NULL; + break; + case (is_array($data)): + // check if it is a mixed typed array + foreach (array_keys($data) as $key) { + if (!is_numeric($key)) { + $markerType = Zend_Amf_Constants::AMF0_MIXEDARRAY; + break; + } + } + // Dealing with a standard numeric array + if(!$markerType){ + $markerType = Zend_Amf_Constants::AMF0_ARRAY; + break; + } + break; + default: + require_once 'Zend/Amf/Exception.php'; + throw new Zend_Amf_Exception('Unsupported data type: ' . gettype($data)); + } + + $this->writeTypeMarker($data, $markerType); + } + return $this; + } + + /** + * Write a php array with string or mixed keys. + * + * @param object $data + * @return Zend_Amf_Parse_Amf0_Serializer + */ + public function writeObject($object) + { + // Loop each element and write the name of the property. + foreach ($object as $key => $value) { + $this->_stream->writeUTF($key); + $this->writeTypeMarker($value); + } + + // Write the end object flag + $this->_stream->writeInt(0); + $this->_stream->writeByte(Zend_Amf_Constants::AMF0_OBJECTTERM); + return $this; + } + + /** + * Write a standard numeric array to the output stream. If a mixed array + * is encountered call writeTypeMarker with mixed array. + * + * @param array $array + * @return Zend_Amf_Parse_Amf0_Serializer + */ + public function writeArray($array) + { + $length = count($array); + if (!$length < 0) { + // write the length of the array + $this->_stream->writeLong(0); + } else { + // Write the length of the numberic array + $this->_stream->writeLong($length); + for ($i=0; $i<$length; $i++) { + $value = isset($array[$i]) ? $array[$i] : null; + $this->writeTypeMarker($value); + } + } + return $this; + } + + /** + * Convert the DateTime into an AMF Date + * + * @param DateTime|Zend_Date $data + * @return Zend_Amf_Parse_Amf0_Serializer + */ + public function writeDate($data) + { + if ($data instanceof DateTime) { + $dateString = $data->format('U'); + } elseif ($data instanceof Zend_Date) { + $dateString = $data->toString('U'); + } else { + require_once 'Zend/Amf/Exception.php'; + throw new Zend_Amf_Exception('Invalid date specified; must be a DateTime or Zend_Date object'); + } + $dateString *= 1000; + + // Make the conversion and remove milliseconds. + $this->_stream->writeDouble($dateString); + + // Flash does not respect timezone but requires it. + $this->_stream->writeInt(0); + + return $this; + } + + /** + * Write a class mapped object to the output stream. + * + * @param object $data + * @return Zend_Amf_Parse_Amf0_Serializer + */ + public function writeTypedObject($data) + { + $this->_stream->writeUTF($this->_className); + $this->writeObject($data); + return $this; + } + + /** + * Encountered and AMF3 Type Marker use AMF3 serializer. Once AMF3 is + * enountered it will not return to AMf0. + * + * @param string $data + * @return Zend_Amf_Parse_Amf0_Serializer + */ + public function writeAmf3TypeMarker($data) + { + require_once 'Zend/Amf/Parse/Amf3/Serializer.php'; + $serializer = new Zend_Amf_Parse_Amf3_Serializer($this->_stream); + $serializer->writeTypeMarker($data); + return $this; + } + + /** + * Find if the class name is a class mapped name and return the + * respective classname if it is. + * + * @param object $object + * @return false|string $className + */ + protected function getClassName($object) + { + require_once 'Zend/Amf/Parse/TypeLoader.php'; + //Check to see if the object is a typed object and we need to change + $className = ''; + switch (true) { + // the return class mapped name back to actionscript class name. + case Zend_Amf_Parse_TypeLoader::getMappedClassName(get_class($object)): + $className = Zend_Amf_Parse_TypeLoader::getMappedClassName(get_class($object)); + break; + // Check to see if the user has defined an explicit Action Script type. + case isset($object->_explicitType): + $className = $object->_explicitType; + unset($object->_explicitType); + break; + // Check if user has defined a method for accessing the Action Script type + case method_exists($object, 'getASClassName'): + $className = $object->getASClassName(); + break; + // No return class name is set make it a generic object + default: + break; + } + if(!$className == '') { + return $className; + } else { + return false; + } + } +} diff --git a/libs/Zend/Amf/Parse/Amf3/Deserializer.php b/libs/Zend/Amf/Parse/Amf3/Deserializer.php new file mode 100644 index 0000000..598829b --- /dev/null +++ b/libs/Zend/Amf/Parse/Amf3/Deserializer.php @@ -0,0 +1,410 @@ +_stream->readByte(); + } + + switch($typeMarker) { + case Zend_Amf_Constants::AMF3_UNDEFINED: + return null; + case Zend_Amf_Constants::AMF3_NULL: + return null; + case Zend_Amf_Constants::AMF3_BOOLEAN_FALSE: + return false; + case Zend_Amf_Constants::AMF3_BOOLEAN_TRUE: + return true; + case Zend_Amf_Constants::AMF3_INTEGER: + return $this->readInteger(); + case Zend_Amf_Constants::AMF3_NUMBER: + return $this->_stream->readDouble(); + case Zend_Amf_Constants::AMF3_STRING: + return $this->readString(); + case Zend_Amf_Constants::AMF3_DATE: + return $this->readDate(); + case Zend_Amf_Constants::AMF3_ARRAY: + return $this->readArray(); + case Zend_Amf_Constants::AMF3_OBJECT: + return $this->readObject(); + case Zend_Amf_Constants::AMF3_XML: + case Zend_Amf_Constants::AMF3_XMLSTRING: + return $this->readXmlString(); + case Zend_Amf_Constants::AMF3_BYTEARRAY: + return $this->readString(); + default: + require_once 'Zend/Amf/Exception.php'; + throw new Zend_Amf_Exception('Unsupported type marker: ' . $typeMarker); + } + } + + /** + * Read and deserialize an integer + * + * AMF 3 represents smaller integers with fewer bytes using the most + * significant bit of each byte. The worst case uses 32-bits + * to represent a 29-bit number, which is what we would have + * done with no compression. + * - 0x00000000 - 0x0000007F : 0xxxxxxx + * - 0x00000080 - 0x00003FFF : 1xxxxxxx 0xxxxxxx + * - 0x00004000 - 0x001FFFFF : 1xxxxxxx 1xxxxxxx 0xxxxxxx + * - 0x00200000 - 0x3FFFFFFF : 1xxxxxxx 1xxxxxxx 1xxxxxxx xxxxxxxx + * - 0x40000000 - 0xFFFFFFFF : throw range exception + * + * + * 0x04 -> integer type code, followed by up to 4 bytes of data. + * + * @see: Parsing integers on OSFlash {http://osflash.org/amf3/parsing_integers>} for the AMF3 integer data format. + * @return int|float + */ + public function readInteger() + { + $count = 1; + $intReference = $this->_stream->readByte(); + $result = 0; + while ((($intReference & 0x80) != 0) && $count < 4) { + $result <<= 7; + $result |= ($intReference & 0x7f); + $intReference = $this->_stream->readByte(); + $count++; + } + if ($count < 4) { + $result <<= 7; + $result |= $intReference; + } else { + // Use all 8 bits from the 4th byte + $result <<= 8; + $result |= $intReference; + + // Check if the integer should be negative + if (($result & 0x10000000) != 0) { + //and extend the sign bit + $result |= 0xe0000000; + } + } + return $result; + } + + /** + * Read and deserialize a string + * + * Strings can be sent as a reference to a previously + * occurring String by using an index to the implicit string reference table. + * Strings are encoding using UTF-8 - however the header may either + * describe a string literal or a string reference. + * + * - string = 006 string-data + * - string-data = integer-data [ modified-utf-8 ] + * - modified-utf-8 = *OCTET + * + * @return String + */ + public function readString() + { + $stringReference = $this->readInteger(); + + //Check if this is a reference string + if (($stringReference & 0x01) == 0) { + // reference string + $stringReference = $stringReference >> 1; + if ($stringReference >= count($this->_referenceStrings)) { + require_once 'Zend/Amf/Exception.php'; + throw new Zend_Amf_Exception('Undefined string reference: ' . $stringReference); + } + // reference string found + return $this->_referenceStrings[$stringReference]; + } + + $length = $stringReference >> 1; + if ($length) { + $string = $this->_stream->readBytes($length); + $this->_referenceStrings[] = $string; + } else { + $string = ""; + } + return $string; + } + + /** + * Read and deserialize a date + * + * Data is the number of milliseconds elapsed since the epoch + * of midnight, 1st Jan 1970 in the UTC time zone. + * Local time zone information is not sent to flash. + * + * - date = 008 integer-data [ number-data ] + * + * @return Zend_Date + */ + public function readDate() + { + $dateReference = $this->readInteger(); + if (($dateReference & 0x01) == 0) { + $dateReference = $dateReference >> 1; + if ($dateReference>=count($this->_referenceObjects)) { + require_once 'Zend/Amf/Exception.php'; + throw new Zend_Amf_Exception('Undefined date reference: ' . $dateReference); + } + return $this->_referenceObjects[$dateReference]; + } + + $timestamp = floor($this->_stream->readDouble() / 1000); + + require_once 'Zend/Date.php'; + $dateTime = new Zend_Date((int) $timestamp); + $this->_referenceObjects[] = $dateTime; + return $dateTime; + } + + /** + * Read amf array to PHP array + * + * - array = 009 integer-data ( [ 1OCTET *amf3-data ] | [OCTET *amf3-data 1] | [ OCTET *amf-data ] ) + * + * @return array + */ + public function readArray() + { + $arrayReference = $this->readInteger(); + if (($arrayReference & 0x01)==0){ + $arrayReference = $arrayReference >> 1; + if ($arrayReference>=count($this->_referenceObjects)) { + require_once 'Zend/Amf/Exception.php'; + throw new Zend_Amf_Exception('Unknow array reference: ' . $arrayReference); + } + return $this->_referenceObjects[$arrayReference]; + } + + // Create a holder for the array in the reference list + $data = array(); + $this->_referenceObjects[] &= $data; + $key = $this->readString(); + + // Iterating for string based keys. + while ($key != '') { + $data[$key] = $this->readTypeMarker(); + $key = $this->readString(); + } + + $arrayReference = $arrayReference >>1; + + //We have a dense array + for ($i=0; $i < $arrayReference; $i++) { + $data[] = $this->readTypeMarker(); + } + + return $data; + } + + /** + * Read an object from the AMF stream and convert it into a PHP object + * + * @todo Rather than using an array of traitsInfo create Zend_Amf_Value_TraitsInfo + * @return object + */ + public function readObject() + { + $traitsInfo = $this->readInteger(); + $storedObject = ($traitsInfo & 0x01)==0; + $traitsInfo = $traitsInfo >> 1; + + // Check if the Object is in the stored Objects reference table + if ($storedObject) { + $ref = $traitsInfo; + if (!isset($this->_referenceObjects[$ref])) { + require_once 'Zend/Amf/Exception.php'; + throw new Zend_Amf_Exception('Unknown Object reference: ' . $ref); + } + $returnObject = $this->_referenceObjects[$ref]; + } else { + // Check if the Object is in the stored Definistions reference table + $storedClass = ($traitsInfo & 0x01) == 0; + $traitsInfo = $traitsInfo >> 1; + if ($storedClass) { + $ref = $traitsInfo; + if (!isset($this->_referenceDefinitions[$ref])) { + require_once 'Zend/Amf/Exception.php'; + throw new Zend_Amf_Exception('Unknows Definition reference: '. $ref); + } + // Populate the reference attributes + $className = $this->_referenceDefinitions[$ref]['className']; + $encoding = $this->_referenceDefinitions[$ref]['encoding']; + $propertyNames = $this->_referenceDefinitions[$ref]['propertyNames']; + } else { + // The class was not in the reference tables. Start reading rawdata to build traits. + // Create a traits table. Zend_Amf_Value_TraitsInfo would be ideal + $className = $this->readString(); + $encoding = $traitsInfo & 0x03; + $propertyNames = array(); + $traitsInfo = $traitsInfo >> 2; + } + + // We now have the object traits defined in variables. Time to go to work: + if (!$className) { + // No class name generic object + $returnObject = new stdClass(); + } else { + // Defined object + // Typed object lookup agsinst registered classname maps + if ($loader = Zend_Amf_Parse_TypeLoader::loadType($className)) { + $returnObject = new $loader(); + } else { + //user defined typed object + require_once 'Zend/Amf/Exception.php'; + throw new Zend_Amf_Exception('Typed object not found: '. $className . ' '); + } + } + + // Add the Object ot the reference table + $this->_referenceObjects[] = $returnObject; + + // Check encoding types for additional processing. + switch ($encoding) { + case (Zend_Amf_Constants::ET_EXTERNAL): + // Externalizable object such as {ArrayCollection} and {ObjectProxy} + if (!$storedClass) { + $this->_referenceDefinitions[] = array( + 'className' => $className, + 'encoding' => $encoding, + 'propertyNames' => $propertyNames, + ); + } + $returnObject->externalizedData = $this->readTypeMarker(); + break; + case (Zend_Amf_Constants::ET_DYNAMIC): + // used for Name-value encoding + if (!$storedClass) { + $this->_referenceDefinitions[] = array( + 'className' => $className, + 'encoding' => $encoding, + 'propertyNames' => $propertyNames, + ); + } + // not a refrence object read name value properties from byte stream + $properties = array(); // clear value + do { + $property = $this->readString(); + if ($property != "") { + $propertyNames[] = $property; + $properties[$property] = $this->readTypeMarker(); + } + } while ($property !=""); + break; + default: + // basic property list object. + if (!$storedClass) { + $count = $traitsInfo; // Number of properties in the list + for($i=0; $i< $count; $i++) { + $propertyNames[] = $this->readString(); + } + // Add a refrence to the class. + $this->_referenceDefinitions[] = array( + 'className' => $className, + 'encoding' => $encoding, + 'propertyNames' => $propertyNames, + ); + } + $properties = array(); // clear value + foreach ($propertyNames as $property) { + $properties[$property] = $this->readTypeMarker(); + } + break; + } + + // Add properties back to the return object. + foreach($properties as $key=>$value) { + if($key) { + $returnObject->$key = $value; + } + } + } + return $returnObject; + } + + /** + * Convert XML to SimpleXml + * If user wants DomDocument they can use dom_import_simplexml + * + * @return SimpleXml Object + */ + public function readXmlString() + { + $xmlReference = $this->readInteger(); + $length = $xmlReference >> 1; + $string = $this->_stream->readBytes($length); + return simplexml_load_string($string); + } +} diff --git a/libs/Zend/Amf/Parse/Amf3/Serializer.php b/libs/Zend/Amf/Parse/Amf3/Serializer.php new file mode 100644 index 0000000..a64cc85 --- /dev/null +++ b/libs/Zend/Amf/Parse/Amf3/Serializer.php @@ -0,0 +1,317 @@ +_stream->writeByte($markerType); + + switch ($markerType) { + case Zend_Amf_Constants::AMF3_NULL: + break; + case Zend_Amf_Constants::AMF3_BOOLEAN_FALSE: + break; + case Zend_Amf_Constants::AMF3_BOOLEAN_TRUE: + break; + case Zend_Amf_Constants::AMF3_INTEGER: + $this->writeInteger($data); + break; + case Zend_Amf_Constants::AMF3_NUMBER: + $this->_stream->writeDouble($data); + break; + case Zend_Amf_Constants::AMF3_STRING: + $this->writeString($data); + break; + case Zend_Amf_Constants::AMF3_DATE: + $this->writeDate($data); + break; + case Zend_Amf_Constants::AMF3_ARRAY: + $this->writeArray($data); + break; + case Zend_Amf_Constants::AMF3_OBJECT: + $this->writeObject($data); + break; + case Zend_Amf_Constants::AMF3_BYTEARRAY: + $this->writeString($data); + break; + default: + require_once 'Zend/Amf/Exception.php'; + throw new Zend_Amf_Exception('Unknown Type Marker: ' . $markerType); + } + } else { + // Detect Type Marker + switch (true) { + case (null === $data): + $markerType = Zend_Amf_Constants::AMF3_NULL; + break; + case (is_bool($data)): + if ($data){ + $markerType = Zend_Amf_Constants::AMF3_BOOLEAN_TRUE; + } else { + $markerType = Zend_Amf_Constants::AMF3_BOOLEAN_FALSE; + } + break; + case (is_int($data)): + if (($data > 0xFFFFFFF) || ($data < -268435456)) { + $markerType = Zend_Amf_Constants::AMF3_NUMBER; + } else { + $markerType = Zend_Amf_Constants::AMF3_INTEGER; + } + break; + case (is_float($data)): + $markerType = Zend_Amf_Constants::AMF3_NUMBER; + break; + case (is_string($data)): + $markerType = Zend_Amf_Constants::AMF3_STRING; + break; + case (is_array($data)): + $markerType = Zend_Amf_Constants::AMF3_ARRAY; + break; + case (is_object($data)): + // Handle object types. + if (($data instanceof DateTime) || ($data instanceof Zend_Date)) { + $markerType = Zend_Amf_Constants::AMF3_DATE; + } else if ($data instanceof Zend_Amf_Value_ByteArray) { + $markerType = Zend_Amf_Constants::AMF3_BYTEARRAY; + } else { + $markerType = Zend_Amf_Constants::AMF3_OBJECT; + } + break; + default: + require_once 'Zend/Amf/Exception.php'; + throw new Zend_Amf_Exception('Unsupported data type: ' . gettype($data)); + } + $this->writeTypeMarker($data, $markerType); + } + } + + /** + * Write an AMF3 integer + * + * @param int|float $data + * @return Zend_Amf_Parse_Amf3_Serializer + */ + public function writeInteger($int) + { + if (($int & 0xffffff80) == 0) { + $this->_stream->writeByte($int & 0x7f); + return $this; + } + + if (($int & 0xffffc000) == 0 ) { + $this->_stream->writeByte(($int >> 7 ) | 0x80); + $this->_stream->writeByte($int & 0x7f); + return $this; + } + + if (($int & 0xffe00000) == 0) { + $this->_stream->writeByte(($int >> 14 ) | 0x80); + $this->_stream->writeByte(($int >> 7 ) | 0x80); + $this->_stream->writeByte($int & 0x7f); + return $this; + } + + $this->_stream->writeByte(($int >> 22 ) | 0x80); + $this->_stream->writeByte(($int >> 15 ) | 0x80); + $this->_stream->writeByte(($int >> 8 ) | 0x80); + $this->_stream->writeByte($int & 0xff); + return $this; + } + + /** + * Send string to output stream + * + * @param string $string + * @return Zend_Amf_Parse_Amf3_Serializer + */ + public function writeString($string) + { + $ref = strlen($string) << 1 | 0x01; + $this->writeInteger($ref); + $this->_stream->writeBytes($string); + return $this; + } + + /** + * Convert DateTime/Zend_Date to AMF date + * + * @param DateTime|Zend_Date $date + * @return Zend_Amf_Parse_Amf3_Serializer + */ + public function writeDate($date) + { + if ($date instanceof DateTime) { + $dateString = $date->format('U') * 1000; + } elseif ($date instanceof Zend_Date) { + $dateString = $date->toString('U') * 1000; + } else { + require_once 'Zend/Amf/Exception.php'; + throw new Zend_Amf_Exception('Invalid date specified; must be a string DateTime or Zend_Date object'); + } + + $this->writeInteger(0x01); + // write time to stream minus milliseconds + $this->_stream->writeDouble($dateString); + return $this; + } + + /** + * Write a PHP array back to the amf output stream + * + * @param array $array + * @return Zend_Amf_Parse_Amf3_Serializer + */ + public function writeArray(array $array) + { + // have to seperate mixed from numberic keys. + $numeric = array(); + $string = array(); + foreach ($array as $key => $value) { + if (is_int($key)) { + $numeric[] = $value; + } else { + $string[$key] = $value; + } + } + + // write the preamble id of the array + $length = count($numeric); + $id = ($length << 1) | 0x01; + $this->writeInteger($id); + + //Write the mixed type array to the output stream + foreach($string as $key => $value) { + $this->writeString($key) + ->writeTypeMarker($value); + } + $this->writeString(''); + + // Write the numeric array to ouput stream + foreach($numeric as $value) { + $this->writeTypeMarker($value); + } + return $this; + } + + /** + * Write object to ouput stream + * + * @param mixed $data + * @return Zend_Amf_Parse_Amf3_Serializer + */ + public function writeObject($object) + { + $encoding = Zend_Amf_Constants::ET_PROPLIST; + $className = ''; + + //Check to see if the object is a typed object and we need to change + switch (true) { + // the return class mapped name back to actionscript class name. + case ($className = Zend_Amf_Parse_TypeLoader::getMappedClassName(get_class($object))): + break; + + // Check to see if the user has defined an explicit Action Script type. + case isset($object->_explicitType): + $className = $object->_explicitType; + unset($object->_explicitType); + break; + + // Check if user has defined a method for accessing the Action Script type + case method_exists($object, 'getASClassName'): + $className = $object->getASClassName(); + break; + + // No return class name is set make it a generic object + default: + break; + } + + $traitsInfo = Zend_Amf_Constants::AMF3_OBJECT_ENCODING; + $traitsInfo |= $encoding << 2; + try { + switch($encoding) { + case Zend_Amf_Constants::ET_PROPLIST: + $count = 0; + foreach($object as $key => $value) { + $count++; + } + $traitsInfo |= ($count << 4); + + // Write the object ID + $this->writeInteger($traitsInfo); + + // Write the classname + $this->writeString($className); + + // Write the object Key's to the output stream + foreach ($object as $key => $value) { + $this->writeString($key); + } + + //Write the object values to the output stream. + foreach ($object as $key => $value) { + $this->writeTypeMarker($value); + } + break; + case Zend_Amf_Constants::ET_EXTERNAL: + require_once 'Zend/Amf/Exception.php'; + throw new Zend_Amf_Exception('External Object Encoding not implemented'); + break; + default: + require_once 'Zend/Amf/Exception.php'; + throw new Zend_Amf_Exception('Unknown Object Encoding type: ' . $encoding); + } + } catch (Exception $e) { + require_once 'Zend/Amf/Exception.php'; + throw new Zend_Amf_Exception('Unable to writeObject output: ' . $e->getMessage()); + } + + return $this; + } +} diff --git a/libs/Zend/Amf/Parse/Deserializer.php b/libs/Zend/Amf/Parse/Deserializer.php new file mode 100644 index 0000000..38ba500 --- /dev/null +++ b/libs/Zend/Amf/Parse/Deserializer.php @@ -0,0 +1,64 @@ +_stream = $stream; + } + + /** + * Checks for AMF marker types and calls the appropriate methods + * for deserializing those marker types. Markers are the data type of + * the following value. + * + * @param int $typeMarker + * @return mixed Whatever the data type is of the marker in php + */ + public abstract function readTypeMarker($markerType = null); +} diff --git a/libs/Zend/Amf/Parse/InputStream.php b/libs/Zend/Amf/Parse/InputStream.php new file mode 100644 index 0000000..d3883bd --- /dev/null +++ b/libs/Zend/Amf/Parse/InputStream.php @@ -0,0 +1,38 @@ +_stream = $stream; + } + + /** + * Find the PHP object type and convert it into an AMF object type + * + * @param mixed $content + * @param int $markerType + * @return void + */ + public abstract function writeTypeMarker($content, $markerType=null); +} diff --git a/libs/Zend/Amf/Parse/TypeLoader.php b/libs/Zend/Amf/Parse/TypeLoader.php new file mode 100644 index 0000000..c370576 --- /dev/null +++ b/libs/Zend/Amf/Parse/TypeLoader.php @@ -0,0 +1,133 @@ + 'Zend_Amf_Value_Messaging_AcknowledgeMessage', + 'flex.messaging.messages.ErrorMessage' => 'Zend_Amf_Value_Messaging_AsyncMessage', + 'flex.messaging.messages.CommandMessage' => 'Zend_Amf_Value_Messaging_CommandMessage', + 'flex.messaging.messages.ErrorMessage' => 'Zend_Amf_Value_Messaging_ErrorMessage', + 'flex.messaging.messages.RemotingMessage' => 'Zend_Amf_Value_Messaging_RemotingMessage', + ); + + /** + * @var array Default class map + */ + protected static $_defaultClassMap = array( + 'flex.messaging.messages.AcknowledgeMessage' => 'Zend_Amf_Value_Messaging_AcknowledgeMessage', + 'flex.messaging.messages.ErrorMessage' => 'Zend_Amf_Value_Messaging_AsyncMessage', + 'flex.messaging.messages.CommandMessage' => 'Zend_Amf_Value_Messaging_CommandMessage', + 'flex.messaging.messages.ErrorMessage' => 'Zend_Amf_Value_Messaging_ErrorMessage', + 'flex.messaging.messages.RemotingMessage' => 'Zend_Amf_Value_Messaging_RemotingMessage', + ); + + /** + * Load the mapped class type into a callback. + * + * @param string $className + * @return object|false + */ + public static function loadType($className) + { + $class = false; + $callBack = false; + $class = self::getMappedClassName($className); + if (!class_exists($class)) { + require_once 'Zend/Amf/Exception.php'; + throw new Zend_Amf_Exception($className .' mapped class '. $class . ' is not defined'); + } + + return $class; + } + + /** + * Looks up the supplied call name to its mapped class name + * + * @param string $className + * @return string + */ + public static function getMappedClassName($className) + { + $mappedName = array_search($className, self::$classMap); + + if ($mappedName) { + return $mappedName; + } + + $mappedName = array_search($className, array_flip(self::$classMap)); + + if ($mappedName) { + return $mappedName; + } + + return false; + } + + /** + * Map PHP class names to ActionScript class names + * + * Allows users to map the class names of there action script classes + * to the equivelent php class name. Used in deserialization to load a class + * and serialiation to set the class name of the returned object. + * + * @param string $asClassName + * @param string $phpClassName + * @return void + */ + public static function setMapping($asClassName, $phpClassName) + { + self::$classMap[$asClassName] = $phpClassName; + } + + /** + * Reset type map + * + * @return void + */ + public static function resetMap() + { + self::$classMap = self::$_defaultClassMap; + } +} diff --git a/libs/Zend/Amf/Request.php b/libs/Zend/Amf/Request.php new file mode 100644 index 0000000..dd126be --- /dev/null +++ b/libs/Zend/Amf/Request.php @@ -0,0 +1,249 @@ +_inputStream = new Zend_Amf_Parse_InputStream($request); + $this->_deserializer = new Zend_Amf_Parse_AMF0_Deserializer($this->_inputStream); + $this->readMessage($this->_inputStream); + return $this; + } + + /** + * Takes the raw AMF input stream and converts it into valid PHP objects + * + * @param Zend_Amf_Parse_InputStream + * @return Zend_Amf_Request + */ + public function readMessage(Zend_Amf_Parse_InputStream $stream) + { + $clientVersion = $stream->readUnsignedShort(); + if (($clientVersion != Zend_Amf_Constants::AMF0_OBJECT_ENCODING) + && ($clientVersion != Zend_Amf_Constants::AMF3_OBJECT_ENCODING) + ) { + require_once 'Zend/Amf/Exception.php'; + throw new Zend_Amf_Exception('Unknown Player Version ' . $clientVersion); + } + + $this->_bodies = array(); + $this->_headers = array(); + $headerCount = $stream->readInt(); + + // Iterate through the AMF envelope header + while ($headerCount--) { + $this->_headers[] = $this->readHeader(); + } + + // Iterate through the AMF envelope body + $bodyCount = $stream->readInt(); + while ($bodyCount--) { + $this->_bodies[] = $this->readBody(); + } + + return $this; + } + + /** + * Deserialize a message header from the input stream. + * + * A message header is structured as: + * - NAME String + * - MUST UNDERSTAND Boolean + * - LENGTH Int + * - DATA Object + * + * @return Zend_Amf_Value_MessageHeader + */ + public function readHeader() + { + $name = $this->_inputStream->readUTF(); + $mustRead = (bool)$this->_inputStream->readByte(); + $length = $this->_inputStream->readLong(); + + try { + $data = $this->_deserializer->readTypeMarker(); + } catch (Exception $e) { + require_once 'Zend/Amf/Exception.php'; + throw new Zend_Amf_Exception('Unable to parse ' . $name . ' header data: ' . $e->getMessage() . ' '. $e->getLine()); + } + + $header = new Zend_Amf_Value_MessageHeader($name, $mustRead, $data, $length); + return $header; + } + + /** + * Deserialize a message body from the input stream + * + * @return Zend_Amf_Value_MessageBody + */ + public function readBody() + { + $targetURI = $this->_inputStream->readUTF(); + $responseURI = $this->_inputStream->readUTF(); + $length = $this->_inputStream->readLong(); + + try { + $data = $this->_deserializer->readTypeMarker(); + } catch (Exception $e) { + require_once 'Zend/Amf/Exception.php'; + throw new Zend_Amf_Exception('Unable to parse ' . $targetURI . ' body data ' . $e->getMessage()); + } + + // Check for AMF3 objectEncoding + if ($this->_deserializer->getObjectEncoding() == Zend_Amf_Constants::AMF3_OBJECT_ENCODING) { + /* + * When and AMF3 message is sent to the server it is nested inside + * an AMF0 array called Content. The following code gets the object + * out of the content array and sets it as the message data. + */ + if(is_array($data) && is_object($data[0])){ + $data = $data[0]; + } + + // set the encoding so we return our message in AMF3 + $this->_objectEncoding = Zend_Amf_Constants::AMF3_OBJECT_ENCODING; + } + + $body = new Zend_Amf_Value_MessageBody($targetURI, $responseURI, $data); + return $body; + } + + /** + * Return an array of the body objects that were found in the amf request. + * + * @return array {target, response, length, content} + */ + public function getAmfBodies() + { + return $this->_bodies; + } + + /** + * Accessor to private array of message bodies. + * + * @param Zend_Amf_Value_MessageBody $message + * @return Zend_Amf_Request + */ + public function addAmfBody(Zend_Amf_Value_MessageBody $message) + { + $this->_bodies[] = $message; + return $this; + } + + /** + * Return an array of headers that were found in the amf request. + * + * @return array {operation, mustUnderstand, length, param} + */ + public function getAmfHeaders() + { + return $this->_headers; + } + + /** + * Return the either 0 or 3 for respect AMF version + * + * @return int + */ + public function getObjectEncoding() + { + return $this->_objectEncoding; + } + + /** + * Set the object response encoding + * + * @param mixed $int + * @return Zend_Amf_Request + */ + public function setObjectEncoding($int) + { + $this->_objectEncoding = $int; + return $this; + } +} diff --git a/libs/Zend/Amf/Request/Http.php b/libs/Zend/Amf/Request/Http.php new file mode 100644 index 0000000..a87e271 --- /dev/null +++ b/libs/Zend/Amf/Request/Http.php @@ -0,0 +1,79 @@ +_rawRequest = $amfRequest; + $this->initialize($amfRequest); + } else { + echo '

Zend Amf Endpoint

' ; + } + } + + /** + * Retrieve raw AMF Request + * + * @return string + */ + public function getRawRequest() + { + return $this->_rawRequest; + } +} diff --git a/libs/Zend/Amf/Response.php b/libs/Zend/Amf/Response.php new file mode 100644 index 0000000..29a9cd4 --- /dev/null +++ b/libs/Zend/Amf/Response.php @@ -0,0 +1,193 @@ +_outputStream = new Zend_Amf_Parse_OutputStream(); + $this->writeMessage($this->_outputStream); + return $this; + } + + /** + * Serialize the PHP data types back into Actionscript and + * create and AMF stream. + * + * @param Zend_Amf_Parse_OutputStream $stream + * @return Zend_Amf_Response + */ + public function writeMessage(Zend_Amf_Parse_OutputStream $stream) + { + $objectEncoding = $this->_objectEncoding; + + //Write encoding to start of stream. Preamble byte is written of two byte Unsigned Short + $stream->writeByte(0x00); + $stream->writeByte($objectEncoding); + + // Loop through the AMF Headers that need to be returned. + $headerCount = count($this->_headers); + $stream->writeInt($headerCount); + foreach ($this->getAmfHeaders() as $header) { + $serializer = new Zend_Amf_Parse_Amf0_Serializer($stream); + $stream->writeUTF($header->name); + $stream->writeByte($header->mustRead); + $stream->writeLong(Zend_Amf_Constants::UNKNOWN_CONTENT_LENGTH); + $serializer->writeTypeMarker($header->data); + } + + // loop through the AMF bodies that need to be returned. + $bodyCount = count($this->_bodies); + $stream->writeInt($bodyCount); + foreach ($this->_bodies as $body) { + $serializer = new Zend_Amf_Parse_Amf0_Serializer($stream); + $stream->writeUTF($body->getTargetURI()); + $stream->writeUTF($body->getResponseURI()); + $stream->writeLong(Zend_Amf_Constants::UNKNOWN_CONTENT_LENGTH); + if($this->_objectEncoding == Zend_Amf_Constants::AMF0_OBJECT_ENCODING) { + $serializer->writeTypeMarker($body->getData()); + } else { + // Content is AMF3 + $serializer->writeTypeMarker($body->getData(),Zend_Amf_Constants::AMF0_AMF3); + } + } + + return $this; + } + + /** + * Return the output stream content + * + * @return string The contents of the output stream + */ + public function getResponse() + { + return $this->_outputStream->getStream(); + } + + /** + * Return the output stream content + * + * @return string + */ + public function __toString() + { + return $this->getResponse(); + } + + /** + * Add an AMF body to be sent to the Flash Player + * + * @param Zend_Amf_Value_MessageBody $body + * @return Zend_Amf_Response + */ + public function addAmfBody(Zend_Amf_Value_MessageBody $body) + { + $this->_bodies[] = $body; + return $this; + } + + /** + * Return an array of AMF bodies to be serialized + * + * @return array + */ + public function getAmfBodies() + { + return $this->_bodies; + } + + /** + * Add an AMF Header to be sent back to the flash player + * + * @param Zend_Amf_Value_MessageHeader $header + * @return Zend_Amf_Response + */ + public function addAmfHeader(Zend_Amf_Value_MessageHeader $header) + { + $this->_headers[] = $header; + return $this; + } + + /** + * Retrieve attached AMF message headers + * + * @return array Array of Zend_Amf_Value_MessageHeader objects + */ + public function getAmfHeaders() + { + return $this->_headers; + } + + /** + * Set the AMF encoding that will be used for serialization + * + * @param int $encoding + * @return Zend_Amf_Response + */ + public function setObjectEncoding($encoding) + { + $this->_objectEncoding = $encoding; + return $this; + } +} diff --git a/libs/Zend/Amf/Response/Http.php b/libs/Zend/Amf/Response/Http.php new file mode 100644 index 0000000..5003c2d --- /dev/null +++ b/libs/Zend/Amf/Response/Http.php @@ -0,0 +1,47 @@ + method pairs + * @var array + */ + protected $_table = array(); + + /** + * Set production flag + * + * @param bool $flag + * @return Zend_Amf_Server + */ + public function setProduction($flag) + { + $this->_production = (bool) $flag; + return $this; + } + + /** + * Whether or not the server is in production + * + * @return bool + */ + public function isProduction() + { + return $this->_production; + } + + + /** + * Loads a remote class or method and executes the function and returns + * the result + * + * @param string $method Is the method to execute + * @param mixed $param values for the method + * @return mixed $response the result of executing the method + * @throws Zend_Amf_Server_Exception + */ + protected function _dispatch($method, $params = null, $source = null) + { + if (!isset($this->_table[$method])) { + // if source is null a method that was not defined was called. + if ($source) { + $classPath = array(); + $path = explode('.', $source); + $className = array_pop($path); + $uriclasspath = implode('/', $path); + + // Take the user supplied directories and add the unique service path to the end. + foreach ($this->_directories as $dir) { + $classPath[] = $dir . $uriclasspath; + } + + require_once('Zend/Loader.php'); + try { + Zend_Loader::loadClass($className, $classPath); + } catch (Exception $e) { + require_once 'Zend/Amf/Server/Exception.php'; + throw new Zend_Amf_Server_Exception('Class "' . $className . '" does not exist'); + } + // Add the new loaded class to the server. + $this->setClass($className); + } else { + require_once 'Zend/Amf/Server/Exception.php'; + throw new Zend_Amf_Server_Exception('Method "' . $method . '" does not exist'); + } + } + + $info = $this->_table[$method]; + $argv = $info->getInvokeArguments(); + if (0 < count($argv)) { + $params = array_merge($params, $argv); + } + + if ($info instanceof Zend_Server_Reflection_Function) { + $func = $info->getName(); + $return = call_user_func_array($func, $params); + } elseif ($info instanceof Zend_Server_Reflection_Method) { + // Get class + $class = $info->getDeclaringClass()->getName(); + if ('static' == $info->isStatic()) { + // for some reason, invokeArgs() does not work the same as + // invoke(), and expects the first argument to be an object. + // So, using a callback if the method is static. + $return = call_user_func_array(array($class, $info->getName()), $params); + } else { + // Object methods + try { + $object = $info->getDeclaringClass()->newInstance(); + } catch (Exception $e) { + require_once 'Zend/Amf/Server/Exception.php'; + throw new Zend_Amf_Server_Exception('Error instantiating class ' . $class . ' to invoke method ' . $info->getName(), 621); + } + $return = $info->invokeArgs($object, $params); + } + } else { + require_once 'Zend/Amf/Server/Exception.php'; + throw new Zend_Amf_Server_Exception('Method missing implementation ' . get_class($info)); + } + + return $return; + } + + /** + * Handles each of the 11 different command message types. + * + * A command message is a flex.messaging.messages.CommandMessage + * + * @see Zend_Amf_Value_Messaging_CommandMessage + * @param Zend_Amf_Value_Messaging_CommandMessage $message + * @return Zend_Amf_Value_Messaging_AcknowledgeMessage + */ + protected function _loadCommandMessage(Zend_Amf_Value_Messaging_CommandMessage $message) + { + switch($message->operation) { + case Zend_Amf_Value_Messaging_CommandMessage::CLIENT_PING_OPERATION : + require_once 'Zend/Amf/Value/Messaging/AcknowledgeMessage.php'; + $return = new Zend_Amf_Value_Messaging_AcknowledgeMessage($message); + break; + default : + require_once 'Zend/Amf/Server/Exception.php'; + throw new Zend_Amf_Server_Exception('CommandMessage::' . $message->operation . ' not implemented'); + break; + } + return $return; + } + + /** + * Takes the deserialized AMF request and performs any operations. + * + * @todo should implement and SPL observer pattern for custom AMF headers + * @todo implement AMF header authentication + * @param Zend_Amf_Request $request + * @return Zend_Amf_Response + * @throws Zend_Amf_server_Exception|Exception + */ + protected function _handle(Zend_Amf_Request $request) + { + // Get the object encoding of the request. + $objectEncoding = $request->getObjectEncoding(); + + // create a response object to place the output from the services. + $response = $this->getResponse(); + + // set reponse encoding + $response->setObjectEncoding($objectEncoding); + + $responseBody = $request->getAmfBodies(); + + // Iterate through each of the service calls in the AMF request + foreach($responseBody as $body) + { + try { + if ($objectEncoding == Zend_Amf_Constants::AMF0_OBJECT_ENCODING) { + // AMF0 Object Encoding + $targetURI = $body->getTargetURI(); + + // Split the target string into its values. + $source = substr($targetURI, 0, strrpos($targetURI, '.')); + + if ($source) { + // Break off method name from namespace into source + $method = substr(strrchr($targetURI, '.'), 1); + $return = $this->_dispatch($method, $body->getData(), $source); + } else { + // Just have a method name. + $return = $this->_dispatch($targetURI, $body->getData()); + } + } else { + // AMF3 read message type + $message = $body->getData(); + if ($message instanceof Zend_Amf_Value_Messaging_CommandMessage) { + // async call with command message + $return = $this->_loadCommandMessage($message); + } elseif ($message instanceof Zend_Amf_Value_Messaging_RemotingMessage) { + require_once 'Zend/Amf/Value/Messaging/AcknowledgeMessage.php'; + $return = new Zend_Amf_Value_Messaging_AcknowledgeMessage($message); + $return->body = $this->_dispatch($message->operation, $message->body, $message->source); + } else { + // Amf3 message sent with netConnection + $targetURI = $body->getTargetURI(); + + // Split the target string into its values. + $source = substr($targetURI, 0, strrpos($targetURI, '.')); + + if ($source) { + // Break off method name from namespace into source + $method = substr(strrchr($targetURI, '.'), 1); + $return = $this->_dispatch($method, array($body->getData()), $source); + } else { + // Just have a method name. + $return = $this->_dispatch($targetURI, $body->getData()); + } + } + } + $responseType = Zend_AMF_Constants::RESULT_METHOD; + } catch (Exception $e) { + switch ($objectEncoding) { + case Zend_Amf_Constants::AMF0_OBJECT_ENCODING : + $return = array( + 'description' => ($this->isProduction()) ? '' : $e->getMessage(), + 'detail' => ($this->isProduction()) ? '' : $e->getTraceAsString(), + 'line' => ($this->isProduction()) ? 0 : $e->getLine(), + 'code' => $e->getCode(), + ); + break; + 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() ? '' : $e->getMessage(); + $return->faultCode = $e->getCode(); + $return->faultDetail = $this->isProduction() ? '' : $e->getTraceAsString(); + break; + } + $responseType = Zend_AMF_Constants::STATUS_METHOD; + } + + $responseURI = $body->getResponseURI() . $responseType; + $newBody = new Zend_Amf_Value_MessageBody($responseURI, null, $return); + $response->addAmfBody($newBody); + } + + // serialize the response and return serialized body. + $response->finalize(); + } + + /** + * Handle an AMF call from the gateway. + * + * @param null|Zend_Amf_Request $request Optional + * @return Zend_Amf_Response + */ + public function handle($request = null) + { + // Check if request was passed otherwise get it from the server + if (is_null($request) || !$request instanceof Zend_Amf_Request) { + $request = $this->getRequest(); + } else { + $this->setRequest($request); + } + + // Check for errors that may have happend in deserialization of Request. + try { + // Take converted PHP objects and handle service call. + // Serialize to Zend_Amf_response for output stream + $this->_handle($request); + $response = $this->getResponse(); + } catch (Exception $e) { + // Handle any errors in the serialization and service calls. + require_once 'Zend/Amf/Server/Exception.php'; + throw new Zend_Amf_Server_Exception('Handle error: ' . $e->getMessage() . ' ' . $e->getLine()); + } + + // Return the Amf serialized output string + return $response; + } + + /** + * Set request object + * + * @param string|Zend_Amf_Request $request + * @return Zend_Amf_Server + */ + public function setRequest($request) + { + if (is_string($request) && class_exists($request)) { + $request = new $request(); + if (!$request instanceof Zend_Amf_Request) { + require_once 'Zend/Amf/Server/Exception.php'; + throw new Zend_Amf_Server_Exception('Invalid request class'); + } + } elseif (!$request instanceof Zend_Amf_Request) { + require_once 'Zend/Amf/Server/Exception.php'; + throw new Zend_Amf_Server_Exception('Invalid request object'); + } + $this->_request = $request; + return $this; + } + + /** + * Return currently registered request object + * + * @return null|Zend_Amf_Request + */ + public function getRequest() + { + if (null === $this->_request) { + require_once 'Zend/Amf/Request/Http.php'; + $this->setRequest(new Zend_Amf_Request_Http()); + } + + return $this->_request; + } + + /** + * Public access method to private Zend_Amf_Server_Response refrence + * + * @param string|Zend_Amf_Server_Response $response + * @return Zend_Amf_Server + */ + public function setResponse($response) + { + if (is_string($response) && class_exists($response)) { + $response = new $response(); + if (!$response instanceof Zend_Amf_Response) { + require_once 'Zend/Amf/Server/Exception.php'; + throw new Zend_Amf_Server_Exception('Invalid response class'); + } + } elseif (!$response instanceof Zend_Amf_Response) { + require_once 'Zend/Amf/Server/Exception.php'; + throw new Zend_Amf_Server_Exception('Invalid response object'); + } + $this->_response = $response; + return $this; + } + + /** + * get a refrence to the Zend_Amf_response instance + * + * @return Zend_Amf_Server_Response + */ + public function getResponse() + { + if (null === ($response = $this->_response)) { + require_once 'Zend/Amf/Response/Http.php'; + $this->setResponse(new Zend_Amf_Response_Http()); + } + return $this->_response; + } + + /** + * Add a file system path to a directory of services. + * @param string|array $path + */ + public function setClassPath($path) + { + + } + + /** + * Attach a class or object to the server + * + * Class may be either a class name or an instantiated object. Reflection + * is done on the class or object to determine the available public + * methods, and each is attached to the server as and available method. If + * a $namespace has been provided, that namespace is used to prefix + * AMF service call. + * + * @param string|object $class + * @param string $namespace Optional + * @param mixed $arg Optional arguments to pass to a method + * @return Zend_Amf_Server + * @throws Zend_Amf_Server_Exception on invalid input + */ + public function setClass($class, $namespace = '', $argv = null) + { + if (is_string($class) && !class_exists($class)){ + require_once 'Zend/Amf/Server/Exception.php'; + throw new Zend_Amf_Server_Exception('Invalid method or class'); + } elseif (!is_string($class) && !is_object($class)) { + require_once 'Zend/Amf/Server/Exception.php'; + throw new Zend_Amf_Server_Exception('Invalid method or class; must be a classname or object'); + } + + $argv = null; + if (3 < func_num_args()) { + $argv = array_slice(func_get_args(), 2); + } + + $this->_methods[] = Zend_Server_Reflection::reflectClass($class, $argv, $namespace); + $this->_buildDispatchTable(); + + return $this; + } + + /** + * Attach a function to the server + * + * Additional arguments to pass to the function at dispatch may be passed; + * any arguments following the namespace will be aggregated and passed at + * dispatch time. + * + * @param string|array $function Valid callback + * @param string $namespace Optional namespace prefix + * @return Zend_Amf_Server + * @throws Zend_Amf_Server_Exception + */ + public function addFunction($function, $namespace = '') + { + if (!is_string($function) && !is_array($function)) { + require_once 'Zend/Amf/Server/Exception.php'; + throw new Zend_Amf_Server_Exception('Unable to attach function'); + } + + $argv = null; + if (2 < func_num_args()) { + $argv = array_slice(func_get_args(), 2); + } + + $function = (array) $function; + foreach ($function as $func) { + if (!is_string($func) || !function_exists($func)) { + require_once 'Zend/Amf/Server/Exception.php'; + throw new Zend_Amf_Server_Exception('Unable to attach function'); + } + $this->_methods[] = Zend_Server_Reflection::reflectFunction($func, $argv, $namespace); + } + + $this->_buildDispatchTable(); + return $this; + } + + + /** + * Creates an array of directories in which services can reside. + * + * @param string $dir + */ + public function addDirectory($dir) + { + $this->_directories[] = $dir; + } + + /** + * Returns an array of directories that can hold services. + * + * @return array + */ + public function getDirectory() + { + return $_directory; + } + + /** + * (Re)Build the dispatch table + * + * The dispatch table consists of a an array of method name => + * Zend_Server_Reflection_Function_Abstract pairs + * + * @return void + */ + protected function _buildDispatchTable() + { + $table = array(); + foreach ($this->_methods as $key => $dispatchable) { + if ($dispatchable instanceof Zend_Server_Reflection_Function_Abstract) { + $ns = $dispatchable->getNamespace(); + $name = $dispatchable->getName(); + $name = empty($ns) ? $name : $ns . '.' . $name; + + if (isset($table[$name])) { + require_once 'Zend/Amf/Server/Exception.php'; + throw new Zend_Amf_Server_Exception('Duplicate method registered: ' . $name); + } + $table[$name] = $dispatchable; + continue; + } + + if ($dispatchable instanceof Zend_Server_Reflection_Class) { + foreach ($dispatchable->getMethods() as $method) { + $ns = $method->getNamespace(); + $name = $method->getName(); + $name = empty($ns) ? $name : $ns . '.' . $name; + + if (isset($table[$name])) { + require_once 'Zend/Amf/Server/Exception.php'; + throw new Zend_Amf_Server_Exception('Duplicate method registered: ' . $name); + } + $table[$name] = $method; + continue; + } + } + } + $this->_table = $table; + } + + /** + * Raise a server fault + * + * Unimplemented + * + * @param string|Exception $fault + * @return void + */ + public function fault($fault = null, $code = 404) + { + } + + /** + * Returns a list of registered methods + * + * Returns an array of dispatchables (Zend_Server_Reflection_Function, + * _Method, and _Class items). + * + * @return array + */ + public function getFunctions() + { + return $this->_table; + } + + /** + * Set server persistence + * + * Unimplemented + * + * @param mixed $mode + * @return void + */ + public function setPersistence($mode) + { + } + + /** + * Load server definition + * + * Unimplemented + * + * @param array $definition + * @return void + */ + public function loadFunctions($definition) + { + } + + /** + * Map ActionScript classes to PHP classes + * + * @param string $asClass + * @param string $phpClass + * @return Zend_Amf_Server + */ + public function setClassMap($asClass, $phpClass) + { + require_once 'Zend/Amf/Parse/TypeLoader.php'; + Zend_Amf_Parse_TypeLoader::setMapping($asClass, $phpClass); + return $this; + } + + /** + * List all available methods + * + * Returns an array of method names. + * + * @return array + */ + public function listMethods() + { + return array_keys($this->_table); + } +} diff --git a/libs/Zend/Amf/Server/Exception.php b/libs/Zend/Amf/Server/Exception.php new file mode 100644 index 0000000..57e0f54 --- /dev/null +++ b/libs/Zend/Amf/Server/Exception.php @@ -0,0 +1,35 @@ +_stream = $stream; + $this->_needle = 0; + $this->_streamLength = strlen($stream); + $testEndian = unpack("C*", pack("S*", 256)); + $this->_bigEndian = 1; + } + + /** + * Returns the current stream + * + * @return string + */ + public function getStream() + { + return $this->_stream; + } + + /** + * Read the number of bytes in a row for the length supplied. + * + * @todo Should check that there are enough bytes left in the stream we are about to read. + * @param int $length + * @return string + * @throws Zend_Amf_Exception for buffer underrun + */ + public function readBytes($length) + { + if (($length + $this->_needle) > strlen($this->_stream)) { + require_once 'Zend/Amf/Exception.php'; + throw new Zend_Amf_Exception("Buffer underrun at needle position: " . $this->_needle . " while requesting length: " . $length); + } + $bytes = substr($this->_stream, $this->_needle, $length); + $this->_needle += $length; + return $bytes; + } + + /** + * Write any length of bytes to the stream + * + * Usually a string. + * + * @param string $bytes + * @return Zend_Amf_Util_BinaryStream + */ + public function writeBytes($bytes) + { + $this->_stream .= $bytes; + return $this; + } + + /** + * Reads a signed byte + * + * @return int Value is in the range of -128 to 127. + */ + public function readByte() + { + $byte = ord($this->_stream[$this->_needle++]); + return $byte; + } + + /** + * Writes the passed string into a signed byte on the stream. + * + * @param string $stream + * @return Zend_Amf_Util_BinaryStream + */ + public function writeByte($stream) + { + $this->_stream .= pack("c",$stream); + return $this; + } + + /** + * Reads a signed 32-bit integer from the data stream. + * + * @return int Value is in the range of -2147483648 to 2147483647 + */ + public function readInt() + { + $int = ($this->readByte() << 8) + $this->readByte(); + return $int; + } + + /** + * Write an the integer to the output stream as a 32 bit signed integer + * + * @param int $stream + * @return Zend_Amf_Util_BinaryStream + */ + public function writeInt($stream) + { + $this->_stream .= pack("n", $stream); + return $this; + } + + /** + * Reads a UTF-8 string from the data stream + * + * @return string A UTF-8 string produced by the byte representation of characters + */ + public function readUtf() + { + $length = $this->readInt(); + return $this->readBytes($length); + } + + /** + * Wite a UTF-8 string to the outputstream + * + * @param string $stream + * @return Zend_Amf_Util_BinaryStream + */ + public function writeUtf($stream) + { + $this->writeInt(strlen($stream)); + $this->_stream .= $stream; + return $this; + } + + + /** + * Read a long UTF string + * + * @return string + */ + public function readLongUtf() + { + $length = $this->readLong(); + return $this->readBytes($length); + } + + /** + * Write a long UTF string to the buffer + * + * @param string $stream + * @return Zend_Amf_Util_BinaryStream + */ + public function writeLongUtf($stream) + { + $this->writeLong(strlen($stream)); + $this->_stream .= $stream; + } + + /** + * Read a long numeric value + * + * @return double + */ + public function readLong() + { + $long = ($this->readByte() << 24) + ($this->readByte() << 16) + ($this->readByte() << 8) + $this->readByte(); + return $long; + } + + /** + * Write long numeric value to output stream + * + * @param int|string $stream + * @return Zend_Amf_Util_BinaryStream + */ + public function writeLong($stream) + { + $this->_stream .= pack("N",$stream); + return $this; + } + + /** + * Read a 16 bit unsigned short. + * + * @todo This could use the unpack() w/ S,n, or v + * @return double + */ + public function readUnsignedShort() + { + $byte1 = $this->readByte(); + $byte2 = $this->readByte(); + $short = (($byte1 << 8) | $byte2); + return $short; + } + + /** + * Reads an IEEE 754 double-precision floating point number from the data stream. + * + * @return double Floating point number + */ + public function readDouble() + { + $bytes = substr($this->_stream, $this->_needle, 8); + $this->_needle += 8; + $double = unpack("dflt", strrev($bytes)); + return $double['flt']; + } + + /** + * Writes an IEEE 754 double-precision floating point number from the data stream. + * + * @param string|double $stream + * @return Zend_Amf_Util_BinaryStream + */ + public function writeDouble($stream) + { + $stream = pack("d", $stream); + if ($this->_bigEndian) { + $stream = strrev($stream); + } + $this->_stream .= $stream; + return $this; + } +} diff --git a/libs/Zend/Amf/Value/ByteArray.php b/libs/Zend/Amf/Value/ByteArray.php new file mode 100644 index 0000000..7f25e29 --- /dev/null +++ b/libs/Zend/Amf/Value/ByteArray.php @@ -0,0 +1,57 @@ +_data = $data; + } + + /** + * Return the byte stream + * + * @return string + */ + public function getData() + { + return $this->_data; + } +} diff --git a/libs/Zend/Amf/Value/MessageBody.php b/libs/Zend/Amf/Value/MessageBody.php new file mode 100644 index 0000000..b92bcb3 --- /dev/null +++ b/libs/Zend/Amf/Value/MessageBody.php @@ -0,0 +1,181 @@ + + * 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-2008 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 new file mode 100644 index 0000000..2b95a68 --- /dev/null +++ b/libs/Zend/Amf/Value/MessageHeader.php @@ -0,0 +1,80 @@ +name = $name; + $this->mustRead = (bool) $mustRead; + $this->data = $data; + if (null !== $length) { + $this->length = (int) $length; + } + } +} diff --git a/libs/Zend/Amf/Value/Messaging/AbstractMessage.php b/libs/Zend/Amf/Value/Messaging/AbstractMessage.php new file mode 100644 index 0000000..69a3e28 --- /dev/null +++ b/libs/Zend/Amf/Value/Messaging/AbstractMessage.php @@ -0,0 +1,91 @@ +clientId = $this->generateId(); + $this->destination = null; + $this->messageId = $this->generateId(); + $this->timestamp = time().'00'; + $this->timeToLive = 0; + $this->headers = new STDClass(); + $this->body = null; + + // correleate the two messages + if ($message) { + $this->correlationId = $message->messageId; + } + } +} diff --git a/libs/Zend/Amf/Value/Messaging/AsyncMessage.php b/libs/Zend/Amf/Value/Messaging/AsyncMessage.php new file mode 100644 index 0000000..453ce9a --- /dev/null +++ b/libs/Zend/Amf/Value/Messaging/AsyncMessage.php @@ -0,0 +1,42 @@ +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 new file mode 100644 index 0000000..c80a1b5 --- /dev/null +++ b/libs/Zend/Amf/Value/Messaging/ErrorMessage.php @@ -0,0 +1,66 @@ +clientId = $this->generateId(); + $this->destination = null; + $this->messageId = $this->generateId(); + $this->timestamp = time().'00'; + $this->timeToLive = 0; + $this->headers = new stdClass(); + $this->body = null; + } +} diff --git a/libs/Zend/Amf/Value/TraitsInfo.php b/libs/Zend/Amf/Value/TraitsInfo.php new file mode 100644 index 0000000..8714029 --- /dev/null +++ b/libs/Zend/Amf/Value/TraitsInfo.php @@ -0,0 +1,153 @@ +_className = $className; + $this->_dynamic = $dynamic; + $this->_externalizable = $externalizable; + $this->_properties = $properties; + } + + /** + * Test if the class is a dynamic class + * + * @return boolean + */ + public function isDynamic() + { + return $this->_dynamic; + } + + /** + * Test if class is externalizable + * + * @return boolean + */ + public function isExternalizable() + { + return $this->_externalizable; + } + + /** + * Return the number of properties in the class + * + * @return int + */ + public function length() + { + return count($this->_properties); + } + + /** + * Return the class name + * + * @return string + */ + public function getClassName() + { + return $this->_className; + } + + /** + * Add an additional property + * + * @param string $name + * @return Zend_Amf_Value_TraitsInfo + */ + public function addProperty($name) + { + $this->_properties[] = $name; + return $this; + } + + /** + * Add all properties of the class. + * + * @param array $props + * @return Zend_Amf_Value_TraitsInfo + */ + public function addAllProperties(array $props) + { + $this->_properties = $props; + return $this; + } + + /** + * Get the property at a given index + * + * @param int $index + * @return string + */ + public function getProperty($index) + { + return $this->_properties[(int) $index]; + } + + /** + * Return all properties of the class. + * + * @return array + */ + public function getAllProperties() + { + return $this->_properties; + } +} diff --git a/libs/Zend/Auth.php b/libs/Zend/Auth.php new file mode 100644 index 0000000..15cfaca --- /dev/null +++ b/libs/Zend/Auth.php @@ -0,0 +1,161 @@ +_storage) { + /** + * @see Zend_Auth_Storage_Session + */ + require_once 'Zend/Auth/Storage/Session.php'; + $this->setStorage(new Zend_Auth_Storage_Session()); + } + + return $this->_storage; + } + + /** + * Sets the persistent storage handler + * + * @param Zend_Auth_Storage_Interface $storage + * @return Zend_Auth Provides a fluent interface + */ + public function setStorage(Zend_Auth_Storage_Interface $storage) + { + $this->_storage = $storage; + return $this; + } + + /** + * Authenticates against the supplied adapter + * + * @param Zend_Auth_Adapter_Interface $adapter + * @return Zend_Auth_Result + */ + public function authenticate(Zend_Auth_Adapter_Interface $adapter) + { + $result = $adapter->authenticate(); + + if ($result->isValid()) { + $this->getStorage()->write($result->getIdentity()); + } + + return $result; + } + + /** + * Returns true if and only if an identity is available from storage + * + * @return boolean + */ + public function hasIdentity() + { + return !$this->getStorage()->isEmpty(); + } + + /** + * Returns the identity from storage or null if no identity is available + * + * @return mixed|null + */ + public function getIdentity() + { + $storage = $this->getStorage(); + + if ($storage->isEmpty()) { + return null; + } + + return $storage->read(); + } + + /** + * Clears the identity from persistent storage + * + * @return void + */ + public function clearIdentity() + { + $this->getStorage()->clear(); + } +} diff --git a/libs/Zend/Auth/Adapter/DbTable.php b/libs/Zend/Auth/Adapter/DbTable.php new file mode 100644 index 0000000..af90599 --- /dev/null +++ b/libs/Zend/Auth/Adapter/DbTable.php @@ -0,0 +1,461 @@ +_zendDb = $zendDb; + + if (null !== $tableName) { + $this->setTableName($tableName); + } + + if (null !== $identityColumn) { + $this->setIdentityColumn($identityColumn); + } + + if (null !== $credentialColumn) { + $this->setCredentialColumn($credentialColumn); + } + + if (null !== $credentialTreatment) { + $this->setCredentialTreatment($credentialTreatment); + } + } + + /** + * setTableName() - set the table name to be used in the select query + * + * @param string $tableName + * @return Zend_Auth_Adapter_DbTable Provides a fluent interface + */ + public function setTableName($tableName) + { + $this->_tableName = $tableName; + return $this; + } + + /** + * setIdentityColumn() - set the column name to be used as the identity column + * + * @param string $identityColumn + * @return Zend_Auth_Adapter_DbTable Provides a fluent interface + */ + public function setIdentityColumn($identityColumn) + { + $this->_identityColumn = $identityColumn; + return $this; + } + + /** + * setCredentialColumn() - set the column name to be used as the credential column + * + * @param string $credentialColumn + * @return Zend_Auth_Adapter_DbTable Provides a fluent interface + */ + public function setCredentialColumn($credentialColumn) + { + $this->_credentialColumn = $credentialColumn; + return $this; + } + + /** + * setCredentialTreatment() - allows the developer to pass a parameterized string that is + * used to transform or treat the input credential data + * + * In many cases, passwords and other sensitive data are encrypted, hashed, encoded, + * obscured, or otherwise treated through some function or algorithm. By specifying a + * parameterized treatment string with this method, a developer may apply arbitrary SQL + * upon input credential data. + * + * Examples: + * + * 'PASSWORD(?)' + * 'MD5(?)' + * + * @param string $treatment + * @return Zend_Auth_Adapter_DbTable Provides a fluent interface + */ + public function setCredentialTreatment($treatment) + { + $this->_credentialTreatment = $treatment; + return $this; + } + + /** + * setIdentity() - set the value to be used as the identity + * + * @param string $value + * @return Zend_Auth_Adapter_DbTable Provides a fluent interface + */ + public function setIdentity($value) + { + $this->_identity = $value; + return $this; + } + + /** + * setCredential() - set the credential value to be used, optionally can specify a treatment + * to be used, should be supplied in parameterized form, such as 'MD5(?)' or 'PASSWORD(?)' + * + * @param string $credential + * @return Zend_Auth_Adapter_DbTable Provides a fluent interface + */ + public function setCredential($credential) + { + $this->_credential = $credential; + return $this; + } + + /** + * getResultRowObject() - Returns the result row as a stdClass object + * + * @param string|array $returnColumns + * @param string|array $omitColumns + * @return stdClass|boolean + */ + public function getResultRowObject($returnColumns = null, $omitColumns = null) + { + if (!$this->_resultRow) { + return false; + } + + $returnObject = new stdClass(); + + if (null !== $returnColumns) { + + $availableColumns = array_keys($this->_resultRow); + foreach ( (array) $returnColumns as $returnColumn) { + if (in_array($returnColumn, $availableColumns)) { + $returnObject->{$returnColumn} = $this->_resultRow[$returnColumn]; + } + } + return $returnObject; + + } elseif (null !== $omitColumns) { + + $omitColumns = (array) $omitColumns; + foreach ($this->_resultRow as $resultColumn => $resultValue) { + if (!in_array($resultColumn, $omitColumns)) { + $returnObject->{$resultColumn} = $resultValue; + } + } + return $returnObject; + + } else { + + foreach ($this->_resultRow as $resultColumn => $resultValue) { + $returnObject->{$resultColumn} = $resultValue; + } + return $returnObject; + + } + } + + /** + * authenticate() - defined by Zend_Auth_Adapter_Interface. This method is called to + * attempt an authenication. Previous to this call, this adapter would have already + * been configured with all nessissary information to successfully connect to a database + * table and attempt to find a record matching the provided identity. + * + * @throws Zend_Auth_Adapter_Exception if answering the authentication query is impossible + * @return Zend_Auth_Result + */ + public function authenticate() + { + $this->_authenticateSetup(); + $dbSelect = $this->_authenticateCreateSelect(); + $resultIdentities = $this->_authenticateQuerySelect($dbSelect); + + if ( ($authResult = $this->_authenticateValidateResultset($resultIdentities)) instanceof Zend_Auth_Result) { + return $authResult; + } + + $authResult = $this->_authenticateValidateResult(array_shift($resultIdentities)); + return $authResult; + } + + /** + * _authenticateSetup() - This method abstracts the steps involved with making sure + * that this adapter was indeed setup properly with all required peices of information. + * + * @throws Zend_Auth_Adapter_Exception - in the event that setup was not done properly + * @return true + */ + protected function _authenticateSetup() + { + $exception = null; + + if ($this->_tableName == '') { + $exception = 'A table must be supplied for the Zend_Auth_Adapter_DbTable authentication adapter.'; + } elseif ($this->_identityColumn == '') { + $exception = 'An identity column must be supplied for the Zend_Auth_Adapter_DbTable authentication adapter.'; + } elseif ($this->_credentialColumn == '') { + $exception = 'A credential column must be supplied for the Zend_Auth_Adapter_DbTable authentication adapter.'; + } elseif ($this->_identity == '') { + $exception = 'A value for the identity was not provided prior to authentication with Zend_Auth_Adapter_DbTable.'; + } elseif ($this->_credential === null) { + $exception = 'A credential value was not provided prior to authentication with Zend_Auth_Adapter_DbTable.'; + } + + if (null !== $exception) { + /** + * @see Zend_Auth_Adapter_Exception + */ + require_once 'Zend/Auth/Adapter/Exception.php'; + throw new Zend_Auth_Adapter_Exception($exception); + } + + $this->_authenticateResultInfo = array( + 'code' => Zend_Auth_Result::FAILURE, + 'identity' => $this->_identity, + 'messages' => array() + ); + + return true; + } + + /** + * _authenticateCreateSelect() - This method creates a Zend_Db_Select object that + * is completely configured to be queried against the database. + * + * @return Zend_Db_Select + */ + protected function _authenticateCreateSelect() + { + // build credential expression + if (empty($this->_credentialTreatment) || (strpos($this->_credentialTreatment, "?") === false)) { + $this->_credentialTreatment = '?'; + } + + $credentialExpression = new Zend_Db_Expr( + '(CASE WHEN ' . + $this->_zendDb->quoteInto( + $this->_zendDb->quoteIdentifier($this->_credentialColumn, true) + . ' = ' . $this->_credentialTreatment, $this->_credential + ) + . ' THEN 1 ELSE 0 END) AS ' + . $this->_zendDb->quoteIdentifier('zend_auth_credential_match') + ); + + // get select + $dbSelect = $this->_zendDb->select(); + $dbSelect->from($this->_tableName, array('*', $credentialExpression)) + ->where($this->_zendDb->quoteIdentifier($this->_identityColumn, true) . ' = ?', $this->_identity); + + return $dbSelect; + } + + /** + * _authenticateQuerySelect() - This method accepts a Zend_Db_Select object and + * performs a query against the database with that object. + * + * @param Zend_Db_Select $dbSelect + * @throws Zend_Auth_Adapter_Exception - when a invalid select object is encoutered + * @return array + */ + protected function _authenticateQuerySelect(Zend_Db_Select $dbSelect) + { + try { + if ($this->_zendDb->getFetchMode() != Zend_DB::FETCH_ASSOC) { + $origDbFetchMode = $this->_zendDb->getFetchMode(); + $this->_zendDb->setFetchMode(Zend_DB::FETCH_ASSOC); + } + $resultIdentities = $this->_zendDb->fetchAll($dbSelect->__toString()); + if (isset($origDbFetchMode)) { + $this->_zendDb->setFetchMode($origDbFetchMode); + unset($origDbFetchMode); + } + } catch (Exception $e) { + /** + * @see Zend_Auth_Adapter_Exception + */ + require_once 'Zend/Auth/Adapter/Exception.php'; + throw new Zend_Auth_Adapter_Exception('The supplied parameters to Zend_Auth_Adapter_DbTable failed to ' + . 'produce a valid sql statement, please check table and column names ' + . 'for validity.'); + } + return $resultIdentities; + } + + /** + * _authenticateValidateResultSet() - This method attempts to make certian that only one + * record was returned in the result set + * + * @param array $resultIdentities + * @return true|Zend_Auth_Result + */ + 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.'; + return $this->_authenticateCreateAuthResult(); + } elseif (count($resultIdentities) > 1) { + $this->_authenticateResultInfo['code'] = Zend_Auth_Result::FAILURE_IDENTITY_AMBIGUOUS; + $this->_authenticateResultInfo['messages'][] = 'More than one record matches the supplied identity.'; + return $this->_authenticateCreateAuthResult(); + } + + return true; + } + + /** + * _authenticateValidateResult() - This method attempts to validate that the record in the + * result set is indeed a record that matched the identity provided to this adapter. + * + * @param array $resultIdentity + * @return Zend_Auth_Result + */ + protected function _authenticateValidateResult($resultIdentity) + { + if ($resultIdentity['zend_auth_credential_match'] != '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']); + $this->_resultRow = $resultIdentity; + + $this->_authenticateResultInfo['code'] = Zend_Auth_Result::SUCCESS; + $this->_authenticateResultInfo['messages'][] = 'Authentication successful.'; + return $this->_authenticateCreateAuthResult(); + } + + /** + * _authenticateCreateAuthResult() - This method creates a Zend_Auth_Result object + * from the information that has been collected during the authenticate() attempt. + * + * @return Zend_Auth_Result + */ + protected function _authenticateCreateAuthResult() + { + return new Zend_Auth_Result( + $this->_authenticateResultInfo['code'], + $this->_authenticateResultInfo['identity'], + $this->_authenticateResultInfo['messages'] + ); + } + +} diff --git a/libs/Zend/Auth/Adapter/Digest.php b/libs/Zend/Auth/Adapter/Digest.php new file mode 100644 index 0000000..56604e9 --- /dev/null +++ b/libs/Zend/Auth/Adapter/Digest.php @@ -0,0 +1,230 @@ +$methodName($$option); + } + } + } + + /** + * Returns the filename option value or null if it has not yet been set + * + * @return string|null + */ + public function getFilename() + { + return $this->_filename; + } + + /** + * Sets the filename option value + * + * @param mixed $filename + * @return Zend_Auth_Adapter_Digest Provides a fluent interface + */ + public function setFilename($filename) + { + $this->_filename = (string) $filename; + return $this; + } + + /** + * Returns the realm option value or null if it has not yet been set + * + * @return string|null + */ + public function getRealm() + { + return $this->_realm; + } + + /** + * Sets the realm option value + * + * @param mixed $realm + * @return Zend_Auth_Adapter_Digest Provides a fluent interface + */ + public function setRealm($realm) + { + $this->_realm = (string) $realm; + return $this; + } + + /** + * Returns the username option value or null if it has not yet been set + * + * @return string|null + */ + public function getUsername() + { + return $this->_username; + } + + /** + * Sets the username option value + * + * @param mixed $username + * @return Zend_Auth_Adapter_Digest Provides a fluent interface + */ + public function setUsername($username) + { + $this->_username = (string) $username; + return $this; + } + + /** + * Returns the password option value or null if it has not yet been set + * + * @return string|null + */ + public function getPassword() + { + return $this->_password; + } + + /** + * Sets the password option value + * + * @param mixed $password + * @return Zend_Auth_Adapter_Digest Provides a fluent interface + */ + public function setPassword($password) + { + $this->_password = (string) $password; + return $this; + } + + /** + * Defined by Zend_Auth_Adapter_Interface + * + * @throws Zend_Auth_Adapter_Exception + * @return Zend_Auth_Result + */ + public function authenticate() + { + $optionsRequired = array('filename', 'realm', 'username', 'password'); + foreach ($optionsRequired as $optionRequired) { + if (null === $this->{"_$optionRequired"}) { + /** + * @see Zend_Auth_Adapter_Exception + */ + require_once 'Zend/Auth/Adapter/Exception.php'; + throw new Zend_Auth_Adapter_Exception("Option '$optionRequired' must be set before authentication"); + } + } + + if (false === ($fileHandle = @fopen($this->_filename, 'r'))) { + /** + * @see Zend_Auth_Adapter_Exception + */ + require_once 'Zend/Auth/Adapter/Exception.php'; + throw new Zend_Auth_Adapter_Exception("Cannot open '$this->_filename' for reading"); + } + + $id = "$this->_username:$this->_realm"; + $idLength = strlen($id); + + $result = array( + 'code' => Zend_Auth_Result::FAILURE, + 'identity' => array( + 'realm' => $this->_realm, + 'username' => $this->_username, + ), + 'messages' => array() + ); + + while ($line = trim(fgets($fileHandle))) { + if (substr($line, 0, $idLength) === $id) { + if (substr($line, -32) === md5("$this->_username:$this->_realm:$this->_password")) { + $result['code'] = Zend_Auth_Result::SUCCESS; + } else { + $result['code'] = Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID; + $result['messages'][] = 'Password incorrect'; + } + return new Zend_Auth_Result($result['code'], $result['identity'], $result['messages']); + } + } + + $result['code'] = Zend_Auth_Result::FAILURE_IDENTITY_NOT_FOUND; + $result['messages'][] = "Username '$this->_username' and realm '$this->_realm' combination not found"; + return new Zend_Auth_Result($result['code'], $result['identity'], $result['messages']); + } +} diff --git a/libs/Zend/Auth/Adapter/Exception.php b/libs/Zend/Auth/Adapter/Exception.php new file mode 100644 index 0000000..9a938f3 --- /dev/null +++ b/libs/Zend/Auth/Adapter/Exception.php @@ -0,0 +1,38 @@ + 'basic'|'digest'|'basic digest' + * 'realm' => + * 'digest_domains' => Space-delimited list of URIs + * 'nonce_timeout' => + * 'use_opaque' => Whether to send the opaque value in the header + * 'alogrithm' => See $_supportedAlgos. Default: MD5 + * 'proxy_auth' => Whether to do authentication as a Proxy + * @throws Zend_Auth_Adapter_Exception + * @return void + */ + public function __construct(array $config) + { + if (!extension_loaded('hash')) { + /** + * @see Zend_Auth_Adapter_Exception + */ + require_once 'Zend/Auth/Adapter/Exception.php'; + throw new Zend_Auth_Adapter_Exception(__CLASS__ . ' requires the \'hash\' extension'); + } + + $this->_request = null; + $this->_response = null; + $this->_ieNoOpaque = false; + + + if (empty($config['accept_schemes'])) { + /** + * @see Zend_Auth_Adapter_Exception + */ + require_once 'Zend/Auth/Adapter/Exception.php'; + throw new Zend_Auth_Adapter_Exception('Config key \'accept_schemes\' is required'); + } + + $schemes = explode(' ', $config['accept_schemes']); + $this->_acceptSchemes = array_intersect($schemes, $this->_supportedSchemes); + if (empty($this->_acceptSchemes)) { + /** + * @see Zend_Auth_Adapter_Exception + */ + require_once 'Zend/Auth/Adapter/Exception.php'; + throw new Zend_Auth_Adapter_Exception('No supported schemes given in \'accept_schemes\'. Valid values: ' + . implode(', ', $this->_supportedSchemes)); + } + + // Double-quotes are used to delimit the realm string in the HTTP header, + // and colons are field delimiters in the password file. + if (empty($config['realm']) || + !ctype_print($config['realm']) || + strpos($config['realm'], ':') !== false || + strpos($config['realm'], '"') !== false) { + /** + * @see Zend_Auth_Adapter_Exception + */ + require_once 'Zend/Auth/Adapter/Exception.php'; + throw new Zend_Auth_Adapter_Exception('Config key \'realm\' is required, and must contain only printable ' + . 'characters, excluding quotation marks and colons'); + } else { + $this->_realm = $config['realm']; + } + + if (in_array('digest', $this->_acceptSchemes)) { + if (empty($config['digest_domains']) || + !ctype_print($config['digest_domains']) || + strpos($config['digest_domains'], '"') !== false) { + /** + * @see Zend_Auth_Adapter_Exception + */ + require_once 'Zend/Auth/Adapter/Exception.php'; + throw new Zend_Auth_Adapter_Exception('Config key \'digest_domains\' is required, and must contain ' + . 'only printable characters, excluding quotation marks'); + } else { + $this->_domains = $config['digest_domains']; + } + + if (empty($config['nonce_timeout']) || + !is_numeric($config['nonce_timeout'])) { + /** + * @see Zend_Auth_Adapter_Exception + */ + require_once 'Zend/Auth/Adapter/Exception.php'; + throw new Zend_Auth_Adapter_Exception('Config key \'nonce_timeout\' is required, and must be an ' + . 'integer'); + } else { + $this->_nonceTimeout = (int) $config['nonce_timeout']; + } + + // We use the opaque value unless explicitly told not to + if (isset($config['use_opaque']) && false == (bool) $config['use_opaque']) { + $this->_useOpaque = false; + } else { + $this->_useOpaque = true; + } + + if (isset($config['algorithm']) && in_array($config['algorithm'], $this->_supportedAlgos)) { + $this->_algo = $config['algorithm']; + } else { + $this->_algo = 'MD5'; + } + } + + // Don't be a proxy unless explicitly told to do so + if (isset($config['proxy_auth']) && true == (bool) $config['proxy_auth']) { + $this->_imaProxy = true; // I'm a Proxy + } else { + $this->_imaProxy = false; + } + } + + /** + * Setter for the _basicResolver property + * + * @param Zend_Auth_Adapter_Http_Resolver_Interface $resolver + * @return Zend_Auth_Adapter_Http Provides a fluent interface + */ + public function setBasicResolver(Zend_Auth_Adapter_Http_Resolver_Interface $resolver) + { + $this->_basicResolver = $resolver; + + return $this; + } + + /** + * Getter for the _basicResolver property + * + * @return Zend_Auth_Adapter_Http_Resolver_Interface + */ + public function getBasicResolver() + { + return $this->_basicResolver; + } + + /** + * Setter for the _digestResolver property + * + * @param Zend_Auth_Adapter_Http_Resolver_Interface $resolver + * @return Zend_Auth_Adapter_Http Provides a fluent interface + */ + public function setDigestResolver(Zend_Auth_Adapter_Http_Resolver_Interface $resolver) + { + $this->_digestResolver = $resolver; + + return $this; + } + + /** + * Getter for the _digestResolver property + * + * @return Zend_Auth_Adapter_Http_Resolver_Interface + */ + public function getDigestResolver() + { + return $this->_digestResolver; + } + + /** + * Setter for the Request object + * + * @param Zend_Controller_Request_Http $request + * @return Zend_Auth_Adapter_Http Provides a fluent interface + */ + public function setRequest(Zend_Controller_Request_Http $request) + { + $this->_request = $request; + + return $this; + } + + /** + * Getter for the Request object + * + * @return Zend_Controller_Request_Http + */ + public function getRequest() + { + return $this->_request; + } + + /** + * Setter for the Response object + * + * @param Zend_Controller_Response_Http $response + * @return Zend_Auth_Adapter_Http Provides a fluent interface + */ + public function setResponse(Zend_Controller_Response_Http $response) + { + $this->_response = $response; + + return $this; + } + + /** + * Getter for the Response object + * + * @return Zend_Controller_Response_Http + */ + public function getResponse() + { + return $this->_response; + } + + /** + * Authenticate + * + * @throws Zend_Auth_Adapter_Exception + * @return Zend_Auth_Result + */ + public function authenticate() + { + if (empty($this->_request) || + empty($this->_response)) { + /** + * @see Zend_Auth_Adapter_Exception + */ + require_once 'Zend/Auth/Adapter/Exception.php'; + throw new Zend_Auth_Adapter_Exception('Request and Response objects must be set before calling ' + . 'authenticate()'); + } + + if ($this->_imaProxy) { + $getHeader = 'Proxy-Authorization'; + } else { + $getHeader = 'Authorization'; + } + + $authHeader = $this->_request->getHeader($getHeader); + if (!$authHeader) { + return $this->_challengeClient(); + } + + list($clientScheme) = explode(' ', $authHeader); + $clientScheme = strtolower($clientScheme); + + // The server can issue multiple challenges, but the client should + // answer with only the selected auth scheme. + if (!in_array($clientScheme, $this->_supportedSchemes)) { + $this->_response->setHttpResponseCode(400); + return new Zend_Auth_Result( + Zend_Auth_Result::FAILURE_UNCATEGORIZED, + array(), + array('Client requested an incorrect or unsupported authentication scheme') + ); + } + + // client sent a scheme that is not the one required + if (!in_array($clientScheme, $this->_acceptSchemes)) { + // challenge again the client + return $this->_challengeClient(); + } + + switch ($clientScheme) { + case 'basic': + $result = $this->_basicAuth($authHeader); + break; + case 'digest': + $result = $this->_digestAuth($authHeader); + break; + default: + /** + * @see Zend_Auth_Adapter_Exception + */ + require_once 'Zend/Auth/Adapter/Exception.php'; + throw new Zend_Auth_Adapter_Exception('Unsupported authentication scheme'); + } + + return $result; + } + + /** + * Challenge Client + * + * Sets a 401 or 407 Unauthorized response code, and creates the + * appropriate Authenticate header(s) to prompt for credentials. + * + * @return Zend_Auth_Result Always returns a non-identity Auth result + */ + protected function _challengeClient() + { + if ($this->_imaProxy) { + $statusCode = 407; + $headerName = 'Proxy-Authenticate'; + } else { + $statusCode = 401; + $headerName = 'WWW-Authenticate'; + } + + $this->_response->setHttpResponseCode($statusCode); + + // Send a challenge in each acceptable authentication scheme + if (in_array('basic', $this->_acceptSchemes)) { + $this->_response->setHeader($headerName, $this->_basicHeader()); + } + if (in_array('digest', $this->_acceptSchemes)) { + $this->_response->setHeader($headerName, $this->_digestHeader()); + } + return new Zend_Auth_Result( + Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID, + array(), + array('Invalid or absent credentials; challenging client') + ); + } + + /** + * Basic Header + * + * Generates a Proxy- or WWW-Authenticate header value in the Basic + * authentication scheme. + * + * @return string Authenticate header value + */ + protected function _basicHeader() + { + return 'Basic realm="' . $this->_realm . '"'; + } + + /** + * Digest Header + * + * Generates a Proxy- or WWW-Authenticate header value in the Digest + * authentication scheme. + * + * @return string Authenticate header value + */ + protected function _digestHeader() + { + $wwwauth = 'Digest realm="' . $this->_realm . '", ' + . 'domain="' . $this->_domains . '", ' + . 'nonce="' . $this->_calcNonce() . '", ' + . ($this->_useOpaque ? 'opaque="' . $this->_calcOpaque() . '", ' : '') + . 'algorithm="' . $this->_algo . '", ' + . 'qop="' . implode(',', $this->_supportedQops) . '"'; + + return $wwwauth; + } + + /** + * Basic Authentication + * + * @param string $header Client's Authorization header + * @throws Zend_Auth_Adapter_Exception + * @return Zend_Auth_Result + */ + protected function _basicAuth($header) + { + if (empty($header)) { + /** + * @see Zend_Auth_Adapter_Exception + */ + require_once 'Zend/Auth/Adapter/Exception.php'; + throw new Zend_Auth_Adapter_Exception('The value of the client Authorization header is required'); + } + if (empty($this->_basicResolver)) { + /** + * @see Zend_Auth_Adapter_Exception + */ + require_once 'Zend/Auth/Adapter/Exception.php'; + throw new Zend_Auth_Adapter_Exception('A basicResolver object must be set before doing Basic ' + . 'authentication'); + } + + // Decode the Authorization header + $auth = substr($header, strlen('Basic ')); + $auth = base64_decode($auth); + if (!$auth) { + /** + * @see Zend_Auth_Adapter_Exception + */ + require_once 'Zend/Auth/Adapter/Exception.php'; + throw new Zend_Auth_Adapter_Exception('Unable to base64_decode Authorization header value'); + } + + // See ZF-1253. Validate the credentials the same way the digest + // implementation does. If invalid credentials are detected, + // re-challenge the client. + if (!ctype_print($auth)) { + return $this->_challengeClient(); + } + // Fix for ZF-1515: Now re-challenges on empty username or password + $creds = array_filter(explode(':', $auth)); + if (count($creds) != 2) { + return $this->_challengeClient(); + } + + $password = $this->_basicResolver->resolve($creds[0], $this->_realm); + if ($password && $password == $creds[1]) { + $identity = array('username'=>$creds[0], 'realm'=>$this->_realm); + return new Zend_Auth_Result(Zend_Auth_Result::SUCCESS, $identity); + } else { + return $this->_challengeClient(); + } + } + + /** + * Digest Authentication + * + * @param string $header Client's Authorization header + * @throws Zend_Auth_Adapter_Exception + * @return Zend_Auth_Result Valid auth result only on successful auth + */ + protected function _digestAuth($header) + { + if (empty($header)) { + /** + * @see Zend_Auth_Adapter_Exception + */ + require_once 'Zend/Auth/Adapter/Exception.php'; + throw new Zend_Auth_Adapter_Exception('The value of the client Authorization header is required'); + } + if (empty($this->_digestResolver)) { + /** + * @see Zend_Auth_Adapter_Exception + */ + require_once 'Zend/Auth/Adapter/Exception.php'; + throw new Zend_Auth_Adapter_Exception('A digestResolver object must be set before doing Digest authentication'); + } + + $data = $this->_parseDigestAuth($header); + if ($data === false) { + $this->_response->setHttpResponseCode(400); + return new Zend_Auth_Result( + Zend_Auth_Result::FAILURE_UNCATEGORIZED, + array(), + array('Invalid Authorization header format') + ); + } + + // See ZF-1052. This code was a bit too unforgiving of invalid + // usernames. Now, if the username is bad, we re-challenge the client. + if ('::invalid::' == $data['username']) { + return $this->_challengeClient(); + } + + // Verify that the client sent back the same nonce + if ($this->_calcNonce() != $data['nonce']) { + return $this->_challengeClient(); + } + // The opaque value is also required to match, but of course IE doesn't + // play ball. + if (!$this->_ieNoOpaque && $this->_calcOpaque() != $data['opaque']) { + return $this->_challengeClient(); + } + + // Look up the user's password hash. If not found, deny access. + // This makes no assumptions about how the password hash was + // constructed beyond that it must have been built in such a way as + // to be recreatable with the current settings of this object. + $ha1 = $this->_digestResolver->resolve($data['username'], $data['realm']); + if ($ha1 === false) { + return $this->_challengeClient(); + } + + // If MD5-sess is used, a1 value is made of the user's password + // hash with the server and client nonce appended, separated by + // colons. + if ($this->_algo == 'MD5-sess') { + $ha1 = hash('md5', $ha1 . ':' . $data['nonce'] . ':' . $data['cnonce']); + } + + // Calculate h(a2). The value of this hash depends on the qop + // option selected by the client and the supported hash functions + switch ($data['qop']) { + case 'auth': + $a2 = $this->_request->getMethod() . ':' . $data['uri']; + break; + case 'auth-int': + // Should be REQUEST_METHOD . ':' . uri . ':' . hash(entity-body), + // but this isn't supported yet, so fall through to default case + default: + /** + * @see Zend_Auth_Adapter_Exception + */ + require_once 'Zend/Auth/Adapter/Exception.php'; + throw new Zend_Auth_Adapter_Exception('Client requested an unsupported qop option'); + } + // Using hash() should make parameterizing the hash algorithm + // easier + $ha2 = hash('md5', $a2); + + + // Calculate the server's version of the request-digest. This must + // match $data['response']. See RFC 2617, section 3.2.2.1 + $message = $data['nonce'] . ':' . $data['nc'] . ':' . $data['cnonce'] . ':' . $data['qop'] . ':' . $ha2; + $digest = hash('md5', $ha1 . ':' . $message); + + // If our digest matches the client's let them in, otherwise return + // a 401 code and exit to prevent access to the protected resource. + if ($digest == $data['response']) { + $identity = array('username'=>$data['username'], 'realm'=>$data['realm']); + return new Zend_Auth_Result(Zend_Auth_Result::SUCCESS, $identity); + } else { + return $this->_challengeClient(); + } + } + + /** + * Calculate Nonce + * + * @return string The nonce value + */ + protected function _calcNonce() + { + // Once subtle consequence of this timeout calculation is that it + // actually divides all of time into _nonceTimeout-sized sections, such + // that the value of timeout is the point in time of the next + // approaching "boundary" of a section. This allows the server to + // consistently generate the same timeout (and hence the same nonce + // value) across requests, but only as long as one of those + // "boundaries" is not crossed between requests. If that happens, the + // nonce will change on its own, and effectively log the user out. This + // would be surprising if the user just logged in. + $timeout = ceil(time() / $this->_nonceTimeout) * $this->_nonceTimeout; + + $nonce = hash('md5', $timeout . ':' . $this->_request->getServer('HTTP_USER_AGENT') . ':' . __CLASS__); + return $nonce; + } + + /** + * Calculate Opaque + * + * The opaque string can be anything; the client must return it exactly as + * it was sent. It may be useful to store data in this string in some + * applications. Ideally, a new value for this would be generated each time + * a WWW-Authenticate header is sent (in order to reduce predictability), + * but we would have to be able to create the same exact value across at + * least two separate requests from the same client. + * + * @return string The opaque value + */ + protected function _calcOpaque() + { + return hash('md5', 'Opaque Data:' . __CLASS__); + } + + /** + * Parse Digest Authorization header + * + * @param string $header Client's Authorization: HTTP header + * @return array|false Data elements from header, or false if any part of + * the header is invalid + */ + protected function _parseDigestAuth($header) + { + $temp = null; + $data = array(); + + // See ZF-1052. Detect invalid usernames instead of just returning a + // 400 code. + $ret = preg_match('/username="([^"]+)"/', $header, $temp); + if (!$ret || empty($temp[1]) + || !ctype_print($temp[1]) + || strpos($temp[1], ':') !== false) { + $data['username'] = '::invalid::'; + } else { + $data['username'] = $temp[1]; + } + $temp = null; + + $ret = preg_match('/realm="([^"]+)"/', $header, $temp); + if (!$ret || empty($temp[1])) { + return false; + } + if (!ctype_print($temp[1]) || strpos($temp[1], ':') !== false) { + return false; + } else { + $data['realm'] = $temp[1]; + } + $temp = null; + + $ret = preg_match('/nonce="([^"]+)"/', $header, $temp); + if (!$ret || empty($temp[1])) { + return false; + } + if (!ctype_xdigit($temp[1])) { + return false; + } else { + $data['nonce'] = $temp[1]; + } + $temp = null; + + $ret = preg_match('/uri="([^"]+)"/', $header, $temp); + if (!$ret || empty($temp[1])) { + return false; + } + // Section 3.2.2.5 in RFC 2617 says the authenticating server must + // verify that the URI field in the Authorization header is for the + // same resource requested in the Request Line. + $rUri = @parse_url($this->_request->getRequestUri()); + $cUri = @parse_url($temp[1]); + if (false === $rUri || false === $cUri) { + return false; + } else { + // Make sure the path portion of both URIs is the same + if ($rUri['path'] != $cUri['path']) { + return false; + } + // Section 3.2.2.5 seems to suggest that the value of the URI + // Authorization field should be made into an absolute URI if the + // Request URI is absolute, but it's vague, and that's a bunch of + // code I don't want to write right now. + $data['uri'] = $temp[1]; + } + $temp = null; + + $ret = preg_match('/response="([^"]+)"/', $header, $temp); + if (!$ret || empty($temp[1])) { + return false; + } + if (32 != strlen($temp[1]) || !ctype_xdigit($temp[1])) { + return false; + } else { + $data['response'] = $temp[1]; + } + $temp = null; + + // The spec says this should default to MD5 if omitted. OK, so how does + // that square with the algo we send out in the WWW-Authenticate header, + // if it can easily be overridden by the client? + $ret = preg_match('/algorithm="?(' . $this->_algo . ')"?/', $header, $temp); + if ($ret && !empty($temp[1]) + && in_array($temp[1], $this->_supportedAlgos)) { + $data['algorithm'] = $temp[1]; + } else { + $data['algorithm'] = 'MD5'; // = $this->_algo; ? + } + $temp = null; + + // Not optional in this implementation + $ret = preg_match('/cnonce="([^"]+)"/', $header, $temp); + if (!$ret || empty($temp[1])) { + return false; + } + if (!ctype_print($temp[1])) { + return false; + } else { + $data['cnonce'] = $temp[1]; + } + $temp = null; + + // If the server sent an opaque value, the client must send it back + if ($this->_useOpaque) { + $ret = preg_match('/opaque="([^"]+)"/', $header, $temp); + if (!$ret || empty($temp[1])) { + + // Big surprise: IE isn't RFC 2617-compliant. + if (false !== strpos($this->_request->getHeader('User-Agent'), 'MSIE')) { + $temp[1] = ''; + $this->_ieNoOpaque = true; + } else { + return false; + } + } + // This implementation only sends MD5 hex strings in the opaque value + if (!$this->_ieNoOpaque && + (32 != strlen($temp[1]) || !ctype_xdigit($temp[1]))) { + return false; + } else { + $data['opaque'] = $temp[1]; + } + $temp = null; + } + + // Not optional in this implementation, but must be one of the supported + // qop types + $ret = preg_match('/qop="?(' . implode('|', $this->_supportedQops) . ')"?/', $header, $temp); + if (!$ret || empty($temp[1])) { + return false; + } + if (!in_array($temp[1], $this->_supportedQops)) { + return false; + } else { + $data['qop'] = $temp[1]; + } + $temp = null; + + // Not optional in this implementation. The spec says this value + // shouldn't be a quoted string, but apparently some implementations + // quote it anyway. See ZF-1544. + $ret = preg_match('/nc="?([0-9A-Fa-f]{8})"?/', $header, $temp); + if (!$ret || empty($temp[1])) { + return false; + } + if (8 != strlen($temp[1]) || !ctype_xdigit($temp[1])) { + return false; + } else { + $data['nc'] = $temp[1]; + } + $temp = null; + + return $data; + } +} diff --git a/libs/Zend/Auth/Adapter/Http/Resolver/Exception.php b/libs/Zend/Auth/Adapter/Http/Resolver/Exception.php new file mode 100644 index 0000000..6f1394b --- /dev/null +++ b/libs/Zend/Auth/Adapter/Http/Resolver/Exception.php @@ -0,0 +1,40 @@ +setFile($path); + } + } + + /** + * Set the path to the credentials file + * + * @param string $path + * @throws Zend_Auth_Adapter_Http_Resolver_Exception + * @return Zend_Auth_Adapter_Http_Resolver_File Provides a fluent interface + */ + public function setFile($path) + { + if (empty($path) || !is_readable($path)) { + /** + * @see Zend_Auth_Adapter_Http_Resolver_Exception + */ + require_once 'Zend/Auth/Adapter/Http/Resolver/Exception.php'; + throw new Zend_Auth_Adapter_Http_Resolver_Exception('Path not readable: ' . $path); + } + $this->_file = $path; + + return $this; + } + + /** + * Returns the path to the credentials file + * + * @return string + */ + public function getFile() + { + return $this->_file; + } + + /** + * Resolve credentials + * + * Only the first matching username/realm combination in the file is + * returned. If the file contains credentials for Digest authentication, + * the returned string is the password hash, or h(a1) from RFC 2617. The + * returned string is the plain-text password for Basic authentication. + * + * The expected format of the file is: + * username:realm:sharedSecret + * + * That is, each line consists of the user's username, the applicable + * authentication realm, and the password or hash, each delimited by + * colons. + * + * @param string $username Username + * @param string $realm Authentication Realm + * @throws Zend_Auth_Adapter_Http_Resolver_Exception + * @return string|false User's shared secret, if the user is found in the + * realm, false otherwise. + */ + public function resolve($username, $realm) + { + if (empty($username)) { + /** + * @see Zend_Auth_Adapter_Http_Resolver_Exception + */ + require_once 'Zend/Auth/Adapter/Http/Resolver/Exception.php'; + throw new Zend_Auth_Adapter_Http_Resolver_Exception('Username is required'); + } else if (!ctype_print($username) || strpos($username, ':') !== false) { + /** + * @see Zend_Auth_Adapter_Http_Resolver_Exception + */ + require_once 'Zend/Auth/Adapter/Http/Resolver/Exception.php'; + throw new Zend_Auth_Adapter_Http_Resolver_Exception('Username must consist only of printable characters, ' + . 'excluding the colon'); + } + if (empty($realm)) { + /** + * @see Zend_Auth_Adapter_Http_Resolver_Exception + */ + require_once 'Zend/Auth/Adapter/Http/Resolver/Exception.php'; + throw new Zend_Auth_Adapter_Http_Resolver_Exception('Realm is required'); + } else if (!ctype_print($realm) || strpos($realm, ':') !== false) { + /** + * @see Zend_Auth_Adapter_Http_Resolver_Exception + */ + require_once 'Zend/Auth/Adapter/Http/Resolver/Exception.php'; + throw new Zend_Auth_Adapter_Http_Resolver_Exception('Realm must consist only of printable characters, ' + . 'excluding the colon.'); + } + + // Open file, read through looking for matching credentials + $fp = @fopen($this->_file, 'r'); + if (!$fp) { + /** + * @see Zend_Auth_Adapter_Http_Resolver_Exception + */ + require_once 'Zend/Auth/Adapter/Http/Resolver/Exception.php'; + throw new Zend_Auth_Adapter_Http_Resolver_Exception('Unable to open password file: ' . $this->_file); + } + + // No real validation is done on the contents of the password file. The + // assumption is that we trust the administrators to keep it secure. + while (($line = fgetcsv($fp, 512, ':')) !== false) { + if ($line[0] == $username && $line[1] == $realm) { + $password = $line[2]; + fclose($fp); + return $password; + } + } + + fclose($fp); + return false; + } +} diff --git a/libs/Zend/Auth/Adapter/Http/Resolver/Interface.php b/libs/Zend/Auth/Adapter/Http/Resolver/Interface.php new file mode 100644 index 0000000..c9f828b --- /dev/null +++ b/libs/Zend/Auth/Adapter/Http/Resolver/Interface.php @@ -0,0 +1,47 @@ +_xmlToken = $strXmlDocument; + $this->_infoCard = new Zend_InfoCard(); + } + + /** + * Sets the InfoCard component Adapter to use + * + * @param Zend_InfoCard_Adapter_Interface $a + * @return Zend_Auth_Adapter_InfoCard Provides a fluent interface + */ + public function setAdapter(Zend_InfoCard_Adapter_Interface $a) + { + $this->_infoCard->setAdapter($a); + return $this; + } + + /** + * Retrieves the InfoCard component adapter being used + * + * @return Zend_InfoCard_Adapter_Interface + */ + public function getAdapter() + { + return $this->_infoCard->getAdapter(); + } + + /** + * Retrieves the InfoCard public key cipher object being used + * + * @return Zend_InfoCard_Cipher_PKI_Interface + */ + public function getPKCipherObject() + { + return $this->_infoCard->getPKCipherObject(); + } + + /** + * Sets the InfoCard public key cipher object to use + * + * @param Zend_InfoCard_Cipher_PKI_Interface $cipherObj + * @return Zend_Auth_Adapter_InfoCard Provides a fluent interface + */ + public function setPKICipherObject(Zend_InfoCard_Cipher_PKI_Interface $cipherObj) + { + $this->_infoCard->setPKICipherObject($cipherObj); + return $this; + } + + /** + * Retrieves the Symmetric cipher object being used + * + * @return Zend_InfoCard_Cipher_Symmetric_Interface + */ + public function getSymCipherObject() + { + return $this->_infoCard->getSymCipherObject(); + } + + /** + * Sets the InfoCard symmetric cipher object to use + * + * @param Zend_InfoCard_Cipher_Symmetric_Interface $cipherObj + * @return Zend_Auth_Adapter_InfoCard Provides a fluent interface + */ + public function setSymCipherObject(Zend_InfoCard_Cipher_Symmetric_Interface $cipherObj) + { + $this->_infoCard->setSymCipherObject($cipherObj); + return $this; + } + + /** + * Remove a Certificate Pair by Key ID from the search list + * + * @param string $key_id The Certificate Key ID returned from adding the certificate pair + * @throws Zend_InfoCard_Exception + * @return Zend_Auth_Adapter_InfoCard Provides a fluent interface + */ + public function removeCertificatePair($key_id) + { + $this->_infoCard->removeCertificatePair($key_id); + return $this; + } + + /** + * Add a Certificate Pair to the list of certificates searched by the component + * + * @param string $private_key_file The path to the private key file for the pair + * @param string $public_key_file The path to the certificate / public key for the pair + * @param string $type (optional) The URI for the type of key pair this is (default RSA with OAEP padding) + * @param string $password (optional) The password for the private key file if necessary + * @throws Zend_InfoCard_Exception + * @return string A key ID representing this key pair in the component + */ + public function addCertificatePair($private_key_file, $public_key_file, $type = Zend_InfoCard_Cipher::ENC_RSA_OAEP_MGF1P, $password = null) + { + return $this->_infoCard->addCertificatePair($private_key_file, $public_key_file, $type, $password); + } + + /** + * Return a Certificate Pair from a key ID + * + * @param string $key_id The Key ID of the certificate pair in the component + * @throws Zend_InfoCard_Exception + * @return array An array containing the path to the private/public key files, + * the type URI and the password if provided + */ + public function getCertificatePair($key_id) + { + return $this->_infoCard->getCertificatePair($key_id); + } + + /** + * Set the XML Token to be processed + * + * @param string $strXmlToken The XML token to process + * @return Zend_Auth_Adapter_InfoCard Provides a fluent interface + */ + public function setXmlToken($strXmlToken) + { + $this->_xmlToken = $strXmlToken; + return $this; + } + + /** + * Get the XML Token being processed + * + * @return string The XML token to be processed + */ + public function getXmlToken() + { + return $this->_xmlToken; + } + + /** + * Authenticates the XML token + * + * @return Zend_Auth_Result The result of the authentication + */ + public function authenticate() + { + try { + $claims = $this->_infoCard->process($this->getXmlToken()); + } catch(Exception $e) { + return new Zend_Auth_Result(Zend_Auth_Result::FAILURE , null, array('Exception Thrown', + $e->getMessage(), + $e->getTraceAsString(), + serialize($e))); + } + + if(!$claims->isValid()) { + switch($claims->getCode()) { + case Zend_infoCard_Claims::RESULT_PROCESSING_FAILURE: + return new Zend_Auth_Result( + Zend_Auth_Result::FAILURE, + $claims, + array( + 'Processing Failure', + $claims->getErrorMsg() + ) + ); + break; + case Zend_InfoCard_Claims::RESULT_VALIDATION_FAILURE: + return new Zend_Auth_Result( + Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID, + $claims, + array( + 'Validation Failure', + $claims->getErrorMsg() + ) + ); + break; + default: + return new Zend_Auth_Result( + Zend_Auth_Result::FAILURE, + $claims, + array( + 'Unknown Failure', + $claims->getErrorMsg() + ) + ); + break; + } + } + + return new Zend_Auth_Result( + Zend_Auth_Result::SUCCESS, + $claims + ); + } +} diff --git a/libs/Zend/Auth/Adapter/Interface.php b/libs/Zend/Auth/Adapter/Interface.php new file mode 100644 index 0000000..8fa6e1f --- /dev/null +++ b/libs/Zend/Auth/Adapter/Interface.php @@ -0,0 +1,46 @@ +setOptions($options); + if ($username !== null) { + $this->setUsername($username); + } + if ($password !== null) { + $this->setPassword($password); + } + } + + /** + * Returns the array of arrays of Zend_Ldap options of this adapter. + * + * @return array|null + */ + public function getOptions() + { + return $this->_options; + } + + /** + * Sets the array of arrays of Zend_Ldap options to be used by + * this adapter. + * + * @param array $options The array of arrays of Zend_Ldap options + * @return Zend_Auth_Adapter_Ldap Provides a fluent interface + */ + public function setOptions($options) + { + $this->_options = is_array($options) ? $options : array(); + return $this; + } + + /** + * Returns the username of the account being authenticated, or + * NULL if none is set. + * + * @return string|null + */ + public function getUsername() + { + return $this->_username; + } + + /** + * Sets the username for binding + * + * @param string $username The username for binding + * @return Zend_Auth_Adapter_Ldap Provides a fluent interface + */ + public function setUsername($username) + { + $this->_username = (string) $username; + return $this; + } + + /** + * Returns the password of the account being authenticated, or + * NULL if none is set. + * + * @return string|null + */ + public function getPassword() + { + return $this->_password; + } + + /** + * Sets the passwort for the account + * + * @param string $password The password of the account being authenticated + * @return Zend_Auth_Adapter_Ldap Provides a fluent interface + */ + public function setPassword($password) + { + $this->_password = (string) $password; + return $this; + } + + /** + * Returns the LDAP Object + * + * @return Zend_Ldap The Zend_Ldap object used to authenticate the credentials + */ + public function getLdap() + { + if ($this->_ldap === null) { + /** + * @see Zend_Ldap + */ + require_once 'Zend/Ldap.php'; + $this->_ldap = new Zend_Ldap(); + } + return $this->_ldap; + } + + /** + * Returns a domain name for the current LDAP options. This is used + * for skipping redundant operations (e.g. authentications). + * + * @return string + */ + protected function _getAuthorityName() + { + $options = $this->getLdap()->getOptions(); + $name = $options['accountDomainName']; + if (!$name) + $name = $options['accountDomainNameShort']; + return $name ? $name : ''; + } + + /** + * Authenticate the user + * + * @throws Zend_Auth_Adapter_Exception + * @return Zend_Auth_Result + */ + public function authenticate() + { + /** + * @see Zend_Ldap_Exception + */ + require_once 'Zend/Ldap/Exception.php'; + + $messages = array(); + $messages[0] = ''; // reserved + $messages[1] = ''; // reserved + + $username = $this->_username; + $password = $this->_password; + + if (!$username) { + $code = Zend_Auth_Result::FAILURE_IDENTITY_NOT_FOUND; + $messages[0] = 'A username is required'; + return new Zend_Auth_Result($code, '', $messages); + } + if (!$password) { + /* A password is required because some servers will + * treat an empty password as an anonymous bind. + */ + $code = Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID; + $messages[0] = 'A password is required'; + return new Zend_Auth_Result($code, '', $messages); + } + + $ldap = $this->getLdap(); + + $code = Zend_Auth_Result::FAILURE; + $messages[0] = "Authority not found: $username"; + $failedAuthorities = array(); + + /* Iterate through each server and try to authenticate the supplied + * credentials against it. + */ + foreach ($this->_options as $name => $options) { + + if (!is_array($options)) { + /** + * @see Zend_Auth_Adapter_Exception + */ + require_once 'Zend/Auth/Adapter/Exception.php'; + throw new Zend_Auth_Adapter_Exception('Adapter options array not in array'); + } + $ldap->setOptions($options); + $dname = ''; + + try { + if ($messages[1]) + $messages[] = $messages[1]; + $messages[1] = ''; + $messages[] = $this->_optionsToString($options); + + $dname = $this->_getAuthorityName(); + if (isset($failedAuthorities[$dname])) { + /* If multiple sets of server options for the same domain + * are supplied, we want to skip redundant authentications + * where the identity or credentials where found to be + * invalid with another server for the same domain. The + * $failedAuthorities array tracks this condition (and also + * serves to supply the original error message). + * This fixes issue ZF-4093. + */ + $messages[1] = $failedAuthorities[$dname]; + $messages[] = "Skipping previously failed authority: $dname"; + continue; + } + + $canonicalName = $ldap->getCanonicalAccountName($username); + + $ldap->bind($canonicalName, $password); + + $messages[0] = ''; + $messages[1] = ''; + $messages[] = "$canonicalName authentication successful"; + + return new Zend_Auth_Result(Zend_Auth_Result::SUCCESS, $canonicalName, $messages); + } catch (Zend_Ldap_Exception $zle) { + + /* LDAP based authentication is notoriously difficult to diagnose. Therefore + * we bend over backwards to capture and record every possible bit of + * information when something goes wrong. + */ + + $err = $zle->getCode(); + + if ($err == Zend_Ldap_Exception::LDAP_X_DOMAIN_MISMATCH) { + /* This error indicates that the domain supplied in the + * username did not match the domains in the server options + * and therefore we should just skip to the next set of + * server options. + */ + continue; + } else if ($err == Zend_Ldap_Exception::LDAP_NO_SUCH_OBJECT) { + $code = Zend_Auth_Result::FAILURE_IDENTITY_NOT_FOUND; + $messages[0] = "Account not found: $username"; + $failedAuthorities[$dname] = $zle->getMessage(); + } else if ($err == Zend_Ldap_Exception::LDAP_INVALID_CREDENTIALS) { + $code = Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID; + $messages[0] = 'Invalid credentials'; + $failedAuthorities[$dname] = $zle->getMessage(); + } else { + $line = $zle->getLine(); + $messages[] = $zle->getFile() . "($line): " . $zle->getMessage(); + $messages[] = str_replace($password, '*****', $zle->getTraceAsString()); + $messages[0] = 'An unexpected failure occurred'; + } + $messages[1] = $zle->getMessage(); + } + } + + $msg = isset($messages[1]) ? $messages[1] : $messages[0]; + $messages[] = "$username authentication failed: $msg"; + + return new Zend_Auth_Result($code, $username, $messages); + } + + /** + * Converts options to string + * + * @param array $options + * @return string + */ + private function _optionsToString(array $options) + { + $str = ''; + foreach ($options as $key => $val) { + if ($key === 'password') + $val = '*****'; + if ($str) + $str .= ','; + $str .= $key . '=' . $val; + } + return $str; + } +} diff --git a/libs/Zend/Auth/Adapter/OpenId.php b/libs/Zend/Auth/Adapter/OpenId.php new file mode 100644 index 0000000..824358d --- /dev/null +++ b/libs/Zend/Auth/Adapter/OpenId.php @@ -0,0 +1,284 @@ +_id = $id; + $this->_storage = $storage; + $this->_returnTo = $returnTo; + $this->_root = $root; + $this->_extensions = $extensions; + $this->_response = $response; + } + + /** + * Sets the value to be used as the identity + * + * @param string $id the identity value + * @return Zend_Auth_Adapter_OpenId Provides a fluent interface + */ + public function setIdentity($id) + { + $this->_id = $id; + return $this; + } + + /** + * Sets the storage implementation which will be use by OpenId + * + * @param Zend_OpenId_Consumer_Storage $storage + * @return Zend_Auth_Adapter_OpenId Provides a fluent interface + */ + public function setStorage(Zend_OpenId_Consumer_Storage $storage) + { + $this->_storage = $storage; + return $this; + } + + /** + * Sets the HTTP URL to redirect response from server to + * + * @param string $returnTo + * @return Zend_Auth_Adapter_OpenId Provides a fluent interface + */ + public function setReturnTo($returnTo) + { + $this->_returnTo = $returnTo; + return $this; + } + + /** + * Sets HTTP URL to identify consumer on server + * + * @param string $root + * @return Zend_Auth_Adapter_OpenId Provides a fluent interface + */ + public function setRoot($root) + { + $this->_root = $root; + return $this; + } + + /** + * Sets OpenID extension(s) + * + * @param mixed $extensions + * @return Zend_Auth_Adapter_OpenId Provides a fluent interface + */ + public function setExtensions($extensions) + { + $this->_extensions = $extensions; + return $this; + } + + /** + * Sets an optional response object to perform HTTP or HTML form redirection + * + * @param string $root + * @return Zend_Auth_Adapter_OpenId Provides a fluent interface + */ + public function setResponse($response) + { + $this->_response = $response; + return $this; + } + + /** + * Enables or disables interaction with user during authentication on + * OpenID provider. + * + * @param bool $check_immediate + * @return Zend_Auth_Adapter_OpenId Provides a fluent interface + */ + public function setCheckImmediate($check_immediate) + { + $this->_check_immediate = $check_immediate; + return $this; + } + + /** + * Sets HTTP client object to make HTTP requests + * + * @param Zend_Http_Client $client HTTP client object to be used + */ + public function setHttpClient($client) { + $this->_httpClient = $client; + } + + /** + * Authenticates the given OpenId identity. + * Defined by Zend_Auth_Adapter_Interface. + * + * @throws Zend_Auth_Adapter_Exception If answering the authentication query is impossible + * @return Zend_Auth_Result + */ + public function authenticate() { + $id = $this->_id; + if (!empty($id)) { + $consumer = new Zend_OpenId_Consumer($this->_storage); + $consumer->setHttpClient($this->_httpClient); + /* login() is never returns on success */ + if (!$this->_check_immediate) { + if (!$consumer->login($id, + $this->_returnTo, + $this->_root, + $this->_extensions, + $this->_response)) { + return new Zend_Auth_Result( + Zend_Auth_Result::FAILURE, + $id, + array("Authentication failed", $consumer->getError())); + } + } else { + if (!$consumer->check($id, + $this->_returnTo, + $this->_root, + $this->_extensions, + $this->_response)) { + return new Zend_Auth_Result( + Zend_Auth_Result::FAILURE, + $id, + array("Authentication failed", $consumer->getError())); + } + } + } else { + $params = (isset($_SERVER['REQUEST_METHOD']) && + $_SERVER['REQUEST_METHOD']=='POST') ? $_POST: $_GET; + $consumer = new Zend_OpenId_Consumer($this->_storage); + $consumer->setHttpClient($this->_httpClient); + if ($consumer->verify( + $params, + $id, + $this->_extensions)) { + return new Zend_Auth_Result( + Zend_Auth_Result::SUCCESS, + $id, + array("Authentication successful")); + } else { + return new Zend_Auth_Result( + Zend_Auth_Result::FAILURE, + $id, + array("Authentication failed", $consumer->getError())); + } + } + } + +} diff --git a/libs/Zend/Auth/Exception.php b/libs/Zend/Auth/Exception.php new file mode 100644 index 0000000..cd7079c --- /dev/null +++ b/libs/Zend/Auth/Exception.php @@ -0,0 +1,36 @@ + self::SUCCESS ) { + $code = 1; + } + + $this->_code = $code; + $this->_identity = $identity; + $this->_messages = $messages; + } + + /** + * Returns whether the result represents a successful authentication attempt + * + * @return boolean + */ + public function isValid() + { + return ($this->_code > 0) ? true : false; + } + + /** + * getCode() - Get the result code for this authentication attempt + * + * @return int + */ + public function getCode() + { + return $this->_code; + } + + /** + * Returns the identity used in the authentication attempt + * + * @return mixed + */ + public function getIdentity() + { + return $this->_identity; + } + + /** + * Returns an array of string reasons why the authentication attempt was unsuccessful + * + * If authentication was successful, this method returns an empty array. + * + * @return array + */ + public function getMessages() + { + return $this->_messages; + } +} diff --git a/libs/Zend/Auth/Storage/Exception.php b/libs/Zend/Auth/Storage/Exception.php new file mode 100644 index 0000000..8b25888 --- /dev/null +++ b/libs/Zend/Auth/Storage/Exception.php @@ -0,0 +1,38 @@ +_data); + } + + /** + * Returns the contents of storage + * Behavior is undefined when storage is empty. + * + * @throws Zend_Auth_Storage_Exception If reading contents from storage is impossible + * @return mixed + */ + public function read() + { + return $this->_data; + } + + /** + * Writes $contents to storage + * + * @param mixed $contents + * @throws Zend_Auth_Storage_Exception If writing $contents to storage is impossible + * @return void + */ + public function write($contents) + { + $this->_data = $contents; + } + + /** + * Clears contents from storage + * + * @throws Zend_Auth_Storage_Exception If clearing contents from storage is impossible + * @return void + */ + public function clear() + { + $this->_data = null; + } +} diff --git a/libs/Zend/Auth/Storage/Session.php b/libs/Zend/Auth/Storage/Session.php new file mode 100644 index 0000000..5e911e1 --- /dev/null +++ b/libs/Zend/Auth/Storage/Session.php @@ -0,0 +1,150 @@ +_namespace = $namespace; + $this->_member = $member; + $this->_session = new Zend_Session_Namespace($this->_namespace); + } + + /** + * Returns the session namespace + * + * @return string + */ + public function getNamespace() + { + return $this->_namespace; + } + + /** + * Returns the name of the session object member + * + * @return string + */ + public function getMember() + { + return $this->_member; + } + + /** + * Defined by Zend_Auth_Storage_Interface + * + * @return boolean + */ + public function isEmpty() + { + return !isset($this->_session->{$this->_member}); + } + + /** + * Defined by Zend_Auth_Storage_Interface + * + * @return mixed + */ + public function read() + { + return $this->_session->{$this->_member}; + } + + /** + * Defined by Zend_Auth_Storage_Interface + * + * @param mixed $contents + * @return void + */ + public function write($contents) + { + $this->_session->{$this->_member} = $contents; + } + + /** + * Defined by Zend_Auth_Storage_Interface + * + * @return void + */ + public function clear() + { + unset($this->_session->{$this->_member}); + } +} diff --git a/libs/Zend/Cache.php b/libs/Zend/Cache.php new file mode 100644 index 0000000..5c7ff51 --- /dev/null +++ b/libs/Zend/Cache.php @@ -0,0 +1,245 @@ +setBackend($backendObject); + return $frontendObject; + } + + /** + * Frontend Constructor + * + * @param string $backend + * @param array $backendOptions + * @param boolean $customBackendNaming + * @param boolean $autoload + * @return Zend_Cache_Backend + */ + public static function _makeBackend($backend, $backendOptions, $customBackendNaming = false, $autoload = false) + { + if (!$customBackendNaming) { + $backend = self::_normalizeName($backend); + } + if (in_array($backend, Zend_Cache::$standardBackends)) { + // we use a standard backend + $backendClass = 'Zend_Cache_Backend_' . $backend; + // security controls are explicit + require_once str_replace('_', DIRECTORY_SEPARATOR, $backendClass) . '.php'; + } else { + // we use a custom backend + if (!preg_match('~^[\w]+$~D', $backend)) { + Zend_Cache::throwException("Invalid backend name [$backend]"); + } + if (!$customBackendNaming) { + // we use this boolean to avoid an API break + $backendClass = 'Zend_Cache_Backend_' . $backend; + } else { + $backendClass = $backend; + } + if (!$autoload) { + $file = str_replace('_', DIRECTORY_SEPARATOR, $backendClass) . '.php'; + if (!(self::_isReadable($file))) { + self::throwException("file $file not found in include_path"); + } + require_once $file; + } + } + return new $backendClass($backendOptions); + } + + /** + * Backend Constructor + * + * @param string $frontend + * @param array $frontendOptions + * @param boolean $customFrontendNaming + * @param boolean $autoload + * @return Zend_Cache_Core|Zend_Cache_Frontend + */ + public static function _makeFrontend($frontend, $frontendOptions = array(), $customFrontendNaming = false, $autoload = false) + { + if (!$customFrontendNaming) { + $frontend = self::_normalizeName($frontend); + } + if (in_array($frontend, self::$standardFrontends)) { + // we use a standard frontend + // For perfs reasons, with frontend == 'Core', we can interact with the Core itself + $frontendClass = 'Zend_Cache_' . ($frontend != 'Core' ? 'Frontend_' : '') . $frontend; + // security controls are explicit + require_once str_replace('_', DIRECTORY_SEPARATOR, $frontendClass) . '.php'; + } else { + // we use a custom frontend + if (!preg_match('~^[\w]+$~D', $frontend)) { + Zend_Cache::throwException("Invalid frontend name [$frontend]"); + } + if (!$customFrontendNaming) { + // we use this boolean to avoid an API break + $frontendClass = 'Zend_Cache_Frontend_' . $frontend; + } else { + $frontendClass = $frontend; + } + if (!$autoload) { + $file = str_replace('_', DIRECTORY_SEPARATOR, $frontendClass) . '.php'; + if (!(self::_isReadable($file))) { + self::throwException("file $file not found in include_path"); + } + require_once $file; + } + } + return new $frontendClass($frontendOptions); + } + + /** + * Throw an exception + * + * Note : for perf reasons, the "load" of Zend/Cache/Exception is dynamic + * @param string $msg Message for the exception + * @throws Zend_Cache_Exception + */ + public static function throwException($msg) + { + // For perfs reasons, we use this dynamic inclusion + require_once 'Zend/Cache/Exception.php'; + throw new Zend_Cache_Exception($msg); + } + + /** + * Normalize frontend and backend names to allow multiple words TitleCased + * + * @param string $name Name to normalize + * @return string + */ + protected static function _normalizeName($name) + { + $name = ucfirst(strtolower($name)); + $name = str_replace(array('-', '_', '.'), ' ', $name); + $name = ucwords($name); + $name = str_replace(' ', '', $name); + return $name; + } + + /** + * Returns TRUE if the $filename is readable, or FALSE otherwise. + * This function uses the PHP include_path, where PHP's is_readable() + * does not. + * + * Note : this method comes from Zend_Loader (see #ZF-2891 for details) + * + * @param string $filename + * @return boolean + */ + private static function _isReadable($filename) + { + if (!$fh = @fopen($filename, 'r', true)) { + return false; + } + @fclose($fh); + return true; + } + +} diff --git a/libs/Zend/Cache/Backend.php b/libs/Zend/Cache/Backend.php new file mode 100644 index 0000000..9763ddd --- /dev/null +++ b/libs/Zend/Cache/Backend.php @@ -0,0 +1,222 @@ + (int) lifetime : + * - Cache lifetime (in seconds) + * - If null, the cache is valid forever + * + * =====> (int) logging : + * - if set to true, a logging is activated throw Zend_Log + * + * @var array directives + */ + protected $_directives = array( + 'lifetime' => 3600, + 'logging' => false, + 'logger' => null + ); + + /** + * Available options + * + * @var array available options + */ + protected $_options = array(); + + /** + * Constructor + * + * @param array $options Associative array of options + * @throws Zend_Cache_Exception + * @return void + */ + public function __construct(array $options = array()) + { + while (list($name, $value) = each($options)) { + $this->setOption($name, $value); + } + } + + /** + * Set the frontend directives + * + * @param array $directives Assoc of directives + * @throws Zend_Cache_Exception + * @return void + */ + public function setDirectives($directives) + { + if (!is_array($directives)) Zend_Cache::throwException('Directives parameter must be an array'); + while (list($name, $value) = each($directives)) { + if (!is_string($name)) { + Zend_Cache::throwException("Incorrect option name : $name"); + } + $name = strtolower($name); + if (array_key_exists($name, $this->_directives)) { + $this->_directives[$name] = $value; + } + + } + + $this->_loggerSanity(); + } + + /** + * Set an option + * + * @param string $name + * @param mixed $value + * @throws Zend_Cache_Exception + * @return void + */ + public function setOption($name, $value) + { + if (!is_string($name)) { + Zend_Cache::throwException("Incorrect option name : $name"); + } + $name = strtolower($name); + if (!array_key_exists($name, $this->_options)) { + Zend_Cache::throwException("Incorrect option name : $name"); + } + $this->_options[$name] = $value; + } + + /** + * Get the life time + * + * if $specificLifetime is not false, the given specific life time is used + * else, the global lifetime is used + * + * @param int $specificLifetime + * @return int Cache life time + */ + public function getLifetime($specificLifetime) + { + if ($specificLifetime === false) { + return $this->_directives['lifetime']; + } + return $specificLifetime; + } + + /** + * Return true if the automatic cleaning is available for the backend + * + * DEPRECATED : use getCapabilities() instead + * + * @deprecated + * @return boolean + */ + public function isAutomaticCleaningAvailable() + { + return true; + } + + /** + * Return a system-wide tmp directory + * + * @return string System-wide tmp directory + */ + static function getTmpDir() + { + if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { + // windows... + foreach (array($_ENV, $_SERVER) as $tab) { + foreach (array('TEMP', 'TMP', 'windir', 'SystemRoot') as $key) { + if (isset($tab[$key])) { + $result = $tab[$key]; + if (($key == 'windir') or ($key == 'SystemRoot')) { + $result = $result . '\\temp'; + } + return $result; + } + } + } + return '\\temp'; + } else { + // unix... + if (isset($_ENV['TMPDIR'])) return $_ENV['TMPDIR']; + if (isset($_SERVER['TMPDIR'])) return $_SERVER['TMPDIR']; + return '/tmp'; + } + } + + /** + * Make sure if we enable logging that the Zend_Log class + * is available. + * Create a default log object if none is set. + * + * @throws Zend_Cache_Exception + * @return void + */ + protected function _loggerSanity() + { + if (!isset($this->_directives['logging']) || !$this->_directives['logging']) { + return; + } + try { + /** + * @see Zend_Log + */ + require_once 'Zend/Log.php'; + } catch (Zend_Exception $e) { + Zend_Cache::throwException('Logging feature is enabled but the Zend_Log class is not available'); + } + if (isset($this->_directives['logger']) && $this->_directives['logger'] instanceof Zend_Log) { + return; + } + // Create a default logger to the standard output stream + require_once 'Zend/Log/Writer/Stream.php'; + $logger = new Zend_Log(new Zend_Log_Writer_Stream('php://output')); + $this->_directives['logger'] = $logger; + } + + /** + * Log a message at the WARN (4) priority. + * + * @param string $message + * @throws Zend_Cache_Exception + * @return void + */ + protected function _log($message, $priority = 4) + { + if (!$this->_directives['logging']) { + return; + } + if (!(isset($this->_directives['logger']) || $this->_directives['logger'] instanceof Zend_Log)) { + Zend_Cache::throwException('Logging is enabled but logger is not set'); + } + $logger = $this->_directives['logger']; + $logger->log($message, $priority); + } + +} diff --git a/libs/Zend/Cache/Backend/Apc.php b/libs/Zend/Cache/Backend/Apc.php new file mode 100644 index 0000000..3948163 --- /dev/null +++ b/libs/Zend/Cache/Backend/Apc.php @@ -0,0 +1,354 @@ + infinite lifetime) + * @return boolean true if no problem + */ + public function save($data, $id, $tags = array(), $specificLifetime = false) + { + $lifetime = $this->getLifetime($specificLifetime); + $result = apc_store($id, array($data, time(), $lifetime), $lifetime); + if (count($tags) > 0) { + $this->_log(self::TAGS_UNSUPPORTED_BY_SAVE_OF_APC_BACKEND); + } + return $result; + } + + /** + * Remove a cache record + * + * @param string $id cache id + * @return boolean true if no problem + */ + public function remove($id) + { + return apc_delete($id); + } + + /** + * Clean some cache records + * + * Available modes are : + * 'all' (default) => remove all cache entries ($tags is not used) + * 'old' => unsupported + * 'matchingTag' => unsupported + * 'notMatchingTag' => unsupported + * 'matchingAnyTag' => unsupported + * + * @param string $mode clean mode + * @param array $tags array of tags + * @throws Zend_Cache_Exception + * @return boolean true if no problem + */ + public function clean($mode = Zend_Cache::CLEANING_MODE_ALL, $tags = array()) + { + switch ($mode) { + case Zend_Cache::CLEANING_MODE_ALL: + return apc_clear_cache('user'); + break; + case Zend_Cache::CLEANING_MODE_OLD: + $this->_log("Zend_Cache_Backend_Apc::clean() : CLEANING_MODE_OLD is unsupported by the Apc backend"); + break; + case Zend_Cache::CLEANING_MODE_MATCHING_TAG: + case Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG: + case Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG: + $this->_log(self::TAGS_UNSUPPORTED_BY_CLEAN_OF_APC_BACKEND); + break; + default: + Zend_Cache::throwException('Invalid mode for clean() method'); + break; + } + } + + /** + * Return true if the automatic cleaning is available for the backend + * + * DEPRECATED : use getCapabilities() instead + * + * @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 + */ + public function getFillingPercentage() + { + $mem = apc_sma_info(true); + $memSize = $mem['num_seg'] * $mem['seg_size']; + $memAvailable= $mem['avail_mem']; + $memUsed = $memSize - $memAvailable; + if ($memSize == 0) { + Zend_Cache::throwException('can\'t get apc memory size'); + } + if ($memUsed > $memSize) { + return 100; + } + 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 + * @return array array of matching cache ids (string) + */ + public function getIdsMatchingTags($tags = array()) + { + $this->_log(self::TAGS_UNSUPPORTED_BY_SAVE_OF_APC_BACKEND); + 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 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()) + { + $this->_log(self::TAGS_UNSUPPORTED_BY_SAVE_OF_APC_BACKEND); + return array(); + } + + /** + * Return an array of stored cache ids + * + * @return array array of stored cache ids (string) + */ + public function getIds() + { + $res = array(); + $array = apc_cache_info('user', false); + $records = $array['cache_list']; + foreach ($records as $record) { + $res[] = $record['info']; + } + return $res; + } + + /** + * Return an array of metadatas for the given cache id + * + * The array must include these keys : + * - 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) + { + $tmp = apc_fetch($id); + if (is_array($tmp)) { + $data = $tmp[0]; + $mtime = $tmp[1]; + if (!isset($tmp[2])) { + // because this record is only with 1.7 release + // if old cache records are still there... + return false; + } + $lifetime = $tmp[2]; + return array( + 'expire' => $mtime + $lifetime, + 'tags' => array(), + 'mtime' => $mtime + ); + } + return false; + } + + /** + * Give (if possible) an extra lifetime to the given cache id + * + * @param string $id cache id + * @param int $extraLifetime + * @return boolean true if ok + */ + public function touch($id, $extraLifetime) + { + $tmp = apc_fetch($id); + if (is_array($tmp)) { + $data = $tmp[0]; + $mtime = $tmp[1]; + if (!isset($tmp[2])) { + // because this record is only with 1.7 release + // if old cache records are still there... + return false; + } + $lifetime = $tmp[2]; + $newLifetime = $lifetime - (time() - $mtime) + $extraLifetime; + if ($newLifetime <=0) { + 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) + * - expired_read (is it possible to read expired cache records + * (for doNotTestCacheValidity option for example)) + * - 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() + { + return array( + 'automatic_cleaning' => false, + 'tags' => false, + 'expired_read' => false, + 'priority' => false, + 'infinite_lifetime' => false, + 'get_list' => true + ); + } + +} diff --git a/libs/Zend/Cache/Backend/ExtendedInterface.php b/libs/Zend/Cache/Backend/ExtendedInterface.php new file mode 100644 index 0000000..43d40ee --- /dev/null +++ b/libs/Zend/Cache/Backend/ExtendedInterface.php @@ -0,0 +1,125 @@ + (string) cache_dir : + * - Directory where to put the cache files + * + * =====> (boolean) file_locking : + * - Enable / disable file_locking + * - Can avoid cache corruption under bad circumstances but it doesn't work on multithread + * webservers and on NFS filesystems for example + * + * =====> (boolean) read_control : + * - Enable / disable read control + * - If enabled, a control key is embeded in cache file and this key is compared with the one + * calculated after the reading. + * + * =====> (string) read_control_type : + * - Type of read control (only if read control is enabled). Available values are : + * 'md5' for a md5 hash control (best but slowest) + * 'crc32' for a crc32 hash control (lightly less safe but faster, better choice) + * 'adler32' for an adler32 hash control (excellent choice too, faster than crc32) + * 'strlen' for a length only test (fastest) + * + * =====> (int) hashed_directory_level : + * - Hashed directory level + * - Set the hashed directory structure level. 0 means "no hashed directory + * structure", 1 means "one level of directory", 2 means "two levels"... + * This option can speed up the cache only when you have many thousands of + * cache file. Only specific benchs can help you to choose the perfect value + * for you. Maybe, 1 or 2 is a good start. + * + * =====> (int) hashed_directory_umask : + * - Umask for hashed directory structure + * + * =====> (string) file_name_prefix : + * - prefix for cache files + * - be really carefull with this option because a too generic value in a system cache dir + * (like /tmp) can cause disasters when cleaning the cache + * + * =====> (int) cache_file_umask : + * - Umask for cache files + * + * =====> (int) metatadatas_array_max_size : + * - max size for the metadatas array (don't change this value unless you + * know what you are doing) + * + * @var array available options + */ + protected $_options = array( + 'cache_dir' => null, + 'file_locking' => true, + 'read_control' => true, + 'read_control_type' => 'crc32', + 'hashed_directory_level' => 0, + 'hashed_directory_umask' => 0700, + 'file_name_prefix' => 'zend_cache', + 'cache_file_umask' => 0600, + 'metadatas_array_max_size' => 100 + ); + + /** + * Array of metadatas (each item is an associative array) + * + * @var array + */ + private $_metadatasArray = array(); + + + /** + * Constructor + * + * @param array $options associative array of options + * @throws Zend_Cache_Exception + * @return void + */ + public function __construct(array $options = array()) + { + parent::__construct($options); + if (!is_null($this->_options['cache_dir'])) { // particular case for this option + $this->setCacheDir($this->_options['cache_dir']); + } else { + $this->setCacheDir(self::getTmpDir() . DIRECTORY_SEPARATOR, false); + } + if (isset($this->_options['file_name_prefix'])) { // particular case for this option + if (!preg_match('~^[\w]+$~', $this->_options['file_name_prefix'])) { + Zend_Cache::throwException('Invalid file_name_prefix : must use only [a-zA-A0-9_]'); + } + } + if ($this->_options['metadatas_array_max_size'] < 10) { + Zend_Cache::throwException('Invalid metadatas_array_max_size, must be > 10'); + } + if (isset($options['hashed_directory_umask']) && is_string($options['hashed_directory_umask'])) { + // See #ZF-4422 + $this->_options['hashed_directory_umask'] = octdec($this->_options['hashed_directory_umask']); + } + if (isset($options['cache_file_umask']) && is_string($options['cache_file_umask'])) { + // See #ZF-4422 + $this->_options['cache_file_umask'] = octdec($this->_options['cache_file_umask']); + } + } + + /** + * Set the cache_dir (particular case of setOption() method) + * + * @param string $value + * @param boolean $trailingSeparator If true, add a trailing separator is necessary + * @throws Zend_Cache_Exception + * @return void + */ + public function setCacheDir($value, $trailingSeparator = true) + { + if (!is_dir($value)) { + Zend_Cache::throwException('cache_dir must be a directory'); + } + if (!is_writable($value)) { + Zend_Cache::throwException('cache_dir is not writable'); + } + if ($trailingSeparator) { + // add a trailing DIRECTORY_SEPARATOR if necessary + $value = rtrim(realpath($value), '\\/') . DIRECTORY_SEPARATOR; + } + $this->_options['cache_dir'] = $value; + } + + /** + * Test if a cache is available for the given id and (if yes) return it (false else) + * + * @param string $id cache id + * @param boolean $doNotTestCacheValidity if set to true, the cache validity won't be tested + * @return string|false cached datas + */ + public function load($id, $doNotTestCacheValidity = false) + { + if (!($this->_test($id, $doNotTestCacheValidity))) { + // The cache is not hit ! + return false; + } + $metadatas = $this->_getMetadatas($id); + $file = $this->_file($id); + $data = $this->_fileGetContents($file); + if ($this->_options['read_control']) { + $hashData = $this->_hash($data, $this->_options['read_control_type']); + $hashControl = $metadatas['hash']; + if ($hashData != $hashControl) { + // Problem detected by the read control ! + $this->_log('Zend_Cache_Backend_File::load() / read_control : stored hash and computed hash do not match'); + $this->remove($id); + return false; + } + } + return $data; + } + + /** + * Test if a cache is available or not (for the given id) + * + * @param string $id cache id + * @return mixed false (a cache is not available) or "last modified" timestamp (int) of the available cache record + */ + public function test($id) + { + clearstatcache(); + return $this->_test($id, false); + } + + /** + * Save some string datas into a cache record + * + * Note : $data is always "string" (serialization is done by the + * core not by the backend) + * + * @param string $data Datas to cache + * @param string $id Cache id + * @param array $tags Array of strings, the cache record will be tagged by each string entry + * @param int $specificLifetime If != false, set a specific lifetime for this cache record (null => infinite lifetime) + * @return boolean true if no problem + */ + public function save($data, $id, $tags = array(), $specificLifetime = false) + { + clearstatcache(); + $file = $this->_file($id); + $path = $this->_path($id); + if ($this->_options['hashed_directory_level'] > 0) { + if (!is_writable($path)) { + // maybe, we just have to build the directory structure + $this->_recursiveMkdirAndChmod($id); + } + if (!is_writable($path)) { + return false; + } + } + if ($this->_options['read_control']) { + $hash = $this->_hash($data, $this->_options['read_control_type']); + } else { + $hash = ''; + } + $metadatas = array( + 'hash' => $hash, + 'mtime' => time(), + 'expire' => $this->_expireTime($this->getLifetime($specificLifetime)), + 'tags' => $tags + ); + $res = $this->_setMetadatas($id, $metadatas); + if (!$res) { + $this->_log('Zend_Cache_Backend_File::save() / error on saving metadata'); + return false; + } + $res = $this->_filePutContents($file, $data); + return $res; + } + + /** + * Remove a cache record + * + * @param string $id cache id + * @return boolean true if no problem + */ + public function remove($id) + { + $file = $this->_file($id); + return ($this->_delMetadatas($id) && $this->_remove($file)); + } + + /** + * Clean some cache records + * + * Available modes are : + * 'all' (default) => remove all cache entries ($tags is not used) + * 'old' => remove too old cache entries ($tags is not used) + * 'matchingTag' => remove cache entries matching all given tags + * ($tags can be an array of strings or a single string) + * 'notMatchingTag' => remove cache entries not matching one of the given tags + * ($tags can be an array of strings or a single string) + * 'matchingAnyTag' => remove cache entries matching any given tags + * ($tags can be an array of strings or a single string) + * + * @param string $mode clean mode + * @param tags array $tags array of tags + * @return boolean true if no problem + */ + public function clean($mode = Zend_Cache::CLEANING_MODE_ALL, $tags = array()) + { + // We use this private method to hide the recursive stuff + clearstatcache(); + return $this->_clean($this->_options['cache_dir'], $mode, $tags); + } + + /** + * Return an array of stored cache ids + * + * @return array array of stored cache ids (string) + */ + public function getIds() + { + return $this->_get($this->_options['cache_dir'], 'ids', array()); + } + + /** + * Return an array of stored tags + * + * @return array array of stored tags (string) + */ + public function getTags() + { + return $this->_get($this->_options['cache_dir'], 'tags', 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 + * @return array array of matching cache ids (string) + */ + public function getIdsMatchingTags($tags = array()) + { + return $this->_get($this->_options['cache_dir'], 'matching', $tags); + } + + /** + * 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 $this->_get($this->_options['cache_dir'], 'notMatching', $tags); + } + + /** + * 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 $this->_get($this->_options['cache_dir'], 'matchingAny', $tags); + } + + /** + * Return the filling percentage of the backend storage + * + * @throws Zend_Cache_Exception + * @return int integer between 0 and 100 + */ + public function getFillingPercentage() + { + $free = disk_free_space($this->_options['cache_dir']); + $total = disk_total_space($this->_options['cache_dir']); + if ($total == 0) { + Zend_Cache::throwException('can\'t get disk_total_space'); + } else { + if ($free >= $total) { + return 100; + } + return ((int) (100. * ($total - $free) / $total)); + } + } + + /** + * Return an array of metadatas for the given cache id + * + * The array must include these keys : + * - 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) + { + $metadatas = $this->_getMetadatas($id); + if (!$metadatas) { + return false; + } + if (time() > $metadatas['expire']) { + return false; + } + return array( + 'expire' => $metadatas['expire'], + 'tags' => $metadatas['tags'], + 'mtime' => $metadatas['mtime'] + ); + } + + /** + * Give (if possible) an extra lifetime to the given cache id + * + * @param string $id cache id + * @param int $extraLifetime + * @return boolean true if ok + */ + public function touch($id, $extraLifetime) + { + $metadatas = $this->_getMetadatas($id); + if (!$metadatas) { + return false; + } + if (time() > $metadatas['expire']) { + return false; + } + $newMetadatas = array( + 'hash' => $metadatas['hash'], + 'mtime' => time(), + 'expire' => $metadatas['expire'] + $extraLifetime, + 'tags' => $metadatas['tags'] + ); + $res = $this->_setMetadatas($id, $newMetadatas); + if (!$res) { + return false; + } + return true; + } + + /** + * 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) + * - expired_read (is it possible to read expired cache records + * (for doNotTestCacheValidity option for example)) + * - 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() + { + return array( + 'automatic_cleaning' => true, + 'tags' => true, + 'expired_read' => true, + 'priority' => false, + 'infinite_lifetime' => true, + 'get_list' => true + ); + } + + /** + * PUBLIC METHOD FOR UNIT TESTING ONLY ! + * + * Force a cache record to expire + * + * @param string $id cache id + */ + public function ___expire($id) + { + $metadatas = $this->_getMetadatas($id); + if ($metadatas) { + $metadatas['expire'] = 1; + $this->_setMetadatas($id, $metadatas); + } + } + + /** + * Get a metadatas record + * + * @param string $id Cache id + * @return array|false Associative array of metadatas + */ + private function _getMetadatas($id) + { + if (isset($this->_metadatasArray[$id])) { + return $this->_metadatasArray[$id]; + } else { + $metadatas = $this->_loadMetadatas($id); + if (!$metadatas) { + return false; + } + $this->_setMetadatas($id, $metadatas, false); + return $metadatas; + } + } + + /** + * Set a metadatas record + * + * @param string $id Cache id + * @param array $metadatas Associative array of metadatas + * @param boolean $save optional pass false to disable saving to file + * @return boolean True if no problem + */ + private function _setMetadatas($id, $metadatas, $save = true) + { + if (count($this->_metadatasArray) >= $this->_options['metadatas_array_max_size']) { + $n = (int) ($this->_options['metadatas_array_max_size'] / 10); + $this->_metadatasArray = array_slice($this->_metadatasArray, $n); + } + if ($save) { + $result = $this->_saveMetadatas($id, $metadatas); + if (!$result) { + return false; + } + } + $this->_metadatasArray[$id] = $metadatas; + return true; + } + + /** + * Drop a metadata record + * + * @param string $id Cache id + * @return boolean True if no problem + */ + private function _delMetadatas($id) + { + if (isset($this->_metadatasArray[$id])) { + unset($this->_metadatasArray[$id]); + } + $file = $this->_metadatasFile($id); + return $this->_remove($file); + } + + /** + * Clear the metadatas array + * + * @return void + */ + private function _cleanMetadatas() + { + $this->_metadatasArray = array(); + } + + /** + * Load metadatas from disk + * + * @param string $id Cache id + * @return array|false Metadatas associative array + */ + private function _loadMetadatas($id) + { + $file = $this->_metadatasFile($id); + $result = $this->_fileGetContents($file); + if (!$result) { + return false; + } + $tmp = @unserialize($result); + return $tmp; + } + + /** + * Save metadatas to disk + * + * @param string $id Cache id + * @param array $metadatas Associative array + * @return boolean True if no problem + */ + private function _saveMetadatas($id, $metadatas) + { + $file = $this->_metadatasFile($id); + $result = $this->_filePutContents($file, serialize($metadatas)); + if (!$result) { + return false; + } + return true; + } + + /** + * Make and return a file name (with path) for metadatas + * + * @param string $id Cache id + * @return string Metadatas file name (with path) + */ + private function _metadatasFile($id) + { + $path = $this->_path($id); + $fileName = $this->_idToFileName('internal-metadatas---' . $id); + return $path . $fileName; + } + + /** + * Check if the given filename is a metadatas one + * + * @param string $fileName File name + * @return boolean True if it's a metadatas one + */ + private function _isMetadatasFile($fileName) + { + $id = $this->_fileNameToId($fileName); + if (substr($id, 0, 21) == 'internal-metadatas---') { + return true; + } else { + return false; + } + } + + /** + * Remove a file + * + * If we can't remove the file (because of locks or any problem), we will touch + * the file to invalidate it + * + * @param string $file Complete file path + * @return boolean True if ok + */ + private function _remove($file) + { + if (!is_file($file)) { + return false; + } + if (!@unlink($file)) { + # we can't remove the file (because of locks or any problem) + $this->_log("Zend_Cache_Backend_File::_remove() : we can't remove $file"); + return false; + } + return true; + } + + /** + * Clean some cache records (private method used for recursive stuff) + * + * Available modes are : + * Zend_Cache::CLEANING_MODE_ALL (default) => remove all cache entries ($tags is not used) + * Zend_Cache::CLEANING_MODE_OLD => remove too old cache entries ($tags is not used) + * Zend_Cache::CLEANING_MODE_MATCHING_TAG => remove cache entries matching all given tags + * ($tags can be an array of strings or a single string) + * Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG => remove cache entries not {matching one of the given tags} + * ($tags can be an array of strings or a single string) + * Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG => remove cache entries matching any given tags + * ($tags can be an array of strings or a single string) + * + * @param string $dir Directory to clean + * @param string $mode Clean mode + * @param array $tags Array of tags + * @throws Zend_Cache_Exception + * @return boolean True if no problem + */ + private function _clean($dir, $mode = Zend_Cache::CLEANING_MODE_ALL, $tags = array()) + { + if (!is_dir($dir)) { + return false; + } + $result = true; + $prefix = $this->_options['file_name_prefix']; + $glob = @glob($dir . $prefix . '--*'); + if ($glob === false) { + return true; + } + foreach ($glob as $file) { + if (is_file($file)) { + $fileName = basename($file); + if ($this->_isMetadatasFile($fileName)) { + // in CLEANING_MODE_ALL, we drop anything, even remainings old metadatas files + if ($mode != Zend_Cache::CLEANING_MODE_ALL) { + continue; + } + } + $id = $this->_fileNameToId($fileName); + $metadatas = $this->_getMetadatas($id); + if ($metadatas === FALSE) { + $metadatas = array('expire' => 1, 'tags' => array()); + } + switch ($mode) { + case Zend_Cache::CLEANING_MODE_ALL: + $res = $this->remove($id); + if (!$res) { + // in this case only, we accept a problem with the metadatas file drop + $res = $this->_remove($file); + } + $result = $result && $res; + break; + case Zend_Cache::CLEANING_MODE_OLD: + if (time() > $metadatas['expire']) { + $result = ($result) && ($this->remove($id)); + } + break; + case Zend_Cache::CLEANING_MODE_MATCHING_TAG: + $matching = true; + foreach ($tags as $tag) { + if (!in_array($tag, $metadatas['tags'])) { + $matching = false; + break; + } + } + if ($matching) { + $result = ($result) && ($this->remove($id)); + } + break; + case Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG: + $matching = false; + foreach ($tags as $tag) { + if (in_array($tag, $metadatas['tags'])) { + $matching = true; + break; + } + } + if (!$matching) { + $result = ($result) && $this->remove($id); + } + break; + case Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG: + $matching = false; + foreach ($tags as $tag) { + if (in_array($tag, $metadatas['tags'])) { + $matching = true; + break; + } + } + if ($matching) { + $result = ($result) && ($this->remove($id)); + } + break; + default: + Zend_Cache::throwException('Invalid mode for clean() method'); + break; + } + } + if ((is_dir($file)) and ($this->_options['hashed_directory_level']>0)) { + // Recursive call + $result = ($result) && ($this->_clean($file . DIRECTORY_SEPARATOR, $mode, $tags)); + if ($mode=='all') { + // if mode=='all', we try to drop the structure too + @rmdir($file); + } + } + } + return $result; + } + + private function _get($dir, $mode, $tags = array()) + { + if (!is_dir($dir)) { + return false; + } + $result = array(); + $prefix = $this->_options['file_name_prefix']; + $glob = @glob($dir . $prefix . '--*'); + if ($glob === false) { + return true; + } + foreach ($glob as $file) { + if (is_file($file)) { + $fileName = basename($file); + $id = $this->_fileNameToId($fileName); + $metadatas = $this->_getMetadatas($id); + if ($metadatas === FALSE) { + continue; + } + if (time() > $metadatas['expire']) { + continue; + } + switch ($mode) { + case 'ids': + $result[] = $id; + break; + case 'tags': + $result = array_unique(array_merge($result, $metadatas['tags'])); + break; + case 'matching': + $matching = true; + foreach ($tags as $tag) { + if (!in_array($tag, $metadatas['tags'])) { + $matching = false; + break; + } + } + if ($matching) { + $result[] = $id; + } + break; + case 'notMatching': + $matching = false; + foreach ($tags as $tag) { + if (in_array($tag, $metadatas['tags'])) { + $matching = true; + break; + } + } + if (!$matching) { + $result[] = $id; + } + break; + case 'matchingAny': + $matching = false; + foreach ($tags as $tag) { + if (in_array($tag, $metadatas['tags'])) { + $matching = true; + break; + } + } + if ($matching) { + $result[] = $id; + } + break; + default: + Zend_Cache::throwException('Invalid mode for _get() method'); + break; + } + } + if ((is_dir($file)) and ($this->_options['hashed_directory_level']>0)) { + // Recursive call + $result = array_unique(array_merge($result, $this->_get($file . DIRECTORY_SEPARATOR, $mode, $tags))); + } + } + return array_unique($result); + } + + /** + * Compute & return the expire time + * + * @return int expire time (unix timestamp) + */ + private function _expireTime($lifetime) + { + if (is_null($lifetime)) { + return 9999999999; + } + return time() + $lifetime; + } + + /** + * Make a control key with the string containing datas + * + * @param string $data Data + * @param string $controlType Type of control 'md5', 'crc32' or 'strlen' + * @throws Zend_Cache_Exception + * @return string Control key + */ + private function _hash($data, $controlType) + { + switch ($controlType) { + case 'md5': + return md5($data); + case 'crc32': + return crc32($data); + case 'strlen': + return strlen($data); + case 'adler32': + return hash('adler32', $data); + default: + Zend_Cache::throwException("Incorrect hash function : $controlType"); + } + } + + /** + * Transform a cache id into a file name and return it + * + * @param string $id Cache id + * @return string File name + */ + private function _idToFileName($id) + { + $prefix = $this->_options['file_name_prefix']; + $result = $prefix . '---' . $id; + return $result; + } + + /** + * Make and return a file name (with path) + * + * @param string $id Cache id + * @return string File name (with path) + */ + private function _file($id) + { + $path = $this->_path($id); + $fileName = $this->_idToFileName($id); + return $path . $fileName; + } + + /** + * Return the complete directory path of a filename (including hashedDirectoryStructure) + * + * @param string $id Cache id + * @param boolean $parts if true, returns array of directory parts instead of single string + * @return string Complete directory path + */ + private function _path($id, $parts = false) + { + $partsArray = array(); + $root = $this->_options['cache_dir']; + $prefix = $this->_options['file_name_prefix']; + if ($this->_options['hashed_directory_level']>0) { + $hash = hash('adler32', $id); + for ($i=0 ; $i < $this->_options['hashed_directory_level'] ; $i++) { + $root = $root . $prefix . '--' . substr($hash, 0, $i + 1) . DIRECTORY_SEPARATOR; + $partsArray[] = $root; + } + } + if ($parts) { + return $partsArray; + } else { + return $root; + } + } + + /** + * Make the directory strucuture for the given id + * + * @param string $id cache id + * @return boolean true + */ + private function _recursiveMkdirAndChmod($id) + { + if ($this->_options['hashed_directory_level'] <=0) { + return true; + } + $partsArray = $this->_path($id, true); + foreach ($partsArray as $part) { + if (!is_dir($part)) { + @mkdir($part, $this->_options['hashed_directory_umask']); + @chmod($part, $this->_options['hashed_directory_umask']); // see #ZF-320 (this line is required in some configurations) + } + } + return true; + } + + /** + * Test if the given cache id is available (and still valid as a cache record) + * + * @param string $id Cache id + * @param boolean $doNotTestCacheValidity If set to true, the cache validity won't be tested + * @return boolean|mixed false (a cache is not available) or "last modified" timestamp (int) of the available cache record + */ + private function _test($id, $doNotTestCacheValidity) + { + $metadatas = $this->_getMetadatas($id); + if (!$metadatas) { + return false; + } + if ($doNotTestCacheValidity || (time() <= $metadatas['expire'])) { + return $metadatas['mtime']; + } + return false; + } + + /** + * Return the file content of the given file + * + * @param string $file File complete path + * @return string File content (or false if problem) + */ + private function _fileGetContents($file) + { + $result = false; + if (!is_file($file)) { + return false; + } + if (function_exists('get_magic_quotes_runtime')) { + $mqr = @get_magic_quotes_runtime(); + @set_magic_quotes_runtime(0); + } + $f = @fopen($file, 'rb'); + if ($f) { + if ($this->_options['file_locking']) @flock($f, LOCK_SH); + $result = stream_get_contents($f); + if ($this->_options['file_locking']) @flock($f, LOCK_UN); + @fclose($f); + } + if (function_exists('set_magic_quotes_runtime')) { + @set_magic_quotes_runtime($mqr); + } + return $result; + } + + /** + * Put the given string into the given file + * + * @param string $file File complete path + * @param string $string String to put in file + * @return boolean true if no problem + */ + private function _filePutContents($file, $string) + { + $result = false; + $f = @fopen($file, 'ab+'); + if ($f) { + if ($this->_options['file_locking']) @flock($f, LOCK_EX); + fseek($f, 0); + ftruncate($f, 0); + $tmp = @fwrite($f, $string); + if (!($tmp === FALSE)) { + $result = true; + } + @fclose($f); + } + @chmod($file, $this->_options['cache_file_umask']); + return $result; + } + + /** + * Transform a file name into cache id and return it + * + * @param string $fileName File name + * @return string Cache id + */ + private function _fileNameToId($fileName) + { + $prefix = $this->_options['file_name_prefix']; + return preg_replace('~^' . $prefix . '---(.*)$~', '$1', $fileName); + } + +} diff --git a/libs/Zend/Cache/Backend/Interface.php b/libs/Zend/Cache/Backend/Interface.php new file mode 100644 index 0000000..09798b1 --- /dev/null +++ b/libs/Zend/Cache/Backend/Interface.php @@ -0,0 +1,98 @@ + infinite lifetime) + * @return boolean true if no problem + */ + public function save($data, $id, $tags = array(), $specificLifetime = false); + + /** + * Remove a cache record + * + * @param string $id Cache id + * @return boolean True if no problem + */ + public function remove($id); + + /** + * Clean some cache records + * + * Available modes are : + * Zend_Cache::CLEANING_MODE_ALL (default) => remove all cache entries ($tags is not used) + * Zend_Cache::CLEANING_MODE_OLD => remove too old cache entries ($tags is not used) + * Zend_Cache::CLEANING_MODE_MATCHING_TAG => remove cache entries matching all given tags + * ($tags can be an array of strings or a single string) + * Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG => remove cache entries not {matching one of the given tags} + * ($tags can be an array of strings or a single string) + * Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG => remove cache entries matching any given tags + * ($tags can be an array of strings or a single string) + * + * @param string $mode Clean mode + * @param array $tags Array of tags + * @return boolean true if no problem + */ + public function clean($mode = Zend_Cache::CLEANING_MODE_ALL, $tags = array()); + +} diff --git a/libs/Zend/Cache/Backend/Memcached.php b/libs/Zend/Cache/Backend/Memcached.php new file mode 100644 index 0000000..f0fe90e --- /dev/null +++ b/libs/Zend/Cache/Backend/Memcached.php @@ -0,0 +1,447 @@ + (array) servers : + * an array of memcached server ; each memcached server is described by an associative array : + * 'host' => (string) : the name of the memcached server + * 'port' => (int) : the port of the memcached server + * 'persistent' => (bool) : use or not persistent connections to this memcached server + * + * =====> (boolean) compression : + * true if you want to use on-the-fly compression + * + * @var array available options + */ + protected $_options = array( + 'servers' => array(array( + 'host' => Zend_Cache_Backend_Memcached::DEFAULT_HOST, + 'port' => Zend_Cache_Backend_Memcached::DEFAULT_PORT, + 'persistent' => Zend_Cache_Backend_Memcached::DEFAULT_PERSISTENT + )), + 'compression' => false + ); + + /** + * Memcache object + * + * @var mixed memcache object + */ + protected $_memcache = null; + + /** + * Constructor + * + * @param array $options associative array of options + * @throws Zend_Cache_Exception + * @return void + */ + public function __construct(array $options = array()) + { + if (!extension_loaded('memcache')) { + Zend_Cache::throwException('The memcache extension must be loaded for using this backend !'); + } + parent::__construct($options); + if (isset($this->_options['servers'])) { + $value= $this->_options['servers']; + if (isset($value['host'])) { + // in this case, $value seems to be a simple associative array (one server only) + $value = array(0 => $value); // let's transform it into a classical array of associative arrays + } + $this->setOption('servers', $value); + } + $this->_memcache = new Memcache; + foreach ($this->_options['servers'] as $server) { + if (!array_key_exists('persistent', $server)) { + $server['persistent'] = Zend_Cache_Backend_Memcached::DEFAULT_PERSISTENT; + } + if (!array_key_exists('port', $server)) { + $server['port'] = Zend_Cache_Backend_Memcached::DEFAULT_PORT; + } + $this->_memcache->addServer($server['host'], $server['port'], $server['persistent']); + } + } + + /** + * Test if a cache is available for the given id and (if yes) return it (false else) + * + * @param string $id Cache id + * @param boolean $doNotTestCacheValidity If set to true, the cache validity won't be tested + * @return string|false cached datas + */ + public function load($id, $doNotTestCacheValidity = false) + { + $tmp = $this->_memcache->get($id); + if (is_array($tmp)) { + return $tmp[0]; + } + return false; + } + + /** + * Test if a cache is available or not (for the given id) + * + * @param string $id Cache id + * @return mixed|false (a cache is not available) or "last modified" timestamp (int) of the available cache record + */ + public function test($id) + { + $tmp = $this->_memcache->get($id); + if (is_array($tmp)) { + return $tmp[1]; + } + return false; + } + + /** + * Save some string datas into a cache record + * + * Note : $data is always "string" (serialization is done by the + * core not by the backend) + * + * @param string $data Datas to cache + * @param string $id Cache id + * @param array $tags Array of strings, the cache record will be tagged by each string entry + * @param int $specificLifetime If != false, set a specific lifetime for this cache record (null => infinite lifetime) + * @return boolean True if no problem + */ + public function save($data, $id, $tags = array(), $specificLifetime = false) + { + $lifetime = $this->getLifetime($specificLifetime); + if ($this->_options['compression']) { + $flag = MEMCACHE_COMPRESSED; + } else { + $flag = 0; + } + if ($this->test($id)) { + // because set and replace seems to have different behaviour + $result = $this->_memcache->replace($id, array($data, time(), $lifetime), $flag, $lifetime); + } else { + $result = $this->_memcache->set($id, array($data, time(), $lifetime), $flag, $lifetime); + } + if (count($tags) > 0) { + $this->_log("Zend_Cache_Backend_Memcached::save() : tags are unsupported by the Memcached backend"); + } + return $result; + } + + /** + * Remove a cache record + * + * @param string $id Cache id + * @return boolean True if no problem + */ + public function remove($id) + { + return $this->_memcache->delete($id); + } + + /** + * Clean some cache records + * + * Available modes are : + * 'all' (default) => remove all cache entries ($tags is not used) + * 'old' => unsupported + * 'matchingTag' => unsupported + * 'notMatchingTag' => unsupported + * 'matchingAnyTag' => unsupported + * + * @param string $mode Clean mode + * @param array $tags Array of tags + * @throws Zend_Cache_Exception + * @return boolean True if no problem + */ + public function clean($mode = Zend_Cache::CLEANING_MODE_ALL, $tags = array()) + { + switch ($mode) { + case Zend_Cache::CLEANING_MODE_ALL: + return $this->_memcache->flush(); + break; + case Zend_Cache::CLEANING_MODE_OLD: + $this->_log("Zend_Cache_Backend_Memcached::clean() : CLEANING_MODE_OLD is unsupported by the Memcached backend"); + break; + case Zend_Cache::CLEANING_MODE_MATCHING_TAG: + case Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG: + case Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG: + $this->_log(self::TAGS_UNSUPPORTED_BY_CLEAN_OF_MEMCACHED_BACKEND); + break; + default: + Zend_Cache::throwException('Invalid mode for clean() method'); + break; + } + } + + /** + * Return true if the automatic cleaning is available for the backend + * + * @return boolean + */ + public function isAutomaticCleaningAvailable() + { + return false; + } + + /** + * Set the frontend directives + * + * @param array $directives Assoc of directives + * @throws Zend_Cache_Exception + * @return void + */ + public function setDirectives($directives) + { + parent::setDirectives($directives); + $lifetime = $this->getLifetime(false); + if ($lifetime > 2592000) { + // #ZF-3490 : For the memcached backend, there is a lifetime limit of 30 days (2592000 seconds) + $this->_log('memcached backend has a limit of 30 days (2592000 seconds) for the lifetime'); + } + if (is_null($lifetime)) { + // #ZF-4614 : we tranform null to zero to get the maximal lifetime + parent::setDirectives(array('lifetime' => 0)); + } + } + + /** + * Return an array of stored cache ids + * + * @return array array of stored cache ids (string) + */ + public function getIds() + { + $this->_log("Zend_Cache_Backend_Memcached::save() : getting the list of cache ids is unsupported by the Memcache backend"); + return array(); + } + + /** + * Return an array of stored tags + * + * @return array array of stored tags (string) + */ + public function getTags() + { + $this->_log(self::TAGS_UNSUPPORTED_BY_SAVE_OF_MEMCACHED_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 + * @return array array of matching cache ids (string) + */ + public function getIdsMatchingTags($tags = array()) + { + $this->_log(self::TAGS_UNSUPPORTED_BY_SAVE_OF_MEMCACHED_BACKEND); + 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_MEMCACHED_BACKEND); + 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 + * @return array array of any matching cache ids (string) + */ + public function getIdsMatchingAnyTags($tags = array()) + { + $this->_log(self::TAGS_UNSUPPORTED_BY_SAVE_OF_MEMCACHED_BACKEND); + return array(); + } + + /** + * Return the filling percentage of the backend storage + * + * @throws Zend_Cache_Exception + * @return int integer between 0 and 100 + */ + public function getFillingPercentage() + { + $mem = $this->_memcache->getStats(); + $memSize = $mem['limit_maxbytes']; + $memUsed= $mem['bytes']; + if ($memSize == 0) { + Zend_Cache::throwException('can\'t get memcache memory size'); + } + if ($memUsed > $memSize) { + return 100; + } + return ((int) (100. * ($memUsed / $memSize))); + } + + /** + * Return an array of metadatas for the given cache id + * + * The array must include these keys : + * - 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) + { + $tmp = $this->_memcache->get($id); + if (is_array($tmp)) { + $data = $tmp[0]; + $mtime = $tmp[1]; + if (!isset($tmp[2])) { + // because this record is only with 1.7 release + // if old cache records are still there... + return false; + } + $lifetime = $tmp[2]; + return array( + 'expire' => $mtime + $lifetime, + 'tags' => array(), + 'mtime' => $mtime + ); + } + return false; + } + + /** + * Give (if possible) an extra lifetime to the given cache id + * + * @param string $id cache id + * @param int $extraLifetime + * @return boolean true if ok + */ + public function touch($id, $extraLifetime) + { + if ($this->_options['compression']) { + $flag = MEMCACHE_COMPRESSED; + } else { + $flag = 0; + } + $tmp = $this->_memcache->get($id); + if (is_array($tmp)) { + $data = $tmp[0]; + $mtime = $tmp[1]; + if (!isset($tmp[2])) { + // because this record is only with 1.7 release + // if old cache records are still there... + return false; + } + $lifetime = $tmp[2]; + $newLifetime = $lifetime - (time() - $mtime) + $extraLifetime; + if ($newLifetime <=0) { + return false; + } + if ($this->test($id)) { + // because set and replace seems to have different behaviour + $result = $this->_memcache->replace($id, array($data, time(), $newLifetime), $flag, $newLifetime); + } else { + $result = $this->_memcache->set($id, array($data, time(), $newLifetime), $flag, $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) + * - expired_read (is it possible to read expired cache records + * (for doNotTestCacheValidity option for example)) + * - 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() + { + return array( + 'automatic_cleaning' => false, + 'tags' => false, + 'expired_read' => false, + 'priority' => false, + 'infinite_lifetime' => false, + 'get_list' => false + ); + } + +} diff --git a/libs/Zend/Cache/Backend/Sqlite.php b/libs/Zend/Cache/Backend/Sqlite.php new file mode 100644 index 0000000..dc27124 --- /dev/null +++ b/libs/Zend/Cache/Backend/Sqlite.php @@ -0,0 +1,678 @@ + (string) cache_db_complete_path : + * - the complete path (filename included) of the SQLITE database + * + * ====> (int) automatic_vacuum_factor : + * - Disable / Tune the automatic vacuum process + * - The automatic vacuum process defragment the database file (and make it smaller) + * when a clean() or delete() is called + * 0 => no automatic vacuum + * 1 => systematic vacuum (when delete() or clean() methods are called) + * x (integer) > 1 => automatic vacuum randomly 1 times on x clean() or delete() + * + * @var array Available options + */ + protected $_options = array( + 'cache_db_complete_path' => null, + 'automatic_vacuum_factor' => 10 + ); + + /** + * DB ressource + * + * @var mixed $_db + */ + private $_db = null; + + /** + * Boolean to store if the structure has benn checked or not + * + * @var boolean $_structureChecked + */ + private $_structureChecked = false; + + /** + * Constructor + * + * @param array $options Associative array of options + * @throws Zend_cache_Exception + * @return void + */ + public function __construct(array $options = array()) + { + parent::__construct($options); + if (is_null($this->_options['cache_db_complete_path'])) { + Zend_Cache::throwException('cache_db_complete_path option has to set'); + } + if (!extension_loaded('sqlite')) { + Zend_Cache::throwException("Cannot use SQLite storage because the 'sqlite' extension is not loaded in the current PHP environment"); + } + $this->_getConnection(); + } + + /** + * Destructor + * + * @return void + */ + public function __destruct() + { + @sqlite_close($this->_getConnection()); + } + + /** + * Test if a cache is available for the given id and (if yes) return it (false else) + * + * @param string $id Cache id + * @param boolean $doNotTestCacheValidity If set to true, the cache validity won't be tested + * @return string|false Cached datas + */ + public function load($id, $doNotTestCacheValidity = false) + { + $this->_checkAndBuildStructure(); + $sql = "SELECT content FROM cache WHERE id='$id'"; + if (!$doNotTestCacheValidity) { + $sql = $sql . " AND (expire=0 OR expire>" . time() . ')'; + } + $result = $this->_query($sql); + $row = @sqlite_fetch_array($result); + if ($row) { + return $row['content']; + } + return false; + } + + /** + * Test if a cache is available or not (for the given id) + * + * @param string $id Cache id + * @return mixed|false (a cache is not available) or "last modified" timestamp (int) of the available cache record + */ + public function test($id) + { + $this->_checkAndBuildStructure(); + $sql = "SELECT lastModified FROM cache WHERE id='$id' AND (expire=0 OR expire>" . time() . ')'; + $result = $this->_query($sql); + $row = @sqlite_fetch_array($result); + if ($row) { + return ((int) $row['lastModified']); + } + return false; + } + + /** + * Save some string datas into a cache record + * + * Note : $data is always "string" (serialization is done by the + * core not by the backend) + * + * @param string $data Datas to cache + * @param string $id Cache id + * @param array $tags Array of strings, the cache record will be tagged by each string entry + * @param int $specificLifetime If != false, set a specific lifetime for this cache record (null => infinite lifetime) + * @throws Zend_Cache_Exception + * @return boolean True if no problem + */ + public function save($data, $id, $tags = array(), $specificLifetime = false) + { + $this->_checkAndBuildStructure(); + $lifetime = $this->getLifetime($specificLifetime); + $data = @sqlite_escape_string($data); + $mktime = time(); + if (is_null($lifetime)) { + $expire = 0; + } else { + $expire = $mktime + $lifetime; + } + $this->_query("DELETE FROM cache WHERE id='$id'"); + $sql = "INSERT INTO cache (id, content, lastModified, expire) VALUES ('$id', '$data', $mktime, $expire)"; + $res = $this->_query($sql); + if (!$res) { + $this->_log("Zend_Cache_Backend_Sqlite::save() : impossible to store the cache id=$id"); + return false; + } + $res = true; + foreach ($tags as $tag) { + $res = $res && $this->_registerTag($id, $tag); + } + return $res; + } + + /** + * Remove a cache record + * + * @param string $id Cache id + * @return boolean True if no problem + */ + public function remove($id) + { + $this->_checkAndBuildStructure(); + $res = $this->_query("SELECT COUNT(*) AS nbr FROM cache WHERE id='$id'"); + $result1 = @sqlite_fetch_single($res); + $result2 = $this->_query("DELETE FROM cache WHERE id='$id'"); + $result3 = $this->_query("DELETE FROM tag WHERE id='$id'"); + $this->_automaticVacuum(); + return ($result1 && $result2 && $result3); + } + + /** + * Clean some cache records + * + * Available modes are : + * Zend_Cache::CLEANING_MODE_ALL (default) => remove all cache entries ($tags is not used) + * Zend_Cache::CLEANING_MODE_OLD => remove too old cache entries ($tags is not used) + * Zend_Cache::CLEANING_MODE_MATCHING_TAG => remove cache entries matching all given tags + * ($tags can be an array of strings or a single string) + * Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG => remove cache entries not {matching one of the given tags} + * ($tags can be an array of strings or a single string) + * Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG => remove cache entries matching any given tags + * ($tags can be an array of strings or a single string) + * + * @param string $mode Clean mode + * @param array $tags Array of tags + * @return boolean True if no problem + */ + public function clean($mode = Zend_Cache::CLEANING_MODE_ALL, $tags = array()) + { + $this->_checkAndBuildStructure(); + $return = $this->_clean($mode, $tags); + $this->_automaticVacuum(); + return $return; + } + + /** + * Return an array of stored cache ids + * + * @return array array of stored cache ids (string) + */ + public function getIds() + { + $this->_checkAndBuildStructure(); + $res = $this->_query("SELECT id FROM cache WHERE (expire=0 OR expire>" . time() . ")"); + $result = array(); + while ($id = @sqlite_fetch_single($res)) { + $result[] = $id; + } + return $result; + } + + /** + * Return an array of stored tags + * + * @return array array of stored tags (string) + */ + public function getTags() + { + $this->_checkAndBuildStructure(); + $res = $this->_query("SELECT DISTINCT(name) AS name FROM tag"); + $result = array(); + while ($id = @sqlite_fetch_single($res)) { + $result[] = $id; + } + return $result; + } + + /** + * 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 + * @return array array of matching cache ids (string) + */ + public function getIdsMatchingTags($tags = array()) + { + $first = true; + $ids = array(); + foreach ($tags as $tag) { + $res = $this->_query("SELECT DISTINCT(id) AS id FROM tag WHERE name='$tag'"); + if (!$res) { + return array(); + } + $rows = @sqlite_fetch_all($res, SQLITE_ASSOC); + $ids2 = array(); + foreach ($rows as $row) { + $ids2[] = $row['id']; + } + if ($first) { + $ids = $ids2; + $first = false; + } else { + $ids = array_intersect($ids, $ids2); + } + } + $result = array(); + foreach ($ids as $id) { + $result[] = $id; + } + return $result; + } + + /** + * 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()) + { + $res = $this->_query("SELECT id FROM cache"); + $rows = @sqlite_fetch_all($res, SQLITE_ASSOC); + $result = array(); + foreach ($rows as $row) { + $id = $row['id']; + $matching = false; + foreach ($tags as $tag) { + $res = $this->_query("SELECT COUNT(*) AS nbr FROM tag WHERE name='$tag' AND id='$id'"); + if (!$res) { + return array(); + } + $nbr = (int) @sqlite_fetch_single($res); + if ($nbr > 0) { + $matching = true; + } + } + if (!$matching) { + $result[] = $id; + } + } + return $result; + } + + /** + * 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()) + { + $first = true; + $ids = array(); + foreach ($tags as $tag) { + $res = $this->_query("SELECT DISTINCT(id) AS id FROM tag WHERE name='$tag'"); + if (!$res) { + return array(); + } + $rows = @sqlite_fetch_all($res, SQLITE_ASSOC); + $ids2 = array(); + foreach ($rows as $row) { + $ids2[] = $row['id']; + } + if ($first) { + $ids = $ids2; + $first = false; + } else { + $ids = array_merge($ids, $ids2); + } + } + $result = array(); + foreach ($ids as $id) { + $result[] = $id; + } + return $result; + } + + /** + * Return the filling percentage of the backend storage + * + * @throws Zend_Cache_Exception + * @return int integer between 0 and 100 + */ + public function getFillingPercentage() + { + $dir = dirname($this->_options['cache_db_complete_path']); + $free = disk_free_space($dir); + $total = disk_total_space($dir); + if ($total == 0) { + Zend_Cache::throwException('can\'t get disk_total_space'); + } else { + if ($free >= $total) { + return 100; + } + return ((int) (100. * ($total - $free) / $total)); + } + } + + /** + * Return an array of metadatas for the given cache id + * + * The array must include these keys : + * - 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) + { + $tags = array(); + $res = $this->_query("SELECT name FROM tag WHERE id='$id'"); + if ($res) { + $rows = @sqlite_fetch_all($res, SQLITE_ASSOC); + foreach ($rows as $row) { + $tags[] = $row['name']; + } + } + $this->_query('CREATE TABLE cache (id TEXT PRIMARY KEY, content BLOB, lastModified INTEGER, expire INTEGER)'); + $res = $this->_query("SELECT lastModified,expire FROM cache WHERE id='$id'"); + if (!$res) { + return false; + } + $row = @sqlite_fetch_array($res, SQLITE_ASSOC); + return array( + 'tags' => $tags, + 'mtime' => $row['lastModified'], + 'expire' => $row['expire'] + ); + } + + /** + * Give (if possible) an extra lifetime to the given cache id + * + * @param string $id cache id + * @param int $extraLifetime + * @return boolean true if ok + */ + public function touch($id, $extraLifetime) + { + $sql = "SELECT expire FROM cache WHERE id='$id' AND (expire=0 OR expire>" . time() . ')'; + $res = $this->_query($sql); + if (!$res) { + return false; + } + $expire = @sqlite_fetch_single($res); + $newExpire = $expire + $extraLifetime; + $res = $this->_query("UPDATE cache SET lastModified=" . time() . ", expire=$newExpire WHERE id='$id'"); + if ($res) { + return true; + } else { + 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) + * - expired_read (is it possible to read expired cache records + * (for doNotTestCacheValidity option for example)) + * - 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() + { + return array( + 'automatic_cleaning' => true, + 'tags' => true, + 'expired_read' => true, + 'priority' => false, + 'infinite_lifetime' => true, + 'get_list' => true + ); + } + + /** + * PUBLIC METHOD FOR UNIT TESTING ONLY ! + * + * Force a cache record to expire + * + * @param string $id Cache id + */ + public function ___expire($id) + { + $time = time() - 1; + $this->_query("UPDATE cache SET lastModified=$time, expire=$time WHERE id='$id'"); + } + + /** + * Return the connection resource + * + * If we are not connected, the connection is made + * + * @throws Zend_Cache_Exception + * @return resource Connection resource + */ + private function _getConnection() + { + if (is_resource($this->_db)) { + return $this->_db; + } else { + $this->_db = @sqlite_open($this->_options['cache_db_complete_path']); + if (!(is_resource($this->_db))) { + Zend_Cache::throwException("Impossible to open " . $this->_options['cache_db_complete_path'] . " cache DB file"); + } + return $this->_db; + } + } + + /** + * Execute an SQL query silently + * + * @param string $query SQL query + * @return mixed|false query results + */ + private function _query($query) + { + $db = $this->_getConnection(); + if (is_resource($db)) { + $res = @sqlite_query($db, $query); + if ($res === false) { + return false; + } else { + return $res; + } + } + return false; + } + + /** + * Deal with the automatic vacuum process + * + * @return void + */ + private function _automaticVacuum() + { + if ($this->_options['automatic_vacuum_factor'] > 0) { + $rand = rand(1, $this->_options['automatic_vacuum_factor']); + if ($rand == 1) { + $this->_query('VACUUM'); + @sqlite_close($this->_getConnection()); + } + } + } + + /** + * Register a cache id with the given tag + * + * @param string $id Cache id + * @param string $tag Tag + * @return boolean True if no problem + */ + private function _registerTag($id, $tag) { + $res = $this->_query("DELETE FROM TAG WHERE name='$tag' AND id='$id'"); + $res = $this->_query("INSERT INTO tag (name, id) VALUES ('$tag', '$id')"); + if (!$res) { + $this->_log("Zend_Cache_Backend_Sqlite::_registerTag() : impossible to register tag=$tag on id=$id"); + return false; + } + return true; + } + + /** + * Build the database structure + * + * @return false + */ + private function _buildStructure() + { + $this->_query('DROP INDEX tag_id_index'); + $this->_query('DROP INDEX tag_name_index'); + $this->_query('DROP INDEX cache_id_expire_index'); + $this->_query('DROP TABLE version'); + $this->_query('DROP TABLE cache'); + $this->_query('DROP TABLE tag'); + $this->_query('CREATE TABLE version (num INTEGER PRIMARY KEY)'); + $this->_query('CREATE TABLE cache (id TEXT PRIMARY KEY, content BLOB, lastModified INTEGER, expire INTEGER)'); + $this->_query('CREATE TABLE tag (name TEXT, id TEXT)'); + $this->_query('CREATE INDEX tag_id_index ON tag(id)'); + $this->_query('CREATE INDEX tag_name_index ON tag(name)'); + $this->_query('CREATE INDEX cache_id_expire_index ON cache(id, expire)'); + $this->_query('INSERT INTO version (num) VALUES (1)'); + } + + /** + * Check if the database structure is ok (with the good version) + * + * @return boolean True if ok + */ + private function _checkStructureVersion() + { + $result = $this->_query("SELECT num FROM version"); + if (!$result) return false; + $row = @sqlite_fetch_array($result); + if (!$row) { + return false; + } + if (((int) $row['num']) != 1) { + // old cache structure + $this->_log('Zend_Cache_Backend_Sqlite::_checkStructureVersion() : old cache structure version detected => the cache is going to be dropped'); + return false; + } + return true; + } + + /** + * Clean some cache records + * + * Available modes are : + * Zend_Cache::CLEANING_MODE_ALL (default) => remove all cache entries ($tags is not used) + * Zend_Cache::CLEANING_MODE_OLD => remove too old cache entries ($tags is not used) + * Zend_Cache::CLEANING_MODE_MATCHING_TAG => remove cache entries matching all given tags + * ($tags can be an array of strings or a single string) + * Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG => remove cache entries not {matching one of the given tags} + * ($tags can be an array of strings or a single string) + * Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG => remove cache entries matching any given tags + * ($tags can be an array of strings or a single string) + * + * @param string $mode Clean mode + * @param array $tags Array of tags + * @return boolean True if no problem + */ + private function _clean($mode = Zend_Cache::CLEANING_MODE_ALL, $tags = array()) + { + switch ($mode) { + case Zend_Cache::CLEANING_MODE_ALL: + $res1 = $this->_query('DELETE FROM cache'); + $res2 = $this->_query('DELETE FROM tag'); + return $res1 && $res2; + break; + case Zend_Cache::CLEANING_MODE_OLD: + $mktime = time(); + $res1 = $this->_query("DELETE FROM tag WHERE id IN (SELECT id FROM cache WHERE expire>0 AND expire<=$mktime)"); + $res2 = $this->_query("DELETE FROM cache WHERE expire>0 AND expire<=$mktime"); + return $res1 && $res2; + break; + case Zend_Cache::CLEANING_MODE_MATCHING_TAG: + $ids = $this->getIdsMatchingTags($tags); + $result = true; + foreach ($ids as $id) { + $result = $result && ($this->remove($id)); + } + return $result; + break; + case Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG: + $ids = $this->getIdsNotMatchingTags($tags); + $result = true; + foreach ($ids as $id) { + $result = $result && ($this->remove($id)); + } + return $result; + break; + case Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG: + $ids = $this->getIdsMatchingAnyTags($tags); + $result = true; + foreach ($ids as $id) { + $result = $result && ($this->remove($id)); + } + return $result; + break; + default: + break; + } + return false; + } + + /** + * Check if the database structure is ok (with the good version), if no : build it + * + * @throws Zend_Cache_Exception + * @return boolean True if ok + */ + private function _checkAndBuildStructure() + { + if (!($this->_structureChecked)) { + if (!$this->_checkStructureVersion()) { + $this->_buildStructure(); + if (!$this->_checkStructureVersion()) { + Zend_Cache::throwException("Impossible to build cache structure in " . $this->_options['cache_db_complete_path']); + } + } + $this->_structureChecked = true; + } + return true; + } + +} diff --git a/libs/Zend/Cache/Backend/Test.php b/libs/Zend/Cache/Backend/Test.php new file mode 100644 index 0000000..b214612 --- /dev/null +++ b/libs/Zend/Cache/Backend/Test.php @@ -0,0 +1,269 @@ +_addLog('construct', array($options)); + } + + /** + * Set the frontend directives + * + * @param array $directives assoc of directives + * @return void + */ + public function setDirectives($directives) + { + $this->_addLog('setDirectives', array($directives)); + } + + /** + * Test if a cache is available for the given id and (if yes) return it (false else) + * + * For this test backend only, if $id == 'false', then the method will return false + * if $id == 'serialized', the method will return a serialized array + * ('foo' else) + * + * @param string $id Cache id + * @param boolean $doNotTestCacheValidity If set to true, the cache validity won't be tested + * @return string Cached datas (or false) + */ + public function load($id, $doNotTestCacheValidity = false) + { + $this->_addLog('get', array($id, $doNotTestCacheValidity)); + if ($id=='false') { + return false; + } + if ($id=='serialized') { + return serialize(array('foo')); + } + if ($id=='serialized2') { + return serialize(array('headers' => array(), 'data' => 'foo')); + } + if (($id=='71769f39054f75894288e397df04e445') or ($id=='615d222619fb20b527168340cebd0578')) { + return serialize(array('foo', 'bar')); + } + if (($id=='8a02d218a5165c467e7a5747cc6bd4b6') or ($id=='648aca1366211d17cbf48e65dc570bee')) { + return serialize(array('foo', 'bar')); + } + return 'foo'; + } + + /** + * Test if a cache is available or not (for the given id) + * + * For this test backend only, if $id == 'false', then the method will return false + * (123456 else) + * + * @param string $id Cache id + * @return mixed|false false (a cache is not available) or "last modified" timestamp (int) of the available cache record + */ + public function test($id) + { + $this->_addLog('test', array($id)); + if ($id=='false') { + return false; + } + if (($id=='d8523b3ee441006261eeffa5c3d3a0a7') or ($id=='3c439c922209e2cb0b54d6deffccd75a')) { + return false; + } + if (($id=='40f649b94977c0a6e76902e2a0b43587') or ($id=='e83249ea22178277d5befc2c5e2e9ace')) { + return false; + } + return 123456; + } + + /** + * Save some string datas into a cache record + * + * For this test backend only, if $id == 'false', then the method will return false + * (true else) + * + * @param string $data Datas to cache + * @param string $id Cache id + * @param array $tags Array of strings, the cache record will be tagged by each string entry + * @param int $specificLifetime If != false, set a specific lifetime for this cache record (null => infinite lifetime) + * @return boolean True if no problem + */ + public function save($data, $id, $tags = array(), $specificLifetime = false) + { + $this->_addLog('save', array($data, $id, $tags)); + if ($id=='false') { + return false; + } + return true; + } + + /** + * Remove a cache record + * + * For this test backend only, if $id == 'false', then the method will return false + * (true else) + * + * @param string $id Cache id + * @return boolean True if no problem + */ + public function remove($id) + { + $this->_addLog('remove', array($id)); + if ($id=='false') { + return false; + } + return true; + } + + /** + * Clean some cache records + * + * For this test backend only, if $mode == 'false', then the method will return false + * (true else) + * + * Available modes are : + * Zend_Cache::CLEANING_MODE_ALL (default) => remove all cache entries ($tags is not used) + * Zend_Cache::CLEANING_MODE_OLD => remove too old cache entries ($tags is not used) + * Zend_Cache::CLEANING_MODE_MATCHING_TAG => remove cache entries matching all given tags + * ($tags can be an array of strings or a single string) + * Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG => remove cache entries not {matching one of the given tags} + * ($tags can be an array of strings or a single string) + * + * @param string $mode Clean mode + * @param array $tags Array of tags + * @return boolean True if no problem + */ + public function clean($mode = Zend_Cache::CLEANING_MODE_ALL, $tags = array()) + { + $this->_addLog('clean', array($mode, $tags)); + if ($mode=='false') { + return false; + } + return true; + } + + /** + * Get the last log + * + * @return string The last log + */ + public function getLastLog() + { + return $this->_log[$this->_index - 1]; + } + + /** + * Get the log index + * + * @return int Log index + */ + public function getLogIndex() + { + return $this->_index; + } + + /** + * Get the complete log array + * + * @return array Complete log array + */ + public function getAllLogs() + { + return $this->_log; + } + + /** + * Return true if the automatic cleaning is available for the backend + * + * @return boolean + */ + public function isAutomaticCleaningAvailable() + { + return true; + } + + /** + * Add an event to the log array + * + * @param string $methodName MethodName + * @param array $args Arguments + * @return void + */ + private function _addLog($methodName, $args) + { + $this->_log[$this->_index] = array( + 'methodName' => $methodName, + 'args' => $args + ); + $this->_index = $this->_index + 1; + } + +} diff --git a/libs/Zend/Cache/Backend/TwoLevels.php b/libs/Zend/Cache/Backend/TwoLevels.php new file mode 100644 index 0000000..aec8e59 --- /dev/null +++ b/libs/Zend/Cache/Backend/TwoLevels.php @@ -0,0 +1,501 @@ + (string) slow_backend : + * - Slow backend name + * - Must implement the Zend_Cache_Backend_ExtendedInterface + * - Should provide a big storage + * + * =====> (string) fast_backend : + * - Flow backend name + * - Must implement the Zend_Cache_Backend_ExtendedInterface + * - Must be much faster than slow_backend + * + * =====> (array) slow_backend_options : + * - Slow backend options (see corresponding backend) + * + * =====> (array) fast_backend_options : + * - Fast backend options (see corresponding backend) + * + * =====> (int) stats_update_factor : + * - Disable / Tune the computation of the fast backend filling percentage + * - When saving a record into cache : + * 1 => systematic computation of the fast backend filling percentage + * x (integer) > 1 => computation of the fast backend filling percentage randomly 1 times on x cache write + * + * =====> (boolean) slow_backend_custom_naming : + * =====> (boolean) fast_backend_custom_naming : + * =====> (boolean) slow_backend_autoload : + * =====> (boolean) fast_backend_autoload : + * - See Zend_Cache::factory() method + * + * =====> (boolean) auto_refresh_fast_cache + * - If true, auto refresh the fast cache when a cache record is hit + * + * @var array available options + */ + protected $_options = array( + 'slow_backend' => 'File', + 'fast_backend' => 'Apc', + 'slow_backend_options' => array(), + 'fast_backend_options' => array(), + 'stats_update_factor' => 10, + 'slow_backend_custom_naming' => false, + 'fast_backend_custom_naming' => false, + 'slow_backend_autoload' => false, + 'fast_backend_autoload' => false, + 'auto_refresh_fast_cache' => true + ); + + /** + * Slow Backend + * + * @var Zend_Cache_Backend + */ + private $_slowBackend; + + /** + * Fast Backend + * + * @var Zend_Cache_Backend + */ + private $_fastBackend; + + /** + * Cache for the fast backend filling percentage + * + * @var int + */ + private $_fastBackendFillingPercentage = null; + + /** + * Constructor + * + * @param array $options Associative array of options + * @throws Zend_Cache_Exception + * @return void + */ + public function __construct(array $options = array()) + { + parent::__construct($options); + if (is_null($this->_options['slow_backend'])) { + Zend_Cache::throwException('slow_backend option has to set'); + } + if (is_null($this->_options['fast_backend'])) { + Zend_Cache::throwException('fast_backend option has to set'); + } + $this->_slowBackend = Zend_Cache::_makeBackend($this->_options['slow_backend'], $this->_options['slow_backend_options'], $this->_options['slow_backend_custom_naming'], $this->_options['slow_backend_autoload']); + $this->_fastBackend = Zend_Cache::_makeBackend($this->_options['fast_backend'], $this->_options['fast_backend_options'], $this->_options['fast_backend_custom_naming'], $this->_options['fast_backend_autoload']); + if (!in_array('Zend_Cache_Backend_ExtendedInterface', class_implements($this->_slowBackend))) { + Zend_Cache::throwException('slow_backend must implement the Zend_Cache_Backend_ExtendedInterface interface'); + } + if (!in_array('Zend_Cache_Backend_ExtendedInterface', class_implements($this->_fastBackend))) { + Zend_Cache::throwException('slow_backend must implement the Zend_Cache_Backend_ExtendedInterface interface'); + } + $this->_slowBackend->setDirectives($this->_directives); + $this->_fastBackend->setDirectives($this->_directives); + } + + /** + * Test if a cache is available or not (for the given id) + * + * @param string $id cache id + * @return mixed|false (a cache is not available) or "last modified" timestamp (int) of the available cache record + */ + public function test($id) + { + $fastTest = $this->_fastBackend->test($id); + if ($fastTest) { + return $fastTest; + } else { + return $this->_slowBackend->test($id); + } + } + + /** + * Save some string datas into a cache record + * + * Note : $data is always "string" (serialization is done by the + * core not by the backend) + * + * @param string $data Datas to cache + * @param string $id Cache id + * @param array $tags Array of strings, the cache record will be tagged by each string entry + * @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 + * @return boolean true if no problem + */ + public function save($data, $id, $tags = array(), $specificLifetime = false, $priority = 8) + { + $usage = $this->_getFastFillingPercentage('saving'); + $boolFast = true; + $lifetime = $this->getLifetime($specificLifetime); + $preparedData = $this->_prepareData($data, $lifetime, $priority); + if (($priority > 0) && (10 * $priority >= $usage)) { + $fastLifetime = $this->_getFastLifetime($lifetime, $priority); + $boolFast = $this->_fastBackend->save($preparedData, $id, array(), $fastLifetime); + } + $boolSlow = $this->_slowBackend->save($preparedData, $id, $tags, $lifetime); + return ($boolFast && $boolSlow); + } + + /** + * Test if a cache is available for the given id and (if yes) return it (false else) + * + * Note : return value is always "string" (unserialization is done by the core not by the backend) + * + * @param string $id Cache id + * @param boolean $doNotTestCacheValidity If set to true, the cache validity won't be tested + * @return string|false cached datas + */ + public function load($id, $doNotTestCacheValidity = false) + { + $res = $this->_fastBackend->load($id, $doNotTestCacheValidity); + if ($res === false) { + $res = $this->_slowBackend->load($id, $doNotTestCacheValidity); + if ($res === false) { + // there is no cache at all for this id + return false; + } + } + $array = unserialize($res); + // maybe, we have to refresh the fast cache ? + if ($this->_options['auto_refresh_fast_cache']) { + if ($array['priority'] == 10) { + // no need to refresh the fast cache with priority = 10 + return $array['data']; + } + $newFastLifetime = $this->_getFastLifetime($array['lifetime'], $array['priority'], time() - $array['expire']); + // we have the time to refresh the fast cache + $usage = $this->_getFastFillingPercentage('loading'); + if (($array['priority'] > 0) && (10 * $array['priority'] >= $usage)) { + // we can refresh the fast cache + $preparedData = $this->_prepareData($array['data'], $array['lifetime'], $array['priority']); + $this->_fastBackend->save($preparedData, $id, array(), $newFastLifetime); + } + } + return $array['data']; + } + + /** + * Remove a cache record + * + * @param string $id Cache id + * @return boolean True if no problem + */ + public function remove($id) + { + $this->_fastBackend->remove($id); + return $this->_slowBackend->remove($id); + } + + /** + * Clean some cache records + * + * Available modes are : + * Zend_Cache::CLEANING_MODE_ALL (default) => remove all cache entries ($tags is not used) + * Zend_Cache::CLEANING_MODE_OLD => remove too old cache entries ($tags is not used) + * Zend_Cache::CLEANING_MODE_MATCHING_TAG => remove cache entries matching all given tags + * ($tags can be an array of strings or a single string) + * Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG => remove cache entries not {matching one of the given tags} + * ($tags can be an array of strings or a single string) + * Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG => remove cache entries matching any given tags + * ($tags can be an array of strings or a single string) + * + * @param string $mode Clean mode + * @param array $tags Array of tags + * @throws Zend_Cache_Exception + * @return boolean true if no problem + */ + public function clean($mode = Zend_Cache::CLEANING_MODE_ALL, $tags = array()) + { + switch($mode) { + case Zend_Cache::CLEANING_MODE_ALL: + $boolFast = $this->_fastBackend->clean(Zend_Cache::CLEANING_MODE_ALL); + $boolSlow = $this->_slowBackend->clean(Zend_Cache::CLEANING_MODE_ALL); + return $boolFast && $boolSlow; + break; + case Zend_Cache::CLEANING_MODE_OLD: + return $this->_slowBackend->clean(Zend_Cache::CLEANING_MODE_OLD); + case Zend_Cache::CLEANING_MODE_MATCHING_TAG: + $ids = $this->_slowBackend->getIdsMatchingTags($tags); + $res = true; + foreach ($ids as $id) { + $res = $res && $this->_slowBackend->remove($id) && $this->_fastBackend->remove($id); + } + return $res; + break; + case Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG: + $ids = $this->_slowBackend->getIdsNotMatchingTags($tags); + $res = true; + foreach ($ids as $id) { + $res = $res && $this->_slowBackend->remove($id) && $this->_fastBackend->remove($id); + } + return $res; + break; + case Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG: + $ids = $this->_slowBackend->getIdsMatchingAnyTags($tags); + $res = true; + foreach ($ids as $id) { + $res = $res && $this->_slowBackend->remove($id) && $this->_fastBackend->remove($id); + } + return $res; + break; + default: + Zend_Cache::throwException('Invalid mode for clean() method'); + break; + } + } + + /** + * Return an array of stored cache ids + * + * @return array array of stored cache ids (string) + */ + public function getIds() + { + return $this->_slowBackend->getIds(); + } + + /** + * Return an array of stored tags + * + * @return array array of stored tags (string) + */ + public function getTags() + { + return $this->_slowBackend->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 + * @return array array of matching cache ids (string) + */ + public function getIdsMatchingTags($tags = array()) + { + return $this->_slowBackend->getIdsMatchingTags($tags); + } + + /** + * 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 $this->_slowBackend->getIdsNotMatchingTags($tags); + } + + /** + * 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 $this->_slowBackend->getIdsMatchingAnyTags($tags); + } + + + /** + * Return the filling percentage of the backend storage + * + * @return int integer between 0 and 100 + */ + public function getFillingPercentage() + { + return $this->_slowBackend->getFillingPercentage(); + } + + /** + * Return an array of metadatas for the given cache id + * + * The array must include these keys : + * - 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) + { + return $this->_slowBackend->getMetadatas($id); + } + + /** + * Give (if possible) an extra lifetime to the given cache id + * + * @param string $id cache id + * @param int $extraLifetime + * @return boolean true if ok + */ + public function touch($id, $extraLifetime) + { + return $this->_slowBackend->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) + * - expired_read (is it possible to read expired cache records + * (for doNotTestCacheValidity option for example)) + * - 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() + { + $slowBackendCapabilities = $this->_slowBackend->getCapabilities(); + return array( + 'automatic_cleaning' => $slowBackendCapabilities['automatic_cleaning'], + 'tags' => $slowBackendCapabilities['tags'], + 'expired_read' => $slowBackendCapabilities['expired_read'], + 'priority' => $slowBackendCapabilities['priority'], + 'infinite_lifetime' => $slowBackendCapabilities['infinite_lifetime'], + 'get_list' => $slowBackendCapabilities['get_list'] + ); + } + + /** + * Prepare a serialized array to store datas and metadatas informations + * + * @param string $data data to store + * @param int $lifetime original lifetime + * @param int $priority priority + * @return string serialize array to store into cache + */ + private function _prepareData($data, $lifetime, $priority) + { + $lt = $lifetime; + if (is_null($lt)) { + $lt = 9999999999; + } + return serialize(array( + 'data' => $data, + 'lifetime' => $lifetime, + 'expire' => time() + $lt, + 'priority' => $priority + )); + } + + /** + * Compute and return the lifetime for the fast backend + * + * @param int $lifetime original lifetime + * @param int $priority priority + * @param int $maxLifetime maximum lifetime + * @return int lifetime for the fast backend + */ + private function _getFastLifetime($lifetime, $priority, $maxLifetime = null) + { + if (is_null($lifetime)) { + // if lifetime is null, we have an infinite lifetime + // we need to use arbitrary lifetimes + $fastLifetime = (int) (2592000 / (11 - $priority)); + } else { + $fastLifetime = (int) ($lifetime / (11 - $priority)); + } + if (!is_null($maxLifetime) && ($maxLifetime >= 0)) { + if ($fastLifetime > $maxLifetime) { + return $maxLifetime; + } + } + return $fastLifetime; + } + + /** + * PUBLIC METHOD FOR UNIT TESTING ONLY ! + * + * Force a cache record to expire + * + * @param string $id cache id + */ + public function ___expire($id) + { + $this->_fastBackend->remove($id); + $this->_slowBackend->___expire($id); + } + + private function _getFastFillingPercentage($mode) + { + + if ($mode == 'saving') { + // mode saving + if (is_null($this->_fastBackendFillingPercentage)) { + $this->_fastBackendFillingPercentage = $this->_fastBackend->getFillingPercentage(); + } else { + $rand = rand(1, $this->_options['stats_update_factor']); + if ($rand == 1) { + // we force a refresh + $this->_fastBackendFillingPercentage = $this->_fastBackend->getFillingPercentage(); + } + } + } else { + // mode loading + // we compute the percentage only if it's not available in cache + if (is_null($this->_fastBackendFillingPercentage)) { + $this->_fastBackendFillingPercentage = $this->_fastBackend->getFillingPercentage(); + } + } + return $this->_fastBackendFillingPercentage; + } + +} diff --git a/libs/Zend/Cache/Backend/Xcache.php b/libs/Zend/Cache/Backend/Xcache.php new file mode 100644 index 0000000..e6064ba --- /dev/null +++ b/libs/Zend/Cache/Backend/Xcache.php @@ -0,0 +1,215 @@ + (string) user : + * xcache.admin.user (necessary for the clean() method) + * + * =====> (string) password : + * xcache.admin.pass (clear, not MD5) (necessary for the clean() method) + * + * @var array available options + */ + protected $_options = array( + 'user' => null, + 'password' => null + ); + + /** + * Constructor + * + * @param array $options associative array of options + * @throws Zend_Cache_Exception + * @return void + */ + public function __construct(array $options = array()) + { + if (!extension_loaded('xcache')) { + Zend_Cache::throwException('The xcache extension must be loaded for using this backend !'); + } + parent::__construct($options); + } + + /** + * Test if a cache is available for the given id and (if yes) return it (false else) + * + * WARNING $doNotTestCacheValidity=true is unsupported by the Xcache backend + * + * @param string $id cache id + * @param boolean $doNotTestCacheValidity if set to true, the cache validity won't be tested + * @return string cached datas (or false) + */ + public function load($id, $doNotTestCacheValidity = false) + { + if ($doNotTestCacheValidity) { + $this->_log("Zend_Cache_Backend_Xcache::load() : \$doNotTestCacheValidity=true is unsupported by the Xcache backend"); + } + $tmp = xcache_get($id); + if (is_array($tmp)) { + return $tmp[0]; + } + return false; + } + + /** + * Test if a cache is available or not (for the given id) + * + * @param string $id cache id + * @return mixed false (a cache is not available) or "last modified" timestamp (int) of the available cache record + */ + public function test($id) + { + if (xcache_isset($id)) { + $tmp = xcache_get($id); + if (is_array($tmp)) { + return $tmp[1]; + } + } + return false; + } + + /** + * Save some string datas into a cache record + * + * Note : $data is always "string" (serialization is done by the + * core not by the backend) + * + * @param string $data datas to cache + * @param string $id cache id + * @param array $tags array of strings, the cache record will be tagged by each string entry + * @param int $specificLifetime if != false, set a specific lifetime for this cache record (null => infinite lifetime) + * @return boolean true if no problem + */ + public function save($data, $id, $tags = array(), $specificLifetime = false) + { + $lifetime = $this->getLifetime($specificLifetime); + $result = xcache_set($id, array($data, time()), $lifetime); + if (count($tags) > 0) { + $this->_log(self::TAGS_UNSUPPORTED_BY_SAVE_OF_XCACHE_BACKEND); + } + return $result; + } + + /** + * Remove a cache record + * + * @param string $id cache id + * @return boolean true if no problem + */ + public function remove($id) + { + return xcache_unset($id); + } + + /** + * Clean some cache records + * + * Available modes are : + * 'all' (default) => remove all cache entries ($tags is not used) + * 'old' => unsupported + * 'matchingTag' => unsupported + * 'notMatchingTag' => unsupported + * 'matchingAnyTag' => unsupported + * + * @param string $mode clean mode + * @param array $tags array of tags + * @throws Zend_Cache_Exception + * @return boolean true if no problem + */ + public function clean($mode = Zend_Cache::CLEANING_MODE_ALL, $tags = array()) + { + switch ($mode) { + case Zend_Cache::CLEANING_MODE_ALL: + // Necessary because xcache_clear_cache() need basic authentification + $backup = array(); + if (isset($_SERVER['PHP_AUTH_USER'])) { + $backup['PHP_AUTH_USER'] = $_SERVER['PHP_AUTH_USER']; + } + if (isset($_SERVER['PHP_AUTH_PW'])) { + $backup['PHP_AUTH_PW'] = $_SERVER['PHP_AUTH_PW']; + } + if ($this->_options['user']) { + $_SERVER['PHP_AUTH_USER'] = $this->_options['user']; + } + if ($this->_options['password']) { + $_SERVER['PHP_AUTH_PW'] = $this->_options['password']; + } + xcache_clear_cache(XC_TYPE_VAR, 0); + if (isset($backup['PHP_AUTH_USER'])) { + $_SERVER['PHP_AUTH_USER'] = $backup['PHP_AUTH_USER']; + $_SERVER['PHP_AUTH_PW'] = $backup['PHP_AUTH_PW']; + } + return true; + break; + case Zend_Cache::CLEANING_MODE_OLD: + $this->_log("Zend_Cache_Backend_Xcache::clean() : CLEANING_MODE_OLD is unsupported by the Xcache backend"); + break; + case Zend_Cache::CLEANING_MODE_MATCHING_TAG: + case Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG: + case Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG: + $this->_log(self::TAGS_UNSUPPORTED_BY_CLEAN_OF_XCACHE_BACKEND); + break; + default: + Zend_Cache::throwException('Invalid mode for clean() method'); + break; + } + } + + /** + * Return true if the automatic cleaning is available for the backend + * + * @return boolean + */ + public function isAutomaticCleaningAvailable() + { + return false; + } + +} diff --git a/libs/Zend/Cache/Backend/ZendPlatform.php b/libs/Zend/Cache/Backend/ZendPlatform.php new file mode 100644 index 0000000..c19b41b --- /dev/null +++ b/libs/Zend/Cache/Backend/ZendPlatform.php @@ -0,0 +1,316 @@ +_directives['lifetime']; + } + $res = output_cache_get($id, $lifetime); + if($res) { + return $res[0]; + } else { + return false; + } + } + + + /** + * Test if a cache is available or not (for the given id) + * + * @param string $id Cache id + * @return mixed|false false (a cache is not available) or "last modified" timestamp (int) of the available cache record + */ + public function test($id) + { + $result = output_cache_get($id, $this->_directives['lifetime']); + if ($result) { + return $result[1]; + } + return false; + } + + /** + * Save some string datas into a cache record + * + * Note : $data is always "string" (serialization is done by the + * core not by the backend) + * + * @param string $data Data to cache + * @param string $id Cache id + * @param array $tags Array of strings, the cache record will be tagged by each string entry + * @param int $specificLifetime If != false, set a specific lifetime for this cache record (null => infinite lifetime) + * @return boolean true if no problem + */ + public function save($data, $id, $tags = array(), $specificLifetime = false) + { + if (!($specificLifetime === false)) { + $this->_log("Zend_Cache_Backend_ZendPlatform::save() : non false specifc lifetime is unsuported for this backend"); + } + + $lifetime = $this->_directives['lifetime']; + $result1 = output_cache_put($id, array($data, time())); + $result2 = (count($tags) == 0); + + foreach ($tags as $tag) { + $tagid = self::TAGS_PREFIX.$tag; + $old_tags = output_cache_get($tagid, $lifetime); + if ($old_tags === false) { + $old_tags = array(); + } + $old_tags[$id] = $id; + output_cache_remove_key($tagid); + $result2 = output_cache_put($tagid, $old_tags); + } + + return $result1 && $result2; + } + + + /** + * Remove a cache record + * + * @param string $id Cache id + * @return boolean True if no problem + */ + public function remove($id) + { + return output_cache_remove_key($id); + } + + + /** + * Clean some cache records + * + * Available modes are : + * Zend_Cache::CLEANING_MODE_ALL (default) => remove all cache entries ($tags is not used) + * Zend_Cache::CLEANING_MODE_OLD => remove too old cache entries ($tags is not used) + * This mode is not supported in this backend + * Zend_Cache::CLEANING_MODE_MATCHING_TAG => remove cache entries matching all given tags + * ($tags can be an array of strings or a single string) + * Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG => unsupported + * Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG => remove cache entries matching any given tags + * ($tags can be an array of strings or a single string) + * + * @param string $mode Clean mode + * @param array $tags Array of tags + * @throws Zend_Cache_Exception + * @return boolean True if no problem + */ + public function clean($mode = Zend_Cache::CLEANING_MODE_ALL, $tags = array()) + { + switch ($mode) { + case Zend_Cache::CLEANING_MODE_ALL: + case Zend_Cache::CLEANING_MODE_OLD: + $cache_dir = ini_get('zend_accelerator.output_cache_dir'); + if (!$cache_dir) { + return false; + } + $cache_dir .= '/.php_cache_api/'; + return $this->_clean($cache_dir, $mode); + break; + case Zend_Cache::CLEANING_MODE_MATCHING_TAG: + $idlist = null; + foreach ($tags as $tag) { + $next_idlist = output_cache_get(self::TAGS_PREFIX.$tag, $this->_directives['lifetime']); + if ($idlist) { + $idlist = array_intersect_assoc($idlist, $next_idlist); + } else { + $idlist = $next_idlist; + } + if (count($idlist) == 0) { + // if ID list is already empty - we may skip checking other IDs + $idlist = null; + break; + } + } + if ($idlist) { + foreach ($idlist as $id) { + output_cache_remove_key($id); + } + } + return true; + break; + case Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG: + $this->_log("Zend_Cache_Backend_ZendPlatform::clean() : CLEANING_MODE_NOT_MATCHING_TAG is not supported by the Zend Platform backend"); + return false; + break; + case Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG: + $idlist = null; + foreach ($tags as $tag) { + $next_idlist = output_cache_get(self::TAGS_PREFIX.$tag, $this->_directives['lifetime']); + if ($idlist) { + $idlist = array_merge_recursive($idlist, $next_idlist); + } else { + $idlist = $next_idlist; + } + if (count($idlist) == 0) { + // if ID list is already empty - we may skip checking other IDs + $idlist = null; + break; + } + } + if ($idlist) { + foreach ($idlist as $id) { + output_cache_remove_key($id); + } + } + return true; + break; + default: + Zend_Cache::throwException('Invalid mode for clean() method'); + break; + } + } + + /** + * Clean a directory and recursivly go over it's subdirectories + * + * Remove all the cached files that need to be cleaned (according to mode and files mtime) + * + * @param string $dir Path of directory ot clean + * @param string $mode The same parameter as in Zend_Cache_Backend_ZendPlatform::clean() + * @return boolean True if ok + */ + private function _clean($dir, $mode) + { + $d = @dir($dir); + if (!$d) { + return false; + } + $result = true; + while (false !== ($file = $d->read())) { + if ($file == '.' || $file == '..') { + continue; + } + $file = $d->path . $file; + if (is_dir($file)) { + $result = ($this->_clean($file .'/', $mode)) && ($result); + } else { + if ($mode == Zend_Cache::CLEANING_MODE_ALL) { + $result = ($this->_remove($file)) && ($result); + } else if ($mode == Zend_Cache::CLEANING_MODE_OLD) { + // Files older than lifetime get deleted from cache + if (!is_null($this->_directives['lifetime'])) { + if ((time() - @filemtime($file)) > $this->_directives['lifetime']) { + $result = ($this->_remove($file)) && ($result); + } + } + } + } + } + $d->close(); + return $result; + } + + /** + * Remove a file + * + * If we can't remove the file (because of locks or any problem), we will touch + * the file to invalidate it + * + * @param string $file Complete file path + * @return boolean True if ok + */ + private function _remove($file) + { + if (!@unlink($file)) { + # If we can't remove the file (because of locks or any problem), we will touch + # the file to invalidate it + $this->_log("Zend_Cache_Backend_ZendPlatform::_remove() : we can't remove $file => we are going to try to invalidate it"); + if (is_null($this->_directives['lifetime'])) { + return false; + } + if (!file_exists($file)) { + return false; + } + return @touch($file, time() - 2*abs($this->_directives['lifetime'])); + } + return true; + } + +} diff --git a/libs/Zend/Cache/Core.php b/libs/Zend/Cache/Core.php new file mode 100644 index 0000000..a1e6138 --- /dev/null +++ b/libs/Zend/Cache/Core.php @@ -0,0 +1,634 @@ + (boolean) write_control : + * - Enable / disable write control (the cache is read just after writing to detect corrupt entries) + * - Enable write control will lightly slow the cache writing but not the cache reading + * Write control can detect some corrupt cache files but maybe it's not a perfect control + * + * ====> (boolean) caching : + * - Enable / disable caching + * (can be very useful for the debug of cached scripts) + * + * =====> (string) cache_id_prefix : + * - prefix for cache ids (namespace) + * + * ====> (boolean) automatic_serialization : + * - Enable / disable automatic serialization + * - It can be used to save directly datas which aren't strings (but it's slower) + * + * ====> (int) automatic_cleaning_factor : + * - Disable / Tune the automatic cleaning process + * - The automatic cleaning process destroy too old (for the given life time) + * cache files when a new cache file is written : + * 0 => no automatic cache cleaning + * 1 => systematic cache cleaning + * x (integer) > 1 => automatic cleaning randomly 1 times on x cache write + * + * ====> (int) lifetime : + * - Cache lifetime (in seconds) + * - If null, the cache is valid forever. + * + * ====> (boolean) logging : + * - If set to true, logging is activated (but the system is slower) + * + * ====> (boolean) ignore_user_abort + * - If set to true, the core will set the ignore_user_abort PHP flag inside the + * save() method to avoid cache corruptions in some cases (default false) + * + * @var array $_options available options + */ + protected $_options = array( + 'write_control' => true, + 'caching' => true, + 'cache_id_prefix' => null, + 'automatic_serialization' => false, + 'automatic_cleaning_factor' => 10, + 'lifetime' => 3600, + 'logging' => false, + 'logger' => null, + 'ignore_user_abort' => false + ); + + /** + * Array of options which have to be transfered to backend + * + * @var array $_directivesList + */ + protected static $_directivesList = array('lifetime', 'logging', 'logger'); + + /** + * Not used for the core, just a sort a hint to get a common setOption() method (for the core and for frontends) + * + * @var array $_specificOptions + */ + protected $_specificOptions = array(); + + /** + * Last used cache id + * + * @var string $_lastId + */ + private $_lastId = null; + + /** + * True if the backend implements Zend_Cache_Backend_ExtendedInterface + * + * @var boolean $_extendedBackend + */ + protected $_extendedBackend = false; + + /** + * Array of capabilities of the backend (only if it implements Zend_Cache_Backend_ExtendedInterface) + * + * @var array + */ + protected $_backendCapabilities = array(); + + /** + * Constructor + * + * @param array $options Associative array of options + * @throws Zend_Cache_Exception + * @return void + */ + public function __construct(array $options = array()) + { + while (list($name, $value) = each($options)) { + $this->setOption($name, $value); + } + $this->_loggerSanity(); + } + + /** + * Set the backend + * + * @param object $backendObject + * @throws Zend_Cache_Exception + * @return void + */ + public function setBackend(Zend_Cache_Backend $backendObject) + { + $this->_backend= $backendObject; + // some options (listed in $_directivesList) have to be given + // to the backend too (even if they are not "backend specific") + $directives = array(); + foreach (Zend_Cache_Core::$_directivesList as $directive) { + $directives[$directive] = $this->_options[$directive]; + } + $this->_backend->setDirectives($directives); + if (in_array('Zend_Cache_Backend_ExtendedInterface', class_implements($this->_backend))) { + $this->_extendedBackend = true; + $this->_backendCapabilities = $this->_backend->getCapabilities(); + } + + } + + /** + * Returns the backend + * + * @return object backend object + */ + public function getBackend() + { + return $this->_backend; + } + + /** + * Public frontend to set an option + * + * There is an additional validation (relatively to the protected _setOption method) + * + * @param string $name Name of the option + * @param mixed $value Value of the option + * @throws Zend_Cache_Exception + * @return void + */ + public function setOption($name, $value) + { + if (is_string($name)) { + $name = strtolower($name); + if (array_key_exists($name, $this->_options)) { + // This is a Core option + $this->_setOption($name, $value); + return; + } + if (array_key_exists($name, $this->_specificOptions)) { + // This a specic option of this frontend + $this->_specificOptions[$name] = $value; + return; + } + } + Zend_Cache::throwException("Incorrect option name : $name"); + } + + /** + * Public frontend to get an option value + * + * @param string $name Name of the option + * @throws Zend_Cache_Exception + * @return mixed option value + */ + public function getOption($name) + { + if (is_string($name)) { + $name = strtolower($name); + if (array_key_exists($name, $this->_options)) { + // This is a Core option + return $this->_options[$name]; + } + if (array_key_exists($name, $this->_specificOptions)) { + // This a specic option of this frontend + return $this->_specificOptions[$name]; + } + } + Zend_Cache::throwException("Incorrect option name : $name"); + } + + /** + * Set an option + * + * @param string $name Name of the option + * @param mixed $value Value of the option + * @throws Zend_Cache_Exception + * @return void + */ + private function _setOption($name, $value) + { + if (!is_string($name) || !array_key_exists($name, $this->_options)) { + Zend_Cache::throwException("Incorrect option name : $name"); + } + $this->_options[$name] = $value; + } + + /** + * Force a new lifetime + * + * The new value is set for the core/frontend but for the backend too (directive) + * + * @param int $newLifetime New lifetime (in seconds) + * @return void + */ + public function setLifetime($newLifetime) + { + $this->_options['lifetime'] = $newLifetime; + $this->_backend->setDirectives(array( + 'lifetime' => $newLifetime + )); + } + + /** + * Test if a cache is available for the given id and (if yes) return it (false else) + * + * @param string $id Cache id + * @param boolean $doNotTestCacheValidity If set to true, the cache validity won't be tested + * @param boolean $doNotUnserialize Do not serialize (even if automatic_serialization is true) => for internal use + * @return mixed|false Cached datas + */ + public function load($id, $doNotTestCacheValidity = false, $doNotUnserialize = false) + { + if (!$this->_options['caching']) { + return false; + } + $id = $this->_id($id); // cache id may need prefix + $this->_lastId = $id; + self::_validateIdOrTag($id); + $data = $this->_backend->load($id, $doNotTestCacheValidity); + if ($data===false) { + // no cache available + return false; + } + if ((!$doNotUnserialize) && $this->_options['automatic_serialization']) { + // we need to unserialize before sending the result + return unserialize($data); + } + return $data; + } + + /** + * Test if a cache is available for the given id + * + * @param string $id Cache id + * @return boolean True is a cache is available, false else + */ + public function test($id) + { + if (!$this->_options['caching']) { + return false; + } + $id = $this->_id($id); // cache id may need prefix + self::_validateIdOrTag($id); + $this->_lastId = $id; + return $this->_backend->test($id); + } + + /** + * Save some data in a cache + * + * @param mixed $data Data to put in cache (can be another type than string if automatic_serialization is on) + * @param string $id Cache id (if not set, the last cache id will be used) + * @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 + * @throws Zend_Cache_Exception + * @return boolean True if no problem + */ + public function save($data, $id = null, $tags = array(), $specificLifetime = false, $priority = 8) + { + if (!$this->_options['caching']) { + return true; + } + if (is_null($id)) { + $id = $this->_lastId; + } else { + $id = $this->_id($id); + } + self::_validateIdOrTag($id); + self::_validateTagsArray($tags); + if ($this->_options['automatic_serialization']) { + // we need to serialize datas before storing them + $data = serialize($data); + } else { + if (!is_string($data)) { + Zend_Cache::throwException("Datas must be string or set automatic_serialization = true"); + } + } + // automatic cleaning + if ($this->_options['automatic_cleaning_factor'] > 0) { + $rand = rand(1, $this->_options['automatic_cleaning_factor']); + if ($rand==1) { + if ($this->_extendedBackend) { + // New way + if ($this->_backendCapabilities['automatic_cleaning']) { + $this->clean(Zend_Cache::CLEANING_MODE_OLD); + } else { + $this->_log('Zend_Cache_Core::save() / automatic cleaning is not available/necessary with this backend'); + } + } else { + // Deprecated way (will be removed in next major version) + if (method_exists($this->_backend, 'isAutomaticCleaningAvailable') && ($this->_backend->isAutomaticCleaningAvailable())) { + $this->clean(Zend_Cache::CLEANING_MODE_OLD); + } else { + $this->_log('Zend_Cache_Core::save() / automatic cleaning is not available/necessary with this backend'); + } + } + } + } + if ($this->_options['ignore_user_abort']) { + $abort = ignore_user_abort(true); + } + if (($this->_extendedBackend) && ($this->_backendCapabilities['priority'])) { + $result = $this->_backend->save($data, $id, $tags, $specificLifetime, $priority); + } else { + $result = $this->_backend->save($data, $id, $tags, $specificLifetime); + } + if ($this->_options['ignore_user_abort']) { + ignore_user_abort($abort); + } + if (!$result) { + // maybe the cache is corrupted, so we remove it ! + if ($this->_options['logging']) { + $this->_log("Zend_Cache_Core::save() : impossible to save cache (id=$id)"); + } + $this->remove($id); + return false; + } + if ($this->_options['write_control']) { + $data2 = $this->_backend->load($id, true); + if ($data!=$data2) { + $this->_log('Zend_Cache_Core::save() / write_control : written and read data do not match'); + $this->_backend->remove($id); + return false; + } + } + return true; + } + + /** + * Remove a cache + * + * @param string $id Cache id to remove + * @return boolean True if ok + */ + public function remove($id) + { + if (!$this->_options['caching']) { + return true; + } + $id = $this->_id($id); // cache id may need prefix + self::_validateIdOrTag($id); + return $this->_backend->remove($id); + } + + /** + * Clean cache entries + * + * Available modes are : + * 'all' (default) => remove all cache entries ($tags is not used) + * 'old' => remove too old cache entries ($tags is not used) + * 'matchingTag' => remove cache entries matching all given tags + * ($tags can be an array of strings or a single string) + * 'notMatchingTag' => remove cache entries not matching one of the given tags + * ($tags can be an array of strings or a single string) + * 'matchingAnyTag' => remove cache entries matching any given tags + * ($tags can be an array of strings or a single string) + * + * @param string $mode + * @param array|string $tags + * @throws Zend_Cache_Exception + * @return boolean True if ok + */ + public function clean($mode = 'all', $tags = array()) + { + if (!$this->_options['caching']) { + return true; + } + if (!in_array($mode, array(Zend_Cache::CLEANING_MODE_ALL, + Zend_Cache::CLEANING_MODE_OLD, + Zend_Cache::CLEANING_MODE_MATCHING_TAG, + Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG, + Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG))) { + Zend_Cache::throwException('Invalid cleaning mode'); + } + self::_validateTagsArray($tags); + return $this->_backend->clean($mode, $tags); + } + + /** + * 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 + * @return array array of matching cache ids (string) + */ + public function getIdsMatchingTags($tags = array()) + { + if (!$this->_extendedBackend) { + Zend_Cache::throwException('Current backend doesn\'t implement the Zend_Cache_Backend_ExtendedInterface, so this method is not available'); + } + if (!($this->_backendCapabilities['tags'])) { + Zend_Cache::throwException('tags are not supported by the current backend'); + } + return $this->_backend->getIdsMatchingTags($tags); + } + + /** + * 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()) + { + if (!$this->_extendedBackend) { + Zend_Cache::throwException('Current backend doesn\'t implement the Zend_Cache_Backend_ExtendedInterface, so this method is not available'); + } + if (!($this->_backendCapabilities['tags'])) { + Zend_Cache::throwException('tags are not supported by the current backend'); + } + return $this->_backend->getIdsNotMatchingTags($tags); + } + + /** + * Return an array of stored cache ids + * + * @return array array of stored cache ids (string) + */ + public function getIds() + { + if (!$this->_extendedBackend) { + Zend_Cache::throwException('Current backend doesn\'t implement the Zend_Cache_Backend_ExtendedInterface, so this method is not available'); + } + return $this->_backend->getIds(); + } + + /** + * Return an array of stored tags + * + * @return array array of stored tags (string) + */ + public function getTags() + { + if (!$this->_extendedBackend) { + Zend_Cache::throwException('Current backend doesn\'t implement the Zend_Cache_Backend_ExtendedInterface, so this method is not available'); + } + if (!($this->_backendCapabilities['tags'])) { + Zend_Cache::throwException('tags are not supported by the current backend'); + } + return $this->_backend->getTags(); + } + + /** + * Return the filling percentage of the backend storage + * + * @return int integer between 0 and 100 + */ + public function getFillingPercentage() + { + if (!$this->_extendedBackend) { + Zend_Cache::throwException('Current backend doesn\'t implement the Zend_Cache_Backend_ExtendedInterface, so this method is not available'); + } + return $this->_backend->getFillingPercentage(); + } + + /** + * Give (if possible) an extra lifetime to the given cache id + * + * @param string $id cache id + * @param int $extraLifetime + * @return boolean true if ok + */ + public function touch($id, $extraLifetime) + { + if (!$this->_extendedBackend) { + Zend_Cache::throwException('Current backend doesn\'t implement the Zend_Cache_Backend_ExtendedInterface, so this method is not available'); + } + return $this->_backend->touch($id, $extraLifetime); + } + + /** + * Validate a cache id or a tag (security, reliable filenames, reserved prefixes...) + * + * Throw an exception if a problem is found + * + * @param string $string Cache id or tag + * @throws Zend_Cache_Exception + * @return void + */ + private static function _validateIdOrTag($string) + { + if (!is_string($string)) { + Zend_Cache::throwException('Invalid id or tag : must be a string'); + } + if (substr($string, 0, 9) == 'internal-') { + Zend_Cache::throwException('"internal-*" ids or tags are reserved'); + } + if (!preg_match('~^[\w]+$~D', $string)) { + Zend_Cache::throwException("Invalid id or tag '$string' : must use only [a-zA-Z0-9_]"); + } + } + + /** + * Validate a tags array (security, reliable filenames, reserved prefixes...) + * + * Throw an exception if a problem is found + * + * @param array $tags Array of tags + * @throws Zend_Cache_Exception + * @return void + */ + private static function _validateTagsArray($tags) + { + if (!is_array($tags)) { + Zend_Cache::throwException('Invalid tags array : must be an array'); + } + foreach($tags as $tag) { + self::_validateIdOrTag($tag); + } + reset($tags); + } + + /** + * Make sure if we enable logging that the Zend_Log class + * is available. + * Create a default log object if none is set. + * + * @throws Zend_Cache_Exception + * @return void + */ + protected function _loggerSanity() + { + if (!isset($this->_options['logging']) || !$this->_options['logging']) { + return; + } + try { + /** + * @see Zend_Log + */ + require_once 'Zend/Log.php'; + } catch (Zend_Exception $e) { + Zend_Cache::throwException('Logging feature is enabled but the Zend_Log class is not available'); + } + if (isset($this->_options['logger']) && $this->_options['logger'] instanceof Zend_Log) { + return; + } + // Create a default logger to the standard output stream + require_once 'Zend/Log/Writer/Stream.php'; + $logger = new Zend_Log(new Zend_Log_Writer_Stream('php://output')); + $this->_options['logger'] = $logger; + } + + /** + * Log a message at the WARN (4) priority. + * + * @param string $message + * @throws Zend_Cache_Exception + * @return void + */ + protected function _log($message, $priority = 4) + { + if (!$this->_options['logging']) { + return; + } + if (!(isset($this->_options['logger']) || $this->_options['logger'] instanceof Zend_Log)) { + Zend_Cache::throwException('Logging is enabled but logger is not set'); + } + $logger = $this->_options['logger']; + $logger->log($message, $priority); + } + + /** + * Make and return a cache id + * + * Checks 'cache_id_prefix' and returns new id with prefix or simply the id if null + * + * @param string $id Cache id + * @return string Cache id (with or without prefix) + */ + private function _id($id) + { + if (!is_null($id) && isset($this->_options['cache_id_prefix'])) { + return $this->_options['cache_id_prefix'] . $id; // return with prefix + } + return $id; // no prefix, just return the $id passed + } + +} diff --git a/libs/Zend/Cache/Exception.php b/libs/Zend/Cache/Exception.php new file mode 100644 index 0000000..a46d8ca --- /dev/null +++ b/libs/Zend/Cache/Exception.php @@ -0,0 +1,31 @@ + (mixed) cached_entity : + * - if set to a class name, we will cache an abstract class and will use only static calls + * - if set to an object, we will cache this object methods + * + * ====> (boolean) cache_by_default : + * - if true, method calls will be cached by default + * + * ====> (array) cached_methods : + * - an array of method names which will be cached (even if cache_by_default = false) + * + * ====> (array) non_cached_methods : + * - an array of method names which won't be cached (even if cache_by_default = true) + * + * @var array available options + */ + protected $_specificOptions = array( + 'cached_entity' => null, + 'cache_by_default' => true, + 'cached_methods' => array(), + 'non_cached_methods' => array() + ); + + /** + * Tags array + * + * @var array + */ + private $_tags = array(); + + /** + * SpecificLifetime value + * + * false => no specific life time + * + * @var int + */ + private $_specificLifetime = false; + + /** + * The cached object or the name of the cached abstract class + * + * @var mixed + */ + private $_cachedEntity = null; + + /** + * The class name of the cached object or cached abstract class + * + * Used to differentiate between different classes with the same method calls. + * + * @var string + */ + private $_cachedEntityLabel = ''; + + /** + * Priority (used by some particular backends) + * + * @var int + */ + private $_priority = 8; + + /** + * Constructor + * + * @param array $options Associative array of options + * @throws Zend_Cache_Exception + * @return void + */ + public function __construct(array $options = array()) + { + while (list($name, $value) = each($options)) { + $this->setOption($name, $value); + } + if (is_null($this->_specificOptions['cached_entity'])) { + Zend_Cache::throwException('cached_entity must be set !'); + } + $this->setCachedEntity($this->_specificOptions['cached_entity']); + $this->setOption('automatic_serialization', true); + } + + /** + * Set a specific life time + * + * @param int $specificLifetime + * @return void + */ + public function setSpecificLifetime($specificLifetime = false) + { + $this->_specificLifetime = $specificLifetime; + } + + /** + * Set the priority (used by some particular backends) + * + * @param int $priority integer between 0 (very low priority) and 10 (maximum priority) + */ + public function setPriority($priority) + { + $this->_priority = $priority; + } + + /** + * Public frontend to set an option + * + * Just a wrapper to get a specific behaviour for cached_entity + * + * @param string $name Name of the option + * @param mixed $value Value of the option + * @throws Zend_Cache_Exception + * @return void + */ + public function setOption($name, $value) + { + if ($name == 'cached_entity') { + $this->setCachedEntity($value); + } else { + parent::setOption($name, $value); + } + } + + /** + * Specific method to set the cachedEntity + * + * if set to a class name, we will cache an abstract class and will use only static calls + * if set to an object, we will cache this object methods + * + * @param mixed $cachedEntity + */ + public function setCachedEntity($cachedEntity) + { + if (!is_string($cachedEntity) && !is_object($cachedEntity)) { + Zend_Cache::throwException('cached_entity must be an object or a class name'); + } + $this->_cachedEntity = $cachedEntity; + $this->_specificOptions['cached_entity'] = $cachedEntity; + if (is_string($this->_cachedEntity)){ + $this->_cachedEntityLabel = $this->_cachedEntity; + } else { + $ro = new ReflectionObject($this->_cachedEntity); + $this->_cachedEntityLabel = $ro->getName(); + } + } + + /** + * Set the cache array + * + * @param array $tags + * @return void + */ + public function setTagsArray($tags = array()) + { + $this->_tags = $tags; + } + + /** + * Main method : call the specified method or get the result from cache + * + * @param string $name Method name + * @param array $parameters Method parameters + * @return mixed Result + */ + public function __call($name, $parameters) + { + $cacheBool1 = $this->_specificOptions['cache_by_default']; + $cacheBool2 = in_array($name, $this->_specificOptions['cached_methods']); + $cacheBool3 = in_array($name, $this->_specificOptions['non_cached_methods']); + $cache = (($cacheBool1 || $cacheBool2) && (!$cacheBool3)); + if (!$cache) { + // We do not have not cache + return call_user_func_array(array($this->_cachedEntity, $name), $parameters); + } + $id = $this->_makeId($name, $parameters); + if ($this->test($id)) { + // A cache is available + $result = $this->load($id); + $output = $result[0]; + $return = $result[1]; + } else { + // A cache is not available + ob_start(); + ob_implicit_flush(false); + $return = call_user_func_array(array($this->_cachedEntity, $name), $parameters); + $output = ob_get_contents(); + ob_end_clean(); + $data = array($output, $return); + $this->save($data, $id, $this->_tags, $this->_specificLifetime, $this->_priority); + } + echo $output; + return $return; + } + + /** + * Make a cache id from the method name and parameters + * + * @param string $name Method name + * @param array $parameters Method parameters + * @return string Cache id + */ + private function _makeId($name, $parameters) + { + return md5($this->_cachedEntityLabel . '__' . $name . '__' . serialize($parameters)); + } + +} diff --git a/libs/Zend/Cache/Frontend/File.php b/libs/Zend/Cache/Frontend/File.php new file mode 100644 index 0000000..59d2c0f --- /dev/null +++ b/libs/Zend/Cache/Frontend/File.php @@ -0,0 +1,145 @@ + (string) master_file : + * - the complete path and name of the master file + * - this option has to be set ! + * + * @var array available options + */ + protected $_specificOptions = array( + 'master_file' => '' + ); + + /** + * Master file mtime + * + * @var int + */ + private $_masterFile_mtime = null; + + /** + * Constructor + * + * @param array $options Associative array of options + * @throws Zend_Cache_Exception + * @return void + */ + public function __construct(array $options = array()) + { + while (list($name, $value) = each($options)) { + $this->setOption($name, $value); + } + if (!isset($this->_specificOptions['master_file'])) { + Zend_Cache::throwException('master_file option must be set'); + } + $this->setMasterFile($this->_specificOptions['master_file']); + } + + /** + * Change the master_file option + * + * @param string $masterFile the complete path and name of the master file + */ + public function setMasterFile($masterFile) + { + clearstatcache(); + $this->_specificOptions['master_file'] = $masterFile; + if (!($this->_masterFile_mtime = @filemtime($masterFile))) { + Zend_Cache::throwException('Unable to read master_file : '.$masterFile); + } + } + + /** + * Public frontend to set an option + * + * Just a wrapper to get a specific behaviour for master_file + * + * @param string $name Name of the option + * @param mixed $value Value of the option + * @throws Zend_Cache_Exception + * @return void + */ + public function setOption($name, $value) + { + if ($name == 'master_file') { + $this->setMasterFile($value); + } else { + parent::setOption($name, $value); + } + } + + /** + * Test if a cache is available for the given id and (if yes) return it (false else) + * + * @param string $id Cache id + * @param boolean $doNotTestCacheValidity If set to true, the cache validity won't be tested + * @param boolean $doNotUnserialize Do not serialize (even if automatic_serialization is true) => for internal use + * @return mixed|false Cached datas + */ + public function load($id, $doNotTestCacheValidity = false, $doNotUnserialize = false) + { + if (!$doNotTestCacheValidity) { + if ($this->test($id)) { + return parent::load($id, true, $doNotUnserialize); + } + return false; + } + return parent::load($id, true, $doNotUnserialize); + } + + /** + * Test if a cache is available for the given id + * + * @param string $id Cache id + * @return boolean True is a cache is available, false else + */ + public function test($id) + { + $lastModified = parent::test($id); + if ($lastModified) { + if ($lastModified > $this->_masterFile_mtime) { + return $lastModified; + } + } + return false; + } + +} + diff --git a/libs/Zend/Cache/Frontend/Function.php b/libs/Zend/Cache/Frontend/Function.php new file mode 100644 index 0000000..b059b30 --- /dev/null +++ b/libs/Zend/Cache/Frontend/Function.php @@ -0,0 +1,130 @@ + (boolean) cache_by_default : + * - if true, function calls will be cached by default + * + * ====> (array) cached_functions : + * - an array of function names which will be cached (even if cache_by_default = false) + * + * ====> (array) non_cached_functions : + * - an array of function names which won't be cached (even if cache_by_default = true) + * + * @var array options + */ + protected $_specificOptions = array( + 'cache_by_default' => true, + 'cached_functions' => array(), + 'non_cached_functions' => array() + ); + + /** + * Constructor + * + * @param array $options Associative array of options + * @return void + */ + public function __construct(array $options = array()) + { + while (list($name, $value) = each($options)) { + $this->setOption($name, $value); + } + $this->setOption('automatic_serialization', true); + } + + /** + * Main method : call the specified function or get the result from cache + * + * @param string $name Function name + * @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 + * @return mixed Result + */ + public function call($name, $parameters = array(), $tags = array(), $specificLifetime = false, $priority = 8) + { + $cacheBool1 = $this->_specificOptions['cache_by_default']; + $cacheBool2 = in_array($name, $this->_specificOptions['cached_functions']); + $cacheBool3 = in_array($name, $this->_specificOptions['non_cached_functions']); + $cache = (($cacheBool1 || $cacheBool2) && (!$cacheBool3)); + if (!$cache) { + // We do not have not cache + return call_user_func_array($name, $parameters); + } + $id = $this->_makeId($name, $parameters); + if ($this->test($id)) { + // A cache is available + $result = $this->load($id); + $output = $result[0]; + $return = $result[1]; + } else { + // A cache is not available + ob_start(); + ob_implicit_flush(false); + $return = call_user_func_array($name, $parameters); + $output = ob_get_contents(); + ob_end_clean(); + $data = array($output, $return); + $this->save($data, $id, $tags, $specificLifetime, $priority); + } + echo $output; + return $return; + } + + /** + * Make a cache id from the function name and parameters + * + * @param string $name Function name + * @param array $parameters Function parameters + * @throws Zend_Cache_Exception + * @return string Cache id + */ + private function _makeId($name, $parameters) + { + if (!is_string($name)) { + Zend_Cache::throwException('Incorrect function name'); + } + if (!is_array($parameters)) { + Zend_Cache::throwException('parameters argument must be an array'); + } + return md5($name . serialize($parameters)); + } + +} diff --git a/libs/Zend/Cache/Frontend/Output.php b/libs/Zend/Cache/Frontend/Output.php new file mode 100644 index 0000000..7451a12 --- /dev/null +++ b/libs/Zend/Cache/Frontend/Output.php @@ -0,0 +1,105 @@ +_idStack = array(); + } + + /** + * Start the cache + * + * @param string $id Cache id + * @param boolean $doNotTestCacheValidity If set to true, the cache validity won't be tested + * @param boolean $echoData If set to true, datas are sent to the browser if the cache is hit (simpy returned else) + * @return mixed True if the cache is hit (false else) with $echoData=true (default) ; string else (datas) + */ + public function start($id, $doNotTestCacheValidity = false, $echoData = true) + { + $data = $this->load($id, $doNotTestCacheValidity); + if ($data !== false) { + if ( $echoData ) { + echo($data); + return true; + } else { + return $data; + } + } + ob_start(); + ob_implicit_flush(false); + $this->_idStack[] = $id; + return false; + } + + /** + * Stop the cache + * + * @param array $tags Tags array + * @param int $specificLifetime If != false, set a specific lifetime for this cache record (null => infinite lifetime) + * @param string $forcedDatas If not null, force written datas with this + * @param boolean $echoData If set to true, datas are sent to the browser + * @param int $priority integer between 0 (very low priority) and 10 (maximum priority) used by some particular backends + * @return void + */ + public function end($tags = array(), $specificLifetime = false, $forcedDatas = null, $echoData = true, $priority = 8) + { + if (is_null($forcedDatas)) { + $data = ob_get_contents(); + ob_end_clean(); + } else { + $data =& $forcedDatas; + } + $id = array_pop($this->_idStack); + if (is_null($id)) { + Zend_Cache::throwException('use of end() without a start()'); + } + $this->save($data, $id, $tags, $specificLifetime, $priority); + if ($echoData) { + echo($data); + } + } + +} diff --git a/libs/Zend/Cache/Frontend/Page.php b/libs/Zend/Cache/Frontend/Page.php new file mode 100644 index 0000000..02b5310 --- /dev/null +++ b/libs/Zend/Cache/Frontend/Page.php @@ -0,0 +1,395 @@ + (boolean) http_conditional : + * - if true, http conditional mode is on + * WARNING : http_conditional OPTION IS NOT IMPLEMENTED FOR THE MOMENT (TODO) + * + * ====> (boolean) debug_header : + * - if true, a debug text is added before each cached pages + * + * ====> (boolean) content_type_memorization : + * - deprecated => use memorize_headers instead + * - if the Content-Type header is sent after the cache was started, the + * corresponding value can be memorized and replayed when the cache is hit + * (if false (default), the frontend doesn't take care of Content-Type header) + * + * ====> (array) memorize_headers : + * - an array of strings corresponding to some HTTP headers name. Listed headers + * will be stored with cache datas and "replayed" when the cache is hit + * + * ====> (array) default_options : + * - an associative array of default options : + * - (boolean) cache : cache is on by default if true + * - (boolean) cacheWithXXXVariables (XXXX = 'Get', 'Post', 'Session', 'Files' or 'Cookie') : + * if true, cache is still on even if there are some variables in this superglobal array + * if false, cache is off if there are some variables in this superglobal array + * - (boolean) makeIdWithXXXVariables (XXXX = 'Get', 'Post', 'Session', 'Files' or 'Cookie') : + * if true, we have to use the content of this superglobal array to make a cache id + * if false, the cache id won't be dependent of the content of this superglobal array + * - (int) specific_lifetime : cache specific lifetime + * (false => global lifetime is used, null => infinite lifetime, + * integer => this lifetime is used), this "lifetime" is probably only + * usefull when used with "regexps" array + * - (array) tags : array of tags (strings) + * - (int) priority : integer between 0 (very low priority) and 10 (maximum priority) used by + * some particular backends + * + * ====> (array) regexps : + * - an associative array to set options only for some REQUEST_URI + * - keys are (pcre) regexps + * - values are associative array with specific options to set if the regexp matchs on $_SERVER['REQUEST_URI'] + * (see default_options for the list of available options) + * - if several regexps match the $_SERVER['REQUEST_URI'], only the last one will be used + * + * @var array options + */ + protected $_specificOptions = array( + 'http_conditional' => false, + 'debug_header' => false, + 'content_type_memorization' => false, + 'memorize_headers' => array(), + 'default_options' => array( + 'cache_with_get_variables' => false, + 'cache_with_post_variables' => false, + 'cache_with_session_variables' => false, + 'cache_with_files_variables' => false, + 'cache_with_cookie_variables' => false, + 'make_id_with_get_variables' => true, + 'make_id_with_post_variables' => true, + 'make_id_with_session_variables' => true, + 'make_id_with_files_variables' => true, + 'make_id_with_cookie_variables' => true, + 'cache' => true, + 'specific_lifetime' => false, + 'tags' => array(), + 'priority' => null + ), + 'regexps' => array() + ); + + /** + * Internal array to store some options + * + * @var array associative array of options + */ + protected $_activeOptions = array(); + + /** + * If true, the page won't be cached + * + * @var boolean + */ + private $_cancel = false; + + /** + * Constructor + * + * @param array $options Associative array of options + * @param boolean $doNotTestCacheValidity If set to true, the cache validity won't be tested + * @throws Zend_Cache_Exception + * @return void + */ + public function __construct(array $options = array()) + { + while (list($name, $value) = each($options)) { + $name = strtolower($name); + switch ($name) { + case 'regexps': + $this->_setRegexps($value); + break; + case 'default_options': + $this->_setDefaultOptions($value); + break; + case 'content_type_memorization': + $this->_setContentTypeMemorization($value); + break; + default: + $this->setOption($name, $value); + } + } + if (isset($this->_specificOptions['http_conditional'])) { + if ($this->_specificOptions['http_conditional']) { + Zend_Cache::throwException('http_conditional is not implemented for the moment !'); + } + } + $this->setOption('automatic_serialization', true); + } + + /** + * Specific setter for the 'default_options' option (with some additional tests) + * + * @param array $options Associative array + * @throws Zend_Cache_Exception + * @return void + */ + protected function _setDefaultOptions($options) + { + if (!is_array($options)) { + Zend_Cache::throwException('default_options must be an array !'); + } + foreach ($options as $key=>$value) { + $key = strtolower($key); + if (!isset($this->_specificOptions['default_options'][$key])) { + Zend_Cache::throwException("unknown option [$key] !"); + } else { + $this->_specificOptions['default_options'][$key] = $value; + } + } + } + + /** + * Set the deprecated contentTypeMemorization option + * + * @param boolean $value value + * @return void + * @deprecated + */ + protected function _setContentTypeMemorization($value) + { + $found = null; + foreach ($this->_specificOptions['memorize_headers'] as $key => $value) { + if (strtolower($value) == 'content-type') { + $found = $key; + } + } + if ($value) { + if (!$found) { + $this->_specificOptions['memorize_headers'][] = 'Content-Type'; + } + } else { + if ($found) { + unset($this->_specificOptions['memorize_headers'][$found]); + } + } + } + + /** + * Specific setter for the 'regexps' option (with some additional tests) + * + * @param array $options Associative array + * @throws Zend_Cache_Exception + * @return void + */ + protected function _setRegexps($regexps) + { + if (!is_array($regexps)) { + Zend_Cache::throwException('regexps option must be an array !'); + } + foreach ($regexps as $regexp=>$conf) { + if (!is_array($conf)) { + Zend_Cache::throwException('regexps option must be an array of arrays !'); + } + $validKeys = array_keys($this->_specificOptions['default_options']); + foreach ($conf as $key=>$value) { + $key = strtolower($key); + if (!in_array($key, $validKeys)) { + Zend_Cache::throwException("unknown option [$key] !"); + } + } + } + $this->setOption('regexps', $regexps); + } + + /** + * Start the cache + * + * @param string $id (optional) A cache id (if you set a value here, maybe you have to use Output frontend instead) + * @param boolean $doNotDie For unit testing only ! + * @return boolean True if the cache is hit (false else) + */ + public function start($id = false, $doNotDie = false) + { + $this->_cancel = false; + $lastMatchingRegexp = null; + foreach ($this->_specificOptions['regexps'] as $regexp => $conf) { + if (preg_match("`$regexp`", $_SERVER['REQUEST_URI'])) { + $lastMatchingRegexp = $regexp; + } + } + $this->_activeOptions = $this->_specificOptions['default_options']; + if (!is_null($lastMatchingRegexp)) { + $conf = $this->_specificOptions['regexps'][$lastMatchingRegexp]; + foreach ($conf as $key=>$value) { + $this->_activeOptions[$key] = $value; + } + } + if (!($this->_activeOptions['cache'])) { + return false; + } + if (!$id) { + $id = $this->_makeId(); + if (!$id) { + return false; + } + } + $array = $this->load($id); + if ($array !== false) { + $data = $array['data']; + $headers = $array['headers']; + if ($this->_specificOptions['debug_header']) { + echo 'DEBUG HEADER : This is a cached page !'; + } + if (!headers_sent()) { + foreach ($headers as $key=>$headerCouple) { + $name = $headerCouple[0]; + $value = $headerCouple[1]; + header("$name: $value"); + } + } + echo $data; + if ($doNotDie) { + return true; + } + die(); + } + ob_start(array($this, '_flush')); + ob_implicit_flush(false); + return false; + } + + /** + * Cancel the current caching process + */ + public function cancel() + { + $this->_cancel = true; + } + + /** + * callback for output buffering + * (shouldn't really be called manually) + * + * @param string $data Buffered output + * @return string Data to send to browser + */ + public function _flush($data) + { + if ($this->_cancel) { + return $data; + } + $contentType = null; + $storedHeaders = array(); + $headersList = headers_list(); + foreach($this->_specificOptions['memorize_headers'] as $key=>$headerName) { + foreach ($headersList as $headerSent) { + $tmp = split(':', $headerSent); + $headerSentName = trim(array_shift($tmp)); + if (strtolower($headerName) == strtolower($headerSentName)) { + $headerSentValue = trim(implode(':', $tmp)); + $storedHeaders[] = array($headerSentName, $headerSentValue); + } + } + } + $array = array( + 'data' => $data, + 'headers' => $storedHeaders + ); + $this->save($array, null, $this->_activeOptions['tags'], $this->_activeOptions['specific_lifetime'], $this->_activeOptions['priority']); + return $data; + } + + /** + * Make an id depending on REQUEST_URI and superglobal arrays (depending on options) + * + * @return mixed|false a cache id (string), false if the cache should have not to be used + */ + protected function _makeId() + { + $tmp = $_SERVER['REQUEST_URI']; + 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']); + if ($tmp2===false) { + return false; + } + $tmp = $tmp . $tmp2; + } + return md5($tmp); + } + + /** + * Make a partial id depending on options + * + * @param string $arrayName Superglobal array name + * @param bool $bool1 If true, cache is still on even if there are some variables in the superglobal array + * @param bool $bool2 If true, we have to use the content of the superglobal array to make a partial id + * @return mixed|false Partial id (string) or false if the cache should have not to be used + */ + protected function _makePartialId($arrayName, $bool1, $bool2) + { + switch ($arrayName) { + case 'Get': + $var = $_GET; + break; + case 'Post': + $var = $_POST; + break; + case 'Session': + if (isset($_SESSION)) { + $var = $_SESSION; + } else { + $var = null; + } + break; + case 'Cookie': + if (isset($_COOKIE)) { + $var = $_COOKIE; + } else { + $var = null; + } + break; + case 'Files': + $var = $_FILES; + break; + default: + return false; + } + if ($bool1) { + if ($bool2) { + return serialize($var); + } + return ''; + } + if (count($var) > 0) { + return false; + } + return ''; + } + +} diff --git a/libs/Zend/Captcha/Adapter.php b/libs/Zend/Captcha/Adapter.php new file mode 100644 index 0000000..a8cdd0c --- /dev/null +++ b/libs/Zend/Captcha/Adapter.php @@ -0,0 +1,76 @@ +_name; + } + + /** + * Set name + * + * @param string $name + */ + public function setName($name) + { + $this->_name = $name; + return $this; + } + + /** + * Constructor + * + * @param array|Zend_Config $options + * @return void + */ + public function __construct($options = null) + { + // Set options + if (is_array($options)) { + $this->setOptions($options); + } else if ($options instanceof Zend_Config) { + $this->setConfig($options); + } + } + + /** + * Set single option for the object + * + * @param string $key + * @param string $value + * @return Zend_Form_Element + */ + public function setOption($key, $value) + { + if (in_array(strtolower($key), $this->_skipOptions)) { + return $this; + } + + $method = 'set' . ucfirst ($key); + if (method_exists ($this, $method)) { + // Setter exists; use it + $this->$method ($value); + $this->_options[$key] = $value; + } elseif (property_exists($this, $key)) { + // Assume it's metadata + $this->$key = $value; + $this->_options[$key] = $value; + } + return $this; + } + + /** + * Set object state from options array + * + * @param array $options + * @return Zend_Form_Element + */ + public function setOptions($options = null) + { + foreach ($options as $key => $value) { + $this->setOption($key, $value); + } + return $this; + } + + /** + * Retrieve options representing object state + * + * @return array + */ + public function getOptions() + { + return $this->_options; + } + + /** + * Set object state from config object + * + * @param Zend_Config $config + * @return Zend_Captcha_Base + */ + public function setConfig(Zend_Config $config) + { + return $this->setOptions($config->toArray()); + } + + /** + * Get optional decorator + * + * By default, return null, indicating no extra decorator needed. + * + * @return null + */ + public function getDecorator() + { + return null; + } +} diff --git a/libs/Zend/Captcha/Dumb.php b/libs/Zend/Captcha/Dumb.php new file mode 100644 index 0000000..ad67c6a --- /dev/null +++ b/libs/Zend/Captcha/Dumb.php @@ -0,0 +1,52 @@ +' + . strrev($this->getWord()) + . ''; + } +} diff --git a/libs/Zend/Captcha/Exception.php b/libs/Zend/Captcha/Exception.php new file mode 100755 index 0000000..1269b21 --- /dev/null +++ b/libs/Zend/Captcha/Exception.php @@ -0,0 +1,34 @@ +_figlet = new Zend_Text_Figlet($options); + } + + /** + * Generate new captcha + * + * @return string + */ + public function generate() + { + $this->_useNumbers = false; + return parent::generate(); + } + + /** + * Display the captcha + * + * @param Zend_View $view + * @param mixed $element + * @return string + */ + public function render(Zend_View_Interface $view, $element = null) + { + return '
'
+             . $this->_figlet->render($this->getWord())
+             . "
\n"; + } +} diff --git a/libs/Zend/Captcha/Image.php b/libs/Zend/Captcha/Image.php new file mode 100644 index 0000000..1ed0710 --- /dev/null +++ b/libs/Zend/Captcha/Image.php @@ -0,0 +1,589 @@ +_imgAlt; + } + /** + * @return string + */ + public function getStartImage () + { + return $this->_startImage; + } + /** + * @return int + */ + public function getDotNoiseLevel () + { + return $this->_dotNoiseLevel; + } + /** + * @return int + */ + public function getLineNoiseLevel () + { + return $this->_lineNoiseLevel; + } + /** + * Get captcha expiration + * + * @return int + */ + public function getExpiration() + { + return $this->_expiration; + } + + /** + * Get garbage collection frequency + * + * @return int + */ + public function getGcFreq() + { + return $this->_gcFreq; + } + /** + * Get font to use when generating captcha + * + * @return string + */ + public function getFont() + { + return $this->_font; + } + + /** + * Get font size + * + * @return int + */ + public function getFontSize() + { + return $this->_fsize; + } + + /** + * Get captcha image height + * + * @return int + */ + public function getHeight() + { + return $this->_height; + } + + /** + * Get captcha image directory + * + * @return string + */ + public function getImgDir() + { + return $this->_imgDir; + } + /** + * Get captcha image base URL + * + * @return string + */ + public function getImgUrl() + { + return $this->_imgUrl; + } + /** + * Get captcha image file suffix + * + * @return string + */ + public function getSuffix() + { + return $this->_suffix; + } + /** + * Get captcha image width + * + * @return int + */ + public function getWidth() + { + return $this->_width; + } + /** + * @param string $startImage + */ + public function setStartImage ($startImage) + { + $this->_startImage = $startImage; + return $this; + } + /** + * @param int $dotNoiseLevel + */ + public function setDotNoiseLevel ($dotNoiseLevel) + { + $this->_dotNoiseLevel = $dotNoiseLevel; + return $this; + } + /** + * @param int $lineNoiseLevel + */ + public function setLineNoiseLevel ($lineNoiseLevel) + { + $this->_lineNoiseLevel = $lineNoiseLevel; + return $this; + } + + /** + * Set captcha expiration + * + * @param int $expiration + * @return Zend_Captcha_Image + */ + public function setExpiration($expiration) + { + $this->_expiration = $expiration; + return $this; + } + + /** + * Set garbage collection frequency + * + * @param int $gcFreq + * @return Zend_Captcha_Image + */ + public function setGcFreq($gcFreq) + { + $this->_gcFreq = $gcFreq; + return $this; + } + + /** + * Set captcha font + * + * @param string $font + * @return Zend_Captcha_Image + */ + public function setFont($font) + { + $this->_font = $font; + return $this; + } + + /** + * Set captcha font size + * + * @param int $fsize + * @return Zend_Captcha_Image + */ + public function setFontSize($fsize) + { + $this->_fsize = $fsize; + return $this; + } + + /** + * Set captcha image height + * + * @param int $height + * @return Zend_Captcha_Image + */ + public function setHeight($height) + { + $this->_height = $height; + return $this; + } + + /** + * Set captcha image storage directory + * + * @param string $imgDir + * @return Zend_Captcha_Image + */ + public function setImgDir($imgDir) + { + $this->_imgDir = rtrim($imgDir, "/\\") . '/'; + return $this; + } + + /** + * Set captcha image base URL + * + * @param string $imgUrl + * @return Zend_Captcha_Image + */ + public function setImgUrl($imgUrl) + { + $this->_imgUrl = rtrim($imgUrl, "/\\") . '/'; + return $this; + } + /** + * @param string $imgAlt + */ + public function setImgAlt ($imgAlt) + { + $this->_imgAlt = $imgAlt; + return $this; + } + + /** + * Set captch image filename suffix + * + * @param string $suffix + * @return Zend_Captcha_Image + */ + public function setSuffix($suffix) + { + $this->_suffix = $suffix; + return $this; + } + + /** + * Set captcha image width + * + * @param int $width + * @return Zend_Captcha_Image + */ + public function setWidth($width) + { + $this->_width = $width; + return $this; + } + + /** + * Generate random frequency + * + * @return float + */ + protected function _randomFreq() + { + return mt_rand(700000, 1000000) / 15000000; + } + + /** + * Generate random phase + * + * @return float + */ + protected function _randomPhase() + { + // random phase from 0 to pi + return mt_rand(0, 3141592) / 1000000; + } + + /** + * Generate random character size + * + * @return int + */ + protected function _randomSize() + { + return mt_rand(300, 700) / 100; + } + + /** + * Generate captcha + * + * @return string captcha ID + */ + public function generate() + { + $id = parent::generate(); + $this->_generateImage($id, $this->getWord()); + + if (mt_rand(0, $this->getGcFreq()) == 1) { + $this->_gc(); + } + return $id; + } + + /** + * Generate image captcha + * + * Override this function if you want different image generator + * Wave transform from http://www.captcha.ru/captchas/multiwave/ + * + * @param string $id Captcha ID + * @param string $word Captcha word + */ + protected function _generateImage($id, $word) + { + if (!extension_loaded("gd")) { + require_once 'Zend/Captcha/Exception.php'; + throw new Zend_Captcha_Exception("Image CAPTCHA requires GD extension"); + } + + if (!function_exists("imagepng")) { + require_once 'Zend/Captcha/Exception.php'; + throw new Zend_Captcha_Exception("Image CAPTCHA requires PNG support"); + } + + if (!function_exists("imageftbbox")) { + require_once 'Zend/Captcha/Exception.php'; + throw new Zend_Captcha_Exception("Image CAPTCHA requires FT fonts support"); + } + + $font = $this->getFont(); + + if (empty($font)) { + require_once 'Zend/Captcha/Exception.php'; + throw new Zend_Captcha_Exception("Image CAPTCHA requires font"); + } + + $w = $this->getWidth(); + $h = $this->getHeight(); + $fsize = $this->getFontSize(); + + $img_file = $this->getImgDir() . $id . $this->getSuffix(); + if(empty($this->_startImage)) { + $img = imagecreatetruecolor($w, $h); + } else { + $img = imagecreatefrompng($this->_startImage); + if(!$img) { + require_once 'Zend/Captcha/Exception.php'; + throw new Zend_Captcha_Exception("Can not load start image"); + } + $w = imagesx($img); + $h = imagesy($img); + } + $text_color = imagecolorallocate($img, 0, 0, 0); + $bg_color = imagecolorallocate($img, 255, 255, 255); + imagefilledrectangle($img, 0, 0, $w-1, $h-1, $bg_color); + $textbox = imageftbbox($fsize, 0, $font, $word); + $x = ($w - ($textbox[2] - $textbox[0])) / 2; + $y = ($h - ($textbox[7] - $textbox[1])) / 2; + imagefttext($img, $fsize, 0, $x, $y, $text_color, $font, $word); + + // generate noise + for ($i=0; $i<$this->_dotNoiseLevel; $i++) { + imagefilledellipse($img, mt_rand(0,$w), mt_rand(0,$h), 2, 2, $text_color); + } + for($i=0; $i<$this->_lineNoiseLevel; $i++) { + imageline($img, mt_rand(0,$w), mt_rand(0,$h), mt_rand(0,$w), mt_rand(0,$h), $text_color); + } + + // transformed image + $img2 = imagecreatetruecolor($w, $h); + $bg_color = imagecolorallocate($img2, 255, 255, 255); + imagefilledrectangle($img2, 0, 0, $w-1, $h-1, $bg_color); + // apply wave transforms + $freq1 = $this->_randomFreq(); + $freq2 = $this->_randomFreq(); + $freq3 = $this->_randomFreq(); + $freq4 = $this->_randomFreq(); + + $ph1 = $this->_randomPhase(); + $ph2 = $this->_randomPhase(); + $ph3 = $this->_randomPhase(); + $ph4 = $this->_randomPhase(); + + $szx = $this->_randomSize(); + $szy = $this->_randomSize(); + + for ($x = 0; $x < $w; $x++) { + for ($y = 0; $y < $h; $y++) { + $sx = $x + (sin($x*$freq1 + $ph1) + sin($y*$freq3 + $ph3)) * $szx; + $sy = $y + (sin($x*$freq2 + $ph2) + sin($y*$freq4 + $ph4)) * $szy; + + if ($sx < 0 || $sy < 0 || $sx >= $w - 1 || $sy >= $h - 1) { + continue; + } else { + $color = (imagecolorat($img, $sx, $sy) >> 16) & 0xFF; + $color_x = (imagecolorat($img, $sx + 1, $sy) >> 16) & 0xFF; + $color_y = (imagecolorat($img, $sx, $sy + 1) >> 16) & 0xFF; + $color_xy = (imagecolorat($img, $sx + 1, $sy + 1) >> 16) & 0xFF; + } + if ($color == 255 && $color_x == 255 && $color_y == 255 && $color_xy == 255) { + // ignore background + continue; + } elseif ($color == 0 && $color_x == 0 && $color_y == 0 && $color_xy == 0) { + // transfer inside of the image as-is + $newcolor = 0; + } else { + // do antialiasing for border items + $frac_x = $sx-floor($sx); + $frac_y = $sy-floor($sy); + $frac_x1 = 1-$frac_x; + $frac_y1 = 1-$frac_y; + + $newcolor = $color * $frac_x1 * $frac_y1 + + $color_x * $frac_x * $frac_y1 + + $color_y * $frac_x1 * $frac_y + + $color_xy * $frac_x * $frac_y; + } + imagesetpixel($img2, $x, $y, imagecolorallocate($img2, $newcolor, $newcolor, $newcolor)); + } + } + + // generate noise + for ($i=0; $i<$this->_dotNoiseLevel; $i++) { + imagefilledellipse($img2, mt_rand(0,$w), mt_rand(0,$h), 2, 2, $text_color); + } + for ($i=0; $i<$this->_lineNoiseLevel; $i++) { + imageline($img2, mt_rand(0,$w), mt_rand(0,$h), mt_rand(0,$w), mt_rand(0,$h), $text_color); + } + + imagepng($img2, $img_file); + imagedestroy($img); + imagedestroy($img2); + } + + /** + * Remove old files from image directory + * + */ + protected function _gc() + { + $expire = time() - $this->getExpiration(); + foreach (new DirectoryIterator($this->getImgDir()) as $file) { + if (!$file->isDot() && !$file->isDir()) { + if ($file->getMTime() < $expire) { + unlink($file->getPathname()); + } + } + } + } + + /** + * Display the captcha + * + * @param Zend_View $view + * @param mixed $element + * @return string + */ + public function render(Zend_View_Interface $view, $element = null) + { + return ''.$this->getImgAlt().'
'; + } +} diff --git a/libs/Zend/Captcha/ReCaptcha.php b/libs/Zend/Captcha/ReCaptcha.php new file mode 100644 index 0000000..aee7fed --- /dev/null +++ b/libs/Zend/Captcha/ReCaptcha.php @@ -0,0 +1,259 @@ + 'Missing captcha fields', + self::ERR_CAPTCHA => 'Failed to validate captcha', + self::BAD_CAPTCHA => 'Captcha value is wrong: %value%', + ); + + /** + * Retrieve ReCaptcha Private key + * + * @return string + */ + public function getPrivkey() + { + return $this->_privkey; + } + + /** + * Retrieve ReCaptcha Public key + * + * @return string + */ + public function getPubkey() + { + return $this->_pubkey; + } + + /** + * Set ReCaptcha Private key + * + * @param string $_privkey + * @return Zend_Captcha_ReCaptcha + */ + public function setPrivkey($privkey) + { + $this->_privkey = $privkey; + return $this; + } + + /** + * Set ReCaptcha public key + * + * @param string $_pubkey + * @return Zend_Captcha_ReCaptcha + */ + public function setPubkey($pubkey) + { + $this->_pubkey = $pubkey; + return $this; + } + + /** + * Constructor + * + * @param array|Zend_Config $options + * @return void + */ + public function __construct($options = null) + { + parent::__construct($options); + + $this->setService(new Zend_Service_ReCaptcha($this->getPubKey(), $this->getPrivKey())); + $this->_serviceParams = $this->getService()->getParams(); + + if ($options instanceof Zend_Config) { + $options = $options->toArray(); + } + if (!empty($options)) { + $this->setOptions($options); + } + } + + /** + * Set service object + * + * @param Zend_Service_ReCaptcha $service + * @return Zend_Captcha_ReCaptcha + */ + public function setService(Zend_Service_ReCaptcha $service) + { + $this->_service = $service; + return $this; + } + + /** + * Retrieve ReCaptcha service object + * + * @return Zend_Service_ReCaptcha + */ + public function getService() + { + return $this->_service; + } + + /** + * Set option + * + * If option is a service parameter, proxies to the service. + * + * @param string $key + * @param mixed $value + * @return Zend_Captcha_ReCaptcha + */ + public function setOption($key, $value) + { + $service = $this->getService(); + if (isset($this->_serviceParams[$key])) { + $service->setParam($key, $value); + return $this; + } + return parent::setOption($key, $value); + } + + /** + * Generate captcha + * + * @see Zend_Form_Captcha_Adapter::generate() + * @return string + */ + public function generate() + { + return ""; + } + + /** + * Validate captcha + * + * @see Zend_Validate_Interface::isValid() + * @param mixed $value + * @return boolean + */ + public function isValid($value, $context = null) + { + if (empty($context[$this->_CHALLENGE]) || empty($context[$this->_RESPONSE])) { + $this->_error(self::MISSING_VALUE); + return false; + } + + $service = $this->getService(); + + $res = $service->verify($context[$this->_CHALLENGE], $context[$this->_RESPONSE]); + + if (!$res) { + $this->_error(self::ERR_CAPTCHA); + return false; + } + + if (!$res->isValid()) { + $this->_error(self::BAD_CAPTCHA, $res->getErrorCode()); + $service->setParam('error', $res->getErrorCode()); + return false; + } + + return true; + } + + /** + * Render captcha + * + * @param Zend_View $view + * @param mixed $element + * @return string + */ + public function render(Zend_View_Interface $view, $element = null) + { + return $this->getService()->getHTML(); + } +} diff --git a/libs/Zend/Captcha/Word.php b/libs/Zend/Captcha/Word.php new file mode 100644 index 0000000..a41f944 --- /dev/null +++ b/libs/Zend/Captcha/Word.php @@ -0,0 +1,356 @@ + 'Empty captcha value', + self::MISSING_ID => 'Captcha ID field is missing', + self::BAD_CAPTCHA => 'Captcha value is wrong', + ); + + /** + * Length of the word to generate + * + * @var integer + */ + protected $_wordlen = 8; + + /** + * Retrieve session class to utilize + * + * @return string + */ + public function getSessionClass() + { + return $this->_sessionClass; + } + + /** + * Set session class for persistence + * + * @param string $_sessionClass + * @return Zend_Captcha_Word + */ + public function setSessionClass($_sessionClass) + { + $this->_sessionClass = $_sessionClass; + return $this; + } + + /** + * Retrieve word length to use when genrating captcha + * + * @return integer + */ + public function getWordlen() + { + return $this->_wordlen; + } + + /** + * Set word length of captcha + * + * @param integer $wordlen + * @return Zend_Captcha_Word + */ + public function setWordlen($wordlen) + { + $this->_wordlen = $wordlen; + return $this; + } + + /** + * Retrieve captcha ID + * + * @return string + */ + public function getId () + { + if (null === $this->_id) { + $this->_setId($this->_generateRandomId()); + } + return $this->_id; + } + + /** + * Set captcha identifier + * + * @param string $id + * return Zend_Captcha_Word + */ + protected function _setId ($id) + { + $this->_id = $id; + return $this; + } + + /** + * Set timeout for session token + * + * @param int $ttl + * @return Zend_Captcha_Word + */ + public function setTimeout($ttl) + { + $this->_timeout = (int) $ttl; + return $this; + } + + /** + * Get session token timeout + * + * @return int + */ + public function getTimeout() + { + return $this->_timeout; + } + + /** + * Get session object + * + * @return Zend_Session_Namespace + */ + public function getSession() + { + if (!isset($this->_session) || (null === $this->_session)) { + $id = $this->getId(); + $this->_session = new $this->_sessionClass('Zend_Form_Captcha_' . $id); + $this->_session->setExpirationHops(1, null, true); + $this->_session->setExpirationSeconds($this->getTimeout()); + } + return $this->_session; + } + + /** + * Set session namespace object + * + * @param Zend_Session_Namespace $session + * @return Zend_Captcha_Word + */ + public function setSession(Zend_Session_Namespace $session) + { + $this->_session = $session; + return $this; + } + + /** + * Get captcha word + * + * @return string + */ + public function getWord() + { + if (empty($this->_word)) { + $session = $this->getSession(); + $this->_word = $session->word; + } + return $this->_word; + } + + /** + * Set captcha word + * + * @param string $word + * @return Zend_Captcha_Word + */ + protected function _setWord($word) + { + $session = $this->getSession(); + $session->word = $word; + $this->_word = $word; + return $this; + } + + /** + * Generate new random word + * + * @return string + */ + protected function _generateWord() + { + $word = ''; + $wordLen = $this->getWordLen(); + $vowels = $this->_useNumbers ? self::$VN : self::$V; + $consonants = $this->_useNumbers ? self::$CN : self::$C; + + for ($i=0; $i < $wordLen; $i = $i + 2) { + // generate word with mix of vowels and consonants + $consonant = $consonants[array_rand($consonants)]; + $vowel = $vowels[array_rand($vowels)]; + $word .= $consonant . $vowel; + } + + if (strlen($word) > $wordLen) { + $word = substr($word, 0, $wordLen); + } + + return $word; + } + + /** + * Generate new session ID and new word + * + * @return string session ID + */ + public function generate() + { + $this->_session = null; + $id = $this->_generateRandomId(); + $this->_setId($id); + $word = $this->_generateWord(); + $this->_setWord($word); + return $id; + } + + protected function _generateRandomId() + { + return md5(mt_rand(0, 1000) . microtime(true)); + } + + /** + * Validate the word + * + * @see Zend_Validate_Interface::isValid() + * @param mixed $value + * @return boolean + */ + public function isValid($value, $context = null) + { + $name = $this->getName(); + if (!isset($context[$name]['input'])) { + $this->_error(self::MISSING_VALUE); + return false; + } + $value = strtolower($context[$name]['input']); + $this->_setValue($value); + + if (!isset($context[$name]['id'])) { + $this->_error(self::MISSING_ID); + return false; + } + + $this->_id = $context[$name]['id']; + if ($value !== $this->getWord()) { + $this->_error(self::BAD_CAPTCHA); + return false; + } + + return true; + } + + /** + * Get captcha decorator + * + * @return string + */ + public function getDecorator() + { + return "Captcha_Word"; + } +} diff --git a/libs/Zend/Config.php b/libs/Zend/Config.php new file mode 100644 index 0000000..067e9c1 --- /dev/null +++ b/libs/Zend/Config.php @@ -0,0 +1,433 @@ +_allowModifications = (boolean) $allowModifications; + $this->_loadedSection = null; + $this->_index = 0; + $this->_data = array(); + foreach ($array as $key => $value) { + if (is_array($value)) { + $this->_data[$key] = new self($value, $this->_allowModifications); + } else { + $this->_data[$key] = $value; + } + } + $this->_count = count($this->_data); + } + + /** + * Retrieve a value and return $default if there is no element set. + * + * @param string $name + * @param mixed $default + * @return mixed + */ + public function get($name, $default = null) + { + $result = $default; + if (array_key_exists($name, $this->_data)) { + $result = $this->_data[$name]; + } + return $result; + } + + /** + * Magic function so that $obj->value will work. + * + * @param string $name + * @return mixed + */ + public function __get($name) + { + return $this->get($name); + } + + /** + * Only allow setting of a property if $allowModifications + * was set to true on construction. Otherwise, throw an exception. + * + * @param string $name + * @param mixed $value + * @throws Zend_Config_Exception + * @return void + */ + public function __set($name, $value) + { + if ($this->_allowModifications) { + if (is_array($value)) { + $this->_data[$name] = new self($value, true); + } else { + $this->_data[$name] = $value; + } + $this->_count = count($this->_data); + } else { + /** @see Zend_Config_Exception */ + require_once 'Zend/Config/Exception.php'; + 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() + { + $array = array(); + foreach ($this->_data as $key => $value) { + if ($value instanceof Zend_Config) { + $array[$key] = clone $value; + } else { + $array[$key] = $value; + } + } + $this->_data = $array; + } + + /** + * Return an associative array of the stored data. + * + * @return array + */ + public function toArray() + { + $array = array(); + foreach ($this->_data as $key => $value) { + if ($value instanceof Zend_Config) { + $array[$key] = $value->toArray(); + } else { + $array[$key] = $value; + } + } + return $array; + } + + /** + * Support isset() overloading on PHP 5.1 + * + * @param string $name + * @return boolean + */ + public function __isset($name) + { + return isset($this->_data[$name]); + } + + /** + * Support unset() overloading on PHP 5.1 + * + * @param string $name + * @throws Zend_Config_Exception + * @return void + */ + public function __unset($name) + { + if ($this->_allowModifications) { + unset($this->_data[$name]); + $this->_count = count($this->_data); + } else { + /** @see Zend_Config_Exception */ + require_once 'Zend/Config/Exception.php'; + throw new Zend_Config_Exception('Zend_Config is read only'); + } + + } + + /** + * Defined by Countable interface + * + * @return int + */ + public function count() + { + return $this->_count; + } + + /** + * Defined by Iterator interface + * + * @return mixed + */ + public function current() + { + return current($this->_data); + } + + /** + * Defined by Iterator interface + * + * @return mixed + */ + public function key() + { + return key($this->_data); + } + + /** + * Defined by Iterator interface + * + */ + public function next() + { + next($this->_data); + $this->_index++; + } + + /** + * Defined by Iterator interface + * + */ + public function rewind() + { + reset($this->_data); + $this->_index = 0; + } + + /** + * Defined by Iterator interface + * + * @return boolean + */ + public function valid() + { + return $this->_index < $this->_count; + } + + /** + * Returns the section name(s) loaded. + * + * @return mixed + */ + public function getSectionName() + { + return $this->_loadedSection; + } + + /** + * Returns true if all sections were loaded + * + * @return boolean + */ + public function areAllSectionsLoaded() + { + return $this->_loadedSection === null; + } + + + /** + * Merge another Zend_Config with this one. The items + * in $merge will override the same named items in + * the current config. + * + * @param Zend_Config $merge + * @return Zend_Config + */ + public function merge(Zend_Config $merge) + { + foreach($merge as $key => $item) { + if(array_key_exists($key, $this->_data)) { + if($item instanceof Zend_Config && $this->$key instanceof Zend_Config) { + $this->$key = $this->$key->merge(new Zend_Config($item->toArray(), !$this->readOnly())); + } else { + $this->$key = $item; + } + } else { + if($item instanceof Zend_Config) { + $this->$key = new Zend_Config($item->toArray(), !$this->readOnly()); + } else { + $this->$key = $item; + } + } + } + + return $this; + } + + /** + * Prevent any more modifications being made to this instance. Useful + * after merge() has been used to merge multiple Zend_Config objects + * into one object which should then not be modified again. + * + */ + public function setReadOnly() + { + $this->_allowModifications = false; + } + + /** + * Returns if this Zend_Config object is read only or not. + * + * @return boolean + */ + public function readOnly() + { + return !$this->_allowModifications; + } + + /** + * Get the current extends + * + * @return array + */ + public function getExtends() + { + return $this->_extends; + } + + /** + * Set an extend for Zend_Config_Writer + * + * @param string $extendingSection + * @param string $extendedSection + * @return void + */ + public function setExtend($extendingSection, $extendedSection = null) + { + if ($extendedSection === null && isset($this->_extends[$extendingSection])) { + unset($this->_extends[$extendingSection]); + } else if ($extendedSection !== null) { + $this->_extends[$extendingSection] = $extendedSection; + } + } + + /** + * Throws an exception if $extendingSection may not extend $extendedSection, + * and tracks the section extension if it is valid. + * + * @param string $extendingSection + * @param string $extendedSection + * @throws Zend_Config_Exception + * @return void + */ + protected function _assertValidExtend($extendingSection, $extendedSection) + { + // detect circular section inheritance + $extendedSectionCurrent = $extendedSection; + while (array_key_exists($extendedSectionCurrent, $this->_extends)) { + if ($this->_extends[$extendedSectionCurrent] == $extendingSection) { + /** @see Zend_Config_Exception */ + require_once 'Zend/Config/Exception.php'; + throw new Zend_Config_Exception('Illegal circular inheritance detected'); + } + $extendedSectionCurrent = $this->_extends[$extendedSectionCurrent]; + } + // remember that this section extends another section + $this->_extends[$extendingSection] = $extendedSection; + } + + /** + * Handle any errors from simplexml_load_file or parse_ini_file + * + * @param integer $errno + * @param string $errstr + * @param string $errfile + * @param integer $errline + */ + protected function _loadFileErrorHandler($errno, $errstr, $errfile, $errline) + { + if ($this->_loadFileErrorStr === null) { + $this->_loadFileErrorStr = $errstr; + } else { + $this->_loadFileErrorStr .= (PHP_EOL . $errstr); + } + } + +} diff --git a/libs/Zend/Config/Exception.php b/libs/Zend/Config/Exception.php new file mode 100644 index 0000000..99bdab1 --- /dev/null +++ b/libs/Zend/Config/Exception.php @@ -0,0 +1,32 @@ +hostname === "staging" + * $data->db->connection === "database" + * + * The $options parameter may be provided as either a boolean or an array. + * If provided as a boolean, this sets the $allowModifications option of + * Zend_Config. If provided as an array, there are two configuration + * directives that may be set. For example: + * + * $options = array( + * 'allowModifications' => false, + * 'nestSeparator' => '->' + * ); + * + * @param string $filename + * @param string|null $section + * @param boolean|array $options + * @throws Zend_Config_Exception + * @return void + */ + public function __construct($filename, $section = null, $options = false) + { + if (empty($filename)) { + /** + * @see Zend_Config_Exception + */ + require_once 'Zend/Config/Exception.php'; + throw new Zend_Config_Exception('Filename is not set'); + } + + $allowModifications = false; + if (is_bool($options)) { + $allowModifications = $options; + } elseif (is_array($options)) { + if (isset($options['allowModifications'])) { + $allowModifications = (bool) $options['allowModifications']; + } + if (isset($options['nestSeparator'])) { + $this->_nestSeparator = (string) $options['nestSeparator']; + } + } + + set_error_handler(array($this, '_loadFileErrorHandler')); + $iniArray = parse_ini_file($filename, true); // Warnings and errors are suppressed + restore_error_handler(); + // Check if there was a error while loading file + if ($this->_loadFileErrorStr !== null) { + /** + * @see Zend_Config_Exception + */ + require_once 'Zend/Config/Exception.php'; + throw new Zend_Config_Exception($this->_loadFileErrorStr); + } + + $preProcessedArray = array(); + foreach ($iniArray as $key => $data) + { + $bits = explode(':', $key); + $thisSection = trim($bits[0]); + switch (count($bits)) { + case 1: + $preProcessedArray[$thisSection] = $data; + break; + + case 2: + $extendedSection = trim($bits[1]); + $preProcessedArray[$thisSection] = array_merge(array(';extends'=>$extendedSection), $data); + break; + + default: + /** + * @see Zend_Config_Exception + */ + require_once 'Zend/Config/Exception.php'; + throw new Zend_Config_Exception("Section '$thisSection' may not extend multiple sections in $filename"); + } + } + + if (null === $section) { + $dataArray = array(); + foreach ($preProcessedArray as $sectionName => $sectionData) { + if(!is_array($sectionData)) { + $dataArray = array_merge_recursive($dataArray, $this->_processKey(array(), $sectionName, $sectionData)); + } else { + $dataArray[$sectionName] = $this->_processExtends($preProcessedArray, $sectionName); + } + } + parent::__construct($dataArray, $allowModifications); + } elseif (is_array($section)) { + $dataArray = array(); + foreach ($section as $sectionName) { + if (!isset($preProcessedArray[$sectionName])) { + /** + * @see Zend_Config_Exception + */ + require_once 'Zend/Config/Exception.php'; + throw new Zend_Config_Exception("Section '$sectionName' cannot be found in $filename"); + } + $dataArray = array_merge($this->_processExtends($preProcessedArray, $sectionName), $dataArray); + + } + parent::__construct($dataArray, $allowModifications); + } else { + if (!isset($preProcessedArray[$section])) { + /** + * @see Zend_Config_Exception + */ + require_once 'Zend/Config/Exception.php'; + throw new Zend_Config_Exception("Section '$section' cannot be found in $filename"); + } + parent::__construct($this->_processExtends($preProcessedArray, $section), $allowModifications); + } + + $this->_loadedSection = $section; + } + + /** + * Helper function to process each element in the section and handle + * the "extends" inheritance keyword. Passes control to _processKey() + * to handle the "dot" sub-property syntax in each key. + * + * @param array $iniArray + * @param string $section + * @param array $config + * @throws Zend_Config_Exception + * @return array + */ + protected function _processExtends($iniArray, $section, $config = array()) + { + $thisSection = $iniArray[$section]; + + foreach ($thisSection as $key => $value) { + if (strtolower($key) == ';extends') { + if (isset($iniArray[$value])) { + $this->_assertValidExtend($section, $value); + $config = $this->_processExtends($iniArray, $value, $config); + } else { + /** + * @see Zend_Config_Exception + */ + require_once 'Zend/Config/Exception.php'; + throw new Zend_Config_Exception("Section '$section' cannot be found"); + } + } else { + $config = $this->_processKey($config, $key, $value); + } + } + return $config; + } + + /** + * Assign the key's value to the property list. Handle the "dot" + * notation for sub-properties by passing control to + * processLevelsInKey(). + * + * @param array $config + * @param string $key + * @param string $value + * @throws Zend_Config_Exception + * @return array + */ + protected function _processKey($config, $key, $value) + { + if (strpos($key, $this->_nestSeparator) !== false) { + $pieces = explode($this->_nestSeparator, $key, 2); + if (strlen($pieces[0]) && strlen($pieces[1])) { + if (!isset($config[$pieces[0]])) { + $config[$pieces[0]] = array(); + } elseif (!is_array($config[$pieces[0]])) { + /** + * @see Zend_Config_Exception + */ + require_once 'Zend/Config/Exception.php'; + throw new Zend_Config_Exception("Cannot create sub-key for '{$pieces[0]}' as key already exists"); + } + $config[$pieces[0]] = $this->_processKey($config[$pieces[0]], $pieces[1], $value); + } else { + /** + * @see Zend_Config_Exception + */ + require_once 'Zend/Config/Exception.php'; + throw new Zend_Config_Exception("Invalid key '$key'"); + } + } else { + $config[$key] = $value; + } + return $config; + } +} diff --git a/libs/Zend/Config/Writer.php b/libs/Zend/Config/Writer.php new file mode 100644 index 0000000..99b9580 --- /dev/null +++ b/libs/Zend/Config/Writer.php @@ -0,0 +1,101 @@ +setOptions($options); + } + } + + /** + * Set options via a Zend_Config instance + * + * @param Zend_Config $config + * @return Zend_Config_Writer + */ + public function setConfig(Zend_Config $config) + { + $this->_config = $config; + + return $this; + } + + /** + * Set options via an array + * + * @param array $options + * @return Zend_Config_Writer + */ + public function setOptions(array $options) + { + foreach ($options as $key => $value) { + if (in_array(strtolower($key), $this->_skipOptions)) { + continue; + } + + $method = 'set' . ucfirst($key); + if (method_exists($this, $method)) { + $this->$method($value); + } + } + + return $this; + } + + /** + * Write a Zend_Config object to it's target + * + * @return void + */ + abstract public function write(); +} diff --git a/libs/Zend/Config/Writer/Array.php b/libs/Zend/Config/Writer/Array.php new file mode 100644 index 0000000..98be868 --- /dev/null +++ b/libs/Zend/Config/Writer/Array.php @@ -0,0 +1,101 @@ +_filename = $filename; + + return $this; + } + + /** + * Defined by Zend_Config_Writer + * + * @param string $filename + * @param Zend_Config $config + * @throws Zend_Config_Exception When filename was not set + * @throws Zend_Config_Exception When filename is not writable + * @return void + */ + public function write($filename = null, Zend_Config $config = null) + { + if ($filename !== null) { + $this->setFilename($filename); + } + + if ($config !== null) { + $this->setConfig($config); + } + + 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 = "_filename, $arrayString); + + 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 new file mode 100644 index 0000000..1a05237 --- /dev/null +++ b/libs/Zend/Config/Writer/Ini.php @@ -0,0 +1,174 @@ +_filename = $filename; + + return $this; + } + + /** + * Set the nest separator + * + * @param string $filename + * @return Zend_Config_Writer_Ini + */ + public function setNestSeparator($separator) + { + $this->_nestSeparator = $separator; + + return $this; + } + + /** + * Defined by Zend_Config_Writer + * + * @param string $filename + * @param Zend_Config $config + * @throws Zend_Config_Exception When filename was not set + * @throws Zend_Config_Exception When filename is not writable + * @return void + */ + public function write($filename = null, Zend_Config $config = null) + { + if ($filename !== null) { + $this->setFilename($filename); + } + + if ($config !== null) { + $this->setConfig($config); + } + + 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) + . "\n"; + } else { + foreach ($this->_config as $sectionName => $data) { + if (isset($extends[$sectionName])) { + $sectionName .= ' : ' . $extends[$sectionName]; + } + + $iniString .= '[' . $sectionName . ']' . "\n" + . $this->_addBranch($data) + . "\n"; + } + } + + $result = @file_put_contents($this->_filename, $iniString); + + 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 INI string recursively + * + * @param Zend_Config $config + * @return void + */ + protected function _addBranch(Zend_Config $config, $parents = array()) + { + $iniString = ''; + + foreach ($config as $key => $value) { + $group = array_merge($parents, array($key)); + + if ($value instanceof Zend_Config) { + $iniString .= $this->_addBranch($value, $group); + } else { + $iniString .= implode($this->_nestSeparator, $group) + . ' = ' + . $this->_prepareValue($value) + . "\n"; + } + } + + return $iniString; + } + + /** + * Prepare a value for INI + * + * @param mixed $value + * @return string + */ + protected function _prepareValue($value) + { + if (is_integer($value) || is_float($value)) { + return $value; + } elseif (is_bool($value)) { + return ($value ? 'true' : 'false'); + } else { + return '"' . addslashes($value) . '"'; + } + } +} diff --git a/libs/Zend/Config/Writer/Xml.php b/libs/Zend/Config/Writer/Xml.php new file mode 100644 index 0000000..c8b8b74 --- /dev/null +++ b/libs/Zend/Config/Writer/Xml.php @@ -0,0 +1,140 @@ +_filename = $filename; + + return $this; + } + + /** + * Defined by Zend_Config_Writer + * + * @param string $filename + * @param Zend_Config $config + * @throws Zend_Config_Exception When filename was not set + * @throws Zend_Config_Exception When filename is not writable + * @return void + */ + public function write($filename = null, Zend_Config $config = null) + { + if ($filename !== null) { + $this->setFilename($filename); + } + + if ($config !== null) { + $this->setConfig($config); + } + + 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); + + $this->_addBranch($this->_config, $child); + } else { + foreach ($this->_config as $sectionName => $data) { + if (!($data instanceof Zend_Config)) { + continue; + } + + $child = $xml->addChild($sectionName); + + if (isset($extends[$sectionName])) { + $child->addAttribute('extends', $extends[$sectionName]); + } + + $this->_addBranch($data, $child); + } + } + + $dom = dom_import_simplexml($xml)->ownerDocument; + $dom->formatOutput = true; + + $xmlString = $dom->saveXML(); + + $result = @file_put_contents($this->_filename, $xmlString); + + 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 + * + * @param Zend_Config $config + * @param SimpleXMLElement $xml + * @return void + */ + protected function _addBranch(Zend_Config $config, SimpleXMLElement $xml) + { + foreach ($config as $key => $value) { + if ($value instanceof Zend_Config) { + $child = $xml->addChild($key); + + $this->_addBranch($value, $child); + } else { + $xml->addChild($key, (string) $value); + } + } + } +} diff --git a/libs/Zend/Config/Xml.php b/libs/Zend/Config/Xml.php new file mode 100644 index 0000000..70d839c --- /dev/null +++ b/libs/Zend/Config/Xml.php @@ -0,0 +1,230 @@ +_loadFileErrorStr !== null) { + require_once 'Zend/Config/Exception.php'; + throw new Zend_Config_Exception($this->_loadFileErrorStr); + } + + if ($section === null) { + $dataArray = array(); + foreach ($config as $sectionName => $sectionData) { + $dataArray[$sectionName] = $this->_processExtends($config, $sectionName); + } + + parent::__construct($dataArray, $allowModifications); + } else if (is_array($section)) { + $dataArray = array(); + foreach ($section as $sectionName) { + if (!isset($config->$sectionName)) { + require_once 'Zend/Config/Exception.php'; + throw new Zend_Config_Exception("Section '$sectionName' cannot be found in $filename"); + } + + $dataArray = array_merge($this->_processExtends($config, $sectionName), $dataArray); + } + + parent::__construct($dataArray, $allowModifications); + } else { + if (!isset($config->$section)) { + require_once 'Zend/Config/Exception.php'; + throw new Zend_Config_Exception("Section '$section' cannot be found in $filename"); + } + + $dataArray = $this->_processExtends($config, $section); + if (!is_array($dataArray)) { + // Section in the XML file contains just one top level string + $dataArray = array($section => $dataArray); + } + + parent::__construct($dataArray, $allowModifications); + } + + $this->_loadedSection = $section; + } + + /** + * Helper function to process each element in the section and handle + * the "extends" inheritance attribute. + * + * @param SimpleXMLElement $element XML Element to process + * @param string $section Section to process + * @param array $config Configuration which was parsed yet + * @throws Zend_Config_Exception When $section cannot be found + * @return array + */ + protected function _processExtends(SimpleXMLElement $element, $section, array $config = array()) + { + if (!isset($element->$section)) { + require_once 'Zend/Config/Exception.php'; + throw new Zend_Config_Exception("Section '$section' cannot be found"); + } + + $thisSection = $element->$section; + + if (isset($thisSection['extends'])) { + $extendedSection = (string) $thisSection['extends']; + $this->_assertValidExtend($section, $extendedSection); + $config = $this->_processExtends($element, $extendedSection, $config); + } + + $config = $this->_arrayMergeRecursive($config, $this->_toArray($thisSection)); + + return $config; + } + + /** + * Returns a string or an associative and possibly multidimensional array from + * a SimpleXMLElement. + * + * @param SimpleXMLElement $xmlObject Convert a SimpleXMLElement into an array + * @return array|string + */ + protected function _toArray(SimpleXMLElement $xmlObject) + { + $config = array(); + + // Search for parent node values + if (count($xmlObject->attributes()) > 0) { + foreach ($xmlObject->attributes() as $key => $value) { + if ($key === 'extends') { + continue; + } + + $value = (string) $value; + + if (array_key_exists($key, $config)) { + if (!is_array($config[$key])) { + $config[$key] = array($config[$key]); + } + + $config[$key][] = $value; + } else { + $config[$key] = $value; + } + } + } + + // Search for children + if (count($xmlObject->children()) > 0) { + foreach ($xmlObject->children() as $key => $value) { + if (count($value->children()) > 0) { + $value = $this->_toArray($value); + } else if (count($value->attributes()) > 0) { + $attributes = $value->attributes(); + if (isset($attributes['value'])) { + $value = (string) $attributes['value']; + } else { + $value = $this->_toArray($value); + } + } else { + $value = (string) $value; + } + + if (array_key_exists($key, $config)) { + if (!is_array($config[$key]) || !array_key_exists(0, $config[$key])) { + $config[$key] = array($config[$key]); + } + + $config[$key][] = $value; + } else { + $config[$key] = $value; + } + } + } else if (!isset($xmlObject['extends']) && (count($config) === 0)) { + // Object has no children nor attributes and doesn't use the extends + // attribute: it's a string + $config = (string) $xmlObject; + } + + return $config; + } + + /** + * Merge two arrays recursively, overwriting keys of the same name + * in $array1 with the value in $array2. + * + * @param mixed $firstArray First array + * @param mixed $secondArray Second array to merge into first array + * @return array + */ + protected function _arrayMergeRecursive($firstArray, $secondArray) + { + if (is_array($firstArray) && is_array($secondArray)) { + foreach ($secondArray as $key => $value) { + if (isset($firstArray[$key])) { + $firstArray[$key] = $this->_arrayMergeRecursive($firstArray[$key], $value); + } else { + $firstArray[$key] = $value; + } + } + } else { + $firstArray = $secondArray; + } + + return $firstArray; + } +} diff --git a/libs/Zend/Console/Getopt.php b/libs/Zend/Console/Getopt.php new file mode 100644 index 0000000..3949192 --- /dev/null +++ b/libs/Zend/Console/Getopt.php @@ -0,0 +1,954 @@ + self::MODE_ZEND, + self::CONFIG_DASHDASH => true, + self::CONFIG_IGNORECASE => false + ); + + /** + * Stores the command-line arguments for the calling applicaion. + * + * @var array + */ + protected $_argv = array(); + + /** + * Stores the name of the calling applicaion. + * + * @var string + */ + protected $_progname = ''; + + /** + * Stores the list of legal options for this application. + * + * @var array + */ + protected $_rules = array(); + + /** + * Stores alternate spellings of legal options. + * + * @var array + */ + protected $_ruleMap = array(); + + /** + * Stores options given by the user in the current invocation + * of the application, as well as parameters given in options. + * + * @var array + */ + protected $_options = array(); + + /** + * Stores the command-line arguments other than options. + * + * @var array + */ + protected $_remainingArgs = array(); + + /** + * State of the options: parsed or not yet parsed? + * + * @var boolean + */ + protected $_parsed = false; + + /** + * The constructor takes one to three parameters. + * + * The first parameter is $rules, which may be a string for + * gnu-style format, or a structured array for Zend-style format. + * + * The second parameter is $argv, and it is optional. If not + * specified, $argv is inferred from the global argv. + * + * The third parameter is an array of configuration parameters + * to control the behavior of this instance of Getopt; it is optional. + * + * @param array $rules + * @param array $argv + * @param array $getoptConfig + * @return void + */ + public function __construct($rules, $argv = null, $getoptConfig = array()) + { + $this->_progname = $_SERVER['argv'][0]; + $this->setOptions($getoptConfig); + $this->addRules($rules); + if (!is_array($argv)) { + $argv = array_slice($_SERVER['argv'], 1); + } + if (isset($argv)) { + $this->addArguments((array)$argv); + } + } + + /** + * Return the state of the option seen on the command line of the + * current application invocation. This function returns true, or the + * parameter to the option, if any. If the option was not given, + * this function returns null. + * + * The magic __get method works in the context of naming the option + * as a virtual member of this class. + * + * @param string $key + * @return string + */ + public function __get($key) + { + return $this->getOption($key); + } + + /** + * Test whether a given option has been seen. + * + * @param string $key + * @return boolean + */ + public function __isset($key) + { + $this->parse(); + if (isset($this->_ruleMap[$key])) { + $key = $this->_ruleMap[$key]; + return isset($this->_options[$key]); + } + return false; + } + + /** + * Set the value for a given option. + * + * @param string $key + * @param string $value + * @return void + */ + public function __set($key, $value) + { + $this->parse(); + if (isset($this->_ruleMap[$key])) { + $key = $this->_ruleMap[$key]; + $this->_options[$key] = $value; + } + } + + /** + * Return the current set of options and parameters seen as a string. + * + * @return string + */ + public function __toString() + { + return $this->toString(); + } + + /** + * Unset an option. + * + * @param string $key + * @return void + */ + public function __unset($key) + { + $this->parse(); + if (isset($this->_ruleMap[$key])) { + $key = $this->_ruleMap[$key]; + unset($this->_options[$key]); + } + } + + /** + * Define additional command-line arguments. + * These are appended to those defined when the constructor was called. + * + * @param array $argv + * @return Zend_Console_Getopt Provides a fluent interface + */ + public function addArguments($argv) + { + $this->_argv = array_merge($this->_argv, $argv); + $this->_parsed = false; + return $this; + } + + /** + * Define full set of command-line arguments. + * These replace any currently defined. + * + * @param array $argv + * @return Zend_Console_Getopt Provides a fluent interface + */ + public function setArguments($argv) + { + $this->_argv = $argv; + $this->_parsed = false; + return $this; + } + + /** + * Define multiple configuration options from an associative array. + * These are not program options, but properties to configure + * the behavior of Zend_Console_Getopt. + * + * @param array $getoptConfig + * @return Zend_Console_Getopt Provides a fluent interface + */ + public function setOptions($getoptConfig) + { + if (isset($getoptConfig)) { + foreach ($getoptConfig as $key => $value) { + $this->setOption($key, $value); + } + } + return $this; + } + + /** + * Define one configuration option as a key/value pair. + * These are not program options, but properties to configure + * the behavior of Zend_Console_Getopt. + * + * @param string $configKey + * @param string $configValue + * @return Zend_Console_Getopt Provides a fluent interface + */ + public function setOption($configKey, $configValue) + { + if ($configKey !== null) { + $this->_getoptConfig[$configKey] = $configValue; + } + return $this; + } + + /** + * Define additional option rules. + * These are appended to the rules defined when the constructor was called. + * + * @param array $rules + * @return Zend_Console_Getopt Provides a fluent interface + */ + public function addRules($rules) + { + $ruleMode = $this->_getoptConfig['ruleMode']; + switch ($this->_getoptConfig['ruleMode']) { + case self::MODE_ZEND: + if (is_array($rules)) { + $this->_addRulesModeZend($rules); + break; + } + // intentional fallthrough + case self::MODE_GNU: + $this->_addRulesModeGnu($rules); + break; + default: + /** + * Call addRulesModeFoo() for ruleMode 'foo'. + * The developer should subclass Getopt and + * provide this method. + */ + $method = '_addRulesMode' . ucfirst($ruleMode); + $this->$method($rules); + } + $this->_parsed = false; + return $this; + } + + /** + * Return the current set of options and parameters seen as a string. + * + * @return string + */ + public function toString() + { + $this->parse(); + $s = array(); + foreach ($this->_options as $flag => $value) { + $s[] = $flag . '=' . ($value === true ? 'true' : $value); + } + return implode(' ', $s); + } + + /** + * Return the current set of options and parameters seen + * as an array of canonical options and parameters. + * + * Clusters have been expanded, and option aliases + * have been mapped to their primary option names. + * + * @return array + */ + public function toArray() + { + $this->parse(); + $s = array(); + foreach ($this->_options as $flag => $value) { + $s[] = $flag; + if ($value !== true) { + $s[] = $value; + } + } + return $s; + } + + /** + * Return the current set of options and parameters seen in Json format. + * + * @return string + */ + public function toJson() + { + $this->parse(); + $j = array(); + foreach ($this->_options as $flag => $value) { + $j['options'][] = array( + 'option' => array( + 'flag' => $flag, + 'parameter' => $value + ) + ); + } + + /** + * @see Zend_Json + */ + require_once 'Zend/Json.php'; + $json = Zend_Json::encode($j); + + return $json; + } + + /** + * Return the current set of options and parameters seen in XML format. + * + * @return string + */ + public function toXml() + { + $this->parse(); + $doc = new DomDocument('1.0', 'utf-8'); + $optionsNode = $doc->createElement('options'); + $doc->appendChild($optionsNode); + foreach ($this->_options as $flag => $value) { + $optionNode = $doc->createElement('option'); + $optionNode->setAttribute('flag', utf8_encode($flag)); + if ($value !== true) { + $optionNode->setAttribute('parameter', utf8_encode($value)); + } + $optionsNode->appendChild($optionNode); + } + $xml = $doc->saveXML(); + return $xml; + } + + /** + * Return a list of options that have been seen in the current argv. + * + * @return array + */ + public function getOptions() + { + $this->parse(); + return array_keys($this->_options); + } + + /** + * Return the state of the option seen on the command line of the + * current application invocation. + * + * This function returns true, or the parameter value to the option, if any. + * If the option was not given, this function returns false. + * + * @param string $flag + * @return mixed + */ + public function getOption($flag) + { + $this->parse(); + if ($this->_getoptConfig[self::CONFIG_IGNORECASE]) { + $flag = strtolower($flag); + } + if (isset($this->_ruleMap[$flag])) { + $flag = $this->_ruleMap[$flag]; + if (isset($this->_options[$flag])) { + return $this->_options[$flag]; + } + } + return null; + } + + /** + * Return the arguments from the command-line following all options found. + * + * @return array + */ + public function getRemainingArgs() + { + $this->parse(); + return $this->_remainingArgs; + } + + /** + * Return a useful option reference, formatted for display in an + * error message. + * + * Note that this usage information is provided in most Exceptions + * generated by this class. + * + * @return string + */ + public function getUsageMessage() + { + $usage = "Usage: {$this->_progname} [ options ]\n"; + $maxLen = 20; + foreach ($this->_rules as $rule) { + $flags = array(); + if (is_array($rule['alias'])) { + foreach ($rule['alias'] as $flag) { + $flags[] = (strlen($flag) == 1 ? '-' : '--') . $flag; + } + } + $linepart['name'] = implode('|', $flags); + if (isset($rule['param']) && $rule['param'] != 'none') { + $linepart['name'] .= ' '; + switch ($rule['param']) { + case 'optional': + $linepart['name'] .= "[ <{$rule['paramType']}> ]"; + break; + case 'required': + $linepart['name'] .= "<{$rule['paramType']}>"; + break; + } + } + if (strlen($linepart['name']) > $maxLen) { + $maxLen = strlen($linepart['name']); + } + $linepart['help'] = ''; + if (isset($rule['help'])) { + $linepart['help'] .= $rule['help']; + } + $lines[] = $linepart; + } + foreach ($lines as $linepart) { + $usage .= sprintf("%s %s\n", + str_pad($linepart['name'], $maxLen), + $linepart['help']); + } + return $usage; + } + + /** + * Define aliases for options. + * + * The parameter $aliasMap is an associative array + * mapping option name (short or long) to an alias. + * + * @param array $aliasMap + * @throws Zend_Console_Getopt_Exception + * @return Zend_Console_Getopt Provides a fluent interface + */ + public function setAliases($aliasMap) + { + foreach ($aliasMap as $flag => $alias) + { + if ($this->_getoptConfig[self::CONFIG_IGNORECASE]) { + $flag = strtolower($flag); + $alias = strtolower($alias); + } + if (!isset($this->_ruleMap[$flag])) { + continue; + } + $flag = $this->_ruleMap[$flag]; + if (isset($this->_rules[$alias]) || isset($this->_ruleMap[$alias])) { + $o = (strlen($alias) == 1 ? '-' : '--') . $alias; + /** + * @see Zend_Console_Getopt_Exception + */ + throw new Zend_Console_Getopt_Exception( + "Option \"$o\" is being defined more than once."); + } + $this->_rules[$flag]['alias'][] = $alias; + $this->_ruleMap[$alias] = $flag; + } + return $this; + } + + /** + * Define help messages for options. + * + * The parameter $help_map is an associative array + * mapping option name (short or long) to the help string. + * + * @param array $helpMap + * @return Zend_Console_Getopt Provides a fluent interface + */ + public function setHelp($helpMap) + { + foreach ($helpMap as $flag => $help) + { + if (!isset($this->_ruleMap[$flag])) { + continue; + } + $flag = $this->_ruleMap[$flag]; + $this->_rules[$flag]['help'] = $help; + } + return $this; + } + + /** + * Parse command-line arguments and find both long and short + * options. + * + * Also find option parameters, and remaining arguments after + * all options have been parsed. + * + * @return Zend_Console_Getopt|null Provides a fluent interface + */ + public function parse() + { + if ($this->_parsed === true) { + return; + } + $argv = $this->_argv; + $this->_options = array(); + $this->_remainingArgs = array(); + while (count($argv) > 0) { + if ($argv[0] == '--') { + array_shift($argv); + if ($this->_getoptConfig[self::CONFIG_DASHDASH]) { + $this->_remainingArgs = array_merge($this->_remainingArgs, $argv); + break; + } + } + if (substr($argv[0], 0, 2) == '--') { + $this->_parseLongOption($argv); + } else if (substr($argv[0], 0, 1) == '-') { + $this->_parseShortOptionCluster($argv); + } else { + $this->_remainingArgs[] = array_shift($argv); + } + } + $this->_parsed = true; + return $this; + } + + /** + * Parse command-line arguments for a single long option. + * A long option is preceded by a double '--' character. + * Long options may not be clustered. + * + * @param mixed &$argv + * @return void + */ + protected function _parseLongOption(&$argv) + { + $optionWithParam = ltrim(array_shift($argv), '-'); + $l = explode('=', $optionWithParam); + $flag = array_shift($l); + $param = array_shift($l); + if (isset($param)) { + array_unshift($argv, $param); + } + $this->_parseSingleOption($flag, $argv); + } + + /** + * Parse command-line arguments for short options. + * Short options are those preceded by a single '-' character. + * Short options may be clustered. + * + * @param mixed &$argv + * @return void + */ + protected function _parseShortOptionCluster(&$argv) + { + $flagCluster = ltrim(array_shift($argv), '-'); + foreach (str_split($flagCluster) as $flag) { + $this->_parseSingleOption($flag, $argv); + } + } + + /** + * Parse command-line arguments for a single option. + * + * @param string $flag + * @param mixed $argv + * @throws Zend_Console_Getopt_Exception + * @return void + */ + protected function _parseSingleOption($flag, &$argv) + { + if ($this->_getoptConfig[self::CONFIG_IGNORECASE]) { + $flag = strtolower($flag); + } + if (!isset($this->_ruleMap[$flag])) { + /** + * @see Zend_Console_Getopt_Exception + */ + throw new Zend_Console_Getopt_Exception( + "Option \"$flag\" is not recognized.", + $this->getUsageMessage()); + } + $realFlag = $this->_ruleMap[$flag]; + switch ($this->_rules[$realFlag]['param']) { + case 'required': + if (count($argv) > 0) { + $param = array_shift($argv); + $this->_checkParameterType($realFlag, $param); + } else { + /** + * @see Zend_Console_Getopt_Exception + */ + throw new Zend_Console_Getopt_Exception( + "Option \"$flag\" requires a parameter.", + $this->getUsageMessage()); + } + break; + case 'optional': + if (count($argv) > 0 && substr($argv[0], 0, 1) != '-') { + $param = array_shift($argv); + $this->_checkParameterType($realFlag, $param); + } else { + $param = true; + } + break; + default: + $param = true; + } + $this->_options[$realFlag] = $param; + } + + /** + * Return true if the parameter is in a valid format for + * the option $flag. + * Throw an exception in most other cases. + * + * @param string $flag + * @param string $param + * @throws Zend_Console_Getopt_Exception + * @return bool + */ + protected function _checkParameterType($flag, $param) + { + $type = 'string'; + if (isset($this->_rules[$flag]['paramType'])) { + $type = $this->_rules[$flag]['paramType']; + } + switch ($type) { + case 'word': + if (preg_match('/\W/', $param)) { + /** + * @see Zend_Console_Getopt_Exception + */ + throw new Zend_Console_Getopt_Exception( + "Option \"$flag\" requires a single-word parameter, but was given \"$param\".", + $this->getUsageMessage()); + } + break; + case 'integer': + if (preg_match('/\D/', $param)) { + /** + * @see Zend_Console_Getopt_Exception + */ + throw new Zend_Console_Getopt_Exception( + "Option \"$flag\" requires an integer parameter, but was given \"$param\".", + $this->getUsageMessage()); + } + break; + case 'string': + default: + break; + } + return true; + } + + /** + * Define legal options using the gnu-style format. + * + * @param string $rules + * @return void + */ + protected function _addRulesModeGnu($rules) + { + $ruleArray = array(); + + /** + * Options may be single alphanumeric characters. + * Options may have a ':' which indicates a required string parameter. + * No long options or option aliases are supported in GNU style. + */ + preg_match_all('/([a-zA-Z0-9]:?)/', $rules, $ruleArray); + foreach ($ruleArray[1] as $rule) { + $r = array(); + $flag = substr($rule, 0, 1); + if ($this->_getoptConfig[self::CONFIG_IGNORECASE]) { + $flag = strtolower($flag); + } + $r['alias'][] = $flag; + if (substr($rule, 1, 1) == ':') { + $r['param'] = 'required'; + $r['paramType'] = 'string'; + } else { + $r['param'] = 'none'; + } + $this->_rules[$flag] = $r; + $this->_ruleMap[$flag] = $flag; + } + } + + /** + * Define legal options using the Zend-style format. + * + * @param array $rules + * @throws Zend_Console_Getopt_Exception + * @return void + */ + protected function _addRulesModeZend($rules) + { + foreach ($rules as $ruleCode => $helpMessage) + { + // this may have to translate the long parm type if there + // are any complaints that =string will not work (even though that use + // case is not documented) + if (in_array(substr($ruleCode, -2, 1), array('-', '='))) { + $flagList = substr($ruleCode, 0, -2); + $delimiter = substr($ruleCode, -2, 1); + $paramType = substr($ruleCode, -1); + } else { + $flagList = $ruleCode; + $delimiter = $paramType = null; + } + if ($this->_getoptConfig[self::CONFIG_IGNORECASE]) { + $flagList = strtolower($flagList); + } + $flags = explode('|', $flagList); + $rule = array(); + $mainFlag = $flags[0]; + foreach ($flags as $flag) { + if (empty($flag)) { + /** + * @see Zend_Console_Getopt_Exception + */ + throw new Zend_Console_Getopt_Exception( + "Blank flag not allowed in rule \"$ruleCode\"."); + } + if (strlen($flag) == 1) { + if (isset($this->_ruleMap[$flag])) { + /** + * @see Zend_Console_Getopt_Exception + */ + throw new Zend_Console_Getopt_Exception( + "Option \"-$flag\" is being defined more than once."); + } + $this->_ruleMap[$flag] = $mainFlag; + $rule['alias'][] = $flag; + } else { + if (isset($this->_rules[$flag]) || isset($this->_ruleMap[$flag])) { + /** + * @see Zend_Console_Getopt_Exception + */ + throw new Zend_Console_Getopt_Exception( + "Option \"--$flag\" is being defined more than once."); + } + $this->_ruleMap[$flag] = $mainFlag; + $rule['alias'][] = $flag; + } + } + if (isset($delimiter)) { + switch ($delimiter) { + case self::PARAM_REQUIRED: + $rule['param'] = 'required'; + break; + case self::PARAM_OPTIONAL: + default: + $rule['param'] = 'optional'; + } + switch (substr($paramType, 0, 1)) { + case self::TYPE_WORD: + $rule['paramType'] = 'word'; + break; + case self::TYPE_INTEGER: + $rule['paramType'] = 'integer'; + break; + case self::TYPE_STRING: + default: + $rule['paramType'] = 'string'; + } + } else { + $rule['param'] = 'none'; + } + $rule['help'] = $helpMessage; + $this->_rules[$mainFlag] = $rule; + } + } + +} diff --git a/libs/Zend/Console/Getopt/Exception.php b/libs/Zend/Console/Getopt/Exception.php new file mode 100644 index 0000000..6e3509f --- /dev/null +++ b/libs/Zend/Console/Getopt/Exception.php @@ -0,0 +1,65 @@ +usage = $usage; + parent::__construct($message); + } + + /** + * Returns the usage + * + * @return string + */ + public function getUsageMessage() + { + return $this->usage; + } +} diff --git a/libs/Zend/Controller/Action.php b/libs/Zend/Controller/Action.php new file mode 100644 index 0000000..07ef627 --- /dev/null +++ b/libs/Zend/Controller/Action.php @@ -0,0 +1,678 @@ +setRequest($request) + ->setResponse($response) + ->_setInvokeArgs($invokeArgs); + $this->_helper = new Zend_Controller_Action_HelperBroker($this); + $this->init(); + } + + /** + * Initialize object + * + * Called from {@link __construct()} as final step of object instantiation. + * + * @return void + */ + public function init() + { + } + + /** + * Initialize View object + * + * Initializes {@link $view} if not otherwise a Zend_View_Interface. + * + * If {@link $view} is not otherwise set, instantiates a new Zend_View + * object, using the 'views' subdirectory at the same level as the + * controller directory for the current module as the base directory. + * It uses this to set the following: + * - script path = views/scripts/ + * - helper path = views/helpers/ + * - filter path = views/filters/ + * + * @return Zend_View_Interface + * @throws Zend_Controller_Exception if base view directory does not exist + */ + public function initView() + { + if (!$this->getInvokeArg('noViewRenderer') && $this->_helper->hasHelper('viewRenderer')) { + return $this->view; + } + + require_once 'Zend/View/Interface.php'; + if (isset($this->view) && ($this->view instanceof Zend_View_Interface)) { + return $this->view; + } + + $request = $this->getRequest(); + $module = $request->getModuleName(); + $dirs = $this->getFrontController()->getControllerDirectory(); + if (empty($module) || !isset($dirs[$module])) { + $module = $this->getFrontController()->getDispatcher()->getDefaultModule(); + } + $baseDir = dirname($dirs[$module]) . DIRECTORY_SEPARATOR . 'views'; + if (!file_exists($baseDir) || !is_dir($baseDir)) { + require_once 'Zend/Controller/Exception.php'; + throw new Zend_Controller_Exception('Missing base view directory ("' . $baseDir . '")'); + } + + require_once 'Zend/View.php'; + $this->view = new Zend_View(array('basePath' => $baseDir)); + + return $this->view; + } + + /** + * Render a view + * + * Renders a view. By default, views are found in the view script path as + * /.phtml. You may change the script suffix by + * resetting {@link $viewSuffix}. You may omit the controller directory + * prefix by specifying boolean true for $noController. + * + * By default, the rendered contents are appended to the response. You may + * specify the named body content segment to set by specifying a $name. + * + * @see Zend_Controller_Response_Abstract::appendBody() + * @param string|null $action Defaults to action registered in request object + * @param string|null $name Response object named path segment to use; defaults to null + * @param bool $noController Defaults to false; i.e. use controller name as subdir in which to search for view script + * @return void + */ + public function render($action = null, $name = null, $noController = false) + { + if (!$this->getInvokeArg('noViewRenderer') && $this->_helper->hasHelper('viewRenderer')) { + return $this->_helper->viewRenderer->render($action, $name, $noController); + } + + $view = $this->initView(); + $script = $this->getViewScript($action, $noController); + + $this->getResponse()->appendBody( + $view->render($script), + $name + ); + } + + /** + * Render a given view script + * + * Similar to {@link render()}, this method renders a view script. Unlike render(), + * however, it does not autodetermine the view script via {@link getViewScript()}, + * but instead renders the script passed to it. Use this if you know the + * exact view script name and path you wish to use, or if using paths that do not + * conform to the spec defined with getViewScript(). + * + * By default, the rendered contents are appended to the response. You may + * specify the named body content segment to set by specifying a $name. + * + * @param string $script + * @param string $name + * @return void + */ + public function renderScript($script, $name = null) + { + if (!$this->getInvokeArg('noViewRenderer') && $this->_helper->hasHelper('viewRenderer')) { + return $this->_helper->viewRenderer->renderScript($script, $name); + } + + $view = $this->initView(); + $this->getResponse()->appendBody( + $view->render($script), + $name + ); + } + + /** + * Construct view script path + * + * Used by render() to determine the path to the view script. + * + * @param string $action Defaults to action registered in request object + * @param bool $noController Defaults to false; i.e. use controller name as subdir in which to search for view script + * @return string + * @throws Zend_Controller_Exception with bad $action + */ + public function getViewScript($action = null, $noController = null) + { + if (!$this->getInvokeArg('noViewRenderer') && $this->_helper->hasHelper('viewRenderer')) { + $viewRenderer = $this->_helper->getHelper('viewRenderer'); + if (null !== $noController) { + $viewRenderer->setNoController($noController); + } + return $viewRenderer->getViewScript($action); + } + + $request = $this->getRequest(); + if (null === $action) { + $action = $request->getActionName(); + } elseif (!is_string($action)) { + require_once 'Zend/Controller/Exception.php'; + throw new Zend_Controller_Exception('Invalid action specifier for view render'); + } + + if (null === $this->_delimiters) { + $dispatcher = Zend_Controller_Front::getInstance()->getDispatcher(); + $wordDelimiters = $dispatcher->getWordDelimiter(); + $pathDelimiters = $dispatcher->getPathDelimiter(); + $this->_delimiters = array_unique(array_merge($wordDelimiters, (array) $pathDelimiters)); + } + + $action = str_replace($this->_delimiters, '-', $action); + $script = $action . '.' . $this->viewSuffix; + + if (!$noController) { + $controller = $request->getControllerName(); + $controller = str_replace($this->_delimiters, '-', $controller); + $script = $controller . DIRECTORY_SEPARATOR . $script; + } + + return $script; + } + + /** + * Return the Request object + * + * @return Zend_Controller_Request_Abstract + */ + public function getRequest() + { + return $this->_request; + } + + /** + * Set the Request object + * + * @param Zend_Controller_Request_Abstract $request + * @return Zend_Controller_Action + */ + public function setRequest(Zend_Controller_Request_Abstract $request) + { + $this->_request = $request; + return $this; + } + + /** + * Return the Response object + * + * @return Zend_Controller_Response_Abstract + */ + public function getResponse() + { + return $this->_response; + } + + /** + * Set the Response object + * + * @param Zend_Controller_Response_Abstract $response + * @return Zend_Controller_Action + */ + public function setResponse(Zend_Controller_Response_Abstract $response) + { + $this->_response = $response; + return $this; + } + + /** + * Set invocation arguments + * + * @param array $args + * @return Zend_Controller_Action + */ + protected function _setInvokeArgs(array $args = array()) + { + $this->_invokeArgs = $args; + return $this; + } + + /** + * Return the array of constructor arguments (minus the Request object) + * + * @return array + */ + public function getInvokeArgs() + { + return $this->_invokeArgs; + } + + /** + * Return a single invocation argument + * + * @param string $key + * @return mixed + */ + public function getInvokeArg($key) + { + if (isset($this->_invokeArgs[$key])) { + return $this->_invokeArgs[$key]; + } + + return null; + } + + /** + * Get a helper by name + * + * @param string $helperName + * @return Zend_Controller_Action_Helper_Abstract + */ + public function getHelper($helperName) + { + return $this->_helper->{$helperName}; + } + + /** + * Get a clone of a helper by name + * + * @param string $helperName + * @return Zend_Controller_Action_Helper_Abstract + */ + public function getHelperCopy($helperName) + { + return clone $this->_helper->{$helperName}; + } + + /** + * Set the front controller instance + * + * @param Zend_Controller_Front $front + * @return Zend_Controller_Action + */ + public function setFrontController(Zend_Controller_Front $front) + { + $this->_frontController = $front; + return $this; + } + + /** + * Retrieve Front Controller + * + * @return Zend_Controller_Front + */ + public function getFrontController() + { + // Used cache version if found + if (null !== $this->_frontController) { + return $this->_frontController; + } + + // Grab singleton instance, if class has been loaded + if (class_exists('Zend_Controller_Front')) { + $this->_frontController = Zend_Controller_Front::getInstance(); + return $this->_frontController; + } + + // Throw exception in all other cases + require_once 'Zend/Controller/Exception.php'; + throw new Zend_Controller_Exception('Front controller class has not been loaded'); + } + + /** + * Pre-dispatch routines + * + * Called before action method. If using class with + * {@link Zend_Controller_Front}, it may modify the + * {@link $_request Request object} and reset its dispatched flag in order + * to skip processing the current action. + * + * @return void + */ + public function preDispatch() + { + } + + /** + * Post-dispatch routines + * + * Called after action method execution. If using class with + * {@link Zend_Controller_Front}, it may modify the + * {@link $_request Request object} and reset its dispatched flag in order + * to process an additional action. + * + * Common usages for postDispatch() include rendering content in a sitewide + * template, link url correction, setting headers, etc. + * + * @return void + */ + public function postDispatch() + { + } + + /** + * Proxy for undefined methods. Default behavior is to throw an + * exception on undefined methods, however this function can be + * overridden to implement magic (dynamic) actions, or provide run-time + * dispatching. + * + * @param string $methodName + * @param array $args + */ + public function __call($methodName, $args) + { + if ('Action' == substr($methodName, -6)) { + require_once 'Zend/Controller/Action/Exception.php'; + $action = substr($methodName, 0, strlen($methodName) - 6); + require_once 'Zend/Controller/Action/Exception.php'; + throw new Zend_Controller_Action_Exception(sprintf('Action "%s" does not exist and was not trapped in __call()', $action), 404); + } + + require_once 'Zend/Controller/Action/Exception.php'; + throw new Zend_Controller_Action_Exception(sprintf('Method "%s" does not exist and was not trapped in __call()', $methodName), 500); + } + + /** + * Dispatch the requested action + * + * @param string $action Method name of action + * @return void + */ + public function dispatch($action) + { + // Notify helpers of action preDispatch state + $this->_helper->notifyPreDispatch(); + + $this->preDispatch(); + if ($this->getRequest()->isDispatched()) { + if (null === $this->_classMethods) { + $this->_classMethods = get_class_methods($this); + } + + // preDispatch() didn't change the action, so we can continue + if ($this->getInvokeArg('useCaseSensitiveActions') || in_array($action, $this->_classMethods)) { + if ($this->getInvokeArg('useCaseSensitiveActions')) { + trigger_error('Using case sensitive actions without word separators is deprecated; please do not rely on this "feature"'); + } + $this->$action(); + } else { + $this->__call($action, array()); + } + $this->postDispatch(); + } + + // whats actually important here is that this action controller is + // shutting down, regardless of dispatching; notify the helpers of this + // state + $this->_helper->notifyPostDispatch(); + } + + /** + * Call the action specified in the request object, and return a response + * + * Not used in the Action Controller implementation, but left for usage in + * Page Controller implementations. Dispatches a method based on the + * request. + * + * Returns a Zend_Controller_Response_Abstract object, instantiating one + * prior to execution if none exists in the controller. + * + * {@link preDispatch()} is called prior to the action, + * {@link postDispatch()} is called following it. + * + * @param null|Zend_Controller_Request_Abstract $request Optional request + * object to use + * @param null|Zend_Controller_Response_Abstract $response Optional response + * object to use + * @return Zend_Controller_Response_Abstract + */ + public function run(Zend_Controller_Request_Abstract $request = null, Zend_Controller_Response_Abstract $response = null) + { + if (null !== $request) { + $this->setRequest($request); + } else { + $request = $this->getRequest(); + } + + if (null !== $response) { + $this->setResponse($response); + } + + $action = $request->getActionName(); + if (empty($action)) { + $action = 'index'; + } + $action = $action . 'Action'; + + $request->setDispatched(true); + $this->dispatch($action); + + return $this->getResponse(); + } + + /** + * Gets a parameter from the {@link $_request Request object}. If the + * parameter does not exist, NULL will be returned. + * + * If the parameter does not exist and $default is set, then + * $default will be returned instead of NULL. + * + * @param string $paramName + * @param mixed $default + * @return mixed + */ + protected function _getParam($paramName, $default = null) + { + $value = $this->getRequest()->getParam($paramName); + if ((null == $value) && (null !== $default)) { + $value = $default; + } + + return $value; + } + + /** + * Set a parameter in the {@link $_request Request object}. + * + * @param string $paramName + * @param mixed $value + * @return Zend_Controller_Action + */ + protected function _setParam($paramName, $value) + { + $this->getRequest()->setParam($paramName, $value); + + return $this; + } + + /** + * Determine whether a given parameter exists in the + * {@link $_request Request object}. + * + * @param string $paramName + * @return boolean + */ + protected function _hasParam($paramName) + { + return null !== $this->getRequest()->getParam($paramName); + } + + /** + * Return all parameters in the {@link $_request Request object} + * as an associative array. + * + * @return array + */ + protected function _getAllParams() + { + return $this->getRequest()->getParams(); + } + + + /** + * Forward to another controller/action. + * + * It is important to supply the unformatted names, i.e. "article" + * rather than "ArticleController". The dispatcher will do the + * appropriate formatting when the request is received. + * + * If only an action name is provided, forwards to that action in this + * controller. + * + * If an action and controller are specified, forwards to that action and + * controller in this module. + * + * Specifying an action, controller, and module is the most specific way to + * forward. + * + * A fourth argument, $params, will be used to set the request parameters. + * If either the controller or module are unnecessary for forwarding, + * simply pass null values for them before specifying the parameters. + * + * @param string $action + * @param string $controller + * @param string $module + * @param array $params + * @return void + */ + final protected function _forward($action, $controller = null, $module = null, array $params = null) + { + $request = $this->getRequest(); + + if (null !== $params) { + $request->setParams($params); + } + + if (null !== $controller) { + $request->setControllerName($controller); + + // Module should only be reset if controller has been specified + if (null !== $module) { + $request->setModuleName($module); + } + } + + $request->setActionName($action) + ->setDispatched(false); + } + + /** + * Redirect to another URL + * + * Proxies to {@link Zend_Controller_Action_Helper_Redirector::gotoUrl()}. + * + * @param string $url + * @param array $options Options to be used when redirecting + * @return void + */ + protected function _redirect($url, array $options = array()) + { + $this->_helper->redirector->gotoUrl($url, $options); + } +} diff --git a/libs/Zend/Controller/Action/Exception.php b/libs/Zend/Controller/Action/Exception.php new file mode 100644 index 0000000..a275c5f --- /dev/null +++ b/libs/Zend/Controller/Action/Exception.php @@ -0,0 +1,37 @@ +_actionController = $actionController; + return $this; + } + + /** + * Retrieve current action controller + * + * @return Zend_Controller_Action + */ + public function getActionController() + { + return $this->_actionController; + } + + /** + * Retrieve front controller instance + * + * @return Zend_Controller_Front + */ + public function getFrontController() + { + if (null === $this->_frontController) { + $this->_frontController = Zend_Controller_Front::getInstance(); + } + + return $this->_frontController; + } + + /** + * Hook into action controller initialization + * + * @return void + */ + public function init() + { + } + + /** + * Hook into action controller preDispatch() workflow + * + * @return void + */ + public function preDispatch() + { + } + + /** + * Hook into action controller postDispatch() workflow + * + * @return void + */ + public function postDispatch() + { + } + + /** + * getRequest() - + * + * @return Zend_Controller_Request_Abstract $request + */ + public function getRequest() + { + $controller = $this->getActionController(); + if (null === $controller) { + $controller = $this->getFrontController(); + } + + return $controller->getRequest(); + } + + /** + * getResponse() - + * + * @return Zend_Controller_Response_Abstract $response + */ + public function getResponse() + { + $controller = $this->getActionController(); + if (null === $controller) { + $controller = $this->getFrontController(); + } + + return $controller->getResponse(); + } + + /** + * getName() + * + * @return string + */ + public function getName() + { + $full_class_name = get_class($this); + + if (strpos($full_class_name, '_') !== false) { + $helper_name = strrchr($full_class_name, '_'); + return ltrim($helper_name, '_'); + } else { + return $full_class_name; + } + } +} diff --git a/libs/Zend/Controller/Action/Helper/ActionStack.php b/libs/Zend/Controller/Action/Helper/ActionStack.php new file mode 100644 index 0000000..79b012a --- /dev/null +++ b/libs/Zend/Controller/Action/Helper/ActionStack.php @@ -0,0 +1,138 @@ +hasPlugin('Zend_Controller_Plugin_ActionStack')) { + /** + * @see Zend_Controller_Plugin_ActionStack + */ + require_once 'Zend/Controller/Plugin/ActionStack.php'; + $this->_actionStack = new Zend_Controller_Plugin_ActionStack(); + $front->registerPlugin($this->_actionStack, 97); + } else { + $this->_actionStack = $front->getPlugin('Zend_Controller_Plugin_ActionStack'); + } + } + + /** + * 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) + { + $this->_actionStack->pushStack($next); + return $this; + } + + /** + * Push a new action onto the stack + * + * @param string $action + * @param string $controller + * @param string $module + * @param array $params + * @throws Zend_Controller_Action_Exception + * @return Zend_Controller_Action_Helper_ActionStack + */ + public function actionToStack($action, $controller = null, $module = null, array $params = array()) + { + if ($action instanceof Zend_Controller_Request_Abstract) { + return $this->pushStack($action); + } elseif (!is_string($action)) { + /** + * @see Zend_Controller_Action_Exception + */ + require_once 'Zend/Controller/Action/Exception.php'; + throw new Zend_Controller_Action_Exception('ActionStack requires either a request object or minimally a string action'); + } + + $request = $this->getRequest(); + + if ($request instanceof Zend_Controller_Request_Abstract === false){ + /** + * @see Zend_Controller_Action_Exception + */ + 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; + + /** + * @see Zend_Controller_Request_Simple + */ + require_once 'Zend/Controller/Request/Simple.php'; + $newRequest = new Zend_Controller_Request_Simple($action, $controller, $module, $params); + + return $this->pushStack($newRequest); + } + + /** + * Perform helper when called as $this->_helper->actionStack() from an action controller + * + * Proxies to {@link simple()} + * + * @param string $action + * @param string $controller + * @param string $module + * @param array $params + * @return boolean + */ + public function direct($action, $controller = null, $module = null, array $params = array()) + { + return $this->actionToStack($action, $controller, $module, $params); + } +} diff --git a/libs/Zend/Controller/Action/Helper/AjaxContext.php b/libs/Zend/Controller/Action/Helper/AjaxContext.php new file mode 100644 index 0000000..c4e1b94 --- /dev/null +++ b/libs/Zend/Controller/Action/Helper/AjaxContext.php @@ -0,0 +1,77 @@ +addContext('html', array('suffix' => 'ajax')); + } + + /** + * Initialize AJAX context switching + * + * Checks for XHR requests; if detected, attempts to perform context switch. + * + * @param string $format + * @return void + */ + public function initContext($format = null) + { + $this->_currentContext = null; + + if (!$this->getRequest()->isXmlHttpRequest()) { + return; + } + + return parent::initContext($format); + } +} diff --git a/libs/Zend/Controller/Action/Helper/AutoComplete/Abstract.php b/libs/Zend/Controller/Action/Helper/AutoComplete/Abstract.php new file mode 100644 index 0000000..7fd04c3 --- /dev/null +++ b/libs/Zend/Controller/Action/Helper/AutoComplete/Abstract.php @@ -0,0 +1,149 @@ +disableLayout(); + } + + Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer')->setNoRender(true); + + return $this; + } + + /** + * Encode data to JSON + * + * @param mixed $data + * @param bool $keepLayouts + * @throws Zend_Controller_Action_Exception + * @return string + */ + public function encodeJson($data, $keepLayouts = false) + { + if ($this->validateData($data)) { + return Zend_Controller_Action_HelperBroker::getStaticHelper('Json')->encodeJson($data, $keepLayouts); + } + + /** + * @see Zend_Controller_Action_Exception + */ + require_once 'Zend/Controller/Action/Exception.php'; + throw new Zend_Controller_Action_Exception('Invalid data passed for autocompletion'); + } + + /** + * Send autocompletion data + * + * Calls prepareAutoCompletion, populates response body with this + * information, and sends response. + * + * @param mixed $data + * @param bool $keepLayouts + * @return string|void + */ + public function sendAutoCompletion($data, $keepLayouts = false) + { + $data = $this->prepareAutoCompletion($data, $keepLayouts); + + $response = $this->getResponse(); + $response->setBody($data); + + if (!$this->suppressExit) { + $response->sendResponse(); + exit; + } + + return $data; + } + + /** + * Strategy pattern: allow calling helper as broker method + * + * Prepares autocompletion data and, if $sendNow is true, immediately sends + * response. + * + * @param mixed $data + * @param bool $sendNow + * @param bool $keepLayouts + * @return string|void + */ + public function direct($data, $sendNow = true, $keepLayouts = false) + { + if ($sendNow) { + return $this->sendAutoCompletion($data, $keepLayouts); + } + + return $this->prepareAutoCompletion($data, $keepLayouts); + } +} diff --git a/libs/Zend/Controller/Action/Helper/AutoCompleteDojo.php b/libs/Zend/Controller/Action/Helper/AutoCompleteDojo.php new file mode 100644 index 0000000..b040117 --- /dev/null +++ b/libs/Zend/Controller/Action/Helper/AutoCompleteDojo.php @@ -0,0 +1,87 @@ + $value) { + $items[] = array('label' => $value, 'name' => $value); + } + $data = new Zend_Dojo_Data('name', $items); + } + + if (!$keepLayouts) { + require_once 'Zend/Controller/Action/HelperBroker.php'; + Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer')->setNoRender(true); + + require_once 'Zend/Layout.php'; + $layout = Zend_Layout::getMvcInstance(); + if ($layout instanceof Zend_Layout) { + $layout->disableLayout(); + } + } + + $response = Zend_Controller_Front::getInstance()->getResponse(); + $response->setHeader('Content-Type', 'application/json'); + + return $data->toJson(); + } +} diff --git a/libs/Zend/Controller/Action/Helper/AutoCompleteScriptaculous.php b/libs/Zend/Controller/Action/Helper/AutoCompleteScriptaculous.php new file mode 100644 index 0000000..19235d2 --- /dev/null +++ b/libs/Zend/Controller/Action/Helper/AutoCompleteScriptaculous.php @@ -0,0 +1,82 @@ +validateData($data)) { + /** + * @see Zend_Controller_Action_Exception + */ + require_once 'Zend/Controller/Action/Exception.php'; + throw new Zend_Controller_Action_Exception('Invalid data passed for autocompletion'); + } + + $data = (array) $data; + $data = '
  • ' . implode('
  • ', $data) . '
'; + + if (!$keepLayouts) { + $this->disableLayouts(); + } + + return $data; + } +} diff --git a/libs/Zend/Controller/Action/Helper/ContextSwitch.php b/libs/Zend/Controller/Action/Helper/ContextSwitch.php new file mode 100644 index 0000000..1ddd6c0 --- /dev/null +++ b/libs/Zend/Controller/Action/Helper/ContextSwitch.php @@ -0,0 +1,1368 @@ +setConfig($options); + } elseif (is_array($options)) { + $this->setOptions($options); + } + + if (empty($this->_contexts)) { + $this->addContexts(array( + 'json' => array( + 'suffix' => 'json', + 'headers' => array('Content-Type' => 'application/json'), + 'callbacks' => array( + 'init' => 'initJsonContext', + 'post' => 'postJsonContext' + ) + ), + 'xml' => array( + 'suffix' => 'xml', + 'headers' => array('Content-Type' => 'application/xml'), + ) + )); + } + } + + /** + * Configure object from array of options + * + * @param array $options + * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface + */ + public function setOptions(array $options) + { + if (isset($options['contexts'])) { + $this->setContexts($options['contexts']); + unset($options['contexts']); + } + + foreach ($options as $key => $value) { + $method = 'set' . ucfirst($key); + if (in_array($method, $this->_unconfigurable)) { + continue; + } + + if (in_array($method, $this->_specialConfig)) { + $method = '_' . $method; + } + + if (method_exists($this, $method)) { + $this->$method($value); + } + } + return $this; + } + + /** + * Set object state from config object + * + * @param Zend_Config $config + * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface + */ + public function setConfig(Zend_Config $config) + { + return $this->setOptions($config->toArray()); + } + + /** + * Strategy pattern: return object + * + * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface + */ + public function direct() + { + return $this; + } + + /** + * Initialize context detection and switching + * + * @param mixed $format + * @throws Zend_Controller_Action_Exception + * @return void + */ + public function initContext($format = null) + { + $this->_currentContext = null; + + $controller = $this->getActionController(); + $request = $this->getRequest(); + $action = $request->getActionName(); + + // Return if no context switching enabled, or no context switching + // enabled for this action + $contexts = $this->getActionContexts($action); + if (empty($contexts)) { + return; + } + + // Return if no context parameter provided + if (!$context = $request->getParam($this->getContextParam())) { + if ($format === null) { + return; + } + $context = $format; + $format = null; + } + + // Check if context allowed by action controller + if (!$this->hasActionContext($action, $context)) { + return; + } + + // Return if invalid context parameter provided and no format or invalid + // format provided + if (!$this->hasContext($context)) { + if (empty($format) || !$this->hasContext($format)) { + + return; + } + } + + // Use provided format if passed + if (!empty($format) && $this->hasContext($format)) { + $context = $format; + } + + $suffix = $this->getSuffix($context); + $this->_getViewRenderer()->setViewSuffix($suffix); + + $headers = $this->getHeaders($context); + if (!empty($headers)) { + $response = $this->getResponse(); + foreach ($headers as $header => $content) { + $response->setHeader($header, $content); + } + } + + if ($this->getAutoDisableLayout()) { + /** + * @see Zend_Layout + */ + require_once 'Zend/Layout.php'; + $layout = Zend_Layout::getMvcInstance(); + if (null !== $layout) { + $layout->disableLayout(); + } + } + + if (null !== ($callback = $this->getCallback($context, self::TRIGGER_INIT))) { + if (is_string($callback) && method_exists($this, $callback)) { + $this->$callback(); + } elseif (is_string($callback) && function_exists($callback)) { + $callback(); + } elseif (is_array($callback)) { + call_user_func($callback); + } else { + /** + * @see Zend_Controller_Action_Exception + */ + require_once 'Zend/Controller/Action/Exception.php'; + throw new Zend_Controller_Action_Exception(sprintf('Invalid context callback registered for context "%s"', $context)); + } + } + + $this->_currentContext = $context; + } + + /** + * JSON context extra initialization + * + * Turns off viewRenderer auto-rendering + * + * @return void + */ + public function initJsonContext() + { + if (!$this->getAutoJsonSerialization()) { + return; + } + + $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer'); + $view = $viewRenderer->view; + if ($view instanceof Zend_View_Interface) { + $viewRenderer->setNoRender(true); + } + } + + /** + * Should JSON contexts auto-serialize? + * + * @param boolean $flag + * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface + */ + public function setAutoJsonSerialization($flag) + { + $this->_autoJsonSerialization = (bool) $flag; + return $this; + } + + /** + * Get JSON context auto-serialization flag + * + * @return boolean + */ + public function getAutoJsonSerialization() + { + return $this->_autoJsonSerialization; + } + + /** + * Set suffix from array + * + * @param array $spec + * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface + */ + protected function _setSuffix(array $spec) + { + foreach ($spec as $context => $suffixInfo) { + if (!is_string($context)) { + $context = null; + } + + if (is_string($suffixInfo)) { + $this->setSuffix($context, $suffixInfo); + continue; + } elseif (is_array($suffixInfo)) { + if (isset($suffixInfo['suffix'])) { + $suffix = $suffixInfo['suffix']; + $prependViewRendererSuffix = true; + + if ((null === $context) && isset($suffixInfo['context'])) { + $context = $suffixInfo['context']; + } + + if (isset($suffixInfo['prependViewRendererSuffix'])) { + $prependViewRendererSuffix = $suffixInfo['prependViewRendererSuffix']; + } + + $this->setSuffix($context, $suffix, $prependViewRendererSuffix); + continue; + } + + $count = count($suffixInfo); + switch (true) { + case (($count < 2) && (null === $context)): + /** + * @see Zend_Controller_Action_Exception + */ + require_once 'Zend/Controller/Action/Exception.php'; + throw new Zend_Controller_Action_Exception('Invalid suffix information provided in config'); + case ($count < 2): + $suffix = array_shift($suffixInfo); + $this->setSuffix($context, $suffix); + break; + case (($count < 3) && (null === $context)): + $context = array_shift($suffixInfo); + $suffix = array_shift($suffixInfo); + $this->setSuffix($context, $suffix); + break; + case (($count == 3) && (null === $context)): + $context = array_shift($suffixInfo); + $suffix = array_shift($suffixInfo); + $prependViewRendererSuffix = array_shift($suffixInfo); + $this->setSuffix($context, $suffix, $prependViewRendererSuffix); + break; + case ($count >= 2): + $suffix = array_shift($suffixInfo); + $prependViewRendererSuffix = array_shift($suffixInfo); + $this->setSuffix($context, $suffix, $prependViewRendererSuffix); + break; + } + } + } + return $this; + } + + /** + * Customize view script suffix to use when switching context. + * + * Passing an empty suffix value to the setters disables the view script + * suffix change. + * + * @param string $context Context type for which to set suffix + * @param string $suffix Suffix to use + * @param boolean $prependViewRendererSuffix Whether or not to prepend the new suffix to the viewrenderer suffix + * @throws Zend_Controller_Action_Exception + * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface + */ + public function setSuffix($context, $suffix, $prependViewRendererSuffix = true) + { + if (!isset($this->_contexts[$context])) { + /** + * @see Zend_Controller_Action_Exception + */ + require_once 'Zend/Controller/Action/Exception.php'; + throw new Zend_Controller_Action_Exception(sprintf('Cannot set suffix; invalid context type "%s"', $context)); + } + + if (empty($suffix)) { + $suffix = ''; + } + + if (is_array($suffix)) { + if (isset($suffix['prependViewRendererSuffix'])) { + $prependViewRendererSuffix = $suffix['prependViewRendererSuffix']; + } + if (isset($suffix['suffix'])) { + $suffix = $suffix['suffix']; + } else { + $suffix = ''; + } + } + + $suffix = (string) $suffix; + + if ($prependViewRendererSuffix) { + if (empty($suffix)) { + $suffix = $this->_getViewRenderer()->getViewSuffix(); + } else { + $suffix .= '.' . $this->_getViewRenderer()->getViewSuffix(); + } + } + + $this->_contexts[$context]['suffix'] = $suffix; + return $this; + } + + /** + * Retrieve suffix for given context type + * + * @param string $type Context type + * @throws Zend_Controller_Action_Exception + * @return string + */ + public function getSuffix($type) + { + if (!isset($this->_contexts[$type])) { + /** + * @see Zend_Controller_Action_Exception + */ + require_once 'Zend/Controller/Action/Exception.php'; + throw new Zend_Controller_Action_Exception(sprintf('Cannot retrieve suffix; invalid context type "%s"', $type)); + } + + return $this->_contexts[$type]['suffix']; + } + + /** + * Does the given context exist? + * + * @param string $context + * @param boolean $throwException + * @throws Zend_Controller_Action_Exception if context does not exist and throwException is true + * @return bool + */ + public function hasContext($context, $throwException = false) + { + if (is_string($context)) { + if (isset($this->_contexts[$context])) { + return true; + } + } elseif (is_array($context)) { + $error = false; + foreach ($context as $test) { + if (!isset($this->_contexts[$test])) { + $error = (string) $test; + break; + } + } + if (false === $error) { + return true; + } + $context = $error; + } elseif (true === $context) { + return true; + } + + if ($throwException) { + /** + * @see Zend_Controller_Action_Exception + */ + require_once 'Zend/Controller/Action/Exception.php'; + throw new Zend_Controller_Action_Exception(sprintf('Context "%s" does not exist', $context)); + } + + return false; + } + + /** + * Add header to context + * + * @param string $context + * @param string $header + * @param string $content + * @throws Zend_Controller_Action_Exception + * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface + */ + public function addHeader($context, $header, $content) + { + $context = (string) $context; + $this->hasContext($context, true); + + $header = (string) $header; + $content = (string) $content; + + if (isset($this->_contexts[$context]['headers'][$header])) { + /** + * @see Zend_Controller_Action_Exception + */ + require_once 'Zend/Controller/Action/Exception.php'; + throw new Zend_Controller_Action_Exception(sprintf('Cannot add "%s" header to context "%s": already exists', $header, $context)); + } + + $this->_contexts[$context]['headers'][$header] = $content; + return $this; + } + + /** + * Customize response header to use when switching context + * + * Passing an empty header value to the setters disables the response + * header. + * + * @param string $type Context type for which to set suffix + * @param string $header Header to set + * @param string $content Header content + * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface + */ + public function setHeader($context, $header, $content) + { + $this->hasContext($context, true); + $context = (string) $context; + $header = (string) $header; + $content = (string) $content; + + $this->_contexts[$context]['headers'][$header] = $content; + return $this; + } + + /** + * Add multiple headers at once for a given context + * + * @param string $context + * @param array $headers + * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface + */ + public function addHeaders($context, array $headers) + { + foreach ($headers as $header => $content) { + $this->addHeader($context, $header, $content); + } + + return $this; + } + + /** + * Set headers from context => headers pairs + * + * @param array $options + * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface + */ + protected function _setHeaders(array $options) + { + foreach ($options as $context => $headers) { + if (!is_array($headers)) { + continue; + } + $this->setHeaders($context, $headers); + } + + return $this; + } + + /** + * Set multiple headers at once for a given context + * + * @param string $context + * @param array $headers + * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface + */ + public function setHeaders($context, array $headers) + { + $this->clearHeaders($context); + foreach ($headers as $header => $content) { + $this->setHeader($context, $header, $content); + } + + return $this; + } + + /** + * Retrieve context header + * + * Returns the value of a given header for a given context type + * + * @param string $context + * @param string $header + * @return string|null + */ + public function getHeader($context, $header) + { + $this->hasContext($context, true); + $context = (string) $context; + $header = (string) $header; + if (isset($this->_contexts[$context]['headers'][$header])) { + return $this->_contexts[$context]['headers'][$header]; + } + + return null; + } + + /** + * Retrieve context headers + * + * Returns all headers for a context as key/value pairs + * + * @param string $context + * @return array + */ + public function getHeaders($context) + { + $this->hasContext($context, true); + $context = (string) $context; + return $this->_contexts[$context]['headers']; + } + + /** + * Remove a single header from a context + * + * @param string $context + * @param string $header + * @return boolean + */ + public function removeHeader($context, $header) + { + $this->hasContext($context, true); + $context = (string) $context; + $header = (string) $header; + if (isset($this->_contexts[$context]['headers'][$header])) { + unset($this->_contexts[$context]['headers'][$header]); + return true; + } + + return false; + } + + /** + * Clear all headers for a given context + * + * @param string $context + * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface + */ + public function clearHeaders($context) + { + $this->hasContext($context, true); + $context = (string) $context; + $this->_contexts[$context]['headers'] = array(); + return $this; + } + + /** + * Validate trigger and return in normalized form + * + * @param string $trigger + * @throws Zend_Controller_Action_Exception + * @return string + */ + protected function _validateTrigger($trigger) + { + $trigger = strtoupper($trigger); + if ('TRIGGER_' !== substr($trigger, 0, 8)) { + $trigger = 'TRIGGER_' . $trigger; + } + + if (!in_array($trigger, array(self::TRIGGER_INIT, self::TRIGGER_POST))) { + /** + * @see Zend_Controller_Action_Exception + */ + require_once 'Zend/Controller/Action/Exception.php'; + throw new Zend_Controller_Action_Exception(sprintf('Invalid trigger "%s"', $trigger)); + } + + return $trigger; + } + + /** + * Set a callback for a given context and trigger + * + * @param string $context + * @param string $trigger + * @param string|array $callback + * @throws Zend_Controller_Action_Exception + * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface + */ + public function setCallback($context, $trigger, $callback) + { + $this->hasContext($context, true); + $trigger = $this->_validateTrigger($trigger); + + if (!is_string($callback)) { + if (!is_array($callback) || (2 != count($callback))) { + /** + * @see Zend_Controller_Action_Exception + */ + require_once 'Zend/Controller/Action/Exception.php'; + throw new Zend_Controller_Action_Exception('Invalid callback specified'); + } + } + + $this->_contexts[$context]['callbacks'][$trigger] = $callback; + return $this; + } + + /** + * Set callbacks from array of context => callbacks pairs + * + * @param array $options + * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface + */ + protected function _setCallbacks(array $options) + { + foreach ($options as $context => $callbacks) { + if (!is_array($callbacks)) { + continue; + } + + $this->setCallbacks($context, $callbacks); + } + return $this; + } + + /** + * Set callbacks for a given context + * + * Callbacks should be in trigger/callback pairs. + * + * @param string $context + * @param array $callbacks + * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface + */ + public function setCallbacks($context, array $callbacks) + { + $this->hasContext($context, true); + $context = (string) $context; + if (!isset($this->_contexts[$context]['callbacks'])) { + $this->_contexts[$context]['callbacks'] = array(); + } + + foreach ($callbacks as $trigger => $callback) { + $this->setCallback($context, $trigger, $callback); + } + return $this; + } + + /** + * Get a single callback for a given context and trigger + * + * @param string $context + * @param string $trigger + * @return string|array|null + */ + public function getCallback($context, $trigger) + { + $this->hasContext($context, true); + $trigger = $this->_validateTrigger($trigger); + if (isset($this->_contexts[$context]['callbacks'][$trigger])) { + return $this->_contexts[$context]['callbacks'][$trigger]; + } + + return null; + } + + /** + * Get all callbacks for a given context + * + * @param string $context + * @return array + */ + public function getCallbacks($context) + { + $this->hasContext($context, true); + return $this->_contexts[$context]['callbacks']; + } + + /** + * Clear a callback for a given context and trigger + * + * @param string $context + * @param string $trigger + * @return boolean + */ + public function removeCallback($context, $trigger) + { + $this->hasContext($context, true); + $trigger = $this->_validateTrigger($trigger); + if (isset($this->_contexts[$context]['callbacks'][$trigger])) { + unset($this->_contexts[$context]['callbacks'][$trigger]); + return true; + } + + return false; + } + + /** + * Clear all callbacks for a given context + * + * @param string $context + * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface + */ + public function clearCallbacks($context) + { + $this->hasContext($context, true); + $this->_contexts[$context]['callbacks'] = array(); + return $this; + } + + /** + * Set name of parameter to use when determining context format + * + * @param string $name + * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface + */ + public function setContextParam($name) + { + $this->_contextParam = (string) $name; + return $this; + } + + /** + * Return context format request parameter name + * + * @return string + */ + public function getContextParam() + { + return $this->_contextParam; + } + + /** + * Indicate default context to use when no context format provided + * + * @param string $type + * @throws Zend_Controller_Action_Exception + * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface + */ + public function setDefaultContext($type) + { + if (!isset($this->_contexts[$type])) { + /** + * @see Zend_Controller_Action_Exception + */ + require_once 'Zend/Controller/Action/Exception.php'; + throw new Zend_Controller_Action_Exception(sprintf('Cannot set default context; invalid context type "%s"', $type)); + } + + $this->_defaultContext = $type; + return $this; + } + + /** + * Return default context + * + * @return string + */ + public function getDefaultContext() + { + return $this->_defaultContext; + } + + /** + * Set flag indicating if layout should be disabled + * + * @param boolean $flag + * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface + */ + public function setAutoDisableLayout($flag) + { + $this->_disableLayout = ($flag) ? true : false; + return $this; + } + + /** + * Retrieve auto layout disable flag + * + * @return boolean + */ + public function getAutoDisableLayout() + { + return $this->_disableLayout; + } + + /** + * Add new context + * + * @param string $context Context type + * @param array $spec Context specification + * @throws Zend_Controller_Action_Exception + * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface + */ + public function addContext($context, array $spec) + { + if ($this->hasContext($context)) { + /** + * @see Zend_Controller_Action_Exception + */ + require_once 'Zend/Controller/Action/Exception.php'; + throw new Zend_Controller_Action_Exception(sprintf('Cannot add context "%s"; already exists', $context)); + } + $context = (string) $context; + + $this->_contexts[$context] = array(); + + $this->setSuffix($context, (isset($spec['suffix']) ? $spec['suffix'] : '')) + ->setHeaders($context, (isset($spec['headers']) ? $spec['headers'] : array())) + ->setCallbacks($context, (isset($spec['callbacks']) ? $spec['callbacks'] : array())); + return $this; + } + + /** + * Overwrite existing context + * + * @param string $context Context type + * @param array $spec Context specification + * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface + */ + public function setContext($context, array $spec) + { + $this->removeContext($context); + return $this->addContext($context, $spec); + } + + /** + * Add multiple contexts + * + * @param array $contexts + * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface + */ + public function addContexts(array $contexts) + { + foreach ($contexts as $context => $spec) { + $this->addContext($context, $spec); + } + return $this; + } + + /** + * Set multiple contexts, after first removing all + * + * @param array $contexts + * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface + */ + public function setContexts(array $contexts) + { + $this->clearContexts(); + foreach ($contexts as $context => $spec) { + $this->addContext($context, $spec); + } + return $this; + } + + /** + * Retrieve context specification + * + * @param string $context + * @return array|null + */ + public function getContext($context) + { + if ($this->hasContext($context)) { + return $this->_contexts[(string) $context]; + } + return null; + } + + /** + * Retrieve context definitions + * + * @return array + */ + public function getContexts() + { + return $this->_contexts; + } + + /** + * Remove a context + * + * @param string $context + * @return boolean + */ + public function removeContext($context) + { + if ($this->hasContext($context)) { + unset($this->_contexts[(string) $context]); + return true; + } + return false; + } + + /** + * Remove all contexts + * + * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface + */ + public function clearContexts() + { + $this->_contexts = array(); + return $this; + } + + /** + * Return current context, if any + * + * @return null|string + */ + public function getCurrentContext() + { + return $this->_currentContext; + } + + /** + * Post dispatch processing + * + * Execute postDispatch callback for current context, if available + * + * @throws Zend_Controller_Action_Exception + * @return void + */ + public function postDispatch() + { + $context = $this->getCurrentContext(); + if (null !== $context) { + if (null !== ($callback = $this->getCallback($context, self::TRIGGER_POST))) { + if (is_string($callback) && method_exists($this, $callback)) { + $this->$callback(); + } elseif (is_string($callback) && function_exists($callback)) { + $callback(); + } elseif (is_array($callback)) { + call_user_func($callback); + } else { + /** + * @see Zend_Controller_Action_Exception + */ + require_once 'Zend/Controller/Action/Exception.php'; + throw new Zend_Controller_Action_Exception(sprintf('Invalid postDispatch context callback registered for context "%s"', $context)); + } + } + } + } + + /** + * JSON post processing + * + * JSON serialize view variables to response body + * + * @return void + */ + public function postJsonContext() + { + if (!$this->getAutoJsonSerialization()) { + return; + } + + $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer'); + $view = $viewRenderer->view; + if ($view instanceof Zend_View_Interface) { + /** + * @see Zend_Json + */ + if(method_exists($view, 'getVars')) { + require_once 'Zend/Json.php'; + $vars = Zend_Json::encode($view->getVars()); + $this->getResponse()->setBody($vars); + } else { + require_once 'Zend/Controller/Action/Exception.php'; + throw new Zend_Controller_Action_Exception('View does not implement the getVars() method needed to encode the view into JSON'); + } + } + } + + /** + * Add one or more contexts to an action + * + * @param string $action + * @param string|array $context + * @return Zend_Controller_Action_Helper_ContextSwitch|void Provides a fluent interface + */ + public function addActionContext($action, $context) + { + $this->hasContext($context, true); + $controller = $this->getActionController(); + if (null === $controller) { + return; + } + $action = (string) $action; + $contextKey = $this->_contextKey; + + if (!isset($controller->$contextKey)) { + $controller->$contextKey = array(); + } + + if (true === $context) { + $contexts = $this->getContexts(); + $controller->{$contextKey}[$action] = array_keys($contexts); + return $this; + } + + $context = (array) $context; + if (!isset($controller->{$contextKey}[$action])) { + $controller->{$contextKey}[$action] = $context; + } else { + $controller->{$contextKey}[$action] = array_merge( + $controller->{$contextKey}[$action], + $context + ); + } + + return $this; + } + + /** + * Set a context as available for a given controller action + * + * @param string $action + * @param string|array $context + * @return Zend_Controller_Action_Helper_ContextSwitch|void Provides a fluent interface + */ + public function setActionContext($action, $context) + { + $this->hasContext($context, true); + $controller = $this->getActionController(); + if (null === $controller) { + return; + } + $action = (string) $action; + $contextKey = $this->_contextKey; + + if (!isset($controller->$contextKey)) { + $controller->$contextKey = array(); + } + + if (true === $context) { + $contexts = $this->getContexts(); + $controller->{$contextKey}[$action] = array_keys($contexts); + } else { + $controller->{$contextKey}[$action] = (array) $context; + } + + return $this; + } + + /** + * Add multiple action/context pairs at once + * + * @param array $contexts + * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface + */ + public function addActionContexts(array $contexts) + { + foreach ($contexts as $action => $context) { + $this->addActionContext($action, $context); + } + return $this; + } + + /** + * Overwrite and set multiple action contexts at once + * + * @param array $contexts + * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface + */ + public function setActionContexts(array $contexts) + { + foreach ($contexts as $action => $context) { + $this->setActionContext($action, $context); + } + return $this; + } + + /** + * Does a particular controller action have the given context(s)? + * + * @param string $action + * @param string|array $context + * @throws Zend_Controller_Action_Exception + * @return boolean + */ + public function hasActionContext($action, $context) + { + $this->hasContext($context, true); + $controller = $this->getActionController(); + if (null === $controller) { + return false; + } + $action = (string) $action; + $contextKey = $this->_contextKey; + + if (!isset($controller->{$contextKey})) { + return false; + } + + $allContexts = $controller->{$contextKey}; + + if (!is_array($allContexts)) { + /** + * @see Zend_Controller_Action_Exception + */ + require_once 'Zend/Controller/Action/Exception.php'; + throw new Zend_Controller_Action_Exception("Invalid contexts found for controller"); + } + + if (!isset($allContexts[$action])) { + return false; + } + + if (true === $allContexts[$action]) { + return true; + } + + $contexts = $allContexts[$action]; + + if (!is_array($contexts)) { + /** + * @see Zend_Controller_Action_Exception + */ + require_once 'Zend/Controller/Action/Exception.php'; + throw new Zend_Controller_Action_Exception(sprintf("Invalid contexts found for action '%s'", $action)); + } + + if (is_string($context) && in_array($context, $contexts)) { + return true; + } elseif (is_array($context)) { + $found = true; + foreach ($context as $test) { + if (!in_array($test, $contexts)) { + $found = false; + break; + } + } + return $found; + } + + return false; + } + + /** + * Get contexts for a given action or all actions in the controller + * + * @param string $action + * @return array + */ + public function getActionContexts($action = null) + { + $controller = $this->getActionController(); + if (null === $controller) { + return array(); + } + $action = (string) $action; + $contextKey = $this->_contextKey; + + if (!isset($controller->$contextKey)) { + return array(); + } + + if (null !== $action) { + if (isset($controller->{$contextKey}[$action])) { + return $controller->{$contextKey}[$action]; + } else { + return array(); + } + } + + return $controller->$contextKey; + } + + /** + * Remove one or more contexts for a given controller action + * + * @param string $action + * @param string|array $context + * @return boolean + */ + public function removeActionContext($action, $context) + { + if ($this->hasActionContext($action, $context)) { + $controller = $this->getActionController(); + $contextKey = $this->_contextKey; + $action = (string) $action; + $contexts = $controller->$contextKey; + $actionContexts = $contexts[$action]; + $contexts = (array) $context; + foreach ($contexts as $context) { + $index = array_search($context, $actionContexts); + if (false !== $index) { + unset($controller->{$contextKey}[$action][$index]); + } + } + return true; + } + return false; + } + + /** + * Clear all contexts for a given controller action or all actions + * + * @param string $action + * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface + */ + public function clearActionContexts($action = null) + { + $controller = $this->getActionController(); + $contextKey = $this->_contextKey; + + if (!isset($controller->$contextKey) || empty($controller->$contextKey)) { + return $this; + } + + if (null === $action) { + $controller->$contextKey = array(); + return $this; + } + + $action = (string) $action; + if (isset($controller->{$contextKey}[$action])) { + unset($controller->{$contextKey}[$action]); + } + + return $this; + } + + /** + * Retrieve ViewRenderer + * + * @return Zend_Controller_Action_Helper_ViewRenderer Provides a fluent interface + */ + protected function _getViewRenderer() + { + if (null === $this->_viewRenderer) { + $this->_viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer'); + } + + return $this->_viewRenderer; + } +} + diff --git a/libs/Zend/Controller/Action/Helper/FlashMessenger.php b/libs/Zend/Controller/Action/Helper/FlashMessenger.php new file mode 100644 index 0000000..f00f504 --- /dev/null +++ b/libs/Zend/Controller/Action/Helper/FlashMessenger.php @@ -0,0 +1,266 @@ +getName()); + foreach (self::$_session as $namespace => $messages) { + self::$_messages[$namespace] = $messages; + unset(self::$_session->{$namespace}); + } + } + } + + /** + * postDispatch() - runs after action is dispatched, in this + * case, it is resetting the namespace in case we have forwarded to a different + * action, Flashmessage will be 'clean' (default namespace) + * + * @return Zend_Controller_Action_Helper_FlashMessenger Provides a fluent interface + */ + public function postDispatch() + { + $this->resetNamespace(); + return $this; + } + + /** + * setNamespace() - change the namespace messages are added to, useful for + * per action controller messaging between requests + * + * @param string $namespace + * @return Zend_Controller_Action_Helper_FlashMessenger Provides a fluent interface + */ + public function setNamespace($namespace = 'default') + { + $this->_namespace = $namespace; + return $this; + } + + /** + * resetNamespace() - reset the namespace to the default + * + * @return Zend_Controller_Action_Helper_FlashMessenger Provides a fluent interface + */ + public function resetNamespace() + { + $this->setNamespace(); + return $this; + } + + /** + * addMessage() - Add a message to flash message + * + * @param string $message + * @return Zend_Controller_Action_Helper_FlashMessenger Provides a fluent interface + */ + public function addMessage($message) + { + if (self::$_messageAdded === false) { + self::$_session->setExpirationHops(1, null, true); + } + + if (!is_array(self::$_session->{$this->_namespace})) { + self::$_session->{$this->_namespace} = array(); + } + + self::$_session->{$this->_namespace}[] = $message; + + return $this; + } + + /** + * hasMessages() - Wether a specific namespace has messages + * + * @return boolean + */ + public function hasMessages() + { + return isset(self::$_messages[$this->_namespace]); + } + + /** + * getMessages() - Get messages from a specific namespace + * + * @return array + */ + public function getMessages() + { + if ($this->hasMessages()) { + return self::$_messages[$this->_namespace]; + } + + return array(); + } + + /** + * Clear all messages from the previous request & current namespace + * + * @return boolean True if messages were cleared, false if none existed + */ + public function clearMessages() + { + if ($this->hasMessages()) { + unset(self::$_messages[$this->_namespace]); + return true; + } + + return false; + } + + /** + * hasCurrentMessages() - check to see if messages have been added to current + * namespace within this request + * + * @return boolean + */ + public function hasCurrentMessages() + { + return isset(self::$_session->{$this->_namespace}); + } + + /** + * getCurrentMessages() - get messages that have been added to the current + * namespace within this request + * + * @return array + */ + public function getCurrentMessages() + { + if ($this->hasCurrentMessages()) { + return self::$_session->{$this->_namespace}; + } + + return array(); + } + + /** + * clear messages from the current request & current namespace + * + * @return boolean + */ + public function clearCurrentMessages() + { + if ($this->hasCurrentMessages()) { + unset(self::$_session->{$this->_namespace}); + return true; + } + + return false; + } + + /** + * getIterator() - complete the IteratorAggregate interface, for iterating + * + * @return ArrayObject + */ + public function getIterator() + { + if ($this->hasMessages()) { + return new ArrayObject($this->getMessages()); + } + + return new ArrayObject(); + } + + /** + * count() - Complete the countable interface + * + * @return int + */ + public function count() + { + if ($this->hasMessages()) { + return count($this->getMessages()); + } + + return 0; + } + + /** + * Strategy pattern: proxy to addMessage() + * + * @param string $message + * @return void + */ + public function direct($message) + { + return $this->addMessage($message); + } +} diff --git a/libs/Zend/Controller/Action/Helper/Json.php b/libs/Zend/Controller/Action/Helper/Json.php new file mode 100644 index 0000000..6c0b96c --- /dev/null +++ b/libs/Zend/Controller/Action/Helper/Json.php @@ -0,0 +1,117 @@ +json($data, $keepLayouts); + + if (!$keepLayouts) { + /** + * @see Zend_Controller_Action_HelperBroker + */ + require_once 'Zend/Controller/Action/HelperBroker.php'; + Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer')->setNoRender(true); + } + + return $data; + } + + /** + * Encode JSON response and immediately send + * + * @param mixed $data + * @param boolean $keepLayouts + * @return string|void + */ + public function sendJson($data, $keepLayouts = false) + { + $data = $this->encodeJson($data, $keepLayouts); + $response = $this->getResponse(); + $response->setBody($data); + + if (!$this->suppressExit) { + $response->sendResponse(); + exit; + } + + return $data; + } + + /** + * Strategy pattern: call helper as helper broker method + * + * Allows encoding JSON. If $sendNow is true, immediately sends JSON + * response. + * + * @param mixed $data + * @param boolean $sendNow + * @param boolean $keepLayouts + * @return string|void + */ + public function direct($data, $sendNow = true, $keepLayouts = false) + { + if ($sendNow) { + return $this->sendJson($data, $keepLayouts); + } + return $this->encodeJson($data, $keepLayouts); + } +} diff --git a/libs/Zend/Controller/Action/Helper/Redirector.php b/libs/Zend/Controller/Action/Helper/Redirector.php new file mode 100644 index 0000000..d80488b --- /dev/null +++ b/libs/Zend/Controller/Action/Helper/Redirector.php @@ -0,0 +1,510 @@ +_code; + } + + /** + * Validate HTTP status redirect code + * + * @param int $code + * @throws Zend_Controller_Action_Exception on invalid HTTP status code + * @return true + */ + protected function _checkCode($code) + { + $code = (int)$code; + if ((300 > $code) || (307 < $code) || (304 == $code) || (306 == $code)) { + /** + * @see Zend_Controller_Exception + */ + require_once 'Zend/Controller/Exception.php'; + throw new Zend_Controller_Action_Exception('Invalid redirect HTTP status code (' . $code . ')'); + } + + return true; + } + + /** + * Retrieve HTTP status code for {@link _redirect()} behaviour + * + * @param int $code + * @return Zend_Controller_Action_Helper_Redirector Provides a fluent interface + */ + public function setCode($code) + { + $this->_checkCode($code); + $this->_code = $code; + return $this; + } + + /** + * Retrieve flag for whether or not {@link _redirect()} will exit when finished. + * + * @return boolean + */ + public function getExit() + { + return $this->_exit; + } + + /** + * Retrieve exit flag for {@link _redirect()} behaviour + * + * @param boolean $flag + * @return Zend_Controller_Action_Helper_Redirector Provides a fluent interface + */ + public function setExit($flag) + { + $this->_exit = ($flag) ? true : false; + return $this; + } + + /** + * Retrieve flag for whether or not {@link _redirect()} will prepend the + * base URL on relative URLs + * + * @return boolean + */ + public function getPrependBase() + { + return $this->_prependBase; + } + + /** + * Retrieve 'prepend base' flag for {@link _redirect()} behaviour + * + * @param boolean $flag + * @return Zend_Controller_Action_Helper_Redirector Provides a fluent interface + */ + public function setPrependBase($flag) + { + $this->_prependBase = ($flag) ? true : false; + return $this; + } + + /** + * Return use absolute URI flag + * + * @return boolean + */ + public function getUseAbsoluteUri() + { + return $this->_useAbsoluteUri; + } + + /** + * Set use absolute URI flag + * + * @param boolean $flag + * @return Zend_Controller_Action_Helper_Redirector Provides a fluent interface + */ + public function setUseAbsoluteUri($flag = true) + { + $this->_useAbsoluteUri = ($flag) ? true : false; + return $this; + } + + /** + * Set redirect in response object + * + * @return void + */ + protected function _redirect($url) + { + if ($this->getUseAbsoluteUri() && !preg_match('#^(https?|ftp)://#', $url)) { + $host = (isset($_SERVER['HTTP_HOST'])?$_SERVER['HTTP_HOST']:''); + $proto = (isset($_SERVER['HTTPS'])&&$_SERVER['HTTPS']!=="off") ? 'https' : 'http'; + $port = (isset($_SERVER['SERVER_PORT'])?$_SERVER['SERVER_PORT']:80); + $uri = $proto . '://' . $host; + if ((('http' == $proto) && (80 != $port)) || (('https' == $proto) && (443 != $port))) { + $uri .= ':' . $port; + } + $url = $uri . '/' . ltrim($url, '/'); + } + $this->_redirectUrl = $url; + $this->getResponse()->setRedirect($url, $this->getCode()); + } + + /** + * Retrieve currently set URL for redirect + * + * @return string + */ + public function getRedirectUrl() + { + return $this->_redirectUrl; + } + + /** + * Determine if the baseUrl should be prepended, and prepend if necessary + * + * @param string $url + * @return string + */ + protected function _prependBase($url) + { + if ($this->getPrependBase()) { + $request = $this->getRequest(); + if ($request instanceof Zend_Controller_Request_Http) { + $base = rtrim($request->getBaseUrl(), '/'); + if (!empty($base) && ('/' != $base)) { + $url = $base . '/' . ltrim($url, '/'); + } else { + $url = '/' . ltrim($url, '/'); + } + } + } + + return $url; + } + + /** + * Set a redirect URL of the form /module/controller/action/params + * + * @param string $action + * @param string $controller + * @param string $module + * @param array $params + * @return void + */ + public function setGotoSimple($action, $controller = null, $module = null, array $params = array()) + { + $dispatcher = $this->getFrontController()->getDispatcher(); + $request = $this->getRequest(); + $curModule = $request->getModuleName(); + $useDefaultController = false; + + if (null === $controller && null !== $module) { + $useDefaultController = true; + } + + if (null === $module) { + $module = $curModule; + } + + if ($module == $dispatcher->getDefaultModule()) { + $module = ''; + } + + if (null === $controller && !$useDefaultController) { + $controller = $request->getControllerName(); + if (empty($controller)) { + $controller = $dispatcher->getDefaultControllerName(); + } + } + + $params['module'] = $module; + $params['controller'] = $controller; + $params['action'] = $action; + + $router = $this->getFrontController()->getRouter(); + $url = $router->assemble($params, 'default', true); + + $this->_redirect($url); + } + + /** + * Build a URL based on a route + * + * @param array $urlOptions + * @param string $name Route name + * @param boolean $reset + * @param boolean $encode + * @return void + */ + public function setGotoRoute(array $urlOptions = array(), $name = null, $reset = false, $encode = true) + { + $router = $this->getFrontController()->getRouter(); + $url = $router->assemble($urlOptions, $name, $reset, $encode); + + $this->_redirect($url); + } + + /** + * Set a redirect URL string + * + * By default, emits a 302 HTTP status header, prepends base URL as defined + * in request object if url is relative, and halts script execution by + * calling exit(). + * + * $options is an optional associative array that can be used to control + * redirect behaviour. The available option keys are: + * - exit: boolean flag indicating whether or not to halt script execution when done + * - prependBase: boolean flag indicating whether or not to prepend the base URL when a relative URL is provided + * - code: integer HTTP status code to use with redirect. Should be between 300 and 307. + * + * _redirect() sets the Location header in the response object. If you set + * the exit flag to false, you can override this header later in code + * execution. + * + * If the exit flag is true (true by default), _redirect() will write and + * close the current session, if any. + * + * @param string $url + * @param array $options + * @return void + */ + public function setGotoUrl($url, array $options = array()) + { + // prevent header injections + $url = str_replace(array("\n", "\r"), '', $url); + + $exit = $this->getExit(); + $prependBase = $this->getPrependBase(); + $code = $this->getCode(); + if (null !== $options) { + if (isset($options['exit'])) { + $this->setExit(($options['exit']) ? true : false); + } + if (isset($options['prependBase'])) { + $this->setPrependBase(($options['prependBase']) ? true : false); + } + if (isset($options['code'])) { + $this->setCode($options['code']); + } + } + + // If relative URL, decide if we should prepend base URL + if (!preg_match('|^[a-z]+://|', $url)) { + $url = $this->_prependBase($url); + } + + $this->_redirect($url); + } + + /** + * Perform a redirect to an action/controller/module with params + * + * @param string $action + * @param string $controller + * @param string $module + * @param array $params + * @return void + */ + public function gotoSimple($action, $controller = null, $module = null, array $params = array()) + { + $this->setGotoSimple($action, $controller, $module, $params); + + if ($this->getExit()) { + $this->redirectAndExit(); + } + } + + /** + * Perform a redirect to an action/controller/module with params, forcing an immdiate exit + * + * @param mixed $action + * @param mixed $controller + * @param mixed $module + * @param array $params + * @return void + */ + public function gotoSimpleAndExit($action, $controller = null, $module = null, array $params = array()) + { + $this->setGotoSimple($action, $controller, $module, $params); + $this->redirectAndExit(); + } + + /** + * Redirect to a route-based URL + * + * Uses route's assemble method tobuild the URL; route is specified by $name; + * default route is used if none provided. + * + * @param array $urlOptions Array of key/value pairs used to assemble URL + * @param string $name + * @param boolean $reset + * @param boolean $encode + * @return void + */ + public function gotoRoute(array $urlOptions = array(), $name = null, $reset = false, $encode = true) + { + $this->setGotoRoute($urlOptions, $name, $reset, $encode); + + if ($this->getExit()) { + $this->redirectAndExit(); + } + } + + /** + * Redirect to a route-based URL, and immediately exit + * + * Uses route's assemble method tobuild the URL; route is specified by $name; + * default route is used if none provided. + * + * @param array $urlOptions Array of key/value pairs used to assemble URL + * @param string $name + * @param boolean $reset + * @return void + */ + public function gotoRouteAndExit(array $urlOptions = array(), $name = null, $reset = false) + { + $this->setGotoRoute($urlOptions, $name, $reset); + $this->redirectAndExit(); + } + + /** + * Perform a redirect to a url + * + * @param string $url + * @param array $options + * @return void + */ + public function gotoUrl($url, array $options = array()) + { + $this->setGotoUrl($url, $options); + + if ($this->getExit()) { + $this->redirectAndExit(); + } + } + + /** + * Set a URL string for a redirect, perform redirect, and immediately exit + * + * @param string $url + * @param array $options + * @return void + */ + public function gotoUrlAndExit($url, array $options = array()) + { + $this->gotoUrl($url, $options); + $this->redirectAndExit(); + } + + /** + * exit(): Perform exit for redirector + * + * @return void + */ + public function redirectAndExit() + { + // Close session, if started + if (class_exists('Zend_Session', false) && Zend_Session::isStarted()) { + Zend_Session::writeClose(); + } elseif (isset($_SESSION)) { + session_write_close(); + } + + $this->getResponse()->sendHeaders(); + exit(); + } + + /** + * direct(): Perform helper when called as + * $this->_helper->redirector($action, $controller, $module, $params) + * + * @param string $action + * @param string $controller + * @param string $module + * @param array $params + * @return void + */ + public function direct($action, $controller = null, $module = null, array $params = array()) + { + $this->gotoSimple($action, $controller, $module, $params); + } + + /** + * Overloading + * + * Overloading for old 'goto', 'setGoto', and 'gotoAndExit' methods + * + * @param string $method + * @param array $args + * @return mixed + * @throws Zend_Controller_Action_Exception for invalid methods + */ + public function __call($method, $args) + { + $method = strtolower($method); + if ('goto' == $method) { + return call_user_func_array(array($this, 'gotoSimple'), $args); + } + if ('setgoto' == $method) { + return call_user_func_array(array($this, 'setGotoSimple'), $args); + } + if ('gotoandexit' == $method) { + return call_user_func_array(array($this, 'gotoSimpleAndExit'), $args); + } + + require_once 'Zend/Controller/Action/Exception.php'; + throw new Zend_Controller_Action_Exception(sprintf('Invalid method "%s" called on redirector', $method)); + } +} diff --git a/libs/Zend/Controller/Action/Helper/Url.php b/libs/Zend/Controller/Action/Helper/Url.php new file mode 100644 index 0000000..dc183a0 --- /dev/null +++ b/libs/Zend/Controller/Action/Helper/Url.php @@ -0,0 +1,117 @@ +getRequest(); + + if (null === $controller) { + $controller = $request->getControllerName(); + } + + if (null === $module) { + $module = $request->getModuleName(); + } + + $url = $controller . '/' . $action; + if ($module != $this->getFrontController()->getDispatcher()->getDefaultModule()) { + $url = $module . '/' . $url; + } + + if ('' !== ($baseUrl = $this->getFrontController()->getBaseUrl())) { + $url = $baseUrl . '/' . $url; + } + + if (null !== $params) { + $paramPairs = array(); + foreach ($params as $key => $value) { + $paramPairs[] = urlencode($key) . '/' . urlencode($value); + } + $paramString = implode('/', $paramPairs); + $url .= '/' . $paramString; + } + + $url = '/' . ltrim($url, '/'); + + return $url; + } + + /** + * Assembles a URL based on a given route + * + * This method will typically be used for more complex operations, as it + * ties into the route objects registered with the router. + * + * @param array $urlOptions Options passed to the assemble method of the Route object. + * @param mixed $name The name of a Route to use. If null it will use the current Route + * @param boolean $reset + * @param boolean $encode + * @return string Url for the link href attribute. + */ + public function url($urlOptions = array(), $name = null, $reset = false, $encode = true) + { + $router = $this->getFrontController()->getRouter(); + return $router->assemble($urlOptions, $name, $reset, $encode); + } + + /** + * Perform helper when called as $this->_helper->url() from an action controller + * + * Proxies to {@link simple()} + * + * @param string $action + * @param string $controller + * @param string $module + * @param array $params + * @return string + */ + public function direct($action, $controller = null, $module = null, array $params = null) + { + return $this->simple($action, $controller, $module, $params); + } +} diff --git a/libs/Zend/Controller/Action/Helper/ViewRenderer.php b/libs/Zend/Controller/Action/Helper/ViewRenderer.php new file mode 100644 index 0000000..a01845a --- /dev/null +++ b/libs/Zend/Controller/Action/Helper/ViewRenderer.php @@ -0,0 +1,994 @@ + + * // In your bootstrap: + * Zend_Controller_Action_HelperBroker::addHelper(new Zend_Controller_Action_Helper_ViewRenderer()); + * + * // In your action controller methods: + * $viewHelper = $this->_helper->getHelper('view'); + * + * // Don't use controller subdirectories + * $viewHelper->setNoController(true); + * + * // Specify a different script to render: + * $this->_helper->view('form'); + * + * + * + * @uses Zend_Controller_Action_Helper_Abstract + * @package Zend_Controller + * @subpackage Zend_Controller_Action_Helper + * @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_Controller_Action_Helper_ViewRenderer extends Zend_Controller_Action_Helper_Abstract +{ + /** + * @var Zend_View_Interface + */ + public $view; + + /** + * Word delimiters + * @var array + */ + protected $_delimiters; + + /** + * Front controller instance + * @var Zend_Controller_Front + */ + protected $_frontController; + + /** + * @var Zend_Filter_Inflector + */ + protected $_inflector; + + /** + * Inflector target + * @var string + */ + protected $_inflectorTarget = ''; + + /** + * Current module directory + * @var string + */ + protected $_moduleDir = ''; + + /** + * Whether or not to autorender using controller name as subdirectory; + * global setting (not reset at next invocation) + * @var boolean + */ + protected $_neverController = false; + + /** + * Whether or not to autorender postDispatch; global setting (not reset at + * next invocation) + * @var boolean + */ + protected $_neverRender = false; + + /** + * Whether or not to use a controller name as a subdirectory when rendering + * @var boolean + */ + protected $_noController = false; + + /** + * Whether or not to autorender postDispatch; per controller/action setting (reset + * at next invocation) + * @var boolean + */ + protected $_noRender = false; + + /** + * Characters representing path delimiters in the controller + * @var string|array + */ + protected $_pathDelimiters; + + /** + * Which named segment of the response to utilize + * @var string + */ + protected $_responseSegment = null; + + /** + * Which action view script to render + * @var string + */ + protected $_scriptAction = null; + + /** + * View object basePath + * @var string + */ + protected $_viewBasePathSpec = ':moduleDir/views'; + + /** + * View script path specification string + * @var string + */ + protected $_viewScriptPathSpec = ':controller/:action.:suffix'; + + /** + * View script path specification string, minus controller segment + * @var string + */ + protected $_viewScriptPathNoControllerSpec = ':action.:suffix'; + + /** + * View script suffix + * @var string + */ + protected $_viewSuffix = 'phtml'; + + /** + * Constructor + * + * Optionally set view object and options. + * + * @param Zend_View_Interface $view + * @param array $options + * @return void + */ + public function __construct(Zend_View_Interface $view = null, array $options = array()) + { + if (null !== $view) { + $this->setView($view); + } + + if (!empty($options)) { + $this->_setOptions($options); + } + } + + /** + * Clone - also make sure the view is cloned. + * + * @return void + */ + public function __clone() + { + if (isset($this->view) && $this->view instanceof Zend_View_Interface) { + $this->view = clone $this->view; + + } + } + + /** + * Set the view object + * + * @param Zend_View_Interface $view + * @return Zend_Controller_Action_Helper_ViewRenderer Provides a fluent interface + */ + public function setView(Zend_View_Interface $view) + { + $this->view = $view; + return $this; + } + + /** + * Get current module name + * + * @return string + */ + public function getModule() + { + $request = $this->getRequest(); + $module = $request->getModuleName(); + if (null === $module) { + $module = $this->getFrontController()->getDispatcher()->getDefaultModule(); + } + + return $module; + } + + /** + * Get module directory + * + * @throws Zend_Controller_Action_Exception + * @return string + */ + public function getModuleDirectory() + { + $module = $this->getModule(); + $moduleDir = $this->getFrontController()->getControllerDirectory($module); + if ((null === $moduleDir) || is_array($moduleDir)) { + /** + * @see Zend_Controller_Action_Exception + */ + require_once 'Zend/Controller/Action/Exception.php'; + throw new Zend_Controller_Action_Exception('ViewRenderer cannot locate module directory'); + } + $this->_moduleDir = dirname($moduleDir); + return $this->_moduleDir; + } + + /** + * Get inflector + * + * @return Zend_Filter_Inflector + */ + public function getInflector() + { + if (null === $this->_inflector) { + /** + * @see Zend_Filter_Inflector + */ + require_once 'Zend/Filter/Inflector.php'; + /** + * @see Zend_Filter_PregReplace + */ + require_once 'Zend/Filter/PregReplace.php'; + /** + * @see Zend_Filter_Word_UnderscoreToSeparator + */ + require_once 'Zend/Filter/Word/UnderscoreToSeparator.php'; + $this->_inflector = new Zend_Filter_Inflector(); + $this->_inflector->setStaticRuleReference('moduleDir', $this->_moduleDir) // moduleDir must be specified before the less specific 'module' + ->addRules(array( + ':module' => array('Word_CamelCaseToDash', 'StringToLower'), + ':controller' => array('Word_CamelCaseToDash', new Zend_Filter_Word_UnderscoreToSeparator('/'), 'StringToLower'), + ':action' => array('Word_CamelCaseToDash', new Zend_Filter_PregReplace('#[^a-z0-9' . preg_quote('/', '#') . ']+#i', '-'), 'StringToLower'), + )) + ->setStaticRuleReference('suffix', $this->_viewSuffix) + ->setTargetReference($this->_inflectorTarget); + } + + // Ensure that module directory is current + $this->getModuleDirectory(); + + return $this->_inflector; + } + + /** + * Set inflector + * + * @param Zend_Filter_Inflector $inflector + * @param boolean $reference Whether the moduleDir, target, and suffix should be set as references to ViewRenderer properties + * @return Zend_Controller_Action_Helper_ViewRenderer Provides a fluent interface + */ + public function setInflector(Zend_Filter_Inflector $inflector, $reference = false) + { + $this->_inflector = $inflector; + if ($reference) { + $this->_inflector->setStaticRuleReference('suffix', $this->_viewSuffix) + ->setStaticRuleReference('moduleDir', $this->_moduleDir) + ->setTargetReference($this->_inflectorTarget); + } + return $this; + } + + /** + * Set inflector target + * + * @param string $target + * @return void + */ + protected function _setInflectorTarget($target) + { + $this->_inflectorTarget = (string) $target; + } + + /** + * Set internal module directory representation + * + * @param string $dir + * @return void + */ + protected function _setModuleDir($dir) + { + $this->_moduleDir = (string) $dir; + } + + /** + * Get internal module directory representation + * + * @return string + */ + protected function _getModuleDir() + { + return $this->_moduleDir; + } + + /** + * Generate a class prefix for helper and filter classes + * + * @return string + */ + protected function _generateDefaultPrefix() + { + $default = 'Zend_View'; + if (null === $this->_actionController) { + return $default; + } + + $class = get_class($this->_actionController); + + if (!strstr($class, '_')) { + return $default; + } + + $module = $this->getModule(); + if ('default' == $module) { + return $default; + } + + $prefix = substr($class, 0, strpos($class, '_')) . '_View'; + + return $prefix; + } + + /** + * Retrieve base path based on location of current action controller + * + * @return string + */ + protected function _getBasePath() + { + if (null === $this->_actionController) { + return './views'; + } + + $inflector = $this->getInflector(); + $this->_setInflectorTarget($this->getViewBasePathSpec()); + + $dispatcher = $this->_frontController->getDispatcher(); + $request = $this->getRequest(); + + $parts = array( + 'module' => (($moduleName = $request->getModuleName()) != '') ? $dispatcher->formatModuleName($moduleName) : $moduleName, + 'controller' => substr($dispatcher->formatControllerName($request->getControllerName()), 0, -10), + 'action' => $dispatcher->formatActionName($request->getActionName()) + ); + + $path = $inflector->filter($parts); + return $path; + } + + /** + * Set options + * + * @param array $options + * @return Zend_Controller_Action_Helper_ViewRenderer Provides a fluent interface + */ + protected function _setOptions(array $options) + { + foreach ($options as $key => $value) + { + switch ($key) { + case 'neverRender': + case 'neverController': + case 'noController': + case 'noRender': + $property = '_' . $key; + $this->{$property} = ($value) ? true : false; + break; + case 'responseSegment': + case 'scriptAction': + case 'viewBasePathSpec': + case 'viewScriptPathSpec': + case 'viewScriptPathNoControllerSpec': + case 'viewSuffix': + $property = '_' . $key; + $this->{$property} = (string) $value; + break; + default: + break; + } + } + + return $this; + } + + /** + * Initialize the view object + * + * $options may contain the following keys: + * - neverRender - flag dis/enabling postDispatch() autorender (affects all subsequent calls) + * - noController - flag indicating whether or not to look for view scripts in subdirectories named after the controller + * - noRender - flag indicating whether or not to autorender postDispatch() + * - responseSegment - which named response segment to render a view script to + * - scriptAction - what action script to render + * - viewBasePathSpec - specification to use for determining view base path + * - viewScriptPathSpec - specification to use for determining view script paths + * - viewScriptPathNoControllerSpec - specification to use for determining view script paths when noController flag is set + * - viewSuffix - what view script filename suffix to use + * + * @param string $path + * @param string $prefix + * @param array $options + * @throws Zend_Controller_Action_Exception + * @return void + */ + public function initView($path = null, $prefix = null, array $options = array()) + { + if (null === $this->view) { + $this->setView(new Zend_View()); + } + + // Reset some flags every time + $options['noController'] = (isset($options['noController'])) ? $options['noController'] : false; + $options['noRender'] = (isset($options['noRender'])) ? $options['noRender'] : false; + $this->_scriptAction = null; + $this->_responseSegment = null; + + // Set options first; may be used to determine other initializations + $this->_setOptions($options); + + // Get base view path + if (empty($path)) { + $path = $this->_getBasePath(); + if (empty($path)) { + /** + * @see Zend_Controller_Action_Exception + */ + require_once 'Zend/Controller/Action/Exception.php'; + throw new Zend_Controller_Action_Exception('ViewRenderer initialization failed: retrieved view base path is empty'); + } + } + + if (null === $prefix) { + $prefix = $this->_generateDefaultPrefix(); + } + + // Determine if this path has already been registered + $currentPaths = $this->view->getScriptPaths(); + $path = str_replace(array('/', '\\'), '/', $path); + $pathExists = false; + foreach ($currentPaths as $tmpPath) { + $tmpPath = str_replace(array('/', '\\'), '/', $tmpPath); + if (strstr($tmpPath, $path)) { + $pathExists = true; + break; + } + } + if (!$pathExists) { + $this->view->addBasePath($path, $prefix); + } + + // Register view with action controller (unless already registered) + if ((null !== $this->_actionController) && (null === $this->_actionController->view)) { + $this->_actionController->view = $this->view; + $this->_actionController->viewSuffix = $this->_viewSuffix; + } + } + + /** + * init - initialize view + * + * @return void + */ + public function init() + { + if ($this->getFrontController()->getParam('noViewRenderer')) { + return; + } + + $this->initView(); + } + + /** + * Set view basePath specification + * + * Specification can contain one or more of the following: + * - :moduleDir - current module directory + * - :controller - name of current controller in the request + * - :action - name of current action in the request + * - :module - name of current module in the request + * + * @param string $path + * @return Zend_Controller_Action_Helper_ViewRenderer Provides a fluent interface + */ + public function setViewBasePathSpec($path) + { + $this->_viewBasePathSpec = (string) $path; + return $this; + } + + /** + * Retrieve the current view basePath specification string + * + * @return string + */ + public function getViewBasePathSpec() + { + return $this->_viewBasePathSpec; + } + + /** + * Set view script path specification + * + * Specification can contain one or more of the following: + * - :moduleDir - current module directory + * - :controller - name of current controller in the request + * - :action - name of current action in the request + * - :module - name of current module in the request + * + * @param string $path + * @return Zend_Controller_Action_Helper_ViewRenderer Provides a fluent interface + */ + public function setViewScriptPathSpec($path) + { + $this->_viewScriptPathSpec = (string) $path; + return $this; + } + + /** + * Retrieve the current view script path specification string + * + * @return string + */ + public function getViewScriptPathSpec() + { + return $this->_viewScriptPathSpec; + } + + /** + * Set view script path specification (no controller variant) + * + * Specification can contain one or more of the following: + * - :moduleDir - current module directory + * - :controller - name of current controller in the request + * - :action - name of current action in the request + * - :module - name of current module in the request + * + * :controller will likely be ignored in this variant. + * + * @param string $path + * @return Zend_Controller_Action_Helper_ViewRenderer Provides a fluent interface + */ + public function setViewScriptPathNoControllerSpec($path) + { + $this->_viewScriptPathNoControllerSpec = (string) $path; + return $this; + } + + /** + * Retrieve the current view script path specification string (no controller variant) + * + * @return string + */ + public function getViewScriptPathNoControllerSpec() + { + return $this->_viewScriptPathNoControllerSpec; + } + + /** + * Get a view script based on an action and/or other variables + * + * Uses values found in current request if no values passed in $vars. + * + * If {@link $_noController} is set, uses {@link $_viewScriptPathNoControllerSpec}; + * otherwise, uses {@link $_viewScriptPathSpec}. + * + * @param string $action + * @param array $vars + * @return string + */ + public function getViewScript($action = null, array $vars = array()) + { + $request = $this->getRequest(); + if ((null === $action) && (!isset($vars['action']))) { + $action = $this->getScriptAction(); + if (null === $action) { + $action = $request->getActionName(); + } + $vars['action'] = $action; + } elseif (null !== $action) { + $vars['action'] = $action; + } + + $inflector = $this->getInflector(); + if ($this->getNoController() || $this->getNeverController()) { + $this->_setInflectorTarget($this->getViewScriptPathNoControllerSpec()); + } else { + $this->_setInflectorTarget($this->getViewScriptPathSpec()); + } + return $this->_translateSpec($vars); + } + + /** + * Set the neverRender flag (i.e., globally dis/enable autorendering) + * + * @param boolean $flag + * @return Zend_Controller_Action_Helper_ViewRenderer Provides a fluent interface + */ + public function setNeverRender($flag = true) + { + $this->_neverRender = ($flag) ? true : false; + return $this; + } + + /** + * Retrieve neverRender flag value + * + * @return boolean + */ + public function getNeverRender() + { + return $this->_neverRender; + } + + /** + * Set the noRender flag (i.e., whether or not to autorender) + * + * @param boolean $flag + * @return Zend_Controller_Action_Helper_ViewRenderer Provides a fluent interface + */ + public function setNoRender($flag = true) + { + $this->_noRender = ($flag) ? true : false; + return $this; + } + + /** + * Retrieve noRender flag value + * + * @return boolean + */ + public function getNoRender() + { + return $this->_noRender; + } + + /** + * Set the view script to use + * + * @param string $name + * @return Zend_Controller_Action_Helper_ViewRenderer Provides a fluent interface + */ + public function setScriptAction($name) + { + $this->_scriptAction = (string) $name; + return $this; + } + + /** + * Retrieve view script name + * + * @return string + */ + public function getScriptAction() + { + return $this->_scriptAction; + } + + /** + * Set the response segment name + * + * @param string $name + * @return Zend_Controller_Action_Helper_ViewRenderer Provides a fluent interface + */ + public function setResponseSegment($name) + { + if (null === $name) { + $this->_responseSegment = null; + } else { + $this->_responseSegment = (string) $name; + } + + return $this; + } + + /** + * Retrieve named response segment name + * + * @return string + */ + public function getResponseSegment() + { + return $this->_responseSegment; + } + + /** + * Set the noController flag (i.e., whether or not to render into controller subdirectories) + * + * @param boolean $flag + * @return Zend_Controller_Action_Helper_ViewRenderer Provides a fluent interface + */ + public function setNoController($flag = true) + { + $this->_noController = ($flag) ? true : false; + return $this; + } + + /** + * Retrieve noController flag value + * + * @return boolean + */ + public function getNoController() + { + return $this->_noController; + } + + /** + * Set the neverController flag (i.e., whether or not to render into controller subdirectories) + * + * @param boolean $flag + * @return Zend_Controller_Action_Helper_ViewRenderer Provides a fluent interface + */ + public function setNeverController($flag = true) + { + $this->_neverController = ($flag) ? true : false; + return $this; + } + + /** + * Retrieve neverController flag value + * + * @return boolean + */ + public function getNeverController() + { + return $this->_neverController; + } + + /** + * Set view script suffix + * + * @param string $suffix + * @return Zend_Controller_Action_Helper_ViewRenderer Provides a fluent interface + */ + public function setViewSuffix($suffix) + { + $this->_viewSuffix = (string) $suffix; + return $this; + } + + /** + * Get view script suffix + * + * @return string + */ + public function getViewSuffix() + { + return $this->_viewSuffix; + } + + /** + * Set options for rendering a view script + * + * @param string $action View script to render + * @param string $name Response named segment to render to + * @param boolean $noController Whether or not to render within a subdirectory named after the controller + * @return Zend_Controller_Action_Helper_ViewRenderer Provides a fluent interface + */ + public function setRender($action = null, $name = null, $noController = null) + { + if (null !== $action) { + $this->setScriptAction($action); + } + + if (null !== $name) { + $this->setResponseSegment($name); + } + + if (null !== $noController) { + $this->setNoController($noController); + } + + return $this; + } + + /** + * Inflect based on provided vars + * + * Allowed variables are: + * - :moduleDir - current module directory + * - :module - current module name + * - :controller - current controller name + * - :action - current action name + * - :suffix - view script file suffix + * + * @param array $vars + * @return string + */ + protected function _translateSpec(array $vars = array()) + { + $inflector = $this->getInflector(); + $request = $this->getRequest(); + $dispatcher = $this->_frontController->getDispatcher(); + $module = $dispatcher->formatModuleName($request->getModuleName()); + $controller = substr($dispatcher->formatControllerName($request->getControllerName()), 0, -10); + $action = $dispatcher->formatActionName($request->getActionName()); + + $params = compact('module', 'controller', 'action'); + foreach ($vars as $key => $value) { + switch ($key) { + case 'module': + case 'controller': + case 'action': + case 'moduleDir': + case 'suffix': + $params[$key] = (string) $value; + break; + default: + break; + } + } + + if (isset($params['suffix'])) { + $origSuffix = $this->getViewSuffix(); + $this->setViewSuffix($params['suffix']); + } + if (isset($params['moduleDir'])) { + $origModuleDir = $this->_getModuleDir(); + $this->_setModuleDir($params['moduleDir']); + } + + $filtered = $inflector->filter($params); + + if (isset($params['suffix'])) { + $this->setViewSuffix($origSuffix); + } + if (isset($params['moduleDir'])) { + $this->_setModuleDir($origModuleDir); + } + + return $filtered; + } + + /** + * Render a view script (optionally to a named response segment) + * + * Sets the noRender flag to true when called. + * + * @param string $script + * @param string $name + * @return void + */ + public function renderScript($script, $name = null) + { + if (null === $name) { + $name = $this->getResponseSegment(); + } + + $this->getResponse()->appendBody( + $this->view->render($script), + $name + ); + + $this->setNoRender(); + } + + /** + * Render a view based on path specifications + * + * Renders a view based on the view script path specifications. + * + * @param string $action + * @param string $name + * @param boolean $noController + * @return void + */ + public function render($action = null, $name = null, $noController = null) + { + $this->setRender($action, $name, $noController); + $path = $this->getViewScript(); + $this->renderScript($path, $name); + } + + /** + * Render a script based on specification variables + * + * Pass an action, and one or more specification variables (view script suffix) + * to determine the view script path, and render that script. + * + * @param string $action + * @param array $vars + * @param string $name + * @return void + */ + public function renderBySpec($action = null, array $vars = array(), $name = null) + { + if (null !== $name) { + $this->setResponseSegment($name); + } + + $path = $this->getViewScript($action, $vars); + + $this->renderScript($path); + } + + /** + * postDispatch - auto render a view + * + * Only autorenders if: + * - _noRender is false + * - action controller is present + * - request has not been re-dispatched (i.e., _forward() has not been called) + * - response is not a redirect + * + * @return void + */ + public function postDispatch() + { + if ($this->_shouldRender()) { + $this->render(); + } + } + + /** + * Should the ViewRenderer render a view script? + * + * @return boolean + */ + protected function _shouldRender() + { + return (!$this->getFrontController()->getParam('noViewRenderer') + && !$this->_neverRender + && !$this->_noRender + && (null !== $this->_actionController) + && $this->getRequest()->isDispatched() + && !$this->getResponse()->isRedirect() + ); + } + + /** + * Use this helper as a method; proxies to setRender() + * + * @param string $action + * @param string $name + * @param boolean $noController + * @return void + */ + public function direct($action = null, $name = null, $noController = null) + { + $this->setRender($action, $name, $noController); + } +} diff --git a/libs/Zend/Controller/Action/HelperBroker.php b/libs/Zend/Controller/Action/HelperBroker.php new file mode 100644 index 0000000..c571d6a --- /dev/null +++ b/libs/Zend/Controller/Action/HelperBroker.php @@ -0,0 +1,380 @@ + 'Zend/Controller/Action/Helper/', + )); + } + return self::$_pluginLoader; + } + + /** + * addPrefix() - Add repository of helpers by prefix + * + * @param string $prefix + */ + static public function addPrefix($prefix) + { + $prefix = rtrim($prefix, '_'); + $path = str_replace('_', DIRECTORY_SEPARATOR, $prefix); + self::getPluginLoader()->addPrefixPath($prefix, $path); + } + + /** + * addPath() - Add path to repositories where Action_Helpers could be found. + * + * @param string $path + * @param string $prefix Optional; defaults to 'Zend_Controller_Action_Helper' + * @return void + */ + static public function addPath($path, $prefix = 'Zend_Controller_Action_Helper') + { + self::getPluginLoader()->addPrefixPath($prefix, $path); + } + + /** + * addHelper() - Add helper objects + * + * @param Zend_Controller_Action_Helper_Abstract $helper + * @return void + */ + static public function addHelper(Zend_Controller_Action_Helper_Abstract $helper) + { + self::getStack()->push($helper); + return; + } + + /** + * resetHelpers() + * + * @return void + */ + static public function resetHelpers() + { + self::$_stack = null; + return; + } + + /** + * Retrieve or initialize a helper statically + * + * Retrieves a helper object statically, loading on-demand if the helper + * does not already exist in the stack. Always returns a helper, unless + * the helper class cannot be found. + * + * @param string $name + * @return Zend_Controller_Action_Helper_Abstract + */ + public static function getStaticHelper($name) + { + $name = self::_normalizeHelperName($name); + $stack = self::getStack(); + + if (!isset($stack->{$name})) { + self::_loadHelper($name); + } + + return $stack->{$name}; + } + + /** + * getExistingHelper() - get helper by name + * + * Static method to retrieve helper object. Only retrieves helpers already + * initialized with the broker (either via addHelper() or on-demand loading + * via getHelper()). + * + * Throws an exception if the referenced helper does not exist in the + * stack; use {@link hasHelper()} to check if the helper is registered + * prior to retrieving it. + * + * @param string $name + * @return Zend_Controller_Action_Helper_Abstract + * @throws Zend_Controller_Action_Exception + */ + public static function getExistingHelper($name) + { + $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'); + } + + return $stack->{$name}; + } + + /** + * Return all registered helpers as helper => object pairs + * + * @return array + */ + public static function getExistingHelpers() + { + return self::getStack()->getHelpersByName(); + } + + /** + * Is a particular helper loaded in the broker? + * + * @param string $name + * @return boolean + */ + public static function hasHelper($name) + { + $name = self::_normalizeHelperName($name); + return isset(self::getStack()->{$name}); + } + + /** + * Remove a particular helper from the broker + * + * @param string $name + * @return boolean + */ + public static function removeHelper($name) + { + $name = self::_normalizeHelperName($name); + $stack = self::getStack(); + if (isset($stack->{$name})) { + unset($stack->{$name}); + } + + return false; + } + + /** + * Lazy load the priority stack and return it + * + * @return Zend_Controller_Action_HelperBroker_PriorityStack + */ + public static function getStack() + { + if (self::$_stack == null) { + self::$_stack = new Zend_Controller_Action_HelperBroker_PriorityStack(); + } + + return self::$_stack; + } + + /** + * Constructor + * + * @param Zend_Controller_Action $actionController + * @return void + */ + public function __construct(Zend_Controller_Action $actionController) + { + $this->_actionController = $actionController; + foreach (self::getStack() as $helper) { + $helper->setActionController($actionController); + $helper->init(); + } + } + + /** + * notifyPreDispatch() - called by action controller dispatch method + * + * @return void + */ + public function notifyPreDispatch() + { + foreach (self::getStack() as $helper) { + $helper->preDispatch(); + } + } + + /** + * notifyPostDispatch() - called by action controller dispatch method + * + * @return void + */ + public function notifyPostDispatch() + { + foreach (self::getStack() as $helper) { + $helper->postDispatch(); + } + } + + /** + * getHelper() - get helper by name + * + * @param string $name + * @return Zend_Controller_Action_Helper_Abstract + */ + public function getHelper($name) + { + $name = self::_normalizeHelperName($name); + $stack = self::getStack(); + + if (!isset($stack->{$name})) { + self::_loadHelper($name); + } + + $helper = $stack->{$name}; + + $initialize = false; + if (null === ($actionController = $helper->getActionController())) { + $initialize = true; + } elseif ($actionController !== $this->_actionController) { + $initialize = true; + } + + if ($initialize) { + $helper->setActionController($this->_actionController) + ->init(); + } + + return $helper; + } + + /** + * Method overloading + * + * @param string $method + * @param array $args + * @return mixed + * @throws Zend_Controller_Action_Exception if helper does not have a direct() method + */ + public function __call($method, $args) + { + $helper = $this->getHelper($method); + if (!method_exists($helper, 'direct')) { + require_once 'Zend/Controller/Action/Exception.php'; + throw new Zend_Controller_Action_Exception('Helper "' . $method . '" does not support overloading via direct()'); + } + return call_user_func_array(array($helper, 'direct'), $args); + } + + /** + * Retrieve helper by name as object property + * + * @param string $name + * @return Zend_Controller_Action_Helper_Abstract + */ + public function __get($name) + { + return $this->getHelper($name); + } + + /** + * Normalize helper name for lookups + * + * @param string $name + * @return string + */ + protected static function _normalizeHelperName($name) + { + if (strpos($name, '_') !== false) { + $name = str_replace(' ', '', ucwords(str_replace('_', ' ', $name))); + } + + return ucfirst($name); + } + + /** + * Load a helper + * + * @param string $name + * @return void + */ + protected static function _loadHelper($name) + { + try { + $class = self::getPluginLoader()->load($name); + } catch (Zend_Loader_PluginLoader_Exception $e) { + require_once 'Zend/Controller/Action/Exception.php'; + throw new Zend_Controller_Action_Exception('Action Helper by name ' . $name . ' not found'); + } + + $helper = new $class(); + + if (!$helper instanceof Zend_Controller_Action_Helper_Abstract) { + require_once 'Zend/Controller/Action/Exception.php'; + throw new Zend_Controller_Action_Exception('Helper name ' . $name . ' -> class ' . $class . ' is not of type Zend_Controller_Action_Helper_Abstract'); + } + + self::getStack()->push($helper); + } +} diff --git a/libs/Zend/Controller/Action/HelperBroker/PriorityStack.php b/libs/Zend/Controller/Action/HelperBroker/PriorityStack.php new file mode 100644 index 0000000..0aa23f8 --- /dev/null +++ b/libs/Zend/Controller/Action/HelperBroker/PriorityStack.php @@ -0,0 +1,280 @@ +_helpersByNameRef)) { + return false; + } + + return $this->_helpersByNameRef[$helperName]; + } + + /** + * Magic property overloading for returning if helper is set by name + * + * @param string $helperName The helper name + * @return Zend_Controller_Action_Helper_Abstract + */ + public function __isset($helperName) + { + return array_key_exists($helperName, $this->_helpersByNameRef); + } + + /** + * Magic property overloading for unsetting if helper is exists by name + * + * @param string $helperName The helper name + * @return Zend_Controller_Action_Helper_Abstract + */ + public function __unset($helperName) + { + return $this->offsetUnset($helperName); + } + + /** + * push helper onto the stack + * + * @param Zend_Controller_Action_Helper_Abstract $helper + * @return Zend_Controller_Action_HelperBroker_PriorityStack + */ + public function push(Zend_Controller_Action_Helper_Abstract $helper) + { + $this->offsetSet($this->getNextFreeHigherPriority(), $helper); + return $this; + } + + /** + * Return something iterable + * + * @return array + */ + public function getIterator() + { + return new ArrayObject($this->_helpersByPriority); + } + + /** + * offsetExists() + * + * @param int|string $priorityOrHelperName + * @return Zend_Controller_Action_HelperBroker_PriorityStack + */ + public function offsetExists($priorityOrHelperName) + { + if (is_string($priorityOrHelperName)) { + return array_key_exists($priorityOrHelperName, $this->_helpersByNameRef); + } else { + return array_key_exists($priorityOrHelperName, $this->_helpersByPriority); + } + } + + /** + * offsetGet() + * + * @param int|string $priorityOrHelperName + * @return Zend_Controller_Action_HelperBroker_PriorityStack + */ + public function offsetGet($priorityOrHelperName) + { + 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.'); + } + + if (is_string($priorityOrHelperName)) { + return $this->_helpersByNameRef[$priorityOrHelperName]; + } else { + return $this->_helpersByPriority[$priorityOrHelperName]; + } + } + + /** + * offsetSet() + * + * @param int $priority + * @param Zend_Controller_Action_Helper_Abstract $helper + * @return Zend_Controller_Action_HelperBroker_PriorityStack + */ + public function offsetSet($priority, $helper) + { + $priority = (int) $priority; + + if (!$helper instanceof Zend_Controller_Action_Helper_Abstract) { + 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() + * + * @param int|string $priorityOrHelperName Priority integer or the helper name + * @return Zend_Controller_Action_HelperBroker_PriorityStack + */ + public function offsetUnset($priorityOrHelperName) + { + if (!$this->offsetExists($priorityOrHelperName)) { + 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]; + $priority = array_search($helper, $this->_helpersByPriority, true); + } else { + $priority = $priorityOrHelperName; + $helperName = $this->_helpersByPriority[$priorityOrHelperName]->getName(); + } + + unset($this->_helpersByNameRef[$helperName]); + unset($this->_helpersByPriority[$priority]); + return $this; + } + + /** + * return the count of helpers + * + * @return int + */ + public function count() + { + 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. + * + * @param int $indexPriority OPTIONAL + * @return int + */ + public function getNextFreeHigherPriority($indexPriority = null) + { + 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. + * + * @param int $indexPriority + * @return int + */ + public function getNextFreeLowerPriority($indexPriority = null) + { + if ($indexPriority == null) { + $indexPriority = $this->_nextDefaultPriority; + } + + $priorities = array_keys($this->_helpersByPriority); + + while (in_array($indexPriority, $priorities)) { + $indexPriority--; + } + + return $indexPriority; + } + + /** + * return the highest priority + * + * @return int + */ + public function getHighestPriority() + { + return max(array_keys($this->_helpersByPriority)); + } + + /** + * return the lowest priority + * + * @return int + */ + public function getLowestPriority() + { + return min(array_keys($this->_helpersByPriority)); + } + + /** + * return the helpers referenced by name + * + * @return array + */ + public function getHelpersByName() + { + return $this->_helpersByNameRef; + } + +} diff --git a/libs/Zend/Controller/Dispatcher/Abstract.php b/libs/Zend/Controller/Dispatcher/Abstract.php new file mode 100644 index 0000000..1781d51 --- /dev/null +++ b/libs/Zend/Controller/Dispatcher/Abstract.php @@ -0,0 +1,439 @@ +setParams($params); + } + + /** + * Formats a string into a controller name. This is used to take a raw + * controller name, such as one stored inside a Zend_Controller_Request_Abstract + * object, and reformat it to a proper class name that a class extending + * Zend_Controller_Action would use. + * + * @param string $unformatted + * @return string + */ + public function formatControllerName($unformatted) + { + return ucfirst($this->_formatName($unformatted)) . 'Controller'; + } + + /** + * Formats a string into an action name. This is used to take a raw + * action name, such as one that would be stored inside a Zend_Controller_Request_Abstract + * object, and reformat into a proper method name that would be found + * inside a class extending Zend_Controller_Action. + * + * @param string $unformatted + * @return string + */ + public function formatActionName($unformatted) + { + $formatted = $this->_formatName($unformatted, true); + return strtolower(substr($formatted, 0, 1)) . substr($formatted, 1) . 'Action'; + } + + /** + * Verify delimiter + * + * Verify a delimiter to use in controllers or actions. May be a single + * string or an array of strings. + * + * @param string|array $spec + * @return array + * @throws Zend_Controller_Dispatcher_Exception with invalid delimiters + */ + public function _verifyDelimiter($spec) + { + if (is_string($spec)) { + return (array) $spec; + } elseif (is_array($spec)) { + $allStrings = true; + foreach ($spec as $delim) { + if (!is_string($delim)) { + $allStrings = false; + break; + } + } + + if (!$allStrings) { + require_once 'Zend/Controller/Dispatcher/Exception.php'; + throw new Zend_Controller_Dispatcher_Exception('Word delimiter array must contain only strings'); + } + + return $spec; + } + + require_once 'Zend/Controller/Dispatcher/Exception.php'; + throw new Zend_Controller_Dispatcher_Exception('Invalid word delimiter'); + } + + /** + * Retrieve the word delimiter character(s) used in + * controller or action names + * + * @return array + */ + public function getWordDelimiter() + { + return $this->_wordDelimiter; + } + + /** + * Set word delimiter + * + * Set the word delimiter to use in controllers and actions. May be a + * single string or an array of strings. + * + * @param string|array $spec + * @return Zend_Controller_Dispatcher_Abstract + */ + public function setWordDelimiter($spec) + { + $spec = $this->_verifyDelimiter($spec); + $this->_wordDelimiter = $spec; + + return $this; + } + + /** + * Retrieve the path delimiter character(s) used in + * controller names + * + * @return array + */ + public function getPathDelimiter() + { + return $this->_pathDelimiter; + } + + /** + * Set path delimiter + * + * Set the path delimiter to use in controllers. May be a single string or + * an array of strings. + * + * @param string $spec + * @return Zend_Controller_Dispatcher_Abstract + */ + public function setPathDelimiter($spec) + { + if (!is_string($spec)) { + require_once 'Zend/Controller/Dispatcher/Exception.php'; + throw new Zend_Controller_Dispatcher_Exception('Invalid path delimiter'); + } + $this->_pathDelimiter = $spec; + + return $this; + } + + /** + * Formats a string from a URI into a PHP-friendly name. + * + * By default, replaces words separated by the word separator character(s) + * with camelCaps. If $isAction is false, it also preserves replaces words + * separated by the path separation character with an underscore, making + * the following word Title cased. All non-alphanumeric characters are + * removed. + * + * @param string $unformatted + * @param boolean $isAction Defaults to false + * @return string + */ + protected function _formatName($unformatted, $isAction = false) + { + // preserve directories + if (!$isAction) { + $segments = explode($this->getPathDelimiter(), $unformatted); + } else { + $segments = (array) $unformatted; + } + + foreach ($segments as $key => $segment) { + $segment = str_replace($this->getWordDelimiter(), ' ', strtolower($segment)); + $segment = preg_replace('/[^a-z0-9 ]/', '', $segment); + $segments[$key] = str_replace(' ', '', ucwords($segment)); + } + + return implode('_', $segments); + } + + /** + * Retrieve front controller instance + * + * @return Zend_Controller_Front + */ + public function getFrontController() + { + if (null === $this->_frontController) { + require_once 'Zend/Controller/Front.php'; + $this->_frontController = Zend_Controller_Front::getInstance(); + } + + return $this->_frontController; + } + + /** + * Set front controller instance + * + * @param Zend_Controller_Front $controller + * @return Zend_Controller_Dispatcher_Abstract + */ + public function setFrontController(Zend_Controller_Front $controller) + { + $this->_frontController = $controller; + return $this; + } + + /** + * Add or modify a parameter to use when instantiating an action controller + * + * @param string $name + * @param mixed $value + * @return Zend_Controller_Dispatcher_Abstract + */ + public function setParam($name, $value) + { + $name = (string) $name; + $this->_invokeParams[$name] = $value; + return $this; + } + + /** + * Set parameters to pass to action controller constructors + * + * @param array $params + * @return Zend_Controller_Dispatcher_Abstract + */ + public function setParams(array $params) + { + $this->_invokeParams = array_merge($this->_invokeParams, $params); + return $this; + } + + /** + * Retrieve a single parameter from the controller parameter stack + * + * @param string $name + * @return mixed + */ + public function getParam($name) + { + if(isset($this->_invokeParams[$name])) { + return $this->_invokeParams[$name]; + } + + return null; + } + + /** + * Retrieve action controller instantiation parameters + * + * @return array + */ + public function getParams() + { + return $this->_invokeParams; + } + + /** + * Clear the controller parameter stack + * + * By default, clears all parameters. If a parameter name is given, clears + * only that parameter; if an array of parameter names is provided, clears + * each. + * + * @param null|string|array single key or array of keys for params to clear + * @return Zend_Controller_Dispatcher_Abstract + */ + public function clearParams($name = null) + { + if (null === $name) { + $this->_invokeParams = array(); + } elseif (is_string($name) && isset($this->_invokeParams[$name])) { + unset($this->_invokeParams[$name]); + } elseif (is_array($name)) { + foreach ($name as $key) { + if (is_string($key) && isset($this->_invokeParams[$key])) { + unset($this->_invokeParams[$key]); + } + } + } + + return $this; + } + + /** + * Set response object to pass to action controllers + * + * @param Zend_Controller_Response_Abstract|null $response + * @return Zend_Controller_Dispatcher_Abstract + */ + public function setResponse(Zend_Controller_Response_Abstract $response = null) + { + $this->_response = $response; + return $this; + } + + /** + * Return the registered response object + * + * @return Zend_Controller_Response_Abstract|null + */ + public function getResponse() + { + return $this->_response; + } + + /** + * Set the default controller (minus any formatting) + * + * @param string $controller + * @return Zend_Controller_Dispatcher_Abstract + */ + public function setDefaultControllerName($controller) + { + $this->_defaultController = (string) $controller; + return $this; + } + + /** + * Retrieve the default controller name (minus formatting) + * + * @return string + */ + public function getDefaultControllerName() + { + return $this->_defaultController; + } + + /** + * Set the default action (minus any formatting) + * + * @param string $action + * @return Zend_Controller_Dispatcher_Abstract + */ + public function setDefaultAction($action) + { + $this->_defaultAction = (string) $action; + return $this; + } + + /** + * Retrieve the default action name (minus formatting) + * + * @return string + */ + public function getDefaultAction() + { + return $this->_defaultAction; + } + + /** + * Set the default module + * + * @param string $module + * @return Zend_Controller_Dispatcher_Abstract + */ + public function setDefaultModule($module) + { + $this->_defaultModule = (string) $module; + return $this; + } + + /** + * Retrieve the default module + * + * @return string + */ + public function getDefaultModule() + { + return $this->_defaultModule; + } +} diff --git a/libs/Zend/Controller/Dispatcher/Exception.php b/libs/Zend/Controller/Dispatcher/Exception.php new file mode 100644 index 0000000..ff61c71 --- /dev/null +++ b/libs/Zend/Controller/Dispatcher/Exception.php @@ -0,0 +1,36 @@ +_curModule = $this->getDefaultModule(); + } + + /** + * Add a single path to the controller directory stack + * + * @param string $path + * @param string $module + * @return Zend_Controller_Dispatcher_Standard + */ + public function addControllerDirectory($path, $module = null) + { + if (null === $module) { + $module = $this->_defaultModule; + } + + $module = (string) $module; + $path = rtrim((string) $path, '/\\'); + + $this->_controllerDirectory[$module] = $path; + return $this; + } + + /** + * Set controller directory + * + * @param array|string $directory + * @return Zend_Controller_Dispatcher_Standard + */ + public function setControllerDirectory($directory, $module = null) + { + $this->_controllerDirectory = array(); + + if (is_string($directory)) { + $this->addControllerDirectory($directory, $module); + } elseif (is_array($directory)) { + foreach ((array) $directory as $module => $path) { + $this->addControllerDirectory($path, $module); + } + } else { + require_once 'Zend/Controller/Exception.php'; + throw new Zend_Controller_Exception('Controller directory spec must be either a string or an array'); + } + + return $this; + } + + /** + * Return the currently set directories for Zend_Controller_Action class + * lookup + * + * If a module is specified, returns just that directory. + * + * @param string $module Module name + * @return array|string Returns array of all directories by default, single + * module directory if module argument provided + */ + public function getControllerDirectory($module = null) + { + if (null === $module) { + return $this->_controllerDirectory; + } + + $module = (string) $module; + if (array_key_exists($module, $this->_controllerDirectory)) { + return $this->_controllerDirectory[$module]; + } + + return null; + } + + /** + * Remove a controller directory by module name + * + * @param string $module + * @return bool + */ + public function removeControllerDirectory($module) + { + $module = (string) $module; + if (array_key_exists($module, $this->_controllerDirectory)) { + unset($this->_controllerDirectory[$module]); + return true; + } + return false; + } + + /** + * Format the module name. + * + * @param string $unformatted + * @return string + */ + public function formatModuleName($unformatted) + { + if (($this->_defaultModule == $unformatted) && !$this->getParam('prefixDefaultModule')) { + return $unformatted; + } + + return ucfirst($this->_formatName($unformatted)); + } + + /** + * Format action class name + * + * @param string $moduleName Name of the current module + * @param string $className Name of the action class + * @return string Formatted class name + */ + public function formatClassName($moduleName, $className) + { + return $this->formatModuleName($moduleName) . '_' . $className; + } + + /** + * Convert a class name to a filename + * + * @param string $class + * @return string + */ + public function classToFilename($class) + { + return str_replace('_', DIRECTORY_SEPARATOR, $class) . '.php'; + } + + /** + * Returns TRUE if the Zend_Controller_Request_Abstract object can be + * dispatched to a controller. + * + * Use this method wisely. By default, the dispatcher will fall back to the + * default controller (either in the module specified or the global default) + * if a given controller does not exist. This method returning false does + * not necessarily indicate the dispatcher will not still dispatch the call. + * + * @param Zend_Controller_Request_Abstract $action + * @return boolean + */ + public function isDispatchable(Zend_Controller_Request_Abstract $request) + { + $className = $this->getControllerClass($request); + if (!$className) { + return false; + } + + if (class_exists($className, false)) { + return true; + } + + $fileSpec = $this->classToFilename($className); + $dispatchDir = $this->getDispatchDirectory(); + $test = $dispatchDir . DIRECTORY_SEPARATOR . $fileSpec; + return Zend_Loader::isReadable($test); + } + + /** + * Dispatch to a controller/action + * + * By default, if a controller is not dispatchable, dispatch() will throw + * an exception. If you wish to use the default controller instead, set the + * param 'useDefaultControllerAlways' via {@link setParam()}. + * + * @param Zend_Controller_Request_Abstract $request + * @param Zend_Controller_Response_Abstract $response + * @return void + * @throws Zend_Controller_Dispatcher_Exception + */ + public function dispatch(Zend_Controller_Request_Abstract $request, Zend_Controller_Response_Abstract $response) + { + $this->setResponse($response); + + /** + * Get controller class + */ + if (!$this->isDispatchable($request)) { + $controller = $request->getControllerName(); + if (!$this->getParam('useDefaultControllerAlways') && !empty($controller)) { + require_once 'Zend/Controller/Dispatcher/Exception.php'; + throw new Zend_Controller_Dispatcher_Exception('Invalid controller specified (' . $request->getControllerName() . ')'); + } + + $className = $this->getDefaultControllerClass($request); + } else { + $className = $this->getControllerClass($request); + if (!$className) { + $className = $this->getDefaultControllerClass($request); + } + } + + /** + * Load the controller class file + */ + $className = $this->loadClass($className); + + /** + * Instantiate controller with request, response, and invocation + * arguments; throw exception if it's not an action controller + */ + $controller = new $className($request, $this->getResponse(), $this->getParams()); + if (!$controller instanceof Zend_Controller_Action) { + require_once 'Zend/Controller/Dispatcher/Exception.php'; + throw new Zend_Controller_Dispatcher_Exception("Controller '$className' is not an instance of Zend_Controller_Action"); + } + + /** + * Retrieve the action name + */ + $action = $this->getActionMethod($request); + + /** + * Dispatch the method call + */ + $request->setDispatched(true); + + // by default, buffer output + $disableOb = $this->getParam('disableOutputBuffering'); + $obLevel = ob_get_level(); + if (empty($disableOb)) { + ob_start(); + } + + try { + $controller->dispatch($action); + } catch (Exception $e) { + // Clean output buffer on error + $curObLevel = ob_get_level(); + if ($curObLevel > $obLevel) { + do { + ob_get_clean(); + $curObLevel = ob_get_level(); + } while ($curObLevel > $obLevel); + } + + throw $e; + } + + if (empty($disableOb)) { + $content = ob_get_clean(); + $response->appendBody($content); + } + + // Destroy the page controller instance and reflection objects + $controller = null; + } + + /** + * Load a controller class + * + * Attempts to load the controller class file from + * {@link getControllerDirectory()}. If the controller belongs to a + * module, looks for the module prefix to the controller class. + * + * @param string $className + * @return string Class name loaded + * @throws Zend_Controller_Dispatcher_Exception if class not loaded + */ + public function loadClass($className) + { + $finalClass = $className; + if (($this->_defaultModule != $this->_curModule) + || $this->getParam('prefixDefaultModule')) + { + $finalClass = $this->formatClassName($this->_curModule, $className); + } + if (class_exists($finalClass, false)) { + return $finalClass; + } + + $dispatchDir = $this->getDispatchDirectory(); + $loadFile = $dispatchDir . DIRECTORY_SEPARATOR . $this->classToFilename($className); + + if (!include_once $loadFile) { + require_once 'Zend/Controller/Dispatcher/Exception.php'; + throw new Zend_Controller_Dispatcher_Exception('Cannot load controller class "' . $className . '" from file "' . $loadFile . "'"); + } + + if (!class_exists($finalClass, false)) { + require_once 'Zend/Controller/Dispatcher/Exception.php'; + throw new Zend_Controller_Dispatcher_Exception('Invalid controller class ("' . $finalClass . '")'); + } + + return $finalClass; + } + + /** + * Get controller class name + * + * Try request first; if not found, try pulling from request parameter; + * if still not found, fallback to default + * + * @param Zend_Controller_Request_Abstract $request + * @return string|false Returns class name on success + */ + public function getControllerClass(Zend_Controller_Request_Abstract $request) + { + $controllerName = $request->getControllerName(); + if (empty($controllerName)) { + if (!$this->getParam('useDefaultControllerAlways')) { + return false; + } + $controllerName = $this->getDefaultControllerName(); + $request->setControllerName($controllerName); + } + + $className = $this->formatControllerName($controllerName); + + $controllerDirs = $this->getControllerDirectory(); + $module = $request->getModuleName(); + if ($this->isValidModule($module)) { + $this->_curModule = $module; + $this->_curDirectory = $controllerDirs[$module]; + } elseif ($this->isValidModule($this->_defaultModule)) { + $request->setModuleName($this->_defaultModule); + $this->_curModule = $this->_defaultModule; + $this->_curDirectory = $controllerDirs[$this->_defaultModule]; + } else { + require_once 'Zend/Controller/Exception.php'; + throw new Zend_Controller_Exception('No default module defined for this application'); + } + + return $className; + } + + /** + * Determine if a given module is valid + * + * @param string $module + * @return bool + */ + public function isValidModule($module) + { + if (!is_string($module)) { + return false; + } + + $module = strtolower($module); + $controllerDir = $this->getControllerDirectory(); + foreach (array_keys($controllerDir) as $moduleName) { + if ($module == strtolower($moduleName)) { + return true; + } + } + + return false; + } + + /** + * Retrieve default controller class + * + * Determines whether the default controller to use lies within the + * requested module, or if the global default should be used. + * + * By default, will only use the module default unless that controller does + * not exist; if this is the case, it falls back to the default controller + * in the default module. + * + * @param Zend_Controller_Request_Abstract $request + * @return string + */ + public function getDefaultControllerClass(Zend_Controller_Request_Abstract $request) + { + $controller = $this->getDefaultControllerName(); + $default = $this->formatControllerName($controller); + $request->setControllerName($controller) + ->setActionName(null); + + $module = $request->getModuleName(); + $controllerDirs = $this->getControllerDirectory(); + $this->_curModule = $this->_defaultModule; + $this->_curDirectory = $controllerDirs[$this->_defaultModule]; + if ($this->isValidModule($module)) { + $found = false; + if (class_exists($default, false)) { + $found = true; + } else { + $moduleDir = $controllerDirs[$module]; + $fileSpec = $moduleDir . DIRECTORY_SEPARATOR . $this->classToFilename($default); + if (Zend_Loader::isReadable($fileSpec)) { + $found = true; + $this->_curDirectory = $moduleDir; + } + } + if ($found) { + $request->setModuleName($module); + $this->_curModule = $this->formatModuleName($module); + } + } else { + $request->setModuleName($this->_defaultModule); + } + + return $default; + } + + /** + * Return the value of the currently selected dispatch directory (as set by + * {@link getController()}) + * + * @return string + */ + public function getDispatchDirectory() + { + return $this->_curDirectory; + } + + /** + * Determine the action name + * + * First attempt to retrieve from request; then from request params + * using action key; default to default action + * + * Returns formatted action name + * + * @param Zend_Controller_Request_Abstract $request + * @return string + */ + public function getActionMethod(Zend_Controller_Request_Abstract $request) + { + $action = $request->getActionName(); + if (empty($action)) { + $action = $this->getDefaultAction(); + $request->setActionName($action); + } + + return $this->formatActionName($action); + } +} diff --git a/libs/Zend/Controller/Exception.php b/libs/Zend/Controller/Exception.php new file mode 100644 index 0000000..f21ec10 --- /dev/null +++ b/libs/Zend/Controller/Exception.php @@ -0,0 +1,34 @@ +_plugins = new Zend_Controller_Plugin_Broker(); + } + + /** + * Enforce singleton; disallow cloning + * + * @return void + */ + private function __clone() + { + } + + /** + * Singleton instance + * + * @return Zend_Controller_Front + */ + public static function getInstance() + { + if (null === self::$_instance) { + self::$_instance = new self(); + } + + return self::$_instance; + } + + /** + * Resets all object properties of the singleton instance + * + * Primarily used for testing; could be used to chain front controllers. + * + * Also resets action helper broker, clearing all registered helpers. + * + * @return void + */ + public function resetInstance() + { + $reflection = new ReflectionObject($this); + foreach ($reflection->getProperties() as $property) { + $name = $property->getName(); + switch ($name) { + case '_instance': + break; + case '_controllerDir': + case '_invokeParams': + $this->{$name} = array(); + break; + case '_plugins': + $this->{$name} = new Zend_Controller_Plugin_Broker(); + break; + case '_throwExceptions': + case '_returnResponse': + $this->{$name} = false; + break; + case '_moduleControllerDirectoryName': + $this->{$name} = 'controllers'; + break; + default: + $this->{$name} = null; + break; + } + } + Zend_Controller_Action_HelperBroker::resetHelpers(); + } + + /** + * Convenience feature, calls setControllerDirectory()->setRouter()->dispatch() + * + * In PHP 5.1.x, a call to a static method never populates $this -- so run() + * may actually be called after setting up your front controller. + * + * @param string|array $controllerDirectory Path to Zend_Controller_Action + * controller classes or array of such paths + * @return void + * @throws Zend_Controller_Exception if called from an object instance + */ + public static function run($controllerDirectory) + { + self::getInstance() + ->setControllerDirectory($controllerDirectory) + ->dispatch(); + } + + /** + * Add a controller directory to the controller directory stack + * + * If $args is presented and is a string, uses it for the array key mapping + * to the directory specified. + * + * @param string $directory + * @param string $module Optional argument; module with which to associate directory. If none provided, assumes 'default' + * @return Zend_Controller_Front + * @throws Zend_Controller_Exception if directory not found or readable + */ + public function addControllerDirectory($directory, $module = null) + { + $this->getDispatcher()->addControllerDirectory($directory, $module); + return $this; + } + + /** + * Set controller directory + * + * Stores controller directory(ies) in dispatcher. May be an array of + * directories or a string containing a single directory. + * + * @param string|array $directory Path to Zend_Controller_Action controller + * classes or array of such paths + * @param string $module Optional module name to use with string $directory + * @return Zend_Controller_Front + */ + public function setControllerDirectory($directory, $module = null) + { + $this->getDispatcher()->setControllerDirectory($directory, $module); + return $this; + } + + /** + * Retrieve controller directory + * + * Retrieves: + * - Array of all controller directories if no $name passed + * - String path if $name passed and exists as a key in controller directory array + * - null if $name passed but does not exist in controller directory keys + * + * @param string $name Default null + * @return array|string|null + */ + public function getControllerDirectory($name = null) + { + return $this->getDispatcher()->getControllerDirectory($name); + } + + /** + * Remove a controller directory by module name + * + * @param string $module + * @return bool + */ + public function removeControllerDirectory($module) + { + return $this->getDispatcher()->removeControllerDirectory($module); + } + + /** + * Specify a directory as containing modules + * + * Iterates through the directory, adding any subdirectories as modules; + * the subdirectory within each module named after {@link $_moduleControllerDirectoryName} + * will be used as the controller directory path. + * + * @param string $path + * @return Zend_Controller_Front + */ + public function addModuleDirectory($path) + { + try{ + $dir = new DirectoryIterator($path); + }catch(Exception $e){ + throw new Zend_Controller_Exception("Directory $path not readable"); + } + foreach ($dir as $file) { + if ($file->isDot() || !$file->isDir()) { + continue; + } + + $module = $file->getFilename(); + + // Don't use SCCS directories as modules + if (preg_match('/^[^a-z]/i', $module) || ('CVS' == $module)) { + continue; + } + + $moduleDir = $file->getPathname() . DIRECTORY_SEPARATOR . $this->getModuleControllerDirectoryName(); + $this->addControllerDirectory($moduleDir, $module); + } + + return $this; + } + + /** + * Return the path to a module directory (but not the controllers directory within) + * + * @param string $module + * @return string|null + */ + public function getModuleDirectory($module = null) + { + if (null === $module) { + $request = $this->getRequest(); + if (null !== $request) { + $module = $this->getRequest()->getModuleName(); + } + if (empty($module)) { + $module = $this->getDispatcher()->getDefaultModule(); + } + } + + $controllerDir = $this->getControllerDirectory($module); + + if ((null === $controllerDir) || !is_string($controllerDir)) { + return null; + } + + return dirname($controllerDir); + } + + /** + * Set the directory name within a module containing controllers + * + * @param string $name + * @return Zend_Controller_Front + */ + public function setModuleControllerDirectoryName($name = 'controllers') + { + $this->_moduleControllerDirectoryName = (string) $name; + + return $this; + } + + /** + * Return the directory name within a module containing controllers + * + * @return string + */ + public function getModuleControllerDirectoryName() + { + return $this->_moduleControllerDirectoryName; + } + + /** + * Set the default controller (unformatted string) + * + * @param string $controller + * @return Zend_Controller_Front + */ + public function setDefaultControllerName($controller) + { + $dispatcher = $this->getDispatcher(); + $dispatcher->setDefaultControllerName($controller); + return $this; + } + + /** + * Retrieve the default controller (unformatted string) + * + * @return string + */ + public function getDefaultControllerName() + { + return $this->getDispatcher()->getDefaultControllerName(); + } + + /** + * Set the default action (unformatted string) + * + * @param string $action + * @return Zend_Controller_Front + */ + public function setDefaultAction($action) + { + $dispatcher = $this->getDispatcher(); + $dispatcher->setDefaultAction($action); + return $this; + } + + /** + * Retrieve the default action (unformatted string) + * + * @return string + */ + public function getDefaultAction() + { + return $this->getDispatcher()->getDefaultAction(); + } + + /** + * Set the default module name + * + * @param string $module + * @return Zend_Controller_Front + */ + public function setDefaultModule($module) + { + $dispatcher = $this->getDispatcher(); + $dispatcher->setDefaultModule($module); + return $this; + } + + /** + * Retrieve the default module + * + * @return string + */ + public function getDefaultModule() + { + return $this->getDispatcher()->getDefaultModule(); + } + + /** + * Set request class/object + * + * Set the request object. The request holds the request environment. + * + * If a class name is provided, it will instantiate it + * + * @param string|Zend_Controller_Request_Abstract $request + * @throws Zend_Controller_Exception if invalid request class + * @return Zend_Controller_Front + */ + public function setRequest($request) + { + if (is_string($request)) { + Zend_Loader::loadClass($request); + $request = new $request(); + } + if (!$request instanceof Zend_Controller_Request_Abstract) { + throw new Zend_Controller_Exception('Invalid request class'); + } + + $this->_request = $request; + + return $this; + } + + /** + * Return the request object. + * + * @return null|Zend_Controller_Request_Abstract + */ + public function getRequest() + { + return $this->_request; + } + + /** + * Set router class/object + * + * Set the router object. The router is responsible for mapping + * the request to a controller and action. + * + * If a class name is provided, instantiates router with any parameters + * registered via {@link setParam()} or {@link setParams()}. + * + * @param string|Zend_Controller_Router_Interface $router + * @throws Zend_Controller_Exception if invalid router class + * @return Zend_Controller_Front + */ + public function setRouter($router) + { + if (is_string($router)) { + Zend_Loader::loadClass($router); + $router = new $router(); + } + + if (!$router instanceof Zend_Controller_Router_Interface) { + throw new Zend_Controller_Exception('Invalid router class'); + } + + $router->setFrontController($this); + $this->_router = $router; + + return $this; + } + + /** + * Return the router object. + * + * Instantiates a Zend_Controller_Router_Rewrite object if no router currently set. + * + * @return Zend_Controller_Router_Interface + */ + public function getRouter() + { + if (null == $this->_router) { + require_once 'Zend/Controller/Router/Rewrite.php'; + $this->setRouter(new Zend_Controller_Router_Rewrite()); + } + + return $this->_router; + } + + /** + * Set the base URL used for requests + * + * Use to set the base URL segment of the REQUEST_URI to use when + * determining PATH_INFO, etc. Examples: + * - /admin + * - /myapp + * - /subdir/index.php + * + * Note that the URL should not include the full URI. Do not use: + * - http://example.com/admin + * - http://example.com/myapp + * - http://example.com/subdir/index.php + * + * If a null value is passed, this can be used as well for autodiscovery (default). + * + * @param string $base + * @return Zend_Controller_Front + * @throws Zend_Controller_Exception for non-string $base + */ + public function setBaseUrl($base = null) + { + if (!is_string($base) && (null !== $base)) { + throw new Zend_Controller_Exception('Rewrite base must be a string'); + } + + $this->_baseUrl = $base; + + if ((null !== ($request = $this->getRequest())) && (method_exists($request, 'setBaseUrl'))) { + $request->setBaseUrl($base); + } + + return $this; + } + + /** + * Retrieve the currently set base URL + * + * @return string + */ + public function getBaseUrl() + { + $request = $this->getRequest(); + if ((null !== $request) && method_exists($request, 'getBaseUrl')) { + return $request->getBaseUrl(); + } + + return $this->_baseUrl; + } + + /** + * Set the dispatcher object. The dispatcher is responsible for + * taking a Zend_Controller_Dispatcher_Token object, instantiating the controller, and + * call the action method of the controller. + * + * @param Zend_Controller_Dispatcher_Interface $dispatcher + * @return Zend_Controller_Front + */ + public function setDispatcher(Zend_Controller_Dispatcher_Interface $dispatcher) + { + $this->_dispatcher = $dispatcher; + return $this; + } + + /** + * Return the dispatcher object. + * + * @return Zend_Controller_Dispatcher_Interface + */ + public function getDispatcher() + { + /** + * Instantiate the default dispatcher if one was not set. + */ + if (!$this->_dispatcher instanceof Zend_Controller_Dispatcher_Interface) { + require_once 'Zend/Controller/Dispatcher/Standard.php'; + $this->_dispatcher = new Zend_Controller_Dispatcher_Standard(); + } + return $this->_dispatcher; + } + + /** + * Set response class/object + * + * Set the response object. The response is a container for action + * responses and headers. Usage is optional. + * + * If a class name is provided, instantiates a response object. + * + * @param string|Zend_Controller_Response_Abstract $response + * @throws Zend_Controller_Exception if invalid response class + * @return Zend_Controller_Front + */ + public function setResponse($response) + { + if (is_string($response)) { + Zend_Loader::loadClass($response); + $response = new $response(); + } + if (!$response instanceof Zend_Controller_Response_Abstract) { + throw new Zend_Controller_Exception('Invalid response class'); + } + + $this->_response = $response; + + return $this; + } + + /** + * Return the response object. + * + * @return null|Zend_Controller_Response_Abstract + */ + public function getResponse() + { + return $this->_response; + } + + /** + * Add or modify a parameter to use when instantiating an action controller + * + * @param string $name + * @param mixed $value + * @return Zend_Controller_Front + */ + public function setParam($name, $value) + { + $name = (string) $name; + $this->_invokeParams[$name] = $value; + return $this; + } + + /** + * Set parameters to pass to action controller constructors + * + * @param array $params + * @return Zend_Controller_Front + */ + public function setParams(array $params) + { + $this->_invokeParams = array_merge($this->_invokeParams, $params); + return $this; + } + + /** + * Retrieve a single parameter from the controller parameter stack + * + * @param string $name + * @return mixed + */ + public function getParam($name) + { + if(isset($this->_invokeParams[$name])) { + return $this->_invokeParams[$name]; + } + + return null; + } + + /** + * Retrieve action controller instantiation parameters + * + * @return array + */ + public function getParams() + { + return $this->_invokeParams; + } + + /** + * Clear the controller parameter stack + * + * By default, clears all parameters. If a parameter name is given, clears + * only that parameter; if an array of parameter names is provided, clears + * each. + * + * @param null|string|array single key or array of keys for params to clear + * @return Zend_Controller_Front + */ + public function clearParams($name = null) + { + if (null === $name) { + $this->_invokeParams = array(); + } elseif (is_string($name) && isset($this->_invokeParams[$name])) { + unset($this->_invokeParams[$name]); + } elseif (is_array($name)) { + foreach ($name as $key) { + if (is_string($key) && isset($this->_invokeParams[$key])) { + unset($this->_invokeParams[$key]); + } + } + } + + return $this; + } + + /** + * Register a plugin. + * + * @param Zend_Controller_Plugin_Abstract $plugin + * @param int $stackIndex Optional; stack index for plugin + * @return Zend_Controller_Front + */ + public function registerPlugin(Zend_Controller_Plugin_Abstract $plugin, $stackIndex = null) + { + $this->_plugins->registerPlugin($plugin, $stackIndex); + return $this; + } + + /** + * Unregister a plugin. + * + * @param string|Zend_Controller_Plugin_Abstract $plugin Plugin class or object to unregister + * @return Zend_Controller_Front + */ + public function unregisterPlugin($plugin) + { + $this->_plugins->unregisterPlugin($plugin); + return $this; + } + + /** + * Is a particular plugin registered? + * + * @param string $class + * @return bool + */ + public function hasPlugin($class) + { + return $this->_plugins->hasPlugin($class); + } + + /** + * Retrieve a plugin or plugins by class + * + * @param string $class + * @return false|Zend_Controller_Plugin_Abstract|array + */ + public function getPlugin($class) + { + return $this->_plugins->getPlugin($class); + } + + /** + * Retrieve all plugins + * + * @return array + */ + public function getPlugins() + { + return $this->_plugins->getPlugins(); + } + + /** + * Set the throwExceptions flag and retrieve current status + * + * Set whether exceptions encounted in the dispatch loop should be thrown + * or caught and trapped in the response object. + * + * Default behaviour is to trap them in the response object; call this + * method to have them thrown. + * + * Passing no value will return the current value of the flag; passing a + * boolean true or false value will set the flag and return the current + * object instance. + * + * @param boolean $flag Defaults to null (return flag state) + * @return boolean|Zend_Controller_Front Used as a setter, returns object; as a getter, returns boolean + */ + public function throwExceptions($flag = null) + { + if ($flag !== null) { + $this->_throwExceptions = (bool) $flag; + return $this; + } + + return $this->_throwExceptions; + } + + /** + * Set whether {@link dispatch()} should return the response without first + * rendering output. By default, output is rendered and dispatch() returns + * nothing. + * + * @param boolean $flag + * @return boolean|Zend_Controller_Front Used as a setter, returns object; as a getter, returns boolean + */ + public function returnResponse($flag = null) + { + if (true === $flag) { + $this->_returnResponse = true; + return $this; + } elseif (false === $flag) { + $this->_returnResponse = false; + return $this; + } + + return $this->_returnResponse; + } + + /** + * Dispatch an HTTP request to a controller/action. + * + * @param Zend_Controller_Request_Abstract|null $request + * @param Zend_Controller_Response_Abstract|null $response + * @return void|Zend_Controller_Response_Abstract Returns response object if returnResponse() is true + */ + public function dispatch(Zend_Controller_Request_Abstract $request = null, Zend_Controller_Response_Abstract $response = null) + { + if (!$this->getParam('noErrorHandler') && !$this->_plugins->hasPlugin('Zend_Controller_Plugin_ErrorHandler')) { + // Register with stack index of 100 + require_once 'Zend/Controller/Plugin/ErrorHandler.php'; + $this->_plugins->registerPlugin(new Zend_Controller_Plugin_ErrorHandler(), 100); + } + + if (!$this->getParam('noViewRenderer') && !Zend_Controller_Action_HelperBroker::hasHelper('viewRenderer')) { + require_once 'Zend/Controller/Action/Helper/ViewRenderer.php'; + Zend_Controller_Action_HelperBroker::getStack()->offsetSet(-80, new Zend_Controller_Action_Helper_ViewRenderer()); + } + + /** + * Instantiate default request object (HTTP version) if none provided + */ + if (null !== $request) { + $this->setRequest($request); + } elseif ((null === $request) && (null === ($request = $this->getRequest()))) { + require_once 'Zend/Controller/Request/Http.php'; + $request = new Zend_Controller_Request_Http(); + $this->setRequest($request); + } + + /** + * Set base URL of request object, if available + */ + if (is_callable(array($this->_request, 'setBaseUrl'))) { + if (null !== $this->_baseUrl) { + $this->_request->setBaseUrl($this->_baseUrl); + } + } + + /** + * Instantiate default response object (HTTP version) if none provided + */ + if (null !== $response) { + $this->setResponse($response); + } elseif ((null === $this->_response) && (null === ($this->_response = $this->getResponse()))) { + require_once 'Zend/Controller/Response/Http.php'; + $response = new Zend_Controller_Response_Http(); + $this->setResponse($response); + } + + /** + * Register request and response objects with plugin broker + */ + $this->_plugins + ->setRequest($this->_request) + ->setResponse($this->_response); + + /** + * Initialize router + */ + $router = $this->getRouter(); + $router->setParams($this->getParams()); + + /** + * Initialize dispatcher + */ + $dispatcher = $this->getDispatcher(); + $dispatcher->setParams($this->getParams()) + ->setResponse($this->_response); + + // Begin dispatch + try { + /** + * Route request to controller/action, if a router is provided + */ + + /** + * Notify plugins of router startup + */ + $this->_plugins->routeStartup($this->_request); + + $router->route($this->_request); + + /** + * Notify plugins of router completion + */ + $this->_plugins->routeShutdown($this->_request); + + /** + * Notify plugins of dispatch loop startup + */ + $this->_plugins->dispatchLoopStartup($this->_request); + + /** + * Attempt to dispatch the controller/action. If the $this->_request + * indicates that it needs to be dispatched, move to the next + * action in the request. + */ + do { + $this->_request->setDispatched(true); + + /** + * Notify plugins of dispatch startup + */ + $this->_plugins->preDispatch($this->_request); + + /** + * Skip requested action if preDispatch() has reset it + */ + if (!$this->_request->isDispatched()) { + continue; + } + + /** + * Dispatch request + */ + try { + $dispatcher->dispatch($this->_request, $this->_response); + } catch (Exception $e) { + if ($this->throwExceptions()) { + throw $e; + } + $this->_response->setException($e); + } + + /** + * Notify plugins of dispatch completion + */ + $this->_plugins->postDispatch($this->_request); + } while (!$this->_request->isDispatched()); + } catch (Exception $e) { + if ($this->throwExceptions()) { + throw $e; + } + + $this->_response->setException($e); + } + + /** + * Notify plugins of dispatch loop completion + */ + try { + $this->_plugins->dispatchLoopShutdown(); + } catch (Exception $e) { + if ($this->throwExceptions()) { + throw $e; + } + + $this->_response->setException($e); + } + + if ($this->returnResponse()) { + return $this->_response; + } + + $this->_response->sendResponse(); + } +} diff --git a/libs/Zend/Controller/Plugin/Abstract.php b/libs/Zend/Controller/Plugin/Abstract.php new file mode 100644 index 0000000..87601fc --- /dev/null +++ b/libs/Zend/Controller/Plugin/Abstract.php @@ -0,0 +1,150 @@ +_request = $request; + return $this; + } + + /** + * Get request object + * + * @return Zend_Controller_Request_Abstract $request + */ + public function getRequest() + { + return $this->_request; + } + + /** + * Set response object + * + * @param Zend_Controller_Response_Abstract $response + * @return Zend_Controller_Plugin_Abstract + */ + public function setResponse(Zend_Controller_Response_Abstract $response) + { + $this->_response = $response; + return $this; + } + + /** + * Get response object + * + * @return Zend_Controller_Response_Abstract $response + */ + public function getResponse() + { + return $this->_response; + } + + /** + * Called before Zend_Controller_Front begins evaluating the + * request against its routes. + * + * @param Zend_Controller_Request_Abstract $request + * @return void + */ + public function routeStartup(Zend_Controller_Request_Abstract $request) + {} + + /** + * Called after Zend_Controller_Router exits. + * + * Called after Zend_Controller_Front exits from the router. + * + * @param Zend_Controller_Request_Abstract $request + * @return void + */ + public function routeShutdown(Zend_Controller_Request_Abstract $request) + {} + + /** + * Called before Zend_Controller_Front enters its dispatch loop. + * + * @param Zend_Controller_Request_Abstract $request + * @return void + */ + public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request) + {} + + /** + * Called before an action is dispatched by Zend_Controller_Dispatcher. + * + * This callback allows for proxy or filter behavior. By altering the + * request and resetting its dispatched flag (via + * {@link Zend_Controller_Request_Abstract::setDispatched() setDispatched(false)}), + * the current action may be skipped. + * + * @param Zend_Controller_Request_Abstract $request + * @return void + */ + public function preDispatch(Zend_Controller_Request_Abstract $request) + {} + + /** + * Called after an action is dispatched by Zend_Controller_Dispatcher. + * + * This callback allows for proxy or filter behavior. By altering the + * request and resetting its dispatched flag (via + * {@link Zend_Controller_Request_Abstract::setDispatched() setDispatched(false)}), + * a new action may be specified for dispatching. + * + * @param Zend_Controller_Request_Abstract $request + * @return void + */ + public function postDispatch(Zend_Controller_Request_Abstract $request) + {} + + /** + * Called before Zend_Controller_Front exits its dispatch loop. + * + * @return void + */ + public function dispatchLoopShutdown() + {} +} diff --git a/libs/Zend/Controller/Plugin/ActionStack.php b/libs/Zend/Controller/Plugin/ActionStack.php new file mode 100644 index 0000000..b30a6ab --- /dev/null +++ b/libs/Zend/Controller/Plugin/ActionStack.php @@ -0,0 +1,245 @@ +setRegistry($registry); + + if (null !== $key) { + $this->setRegistryKey($key); + } else { + $key = $this->getRegistryKey(); + } + + $registry[$key] = array(); + } + + /** + * Set registry object + * + * @param Zend_Registry $registry + * @return Zend_Controller_Plugin_ActionStack + */ + public function setRegistry(Zend_Registry $registry) + { + $this->_registry = $registry; + return $this; + } + + /** + * Retrieve registry object + * + * @return Zend_Registry + */ + public function getRegistry() + { + return $this->_registry; + } + + /** + * Retrieve registry key + * + * @return string + */ + public function getRegistryKey() + { + return $this->_registryKey; + } + + /** + * Set registry key + * + * @param string $key + * @return Zend_Controller_Plugin_ActionStack + */ + public function setRegistryKey($key) + { + $this->_registryKey = (string) $key; + return $this; + } + + /** + * Retrieve action stack + * + * @return array + */ + public function getStack() + { + $registry = $this->getRegistry(); + $stack = $registry[$this->getRegistryKey()]; + return $stack; + } + + /** + * Save stack to registry + * + * @param array $stack + * @return Zend_Controller_Plugin_ActionStack + */ + protected function _saveStack(array $stack) + { + $registry = $this->getRegistry(); + $registry[$this->getRegistryKey()] = $stack; + return $this; + } + + /** + * Push an item onto the stack + * + * @param Zend_Controller_Request_Abstract $next + * @return Zend_Controller_Plugin_ActionStack + */ + public function pushStack(Zend_Controller_Request_Abstract $next) + { + $stack = $this->getStack(); + array_push($stack, $next); + return $this->_saveStack($stack); + } + + /** + * Pop an item off the action stack + * + * @return false|Zend_Controller_Request_Abstract + */ + public function popStack() + { + $stack = $this->getStack(); + if (0 == count($stack)) { + return false; + } + + $next = array_pop($stack); + $this->_saveStack($stack); + + if (!$next instanceof Zend_Controller_Request_Abstract) { + require_once 'Zend/Controller/Exception.php'; + throw new Zend_Controller_Exception('ArrayStack should only contain request objects'); + } + $action = $next->getActionName(); + if (empty($action)) { + return $this->popStack($stack); + } + + $request = $this->getRequest(); + $controller = $next->getControllerName(); + if (empty($controller)) { + $next->setControllerName($request->getControllerName()); + } + + $module = $next->getModuleName(); + if (empty($module)) { + $next->setModuleName($request->getModuleName()); + } + + return $next; + } + + /** + * postDispatch() plugin hook -- check for actions in stack, and dispatch if any found + * + * @param Zend_Controller_Request_Abstract $request + * @return void + */ + public function postDispatch(Zend_Controller_Request_Abstract $request) + { + // Don't move on to next request if this is already an attempt to + // forward + if (!$request->isDispatched()) { + return; + } + + $this->setRequest($request); + $stack = $this->getStack(); + if (empty($stack)) { + return; + } + $next = $this->popStack(); + if (!$next) { + return; + } + + $this->forward($next); + } + + /** + * Forward request with next action + * + * @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); + } +} diff --git a/libs/Zend/Controller/Plugin/Broker.php b/libs/Zend/Controller/Plugin/Broker.php new file mode 100644 index 0000000..054cf77 --- /dev/null +++ b/libs/Zend/Controller/Plugin/Broker.php @@ -0,0 +1,363 @@ +_plugins, true)) { + throw new Zend_Controller_Exception('Plugin already registered'); + } + + $stackIndex = (int) $stackIndex; + + if ($stackIndex) { + if (isset($this->_plugins[$stackIndex])) { + throw new Zend_Controller_Exception('Plugin with stackIndex "' . $stackIndex . '" already registered'); + } + $this->_plugins[$stackIndex] = $plugin; + } else { + $stackIndex = count($this->_plugins); + while (isset($this->_plugins[$stackIndex])) { + ++$stackIndex; + } + $this->_plugins[$stackIndex] = $plugin; + } + + $request = $this->getRequest(); + if ($request) { + $this->_plugins[$stackIndex]->setRequest($request); + } + $response = $this->getResponse(); + if ($response) { + $this->_plugins[$stackIndex]->setResponse($response); + } + + ksort($this->_plugins); + + return $this; + } + + /** + * Unregister a plugin. + * + * @param string|Zend_Controller_Plugin_Abstract $plugin Plugin object or class name + * @return Zend_Controller_Plugin_Broker + */ + public function unregisterPlugin($plugin) + { + if ($plugin instanceof Zend_Controller_Plugin_Abstract) { + // Given a plugin object, find it in the array + $key = array_search($plugin, $this->_plugins, true); + if (false === $key) { + throw new Zend_Controller_Exception('Plugin never registered.'); + } + unset($this->_plugins[$key]); + } elseif (is_string($plugin)) { + // Given a plugin class, find all plugins of that class and unset them + foreach ($this->_plugins as $key => $_plugin) { + $type = get_class($_plugin); + if ($plugin == $type) { + unset($this->_plugins[$key]); + } + } + } + return $this; + } + + /** + * Is a plugin of a particular class registered? + * + * @param string $class + * @return bool + */ + public function hasPlugin($class) + { + foreach ($this->_plugins as $plugin) { + $type = get_class($plugin); + if ($class == $type) { + return true; + } + } + + return false; + } + + /** + * Retrieve a plugin or plugins by class + * + * @param string $class Class name of plugin(s) desired + * @return false|Zend_Controller_Plugin_Abstract|array Returns false if none found, plugin if only one found, and array of plugins if multiple plugins of same class found + */ + public function getPlugin($class) + { + $found = array(); + foreach ($this->_plugins as $plugin) { + $type = get_class($plugin); + if ($class == $type) { + $found[] = $plugin; + } + } + + switch (count($found)) { + case 0: + return false; + case 1: + return $found[0]; + default: + return $found; + } + } + + /** + * Retrieve all plugins + * + * @return array + */ + public function getPlugins() + { + return $this->_plugins; + } + + /** + * Set request object, and register with each plugin + * + * @param Zend_Controller_Request_Abstract $request + * @return Zend_Controller_Plugin_Broker + */ + public function setRequest(Zend_Controller_Request_Abstract $request) + { + $this->_request = $request; + + foreach ($this->_plugins as $plugin) { + $plugin->setRequest($request); + } + + return $this; + } + + /** + * Get request object + * + * @return Zend_Controller_Request_Abstract $request + */ + public function getRequest() + { + return $this->_request; + } + + /** + * Set response object + * + * @param Zend_Controller_Response_Abstract $response + * @return Zend_Controller_Plugin_Broker + */ + public function setResponse(Zend_Controller_Response_Abstract $response) + { + $this->_response = $response; + + foreach ($this->_plugins as $plugin) { + $plugin->setResponse($response); + } + + + return $this; + } + + /** + * Get response object + * + * @return Zend_Controller_Response_Abstract $response + */ + public function getResponse() + { + return $this->_response; + } + + + /** + * Called before Zend_Controller_Front begins evaluating the + * request against its routes. + * + * @param Zend_Controller_Request_Abstract $request + * @return void + */ + public function routeStartup(Zend_Controller_Request_Abstract $request) + { + foreach ($this->_plugins as $plugin) { + try { + $plugin->routeStartup($request); + } catch (Exception $e) { + if (Zend_Controller_Front::getInstance()->throwExceptions()) { + throw $e; + } else { + $this->getResponse()->setException($e); + } + } + } + } + + + /** + * Called before Zend_Controller_Front exits its iterations over + * the route set. + * + * @param Zend_Controller_Request_Abstract $request + * @return void + */ + public function routeShutdown(Zend_Controller_Request_Abstract $request) + { + foreach ($this->_plugins as $plugin) { + try { + $plugin->routeShutdown($request); + } catch (Exception $e) { + if (Zend_Controller_Front::getInstance()->throwExceptions()) { + throw $e; + } else { + $this->getResponse()->setException($e); + } + } + } + } + + + /** + * Called before Zend_Controller_Front enters its dispatch loop. + * + * During the dispatch loop, Zend_Controller_Front keeps a + * Zend_Controller_Request_Abstract object, and uses + * Zend_Controller_Dispatcher to dispatch the + * Zend_Controller_Request_Abstract object to controllers/actions. + * + * @param Zend_Controller_Request_Abstract $request + * @return void + */ + public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request) + { + foreach ($this->_plugins as $plugin) { + try { + $plugin->dispatchLoopStartup($request); + } catch (Exception $e) { + if (Zend_Controller_Front::getInstance()->throwExceptions()) { + throw $e; + } else { + $this->getResponse()->setException($e); + } + } + } + } + + + /** + * Called before an action is dispatched by Zend_Controller_Dispatcher. + * + * @param Zend_Controller_Request_Abstract $request + * @return void + */ + public function preDispatch(Zend_Controller_Request_Abstract $request) + { + foreach ($this->_plugins as $plugin) { + try { + $plugin->preDispatch($request); + } catch (Exception $e) { + if (Zend_Controller_Front::getInstance()->throwExceptions()) { + throw $e; + } else { + $this->getResponse()->setException($e); + } + } + } + } + + + /** + * Called after an action is dispatched by Zend_Controller_Dispatcher. + * + * @param Zend_Controller_Request_Abstract $request + * @return void + */ + public function postDispatch(Zend_Controller_Request_Abstract $request) + { + foreach ($this->_plugins as $plugin) { + try { + $plugin->postDispatch($request); + } catch (Exception $e) { + if (Zend_Controller_Front::getInstance()->throwExceptions()) { + throw $e; + } else { + $this->getResponse()->setException($e); + } + } + } + } + + + /** + * Called before Zend_Controller_Front exits its dispatch loop. + * + * @param Zend_Controller_Request_Abstract $request + * @return void + */ + public function dispatchLoopShutdown() + { + foreach ($this->_plugins as $plugin) { + try { + $plugin->dispatchLoopShutdown(); + } catch (Exception $e) { + if (Zend_Controller_Front::getInstance()->throwExceptions()) { + throw $e; + } else { + $this->getResponse()->setException($e); + } + } + } + } +} diff --git a/libs/Zend/Controller/Plugin/ErrorHandler.php b/libs/Zend/Controller/Plugin/ErrorHandler.php new file mode 100644 index 0000000..9c67f0e --- /dev/null +++ b/libs/Zend/Controller/Plugin/ErrorHandler.php @@ -0,0 +1,257 @@ +setErrorHandler($options); + } + + /** + * setErrorHandler() - setup the error handling options + * + * @param array $options + * @return Zend_Controller_Plugin_ErrorHandler + */ + public function setErrorHandler(Array $options = array()) + { + if (isset($options['module'])) { + $this->setErrorHandlerModule($options['module']); + } + if (isset($options['controller'])) { + $this->setErrorHandlerController($options['controller']); + } + if (isset($options['action'])) { + $this->setErrorHandlerAction($options['action']); + } + return $this; + } + + /** + * Set the module name for the error handler + * + * @param string $module + * @return Zend_Controller_Plugin_ErrorHandler + */ + public function setErrorHandlerModule($module) + { + $this->_errorModule = (string) $module; + return $this; + } + + /** + * Retrieve the current error handler module + * + * @return string + */ + public function getErrorHandlerModule() + { + if (null === $this->_errorModule) { + $this->_errorModule = Zend_Controller_Front::getInstance()->getDispatcher()->getDefaultModule(); + } + return $this->_errorModule; + } + + /** + * Set the controller name for the error handler + * + * @param string $controller + * @return Zend_Controller_Plugin_ErrorHandler + */ + public function setErrorHandlerController($controller) + { + $this->_errorController = (string) $controller; + return $this; + } + + /** + * Retrieve the current error handler controller + * + * @return string + */ + public function getErrorHandlerController() + { + return $this->_errorController; + } + + /** + * Set the action name for the error handler + * + * @param string $action + * @return Zend_Controller_Plugin_ErrorHandler + */ + public function setErrorHandlerAction($action) + { + $this->_errorAction = (string) $action; + return $this; + } + + /** + * Retrieve the current error handler action + * + * @return string + */ + public function getErrorHandlerAction() + { + return $this->_errorAction; + } + + /** + * postDispatch() plugin hook -- check for exceptions and dispatch error + * handler if necessary + * + * If the 'noErrorHandler' front controller flag has been set, + * returns early. + * + * @param Zend_Controller_Request_Abstract $request + * @return void + */ + public function postDispatch(Zend_Controller_Request_Abstract $request) + { + $frontController = Zend_Controller_Front::getInstance(); + if ($frontController->getParam('noErrorHandler')) { + return; + } + + $response = $this->getResponse(); + + if ($this->_isInsideErrorHandlerLoop) { + $exceptions = $response->getException(); + if (count($exceptions) > $this->_exceptionCountAtFirstEncounter) { + // Exception thrown by error handler; tell the front controller to throw it + $frontController->throwExceptions(true); + throw array_pop($exceptions); + } + } + + // check for an exception AND allow the error handler controller the option to forward + if (($response->isException()) && (!$this->_isInsideErrorHandlerLoop)) { + $this->_isInsideErrorHandlerLoop = true; + + // Get exception information + $error = new ArrayObject(array(), ArrayObject::ARRAY_AS_PROPS); + $exceptions = $response->getException(); + $exception = $exceptions[0]; + $exceptionType = get_class($exception); + $error->exception = $exception; + switch ($exceptionType) { + case 'Zend_Controller_Dispatcher_Exception': + $error->type = self::EXCEPTION_NO_CONTROLLER; + break; + case 'Zend_Controller_Action_Exception': + if (404 == $exception->getCode()) { + $error->type = self::EXCEPTION_NO_ACTION; + } else { + $error->type = self::EXCEPTION_OTHER; + } + break; + default: + $error->type = self::EXCEPTION_OTHER; + break; + } + + // Keep a copy of the original request + $error->request = clone $request; + + // get a count of the number of exceptions encountered + $this->_exceptionCountAtFirstEncounter = count($exceptions); + + // Forward to the error handler + $request->setParam('error_handler', $error) + ->setModuleName($this->getErrorHandlerModule()) + ->setControllerName($this->getErrorHandlerController()) + ->setActionName($this->getErrorHandlerAction()) + ->setDispatched(false); + } + } +} diff --git a/libs/Zend/Controller/Request/Abstract.php b/libs/Zend/Controller/Request/Abstract.php new file mode 100644 index 0000000..a39b39b --- /dev/null +++ b/libs/Zend/Controller/Request/Abstract.php @@ -0,0 +1,338 @@ +_module) { + $this->_module = $this->getParam($this->getModuleKey()); + } + + return $this->_module; + } + + /** + * Set the module name to use + * + * @param string $value + * @return Zend_Controller_Request_Abstract + */ + public function setModuleName($value) + { + $this->_module = $value; + return $this; + } + + /** + * Retrieve the controller name + * + * @return string + */ + public function getControllerName() + { + if (null === $this->_controller) { + $this->_controller = $this->getParam($this->getControllerKey()); + } + + return $this->_controller; + } + + /** + * Set the controller name to use + * + * @param string $value + * @return Zend_Controller_Request_Abstract + */ + public function setControllerName($value) + { + $this->_controller = $value; + return $this; + } + + /** + * Retrieve the action name + * + * @return string + */ + public function getActionName() + { + if (null === $this->_action) { + $this->_action = $this->getParam($this->getActionKey()); + } + + return $this->_action; + } + + /** + * Set the action name + * + * @param string $value + * @return Zend_Controller_Request_Abstract + */ + public function setActionName($value) + { + $this->_action = $value; + return $this; + } + + /** + * Retrieve the module key + * + * @return string + */ + public function getModuleKey() + { + return $this->_moduleKey; + } + + /** + * Set the module key + * + * @param string $key + * @return Zend_Controller_Request_Abstract + */ + public function setModuleKey($key) + { + $this->_moduleKey = (string) $key; + return $this; + } + + /** + * Retrieve the controller key + * + * @return string + */ + public function getControllerKey() + { + return $this->_controllerKey; + } + + /** + * Set the controller key + * + * @param string $key + * @return Zend_Controller_Request_Abstract + */ + public function setControllerKey($key) + { + $this->_controllerKey = (string) $key; + return $this; + } + + /** + * Retrieve the action key + * + * @return string + */ + public function getActionKey() + { + return $this->_actionKey; + } + + /** + * Set the action key + * + * @param string $key + * @return Zend_Controller_Request_Abstract + */ + public function setActionKey($key) + { + $this->_actionKey = (string) $key; + return $this; + } + + /** + * Get an action parameter + * + * @param string $key + * @param mixed $default Default value to use if key not found + * @return mixed + */ + public function getParam($key, $default = null) + { + $key = (string) $key; + if (isset($this->_params[$key])) { + return $this->_params[$key]; + } + + return $default; + } + + /** + * Retrieve only user params (i.e, any param specific to the object and not the environment) + * + * @return array + */ + public function getUserParams() + { + return $this->_params; + } + + /** + * Retrieve a single user param (i.e, a param specific to the object and not the environment) + * + * @param string $key + * @param string $default Default value to use if key not found + * @return mixed + */ + public function getUserParam($key, $default = null) + { + if (isset($this->_params[$key])) { + return $this->_params[$key]; + } + + return $default; + } + + /** + * Set an action parameter + * + * A $value of null will unset the $key if it exists + * + * @param string $key + * @param mixed $value + * @return Zend_Controller_Request_Abstract + */ + public function setParam($key, $value) + { + $key = (string) $key; + + if ((null === $value) && isset($this->_params[$key])) { + unset($this->_params[$key]); + } elseif (null !== $value) { + $this->_params[$key] = $value; + } + + return $this; + } + + /** + * Get all action parameters + * + * @return array + */ + public function getParams() + { + return $this->_params; + } + + /** + * Set action parameters en masse; does not overwrite + * + * Null values will unset the associated key. + * + * @param array $array + * @return Zend_Controller_Request_Abstract + */ + public function setParams(array $array) + { + $this->_params = $this->_params + (array) $array; + + foreach ($this->_params as $key => $value) { + if (null === $value) { + unset($this->_params[$key]); + } + } + + return $this; + } + + /** + * Set flag indicating whether or not request has been dispatched + * + * @param boolean $flag + * @return Zend_Controller_Request_Abstract + */ + public function setDispatched($flag = true) + { + $this->_dispatched = $flag ? true : false; + return $this; + } + + /** + * Determine if the request has been dispatched + * + * @return boolean + */ + public function isDispatched() + { + return $this->_dispatched; + } +} diff --git a/libs/Zend/Controller/Request/Apache404.php b/libs/Zend/Controller/Request/Apache404.php new file mode 100644 index 0000000..3df0b31 --- /dev/null +++ b/libs/Zend/Controller/Request/Apache404.php @@ -0,0 +1,84 @@ +_requestUri = $requestUri; + return $this; + } +} diff --git a/libs/Zend/Controller/Request/Exception.php b/libs/Zend/Controller/Request/Exception.php new file mode 100644 index 0000000..e9648cf --- /dev/null +++ b/libs/Zend/Controller/Request/Exception.php @@ -0,0 +1,36 @@ +valid()) { + $path = $uri->getPath(); + $query = $uri->getQuery(); + if (!empty($query)) { + $path .= '?' . $query; + } + + $this->setRequestUri($path); + } else { + require_once 'Zend/Controller/Request/Exception.php'; + throw new Zend_Controller_Request_Exception('Invalid URI provided to constructor'); + } + } else { + $this->setRequestUri(); + } + } + + /** + * Access values contained in the superglobals as public members + * Order of precedence: 1. GET, 2. POST, 3. COOKIE, 4. SERVER, 5. ENV + * + * @see http://msdn.microsoft.com/en-us/library/system.web.httprequest.item.aspx + * @param string $key + * @return mixed + */ + public function __get($key) + { + switch (true) { + case isset($this->_params[$key]): + return $this->_params[$key]; + case isset($_GET[$key]): + return $_GET[$key]; + case isset($_POST[$key]): + return $_POST[$key]; + case isset($_COOKIE[$key]): + return $_COOKIE[$key]; + case ($key == 'REQUEST_URI'): + return $this->getRequestUri(); + case ($key == 'PATH_INFO'): + return $this->getPathInfo(); + case isset($_SERVER[$key]): + return $_SERVER[$key]; + case isset($_ENV[$key]): + return $_ENV[$key]; + default: + return null; + } + } + + /** + * Alias to __get + * + * @param string $key + * @return mixed + */ + public function get($key) + { + return $this->__get($key); + } + + /** + * Set values + * + * In order to follow {@link __get()}, which operates on a number of + * superglobals, setting values through overloading is not allowed and will + * raise an exception. Use setParam() instead. + * + * @param string $key + * @param mixed $value + * @return void + * @throws Zend_Controller_Request_Exception + */ + public function __set($key, $value) + { + require_once 'Zend/Controller/Request/Exception.php'; + throw new Zend_Controller_Request_Exception('Setting values in superglobals not allowed; please use setParam()'); + } + + /** + * Alias to __set() + * + * @param string $key + * @param mixed $value + * @return void + */ + public function set($key, $value) + { + return $this->__set($key, $value); + } + + /** + * Check to see if a property is set + * + * @param string $key + * @return boolean + */ + public function __isset($key) + { + switch (true) { + case isset($this->_params[$key]): + return true; + case isset($_GET[$key]): + return true; + case isset($_POST[$key]): + return true; + case isset($_COOKIE[$key]): + return true; + case isset($_SERVER[$key]): + return true; + case isset($_ENV[$key]): + return true; + default: + return false; + } + } + + /** + * Alias to __isset() + * + * @param string $key + * @return boolean + */ + public function has($key) + { + return $this->__isset($key); + } + + /** + * Set GET values + * + * @param string|array $spec + * @param null|mixed $value + * @return Zend_Controller_Request_Http + */ + public function setQuery($spec, $value = null) + { + if ((null === $value) && !is_array($spec)) { + require_once 'Zend/Controller/Exception.php'; + throw new Zend_Controller_Exception('Invalid value passed to setQuery(); must be either array of values or key/value pair'); + } + if ((null === $value) && is_array($spec)) { + foreach ($spec as $key => $value) { + $this->setQuery($key, $value); + } + return $this; + } + $_GET[(string) $spec] = $value; + return $this; + } + + /** + * Retrieve a member of the $_GET superglobal + * + * If no $key is passed, returns the entire $_GET array. + * + * @todo How to retrieve from nested arrays + * @param string $key + * @param mixed $default Default value to use if key not found + * @return mixed Returns null if key does not exist + */ + public function getQuery($key = null, $default = null) + { + if (null === $key) { + return $_GET; + } + + return (isset($_GET[$key])) ? $_GET[$key] : $default; + } + + /** + * Set POST values + * + * @param string|array $spec + * @param null|mixed $value + * @return Zend_Controller_Request_Http + */ + public function setPost($spec, $value = null) + { + if ((null === $value) && !is_array($spec)) { + require_once 'Zend/Controller/Exception.php'; + throw new Zend_Controller_Exception('Invalid value passed to setPost(); must be either array of values or key/value pair'); + } + if ((null === $value) && is_array($spec)) { + foreach ($spec as $key => $value) { + $this->setPost($key, $value); + } + return $this; + } + $_POST[(string) $spec] = $value; + return $this; + } + + /** + * Retrieve a member of the $_POST superglobal + * + * If no $key is passed, returns the entire $_POST array. + * + * @todo How to retrieve from nested arrays + * @param string $key + * @param mixed $default Default value to use if key not found + * @return mixed Returns null if key does not exist + */ + public function getPost($key = null, $default = null) + { + if (null === $key) { + return $_POST; + } + + return (isset($_POST[$key])) ? $_POST[$key] : $default; + } + + /** + * Retrieve a member of the $_COOKIE superglobal + * + * If no $key is passed, returns the entire $_COOKIE array. + * + * @todo How to retrieve from nested arrays + * @param string $key + * @param mixed $default Default value to use if key not found + * @return mixed Returns null if key does not exist + */ + public function getCookie($key = null, $default = null) + { + if (null === $key) { + return $_COOKIE; + } + + return (isset($_COOKIE[$key])) ? $_COOKIE[$key] : $default; + } + + /** + * Retrieve a member of the $_SERVER superglobal + * + * If no $key is passed, returns the entire $_SERVER array. + * + * @param string $key + * @param mixed $default Default value to use if key not found + * @return mixed Returns null if key does not exist + */ + public function getServer($key = null, $default = null) + { + if (null === $key) { + return $_SERVER; + } + + return (isset($_SERVER[$key])) ? $_SERVER[$key] : $default; + } + + /** + * Retrieve a member of the $_ENV superglobal + * + * If no $key is passed, returns the entire $_ENV array. + * + * @param string $key + * @param mixed $default Default value to use if key not found + * @return mixed Returns null if key does not exist + */ + public function getEnv($key = null, $default = null) + { + if (null === $key) { + return $_ENV; + } + + return (isset($_ENV[$key])) ? $_ENV[$key] : $default; + } + + /** + * Set the REQUEST_URI on which the instance operates + * + * If no request URI is passed, uses the value in $_SERVER['REQUEST_URI'], + * $_SERVER['HTTP_X_REWRITE_URL'], or $_SERVER['ORIG_PATH_INFO'] + $_SERVER['QUERY_STRING']. + * + * @param string $requestUri + * @return Zend_Controller_Request_Http + */ + public function setRequestUri($requestUri = null) + { + if ($requestUri === null) { + if (isset($_SERVER['HTTP_X_REWRITE_URL'])) { // check this first so IIS will catch + $requestUri = $_SERVER['HTTP_X_REWRITE_URL']; + } elseif (isset($_SERVER['REQUEST_URI'])) { + $requestUri = $_SERVER['REQUEST_URI']; + } elseif (isset($_SERVER['ORIG_PATH_INFO'])) { // IIS 5.0, PHP as CGI + $requestUri = $_SERVER['ORIG_PATH_INFO']; + if (!empty($_SERVER['QUERY_STRING'])) { + $requestUri .= '?' . $_SERVER['QUERY_STRING']; + } + } else { + return $this; + } + } elseif (!is_string($requestUri)) { + return $this; + } else { + // Set GET items, if available + if (false !== ($pos = strpos($requestUri, '?'))) { + // Get key => value pairs and set $_GET + $query = substr($requestUri, $pos + 1); + parse_str($query, $vars); + $this->setQuery($vars); + } + } + + $this->_requestUri = $requestUri; + return $this; + } + + /** + * Returns the REQUEST_URI taking into account + * platform differences between Apache and IIS + * + * @return string + */ + public function getRequestUri() + { + if (empty($this->_requestUri)) { + $this->setRequestUri(); + } + + return $this->_requestUri; + } + + /** + * Set the base URL of the request; i.e., the segment leading to the script name + * + * E.g.: + * - /admin + * - /myapp + * - /subdir/index.php + * + * Do not use the full URI when providing the base. The following are + * examples of what not to use: + * - http://example.com/admin (should be just /admin) + * - http://example.com/subdir/index.php (should be just /subdir/index.php) + * + * If no $baseUrl is provided, attempts to determine the base URL from the + * environment, using SCRIPT_FILENAME, SCRIPT_NAME, PHP_SELF, and + * ORIG_SCRIPT_NAME in its determination. + * + * @param mixed $baseUrl + * @return Zend_Controller_Request_Http + */ + public function setBaseUrl($baseUrl = null) + { + if ((null !== $baseUrl) && !is_string($baseUrl)) { + return $this; + } + + if ($baseUrl === null) { + $filename = (isset($_SERVER['SCRIPT_FILENAME'])) ? basename($_SERVER['SCRIPT_FILENAME']) : ''; + + if (isset($_SERVER['SCRIPT_NAME']) && basename($_SERVER['SCRIPT_NAME']) === $filename) { + $baseUrl = $_SERVER['SCRIPT_NAME']; + } elseif (isset($_SERVER['PHP_SELF']) && basename($_SERVER['PHP_SELF']) === $filename) { + $baseUrl = $_SERVER['PHP_SELF']; + } elseif (isset($_SERVER['ORIG_SCRIPT_NAME']) && basename($_SERVER['ORIG_SCRIPT_NAME']) === $filename) { + $baseUrl = $_SERVER['ORIG_SCRIPT_NAME']; // 1and1 shared hosting compatibility + } else { + // Backtrack up the script_filename to find the portion matching + // php_self + $path = isset($_SERVER['PHP_SELF']) ? $_SERVER['PHP_SELF'] : ''; + $file = isset($_SERVER['SCRIPT_FILENAME']) ? $_SERVER['SCRIPT_FILENAME'] : ''; + $segs = explode('/', trim($file, '/')); + $segs = array_reverse($segs); + $index = 0; + $last = count($segs); + $baseUrl = ''; + do { + $seg = $segs[$index]; + $baseUrl = '/' . $seg . $baseUrl; + ++$index; + } while (($last > $index) && (false !== ($pos = strpos($path, $baseUrl))) && (0 != $pos)); + } + + // Does the baseUrl have anything in common with the request_uri? + $requestUri = $this->getRequestUri(); + + if (0 === strpos($requestUri, $baseUrl)) { + // full $baseUrl matches + $this->_baseUrl = $baseUrl; + return $this; + } + + if (0 === strpos($requestUri, dirname($baseUrl))) { + // directory portion of $baseUrl matches + $this->_baseUrl = rtrim(dirname($baseUrl), '/'); + return $this; + } + + if (!strpos($requestUri, basename($baseUrl))) { + // no match whatsoever; set it blank + $this->_baseUrl = ''; + return $this; + } + + // If using mod_rewrite or ISAPI_Rewrite strip the script filename + // out of baseUrl. $pos !== 0 makes sure it is not matching a value + // from PATH_INFO or QUERY_STRING + if ((strlen($requestUri) >= strlen($baseUrl)) + && ((false !== ($pos = strpos($requestUri, $baseUrl))) && ($pos !== 0))) + { + $baseUrl = substr($requestUri, 0, $pos + strlen($baseUrl)); + } + } + + $this->_baseUrl = rtrim($baseUrl, '/'); + return $this; + } + + /** + * Everything in REQUEST_URI before PATH_INFO + *
+ * + * @return string + */ + public function getBaseUrl() + { + if (null === $this->_baseUrl) { + $this->setBaseUrl(); + } + + return $this->_baseUrl; + } + + /** + * Set the base path for the URL + * + * @param string|null $basePath + * @return Zend_Controller_Request_Http + */ + public function setBasePath($basePath = null) + { + if ($basePath === null) { + $filename = basename($_SERVER['SCRIPT_FILENAME']); + + $baseUrl = $this->getBaseUrl(); + if (empty($baseUrl)) { + $this->_basePath = ''; + return $this; + } + + if (basename($baseUrl) === $filename) { + $basePath = dirname($baseUrl); + } else { + $basePath = $baseUrl; + } + } + + if (substr(PHP_OS, 0, 3) === 'WIN') { + $basePath = str_replace('\\', '/', $basePath); + } + + $this->_basePath = rtrim($basePath, '/'); + return $this; + } + + /** + * Everything in REQUEST_URI before PATH_INFO not including the filename + * + * + * @return string + */ + public function getBasePath() + { + if (null === $this->_basePath) { + $this->setBasePath(); + } + + return $this->_basePath; + } + + /** + * Set the PATH_INFO string + * + * @param string|null $pathInfo + * @return Zend_Controller_Request_Http + */ + public function setPathInfo($pathInfo = null) + { + if ($pathInfo === null) { + $baseUrl = $this->getBaseUrl(); + + if (null === ($requestUri = $this->getRequestUri())) { + return $this; + } + + // Remove the query string from REQUEST_URI + if ($pos = strpos($requestUri, '?')) { + $requestUri = substr($requestUri, 0, $pos); + } + + if ((null !== $baseUrl) + && (false === ($pathInfo = substr($requestUri, strlen($baseUrl))))) + { + // If substr() returns false then PATH_INFO is set to an empty string + $pathInfo = ''; + } elseif (null === $baseUrl) { + $pathInfo = $requestUri; + } + } + + $this->_pathInfo = (string) $pathInfo; + return $this; + } + + /** + * Returns everything between the BaseUrl and QueryString. + * This value is calculated instead of reading PATH_INFO + * directly from $_SERVER due to cross-platform differences. + * + * @return string + */ + public function getPathInfo() + { + if (empty($this->_pathInfo)) { + $this->setPathInfo(); + } + + return $this->_pathInfo; + } + + /** + * Set allowed parameter sources + * + * Can be empty array, or contain one or more of '_GET' or '_POST'. + * + * @param array $paramSoures + * @return Zend_Controller_Request_Http + */ + public function setParamSources(array $paramSources = array()) + { + $this->_paramSources = $paramSources; + return $this; + } + + /** + * Get list of allowed parameter sources + * + * @return array + */ + public function getParamSources() + { + return $this->_paramSources; + } + + /** + * Set a userland parameter + * + * Uses $key to set a userland parameter. If $key is an alias, the actual + * key will be retrieved and used to set the parameter. + * + * @param mixed $key + * @param mixed $value + * @return Zend_Controller_Request_Http + */ + public function setParam($key, $value) + { + $key = (null !== ($alias = $this->getAlias($key))) ? $alias : $key; + parent::setParam($key, $value); + return $this; + } + + /** + * Retrieve a parameter + * + * Retrieves a parameter from the instance. Priority is in the order of + * userland parameters (see {@link setParam()}), $_GET, $_POST. If a + * parameter matching the $key is not found, null is returned. + * + * If the $key is an alias, the actual key aliased will be used. + * + * @param mixed $key + * @param mixed $default Default value to use if key not found + * @return mixed + */ + public function getParam($key, $default = null) + { + $keyName = (null !== ($alias = $this->getAlias($key))) ? $alias : $key; + + $paramSources = $this->getParamSources(); + if (isset($this->_params[$keyName])) { + return $this->_params[$keyName]; + } elseif (in_array('_GET', $paramSources) && (isset($_GET[$keyName]))) { + return $_GET[$keyName]; + } elseif (in_array('_POST', $paramSources) && (isset($_POST[$keyName]))) { + return $_POST[$keyName]; + } + + return $default; + } + + /** + * 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 + * userland params will take precedence over all others). + * + * @return array + */ + public function getParams() + { + $return = $this->_params; + if (isset($_GET) && is_array($_GET)) { + $return += $_GET; + } + if (isset($_POST) && is_array($_POST)) { + $return += $_POST; + } + return $return; + } + + /** + * Set parameters + * + * Set one or more parameters. Parameters are set as userland parameters, + * using the keys specified in the array. + * + * @param array $params + * @return Zend_Controller_Request_Http + */ + public function setParams(array $params) + { + foreach ($params as $key => $value) { + $this->setParam($key, $value); + } + return $this; + } + + /** + * Set a key alias + * + * Set an alias used for key lookups. $name specifies the alias, $target + * specifies the actual key to use. + * + * @param string $name + * @param string $target + * @return Zend_Controller_Request_Http + */ + public function setAlias($name, $target) + { + $this->_aliases[$name] = $target; + return $this; + } + + /** + * Retrieve an alias + * + * Retrieve the actual key represented by the alias $name. + * + * @param string $name + * @return string|null Returns null when no alias exists + */ + public function getAlias($name) + { + if (isset($this->_aliases[$name])) { + return $this->_aliases[$name]; + } + + return null; + } + + /** + * Retrieve the list of all aliases + * + * @return array + */ + public function getAliases() + { + return $this->_aliases; + } + + /** + * Return the method by which the request was made + * + * @return string + */ + public function getMethod() + { + return $this->getServer('REQUEST_METHOD'); + } + + /** + * Was the request made by POST? + * + * @return boolean + */ + public function isPost() + { + if ('POST' == $this->getMethod()) { + return true; + } + + return false; + } + + /** + * Was the request made by GET? + * + * @return boolean + */ + public function isGet() + { + if ('GET' == $this->getMethod()) { + return true; + } + + return false; + } + + /** + * Was the request made by PUT? + * + * @return boolean + */ + public function isPut() + { + if ('PUT' == $this->getMethod()) { + return true; + } + + return false; + } + + /** + * Was the request made by DELETE? + * + * @return boolean + */ + public function isDelete() + { + if ('DELETE' == $this->getMethod()) { + return true; + } + + return false; + } + + /** + * Was the request made by HEAD? + * + * @return boolean + */ + public function isHead() + { + if ('HEAD' == $this->getMethod()) { + return true; + } + + return false; + } + + /** + * Was the request made by OPTIONS? + * + * @return boolean + */ + public function isOptions() + { + if ('OPTIONS' == $this->getMethod()) { + return true; + } + + return false; + } + + /** + * Is the request a Javascript XMLHttpRequest? + * + * Should work with Prototype/Script.aculo.us, possibly others. + * + * @return boolean + */ + public function isXmlHttpRequest() + { + return ($this->getHeader('X_REQUESTED_WITH') == 'XMLHttpRequest'); + } + + /** + * Is this a Flash request? + * + * @return bool + */ + public function isFlashRequest() + { + $header = strtolower($this->getHeader('USER_AGENT')); + return (strstr($header, ' flash')) ? true : false; + } + + /** + * Is https secure request + * + * @return boolean + */ + public function isSecure() + { + return ($this->getScheme() === self::SCHEME_HTTPS); + } + + /** + * Return the raw body of the request, if present + * + * @return string|false Raw body, or false if not present + */ + public function getRawBody() + { + $body = file_get_contents('php://input'); + + if (strlen(trim($body)) > 0) { + return $body; + } + + return false; + } + + /** + * Return the value of the given HTTP header. Pass the header name as the + * plain, HTTP-specified header name. Ex.: Ask for 'Accept' to get the + * Accept header, 'Accept-Encoding' to get the Accept-Encoding header. + * + * @param string $header HTTP header name + * @return string|false HTTP header value, or false if not found + * @throws Zend_Controller_Request_Exception + */ + public function getHeader($header) + { + if (empty($header)) { + require_once 'Zend/Controller/Request/Exception.php'; + throw new Zend_Controller_Request_Exception('An HTTP header name is required'); + } + + // Try to get it from the $_SERVER array first + $temp = 'HTTP_' . strtoupper(str_replace('-', '_', $header)); + if (!empty($_SERVER[$temp])) { + return $_SERVER[$temp]; + } + + // This seems to be the only way to get the Authorization header on + // Apache + if (function_exists('apache_request_headers')) { + $headers = apache_request_headers(); + if (!empty($headers[$header])) { + return $headers[$header]; + } + } + + return false; + } + + /** + * Get the request URI scheme + * + * @return string + */ + public function getScheme() + { + return ($this->getServer('HTTPS') == 'on') ? self::SCHEME_HTTPS : self::SCHEME_HTTP; + } + + /** + * Get the HTTP host. + * + * "Host" ":" host [ ":" port ] ; Section 3.2.2 + * Note the HTTP Host header is not the same as the URI host. + * It includes the port while the URI host doesn't. + * + * @return string + */ + public function getHttpHost() + { + $host = $this->getServer('HTTP_HOST'); + if (!empty($host)) { + return $host; + } + + $scheme = $this->getScheme(); + $name = $this->getServer('SERVER_NAME'); + $port = $this->getServer('SERVER_PORT'); + + if (($scheme == self::SCHEME_HTTP && $port == 80) || ($scheme == self::SCHEME_HTTPS && $port == 443)) { + return $name; + } else { + return $name . ':' . $port; + } + } +} diff --git a/libs/Zend/Controller/Request/HttpTestCase.php b/libs/Zend/Controller/Request/HttpTestCase.php new file mode 100644 index 0000000..7a4280b --- /dev/null +++ b/libs/Zend/Controller/Request/HttpTestCase.php @@ -0,0 +1,275 @@ +_rawBody = (string) $content; + return $this; + } + + /** + * Get RAW POST body + * + * @return string|null + */ + public function getRawBody() + { + return $this->_rawBody; + } + + /** + * Clear raw POST body + * + * @return Zend_Controller_Request_HttpTestCase + */ + public function clearRawBody() + { + $this->_rawBody = null; + return $this; + } + + /** + * Set a cookie + * + * @param string $key + * @param mixed $value + * @return Zend_Controller_Request_HttpTestCase + */ + public function setCookie($key, $value) + { + $_COOKIE[(string) $key] = $value; + return $this; + } + + /** + * Set multiple cookies at once + * + * @param array $cookies + * @return void + */ + public function setCookies(array $cookies) + { + foreach ($cookies as $key => $value) { + $_COOKIE[$key] = $value; + } + return $this; + } + + /** + * Clear all cookies + * + * @return Zend_Controller_Request_HttpTestCase + */ + public function clearCookies() + { + $_COOKIE = array(); + return $this; + } + + /** + * Set request method + * + * @param string $type + * @return Zend_Controller_Request_HttpTestCase + */ + public function setMethod($type) + { + $type = strtoupper(trim((string) $type)); + if (!in_array($type, $this->_validMethodTypes)) { + require_once 'Zend/Controller/Exception.php'; + throw new Zend_Controller_Exception('Invalid request method specified'); + } + $this->_method = $type; + return $this; + } + + /** + * Get request method + * + * @return string|null + */ + public function getMethod() + { + return $this->_method; + } + + /** + * Set a request header + * + * @param string $key + * @param string $value + * @return Zend_Controller_Request_HttpTestCase + */ + public function setHeader($key, $value) + { + $key = $this->_normalizeHeaderName($key); + $this->_headers[$key] = (string) $value; + return $this; + } + + /** + * Set request headers + * + * @param array $headers + * @return Zend_Controller_Request_HttpTestCase + */ + public function setHeaders(array $headers) + { + foreach ($headers as $key => $value) { + $this->setHeader($key, $value); + } + return $this; + } + + /** + * Get request header + * + * @param string $header + * @param mixed $default + * @return string|null + */ + public function getHeader($header, $default = null) + { + $header = $this->_normalizeHeaderName($header); + if (array_key_exists($header, $this->_headers)) { + return $this->_headers[$header]; + } + return $default; + } + + /** + * Get all request headers + * + * @return array + */ + public function getHeaders() + { + return $this->_headers; + } + + /** + * Clear request headers + * + * @return Zend_Controller_Request_HttpTestCase + */ + public function clearHeaders() + { + $this->_headers = array(); + return $this; + } + + /** + * Get REQUEST_URI + * + * @return null|string + */ + public function getRequestUri() + { + return $this->_requestUri; + } + + /** + * Normalize a header name for setting and retrieval + * + * @param string $name + * @return string + */ + protected function _normalizeHeaderName($name) + { + $name = strtoupper((string) $name); + $name = str_replace('-', '_', $name); + return $name; + } +} diff --git a/libs/Zend/Controller/Request/Simple.php b/libs/Zend/Controller/Request/Simple.php new file mode 100644 index 0000000..6b1464c --- /dev/null +++ b/libs/Zend/Controller/Request/Simple.php @@ -0,0 +1,54 @@ +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 new file mode 100644 index 0000000..71fa665 --- /dev/null +++ b/libs/Zend/Controller/Response/Abstract.php @@ -0,0 +1,755 @@ +canSendHeaders(true); + $name = $this->_normalizeHeader($name); + $value = (string) $value; + + if ($replace) { + foreach ($this->_headers as $key => $header) { + if ($name == $header['name']) { + unset($this->_headers[$key]); + } + } + } + + $this->_headers[] = array( + 'name' => $name, + 'value' => $value, + 'replace' => $replace + ); + + return $this; + } + + /** + * Set redirect URL + * + * Sets Location header and response code. Forces replacement of any prior + * redirects. + * + * @param string $url + * @param int $code + * @return Zend_Controller_Response_Abstract + */ + public function setRedirect($url, $code = 302) + { + $this->canSendHeaders(true); + $this->setHeader('Location', $url, true) + ->setHttpResponseCode($code); + + return $this; + } + + /** + * Is this a redirect? + * + * @return boolean + */ + public function isRedirect() + { + return $this->_isRedirect; + } + + /** + * Return array of headers; see {@link $_headers} for format + * + * @return array + */ + public function getHeaders() + { + return $this->_headers; + } + + /** + * Clear headers + * + * @return Zend_Controller_Response_Abstract + */ + public function clearHeaders() + { + $this->_headers = array(); + + return $this; + } + + /** + * Set raw HTTP header + * + * Allows setting non key => value headers, such as status codes + * + * @param string $value + * @return Zend_Controller_Response_Abstract + */ + public function setRawHeader($value) + { + $this->canSendHeaders(true); + if ('Location' == substr($value, 0, 8)) { + $this->_isRedirect = true; + } + $this->_headersRaw[] = (string) $value; + return $this; + } + + /** + * Retrieve all {@link setRawHeader() raw HTTP headers} + * + * @return array + */ + public function getRawHeaders() + { + return $this->_headersRaw; + } + + /** + * Clear all {@link setRawHeader() raw HTTP headers} + * + * @return Zend_Controller_Response_Abstract + */ + public function clearRawHeaders() + { + $this->_headersRaw = array(); + return $this; + } + + /** + * Clear all headers, normal and raw + * + * @return Zend_Controller_Response_Abstract + */ + public function clearAllHeaders() + { + return $this->clearHeaders() + ->clearRawHeaders(); + } + + /** + * Set HTTP response code to use with headers + * + * @param int $code + * @return Zend_Controller_Response_Abstract + */ + public function setHttpResponseCode($code) + { + if (!is_int($code) || (100 > $code) || (599 < $code)) { + require_once 'Zend/Controller/Response/Exception.php'; + throw new Zend_Controller_Response_Exception('Invalid HTTP response code'); + } + + if ((300 <= $code) && (307 >= $code)) { + $this->_isRedirect = true; + } else { + $this->_isRedirect = false; + } + + $this->_httpResponseCode = $code; + return $this; + } + + /** + * Retrieve HTTP response code + * + * @return int + */ + public function getHttpResponseCode() + { + return $this->_httpResponseCode; + } + + /** + * Can we send headers? + * + * @param boolean $throw Whether or not to throw an exception if headers have been sent; defaults to false + * @return boolean + * @throws Zend_Controller_Response_Exception + */ + public function canSendHeaders($throw = false) + { + $ok = headers_sent($file, $line); + if ($ok && $throw && $this->headersSentThrowsException) { + require_once 'Zend/Controller/Response/Exception.php'; + throw new Zend_Controller_Response_Exception('Cannot send headers; headers already sent in ' . $file . ', line ' . $line); + } + + return !$ok; + } + + /** + * Send all headers + * + * Sends any headers specified. If an {@link setHttpResponseCode() HTTP response code} + * has been specified, it is sent with the first header. + * + * @return Zend_Controller_Response_Abstract + */ + public function sendHeaders() + { + // Only check if we can send headers if we have headers to send + if (count($this->_headersRaw) || count($this->_headers) || (200 != $this->_httpResponseCode)) { + $this->canSendHeaders(true); + } elseif (200 == $this->_httpResponseCode) { + // Haven't changed the response code, and we have no headers + return $this; + } + + $httpCodeSent = false; + + foreach ($this->_headersRaw as $header) { + if (!$httpCodeSent && $this->_httpResponseCode) { + header($header, true, $this->_httpResponseCode); + $httpCodeSent = true; + } else { + header($header); + } + } + + foreach ($this->_headers as $header) { + if (!$httpCodeSent && $this->_httpResponseCode) { + header($header['name'] . ': ' . $header['value'], $header['replace'], $this->_httpResponseCode); + $httpCodeSent = true; + } else { + header($header['name'] . ': ' . $header['value'], $header['replace']); + } + } + + if (!$httpCodeSent) { + header('HTTP/1.1 ' . $this->_httpResponseCode); + $httpCodeSent = true; + } + + return $this; + } + + /** + * Set body content + * + * If $name is not passed, or is not a string, resets the entire body and + * sets the 'default' key to $content. + * + * If $name is a string, sets the named segment in the body array to + * $content. + * + * @param string $content + * @param null|string $name + * @return Zend_Controller_Response_Abstract + */ + public function setBody($content, $name = null) + { + if ((null === $name) || !is_string($name)) { + $this->_body = array('default' => (string) $content); + } else { + $this->_body[$name] = (string) $content; + } + + return $this; + } + + /** + * Append content to the body content + * + * @param string $content + * @param null|string $name + * @return Zend_Controller_Response_Abstract + */ + public function appendBody($content, $name = null) + { + if ((null === $name) || !is_string($name)) { + if (isset($this->_body['default'])) { + $this->_body['default'] .= (string) $content; + } else { + return $this->append('default', $content); + } + } elseif (isset($this->_body[$name])) { + $this->_body[$name] .= (string) $content; + } else { + return $this->append($name, $content); + } + + return $this; + } + + /** + * Clear body array + * + * With no arguments, clears the entire body array. Given a $name, clears + * just that named segment; if no segment matching $name exists, returns + * false to indicate an error. + * + * @param string $name Named segment to clear + * @return boolean + */ + public function clearBody($name = null) + { + if (null !== $name) { + $name = (string) $name; + if (isset($this->_body[$name])) { + unset($this->_body[$name]); + return true; + } + + return false; + } + + $this->_body = array(); + return true; + } + + /** + * Return the body content + * + * If $spec is false, returns the concatenated values of the body content + * array. If $spec is boolean true, returns the body content array. If + * $spec is a string and matches a named segment, returns the contents of + * that segment; otherwise, returns null. + * + * @param boolean $spec + * @return string|array|null + */ + public function getBody($spec = false) + { + if (false === $spec) { + ob_start(); + $this->outputBody(); + return ob_get_clean(); + } elseif (true === $spec) { + return $this->_body; + } elseif (is_string($spec) && isset($this->_body[$spec])) { + return $this->_body[$spec]; + } + + return null; + } + + /** + * Append a named body segment to the body content array + * + * If segment already exists, replaces with $content and places at end of + * array. + * + * @param string $name + * @param string $content + * @return Zend_Controller_Response_Abstract + */ + public function append($name, $content) + { + if (!is_string($name)) { + require_once 'Zend/Controller/Response/Exception.php'; + throw new Zend_Controller_Response_Exception('Invalid body segment key ("' . gettype($name) . '")'); + } + + if (isset($this->_body[$name])) { + unset($this->_body[$name]); + } + $this->_body[$name] = (string) $content; + return $this; + } + + /** + * Prepend a named body segment to the body content array + * + * If segment already exists, replaces with $content and places at top of + * array. + * + * @param string $name + * @param string $content + * @return void + */ + public function prepend($name, $content) + { + if (!is_string($name)) { + require_once 'Zend/Controller/Response/Exception.php'; + throw new Zend_Controller_Response_Exception('Invalid body segment key ("' . gettype($name) . '")'); + } + + if (isset($this->_body[$name])) { + unset($this->_body[$name]); + } + + $new = array($name => (string) $content); + $this->_body = $new + $this->_body; + + return $this; + } + + /** + * Insert a named segment into the body content array + * + * @param string $name + * @param string $content + * @param string $parent + * @param boolean $before Whether to insert the new segment before or + * after the parent. Defaults to false (after) + * @return Zend_Controller_Response_Abstract + */ + public function insert($name, $content, $parent = null, $before = false) + { + if (!is_string($name)) { + require_once 'Zend/Controller/Response/Exception.php'; + throw new Zend_Controller_Response_Exception('Invalid body segment key ("' . gettype($name) . '")'); + } + + if ((null !== $parent) && !is_string($parent)) { + require_once 'Zend/Controller/Response/Exception.php'; + throw new Zend_Controller_Response_Exception('Invalid body segment parent key ("' . gettype($parent) . '")'); + } + + if (isset($this->_body[$name])) { + unset($this->_body[$name]); + } + + if ((null === $parent) || !isset($this->_body[$parent])) { + return $this->append($name, $content); + } + + $ins = array($name => (string) $content); + $keys = array_keys($this->_body); + $loc = array_search($parent, $keys); + if (!$before) { + // Increment location if not inserting before + ++$loc; + } + + if (0 === $loc) { + // If location of key is 0, we're prepending + $this->_body = $ins + $this->_body; + } elseif ($loc >= (count($this->_body))) { + // If location of key is maximal, we're appending + $this->_body = $this->_body + $ins; + } else { + // Otherwise, insert at location specified + $pre = array_slice($this->_body, 0, $loc); + $post = array_slice($this->_body, $loc); + $this->_body = $pre + $ins + $post; + } + + return $this; + } + + /** + * Echo the body segments + * + * @return void + */ + public function outputBody() + { + foreach ($this->_body as $content) { + echo $content; + } + } + + /** + * Register an exception with the response + * + * @param Exception $e + * @return Zend_Controller_Response_Abstract + */ + public function setException(Exception $e) + { + $this->_exceptions[] = $e; + return $this; + } + + /** + * Retrieve the exception stack + * + * @return array + */ + public function getException() + { + return $this->_exceptions; + } + + /** + * Has an exception been registered with the response? + * + * @return boolean + */ + public function isException() + { + return !empty($this->_exceptions); + } + + /** + * Does the response object contain an exception of a given type? + * + * @param string $type + * @return boolean + */ + public function hasExceptionOfType($type) + { + foreach ($this->_exceptions as $e) { + if ($e instanceof $type) { + return true; + } + } + + return false; + } + + /** + * Does the response object contain an exception with a given message? + * + * @param string $message + * @return boolean + */ + public function hasExceptionOfMessage($message) + { + foreach ($this->_exceptions as $e) { + if ($message == $e->getMessage()) { + return true; + } + } + + return false; + } + + /** + * Does the response object contain an exception with a given code? + * + * @param int $code + * @return boolean + */ + public function hasExceptionOfCode($code) + { + $code = (int) $code; + foreach ($this->_exceptions as $e) { + if ($code == $e->getCode()) { + return true; + } + } + + return false; + } + + /** + * Retrieve all exceptions of a given type + * + * @param string $type + * @return false|array + */ + public function getExceptionByType($type) + { + $exceptions = array(); + foreach ($this->_exceptions as $e) { + if ($e instanceof $type) { + $exceptions[] = $e; + } + } + + if (empty($exceptions)) { + $exceptions = false; + } + + return $exceptions; + } + + /** + * Retrieve all exceptions of a given message + * + * @param string $message + * @return false|array + */ + public function getExceptionByMessage($message) + { + $exceptions = array(); + foreach ($this->_exceptions as $e) { + if ($message == $e->getMessage()) { + $exceptions[] = $e; + } + } + + if (empty($exceptions)) { + $exceptions = false; + } + + return $exceptions; + } + + /** + * Retrieve all exceptions of a given code + * + * @param mixed $code + * @return void + */ + public function getExceptionByCode($code) + { + $code = (int) $code; + $exceptions = array(); + foreach ($this->_exceptions as $e) { + if ($code == $e->getCode()) { + $exceptions[] = $e; + } + } + + if (empty($exceptions)) { + $exceptions = false; + } + + return $exceptions; + } + + /** + * Whether or not to render exceptions (off by default) + * + * If called with no arguments or a null argument, returns the value of the + * flag; otherwise, sets it and returns the current value. + * + * @param boolean $flag Optional + * @return boolean + */ + public function renderExceptions($flag = null) + { + if (null !== $flag) { + $this->_renderExceptions = $flag ? true : false; + } + + return $this->_renderExceptions; + } + + /** + * Send the response, including all headers, rendering exceptions if so + * requested. + * + * @return void + */ + public function sendResponse() + { + $this->sendHeaders(); + + if ($this->isException() && $this->renderExceptions()) { + $exceptions = ''; + foreach ($this->getException() as $e) { + $exceptions .= $e->__toString() . "\n"; + } + echo $exceptions; + return; + } + + $this->outputBody(); + } + + /** + * Magic __toString functionality + * + * Proxies to {@link sendResponse()} and returns response value as string + * using output buffering. + * + * @return string + */ + public function __toString() + { + ob_start(); + $this->sendResponse(); + return ob_get_clean(); + } +} diff --git a/libs/Zend/Controller/Response/Cli.php b/libs/Zend/Controller/Response/Cli.php new file mode 100644 index 0000000..7a53aa9 --- /dev/null +++ b/libs/Zend/Controller/Response/Cli.php @@ -0,0 +1,67 @@ +isException() && $this->renderExceptions()) { + $exceptions = ''; + foreach ($this->getException() as $e) { + $exceptions .= $e->__toString() . "\n"; + } + return $exceptions; + } + + return $this->_body; + } +} diff --git a/libs/Zend/Controller/Response/Exception.php b/libs/Zend/Controller/Response/Exception.php new file mode 100644 index 0000000..994b920 --- /dev/null +++ b/libs/Zend/Controller/Response/Exception.php @@ -0,0 +1,34 @@ +_headersRaw as $header) { + $headers[] = $header; + } + foreach ($this->_headers as $header) { + $name = $header['name']; + $key = strtolower($name); + if (array_key_exists($name, $headers)) { + if ($header['replace']) { + $headers[$key] = $header['name'] . ': ' . $header['value']; + } + } else { + $headers[$key] = $header['name'] . ': ' . $header['value']; + } + } + return $headers; + } + + /** + * Can we send headers? + * + * @param bool $throw + * @return void + */ + public function canSendHeaders($throw = false) + { + return true; + } + + /** + * Return the concatenated body segments + * + * @return string + */ + public function outputBody() + { + $fullContent = ''; + foreach ($this->_body as $content) { + $fullContent .= $content; + } + return $fullContent; + } + + /** + * Get body and/or body segments + * + * @param bool|string $spec + * @return string|array|null + */ + public function getBody($spec = false) + { + if (false === $spec) { + return $this->outputBody(); + } elseif (true === $spec) { + return $this->_body; + } elseif (is_string($spec) && isset($this->_body[$spec])) { + return $this->_body[$spec]; + } + + return null; + } + + /** + * "send" Response + * + * Concats all response headers, and then final body (separated by two + * newlines) + * + * @return string + */ + public function sendResponse() + { + $headers = $this->sendHeaders(); + $content = implode("\n", $headers) . "\n\n"; + + if ($this->isException() && $this->renderExceptions()) { + $exceptions = ''; + foreach ($this->getException() as $e) { + $exceptions .= $e->__toString() . "\n"; + } + $content .= $exceptions; + } else { + $content .= $this->outputBody(); + } + + return $content; + } +} diff --git a/libs/Zend/Controller/Router/Abstract.php b/libs/Zend/Controller/Router/Abstract.php new file mode 100644 index 0000000..513cfe6 --- /dev/null +++ b/libs/Zend/Controller/Router/Abstract.php @@ -0,0 +1,169 @@ +setParams($params); + } + + /** + * Add or modify a parameter to use when instantiating an action controller + * + * @param string $name + * @param mixed $value + * @return Zend_Controller_Router + */ + public function setParam($name, $value) + { + $name = (string) $name; + $this->_invokeParams[$name] = $value; + return $this; + } + + /** + * Set parameters to pass to action controller constructors + * + * @param array $params + * @return Zend_Controller_Router + */ + public function setParams(array $params) + { + $this->_invokeParams = array_merge($this->_invokeParams, $params); + return $this; + } + + /** + * Retrieve a single parameter from the controller parameter stack + * + * @param string $name + * @return mixed + */ + public function getParam($name) + { + if(isset($this->_invokeParams[$name])) { + return $this->_invokeParams[$name]; + } + + return null; + } + + /** + * Retrieve action controller instantiation parameters + * + * @return array + */ + public function getParams() + { + return $this->_invokeParams; + } + + /** + * Clear the controller parameter stack + * + * By default, clears all parameters. If a parameter name is given, clears + * only that parameter; if an array of parameter names is provided, clears + * each. + * + * @param null|string|array single key or array of keys for params to clear + * @return Zend_Controller_Router + */ + public function clearParams($name = null) + { + if (null === $name) { + $this->_invokeParams = array(); + } elseif (is_string($name) && isset($this->_invokeParams[$name])) { + unset($this->_invokeParams[$name]); + } elseif (is_array($name)) { + foreach ($name as $key) { + if (is_string($key) && isset($this->_invokeParams[$key])) { + unset($this->_invokeParams[$key]); + } + } + } + + return $this; + } + + /** + * Retrieve Front Controller + * + * @return Zend_Controller_Front + */ + public function getFrontController() + { + // Used cache version if found + if (null !== $this->_frontController) { + return $this->_frontController; + } + + require_once 'Zend/Controller/Front.php'; + $this->_frontController = Zend_Controller_Front::getInstance(); + return $this->_frontController; + } + + /** + * Set Front Controller + * + * @param Zend_Controller_Front $controller + * @return Zend_Controller_Router_Interface + */ + public function setFrontController(Zend_Controller_Front $controller) + { + $this->_frontController = $controller; + return $this; + } + +} diff --git a/libs/Zend/Controller/Router/Exception.php b/libs/Zend/Controller/Router/Exception.php new file mode 100644 index 0000000..ce4d2c5 --- /dev/null +++ b/libs/Zend/Controller/Router/Exception.php @@ -0,0 +1,35 @@ +hasRoute('default')) { + + $dispatcher = $this->getFrontController()->getDispatcher(); + $request = $this->getFrontController()->getRequest(); + + require_once 'Zend/Controller/Router/Route/Module.php'; + $compat = new Zend_Controller_Router_Route_Module(array(), $dispatcher, $request); + + $this->_routes = array_merge(array('default' => $compat), $this->_routes); + } + } + + /** + * Add route to the route chain + * + * If route implements Zend_Controller_Request_Aware interface it is initialized with a request object + * + * @param string $name Name of the route + * @param 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; + } + + /** + * Add routes to the route chain + * + * @param array $routes Array of routes with names as keys and routes as values + */ + public function addRoutes($routes) { + foreach ($routes as $name => $route) { + $this->addRoute($name, $route); + } + return $this; + } + + /** + * Create routes out of Zend_Config configuration + * + * Example INI: + * routes.archive.route = "archive/:year/*" + * routes.archive.defaults.controller = archive + * routes.archive.defaults.action = show + * routes.archive.defaults.year = 2000 + * routes.archive.reqs.year = "\d+" + * + * routes.news.type = "Zend_Controller_Router_Route_Static" + * routes.news.route = "news" + * routes.news.defaults.controller = "news" + * routes.news.defaults.action = "list" + * + * And finally after you have created a Zend_Config with above ini: + * $router = new Zend_Controller_Router_Rewrite(); + * $router->addConfig($config, 'routes'); + * + * @param Zend_Config $config Configuration object + * @param string $section Name of the config section containing route's definitions + * @throws Zend_Controller_Router_Exception + */ + public function addConfig(Zend_Config $config, $section = null) + { + if ($section !== null) { + if ($config->{$section} === null) { + 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 (isset($info->chains) && $info->chains instanceof Zend_Config) { + $this->_addChainRoutesFromConfig($name, $route, $info->chains); + } else { + $this->addRoute($name, $route); + } + } + + return $this; + } + + /** + * Get a route frm a config instance + * + * @param Zend_Config $info + * @return Zend_Controller_Router_Route_Interface + */ + protected function _getRouteFromConfig(Zend_Config $info) + { + $class = (isset($info->type)) ? $info->type : 'Zend_Controller_Router_Route'; + Zend_Loader::loadClass($class); + + $route = call_user_func(array($class, 'getInstance'), $info); + + return $route; + } + + /** + * Add chain routes from a config route + * + * @todo Add recursive chaining (not required yet, but later when path + * route chaining is done) + * + * @param string $name + * @param Zend_Controller_Router_Route_Interface $route + * @param Zend_Config $childRoutesInfo + * @return void + */ + protected function _addChainRoutesFromConfig($name, + Zend_Controller_Router_Route_Interface $route, + Zend_Config $childRoutesInfo) + { + foreach ($childRoutesInfo as $childRouteName => $childRouteInfo) { + $childRoute = $this->_getRouteFromConfig($childRouteInfo); + + $chainRoute = $route->chain($childRoute); + $chainName = $name . '-' . $childRouteName; + + $this->addRoute($chainName, $chainRoute); + } + } + + /** + * Remove a route from the route chain + * + * @param string $name Name of the route + * @throws Zend_Controller_Router_Exception + */ + public function removeRoute($name) { + if (!isset($this->_routes[$name])) { + require_once 'Zend/Controller/Router/Exception.php'; + throw new Zend_Controller_Router_Exception("Route $name is not defined"); + } + unset($this->_routes[$name]); + return $this; + } + + /** + * Remove all standard default routes + * + * @param Zend_Controller_Router_Route_Interface Route + */ + public function removeDefaultRoutes() { + $this->_useDefaultRoutes = false; + return $this; + } + + /** + * Check if named route exists + * + * @param string $name Name of the route + * @return boolean + */ + public function hasRoute($name) + { + return isset($this->_routes[$name]); + } + + /** + * Retrieve a named route + * + * @param string $name Name of the route + * @throws Zend_Controller_Router_Exception + * @return Zend_Controller_Router_Route_Interface Route object + */ + public function getRoute($name) + { + if (!isset($this->_routes[$name])) { + require_once 'Zend/Controller/Router/Exception.php'; + throw new Zend_Controller_Router_Exception("Route $name is not defined"); + } + return $this->_routes[$name]; + } + + /** + * Retrieve a currently matched route + * + * @throws Zend_Controller_Router_Exception + * @return Zend_Controller_Router_Route_Interface Route object + */ + public function getCurrentRoute() + { + if (!isset($this->_currentRoute)) { + require_once 'Zend/Controller/Router/Exception.php'; + throw new Zend_Controller_Router_Exception("Current route is not defined"); + } + return $this->getRoute($this->_currentRoute); + } + + /** + * Retrieve a name of currently matched route + * + * @throws Zend_Controller_Router_Exception + * @return Zend_Controller_Router_Route_Interface Route object + */ + public function getCurrentRouteName() + { + if (!isset($this->_currentRoute)) { + require_once 'Zend/Controller/Router/Exception.php'; + throw new Zend_Controller_Router_Exception("Current route is not defined"); + } + return $this->_currentRoute; + } + + /** + * Retrieve an array of routes added to the route chain + * + * @return array All of the defined routes + */ + public function getRoutes() + { + return $this->_routes; + } + + /** + * Find a matching route to the current PATH_INFO and inject + * returning values to the Request object. + * + * @throws Zend_Controller_Router_Exception + * @return Zend_Controller_Request_Abstract Request object + */ + public function route(Zend_Controller_Request_Abstract $request) + { + + if (!$request instanceof Zend_Controller_Request_Http) { + require_once 'Zend/Controller/Router/Exception.php'; + throw new Zend_Controller_Router_Exception('Zend_Controller_Router_Rewrite requires a Zend_Controller_Request_Http-based request object'); + } + + if ($this->_useDefaultRoutes) { + $this->addDefaultRoutes(); + } + + /** Find the matching route */ + foreach (array_reverse($this->_routes) as $name => $route) { + + // 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; + break; + } + } + + return $request; + + } + + protected function _setRequestParams($request, $params) + { + foreach ($params as $param => $value) { + + $request->setParam($param, $value); + + if ($param === $request->getModuleKey()) { + $request->setModuleName($value); + } + if ($param === $request->getControllerKey()) { + $request->setControllerName($value); + } + if ($param === $request->getActionKey()) { + $request->setActionName($value); + } + + } + } + + /** + * 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) { + try { + $name = $this->getCurrentRouteName(); + } catch (Zend_Controller_Router_Exception $e) { + $name = 'default'; + } + } + + $params = array_merge($this->_globalParams, $userParams); + + $route = $this->getRoute($name); + $url = $route->assemble($params, $reset, $encode); + + if (!preg_match('|^[a-z]+://|', $url)) { + $url = rtrim($this->getFrontController()->getBaseUrl(), '/') . '/' . $url; + } + + return $url; + } + + /** + * Set a global parameter + * + * @param string $name + * @param mixed $value + * @return Zend_Controller_Router_Rewrite + */ + public function setGlobalParam($name, $value) + { + $this->_globalParams[$name] = $value; + + return $this; + } +} \ No newline at end of file diff --git a/libs/Zend/Controller/Router/Route.php b/libs/Zend/Controller/Router/Route.php new file mode 100644 index 0000000..9e7e95e --- /dev/null +++ b/libs/Zend/Controller/Router/Route.php @@ -0,0 +1,313 @@ +reqs instanceof Zend_Config) ? $config->reqs->toArray() : array(); + $defs = ($config->defaults instanceof Zend_Config) ? $config->defaults->toArray() : array(); + return new self($config->route, $defs, $reqs); + } + + /** + * Prepares the route for mapping by splitting (exploding) it + * to a corresponding atomic parts. These parts are assigned + * a position which is later used for matching and preparing values. + * + * @param string $route Map used to match with later submitted URL path + * @param array $defaults Defaults for map variables with keys as variable names + * @param array $reqs Regular expression requirements for variables (keys as variable names) + */ + public function __construct($route, $defaults = array(), $reqs = array()) + { + + $route = trim($route, $this->_urlDelimiter); + $this->_defaults = (array) $defaults; + $this->_requirements = (array) $reqs; + + if ($route != '') { + + foreach (explode($this->_urlDelimiter, $route) as $pos => $part) { + + if (substr($part, 0, 1) == $this->_urlVariable) { + $name = substr($part, 1); + $this->_parts[$pos] = (isset($reqs[$name]) ? $reqs[$name] : $this->_defaultRegex); + $this->_variables[$pos] = $name; + } else { + $this->_parts[$pos] = $part; + if ($part != '*') $this->_staticCount++; + } + + } + + } + + } + + /** + * Matches a user submitted path with parts defined by a map. Assigns and + * returns an array of variables on a successful match. + * + * @param string $path Path used to match against this routing map + * @return array|false An array of assigned values or a false on a mismatch + */ + public function match($path) + { + + $pathStaticCount = 0; + $values = array(); + + $path = trim($path, $this->_urlDelimiter); + + if ($path != '') { + + $path = explode($this->_urlDelimiter, $path); + + foreach ($path as $pos => $pathPart) { + + // Path is longer than a route, it's not a match + if (!array_key_exists($pos, $this->_parts)) { + return false; + } + + // If it's a wildcard, get the rest of URL as wildcard data and stop matching + if ($this->_parts[$pos] == '*') { + $count = count($path); + for($i = $pos; $i < $count; $i+=2) { + $var = urldecode($path[$i]); + if (!isset($this->_wildcardData[$var]) && !isset($this->_defaults[$var]) && !isset($values[$var])) { + $this->_wildcardData[$var] = (isset($path[$i+1])) ? urldecode($path[$i+1]) : null; + } + } + break; + } + + $name = isset($this->_variables[$pos]) ? $this->_variables[$pos] : null; + $pathPart = urldecode($pathPart); + + // If it's a static part, match directly + if ($name === null && $this->_parts[$pos] != $pathPart) { + return false; + } + + // If it's a variable with requirement, match a regex. If not - everything matches + if ($this->_parts[$pos] !== null && !preg_match($this->_regexDelimiter . '^' . $this->_parts[$pos] . '$' . $this->_regexDelimiter . 'iu', $pathPart)) { + return false; + } + + // If it's a variable store it's value for later + if ($name !== null) { + $values[$name] = $pathPart; + } else { + $pathStaticCount++; + } + + } + + } + + // Check if all static mappings have been matched + if ($this->_staticCount != $pathStaticCount) { + return false; + } + + $return = $values + $this->_wildcardData + $this->_defaults; + + // Check if all map variables have been initialized + foreach ($this->_variables as $var) { + if (!array_key_exists($var, $return)) { + return false; + } + } + + $this->_values = $values; + + return $return; + + } + + /** + * Assembles user submitted parameters forming a URL path defined by this route + * + * @param array $data An array of variable and value pairs used as parameters + * @param boolean $reset Whether or not to set route defaults with those provided in $data + * @return string Route path with user submitted parameters + */ + public function assemble($data = array(), $reset = false, $encode = false) + { + + $url = array(); + $flag = false; + + foreach ($this->_parts as $key => $part) { + + $name = isset($this->_variables[$key]) ? $this->_variables[$key] : null; + + $useDefault = false; + if (isset($name) && array_key_exists($name, $data) && $data[$name] === null) { + $useDefault = true; + } + + if (isset($name)) { + + if (isset($data[$name]) && !$useDefault) { + $url[$key] = $data[$name]; + unset($data[$name]); + } elseif (!$reset && !$useDefault && isset($this->_values[$name])) { + $url[$key] = $this->_values[$name]; + } elseif (!$reset && !$useDefault && isset($this->_wildcardData[$name])) { + $url[$key] = $this->_wildcardData[$name]; + } elseif (isset($this->_defaults[$name])) { + $url[$key] = $this->_defaults[$name]; + } else { + require_once 'Zend/Controller/Router/Exception.php'; + throw new Zend_Controller_Router_Exception($name . ' is not specified'); + } + + + } elseif ($part != '*') { + $url[$key] = $part; + } else { + if (!$reset) $data += $this->_wildcardData; + foreach ($data as $var => $value) { + if ($value !== null) { + $url[$key++] = $var; + $url[$key++] = $value; + $flag = true; + } + } + } + + } + + $return = ''; + + foreach (array_reverse($url, true) as $key => $value) { + if ($flag || !isset($this->_variables[$key]) || $value !== $this->getDefault($this->_variables[$key])) { + if ($encode) $value = urlencode($value); + $return = $this->_urlDelimiter . $value . $return; + $flag = true; + } + } + + return trim($return, $this->_urlDelimiter); + + } + + /** + * Return a single parameter of route's defaults + * + * @param string $name Array key of the parameter + * @return string Previously set default + */ + public function getDefault($name) { + if (isset($this->_defaults[$name])) { + return $this->_defaults[$name]; + } + return null; + } + + /** + * Return an array of defaults + * + * @return array Route defaults + */ + public function getDefaults() { + return $this->_defaults; + } + +} diff --git a/libs/Zend/Controller/Router/Route/Abstract.php b/libs/Zend/Controller/Router/Route/Abstract.php new file mode 100644 index 0000000..d527608 --- /dev/null +++ b/libs/Zend/Controller/Router/Route/Abstract.php @@ -0,0 +1,52 @@ +chain($this)->chain($route, $separator); + + return $chain; + } + +} diff --git a/libs/Zend/Controller/Router/Route/Chain.php b/libs/Zend/Controller/Router/Route/Chain.php new file mode 100644 index 0000000..c1c9a0a --- /dev/null +++ b/libs/Zend/Controller/Router/Route/Chain.php @@ -0,0 +1,135 @@ +_routes[] = $route; + $this->_separators[] = $separator; + + return $this; + + } + + /** + * Matches a user submitted path with a previously defined route. + * Assigns and returns an array of defaults on a successful match. + * + * @param Zend_Controller_Request_Http $request Request to get the path info from + * @return array|false An array of assigned values or a false on a mismatch + */ + public function match($request, $partial = null) + { + + $path = $request->getPathInfo(); + + $values = array(); + + foreach ($this->_routes as $key => $route) { + + // 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; + } + + $res = $route->match($match); + if ($res === false) return false; + + $values = $res + $values; + + } + + return $values; + } + + /** + * Assembles a URL path defined by this route + * + * @param array $data An array of variable and value pairs used as parameters + * @return string Route path with user submitted parameters + */ + public function assemble($data = array(), $reset = false, $encode = false) + { + $value = ''; + + foreach ($this->_routes as $key => $route) { + if ($key > 0) { + $value .= $this->_separators[$key]; + } + + $value .= $route->assemble($data, $reset, $encode); + + if (method_exists($route, 'getVariables')) { + $variables = $route->getVariables(); + + foreach ($variables as $variable) { + $data[$variable] = null; + } + } + } + + return $value; + } + + /** + * Set the request object for this and the child routes + * + * @param Zend_Controller_Request_Abstract|null $request + * @return void + */ + public function setRequest(Zend_Controller_Request_Abstract $request = null) + { + $this->_request = $request; + + foreach ($this->_routes as $route) { + if (method_exists($route, 'setRequest')) { + $route->setRequest($request); + } + } + } + +} diff --git a/libs/Zend/Controller/Router/Route/Hostname.php b/libs/Zend/Controller/Router/Route/Hostname.php new file mode 100644 index 0000000..d19cfa4 --- /dev/null +++ b/libs/Zend/Controller/Router/Route/Hostname.php @@ -0,0 +1,341 @@ +_request = $request; + } + + /** + * Get the request object + * + * @return Zend_Controller_Request_Abstract $request + */ + public function getRequest() + { + if ($this->_request === null) { + require_once 'Zend/Controller/Front.php'; + $this->_request = Zend_Controller_Front::getInstance()->getRequest(); + } + + return $this->_request; + } + + /** + * Instantiates route based on passed Zend_Config structure + * + * @param Zend_Config $config Configuration object + */ + public static function getInstance(Zend_Config $config) + { + $reqs = ($config->reqs instanceof Zend_Config) ? $config->reqs->toArray() : array(); + $defs = ($config->defaults instanceof Zend_Config) ? $config->defaults->toArray() : array(); + $scheme = (isset($config->scheme)) ? $config->scheme : null; + return new self($config->route, $defs, $reqs, $scheme); + } + + /** + * Prepares the route for mapping by splitting (exploding) it + * to a corresponding atomic parts. These parts are assigned + * a position which is later used for matching and preparing values. + * + * @param string $route Map used to match with later submitted hostname + * @param array $defaults Defaults for map variables with keys as variable names + * @param array $reqs Regular expression requirements for variables (keys as variable names) + * @param string $scheme + */ + public function __construct($route, $defaults = array(), $reqs = array(), $scheme = null) + { + $route = trim($route, '.'); + $this->_defaults = (array) $defaults; + $this->_requirements = (array) $reqs; + $this->_scheme = $scheme; + + if ($route != '') { + foreach (explode('.', $route) as $pos => $part) { + if (substr($part, 0, 1) == $this->_hostVariable) { + $name = substr($part, 1); + $this->_parts[$pos] = (isset($reqs[$name]) ? $reqs[$name] : $this->_defaultRegex); + $this->_variables[$pos] = $name; + } else { + $this->_parts[$pos] = $part; + $this->_staticCount++; + } + } + } + } + + /** + * Matches a user submitted path with parts defined by a map. Assigns and + * returns an array of variables on a successful match. + * + * @param Zend_Controller_Request_Http $request Request to get the host from + * @return array|false An array of assigned values or a false on a mismatch + */ + public function match($request) + { + // Check the scheme if required + if ($this->_scheme !== null) { + $scheme = $request->getScheme(); + + if ($scheme !== $this->_scheme) { + return false; + } + } + + // Get the host and remove unnecessary port information + $host = $request->getHttpHost(); + if (preg_match('#:\d+$#', $host, $result) === 1) { + $host = substr($host, 0, -strlen($result[0])); + } + + $hostStaticCount = 0; + $values = array(); + + $host = trim($host, '.'); + + if ($host != '') { + $host = explode('.', $host); + + foreach ($host as $pos => $hostPart) { + // Host is longer than a route, it's not a match + if (!array_key_exists($pos, $this->_parts)) { + return false; + } + + $name = isset($this->_variables[$pos]) ? $this->_variables[$pos] : null; + $hostPart = urldecode($hostPart); + + // If it's a static part, match directly + if ($name === null && $this->_parts[$pos] != $hostPart) { + return false; + } + + // If it's a variable with requirement, match a regex. If not - everything matches + if ($this->_parts[$pos] !== null && !preg_match($this->_regexDelimiter . '^' . $this->_parts[$pos] . '$' . $this->_regexDelimiter . 'iu', $hostPart)) { + return false; + } + + // If it's a variable store it's value for later + if ($name !== null) { + $values[$name] = $hostPart; + } else { + $hostStaticCount++; + } + } + } + + // Check if all static mappings have been matched + if ($this->_staticCount != $hostStaticCount) { + return false; + } + + $return = $values + $this->_defaults; + + // Check if all map variables have been initialized + foreach ($this->_variables as $var) { + if (!array_key_exists($var, $return)) { + return false; + } + } + + $this->_values = $values; + + return $return; + + } + + /** + * Assembles user submitted parameters forming a hostname defined by this route + * + * @param array $data An array of variable and value pairs used as parameters + * @param boolean $reset Whether or not to set route defaults with those provided in $data + * @return string Route path with user submitted parameters + */ + public function assemble($data = array(), $reset = false, $encode = false) + { + $host = array(); + $flag = false; + + foreach ($this->_parts as $key => $part) { + $name = isset($this->_variables[$key]) ? $this->_variables[$key] : null; + + $useDefault = false; + if (isset($name) && array_key_exists($name, $data) && $data[$name] === null) { + $useDefault = true; + } + + if (isset($name)) { + if (isset($data[$name]) && !$useDefault) { + $host[$key] = $data[$name]; + unset($data[$name]); + } elseif (!$reset && !$useDefault && isset($this->_values[$name])) { + $host[$key] = $this->_values[$name]; + } elseif (isset($this->_defaults[$name])) { + $host[$key] = $this->_defaults[$name]; + } else { + require_once 'Zend/Controller/Router/Exception.php'; + throw new Zend_Controller_Router_Exception($name . ' is not specified'); + } + } else { + $host[$key] = $part; + } + } + + $return = ''; + + foreach (array_reverse($host, true) as $key => $value) { + if ($flag || !isset($this->_variables[$key]) || $value !== $this->getDefault($this->_variables[$key])) { + if ($encode) $value = urlencode($value); + $return = '.' . $value . $return; + $flag = true; + } + } + + $url = trim($return, '.'); + + if ($this->_scheme !== null) { + $scheme = $this->_scheme; + } else { + $request = $this->getRequest(); + if ($request instanceof Zend_Controller_Request_Http) { + $scheme = $request->getScheme(); + } else { + $scheme = 'http'; + } + } + + $hostname = implode('.', $host); + $url = $scheme . '://' . $url; + + return $url; + } + + /** + * Return a single parameter of route's defaults + * + * @param string $name Array key of the parameter + * @return string Previously set default + */ + public function getDefault($name) { + if (isset($this->_defaults[$name])) { + return $this->_defaults[$name]; + } + return null; + } + + /** + * Return an array of defaults + * + * @return array Route defaults + */ + public function getDefaults() { + return $this->_defaults; + } + + /** + * Get all variables which are used by the route + * + * @return array + */ + public function getVariables() + { + return $this->_variables; + } +} diff --git a/libs/Zend/Controller/Router/Route/Interface.php b/libs/Zend/Controller/Router/Route/Interface.php new file mode 100644 index 0000000..bf54993 --- /dev/null +++ b/libs/Zend/Controller/Router/Route/Interface.php @@ -0,0 +1,36 @@ +defaults instanceof Zend_Config) ? $config->defaults->toArray() : array(); + return new self($defs); + } + + /** + * Constructor + * + * @param array $defaults Defaults for map variables with keys as variable names + * @param Zend_Controller_Dispatcher_Interface $dispatcher Dispatcher object + * @param Zend_Controller_Request_Abstract $request Request object + */ + public function __construct(array $defaults = array(), + Zend_Controller_Dispatcher_Interface $dispatcher = null, + Zend_Controller_Request_Abstract $request = null) + { + $this->_defaults = $defaults; + + if (isset($request)) { + $this->_request = $request; + } + + if (isset($dispatcher)) { + $this->_dispatcher = $dispatcher; + } + } + + /** + * Set request keys based on values in request object + * + * @return void + */ + protected function _setRequestKeys() + { + if (null !== $this->_request) { + $this->_moduleKey = $this->_request->getModuleKey(); + $this->_controllerKey = $this->_request->getControllerKey(); + $this->_actionKey = $this->_request->getActionKey(); + } + + if (null !== $this->_dispatcher) { + $this->_defaults += array( + $this->_controllerKey => $this->_dispatcher->getDefaultControllerName(), + $this->_actionKey => $this->_dispatcher->getDefaultAction(), + $this->_moduleKey => $this->_dispatcher->getDefaultModule() + ); + } + + $this->_keysSet = true; + } + + /** + * Matches a user submitted path. Assigns and returns an array of variables + * on a successful match. + * + * If a request object is registered, it uses its setModuleName(), + * setControllerName(), and setActionName() accessors to set those values. + * Always returns the values as an array. + * + * @param string $path Path used to match against this routing map + * @return array An array of assigned values or a false on a mismatch + */ + public function match($path) + { + $this->_setRequestKeys(); + + $values = array(); + $params = array(); + $path = trim($path, self::URI_DELIMITER); + + if ($path != '') { + + $path = explode(self::URI_DELIMITER, $path); + + if ($this->_dispatcher && $this->_dispatcher->isValidModule($path[0])) { + $values[$this->_moduleKey] = array_shift($path); + $this->_moduleValid = true; + } + + if (count($path) && !empty($path[0])) { + $values[$this->_controllerKey] = array_shift($path); + } + + if (count($path) && !empty($path[0])) { + $values[$this->_actionKey] = array_shift($path); + } + + 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] = (isset($params[$key]) ? (array_merge((array) $params[$key], array($val))): $val); + } + } + } + + $this->_values = $values + $params; + + return $this->_values + $this->_defaults; + } + + /** + * Assembles user submitted parameters forming a URL path defined by this route + * + * @param array $data An array of variable and value pairs used as parameters + * @param bool $reset Weither to reset the current params + * @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]; + unset($params[$this->_controllerKey]); + + $action = $params[$this->_actionKey]; + unset($params[$this->_actionKey]); + + foreach ($params as $key => $value) { + if (is_array($value)) { + foreach ($value as $arrayValue) { + if ($encode) $arrayValue = urlencode($arrayValue); + $url .= '/' . $key; + $url .= '/' . $arrayValue; + } + } else { + if ($encode) $value = urlencode($value); + $url .= '/' . $key; + $url .= '/' . $value; + } + } + + if (!empty($url) || $action !== $this->_defaults[$this->_actionKey]) { + if ($encode) $action = urlencode($action); + $url = '/' . $action . $url; + } + + if (!empty($url) || $controller !== $this->_defaults[$this->_controllerKey]) { + if ($encode) $controller = urlencode($controller); + $url = '/' . $controller . $url; + } + + if (isset($module)) { + if ($encode) $module = urlencode($module); + $url = '/' . $module . $url; + } + + return ltrim($url, self::URI_DELIMITER); + } + + /** + * Return a single parameter of route's defaults + * + * @param string $name Array key of the parameter + * @return string Previously set default + */ + public function getDefault($name) { + if (isset($this->_defaults[$name])) { + return $this->_defaults[$name]; + } + } + + /** + * Return an array of defaults + * + * @return array Route defaults + */ + public function getDefaults() { + return $this->_defaults; + } + +} diff --git a/libs/Zend/Controller/Router/Route/Regex.php b/libs/Zend/Controller/Router/Route/Regex.php new file mode 100644 index 0000000..15daf58 --- /dev/null +++ b/libs/Zend/Controller/Router/Route/Regex.php @@ -0,0 +1,230 @@ +defaults instanceof Zend_Config) ? $config->defaults->toArray() : array(); + $map = ($config->map instanceof Zend_Config) ? $config->map->toArray() : array(); + $reverse = (isset($config->reverse)) ? $config->reverse : null; + return new self($config->route, $defs, $map, $reverse); + } + + public function __construct($route, $defaults = array(), $map = array(), $reverse = null) + { + $this->_regex = '#^' . $route . '$#i'; + $this->_defaults = (array) $defaults; + $this->_map = (array) $map; + $this->_reverse = $reverse; + } + + 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. + * + * @param string $path Path used to match against this routing map + * @return array|false An array of assigned values or a false on a mismatch + */ + public function match($path) + { + $path = trim(urldecode($path), '/'); + $res = preg_match($this->_regex, $path, $values); + + if ($res === 0) return false; + + // array_filter_key()? Why isn't this in a standard PHP function set yet? :) + foreach ($values as $i => $value) { + if (!is_int($i) || $i === 0) { + unset($values[$i]); + } + } + + $this->_values = $values; + + $values = $this->_getMappedValues($values); + $defaults = $this->_getMappedValues($this->_defaults, false, true); + + $return = $values + $defaults; + + return $return; + } + + /** + * Maps numerically indexed array values to it's associative mapped counterpart. + * Or vice versa. Uses user provided map array which consists of index => name + * parameter mapping. If map is not found, it returns original array. + * + * Method strips destination type of keys form source array. Ie. if source array is + * indexed numerically then every associative key will be stripped. Vice versa if reversed + * is set to true. + * + * @param array $values Indexed or associative array of values to map + * @param boolean $reversed False means translation of index to association. True means reverse. + * @param boolean $preserve Should wrong type of keys be preserved or stripped. + * @return array An array of mapped values + */ + protected function _getMappedValues($values, $reversed = false, $preserve = false) + { + if (count($this->_map) == 0) { + return $values; + } + + $return = array(); + + foreach ($values as $key => $value) { + if (is_int($key) && !$reversed) { + if (array_key_exists($key, $this->_map)) { + $index = $this->_map[$key]; + } elseif (false === ($index = array_search($key, $this->_map))) { + $index = $key; + } + $return[$index] = $values[$key]; + } elseif ($reversed) { + $index = (!is_int($key)) ? array_search($key, $this->_map, true) : $key; + if (false !== $index) { + $return[$index] = $values[$key]; + } + } elseif ($preserve) { + $return[$key] = $value; + } + } + + return $return; + } + + /** + * Assembles a URL path defined by this route + * + * @param array $data An array of name (or index) and value pairs used as parameters + * @return string Route path with user submitted parameters + */ + public function assemble($data = array(), $reset = false, $encode = false) + { + if ($this->_reverse === null) { + require_once 'Zend/Controller/Router/Exception.php'; + throw new Zend_Controller_Router_Exception('Cannot assemble. Reversed route is not specified.'); + } + + $defaultValuesMapped = $this->_getMappedValues($this->_defaults, true, false); + $matchedValuesMapped = $this->_getMappedValues($this->_values, true, false); + $dataValuesMapped = $this->_getMappedValues($data, true, false); + + // handle resets, if so requested (By null value) to do so + if (($resetKeys = array_search(null, $dataValuesMapped, true)) !== false) { + foreach ((array) $resetKeys as $resetKey) { + if (isset($matchedValuesMapped[$resetKey])) { + unset($matchedValuesMapped[$resetKey]); + unset($dataValuesMapped[$resetKey]); + } + } + } + + // merge all the data together, first defaults, then values matched, then supplied + $mergedData = $defaultValuesMapped; + $mergedData = $this->_arrayMergeNumericKeys($mergedData, $matchedValuesMapped); + $mergedData = $this->_arrayMergeNumericKeys($mergedData, $dataValuesMapped); + + if ($encode) { + foreach ($mergedData as $key => &$value) { + $value = urlencode($value); + } + } + + ksort($mergedData); + + $return = @vsprintf($this->_reverse, $mergedData); + + if ($return === false) { + require_once 'Zend/Controller/Router/Exception.php'; + throw new Zend_Controller_Router_Exception('Cannot assemble. Too few arguments?'); + } + + return $return; + + } + + /** + * Return a single parameter of route's defaults + * + * @param string $name Array key of the parameter + * @return string Previously set default + */ + public function getDefault($name) { + if (isset($this->_defaults[$name])) { + return $this->_defaults[$name]; + } + } + + /** + * Return an array of defaults + * + * @return array Route defaults + */ + public function getDefaults() { + return $this->_defaults; + } + + /** + * _arrayMergeNumericKeys() - allows for a strict key (numeric's included) array_merge. + * php's array_merge() lacks the ability to merge with numeric keys. + * + * @param array $array1 + * @param array $array2 + * @return array + */ + protected function _arrayMergeNumericKeys(Array $array1, Array $array2) + { + $returnArray = $array1; + foreach ($array2 as $array2Index => $array2Value) { + $returnArray[$array2Index] = $array2Value; + } + return $returnArray; + } + + +} diff --git a/libs/Zend/Controller/Router/Route/Static.php b/libs/Zend/Controller/Router/Route/Static.php new file mode 100644 index 0000000..fa98aaf --- /dev/null +++ b/libs/Zend/Controller/Router/Route/Static.php @@ -0,0 +1,116 @@ +defaults instanceof Zend_Config) ? $config->defaults->toArray() : array(); + return new self($config->route, $defs); + } + + /** + * Prepares the route for mapping. + * + * @param string $route Map used to match with later submitted URL path + * @param array $defaults Defaults for map variables with keys as variable names + */ + public function __construct($route, $defaults = array()) + { + $this->_route = trim($route, '/'); + $this->_defaults = (array) $defaults; + } + + /** + * Matches a user submitted path with a previously defined route. + * Assigns and returns an array of defaults on a successful match. + * + * @param string $path Path used to match against this routing map + * @return array|false An array of assigned values or a false on a mismatch + */ + public function match($path) + { + if (trim($path, '/') == $this->_route) { + return $this->_defaults; + } + return false; + } + + /** + * Assembles a URL path defined by this route + * + * @param array $data An array of variable and value pairs used as parameters + * @return string Route path with user submitted parameters + */ + public function assemble($data = array(), $reset = false, $encode = false) + { + return $this->_route; + } + + /** + * Return a single parameter of route's defaults + * + * @param string $name Array key of the parameter + * @return string Previously set default + */ + public function getDefault($name) { + if (isset($this->_defaults[$name])) { + return $this->_defaults[$name]; + } + return null; + } + + /** + * Return an array of defaults + * + * @return array Route defaults + */ + public function getDefaults() { + return $this->_defaults; + } + +} diff --git a/libs/Zend/Currency.php b/libs/Zend/Currency.php new file mode 100644 index 0000000..1e13c70 --- /dev/null +++ b/libs/Zend/Currency.php @@ -0,0 +1,609 @@ + Position for the currency sign + * 'script' => Script for the output + * 'format' => Locale for numeric output + * 'display' => Currency detail to show + * 'precision' => Precision for the currency + * 'name' => Name for this currency + * 'currency' => 3 lettered international abbreviation + * 'symbol' => Currency symbol + * + * @var array + * @see Zend_Locale + */ + protected $_options = array( + 'position' => self::STANDARD, + 'script' => null, + 'format' => null, + 'display' => self::NO_SYMBOL, + 'precision' => 2, + 'name' => null, + 'currency' => null, + 'symbol' => null + ); + + /** + * Creates a currency instance. Every supressed parameter is used from the actual or the given locale. + * + * @param string $currency OPTIONAL currency short name + * @param string|Zend_Locale $locale OPTIONAL locale name + * @throws Zend_Currency_Exception When currency is invalid + */ + public function __construct($currency = null, $locale = null) + { + if (Zend_Locale::isLocale($currency, true, false)) { + $temp = $locale; + $locale = $currency; + $currency = $temp; + } + + if (empty($locale)) { + require_once 'Zend/Registry.php'; + if (Zend_Registry::isRegistered('Zend_Locale') === true) { + $locale = Zend_Registry::get('Zend_Locale'); + } + } + + $this->setLocale($locale); + + // Get currency details + $this->_options['currency'] = self::getShortName($currency, $this->_locale); + $this->_options['name'] = self::getName($currency, $this->_locale); + $this->_options['symbol'] = self::getSymbol($currency, $this->_locale); + + if (($this->_options['currency'] === null) and ($this->_options['name'] === null)) { + require_once 'Zend/Currency/Exception.php'; + throw new Zend_Currency_Exception("Currency '$currency' not found"); + } + + // Get the format + $this->_options['position'] = $this->_updateFormat(); + $this->_options['display'] = self::NO_SYMBOL; + if (empty($this->_options['symbol']) === false) { + $this->_options['display'] = self::USE_SYMBOL; + } else if (empty($this->_options['currency']) === false) { + $this->_options['display'] = self::USE_SHORTNAME; + } + } + + /** + * Gets the information required for formating the currency from Zend_Locale + * + * @return Zend_Currency + */ + protected function _updateFormat() + { + $locale = (empty($this->_options['format']) === true) ? $this->_locale : $this->_options['format']; + + // Getting the format information of the currency + $format = Zend_Locale_Data::getContent($locale, 'currencynumber'); + + iconv_set_encoding('internal_encoding', 'UTF-8'); + if (iconv_strpos($format, ';') !== false) { + $format = iconv_substr($format, 0, iconv_strpos($format, ';')); + } + + // Knowing the sign positioning information + if (iconv_strpos($format, '¤') === 0) { + $position = self::LEFT; + } else if (iconv_strpos($format, '¤') === (iconv_strlen($format) - 1)) { + $position = self::RIGHT; + } + + return $position; + } + + /** + * Returns a localized currency string + * + * @param integer|float $value Currency value + * @param array $options OPTIONAL options to set temporary + * @throws Zend_Currency_Exception When the value is not a number + * @return string + */ + public function toCurrency($value, array $options = array()) + { + // Validate the passed number + if ((isset($value) === false) or (is_numeric($value) === false)) { + require_once 'Zend/Currency/Exception.php'; + throw new Zend_Currency_Exception("Value '$value' has to be numeric"); + } + + $options = $this->_checkOptions($options) + $this->_options; + + // Format the number + if (empty($options['format']) === true) { + $options['format'] = $this->_locale; + } + + $value = Zend_Locale_Format::toNumber($value, array('locale' => $options['format'], + 'precision' => $options['precision'])); + + // Localize the number digits + if (empty($options['script']) === false) { + $value = Zend_Locale_Format::convertNumerals($value, 'Latn', $options['script']); + } + + // Get the sign to be placed next to the number + if (is_numeric($options['display']) === false) { + $sign = ' ' . $options['display'] . ' '; + } else { + switch($options['display']) { + case self::USE_SYMBOL: + $sign = ' ' . $options['symbol'] . ' '; + break; + + case self::USE_SHORTNAME: + $sign = ' ' . $options['currency'] . ' '; + break; + + case self::USE_NAME: + $sign = ' ' . $options['name'] . ' '; + break; + + default: + $sign = ''; + break; + } + } + + // Place the sign next to the number + if ($options['position'] === self::RIGHT) { + $value = $value . $sign; + } else if ($options['position'] === self::LEFT) { + $value = $sign . $value; + } + + return trim($value); + } + + /** + * Sets the formating options of the localized currency string + * If no parameter is passed, the standard setting of the + * actual set locale will be used + * + * @param array $options (Optional) Options to set + * @return Zend_Currency + */ + public function setFormat(array $options = array()) + { + $this->_options = $this->_checkOptions($options) + $this->_options; + return $this; + } + + /** + * Internal function for checking static given locale parameter + * + * @param string $currency (Optional) Currency name + * @param string|Zend_Locale $locale (Optional) Locale to display informations + * @throws Zend_Currency_Exception When locale contains no region + * @return string The extracted locale representation as string + */ + private function _checkParams($currency = null, $locale = null) + { + // Manage the params + if ((empty($locale)) and (!empty($currency)) and + (Zend_Locale::isLocale($currency, true, false))) { + $locale = $currency; + $currency = null; + } + + // Validate the locale and get the country short name + $country = null; + if ((Zend_Locale::isLocale($locale, true, false)) and (strlen($locale) > 4)) { + $country = substr($locale, (strpos($locale, '_') + 1)); + } else { + require_once 'Zend/Currency/Exception.php'; + throw new Zend_Currency_Exception("No region found within the locale '" . (string) $locale . "'"); + } + + // Get the available currencies for this country + $data = Zend_Locale_Data::getContent($locale, 'currencytoregion', $country); + if ((empty($currency) === false) and (empty($data) === false)) { + $abbreviation = $currency; + } else { + $abbreviation = $data; + } + + return array('locale' => $locale, 'currency' => $currency, 'name' => $abbreviation, 'country' => $country); + } + + /** + * Returns the actual or details of other currency symbols, + * when no symbol is available it returns the currency shortname (f.e. FIM for Finnian Mark) + * + * @param string $currency (Optional) Currency name + * @param string|Zend_Locale $locale (Optional) Locale to display informations + * @return string + */ + public function getSymbol($currency = null, $locale = null) + { + if (($currency === null) and ($locale === null)) { + return $this->_options['symbol']; + } + + $params = self::_checkParams($currency, $locale); + + // Get the symbol + $symbol = Zend_Locale_Data::getContent($params['locale'], 'currencysymbol', $params['currency']); + if (empty($symbol) === true) { + $symbol = Zend_Locale_Data::getContent($params['locale'], 'currencysymbol', $params['name']); + } + + if (empty($symbol) === true) { + return null; + } + + return $symbol; + } + + /** + * Returns the actual or details of other currency shortnames + * + * @param string $currency OPTIONAL Currency's name + * @param string|Zend_Locale $locale OPTIONAL The locale + * @return string + */ + public function getShortName($currency = null, $locale = null) + { + if (($currency === null) and ($locale === null)) { + return $this->_options['currency']; + } + + $params = self::_checkParams($currency, $locale); + + // Get the shortname + if (empty($params['currency']) === true) { + return $params['name']; + } + + $list = Zend_Locale_Data::getContent($params['locale'], 'currencytoname', $params['currency']); + if (empty($list) === true) { + $list = Zend_Locale_Data::getContent($params['locale'], 'nametocurrency', $params['currency']); + if (empty($list) === false) { + $list = $params['currency']; + } + } + + if (empty($list) === true) { + return null; + } + + return $list; + } + + /** + * Returns the actual or details of other currency names + * + * @param string $currency (Optional) Currency's short name + * @param string|Zend_Locale $locale (Optional) The locale + * @return string + */ + public function getName($currency = null, $locale = null) + { + if (($currency === null) and ($locale === null)) { + return $this->_options['name']; + } + + $params = self::_checkParams($currency, $locale); + + // Get the name + $name = Zend_Locale_Data::getContent($params['locale'], 'nametocurrency', $params['currency']); + if (empty($name) === true) { + $name = Zend_Locale_Data::getContent($params['locale'], 'nametocurrency', $params['name']); + } + + if (empty($name) === true) { + return null; + } + + return $name; + } + + /** + * Returns a list of regions where this currency is or was known + * + * @param string $currency OPTIONAL Currency's short name + * @throws Zend_Currency_Exception When no currency was defined + * @return array List of regions + */ + public function getRegionList($currency = null) + { + if ($currency === null) { + $currency = $this->_options['currency']; + } + + if (empty($currency) === true) { + require_once 'Zend/Currency/Exception.php'; + throw new Zend_Currency_Exception('No currency defined'); + } + + $data = Zend_Locale_Data::getContent('', 'regiontocurrency', $currency); + + $result = explode(' ', $data); + return $result; + } + + /** + * Returns a list of currencies which are used in this region + * a region name should be 2 charachters only (f.e. EG, DE, US) + * If no region is given, the actual region is used + * + * @param string $region OPTIONAL Region to return the currencies for + * @return array List of currencies + */ + public function getCurrencyList($region = null) + { + if (empty($region) === true) { + if (strlen($this->_locale) > 4) { + $region = substr($this->_locale, (strpos($this->_locale, '_') + 1)); + } + } + + return Zend_Locale_Data::getList('', 'regiontocurrency', $region); + } + + /** + * Returns the actual currency name + * + * @return string + */ + public function toString() + { + return (empty($this->_options['name']) === false) ? $this->_options['name'] : $this->_options['currency']; + } + + /** + * Returns the currency name + * + * @return string + */ + public function __toString() + { + return $this->toString(); + } + + /** + * Returns the set cache + * + * @return Zend_Cache_Core The set cache + */ + public static function getCache() + { + $cache = Zend_Locale_Data::getCache(); + return $cache; + } + + /** + * Sets a cache for Zend_Currency + * + * @param Zend_Cache_Core $cache Cache to set + * @return void + */ + public static function setCache(Zend_Cache_Core $cache) + { + Zend_Locale_Data::setCache($cache); + } + + /** + * Returns true when a cache is set + * + * @return boolean + */ + public static function hasCache() + { + return Zend_Locale_Data::hasCache(); + } + + /** + * Removes any set cache + * + * @return void + */ + public static function removeCache() + { + Zend_Locale_Data::removeCache(); + } + + /** + * Clears all set cache data + * + * @return void + */ + public static function clearCache() + { + Zend_Locale_Data::clearCache(); + } + + /** + * Sets a new locale for data retreivement + * Example: 'de_XX' will be set to 'de' because 'de_XX' does not exist + * 'xx_YY' will be set to 'root' because 'xx' does not exist + * + * @param string|Zend_Locale $locale (Optional) Locale for parsing input + * @throws Zend_Currency_Exception When the given locale does not exist + * @return Zend_Currency Provides fluent interface + */ + public function setLocale($locale = null) + { + if (!Zend_Locale::isLocale($locale, false, false)) { + if (!Zend_Locale::isLocale($locale, true, false)) { + require_once 'Zend/Currency/Exception.php'; + throw new Zend_Currency_Exception("Given locale (" . (string) $locale . ") does not exist"); + } else { + $locale = new Zend_Locale(); + } + } + + $this->_locale = (string) $locale; + + // Get currency details + $this->_options['currency'] = $this->getShortName(null, $this->_locale); + $this->_options['name'] = $this->getName(null, $this->_locale); + $this->_options['symbol'] = $this->getSymbol(null, $this->_locale); + + return $this; + } + + /** + * Returns the actual set locale + * + * @return string + */ + public function getLocale() + { + return $this->_locale; + } + + /** + * Internal method for checking the options array + * + * @param array $options Options to check + * @throws Zend_Currency_Exception On unknown position + * @throws Zend_Currency_Exception On unknown locale + * @throws Zend_Currency_Exception On unknown display + * @throws Zend_Currency_Exception On precision not between -1 and 30 + * @throws Zend_Currency_Exception On problem with script conversion + * @throws Zend_Currency_Exception On unknown options + * @return array + */ + private function _checkOptions(array $options = array()) + { + if (count($options) === 0) { + return $this->_options; + } + + foreach ($options as $name => $value) { + $name = strtolower($name); + if ($name !== 'format') { + if (gettype($value) === 'string') { + $value = strtolower($value); + } + } + + switch($name) { + case 'position': + if (($value !== self::STANDARD) and ($value !== self::RIGHT) and ($value !== self::LEFT)) { + require_once 'Zend/Currency/Exception.php'; + throw new Zend_Currency_Exception("Unknown position '" . $value . "'"); + } + + if ($value === self::STANDARD) { + $options['position'] = $this->_updateFormat(); + } + break; + + case 'format': + if ((empty($value) === false) and (Zend_Locale::isLocale($value, null, false) === false)) { + require_once 'Zend/Currency/Exception.php'; + throw new Zend_Currency_Exception("'" . + ((gettype($value) === 'object') ? get_class($value) : $value) + . "' is not a known locale."); + } + break; + + case 'display': + if (is_numeric($value) and ($value !== self::NO_SYMBOL) and ($value !== self::USE_SYMBOL) and + ($value !== self::USE_SHORTNAME) and ($value !== self::USE_NAME)) { + require_once 'Zend/Currency/Exception.php'; + throw new Zend_Currency_Exception("Unknown display '$value'"); + } + break; + + case 'precision': + if ($value === null) { + $value = -1; + } + + if (($value < -1) or ($value > 30)) { + require_once 'Zend/Currency/Exception.php'; + throw new Zend_Currency_Exception("'$value' precision has to be between -1 and 30."); + } + break; + + case 'script': + try { + Zend_Locale_Format::convertNumerals(0, $options['script']); + } catch (Zend_Locale_Exception $e) { + require_once 'Zend/Currency/Exception.php'; + throw new Zend_Currency_Exception($e->getMessage()); + } + break; + + case 'name': + // Break intentionally omitted + case 'currency': + // Break intentionally omitted + case 'symbol': + // Unchecked options + break; + + default: + require_once 'Zend/Currency/Exception.php'; + throw new Zend_Currency_Exception("Unknown option: '$name' = '$value'"); + break; + } + } + + return $options; + } +} diff --git a/libs/Zend/Currency/Exception.php b/libs/Zend/Currency/Exception.php new file mode 100644 index 0000000..145c0bb --- /dev/null +++ b/libs/Zend/Currency/Exception.php @@ -0,0 +1,37 @@ + 'iso', // format for date strings 'iso' or 'php' + 'fix_dst' => true, // fix dst on summer/winter time change + 'extend_month' => false, // false - addMonth like SQL, true like excel + 'cache' => null, // cache to set + 'timesync' => null // timesync server to set + ); + + // Class wide Date Constants + // day formats + const DAY = 'DAY'; // d - 2 digit day of month, 01-31 + const DAY_SHORT = 'DAY_SHORT'; // j - 1,2 digit day of month, 1-31 + + const DAY_SUFFIX = 'DAY_SUFFIX'; // S - english suffix day of month, st-th + const DAY_OF_YEAR = 'DAY_OF_YEAR'; // z - Number of day of year + + const WEEKDAY = 'WEEKDAY'; // l - full day name - locale aware, Monday - Sunday + const WEEKDAY_SHORT = 'WEEKDAY_SHORT'; // --- 3 letter day of week - locale aware, Mon-Sun + const WEEKDAY_NARROW = 'WEEKDAY_NARROW'; // --- 1 letter day name - locale aware, M-S + const WEEKDAY_NAME = 'WEEKDAY_NAME'; // D - abbreviated day name, 1-3 letters - locale aware, Mon-Sun + + const WEEKDAY_8601 = 'WEEKDAY_8601'; // N - digit weekday ISO 8601, 1-7 1 = monday, 7=sunday + const WEEKDAY_DIGIT = 'WEEKDAY_DIGIT'; // w - weekday, 0-6 0=sunday, 6=saturday + + // week formats + const WEEK = 'WEEK'; // W - number of week ISO8601, 1-53 + + // month formats + const MONTH = 'MONTH'; // m - 2 digit month, 01-12 + const MONTH_SHORT = 'MONTH_SHORT'; // n - 1 digit month, no leading zeros, 1-12 + + const MONTH_DAYS = 'MONTH_DAYS'; // t - Number of days this month + + const MONTH_NAME = 'MONTH_NAME'; // F - full month name - locale aware, January-December + const MONTH_NAME_SHORT = 'MONTH_NAME_SHORT'; // M - 3 letter monthname - locale aware, Jan-Dec + const MONTH_NAME_NARROW = 'MONTH_NAME_NARROW'; // --- 1 letter month name - locale aware, J-D + + // year formats + const YEAR = 'YEAR'; // Y - 4 digit year + const YEAR_SHORT = 'YEAR_SHORT'; // y - 2 digit year, leading zeros 00-99 + + const YEAR_8601 = 'YEAR_8601'; // o - number of year ISO8601 + const YEAR_SHORT_8601= 'YEAR_SHORT_8601';// --- 2 digit number of year ISO8601 + + const LEAPYEAR = 'LEAPYEAR'; // L - is leapyear ?, 0-1 + + // time formats + const MERIDIEM = 'MERIDIEM'; // A,a - AM/PM - locale aware, AM/PM + const SWATCH = 'SWATCH'; // B - Swatch Internet Time + + const HOUR = 'HOUR'; // H - 2 digit hour, leading zeros, 00-23 + const HOUR_SHORT = 'HOUR_SHORT'; // G - 1 digit hour, no leading zero, 0-23 + + const HOUR_AM = 'HOUR_AM'; // h - 2 digit hour, leading zeros, 01-12 am/pm + const HOUR_SHORT_AM = 'HOUR_SHORT_AM'; // g - 1 digit hour, no leading zero, 1-12 am/pm + + const MINUTE = 'MINUTE'; // i - 2 digit minute, leading zeros, 00-59 + const MINUTE_SHORT = 'MINUTE_SHORT'; // --- 1 digit minute, no leading zero, 0-59 + + const SECOND = 'SECOND'; // s - 2 digit second, leading zeros, 00-59 + const SECOND_SHORT = 'SECOND_SHORT'; // --- 1 digit second, no leading zero, 0-59 + + const MILLISECOND = 'MILLISECOND'; // --- milliseconds + + // timezone formats + const TIMEZONE_NAME = 'TIMEZONE_NAME'; // e - timezone string + const DAYLIGHT = 'DAYLIGHT'; // I - is Daylight saving time ?, 0-1 + const GMT_DIFF = 'GMT_DIFF'; // O - GMT difference, -1200 +1200 + const GMT_DIFF_SEP = 'GMT_DIFF_SEP'; // P - seperated GMT diff, -12:00 +12:00 + const TIMEZONE = 'TIMEZONE'; // T - timezone, EST, GMT, MDT + const TIMEZONE_SECS = 'TIMEZONE_SECS'; // Z - timezone offset in seconds, -43200 +43200 + + // date strings + const ISO_8601 = 'ISO_8601'; // c - ISO 8601 date string + const RFC_2822 = 'RFC_2822'; // r - RFC 2822 date string + const TIMESTAMP = 'TIMESTAMP'; // U - unix timestamp + + // additional formats + const ERA = 'ERA'; // --- short name of era, locale aware, + const ERA_NAME = 'ERA_NAME'; // --- full name of era, locale aware, + const DATES = 'DATES'; // --- standard date, locale aware + const DATE_FULL = 'DATE_FULL'; // --- full date, locale aware + const DATE_LONG = 'DATE_LONG'; // --- long date, locale aware + const DATE_MEDIUM = 'DATE_MEDIUM'; // --- medium date, locale aware + const DATE_SHORT = 'DATE_SHORT'; // --- short date, locale aware + const TIMES = 'TIMES'; // --- standard time, locale aware + const TIME_FULL = 'TIME_FULL'; // --- full time, locale aware + const TIME_LONG = 'TIME_LONG'; // --- long time, locale aware + const TIME_MEDIUM = 'TIME_MEDIUM'; // --- medium time, locale aware + const TIME_SHORT = 'TIME_SHORT'; // --- short time, locale aware + const ATOM = 'ATOM'; // --- DATE_ATOM + const COOKIE = 'COOKIE'; // --- DATE_COOKIE + const RFC_822 = 'RFC_822'; // --- DATE_RFC822 + const RFC_850 = 'RFC_850'; // --- DATE_RFC850 + const RFC_1036 = 'RFC_1036'; // --- DATE_RFC1036 + const RFC_1123 = 'RFC_1123'; // --- DATE_RFC1123 + const RFC_3339 = 'RFC_3339'; // --- DATE_RFC3339 + const RSS = 'RSS'; // --- DATE_RSS + const W3C = 'W3C'; // --- DATE_W3C + + /** + * Generates the standard date object, could be a unix timestamp, localized date, + * string, integer, array and so on. Also parts of dates or time are supported + * Always set the default timezone: http://php.net/date_default_timezone_set + * For example, in your bootstrap: date_default_timezone_set('America/Los_Angeles'); + * For detailed instructions please look in the docu. + * + * @param string|integer|Zend_Date|array $date OPTIONAL Date value or value of date part to set + * ,depending on $part. If null the actual time is set + * @param string $part OPTIONAL Defines the input format of $date + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return Zend_Date + * @throws Zend_Date_Exception + */ + public function __construct($date = null, $part = null, $locale = null) + { + if (($date !== null) and !($date instanceof Zend_TimeSync_Protocol) and (Zend_Locale::isLocale($date, true, false))) { + $locale = $date; + $date = null; + $part = null; + } else if (($part !== null) and (Zend_Locale::isLocale($part, null, false))) { + $locale = $part; + $part = null; + } + + if (empty($locale)) { + require_once 'Zend/Registry.php'; + if (Zend_Registry::isRegistered('Zend_Locale') === true) { + $locale = Zend_Registry::get('Zend_Locale'); + } + } + + $this->setLocale($locale); + + if (is_string($date) && defined('self::' . $date)) { + $part = $date; + $date = null; + } + + if (is_null($date)) { + $date = self::now($locale); + if (($part !== null) && ($part !== self::TIMESTAMP)) { + $date = $date->get($part); + } + } + + if ($date instanceof Zend_TimeSync_Protocol) { + $date = $date->getInfo(); + $date = $this->_getTime($date['offset']); + $part = null; + } else if (parent::$_defaultOffset != 0) { + $date = $this->_getTime(parent::$_defaultOffset); + } + + // set the timezone and offset for $this + $zone = @date_default_timezone_get(); + $this->setTimezone($zone); + + // try to get timezone from date-string + if (!is_int($date)) { + $zone = $this->getTimezoneFromString($date); + $this->setTimezone($zone); + } + + // set datepart + if (($part !== null && $part !== self::TIMESTAMP) or (!is_numeric($date))) { + // switch off dst handling for value setting + $this->setUnixTimestamp($this->getGmtOffset()); + $this->set($date, $part, $this->_locale); + + // DST fix + if ((is_array($date) === true) and (isset($date['hour']) === true)) { + $hour = $this->toString('H'); + $hour = $date['hour'] - $hour; + if ($hour !== 0) { + $this->addTimestamp($hour * 3600); + } + } + } else { + $this->setUnixTimestamp($date); + } + } + + /** + * Sets class wide options, if no option was given, the actual set options will be returned + * + * @param array $options Options to set + * @throws Zend_Date_Exception + * @return Options array if no option was given + */ + public static function setOptions(array $options = array()) + { + if (empty($options)) { + return self::$_options; + } + foreach ($options as $name => $value) { + $name = strtolower($name); + + if (array_key_exists($name, self::$_options)) { + switch($name) { + case 'format_type' : + if ((strtolower($value) != 'php') && (strtolower($value) != 'iso')) { + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception("Unknown format type ($value) for dates, only 'iso' and 'php' supported", $value); + } + break; + case 'fix_dst' : + if (!is_bool($value)) { + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception("'fix_dst' has to be boolean", $value); + } + break; + case 'extend_month' : + if (!is_bool($value)) { + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception("'extend_month' has to be boolean", $value); + } + break; + case 'cache' : + if (!$value instanceof Zend_Cache_Core) { + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception("Instance of Zend_Cache expected"); + } + parent::$_cache = $value; + Zend_Locale_Data::setCache($value); + break; + case 'timesync' : + if (!$value instanceof Zend_TimeSync_Protocol) { + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception("Instance of Zend_TimeSync expected"); + } + $date = $value->getInfo(); + parent::$_defaultOffset = $date['offset']; + break; + } + self::$_options[$name] = $value; + } + else { + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception("Unknown option: $name = $value"); + } + } + } + + /** + * Returns this object's internal UNIX timestamp (equivalent to Zend_Date::TIMESTAMP). + * If the timestamp is too large for integers, then the return value will be a string. + * This function does not return the timestamp as an object. + * Use clone() or copyPart() instead. + * + * @return integer|string UNIX timestamp + */ + public function getTimestamp() + { + return $this->getUnixTimestamp(); + } + + /** + * Returns the calculated timestamp + * HINT: timestamps are always GMT + * + * @param string $calc Type of calculation to make + * @param string|integer|array|Zend_Date $stamp Timestamp to calculate, when null the actual timestamp is calculated + * @return Zend_Date|integer + * @throws Zend_Date_Exception + */ + private function _timestamp($calc, $stamp) + { + if ($stamp instanceof Zend_Date) { + // extract timestamp from object + $stamp = $stamp->get(self::TIMESTAMP, true); + } + + if (is_array($stamp)) { + if (isset($stamp['timestamp']) === true) { + $stamp = $stamp['timestamp']; + } else { + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception('no timestamp given in array'); + } + } + + if ($calc === 'set') { + $return = $this->setUnixTimestamp($stamp); + } else { + $return = $this->_calcdetail($calc, $stamp, self::TIMESTAMP, null); + } + if ($calc != 'cmp') { + return $this; + } + return $return; + } + + /** + * Sets a new timestamp + * + * @param integer|string|array|Zend_Date $timestamp Timestamp to set + * @return Zend_Date + * @throws Zend_Date_Exception + */ + public function setTimestamp($timestamp) + { + return $this->_timestamp('set', $timestamp); + } + + /** + * Adds a timestamp + * + * @param integer|string|array|Zend_Date $timestamp Timestamp to add + * @return Zend_Date + * @throws Zend_Date_Exception + */ + public function addTimestamp($timestamp) + { + return $this->_timestamp('add', $timestamp); + } + + /** + * Subtracts a timestamp + * + * @param integer|string|array|Zend_Date $timestamp Timestamp to sub + * @return Zend_Date + * @throws Zend_Date_Exception + */ + public function subTimestamp($timestamp) + { + return $this->_timestamp('sub', $timestamp); + } + + /** + * Compares two timestamps, returning the difference as integer + * + * @param integer|string|array|Zend_Date $timestamp Timestamp to compare + * @return integer 0 = equal, 1 = later, -1 = earlier + * @throws Zend_Date_Exception + */ + public function compareTimestamp($timestamp) + { + return $this->_timestamp('cmp', $timestamp); + } + + /** + * Returns a string representation of the object + * Supported format tokens are: + * G - era, y - year, Y - ISO year, M - month, w - week of year, D - day of year, d - day of month + * E - day of week, e - number of weekday (1-7), h - hour 1-12, H - hour 0-23, m - minute, s - second + * A - milliseconds of day, z - timezone, Z - timezone offset, S - fractional second, a - period of day + * + * Additionally format tokens but non ISO conform are: + * SS - day suffix, eee - php number of weekday(0-6), ddd - number of days per month + * l - Leap year, B - swatch internet time, I - daylight saving time, X - timezone offset in seconds + * r - RFC2822 format, U - unix timestamp + * + * Not supported ISO tokens are + * u - extended year, Q - quarter, q - quarter, L - stand alone month, W - week of month + * F - day of week of month, g - modified julian, c - stand alone weekday, k - hour 0-11, K - hour 1-24 + * v - wall zone + * + * @param string $format OPTIONAL Rule for formatting output. If null the default date format is used + * @param string $type OPTIONAL Type for the format string which overrides the standard setting + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return string + */ + public function toString($format = null, $type = null, $locale = null) + { + if ((strlen($format) != 2) and ($format !== null) and (Zend_Locale::isLocale($format, null, false))) { + $locale = $format; + $format = null; + } + + if (($type !== null) and (Zend_Locale::isLocale($type, null, false))) { + $locale = $type; + $type = null; + } + + if ($locale === null) { + $locale = $this->getLocale(); + } + + if ($format === null) { + $format = Zend_Locale_Format::getDateFormat($locale) . ' ' . Zend_Locale_Format::getTimeFormat($locale); + } else if (((self::$_options['format_type'] == 'php') && ($type === null)) or ($type == 'php')) { + $format = Zend_Locale_Format::convertPhpToIsoFormat($format); + } + + // get format tokens + $j = 0; + $comment = false; + $output = array(); + for($i = 0; $i < strlen($format); ++$i) { + + if ($format[$i] == "'") { + if ($comment == false) { + $comment = true; + ++$j; + $output[$j] = "'"; + } else if (isset($format[$i+1]) and ($format[$i+1] == "'")) { + $output[$j] .= "'"; + ++$i; + } else { + $comment = false; + } + continue; + } + + if (isset($output[$j]) and ($output[$j][0] == $format[$i]) or + ($comment == true)) { + $output[$j] .= $format[$i]; + } else { + ++$j; + $output[$j] = $format[$i]; + } + } + + $notset = false; + // fill format tokens with date information + for($i = 1; $i <= count($output); ++$i) { + // fill fixed tokens + switch ($output[$i]) { + + // special formats + case 'SS' : + $output[$i] = $this->date('S', $this->getUnixTimestamp(), false); + break; + + case 'eee' : + $output[$i] = $this->date('N', $this->getUnixTimestamp(), false); + break; + + case 'ddd' : + $output[$i] = $this->date('t', $this->getUnixTimestamp(), false); + break; + + case 'l' : + $output[$i] = $this->date('L', $this->getUnixTimestamp(), false); + break; + + case 'B' : + $output[$i] = $this->date('B', $this->getUnixTimestamp(), false); + break; + + case 'I' : + $output[$i] = $this->date('I', $this->getUnixTimestamp(), false); + break; + + case 'X' : + $output[$i] = $this->date('Z', $this->getUnixTimestamp(), false); + break; + + case 'r' : + $output[$i] = $this->date('r', $this->getUnixTimestamp(), false); + break; + + case 'U' : + $output[$i] = $this->getUnixTimestamp(); + break; + + // eras + case 'GGGGG' : + $output[$i] = substr($this->get(self::ERA, $locale), 0, 1) . "."; + break; + + case 'GGGG' : + $output[$i] = $this->get(self::ERA_NAME, $locale); + break; + + case 'GGG' : + case 'GG' : + case 'G' : + $output[$i] = $this->get(self::ERA, $locale); + break; + + // years + case 'yy' : + $output[$i] = str_pad($this->get(self::YEAR_SHORT, $locale), 2, '0', STR_PAD_LEFT); + break; + + // ISO years + case 'YY' : + $output[$i] = str_pad($this->get(self::YEAR_SHORT_8601, $locale), 2, '0', STR_PAD_LEFT); + break; + + // months + case 'MMMMM' : + $output[$i] = substr($this->get(self::MONTH_NAME_NARROW, $locale), 0, 1); + break; + + case 'MMMM' : + $output[$i] = $this->get(self::MONTH_NAME, $locale); + break; + + case 'MMM' : + $output[$i] = $this->get(self::MONTH_NAME_SHORT, $locale); + break; + + case 'MM' : + $output[$i] = $this->get(self::MONTH, $locale); + break; + + case 'M' : + $output[$i] = $this->get(self::MONTH_SHORT, $locale); + break; + + // week + case 'ww' : + $output[$i] = str_pad($this->get(self::WEEK, $locale), 2, '0', STR_PAD_LEFT); + break; + + case 'w' : + $output[$i] = $this->get(self::WEEK, $locale); + break; + + // monthday + case 'dd' : + $output[$i] = $this->get(self::DAY, $locale); + break; + + case 'd' : + $output[$i] = $this->get(self::DAY_SHORT, $locale); + break; + + // yearday + case 'DDD' : + $output[$i] = str_pad($this->get(self::DAY_OF_YEAR, $locale), 3, '0', STR_PAD_LEFT); + break; + + case 'DD' : + $output[$i] = str_pad($this->get(self::DAY_OF_YEAR, $locale), 2, '0', STR_PAD_LEFT); + break; + + case 'D' : + $output[$i] = $this->get(self::DAY_OF_YEAR, $locale); + break; + + // weekday + case 'EEEEE' : + $output[$i] = $this->get(self::WEEKDAY_NARROW, $locale); + break; + + case 'EEEE' : + $output[$i] = $this->get(self::WEEKDAY, $locale); + break; + + case 'EEE' : + $output[$i] = $this->get(self::WEEKDAY_SHORT, $locale); + break; + + case 'EE' : + $output[$i] = $this->get(self::WEEKDAY_NAME, $locale); + break; + + case 'E' : + $output[$i] = $this->get(self::WEEKDAY_NARROW, $locale); + break; + + // weekday number + case 'ee' : + $output[$i] = str_pad($this->get(self::WEEKDAY_8601, $locale), 2, '0', STR_PAD_LEFT); + break; + + case 'e' : + $output[$i] = $this->get(self::WEEKDAY_8601, $locale); + break; + + + // period + case 'a' : + $output[$i] = $this->get(self::MERIDIEM, $locale); + break; + + // hour + case 'hh' : + $output[$i] = $this->get(self::HOUR_AM, $locale); + break; + + case 'h' : + $output[$i] = $this->get(self::HOUR_SHORT_AM, $locale); + break; + + case 'HH' : + $output[$i] = $this->get(self::HOUR, $locale); + break; + + case 'H' : + $output[$i] = $this->get(self::HOUR_SHORT, $locale); + break; + + // minute + case 'mm' : + $output[$i] = $this->get(self::MINUTE, $locale); + break; + + case 'm' : + $output[$i] = $this->get(self::MINUTE_SHORT, $locale); + break; + + // second + case 'ss' : + $output[$i] = $this->get(self::SECOND, $locale); + break; + + case 's' : + $output[$i] = $this->get(self::SECOND_SHORT, $locale); + break; + + case 'S' : + $output[$i] = $this->get(self::MILLISECOND, $locale); + break; + + // zone + // @todo v needs to be reworked as it's the long wall time and not the timezone + case 'vvvv' : + case 'zzzz' : + $output[$i] = $this->get(self::TIMEZONE_NAME, $locale); + break; + + // @todo v needs to be reworked as it's the short wall time and not the timezone + case 'v' : + case 'zzz' : + case 'zz' : + case 'z' : + $output[$i] = $this->get(self::TIMEZONE, $locale); + break; + + // zone offset + case 'ZZZZ' : + $output[$i] = $this->get(self::GMT_DIFF_SEP, $locale); + break; + + case 'ZZZ' : + case 'ZZ' : + case 'Z' : + $output[$i] = $this->get(self::GMT_DIFF, $locale); + break; + + default : + $notset = true; + break; + } + + // fill variable tokens + if ($notset == true) { + if (($output[$i][0] !== "'") and (preg_match('/y+/', $output[$i]))) { + $length = strlen($output[$i]); + $output[$i] = $this->get(self::YEAR, $locale); + $output[$i] = str_pad($output[$i], $length, '0', STR_PAD_LEFT); + } + + if (($output[$i][0] !== "'") and (preg_match('/Y+/', $output[$i]))) { + $length = strlen($output[$i]); + $output[$i] = $this->get(self::YEAR_8601, $locale); + $output[$i] = str_pad($output[$i], $length, '0', STR_PAD_LEFT); + } + + if (($output[$i][0] !== "'") and (preg_match('/A+/', $output[$i]))) { + $length = strlen($output[$i]); + $seconds = $this->get(self::TIMESTAMP, $locale); + $month = $this->get(self::MONTH_SHORT, $locale); + $day = $this->get(self::DAY_SHORT, $locale); + $year = $this->get(self::YEAR, $locale); + + $seconds -= $this->mktime(0, 0, 0, $month, $day, $year, false); + $output[$i] = str_pad($seconds, $length, '0', STR_PAD_LEFT); + } + + if ($output[$i][0] === "'") { + $output[$i] = substr($output[$i], 1); + } + } + $notset = false; + } + + return implode('', $output); + } + + /** + * Returns a string representation of the date which is equal with the timestamp + * + * @return string + */ + public function __toString() + { + return $this->toString(null, $this->_locale); + } + + /** + * Returns a integer representation of the object + * But returns false when the given part is no value f.e. Month-Name + * + * @param string|integer|Zend_Date $part OPTIONAL Defines the date or datepart to return as integer + * @return integer|false + */ + public function toValue($part = null) + { + $result = $this->get($part); + if (is_numeric($result)) { + return intval("$result"); + } else { + return false; + } + } + + /** + * Returns an array representation of the object + * + * @return array + */ + public function toArray() + { + return array('day' => $this->get(self::DAY_SHORT), + 'month' => $this->get(self::MONTH_SHORT), + 'year' => $this->get(self::YEAR), + 'hour' => $this->get(self::HOUR_SHORT), + 'minute' => $this->get(self::MINUTE_SHORT), + 'second' => $this->get(self::SECOND_SHORT), + 'timezone' => $this->get(self::TIMEZONE), + 'timestamp' => $this->get(self::TIMESTAMP), + 'weekday' => $this->get(self::WEEKDAY_DIGIT), + 'dayofyear' => $this->get(self::DAY_OF_YEAR), + 'week' => $this->get(self::WEEK), + 'gmtsecs' => $this->get(self::TIMEZONE_SECS)); + } + + /** + * Returns a representation of a date or datepart + * This could be for example a localized monthname, the time without date, + * the era or only the fractional seconds. There are about 50 different supported date parts. + * For a complete list of supported datepart values look into the docu + * + * @param string $part OPTIONAL Part of the date to return, if null the timestamp is returned + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return integer|string date or datepart + */ + public function get($part = null, $locale = null) + { + if ($locale === null) { + $locale = $this->getLocale(); + } + + if (($part !== null) and (Zend_Locale::isLocale($part, null, false))) { + $locale = $part; + $part = null; + } + + if ($part === null) { + $part = self::TIMESTAMP; + } + + if (!defined("self::".$part)) { + return $this->toString($part, $locale); + } + + switch($part) { + + // day formats + case self::DAY : + return $this->date('d', $this->getUnixTimestamp(), false); + break; + + case self::WEEKDAY_SHORT : + $weekday = strtolower($this->date('D', $this->getUnixTimestamp(), false)); + $day = Zend_Locale_Data::getContent($locale, 'day', array('gregorian', 'format', 'wide', $weekday)); + return substr($day, 0, 3); + break; + + case self::DAY_SHORT : + return $this->date('j', $this->getUnixTimestamp(), false); + break; + + case self::WEEKDAY : + $weekday = strtolower($this->date('D', $this->getUnixTimestamp(), false)); + return Zend_Locale_Data::getContent($locale, 'day', array('gregorian', 'format', 'wide', $weekday)); + break; + + case self::WEEKDAY_8601 : + return $this->date('N', $this->getUnixTimestamp(), false); + break; + + case self::DAY_SUFFIX : + return $this->date('S', $this->getUnixTimestamp(), false); + break; + + case self::WEEKDAY_DIGIT : + return $this->date('w', $this->getUnixTimestamp(), false); + break; + + case self::DAY_OF_YEAR : + return $this->date('z', $this->getUnixTimestamp(), false); + break; + + case self::WEEKDAY_NARROW : + $weekday = strtolower($this->date('D', $this->getUnixTimestamp(), false)); + $day = Zend_Locale_Data::getContent($locale, 'day', array('gregorian', 'format', 'abbreviated', $weekday)); + return substr($day, 0, 1); + break; + + case self::WEEKDAY_NAME : + $weekday = strtolower($this->date('D', $this->getUnixTimestamp(), false)); + return Zend_Locale_Data::getContent($locale, 'day', array('gregorian', 'format', 'abbreviated', $weekday)); + break; + + // week formats + case self::WEEK : + return $this->date('W', $this->getUnixTimestamp(), false); + break; + + // month formats + case self::MONTH_NAME : + $month = $this->date('n', $this->getUnixTimestamp(), false); + return Zend_Locale_Data::getContent($locale, 'month', array('gregorian', 'format', 'wide', $month)); + break; + + case self::MONTH : + return $this->date('m', $this->getUnixTimestamp(), false); + break; + + case self::MONTH_NAME_SHORT : + $month = $this->date('n', $this->getUnixTimestamp(), false); + return Zend_Locale_Data::getContent($locale, 'month', array('gregorian', 'format', 'abbreviated', $month)); + break; + + case self::MONTH_SHORT : + return $this->date('n', $this->getUnixTimestamp(), false); + break; + + case self::MONTH_DAYS : + return $this->date('t', $this->getUnixTimestamp(), false); + break; + + case self::MONTH_NAME_NARROW : + $month = $this->date('n', $this->getUnixTimestamp(), false); + $mon = Zend_Locale_Data::getContent($locale, 'month', array('gregorian', 'format', 'abbreviated', $month)); + return substr($mon, 0, 1); + break; + + // year formats + case self::LEAPYEAR : + return $this->date('L', $this->getUnixTimestamp(), false); + break; + + case self::YEAR_8601 : + return $this->date('o', $this->getUnixTimestamp(), false); + break; + + case self::YEAR : + return $this->date('Y', $this->getUnixTimestamp(), false); + break; + + case self::YEAR_SHORT : + return $this->date('y', $this->getUnixTimestamp(), false); + break; + + + case self::YEAR_SHORT_8601 : + $year = $this->date('o', $this->getUnixTimestamp(), false); + return substr($year, -2); + break; + + // time formats + case self::MERIDIEM : + $am = $this->date('a', $this->getUnixTimestamp(), false); + if ($am == 'am') { + return Zend_Locale_Data::getContent($locale, 'am'); + } + return Zend_Locale_Data::getContent($locale, 'pm'); + break; + + case self::SWATCH : + return $this->date('B', $this->getUnixTimestamp(), false); + break; + + case self::HOUR_SHORT_AM : + return $this->date('g', $this->getUnixTimestamp(), false); + break; + + case self::HOUR_SHORT : + return $this->date('G', $this->getUnixTimestamp(), false); + break; + + case self::HOUR_AM : + return $this->date('h', $this->getUnixTimestamp(), false); + break; + + case self::HOUR : + return $this->date('H', $this->getUnixTimestamp(), false); + break; + + case self::MINUTE : + return $this->date('i', $this->getUnixTimestamp(), false); + break; + + case self::SECOND : + return $this->date('s', $this->getUnixTimestamp(), false); + break; + + case self::MINUTE_SHORT : + return $this->date('i', $this->getUnixTimestamp(), false); + break; + + case self::SECOND_SHORT : + return $this->date('s', $this->getUnixTimestamp(), false); + break; + + case self::MILLISECOND : + return $this->_fractional; + break; + + // timezone formats + case self::TIMEZONE_NAME : + return $this->date('e', $this->getUnixTimestamp(), false); + break; + + case self::DAYLIGHT : + return $this->date('I', $this->getUnixTimestamp(), false); + break; + + case self::GMT_DIFF : + return $this->date('O', $this->getUnixTimestamp(), false); + break; + + case self::GMT_DIFF_SEP : + return $this->date('P', $this->getUnixTimestamp(), false); + break; + + case self::TIMEZONE : + return $this->date('T', $this->getUnixTimestamp(), false); + break; + + case self::TIMEZONE_SECS : + return $this->date('Z', $this->getUnixTimestamp(), false); + break; + + // date strings + case self::ISO_8601 : + return $this->date('c', $this->getUnixTimestamp(), false); + break; + + case self::RFC_2822 : + return $this->date('r', $this->getUnixTimestamp(), false); + break; + + case self::TIMESTAMP : + return $this->getUnixTimestamp(); + break; + + // additional formats + case self::ERA : + $year = $this->date('Y', $this->getUnixTimestamp(), false); + if ($year < 0) { + return Zend_Locale_Data::getContent($locale, 'era', array('gregorian', 'Abbr', '0')); + } + return Zend_Locale_Data::getContent($locale, 'era', array('gregorian', 'Abbr', '1')); + break; + + case self::ERA_NAME : + $year = $this->date('Y', $this->getUnixTimestamp(), false); + if ($year < 0) { + return Zend_Locale_Data::getContent($locale, 'era', array('gregorian', 'Names', '0')); + } + return Zend_Locale_Data::getContent($locale, 'era', array('gregorian', 'Names', '1')); + break; + + case self::DATES : + return $this->toString(Zend_Locale_Format::getDateFormat($locale), 'iso', $locale); + break; + + case self::DATE_FULL : + $date = Zend_Locale_Data::getContent($locale, 'date', array('gregorian', 'full')); + return $this->toString($date, 'iso', $locale); + break; + + case self::DATE_LONG : + $date = Zend_Locale_Data::getContent($locale, 'date', array('gregorian', 'long')); + return $this->toString($date, 'iso', $locale); + break; + + case self::DATE_MEDIUM : + $date = Zend_Locale_Data::getContent($locale, 'date', array('gregorian', 'medium')); + return $this->toString($date, 'iso', $locale); + break; + + case self::DATE_SHORT : + $date = Zend_Locale_Data::getContent($locale, 'date', array('gregorian', 'short')); + return $this->toString($date, 'iso', $locale); + break; + + case self::TIMES : + return $this->toString(Zend_Locale_Format::getTimeFormat($locale), 'iso', $locale); + break; + + case self::TIME_FULL : + $time = Zend_Locale_Data::getContent($locale, 'time', 'full'); + return $this->toString($time, 'iso', $locale); + break; + + case self::TIME_LONG : + $time = Zend_Locale_Data::getContent($locale, 'time', 'long'); + return $this->toString($time, 'iso', $locale); + break; + + case self::TIME_MEDIUM : + $time = Zend_Locale_Data::getContent($locale, 'time', 'medium'); + return $this->toString($time, 'iso', $locale); + break; + + case self::TIME_SHORT : + $time = Zend_Locale_Data::getContent($locale, 'time', 'short'); + return $this->toString($time, 'iso', $locale); + break; + + case self::ATOM : + return $this->date('Y\-m\-d\TH\:i\:sP', $this->getUnixTimestamp(), false); + break; + + case self::COOKIE : + return $this->date('l\, d\-M\-y H\:i\:s e', $this->getUnixTimestamp(), false); + break; + + case self::RFC_822 : + return $this->date('D\, d M y H\:i\:s O', $this->getUnixTimestamp(), false); + break; + + case self::RFC_850 : + return $this->date('l\, d\-M\-y H\:i\:s e', $this->getUnixTimestamp(), false); + break; + + case self::RFC_1036 : + return $this->date('D\, d M y H\:i\:s O', $this->getUnixTimestamp(), false); + break; + + case self::RFC_1123 : + return $this->date('D\, d M Y H\:i\:s O', $this->getUnixTimestamp(), false); + break; + + case self::RFC_3339 : + return $this->date('Y\-m\-d\TH\:i\:sP', $this->getUnixTimestamp(), false); + break; + + case self::RSS : + return $this->date('D\, d M Y H\:i\:s O', $this->getUnixTimestamp(), false); + break; + + case self::W3C : + return $this->date('Y\-m\-d\TH\:i\:sP', $this->getUnixTimestamp(), false); + break; + } + } + + /** + * Return digit from standard names (english) + * Faster implementation than locale aware searching + * + * @param string $name + * @return integer Number of this month + * @throws Zend_Date_Exception + */ + private function _getDigitFromName($name) + { + switch($name) { + case "Jan": + return 1; + + case "Feb": + return 2; + + case "Mar": + return 3; + + case "Apr": + return 4; + + case "May": + return 5; + + case "Jun": + return 6; + + case "Jul": + return 7; + + case "Aug": + return 8; + + case "Sep": + return 9; + + case "Oct": + return 10; + + case "Nov": + return 11; + + case "Dec": + return 12; + + default: + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception('Month ($name) is not a known month'); + } + } + + /** + * Counts the exact year number + * < 70 - 2000 added, >70 < 100 - 1900, others just returned + * + * @param integer $value year number + * @return integer Number of year + */ + public static function getFullYear($value) + { + if ($value >= 0) { + if ($value < 70) { + $value += 2000; + } else if ($value < 100) { + $value += 1900; + } + } + return $value; + } + + /** + * Sets the given date as new date or a given datepart as new datepart returning the new datepart + * This could be for example a localized dayname, the date without time, + * the month or only the seconds. There are about 50 different supported date parts. + * For a complete list of supported datepart values look into the docu + * + * @param string|integer|array|Zend_Date $date Date or datepart to set + * @param string $part OPTIONAL Part of the date to set, if null the timestamp is set + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return integer|string new datepart + * @throws Zend_Date_Exception + */ + public function set($date, $part = null, $locale = null) + { + $zone = $this->getTimezoneFromString($date); + $this->setTimezone($zone); + + $result = $this->_calculate('set', $date, $part, $locale); + return $result; + } + + /** + * Adds a date or datepart to the existing date, by extracting $part from $date, + * and modifying this object by adding that part. The $part is then extracted from + * this object and returned as an integer or numeric string (for large values, or $part's + * corresponding to pre-defined formatted date strings). + * This could be for example a ISO 8601 date, the hour the monthname or only the minute. + * There are about 50 different supported date parts. + * For a complete list of supported datepart values look into the docu. + * + * @param string|integer|array|Zend_Date $date Date or datepart to add + * @param string $part OPTIONAL Part of the date to add, if null the timestamp is added + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return integer|string new datepart + * @throws Zend_Date_Exception + */ + public function add($date, $part = null, $locale = null) + { + $this->_calculate('add', $date, $part, $locale); + $result = $this->get($part, $locale); + + return $result; + } + + /** + * Subtracts a date from another date. + * This could be for example a RFC2822 date, the time, + * the year or only the timestamp. There are about 50 different supported date parts. + * For a complete list of supported datepart values look into the docu + * Be aware: Adding -2 Months is not equal to Subtracting 2 Months !!! + * + * @param string|integer|array|Zend_Date $date Date or datepart to subtract + * @param string $part OPTIONAL Part of the date to sub, if null the timestamp is subtracted + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return integer|string new datepart + * @throws Zend_Date_Exception + */ + public function sub($date, $part = null, $locale = null) + { + $this->_calculate('sub', $date, $part, $locale); + $result = $this->get($part, $locale); + + return $result; + } + + /** + * Compares a date or datepart with the existing one. + * Returns -1 if earlier, 0 if equal and 1 if later. + * + * @param string|integer|array|Zend_Date $date Date or datepart to compare with the date object + * @param string $part OPTIONAL Part of the date to compare, if null the timestamp is subtracted + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return integer 0 = equal, 1 = later, -1 = earlier + * @throws Zend_Date_Exception + */ + public function compare($date, $part = null, $locale = null) + { + $compare = $this->_calculate('cmp', $date, $part, $locale); + + if ($compare > 0) { + return 1; + } else if ($compare < 0) { + return -1; + } + return 0; + } + + /** + * Returns a new instance of Zend_Date with the selected part copied. + * To make an exact copy, use PHP's clone keyword. + * For a complete list of supported date part values look into the docu. + * If a date part is copied, all other date parts are set to standard values. + * For example: If only YEAR is copied, the returned date object is equal to + * 01-01-YEAR 00:00:00 (01-01-1970 00:00:00 is equal to timestamp 0) + * If only HOUR is copied, the returned date object is equal to + * 01-01-1970 HOUR:00:00 (so $this contains a timestamp equal to a timestamp of 0 plus HOUR). + * + * @param string $part Part of the date to compare, if null the timestamp is subtracted + * @param string|Zend_Locale $locale OPTIONAL New object's locale. No adjustments to timezone are made. + * @return Zend_Date + */ + public function copyPart($part, $locale = null) + { + $clone = clone $this; // copy all instance variables + $clone->setUnixTimestamp(0); // except the timestamp + if ($locale != null) { + $clone->setLocale($locale); // set an other locale if selected + } + $clone->set($this, $part); + return $clone; + } + + /** + * Internal function, returns the offset of a given timezone + * + * @param string $zone + * @return integer + */ + public function getTimezoneFromString($zone) + { + if (is_array($zone)) { + return $this->getTimezone(); + } + if ($zone instanceof Zend_Date) { + return $zone->getTimezone(); + } + preg_match('/([+-]\d{2}):{0,1}\d{2}/', $zone, $match); + if (!empty($match) and ($match[count($match) - 1] <= 12) and ($match[count($match) - 1] >= -12)) { + $zone = "Etc/GMT"; + $zone .= ($match[count($match) - 1] < 0) ? "+" : "-"; + $zone .= (int) abs($match[count($match) - 1]); + return $zone; + } + + preg_match('/([[:alpha:]\/]{3,30})/', $zone, $match); + try { + if (!empty($match) and (!is_int($match[count($match) - 1]))) { + $oldzone = $this->getTimezone(); + $this->setTimezone($match[count($match) - 1]); + $result = $this->getTimezone(); + $this->setTimezone($oldzone); + if ($result !== $oldzone) { + return $match[count($match) - 1]; + } + } + } catch (Exception $e) { + // fall through + } + + return $this->getTimezone(); + } + + /** + * Calculates the date or object + * + * @param string $calc Calculation to make + * @param string|integer $date Date for calculation + * @param string|integer $comp Second date for calculation + * @param boolean|integer $dst Use dst correction if option is set + * @return integer|string|Zend_Date new timestamp or Zend_Date depending on calculation + */ + private function _assign($calc, $date, $comp = 0, $dst = false) + { + switch ($calc) { + case 'set' : + if (!empty($comp)) { + $this->setUnixTimestamp(call_user_func(Zend_Locale_Math::$sub, $this->getUnixTimestamp(), $comp)); + } + $this->setUnixTimestamp(call_user_func(Zend_Locale_Math::$add, $this->getUnixTimestamp(), $date)); + $value = $this->getUnixTimestamp(); + break; + case 'add' : + $this->setUnixTimestamp(call_user_func(Zend_Locale_Math::$add, $this->getUnixTimestamp(), $date)); + $value = $this->getUnixTimestamp(); + break; + case 'sub' : + $this->setUnixTimestamp(call_user_func(Zend_Locale_Math::$sub, $this->getUnixTimestamp(), $date)); + $value = $this->getUnixTimestamp(); + break; + default : + // cmp - compare + return call_user_func(Zend_Locale_Math::$comp, $comp, $date); + break; + } + + // dst-correction if 'fix_dst' = true and dst !== false but only for non UTC and non GMT + if ((self::$_options['fix_dst'] === true) and ($dst !== false) and ($this->_dst === true)) { + $hour = $this->get(self::HOUR); + if ($hour != $dst) { + if (($dst == ($hour + 1)) or ($dst == ($hour - 23))) { + $value += 3600; + } else if (($dst == ($hour - 1)) or ($dst == ($hour + 23))) { + $value -= 3600; + } + $this->setUnixTimestamp($value); + } + } + return $this->getUnixTimestamp(); + } + + + /** + * Calculates the date or object + * + * @param string $calc Calculation to make, one of: 'add'|'sub'|'cmp'|'copy'|'set' + * @param string|integer|array|Zend_Date $date Date or datepart to calculate with + * @param string $part Part of the date to calculate, if null the timestamp is used + * @param string|Zend_Locale $locale Locale for parsing input + * @return integer|string|Zend_Date new timestamp + * @throws Zend_Date_Exception + */ + private function _calculate($calc, $date, $part, $locale) + { + if (is_null($date) === true) { + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception('parameter $date must be set, null is not allowed'); + } + + if (($part !== null) and (Zend_Locale::isLocale($part, null, false))) { + $locale = $part; + $part = null; + } + + if ($locale === null) { + $locale = $this->getLocale(); + } + + $locale = (string) $locale; + + // Create date parts + $year = $this->get(self::YEAR); + $month = $this->get(self::MONTH_SHORT); + $day = $this->get(self::DAY_SHORT); + $hour = $this->get(self::HOUR_SHORT); + $minute = $this->get(self::MINUTE_SHORT); + $second = $this->get(self::SECOND_SHORT); + // If object extract value + if ($date instanceof Zend_Date) { + $date = $date->get($part, $locale); + } + + if (is_array($date) === true) { + if (empty($part) === false) { + switch($part) { + // Fall through + case self::DAY: + case self::DAY_SHORT: + if (isset($date['day']) === true) { + $date = $date['day']; + } + break; + // Fall through + case self::WEEKDAY_SHORT: + case self::WEEKDAY: + case self::WEEKDAY_8601: + case self::WEEKDAY_DIGIT: + case self::WEEKDAY_NARROW: + case self::WEEKDAY_NAME: + if (isset($date['weekday']) === true) { + $date = $date['weekday']; + $part = self::WEEKDAY_DIGIT; + } + break; + case self::DAY_OF_YEAR: + if (isset($date['day_of_year']) === true) { + $date = $date['day_of_year']; + } + break; + // Fall through + case self::MONTH: + case self::MONTH_SHORT: + case self::MONTH_NAME: + case self::MONTH_NAME_SHORT: + case self::MONTH_NAME_NARROW: + if (isset($date['month']) === true) { + $date = $date['month']; + } + break; + // Fall through + case self::YEAR: + case self::YEAR_SHORT: + case self::YEAR_8601: + case self::YEAR_SHORT_8601: + if (isset($date['year']) === true) { + $date = $date['year']; + } + break; + // Fall through + case self::HOUR: + case self::HOUR_AM: + case self::HOUR_SHORT: + case self::HOUR_SHORT_AM: + if (isset($date['hour']) === true) { + $date = $date['hour']; + } + break; + // Fall through + case self::MINUTE: + case self::MINUTE_SHORT: + if (isset($date['minute']) === true) { + $date = $date['minute']; + } + break; + // Fall through + case self::SECOND: + case self::SECOND_SHORT: + if (isset($date['second']) === true) { + $date = $date['second']; + } + break; + // Fall through + case self::TIMEZONE: + case self::TIMEZONE_NAME: + if (isset($date['timezone']) === true) { + $date = $date['timezone']; + } + break; + case self::TIMESTAMP: + if (isset($date['timestamp']) === true) { + $date = $date['timestamp']; + } + break; + case self::WEEK: + if (isset($date['week']) === true) { + $date = $date['week']; + } + break; + case self::TIMEZONE_SECS: + if (isset($date['gmtsecs']) === true) { + $date = $date['gmtsecs']; + } + break; + default: + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception("datepart for part ($part) not found in array"); + break; + } + } else { + $hours = 0; + if (isset($date['hour']) === true) { + $hours = $date['hour']; + } + $minutes = 0; + if (isset($date['minute']) === true) { + $minutes = $date['minute']; + } + $seconds = 0; + if (isset($date['second']) === true) { + $seconds = $date['second']; + } + $months = 0; + if (isset($date['month']) === true) { + $months = $date['month']; + } + $days = 0; + if (isset($date['day']) === true) { + $days = $date['day']; + } + $years = 0; + if (isset($date['year']) === true) { + $years = $date['year']; + } + return $this->_assign($calc, $this->mktime($hours, $minutes, $seconds, $months, $days, $years, true), + $this->mktime($hour, $minute, $second, $month, $day, $year, true), $hour); + } + } + + // $date as object, part of foreign date as own date + switch($part) { + + // day formats + case self::DAY: + if (is_numeric($date)) { + return $this->_assign($calc, $this->mktime(0, 0, 0, 1, 1 + intval($date), 1970, true), + $this->mktime(0, 0, 0, 1, 1 + intval($day), 1970, true), $hour); + } + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception("invalid date ($date) operand, day expected", $date); + break; + + case self::WEEKDAY_SHORT: + $daylist = Zend_Locale_Data::getList($locale, 'day'); + $weekday = (int) $this->get(self::WEEKDAY_DIGIT, $locale); + $cnt = 0; + + foreach ($daylist as $key => $value) { + if (strtoupper(substr($value, 0, 3)) == strtoupper($date)) { + $found = $cnt; + break; + } + ++$cnt; + } + + // Weekday found + if ($cnt < 7) { + return $this->_assign($calc, $this->mktime(0, 0, 0, 1, 1 + $found, 1970, true), + $this->mktime(0, 0, 0, 1, 1 + $weekday, 1970, true), $hour); + } + + // Weekday not found + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception("invalid date ($date) operand, weekday expected", $date); + break; + + case self::DAY_SHORT: + if (is_numeric($date)) { + return $this->_assign($calc, $this->mktime(0, 0, 0, 1, 1 + intval($date), 1970, true), + $this->mktime(0, 0, 0, 1, 1 + intval($day), 1970, true), $hour); + } + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception("invalid date ($date) operand, day expected", $date); + break; + + case self::WEEKDAY: + $daylist = Zend_Locale_Data::getList($locale, 'day'); + $weekday = (int) $this->get(self::WEEKDAY_DIGIT, $locale); + $cnt = 0; + + foreach ($daylist as $key => $value) { + if (strtoupper($value) == strtoupper($date)) { + $found = $cnt; + break; + } + ++$cnt; + } + + // Weekday found + if ($cnt < 7) { + return $this->_assign($calc, $this->mktime(0, 0, 0, 1, 1 + $found, 1970, true), + $this->mktime(0, 0, 0, 1, 1 + $weekday, 1970, true), $hour); + } + + // Weekday not found + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception("invalid date ($date) operand, weekday expected", $date); + break; + + case self::WEEKDAY_8601: + $weekday = (int) $this->get(self::WEEKDAY_8601, $locale); + if ((intval($date) > 0) and (intval($date) < 8)) { + return $this->_assign($calc, $this->mktime(0, 0, 0, 1, 1 + intval($date), 1970, true), + $this->mktime(0, 0, 0, 1, 1 + $weekday, 1970, true), $hour); + } + + // Weekday not found + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception("invalid date ($date) operand, weekday expected", $date); + break; + + case self::DAY_SUFFIX: + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception('day suffix not supported', $date); + break; + + case self::WEEKDAY_DIGIT: + $weekday = (int) $this->get(self::WEEKDAY_DIGIT, $locale); + if (is_numeric($date) and (intval($date) >= 0) and (intval($date) < 7)) { + return $this->_assign($calc, $this->mktime(0, 0, 0, 1, 1 + $date, 1970, true), + $this->mktime(0, 0, 0, 1, 1 + $weekday, 1970, true), $hour); + } + + // Weekday not found + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception("invalid date ($date) operand, weekday expected", $date); + break; + + case self::DAY_OF_YEAR: + if (is_numeric($date)) { + return $this->_assign($calc, $this->mktime(0, 0, 0, 1, 1 + $date, 1970, true), + $this->mktime(0, 0, 0, $month, 1 + $day, 1970, true), $hour); + } + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception("invalid date ($date) operand, day expected", $date); + break; + + case self::WEEKDAY_NARROW: + $daylist = Zend_Locale_Data::getList($locale, 'day', array('gregorian', 'format', 'abbreviated')); + $weekday = (int) $this->get(self::WEEKDAY_DIGIT, $locale); + $cnt = 0; + foreach ($daylist as $key => $value) { + if (strtoupper(substr($value, 0, 1)) == strtoupper($date)) { + $found = $cnt; + break; + } + ++$cnt; + } + + // Weekday found + if ($cnt < 7) { + return $this->_assign($calc, $this->mktime(0, 0, 0, 1, 1 + $found, 1970, true), + $this->mktime(0, 0, 0, 1, 1 + $weekday, 1970, true), $hour); + } + + // Weekday not found + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception("invalid date ($date) operand, weekday expected", $date); + break; + + case self::WEEKDAY_NAME: + $daylist = Zend_Locale_Data::getList($locale, 'day', array('gregorian', 'format', 'abbreviated')); + $weekday = (int) $this->get(self::WEEKDAY_DIGIT, $locale); + $cnt = 0; + foreach ($daylist as $key => $value) { + if (strtoupper($value) == strtoupper($date)) { + $found = $cnt; + break; + } + ++$cnt; + } + + // Weekday found + if ($cnt < 7) { + return $this->_assign($calc, $this->mktime(0, 0, 0, 1, 1 + $found, 1970, true), + $this->mktime(0, 0, 0, 1, 1 + $weekday, 1970, true), $hour); + } + + // Weekday not found + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception("invalid date ($date) operand, weekday expected", $date); + break; + + // week formats + case self::WEEK: + if (is_numeric($date)) { + $week = (int) $this->get(self::WEEK, $locale); + return $this->_assign($calc, parent::mktime(0, 0, 0, 1, 1 + ($date * 7), 1970, true), + parent::mktime(0, 0, 0, 1, 1 + ($week * 7), 1970, true), $hour); + } + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception("invalid date ($date) operand, week expected", $date); + break; + + // month formats + case self::MONTH_NAME: + $monthlist = Zend_Locale_Data::getList($locale, 'month'); + $cnt = 0; + foreach ($monthlist as $key => $value) { + if (strtoupper($value) == strtoupper($date)) { + $found = $key; + break; + } + ++$cnt; + } + $date = array_search($date, $monthlist); + + // Monthname found + if ($cnt < 12) { + $fixday = 0; + if ($calc == 'add') { + $date += $found; + $calc = 'set'; + if (self::$_options['extend_month'] == false) { + $parts = $this->getDateParts($this->mktime(0, 0, 0, $date, $day, $year, false)); + if ($parts['mday'] != $day) { + $fixday -= $parts['mday']; + } + } + } else if ($calc == 'sub') { + $date = $month - $found; + $calc = 'set'; + if (self::$_options['extend_month'] == false) { + $parts = $this->getDateParts($this->mktime(0, 0, 0, $date, $day, $year, false)); + if ($parts['mday'] != $day) { + $fixday -= $parts['mday']; + } + } + } + return $this->_assign($calc, $this->mktime(0, 0, 0, $date, $day + $fixday, $year, true), + $this->mktime(0, 0, 0, $month, $day, $year, true), $hour); + } + + // Monthname not found + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception("invalid date ($date) operand, month expected", $date); + break; + + case self::MONTH: + if (is_numeric($date)) { + $fixday = 0; + if ($calc == 'add') { + $date += $month; + $calc = 'set'; + if (self::$_options['extend_month'] == false) { + $parts = $this->getDateParts($this->mktime(0, 0, 0, $date, $day, $year, false)); + if ($parts['mday'] != $day) { + $fixday -= $parts['mday']; + } + } + } else if ($calc == 'sub') { + $date = $month - $date; + $calc = 'set'; + if (self::$_options['extend_month'] == false) { + $parts = $this->getDateParts($this->mktime(0, 0, 0, $date, $day, $year, false)); + if ($parts['mday'] != $day) { + $fixday -= $parts['mday']; + } + } + } + return $this->_assign($calc, $this->mktime(0, 0, 0, $date, $day + $fixday, $year, true), + $this->mktime(0, 0, 0, $month, $day, $year, true), $hour); + } + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception("invalid date ($date) operand, month expected", $date); + break; + + case self::MONTH_NAME_SHORT: + $monthlist = Zend_Locale_Data::getList($locale, 'month', array('gregorian', 'format', 'abbreviated')); + $cnt = 0; + foreach ($monthlist as $key => $value) { + if (strtoupper($value) == strtoupper($date)) { + $found = $key; + break; + } + ++$cnt; + } + $date = array_search($date, $monthlist); + + // Monthname found + if ($cnt < 12) { + $fixday = 0; + if ($calc == 'add') { + $date += $found; + $calc = 'set'; + if (self::$_options['extend_month'] === false) { + $parts = $this->getDateParts($this->mktime(0, 0, 0, $date, $day, $year, false)); + if ($parts['mday'] != $day) { + $fixday -= $parts['mday']; + } + } + } else if ($calc == 'sub') { + $date = $month - $found; + $calc = 'set'; + if (self::$_options['extend_month'] === false) { + $parts = $this->getDateParts($this->mktime(0, 0, 0, $date, $day, $year, false)); + if ($parts['mday'] != $day) { + $fixday -= $parts['mday']; + } + } + } + return $this->_assign($calc, $this->mktime(0, 0, 0, $date, $day + $fixday, $year, true), + $this->mktime(0, 0, 0, $month, $day, $year, true), $hour); + } + + // Monthname not found + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception("invalid date ($date) operand, month expected", $date); + break; + + case self::MONTH_SHORT: + if (is_numeric($date) === true) { + $fixday = 0; + if ($calc === 'add') { + $date += $month; + $calc = 'set'; + if (self::$_options['extend_month'] === false) { + $parts = $this->getDateParts($this->mktime(0, 0, 0, $date, $day, $year, false)); + if ($parts['mday'] != $day) { + $fixday -= $parts['mday']; + } + } + } else if ($calc === 'sub') { + $date = $month - $date; + $calc = 'set'; + if (self::$_options['extend_month'] === false) { + $parts = $this->getDateParts($this->mktime(0, 0, 0, $date, $day, $year, false)); + if ($parts['mday'] != $day) { + $fixday -= $parts['mday']; + } + } + } + + return $this->_assign($calc, $this->mktime(0, 0, 0, $date, $day + $fixday, $year, true), + $this->mktime(0, 0, 0, $month, $day, $year, true), $hour); + } + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception("invalid date ($date) operand, month expected", $date); + break; + + case self::MONTH_DAYS: + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception('month days not supported', $date); + break; + + case self::MONTH_NAME_NARROW: + $monthlist = Zend_Locale_Data::getList($locale, 'month', array('gregorian', 'stand-alone', 'narrow')); + $cnt = 0; + foreach ($monthlist as $key => $value) { + if (strtoupper($value) === strtoupper($date)) { + $found = $key; + break; + } + ++$cnt; + } + $date = array_search($date, $monthlist); + + // Monthname found + if ($cnt < 12) { + $fixday = 0; + if ($calc === 'add') { + $date += $found; + $calc = 'set'; + if (self::$_options['extend_month'] === false) { + $parts = $this->getDateParts($this->mktime(0, 0, 0, $date, $day, $year, false)); + if ($parts['mday'] != $day) { + $fixday -= $parts['mday']; + } + } + } else if ($calc === 'sub') { + $date = $month - $found; + $calc = 'set'; + if (self::$_options['extend_month'] === false) { + $parts = $this->getDateParts($this->mktime(0, 0, 0, $date, $day, $year, false)); + if ($parts['mday'] != $day) { + $fixday -= $parts['mday']; + } + } + } + return $this->_assign($calc, $this->mktime(0, 0, 0, $date, $day + $fixday, $year, true), + $this->mktime(0, 0, 0, $month, $day, $year, true), $hour); + } + + // Monthname not found + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception("invalid date ($date) operand, month expected", $date); + break; + + // year formats + case self::LEAPYEAR: + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception('leap year not supported', $date); + break; + + case self::YEAR_8601: + if (is_numeric($date)) { + if ($calc === 'add') { + $date += $year; + $calc = 'set'; + } else if ($calc === 'sub') { + $date = $year - $date; + $calc = 'set'; + } + return $this->_assign($calc, $this->mktime(0, 0, 0, $month, $day, intval($date), true), + $this->mktime(0, 0, 0, $month, $day, $year, true), false); + } + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception("invalid date ($date) operand, year expected", $date); + break; + + case self::YEAR: + if (is_numeric($date)) { + if ($calc === 'add') { + $date += $year; + $calc = 'set'; + } else if ($calc === 'sub') { + $date = $year - $date; + $calc = 'set'; + } + return $this->_assign($calc, $this->mktime(0, 0, 0, $month, $day, intval($date), true), + $this->mktime(0, 0, 0, $month, $day, $year, true), false); + } + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception("invalid date ($date) operand, year expected", $date); + break; + + case self::YEAR_SHORT: + if (is_numeric($date)) { + $date = intval($date); + if (($calc == 'set') || ($calc == 'cmp')) { + $date = self::getFullYear($date); + } + if ($calc === 'add') { + $date += $year; + $calc = 'set'; + } else if ($calc === 'sub') { + $date = $year - $date; + $calc = 'set'; + } + return $this->_assign($calc, $this->mktime(0, 0, 0, $month, $day, $date, true), + $this->mktime(0, 0, 0, $month, $day, $year, true), false); + } + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception("invalid date ($date) operand, year expected", $date); + break; + + case self::YEAR_SHORT_8601: + if (is_numeric($date)) { + $date = intval($date); + if (($calc === 'set') || ($calc === 'cmp')) { + $date = self::getFullYear($date); + } + if ($calc === 'add') { + $date += $year; + $calc = 'set'; + } else if ($calc === 'sub') { + $date = $year - $date; + $calc = 'set'; + } + return $this->_assign($calc, $this->mktime(0, 0, 0, $month, $day, $date, true), + $this->mktime(0, 0, 0, $month, $day, $year, true), false); + } + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception("invalid date ($date) operand, year expected", $date); + break; + + // time formats + case self::MERIDIEM: + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception('meridiem not supported', $date); + break; + + case self::SWATCH: + if (is_numeric($date)) { + $rest = intval($date); + $hours = floor($rest * 24 / 1000); + $rest = $rest - ($hours * 1000 / 24); + $minutes = floor($rest * 1440 / 1000); + $rest = $rest - ($minutes * 1000 / 1440); + $seconds = floor($rest * 86400 / 1000); + return $this->_assign($calc, $this->mktime($hours, $minutes, $seconds, 1, 1, 1970, true), + $this->mktime($hour, $minute, $second, 1, 1, 1970, true), false); + } + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception("invalid date ($date) operand, swatchstamp expected", $date); + break; + + case self::HOUR_SHORT_AM: + if (is_numeric($date)) { + return $this->_assign($calc, $this->mktime(intval($date), 0, 0, 1, 1, 1970, true), + $this->mktime($hour, 0, 0, 1, 1, 1970, true), false); + } + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception("invalid date ($date) operand, hour expected", $date); + break; + + case self::HOUR_SHORT: + if (is_numeric($date)) { + return $this->_assign($calc, $this->mktime(intval($date), 0, 0, 1, 1, 1970, true), + $this->mktime($hour, 0, 0, 1, 1, 1970, true), false); + } + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception("invalid date ($date) operand, hour expected", $date); + break; + + case self::HOUR_AM: + if (is_numeric($date)) { + return $this->_assign($calc, $this->mktime(intval($date), 0, 0, 1, 1, 1970, true), + $this->mktime($hour, 0, 0, 1, 1, 1970, true), false); + } + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception("invalid date ($date) operand, hour expected", $date); + break; + + case self::HOUR: + if (is_numeric($date)) { + return $this->_assign($calc, $this->mktime(intval($date), 0, 0, 1, 1, 1970, true), + $this->mktime($hour, 0, 0, 1, 1, 1970, true), false); + } + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception("invalid date ($date) operand, hour expected", $date); + break; + + case self::MINUTE: + if (is_numeric($date)) { + return $this->_assign($calc, $this->mktime(0, intval($date), 0, 1, 1, 1970, true), + $this->mktime(0, $minute, 0, 1, 1, 1970, true), false); + } + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception("invalid date ($date) operand, minute expected", $date); + break; + + case self::SECOND: + if (is_numeric($date)) { + return $this->_assign($calc, $this->mktime(0, 0, intval($date), 1, 1, 1970, true), + $this->mktime(0, 0, $second, 1, 1, 1970, true), false); + } + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception("invalid date ($date) operand, second expected", $date); + break; + + case self::MILLISECOND: + if (is_numeric($date)) { + switch($calc) { + case 'set' : + return $this->setMillisecond($date); + break; + case 'add' : + return $this->addMillisecond($date); + break; + case 'sub' : + return $this->subMillisecond($date); + break; + } + return $this->compareMillisecond($date); + } + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception("invalid date ($date) operand, milliseconds expected", $date); + break; + + case self::MINUTE_SHORT: + if (is_numeric($date)) { + return $this->_assign($calc, $this->mktime(0, intval($date), 0, 1, 1, 1970, true), + $this->mktime(0, $minute, 0, 1, 1, 1970, true), false); + } + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception("invalid date ($date) operand, minute expected", $date); + break; + + case self::SECOND_SHORT: + if (is_numeric($date)) { + return $this->_assign($calc, $this->mktime(0, 0, intval($date), 1, 1, 1970, true), + $this->mktime(0, 0, $second, 1, 1, 1970, true), false); + } + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception("invalid date ($date) operand, second expected", $date); + break; + + // timezone formats + // break intentionally omitted + case self::TIMEZONE_NAME: + case self::TIMEZONE: + case self::TIMEZONE_SECS: + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception('timezone not supported', $date); + break; + + case self::DAYLIGHT: + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception('daylight not supported', $date); + break; + + case self::GMT_DIFF: + case self::GMT_DIFF_SEP: + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception('gmtdiff not supported', $date); + break; + + // date strings + case self::ISO_8601: + // (-)YYYY-MM-dd + preg_match('/^(-{0,1}\d{4})-(\d{2})-(\d{2})/', $date, $datematch); + // (-)YY-MM-dd + if (empty($datematch)) { + preg_match('/^(-{0,1}\d{2})-(\d{2})-(\d{2})/', $date, $datematch); + } + // (-)YYYYMMdd + if (empty($datematch)) { + preg_match('/^(-{0,1}\d{4})(\d{2})(\d{2})/', $date, $datematch); + } + // (-)YYMMdd + if (empty($datematch)) { + preg_match('/^(-{0,1}\d{2})(\d{2})(\d{2})/', $date, $datematch); + } + $tmpdate = $date; + if (!empty($datematch)) { + $tmpdate = substr($date, strlen($datematch[0])); + } + // (T)hh:mm:ss + preg_match('/[T,\s]{0,1}(\d{2}):(\d{2}):(\d{2})/', $tmpdate, $timematch); + if (empty($timematch)) { + preg_match('/[T,\s]{0,1}(\d{2})(\d{2})(\d{2})/', $tmpdate, $timematch); + } + if (empty($datematch) and empty($timematch)) { + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception("unsupported ISO8601 format ($date)", $date); + } + if (!empty($timematch)) { + $tmpdate = substr($tmpdate, strlen($timematch[0])); + } + if (empty($datematch)) { + $datematch[1] = 1970; + $datematch[2] = 1; + $datematch[3] = 1; + } else if (strlen($datematch[1]) == 2) { + $datematch[1] = self::getFullYear($datematch[1]); + } + if (empty($timematch)) { + $timematch[1] = 0; + $timematch[2] = 0; + $timematch[3] = 0; + } + + if (($calc == 'set') || ($calc == 'cmp')) { + --$datematch[2]; + --$month; + --$datematch[3]; + --$day; + $datematch[1] -= 1970; + $year -= 1970; + } + return $this->_assign($calc, $this->mktime($timematch[1], $timematch[2], $timematch[3], 1 + $datematch[2], 1 + $datematch[3], 1970 + $datematch[1], false), + $this->mktime($hour, $minute, $second, 1 + $month, 1 + $day, 1970 + $year, false), false); + break; + + case self::RFC_2822: + $result = preg_match('/^\w{3},\s(\d{1,2})\s(\w{3})\s(\d{4})\s(\d{2}):(\d{2}):{0,1}(\d{0,2})\s([+-]{1}\d{4})$/', $date, $match); + if (!$result) { + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception("no RFC 2822 format ($date)", $date); + } + + $months = $this->_getDigitFromName($match[2]); + + if (($calc == 'set') || ($calc == 'cmp')) { + --$months; + --$month; + --$match[1]; + --$day; + $match[3] -= 1970; + $year -= 1970; + } + return $this->_assign($calc, $this->mktime($match[4], $match[5], $match[6], 1 + $months, 1 + $match[1], 1970 + $match[3], false), + $this->mktime($hour, $minute, $second, 1 + $month, 1 + $day, 1970 + $year, false), false); + break; + + case self::TIMESTAMP: + if (is_numeric($date)) { + return $this->_assign($calc, $date, $this->getUnixTimestamp()); + } + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception("invalid date ($date) operand, timestamp expected", $date); + break; + + // additional formats + // break intentionally omitted + case self::ERA: + case self::ERA_NAME: + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception('era not supported', $date); + break; + + case self::DATES: + try { + $parsed = Zend_Locale_Format::getDate($date, array('locale' => $locale, 'format_type' => 'iso', 'fix_date' => true)); + + if (($calc == 'set') || ($calc == 'cmp')) { + --$parsed['month']; + --$month; + --$parsed['day']; + --$day; + $parsed['year'] -= 1970; + $year -= 1970; + } + return $this->_assign($calc, $this->mktime(0, 0, 0, 1 + $parsed['month'], 1 + $parsed['day'], 1970 + $parsed['year'], true), + $this->mktime(0, 0, 0, 1 + $month, 1 + $day, 1970 + $year, true), $hour); + } catch (Zend_Locale_Exception $e) { + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception($e->getMessage(), $date); + } + break; + + case self::DATE_FULL: + try { + $format = Zend_Locale_Data::getContent($locale, 'date', array('gregorian', 'full')); + $parsed = Zend_Locale_Format::getDate($date, array('date_format' => $format, 'format_type' => 'iso', 'locale' => $locale)); + + if (($calc == 'set') || ($calc == 'cmp')) { + --$parsed['month']; + --$month; + --$parsed['day']; + --$day; + $parsed['year'] -= 1970; + $year -= 1970; + } + return $this->_assign($calc, $this->mktime(0, 0, 0, 1 + $parsed['month'], 1 + $parsed['day'], 1970 + $parsed['year'], true), + $this->mktime(0, 0, 0, 1 + $month, 1 + $day, 1970 + $year, true), $hour); + } catch (Zend_Locale_Exception $e) { + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception($e->getMessage(), $date); + } + break; + + case self::DATE_LONG: + try { + $format = Zend_Locale_Data::getContent($locale, 'date', array('gregorian', 'long')); + $parsed = Zend_Locale_Format::getDate($date, array('date_format' => $format, 'format_type' => 'iso', 'locale' => $locale)); + + if (($calc == 'set') || ($calc == 'cmp')){ + --$parsed['month']; + --$month; + --$parsed['day']; + --$day; + $parsed['year'] -= 1970; + $year -= 1970; + } + return $this->_assign($calc, $this->mktime(0, 0, 0, 1 + $parsed['month'], 1 + $parsed['day'], 1970 + $parsed['year'], true), + $this->mktime(0, 0, 0, 1 + $month, 1 + $day, 1970 + $year, true), $hour); + } catch (Zend_Locale_Exception $e) { + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception($e->getMessage(), $date); + } + break; + + case self::DATE_MEDIUM: + try { + $format = Zend_Locale_Data::getContent($locale, 'date', array('gregorian', 'medium')); + $parsed = Zend_Locale_Format::getDate($date, array('date_format' => $format, 'format_type' => 'iso', 'locale' => $locale)); + + if (($calc == 'set') || ($calc == 'cmp')) { + --$parsed['month']; + --$month; + --$parsed['day']; + --$day; + $parsed['year'] -= 1970; + $year -= 1970; + } + return $this->_assign($calc, $this->mktime(0, 0, 0, 1 + $parsed['month'], 1 + $parsed['day'], 1970 + $parsed['year'], true), + $this->mktime(0, 0, 0, 1 + $month, 1 + $day, 1970 + $year, true), $hour); + } catch (Zend_Locale_Exception $e) { + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception($e->getMessage(), $date); + } + break; + + case self::DATE_SHORT: + try { + $format = Zend_Locale_Data::getContent($locale, 'date', array('gregorian', 'short')); + $parsed = Zend_Locale_Format::getDate($date, array('date_format' => $format, 'format_type' => 'iso', 'locale' => $locale)); + + $parsed['year'] = self::getFullYear($parsed['year']); + + if (($calc == 'set') || ($calc == 'cmp')) { + --$parsed['month']; + --$month; + --$parsed['day']; + --$day; + $parsed['year'] -= 1970; + $year -= 1970; + } + return $this->_assign($calc, $this->mktime(0, 0, 0, 1 + $parsed['month'], 1 + $parsed['day'], 1970 + $parsed['year'], true), + $this->mktime(0, 0, 0, 1 + $month, 1 + $day, 1970 + $year, true), $hour); + } catch (Zend_Locale_Exception $e) { + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception($e->getMessage(), $date); + } + break; + + case self::TIMES: + try { + if ($calc != 'set') { + $month = 1; + $day = 1; + $year = 1970; + } + $parsed = Zend_Locale_Format::getTime($date, array('locale' => $locale, 'format_type' => 'iso', 'fix_date' => true)); + return $this->_assign($calc, $this->mktime($parsed['hour'], $parsed['minute'], $parsed['second'], $month, $day, $year, true), + $this->mktime($hour, $minute, $second, $month, $day, $year, true), false); + } catch (Zend_Locale_Exception $e) { + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception($e->getMessage(), $date); + } + break; + + case self::TIME_FULL: + try { + $format = Zend_Locale_Data::getContent($locale, 'time', array('gregorian', 'full')); + $parsed = Zend_Locale_Format::getTime($date, array('date_format' => $format, 'format_type' => 'iso', 'locale' => $locale)); + if ($calc != 'set') { + $month = 1; + $day = 1; + $year = 1970; + } + return $this->_assign($calc, $this->mktime($parsed['hour'], $parsed['minute'], 0, $month, $day, $year, true), + $this->mktime($hour, $minute, $second, $month, $day, $year, true), false); + } catch (Zend_Locale_Exception $e) { + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception($e->getMessage(), $date); + } + break; + + case self::TIME_LONG: + try { + $format = Zend_Locale_Data::getContent($locale, 'time', array('gregorian', 'long')); + $parsed = Zend_Locale_Format::getTime($date, array('date_format' => $format, 'format_type' => 'iso', 'locale' => $locale)); + if ($calc != 'set') { + $month = 1; + $day = 1; + $year = 1970; + } + return $this->_assign($calc, $this->mktime($parsed['hour'], $parsed['minute'], $parsed['second'], $month, $day, $year, true), + $this->mktime($hour, $minute, $second, $month, $day, $year, true), false); + } catch (Zend_Locale_Exception $e) { + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception($e->getMessage(), $date); + } + break; + + case self::TIME_MEDIUM: + try { + $format = Zend_Locale_Data::getContent($locale, 'time', array('gregorian', 'medium')); + $parsed = Zend_Locale_Format::getTime($date, array('date_format' => $format, 'format_type' => 'iso', 'locale' => $locale)); + if ($calc != 'set') { + $month = 1; + $day = 1; + $year = 1970; + } + return $this->_assign($calc, $this->mktime($parsed['hour'], $parsed['minute'], $parsed['second'], $month, $day, $year, true), + $this->mktime($hour, $minute, $second, $month, $day, $year, true), false); + } catch (Zend_Locale_Exception $e) { + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception($e->getMessage(), $date); + } + break; + + case self::TIME_SHORT: + try { + $format = Zend_Locale_Data::getContent($locale, 'time', array('gregorian', 'short')); + $parsed = Zend_Locale_Format::getTime($date, array('date_format' => $format, 'format_type' => 'iso', 'locale' => $locale)); + if ($calc != 'set') { + $month = 1; + $day = 1; + $year = 1970; + } + return $this->_assign($calc, $this->mktime($parsed['hour'], $parsed['minute'], 0, $month, $day, $year, true), + $this->mktime($hour, $minute, $second, $month, $day, $year, true), false); + } catch (Zend_Locale_Exception $e) { + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception($e->getMessage(), $date); + } + break; + + // ATOM and RFC_3339 are identical + case self::ATOM: + case self::RFC_3339: + $result = preg_match('/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})\d{0,4}([+-]{1}\d{2}:\d{2}|Z)$/', $date, $match); + if (!$result) { + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception("invalid date ($date) operand, ATOM format expected", $date); + } + + if (($calc == 'set') || ($calc == 'cmp')) { + --$match[2]; + --$month; + --$match[3]; + --$day; + $match[1] -= 1970; + $year -= 1970; + } + return $this->_assign($calc, $this->mktime($match[4], $match[5], $match[6], 1 + $match[2], 1 + $match[3], 1970 + $match[1], true), + $this->mktime($hour, $minute, $second, 1 + $month, 1 + $day, 1970 + $year, true), false); + break; + + case self::COOKIE: + $result = preg_match("/^\w{6,9},\s(\d{2})-(\w{3})-(\d{2})\s(\d{2}):(\d{2}):(\d{2})\s.{3,20}$/", $date, $match); + if (!$result) { + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception("invalid date ($date) operand, COOKIE format expected", $date); + } + $match[0] = substr($match[0], strpos($match[0], ' ')+1); + + $months = $this->_getDigitFromName($match[2]); + $match[3] = self::getFullYear($match[3]); + + if (($calc == 'set') || ($calc == 'cmp')) { + --$months; + --$month; + --$match[1]; + --$day; + $match[3] -= 1970; + $year -= 1970; + } + return $this->_assign($calc, $this->mktime($match[4], $match[5], $match[6], 1 + $months, 1 + $match[1], 1970 + $match[3], true), + $this->mktime($hour, $minute, $second, 1 + $month, 1 + $day, 1970 + $year, true), false); + break; + + case self::RFC_822: + case self::RFC_1036: + // new RFC 822 format, identical to RFC 1036 standard + $result = preg_match('/^\w{0,3},{0,1}\s{0,1}(\d{1,2})\s(\w{3})\s(\d{2})\s(\d{2}):(\d{2}):{0,1}(\d{0,2})\s([+-]{1}\d{4}|\w{1,20})$/', $date, $match); + if (!$result) { + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception("invalid date ($date) operand, RFC 822 date format expected", $date); + } + + $months = $this->_getDigitFromName($match[2]); + $match[3] = self::getFullYear($match[3]); + + if (($calc == 'set') || ($calc == 'cmp')) { + --$months; + --$month; + --$match[1]; + --$day; + $match[3] -= 1970; + $year -= 1970; + } + return $this->_assign($calc, $this->mktime($match[4], $match[5], $match[6], 1 + $months, 1 + $match[1], 1970 + $match[3], false), + $this->mktime($hour, $minute, $second, 1 + $month, 1 + $day, 1970 + $year, false), false); + break; + + case self::RFC_850: + $result = preg_match('/^\w{6,9},\s(\d{2})-(\w{3})-(\d{2})\s(\d{2}):(\d{2}):(\d{2})\s.{3,21}$/', $date, $match); + if (!$result) { + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception("invalid date ($date) operand, RFC 850 date format expected", $date); + } + + $months = $this->_getDigitFromName($match[2]); + $match[3] = self::getFullYear($match[3]); + + if (($calc == 'set') || ($calc == 'cmp')) { + --$months; + --$month; + --$match[1]; + --$day; + $match[3] -= 1970; + $year -= 1970; + } + return $this->_assign($calc, $this->mktime($match[4], $match[5], $match[6], 1 + $months, 1 + $match[1], 1970 + $match[3], true), + $this->mktime($hour, $minute, $second, 1 + $month, 1 + $day, 1970 + $year, true), false); + break; + + case self::RFC_1123: + $result = preg_match('/^\w{0,3},{0,1}\s{0,1}(\d{1,2})\s(\w{3})\s(\d{2,4})\s(\d{2}):(\d{2}):{0,1}(\d{0,2})\s([+-]{1}\d{4}|\w{1,20})$/', $date, $match); + if (!$result) { + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception("invalid date ($date) operand, RFC 1123 date format expected", $date); + } + + $months = $this->_getDigitFromName($match[2]); + + if (($calc == 'set') || ($calc == 'cmp')) { + --$months; + --$month; + --$match[1]; + --$day; + $match[3] -= 1970; + $year -= 1970; + } + return $this->_assign($calc, $this->mktime($match[4], $match[5], $match[6], 1 + $months, 1 + $match[1], 1970 + $match[3], true), + $this->mktime($hour, $minute, $second, 1 + $month, 1 + $day, 1970 + $year, true), false); + break; + + case self::RSS: + $result = preg_match('/^\w{3},\s(\d{2})\s(\w{3})\s(\d{2,4})\s(\d{1,2}):(\d{2}):(\d{2})\s.{1,21}$/', $date, $match); + if (!$result) { + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception("invalid date ($date) operand, RSS date format expected", $date); + } + + $months = $this->_getDigitFromName($match[2]); + $match[3] = self::getFullYear($match[3]); + + if (($calc == 'set') || ($calc == 'cmp')) { + --$months; + --$month; + --$match[1]; + --$day; + $match[3] -= 1970; + $year -= 1970; + } + return $this->_assign($calc, $this->mktime($match[4], $match[5], $match[6], 1 + $months, 1 + $match[1], 1970 + $match[3], true), + $this->mktime($hour, $minute, $second, 1 + $month, 1 + $day, 1970 + $year, true), false); + break; + + case self::W3C: + $result = preg_match('/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})[+-]{1}\d{2}:\d{2}$/', $date, $match); + if (!$result) { + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception("invalid date ($date) operand, W3C date format expected", $date); + } + + if (($calc == 'set') || ($calc == 'cmp')) { + --$match[2]; + --$month; + --$match[3]; + --$day; + $match[1] -= 1970; + $year -= 1970; + } + return $this->_assign($calc, $this->mktime($match[4], $match[5], $match[6], 1 + $match[2], 1 + $match[3], 1970 + $match[1], true), + $this->mktime($hour, $minute, $second, 1 + $month, 1 + $day, 1970 + $year, true), false); + break; + + default: + if (!is_numeric($date) || !empty($part)) { + try { + if (self::$_options['format_type'] == 'php') { + $part = Zend_Locale_Format::convertPhpToIsoFormat($part); + } + if (empty($part)) { + $part = Zend_Locale_Format::getDateFormat($locale) . " "; + $part .= Zend_Locale_Format::getTimeFormat($locale); + } + $parsed = Zend_Locale_Format::getDate($date, array('date_format' => $part, 'locale' => $locale, 'fix_date' => true, 'format_type' => 'iso')); + if ((strpos(strtoupper($part), 'YY') !== false) and (strpos(strtoupper($part), 'YYYY') === false)) { + $parsed['year'] = self::getFullYear($parsed['year']); + } + if (($calc == 'set') || ($calc == 'cmp')) { + if (isset($parsed['month'])) { + --$parsed['month']; + } else { + $parsed['month'] = 0; + } + if (isset($parsed['day'])) { + --$parsed['day']; + } else { + $parsed['day'] = 0; + } + if (isset($parsed['year'])) { + $parsed['year'] -= 1970; + } else { + $parsed['year'] = 0; + } + } + return $this->_assign($calc, $this->mktime( + isset($parsed['hour']) ? $parsed['hour'] : 0, + isset($parsed['minute']) ? $parsed['minute'] : 0, + isset($parsed['second']) ? $parsed['second'] : 0, + 1 + $parsed['month'], 1 + $parsed['day'], 1970 + $parsed['year'], + false), $this->getUnixTimestamp(), false); + } catch (Zend_Locale_Exception $e) { + if (!is_numeric($date)) { + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception($e->getMessage(), $date); + } + } + } + return $this->_assign($calc, $date, $this->getUnixTimestamp(), false); + break; + } + } + + /** + * Returns true when both date objects or date parts are equal. + * For example: + * 15.May.2000 <-> 15.June.2000 Equals only for Day or Year... all other will return false + * + * @param string|integer|array|Zend_Date $date Date or datepart to equal with + * @param string $part OPTIONAL Part of the date to compare, if null the timestamp is used + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return boolean + * @throws Zend_Date_Exception + */ + public function equals($date, $part = null, $locale = null) + { + $result = $this->compare($date, $part, $locale); + + if ($result == 0) { + return true; + } + return false; + } + + /** + * Returns if the given date or datepart is earlier + * For example: + * 15.May.2000 <-> 13.June.1999 will return true for day, year and date, but not for month + * + * @param string|integer|array|Zend_Date $date Date or datepart to compare with + * @param string $part OPTIONAL Part of the date to compare, if null the timestamp is used + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return boolean + * @throws Zend_Date_Exception + */ + public function isEarlier($date, $part = null, $locale = null) + { + $result = $this->compare($date, $part, $locale); + + if ($result == -1) { + return true; + } + return false; + } + + /** + * Returns if the given date or datepart is later + * For example: + * 15.May.2000 <-> 13.June.1999 will return true for month but false for day, year and date + * Returns if the given date is later + * + * @param string|integer|array|Zend_Date $date Date or datepart to compare with + * @param string $part OPTIONAL Part of the date to compare, if null the timestamp is used + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return boolean + * @throws Zend_Date_Exception + */ + public function isLater($date, $part = null, $locale = null) + { + $result = $this->compare($date, $part, $locale); + + if ($result == 1) { + return true; + } + return false; + } + + /** + * Returns only the time of the date as new Zend_Date object + * For example: + * 15.May.2000 10:11:23 will return a dateobject equal to 01.Jan.1970 10:11:23 + * + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return Zend_Date + */ + public function getTime($locale = null) + { + return $this->copyPart(self::TIME_MEDIUM, $locale); + } + + /** + * Returns the calculated time + * + * @param string $calc Calculation to make + * @param string|integer|array|Zend_Date $time Time to calculate with, if null the actual time is taken + * @param string $format Timeformat for parsing input + * @param string|Zend_Locale $locale Locale for parsing input + * @return integer|Zend_Date new time + * @throws Zend_Date_Exception + */ + private function _time($calc, $time, $format, $locale) + { + if (is_null($time)) { + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception('parameter $time must be set, null is not allowed'); + } + + if ($locale === null) { + $locale = $this->getLocale(); + } + + if ($time instanceof Zend_Date) { + // extract time from object + $time = $time->get(self::TIME_MEDIUM, $locale); + } else { + if (is_array($time)) { + if ((isset($time['hour']) === true) or (isset($time['minute']) === true) or + (isset($time['second']) === true)) { + $parsed = $time; + } else { + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception("no hour, minute or second given in array"); + } + } else { + if (self::$_options['format_type'] == 'php') { + $format = Zend_Locale_Format::convertPhpToIsoFormat($format); + } + try { + $parsed = Zend_Locale_Format::getTime($time, array('date_format' => $format, 'locale' => $locale, 'format_type' => 'iso')); + } catch (Zend_Locale_Exception $e) { + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception($e->getMessage()); + } + } + $time = new self(0, self::TIMESTAMP, $locale); + $time->setTimezone('UTC'); + $time->set($parsed['hour'], self::HOUR); + $time->set($parsed['minute'], self::MINUTE); + $time->set($parsed['second'], self::SECOND); + $time = $time->get(self::TIME_MEDIUM, $locale); + } + + $return = $this->_calcdetail($calc, $time, self::TIME_MEDIUM, $locale); + if ($calc != 'cmp') { + return $this; + } + return $return; + } + + + /** + * Sets a new time for the date object. Format defines how to parse the time string. + * Also a complete date can be given, but only the time is used for setting. + * For example: dd.MMMM.yyTHH:mm' and 'ss sec'-> 10.May.07T25:11 and 44 sec => 1h11min44sec + 1 day + * Returned is the new date object and the existing date is left as it was before + * + * @param string|integer|array|Zend_Date $time Time to set + * @param string $format OPTIONAL Timeformat for parsing input + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return Zend_Date new time + * @throws Zend_Date_Exception + */ + public function setTime($time, $format = null, $locale = null) + { + return $this->_time('set', $time, $format, $locale); + } + + + /** + * Adds a time to the existing date. Format defines how to parse the time string. + * If only parts are given the other parts are set to 0. + * If no format is given, the standardformat of this locale is used. + * For example: HH:mm:ss -> 10 -> +10 hours + * + * @param string|integer|array|Zend_Date $time Time to add + * @param string $format OPTIONAL Timeformat for parsing input + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return Zend_Date new time + * @throws Zend_Date_Exception + */ + public function addTime($time, $format = null, $locale = null) + { + return $this->_time('add', $time, $format, $locale); + } + + + /** + * Subtracts a time from the existing date. Format defines how to parse the time string. + * If only parts are given the other parts are set to 0. + * If no format is given, the standardformat of this locale is used. + * For example: HH:mm:ss -> 10 -> -10 hours + * + * @param string|integer|array|Zend_Date $time Time to sub + * @param string $format OPTIONAL Timeformat for parsing input + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return Zend_Date new time + * @throws Zend_Date_Exception + */ + public function subTime($time, $format = null, $locale = null) + { + return $this->_time('sub', $time, $format, $locale); + } + + + /** + * Compares the time from the existing date. Format defines how to parse the time string. + * If only parts are given the other parts are set to default. + * If no format us given, the standardformat of this locale is used. + * For example: HH:mm:ss -> 10 -> 10 hours + * + * @param string|integer|array|Zend_Date $time Time to compare + * @param string $format OPTIONAL Timeformat for parsing input + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return integer 0 = equal, 1 = later, -1 = earlier + * @throws Zend_Date_Exception + */ + public function compareTime($time, $format = null, $locale = null) + { + return $this->_time('cmp', $time, $format, $locale); + } + + /** + * Returns a clone of $this, with the time part set to 00:00:00. + * + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return Zend_Date + */ + public function getDate($locale = null) + { + $date = $this->copyPart(self::DATE_FULL, $locale); + $date->addTimestamp($this->getGmtOffset()); + return $date; + } + + /** + * Returns the calculated date + * + * @param string $calc Calculation to make + * @param string|integer|array|Zend_Date $date Date to calculate with, if null the actual date is taken + * @param string $format Date format for parsing + * @param string|Zend_Locale $locale Locale for parsing input + * @return integer|Zend_Date new date + * @throws Zend_Date_Exception + */ + private function _date($calc, $date, $format, $locale) + { + if (is_null($date)) { + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception('parameter $date must be set, null is not allowed'); + } + + if ($locale === null) { + $locale = $this->getLocale(); + } + + if ($date instanceof Zend_Date) { + // extract date from object + $date = $date->get(self::DATE_FULL, $locale); + } else { + if (is_array($date)) { + if ((isset($time['year']) === true) or (isset($time['month']) === true) or + (isset($time['day']) === true)) { + $parsed = $time; + } else { + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception("no day,month or year given in array"); + } + } else { + if (self::$_options['format_type'] == 'php') { + $format = Zend_Locale_Format::convertPhpToIsoFormat($format); + } + try { + $parsed = Zend_Locale_Format::getDate($date, array('date_format' => $format, 'locale' => $locale, 'format_type' => 'iso')); + if ((strpos(strtoupper($format), 'YY') !== false) and (strpos(strtoupper($format), 'YYYY') === false)) { + $parsed['year'] = self::getFullYear($parsed['year']); + } + } catch (Zend_Locale_Exception $e) { + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception($e->getMessage()); + } + } + $date = new self(0, self::TIMESTAMP, $locale); + $date->setTimezone('UTC'); + $date->set($parsed['year'], self::YEAR); + $date->set($parsed['month'], self::MONTH); + $date->set($parsed['day'], self::DAY); + $date = $date->get(self::DATE_FULL, $locale); + } + + $return = $this->_calcdetail($calc, $date, self::DATE_FULL, $locale); + if ($calc != 'cmp') { + return $this; + } + return $return; + } + + + /** + * Sets a new date for the date object. Format defines how to parse the date string. + * Also a complete date with time can be given, but only the date is used for setting. + * For example: MMMM.yy HH:mm-> May.07 22:11 => 01.May.07 00:00 + * Returned is the new date object and the existing time is left as it was before + * + * @param string|integer|array|Zend_Date $date Date to set + * @param string $format OPTIONAL Date format for parsing + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return integer|Zend_Date new date + * @throws Zend_Date_Exception + */ + public function setDate($date, $format = null, $locale = null) + { + return $this->_date('set', $date, $format, $locale); + } + + + /** + * Adds a date to the existing date object. Format defines how to parse the date string. + * If only parts are given the other parts are set to 0. + * If no format is given, the standardformat of this locale is used. + * For example: MM.dd.YYYY -> 10 -> +10 months + * + * @param string|integer|array|Zend_Date $date Date to add + * @param string $format OPTIONAL Date format for parsing input + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return Zend_Date new date + * @throws Zend_Date_Exception + */ + public function addDate($date, $format = null, $locale = null) + { + return $this->_date('add', $date, $format, $locale); + } + + + /** + * Subtracts a date from the existing date object. Format defines how to parse the date string. + * If only parts are given the other parts are set to 0. + * If no format is given, the standardformat of this locale is used. + * For example: MM.dd.YYYY -> 10 -> -10 months + * Be aware: Subtracting 2 months is not equal to Adding -2 months !!! + * + * @param string|integer|array|Zend_Date $date Date to sub + * @param string $format OPTIONAL Date format for parsing input + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return Zend_Date new date + * @throws Zend_Date_Exception + */ + public function subDate($date, $format = null, $locale = null) + { + return $this->_date('sub', $date, $format, $locale); + } + + + /** + * Compares the date from the existing date object, ignoring the time. + * Format defines how to parse the date string. + * If only parts are given the other parts are set to 0. + * If no format is given, the standardformat of this locale is used. + * For example: 10.01.2000 => 10.02.1999 -> false + * + * @param string|integer|array|Zend_Date $date Date to compare + * @param string $format OPTIONAL Date format for parsing input + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return Zend_Date new date + * @throws Zend_Date_Exception + */ + public function compareDate($date, $format = null, $locale = null) + { + return $this->_date('cmp', $date, $format, $locale); + } + + + /** + * Returns the full ISO 8601 date from the date object. + * Always the complete ISO 8601 specifiction is used. If an other ISO date is needed + * (ISO 8601 defines several formats) use toString() instead. + * This function does not return the ISO date as object. Use copy() instead. + * + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return string + */ + public function getIso($locale = null) + { + return $this->get(self::ISO_8601, $locale); + } + + + /** + * Sets a new date for the date object. Not given parts are set to default. + * Only supported ISO 8601 formats are accepted. + * For example: 050901 -> 01.Sept.2005 00:00:00, 20050201T10:00:30 -> 01.Feb.2005 10h00m30s + * Returned is the new date object + * + * @param string|integer|Zend_Date $date ISO Date to set + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return integer|Zend_Date new date + * @throws Zend_Date_Exception + */ + public function setIso($date, $locale = null) + { + return $this->_calcvalue('set', $date, 'iso', self::ISO_8601, $locale); + } + + + /** + * Adds a ISO date to the date object. Not given parts are set to default. + * Only supported ISO 8601 formats are accepted. + * For example: 050901 -> + 01.Sept.2005 00:00:00, 10:00:00 -> +10h + * Returned is the new date object + * + * @param string|integer|Zend_Date $date ISO Date to add + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return integer|Zend_Date new date + * @throws Zend_Date_Exception + */ + public function addIso($date, $locale = null) + { + return $this->_calcvalue('add', $date, 'iso', self::ISO_8601, $locale); + } + + + /** + * Subtracts a ISO date from the date object. Not given parts are set to default. + * Only supported ISO 8601 formats are accepted. + * For example: 050901 -> - 01.Sept.2005 00:00:00, 10:00:00 -> -10h + * Returned is the new date object + * + * @param string|integer|Zend_Date $date ISO Date to sub + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return integer|Zend_Date new date + * @throws Zend_Date_Exception + */ + public function subIso($date, $locale = null) + { + return $this->_calcvalue('sub', $date, 'iso', self::ISO_8601, $locale); + } + + + /** + * Compares a ISO date with the date object. Not given parts are set to default. + * Only supported ISO 8601 formats are accepted. + * For example: 050901 -> - 01.Sept.2005 00:00:00, 10:00:00 -> -10h + * Returns if equal, earlier or later + * + * @param string|integer|Zend_Date $date ISO Date to sub + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return integer 0 = equal, 1 = later, -1 = earlier + * @throws Zend_Date_Exception + */ + public function compareIso($date, $locale = null) + { + return $this->_calcvalue('cmp', $date, 'iso', self::ISO_8601, $locale); + } + + + /** + * Returns a RFC 822 compilant datestring from the date object. + * This function does not return the RFC date as object. Use copy() instead. + * + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return string + */ + public function getArpa($locale = null) + { + return $this->get(self::RFC_822, $locale); + } + + + /** + * Sets a RFC 822 date as new date for the date object. + * Only RFC 822 compilant date strings are accepted. + * For example: Sat, 14 Feb 09 00:31:30 +0100 + * Returned is the new date object + * + * @param string|integer|Zend_Date $date RFC 822 to set + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return integer|Zend_Date new date + * @throws Zend_Date_Exception + */ + public function setArpa($date, $locale = null) + { + return $this->_calcvalue('set', $date, 'arpa', self::RFC_822, $locale); + } + + + /** + * Adds a RFC 822 date to the date object. + * ARPA messages are used in emails or HTTP Headers. + * Only RFC 822 compilant date strings are accepted. + * For example: Sat, 14 Feb 09 00:31:30 +0100 + * Returned is the new date object + * + * @param string|integer|Zend_Date $date RFC 822 Date to add + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return integer|Zend_Date new date + * @throws Zend_Date_Exception + */ + public function addArpa($date, $locale = null) + { + return $this->_calcvalue('add', $date, 'arpa', self::RFC_822, $locale); + } + + + /** + * Subtracts a RFC 822 date from the date object. + * ARPA messages are used in emails or HTTP Headers. + * Only RFC 822 compilant date strings are accepted. + * For example: Sat, 14 Feb 09 00:31:30 +0100 + * Returned is the new date object + * + * @param string|integer|Zend_Date $date RFC 822 Date to sub + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return integer|Zend_Date new date + * @throws Zend_Date_Exception + */ + public function subArpa($date, $locale = null) + { + return $this->_calcvalue('sub', $date, 'arpa', self::RFC_822, $locale); + } + + + /** + * Compares a RFC 822 compilant date with the date object. + * ARPA messages are used in emails or HTTP Headers. + * Only RFC 822 compilant date strings are accepted. + * For example: Sat, 14 Feb 09 00:31:30 +0100 + * Returns if equal, earlier or later + * + * @param string|integer|Zend_Date $date RFC 822 Date to sub + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return integer 0 = equal, 1 = later, -1 = earlier + * @throws Zend_Date_Exception + */ + public function compareArpa($date, $locale = null) + { + return $this->_calcvalue('cmp', $date, 'arpa', self::RFC_822, $locale); + } + + + /** + * Check if location is supported + * + * @param $location array - locations array + * @return $horizon float + */ + private function _checkLocation($location) + { + if (!isset($location['longitude']) or !isset($location['latitude'])) { + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception('Location must include \'longitude\' and \'latitude\'', $location); + } + if (($location['longitude'] > 180) or ($location['longitude'] < -180)) { + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception('Longitude must be between -180 and 180', $location); + } + if (($location['latitude'] > 90) or ($location['latitude'] < -90)) { + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception('Latitude must be between -90 and 90', $location); + } + + if (!isset($location['horizon'])){ + $location['horizon'] = 'effective'; + } + + switch ($location['horizon']) { + case 'civil' : + return -0.104528; + break; + case 'nautic' : + return -0.207912; + break; + case 'astronomic' : + return -0.309017; + break; + default : + return -0.0145439; + break; + } + } + + + /** + * Returns the time of sunrise for this date and a given location as new date object + * For a list of cities and correct locations use the class Zend_Date_Cities + * + * @param $location array - location of sunrise + * ['horizon'] -> civil, nautic, astronomical, effective (default) + * ['longitude'] -> longitude of location + * ['latitude'] -> latitude of location + * @return Zend_Date + * @throws Zend_Date_Exception + */ + public function getSunrise($location) + { + $horizon = $this->_checkLocation($location); + $result = clone $this; + $result->set($this->calcSun($location, $horizon, true), self::TIMESTAMP); + return $result; + } + + + /** + * Returns the time of sunset for this date and a given location as new date object + * For a list of cities and correct locations use the class Zend_Date_Cities + * + * @param $location array - location of sunset + * ['horizon'] -> civil, nautic, astronomical, effective (default) + * ['longitude'] -> longitude of location + * ['latitude'] -> latitude of location + * @return Zend_Date + * @throws Zend_Date_Exception + */ + public function getSunset($location) + { + $horizon = $this->_checkLocation($location); + $result = clone $this; + $result->set($this->calcSun($location, $horizon, false), self::TIMESTAMP); + return $result; + } + + + /** + * Returns an array with the sunset and sunrise dates for all horizon types + * For a list of cities and correct locations use the class Zend_Date_Cities + * + * @param $location array - location of suninfo + * ['horizon'] -> civil, nautic, astronomical, effective (default) + * ['longitude'] -> longitude of location + * ['latitude'] -> latitude of location + * @return array - [sunset|sunrise][effective|civil|nautic|astronomic] + * @throws Zend_Date_Exception + */ + public function getSunInfo($location) + { + $suninfo = array(); + for ($i = 0; $i < 4; ++$i) { + switch ($i) { + case 0 : + $location['horizon'] = 'effective'; + break; + case 1 : + $location['horizon'] = 'civil'; + break; + case 2 : + $location['horizon'] = 'nautic'; + break; + case 3 : + $location['horizon'] = 'astronomic'; + break; + } + $horizon = $this->_checkLocation($location); + $result = clone $this; + $result->set($this->calcSun($location, $horizon, true), self::TIMESTAMP); + $suninfo['sunrise'][$location['horizon']] = $result; + $result = clone $this; + $result->set($this->calcSun($location, $horizon, false), self::TIMESTAMP); + $suninfo['sunset'][$location['horizon']] = $result; + } + return $suninfo; + } + + + /** + * Check a given year for leap year. + * + * @param integer|array|Zend_Date $year Year to check + * @return boolean + */ + public static function checkLeapYear($year) + { + if ($year instanceof Zend_Date) { + $year = (int) $year->get(self::YEAR); + } + if (is_array($year)) { + if (isset($year['year']) === true) { + $year = $year['year']; + } else { + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception("no year given in array"); + } + } + if (!is_numeric($year)) { + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception("year ($year) has to be integer for checkLeapYear()", $year); + } + + return (bool) parent::isYearLeapYear($year); + } + + + /** + * Returns true, if the year is a leap year. + * + * @return boolean + */ + public function isLeapYear() + { + return self::checkLeapYear($this); + } + + + /** + * Returns if the set date is todays date + * + * @return boolean + */ + public function isToday() + { + $today = $this->date('Ymd', $this->_getTime()); + $day = $this->date('Ymd', $this->getUnixTimestamp()); + return ($today == $day); + } + + + /** + * Returns if the set date is yesterdays date + * + * @return boolean + */ + public function isYesterday() + { + list($year, $month, $day) = explode('-', $this->date('Y-m-d', $this->_getTime())); + // adjusts for leap days and DST changes that are timezone specific + $yesterday = $this->date('Ymd', $this->mktime(0, 0, 0, $month, $day -1, $year)); + $day = $this->date('Ymd', $this->getUnixTimestamp()); + return $day == $yesterday; + } + + + /** + * Returns if the set date is tomorrows date + * + * @return boolean + */ + public function isTomorrow() + { + list($year, $month, $day) = explode('-', $this->date('Y-m-d', $this->_getTime())); + // adjusts for leap days and DST changes that are timezone specific + $tomorrow = $this->date('Ymd', $this->mktime(0, 0, 0, $month, $day +1, $year)); + $day = $this->date('Ymd', $this->getUnixTimestamp()); + return $day == $tomorrow; + } + + /** + * Returns the actual date as new date object + * + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return Zend_Date + */ + public static function now($locale = null) + { + return new Zend_Date(time(), self::TIMESTAMP, $locale); + } + + /** + * Calculate date details + * + * @param string $calc Calculation to make + * @param string|integer|array|Zend_Date $date Date or Part to calculate + * @param string $part Datepart for Calculation + * @param string|Zend_Locale $locale Locale for parsing input + * @return integer|string new date + * @throws Zend_Date_Exception + */ + private function _calcdetail($calc, $date, $type, $locale) + { + switch($calc) { + case 'set' : + return $this->set($date, $type, $locale); + break; + case 'add' : + return $this->add($date, $type, $locale); + break; + case 'sub' : + return $this->sub($date, $type, $locale); + break; + } + return $this->compare($date, $type, $locale); + } + + /** + * Internal calculation, returns the requested date type + * + * @param string $calc Calculation to make + * @param string|integer|Zend_Date $value Datevalue to calculate with, if null the actual value is taken + * @param string|Zend_Locale $locale Locale for parsing input + * @return integer|Zend_Date new date + * @throws Zend_Date_Exception + */ + private function _calcvalue($calc, $value, $type, $parameter, $locale) + { + if (is_null($value)) { + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception("parameter $type must be set, null is not allowed"); + } + + if ($locale === null) { + $locale = $this->getLocale(); + } + + if ($value instanceof Zend_Date) { + // extract value from object + $value = $value->get($parameter, $locale); + } else if (!is_array($value) && !is_numeric($value) && ($type != 'iso') && ($type != 'arpa')) { + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception("invalid $type ($value) operand", $value); + } + + $return = $this->_calcdetail($calc, $value, $parameter, $locale); + if ($calc != 'cmp') { + return $this; + } + return $return; + } + + + /** + * Returns only the year from the date object as new object. + * For example: 10.May.2000 10:30:00 -> 01.Jan.2000 00:00:00 + * + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return Zend_Date + */ + public function getYear($locale = null) + { + return $this->copyPart(self::YEAR, $locale); + } + + + /** + * Sets a new year + * If the year is between 0 and 69, 2000 will be set (2000-2069) + * If the year if between 70 and 99, 1999 will be set (1970-1999) + * 3 or 4 digit years are set as expected. If you need to set year 0-99 + * use set() instead. + * Returned is the new date object + * + * @param string|integer|array|Zend_Date $date Year to set + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return Zend_Date new date + * @throws Zend_Date_Exception + */ + public function setYear($year, $locale = null) + { + return $this->_calcvalue('set', $year, 'year', self::YEAR, $locale); + } + + + /** + * Adds the year to the existing date object + * If the year is between 0 and 69, 2000 will be added (2000-2069) + * If the year if between 70 and 99, 1999 will be added (1970-1999) + * 3 or 4 digit years are added as expected. If you need to add years from 0-99 + * use add() instead. + * Returned is the new date object + * + * @param string|integer|array|Zend_Date $date Year to add + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return Zend_Date new date + * @throws Zend_Date_Exception + */ + public function addYear($year, $locale = null) + { + return $this->_calcvalue('add', $year, 'year', self::YEAR, $locale); + } + + + /** + * Subs the year from the existing date object + * If the year is between 0 and 69, 2000 will be subtracted (2000-2069) + * If the year if between 70 and 99, 1999 will be subtracted (1970-1999) + * 3 or 4 digit years are subtracted as expected. If you need to subtract years from 0-99 + * use sub() instead. + * Returned is the new date object + * + * @param string|integer|array|Zend_Date $date Year to sub + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return Zend_Date new date + * @throws Zend_Date_Exception + */ + public function subYear($year, $locale = null) + { + return $this->_calcvalue('sub', $year, 'year', self::YEAR, $locale); + } + + + /** + * Compares the year with the existing date object, ignoring other date parts. + * For example: 10.03.2000 -> 15.02.2000 -> true + * Returns if equal, earlier or later + * + * @param string|integer|array|Zend_Date $year Year to compare + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return integer 0 = equal, 1 = later, -1 = earlier + * @throws Zend_Date_Exception + */ + public function compareYear($year, $locale = null) + { + return $this->_calcvalue('cmp', $year, 'year', self::YEAR, $locale); + } + + + /** + * Returns only the month from the date object as new object. + * For example: 10.May.2000 10:30:00 -> 01.May.1970 00:00:00 + * + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return Zend_Date + */ + public function getMonth($locale = null) + { + return $this->copyPart(self::MONTH, $locale); + } + + + /** + * Returns the calculated month + * + * @param string $calc Calculation to make + * @param string|integer|array|Zend_Date $month Month to calculate with, if null the actual month is taken + * @param string|Zend_Locale $locale Locale for parsing input + * @return integer|Zend_Date new time + * @throws Zend_Date_Exception + */ + private function _month($calc, $month, $locale) + { + if (is_null($month)) { + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception('parameter $month must be set, null is not allowed'); + } + + if ($locale === null) { + $locale = $this->getLocale(); + } + + if ($month instanceof Zend_Date) { + // extract month from object + $found = $month->get(self::MONTH_SHORT, $locale); + } else { + if (is_numeric($month)) { + $found = $month; + } else if (is_array($month)) { + if (isset($month['month']) === true) { + $month = $month['month']; + } else { + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception("no month given in array"); + } + } else { + $monthlist = Zend_Locale_Data::getList($locale, 'month'); + $monthlist2 = Zend_Locale_Data::getList($locale, 'month', array('gregorian', 'format', 'abbreviated')); + + $monthlist = array_merge($monthlist, $monthlist2); + $found = 0; + $cnt = 0; + foreach ($monthlist as $key => $value) { + if (strtoupper($value) == strtoupper($month)) { + $found = $key + 1; + break; + } + ++$cnt; + } + if ($found == 0) { + foreach ($monthlist2 as $key => $value) { + if (strtoupper(substr($value, 0, 1)) == strtoupper($month)) { + $found = $key + 1; + break; + } + ++$cnt; + } + } + if ($found == 0) { + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception("unknown month name ($month)", $month); + } + } + } + $return = $this->_calcdetail($calc, $found, self::MONTH_SHORT, $locale); + if ($calc != 'cmp') { + return $this; + } + return $return; + } + + + /** + * Sets a new month + * The month can be a number or a string. Setting months lower then 0 and greater then 12 + * will result in adding or subtracting the relevant year. (12 months equal one year) + * If a localized monthname is given it will be parsed with the default locale or the optional + * set locale. + * Returned is the new date object + * + * @param string|integer|array|Zend_Date $month Month to set + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return Zend_Date new date + * @throws Zend_Date_Exception + */ + public function setMonth($month, $locale = null) + { + return $this->_month('set', $month, $locale); + } + + + /** + * Adds months to the existing date object. + * The month can be a number or a string. Adding months lower then 0 and greater then 12 + * will result in adding or subtracting the relevant year. (12 months equal one year) + * If a localized monthname is given it will be parsed with the default locale or the optional + * set locale. + * Returned is the new date object + * + * @param string|integer|array|Zend_Date $month Month to add + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return Zend_Date new date + * @throws Zend_Date_Exception + */ + public function addMonth($month, $locale = null) + { + return $this->_month('add', $month, $locale); + } + + + /** + * Subtracts months from the existing date object. + * The month can be a number or a string. Subtracting months lower then 0 and greater then 12 + * will result in adding or subtracting the relevant year. (12 months equal one year) + * If a localized monthname is given it will be parsed with the default locale or the optional + * set locale. + * Returned is the new date object + * + * @param string|integer|array|Zend_Date $month Month to sub + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return Zend_Date new date + * @throws Zend_Date_Exception + */ + public function subMonth($month, $locale = null) + { + return $this->_month('sub', $month, $locale); + } + + + /** + * Compares the month with the existing date object, ignoring other date parts. + * For example: 10.03.2000 -> 15.03.1950 -> true + * Returns if equal, earlier or later + * + * @param string|integer|array|Zend_Date $month Month to compare + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return integer 0 = equal, 1 = later, -1 = earlier + * @throws Zend_Date_Exception + */ + public function compareMonth($month, $locale = null) + { + return $this->_month('cmp', $month, $locale); + } + + + /** + * Returns the day as new date object + * Example: 20.May.1986 -> 20.Jan.1970 00:00:00 + * + * @param $locale string|Zend_Locale OPTIONAL Locale for parsing input + * @return Zend_Date + */ + public function getDay($locale = null) + { + return $this->copyPart(self::DAY_SHORT, $locale); + } + + + /** + * Returns the calculated day + * + * @param $calc string Type of calculation to make + * @param $day string|integer|Zend_Date Day to calculate, when null the actual day is calculated + * @param $locale string|Zend_Locale Locale for parsing input + * @return Zend_Date|integer + */ + private function _day($calc, $day, $locale) + { + if (is_null($day)) { + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception('parameter $day must be set, null is not allowed'); + } + + if ($locale === null) { + $locale = $this->getLocale(); + } + + if ($day instanceof Zend_Date) { + $day = $day->get(self::DAY_SHORT, $locale); + } + + if (is_numeric($day)) { + $type = self::DAY_SHORT; + } else if (is_array($day)) { + if (isset($day['day']) === true) { + $day = $day['day']; + $type = self::WEEKDAY; + } else { + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception("no day given in array"); + } + } else { + switch (strlen($day)) { + case 1 : + $type = self::WEEKDAY_NARROW; + break; + case 2: + $type = self::WEEKDAY_NAME; + break; + case 3: + $type = self::WEEKDAY_SHORT; + break; + default: + $type = self::WEEKDAY; + break; + } + } + $return = $this->_calcdetail($calc, $day, $type, $locale); + if ($calc != 'cmp') { + return $this; + } + return $return; + } + + + /** + * Sets a new day + * The day can be a number or a string. Setting days lower then 0 or greater than the number of this months days + * will result in adding or subtracting the relevant month. + * If a localized dayname is given it will be parsed with the default locale or the optional + * set locale. + * Returned is the new date object + * Example: setDay('Montag', 'de_AT'); will set the monday of this week as day. + * + * @param string|integer|array|Zend_Date $month Day to set + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return Zend_Date new date + * @throws Zend_Date_Exception + */ + public function setDay($day, $locale = null) + { + return $this->_day('set', $day, $locale); + } + + + /** + * Adds days to the existing date object. + * The day can be a number or a string. Adding days lower then 0 or greater than the number of this months days + * will result in adding or subtracting the relevant month. + * If a localized dayname is given it will be parsed with the default locale or the optional + * set locale. + * Returned is the new date object + * Example: addDay('Montag', 'de_AT'); will add the number of days until the next monday + * + * @param string|integer|array|Zend_Date $month Day to add + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return Zend_Date new date + * @throws Zend_Date_Exception + */ + public function addDay($day, $locale = null) + { + return $this->_day('add', $day, $locale); + } + + + /** + * Subtracts days from the existing date object. + * The day can be a number or a string. Subtracting days lower then 0 or greater than the number of this months days + * will result in adding or subtracting the relevant month. + * If a localized dayname is given it will be parsed with the default locale or the optional + * set locale. + * Returned is the new date object + * Example: subDay('Montag', 'de_AT'); will sub the number of days until the previous monday + * + * @param string|integer|array|Zend_Date $month Day to sub + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return Zend_Date new date + * @throws Zend_Date_Exception + */ + public function subDay($day, $locale = null) + { + return $this->_day('sub', $day, $locale); + } + + + /** + * Compares the day with the existing date object, ignoring other date parts. + * For example: 'Monday', 'en' -> 08.Jan.2007 -> 0 + * Returns if equal, earlier or later + * + * @param string|integer|array|Zend_Date $day Day to compare + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return integer 0 = equal, 1 = later, -1 = earlier + * @throws Zend_Date_Exception + */ + public function compareDay($day, $locale = null) + { + return $this->_day('cmp', $day, $locale); + } + + + /** + * Returns the weekday as new date object + * Weekday is always from 1-7 + * Example: 09-Jan-2007 -> 2 = Tuesday -> 02-Jan-1970 (when 02.01.1970 is also Tuesday) + * + * @param $locale string|Zend_Locale OPTIONAL Locale for parsing input + * @return Zend_Date + */ + public function getWeekday($locale = null) + { + return $this->copyPart(self::WEEKDAY, $locale); + } + + + /** + * Returns the calculated weekday + * + * @param $calc string Type of calculation to make + * @param $weekday string|integer|array|Zend_Date Weekday to calculate, when null the actual weekday is calculated + * @param $locale string|Zend_Locale Locale for parsing input + * @return Zend_Date|integer + * @throws Zend_Date_Exception + */ + private function _weekday($calc, $weekday, $locale) + { + if (is_null($weekday)) { + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception('parameter $weekday must be set, null is not allowed'); + } + + if ($locale === null) { + $locale = $this->getLocale(); + } + + if ($weekday instanceof Zend_Date) { + $weekday = $weekday->get(self::WEEKDAY_8601, $locale); + } + + if (is_numeric($weekday)) { + $type = self::WEEKDAY_8601; + } else if (is_array($weekday)) { + if (isset($weekday['weekday']) === true) { + $weekday = $weekday['weekday']; + $type = self::WEEKDAY; + } else { + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception("no weekday given in array"); + } + } else { + switch(strlen($weekday)) { + case 1: + $type = self::WEEKDAY_NARROW; + break; + case 2: + $type = self::WEEKDAY_NAME; + break; + case 3: + $type = self::WEEKDAY_SHORT; + break; + default: + $type = self::WEEKDAY; + break; + } + } + $return = $this->_calcdetail($calc, $weekday, $type, $locale); + if ($calc != 'cmp') { + return $this; + } + return $return; + } + + + /** + * Sets a new weekday + * The weekday can be a number or a string. If a localized weekday name is given, + * then it will be parsed as a date in $locale (defaults to the same locale as $this). + * Returned is the new date object. + * Example: setWeekday(3); will set the wednesday of this week as day. + * + * @param string|integer|array|Zend_Date $month Weekday to set + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return Zend_Date new date + * @throws Zend_Date_Exception + */ + public function setWeekday($weekday, $locale = null) + { + return $this->_weekday('set', $weekday, $locale); + } + + + /** + * Adds weekdays to the existing date object. + * The weekday can be a number or a string. + * If a localized dayname is given it will be parsed with the default locale or the optional + * set locale. + * Returned is the new date object + * Example: addWeekday(3); will add the difference of days from the begining of the month until + * wednesday. + * + * @param string|integer|array|Zend_Date $month Weekday to add + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return Zend_Date new date + * @throws Zend_Date_Exception + */ + public function addWeekday($weekday, $locale = null) + { + return $this->_weekday('add', $weekday, $locale); + } + + + /** + * Subtracts weekdays from the existing date object. + * The weekday can be a number or a string. + * If a localized dayname is given it will be parsed with the default locale or the optional + * set locale. + * Returned is the new date object + * Example: subWeekday(3); will subtract the difference of days from the begining of the month until + * wednesday. + * + * @param string|integer|array|Zend_Date $month Weekday to sub + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return Zend_Date new date + * @throws Zend_Date_Exception + */ + public function subWeekday($weekday, $locale = null) + { + return $this->_weekday('sub', $weekday, $locale); + } + + + /** + * Compares the weekday with the existing date object, ignoring other date parts. + * For example: 'Monday', 'en' -> 08.Jan.2007 -> 0 + * Returns if equal, earlier or later + * + * @param string|integer|array|Zend_Date $weekday Weekday to compare + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return integer 0 = equal, 1 = later, -1 = earlier + * @throws Zend_Date_Exception + */ + public function compareWeekday($weekday, $locale = null) + { + return $this->_weekday('cmp', $weekday, $locale); + } + + + /** + * Returns the day of year as new date object + * Example: 02.Feb.1986 10:00:00 -> 02.Feb.1970 00:00:00 + * + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return Zend_Date + */ + public function getDayOfYear($locale = null) + { + return $this->copyPart(self::DAY_OF_YEAR, $locale); + } + + + /** + * Sets a new day of year + * The day of year is always a number. + * Returned is the new date object + * Example: 04.May.2004 -> setDayOfYear(10) -> 10.Jan.2004 + * + * @param string|integer|array|Zend_Date $day Day of Year to set + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return Zend_Date new date + * @throws Zend_Date_Exception + */ + public function setDayOfYear($day, $locale = null) + { + return $this->_calcvalue('set', $day, 'day of year', self::DAY_OF_YEAR, $locale); + } + + + /** + * Adds a day of year to the existing date object. + * The day of year is always a number. + * Returned is the new date object + * Example: addDayOfYear(10); will add 10 days to the existing date object. + * + * @param string|integer|array|Zend_Date $day Day of Year to add + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return Zend_Date new date + * @throws Zend_Date_Exception + */ + public function addDayOfYear($day, $locale = null) + { + return $this->_calcvalue('add', $day, 'day of year', self::DAY_OF_YEAR, $locale); + } + + + /** + * Subtracts a day of year from the existing date object. + * The day of year is always a number. + * Returned is the new date object + * Example: subDayOfYear(10); will subtract 10 days from the existing date object. + * + * @param string|integer|array|Zend_Date $day Day of Year to sub + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return Zend_Date new date + * @throws Zend_Date_Exception + */ + public function subDayOfYear($day, $locale = null) + { + return $this->_calcvalue('sub', $day, 'day of year', self::DAY_OF_YEAR, $locale); + } + + + /** + * Compares the day of year with the existing date object. + * For example: compareDayOfYear(33) -> 02.Feb.2007 -> 0 + * Returns if equal, earlier or later + * + * @param string|integer|array|Zend_Date $day Day of Year to compare + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return integer 0 = equal, 1 = later, -1 = earlier + * @throws Zend_Date_Exception + */ + public function compareDayOfYear($day, $locale = null) + { + return $this->_calcvalue('cmp', $day, 'day of year', self::DAY_OF_YEAR, $locale); + } + + + /** + * Returns the hour as new date object + * Example: 02.Feb.1986 10:30:25 -> 01.Jan.1970 10:00:00 + * + * @param $locale string|Zend_Locale OPTIONAL Locale for parsing input + * @return Zend_Date + */ + public function getHour($locale = null) + { + return $this->copyPart(self::HOUR, $locale); + } + + + /** + * Sets a new hour + * The hour is always a number. + * Returned is the new date object + * Example: 04.May.1993 13:07:25 -> setHour(7); -> 04.May.1993 07:07:25 + * + * @param string|integer|array|Zend_Date $hour Hour to set + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return Zend_Date new date + * @throws Zend_Date_Exception + */ + public function setHour($hour, $locale = null) + { + return $this->_calcvalue('set', $hour, 'hour', self::HOUR_SHORT, $locale); + } + + + /** + * Adds hours to the existing date object. + * The hour is always a number. + * Returned is the new date object + * Example: 04.May.1993 13:07:25 -> addHour(12); -> 05.May.1993 01:07:25 + * + * @param string|integer|array|Zend_Date $hour Hour to add + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return Zend_Date new date + * @throws Zend_Date_Exception + */ + public function addHour($hour, $locale = null) + { + return $this->_calcvalue('add', $hour, 'hour', self::HOUR_SHORT, $locale); + } + + + /** + * Subtracts hours from the existing date object. + * The hour is always a number. + * Returned is the new date object + * Example: 04.May.1993 13:07:25 -> subHour(6); -> 05.May.1993 07:07:25 + * + * @param string|integer|array|Zend_Date $hour Hour to sub + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return Zend_Date new date + * @throws Zend_Date_Exception + */ + public function subHour($hour, $locale = null) + { + return $this->_calcvalue('sub', $hour, 'hour', self::HOUR_SHORT, $locale); + } + + + /** + * Compares the hour with the existing date object. + * For example: 10:30:25 -> compareHour(10) -> 0 + * Returns if equal, earlier or later + * + * @param string|integer|array|Zend_Date $hour Hour to compare + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return integer 0 = equal, 1 = later, -1 = earlier + * @throws Zend_Date_Exception + */ + public function compareHour($hour, $locale = null) + { + return $this->_calcvalue('cmp', $hour, 'hour', self::HOUR_SHORT, $locale); + } + + + /** + * Returns the minute as new date object + * Example: 02.Feb.1986 10:30:25 -> 01.Jan.1970 00:30:00 + * + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return Zend_Date + */ + public function getMinute($locale = null) + { + return $this->copyPart(self::MINUTE, $locale); + } + + + /** + * Sets a new minute + * The minute is always a number. + * Returned is the new date object + * Example: 04.May.1993 13:07:25 -> setMinute(29); -> 04.May.1993 13:29:25 + * + * @param string|integer|array|Zend_Date $minute Minute to set + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return Zend_Date new date + * @throws Zend_Date_Exception + */ + public function setMinute($minute, $locale = null) + { + return $this->_calcvalue('set', $minute, 'minute', self::MINUTE_SHORT, $locale); + } + + + /** + * Adds minutes to the existing date object. + * The minute is always a number. + * Returned is the new date object + * Example: 04.May.1993 13:07:25 -> addMinute(65); -> 04.May.1993 13:12:25 + * + * @param string|integer|array|Zend_Date $minute Minute to add + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return Zend_Date new date + * @throws Zend_Date_Exception + */ + public function addMinute($minute, $locale = null) + { + return $this->_calcvalue('add', $minute, 'minute', self::MINUTE_SHORT, $locale); + } + + + /** + * Subtracts minutes from the existing date object. + * The minute is always a number. + * Returned is the new date object + * Example: 04.May.1993 13:07:25 -> subMinute(9); -> 04.May.1993 12:58:25 + * + * @param string|integer|array|Zend_Date $minute Minute to sub + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return Zend_Date new date + * @throws Zend_Date_Exception + */ + public function subMinute($minute, $locale = null) + { + return $this->_calcvalue('sub', $minute, 'minute', self::MINUTE_SHORT, $locale); + } + + + /** + * Compares the minute with the existing date object. + * For example: 10:30:25 -> compareMinute(30) -> 0 + * Returns if equal, earlier or later + * + * @param string|integer|array|Zend_Date $minute Hour to compare + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return integer 0 = equal, 1 = later, -1 = earlier + * @throws Zend_Date_Exception + */ + public function compareMinute($minute, $locale = null) + { + return $this->_calcvalue('cmp', $minute, 'minute', self::MINUTE_SHORT, $locale); + } + + + /** + * Returns the second as new date object + * Example: 02.Feb.1986 10:30:25 -> 01.Jan.1970 00:00:25 + * + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return Zend_Date + */ + public function getSecond($locale = null) + { + return $this->copyPart(self::SECOND, $locale); + } + + + /** + * Sets new seconds to the existing date object. + * The second is always a number. + * Returned is the new date object + * Example: 04.May.1993 13:07:25 -> setSecond(100); -> 04.May.1993 13:08:40 + * + * @param string|integer|array|Zend_Date $second Second to set + * @param string|Zend_Locale $locale (Optional) Locale for parsing input + * @return Zend_Date new date + * @throws Zend_Date_Exception + */ + public function setSecond($second, $locale = null) + { + return $this->_calcvalue('set', $second, 'second', self::SECOND_SHORT, $locale); + } + + + /** + * Adds seconds to the existing date object. + * The second is always a number. + * Returned is the new date object + * Example: 04.May.1993 13:07:25 -> addSecond(65); -> 04.May.1993 13:08:30 + * + * @param string|integer|array|Zend_Date $second Second to add + * @param string|Zend_Locale $locale (Optional) Locale for parsing input + * @return Zend_Date new date + * @throws Zend_Date_Exception + */ + public function addSecond($second, $locale = null) + { + return $this->_calcvalue('add', $second, 'second', self::SECOND_SHORT, $locale); + } + + + /** + * Subtracts seconds from the existing date object. + * The second is always a number. + * Returned is the new date object + * Example: 04.May.1993 13:07:25 -> subSecond(10); -> 04.May.1993 13:07:15 + * + * @param string|integer|array|Zend_Date $second Second to sub + * @param string|Zend_Locale $locale (Optional) Locale for parsing input + * @return Zend_Date new date + * @throws Zend_Date_Exception + */ + public function subSecond($second, $locale = null) + { + return $this->_calcvalue('sub', $second, 'second', self::SECOND_SHORT, $locale); + } + + + /** + * Compares the second with the existing date object. + * For example: 10:30:25 -> compareSecond(25) -> 0 + * Returns if equal, earlier or later + * + * @param string|integer|array|Zend_Date $second Second to compare + * @param string|Zend_Locale $locale (Optional) Locale for parsing input + * @return integer 0 = equal, 1 = later, -1 = earlier + * @throws Zend_Date_Exception + */ + public function compareSecond($second, $locale = null) + { + return $this->_calcvalue('cmp', $second, 'second', self::SECOND_SHORT, $locale); + } + + + /** + * Returns the precision for fractional seconds + * + * @return integer + */ + public function getFractionalPrecision() + { + return $this->_precision; + } + + + /** + * Sets a new precision for fractional seconds + * + * @param integer $precision Precision for the fractional datepart 3 = milliseconds + * @throws Zend_Date_Exception + * @return void + */ + public function setFractionalPrecision($precision) + { + if (!intval($precision) or ($precision < 0) or ($precision > 9)) { + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception("precision ($precision) must be a positive integer less than 10", $precision); + } + $this->_precision = (int) $precision; + } + + + /** + * Returns the milliseconds of the date object + * + * @return integer + */ + public function getMilliSecond() + { + return $this->_fractional; + } + + + /** + * Sets new milliseconds for the date object + * Example: setMilliSecond(550, 2) -> equals +5 Sec +50 MilliSec + * + * @param integer|Zend_Date $milli (Optional) Millisecond to set, when null the actual millisecond is set + * @param integer $precision (Optional) Fraction precision of the given milliseconds + * @return integer|string + */ + public function setMilliSecond($milli = null, $precision = null) + { + if ($milli === null) { + list($milli, $time) = explode(" ", microtime()); + $milli = intval($milli); + $precision = 6; + } else if (!is_numeric($milli)) { + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception("invalid milli second ($milli) operand", $milli); + } + + if ($precision === null) { + $precision = $this->_precision; + } else if (!is_int($precision) || $precision < 1 || $precision > 9) { + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception("precision ($precision) must be a positive integer less than 10", $precision); + } + + $this->_fractional = 0; + $this->addMilliSecond($milli, $precision); + return $this->_fractional; + } + + + /** + * Adds milliseconds to the date object + * + * @param integer|Zend_Date $milli (Optional) Millisecond to add, when null the actual millisecond is added + * @param integer $precision (Optional) Fractional precision for the given milliseconds + * @return integer|string + */ + public function addMilliSecond($milli = null, $precision = null) + { + if ($milli === null) { + list($milli, $time) = explode(" ", microtime()); + $milli = intval($milli); + } else if (!is_numeric($milli)) { + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception("invalid milli second ($milli) operand", $milli); + } + + if ($precision === null) { + $precision = $this->_precision; + } else if (!is_int($precision) || $precision < 1 || $precision > 9) { + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception("precision ($precision) must be a positive integer less than 10", $precision); + } + + if ($precision != $this->_precision) { + if ($precision > $this->_precision) { + $diff = $precision - $this->_precision; + $milli = (int) ($milli / (10 * $diff)); + } else { + $diff = $this->_precision - $precision; + $milli = (int) ($milli * (10 * $diff)); + } + } + + $this->_fractional += $milli; + // Add/sub milliseconds + add/sub seconds + + $max = pow(10, $this->_precision); + // Milli includes seconds + if ($this->_fractional >= $max) { + while ($this->_fractional >= $max) { + $this->addSecond(1); + $this->_fractional -= $max; + } + } + + if ($this->_fractional < 0) { + while ($this->_fractional < 0) { + $this->subSecond(1); + $this->_fractional += $max; + } + } + + return $this->_fractional; + } + + + /** + * Subtracts a millisecond + * + * @param integer|Zend_Date $milli (Optional) Millisecond to sub, when null the actual millisecond is subtracted + * @param integer $precision (Optional) Fractional precision for the given milliseconds + * @return integer + */ + public function subMilliSecond($milli = null, $precision = null) + { + return $this->addMilliSecond(0 - $milli); + } + + /** + * Compares only the millisecond part, returning the difference + * + * @param integer|Zend_Date $milli OPTIONAL Millisecond to compare, when null the actual millisecond is compared + * @param integer $precision OPTIONAL Fractional precision for the given milliseconds + * @return integer + */ + public function compareMilliSecond($milli = null, $precision = null) + { + if ($milli === null) { + list($milli, $time) = explode(" ", microtime()); + $milli = intval($milli); + } else if (is_numeric($milli) === false) { + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception("invalid milli second ($milli) operand", $milli); + } + + if ($precision === null) { + $precision = $this->_precision; + } else if (!is_int($precision) || $precision < 1 || $precision > 9) { + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception("precision ($precision) must be a positive integer less than 10", $precision); + } + + if ($precision === 0) { + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception('precision is 0'); + } + + if ($precision != $this->_precision) { + if ($precision > $this->_precision) { + $diff = $precision - $this->_precision; + $milli = (int) ($milli / (10 * $diff)); + } else { + $diff = $this->_precision - $precision; + $milli = (int) ($milli * (10 * $diff)); + } + } + + $comp = $this->_fractional - $milli; + if ($comp < 0) { + return -1; + } else if ($comp > 0) { + return 1; + } + return 0; + } + + /** + * Returns the week as new date object using monday as begining of the week + * Example: 12.Jan.2007 -> 08.Jan.1970 00:00:00 + * + * @param $locale string|Zend_Locale OPTIONAL Locale for parsing input + * @return Zend_Date + */ + public function getWeek($locale = null) + { + return $this->copyPart(self::WEEK, $locale); + } + + /** + * Sets a new week. The week is always a number. The day of week is not changed. + * Returned is the new date object + * Example: 09.Jan.2007 13:07:25 -> setWeek(1); -> 02.Jan.2007 13:07:25 + * + * @param string|integer|array|Zend_Date $week Week to set + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return Zend_Date + * @throws Zend_Date_Exception + */ + public function setWeek($week, $locale = null) + { + return $this->_calcvalue('set', $week, 'week', self::WEEK, $locale); + } + + /** + * Adds a week. The week is always a number. The day of week is not changed. + * Returned is the new date object + * Example: 09.Jan.2007 13:07:25 -> addWeek(1); -> 16.Jan.2007 13:07:25 + * + * @param string|integer|array|Zend_Date $week Week to add + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return Zend_Date + * @throws Zend_Date_Exception + */ + public function addWeek($week, $locale = null) + { + return $this->_calcvalue('add', $week, 'week', self::WEEK, $locale); + } + + /** + * Subtracts a week. The week is always a number. The day of week is not changed. + * Returned is the new date object + * Example: 09.Jan.2007 13:07:25 -> subWeek(1); -> 02.Jan.2007 13:07:25 + * + * @param string|integer|array|Zend_Date $week Week to sub + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return Zend_Date + * @throws Zend_Date_Exception + */ + public function subWeek($week, $locale = null) + { + return $this->_calcvalue('sub', $week, 'week', self::WEEK, $locale); + } + + /** + * Compares only the week part, returning the difference + * Returned is the new date object + * Returns if equal, earlier or later + * Example: 09.Jan.2007 13:07:25 -> compareWeek(2); -> 0 + * + * @param string|integer|array|Zend_Date $week Week to compare + * @param string|Zend_Locale $locale OPTIONAL Locale for parsing input + * @return integer 0 = equal, 1 = later, -1 = earlier + */ + public function compareWeek($week, $locale = null) + { + return $this->_calcvalue('cmp', $week, 'week', self::WEEK, $locale); + } + + /** + * Sets a new standard locale for the date object. + * This locale will be used for all functions + * Returned is the really set locale. + * Example: 'de_XX' will be set to 'de' because 'de_XX' does not exist + * 'xx_YY' will be set to 'root' because 'xx' does not exist + * + * @param string|Zend_Locale $locale (Optional) Locale for parsing input + * @throws Zend_Date_Exception When the given locale does not exist + * @return Zend_Date Provides fluent interface + */ + public function setLocale($locale = null) + { + if (!Zend_Locale::isLocale($locale, true, false)) { + if (!Zend_Locale::isLocale($locale, false, false)) { + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception("Given locale ({$locale}) does not exist", (string) $locale); + } + + $locale = new Zend_Locale($locale); + } + + $this->_locale = (string) $locale; + return $this; + } + + /** + * Returns the actual set locale + * + * @return string + */ + public function getLocale() + { + return $this->_locale; + } + + /** + * Checks if the given date is a real date or datepart. + * Returns false if a expected datepart is missing or a datepart exceeds its possible border. + * But the check will only be done for the expected dateparts which are given by format. + * If no format is given the standard dateformat for the actual locale is used. + * f.e. 30.February.2007 will return false if format is 'dd.MMMM.YYYY' + * + * @param string $date Date to parse for correctness + * @param string $format (Optional) Format for parsing the date string + * @param string|Zend_Locale $locale (Optional) Locale for parsing date parts + * @return boolean True when all date parts are correct + */ + public static function isDate($date, $format = null, $locale = null) + { + if (($format !== null) and (Zend_Locale::isLocale($format, null, false))) { + $locale = $format; + $format = null; + } + + if (empty($locale)) { + require_once 'Zend/Registry.php'; + if (Zend_Registry::isRegistered('Zend_Locale') === true) { + $locale = Zend_Registry::get('Zend_Locale'); + } + } + + if (!Zend_Locale::isLocale($locale, true, false)) { + if (!Zend_Locale::isLocale($locale, false, false)) { + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception("Given locale ({$locale}) does not exist", (string) $locale); + } + + $locale = new Zend_Locale($locale); + } + + $locale = (string) $locale; + if ($format === null) { + $format = Zend_Locale_Format::getDateFormat($locale); + } else if (self::$_options['format_type'] == 'php') { + $format = Zend_Locale_Format::convertPhpToIsoFormat($format); + } + + try { + $parsed = Zend_Locale_Format::getDate($date, array('locale' => $locale, + 'date_format' => $format, 'format_type' => 'iso', + 'fix_date' => false)); + + if (isset($parsed['year']) and ((strpos(strtoupper($format), 'YY') !== false) and + (strpos(strtoupper($format), 'YYYY') === false))) { + $parsed['year'] = self::getFullYear($parsed['year']); + } + } catch (Zend_Locale_Exception $e) { + // Date can not be parsed + return false; + } + + if (((strpos($format, 'Y') !== false) or (strpos($format, 'y') !== false)) and + (!isset($parsed['year']))) { + // Year expected but not found + return false; + } + + if ((strpos($format, 'M') !== false) and (!isset($parsed['month']))) { + // Month expected but not found + return false; + } + + if ((strpos($format, 'd') !== false) and (!isset($parsed['day']))) { + // Day expected but not found + return false; + } + + if (((strpos($format, 'H') !== false) or (strpos($format, 'h') !== false)) and + (!isset($parsed['hour']))) { + // Hour expected but not found + return false; + } + + if ((strpos($format, 'm') !== false) and (!isset($parsed['minute']))) { + // Minute expected but not found + return false; + } + + if ((strpos($format, 's') !== false) and (!isset($parsed['second']))) { + // Second expected but not found + return false; + } + + // Set not given dateparts + if (isset($parsed['hour']) === false) { + $parsed['hour'] = 0; + } + + if (isset($parsed['minute']) === false) { + $parsed['minute'] = 0; + } + + if (isset($parsed['second']) === false) { + $parsed['second'] = 0; + } + + if (isset($parsed['month']) === false) { + $parsed['month'] = 1; + } + + if (isset($parsed['day']) === false) { + $parsed['day'] = 1; + } + + if (isset($parsed['year']) === false) { + $parsed['year'] = 1970; + } + + $date = new self($parsed, null, $locale); + $timestamp = $date->mktime($parsed['hour'], $parsed['minute'], $parsed['second'], + $parsed['month'], $parsed['day'], $parsed['year']); + if ($parsed['year'] != $date->date('Y', $timestamp)) { + // Given year differs from parsed year + return false; + } + + if ($parsed['month'] != $date->date('n', $timestamp)) { + // Given month differs from parsed month + return false; + } + + if ($parsed['day'] != $date->date('j', $timestamp)) { + // Given day differs from parsed day + return false; + } + + if ($parsed['hour'] != $date->date('G', $timestamp)) { + // Given hour differs from parsed hour + return false; + } + + if ($parsed['minute'] != $date->date('i', $timestamp)) { + // Given minute differs from parsed minute + return false; + } + + if ($parsed['second'] != $date->date('s', $timestamp)) { + // Given second differs from parsed second + return false; + } + + return true; + } + +} diff --git a/libs/Zend/Date/Cities.php b/libs/Zend/Date/Cities.php new file mode 100644 index 0000000..4ea0736 --- /dev/null +++ b/libs/Zend/Date/Cities.php @@ -0,0 +1,322 @@ + array('latitude' => 5.3411111, 'longitude' => -4.0280556), + 'Abu Dhabi' => array('latitude' => 24.4666667, 'longitude' => 54.3666667), + 'Abuja' => array('latitude' => 9.1758333, 'longitude' => 7.1808333), + 'Accra' => array('latitude' => 5.55, 'longitude' => -0.2166667), + 'Adamstown' => array('latitude' => -25.0666667, 'longitude' => -130.0833333), + 'Addis Ababa' => array('latitude' => 9.0333333, 'longitude' => 38.7), + 'Adelaide' => array('latitude' => -34.9333333, 'longitude' => 138.6), + 'Algiers' => array('latitude' => 36.7630556, 'longitude' => 3.0505556), + 'Alofi' => array('latitude' => -19.0166667, 'longitude' => -169.9166667), + 'Amman' => array('latitude' => 31.95, 'longitude' => 35.9333333), + 'Amsterdam' => array('latitude' => 52.35, 'longitude' => 4.9166667), + 'Andorra la Vella' => array('latitude' => 42.5, 'longitude' => 1.5166667), + 'Ankara' => array('latitude' => 39.9272222, 'longitude' => 32.8644444), + 'Antananarivo' => array('latitude' => -18.9166667, 'longitude' => 47.5166667), + 'Apia' => array('latitude' => -13.8333333, 'longitude' => -171.7333333), + 'Ashgabat' => array('latitude' => 37.95, 'longitude' => 58.3833333), + 'Asmara' => array('latitude' => 15.3333333, 'longitude' => 38.9333333), + 'Astana' => array('latitude' => 51.1811111, 'longitude' => 71.4277778), + 'Asunción' => array('latitude' => -25.2666667, 'longitude' => -57.6666667), + 'Athens' => array('latitude' => 37.9833333, 'longitude' => 23.7333333), + 'Auckland' => array('latitude' => -36.8666667, 'longitude' => 174.7666667), + 'Avarua' => array('latitude' => -21.2, 'longitude' => -159.7666667), + 'Baghdad' => array('latitude' => 33.3386111, 'longitude' => 44.3938889), + 'Baku' => array('latitude' => 40.3952778, 'longitude' => 49.8822222), + 'Bamako' => array('latitude' => 12.65, 'longitude' => -8), + 'Bandar Seri Begawan' => array('latitude' => 4.8833333, 'longitude' => 114.9333333), + 'Bankok' => array('latitude' => 13.5833333, 'longitude' => 100.2166667), + 'Bangui' => array('latitude' => 4.3666667, 'longitude' => 18.5833333), + 'Banjul' => array('latitude' => 13.4530556, 'longitude' => -16.5775), + 'Basel' => array('latitude' => 47.5666667, 'longitude' => 7.6), + 'Basseterre' => array('latitude' => 17.3, 'longitude' => -62.7166667), + 'Beijing' => array('latitude' => 39.9288889, 'longitude' => 116.3883333), + 'Beirut' => array('latitude' => 33.8719444, 'longitude' => 35.5097222), + 'Belgrade' => array('latitude' => 44.8186111, 'longitude' => 20.4680556), + 'Belmopan' => array('latitude' => 17.25, 'longitude' => -88.7666667), + 'Berlin' => array('latitude' => 52.5166667, 'longitude' => 13.4), + 'Bern' => array('latitude' => 46.9166667, 'longitude' => 7.4666667), + 'Bishkek' => array('latitude' => 42.8730556, 'longitude' => 74.6002778), + 'Bissau' => array('latitude' => 11.85, 'longitude' => -15.5833333), + 'Bloemfontein' => array('latitude' => -29.1333333, 'longitude' => 26.2), + 'Bogotá' => array('latitude' => 4.6, 'longitude' => -74.0833333), + 'Brasilia' => array('latitude' => -15.7833333, 'longitude' => -47.9166667), + 'Bratislava' => array('latitude' => 48.15, 'longitude' => 17.1166667), + 'Brazzaville' => array('latitude' => -4.2591667, 'longitude' => 15.2847222), + 'Bridgetown' => array('latitude' => 13.1, 'longitude' => -59.6166667), + 'Brisbane' => array('latitude' => -27.5, 'longitude' => 153.0166667), + 'Brussels' => array('latitude' => 50.8333333, 'longitude' => 4.3333333), + 'Bucharest' => array('latitude' => 44.4333333, 'longitude' => 26.1), + 'Budapest' => array('latitude' => 47.5, 'longitude' => 19.0833333), + 'Buenos Aires' => array('latitude' => -34.5875, 'longitude' => -58.6725), + 'Bujumbura' => array('latitude' => -3.3761111, 'longitude' => 29.36), + 'Cairo' => array('latitude' => 30.05, 'longitude' => 31.25), + 'Calgary' => array('latitude' => 51.0833333, 'longitude' => -114.0833333), + 'Canberra' => array('latitude' => -35.2833333, 'longitude' => 149.2166667), + 'Cape Town' => array('latitude' => -33.9166667, 'longitude' => 18.4166667), + 'Caracas' => array('latitude' => 10.5, 'longitude' => -66.9166667), + 'Castries' => array('latitude' => 14, 'longitude' => -61), + 'Charlotte Amalie' => array('latitude' => 18.34389, 'longitude' => -64.93111), + 'Chicago' => array('latitude' => 41.85, 'longitude' => -87.65), + 'Chisinau' => array('latitude' => 47.055556, 'longitude' => 28.8575), + 'Cockburn Town' => array('latitude' => 21.4666667, 'longitude' => -71.1333333), + 'Colombo' => array('latitude' => 6.9319444, 'longitude' => 79.8477778), + 'Conakry' => array('latitude' => 9.5091667, 'longitude' => -13.7122222), + 'Copenhagen' => array('latitude' => 55.6666667, 'longitude' => 12.5833333), + 'Cotonou' => array('latitude' => 6.35, 'longitude' => 2.4333333), + 'Dakar' => array('latitude' => 14.6708333, 'longitude' => -17.4380556), + 'Damascus' => array('latitude' => 33.5, 'longitude' => 36.3), + 'Dar es Salaam' => array('latitude' => -6.8, 'longitude' => 39.2833333), + 'Dhaka' => array('latitude' => 23.7230556, 'longitude' => 90.4086111), + 'Dili' => array('latitude' => -8.5586111, 'longitude' => 125.5736111), + 'Djibouti' => array('latitude' => 11.595, 'longitude' => 43.1480556), + 'Dodoma' => array('latitude' => -6.1833333, 'longitude' => 35.75), + 'Doha' => array('latitude' => 25.2866667, 'longitude' => 51.5333333), + 'Dubai' => array('latitude' => 25.2522222, 'longitude' => 55.28), + 'Dublin' => array('latitude' => 53.3330556, 'longitude' => -6.2488889), + 'Dushanbe' => array('latitude' => 38.56, 'longitude' => 68.7738889 ), + 'Fagatogo' => array('latitude' => -14.2825, 'longitude' => -170.69), + 'Fongafale' => array('latitude' => -8.5166667, 'longitude' => 179.2166667), + 'Freetown' => array('latitude' => 8.49, 'longitude' => -13.2341667), + 'Gaborone' => array('latitude' => -24.6463889, 'longitude' => 25.9119444), + 'Geneva' => array('latitude' => 46.2, 'longitude' => 6.1666667), + 'George Town' => array('latitude' => 19.3, 'longitude' => -81.3833333), + 'Georgetown' => array('latitude' => 6.8, 'longitude' => -58.1666667), + 'Gibraltar' => array('latitude' => 36.1333333, 'longitude' => -5.35), + 'Glasgow' => array('latitude' => 55.8333333, 'longitude' => -4.25), + 'Guatemala la Nueva' => array('latitude' => 14.6211111, 'longitude' => -90.5269444), + 'Hagatna' => array('latitude' => 13.47417, 'longitude' => 144.74778), + 'The Hague' => array('latitude' => 52.0833333, 'longitude' => 4.3), + 'Hamilton' => array('latitude' => 32.2941667, 'longitude' => -64.7838889), + 'Hanoi' => array('latitude' => 21.0333333, 'longitude' => 105.85), + 'Harare' => array('latitude' => -17.8177778, 'longitude' => 31.0447222), + 'Havana' => array('latitude' => 23.1319444, 'longitude' => -82.3641667), + 'Helsinki' => array('latitude' => 60.1755556, 'longitude' => 24.9341667), + 'Honiara' => array('latitude' => -9.4333333, 'longitude' => 159.95), + 'Islamabad' => array('latitude' => 30.8486111, 'longitude' => 72.4944444), + 'Istanbul' => array('latitude' => 41.0186111, 'longitude' => 28.9647222), + 'Jakarta' => array('latitude' => -6.1744444, 'longitude' => 106.8294444), + 'Jamestown' => array('latitude' => -15.9333333, 'longitude' => -5.7166667), + 'Jerusalem' => array('latitude' => 31.7666667, 'longitude' => 35.2333333), + 'Johannesburg' => array('latitude' => -26.2, 'longitude' => 28.0833333), + 'Kabul' => array('latitude' => 34.5166667, 'longitude' => 69.1833333), + 'Kampala' => array('latitude' => 0.3155556, 'longitude' => 32.5655556), + 'Kathmandu' => array('latitude' => 27.7166667, 'longitude' => 85.3166667), + 'Khartoum' => array('latitude' => 15.5880556, 'longitude' => 32.5341667), + 'Kigali' => array('latitude' => -1.9536111, 'longitude' => 30.0605556), + 'Kingston' => array('latitude' => -29.05, 'longitude' => 167.95), + 'Kingstown' => array('latitude' => 13.1333333, 'longitude' => -61.2166667), + 'Kinshasa' => array('latitude' => -4.3, 'longitude' => 15.3), + 'Kolkata' => array('latitude' => 22.5697222, 'longitude' => 88.3697222), + 'Kuala Lumpur' => array('latitude' => 3.1666667, 'longitude' => 101.7), + 'Kuwait City' => array('latitude' => 29.3697222, 'longitude' => 47.9783333), + 'Kiev' => array('latitude' => 50.4333333, 'longitude' => 30.5166667), + 'La Paz' => array('latitude' => -16.5, 'longitude' => -68.15), + 'Libreville' => array('latitude' => 0.3833333, 'longitude' => 9.45), + 'Lilongwe' => array('latitude' => -13.9833333, 'longitude' => 33.7833333), + 'Lima' => array('latitude' => -12.05, 'longitude' => -77.05), + 'Lisbon' => array('latitude' => 38.7166667, 'longitude' => -9.1333333), + 'Ljubljana' => array('latitude' => 46.0552778, 'longitude' => 14.5144444), + 'Lobamba' => array('latitude' => -26.4666667, 'longitude' => 31.2), + 'Lomé' => array('latitude' => 9.7166667, 'longitude' => 38.3), + 'London' => array('latitude' => 51.5, 'longitude' => -0.1166667), + 'Los Angeles' => array('latitude' => 34.05222, 'longitude' => -118.24278), + 'Luanda' => array('latitude' => -8.8383333, 'longitude' => 13.2344444), + 'Lusaka' => array('latitude' => -15.4166667, 'longitude' => 28.2833333), + 'Luxembourg' => array('latitude' => 49.6116667, 'longitude' => 6.13), + 'Madrid' => array('latitude' => 40.4, 'longitude' => -3.6833333), + 'Majuro' => array('latitude' => 7.1, 'longitude' => 171.3833333), + 'Malabo' => array('latitude' => 3.75, 'longitude' => 8.7833333), + 'Managua' => array('latitude' => 12.1508333, 'longitude' => -86.2683333), + 'Manama' => array('latitude' => 26.2361111, 'longitude' => 50.5830556), + 'Manila' => array('latitude' => 14.6041667, 'longitude' => 120.9822222), + 'Maputo' => array('latitude' => -25.9652778, 'longitude' => 32.5891667), + 'Maseru' => array('latitude' => -29.3166667, 'longitude' => 27.4833333), + 'Mbabane' => array('latitude' => -26.3166667, 'longitude' => 31.1333333), + 'Melbourne' => array('latitude' => -37.8166667, 'longitude' => 144.9666667), + 'Melekeok' => array('latitude' => 7.4933333, 'longitude' => 134.6341667), + 'Mexiko City' => array('latitude' => 19.4341667, 'longitude' => -99.1386111), + 'Minsk' => array('latitude' => 53.9, 'longitude' => 27.5666667), + 'Mogadishu' => array('latitude' => 2.0666667, 'longitude' => 45.3666667), + 'Monaco' => array('latitude' => 43.7333333, 'longitude' => 7.4166667), + 'Monrovia' => array('latitude' => 6.3105556, 'longitude' => -10.8047222), + 'Montevideo' => array('latitude' => -34.8580556, 'longitude' => -56.1708333), + 'Montreal' => array('latitude' => 45.5, 'longitude' => -73.5833333), + 'Moroni' => array('latitude' => -11.7041667, 'longitude' => 43.2402778), + 'Moscow' => array('latitude' => 55.7522222, 'longitude' => 37.6155556), + 'Muscat' => array('latitude' => 23.6133333, 'longitude' => 58.5933333), + 'Nairobi' => array('latitude' => -1.3166667, 'longitude' => 36.8333333), + 'Nassau' => array('latitude' => 25.0833333, 'longitude' => -77.35), + 'N´Djamena' => array('latitude' => 12.1130556, 'longitude' => 15.0491667), + 'New Dehli' => array('latitude' => 28.6, 'longitude' => 77.2), + 'New York' => array('latitude' => 40.71417, 'longitude' => -74.00639), + 'Newcastle' => array('latitude' => -32.9166667, 'longitude' => 151.75), + 'Niamey' => array('latitude' => 13.6666667, 'longitude' => 1.7833333), + 'Nicosia' => array('latitude' => 35.1666667, 'longitude' => 33.3666667), + 'Nouakchott' => array('latitude' => 18.0863889, 'longitude' => -15.9752778), + 'Noumea' => array('latitude' => -22.2666667, 'longitude' => 166.45), + 'Nuku´alofa' => array('latitude' => -21.1333333, 'longitude' => -175.2), + 'Nuuk' => array('latitude' => 64.1833333, 'longitude' => -51.75), + 'Oranjestad' => array('latitude' => 12.5166667, 'longitude' => -70.0333333), + 'Oslo' => array('latitude' => 59.9166667, 'longitude' => 10.75), + 'Ouagadougou' => array('latitude' => 12.3702778, 'longitude' => -1.5247222), + 'Palikir' => array('latitude' => 6.9166667, 'longitude' => 158.15), + 'Panama City' => array('latitude' => 8.9666667, 'longitude' => -79.5333333), + 'Papeete' => array('latitude' => -17.5333333, 'longitude' => -149.5666667), + 'Paramaribo' => array('latitude' => 5.8333333, 'longitude' => -55.1666667), + 'Paris' => array('latitude' => 48.8666667, 'longitude' => 2.3333333), + 'Perth' => array('latitude' => -31.9333333, 'longitude' => 115.8333333), + 'Phnom Penh' => array('latitude' => 11.55, 'longitude' => 104.9166667), + 'Podgorica' => array('latitude' => 43.7752778, 'longitude' => 19.6827778), + 'Port Louis' => array('latitude' => -20.1666667, 'longitude' => 57.5), + 'Port Moresby' => array('latitude' => -9.4647222, 'longitude' => 147.1925), + 'Port-au-Prince' => array('latitude' => 18.5391667, 'longitude' => -72.335), + 'Port of Spain' => array('latitude' => 10.6666667, 'longitude' => -61.5), + 'Porto-Novo' => array('latitude' => 6.4833333, 'longitude' => 2.6166667), + 'Prague' => array('latitude' => 50.0833333, 'longitude' => 14.4666667), + 'Praia' => array('latitude' => 14.9166667, 'longitude' => -23.5166667), + 'Pretoria' => array('latitude' => -25.7069444, 'longitude' => 28.2294444), + 'Pyongyang' => array('latitude' => 39.0194444, 'longitude' => 125.7547222), + 'Quito' => array('latitude' => -0.2166667, 'longitude' => -78.5), + 'Rabat' => array('latitude' => 34.0252778, 'longitude' => -6.8361111), + 'Reykjavik' => array('latitude' => 64.15, 'longitude' => -21.95), + 'Riga' => array('latitude' => 56.95, 'longitude' => 24.1), + 'Rio de Janero' => array('latitude' => -22.9, 'longitude' => -43.2333333), + 'Road Town' => array('latitude' => 18.4166667, 'longitude' => -64.6166667), + 'Rome' => array('latitude' => 41.9, 'longitude' => 12.4833333), + 'Roseau' => array('latitude' => 15.3, 'longitude' => -61.4), + 'Rotterdam' => array('latitude' => 51.9166667, 'longitude' => 4.5), + 'Salvador' => array('latitude' => -12.9833333, 'longitude' => -38.5166667), + 'San José' => array('latitude' => 9.9333333, 'longitude' => -84.0833333), + 'San Juan' => array('latitude' => 18.46833, 'longitude' => -66.10611), + 'San Marino' => array('latitude' => 43.5333333, 'longitude' => 12.9666667), + 'San Salvador' => array('latitude' => 13.7086111, 'longitude' => -89.2030556), + 'Sanaá' => array('latitude' => 15.3547222, 'longitude' => 44.2066667), + 'Santa Cruz' => array('latitude' => -17.8, 'longitude' => -63.1666667), + 'Santiago' => array('latitude' => -33.45, 'longitude' => -70.6666667), + 'Santo Domingo' => array('latitude' => 18.4666667, 'longitude' => -69.9), + 'Sao Paulo' => array('latitude' => -23.5333333, 'longitude' => -46.6166667), + 'Sarajevo' => array('latitude' => 43.85, 'longitude' => 18.3833333), + 'Seoul' => array('latitude' => 37.5663889, 'longitude' => 126.9997222), + 'Shanghai' => array('latitude' => 31.2222222, 'longitude' => 121.4580556), + 'Sydney' => array('latitude' => -33.8833333, 'longitude' => 151.2166667), + 'Singapore' => array('latitude' => 1.2930556, 'longitude' => 103.8558333), + 'Skopje' => array('latitude' => 42, 'longitude' => 21.4333333), + 'Sofia' => array('latitude' => 42.6833333, 'longitude' => 23.3166667), + 'St. George´s' => array('latitude' => 12.05, 'longitude' => -61.75), + 'St. John´s' => array('latitude' => 17.1166667, 'longitude' => -61.85), + 'Stanley' => array('latitude' => -51.7, 'longitude' => -57.85), + 'Stockholm' => array('latitude' => 59.3333333, 'longitude' => 18.05), + 'Suva' => array('latitude' => -18.1333333, 'longitude' => 178.4166667), + 'Taipei' => array('latitude' => 25.0166667, 'longitude' => 121.45), + 'Tallinn' => array('latitude' => 59.4338889, 'longitude' => 24.7280556), + 'Tashkent' => array('latitude' => 41.3166667, 'longitude' => 69.25), + 'Tbilisi' => array('latitude' => 41.725, 'longitude' => 44.7908333), + 'Tegucigalpa' => array('latitude' => 14.1, 'longitude' => -87.2166667), + 'Tehran' => array('latitude' => 35.6719444, 'longitude' => 51.4244444), + 'The Hague' => array('latitude' => 52.0833333, 'longitude' => 4.3), + 'Thimphu' => array('latitude' => 27.4833333, 'longitude' => 89.6), + 'Tirana' => array('latitude' => 41.3275, 'longitude' => 19.8188889), + 'Tiraspol' => array('latitude' => 46.8402778, 'longitude' => 29.6433333), + 'Tokyo' => array('latitude' => 35.685, 'longitude' => 139.7513889), + 'Toronto' => array('latitude' => 43.6666667, 'longitude' => -79.4166667), + 'Tórshavn' => array('latitude' => 62.0166667, 'longitude' => -6.7666667), + 'Tripoli' => array('latitude' => 32.8925, 'longitude' => 13.18), + 'Tunis' => array('latitude' => 36.8027778, 'longitude' => 10.1797222), + 'Ulaanbaatar' => array('latitude' => 47.9166667, 'longitude' => 106.9166667), + 'Vaduz' => array('latitude' => 47.1333333, 'longitude' => 9.5166667), + 'Valletta' => array('latitude' => 35.8997222, 'longitude' => 14.5147222), + 'Valparaiso' => array('latitude' => -33.0477778, 'longitude' => -71.6011111), + 'Vancouver' => array('latitude' => 49.25, 'longitude' => -123.1333333), + 'Vatican City' => array('latitude' => 41.9, 'longitude' => 12.4833333), + 'Victoria' => array('latitude' => -4.6166667, 'longitude' => 55.45), + 'Vienna' => array('latitude' => 48.2, 'longitude' => 16.3666667), + 'Vientaine' => array('latitude' => 17.9666667, 'longitude' => 102.6), + 'Vilnius' => array('latitude' => 54.6833333, 'longitude' => 25.3166667), + 'Warsaw' => array('latitude' => 52.25, 'longitude' => 21), + 'Washington dc' => array('latitude' => 38.895, 'longitude' => -77.03667), + 'Wellington' => array('latitude' => -41.3, 'longitude' => 174.7833333), + 'Willemstad' => array('latitude' => 12.1, 'longitude' => -68.9166667), + 'Windhoek' => array('latitude' => -22.57, 'longitude' => 17.0836111), + 'Yamoussoukro' => array('latitude' => 6.8166667, 'longitude' => -5.2833333), + 'Yaoundé' => array('latitude' => 3.8666667, 'longitude' => 11.5166667), + 'Yerevan' => array('latitude' => 40.1811111, 'longitude' => 44.5136111), + 'Zürich' => array('latitude' => 47.3666667, 'longitude' => 8.55), + 'Zagreb' => array('latitude' => 45.8, 'longitude' => 16) + ); + + /** + * Returns the location from the selected city + * + * @param string $city City to get location for + * @param string $horizon Horizon to use : + * default: effective + * others are civil, nautic, astronomic + * @return array + * @throws Zend_Date_Exception When city is unknown + */ + public static function City($city, $horizon = false) + { + foreach (self::$cities as $key => $value) { + if (strtolower($key) === strtolower($city)) { + $return = $value; + $return['horizon'] = $horizon; + return $return; + } + } + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception('unknown city'); + } + + /** + * Return a list with all known cities + * + * @return array + */ + public static function getCityList() + { + return array_keys(self::$cities); + } +} diff --git a/libs/Zend/Date/DateObject.php b/libs/Zend/Date/DateObject.php new file mode 100644 index 0000000..3528bc2 --- /dev/null +++ b/libs/Zend/Date/DateObject.php @@ -0,0 +1,1044 @@ + 0, 1960 => -315619200, 1950 => -631152000, + 1940 => -946771200, 1930 => -1262304000, 1920 => -1577923200, + 1910 => -1893456000, 1900 => -2208988800, 1890 => -2524521600, + 1880 => -2840140800, 1870 => -3155673600, 1860 => -3471292800, + 1850 => -3786825600, 1840 => -4102444800, 1830 => -4417977600, + 1820 => -4733596800, 1810 => -5049129600, 1800 => -5364662400, + 1790 => -5680195200, 1780 => -5995814400, 1770 => -6311347200, + 1760 => -6626966400, 1750 => -6942499200, 1740 => -7258118400, + 1730 => -7573651200, 1720 => -7889270400, 1710 => -8204803200, + 1700 => -8520336000, 1690 => -8835868800, 1680 => -9151488000, + 1670 => -9467020800, 1660 => -9782640000, 1650 => -10098172800, + 1640 => -10413792000, 1630 => -10729324800, 1620 => -11044944000, + 1610 => -11360476800, 1600 => -11676096000); + + /** + * Set this object to have a new UNIX timestamp. + * + * @param string|integer $timestamp OPTIONAL timestamp; defaults to local time using time() + * @return string|integer old timestamp + * @throws Zend_Date_Exception + */ + protected function setUnixTimestamp($timestamp = null) + { + $old = $this->_unixTimestamp; + + if (is_numeric($timestamp)) { + $this->_unixTimestamp = $timestamp; + } else if ($timestamp === null) { + $this->_unixTimestamp = time(); + } else { + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception('\'' . $timestamp . '\' is not a valid UNIX timestamp', $timestamp); + } + + return $old; + } + + /** + * Returns this object's UNIX timestamp + * A timestamp greater then the integer range will be returned as string + * This function does not return the timestamp as object. Use copy() instead. + * + * @return integer|string timestamp + */ + protected function getUnixTimestamp() + { + if ($this->_unixTimestamp === intval($this->_unixTimestamp)) { + return (int) $this->_unixTimestamp; + } else { + return (string) $this->_unixTimestamp; + } + } + + /** + * Internal function. + * Returns time(). This method exists to allow unit tests to work-around methods that might otherwise + * be hard-coded to use time(). For example, this makes it possible to test isYesterday() in Date.php. + * + * @param integer $sync OPTIONAL time syncronisation value + * @return integer timestamp + */ + protected function _getTime($sync = null) + { + if ($sync !== null) { + $this->_syncronised = round($sync); + } + return (time() + $this->_syncronised); + } + + /** + * Internal mktime function used by Zend_Date. + * The timestamp returned by mktime() can exceed the precision of traditional UNIX timestamps, + * by allowing PHP to auto-convert to using a float value. + * + * Returns a timestamp relative to 1970/01/01 00:00:00 GMT/UTC. + * DST (Summer/Winter) is depriciated since php 5.1.0. + * Year has to be 4 digits otherwise it would be recognised as + * year 70 AD instead of 1970 AD as expected !! + * + * @param integer $hour + * @param integer $minute + * @param integer $second + * @param integer $month + * @param integer $day + * @param integer $year + * @param boolean $gmt OPTIONAL true = other arguments are for UTC time, false = arguments are for local time/date + * @return integer|float timestamp (number of seconds elapsed relative to 1970/01/01 00:00:00 GMT/UTC) + */ + protected function mktime($hour, $minute, $second, $month, $day, $year, $gmt = false) + { + + // complete date but in 32bit timestamp - use PHP internal + if ((1901 < $year) and ($year < 2038)) { + + $oldzone = @date_default_timezone_get(); + // Timezone also includes DST settings, therefor substracting the GMT offset is not enough + // We have to set the correct timezone to get the right value + if (($this->_timezone != $oldzone) and ($gmt === false)) { + date_default_timezone_set($this->_timezone); + } + $result = ($gmt) ? @gmmktime($hour, $minute, $second, $month, $day, $year) + : @mktime($hour, $minute, $second, $month, $day, $year); + date_default_timezone_set($oldzone); + + return $result; + } + + if ($gmt !== true) { + $second += $this->_offset; + } + + if (isset(self::$_cache)) { + $id = strtr('Zend_DateObject_mkTime_' . $this->_offset . '_' . $year.$month.$day.'_'.$hour.$minute.$second . '_'.(int)$gmt, '-','_'); + if ($result = self::$_cache->load($id)) { + return unserialize($result); + } + } + + // date to integer + $day = intval($day); + $month = intval($month); + $year = intval($year); + + // correct months > 12 and months < 1 + if ($month > 12) { + $overlap = floor($month / 12); + $year += $overlap; + $month -= $overlap * 12; + } else { + $overlap = ceil((1 - $month) / 12); + $year -= $overlap; + $month += $overlap * 12; + } + + $date = 0; + if ($year >= 1970) { + + // Date is after UNIX epoch + // go through leapyears + // add months from latest given year + for ($count = 1970; $count <= $year; $count++) { + + $leapyear = self::isYearLeapYear($count); + if ($count < $year) { + + $date += 365; + if ($leapyear === true) { + $date++; + } + + } else { + + for ($mcount = 0; $mcount < ($month - 1); $mcount++) { + $date += self::$_monthTable[$mcount]; + if (($leapyear === true) and ($mcount == 1)) { + $date++; + } + + } + } + } + + $date += $day - 1; + $date = (($date * 86400) + ($hour * 3600) + ($minute * 60) + $second); + } else { + + // Date is before UNIX epoch + // go through leapyears + // add months from latest given year + for ($count = 1969; $count >= $year; $count--) { + + $leapyear = self::isYearLeapYear($count); + if ($count > $year) + { + $date += 365; + if ($leapyear === true) + $date++; + } else { + + for ($mcount = 11; $mcount > ($month - 1); $mcount--) { + $date += self::$_monthTable[$mcount]; + if (($leapyear === true) and ($mcount == 1)) { + $date++; + } + + } + } + } + + $date += (self::$_monthTable[$month - 1] - $day); + $date = -(($date * 86400) + (86400 - (($hour * 3600) + ($minute * 60) + $second))); + + // gregorian correction for 5.Oct.1582 + if ($date < -12220185600) { + $date += 864000; + } else if ($date < -12219321600) { + $date = -12219321600; + } + } + + if (isset(self::$_cache)) { + self::$_cache->save( serialize($date), $id); + } + + return $date; + } + + /** + * Returns true, if given $year is a leap year. + * + * @param integer $year + * @return boolean true, if year is leap year + */ + protected static function isYearLeapYear($year) + { + // all leapyears can be divided through 4 + if (($year % 4) != 0) { + return false; + } + + // all leapyears can be divided through 400 + if ($year % 400 == 0) { + return true; + } else if (($year > 1582) and ($year % 100 == 0)) { + return false; + } + + return true; + } + + /** + * Internal mktime function used by Zend_Date for handling 64bit timestamps. + * + * Returns a formatted date for a given timestamp. + * + * @param string $format format for output + * @param mixed $timestamp + * @param boolean $gmt OPTIONAL true = other arguments are for UTC time, false = arguments are for local time/date + * @return string + */ + protected function date($format, $timestamp = null, $gmt = false) + { + $oldzone = @date_default_timezone_get(); + if ($this->_timezone != $oldzone) { + date_default_timezone_set($this->_timezone); + } + if ($timestamp === null) { + $result = ($gmt) ? @gmdate($format) : @date($format); + date_default_timezone_set($oldzone); + return $result; + } + + if (abs($timestamp) <= 0x7FFFFFFF) { + $result = ($gmt) ? @gmdate($format, $timestamp) : @date($format, $timestamp); + date_default_timezone_set($oldzone); + return $result; + } + + $jump = false; + if (isset(self::$_cache)) { + $idstamp = strtr('Zend_DateObject_date_' . $this->_offset . '_'. $timestamp . '_'.(int)$gmt, '-','_'); + if ($result2 = self::$_cache->load($idstamp)) { + $timestamp = unserialize($result2); + $jump = true; + } + } + + // check on false or null alone failes + if (empty($gmt) and empty($jump)) { + $tempstamp = $timestamp; + if ($tempstamp > 0) { + while (abs($tempstamp) > 0x7FFFFFFF) { + $tempstamp -= (86400 * 23376); + } + $dst = date("I", $tempstamp); + if ($dst === 1) { + $timestamp += 3600; + } + $temp = date('Z', $tempstamp); + $timestamp += $temp; + } + + if (isset(self::$_cache)) { + self::$_cache->save( serialize($timestamp), $idstamp); + } + } + + + if (($timestamp < 0) and ($gmt !== true)) { + $timestamp -= $this->_offset; + } + date_default_timezone_set($oldzone); + + $date = $this->getDateParts($timestamp, true); + $length = strlen($format); + $output = ''; + + for ($i = 0; $i < $length; $i++) { + + switch($format[$i]) { + + // day formats + case 'd': // day of month, 2 digits, with leading zero, 01 - 31 + $output .= (($date['mday'] < 10) ? '0' . $date['mday'] : $date['mday']); + break; + + case 'D': // day of week, 3 letters, Mon - Sun + $output .= date('D', 86400 * (3 + self::dayOfWeek($date['year'], $date['mon'], $date['mday']))); + break; + + case 'j': // day of month, without leading zero, 1 - 31 + $output .= $date['mday']; + break; + + case 'l': // day of week, full string name, Sunday - Saturday + $output .= date('l', 86400 * (3 + self::dayOfWeek($date['year'], $date['mon'], $date['mday']))); + break; + + case 'N': // ISO 8601 numeric day of week, 1 - 7 + $day = self::dayOfWeek($date['year'], $date['mon'], $date['mday']); + if ($day == 0) { + $day = 7; + } + $output .= $day; + break; + + case 'S': // english suffix for day of month, st nd rd th + if (($date['mday'] % 10) == 1) { + $output .= 'st'; + } else if ((($date['mday'] % 10) == 2) and ($date['mday'] != 12)) { + $output .= 'nd'; + } else if (($date['mday'] % 10) == 3) { + $output .= 'rd'; + } else { + $output .= 'th'; + } + break; + + case 'w': // numeric day of week, 0 - 6 + $output .= self::dayOfWeek($date['year'], $date['mon'], $date['mday']); + break; + + case 'z': // day of year, 0 - 365 + $output .= $date['yday']; + break; + + + // week formats + case 'W': // ISO 8601, week number of year + $output .= $this->weekNumber($date['year'], $date['mon'], $date['mday']); + break; + + + // month formats + case 'F': // string month name, january - december + $output .= date('F', mktime(0, 0, 0, $date['mon'], 2, 1971)); + break; + + case 'm': // number of month, with leading zeros, 01 - 12 + $output .= (($date['mon'] < 10) ? '0' . $date['mon'] : $date['mon']); + break; + + case 'M': // 3 letter month name, Jan - Dec + $output .= date('M',mktime(0, 0, 0, $date['mon'], 2, 1971)); + break; + + case 'n': // number of month, without leading zeros, 1 - 12 + $output .= $date['mon']; + break; + + case 't': // number of day in month + $output .= self::$_monthTable[$date['mon'] - 1]; + break; + + + // year formats + case 'L': // is leap year ? + $output .= (self::isYearLeapYear($date['year'])) ? '1' : '0'; + break; + + case 'o': // ISO 8601 year number + $week = $this->weekNumber($date['year'], $date['mon'], $date['mday']); + if (($week > 50) and ($date['mon'] == 1)) { + $output .= ($date['year'] - 1); + } else { + $output .= $date['year']; + } + break; + + case 'Y': // year number, 4 digits + $output .= $date['year']; + break; + + case 'y': // year number, 2 digits + $output .= substr($date['year'], strlen($date['year']) - 2, 2); + break; + + + // time formats + case 'a': // lower case am/pm + $output .= (($date['hours'] >= 12) ? 'pm' : 'am'); + break; + + case 'A': // upper case am/pm + $output .= (($date['hours'] >= 12) ? 'PM' : 'AM'); + break; + + case 'B': // swatch internet time + $dayseconds = ($date['hours'] * 3600) + ($date['minutes'] * 60) + $date['seconds']; + if ($gmt === true) { + $dayseconds += 3600; + } + $output .= (int) (($dayseconds % 86400) / 86.4); + break; + + case 'g': // hours without leading zeros, 12h format + if ($date['hours'] > 12) { + $hour = $date['hours'] - 12; + } else { + if ($date['hours'] == 0) { + $hour = '12'; + } else { + $hour = $date['hours']; + } + } + $output .= $hour; + break; + + case 'G': // hours without leading zeros, 24h format + $output .= $date['hours']; + break; + + case 'h': // hours with leading zeros, 12h format + if ($date['hours'] > 12) { + $hour = $date['hours'] - 12; + } else { + if ($date['hours'] == 0) { + $hour = '12'; + } else { + $hour = $date['hours']; + } + } + $output .= (($hour < 10) ? '0'.$hour : $hour); + break; + + case 'H': // hours with leading zeros, 24h format + $output .= (($date['hours'] < 10) ? '0' . $date['hours'] : $date['hours']); + break; + + case 'i': // minutes with leading zeros + $output .= (($date['minutes'] < 10) ? '0' . $date['minutes'] : $date['minutes']); + break; + + case 's': // seconds with leading zeros + $output .= (($date['seconds'] < 10) ? '0' . $date['seconds'] : $date['seconds']); + break; + + + // timezone formats + case 'e': // timezone identifier + if ($gmt === true) { + $output .= gmdate('e', mktime($date['hours'], $date['minutes'], $date['seconds'], + $date['mon'], $date['mday'], 2000)); + } else { + $output .= date('e', mktime($date['hours'], $date['minutes'], $date['seconds'], + $date['mon'], $date['mday'], 2000)); + } + break; + + case 'I': // daylight saving time or not + if ($gmt === true) { + $output .= gmdate('I', mktime($date['hours'], $date['minutes'], $date['seconds'], + $date['mon'], $date['mday'], 2000)); + } else { + $output .= date('I', mktime($date['hours'], $date['minutes'], $date['seconds'], + $date['mon'], $date['mday'], 2000)); + } + break; + + case 'O': // difference to GMT in hours + $gmtstr = ($gmt === true) ? 0 : $this->_offset; + $output .= sprintf('%s%04d', ($gmtstr <= 0) ? '+' : '-', abs($gmtstr) / 36); + break; + + case 'P': // difference to GMT with colon + $gmtstr = ($gmt === true) ? 0 : $this->_offset; + $gmtstr = sprintf('%s%04d', ($gmtstr <= 0) ? '+' : '-', abs($gmtstr) / 36); + $output = $output . substr($gmtstr, 0, 3) . ':' . substr($gmtstr, 3); + break; + + case 'T': // timezone settings + if ($gmt === true) { + $output .= gmdate('T', mktime($date['hours'], $date['minutes'], $date['seconds'], + $date['mon'], $date['mday'], 2000)); + } else { + $output .= date('T', mktime($date['hours'], $date['minutes'], $date['seconds'], + $date['mon'], $date['mday'], 2000)); + } + break; + + case 'Z': // timezone offset in seconds + $output .= ($gmt === true) ? 0 : -$this->_offset; + break; + + + // complete time formats + case 'c': // ISO 8601 date format + $difference = $this->_offset; + $difference = sprintf('%s%04d', ($difference <= 0) ? '+' : '-', abs($difference) / 36); + $output .= $date['year'] . '-' + . (($date['mon'] < 10) ? '0' . $date['mon'] : $date['mon']) . '-' + . (($date['mday'] < 10) ? '0' . $date['mday'] : $date['mday']) . 'T' + . (($date['hours'] < 10) ? '0' . $date['hours'] : $date['hours']) . ':' + . (($date['minutes'] < 10) ? '0' . $date['minutes'] : $date['minutes']) . ':' + . (($date['seconds'] < 10) ? '0' . $date['seconds'] : $date['seconds']) + . $difference; + break; + + case 'r': // RFC 2822 date format + $difference = $this->_offset; + $difference = sprintf('%s%04d', ($difference <= 0) ? '+' : '-', abs($difference) / 36); + $output .= gmdate('D', 86400 * (3 + self::dayOfWeek($date['year'], $date['mon'], $date['mday']))) . ', ' + . (($date['mday'] < 10) ? '0' . $date['mday'] : $date['mday']) . ' ' + . date('M', mktime(0, 0, 0, $date['mon'], 2, 1971)) . ' ' + . $date['year'] . ' ' + . (($date['hours'] < 10) ? '0' . $date['hours'] : $date['hours']) . ':' + . (($date['minutes'] < 10) ? '0' . $date['minutes'] : $date['minutes']) . ':' + . (($date['seconds'] < 10) ? '0' . $date['seconds'] : $date['seconds']) . ' ' + . $difference; + break; + + case 'U': // Unix timestamp + $output .= $timestamp; + break; + + + // special formats + case "\\": // next letter to print with no format + $i++; + if ($i < $length) { + $output .= $format[$i]; + } + break; + + default: // letter is no format so add it direct + $output .= $format[$i]; + break; + } + } + + return (string) $output; + } + + /** + * Returns the day of week for a Gregorian calendar date. + * 0 = sunday, 6 = saturday + * + * @param integer $year + * @param integer $month + * @param integer $day + * @return integer dayOfWeek + */ + protected static function dayOfWeek($year, $month, $day) + { + if ((1901 < $year) and ($year < 2038)) { + return (int) date('w', mktime(0, 0, 0, $month, $day, $year)); + } + + // gregorian correction + $correction = 0; + if (($year < 1582) or (($year == 1582) and (($month < 10) or (($month == 10) && ($day < 15))))) { + $correction = 3; + } + + if ($month > 2) { + $month -= 2; + } else { + $month += 10; + $year--; + } + + $day = floor((13 * $month - 1) / 5) + $day + ($year % 100) + floor(($year % 100) / 4); + $day += floor(($year / 100) / 4) - 2 * floor($year / 100) + 77 + $correction; + + return (int) ($day - 7 * floor($day / 7)); + } + + /** + * Internal getDateParts function for handling 64bit timestamps, similar to: + * http://www.php.net/getdate + * + * Returns an array of date parts for $timestamp, relative to 1970/01/01 00:00:00 GMT/UTC. + * + * $fast specifies ALL date parts should be returned (slower) + * Default is false, and excludes $dayofweek, weekday, month and timestamp from parts returned. + * + * @param mixed $timestamp + * @param boolean $fast OPTIONAL defaults to fast (false), resulting in fewer date parts + * @return array + */ + protected function getDateParts($timestamp = null, $fast = null) + { + + // actual timestamp + if ($timestamp === null) { + return getdate(); + } + + // 32bit timestamp + if (abs($timestamp) <= 0x7FFFFFFF) { + return @getdate($timestamp); + } + + if (isset(self::$_cache)) { + $id = strtr('Zend_DateObject_getDateParts_' . $timestamp.'_'.(int)$fast, '-','_'); + if ($result = self::$_cache->load($id)) { + return unserialize($result); + } + } + + $otimestamp = $timestamp; + $numday = 0; + $month = 0; + // gregorian correction + if ($timestamp < -12219321600) { + $timestamp -= 864000; + } + + // timestamp lower 0 + if ($timestamp < 0) { + $sec = 0; + $act = 1970; + + // iterate through 10 years table, increasing speed + foreach(self::$_yearTable as $year => $seconds) { + if ($timestamp >= $seconds) { + $i = $act; + break; + } + $sec = $seconds; + $act = $year; + } + + $timestamp -= $sec; + if (!isset($i)) { + $i = $act; + } + + // iterate the max last 10 years + do { + --$i; + $day = $timestamp; + + $timestamp += 31536000; + $leapyear = self::isYearLeapYear($i); + if ($leapyear === true) { + $timestamp += 86400; + } + + if ($timestamp >= 0) { + $year = $i; + break; + } + } while ($timestamp < 0); + + $secondsPerYear = 86400 * ($leapyear ? 366 : 365) + $day; + + $timestamp = $day; + // iterate through months + for ($i = 12; --$i >= 0;) { + $day = $timestamp; + + $timestamp += self::$_monthTable[$i] * 86400; + if (($leapyear === true) and ($i == 1)) { + $timestamp += 86400; + } + + if ($timestamp >= 0) { + $month = $i; + $numday = self::$_monthTable[$i]; + if (($leapyear === true) and ($i == 1)) { + ++$numday; + } + break; + } + } + + $timestamp = $day; + $numberdays = $numday + ceil(($timestamp + 1) / 86400); + + $timestamp += ($numday - $numberdays + 1) * 86400; + $hours = floor($timestamp / 3600); + } else { + + // iterate through years + for ($i = 1970;;$i++) { + $day = $timestamp; + + $timestamp -= 31536000; + $leapyear = self::isYearLeapYear($i); + if ($leapyear === true) { + $timestamp -= 86400; + } + + if ($timestamp < 0) { + $year = $i; + break; + } + } + + $secondsPerYear = $day; + + $timestamp = $day; + // iterate through months + for ($i = 0; $i <= 11; $i++) { + $day = $timestamp; + $timestamp -= self::$_monthTable[$i] * 86400; + + if (($leapyear === true) and ($i == 1)) { + $timestamp -= 86400; + } + + if ($timestamp < 0) { + $month = $i; + $numday = self::$_monthTable[$i]; + if (($leapyear === true) and ($i == 1)) { + ++$numday; + } + break; + } + } + + $timestamp = $day; + $numberdays = ceil(($timestamp + 1) / 86400); + $timestamp = $timestamp - ($numberdays - 1) * 86400; + $hours = floor($timestamp / 3600); + } + + $timestamp -= $hours * 3600; + + $month += 1; + $minutes = floor($timestamp / 60); + $seconds = $timestamp - $minutes * 60; + + if ($fast === true) { + $array = array( + 'seconds' => $seconds, + 'minutes' => $minutes, + 'hours' => $hours, + 'mday' => $numberdays, + 'mon' => $month, + 'year' => $year, + 'yday' => floor($secondsPerYear / 86400), + ); + } else { + + $dayofweek = self::dayOfWeek($year, $month, $numberdays); + $array = array( + 'seconds' => $seconds, + 'minutes' => $minutes, + 'hours' => $hours, + 'mday' => $numberdays, + 'wday' => $dayofweek, + 'mon' => $month, + 'year' => $year, + 'yday' => floor($secondsPerYear / 86400), + 'weekday' => gmdate('l', 86400 * (3 + $dayofweek)), + 'month' => gmdate('F', mktime(0, 0, 0, $month, 1, 1971)), + 0 => $otimestamp + ); + } + + if (isset(self::$_cache)) { + self::$_cache->save( serialize($array), $id); + } + + return $array; + } + + /** + * Internal getWeekNumber function for handling 64bit timestamps + * + * Returns the ISO 8601 week number of a given date + * + * @param integer $year + * @param integer $month + * @param integer $day + * @return integer + */ + protected function weekNumber($year, $month, $day) + { + if ((1901 < $year) and ($year < 2038)) { + return (int) date('W', mktime(0, 0, 0, $month, $day, $year)); + } + + $dayofweek = self::dayOfWeek($year, $month, $day); + $firstday = self::dayOfWeek($year, 1, 1); + if (($month == 1) and (($firstday < 1) or ($firstday > 4)) and ($day < 4)) { + $firstday = self::dayOfWeek($year - 1, 1, 1); + $month = 12; + $day = 31; + + } else if (($month == 12) and ((self::dayOfWeek($year + 1, 1, 1) < 5) and + (self::dayOfWeek($year + 1, 1, 1) > 0))) { + return 1; + } + + return intval (((self::dayOfWeek($year, 1, 1) < 5) and (self::dayOfWeek($year, 1, 1) > 0)) + + 4 * ($month - 1) + (2 * ($month - 1) + ($day - 1) + $firstday - $dayofweek + 6) * 36 / 256); + } + + /** + * Internal _range function + * Sets the value $a to be in the range of [0, $b] + * + * @param float $a - value to correct + * @param float $b - maximum range to set + */ + private function _range($a, $b) { + while ($a < 0) { + $a += $b; + } + while ($a >= $b) { + $a -= $b; + } + return $a; + } + + /** + * Calculates the sunrise or sunset based on a location + * + * @param array $location Location for calculation MUST include 'latitude', 'longitude', 'horizon' + * @param bool $horizon true: sunrise; false: sunset + * @return mixed - false: midnight sun, integer: + */ + protected function calcSun($location, $horizon, $rise = false) + { + // timestamp within 32bit + if (abs($this->_unixTimestamp) <= 0x7FFFFFFF) { + if ($rise === false) { + return date_sunset($this->_unixTimestamp, SUNFUNCS_RET_TIMESTAMP, $location['latitude'], + $location['longitude'], 90 + $horizon, $this->_offset / 3600); + } + return date_sunrise($this->_unixTimestamp, SUNFUNCS_RET_TIMESTAMP, $location['latitude'], + $location['longitude'], 90 + $horizon, $this->_offset / 3600); + } + + // self calculation - timestamp bigger than 32bit + // fix circle values + $quarterCircle = 0.5 * M_PI; + $halfCircle = M_PI; + $threeQuarterCircle = 1.5 * M_PI; + $fullCircle = 2 * M_PI; + + // radiant conversion for coordinates + $radLatitude = $location['latitude'] * $halfCircle / 180; + $radLongitude = $location['longitude'] * $halfCircle / 180; + + // get solar coordinates + $tmpRise = $rise ? $quarterCircle : $threeQuarterCircle; + $radDay = $this->date('z',$this->_unixTimestamp) + ($tmpRise - $radLongitude) / $fullCircle; + + // solar anomoly and longitude + $solAnomoly = $radDay * 0.017202 - 0.0574039; + $solLongitude = $solAnomoly + 0.0334405 * sin($solAnomoly); + $solLongitude += 4.93289 + 3.49066E-4 * sin(2 * $solAnomoly); + + // get quadrant + $solLongitude = $this->_range($solLongitude, $fullCircle); + + if (($solLongitude / $quarterCircle) - intval($solLongitude / $quarterCircle) == 0) { + $solLongitude += 4.84814E-6; + } + + // solar ascension + $solAscension = sin($solLongitude) / cos($solLongitude); + $solAscension = atan2(0.91746 * $solAscension, 1); + + // adjust quadrant + if ($solLongitude > $threeQuarterCircle) { + $solAscension += $fullCircle; + } else if ($solLongitude > $quarterCircle) { + $solAscension += $halfCircle; + } + + // solar declination + $solDeclination = 0.39782 * sin($solLongitude); + $solDeclination /= sqrt(-$solDeclination * $solDeclination + 1); + $solDeclination = atan2($solDeclination, 1); + + $solHorizon = $horizon - sin($solDeclination) * sin($radLatitude); + $solHorizon /= cos($solDeclination) * cos($radLatitude); + + // midnight sun, always night + if (abs($solHorizon) > 1) { + return false; + } + + $solHorizon /= sqrt(-$solHorizon * $solHorizon + 1); + $solHorizon = $quarterCircle - atan2($solHorizon, 1); + + if ($rise) { + $solHorizon = $fullCircle - $solHorizon; + } + + // time calculation + $localTime = $solHorizon + $solAscension - 0.0172028 * $radDay - 1.73364; + $universalTime = $localTime - $radLongitude; + + // determinate quadrant + $universalTime = $this->_range($universalTime, $fullCircle); + + // radiant to hours + $universalTime *= 24 / $fullCircle; + + // convert to time + $hour = intval($universalTime); + $universalTime = ($universalTime - $hour) * 60; + $min = intval($universalTime); + $universalTime = ($universalTime - $min) * 60; + $sec = intval($universalTime); + + return $this->mktime($hour, $min, $sec, $this->date('m', $this->_unixTimestamp), + $this->date('j', $this->_unixTimestamp), $this->date('Y', $this->_unixTimestamp), + -1, true); + } + + /** + * Sets a new timezone for calculation of $this object's gmt offset. + * For a list of supported timezones look here: http://php.net/timezones + * If no timezone can be detected or the given timezone is wrong UTC will be set. + * + * @param string $zone OPTIONAL timezone for date calculation; defaults to date_default_timezone_get() + * @return Zend_Date_DateObject Provides fluent interface + * @throws Zend_Date_Exception + */ + public function setTimezone($zone = null) + { + $oldzone = @date_default_timezone_get(); + if ($zone === null) { + $zone = $oldzone; + } + + // throw an error on false input, but only if the new date extension is available + if (function_exists('timezone_open')) { + if (!@timezone_open($zone)) { + require_once 'Zend/Date/Exception.php'; + throw new Zend_Date_Exception("timezone ($zone) is not a known timezone", $zone); + } + } + // this can generate an error if the date extension is not available and a false timezone is given + $result = @date_default_timezone_set($zone); + if ($result === true) { + $this->_offset = mktime(0, 0, 0, 1, 2, 1970) - gmmktime(0, 0, 0, 1, 2, 1970); + $this->_timezone = $zone; + } + date_default_timezone_set($oldzone); + + if (($zone == 'UTC') or ($zone == 'GMT')) { + $this->_dst = false; + } + + return $this; + } + + /** + * Return the timezone of $this object. + * The timezone is initially set when the object is instantiated. + * + * @return string actual set timezone string + */ + public function getTimezone() + { + return $this->_timezone; + } + + /** + * Return the offset to GMT of $this object's timezone. + * The offset to GMT is initially set when the object is instantiated using the currently, + * in effect, default timezone for PHP functions. + * + * @return integer seconds difference between GMT timezone and timezone when object was instantiated + */ + public function getGmtOffset() + { + return $this->_offset; + } +} diff --git a/libs/Zend/Date/Exception.php b/libs/Zend/Date/Exception.php new file mode 100644 index 0000000..0b404e8 --- /dev/null +++ b/libs/Zend/Date/Exception.php @@ -0,0 +1,49 @@ +operand = $op; + parent::__construct($message); + } + + public function getOperand() + { + return $this->operand; + } +} diff --git a/libs/Zend/Db.php b/libs/Zend/Db.php new file mode 100644 index 0000000..7822920 --- /dev/null +++ b/libs/Zend/Db.php @@ -0,0 +1,269 @@ +toArray(); + } + + /* + * Convert Zend_Config argument to plain string + * adapter name and separate config object. + */ + if ($adapter instanceof Zend_Config) { + if (isset($adapter->params)) { + $config = $adapter->params->toArray(); + } + if (isset($adapter->adapter)) { + $adapter = (string) $adapter->adapter; + } else { + $adapter = null; + } + } + + /* + * Verify that adapter parameters are in an array. + */ + if (!is_array($config)) { + /** + * @see Zend_Db_Exception + */ + require_once 'Zend/Db/Exception.php'; + throw new Zend_Db_Exception('Adapter parameters must be in an array or a Zend_Config object'); + } + + /* + * Verify that an adapter name has been specified. + */ + if (!is_string($adapter) || empty($adapter)) { + /** + * @see Zend_Db_Exception + */ + require_once 'Zend/Db/Exception.php'; + throw new Zend_Db_Exception('Adapter name must be specified in a string'); + } + + /* + * Form full adapter class name + */ + $adapterNamespace = 'Zend_Db_Adapter'; + if (isset($config['adapterNamespace'])) { + if ($config['adapterNamespace'] != '') { + $adapterNamespace = $config['adapterNamespace']; + } + unset($config['adapterNamespace']); + } + $adapterName = strtolower($adapterNamespace . '_' . $adapter); + $adapterName = str_replace(' ', '_', ucwords(str_replace('_', ' ', $adapterName))); + + /* + * Load the adapter class. This throws an exception + * if the specified class cannot be loaded. + */ + @Zend_Loader::loadClass($adapterName); + + /* + * Create an instance of the adapter class. + * Pass the config to the adapter class constructor. + */ + $dbAdapter = new $adapterName($config); + + /* + * Verify that the object created is a descendent of the abstract adapter type. + */ + if (! $dbAdapter instanceof Zend_Db_Adapter_Abstract) { + /** + * @see Zend_Db_Exception + */ + require_once 'Zend/Db/Exception.php'; + throw new Zend_Db_Exception("Adapter class '$adapterName' does not extend Zend_Db_Adapter_Abstract"); + } + + return $dbAdapter; + } + +} diff --git a/libs/Zend/Db/Adapter/Abstract.php b/libs/Zend/Db/Adapter/Abstract.php new file mode 100644 index 0000000..ef8117f --- /dev/null +++ b/libs/Zend/Db/Adapter/Abstract.php @@ -0,0 +1,1144 @@ + Zend_Db::INT_TYPE, + Zend_Db::BIGINT_TYPE => Zend_Db::BIGINT_TYPE, + Zend_Db::FLOAT_TYPE => Zend_Db::FLOAT_TYPE + ); + + /** + * Constructor. + * + * $config is an array of key/value pairs or an instance of Zend_Config + * containing configuration options. These options are common to most adapters: + * + * dbname => (string) The name of the database to user + * username => (string) Connect to the database as this username. + * password => (string) Password associated with the username. + * host => (string) What host to connect to, defaults to localhost + * + * Some options are used on a case-by-case basis by adapters: + * + * port => (string) The port of the database + * persistent => (boolean) Whether to use a persistent connection or not, defaults to false + * protocol => (string) The network protocol, defaults to TCPIP + * caseFolding => (int) style of case-alteration used for identifiers + * + * @param array|Zend_Config $config An array or instance of Zend_Config having configuration data + * @throws Zend_Db_Adapter_Exception + */ + public function __construct($config) + { + /* + * Verify that adapter parameters are in an array. + */ + if (!is_array($config)) { + /* + * Convert Zend_Config argument to a plain array. + */ + if ($config instanceof Zend_Config) { + $config = $config->toArray(); + } else { + /** + * @see Zend_Db_Exception + */ + require_once 'Zend/Db/Exception.php'; + throw new Zend_Db_Exception('Adapter parameters must be in an array or a Zend_Config object'); + } + } + + $this->_checkRequiredOptions($config); + + $options = array( + Zend_Db::CASE_FOLDING => $this->_caseFolding, + Zend_DB::AUTO_QUOTE_IDENTIFIERS => $this->_autoQuoteIdentifiers + ); + $driverOptions = array(); + + /* + * normalize the config and merge it with the defaults + */ + if (array_key_exists('options', $config)) { + // can't use array_merge() because keys might be integers + foreach ((array) $config['options'] as $key => $value) { + $options[$key] = $value; + } + } + if (array_key_exists('driver_options', $config)) { + if (!empty($config['driver_options'])) { + // can't use array_merge() because keys might be integers + foreach ((array) $config['driver_options'] as $key => $value) { + $driverOptions[$key] = $value; + } + } + } + $this->_config = array_merge($this->_config, $config); + $this->_config['options'] = $options; + $this->_config['driver_options'] = $driverOptions; + + // obtain the case setting, if there is one + if (array_key_exists(Zend_Db::CASE_FOLDING, $options)) { + $case = (int) $options[Zend_Db::CASE_FOLDING]; + switch ($case) { + case Zend_Db::CASE_LOWER: + case Zend_Db::CASE_UPPER: + case Zend_Db::CASE_NATURAL: + $this->_caseFolding = $case; + break; + default: + require_once 'Zend/Db/Adapter/Exception.php'; + throw new Zend_Db_Adapter_Exception('Case must be one of the following constants: ' + . 'Zend_Db::CASE_NATURAL, Zend_Db::CASE_LOWER, Zend_Db::CASE_UPPER'); + } + } + + // obtain quoting property if there is one + if (array_key_exists(Zend_Db::AUTO_QUOTE_IDENTIFIERS, $options)) { + $this->_autoQuoteIdentifiers = (bool) $options[Zend_Db::AUTO_QUOTE_IDENTIFIERS]; + } + + // create a profiler object + $profiler = false; + if (array_key_exists(Zend_Db::PROFILER, $this->_config)) { + $profiler = $this->_config[Zend_Db::PROFILER]; + unset($this->_config[Zend_Db::PROFILER]); + } + $this->setProfiler($profiler); + } + + /** + * Check for config options that are mandatory. + * Throw exceptions if any are missing. + * + * @param array $config + * @throws Zend_Db_Adapter_Exception + */ + protected function _checkRequiredOptions(array $config) + { + // we need at least a dbname + if (! array_key_exists('dbname', $config)) { + require_once 'Zend/Db/Adapter/Exception.php'; + throw new Zend_Db_Adapter_Exception("Configuration array must have a key for 'dbname' that names the database instance"); + } + + if (! array_key_exists('password', $config)) { + /** + * @see Zend_Db_Adapter_Exception + */ + require_once 'Zend/Db/Adapter/Exception.php'; + throw new Zend_Db_Adapter_Exception("Configuration array must have a key for 'password' for login credentials"); + } + + if (! array_key_exists('username', $config)) { + /** + * @see Zend_Db_Adapter_Exception + */ + require_once 'Zend/Db/Adapter/Exception.php'; + throw new Zend_Db_Adapter_Exception("Configuration array must have a key for 'username' for login credentials"); + } + } + + /** + * Returns the underlying database connection object or resource. + * If not presently connected, this initiates the connection. + * + * @return object|resource|null + */ + public function getConnection() + { + $this->_connect(); + return $this->_connection; + } + + /** + * Returns the configuration variables in this adapter. + * + * @return array + */ + public function getConfig() + { + return $this->_config; + } + + /** + * Set the adapter's profiler object. + * + * The argument may be a boolean, an associative array, an instance of + * Zend_Db_Profiler, or an instance of Zend_Config. + * + * A boolean argument sets the profiler to enabled if true, or disabled if + * false. The profiler class is the adapter's default profiler class, + * Zend_Db_Profiler. + * + * An instance of Zend_Db_Profiler sets the adapter's instance to that + * object. The profiler is enabled and disabled separately. + * + * An associative array argument may contain any of the keys 'enabled', + * 'class', and 'instance'. The 'enabled' and 'instance' keys correspond to the + * boolean and object types documented above. The 'class' key is used to name a + * class to use for a custom profiler. The class must be Zend_Db_Profiler or a + * subclass. The class is instantiated with no constructor arguments. The 'class' + * option is ignored when the 'instance' option is supplied. + * + * An object of type Zend_Config may contain the properties 'enabled', 'class', and + * 'instance', just as if an associative array had been passed instead. + * + * @param Zend_Db_Profiler|Zend_Config|array|boolean $profiler + * @return Zend_Db_Adapter_Abstract Provides a fluent interface + * @throws Zend_Db_Profiler_Exception if the object instance or class specified + * is not Zend_Db_Profiler or an extension of that class. + */ + public function setProfiler($profiler) + { + $enabled = null; + $profilerClass = $this->_defaultProfilerClass; + $profilerInstance = null; + + if ($profilerIsObject = is_object($profiler)) { + if ($profiler instanceof Zend_Db_Profiler) { + $profilerInstance = $profiler; + } else if ($profiler instanceof Zend_Config) { + $profiler = $profiler->toArray(); + } else { + /** + * @see Zend_Db_Profiler_Exception + */ + require_once 'Zend/Db/Profiler/Exception.php'; + throw new Zend_Db_Profiler_Exception('Profiler argument must be an instance of either Zend_Db_Profiler' + . ' or Zend_Config when provided as an object'); + } + } + + if (is_array($profiler)) { + if (isset($profiler['enabled'])) { + $enabled = (bool) $profiler['enabled']; + } + if (isset($profiler['class'])) { + $profilerClass = $profiler['class']; + } + if (isset($profiler['instance'])) { + $profilerInstance = $profiler['instance']; + } + } else if (!$profilerIsObject) { + $enabled = (bool) $profiler; + } + + if ($profilerInstance === null) { + @Zend_Loader::loadClass($profilerClass); + $profilerInstance = new $profilerClass(); + } + + if (!$profilerInstance instanceof Zend_Db_Profiler) { + require_once 'Zend/Db/Profiler/Exception.php'; + throw new Zend_Db_Profiler_Exception('Class ' . get_class($profilerInstance) . ' does not extend ' + . 'Zend_Db_Profiler'); + } + + if (null !== $enabled) { + $profilerInstance->setEnabled($enabled); + } + + $this->_profiler = $profilerInstance; + + return $this; + } + + + /** + * Returns the profiler for this adapter. + * + * @return Zend_Db_Profiler + */ + public function getProfiler() + { + return $this->_profiler; + } + + /** + * Get the default statement class. + * + * @return string + */ + public function getStatementClass() + { + return $this->_defaultStmtClass; + } + + /** + * Set the default statement class. + * + * @return Zend_Db_Abstract Fluent interface + */ + public function setStatementClass($class) + { + $this->_defaultStmtClass = $class; + return $this; + } + + /** + * Prepares and executes an SQL statement with bound data. + * + * @param mixed $sql The SQL statement with placeholders. + * May be a string or Zend_Db_Select. + * @param mixed $bind An array of data to bind to the placeholders. + * @return Zend_Db_Statement_Interface + */ + public function query($sql, $bind = array()) + { + // connect to the database if needed + $this->_connect(); + + // is the $sql a Zend_Db_Select object? + if ($sql instanceof Zend_Db_Select) { + $sql = $sql->assemble(); + } + + // make sure $bind to an array; + // don't use (array) typecasting because + // because $bind may be a Zend_Db_Expr object + if (!is_array($bind)) { + $bind = array($bind); + } + + // prepare and execute the statement with profiling + $stmt = $this->prepare($sql); + $stmt->execute($bind); + + // return the results embedded in the prepared statement object + $stmt->setFetchMode($this->_fetchMode); + return $stmt; + } + + /** + * Leave autocommit mode and begin a transaction. + * + * @return bool True + */ + public function beginTransaction() + { + $this->_connect(); + $q = $this->_profiler->queryStart('begin', Zend_Db_Profiler::TRANSACTION); + $this->_beginTransaction(); + $this->_profiler->queryEnd($q); + return true; + } + + /** + * Commit a transaction and return to autocommit mode. + * + * @return bool True + */ + public function commit() + { + $this->_connect(); + $q = $this->_profiler->queryStart('commit', Zend_Db_Profiler::TRANSACTION); + $this->_commit(); + $this->_profiler->queryEnd($q); + return true; + } + + /** + * Roll back a transaction and return to autocommit mode. + * + * @return bool True + */ + public function rollBack() + { + $this->_connect(); + $q = $this->_profiler->queryStart('rollback', Zend_Db_Profiler::TRANSACTION); + $this->_rollBack(); + $this->_profiler->queryEnd($q); + return true; + } + + /** + * Inserts a table row with specified data. + * + * @param mixed $table The table to insert data into. + * @param array $bind Column-value pairs. + * @return int The number of affected rows. + */ + public function insert($table, array $bind) + { + // extract and quote col names from the array keys + $cols = array(); + $vals = array(); + foreach ($bind as $col => $val) { + $cols[] = $this->quoteIdentifier($col, true); + if ($val instanceof Zend_Db_Expr) { + $vals[] = $val->__toString(); + unset($bind[$col]); + } else { + $vals[] = '?'; + } + } + + // build the statement + $sql = "INSERT INTO " + . $this->quoteIdentifier($table, true) + . ' (' . implode(', ', $cols) . ') ' + . 'VALUES (' . implode(', ', $vals) . ')'; + + // execute the statement and return the number of affected rows + $stmt = $this->query($sql, array_values($bind)); + $result = $stmt->rowCount(); + return $result; + } + + /** + * Updates table rows with specified data based on a WHERE clause. + * + * @param mixed $table The table to update. + * @param array $bind Column-value pairs. + * @param mixed $where UPDATE WHERE clause(s). + * @return int The number of affected rows. + */ + public function update($table, array $bind, $where = '') + { + /** + * Build "col = ?" pairs for the statement, + * except for Zend_Db_Expr which is treated literally. + */ + $set = array(); + foreach ($bind as $col => $val) { + if ($val instanceof Zend_Db_Expr) { + $val = $val->__toString(); + unset($bind[$col]); + } else { + $val = '?'; + } + $set[] = $this->quoteIdentifier($col, true) . ' = ' . $val; + } + + $where = $this->_whereExpr($where); + + /** + * Build the UPDATE statement + */ + $sql = "UPDATE " + . $this->quoteIdentifier($table, true) + . ' SET ' . implode(', ', $set) + . (($where) ? " WHERE $where" : ''); + + /** + * Execute the statement and return the number of affected rows + */ + $stmt = $this->query($sql, array_values($bind)); + $result = $stmt->rowCount(); + return $result; + } + + /** + * Deletes table rows based on a WHERE clause. + * + * @param mixed $table The table to update. + * @param mixed $where DELETE WHERE clause(s). + * @return int The number of affected rows. + */ + public function delete($table, $where = '') + { + $where = $this->_whereExpr($where); + + /** + * Build the DELETE statement + */ + $sql = "DELETE FROM " + . $this->quoteIdentifier($table, true) + . (($where) ? " WHERE $where" : ''); + + /** + * Execute the statement and return the number of affected rows + */ + $stmt = $this->query($sql); + $result = $stmt->rowCount(); + return $result; + } + + /** + * Convert an array, string, or Zend_Db_Expr object + * into a string to put in a WHERE clause. + * + * @param mixed $where + * @return string + */ + protected function _whereExpr($where) + { + if (empty($where)) { + return $where; + } + if (!is_array($where)) { + $where = array($where); + } + foreach ($where as &$term) { + if ($term instanceof Zend_Db_Expr) { + $term = $term->__toString(); + } + $term = '(' . $term . ')'; + } + $where = implode(' AND ', $where); + return $where; + } + + /** + * Creates and returns a new Zend_Db_Select object for this adapter. + * + * @return Zend_Db_Select + */ + public function select() + { + return new Zend_Db_Select($this); + } + + /** + * Get the fetch mode. + * + * @return int + */ + public function getFetchMode() + { + return $this->_fetchMode; + } + + /** + * Fetches all SQL result rows as a sequential array. + * Uses the current fetchMode for the adapter. + * + * @param string|Zend_Db_Select $sql An SQL SELECT statement. + * @param mixed $bind Data to bind into SELECT placeholders. + * @param mixed $fetchMode Override current fetch mode. + * @return array + */ + public function fetchAll($sql, $bind = array(), $fetchMode = null) + { + if ($fetchMode === null) { + $fetchMode = $this->_fetchMode; + } + $stmt = $this->query($sql, $bind); + $result = $stmt->fetchAll($fetchMode); + return $result; + } + + /** + * Fetches the first row of the SQL result. + * Uses the current fetchMode for the adapter. + * + * @param string|Zend_Db_Select $sql An SQL SELECT statement. + * @param mixed $bind Data to bind into SELECT placeholders. + * @param mixed $fetchMode Override current fetch mode. + * @return array + */ + public function fetchRow($sql, $bind = array(), $fetchMode = null) + { + if ($fetchMode === null) { + $fetchMode = $this->_fetchMode; + } + $stmt = $this->query($sql, $bind); + $result = $stmt->fetch($fetchMode); + return $result; + } + + /** + * Fetches all SQL result rows as an associative array. + * + * The first column is the key, the entire row array is the + * value. You should construct the query to be sure that + * the first column contains unique values, or else + * rows with duplicate values in the first column will + * overwrite previous data. + * + * @param string|Zend_Db_Select $sql An SQL SELECT statement. + * @param mixed $bind Data to bind into SELECT placeholders. + * @return string + */ + public function fetchAssoc($sql, $bind = array()) + { + $stmt = $this->query($sql, $bind); + $data = array(); + while ($row = $stmt->fetch(Zend_Db::FETCH_ASSOC)) { + $tmp = array_values(array_slice($row, 0, 1)); + $data[$tmp[0]] = $row; + } + return $data; + } + + /** + * Fetches the first column of all SQL result rows as an array. + * + * The first column in each row is used as the array key. + * + * @param string|Zend_Db_Select $sql An SQL SELECT statement. + * @param mixed $bind Data to bind into SELECT placeholders. + * @return array + */ + public function fetchCol($sql, $bind = array()) + { + $stmt = $this->query($sql, $bind); + $result = $stmt->fetchAll(Zend_Db::FETCH_COLUMN, 0); + return $result; + } + + /** + * Fetches all SQL result rows as an array of key-value pairs. + * + * The first column is the key, the second column is the + * value. + * + * @param string|Zend_Db_Select $sql An SQL SELECT statement. + * @param mixed $bind Data to bind into SELECT placeholders. + * @return string + */ + public function fetchPairs($sql, $bind = array()) + { + $stmt = $this->query($sql, $bind); + $data = array(); + while ($row = $stmt->fetch(Zend_Db::FETCH_NUM)) { + $data[$row[0]] = $row[1]; + } + return $data; + } + + /** + * Fetches the first column of the first row of the SQL result. + * + * @param string|Zend_Db_Select $sql An SQL SELECT statement. + * @param mixed $bind Data to bind into SELECT placeholders. + * @return string + */ + public function fetchOne($sql, $bind = array()) + { + $stmt = $this->query($sql, $bind); + $result = $stmt->fetchColumn(0); + return $result; + } + + /** + * Quote a raw string. + * + * @param string $value Raw string + * @return string Quoted string + */ + protected function _quote($value) + { + if (is_int($value)) { + return $value; + } elseif (is_float($value)) { + return sprintf('%F', $value); + } + return "'" . addcslashes($value, "\000\n\r\\'\"\032") . "'"; + } + + /** + * Safely quotes a value for an SQL statement. + * + * If an array is passed as the value, the array values are quoted + * and then returned as a comma-separated string. + * + * @param mixed $value The value to quote. + * @param mixed $type OPTIONAL the SQL datatype name, or constant, or null. + * @return mixed An SQL-safe quoted value (or string of separated values). + */ + public function quote($value, $type = null) + { + $this->_connect(); + + if ($value instanceof Zend_Db_Select) { + return '(' . $value->assemble() . ')'; + } + + if ($value instanceof Zend_Db_Expr) { + return $value->__toString(); + } + + if (is_array($value)) { + foreach ($value as &$val) { + $val = $this->quote($val, $type); + } + return implode(', ', $value); + } + + if ($type !== null && array_key_exists($type = strtoupper($type), $this->_numericDataTypes)) { + $quotedValue = '0'; + switch ($this->_numericDataTypes[$type]) { + case Zend_Db::INT_TYPE: // 32-bit integer + $quotedValue = (string) intval($value); + break; + case Zend_Db::BIGINT_TYPE: // 64-bit integer + // ANSI SQL-style hex literals (e.g. x'[\dA-F]+') + // are not supported here, because these are string + // literals, not numeric literals. + if (preg_match('/^( + [+-]? # optional sign + (?: + 0[Xx][\da-fA-F]+ # ODBC-style hexadecimal + |\d+ # decimal or octal, or MySQL ZEROFILL decimal + (?:[eE][+-]?\d+)? # optional exponent on decimals or octals + ) + )/x', + (string) $value, $matches)) { + $quotedValue = $matches[1]; + } + break; + case Zend_Db::FLOAT_TYPE: // float or decimal + $quotedValue = sprintf('%F', $value); + } + return $quotedValue; + } + + return $this->_quote($value); + } + + /** + * Quotes a value and places into a piece of text at a placeholder. + * + * The placeholder is a question-mark; all placeholders will be replaced + * with the quoted value. For example: + * + * + * $text = "WHERE date < ?"; + * $date = "2005-01-02"; + * $safe = $sql->quoteInto($text, $date); + * // $safe = "WHERE date < '2005-01-02'" + * + * + * @param string $text The text with a placeholder. + * @param mixed $value The value to quote. + * @param string $type OPTIONAL SQL datatype + * @param integer $count OPTIONAL count of placeholders to replace + * @return string An SQL-safe quoted value placed into the orignal text. + */ + public function quoteInto($text, $value, $type = null, $count = null) + { + if ($count === null) { + return str_replace('?', $this->quote($value, $type), $text); + } else { + while ($count > 0) { + if (strpos($text, '?') != false) { + $text = substr_replace($text, $this->quote($value, $type), strpos($text, '?'), 1); + } + --$count; + } + return $text; + } + } + + /** + * Quotes an identifier. + * + * Accepts a string representing a qualified indentifier. For Example: + * + * $adapter->quoteIdentifier('myschema.mytable') + * + * Returns: "myschema"."mytable" + * + * Or, an array of one or more identifiers that may form a qualified identifier: + * + * $adapter->quoteIdentifier(array('myschema','my.table')) + * + * Returns: "myschema"."my.table" + * + * The actual quote character surrounding the identifiers may vary depending on + * the adapter. + * + * @param string|array|Zend_Db_Expr $ident The identifier. + * @param boolean $auto If true, heed the AUTO_QUOTE_IDENTIFIERS config option. + * @return string The quoted identifier. + */ + public function quoteIdentifier($ident, $auto=false) + { + return $this->_quoteIdentifierAs($ident, null, $auto); + } + + /** + * Quote a column identifier and alias. + * + * @param string|array|Zend_Db_Expr $ident The identifier or expression. + * @param string $alias An alias for the column. + * @param boolean $auto If true, heed the AUTO_QUOTE_IDENTIFIERS config option. + * @return string The quoted identifier and alias. + */ + public function quoteColumnAs($ident, $alias, $auto=false) + { + return $this->_quoteIdentifierAs($ident, $alias, $auto); + } + + /** + * Quote a table identifier and alias. + * + * @param string|array|Zend_Db_Expr $ident The identifier or expression. + * @param string $alias An alias for the table. + * @param boolean $auto If true, heed the AUTO_QUOTE_IDENTIFIERS config option. + * @return string The quoted identifier and alias. + */ + public function quoteTableAs($ident, $alias = null, $auto = false) + { + return $this->_quoteIdentifierAs($ident, $alias, $auto); + } + + /** + * Quote an identifier and an optional alias. + * + * @param string|array|Zend_Db_Expr $ident The identifier or expression. + * @param string $alias An optional alias. + * @param string $as The string to add between the identifier/expression and the alias. + * @param boolean $auto If true, heed the AUTO_QUOTE_IDENTIFIERS config option. + * @return string The quoted identifier and alias. + */ + protected function _quoteIdentifierAs($ident, $alias = null, $auto = false, $as = ' AS ') + { + if ($ident instanceof Zend_Db_Expr) { + $quoted = $ident->__toString(); + } elseif ($ident instanceof Zend_Db_Select) { + $quoted = '(' . $ident->assemble() . ')'; + } else { + if (is_string($ident)) { + $ident = explode('.', $ident); + } + if (is_array($ident)) { + $segments = array(); + foreach ($ident as $segment) { + if ($segment instanceof Zend_Db_Expr) { + $segments[] = $segment->__toString(); + } else { + $segments[] = $this->_quoteIdentifier($segment, $auto); + } + } + if ($alias !== null && end($ident) == $alias) { + $alias = null; + } + $quoted = implode('.', $segments); + } else { + $quoted = $this->_quoteIdentifier($ident, $auto); + } + } + if ($alias !== null) { + $quoted .= $as . $this->_quoteIdentifier($alias, $auto); + } + return $quoted; + } + + /** + * Quote an identifier. + * + * @param string $value The identifier or expression. + * @param boolean $auto If true, heed the AUTO_QUOTE_IDENTIFIERS config option. + * @return string The quoted identifier and alias. + */ + protected function _quoteIdentifier($value, $auto=false) + { + if ($auto === false || $this->_autoQuoteIdentifiers === true) { + $q = $this->getQuoteIdentifierSymbol(); + return ($q . str_replace("$q", "$q$q", $value) . $q); + } + return $value; + } + + /** + * Returns the symbol the adapter uses for delimited identifiers. + * + * @return string + */ + public function getQuoteIdentifierSymbol() + { + return '"'; + } + + /** + * Return the most recent value from the specified sequence in the database. + * This is supported only on RDBMS brands that support sequences + * (e.g. Oracle, PostgreSQL, DB2). Other RDBMS brands return null. + * + * @param string $sequenceName + * @return string + */ + public function lastSequenceId($sequenceName) + { + return null; + } + + /** + * Generate a new value from the specified sequence in the database, and return it. + * This is supported only on RDBMS brands that support sequences + * (e.g. Oracle, PostgreSQL, DB2). Other RDBMS brands return null. + * + * @param string $sequenceName + * @return string + */ + public function nextSequenceId($sequenceName) + { + return null; + } + + /** + * Helper method to change the case of the strings used + * when returning result sets in FETCH_ASSOC and FETCH_BOTH + * modes. + * + * This is not intended to be used by application code, + * but the method must be public so the Statement class + * can invoke it. + * + * @param string $key + * @returns string + */ + public function foldCase($key) + { + switch ($this->_caseFolding) { + case Zend_Db::CASE_LOWER: + $value = strtolower((string) $key); + break; + case Zend_Db::CASE_UPPER: + $value = strtoupper((string) $key); + break; + case Zend_Db::CASE_NATURAL: + default: + $value = (string) $key; + } + return $value; + } + + /** + * Abstract Methods + */ + + /** + * Returns a list of the tables in the database. + * + * @return array + */ + abstract public function listTables(); + + /** + * Returns the column descriptions for a table. + * + * The return value is an associative array keyed by the column name, + * as returned by the RDBMS. + * + * The value of each array element is an associative array + * with the following keys: + * + * SCHEMA_NAME => string; name of database or schema + * TABLE_NAME => string; + * COLUMN_NAME => string; column name + * COLUMN_POSITION => number; ordinal position of column in table + * DATA_TYPE => string; SQL datatype name of column + * DEFAULT => string; default expression of column, null if none + * NULLABLE => boolean; true if column can have nulls + * LENGTH => number; length of CHAR/VARCHAR + * SCALE => number; scale of NUMERIC/DECIMAL + * PRECISION => number; precision of NUMERIC/DECIMAL + * UNSIGNED => boolean; unsigned property of an integer type + * PRIMARY => boolean; true if column is part of the primary key + * PRIMARY_POSITION => integer; position of column in primary key + * + * @param string $tableName + * @param string $schemaName OPTIONAL + * @return array + */ + abstract public function describeTable($tableName, $schemaName = null); + + /** + * Creates a connection to the database. + * + * @return void + */ + abstract protected function _connect(); + + /** + * Force the connection to close. + * + * @return void + */ + abstract public function closeConnection(); + + /** + * Prepare a statement and return a PDOStatement-like object. + * + * @param string|Zend_Db_Select $sql SQL query + * @return Zend_Db_Statment|PDOStatement + */ + abstract public function prepare($sql); + + /** + * Gets the last ID generated automatically by an IDENTITY/AUTOINCREMENT column. + * + * As a convention, on RDBMS brands that support sequences + * (e.g. Oracle, PostgreSQL, DB2), this method forms the name of a sequence + * from the arguments and returns the last id generated by that sequence. + * On RDBMS brands that support IDENTITY/AUTOINCREMENT columns, this method + * returns the last value generated for such a column, and the table name + * argument is disregarded. + * + * @param string $tableName OPTIONAL Name of table. + * @param string $primaryKey OPTIONAL Name of primary key column. + * @return string + */ + abstract public function lastInsertId($tableName = null, $primaryKey = null); + + /** + * Begin a transaction. + */ + abstract protected function _beginTransaction(); + + /** + * Commit a transaction. + */ + abstract protected function _commit(); + + /** + * Roll-back a transaction. + */ + abstract protected function _rollBack(); + + /** + * Set the fetch mode. + * + * @param integer $mode + * @return void + * @throws Zend_Db_Adapter_Exception + */ + abstract public function setFetchMode($mode); + + /** + * Adds an adapter-specific LIMIT clause to the SELECT statement. + * + * @param mixed $sql + * @param integer $count + * @param integer $offset + * @return string + */ + abstract public function limit($sql, $count, $offset = 0); + + /** + * Check if the adapter supports real SQL parameters. + * + * @param string $type 'positional' or 'named' + * @return bool + */ + abstract public function supportsParameters($type); + +} diff --git a/libs/Zend/Db/Adapter/Db2.php b/libs/Zend/Db/Adapter/Db2.php new file mode 100644 index 0000000..c8ebfbf --- /dev/null +++ b/libs/Zend/Db/Adapter/Db2.php @@ -0,0 +1,630 @@ + (string) Connect to the database as this username. + * password => (string) Password associated with the username. + * host => (string) What host to connect to (default 127.0.0.1) + * dbname => (string) The name of the database to user + * protocol => (string) Protocol to use, defaults to "TCPIP" + * port => (integer) Port number to use for TCP/IP if protocol is "TCPIP" + * persistent => (boolean) Set TRUE to use a persistent connection (db2_pconnect) + * + * @var array + */ + protected $_config = array( + 'dbname' => null, + 'username' => null, + 'password' => null, + 'host' => 'localhost', + 'port' => '50000', + 'protocol' => 'TCPIP', + 'persistent' => false + ); + + /** + * Execution mode + * + * @var int execution flag (DB2_AUTOCOMMIT_ON or DB2_AUTOCOMMIT_OFF) + */ + protected $_execute_mode = DB2_AUTOCOMMIT_ON; + + /** + * Default class name for a DB statement. + * + * @var string + */ + protected $_defaultStmtClass = 'Zend_Db_Statement_Db2'; + + /** + * Keys are UPPERCASE SQL datatypes or the constants + * Zend_Db::INT_TYPE, Zend_Db::BIGINT_TYPE, or Zend_Db::FLOAT_TYPE. + * + * Values are: + * 0 = 32-bit integer + * 1 = 64-bit integer + * 2 = float or decimal + * + * @var array Associative array of datatypes to values 0, 1, or 2. + */ + protected $_numericDataTypes = array( + Zend_Db::INT_TYPE => Zend_Db::INT_TYPE, + Zend_Db::BIGINT_TYPE => Zend_Db::BIGINT_TYPE, + Zend_Db::FLOAT_TYPE => Zend_Db::FLOAT_TYPE, + 'INTEGER' => Zend_Db::INT_TYPE, + 'SMALLINT' => Zend_Db::INT_TYPE, + 'BIGINT' => Zend_Db::BIGINT_TYPE, + 'DECIMAL' => Zend_Db::FLOAT_TYPE, + 'NUMERIC' => Zend_Db::FLOAT_TYPE + ); + + /** + * Creates a connection resource. + * + * @return void + */ + protected function _connect() + { + if (is_resource($this->_connection)) { + // connection already exists + return; + } + + if (!extension_loaded('ibm_db2')) { + /** + * @see Zend_Db_Adapter_Db2_Exception + */ + require_once 'Zend/Db/Adapter/Db2/Exception.php'; + throw new Zend_Db_Adapter_Db2_Exception('The IBM DB2 extension is required for this adapter but the extension is not loaded'); + } + + if ($this->_config['persistent']) { + // use persistent connection + $conn_func_name = 'db2_pconnect'; + } else { + // use "normal" connection + $conn_func_name = 'db2_connect'; + } + + if (!isset($this->_config['driver_options']['autocommit'])) { + // set execution mode + $this->_config['driver_options']['autocommit'] = &$this->_execute_mode; + } + + if (isset($this->_config['options'][Zend_Db::CASE_FOLDING])) { + $caseAttrMap = array( + Zend_Db::CASE_NATURAL => DB2_CASE_NATURAL, + Zend_Db::CASE_UPPER => DB2_CASE_UPPER, + Zend_Db::CASE_LOWER => DB2_CASE_LOWER + ); + $this->_config['driver_options']['DB2_ATTR_CASE'] = $caseAttrMap[$this->_config['options'][Zend_Db::CASE_FOLDING]]; + } + + if ($this->_config['host'] !== 'localhost') { + // if the host isn't localhost, use extended connection params + $dbname = 'DRIVER={IBM DB2 ODBC DRIVER}' . + ';DATABASE=' . $this->_config['dbname'] . + ';HOSTNAME=' . $this->_config['host'] . + ';PORT=' . $this->_config['port'] . + ';PROTOCOL=' . $this->_config['protocol'] . + ';UID=' . $this->_config['username'] . + ';PWD=' . $this->_config['password'] .';'; + $this->_connection = $conn_func_name( + $dbname, + null, + null, + $this->_config['driver_options'] + ); + } else { + // host is localhost, so use standard connection params + $this->_connection = $conn_func_name( + $this->_config['dbname'], + $this->_config['username'], + $this->_config['password'], + $this->_config['driver_options'] + ); + } + + // check the connection + if (!$this->_connection) { + /** + * @see Zend_Db_Adapter_Db2_Exception + */ + require_once 'Zend/Db/Adapter/Db2/Exception.php'; + throw new Zend_Db_Adapter_Db2_Exception(db2_conn_errormsg(), db2_conn_error()); + } + } + + /** + * Force the connection to close. + * + * @return void + */ + public function closeConnection() + { + db2_close($this->_connection); + $this->_connection = null; + } + + /** + * Returns an SQL statement for preparation. + * + * @param string $sql The SQL statement with placeholders. + * @return Zend_Db_Statement_Db2 + */ + public function prepare($sql) + { + $this->_connect(); + $stmtClass = $this->_defaultStmtClass; + Zend_Loader::loadClass($stmtClass); + $stmt = new $stmtClass($this, $sql); + $stmt->setFetchMode($this->_fetchMode); + return $stmt; + } + + /** + * Gets the execution mode + * + * @return int the execution mode (DB2_AUTOCOMMIT_ON or DB2_AUTOCOMMIT_OFF) + */ + public function _getExecuteMode() + { + return $this->_execute_mode; + } + + /** + * @param integer $mode + * @return void + */ + public function _setExecuteMode($mode) + { + switch ($mode) { + case DB2_AUTOCOMMIT_OFF: + case DB2_AUTOCOMMIT_ON: + $this->_execute_mode = $mode; + db2_autocommit($this->_connection, $mode); + break; + default: + /** + * @see Zend_Db_Adapter_Db2_Exception + */ + require_once 'Zend/Db/Adapter/Db2/Exception.php'; + throw new Zend_Db_Adapter_Db2_Exception("execution mode not supported"); + break; + } + } + + /** + * Quote a raw string. + * + * @param string $value Raw string + * @return string Quoted string + */ + protected function _quote($value) + { + if (is_int($value) || is_float($value)) { + return $value; + } + /** + * Use db2_escape_string() if it is present in the IBM DB2 extension. + * But some supported versions of PHP do not include this function, + * so fall back to default quoting in the parent class. + */ + if (function_exists('db2_escape_string')) { + return "'" . db2_escape_string($value) . "'"; + } + return parent::_quote($value); + } + + /** + * @return string + */ + public function getQuoteIdentifierSymbol() + { + $this->_connect(); + $info = db2_server_info($this->_connection); + $identQuote = $info->IDENTIFIER_QUOTE_CHAR; + return $identQuote; + } + + /** + * Returns a list of the tables in the database. + * + * @return array + */ + public function listTables() + { + $this->_connect(); + + // take the most general case and assume no z/OS + // since listTables() takes no parameters + $stmt = db2_tables($this->_connection); + + $tables = array(); + + while ($row = db2_fetch_assoc($stmt)) { + $tables[] = $row['TABLE_NAME']; + } + + return $tables; + } + + /** + * Returns the column descriptions for a table. + * + * The return value is an associative array keyed by the column name, + * as returned by the RDBMS. + * + * The value of each array element is an associative array + * with the following keys: + * + * SCHEMA_NAME => string; name of database or schema + * TABLE_NAME => string; + * COLUMN_NAME => string; column name + * COLUMN_POSITION => number; ordinal position of column in table + * DATA_TYPE => string; SQL datatype name of column + * DEFAULT => string; default expression of column, null if none + * NULLABLE => boolean; true if column can have nulls + * LENGTH => number; length of CHAR/VARCHAR + * SCALE => number; scale of NUMERIC/DECIMAL + * PRECISION => number; precision of NUMERIC/DECIMAL + * UNSIGNED => boolean; unsigned property of an integer type + * PRIMARY => boolean; true if column is part of the primary key + * PRIMARY_POSITION => integer; position of column in primary key + * IDENTITY => integer; true if column is auto-generated with unique values + * + * @todo Discover integer unsigned property. + * + * @param string $tableName + * @param string $schemaName OPTIONAL + * @return array + */ + public function describeTable($tableName, $schemaName = null) + { + $sql = "SELECT DISTINCT c.tabschema, c.tabname, c.colname, c.colno, + c.typename, c.default, c.nulls, c.length, c.scale, + c.identity, tc.type AS tabconsttype, k.colseq + FROM syscat.columns c + LEFT JOIN (syscat.keycoluse k JOIN syscat.tabconst tc + ON (k.tabschema = tc.tabschema + AND k.tabname = tc.tabname + AND tc.type = 'P')) + ON (c.tabschema = k.tabschema + AND c.tabname = k.tabname + AND c.colname = k.colname) + WHERE " + . $this->quoteInto('UPPER(c.tabname) = UPPER(?)', $tableName); + if ($schemaName) { + $sql .= $this->quoteInto(' AND UPPER(c.tabschema) = UPPER(?)', $schemaName); + } + $sql .= " ORDER BY c.colno"; + + $desc = array(); + $stmt = $this->query($sql); + + /** + * To avoid case issues, fetch using FETCH_NUM + */ + $result = $stmt->fetchAll(Zend_Db::FETCH_NUM); + + /** + * The ordering of columns is defined by the query so we can map + * to variables to improve readability + */ + $tabschema = 0; + $tabname = 1; + $colname = 2; + $colno = 3; + $typename = 4; + $default = 5; + $nulls = 6; + $length = 7; + $scale = 8; + $identityCol = 9; + $tabconstype = 10; + $colseq = 11; + + foreach ($result as $key => $row) { + list ($primary, $primaryPosition, $identity) = array(false, null, false); + if ($row[$tabconstype] == 'P') { + $primary = true; + $primaryPosition = $row[$colseq]; + } + /** + * In IBM DB2, an column can be IDENTITY + * even if it is not part of the PRIMARY KEY. + */ + if ($row[$identityCol] == 'Y') { + $identity = true; + } + + // only colname needs to be case adjusted + $desc[$this->foldCase($row[$colname])] = array( + 'SCHEMA_NAME' => $this->foldCase($row[$tabschema]), + 'TABLE_NAME' => $this->foldCase($row[$tabname]), + 'COLUMN_NAME' => $this->foldCase($row[$colname]), + 'COLUMN_POSITION' => $row[$colno]+1, + 'DATA_TYPE' => $row[$typename], + 'DEFAULT' => $row[$default], + 'NULLABLE' => (bool) ($row[$nulls] == 'Y'), + 'LENGTH' => $row[$length], + 'SCALE' => $row[$scale], + 'PRECISION' => ($row[$typename] == 'DECIMAL' ? $row[$length] : 0), + 'UNSIGNED' => null, // @todo + 'PRIMARY' => $primary, + 'PRIMARY_POSITION' => $primaryPosition, + 'IDENTITY' => $identity + ); + } + + return $desc; + } + + /** + * Return the most recent value from the specified sequence in the database. + * This is supported only on RDBMS brands that support sequences + * (e.g. Oracle, PostgreSQL, DB2). Other RDBMS brands return null. + * + * @param string $sequenceName + * @return string + */ + public function lastSequenceId($sequenceName) + { + $this->_connect(); + $sql = 'SELECT PREVVAL FOR '.$this->quoteIdentifier($sequenceName, true).' AS VAL FROM SYSIBM.SYSDUMMY1'; + $value = $this->fetchOne($sql); + return (string) $value; + } + + /** + * Generate a new value from the specified sequence in the database, and return it. + * This is supported only on RDBMS brands that support sequences + * (e.g. Oracle, PostgreSQL, DB2). Other RDBMS brands return null. + * + * @param string $sequenceName + * @return string + */ + public function nextSequenceId($sequenceName) + { + $this->_connect(); + $sql = 'SELECT NEXTVAL FOR '.$this->quoteIdentifier($sequenceName, true).' AS VAL FROM SYSIBM.SYSDUMMY1'; + $value = $this->fetchOne($sql); + return (string) $value; + } + + /** + * Gets the last ID generated automatically by an IDENTITY/AUTOINCREMENT column. + * + * As a convention, on RDBMS brands that support sequences + * (e.g. Oracle, PostgreSQL, DB2), this method forms the name of a sequence + * from the arguments and returns the last id generated by that sequence. + * On RDBMS brands that support IDENTITY/AUTOINCREMENT columns, this method + * returns the last value generated for such a column, and the table name + * argument is disregarded. + * + * The IDENTITY_VAL_LOCAL() function gives the last generated identity value + * in the current process, even if it was for a GENERATED column. + * + * @param string $tableName OPTIONAL + * @param string $primaryKey OPTIONAL + * @return string + */ + public function lastInsertId($tableName = null, $primaryKey = null) + { + $this->_connect(); + + if ($tableName !== null) { + $sequenceName = $tableName; + if ($primaryKey) { + $sequenceName .= "_$primaryKey"; + } + $sequenceName .= '_seq'; + return $this->lastSequenceId($sequenceName); + } + + $sql = 'SELECT IDENTITY_VAL_LOCAL() AS VAL FROM SYSIBM.SYSDUMMY1'; + $value = $this->fetchOne($sql); + return (string) $value; + } + + /** + * Begin a transaction. + * + * @return void + */ + protected function _beginTransaction() + { + $this->_setExecuteMode(DB2_AUTOCOMMIT_OFF); + } + + /** + * Commit a transaction. + * + * @return void + */ + protected function _commit() + { + if (!db2_commit($this->_connection)) { + /** + * @see Zend_Db_Adapter_Db2_Exception + */ + require_once 'Zend/Db/Adapter/Db2/Exception.php'; + throw new Zend_Db_Adapter_Db2_Exception( + db2_conn_errormsg($this->_connection), + db2_conn_error($this->_connection)); + } + + $this->_setExecuteMode(DB2_AUTOCOMMIT_ON); + } + + /** + * Rollback a transaction. + * + * @return void + */ + protected function _rollBack() + { + if (!db2_rollback($this->_connection)) { + /** + * @see Zend_Db_Adapter_Db2_Exception + */ + require_once 'Zend/Db/Adapter/Db2/Exception.php'; + throw new Zend_Db_Adapter_Db2_Exception( + db2_conn_errormsg($this->_connection), + db2_conn_error($this->_connection)); + } + $this->_setExecuteMode(DB2_AUTOCOMMIT_ON); + } + + /** + * Set the fetch mode. + * + * @param integer $mode + * @return void + * @throws Zend_Db_Adapter_Db2_Exception + */ + public function setFetchMode($mode) + { + switch ($mode) { + case Zend_Db::FETCH_NUM: // seq array + case Zend_Db::FETCH_ASSOC: // assoc array + case Zend_Db::FETCH_BOTH: // seq+assoc array + case Zend_Db::FETCH_OBJ: // object + $this->_fetchMode = $mode; + break; + case Zend_Db::FETCH_BOUND: // bound to PHP variable + /** + * @see Zend_Db_Adapter_Db2_Exception + */ + require_once 'Zend/Db/Adapter/Db2/Exception.php'; + throw new Zend_Db_Adapter_Db2_Exception('FETCH_BOUND is not supported yet'); + break; + default: + /** + * @see Zend_Db_Adapter_Db2_Exception + */ + require_once 'Zend/Db/Adapter/Db2/Exception.php'; + throw new Zend_Db_Adapter_Db2_Exception("Invalid fetch mode '$mode' specified"); + break; + } + } + + /** + * Adds an adapter-specific LIMIT clause to the SELECT statement. + * + * @param string $sql + * @param integer $count + * @param integer $offset OPTIONAL + * @return string + */ + public function limit($sql, $count, $offset = 0) + { + $count = intval($count); + if ($count <= 0) { + /** + * @see Zend_Db_Adapter_Db2_Exception + */ + require_once 'Zend/Db/Adapter/Db2/Exception.php'; + throw new Zend_Db_Adapter_Db2_Exception("LIMIT argument count=$count is not valid"); + } + + $offset = intval($offset); + if ($offset < 0) { + /** + * @see Zend_Db_Adapter_Db2_Exception + */ + require_once 'Zend/Db/Adapter/Db2/Exception.php'; + throw new Zend_Db_Adapter_Db2_Exception("LIMIT argument offset=$offset is not valid"); + } + + if ($offset == 0) { + $limit_sql = $sql . " FETCH FIRST $count ROWS ONLY"; + return $limit_sql; + } + + /** + * DB2 does not implement the LIMIT clause as some RDBMS do. + * We have to simulate it with subqueries and ROWNUM. + * Unfortunately because we use the column wildcard "*", + * this puts an extra column into the query result set. + */ + $limit_sql = "SELECT z2.* + FROM ( + SELECT ROW_NUMBER() OVER() AS \"ZEND_DB_ROWNUM\", z1.* + FROM ( + " . $sql . " + ) z1 + ) z2 + WHERE z2.zend_db_rownum BETWEEN " . ($offset+1) . " AND " . ($offset+$count); + return $limit_sql; + } + + /** + * Check if the adapter supports real SQL parameters. + * + * @param string $type 'positional' or 'named' + * @return bool + */ + public function supportsParameters($type) + { + switch ($type) { + case 'positional': + return true; + case 'named': + default: + return false; + } + } + +} diff --git a/libs/Zend/Db/Adapter/Db2/Exception.php b/libs/Zend/Db/Adapter/Db2/Exception.php new file mode 100644 index 0000000..c4c88af --- /dev/null +++ b/libs/Zend/Db/Adapter/Db2/Exception.php @@ -0,0 +1,43 @@ +message = $msg; + $this->code = $state; + } +} diff --git a/libs/Zend/Db/Adapter/Exception.php b/libs/Zend/Db/Adapter/Exception.php new file mode 100644 index 0000000..5630846 --- /dev/null +++ b/libs/Zend/Db/Adapter/Exception.php @@ -0,0 +1,52 @@ +_chainedException = $e; + $this->code = $e->getCode(); + } + parent::__construct($message); + } + + public function getChainedException() + { + return $this->_chainedException; + } + +} diff --git a/libs/Zend/Db/Adapter/Mysqli.php b/libs/Zend/Db/Adapter/Mysqli.php new file mode 100644 index 0000000..9a22f17 --- /dev/null +++ b/libs/Zend/Db/Adapter/Mysqli.php @@ -0,0 +1,498 @@ + Zend_Db::INT_TYPE, + Zend_Db::BIGINT_TYPE => Zend_Db::BIGINT_TYPE, + Zend_Db::FLOAT_TYPE => Zend_Db::FLOAT_TYPE, + 'INT' => Zend_Db::INT_TYPE, + 'INTEGER' => Zend_Db::INT_TYPE, + 'MEDIUMINT' => Zend_Db::INT_TYPE, + 'SMALLINT' => Zend_Db::INT_TYPE, + 'TINYINT' => Zend_Db::INT_TYPE, + 'BIGINT' => Zend_Db::BIGINT_TYPE, + 'SERIAL' => Zend_Db::BIGINT_TYPE, + 'DEC' => Zend_Db::FLOAT_TYPE, + 'DECIMAL' => Zend_Db::FLOAT_TYPE, + 'DOUBLE' => Zend_Db::FLOAT_TYPE, + 'DOUBLE PRECISION' => Zend_Db::FLOAT_TYPE, + 'FIXED' => Zend_Db::FLOAT_TYPE, + 'FLOAT' => Zend_Db::FLOAT_TYPE + ); + + /** + * @var Zend_Db_Statement_Mysqli + */ + protected $_stmt = null; + + /** + * Default class name for a DB statement. + * + * @var string + */ + protected $_defaultStmtClass = 'Zend_Db_Statement_Mysqli'; + + /** + * Quote a raw string. + * + * @param mixed $value Raw string + * + * @return string Quoted string + */ + protected function _quote($value) + { + if (is_int($value) || is_float($value)) { + return $value; + } + $this->_connect(); + return "'" . $this->_connection->real_escape_string($value) . "'"; + } + + /** + * Returns the symbol the adapter uses for delimiting identifiers. + * + * @return string + */ + public function getQuoteIdentifierSymbol() + { + return "`"; + } + + /** + * Returns a list of the tables in the database. + * + * @return array + */ + public function listTables() + { + $result = array(); + // Use mysqli extension API, because SHOW doesn't work + // well as a prepared statement on MySQL 4.1. + $sql = 'SHOW TABLES'; + if ($queryResult = $this->getConnection()->query($sql)) { + while ($row = $queryResult->fetch_row()) { + $result[] = $row[0]; + } + $queryResult->close(); + } else { + /** + * @see Zend_Db_Adapter_Mysqli_Exception + */ + require_once 'Zend/Db/Adapter/Mysqli/Exception.php'; + throw new Zend_Db_Adapter_Mysqli_Exception($this->getConnection()->error); + } + return $result; + } + + /** + * Returns the column descriptions for a table. + * + * The return value is an associative array keyed by the column name, + * as returned by the RDBMS. + * + * The value of each array element is an associative array + * with the following keys: + * + * SCHEMA_NAME => string; name of database or schema + * TABLE_NAME => string; + * COLUMN_NAME => string; column name + * COLUMN_POSITION => number; ordinal position of column in table + * DATA_TYPE => string; SQL datatype name of column + * DEFAULT => string; default expression of column, null if none + * NULLABLE => boolean; true if column can have nulls + * LENGTH => number; length of CHAR/VARCHAR + * SCALE => number; scale of NUMERIC/DECIMAL + * PRECISION => number; precision of NUMERIC/DECIMAL + * UNSIGNED => boolean; unsigned property of an integer type + * PRIMARY => boolean; true if column is part of the primary key + * PRIMARY_POSITION => integer; position of column in primary key + * IDENTITY => integer; true if column is auto-generated with unique values + * + * @param string $tableName + * @param string $schemaName OPTIONAL + * @return array + */ + public function describeTable($tableName, $schemaName = null) + { + /** + * @todo use INFORMATION_SCHEMA someday when + * MySQL's implementation isn't too slow. + */ + + if ($schemaName) { + $sql = 'DESCRIBE ' . $this->quoteIdentifier("$schemaName.$tableName", true); + } else { + $sql = 'DESCRIBE ' . $this->quoteIdentifier($tableName, true); + } + + /** + * Use mysqli extension API, because DESCRIBE doesn't work + * well as a prepared statement on MySQL 4.1. + */ + if ($queryResult = $this->getConnection()->query($sql)) { + while ($row = $queryResult->fetch_assoc()) { + $result[] = $row; + } + $queryResult->close(); + } else { + /** + * @see Zend_Db_Adapter_Mysqli_Exception + */ + require_once 'Zend/Db/Adapter/Mysqli/Exception.php'; + throw new Zend_Db_Adapter_Mysqli_Exception($this->getConnection()->error); + } + + $desc = array(); + + $row_defaults = array( + 'Length' => null, + 'Scale' => null, + 'Precision' => null, + 'Unsigned' => null, + 'Primary' => false, + 'PrimaryPosition' => null, + 'Identity' => false + ); + $i = 1; + $p = 1; + foreach ($result as $key => $row) { + $row = array_merge($row_defaults, $row); + if (preg_match('/unsigned/', $row['Type'])) { + $row['Unsigned'] = true; + } + if (preg_match('/^((?:var)?char)\((\d+)\)/', $row['Type'], $matches)) { + $row['Type'] = $matches[1]; + $row['Length'] = $matches[2]; + } else if (preg_match('/^decimal\((\d+),(\d+)\)/', $row['Type'], $matches)) { + $row['Type'] = 'decimal'; + $row['Precision'] = $matches[1]; + $row['Scale'] = $matches[2]; + } else if (preg_match('/^((?:big|medium|small|tiny)?int)\((\d+)\)/', $row['Type'], $matches)) { + $row['Type'] = $matches[1]; + /** + * The optional argument of a MySQL int type is not precision + * or length; it is only a hint for display width. + */ + } + if (strtoupper($row['Key']) == 'PRI') { + $row['Primary'] = true; + $row['PrimaryPosition'] = $p; + if ($row['Extra'] == 'auto_increment') { + $row['Identity'] = true; + } else { + $row['Identity'] = false; + } + ++$p; + } + $desc[$this->foldCase($row['Field'])] = array( + 'SCHEMA_NAME' => null, // @todo + 'TABLE_NAME' => $this->foldCase($tableName), + 'COLUMN_NAME' => $this->foldCase($row['Field']), + 'COLUMN_POSITION' => $i, + 'DATA_TYPE' => $row['Type'], + 'DEFAULT' => $row['Default'], + 'NULLABLE' => (bool) ($row['Null'] == 'YES'), + 'LENGTH' => $row['Length'], + 'SCALE' => $row['Scale'], + 'PRECISION' => $row['Precision'], + 'UNSIGNED' => $row['Unsigned'], + 'PRIMARY' => $row['Primary'], + 'PRIMARY_POSITION' => $row['PrimaryPosition'], + 'IDENTITY' => $row['Identity'] + ); + ++$i; + } + return $desc; + } + + /** + * Creates a connection to the database. + * + * @return void + * @throws Zend_Db_Adapter_Mysqli_Exception + */ + protected function _connect() + { + if ($this->_connection) { + return; + } + + if (!extension_loaded('mysqli')) { + /** + * @see Zend_Db_Adapter_Mysqli_Exception + */ + require_once 'Zend/Db/Adapter/Mysqli/Exception.php'; + throw new Zend_Db_Adapter_Mysqli_Exception('The Mysqli extension is required for this adapter but the extension is not loaded'); + } + + if (isset($this->_config['port'])) { + $port = (integer) $this->_config['port']; + } else { + $port = null; + } + + // Suppress connection warnings here. + // Throw an exception instead. + @$this->_connection = new mysqli( + $this->_config['host'], + $this->_config['username'], + $this->_config['password'], + $this->_config['dbname'], + $port + ); + if ($this->_connection === false || mysqli_connect_errno()) { + /** + * @see Zend_Db_Adapter_Mysqli_Exception + */ + require_once 'Zend/Db/Adapter/Mysqli/Exception.php'; + throw new Zend_Db_Adapter_Mysqli_Exception(mysqli_connect_error()); + } + } + + /** + * Force the connection to close. + * + * @return void + */ + public function closeConnection() + { + $this->_connection->close(); + $this->_connection = null; + } + + /** + * Prepare a statement and return a PDOStatement-like object. + * + * @param string $sql SQL query + * @return Zend_Db_Statement_Mysqli + */ + public function prepare($sql) + { + $this->_connect(); + if ($this->_stmt) { + $this->_stmt->close(); + } + $stmtClass = $this->_defaultStmtClass; + Zend_Loader::loadClass($stmtClass); + $stmt = new $stmtClass($this, $sql); + if ($stmt === false) { + return false; + } + $stmt->setFetchMode($this->_fetchMode); + $this->_stmt = $stmt; + return $stmt; + } + + /** + * Gets the last ID generated automatically by an IDENTITY/AUTOINCREMENT column. + * + * As a convention, on RDBMS brands that support sequences + * (e.g. Oracle, PostgreSQL, DB2), this method forms the name of a sequence + * from the arguments and returns the last id generated by that sequence. + * On RDBMS brands that support IDENTITY/AUTOINCREMENT columns, this method + * returns the last value generated for such a column, and the table name + * argument is disregarded. + * + * MySQL does not support sequences, so $tableName and $primaryKey are ignored. + * + * @param string $tableName OPTIONAL Name of table. + * @param string $primaryKey OPTIONAL Name of primary key column. + * @return string + * @todo Return value should be int? + */ + public function lastInsertId($tableName = null, $primaryKey = null) + { + $mysqli = $this->_connection; + return (string) $mysqli->insert_id; + } + + /** + * Begin a transaction. + * + * @return void + */ + protected function _beginTransaction() + { + $this->_connect(); + $this->_connection->autocommit(false); + } + + /** + * Commit a transaction. + * + * @return void + */ + protected function _commit() + { + $this->_connect(); + $this->_connection->commit(); + $this->_connection->autocommit(true); + } + + /** + * Roll-back a transaction. + * + * @return void + */ + protected function _rollBack() + { + $this->_connect(); + $this->_connection->rollback(); + $this->_connection->autocommit(true); + } + + /** + * Set the fetch mode. + * + * @param int $mode + * @return void + * @throws Zend_Db_Adapter_Mysqli_Exception + */ + public function setFetchMode($mode) + { + switch ($mode) { + case Zend_Db::FETCH_LAZY: + case Zend_Db::FETCH_ASSOC: + case Zend_Db::FETCH_NUM: + case Zend_Db::FETCH_BOTH: + case Zend_Db::FETCH_NAMED: + case Zend_Db::FETCH_OBJ: + $this->_fetchMode = $mode; + break; + case Zend_Db::FETCH_BOUND: // bound to PHP variable + /** + * @see Zend_Db_Adapter_Mysqli_Exception + */ + require_once 'Zend/Db/Adapter/Mysqli/Exception.php'; + throw new Zend_Db_Adapter_Mysqli_Exception('FETCH_BOUND is not supported yet'); + break; + default: + /** + * @see Zend_Db_Adapter_Mysqli_Exception + */ + require_once 'Zend/Db/Adapter/Mysqli/Exception.php'; + throw new Zend_Db_Adapter_Mysqli_Exception("Invalid fetch mode '$mode' specified"); + } + } + + /** + * Adds an adapter-specific LIMIT clause to the SELECT statement. + * + * @param string $sql + * @param int $count + * @param int $offset OPTIONAL + * @return string + */ + public function limit($sql, $count, $offset = 0) + { + $count = intval($count); + if ($count <= 0) { + /** + * @see Zend_Db_Adapter_Mysqli_Exception + */ + require_once 'Zend/Db/Adapter/Mysqli/Exception.php'; + throw new Zend_Db_Adapter_Mysqli_Exception("LIMIT argument count=$count is not valid"); + } + + $offset = intval($offset); + if ($offset < 0) { + /** + * @see Zend_Db_Adapter_Mysqli_Exception + */ + require_once 'Zend/Db/Adapter/Mysqli/Exception.php'; + throw new Zend_Db_Adapter_Mysqli_Exception("LIMIT argument offset=$offset is not valid"); + } + + $sql .= " LIMIT $count"; + if ($offset > 0) { + $sql .= " OFFSET $offset"; + } + + return $sql; + } + + /** + * Check if the adapter supports real SQL parameters. + * + * @param string $type 'positional' or 'named' + * @return bool + */ + public function supportsParameters($type) + { + switch ($type) { + case 'positional': + return true; + case 'named': + default: + return false; + } + } + +} diff --git a/libs/Zend/Db/Adapter/Mysqli/Exception.php b/libs/Zend/Db/Adapter/Mysqli/Exception.php new file mode 100644 index 0000000..25d1ddc --- /dev/null +++ b/libs/Zend/Db/Adapter/Mysqli/Exception.php @@ -0,0 +1,39 @@ + (string) Connect to the database as this username. + * password => (string) Password associated with the username. + * dbname => Either the name of the local Oracle instance, or the + * name of the entry in tnsnames.ora to which you want to connect. + * + * @var array + */ + protected $_config = array( + 'dbname' => null, + 'username' => null, + 'password' => null, + ); + + /** + * Keys are UPPERCASE SQL datatypes or the constants + * Zend_Db::INT_TYPE, Zend_Db::BIGINT_TYPE, or Zend_Db::FLOAT_TYPE. + * + * Values are: + * 0 = 32-bit integer + * 1 = 64-bit integer + * 2 = float or decimal + * + * @var array Associative array of datatypes to values 0, 1, or 2. + */ + protected $_numericDataTypes = array( + Zend_Db::INT_TYPE => Zend_Db::INT_TYPE, + Zend_Db::BIGINT_TYPE => Zend_Db::BIGINT_TYPE, + Zend_Db::FLOAT_TYPE => Zend_Db::FLOAT_TYPE, + 'BINARY_DOUBLE' => Zend_Db::FLOAT_TYPE, + 'BINARY_FLOAT' => Zend_Db::FLOAT_TYPE, + 'NUMBER' => Zend_Db::FLOAT_TYPE, + ); + + /** + * @var integer + */ + protected $_execute_mode = OCI_COMMIT_ON_SUCCESS; + + /** + * Default class name for a DB statement. + * + * @var string + */ + protected $_defaultStmtClass = 'Zend_Db_Statement_Oracle'; + + /** + * Creates a connection resource. + * + * @return void + * @throws Zend_Db_Adapter_Oracle_Exception + */ + protected function _connect() + { + if (is_resource($this->_connection)) { + // connection already exists + return; + } + + if (!extension_loaded('oci8')) { + /** + * @see Zend_Db_Adapter_Oracle_Exception + */ + require_once 'Zend/Db/Adapter/Oracle/Exception.php'; + throw new Zend_Db_Adapter_Oracle_Exception('The OCI8 extension is required for this adapter but the extension is not loaded'); + } + + if (isset($this->_config['dbname'])) { + $this->_connection = @oci_connect( + $this->_config['username'], + $this->_config['password'], + $this->_config['dbname']); + } else { + $this->_connection = oci_connect( + $this->_config['username'], + $this->_config['password']); + } + + // check the connection + if (!$this->_connection) { + /** + * @see Zend_Db_Adapter_Oracle_Exception + */ + require_once 'Zend/Db/Adapter/Oracle/Exception.php'; + throw new Zend_Db_Adapter_Oracle_Exception(oci_error()); + } + } + + /** + * Force the connection to close. + * + * @return void + */ + public function closeConnection() + { + if (is_resource($this->_connection)) { + oci_close($this->_connection); + } + $this->_connection = null; + } + + /** + * Returns an SQL statement for preparation. + * + * @param string $sql The SQL statement with placeholders. + * @return Zend_Db_Statement_Oracle + */ + public function prepare($sql) + { + $this->_connect(); + $stmtClass = $this->_defaultStmtClass; + Zend_Loader::loadClass($stmtClass); + $stmt = new $stmtClass($this, $sql); + $stmt->setFetchMode($this->_fetchMode); + return $stmt; + } + + /** + * Quote a raw string. + * + * @param string $value Raw string + * @return string Quoted string + */ + protected function _quote($value) + { + if (is_int($value) || is_float($value)) { + return $value; + } + $value = str_replace("'", "''", $value); + return "'" . addcslashes($value, "\000\n\r\\\032") . "'"; + } + + /** + * Quote a table identifier and alias. + * + * @param string|array|Zend_Db_Expr $ident The identifier or expression. + * @param string $alias An alias for the table. + * @param boolean $auto If true, heed the AUTO_QUOTE_IDENTIFIERS config option. + * @return string The quoted identifier and alias. + */ + public function quoteTableAs($ident, $alias = null, $auto = false) + { + // Oracle doesn't allow the 'AS' keyword between the table identifier/expression and alias. + return $this->_quoteIdentifierAs($ident, $alias, $auto, ' '); + } + + /** + * Return the most recent value from the specified sequence in the database. + * This is supported only on RDBMS brands that support sequences + * (e.g. Oracle, PostgreSQL, DB2). Other RDBMS brands return null. + * + * @param string $sequenceName + * @return string + */ + public function lastSequenceId($sequenceName) + { + $this->_connect(); + $sql = 'SELECT '.$this->quoteIdentifier($sequenceName, true).'.CURRVAL FROM dual'; + $value = $this->fetchOne($sql); + return $value; + } + + /** + * Generate a new value from the specified sequence in the database, and return it. + * This is supported only on RDBMS brands that support sequences + * (e.g. Oracle, PostgreSQL, DB2). Other RDBMS brands return null. + * + * @param string $sequenceName + * @return string + */ + public function nextSequenceId($sequenceName) + { + $this->_connect(); + $sql = 'SELECT '.$this->quoteIdentifier($sequenceName, true).'.NEXTVAL FROM dual'; + $value = $this->fetchOne($sql); + return $value; + } + + /** + * Gets the last ID generated automatically by an IDENTITY/AUTOINCREMENT column. + * + * As a convention, on RDBMS brands that support sequences + * (e.g. Oracle, PostgreSQL, DB2), this method forms the name of a sequence + * from the arguments and returns the last id generated by that sequence. + * On RDBMS brands that support IDENTITY/AUTOINCREMENT columns, this method + * returns the last value generated for such a column, and the table name + * argument is disregarded. + * + * Oracle does not support IDENTITY columns, so if the sequence is not + * specified, this method returns null. + * + * @param string $tableName OPTIONAL Name of table. + * @param string $primaryKey OPTIONAL Name of primary key column. + * @return string + */ + public function lastInsertId($tableName = null, $primaryKey = null) + { + if ($tableName !== null) { + $sequenceName = $tableName; + if ($primaryKey) { + $sequenceName .= "_$primaryKey"; + } + $sequenceName .= '_seq'; + return $this->lastSequenceId($sequenceName); + } + + // No support for IDENTITY columns; return null + return null; + } + + /** + * Returns a list of the tables in the database. + * + * @return array + */ + public function listTables() + { + $this->_connect(); + $data = $this->fetchCol('SELECT table_name FROM all_tables'); + return $data; + } + + /** + * Returns the column descriptions for a table. + * + * The return value is an associative array keyed by the column name, + * as returned by the RDBMS. + * + * The value of each array element is an associative array + * with the following keys: + * + * SCHEMA_NAME => string; name of schema + * TABLE_NAME => string; + * COLUMN_NAME => string; column name + * COLUMN_POSITION => number; ordinal position of column in table + * DATA_TYPE => string; SQL datatype name of column + * DEFAULT => string; default expression of column, null if none + * NULLABLE => boolean; true if column can have nulls + * LENGTH => number; length of CHAR/VARCHAR + * SCALE => number; scale of NUMERIC/DECIMAL + * PRECISION => number; precision of NUMERIC/DECIMAL + * UNSIGNED => boolean; unsigned property of an integer type + * PRIMARY => boolean; true if column is part of the primary key + * PRIMARY_POSITION => integer; position of column in primary key + * IDENTITY => integer; true if column is auto-generated with unique values + * + * @todo Discover integer unsigned property. + * + * @param string $tableName + * @param string $schemaName OPTIONAL + * @return array + */ + public function describeTable($tableName, $schemaName = null) + { + $sql = "SELECT TC.TABLE_NAME, TB.OWNER, TC.COLUMN_NAME, TC.DATA_TYPE, + TC.DATA_DEFAULT, TC.NULLABLE, TC.COLUMN_ID, TC.DATA_LENGTH, + 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 TC.TABLE_NAME = CC.TABLE_NAME AND TC.COLUMN_NAME = CC.COLUMN_NAME + JOIN ALL_TABLES TB ON (TB.TABLE_NAME = TC.TABLE_NAME AND TB.OWNER = TC.OWNER) + WHERE UPPER(TC.TABLE_NAME) = UPPER(:TBNAME)"; + $bind[':TBNAME'] = $tableName; + if ($schemaName) { + $sql .= ' AND UPPER(TB.OWNER) = UPPER(:SCNAME)'; + $bind[':SCNAME'] = $schemaName; + } + $sql .= ' ORDER BY TC.COLUMN_ID'; + + $stmt = $this->query($sql, $bind); + + /** + * Use FETCH_NUM so we are not dependent on the CASE attribute of the PDO connection + */ + $result = $stmt->fetchAll(Zend_Db::FETCH_NUM); + + $table_name = 0; + $owner = 1; + $column_name = 2; + $data_type = 3; + $data_default = 4; + $nullable = 5; + $column_id = 6; + $data_length = 7; + $data_scale = 8; + $data_precision = 9; + $constraint_type = 10; + $position = 11; + + $desc = array(); + foreach ($result as $key => $row) { + list ($primary, $primaryPosition, $identity) = array(false, null, false); + if ($row[$constraint_type] == 'P') { + $primary = true; + $primaryPosition = $row[$position]; + /** + * Oracle does not support auto-increment keys. + */ + $identity = false; + } + $desc[$this->foldCase($row[$column_name])] = array( + 'SCHEMA_NAME' => $this->foldCase($row[$owner]), + 'TABLE_NAME' => $this->foldCase($row[$table_name]), + 'COLUMN_NAME' => $this->foldCase($row[$column_name]), + 'COLUMN_POSITION' => $row[$column_id], + 'DATA_TYPE' => $row[$data_type], + 'DEFAULT' => $row[$data_default], + 'NULLABLE' => (bool) ($row[$nullable] == 'Y'), + 'LENGTH' => $row[$data_length], + 'SCALE' => $row[$data_scale], + 'PRECISION' => $row[$data_precision], + 'UNSIGNED' => null, // @todo + 'PRIMARY' => $primary, + 'PRIMARY_POSITION' => $primaryPosition, + 'IDENTITY' => $identity + ); + } + return $desc; + } + + /** + * Leave autocommit mode and begin a transaction. + * + * @return void + */ + protected function _beginTransaction() + { + $this->_setExecuteMode(OCI_DEFAULT); + } + + /** + * Commit a transaction and return to autocommit mode. + * + * @return void + * @throws Zend_Db_Adapter_Oracle_Exception + */ + protected function _commit() + { + if (!oci_commit($this->_connection)) { + /** + * @see Zend_Db_Adapter_Oracle_Exception + */ + require_once 'Zend/Db/Adapter/Oracle/Exception.php'; + throw new Zend_Db_Adapter_Oracle_Exception(oci_error($this->_connection)); + } + $this->_setExecuteMode(OCI_COMMIT_ON_SUCCESS); + } + + /** + * Roll back a transaction and return to autocommit mode. + * + * @return void + * @throws Zend_Db_Adapter_Oracle_Exception + */ + protected function _rollBack() + { + if (!oci_rollback($this->_connection)) { + /** + * @see Zend_Db_Adapter_Oracle_Exception + */ + require_once 'Zend/Db/Adapter/Oracle/Exception.php'; + throw new Zend_Db_Adapter_Oracle_Exception(oci_error($this->_connection)); + } + $this->_setExecuteMode(OCI_COMMIT_ON_SUCCESS); + } + + /** + * Set the fetch mode. + * + * @todo Support FETCH_CLASS and FETCH_INTO. + * + * @param integer $mode A fetch mode. + * @return void + * @throws Zend_Db_Adapter_Oracle_Exception + */ + public function setFetchMode($mode) + { + switch ($mode) { + case Zend_Db::FETCH_NUM: // seq array + case Zend_Db::FETCH_ASSOC: // assoc array + case Zend_Db::FETCH_BOTH: // seq+assoc array + case Zend_Db::FETCH_OBJ: // object + $this->_fetchMode = $mode; + break; + case Zend_Db::FETCH_BOUND: // bound to PHP variable + /** + * @see Zend_Db_Adapter_Oracle_Exception + */ + require_once 'Zend/Db/Adapter/Oracle/Exception.php'; + throw new Zend_Db_Adapter_Oracle_Exception('FETCH_BOUND is not supported yet'); + break; + default: + /** + * @see Zend_Db_Adapter_Oracle_Exception + */ + require_once 'Zend/Db/Adapter/Oracle/Exception.php'; + throw new Zend_Db_Adapter_Oracle_Exception("Invalid fetch mode '$mode' specified"); + break; + } + } + + /** + * Adds an adapter-specific LIMIT clause to the SELECT statement. + * + * @param string $sql + * @param integer $count + * @param integer $offset OPTIONAL + * @return string + * @throws Zend_Db_Adapter_Oracle_Exception + */ + public function limit($sql, $count, $offset = 0) + { + $count = intval($count); + if ($count <= 0) { + /** + * @see Zend_Db_Adapter_Oracle_Exception + */ + require_once 'Zend/Db/Adapter/Oracle/Exception.php'; + throw new Zend_Db_Adapter_Oracle_Exception("LIMIT argument count=$count is not valid"); + } + + $offset = intval($offset); + if ($offset < 0) { + /** + * @see Zend_Db_Adapter_Oracle_Exception + */ + require_once 'Zend/Db/Adapter/Oracle/Exception.php'; + throw new Zend_Db_Adapter_Oracle_Exception("LIMIT argument offset=$offset is not valid"); + } + + /** + * Oracle does not implement the LIMIT clause as some RDBMS do. + * We have to simulate it with subqueries and ROWNUM. + * Unfortunately because we use the column wildcard "*", + * this puts an extra column into the query result set. + */ + $limit_sql = "SELECT z2.* + FROM ( + SELECT ROWNUM AS zend_db_rownum, z1.* + FROM ( + " . $sql . " + ) z1 + ) z2 + WHERE z2.zend_db_rownum BETWEEN " . ($offset+1) . " AND " . ($offset+$count); + return $limit_sql; + } + + /** + * @param integer $mode + * @throws Zend_Db_Adapter_Oracle_Exception + */ + private function _setExecuteMode($mode) + { + switch($mode) { + case OCI_COMMIT_ON_SUCCESS: + case OCI_DEFAULT: + case OCI_DESCRIBE_ONLY: + $this->_execute_mode = $mode; + break; + default: + /** + * @see Zend_Db_Adapter_Oracle_Exception + */ + require_once 'Zend/Db/Adapter/Oracle/Exception.php'; + throw new Zend_Db_Adapter_Oracle_Exception("Invalid execution mode '$mode' specified"); + break; + } + } + + /** + * @return int + */ + public function _getExecuteMode() + { + return $this->_execute_mode; + } + + /** + * Inserts a table row with specified data. + * + * Oracle does not support anonymous ('?') binds. + * + * @param mixed $table The table to insert data into. + * @param array $bind Column-value pairs. + * @return int The number of affected rows. + */ + public function insert($table, array $bind) + { + $i = 0; + // extract and quote col names from the array keys + $cols = array(); + $vals = array(); + foreach ($bind as $col => $val) { + $cols[] = $this->quoteIdentifier($col, true); + if ($val instanceof Zend_Db_Expr) { + $vals[] = $val->__toString(); + unset($bind[$col]); + } else { + $vals[] = ':'.$col.$i; + unset($bind[$col]); + $bind[':'.$col.$i] = $val; + } + $i++; + } + + // build the statement + $sql = "INSERT INTO " + . $this->quoteIdentifier($table, true) + . ' (' . implode(', ', $cols) . ') ' + . 'VALUES (' . implode(', ', $vals) . ')'; + + // execute the statement and return the number of affected rows + $stmt = $this->query($sql, $bind); + $result = $stmt->rowCount(); + return $result; + } + + /** + * Updates table rows with specified data based on a WHERE clause. + * + * @param mixed $table The table to update. + * @param array $bind Column-value pairs. + * @param array|string $where UPDATE WHERE clause(s). + * @return int The number of affected rows. + */ + public function update($table, array $bind, $where = '') + { + $i = 0; + // build "col = ?" pairs for the statement + $set = array(); + foreach ($bind as $col => $val) { + if ($val instanceof Zend_Db_Expr) { + $val = $val->__toString(); + unset($bind[$col]); + } else { + unset($bind[$col]); + $bind[':'.$col.$i] = $val; + $val = ':'.$col.$i; + } + $set[] = $this->quoteIdentifier($col, true) . ' = ' . $val; + $i++; + } + + if (is_array($where)) { + $where = implode(' AND ', $where); + } + + // build the statement + $sql = "UPDATE " + . $this->quoteIdentifier($table, true) + . ' SET ' . implode(', ', $set) + . (($where) ? " WHERE $where" : ''); + + // execute the statement and return the number of affected rows + $stmt = $this->query($sql, $bind); + $result = $stmt->rowCount(); + return $result; + } + + /** + * Check if the adapter supports real SQL parameters. + * + * @param string $type 'positional' or 'named' + * @return bool + */ + public function supportsParameters($type) + { + switch ($type) { + case 'named': + return true; + case 'positional': + default: + return false; + } + } + +} + diff --git a/libs/Zend/Db/Adapter/Oracle/Exception.php b/libs/Zend/Db/Adapter/Oracle/Exception.php new file mode 100644 index 0000000..553c6fe --- /dev/null +++ b/libs/Zend/Db/Adapter/Oracle/Exception.php @@ -0,0 +1,59 @@ +message = $error['code'] .' '. $error['message']; + } else { + $this->message = $error['code'] .' '. $error['message']." " + . substr($error['sqltext'], 0, $error['offset']) + . "*" + . substr($error['sqltext'], $error['offset']); + } + $this->code = $error['code']; + } else if (is_string($error)) { + $this->message = $error; + } + if (!$this->code && $code) { + $this->code = $code; + } + } +} diff --git a/libs/Zend/Db/Adapter/Pdo/Abstract.php b/libs/Zend/Db/Adapter/Pdo/Abstract.php new file mode 100644 index 0000000..856f81b --- /dev/null +++ b/libs/Zend/Db/Adapter/Pdo/Abstract.php @@ -0,0 +1,326 @@ +_config settings. + * + * @return string + */ + protected function _dsn() + { + // baseline of DSN parts + $dsn = $this->_config; + + // don't pass the username, password, and driver_options in the DSN + unset($dsn['username']); + unset($dsn['password']); + unset($dsn['options']); + unset($dsn['driver_options']); + + // use all remaining parts in the DSN + foreach ($dsn as $key => $val) { + $dsn[$key] = "$key=$val"; + } + + return $this->_pdoType . ':' . implode(';', $dsn); + } + + /** + * Creates a PDO object and connects to the database. + * + * @return void + * @throws Zend_Db_Adapter_Exception + */ + protected function _connect() + { + // if we already have a PDO object, no need to re-connect. + if ($this->_connection) { + return; + } + + // get the dsn first, because some adapters alter the $_pdoType + $dsn = $this->_dsn(); + + // check for PDO extension + if (!extension_loaded('pdo')) { + /** + * @see Zend_Db_Adapter_Exception + */ + require_once 'Zend/Db/Adapter/Exception.php'; + throw new Zend_Db_Adapter_Exception('The PDO extension is required for this adapter but the extension is not loaded'); + } + + // check the PDO driver is available + if (!in_array($this->_pdoType, PDO::getAvailableDrivers())) { + /** + * @see Zend_Db_Adapter_Exception + */ + require_once 'Zend/Db/Adapter/Exception.php'; + throw new Zend_Db_Adapter_Exception('The ' . $this->_pdoType . ' driver is not currently installed'); + } + + // create PDO connection + $q = $this->_profiler->queryStart('connect', Zend_Db_Profiler::CONNECT); + + try { + $this->_connection = new PDO( + $dsn, + $this->_config['username'], + $this->_config['password'], + $this->_config['driver_options'] + ); + + $this->_profiler->queryEnd($q); + + // set the PDO connection to perform case-folding on array keys, or not + $this->_connection->setAttribute(PDO::ATTR_CASE, $this->_caseFolding); + + // always use exceptions. + $this->_connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + + } catch (PDOException $e) { + /** + * @see Zend_Db_Adapter_Exception + */ + require_once 'Zend/Db/Adapter/Exception.php'; + throw new Zend_Db_Adapter_Exception($e->getMessage()); + } + + } + + /** + * Force the connection to close. + * + * @return void + */ + public function closeConnection() + { + $this->_connection = null; + } + + /** + * Prepares an SQL statement. + * + * @param string $sql The SQL statement with placeholders. + * @param array $bind An array of data to bind to the placeholders. + * @return PDOStatement + */ + public function prepare($sql) + { + $this->_connect(); + $stmtClass = $this->_defaultStmtClass; + Zend_Loader::loadClass($stmtClass); + $stmt = new $stmtClass($this, $sql); + $stmt->setFetchMode($this->_fetchMode); + return $stmt; + } + + /** + * Gets the last ID generated automatically by an IDENTITY/AUTOINCREMENT column. + * + * As a convention, on RDBMS brands that support sequences + * (e.g. Oracle, PostgreSQL, DB2), this method forms the name of a sequence + * from the arguments and returns the last id generated by that sequence. + * On RDBMS brands that support IDENTITY/AUTOINCREMENT columns, this method + * returns the last value generated for such a column, and the table name + * argument is disregarded. + * + * On RDBMS brands that don't support sequences, $tableName and $primaryKey + * are ignored. + * + * @param string $tableName OPTIONAL Name of table. + * @param string $primaryKey OPTIONAL Name of primary key column. + * @return string + */ + public function lastInsertId($tableName = null, $primaryKey = null) + { + $this->_connect(); + return $this->_connection->lastInsertId(); + } + + /** + * Special handling for PDO query(). + * All bind parameter names must begin with ':' + * + * @param string|Zend_Db_Select $sql The SQL statement with placeholders. + * @param array $bind An array of data to bind to the placeholders. + * @return Zend_Db_Statement_Pdo + * @throws Zend_Db_Adapter_Exception To re-throw PDOException. + */ + public function query($sql, $bind = array()) + { + if (is_array($bind)) { + foreach ($bind as $name => $value) { + if (!is_int($name) && !preg_match('/^:/', $name)) { + $newName = ":$name"; + unset($bind[$name]); + $bind[$newName] = $value; + } + } + } + + try { + return parent::query($sql, $bind); + } catch (PDOException $e) { + /** + * @see Zend_Db_Statement_Exception + */ + require_once 'Zend/Db/Statement/Exception.php'; + throw new Zend_Db_Statement_Exception($e->getMessage()); + } + } + + /** + * Quote a raw string. + * + * @param string $value Raw string + * @return string Quoted string + */ + protected function _quote($value) + { + if (is_int($value) || is_float($value)) { + return $value; + } + $this->_connect(); + return $this->_connection->quote($value); + } + + /** + * Begin a transaction. + */ + protected function _beginTransaction() + { + $this->_connect(); + $this->_connection->beginTransaction(); + } + + /** + * Commit a transaction. + */ + protected function _commit() + { + $this->_connect(); + $this->_connection->commit(); + } + + /** + * Roll-back a transaction. + */ + protected function _rollBack() { + $this->_connect(); + $this->_connection->rollBack(); + } + + /** + * Set the PDO fetch mode. + * + * @todo Support FETCH_CLASS and FETCH_INTO. + * + * @param int $mode A PDO fetch mode. + * @return void + * @throws Zend_Db_Adapter_Exception + */ + public function setFetchMode($mode) + { + //check for PDO extension + if (!extension_loaded('pdo')) { + /** + * @see Zend_Db_Adapter_Exception + */ + require_once 'Zend/Db/Adapter/Exception.php'; + throw new Zend_Db_Adapter_Exception('The PDO extension is required for this adapter but the extension is not loaded'); + } + switch ($mode) { + case PDO::FETCH_LAZY: + case PDO::FETCH_ASSOC: + case PDO::FETCH_NUM: + case PDO::FETCH_BOTH: + case PDO::FETCH_NAMED: + case PDO::FETCH_OBJ: + $this->_fetchMode = $mode; + break; + default: + /** + * @see Zend_Db_Adapter_Exception + */ + require_once 'Zend/Db/Adapter/Exception.php'; + throw new Zend_Db_Adapter_Exception("Invalid fetch mode '$mode' specified"); + break; + } + } + + /** + * Check if the adapter supports real SQL parameters. + * + * @param string $type 'positional' or 'named' + * @return bool + */ + public function supportsParameters($type) + { + switch ($type) { + case 'positional': + case 'named': + default: + return true; + } + } + +} + diff --git a/libs/Zend/Db/Adapter/Pdo/Ibm.php b/libs/Zend/Db/Adapter/Pdo/Ibm.php new file mode 100644 index 0000000..21e6a4e --- /dev/null +++ b/libs/Zend/Db/Adapter/Pdo/Ibm.php @@ -0,0 +1,336 @@ + Zend_Db::INT_TYPE, + Zend_Db::BIGINT_TYPE => Zend_Db::BIGINT_TYPE, + Zend_Db::FLOAT_TYPE => Zend_Db::FLOAT_TYPE, + 'INTEGER' => Zend_Db::INT_TYPE, + 'SMALLINT' => Zend_Db::INT_TYPE, + 'BIGINT' => Zend_Db::BIGINT_TYPE, + 'DECIMAL' => Zend_Db::FLOAT_TYPE, + 'DEC' => Zend_Db::FLOAT_TYPE, + 'REAL' => Zend_Db::FLOAT_TYPE, + 'NUMERIC' => Zend_Db::FLOAT_TYPE, + 'DOUBLE PRECISION' => Zend_Db::FLOAT_TYPE, + 'FLOAT' => Zend_Db::FLOAT_TYPE + ); + + /** + * Creates a PDO object and connects to the database. + * + * The IBM data server is set. + * Current options are DB2 or IDS + * @todo also differentiate between z/OS and i/5 + * + * @return void + * @throws Zend_Db_Adapter_Exception + */ + public function _connect() + { + if ($this->_connection) { + return; + } + parent::_connect(); + + $this->getConnection()->setAttribute(Zend_Db::ATTR_STRINGIFY_FETCHES, true); + + try { + if ($this->_serverType === null) { + $server = substr($this->getConnection()->getAttribute(PDO::ATTR_SERVER_INFO), 0, 3); + + switch ($server) { + case 'DB2': + $this->_serverType = new Zend_Db_Adapter_Pdo_Ibm_Db2($this); + + // Add DB2-specific numeric types + $this->_numericDataTypes['DECFLOAT'] = Zend_Db::FLOAT_TYPE; + $this->_numericDataTypes['DOUBLE'] = Zend_Db::FLOAT_TYPE; + $this->_numericDataTypes['NUM'] = Zend_Db::FLOAT_TYPE; + + break; + case 'IDS': + $this->_serverType = new Zend_Db_Adapter_Pdo_Ibm_Ids($this); + + // Add IDS-specific numeric types + $this->_numericDataTypes['SERIAL'] = Zend_Db::INT_TYPE; + $this->_numericDataTypes['SERIAL8'] = Zend_Db::BIGINT_TYPE; + $this->_numericDataTypes['INT8'] = Zend_Db::BIGINT_TYPE; + $this->_numericDataTypes['SMALLFLOAT'] = Zend_Db::FLOAT_TYPE; + $this->_numericDataTypes['MONEY'] = Zend_Db::FLOAT_TYPE; + + break; + } + } + } catch (PDOException $e) { + /** @see Zend_Db_Adapter_Exception */ + require_once 'Zend/Db/Adapter/Exception.php'; + $error = strpos($e->getMessage(), 'driver does not support that attribute'); + if ($error) { + throw new Zend_Db_Adapter_Exception("PDO_IBM driver extension is downlevel. Please use driver release version 1.2.1 or later"); + } else { + throw new Zend_Db_Adapter_Exception($e->getMessage()); + } + } + } + + /** + * Creates a PDO DSN for the adapter from $this->_config settings. + * + * @return string + */ + protected function _dsn() + { + $this->_checkRequiredOptions($this->_config); + + // check if using full connection string + if (array_key_exists('host', $this->_config)) { + $dsn = ';DATABASE=' . $this->_config['dbname'] + . ';HOSTNAME=' . $this->_config['host'] + . ';PORT=' . $this->_config['port'] + // PDO_IBM supports only DB2 TCPIP protocol + . ';PROTOCOL=' . 'TCPIP;'; + } else { + // catalogued connection + $dsn = $this->_config['dbname']; + } + return $this->_pdoType . ': ' . $dsn; + } + + /** + * Checks required options + * + * @param array $config + * @throws Zend_Db_Adapter_Exception + * @return void + */ + protected function _checkRequiredOptions(array $config) + { + parent::_checkRequiredOptions($config); + + if (array_key_exists('host', $this->_config) && + !array_key_exists('port', $config)) { + /** @see Zend_Db_Adapter_Exception */ + require_once 'Zend/Db/Adapter/Exception.php'; + throw new Zend_Db_Adapter_Exception("Configuration must have a key for 'port' when 'host' is specified"); + } + } + + /** + * Prepares an SQL statement. + * + * @param string $sql The SQL statement with placeholders. + * @param array $bind An array of data to bind to the placeholders. + * @return PDOStatement + */ + public function prepare($sql) + { + $this->_connect(); + $stmtClass = $this->_defaultStmtClass; + $stmt = new $stmtClass($this, $sql); + $stmt->setFetchMode($this->_fetchMode); + return $stmt; + } + + /** + * Returns a list of the tables in the database. + * + * @return array + */ + public function listTables() + { + $this->_connect(); + return $this->_serverType->listTables(); + } + + /** + * Returns the column descriptions for a table. + * + * The return value is an associative array keyed by the column name, + * as returned by the RDBMS. + * + * The value of each array element is an associative array + * with the following keys: + * + * SCHEMA_NAME => string; name of database or schema + * TABLE_NAME => string; + * COLUMN_NAME => string; column name + * COLUMN_POSITION => number; ordinal position of column in table + * DATA_TYPE => string; SQL datatype name of column + * DEFAULT => string; default expression of column, null if none + * NULLABLE => boolean; true if column can have nulls + * LENGTH => number; length of CHAR/VARCHAR + * SCALE => number; scale of NUMERIC/DECIMAL + * PRECISION => number; precision of NUMERIC/DECIMAL + * UNSIGNED => boolean; unsigned property of an integer type + * PRIMARY => boolean; true if column is part of the primary key + * PRIMARY_POSITION => integer; position of column in primary key + * + * @todo Discover integer unsigned property. + * + * @param string $tableName + * @param string $schemaName OPTIONAL + * @return array + */ + public function describeTable($tableName, $schemaName = null) + { + $this->_connect(); + return $this->_serverType->describeTable($tableName, $schemaName); + } + + /** + * Inserts a table row with specified data. + * Special handling for PDO_IBM + * remove empty slots + * + * @param mixed $table The table to insert data into. + * @param array $bind Column-value pairs. + * @return int The number of affected rows. + */ + public function insert($table, array $bind) + { + $this->_connect(); + $newbind = array(); + if (is_array($bind)) { + foreach ($bind as $name => $value) { + if(!is_null($value)) { + $newbind[$name] = $value; + } + } + } + + return parent::insert($table, $newbind); + } + + /** + * Adds an adapter-specific LIMIT clause to the SELECT statement. + * + * @param string $sql + * @param integer $count + * @param integer $offset OPTIONAL + * @return string + */ + public function limit($sql, $count, $offset = 0) + { + $this->_connect(); + return $this->_serverType->limit($sql, $count, $offset); + } + + /** + * Gets the last ID generated automatically by an IDENTITY/AUTOINCREMENT + * column. + * + * @param string $tableName OPTIONAL + * @param string $primaryKey OPTIONAL + * @return integer + */ + public function lastInsertId($tableName = null, $primaryKey = null) + { + $this->_connect(); + + if ($tableName !== null) { + $sequenceName = $tableName; + if ($primaryKey) { + $sequenceName .= "_$primaryKey"; + } + $sequenceName .= '_seq'; + return $this->lastSequenceId($sequenceName); + } + + $id = $this->getConnection()->lastInsertId(); + + return $id; + } + + /** + * Return the most recent value from the specified sequence in the database. + * + * @param string $sequenceName + * @return integer + */ + public function lastSequenceId($sequenceName) + { + $this->_connect(); + return $this->_serverType->lastSequenceId($sequenceName); + } + + /** + * Generate a new value from the specified sequence in the database, + * and return it. + * + * @param string $sequenceName + * @return integer + */ + public function nextSequenceId($sequenceName) + { + $this->_connect(); + return $this->_serverType->nextSequenceId($sequenceName); + } +} diff --git a/libs/Zend/Db/Adapter/Pdo/Ibm/Db2.php b/libs/Zend/Db/Adapter/Pdo/Ibm/Db2.php new file mode 100644 index 0000000..05f7dbf --- /dev/null +++ b/libs/Zend/Db/Adapter/Pdo/Ibm/Db2.php @@ -0,0 +1,228 @@ +_adapter = $adapter; + } + + /** + * Returns a list of the tables in the database. + * + * @return array + */ + public function listTables() + { + $sql = "SELECT tabname " + . "FROM SYSCAT.TABLES "; + return $this->_adapter->fetchCol($sql); + } + + /** + * DB2 catalog lookup for describe table + * + * @param string $tableName + * @param string $schemaName OPTIONAL + * @return array + */ + public function describeTable($tableName, $schemaName = null) + { + $sql = "SELECT DISTINCT c.tabschema, c.tabname, c.colname, c.colno, + c.typename, c.default, c.nulls, c.length, c.scale, + c.identity, tc.type AS tabconsttype, k.colseq + FROM syscat.columns c + LEFT JOIN (syscat.keycoluse k JOIN syscat.tabconst tc + ON (k.tabschema = tc.tabschema + AND k.tabname = tc.tabname + AND tc.type = 'P')) + ON (c.tabschema = k.tabschema + AND c.tabname = k.tabname + AND c.colname = k.colname) + WHERE " + . $this->_adapter->quoteInto('UPPER(c.tabname) = UPPER(?)', $tableName); + if ($schemaName) { + $sql .= $this->_adapter->quoteInto(' AND UPPER(c.tabschema) = UPPER(?)', $schemaName); + } + $sql .= " ORDER BY c.colno"; + + $desc = array(); + $stmt = $this->_adapter->query($sql); + + /** + * To avoid case issues, fetch using FETCH_NUM + */ + $result = $stmt->fetchAll(Zend_Db::FETCH_NUM); + + /** + * The ordering of columns is defined by the query so we can map + * to variables to improve readability + */ + $tabschema = 0; + $tabname = 1; + $colname = 2; + $colno = 3; + $typename = 4; + $default = 5; + $nulls = 6; + $length = 7; + $scale = 8; + $identityCol = 9; + $tabconstype = 10; + $colseq = 11; + + foreach ($result as $key => $row) { + list ($primary, $primaryPosition, $identity) = array(false, null, false); + if ($row[$tabconstype] == 'P') { + $primary = true; + $primaryPosition = $row[$colseq]; + } + /** + * In IBM DB2, an column can be IDENTITY + * even if it is not part of the PRIMARY KEY. + */ + if ($row[$identityCol] == 'Y') { + $identity = true; + } + + $desc[$this->_adapter->foldCase($row[$colname])] = array( + 'SCHEMA_NAME' => $this->_adapter->foldCase($row[$tabschema]), + 'TABLE_NAME' => $this->_adapter->foldCase($row[$tabname]), + 'COLUMN_NAME' => $this->_adapter->foldCase($row[$colname]), + 'COLUMN_POSITION' => $row[$colno]+1, + 'DATA_TYPE' => $row[$typename], + 'DEFAULT' => $row[$default], + 'NULLABLE' => (bool) ($row[$nulls] == 'Y'), + 'LENGTH' => $row[$length], + 'SCALE' => $row[$scale], + 'PRECISION' => ($row[$typename] == 'DECIMAL' ? $row[$length] : 0), + 'UNSIGNED' => false, + 'PRIMARY' => $primary, + 'PRIMARY_POSITION' => $primaryPosition, + 'IDENTITY' => $identity + ); + } + + return $desc; + } + + /** + * Adds a DB2-specific LIMIT clause to the SELECT statement. + * + * @param string $sql + * @param integer $count + * @param integer $offset OPTIONAL + * @throws Zend_Db_Adapter_Exception + * @return string + */ + public function limit($sql, $count, $offset = 0) + { + $count = intval($count); + if ($count < 0) { + /** @see Zend_Db_Adapter_Exception */ + require_once 'Zend/Db/Adapter/Exception.php'; + throw new Zend_Db_Adapter_Exception("LIMIT argument count=$count is not valid"); + } else { + $offset = intval($offset); + if ($offset < 0) { + /** @see Zend_Db_Adapter_Exception */ + require_once 'Zend/Db/Adapter/Exception.php'; + throw new Zend_Db_Adapter_Exception("LIMIT argument offset=$offset is not valid"); + } + + if ($offset == 0 && $count > 0) { + $limit_sql = $sql . " FETCH FIRST $count ROWS ONLY"; + return $limit_sql; + } + /** + * DB2 does not implement the LIMIT clause as some RDBMS do. + * We have to simulate it with subqueries and ROWNUM. + * Unfortunately because we use the column wildcard "*", + * this puts an extra column into the query result set. + */ + $limit_sql = "SELECT z2.* + FROM ( + SELECT ROW_NUMBER() OVER() AS \"ZEND_DB_ROWNUM\", z1.* + FROM ( + " . $sql . " + ) z1 + ) z2 + WHERE z2.zend_db_rownum BETWEEN " . ($offset+1) . " AND " . ($offset+$count); + } + return $limit_sql; + } + + /** + * DB2-specific last sequence id + * + * @param string $sequenceName + * @return integer + */ + public function lastSequenceId($sequenceName) + { + $sql = 'SELECT PREVVAL FOR '.$this->_adapter->quoteIdentifier($sequenceName).' AS VAL FROM SYSIBM.SYSDUMMY1'; + $value = $this->_adapter->fetchOne($sql); + return $value; + } + + /** + * DB2-specific sequence id value + * + * @param string $sequenceName + * @return integer + */ + public function nextSequenceId($sequenceName) + { + $sql = 'SELECT NEXTVAL FOR '.$this->_adapter->quoteIdentifier($sequenceName).' AS VAL FROM SYSIBM.SYSDUMMY1'; + $value = $this->_adapter->fetchOne($sql); + return $value; + } +} diff --git a/libs/Zend/Db/Adapter/Pdo/Ibm/Ids.php b/libs/Zend/Db/Adapter/Pdo/Ibm/Ids.php new file mode 100644 index 0000000..936fa32 --- /dev/null +++ b/libs/Zend/Db/Adapter/Pdo/Ibm/Ids.php @@ -0,0 +1,301 @@ +_adapter = $adapter; + } + + /** + * Returns a list of the tables in the database. + * + * @return array + */ + public function listTables() + { + $sql = "SELECT tabname " + . "FROM systables "; + + return $this->_adapter->fetchCol($sql); + } + + /** + * IDS catalog lookup for describe table + * + * @param string $tableName + * @param string $schemaName OPTIONAL + * @return array + */ + public function describeTable($tableName, $schemaName = null) + { + // this is still a work in progress + + $sql= "SELECT DISTINCT t.owner, t.tabname, c.colname, c.colno, c.coltype, + d.default, c.collength, t.tabid + FROM syscolumns c + JOIN systables t ON c.tabid = t.tabid + LEFT JOIN sysdefaults d ON c.tabid = d.tabid AND c.colno = d.colno + WHERE " + . $this->_adapter->quoteInto('UPPER(t.tabname) = UPPER(?)', $tableName); + if ($schemaName) { + $sql .= $this->_adapter->quoteInto(' AND UPPER(t.owner) = UPPER(?)', $schemaName); + } + $sql .= " ORDER BY c.colno"; + + $desc = array(); + $stmt = $this->_adapter->query($sql); + + $result = $stmt->fetchAll(Zend_Db::FETCH_NUM); + + /** + * The ordering of columns is defined by the query so we can map + * to variables to improve readability + */ + $tabschema = 0; + $tabname = 1; + $colname = 2; + $colno = 3; + $typename = 4; + $default = 5; + $length = 6; + $tabid = 7; + + $primaryCols = null; + + foreach ($result as $key => $row) { + $primary = false; + $primaryPosition = null; + + if (!$primaryCols) { + $primaryCols = $this->_getPrimaryInfo($row[$tabid]); + } + + if (array_key_exists($row[$colno], $primaryCols)) { + $primary = true; + $primaryPosition = $primaryCols[$row[$colno]]; + } + + $identity = false; + if ($row[$typename] == 6 + 256 || + $row[$typename] == 18 + 256) { + $identity = true; + } + + $desc[$this->_adapter->foldCase($row[$colname])] = array ( + 'SCHEMA_NAME' => $this->_adapter->foldCase($row[$tabschema]), + 'TABLE_NAME' => $this->_adapter->foldCase($row[$tabname]), + 'COLUMN_NAME' => $this->_adapter->foldCase($row[$colname]), + 'COLUMN_POSITION' => $row[$colno], + 'DATA_TYPE' => $this->_getDataType($row[$typename]), + 'DEFAULT' => $row[$default], + 'NULLABLE' => (bool) !($row[$typename] - 256 >= 0), + 'LENGTH' => $row[$length], + 'SCALE' => ($row[$typename] == 5 ? $row[$length]&255 : 0), + 'PRECISION' => ($row[$typename] == 5 ? (int)($row[$length]/256) : 0), + 'UNSIGNED' => false, + 'PRIMARY' => $primary, + 'PRIMARY_POSITION' => $primaryPosition, + 'IDENTITY' => $identity + ); + } + + return $desc; + } + + /** + * Map number representation of a data type + * to a string + * + * @param int $typeNo + * @return string + */ + protected function _getDataType($typeNo) + { + $typemap = array( + 0 => "CHAR", + 1 => "SMALLINT", + 2 => "INTEGER", + 3 => "FLOAT", + 4 => "SMALLFLOAT", + 5 => "DECIMAL", + 6 => "SERIAL", + 7 => "DATE", + 8 => "MONEY", + 9 => "NULL", + 10 => "DATETIME", + 11 => "BYTE", + 12 => "TEXT", + 13 => "VARCHAR", + 14 => "INTERVAL", + 15 => "NCHAR", + 16 => "NVARCHAR", + 17 => "INT8", + 18 => "SERIAL8", + 19 => "SET", + 20 => "MULTISET", + 21 => "LIST", + 22 => "Unnamed ROW", + 40 => "Variable-length opaque type", + 4118 => "Named ROW" + ); + + if ($typeNo - 256 >= 0) { + $typeNo = $typeNo - 256; + } + + return $typemap[$typeNo]; + } + + /** + * Helper method to retrieve primary key column + * and column location + * + * @param int $tabid + * @return array + */ + protected function _getPrimaryInfo($tabid) + { + $sql = "SELECT i.part1, i.part2, i.part3, i.part4, i.part5, i.part6, + i.part7, i.part8, i.part9, i.part10, i.part11, i.part12, + i.part13, i.part14, i.part15, i.part16 + FROM sysindexes i + JOIN sysconstraints c ON c.idxname = i.idxname + WHERE i.tabid = " . $tabid . " AND c.constrtype = 'P'"; + + $stmt = $this->_adapter->query($sql); + $results = $stmt->fetchAll(); + + $cols = array(); + + // this should return only 1 row + // unless there is no primary key, + // in which case, the empty array is returned + if ($results) { + $row = $results[0]; + } else { + return $cols; + } + + $position = 0; + foreach ($row as $key => $colno) { + $position++; + if ($colno == 0) { + return $cols; + } else { + $cols[$colno] = $position; + } + } + } + + /** + * Adds an IDS-specific LIMIT clause to the SELECT statement. + * + * @param string $sql + * @param integer $count + * @param integer $offset OPTIONAL + * @throws Zend_Db_Adapter_Exception + * @return string + */ + public function limit($sql, $count, $offset = 0) + { + $count = intval($count); + if ($count < 0) { + /** @see Zend_Db_Adapter_Exception */ + require_once 'Zend/Db/Adapter/Exception.php'; + throw new Zend_Db_Adapter_Exception("LIMIT argument count=$count is not valid"); + } else if ($count == 0) { + $limit_sql = str_ireplace("SELECT", "SELECT * FROM (SELECT", $sql); + $limit_sql .= ") WHERE 0 = 1"; + } else { + $offset = intval($offset); + if ($offset < 0) { + /** @see Zend_Db_Adapter_Exception */ + require_once 'Zend/Db/Adapter/Exception.php'; + throw new Zend_Db_Adapter_Exception("LIMIT argument offset=$offset is not valid"); + } + if ($offset == 0) { + $limit_sql = str_ireplace("SELECT", "SELECT FIRST $count", $sql); + } else { + $limit_sql = str_ireplace("SELECT", "SELECT SKIP $offset LIMIT $count", $sql); + } + } + return $limit_sql; + } + + /** + * IDS-specific last sequence id + * + * @param string $sequenceName + * @return integer + */ + public function lastSequenceId($sequenceName) + { + $sql = 'SELECT '.$this->_adapter->quoteIdentifier($sequenceName).'.CURRVAL FROM ' + .'systables WHERE tabid = 1'; + $value = $this->_adapter->fetchOne($sql); + return $value; + } + + /** + * IDS-specific sequence id value + * + * @param string $sequenceName + * @return integer + */ + public function nextSequenceId($sequenceName) + { + $sql = 'SELECT '.$this->_adapter->quoteIdentifier($sequenceName).'.NEXTVAL FROM ' + .'systables WHERE tabid = 1'; + $value = $this->_adapter->fetchOne($sql); + return $value; + } +} diff --git a/libs/Zend/Db/Adapter/Pdo/Mssql.php b/libs/Zend/Db/Adapter/Pdo/Mssql.php new file mode 100644 index 0000000..c55879f --- /dev/null +++ b/libs/Zend/Db/Adapter/Pdo/Mssql.php @@ -0,0 +1,363 @@ + Zend_Db::INT_TYPE, + Zend_Db::BIGINT_TYPE => Zend_Db::BIGINT_TYPE, + Zend_Db::FLOAT_TYPE => Zend_Db::FLOAT_TYPE, + 'INT' => Zend_Db::INT_TYPE, + 'SMALLINT' => Zend_Db::INT_TYPE, + 'TINYINT' => Zend_Db::INT_TYPE, + 'BIGINT' => Zend_Db::BIGINT_TYPE, + 'DECIMAL' => Zend_Db::FLOAT_TYPE, + 'FLOAT' => Zend_Db::FLOAT_TYPE, + 'MONEY' => Zend_Db::FLOAT_TYPE, + 'NUMERIC' => Zend_Db::FLOAT_TYPE, + 'REAL' => Zend_Db::FLOAT_TYPE, + 'SMALLMONEY' => Zend_Db::FLOAT_TYPE + ); + + /** + * Creates a PDO DSN for the adapter from $this->_config settings. + * + * @return string + */ + protected function _dsn() + { + // baseline of DSN parts + $dsn = $this->_config; + + // don't pass the username and password in the DSN + unset($dsn['username']); + unset($dsn['password']); + unset($dsn['driver_options']); + + if (isset($dsn['port'])) { + $seperator = ':'; + if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { + $seperator = ','; + } + $dsn['host'] .= $seperator . $dsn['port']; + unset($dsn['port']); + } + + // this driver supports multiple DSN prefixes + // @see http://www.php.net/manual/en/ref.pdo-dblib.connection.php + if (isset($dsn['pdoType'])) { + switch (strtolower($dsn['pdoType'])) { + case 'freetds': + case 'sybase': + $this->_pdoType = 'sybase'; + break; + case 'mssql': + $this->_pdoType = 'mssql'; + break; + case 'dblib': + default: + $this->_pdoType = 'dblib'; + break; + } + unset($dsn['pdoType']); + } + + // use all remaining parts in the DSN + foreach ($dsn as $key => $val) { + $dsn[$key] = "$key=$val"; + } + + $dsn = $this->_pdoType . ':' . implode(';', $dsn); + return $dsn; + } + + /** + * @return void + */ + protected function _connect() + { + if ($this->_connection) { + return; + } + parent::_connect(); + $this->_connection->exec('SET QUOTED_IDENTIFIER ON'); + } + + /** + * Begin a transaction. + * + * It is necessary to override the abstract PDO transaction functions here, as + * the PDO driver for MSSQL does not support transactions. + */ + protected function _beginTransaction() + { + $this->_connect(); + $this->_connection->exec('BEGIN TRANSACTION'); + return true; + } + + /** + * Commit a transaction. + * + * It is necessary to override the abstract PDO transaction functions here, as + * the PDO driver for MSSQL does not support transactions. + */ + protected function _commit() + { + $this->_connect(); + $this->_connection->exec('COMMIT TRANSACTION'); + return true; + } + + /** + * Roll-back a transaction. + * + * It is necessary to override the abstract PDO transaction functions here, as + * the PDO driver for MSSQL does not support transactions. + */ + protected function _rollBack() { + $this->_connect(); + $this->_connection->exec('ROLLBACK TRANSACTION'); + return true; + } + + /** + * Returns a list of the tables in the database. + * + * @return array + */ + public function listTables() + { + $sql = "SELECT name FROM sysobjects WHERE type = 'U' ORDER BY name"; + return $this->fetchCol($sql); + } + + /** + * Returns the column descriptions for a table. + * + * The return value is an associative array keyed by the column name, + * as returned by the RDBMS. + * + * The value of each array element is an associative array + * with the following keys: + * + * SCHEMA_NAME => string; name of database or schema + * TABLE_NAME => string; + * COLUMN_NAME => string; column name + * COLUMN_POSITION => number; ordinal position of column in table + * DATA_TYPE => string; SQL datatype name of column + * DEFAULT => string; default expression of column, null if none + * NULLABLE => boolean; true if column can have nulls + * LENGTH => number; length of CHAR/VARCHAR + * SCALE => number; scale of NUMERIC/DECIMAL + * PRECISION => number; precision of NUMERIC/DECIMAL + * UNSIGNED => boolean; unsigned property of an integer type + * PRIMARY => boolean; true if column is part of the primary key + * PRIMARY_POSITION => integer; position of column in primary key + * PRIMARY_AUTO => integer; position of auto-generated column in primary key + * + * @todo Discover column primary key position. + * @todo Discover integer unsigned property. + * + * @param string $tableName + * @param string $schemaName OPTIONAL + * @return array + */ + public function describeTable($tableName, $schemaName = null) + { + /** + * Discover metadata information about this table. + */ + $sql = "exec sp_columns @table_name = " . $this->quoteIdentifier($tableName, true); + $stmt = $this->query($sql); + $result = $stmt->fetchAll(Zend_Db::FETCH_NUM); + + $table_name = 2; + $column_name = 3; + $type_name = 5; + $precision = 6; + $length = 7; + $scale = 8; + $nullable = 10; + $column_def = 12; + $column_position = 16; + + /** + * Discover primary key column(s) for this table. + */ + $sql = "exec sp_pkeys @table_name = " . $this->quoteIdentifier($tableName, true); + $stmt = $this->query($sql); + $primaryKeysResult = $stmt->fetchAll(Zend_Db::FETCH_NUM); + $primaryKeyColumn = array(); + $pkey_column_name = 3; + $pkey_key_seq = 4; + foreach ($primaryKeysResult as $pkeysRow) { + $primaryKeyColumn[$pkeysRow[$pkey_column_name]] = $pkeysRow[$pkey_key_seq]; + } + + $desc = array(); + $p = 1; + foreach ($result as $key => $row) { + $identity = false; + $words = explode(' ', $row[$type_name], 2); + if (isset($words[0])) { + $type = $words[0]; + if (isset($words[1])) { + $identity = (bool) preg_match('/identity/', $words[1]); + } + } + + $isPrimary = array_key_exists($row[$column_name], $primaryKeyColumn); + if ($isPrimary) { + $primaryPosition = $primaryKeyColumn[$row[$column_name]]; + } else { + $primaryPosition = null; + } + + $desc[$this->foldCase($row[$column_name])] = array( + 'SCHEMA_NAME' => null, // @todo + 'TABLE_NAME' => $this->foldCase($row[$table_name]), + 'COLUMN_NAME' => $this->foldCase($row[$column_name]), + 'COLUMN_POSITION' => (int) $row[$column_position], + 'DATA_TYPE' => $type, + 'DEFAULT' => $row[$column_def], + 'NULLABLE' => (bool) $row[$nullable], + 'LENGTH' => $row[$length], + 'SCALE' => $row[$scale], + 'PRECISION' => $row[$precision], + 'UNSIGNED' => null, // @todo + 'PRIMARY' => $isPrimary, + 'PRIMARY_POSITION' => $primaryPosition, + 'IDENTITY' => $identity + ); + } + return $desc; + } + + /** + * Adds an adapter-specific LIMIT clause to the SELECT statement. + * + * @link http://lists.bestpractical.com/pipermail/rt-devel/2005-June/007339.html + * + * @param string $sql + * @param integer $count + * @param integer $offset OPTIONAL + * @throws Zend_Db_Adapter_Exception + * @return string + */ + public function limit($sql, $count, $offset = 0) + { + $count = intval($count); + if ($count <= 0) { + /** @see Zend_Db_Adapter_Exception */ + require_once 'Zend/Db/Adapter/Exception.php'; + throw new Zend_Db_Adapter_Exception("LIMIT argument count=$count is not valid"); + } + + $offset = intval($offset); + if ($offset < 0) { + /** @see Zend_Db_Adapter_Exception */ + require_once 'Zend/Db/Adapter/Exception.php'; + throw new Zend_Db_Adapter_Exception("LIMIT argument offset=$offset is not valid"); + } + + $orderby = stristr($sql, 'ORDER BY'); + if ($orderby !== false) { + $sort = (stripos($orderby, ' desc') !== false) ? 'desc' : 'asc'; + $order = str_ireplace('ORDER BY', '', $orderby); + $order = trim(preg_replace('/\bASC\b|\bDESC\b/i', '', $order)); + } + + $sql = preg_replace('/^SELECT\s/i', 'SELECT TOP ' . ($count+$offset) . ' ', $sql); + + $sql = 'SELECT * FROM (SELECT TOP ' . $count . ' * FROM (' . $sql . ') AS inner_tbl'; + if ($orderby !== false) { + $sql .= ' ORDER BY ' . $order . ' '; + $sql .= (stripos($sort, 'asc') !== false) ? 'DESC' : 'ASC'; + } + $sql .= ') AS outer_tbl'; + if ($orderby !== false) { + $sql .= ' ORDER BY ' . $order . ' ' . $sort; + } + + return $sql; + } + + /** + * Gets the last ID generated automatically by an IDENTITY/AUTOINCREMENT column. + * + * As a convention, on RDBMS brands that support sequences + * (e.g. Oracle, PostgreSQL, DB2), this method forms the name of a sequence + * from the arguments and returns the last id generated by that sequence. + * On RDBMS brands that support IDENTITY/AUTOINCREMENT columns, this method + * returns the last value generated for such a column, and the table name + * argument is disregarded. + * + * Microsoft SQL Server does not support sequences, so the arguments to + * this method are ignored. + * + * @param string $tableName OPTIONAL Name of table. + * @param string $primaryKey OPTIONAL Name of primary key column. + * @return string + * @throws Zend_Db_Adapter_Exception + */ + public function lastInsertId($tableName = null, $primaryKey = null) + { + $sql = 'SELECT SCOPE_IDENTITY()'; + return (int)$this->fetchOne($sql); + } + +} diff --git a/libs/Zend/Db/Adapter/Pdo/Mysql.php b/libs/Zend/Db/Adapter/Pdo/Mysql.php new file mode 100644 index 0000000..61ba1dc --- /dev/null +++ b/libs/Zend/Db/Adapter/Pdo/Mysql.php @@ -0,0 +1,233 @@ + Zend_Db::INT_TYPE, + Zend_Db::BIGINT_TYPE => Zend_Db::BIGINT_TYPE, + Zend_Db::FLOAT_TYPE => Zend_Db::FLOAT_TYPE, + 'INT' => Zend_Db::INT_TYPE, + 'INTEGER' => Zend_Db::INT_TYPE, + 'MEDIUMINT' => Zend_Db::INT_TYPE, + 'SMALLINT' => Zend_Db::INT_TYPE, + 'TINYINT' => Zend_Db::INT_TYPE, + 'BIGINT' => Zend_Db::BIGINT_TYPE, + 'SERIAL' => Zend_Db::BIGINT_TYPE, + 'DEC' => Zend_Db::FLOAT_TYPE, + 'DECIMAL' => Zend_Db::FLOAT_TYPE, + 'DOUBLE' => Zend_Db::FLOAT_TYPE, + 'DOUBLE PRECISION' => Zend_Db::FLOAT_TYPE, + 'FIXED' => Zend_Db::FLOAT_TYPE, + 'FLOAT' => Zend_Db::FLOAT_TYPE + ); + + /** + * @return string + */ + public function getQuoteIdentifierSymbol() + { + return "`"; + } + + /** + * Returns a list of the tables in the database. + * + * @return array + */ + public function listTables() + { + return $this->fetchCol('SHOW TABLES'); + } + + /** + * Returns the column descriptions for a table. + * + * The return value is an associative array keyed by the column name, + * as returned by the RDBMS. + * + * The value of each array element is an associative array + * with the following keys: + * + * SCHEMA_NAME => string; name of database or schema + * TABLE_NAME => string; + * COLUMN_NAME => string; column name + * COLUMN_POSITION => number; ordinal position of column in table + * DATA_TYPE => string; SQL datatype name of column + * DEFAULT => string; default expression of column, null if none + * NULLABLE => boolean; true if column can have nulls + * LENGTH => number; length of CHAR/VARCHAR + * SCALE => number; scale of NUMERIC/DECIMAL + * PRECISION => number; precision of NUMERIC/DECIMAL + * UNSIGNED => boolean; unsigned property of an integer type + * PRIMARY => boolean; true if column is part of the primary key + * PRIMARY_POSITION => integer; position of column in primary key + * IDENTITY => integer; true if column is auto-generated with unique values + * + * @param string $tableName + * @param string $schemaName OPTIONAL + * @return array + */ + public function describeTable($tableName, $schemaName = null) + { + // @todo use INFORMATION_SCHEMA someday when MySQL's + // implementation has reasonably good performance and + // the version with this improvement is in wide use. + + if ($schemaName) { + $sql = 'DESCRIBE ' . $this->quoteIdentifier("$schemaName.$tableName", true); + } else { + $sql = 'DESCRIBE ' . $this->quoteIdentifier($tableName, true); + } + $stmt = $this->query($sql); + + // Use FETCH_NUM so we are not dependent on the CASE attribute of the PDO connection + $result = $stmt->fetchAll(Zend_Db::FETCH_NUM); + + $field = 0; + $type = 1; + $null = 2; + $key = 3; + $default = 4; + $extra = 5; + + $desc = array(); + $i = 1; + $p = 1; + foreach ($result as $row) { + list($length, $scale, $precision, $unsigned, $primary, $primaryPosition, $identity) + = array(null, null, null, null, false, null, false); + if (preg_match('/unsigned/', $row[$type])) { + $unsigned = true; + } + if (preg_match('/^((?:var)?char)\((\d+)\)/', $row[$type], $matches)) { + $row[$type] = $matches[1]; + $length = $matches[2]; + } else if (preg_match('/^decimal\((\d+),(\d+)\)/', $row[$type], $matches)) { + $row[$type] = 'decimal'; + $precision = $matches[1]; + $scale = $matches[2]; + } else if (preg_match('/^((?:big|medium|small|tiny)?int)\((\d+)\)/', $row[$type], $matches)) { + $row[$type] = $matches[1]; + // The optional argument of a MySQL int type is not precision + // or length; it is only a hint for display width. + } + if (strtoupper($row[$key]) == 'PRI') { + $primary = true; + $primaryPosition = $p; + if ($row[$extra] == 'auto_increment') { + $identity = true; + } else { + $identity = false; + } + ++$p; + } + $desc[$this->foldCase($row[$field])] = array( + 'SCHEMA_NAME' => null, // @todo + 'TABLE_NAME' => $this->foldCase($tableName), + 'COLUMN_NAME' => $this->foldCase($row[$field]), + 'COLUMN_POSITION' => $i, + 'DATA_TYPE' => $row[$type], + 'DEFAULT' => $row[$default], + 'NULLABLE' => (bool) ($row[$null] == 'YES'), + 'LENGTH' => $length, + 'SCALE' => $scale, + 'PRECISION' => $precision, + 'UNSIGNED' => $unsigned, + 'PRIMARY' => $primary, + 'PRIMARY_POSITION' => $primaryPosition, + 'IDENTITY' => $identity + ); + ++$i; + } + return $desc; + } + + /** + * Adds an adapter-specific LIMIT clause to the SELECT statement. + * + * @param string $sql + * @param integer $count + * @param integer $offset OPTIONAL + * @throws Zend_Db_Adapter_Exception + * @return string + */ + public function limit($sql, $count, $offset = 0) + { + $count = intval($count); + if ($count <= 0) { + /** @see Zend_Db_Adapter_Exception */ + require_once 'Zend/Db/Adapter/Exception.php'; + throw new Zend_Db_Adapter_Exception("LIMIT argument count=$count is not valid"); + } + + $offset = intval($offset); + if ($offset < 0) { + /** @see Zend_Db_Adapter_Exception */ + require_once 'Zend/Db/Adapter/Exception.php'; + throw new Zend_Db_Adapter_Exception("LIMIT argument offset=$offset is not valid"); + } + + $sql .= " LIMIT $count"; + if ($offset > 0) { + $sql .= " OFFSET $offset"; + } + + return $sql; + } + +} diff --git a/libs/Zend/Db/Adapter/Pdo/Oci.php b/libs/Zend/Db/Adapter/Pdo/Oci.php new file mode 100644 index 0000000..a57ae0b --- /dev/null +++ b/libs/Zend/Db/Adapter/Pdo/Oci.php @@ -0,0 +1,344 @@ + Zend_Db::INT_TYPE, + Zend_Db::BIGINT_TYPE => Zend_Db::BIGINT_TYPE, + Zend_Db::FLOAT_TYPE => Zend_Db::FLOAT_TYPE, + 'BINARY_DOUBLE' => Zend_Db::FLOAT_TYPE, + 'BINARY_FLOAT' => Zend_Db::FLOAT_TYPE, + 'NUMBER' => Zend_Db::FLOAT_TYPE + ); + + /** + * Creates a PDO DSN for the adapter from $this->_config settings. + * + * @return string + */ + protected function _dsn() + { + // baseline of DSN parts + $dsn = $this->_config; + + $tns = 'dbname=(DESCRIPTION='; + if (isset($dsn['host'])) { + $tns .= '(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=' . $dsn['host'] . ')'; + if (isset($dsn['port'])) { + $tns .= '(PORT=' . $dsn['port'] . ')'; + } else { + $tns .= '(PORT=1521)'; + } + $tns .= '))'; + } + $tns .= '(CONNECT_DATA=(SID=' . $dsn['dbname'] . ')))'; + + if (isset($dsn['charset'])) + { + $tns .= ';charset=' . $dsn['charset']; + } + + return $this->_pdoType . ':' . $tns; + } + + /** + * Quote a raw string. + * Most PDO drivers have an implementation for the quote() method, + * but the Oracle OCI driver must use the same implementation as the + * Zend_Db_Adapter_Abstract class. + * + * @param string $value Raw string + * @return string Quoted string + */ + protected function _quote($value) + { + if (is_int($value) || is_float($value)) { + return $value; + } + $value = str_replace("'", "''", $value); + return "'" . addcslashes($value, "\000\n\r\\\032") . "'"; + } + + /** + * Quote a table identifier and alias. + * + * @param string|array|Zend_Db_Expr $ident The identifier or expression. + * @param string $alias An alias for the table. + * @return string The quoted identifier and alias. + */ + public function quoteTableAs($ident, $alias = null, $auto = false) + { + // Oracle doesn't allow the 'AS' keyword between the table identifier/expression and alias. + return $this->_quoteIdentifierAs($ident, $alias, $auto, ' '); + } + + /** + * Returns a list of the tables in the database. + * + * @return array + */ + public function listTables() + { + $data = $this->fetchCol('SELECT table_name FROM all_tables'); + return $data; + } + + /** + * Returns the column descriptions for a table. + * + * The return value is an associative array keyed by the column name, + * as returned by the RDBMS. + * + * The value of each array element is an associative array + * with the following keys: + * + * SCHEMA_NAME => string; name of schema + * TABLE_NAME => string; + * COLUMN_NAME => string; column name + * COLUMN_POSITION => number; ordinal position of column in table + * DATA_TYPE => string; SQL datatype name of column + * DEFAULT => string; default expression of column, null if none + * NULLABLE => boolean; true if column can have nulls + * LENGTH => number; length of CHAR/VARCHAR + * SCALE => number; scale of NUMERIC/DECIMAL + * PRECISION => number; precision of NUMERIC/DECIMAL + * UNSIGNED => boolean; unsigned property of an integer type + * PRIMARY => boolean; true if column is part of the primary key + * PRIMARY_POSITION => integer; position of column in primary key + * IDENTITY => integer; true if column is auto-generated with unique values + * + * @todo Discover integer unsigned property. + * + * @param string $tableName + * @param string $schemaName OPTIONAL + * @return array + */ + public function describeTable($tableName, $schemaName = null) + { + $sql = "SELECT TC.TABLE_NAME, TB.OWNER, TC.COLUMN_NAME, TC.DATA_TYPE, + TC.DATA_DEFAULT, TC.NULLABLE, TC.COLUMN_ID, TC.DATA_LENGTH, + 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 TC.TABLE_NAME = CC.TABLE_NAME AND TC.COLUMN_NAME = CC.COLUMN_NAME + JOIN ALL_TABLES TB ON (TB.TABLE_NAME = TC.TABLE_NAME AND TB.OWNER = TC.OWNER) + WHERE TC.TABLE_NAME = :TBNAME"; + $bind[':TBNAME'] = $tableName; + if ($schemaName) { + $sql .= ' AND TB.OWNER = :SCNAME'; + $bind[':SCNAME'] = $schemaName; + } + $sql .= ' ORDER BY TC.COLUMN_ID'; + + $stmt = $this->query($sql, $bind); + + /** + * Use FETCH_NUM so we are not dependent on the CASE attribute of the PDO connection + */ + $result = $stmt->fetchAll(Zend_Db::FETCH_NUM); + + $table_name = 0; + $owner = 1; + $column_name = 2; + $data_type = 3; + $data_default = 4; + $nullable = 5; + $column_id = 6; + $data_length = 7; + $data_scale = 8; + $data_precision = 9; + $constraint_type = 10; + $position = 11; + + $desc = array(); + foreach ($result as $key => $row) { + list ($primary, $primaryPosition, $identity) = array(false, null, false); + if ($row[$constraint_type] == 'P') { + $primary = true; + $primaryPosition = $row[$position]; + /** + * Oracle does not support auto-increment keys. + */ + $identity = false; + } + $desc[$this->foldCase($row[$column_name])] = array( + 'SCHEMA_NAME' => $this->foldCase($row[$owner]), + 'TABLE_NAME' => $this->foldCase($row[$table_name]), + 'COLUMN_NAME' => $this->foldCase($row[$column_name]), + 'COLUMN_POSITION' => $row[$column_id], + 'DATA_TYPE' => $row[$data_type], + 'DEFAULT' => $row[$data_default], + 'NULLABLE' => (bool) ($row[$nullable] == 'Y'), + 'LENGTH' => $row[$data_length], + 'SCALE' => $row[$data_scale], + 'PRECISION' => $row[$data_precision], + 'UNSIGNED' => null, // @todo + 'PRIMARY' => $primary, + 'PRIMARY_POSITION' => $primaryPosition, + 'IDENTITY' => $identity + ); + } + return $desc; + } + + /** + * Return the most recent value from the specified sequence in the database. + * This is supported only on RDBMS brands that support sequences + * (e.g. Oracle, PostgreSQL, DB2). Other RDBMS brands return null. + * + * @param string $sequenceName + * @return integer + */ + public function lastSequenceId($sequenceName) + { + $this->_connect(); + $value = $this->fetchOne('SELECT '.$this->quoteIdentifier($sequenceName, true).'.CURRVAL FROM dual'); + return $value; + } + + /** + * Generate a new value from the specified sequence in the database, and return it. + * This is supported only on RDBMS brands that support sequences + * (e.g. Oracle, PostgreSQL, DB2). Other RDBMS brands return null. + * + * @param string $sequenceName + * @return integer + */ + public function nextSequenceId($sequenceName) + { + $this->_connect(); + $value = $this->fetchOne('SELECT '.$this->quoteIdentifier($sequenceName, true).'.NEXTVAL FROM dual'); + return $value; + } + + /** + * Gets the last ID generated automatically by an IDENTITY/AUTOINCREMENT column. + * + * As a convention, on RDBMS brands that support sequences + * (e.g. Oracle, PostgreSQL, DB2), this method forms the name of a sequence + * from the arguments and returns the last id generated by that sequence. + * On RDBMS brands that support IDENTITY/AUTOINCREMENT columns, this method + * returns the last value generated for such a column, and the table name + * argument is disregarded. + * + * Oracle does not support IDENTITY columns, so if the sequence is not + * specified, this method returns null. + * + * @param string $tableName OPTIONAL Name of table. + * @param string $primaryKey OPTIONAL Name of primary key column. + * @return string + * @throws Zend_Db_Adapter_Oracle_Exception + */ + public function lastInsertId($tableName = null, $primaryKey = null) + { + if ($tableName !== null) { + $sequenceName = $tableName; + if ($primaryKey) { + $sequenceName .= $this->foldCase("_$primaryKey"); + } + $sequenceName .= $this->foldCase('_seq'); + return $this->lastSequenceId($sequenceName); + } + // No support for IDENTITY columns; return null + return null; + } + + /** + * Adds an adapter-specific LIMIT clause to the SELECT statement. + * + * @param string $sql + * @param integer $count + * @param integer $offset + * @throws Zend_Db_Adapter_Exception + * @return string + */ + public function limit($sql, $count, $offset = 0) + { + $count = intval($count); + if ($count <= 0) { + /** @see Zend_Db_Adapter_Exception */ + require_once 'Zend/Db/Adapter/Exception.php'; + throw new Zend_Db_Adapter_Exception("LIMIT argument count=$count is not valid"); + } + + $offset = intval($offset); + if ($offset < 0) { + /** @see Zend_Db_Adapter_Exception */ + require_once 'Zend/Db/Adapter/Exception.php'; + throw new Zend_Db_Adapter_Exception("LIMIT argument offset=$offset is not valid"); + } + + /** + * Oracle does not implement the LIMIT clause as some RDBMS do. + * We have to simulate it with subqueries and ROWNUM. + * Unfortunately because we use the column wildcard "*", + * this puts an extra column into the query result set. + */ + $limit_sql = "SELECT z2.* + FROM ( + SELECT ROWNUM AS zend_db_rownum, z1.* + FROM ( + " . $sql . " + ) z1 + ) z2 + WHERE z2.zend_db_rownum BETWEEN " . ($offset+1) . " AND " . ($offset+$count); + return $limit_sql; + } + +} diff --git a/libs/Zend/Db/Adapter/Pdo/Pgsql.php b/libs/Zend/Db/Adapter/Pdo/Pgsql.php new file mode 100644 index 0000000..8288236 --- /dev/null +++ b/libs/Zend/Db/Adapter/Pdo/Pgsql.php @@ -0,0 +1,306 @@ + Zend_Db::INT_TYPE, + Zend_Db::BIGINT_TYPE => Zend_Db::BIGINT_TYPE, + Zend_Db::FLOAT_TYPE => Zend_Db::FLOAT_TYPE, + 'INTEGER' => Zend_Db::INT_TYPE, + 'SERIAL' => Zend_Db::INT_TYPE, + 'SMALLINT' => Zend_Db::INT_TYPE, + 'BIGINT' => Zend_Db::BIGINT_TYPE, + 'BIGSERIAL' => Zend_Db::BIGINT_TYPE, + 'DECIMAL' => Zend_Db::FLOAT_TYPE, + 'DOUBLE PRECISION' => Zend_Db::FLOAT_TYPE, + 'NUMERIC' => Zend_Db::FLOAT_TYPE, + 'REAL' => Zend_Db::FLOAT_TYPE + ); + + /** + * Returns a list of the tables in the database. + * + * @return array + */ + 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_'"; + + return $this->fetchCol($sql); + } + + /** + * Returns the column descriptions for a table. + * + * The return value is an associative array keyed by the column name, + * as returned by the RDBMS. + * + * The value of each array element is an associative array + * with the following keys: + * + * SCHEMA_NAME => string; name of database or schema + * TABLE_NAME => string; + * COLUMN_NAME => string; column name + * COLUMN_POSITION => number; ordinal position of column in table + * DATA_TYPE => string; SQL datatype name of column + * DEFAULT => string; default expression of column, null if none + * NULLABLE => boolean; true if column can have nulls + * LENGTH => number; length of CHAR/VARCHAR + * SCALE => number; scale of NUMERIC/DECIMAL + * PRECISION => number; precision of NUMERIC/DECIMAL + * UNSIGNED => boolean; unsigned property of an integer type + * PRIMARY => boolean; true if column is part of the primary key + * PRIMARY_POSITION => integer; position of column in primary key + * IDENTITY => integer; true if column is auto-generated with unique values + * + * @todo Discover integer unsigned property. + * + * @param string $tableName + * @param string $schemaName OPTIONAL + * @return array + */ + public function describeTable($tableName, $schemaName = null) + { + $sql = "SELECT + a.attnum, + n.nspname, + c.relname, + a.attname AS colname, + t.typname AS type, + a.atttypmod, + FORMAT_TYPE(a.atttypid, a.atttypmod) AS complete_type, + d.adsrc AS default_value, + a.attnotnull AS notnull, + a.attlen AS length, + co.contype, + ARRAY_TO_STRING(co.conkey, ',') AS conkey + FROM pg_attribute AS a + JOIN pg_class AS c ON a.attrelid = c.oid + JOIN pg_namespace AS n ON c.relnamespace = n.oid + JOIN pg_type AS t ON a.atttypid = t.oid + LEFT OUTER JOIN pg_constraint AS co ON (co.conrelid = c.oid + AND a.attnum = ANY(co.conkey) AND co.contype = 'p') + LEFT OUTER JOIN pg_attrdef AS d ON d.adrelid = c.oid AND d.adnum = a.attnum + WHERE a.attnum > 0 AND c.relname = ".$this->quote($tableName); + if ($schemaName) { + $sql .= " AND n.nspname = ".$this->quote($schemaName); + } + $sql .= ' ORDER BY a.attnum'; + + $stmt = $this->query($sql); + + // Use FETCH_NUM so we are not dependent on the CASE attribute of the PDO connection + $result = $stmt->fetchAll(Zend_Db::FETCH_NUM); + + $attnum = 0; + $nspname = 1; + $relname = 2; + $colname = 3; + $type = 4; + $atttypemod = 5; + $complete_type = 6; + $default_value = 7; + $notnull = 8; + $length = 9; + $contype = 10; + $conkey = 11; + + $desc = array(); + foreach ($result as $key => $row) { + if ($row[$type] == 'varchar') { + if (preg_match('/character varying(?:\((\d+)\))?/', $row[$complete_type], $matches)) { + if (isset($matches[1])) { + $row[$length] = $matches[1]; + } else { + $row[$length] = null; // unlimited + } + } + } + list($primary, $primaryPosition, $identity) = array(false, null, false); + if ($row[$contype] == 'p') { + $primary = true; + $primaryPosition = array_search($row[$attnum], explode(',', $row[$conkey])) + 1; + $identity = (bool) (preg_match('/^nextval/', $row[$default_value])); + } + $desc[$this->foldCase($row[$colname])] = array( + 'SCHEMA_NAME' => $this->foldCase($row[$nspname]), + 'TABLE_NAME' => $this->foldCase($row[$relname]), + 'COLUMN_NAME' => $this->foldCase($row[$colname]), + 'COLUMN_POSITION' => $row[$attnum], + 'DATA_TYPE' => $row[$type], + 'DEFAULT' => $row[$default_value], + 'NULLABLE' => (bool) ($row[$notnull] != 't'), + 'LENGTH' => $row[$length], + 'SCALE' => null, // @todo + 'PRECISION' => null, // @todo + 'UNSIGNED' => null, // @todo + 'PRIMARY' => $primary, + 'PRIMARY_POSITION' => $primaryPosition, + 'IDENTITY' => $identity + ); + } + return $desc; + } + + + /** + * Adds an adapter-specific LIMIT clause to the SELECT statement. + * + * @param string $sql + * @param integer $count + * @param integer $offset OPTIONAL + * @return string + */ + public function limit($sql, $count, $offset = 0) + { + $count = intval($count); + if ($count <= 0) { + /** + * @see Zend_Db_Adapter_Exception + */ + require_once 'Zend/Db/Adapter/Exception.php'; + throw new Zend_Db_Adapter_Exception("LIMIT argument count=$count is not valid"); + } + + $offset = intval($offset); + if ($offset < 0) { + /** + * @see Zend_Db_Adapter_Exception + */ + require_once 'Zend/Db/Adapter/Exception.php'; + throw new Zend_Db_Adapter_Exception("LIMIT argument offset=$offset is not valid"); + } + + $sql .= " LIMIT $count"; + if ($offset > 0) { + $sql .= " OFFSET $offset"; + } + + return $sql; + } + + /** + * Return the most recent value from the specified sequence in the database. + * This is supported only on RDBMS brands that support sequences + * (e.g. Oracle, PostgreSQL, DB2). Other RDBMS brands return null. + * + * @param string $sequenceName + * @return string + */ + public function lastSequenceId($sequenceName) + { + $this->_connect(); + $value = $this->fetchOne("SELECT CURRVAL(".$this->quote($sequenceName).")"); + return $value; + } + + /** + * Generate a new value from the specified sequence in the database, and return it. + * This is supported only on RDBMS brands that support sequences + * (e.g. Oracle, PostgreSQL, DB2). Other RDBMS brands return null. + * + * @param string $sequenceName + * @return string + */ + public function nextSequenceId($sequenceName) + { + $this->_connect(); + $value = $this->fetchOne("SELECT NEXTVAL(".$this->quote($sequenceName).")"); + return $value; + } + + /** + * Gets the last ID generated automatically by an IDENTITY/AUTOINCREMENT column. + * + * As a convention, on RDBMS brands that support sequences + * (e.g. Oracle, PostgreSQL, DB2), this method forms the name of a sequence + * from the arguments and returns the last id generated by that sequence. + * On RDBMS brands that support IDENTITY/AUTOINCREMENT columns, this method + * returns the last value generated for such a column, and the table name + * argument is disregarded. + * + * @param string $tableName OPTIONAL Name of table. + * @param string $primaryKey OPTIONAL Name of primary key column. + * @return string + */ + public function lastInsertId($tableName = null, $primaryKey = null) + { + if ($tableName !== null) { + $sequenceName = $tableName; + if ($primaryKey) { + $sequenceName .= "_$primaryKey"; + } + $sequenceName .= '_seq'; + return $this->lastSequenceId($sequenceName); + } + return $this->_connection->lastInsertId($tableName); + } + +} diff --git a/libs/Zend/Db/Adapter/Pdo/Sqlite.php b/libs/Zend/Db/Adapter/Pdo/Sqlite.php new file mode 100644 index 0000000..d433888 --- /dev/null +++ b/libs/Zend/Db/Adapter/Pdo/Sqlite.php @@ -0,0 +1,295 @@ + Zend_Db::INT_TYPE, + Zend_Db::BIGINT_TYPE => Zend_Db::BIGINT_TYPE, + Zend_Db::FLOAT_TYPE => Zend_Db::FLOAT_TYPE, + 'INTEGER' => Zend_Db::BIGINT_TYPE, + 'REAL' => Zend_Db::FLOAT_TYPE + ); + + /** + * Constructor. + * + * $config is an array of key/value pairs containing configuration + * options. Note that the SQLite options are different than most of + * the other PDO adapters in that no username or password are needed. + * Also, an extra config key "sqlite2" specifies compatibility mode. + * + * dbname => (string) The name of the database to user (required, + * use :memory: for memory-based database) + * + * sqlite2 => (boolean) PDO_SQLITE defaults to SQLite 3. For compatibility + * with an older SQLite 2 database, set this to TRUE. + * + * @param array $config An array of configuration keys. + */ + public function __construct(array $config = array()) + { + if (isset($config['sqlite2']) && $config['sqlite2']) { + $this->_pdoType = 'sqlite2'; + } + + // SQLite uses no username/password. Stub to satisfy parent::_connect() + $this->_config['username'] = null; + $this->_config['password'] = null; + + return parent::__construct($config); + } + + /** + * Check for config options that are mandatory. + * Throw exceptions if any are missing. + * + * @param array $config + * @throws Zend_Db_Adapter_Exception + */ + protected function _checkRequiredOptions(array $config) + { + // we need at least a dbname + if (! array_key_exists('dbname', $config)) { + /** @see Zend_Db_Adapter_Exception */ + require_once 'Zend/Db/Adapter/Exception.php'; + throw new Zend_Db_Adapter_Exception("Configuration array must have a key for 'dbname' that names the database instance"); + } + } + + /** + * DSN builder + */ + protected function _dsn() + { + return $this->_pdoType .':'. $this->_config['dbname']; + } + + /** + * Special configuration for SQLite behavior: make sure that result sets + * contain keys like 'column' instead of 'table.column'. + * + * @throws Zend_Db_Adapter_Exception + */ + protected function _connect() + { + /** + * if we already have a PDO object, no need to re-connect. + */ + if ($this->_connection) { + return; + } + + parent::_connect(); + + $retval = $this->_connection->exec('PRAGMA full_column_names=0'); + if ($retval === false) { + $error = $this->_connection->errorInfo(); + /** @see Zend_Db_Adapter_Exception */ + require_once 'Zend/Db/Adapter/Exception.php'; + throw new Zend_Db_Adapter_Exception($error[2]); + } + + $retval = $this->_connection->exec('PRAGMA short_column_names=1'); + if ($retval === false) { + $error = $this->_connection->errorInfo(); + /** @see Zend_Db_Adapter_Exception */ + require_once 'Zend/Db/Adapter/Exception.php'; + throw new Zend_Db_Adapter_Exception($error[2]); + } + } + + /** + * Returns a list of the tables in the database. + * + * @return array + */ + public function listTables() + { + $sql = "SELECT name FROM sqlite_master WHERE type='table' " + . "UNION ALL SELECT name FROM sqlite_temp_master " + . "WHERE type='table' ORDER BY name"; + + return $this->fetchCol($sql); + } + + /** + * Returns the column descriptions for a table. + * + * The return value is an associative array keyed by the column name, + * as returned by the RDBMS. + * + * The value of each array element is an associative array + * with the following keys: + * + * SCHEMA_NAME => string; name of database or schema + * TABLE_NAME => string; + * COLUMN_NAME => string; column name + * COLUMN_POSITION => number; ordinal position of column in table + * DATA_TYPE => string; SQL datatype name of column + * DEFAULT => string; default expression of column, null if none + * NULLABLE => boolean; true if column can have nulls + * LENGTH => number; length of CHAR/VARCHAR + * SCALE => number; scale of NUMERIC/DECIMAL + * PRECISION => number; precision of NUMERIC/DECIMAL + * UNSIGNED => boolean; unsigned property of an integer type + * PRIMARY => boolean; true if column is part of the primary key + * PRIMARY_POSITION => integer; position of column in primary key + * IDENTITY => integer; true if column is auto-generated with unique values + * + * @param string $tableName + * @param string $schemaName OPTIONAL + * @return array + */ + public function describeTable($tableName, $schemaName = null) + { + if ($schemaName) { + $sql = "PRAGMA $schemaName.table_info($tableName)"; + } else { + $sql = "PRAGMA table_info($tableName)"; + } + + $stmt = $this->query($sql); + + /** + * Use FETCH_NUM so we are not dependent on the CASE attribute of the PDO connection + */ + $result = $stmt->fetchAll(Zend_Db::FETCH_NUM); + + $cid = 0; + $name = 1; + $type = 2; + $notnull = 3; + $dflt_value = 4; + $pk = 5; + + $desc = array(); + + $p = 1; + foreach ($result as $key => $row) { + list($length, $scale, $precision, $primary, $primaryPosition, $identity) = + array(null, null, null, false, null, false); + if (preg_match('/^((?:var)?char)\((\d+)\)/i', $row[$type], $matches)) { + $row[$type] = $matches[1]; + $length = $matches[2]; + } else if (preg_match('/^decimal\((\d+),(\d+)\)/i', $row[$type], $matches)) { + $row[$type] = 'DECIMAL'; + $precision = $matches[1]; + $scale = $matches[2]; + } + if ((bool) $row[$pk]) { + $primary = true; + $primaryPosition = $p; + /** + * SQLite INTEGER primary key is always auto-increment. + */ + $identity = (bool) ($row[$type] == 'INTEGER'); + ++$p; + } + $desc[$this->foldCase($row[$name])] = array( + 'SCHEMA_NAME' => $this->foldCase($schemaName), + 'TABLE_NAME' => $this->foldCase($tableName), + 'COLUMN_NAME' => $this->foldCase($row[$name]), + 'COLUMN_POSITION' => $row[$cid]+1, + 'DATA_TYPE' => $row[$type], + 'DEFAULT' => $row[$dflt_value], + 'NULLABLE' => ! (bool) $row[$notnull], + 'LENGTH' => $length, + 'SCALE' => $scale, + 'PRECISION' => $precision, + 'UNSIGNED' => null, // Sqlite3 does not support unsigned data + 'PRIMARY' => $primary, + 'PRIMARY_POSITION' => $primaryPosition, + 'IDENTITY' => $identity + ); + } + return $desc; + } + + /** + * Adds an adapter-specific LIMIT clause to the SELECT statement. + * + * @param string $sql + * @param integer $count + * @param integer $offset OPTIONAL + * @return string + */ + public function limit($sql, $count, $offset = 0) + { + $count = intval($count); + if ($count <= 0) { + /** @see Zend_Db_Adapter_Exception */ + require_once 'Zend/Db/Adapter/Exception.php'; + throw new Zend_Db_Adapter_Exception("LIMIT argument count=$count is not valid"); + } + + $offset = intval($offset); + if ($offset < 0) { + /** @see Zend_Db_Adapter_Exception */ + require_once 'Zend/Db/Adapter/Exception.php'; + throw new Zend_Db_Adapter_Exception("LIMIT argument offset=$offset is not valid"); + } + + $sql .= " LIMIT $count"; + if ($offset > 0) { + $sql .= " OFFSET $offset"; + } + + return $sql; + } + +} diff --git a/libs/Zend/Db/Exception.php b/libs/Zend/Db/Exception.php new file mode 100644 index 0000000..9359b14 --- /dev/null +++ b/libs/Zend/Db/Exception.php @@ -0,0 +1,34 @@ +_expression = (string) $expression; + } + + /** + * @return string The string of the SQL expression stored in this object. + */ + public function __toString() + { + return $this->_expression; + } + +} diff --git a/libs/Zend/Db/Profiler.php b/libs/Zend/Db/Profiler.php new file mode 100644 index 0000000..b05e3ba --- /dev/null +++ b/libs/Zend/Db/Profiler.php @@ -0,0 +1,460 @@ +setEnabled($enabled); + } + + /** + * Enable or disable the profiler. If $enable is false, the profiler + * is disabled and will not log any queries sent to it. + * + * @param boolean $enable + * @return Zend_Db_Profiler Provides a fluent interface + */ + public function setEnabled($enable) + { + $this->_enabled = (boolean) $enable; + + return $this; + } + + /** + * Get the current state of enable. If True is returned, + * the profiler is enabled. + * + * @return boolean + */ + public function getEnabled() + { + return $this->_enabled; + } + + /** + * Sets a minimum number of seconds for saving query profiles. If this + * is set, only those queries whose elapsed time is equal or greater than + * $minimumSeconds will be saved. To save all queries regardless of + * elapsed time, set $minimumSeconds to null. + * + * @param integer $minimumSeconds OPTIONAL + * @return Zend_Db_Profiler Provides a fluent interface + */ + public function setFilterElapsedSecs($minimumSeconds = null) + { + if (null === $minimumSeconds) { + $this->_filterElapsedSecs = null; + } else { + $this->_filterElapsedSecs = (integer) $minimumSeconds; + } + + return $this; + } + + /** + * Returns the minimum number of seconds for saving query profiles, or null if + * query profiles are saved regardless of elapsed time. + * + * @return integer|null + */ + public function getFilterElapsedSecs() + { + return $this->_filterElapsedSecs; + } + + /** + * Sets the types of query profiles to save. Set $queryType to one of + * the Zend_Db_Profiler::* constants to only save profiles for that type of + * query. To save more than one type, logical OR them together. To + * save all queries regardless of type, set $queryType to null. + * + * @param integer $queryTypes OPTIONAL + * @return Zend_Db_Profiler Provides a fluent interface + */ + public function setFilterQueryType($queryTypes = null) + { + $this->_filterTypes = $queryTypes; + + return $this; + } + + /** + * Returns the types of query profiles saved, or null if queries are saved regardless + * of their types. + * + * @return integer|null + * @see Zend_Db_Profiler::setFilterQueryType() + */ + public function getFilterQueryType() + { + return $this->_filterTypes; + } + + /** + * Clears the history of any past query profiles. This is relentless + * and will even clear queries that were started and may not have + * been marked as ended. + * + * @return Zend_Db_Profiler Provides a fluent interface + */ + public function clear() + { + $this->_queryProfiles = array(); + + return $this; + } + + /** + * @param integer $queryId + * @return integer or null + */ + public function queryClone(Zend_Db_Profiler_Query $query) + { + $this->_queryProfiles[] = clone $query; + + end($this->_queryProfiles); + + return key($this->_queryProfiles); + } + + /** + * Starts a query. Creates a new query profile object (Zend_Db_Profiler_Query) + * and returns the "query profiler handle". Run the query, then call + * queryEnd() and pass it this handle to make the query as ended and + * record the time. If the profiler is not enabled, this takes no + * action and immediately returns null. + * + * @param string $queryText SQL statement + * @param integer $queryType OPTIONAL Type of query, one of the Zend_Db_Profiler::* constants + * @return integer|null + */ + public function queryStart($queryText, $queryType = null) + { + if (!$this->_enabled) { + return null; + } + + // make sure we have a query type + if (null === $queryType) { + switch (strtolower(substr($queryText, 0, 6))) { + case 'insert': + $queryType = self::INSERT; + break; + case 'update': + $queryType = self::UPDATE; + break; + case 'delete': + $queryType = self::DELETE; + break; + case 'select': + $queryType = self::SELECT; + break; + default: + $queryType = self::QUERY; + break; + } + } + + /** + * @see Zend_Db_Profiler_Query + */ + require_once 'Zend/Db/Profiler/Query.php'; + $this->_queryProfiles[] = new Zend_Db_Profiler_Query($queryText, $queryType); + + end($this->_queryProfiles); + + return key($this->_queryProfiles); + } + + /** + * Ends a query. Pass it the handle that was returned by queryStart(). + * This will mark the query as ended and save the time. + * + * @param integer $queryId + * @throws Zend_Db_Profiler_Exception + * @return void + */ + public function queryEnd($queryId) + { + // Don't do anything if the Zend_Db_Profiler is not enabled. + if (!$this->_enabled) { + return; + } + + // Check for a valid query handle. + if (!isset($this->_queryProfiles[$queryId])) { + /** + * @see Zend_Db_Profiler_Exception + */ + require_once 'Zend/Db/Profiler/Exception.php'; + throw new Zend_Db_Profiler_Exception("Profiler has no query with handle '$queryId'."); + } + + $qp = $this->_queryProfiles[$queryId]; + + // Ensure that the query profile has not already ended + if ($qp->hasEnded()) { + /** + * @see Zend_Db_Profiler_Exception + */ + require_once 'Zend/Db/Profiler/Exception.php'; + throw new Zend_Db_Profiler_Exception("Query with profiler handle '$queryId' has already ended."); + } + + // End the query profile so that the elapsed time can be calculated. + $qp->end(); + + /** + * If filtering by elapsed time is enabled, only keep the profile if + * it ran for the minimum time. + */ + if (null !== $this->_filterElapsedSecs && $qp->getElapsedSecs() < $this->_filterElapsedSecs) { + unset($this->_queryProfiles[$queryId]); + return; + } + + /** + * If filtering by query type is enabled, only keep the query if + * it was one of the allowed types. + */ + if (null !== $this->_filterTypes && !($qp->getQueryType() & $this->_filterTypes)) { + unset($this->_queryProfiles[$queryId]); + return; + } + } + + /** + * Get a profile for a query. Pass it the same handle that was returned + * by queryStart() and it will return a Zend_Db_Profiler_Query object. + * + * @param integer $queryId + * @throws Zend_Db_Profiler_Exception + * @return Zend_Db_Profiler_Query + */ + public function getQueryProfile($queryId) + { + if (!array_key_exists($queryId, $this->_queryProfiles)) { + /** + * @see Zend_Db_Profiler_Exception + */ + require_once 'Zend/Db/Profiler/Exception.php'; + throw new Zend_Db_Profiler_Exception("Query handle '$queryId' not found in profiler log."); + } + + return $this->_queryProfiles[$queryId]; + } + + /** + * Get an array of query profiles (Zend_Db_Profiler_Query objects). If $queryType + * is set to one of the Zend_Db_Profiler::* constants then only queries of that + * type will be returned. Normally, queries that have not yet ended will + * not be returned unless $showUnfinished is set to True. If no + * queries were found, False is returned. The returned array is indexed by the query + * profile handles. + * + * @param integer $queryType + * @param boolean $showUnfinished + * @return array|false + */ + public function getQueryProfiles($queryType = null, $showUnfinished = false) + { + $queryProfiles = array(); + foreach ($this->_queryProfiles as $key => $qp) { + if ($queryType === null) { + $condition = true; + } else { + $condition = ($qp->getQueryType() & $queryType); + } + + if (($qp->hasEnded() || $showUnfinished) && $condition) { + $queryProfiles[$key] = $qp; + } + } + + if (empty($queryProfiles)) { + $queryProfiles = false; + } + + return $queryProfiles; + } + + /** + * Get the total elapsed time (in seconds) of all of the profiled queries. + * Only queries that have ended will be counted. If $queryType is set to + * one or more of the Zend_Db_Profiler::* constants, the elapsed time will be calculated + * only for queries of the given type(s). + * + * @param integer $queryType OPTIONAL + * @return float + */ + public function getTotalElapsedSecs($queryType = null) + { + $elapsedSecs = 0; + foreach ($this->_queryProfiles as $key => $qp) { + if (null === $queryType) { + $condition = true; + } else { + $condition = ($qp->getQueryType() & $queryType); + } + if (($qp->hasEnded()) && $condition) { + $elapsedSecs += $qp->getElapsedSecs(); + } + } + return $elapsedSecs; + } + + /** + * Get the total number of queries that have been profiled. Only queries that have ended will + * be counted. If $queryType is set to one of the Zend_Db_Profiler::* constants, only queries of + * that type will be counted. + * + * @param integer $queryType OPTIONAL + * @return integer + */ + public function getTotalNumQueries($queryType = null) + { + if (null === $queryType) { + return count($this->_queryProfiles); + } + + $numQueries = 0; + foreach ($this->_queryProfiles as $qp) { + if ($qp->hasEnded() && ($qp->getQueryType() & $queryType)) { + $numQueries++; + } + } + + return $numQueries; + } + + /** + * Get the Zend_Db_Profiler_Query object for the last query that was run, regardless if it has + * ended or not. If the query has not ended, its end time will be null. If no queries have + * been profiled, false is returned. + * + * @return Zend_Db_Profiler_Query|false + */ + public function getLastQueryProfile() + { + if (empty($this->_queryProfiles)) { + return false; + } + + end($this->_queryProfiles); + + return current($this->_queryProfiles); + } + +} + diff --git a/libs/Zend/Db/Profiler/Exception.php b/libs/Zend/Db/Profiler/Exception.php new file mode 100644 index 0000000..2a2c16d --- /dev/null +++ b/libs/Zend/Db/Profiler/Exception.php @@ -0,0 +1,40 @@ +_label = $label; + if(!$this->_label) { + $this->_label = 'Zend_Db_Profiler_Firebug'; + } + } + + /** + * Enable or disable the profiler. If $enable is false, the profiler + * is disabled and will not log any queries sent to it. + * + * @param boolean $enable + * @return Zend_Db_Profiler Provides a fluent interface + */ + public function setEnabled($enable) + { + parent::setEnabled($enable); + + if ($this->getEnabled()) { + + if (!$this->_message) { + $this->_message = new Zend_Wildfire_Plugin_FirePhp_TableMessage($this->_label); + $this->_message->setBuffered(true); + $this->_message->setHeader(array('Time','Event','Parameters')); + $this->_message->setDestroy(true); + Zend_Wildfire_Plugin_FirePhp::getInstance()->send($this->_message); + } + + } else { + + if ($this->_message) { + $this->_message->setDestroy(true); + $this->_message = null; + } + + } + + return $this; + } + + /** + * Intercept the query end and log the profiling data. + * + * @param integer $queryId + * @throws Zend_Db_Profiler_Exception + * @return void + */ + public function queryEnd($queryId) + { + parent::queryEnd($queryId); + + if (!$this->getEnabled()) { + return; + } + + $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() + { + if (!$this->_message) { + return; + } + $this->_message->setLabel(str_replace(array('%label%', + '%totalCount%', + '%totalDuration%'), + array($this->_label, + $this->getTotalNumQueries(), + (string)round($this->_totalElapsedTime,5)), + $this->_label_template)); + } +} diff --git a/libs/Zend/Db/Profiler/Query.php b/libs/Zend/Db/Profiler/Query.php new file mode 100644 index 0000000..3943114 --- /dev/null +++ b/libs/Zend/Db/Profiler/Query.php @@ -0,0 +1,199 @@ +_query = $query; + $this->_queryType = $queryType; + // by default, and for backward-compatibility, start the click ticking + $this->start(); + } + + /** + * Clone handler for the query object. + * @return void + */ + public function __clone() + { + $this->_boundParams = array(); + $this->_endedMicrotime = null; + $this->start(); + } + + /** + * Starts the elapsed time click ticking. + * This can be called subsequent to object creation, + * to restart the clock. For instance, this is useful + * right before executing a prepared query. + * + * @return void + */ + public function start() + { + $this->_startedMicrotime = microtime(true); + } + + /** + * Ends the query and records the time so that the elapsed time can be determined later. + * + * @return void + */ + public function end() + { + $this->_endedMicrotime = microtime(true); + } + + /** + * Returns true if and only if the query has ended. + * + * @return boolean + */ + public function hasEnded() + { + return $this->_endedMicrotime !== null; + } + + /** + * Get the original SQL text of the query. + * + * @return string + */ + public function getQuery() + { + return $this->_query; + } + + /** + * Get the type of this query (one of the Zend_Db_Profiler::* constants) + * + * @return integer + */ + public function getQueryType() + { + return $this->_queryType; + } + + /** + * @param string $param + * @param mixed $variable + * @return void + */ + public function bindParam($param, $variable) + { + $this->_boundParams[$param] = $variable; + } + + /** + * @param array $param + * @return void + */ + public function bindParams(array $params) + { + if (array_key_exists(0, $params)) { + array_unshift($params, null); + unset($params[0]); + } + foreach ($params as $param => $value) { + $this->bindParam($param, $value); + } + } + + /** + * @return array + */ + public function getQueryParams() + { + return $this->_boundParams; + } + + /** + * Get the elapsed time (in seconds) that the query ran. + * If the query has not yet ended, false is returned. + * + * @return float|false + */ + public function getElapsedSecs() + { + if (null === $this->_endedMicrotime) { + return false; + } + + return $this->_endedMicrotime - $this->_startedMicrotime; + } +} + diff --git a/libs/Zend/Db/Select.php b/libs/Zend/Db/Select.php new file mode 100644 index 0000000..53621fb --- /dev/null +++ b/libs/Zend/Db/Select.php @@ -0,0 +1,1239 @@ + false, + self::COLUMNS => array(), + self::UNION => array(), + self::FROM => array(), + self::WHERE => array(), + self::GROUP => array(), + self::HAVING => array(), + self::ORDER => array(), + self::LIMIT_COUNT => null, + self::LIMIT_OFFSET => null, + self::FOR_UPDATE => false + ); + + /** + * Specify legal join types. + * + * @var array + */ + protected static $_joinTypes = array( + self::INNER_JOIN, + self::LEFT_JOIN, + self::RIGHT_JOIN, + self::FULL_JOIN, + self::CROSS_JOIN, + self::NATURAL_JOIN, + ); + + /** + * Specify legal union types. + * + * @var array + */ + protected static $_unionTypes = array( + self::SQL_UNION, + self::SQL_UNION_ALL + ); + + /** + * The component parts of a SELECT statement. + * Initialized to the $_partsInit array in the constructor. + * + * @var array + */ + protected $_parts = array(); + + /** + * Tracks which columns are being select from each table and join. + * + * @var array + */ + protected $_tableCols = array(); + + /** + * Class constructor + * + * @param Zend_Db_Adapter_Abstract $adapter + */ + public function __construct(Zend_Db_Adapter_Abstract $adapter) + { + $this->_adapter = $adapter; + $this->_parts = self::$_partsInit; + } + + /** + * Makes the query SELECT DISTINCT. + * + * @param bool $flag Whether or not the SELECT is DISTINCT (default true). + * @return Zend_Db_Select This Zend_Db_Select object. + */ + public function distinct($flag = true) + { + $this->_parts[self::DISTINCT] = (bool) $flag; + return $this; + } + + /** + * Adds a FROM table and optional columns to the query. + * + * The first parameter $name can be a simple string, in which case the + * correlation name is generated automatically. If you want to specify + * the correlation name, the first parameter must be an associative + * array in which the key is the physical table name, and the value is + * the correlation name. For example, array('table' => 'alias'). + * The correlation name is prepended to all columns fetched for this + * table. + * + * The second parameter can be a single string or Zend_Db_Expr object, + * or else an array of strings or Zend_Db_Expr objects. + * + * The first parameter can be null or an empty string, in which case + * no correlation name is generated or prepended to the columns named + * in the second parameter. + * + * @param array|string|Zend_Db_Expr $name The table name or an associative array relating table name to + * correlation name. + * @param array|string|Zend_Db_Expr $cols The columns to select from this table. + * @param string $schema The schema name to specify, if any. + * @return Zend_Db_Select This Zend_Db_Select object. + */ + public function from($name, $cols = '*', $schema = null) + { + return $this->joinInner($name, null, $cols, $schema); + } + + /** + * Specifies the columns used in the FROM clause. + * + * The parameter can be a single string or Zend_Db_Expr object, + * or else an array of strings or Zend_Db_Expr objects. + * + * @param array|string|Zend_Db_Expr $cols The columns to select from this table. + * @param string $correlationName Correlation name of target table. OPTIONAL + * @return Zend_Db_Select This Zend_Db_Select object. + */ + public function columns($cols = '*', $correlationName = null) + { + if ($correlationName === null && count($this->_parts[self::FROM])) { + $correlationName = current(array_keys($this->_parts[self::FROM])); + } + + if (!array_key_exists($correlationName, $this->_parts[self::FROM])) { + /** + * @see Zend_Db_Select_Exception + */ + require_once 'Zend/Db/Select/Exception.php'; + throw new Zend_Db_Select_Exception("No table has been specified for the FROM clause"); + } + + $this->_tableCols($correlationName, $cols); + + return $this; + } + + /** + * Adds a UNION clause to the query. + * + * The first parameter $select can be a string, an existing Zend_Db_Select + * object or an array of either of these types. + * + * @param array|string|Zend_Db_Select $select One or more select clauses for the UNION. + * @return Zend_Db_Select This Zend_Db_Select object. + */ + public function union($select = array(), $type = self::SQL_UNION) + { + if (!is_array($select)) { + $select = array(); + } + + if (!in_array($type, self::$_unionTypes)) { + require_once 'Zend/Db/Select/Exception.php'; + throw new Zend_Db_Select_Exception("Invalid union type '{$type}'"); + } + + foreach ($select as $target) { + $this->_parts[self::UNION][] = array($target, $type); + } + + return $this; + } + + /** + * Adds a JOIN table and columns to the query. + * + * The $name and $cols parameters follow the same logic + * as described in the from() method. + * + * @param array|string|Zend_Db_Expr $name The table name. + * @param string $cond Join on this condition. + * @param array|string $cols The columns to select from the joined table. + * @param string $schema The database name to specify, if any. + * @return Zend_Db_Select This Zend_Db_Select object. + */ + public function join($name, $cond, $cols = self::SQL_WILDCARD, $schema = null) + { + return $this->joinInner($name, $cond, $cols, $schema); + } + + /** + * Add an INNER JOIN table and colums to the query + * Rows in both tables are matched according to the expression + * in the $cond argument. The result set is comprised + * of all cases where rows from the left table match + * rows from the right table. + * + * The $name and $cols parameters follow the same logic + * as described in the from() method. + * + * @param array|string|Zend_Db_Expr $name The table name. + * @param string $cond Join on this condition. + * @param array|string $cols The columns to select from the joined table. + * @param string $schema The database name to specify, if any. + * @return Zend_Db_Select This Zend_Db_Select object. + */ + public function joinInner($name, $cond, $cols = self::SQL_WILDCARD, $schema = null) + { + return $this->_join(self::INNER_JOIN, $name, $cond, $cols, $schema); + } + + /** + * Add a LEFT OUTER JOIN table and colums to the query + * All rows from the left operand table are included, + * matching rows from the right operand table included, + * and the columns from the right operand table are filled + * with NULLs if no row exists matching the left table. + * + * The $name and $cols parameters follow the same logic + * as described in the from() method. + * + * @param array|string|Zend_Db_Expr $name The table name. + * @param string $cond Join on this condition. + * @param array|string $cols The columns to select from the joined table. + * @param string $schema The database name to specify, if any. + * @return Zend_Db_Select This Zend_Db_Select object. + */ + public function joinLeft($name, $cond, $cols = self::SQL_WILDCARD, $schema = null) + { + return $this->_join(self::LEFT_JOIN, $name, $cond, $cols, $schema); + } + + /** + * Add a RIGHT OUTER JOIN table and colums to the query. + * Right outer join is the complement of left outer join. + * All rows from the right operand table are included, + * matching rows from the left operand table included, + * and the columns from the left operand table are filled + * with NULLs if no row exists matching the right table. + * + * The $name and $cols parameters follow the same logic + * as described in the from() method. + * + * @param array|string|Zend_Db_Expr $name The table name. + * @param string $cond Join on this condition. + * @param array|string $cols The columns to select from the joined table. + * @param string $schema The database name to specify, if any. + * @return Zend_Db_Select This Zend_Db_Select object. + */ + public function joinRight($name, $cond, $cols = self::SQL_WILDCARD, $schema = null) + { + return $this->_join(self::RIGHT_JOIN, $name, $cond, $cols, $schema); + } + + /** + * Add a FULL OUTER JOIN table and colums to the query. + * A full outer join is like combining a left outer join + * and a right outer join. All rows from both tables are + * included, paired with each other on the same row of the + * result set if they satisfy the join condition, and otherwise + * paired with NULLs in place of columns from the other table. + * + * The $name and $cols parameters follow the same logic + * as described in the from() method. + * + * @param array|string|Zend_Db_Expr $name The table name. + * @param string $cond Join on this condition. + * @param array|string $cols The columns to select from the joined table. + * @param string $schema The database name to specify, if any. + * @return Zend_Db_Select This Zend_Db_Select object. + */ + public function joinFull($name, $cond, $cols = self::SQL_WILDCARD, $schema = null) + { + return $this->_join(self::FULL_JOIN, $name, $cond, $cols, $schema); + } + + /** + * Add a CROSS JOIN table and colums to the query. + * A cross join is a cartesian product; there is no join condition. + * + * The $name and $cols parameters follow the same logic + * as described in the from() method. + * + * @param array|string|Zend_Db_Expr $name The table name. + * @param array|string $cols The columns to select from the joined table. + * @param string $schema The database name to specify, if any. + * @return Zend_Db_Select This Zend_Db_Select object. + */ + public function joinCross($name, $cols = self::SQL_WILDCARD, $schema = null) + { + return $this->_join(self::CROSS_JOIN, $name, null, $cols, $schema); + } + + /** + * Add a NATURAL JOIN table and colums to the query. + * A natural join assumes an equi-join across any column(s) + * that appear with the same name in both tables. + * Only natural inner joins are supported by this API, + * even though SQL permits natural outer joins as well. + * + * The $name and $cols parameters follow the same logic + * as described in the from() method. + * + * @param array|string|Zend_Db_Expr $name The table name. + * @param array|string $cols The columns to select from the joined table. + * @param string $schema The database name to specify, if any. + * @return Zend_Db_Select This Zend_Db_Select object. + */ + public function joinNatural($name, $cols = self::SQL_WILDCARD, $schema = null) + { + return $this->_join(self::NATURAL_JOIN, $name, null, $cols, $schema); + } + + /** + * Adds a WHERE condition to the query by AND. + * + * If a value is passed as the second param, it will be quoted + * and replaced into the condition wherever a question-mark + * appears. Array values are quoted and comma-separated. + * + * + * // simplest but non-secure + * $select->where("id = $id"); + * + * // secure (ID is quoted but matched anyway) + * $select->where('id = ?', $id); + * + * // alternatively, with named binding + * $select->where('id = :id'); + * + * + * Note that it is more correct to use named bindings in your + * queries for values other than strings. When you use named + * bindings, don't forget to pass the values when actually + * making a query: + * + * + * $db->fetchAll($select, array('id' => 5)); + * + * + * @param string $cond The WHERE condition. + * @param string $value OPTIONAL A single value to quote into the condition. + * @param constant $type OPTIONAL The type of the given value + * @return Zend_Db_Select This Zend_Db_Select object. + */ + public function where($cond, $value = null, $type = null) + { + $this->_parts[self::WHERE][] = $this->_where($cond, $value, $type, true); + + return $this; + } + + /** + * Adds a WHERE condition to the query by OR. + * + * Otherwise identical to where(). + * + * @param string $cond The WHERE condition. + * @param string $value OPTIONAL A single value to quote into the condition. + * @param constant $type OPTIONAL The type of the given value + * @return Zend_Db_Select This Zend_Db_Select object. + * + * @see where() + */ + public function orWhere($cond, $value = null, $type = null) + { + $this->_parts[self::WHERE][] = $this->_where($cond, $value, $type, false); + + return $this; + } + + /** + * Adds grouping to the query. + * + * @param array|string $spec The column(s) to group by. + * @return Zend_Db_Select This Zend_Db_Select object. + */ + public function group($spec) + { + if (!is_array($spec)) { + $spec = array($spec); + } + + foreach ($spec as $val) { + if (preg_match('/\(.*\)/', (string) $val)) { + $val = new Zend_Db_Expr($val); + } + $this->_parts[self::GROUP][] = $val; + } + + return $this; + } + + /** + * Adds a HAVING condition to the query by AND. + * + * If a value is passed as the second param, it will be quoted + * and replaced into the condition wherever a question-mark + * appears. See {@link where()} for an example + * + * @param string $cond The HAVING condition. + * @param string|Zend_Db_Expr $val A single value to quote into the condition. + * @return Zend_Db_Select This Zend_Db_Select object. + */ + public function having($cond) + { + if (func_num_args() > 1) { + $val = func_get_arg(1); + $cond = $this->_adapter->quoteInto($cond, $val); + } + + if ($this->_parts[self::HAVING]) { + $this->_parts[self::HAVING][] = self::SQL_AND . " ($cond)"; + } else { + $this->_parts[self::HAVING][] = "($cond)"; + } + + return $this; + } + + /** + * Adds a HAVING condition to the query by OR. + * + * Otherwise identical to orHaving(). + * + * @param string $cond The HAVING condition. + * @param string $val A single value to quote into the condition. + * @return Zend_Db_Select This Zend_Db_Select object. + * + * @see having() + */ + public function orHaving($cond) + { + if (func_num_args() > 1) { + $val = func_get_arg(1); + $cond = $this->_adapter->quoteInto($cond, $val); + } + + if ($this->_parts[self::HAVING]) { + $this->_parts[self::HAVING][] = self::SQL_OR . " ($cond)"; + } else { + $this->_parts[self::HAVING][] = "($cond)"; + } + + return $this; + } + + /** + * Adds a row order to the query. + * + * @param mixed $spec The column(s) and direction to order by. + * @return Zend_Db_Select This Zend_Db_Select object. + */ + public function order($spec) + { + if (!is_array($spec)) { + $spec = array($spec); + } + + // force 'ASC' or 'DESC' on each order spec, default is ASC. + foreach ($spec as $val) { + if ($val instanceof Zend_Db_Expr) { + $expr = $val->__toString(); + if (empty($expr)) { + continue; + } + $this->_parts[self::ORDER][] = $val; + } else { + if (empty($val)) { + continue; + } + $direction = self::SQL_ASC; + if (preg_match('/(.*\W)(' . self::SQL_ASC . '|' . self::SQL_DESC . ')\b/si', $val, $matches)) { + $val = trim($matches[1]); + $direction = $matches[2]; + } + if (preg_match('/\(.*\)/', $val)) { + $val = new Zend_Db_Expr($val); + } + $this->_parts[self::ORDER][] = array($val, $direction); + } + } + + return $this; + } + + /** + * Sets a limit count and offset to the query. + * + * @param int $count OPTIONAL The number of rows to return. + * @param int $offset OPTIONAL Start returning after this many rows. + * @return Zend_Db_Select This Zend_Db_Select object. + */ + public function limit($count = null, $offset = null) + { + $this->_parts[self::LIMIT_COUNT] = (int) $count; + $this->_parts[self::LIMIT_OFFSET] = (int) $offset; + return $this; + } + + /** + * Sets the limit and count by page number. + * + * @param int $page Limit results to this page number. + * @param int $rowCount Use this many rows per page. + * @return Zend_Db_Select This Zend_Db_Select object. + */ + public function limitPage($page, $rowCount) + { + $page = ($page > 0) ? $page : 1; + $rowCount = ($rowCount > 0) ? $rowCount : 1; + $this->_parts[self::LIMIT_COUNT] = (int) $rowCount; + $this->_parts[self::LIMIT_OFFSET] = (int) $rowCount * ($page - 1); + return $this; + } + + /** + * Makes the query SELECT FOR UPDATE. + * + * @param bool $flag Whether or not the SELECT is FOR UPDATE (default true). + * @return Zend_Db_Select This Zend_Db_Select object. + */ + public function forUpdate($flag = true) + { + $this->_parts[self::FOR_UPDATE] = (bool) $flag; + return $this; + } + + /** + * Get part of the structured information for the currect query. + * + * @param string $part + * @return mixed + * @throws Zend_Db_Select_Exception + */ + public function getPart($part) + { + $part = strtolower($part); + if (!array_key_exists($part, $this->_parts)) { + require_once 'Zend/Db/Select/Exception.php'; + throw new Zend_Db_Select_Exception("Invalid Select part '$part'"); + } + return $this->_parts[$part]; + } + + /** + * Executes the current select object and returns the result + * + * @param integer $fetchMode OPTIONAL + * @return PDO_Statement|Zend_Db_Statement + */ + public function query($fetchMode = null) + { + $stmt = $this->_adapter->query($this); + if ($fetchMode == null) { + $fetchMode = $this->_adapter->getFetchMode(); + } + $stmt->setFetchMode($fetchMode); + return $stmt; + } + + /** + * Converts this object to an SQL SELECT string. + * + * @return string This object as a SELECT string. + */ + public function assemble() + { + $sql = self::SQL_SELECT; + foreach (array_keys(self::$_partsInit) as $part) { + $method = '_render' . ucfirst($part); + if (method_exists($this, $method)) { + $sql = $this->$method($sql); + } + } + return $sql; + } + + /** + * Clear parts of the Select object, or an individual part. + * + * @param string $part OPTIONAL + * @return Zend_Db_Select + */ + public function reset($part = null) + { + if ($part == null) { + $this->_parts = self::$_partsInit; + } else if (array_key_exists($part, self::$_partsInit)) { + $this->_parts[$part] = self::$_partsInit[$part]; + } + return $this; + } + + /** + * Gets the Zend_Db_Adapter_Abstract for this + * particular Zend_Db_Select object. + * + * @return Zend_Db_Adapter_Abstract + */ + public function getAdapter() + { + return $this->_adapter; + } + + /** + * Populate the {@link $_parts} 'join' key + * + * Does the dirty work of populating the join key. + * + * The $name and $cols parameters follow the same logic + * as described in the from() method. + * + * @param null|string $type Type of join; inner, left, and null are currently supported + * @param array|string|Zend_Db_Expr $name Table name + * @param string $cond Join on this condition + * @param array|string $cols The columns to select from the joined table + * @param string $schema The database name to specify, if any. + * @return Zend_Db_Select This Zend_Db_Select object + * @throws Zend_Db_Select_Exception + */ + protected function _join($type, $name, $cond, $cols, $schema = null) + { + if (!in_array($type, self::$_joinTypes)) { + /** + * @see Zend_Db_Select_Exception + */ + require_once 'Zend/Db/Select/Exception.php'; + throw new Zend_Db_Select_Exception("Invalid join type '$type'"); + } + + if (count($this->_parts[self::UNION])) { + require_once 'Zend/Db/Select/Exception.php'; + throw new Zend_Db_Select_Exception("Invalid use of table with " . self::SQL_UNION); + } + + if (empty($name)) { + $correlationName = $tableName = ''; + } else if (is_array($name)) { + // Must be array($correlationName => $tableName) or array($ident, ...) + foreach ($name as $_correlationName => $_tableName) { + if (is_string($_correlationName)) { + // We assume the key is the correlation name and value is the table name + $tableName = $_tableName; + $correlationName = $_correlationName; + } else { + // We assume just an array of identifiers, with no correlation name + $tableName = $name; + $correlationName = $this->_uniqueCorrelation($tableName); + } + break; + } + } else if ($name instanceof Zend_Db_Expr|| $name instanceof Zend_Db_Select) { + $tableName = $name; + $correlationName = $this->_uniqueCorrelation('t'); + } else if (preg_match('/^(.+)\s+AS\s+(.+)$/i', $name, $m)) { + $tableName = $m[1]; + $correlationName = $m[2]; + } else { + $tableName = $name; + $correlationName = $this->_uniqueCorrelation($tableName); + } + + // Schema from table name overrides schema argument + if (!is_object($tableName) && false !== strpos($tableName, '.')) { + list($schema, $tableName) = explode('.', $tableName); + } + + if (!empty($correlationName)) { + if (array_key_exists($correlationName, $this->_parts[self::FROM])) { + /** + * @see Zend_Db_Select_Exception + */ + require_once 'Zend/Db/Select/Exception.php'; + throw new Zend_Db_Select_Exception("You cannot define a correlation name '$correlationName' more than once"); + } + + $this->_parts[self::FROM][$correlationName] = array( + 'joinType' => $type, + 'schema' => $schema, + 'tableName' => $tableName, + 'joinCondition' => $cond + ); + } + + // add to the columns from this joined table + $this->_tableCols($correlationName, $cols); + + return $this; + } + + /** + * Handle JOIN... USING... syntax + * + * This is functionality identical to the existing JOIN methods, however + * the join condition can be passed as a single column name. This method + * then completes the ON condition by using the same field for the FROM + * table and the JOIN table. + * + * + * $select = $db->select()->from('table1') + * ->joinUsing('table2', 'column1'); + * + * // SELECT * FROM table1 JOIN table2 ON table1.column1 = table2.column2 + * + * + * These joins are called by the developer simply by adding 'Using' to the + * method name. E.g. + * * joinUsing + * * joinInnerUsing + * * joinFullUsing + * * joinRightUsing + * * joinLeftUsing + * + * @return Zend_Db_Select This Zend_Db_Select object. + */ + public function _joinUsing($type, $name, $cond, $cols = '*', $schema = null) + { + if (empty($this->_parts[self::FROM])) { + require_once 'Zend/Db/Select/Exception.php'; + throw new Zend_Db_Select_Exception("You can only perform a joinUsing after specifying a FROM table"); + } + + $join = $this->_adapter->quoteIdentifier(key($this->_parts[self::FROM]), true); + $from = $this->_adapter->quoteIdentifier($this->_uniqueCorrelation($name), true); + + $cond1 = $from . '.' . $cond; + $cond2 = $join . '.' . $cond; + $cond = $cond1 . ' = ' . $cond2; + + return $this->_join($type, $name, $cond, $cols, $schema); + } + + /** + * Generate a unique correlation name + * + * @param string|array $name A qualified identifier. + * @return string A unique correlation name. + */ + private function _uniqueCorrelation($name) + { + if (is_array($name)) { + $c = end($name); + } else { + // Extract just the last name of a qualified table name + $dot = strrpos($name,'.'); + $c = ($dot === false) ? $name : substr($name, $dot+1); + } + for ($i = 2; array_key_exists($c, $this->_parts[self::FROM]); ++$i) { + $c = $name . '_' . (string) $i; + } + return $c; + } + + /** + * Adds to the internal table-to-column mapping array. + * + * @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. + * @return void + */ + protected function _tableCols($correlationName, $cols) + { + if (!is_array($cols)) { + $cols = array($cols); + } + + if ($correlationName == null) { + $correlationName = ''; + } + + foreach (array_filter($cols) as $alias => $col) { + $currentCorrelationName = $correlationName; + if (is_string($col)) { + // Check for a column matching " AS " and extract the alias name + if (preg_match('/^(.+)\s+' . self::SQL_AS . '\s+(.+)$/i', $col, $m)) { + $col = $m[1]; + $alias = $m[2]; + } + // Check for columns that look like functions and convert to Zend_Db_Expr + if (preg_match('/\(.*\)/', $col)) { + $col = new Zend_Db_Expr($col); + } elseif (preg_match('/(.+)\.(.+)/', $col, $m)) { + $currentCorrelationName = $m[1]; + $col = $m[2]; + } + } + $this->_parts[self::COLUMNS][] = array($currentCorrelationName, $col, is_string($alias) ? $alias : null); + } + } + + /** + * Internal function for creating the where clause + * + * @param string $condition + * @param string $value optional + * @param string $type optional + * @param boolean $bool true = AND, false = OR + * @return string clause + */ + protected function _where($condition, $value = null, $type = null, $bool = true) + { + if (count($this->_parts[self::UNION])) { + require_once 'Zend/Db/Select/Exception.php'; + throw new Zend_Db_Select_Exception("Invalid use of where clause with " . self::SQL_UNION); + } + + if ($value !== null) { + $condition = $this->_adapter->quoteInto($condition, $value, $type); + } + + $cond = ""; + if ($this->_parts[self::WHERE]) { + if ($bool === true) { + $cond = self::SQL_AND . ' '; + } else { + $cond = self::SQL_OR . ' '; + } + } + + return $cond . "($condition)"; + } + + /** + * @return array + */ + protected function _getDummyTable() + { + return array(); + } + + /** + * Return a quoted schema name + * + * @param string $schema The schema name OPTIONAL + * @return string|null + */ + protected function _getQuotedSchema($schema = null) + { + if ($schema === null) { + return null; + } + return $this->_adapter->quoteIdentifier($schema, true) . '.'; + } + + /** + * Return a quoted table name + * + * @param string $tableName The table name + * @param string $correlationName The correlation name OPTIONAL + * @return string + */ + protected function _getQuotedTable($tableName, $correlationName = null) + { + return $this->_adapter->quoteTableAs($tableName, $correlationName, true); + } + + /** + * Render DISTINCT clause + * + * @param string $sql SQL query + * @return string + */ + protected function _renderDistinct($sql) + { + if ($this->_parts[self::DISTINCT]) { + $sql .= ' ' . self::SQL_DISTINCT; + } + + return $sql; + } + + /** + * Render DISTINCT clause + * + * @param string $sql SQL query + * @return string + */ + protected function _renderColumns($sql) + { + if (!count($this->_parts[self::COLUMNS])) { + return null; + } + + $columns = array(); + foreach ($this->_parts[self::COLUMNS] as $columnEntry) { + list($correlationName, $column, $alias) = $columnEntry; + if ($column instanceof Zend_Db_Expr) { + $columns[] = $this->_adapter->quoteColumnAs($column, $alias, true); + } else { + if ($column == self::SQL_WILDCARD) { + $column = new Zend_Db_Expr(self::SQL_WILDCARD); + $alias = null; + } + if (empty($correlationName)) { + $columns[] = $this->_adapter->quoteColumnAs($column, $alias, true); + } else { + $columns[] = $this->_adapter->quoteColumnAs(array($correlationName, $column), $alias, true); + } + } + } + + return $sql .= ' ' . implode(', ', $columns); + } + + /** + * Render FROM clause + * + * @param string $sql SQL query + * @return string + */ + protected function _renderFrom($sql) + { + /* + * If no table specified, use RDBMS-dependent solution + * for table-less query. e.g. DUAL in Oracle. + */ + if (empty($this->_parts[self::FROM])) { + $this->_parts[self::FROM] = $this->_getDummyTable(); + } + + $from = array(); + + foreach ($this->_parts[self::FROM] as $correlationName => $table) { + $tmp = ''; + + // Add join clause (if applicable) + if (! empty($from)) { + $tmp .= ' ' . strtoupper($table['joinType']) . ' '; + } + + $tmp .= $this->_getQuotedSchema($table['schema']); + $tmp .= $this->_getQuotedTable($table['tableName'], $correlationName); + + // Add join conditions (if applicable) + if (!empty($from) && ! empty($table['joinCondition'])) { + $tmp .= ' ' . self::SQL_ON . ' ' . $table['joinCondition']; + } + + // Add the table name and condition add to the list + $from[] = $tmp; + } + + // Add the list of all joins + if (!empty($from)) { + $sql .= ' ' . self::SQL_FROM . ' ' . implode("\n", $from); + } + + return $sql; + } + + /** + * Render UNION query + * + * @param string $sql SQL query + * @return string + */ + protected function _renderUnion($sql) + { + if ($this->_parts[self::UNION]) { + $parts = count($this->_parts[self::UNION]); + foreach ($this->_parts[self::UNION] as $cnt => $union) { + list($target, $type) = $union; + if ($target instanceof Zend_Db_Select) { + $target = $target->assemble(); + } + $sql .= $target; + if ($cnt < $parts - 1) { + $sql .= ' ' . $type . ' '; + } + } + } + + return $sql; + } + + /** + * Render WHERE clause + * + * @param string $sql SQL query + * @return string + */ + protected function _renderWhere($sql) + { + if ($this->_parts[self::FROM] && $this->_parts[self::WHERE]) { + $sql .= ' ' . self::SQL_WHERE . ' ' . implode(' ', $this->_parts[self::WHERE]); + } + + return $sql; + } + + /** + * Render GROUP clause + * + * @param string $sql SQL query + * @return string + */ + protected function _renderGroup($sql) + { + if ($this->_parts[self::FROM] && $this->_parts[self::GROUP]) { + $group = array(); + foreach ($this->_parts[self::GROUP] as $term) { + $group[] = $this->_adapter->quoteIdentifier($term, true); + } + $sql .= ' ' . self::SQL_GROUP_BY . ' ' . implode(",\n\t", $group); + } + + return $sql; + } + + /** + * Render HAVING clause + * + * @param string $sql SQL query + * @return string + */ + protected function _renderHaving($sql) + { + if ($this->_parts[self::FROM] && $this->_parts[self::HAVING]) { + $sql .= ' ' . self::SQL_HAVING . ' ' . implode(' ', $this->_parts[self::HAVING]); + } + + return $sql; + } + + /** + * Render ORDER clause + * + * @param string $sql SQL query + * @return string + */ + protected function _renderOrder($sql) + { + if ($this->_parts[self::ORDER]) { + $order = array(); + foreach ($this->_parts[self::ORDER] as $term) { + if (is_array($term)) { + $order[] = $this->_adapter->quoteIdentifier($term[0], true) . ' ' . $term[1]; + } else { + $order[] = $this->_adapter->quoteIdentifier($term, true); + } + } + $sql .= ' ' . self::SQL_ORDER_BY . ' ' . implode(', ', $order); + } + + return $sql; + } + + /** + * Render LIMIT OFFSET clause + * + * @param string $sql SQL query + * @return string + */ + protected function _renderLimitoffset($sql) + { + $count = 0; + $offset = 0; + + 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); + } + + if (!empty($this->_parts[self::LIMIT_COUNT])) { + $count = (int) $this->_parts[self::LIMIT_COUNT]; + } + + /* + * Add limits clause + */ + if ($count > 0) { + $sql = trim($this->_adapter->limit($sql, $count, $offset)); + } + + return $sql; + } + + /** + * Render FOR UPDATE clause + * + * @param string $sql SQL query + * @return string + */ + protected function _renderForupdate($sql) + { + if ($this->_parts[self::FOR_UPDATE]) { + $sql .= ' ' . self::SQL_FOR_UPDATE; + } + + return $sql; + } + + /** + * Turn magic function calls into non-magic function calls + * for joinUsing syntax + * + * @param string $method + * @param array $args OPTIONAL Zend_Db_Table_Select query modifier + * @return Zend_Db_Select + * @throws Zend_Db_Select_Exception If an invalid method is called. + */ + public function __call($method, array $args) + { + $matches = array(); + + /** + * Recognize methods for Has-Many cases: + * findParent() + * findParentBy() + * Use the non-greedy pattern repeat modifier e.g. \w+? + */ + if (preg_match('/^join([a-zA-Z]*?)Using$/', $method, $matches)) { + $type = strtolower($matches[1]); + if ($type) { + $type .= ' join'; + if (!in_array($type, self::$_joinTypes)) { + require_once 'Zend/Db/Select/Exception.php'; + throw new Zend_Db_Select_Exception("Unrecognized method '$method()'"); + } + if (in_array($type, array(self::CROSS_JOIN, self::NATURAL_JOIN))) { + require_once 'Zend/Db/Select/Exception.php'; + throw new Zend_Db_Select_Exception("Cannot perform a joinUsing with method '$method()'"); + } + } else { + $type = self::INNER_JOIN; + } + array_unshift($args, $type); + return call_user_func_array(array($this, '_joinUsing'), $args); + } + + require_once 'Zend/Db/Select/Exception.php'; + throw new Zend_Db_Select_Exception("Unrecognized method '$method()'"); + } + + /** + * Implements magic method. + * + * @return string This object as a SELECT string. + */ + public function __toString() + { + try { + $sql = $this->assemble(); + } catch (Exception $e) { + trigger_error($e->getMessage(), E_USER_WARNING); + $sql = ''; + } + return $sql; + } + +} diff --git a/libs/Zend/Db/Select/Exception.php b/libs/Zend/Db/Select/Exception.php new file mode 100644 index 0000000..3a4e74d --- /dev/null +++ b/libs/Zend/Db/Select/Exception.php @@ -0,0 +1,38 @@ +_adapter = $adapter; + if ($sql instanceof Zend_Db_Select) { + $sql = $sql->assemble(); + } + $this->_parseParameters($sql); + $this->_prepare($sql); + + $this->_queryId = $this->_adapter->getProfiler()->queryStart($sql); + } + + /** + * @param string $sql + * @return void + */ + protected function _parseParameters($sql) + { + $sql = $this->_stripQuoted($sql); + + // split into text and params + $this->_sqlSplit = preg_split('/(\?|\:[a-zA-Z0-9_]+)/', + $sql, -1, PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY); + + // map params + $this->_sqlParam = array(); + foreach ($this->_sqlSplit as $key => $val) { + if ($val == '?') { + if ($this->_adapter->supportsParameters('positional') === false) { + /** + * @see Zend_Db_Statement_Exception + */ + require_once 'Zend/Db/Statement/Exception.php'; + throw new Zend_Db_Statement_Exception("Invalid bind-variable position '$val'"); + } + } else if ($val[0] == ':') { + if ($this->_adapter->supportsParameters('named') === false) { + /** + * @see Zend_Db_Statement_Exception + */ + require_once 'Zend/Db/Statement/Exception.php'; + throw new Zend_Db_Statement_Exception("Invalid bind-variable name '$val'"); + } + } + $this->_sqlParam[] = $val; + } + + // set up for binding + $this->_bindParam = array(); + } + + /** + * Remove parts of a SQL string that contain quoted strings + * of values or identifiers. + * + * @param string $sql + * @return string + */ + protected function _stripQuoted($sql) + { + // get the character for delimited id quotes, + // this is usually " but in MySQL is ` + $d = $this->_adapter->quoteIdentifier('a'); + $d = $d[0]; + + // get the value used as an escaped delimited id quote, + // e.g. \" or "" or \` + $de = $this->_adapter->quoteIdentifier($d); + $de = substr($de, 1, 2); + $de = str_replace('\\', '\\\\', $de); + + // get the character for value quoting + // this should be ' + $q = $this->_adapter->quote('a'); + $q = $q[0]; + + // get the value used as an escaped quote, + // e.g. \' or '' + $qe = $this->_adapter->quote($q); + $qe = substr($qe, 1, 2); + $qe = str_replace('\\', '\\\\', $qe); + + // get a version of the SQL statement with all quoted + // values and delimited identifiers stripped out + // remove "foo\"bar" + $sql = preg_replace("/$q($qe|\\\\{2}|[^$q])*$q/", '', $sql); + // remove 'foo\'bar' + if (!empty($q)) { + $sql = preg_replace("/$q($qe|[^$q])*$q/", '', $sql); + } + + return $sql; + } + + /** + * Bind a column of the statement result set to a PHP variable. + * + * @param string $column Name the column in the result set, either by + * position or by name. + * @param mixed $param Reference to the PHP variable containing the value. + * @param mixed $type OPTIONAL + * @return bool + */ + public function bindColumn($column, &$param, $type = null) + { + $this->_bindColumn[$column] =& $param; + return true; + } + + /** + * Binds a parameter to the specified variable name. + * + * @param mixed $parameter Name the parameter, either integer or string. + * @param mixed $variable Reference to PHP variable containing the value. + * @param mixed $type OPTIONAL Datatype of SQL parameter. + * @param mixed $length OPTIONAL Length of SQL parameter. + * @param mixed $options OPTIONAL Other options. + * @return bool + */ + public function bindParam($parameter, &$variable, $type = null, $length = null, $options = null) + { + if (!is_int($parameter) && !is_string($parameter)) { + /** + * @see Zend_Db_Statement_Exception + */ + require_once 'Zend/Db/Statement/Exception.php'; + throw new Zend_Db_Statement_Exception('Invalid bind-variable position'); + } + + $position = null; + if (($intval = (int) $parameter) > 0 && $this->_adapter->supportsParameters('positional')) { + if ($intval >= 1 || $intval <= count($this->_sqlParam)) { + $position = $intval; + } + } else if ($this->_adapter->supportsParameters('named')) { + if ($parameter[0] != ':') { + $parameter = ':' . $parameter; + } + if (in_array($parameter, $this->_sqlParam) !== false) { + $position = $parameter; + } + } + + if ($position === null) { + /** + * @see Zend_Db_Statement_Exception + */ + require_once 'Zend/Db/Statement/Exception.php'; + throw new Zend_Db_Statement_Exception("Invalid bind-variable position '$parameter'"); + } + + // Finally we are assured that $position is valid + $this->_bindParam[$position] =& $variable; + return $this->_bindParam($position, $variable, $type, $length, $options); + } + + /** + * Binds a value to a parameter. + * + * @param mixed $parameter Name the parameter, either integer or string. + * @param mixed $value Scalar value to bind to the parameter. + * @param mixed $type OPTIONAL Datatype of the parameter. + * @return bool + */ + public function bindValue($parameter, $value, $type = null) + { + return $this->bindParam($parameter, $value, $type); + } + + /** + * Executes a prepared statement. + * + * @param array $params OPTIONAL Values to bind to parameter placeholders. + * @return bool + */ + public function execute(array $params = null) + { + /* + * Simple case - no query profiler to manage. + */ + if ($this->_queryId === null) { + return $this->_execute($params); + } + + /* + * Do the same thing, but with query profiler + * management before and after the execute. + */ + $prof = $this->_adapter->getProfiler(); + $qp = $prof->getQueryProfile($this->_queryId); + if ($qp->hasEnded()) { + $this->_queryId = $prof->queryClone($qp); + $qp = $prof->getQueryProfile($this->_queryId); + } + if ($params !== null) { + $qp->bindParams($params); + } else { + $qp->bindParams($this->_bindParam); + } + $qp->start($this->_queryId); + + $retval = $this->_execute($params); + + $prof->queryEnd($this->_queryId); + + return $retval; + } + + /** + * Returns an array containing all of the result set rows. + * + * @param int $style OPTIONAL Fetch mode. + * @param int $col OPTIONAL Column number, if fetch mode is by column. + * @return array Collection of rows, each in a format by the fetch mode. + */ + public function fetchAll($style = null, $col = null) + { + $data = array(); + if ($style === Zend_Db::FETCH_COLUMN && $col === null) { + $col = 0; + } + if ($col === null) { + while ($row = $this->fetch($style)) { + $data[] = $row; + } + } else { + while ($val = $this->fetchColumn($col)) { + $data[] = $val; + } + } + return $data; + } + + /** + * Returns a single column from the next row of a result set. + * + * @param int $col OPTIONAL Position of the column to fetch. + * @return string One value from the next row of result set, or false. + */ + public function fetchColumn($col = 0) + { + $data = array(); + $col = (int) $col; + $row = $this->fetch(Zend_Db::FETCH_NUM); + if (!is_array($row)) { + return false; + } + return $row[$col]; + } + + /** + * Fetches the next row and returns it as an object. + * + * @param string $class OPTIONAL Name of the class to create. + * @param array $config OPTIONAL Constructor arguments for the class. + * @return mixed One object instance of the specified class, or false. + */ + public function fetchObject($class = 'stdClass', array $config = array()) + { + $obj = new $class($config); + $row = $this->fetch(Zend_Db::FETCH_ASSOC); + if (!is_array($row)) { + return false; + } + foreach ($row as $key => $val) { + $obj->$key = $val; + } + return $obj; + } + + /** + * Retrieve a statement attribute. + * + * @param string $key Attribute name. + * @return mixed Attribute value. + */ + public function getAttribute($key) + { + if (array_key_exists($key, $this->_attribute)) { + return $this->_attribute[$key]; + } + } + + /** + * Set a statement attribute. + * + * @param string $key Attribute name. + * @param mixed $val Attribute value. + * @return bool + */ + public function setAttribute($key, $val) + { + $this->_attribute[$key] = $val; + } + + /** + * Set the default fetch mode for this statement. + * + * @param int $mode The fetch mode. + * @return bool + * @throws Zend_Db_Statement_Exception + */ + public function setFetchMode($mode) + { + switch ($mode) { + case Zend_Db::FETCH_NUM: + case Zend_Db::FETCH_ASSOC: + case Zend_Db::FETCH_BOTH: + case Zend_Db::FETCH_OBJ: + $this->_fetchMode = $mode; + break; + case Zend_Db::FETCH_BOUND: + default: + $this->closeCursor(); + /** + * @see Zend_Db_Statement_Exception + */ + require_once 'Zend/Db/Statement/Exception.php'; + throw new Zend_Db_Statement_Exception('invalid fetch mode'); + break; + } + } + + /** + * Helper function to map retrieved row + * to bound column variables + * + * @param array $row + * @return bool True + */ + public function _fetchBound($row) + { + foreach ($row as $key => $value) { + // bindColumn() takes 1-based integer positions + // but fetch() returns 0-based integer indexes + if (is_int($key)) { + $key++; + } + // set results only to variables that were bound previously + if (isset($this->_bindColumn[$key])) { + $this->_bindColumn[$key] = $value; + } + } + return true; + } + +} diff --git a/libs/Zend/Db/Statement/Db2.php b/libs/Zend/Db/Statement/Db2.php new file mode 100644 index 0000000..63db1c9 --- /dev/null +++ b/libs/Zend/Db/Statement/Db2.php @@ -0,0 +1,354 @@ +_adapter->getConnection(); + + $this->_stmt = db2_prepare($connection, $sql); + + if (!$this->_stmt) { + /** + * @see Zend_Db_Statement_Db2_Exception + */ + require_once 'Zend/Db/Statement/Db2/Exception.php'; + throw new Zend_Db_Statement_Db2_Exception( + db2_stmt_errormsg(), + db2_stmt_error() + ); + } + } + + /** + * Binds a parameter to the specified variable name. + * + * @param mixed $parameter Name the parameter, either integer or string. + * @param mixed $variable Reference to PHP variable containing the value. + * @param mixed $type OPTIONAL Datatype of SQL parameter. + * @param mixed $length OPTIONAL Length of SQL parameter. + * @param mixed $options OPTIONAL Other options. + * @return bool + * @throws Zend_Db_Statement_Db2_Exception + */ + public function _bindParam($parameter, &$variable, $type = null, $length = null, $options = null) + { + if ($type === null) { + $type = DB2_PARAM_IN; + } + + if (isset($options['data-type'])) { + $datatype = $options['data-type']; + } else { + $datatype = DB2_CHAR; + } + + if (!db2_bind_param($this->_stmt, $position, "variable", $type, $datatype)) { + /** + * @see Zend_Db_Statement_Db2_Exception + */ + require_once 'Zend/Db/Statement/Db2/Exception.php'; + throw new Zend_Db_Statement_Db2_Exception( + db2_stmt_errormsg($this->_stmt), + db2_stmt_error($this->_stmt) + ); + } + + return true; + } + + /** + * Closes the cursor, allowing the statement to be executed again. + * + * @return bool + */ + public function closeCursor() + { + if (!$this->_stmt) { + return false; + } + db2_free_stmt($this->_stmt); + $this->_stmt = false; + return true; + } + + + /** + * Returns the number of columns in the result set. + * Returns null if the statement has no result set metadata. + * + * @return int The number of columns. + */ + public function columnCount() + { + if (!$this->_stmt) { + return false; + } + return db2_num_fields($this->_stmt); + } + + /** + * Retrieves the error code, if any, associated with the last operation on + * the statement handle. + * + * @return string error code. + */ + public function errorCode() + { + if (!$this->_stmt) { + return '0000'; + } + + return db2_stmt_error($this->_stmt); + } + + /** + * Retrieves an array of error information, if any, associated with the + * last operation on the statement handle. + * + * @return array + */ + public function errorInfo() + { + if (!$this->_stmt) { + return array(false, 0, ''); + } + + /* + * Return three-valued array like PDO. But DB2 does not distinguish + * between SQLCODE and native RDBMS error code, so repeat the SQLCODE. + */ + return array( + db2_stmt_error($this->_stmt), + db2_stmt_error($this->_stmt), + db2_stmt_errormsg($this->_stmt) + ); + } + + /** + * Executes a prepared statement. + * + * @param array $params OPTIONAL Values to bind to parameter placeholders. + * @return bool + * @throws Zend_Db_Statement_Db2_Exception + */ + public function _execute(array $params = null) + { + if (!$this->_stmt) { + return false; + } + + $retval = true; + if ($params !== null) { + $retval = @db2_execute($this->_stmt, $params); + } else { + $retval = @db2_execute($this->_stmt); + } + + if ($retval === false) { + /** + * @see Zend_Db_Statement_Db2_Exception + */ + require_once 'Zend/Db/Statement/Db2/Exception.php'; + throw new Zend_Db_Statement_Db2_Exception( + db2_stmt_errormsg($this->_stmt), + db2_stmt_error($this->_stmt)); + } + + $this->_keys = array(); + if ($field_num = $this->columnCount()) { + for ($i = 0; $i < $field_num; $i++) { + $name = db2_field_name($this->_stmt, $i); + $this->_keys[] = $name; + } + } + + $this->_values = array(); + if ($this->_keys) { + $this->_values = array_fill(0, count($this->_keys), null); + } + + return $retval; + } + + /** + * Fetches a row from the result set. + * + * @param int $style OPTIONAL Fetch mode for this fetch operation. + * @param int $cursor OPTIONAL Absolute, relative, or other. + * @param int $offset OPTIONAL Number for absolute or relative cursors. + * @return mixed Array, object, or scalar depending on fetch mode. + * @throws Zend_Db_Statement_Db2_Exception + */ + public function fetch($style = null, $cursor = null, $offset = null) + { + if (!$this->_stmt) { + return false; + } + + if ($style === null) { + $style = $this->_fetchMode; + } + + switch ($style) { + case Zend_Db::FETCH_NUM : + $row = db2_fetch_array($this->_stmt); + break; + case Zend_Db::FETCH_ASSOC : + $row = db2_fetch_assoc($this->_stmt); + break; + case Zend_Db::FETCH_BOTH : + $row = db2_fetch_both($this->_stmt); + break; + case Zend_Db::FETCH_OBJ : + $row = db2_fetch_object($this->_stmt); + break; + case Zend_Db::FETCH_BOUND: + $row = db2_fetch_both($this->_stmt); + if ($row !== false) { + return $this->_fetchBound($row); + } + break; + default: + /** + * @see Zend_Db_Statement_Db2_Exception + */ + require_once 'Zend/Db/Statement/Db2/Exception.php'; + throw new Zend_Db_Statement_Db2_Exception("Invalid fetch mode '$style' specified"); + break; + } + + return $row; + } + + /** + * Fetches the next row and returns it as an object. + * + * @param string $class OPTIONAL Name of the class to create. + * @param array $config OPTIONAL Constructor arguments for the class. + * @return mixed One object instance of the specified class. + */ + public function fetchObject($class = 'stdClass', array $config = array()) + { + $obj = $this->fetch(Zend_Db::FETCH_OBJ); + return $obj; + } + + /** + * Retrieves the next rowset (result set) for a SQL statement that has + * multiple result sets. An example is a stored procedure that returns + * the results of multiple queries. + * + * @return bool + * @throws Zend_Db_Statement_Db2_Exception + */ + public function nextRowset() + { + /** + * @see Zend_Db_Statement_Db2_Exception + */ + require_once 'Zend/Db/Statement/Db2/Exception.php'; + throw new Zend_Db_Statement_Db2_Exception(__FUNCTION__ . '() is not implemented'); + } + + /** + * Returns the number of rows affected by the execution of the + * last INSERT, DELETE, or UPDATE statement executed by this + * statement object. + * + * @return int The number of rows affected. + */ + public function rowCount() + { + if (!$this->_stmt) { + return false; + } + + $num = @db2_num_rows($this->_stmt); + + if ($num === false) { + return 0; + } + + return $num; + } + + /** + * Returns an array containing all of the result set rows. + * + * @param int $style OPTIONAL Fetch mode. + * @param int $col OPTIONAL Column number, if fetch mode is by column. + * @return array Collection of rows, each in a format by the fetch mode. + * + * Behaves like parent, but if limit() + * is used, the final result removes the extra column + * 'zend_db_rownum' + */ + public function fetchAll($style = null, $col = null) + { + $data = parent::fetchAll($style, $col); + $results = array(); + $remove = $this->_adapter->foldCase('ZEND_DB_ROWNUM'); + + foreach ($data as $row) { + if (is_array($row) && array_key_exists($remove, $row)) { + unset($row[$remove]); + } + $results[] = $row; + } + return $results; + } +} diff --git a/libs/Zend/Db/Statement/Db2/Exception.php b/libs/Zend/Db/Statement/Db2/Exception.php new file mode 100644 index 0000000..89b9f5c --- /dev/null +++ b/libs/Zend/Db/Statement/Db2/Exception.php @@ -0,0 +1,56 @@ +message = $msg; + $this->code = $state; + } + +} + diff --git a/libs/Zend/Db/Statement/Exception.php b/libs/Zend/Db/Statement/Exception.php new file mode 100644 index 0000000..19a9735 --- /dev/null +++ b/libs/Zend/Db/Statement/Exception.php @@ -0,0 +1,38 @@ +_adapter->getConnection(); + + $this->_stmt = $mysqli->prepare($sql); + + if ($this->_stmt === false || $mysqli->errno) { + /** + * @see Zend_Db_Statement_Mysqli_Exception + */ + require_once 'Zend/Db/Statement/Mysqli/Exception.php'; + throw new Zend_Db_Statement_Mysqli_Exception("Mysqli prepare error: " . $mysqli->error); + } + } + + /** + * Binds a parameter to the specified variable name. + * + * @param mixed $parameter Name the parameter, either integer or string. + * @param mixed $variable Reference to PHP variable containing the value. + * @param mixed $type OPTIONAL Datatype of SQL parameter. + * @param mixed $length OPTIONAL Length of SQL parameter. + * @param mixed $options OPTIONAL Other options. + * @return bool + * @throws Zend_Db_Statement_Mysqli_Exception + */ + protected function _bindParam($parameter, &$variable, $type = null, $length = null, $options = null) + { + return true; + } + + /** + * Closes the cursor and the statement. + * + * @return bool + */ + public function close() + { + if ($this->_stmt) { + $r = $this->_stmt->close(); + $this->_stmt = null; + return $r; + } + return false; + } + + /** + * Closes the cursor, allowing the statement to be executed again. + * + * @return bool + */ + public function closeCursor() + { + if ($stmt = $this->_stmt) { + $mysqli = $this->_adapter->getConnection(); + while ($mysqli->next_result()) {} + $this->_stmt->free_result(); + return $this->_stmt->reset(); + } + return false; + } + + /** + * Returns the number of columns in the result set. + * Returns null if the statement has no result set metadata. + * + * @return int The number of columns. + */ + public function columnCount() + { + if (isset($this->_meta) && $this->_meta) { + return $this->_meta->field_count; + } + return 0; + } + + /** + * Retrieves the error code, if any, associated with the last operation on + * the statement handle. + * + * @return string error code. + */ + public function errorCode() + { + if (!$this->_stmt) { + return false; + } + return substr($this->_stmt->sqlstate, 0, 5); + } + + /** + * Retrieves an array of error information, if any, associated with the + * last operation on the statement handle. + * + * @return array + */ + public function errorInfo() + { + if (!$this->_stmt) { + return false; + } + return array( + substr($this->_stmt->sqlstate, 0, 5), + $this->_stmt->errno, + $this->_stmt->error, + ); + } + + /** + * Executes a prepared statement. + * + * @param array $params OPTIONAL Values to bind to parameter placeholders. + * @return bool + * @throws Zend_Db_Statement_Mysqli_Exception + */ + public function _execute(array $params = null) + { + if (!$this->_stmt) { + return false; + } + + // if no params were given as an argument to execute(), + // then default to the _bindParam array + if ($params === null) { + $params = $this->_bindParam; + } + // send $params as input parameters to the statement + if ($params) { + array_unshift($params, str_repeat('s', count($params))); + call_user_func_array( + array($this->_stmt, 'bind_param'), + $params + ); + } + + // execute the statement + $retval = $this->_stmt->execute(); + if ($retval === false) { + /** + * @see Zend_Db_Statement_Mysqli_Exception + */ + require_once 'Zend/Db/Statement/Mysqli/Exception.php'; + throw new Zend_Db_Statement_Mysqli_Exception("Mysqli statement execute error : " . $this->_stmt->error); + } + + + // retain metadata + if ($this->_meta === null) { + $this->_meta = $this->_stmt->result_metadata(); + if ($this->_stmt->errno) { + /** + * @see Zend_Db_Statement_Mysqli_Exception + */ + require_once 'Zend/Db/Statement/Mysqli/Exception.php'; + throw new Zend_Db_Statement_Mysqli_Exception("Mysqli statement metadata error: " . $this->_stmt->error); + } + } + + // statements that have no result set do not return metadata + if ($this->_meta !== false) { + + // get the column names that will result + $this->_keys = array(); + foreach ($this->_meta->fetch_fields() as $col) { + $this->_keys[] = $this->_adapter->foldCase($col->name); + } + + // set up a binding space for result variables + $this->_values = array_fill(0, count($this->_keys), null); + + // set up references to the result binding space. + // just passing $this->_values in the call_user_func_array() + // below won't work, you need references. + $refs = array(); + foreach ($this->_values as $i => &$f) { + $refs[$i] = &$f; + } + + $this->_stmt->store_result(); + // bind to the result variables + call_user_func_array( + array($this->_stmt, 'bind_result'), + $this->_values + ); + } + return $retval; + } + + + /** + * Fetches a row from the result set. + * + * @param int $style OPTIONAL Fetch mode for this fetch operation. + * @param int $cursor OPTIONAL Absolute, relative, or other. + * @param int $offset OPTIONAL Number for absolute or relative cursors. + * @return mixed Array, object, or scalar depending on fetch mode. + * @throws Zend_Db_Statement_Mysqli_Exception + */ + public function fetch($style = null, $cursor = null, $offset = null) + { + if (!$this->_stmt) { + return false; + } + // 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 + } + + // make sure we have a fetch mode + if ($style === null) { + $style = $this->_fetchMode; + } + + // dereference the result values, otherwise things like fetchAll() + // return the same values for every entry (because of the reference). + $values = array(); + foreach ($this->_values as $key => $val) { + $values[] = $val; + } + + $row = false; + switch ($style) { + case Zend_Db::FETCH_NUM: + $row = $values; + break; + case Zend_Db::FETCH_ASSOC: + $row = array_combine($this->_keys, $values); + break; + case Zend_Db::FETCH_BOTH: + $assoc = array_combine($this->_keys, $values); + $row = array_merge($values, $assoc); + break; + case Zend_Db::FETCH_OBJ: + $row = (object) array_combine($this->_keys, $values); + break; + case Zend_Db::FETCH_BOUND: + $assoc = array_combine($this->_keys, $values); + $row = array_merge($values, $assoc); + return $this->_fetchBound($row); + break; + default: + /** + * @see Zend_Db_Statement_Mysqli_Exception + */ + require_once 'Zend/Db/Statement/Mysqli/Exception.php'; + throw new Zend_Db_Statement_Mysqli_Exception("Invalid fetch mode '$style' specified"); + break; + } + return $row; + } + + /** + * Retrieves the next rowset (result set) for a SQL statement that has + * multiple result sets. An example is a stored procedure that returns + * the results of multiple queries. + * + * @return bool + * @throws Zend_Db_Statement_Mysqli_Exception + */ + public function nextRowset() + { + /** + * @see Zend_Db_Statement_Mysqli_Exception + */ + require_once 'Zend/Db/Statement/Mysqli/Exception.php'; + throw new Zend_Db_Statement_Mysqli_Exception(__FUNCTION__.'() is not implemented'); + } + + /** + * Returns the number of rows affected by the execution of the + * last INSERT, DELETE, or UPDATE statement executed by this + * statement object. + * + * @return int The number of rows affected. + */ + public function rowCount() + { + if (!$this->_adapter) { + return false; + } + $mysqli = $this->_adapter->getConnection(); + return $mysqli->affected_rows; + } + +} \ No newline at end of file diff --git a/libs/Zend/Db/Statement/Mysqli/Exception.php b/libs/Zend/Db/Statement/Mysqli/Exception.php new file mode 100644 index 0000000..28222d6 --- /dev/null +++ b/libs/Zend/Db/Statement/Mysqli/Exception.php @@ -0,0 +1,36 @@ +_adapter->getConnection(); + $this->_stmt = oci_parse($connection, $sql); + if (!$this->_stmt) { + /** + * @see Zend_Db_Statement_Oracle_Exception + */ + require_once 'Zend/Db/Statement/Oracle/Exception.php'; + throw new Zend_Db_Statement_Oracle_Exception(oci_error($connection)); + } + } + + /** + * Binds a parameter to the specified variable name. + * + * @param mixed $parameter Name the parameter, either integer or string. + * @param mixed $variable Reference to PHP variable containing the value. + * @param mixed $type OPTIONAL Datatype of SQL parameter. + * @param mixed $length OPTIONAL Length of SQL parameter. + * @param mixed $options OPTIONAL Other options. + * @return bool + * @throws Zend_Db_Statement_Exception + */ + protected function _bindParam($parameter, &$variable, $type = null, $length = null, $options = null) + { + // default value + if ($type === NULL) { + $type = SQLT_CHR; + } + + // default value + if ($length === NULL) { + $length = -1; + } + + $retval = @oci_bind_by_name($this->_stmt, $parameter, $variable, $length, $type); + if ($retval === false) { + /** + * @see Zend_Db_Adapter_Oracle_Exception + */ + require_once 'Zend/Db/Statement/Oracle/Exception.php'; + throw new Zend_Db_Statement_Oracle_Exception(oci_error($this->_stmt)); + } + + return true; + } + + /** + * Closes the cursor, allowing the statement to be executed again. + * + * @return bool + */ + public function closeCursor() + { + if (!$this->_stmt) { + return false; + } + + oci_free_statement($this->_stmt); + $this->_stmt = false; + return true; + } + + /** + * Returns the number of columns in the result set. + * Returns null if the statement has no result set metadata. + * + * @return int The number of columns. + */ + public function columnCount() + { + if (!$this->_stmt) { + return false; + } + + return oci_num_fields($this->_stmt); + } + + + /** + * Retrieves the error code, if any, associated with the last operation on + * the statement handle. + * + * @return string error code. + */ + public function errorCode() + { + if (!$this->_stmt) { + return false; + } + + $error = oci_error($this->_stmt); + + if (!$error) { + return false; + } + + return $error['code']; + } + + + /** + * Retrieves an array of error information, if any, associated with the + * last operation on the statement handle. + * + * @return array + */ + public function errorInfo() + { + if (!$this->_stmt) { + return false; + } + + $error = oci_error($this->_stmt); + if (!$error) { + return false; + } + + if (isset($error['sqltext'])) { + return array( + $error['code'], + $error['message'], + $error['offset'], + $error['sqltext'], + ); + } else { + return array( + $error['code'], + $error['message'], + ); + } + } + + + /** + * Executes a prepared statement. + * + * @param array $params OPTIONAL Values to bind to parameter placeholders. + * @return bool + * @throws Zend_Db_Statement_Exception + */ + 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); + } + $error = false; + foreach (array_keys($params) as $name) { + if (!@oci_bind_by_name($this->_stmt, $name, $params[$name], -1)) { + $error = true; + break; + } + } + if ($error) { + /** + * @see Zend_Db_Adapter_Oracle_Exception + */ + require_once 'Zend/Db/Statement/Oracle/Exception.php'; + throw new Zend_Db_Statement_Oracle_Exception(oci_error($this->_stmt)); + } + } + + $retval = @oci_execute($this->_stmt, $this->_adapter->_getExecuteMode()); + if ($retval === false) { + /** + * @see Zend_Db_Adapter_Oracle_Exception + */ + require_once 'Zend/Db/Statement/Oracle/Exception.php'; + throw new Zend_Db_Statement_Oracle_Exception(oci_error($this->_stmt)); + } + + $this->_keys = Array(); + if ($field_num = oci_num_fields($this->_stmt)) { + for ($i = 1; $i <= $field_num; $i++) { + $name = oci_field_name($this->_stmt, $i); + $this->_keys[] = $name; + } + } + + $this->_values = Array(); + if ($this->_keys) { + $this->_values = array_fill(0, count($this->_keys), null); + } + + return $retval; + } + + /** + * Fetches a row from the result set. + * + * @param int $style OPTIONAL Fetch mode for this fetch operation. + * @param int $cursor OPTIONAL Absolute, relative, or other. + * @param int $offset OPTIONAL Number for absolute or relative cursors. + * @return mixed Array, object, or scalar depending on fetch mode. + * @throws Zend_Db_Statement_Exception + */ + public function fetch($style = null, $cursor = null, $offset = null) + { + if (!$this->_stmt) { + return false; + } + + if ($style === null) { + $style = $this->_fetchMode; + } + + switch ($style) { + case Zend_Db::FETCH_NUM: + $row = oci_fetch_row($this->_stmt); + break; + case Zend_Db::FETCH_ASSOC: + $row = oci_fetch_assoc($this->_stmt); + break; + case Zend_Db::FETCH_BOTH: + $row = oci_fetch_array($this->_stmt, OCI_BOTH); + break; + case Zend_Db::FETCH_OBJ: + $row = oci_fetch_object($this->_stmt); + break; + case Zend_Db::FETCH_BOUND: + $row = oci_fetch_array($this->_stmt, OCI_BOTH); + if ($row !== false) { + return $this->_fetchBound($row); + } + break; + default: + /** + * @see Zend_Db_Adapter_Oracle_Exception + */ + require_once 'Zend/Db/Statement/Oracle/Exception.php'; + throw new Zend_Db_Statement_Oracle_Exception( + array( + 'code' => 'HYC00', + 'message' => "Invalid fetch mode '$style' specified" + ) + ); + break; + } + + if (! $row && $error = oci_error($this->_stmt)) { + /** + * @see Zend_Db_Adapter_Oracle_Exception + */ + require_once 'Zend/Db/Statement/Oracle/Exception.php'; + throw new Zend_Db_Statement_Oracle_Exception($error); + } + + return $row; + } + + /** + * Returns an array containing all of the result set rows. + * + * @param int $style OPTIONAL Fetch mode. + * @param int $col OPTIONAL Column number, if fetch mode is by column. + * @return array Collection of rows, each in a format by the fetch mode. + * @throws Zend_Db_Statement_Exception + */ + public function fetchAll($style = null, $col = 0) + { + if (!$this->_stmt) { + return false; + } + + // make sure we have a fetch mode + if ($style === null) { + $style = $this->_fetchMode; + } + + $flags = OCI_FETCHSTATEMENT_BY_ROW; + + switch ($style) { + case Zend_Db::FETCH_BOTH: + /** + * @see Zend_Db_Adapter_Oracle_Exception + */ + require_once 'Zend/Db/Statement/Oracle/Exception.php'; + throw new Zend_Db_Statement_Oracle_Exception( + array( + 'code' => 'HYC00', + 'message' => "OCI8 driver does not support fetchAll(FETCH_BOTH), use fetch() in a loop instead" + ) + ); + // notreached + $flags |= OCI_NUM; + $flags |= OCI_ASSOC; + break; + case Zend_Db::FETCH_NUM: + $flags |= OCI_NUM; + break; + case Zend_Db::FETCH_ASSOC: + $flags |= OCI_ASSOC; + break; + case Zend_Db::FETCH_OBJ: + break; + case Zend_Db::FETCH_COLUMN: + $flags = $flags &~ OCI_FETCHSTATEMENT_BY_ROW; + $flags |= OCI_FETCHSTATEMENT_BY_COLUMN; + $flags |= OCI_NUM; + break; + default: + /** + * @see Zend_Db_Adapter_Oracle_Exception + */ + require_once 'Zend/Db/Statement/Oracle/Exception.php'; + throw new Zend_Db_Statement_Oracle_Exception( + array( + 'code' => 'HYC00', + 'message' => "Invalid fetch mode '$style' specified" + ) + ); + break; + } + + $result = Array(); + if ($flags != OCI_FETCHSTATEMENT_BY_ROW) { /* not Zend_Db::FETCH_OBJ */ + if (! ($rows = oci_fetch_all($this->_stmt, $result, 0, -1, $flags) )) { + if ($error = oci_error($this->_stmt)) { + /** + * @see Zend_Db_Adapter_Oracle_Exception + */ + require_once 'Zend/Db/Statement/Oracle/Exception.php'; + throw new Zend_Db_Statement_Oracle_Exception($error); + } + if (!$rows) { + return array(); + } + } + if ($style == Zend_Db::FETCH_COLUMN) { + $result = $result[$col]; + } + } else { + while (($row = oci_fetch_object($this->_stmt)) !== false) { + $result [] = $row; + } + if ($error = oci_error($this->_stmt)) { + /** + * @see Zend_Db_Adapter_Oracle_Exception + */ + require_once 'Zend/Db/Statement/Oracle/Exception.php'; + throw new Zend_Db_Statement_Oracle_Exception($error); + } + } + + return $result; + } + + + /** + * Returns a single column from the next row of a result set. + * + * @param int $col OPTIONAL Position of the column to fetch. + * @return string + * @throws Zend_Db_Statement_Exception + */ + public function fetchColumn($col = 0) + { + if (!$this->_stmt) { + return false; + } + + if (!oci_fetch($this->_stmt)) { + /* TODO ERROR */ + } + + $data = oci_result($this->_stmt, $col+1); //1-based + if ($data === false) { + /** + * @see Zend_Db_Adapter_Oracle_Exception + */ + require_once 'Zend/Db/Statement/Oracle/Exception.php'; + throw new Zend_Db_Statement_Oracle_Exception(oci_error($this->_stmt)); + } + return $data; + } + + + /** + * Fetches the next row and returns it as an object. + * + * @param string $class OPTIONAL Name of the class to create. + * @param array $config OPTIONAL Constructor arguments for the class. + * @return mixed One object instance of the specified class. + * @throws Zend_Db_Statement_Exception + */ + public function fetchObject($class = 'stdClass', array $config = array()) + { + if (!$this->_stmt) { + return false; + } + + $obj = oci_fetch_object($this->_stmt); + + if ($obj === false) { + /** + * @see Zend_Db_Adapter_Oracle_Exception + */ + require_once 'Zend/Db/Statement/Oracle/Exception.php'; + throw new Zend_Db_Statement_Oracle_Exception(oci_error($this->_stmt)); + } + + /* @todo XXX handle parameters */ + + return $obj; + } + + /** + * Retrieves the next rowset (result set) for a SQL statement that has + * multiple result sets. An example is a stored procedure that returns + * the results of multiple queries. + * + * @return bool + * @throws Zend_Db_Statement_Exception + */ + public function nextRowset() + { + /** + * @see Zend_Db_Statement_Oracle_Exception + */ + require_once 'Zend/Db/Statement/Oracle/Exception.php'; + throw new Zend_Db_Statement_Oracle_Exception( + array( + 'code' => 'HYC00', + 'message' => 'Optional feature not implemented' + ) + ); + } + + /** + * Returns the number of rows affected by the execution of the + * last INSERT, DELETE, or UPDATE statement executed by this + * statement object. + * + * @return int The number of rows affected. + * @throws Zend_Db_Statement_Exception + */ + public function rowCount() + { + if (!$this->_stmt) { + return false; + } + + $num_rows = oci_num_rows($this->_stmt); + + if ($num_rows === false) { + /** + * @see Zend_Db_Adapter_Oracle_Exception + */ + require_once 'Zend/Db/Statement/Oracle/Exception.php'; + throw new Zend_Db_Statement_Oracle_Exception(oci_error($this->_stmt)); + } + + return $num_rows; + } + +} diff --git a/libs/Zend/Db/Statement/Oracle/Exception.php b/libs/Zend/Db/Statement/Oracle/Exception.php new file mode 100644 index 0000000..f4a3bff --- /dev/null +++ b/libs/Zend/Db/Statement/Oracle/Exception.php @@ -0,0 +1,58 @@ +message = $error['code']." ".$error['message']; + } else { + $this->message = $error['code']." ".$error['message']." "; + $this->message .= substr($error['sqltext'], 0, $error['offset']); + $this->message .= "*"; + $this->message .= substr($error['sqltext'], $error['offset']); + } + $this->code = $error['code']; + } + if (!$this->code && $code) { + $this->code = $code; + } + } +} + diff --git a/libs/Zend/Db/Statement/Pdo.php b/libs/Zend/Db/Statement/Pdo.php new file mode 100644 index 0000000..70f1e41 --- /dev/null +++ b/libs/Zend/Db/Statement/Pdo.php @@ -0,0 +1,433 @@ +_stmt = $this->_adapter->getConnection()->prepare($sql); + } catch (PDOException $e) { + require_once 'Zend/Db/Statement/Exception.php'; + throw new Zend_Db_Statement_Exception($e->getMessage()); + } + } + + /** + * Bind a column of the statement result set to a PHP variable. + * + * @param string $column Name the column in the result set, either by + * position or by name. + * @param mixed $param Reference to the PHP variable containing the value. + * @param mixed $type OPTIONAL + * @return bool + * @throws Zend_Db_Statement_Exception + */ + public function bindColumn($column, &$param, $type = null) + { + try { + if (is_null($type)) { + return $this->_stmt->bindColumn($column, $param); + } else { + return $this->_stmt->bindColumn($column, $param, $type); + } + } catch (PDOException $e) { + require_once 'Zend/Db/Statement/Exception.php'; + throw new Zend_Db_Statement_Exception($e->getMessage()); + } + } + + /** + * Binds a parameter to the specified variable name. + * + * @param mixed $parameter Name the parameter, either integer or string. + * @param mixed $variable Reference to PHP variable containing the value. + * @param mixed $type OPTIONAL Datatype of SQL parameter. + * @param mixed $length OPTIONAL Length of SQL parameter. + * @param mixed $options OPTIONAL Other options. + * @return bool + * @throws Zend_Db_Statement_Exception + */ + protected function _bindParam($parameter, &$variable, $type = null, $length = null, $options = null) + { + try { + if ($type === null) { + if (is_bool($variable)) { + $type = PDO::PARAM_BOOL; + } elseif (is_null($variable)) { + $type = PDO::PARAM_NULL; + } elseif (is_integer($variable)) { + $type = PDO::PARAM_INT; + } else { + $type = PDO::PARAM_STR; + } + } + 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()); + } + } + + /** + * Binds a value to a parameter. + * + * @param mixed $parameter Name the parameter, either integer or string. + * @param mixed $value Scalar value to bind to the parameter. + * @param mixed $type OPTIONAL Datatype of the parameter. + * @return bool + * @throws Zend_Db_Statement_Exception + */ + public function bindValue($parameter, $value, $type = null) + { + if (is_string($parameter) && $parameter[0] != ':') { + $parameter = ":$parameter"; + } + try { + if (is_null($type)) { + return $this->_stmt->bindValue($parameter, $value); + } else { + return $this->_stmt->bindValue($parameter, $value, $type); + } + } catch (PDOException $e) { + require_once 'Zend/Db/Statement/Exception.php'; + throw new Zend_Db_Statement_Exception($e->getMessage()); + } + } + + /** + * Closes the cursor, allowing the statement to be executed again. + * + * @return bool + * @throws Zend_Db_Statement_Exception + */ + public function closeCursor() + { + try { + return $this->_stmt->closeCursor(); + } catch (PDOException $e) { + require_once 'Zend/Db/Statement/Exception.php'; + throw new Zend_Db_Statement_Exception($e->getMessage()); + } + } + + /** + * Returns the number of columns in the result set. + * Returns null if the statement has no result set metadata. + * + * @return int The number of columns. + * @throws Zend_Db_Statement_Exception + */ + public function columnCount() + { + try { + return $this->_stmt->columnCount(); + } catch (PDOException $e) { + require_once 'Zend/Db/Statement/Exception.php'; + throw new Zend_Db_Statement_Exception($e->getMessage()); + } + } + + /** + * Retrieves the error code, if any, associated with the last operation on + * the statement handle. + * + * @return string error code. + * @throws Zend_Db_Statement_Exception + */ + public function errorCode() + { + try { + return $this->_stmt->errorCode(); + } catch (PDOException $e) { + require_once 'Zend/Db/Statement/Exception.php'; + throw new Zend_Db_Statement_Exception($e->getMessage()); + } + } + + /** + * Retrieves an array of error information, if any, associated with the + * last operation on the statement handle. + * + * @return array + * @throws Zend_Db_Statement_Exception + */ + public function errorInfo() + { + try { + return $this->_stmt->errorInfo(); + } catch (PDOException $e) { + require_once 'Zend/Db/Statement/Exception.php'; + throw new Zend_Db_Statement_Exception($e->getMessage()); + } + } + + /** + * Executes a prepared statement. + * + * @param array $params OPTIONAL Values to bind to parameter placeholders. + * @return bool + * @throws Zend_Db_Statement_Exception + */ + public function _execute(array $params = null) + { + try { + if ($params !== null) { + return $this->_stmt->execute($params); + } else { + return $this->_stmt->execute(); + } + } catch (PDOException $e) { + require_once 'Zend/Db/Statement/Exception.php'; + throw new Zend_Db_Statement_Exception($e->getMessage()); + } + } + + /** + * Fetches a row from the result set. + * + * @param int $style OPTIONAL Fetch mode for this fetch operation. + * @param int $cursor OPTIONAL Absolute, relative, or other. + * @param int $offset OPTIONAL Number for absolute or relative cursors. + * @return mixed Array, object, or scalar depending on fetch mode. + * @throws Zend_Db_Statement_Exception + */ + public function fetch($style = null, $cursor = null, $offset = null) + { + if ($style === null) { + $style = $this->_fetchMode; + } + try { + 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()); + } + } + + /** + * Returns an array containing all of the result set rows. + * + * @param int $style OPTIONAL Fetch mode. + * @param int $col OPTIONAL Column number, if fetch mode is by column. + * @return array Collection of rows, each in a format by the fetch mode. + * @throws Zend_Db_Statement_Exception + */ + public function fetchAll($style = null, $col = null) + { + if ($style === null) { + $style = $this->_fetchMode; + } + try { + if ($style == PDO::FETCH_COLUMN) { + if ($col === null) { + $col = 0; + } + return $this->_stmt->fetchAll($style, $col); + } else { + return $this->_stmt->fetchAll($style); + } + } catch (PDOException $e) { + require_once 'Zend/Db/Statement/Exception.php'; + throw new Zend_Db_Statement_Exception($e->getMessage()); + } + } + + /** + * Returns a single column from the next row of a result set. + * + * @param int $col OPTIONAL Position of the column to fetch. + * @return string + * @throws Zend_Db_Statement_Exception + */ + public function fetchColumn($col = 0) + { + try { + return $this->_stmt->fetchColumn($col); + } catch (PDOException $e) { + require_once 'Zend/Db/Statement/Exception.php'; + throw new Zend_Db_Statement_Exception($e->getMessage()); + } + } + + /** + * Fetches the next row and returns it as an object. + * + * @param string $class OPTIONAL Name of the class to create. + * @param array $config OPTIONAL Constructor arguments for the class. + * @return mixed One object instance of the specified class. + * @throws Zend_Db_Statement_Exception + */ + public function fetchObject($class = 'stdClass', array $config = array()) + { + try { + return $this->_stmt->fetchObject($class, $config); + } catch (PDOException $e) { + require_once 'Zend/Db/Statement/Exception.php'; + throw new Zend_Db_Statement_Exception($e->getMessage()); + } + } + + /** + * Retrieve a statement attribute. + * + * @param integer $key Attribute name. + * @return mixed Attribute value. + * @throws Zend_Db_Statement_Exception + */ + public function getAttribute($key) + { + try { + return $this->_stmt->getAttribute($key); + } catch (PDOException $e) { + require_once 'Zend/Db/Statement/Exception.php'; + throw new Zend_Db_Statement_Exception($e->getMessage()); + } + } + + /** + * Returns metadata for a column in a result set. + * + * @param int $column + * @return mixed + * @throws Zend_Db_Statement_Exception + */ + public function getColumnMeta($column) + { + try { + return $this->_stmt->getColumnMeta($column); + } catch (PDOException $e) { + require_once 'Zend/Db/Statement/Exception.php'; + throw new Zend_Db_Statement_Exception($e->getMessage()); + } + } + + /** + * Retrieves the next rowset (result set) for a SQL statement that has + * multiple result sets. An example is a stored procedure that returns + * the results of multiple queries. + * + * @return bool + * @throws Zend_Db_Statement_Exception + */ + public function nextRowset() + { + try { + return $this->_stmt->nextRowset(); + } catch (PDOException $e) { + require_once 'Zend/Db/Statement/Exception.php'; + throw new Zend_Db_Statement_Exception($e->getMessage()); + } + } + + /** + * Returns the number of rows affected by the execution of the + * last INSERT, DELETE, or UPDATE statement executed by this + * statement object. + * + * @return int The number of rows affected. + * @throws Zend_Db_Statement_Exception + */ + public function rowCount() + { + try { + return $this->_stmt->rowCount(); + } catch (PDOException $e) { + require_once 'Zend/Db/Statement/Exception.php'; + throw new Zend_Db_Statement_Exception($e->getMessage()); + } + } + + /** + * Set a statement attribute. + * + * @param string $key Attribute name. + * @param mixed $val Attribute value. + * @return bool + * @throws Zend_Db_Statement_Exception + */ + public function setAttribute($key, $val) + { + try { + return $this->_stmt->setAttribute($key, $val); + } catch (PDOException $e) { + require_once 'Zend/Db/Statement/Exception.php'; + throw new Zend_Db_Statement_Exception($e->getMessage()); + } + } + + /** + * Set the default fetch mode for this statement. + * + * @param int $mode The fetch mode. + * @return bool + * @throws Zend_Db_Statement_Exception + */ + public function setFetchMode($mode) + { + $this->_fetchMode = $mode; + try { + return $this->_stmt->setFetchMode($mode); + } catch (PDOException $e) { + require_once 'Zend/Db/Statement/Exception.php'; + throw new Zend_Db_Statement_Exception($e->getMessage()); + } + } + +} diff --git a/libs/Zend/Db/Statement/Pdo/Ibm.php b/libs/Zend/Db/Statement/Pdo/Ibm.php new file mode 100644 index 0000000..de073d5 --- /dev/null +++ b/libs/Zend/Db/Statement/Pdo/Ibm.php @@ -0,0 +1,94 @@ +_adapter->foldCase('ZEND_DB_ROWNUM'); + + foreach ($data as $row) { + if (is_array($row) && array_key_exists($remove, $row)) { + unset($row[$remove]); + } + $results[] = $row; + } + return $results; + } + + /** + * Binds a parameter to the specified variable name. + * + * @param mixed $parameter Name the parameter, either integer or string. + * @param mixed $variable Reference to PHP variable containing the value. + * @param mixed $type OPTIONAL Datatype of SQL parameter. + * @param mixed $length OPTIONAL Length of SQL parameter. + * @param mixed $options OPTIONAL Other options. + * @return bool + * @throws Zend_Db_Statement_Exception + */ + public function _bindParam($parameter, &$variable, $type = null, $length = null, $options = null) + { + try { + if ( is_null($type) && is_null($length) && is_null($options) ) { + return $this->_stmt->bindParam($parameter, $variable); + } else { + 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()); + } + } + +} \ No newline at end of file diff --git a/libs/Zend/Db/Table.php b/libs/Zend/Db/Table.php new file mode 100644 index 0000000..5431d03 --- /dev/null +++ b/libs/Zend/Db/Table.php @@ -0,0 +1,39 @@ + $config); + } + + foreach ($config as $key => $value) { + switch ($key) { + case self::ADAPTER: + $this->_setAdapter($value); + break; + case self::SCHEMA: + $this->_schema = (string) $value; + break; + case self::NAME: + $this->_name = (string) $value; + break; + case self::PRIMARY: + $this->_primary = (array) $value; + break; + case self::ROW_CLASS: + $this->setRowClass($value); + break; + case self::ROWSET_CLASS: + $this->setRowsetClass($value); + break; + case self::REFERENCE_MAP: + $this->setReferences($value); + break; + case self::DEPENDENT_TABLES: + $this->setDependentTables($value); + break; + case self::METADATA_CACHE: + $this->_setMetadataCache($value); + break; + case self::METADATA_CACHE_IN_CLASS: + $this->setMetadataCacheInClass($value); + break; + case self::SEQUENCE: + $this->_setSequence($value); + break; + default: + // ignore unrecognized configuration directive + break; + } + } + + $this->_setup(); + $this->init(); + } + + /** + * @param string $classname + * @return Zend_Db_Table_Abstract Provides a fluent interface + */ + public function setRowClass($classname) + { + $this->_rowClass = (string) $classname; + + return $this; + } + + /** + * @return string + */ + public function getRowClass() + { + return $this->_rowClass; + } + + /** + * @param string $classname + * @return Zend_Db_Table_Abstract Provides a fluent interface + */ + public function setRowsetClass($classname) + { + $this->_rowsetClass = (string) $classname; + + return $this; + } + + /** + * @return string + */ + public function getRowsetClass() + { + return $this->_rowsetClass; + } + + /** + * @param array $referenceMap + * @return Zend_Db_Table_Abstract Provides a fluent interface + */ + public function setReferences(array $referenceMap) + { + $this->_referenceMap = $referenceMap; + + return $this; + } + + /** + * @param string $tableClassname + * @param string $ruleKey OPTIONAL + * @return array + * @throws Zend_Db_Table_Exception + */ + public function getReference($tableClassname, $ruleKey = null) + { + $thisClass = get_class($this); + $refMap = $this->_getReferenceMapNormalized(); + if ($ruleKey !== null) { + if (!isset($refMap[$ruleKey])) { + require_once "Zend/Db/Table/Exception.php"; + throw new Zend_Db_Table_Exception("No reference rule \"$ruleKey\" from table $thisClass to table $tableClassname"); + } + if ($refMap[$ruleKey][self::REF_TABLE_CLASS] != $tableClassname) { + require_once "Zend/Db/Table/Exception.php"; + throw new Zend_Db_Table_Exception("Reference rule \"$ruleKey\" does not reference table $tableClassname"); + } + return $refMap[$ruleKey]; + } + foreach ($refMap as $reference) { + if ($reference[self::REF_TABLE_CLASS] == $tableClassname) { + return $reference; + } + } + require_once "Zend/Db/Table/Exception.php"; + throw new Zend_Db_Table_Exception("No reference from table $thisClass to table $tableClassname"); + } + + /** + * @param array $dependentTables + * @return Zend_Db_Table_Abstract Provides a fluent interface + */ + public function setDependentTables(array $dependentTables) + { + $this->_dependentTables = $dependentTables; + + return $this; + } + + /** + * @return array + */ + public function getDependentTables() + { + return $this->_dependentTables; + } + + /** + * set the defaultSource property - this tells the table class where to find default values + * + * @param string $defaultSource + * @return Zend_Db_Table_Abstract + */ + public function setDefaultSource($defaultSource = self::DEFAULT_NONE) + { + if (!in_array($defaultSource, array(self::DEFAULT_CLASS, self::DEFAULT_DB, self::DEFAULT_NONE))) { + $defaultSource = self::DEFAULT_NONE; + } + + $this->_defaultSource = $defaultSource; + return $this; + } + + /** + * returns the default source flag that determines where defaultSources come from + * + * @return unknown + */ + public function getDefaultSource() + { + return $this->_defaultSource; + } + + /** + * set the default values for the table class + * + * @param array $defaultValues + * @return Zend_Db_Table_Abstract + */ + public function setDefaultValues(Array $defaultValues) + { + foreach ($defaultValues as $defaultName => $defaultValue) { + if (array_key_exists($defaultName, $this->_metadata)) { + $this->_defaultValues[$defaultName] = $defaultValue; + } + } + return $this; + } + + public function getDefaultValues() + { + return $this->_defaultValues; + } + + + /** + * Sets the default Zend_Db_Adapter_Abstract for all Zend_Db_Table objects. + * + * @param mixed $db Either an Adapter object, or a string naming a Registry key + * @return void + */ + public static function setDefaultAdapter($db = null) + { + self::$_defaultDb = self::_setupAdapter($db); + } + + /** + * Gets the default Zend_Db_Adapter_Abstract for all Zend_Db_Table objects. + * + * @return Zend_Db_Adapter_Abstract or null + */ + public static function getDefaultAdapter() + { + return self::$_defaultDb; + } + + /** + * @param mixed $db Either an Adapter object, or a string naming a Registry key + * @return Zend_Db_Table_Abstract Provides a fluent interface + */ + protected function _setAdapter($db) + { + $this->_db = self::_setupAdapter($db); + return $this; + } + + /** + * Gets the Zend_Db_Adapter_Abstract for this particular Zend_Db_Table object. + * + * @return Zend_Db_Adapter_Abstract + */ + public function getAdapter() + { + return $this->_db; + } + + /** + * @param mixed $db Either an Adapter object, or a string naming a Registry key + * @return Zend_Db_Adapter_Abstract + * @throws Zend_Db_Table_Exception + */ + protected static function _setupAdapter($db) + { + if ($db === null) { + return null; + } + if (is_string($db)) { + require_once 'Zend/Registry.php'; + $db = Zend_Registry::get($db); + } + if (!$db instanceof Zend_Db_Adapter_Abstract) { + require_once 'Zend/Db/Table/Exception.php'; + throw new Zend_Db_Table_Exception('Argument must be of type Zend_Db_Adapter_Abstract, or a Registry key where a Zend_Db_Adapter_Abstract object is stored'); + } + return $db; + } + + /** + * Sets the default metadata cache for information returned by Zend_Db_Adapter_Abstract::describeTable(). + * + * If $defaultMetadataCache is null, then no metadata cache is used by default. + * + * @param mixed $metadataCache Either a Cache object, or a string naming a Registry key + * @return void + */ + public static function setDefaultMetadataCache($metadataCache = null) + { + self::$_defaultMetadataCache = self::_setupMetadataCache($metadataCache); + } + + /** + * Gets the default metadata cache for information returned by Zend_Db_Adapter_Abstract::describeTable(). + * + * @return Zend_Cache_Core or null + */ + public static function getDefaultMetadataCache() + { + return self::$_defaultMetadataCache; + } + + /** + * Sets the metadata cache for information returned by Zend_Db_Adapter_Abstract::describeTable(). + * + * If $metadataCache is null, then no metadata cache is used. Since there is no opportunity to reload metadata + * after instantiation, this method need not be public, particularly because that it would have no effect + * results in unnecessary API complexity. To configure the metadata cache, use the metadataCache configuration + * option for the class constructor upon instantiation. + * + * @param mixed $metadataCache Either a Cache object, or a string naming a Registry key + * @return Zend_Db_Table_Abstract Provides a fluent interface + */ + protected function _setMetadataCache($metadataCache) + { + $this->_metadataCache = self::_setupMetadataCache($metadataCache); + return $this; + } + + /** + * Gets the metadata cache for information returned by Zend_Db_Adapter_Abstract::describeTable(). + * + * @return Zend_Cache_Core or null + */ + public function getMetadataCache() + { + return $this->_metadataCache; + } + + /** + * Indicate whether metadata should be cached in the class for the duration + * of the instance + * + * @param bool $flag + * @return Zend_Db_Table_Abstract + */ + public function setMetadataCacheInClass($flag) + { + $this->_metadataCacheInClass = (bool) $flag; + return $this; + } + + /** + * Retrieve flag indicating if metadata should be cached for duration of + * instance + * + * @return bool + */ + public function metadataCacheInClass() + { + return $this->_metadataCacheInClass; + } + + /** + * @param mixed $metadataCache Either a Cache object, or a string naming a Registry key + * @return Zend_Cache_Core + * @throws Zend_Db_Table_Exception + */ + protected static function _setupMetadataCache($metadataCache) + { + if ($metadataCache === null) { + return null; + } + if (is_string($metadataCache)) { + require_once 'Zend/Registry.php'; + $metadataCache = Zend_Registry::get($metadataCache); + } + if (!$metadataCache instanceof Zend_Cache_Core) { + require_once 'Zend/Db/Table/Exception.php'; + throw new Zend_Db_Table_Exception('Argument must be of type Zend_Cache_Core, or a Registry key where a Zend_Cache_Core object is stored'); + } + return $metadataCache; + } + + /** + * Sets the sequence member, which defines the behavior for generating + * primary key values in new rows. + * - If this is a string, then the string names the sequence object. + * - If this is boolean true, then the key uses an auto-incrementing + * or identity mechanism. + * - If this is boolean false, then the key is user-defined. + * Use this for natural keys, for example. + * + * @param mixed $sequence + * @return Zend_Db_Table_Adapter_Abstract Provides a fluent interface + */ + protected function _setSequence($sequence) + { + $this->_sequence = $sequence; + + return $this; + } + + /** + * Turnkey for initialization of a table object. + * Calls other protected methods for individual tasks, to make it easier + * for a subclass to override part of the setup logic. + * + * @return void + */ + protected function _setup() + { + $this->_setupDatabaseAdapter(); + $this->_setupTableName(); + } + + /** + * Initialize database adapter. + * + * @return void + */ + protected function _setupDatabaseAdapter() + { + if (! $this->_db) { + $this->_db = self::getDefaultAdapter(); + if (!$this->_db instanceof Zend_Db_Adapter_Abstract) { + require_once 'Zend/Db/Table/Exception.php'; + throw new Zend_Db_Table_Exception('No adapter found for ' . get_class($this)); + } + } + } + + /** + * Initialize table and schema names. + * + * If the table name is not set in the class definition, + * use the class name itself as the table name. + * + * A schema name provided with the table name (e.g., "schema.table") overrides + * any existing value for $this->_schema. + * + * @return void + */ + protected function _setupTableName() + { + if (! $this->_name) { + $this->_name = get_class($this); + } else if (strpos($this->_name, '.')) { + list($this->_schema, $this->_name) = explode('.', $this->_name); + } + } + + /** + * Initializes metadata. + * + * If metadata cannot be loaded from cache, adapter's describeTable() method is called to discover metadata + * information. Returns true if and only if the metadata are loaded from cache. + * + * @return boolean + * @throws Zend_Db_Table_Exception + */ + protected function _setupMetadata() + { + if ($this->metadataCacheInClass() && (count($this->_metadata) > 0)) { + return true; + } + + // Assume that metadata will be loaded from cache + $isMetadataFromCache = true; + + // If $this has no metadata cache but the class has a default metadata cache + if (null === $this->_metadataCache && null !== self::$_defaultMetadataCache) { + // Make $this use the default metadata cache of the class + $this->_setMetadataCache(self::$_defaultMetadataCache); + } + + // 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"); + } + + // If $this has no metadata cache or metadata cache misses + if (null === $this->_metadataCache || !($metadata = $this->_metadataCache->load($cacheId))) { + // Metadata are not loaded from cache + $isMetadataFromCache = false; + // Fetch metadata from the adapter's describeTable() method + $metadata = $this->_db->describeTable($this->_name, $this->_schema); + // If $this has a metadata cache, then cache the metadata + if (null !== $this->_metadataCache && !$this->_metadataCache->save($metadata, $cacheId)) { + /** + * @see Zend_Db_Table_Exception + */ + require_once 'Zend/Db/Table/Exception.php'; + throw new Zend_Db_Table_Exception('Failed saving metadata to metadataCache'); + } + } + + // Assign the metadata to $this + $this->_metadata = $metadata; + + // Return whether the metadata were loaded from cache + return $isMetadataFromCache; + } + + /** + * Retrieve table columns + * + * @return array + */ + protected function _getCols() + { + if (null === $this->_cols) { + $this->_setupMetadata(); + $this->_cols = array_keys($this->_metadata); + } + return $this->_cols; + } + + /** + * Initialize primary key from metadata. + * If $_primary is not defined, discover primary keys + * from the information returned by describeTable(). + * + * @return void + * @throws Zend_Db_Table_Exception + */ + protected function _setupPrimaryKey() + { + if (!$this->_primary) { + $this->_setupMetadata(); + $this->_primary = array(); + foreach ($this->_metadata as $col) { + if ($col['PRIMARY']) { + $this->_primary[ $col['PRIMARY_POSITION'] ] = $col['COLUMN_NAME']; + if ($col['IDENTITY']) { + $this->_identity = $col['PRIMARY_POSITION']; + } + } + } + // if no primary key was specified and none was found in the metadata + // then throw an exception. + if (empty($this->_primary)) { + require_once 'Zend/Db/Table/Exception.php'; + throw new Zend_Db_Table_Exception('A table must have a primary key, but none was found'); + } + } else if (!is_array($this->_primary)) { + $this->_primary = array(1 => $this->_primary); + } else if (isset($this->_primary[0])) { + array_unshift($this->_primary, null); + unset($this->_primary[0]); + } + + $cols = $this->_getCols(); + if (! array_intersect((array) $this->_primary, $cols) == (array) $this->_primary) { + require_once 'Zend/Db/Table/Exception.php'; + throw new Zend_Db_Table_Exception("Primary key column(s) (" + . implode(',', (array) $this->_primary) + . ") are not columns in this table (" + . implode(',', $cols) + . ")"); + } + + $primary = (array) $this->_primary; + $pkIdentity = $primary[(int) $this->_identity]; + + /** + * Special case for PostgreSQL: a SERIAL key implicitly uses a sequence + * object whose name is "__seq". + */ + if ($this->_sequence === true && $this->_db instanceof Zend_Db_Adapter_Pdo_Pgsql) { + $this->_sequence = "{$this->_name}_{$pkIdentity}_seq"; + if ($this->_schema) { + $this->_sequence = $this->_schema . '.' . $this->_sequence; + } + } + } + + /** + * Returns a normalized version of the reference map + * + * @return array + */ + protected function _getReferenceMapNormalized() + { + $referenceMapNormalized = array(); + + foreach ($this->_referenceMap as $rule => $map) { + + $referenceMapNormalized[$rule] = array(); + + foreach ($map as $key => $value) { + switch ($key) { + + // normalize COLUMNS and REF_COLUMNS to arrays + case self::COLUMNS: + case self::REF_COLUMNS: + if (!is_array($value)) { + $referenceMapNormalized[$rule][$key] = array($value); + } else { + $referenceMapNormalized[$rule][$key] = $value; + } + break; + + // other values are copied as-is + default: + $referenceMapNormalized[$rule][$key] = $value; + break; + } + } + } + + return $referenceMapNormalized; + } + + /** + * Initialize object + * + * Called from {@link __construct()} as final step of object instantiation. + * + * @return void + */ + public function init() + { + } + + /** + * Returns table information. + * + * You can elect to return only a part of this information by supplying its key name, + * otherwise all information is returned as an array. + * + * @param $key The specific info part to return OPTIONAL + * @return mixed + */ + public function info($key = null) + { + $this->_setupPrimaryKey(); + + $info = array( + self::SCHEMA => $this->_schema, + self::NAME => $this->_name, + self::COLS => $this->_getCols(), + self::PRIMARY => (array) $this->_primary, + self::METADATA => $this->_metadata, + self::ROW_CLASS => $this->_rowClass, + self::ROWSET_CLASS => $this->_rowsetClass, + self::REFERENCE_MAP => $this->_referenceMap, + self::DEPENDENT_TABLES => $this->_dependentTables, + self::SEQUENCE => $this->_sequence + ); + + if ($key === null) { + return $info; + } + + if (!array_key_exists($key, $info)) { + require_once 'Zend/Db/Table/Exception.php'; + throw new Zend_Db_Table_Exception('There is no table information for the key "' . $key . '"'); + } + + return $info[$key]; + } + + /** + * Returns an instance of a Zend_Db_Table_Select object. + * + * @return Zend_Db_Table_Select + */ + public function select() + { + require_once 'Zend/Db/Table/Select.php'; + return new Zend_Db_Table_Select($this); + } + + /** + * Inserts a new row. + * + * @param array $data Column-value pairs. + * @return mixed The primary key of the row inserted. + */ + public function insert(array $data) + { + $this->_setupPrimaryKey(); + + /** + * Zend_Db_Table assumes that if you have a compound primary key + * and one of the columns in the key uses a sequence, + * it's the _first_ column in the compound key. + */ + $primary = (array) $this->_primary; + $pkIdentity = $primary[(int)$this->_identity]; + + /** + * If this table uses a database sequence object and the data does not + * specify a value, then get the next ID from the sequence and add it + * to the row. We assume that only the first column in a compound + * primary key takes a value from a sequence. + */ + if (is_string($this->_sequence) && !isset($data[$pkIdentity])) { + $data[$pkIdentity] = $this->_db->nextSequenceId($this->_sequence); + } + + /** + * If the primary key can be generated automatically, and no value was + * specified in the user-supplied data, then omit it from the tuple. + */ + if (array_key_exists($pkIdentity, $data) && $data[$pkIdentity] === null) { + unset($data[$pkIdentity]); + } + + /** + * INSERT the new row. + */ + $tableSpec = ($this->_schema ? $this->_schema . '.' : '') . $this->_name; + $this->_db->insert($tableSpec, $data); + + /** + * Fetch the most recent ID generated by an auto-increment + * or IDENTITY column, unless the user has specified a value, + * overriding the auto-increment mechanism. + */ + if ($this->_sequence === true && !isset($data[$pkIdentity])) { + $data[$pkIdentity] = $this->_db->lastInsertId(); + } + + /** + * Return the primary key value if the PK is a single column, + * else return an associative array of the PK column/value pairs. + */ + $pkData = array_intersect_key($data, array_flip($primary)); + if (count($primary) == 1) { + reset($pkData); + return current($pkData); + } + + return $pkData; + } + + /** + * Updates existing rows. + * + * @param array $data Column-value pairs. + * @param array|string $where An SQL WHERE clause, or an array of SQL WHERE clauses. + * @return int The number of rows updated. + */ + public function update(array $data, $where) + { + $tableSpec = ($this->_schema ? $this->_schema . '.' : '') . $this->_name; + return $this->_db->update($tableSpec, $data, $where); + } + + /** + * Called by a row object for the parent table's class during save() method. + * + * @param string $parentTableClassname + * @param array $oldPrimaryKey + * @param array $newPrimaryKey + * @return int + */ + public function _cascadeUpdate($parentTableClassname, array $oldPrimaryKey, array $newPrimaryKey) + { + $this->_setupMetadata(); + $rowsAffected = 0; + foreach ($this->_getReferenceMapNormalized() as $map) { + if ($map[self::REF_TABLE_CLASS] == $parentTableClassname && isset($map[self::ON_UPDATE])) { + switch ($map[self::ON_UPDATE]) { + case self::CASCADE: + $newRefs = array(); + $where = array(); + for ($i = 0; $i < count($map[self::COLUMNS]); ++$i) { + $col = $this->_db->foldCase($map[self::COLUMNS][$i]); + $refCol = $this->_db->foldCase($map[self::REF_COLUMNS][$i]); + if (array_key_exists($refCol, $newPrimaryKey)) { + $newRefs[$col] = $newPrimaryKey[$refCol]; + } + $type = $this->_metadata[$col]['DATA_TYPE']; + $where[] = $this->_db->quoteInto( + $this->_db->quoteIdentifier($col, true) . ' = ?', + $oldPrimaryKey[$refCol], $type); + } + $rowsAffected += $this->update($newRefs, $where); + break; + default: + // no action + break; + } + } + } + return $rowsAffected; + } + + /** + * Deletes existing rows. + * + * @param array|string $where SQL WHERE clause(s). + * @return int The number of rows deleted. + */ + public function delete($where) + { + $tableSpec = ($this->_schema ? $this->_schema . '.' : '') . $this->_name; + return $this->_db->delete($tableSpec, $where); + } + + /** + * Called by parent table's class during delete() method. + * + * @param string $parentTableClassname + * @param array $primaryKey + * @return int Number of affected rows + */ + public function _cascadeDelete($parentTableClassname, array $primaryKey) + { + $this->_setupMetadata(); + $rowsAffected = 0; + foreach ($this->_getReferenceMapNormalized() as $map) { + if ($map[self::REF_TABLE_CLASS] == $parentTableClassname && isset($map[self::ON_DELETE])) { + switch ($map[self::ON_DELETE]) { + case self::CASCADE: + $where = array(); + for ($i = 0; $i < count($map[self::COLUMNS]); ++$i) { + $col = $this->_db->foldCase($map[self::COLUMNS][$i]); + $refCol = $this->_db->foldCase($map[self::REF_COLUMNS][$i]); + $type = $this->_metadata[$col]['DATA_TYPE']; + $where[] = $this->_db->quoteInto( + $this->_db->quoteIdentifier($col, true) . ' = ?', + $primaryKey[$refCol], $type); + } + $rowsAffected += $this->delete($where); + break; + default: + // no action + break; + } + } + } + return $rowsAffected; + } + + /** + * Fetches rows by primary key. The argument specifies one or more primary + * key value(s). To find multiple rows by primary key, the argument must + * be an array. + * + * This method accepts a variable number of arguments. If the table has a + * multi-column primary key, the number of arguments must be the same as + * the number of columns in the primary key. To find multiple rows in a + * table with a multi-column primary key, each argument must be an array + * with the same number of elements. + * + * The find() method always returns a Rowset object, even if only one row + * was found. + * + * @param mixed $key The value(s) of the primary keys. + * @return Zend_Db_Table_Rowset_Abstract Row(s) matching the criteria. + * @throws Zend_Db_Table_Exception + */ + public function find() + { + $this->_setupPrimaryKey(); + $args = func_get_args(); + $keyNames = array_values((array) $this->_primary); + + if (count($args) < count($keyNames)) { + require_once 'Zend/Db/Table/Exception.php'; + throw new Zend_Db_Table_Exception("Too few columns for the primary key"); + } + + if (count($args) > count($keyNames)) { + require_once 'Zend/Db/Table/Exception.php'; + throw new Zend_Db_Table_Exception("Too many columns for the primary key"); + } + + $whereList = array(); + $numberTerms = 0; + foreach ($args as $keyPosition => $keyValues) { + // Coerce the values to an array. + // Don't simply typecast to array, because the values + // might be Zend_Db_Expr objects. + if (!is_array($keyValues)) { + $keyValues = array($keyValues); + } + if ($numberTerms == 0) { + $numberTerms = count($keyValues); + } else if (count($keyValues) != $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) { + if (!isset($whereList[$i])) { + $whereList[$i] = array(); + } + $whereList[$i][$keyPosition] = $keyValues[$i]; + } + } + + $whereClause = null; + if (count($whereList)) { + $whereOrTerms = array(); + foreach ($whereList as $keyValueSets) { + $whereAndTerms = array(); + foreach ($keyValueSets as $keyPosition => $keyValue) { + $type = $this->_metadata[$keyNames[$keyPosition]]['DATA_TYPE']; + $tableName = $this->_db->quoteTableAs($this->_name, null, true); + $columnName = $this->_db->quoteIdentifier($keyNames[$keyPosition], true); + $whereAndTerms[] = $this->_db->quoteInto( + $tableName . '.' . $columnName . ' = ?', + $keyValue, $type); + } + $whereOrTerms[] = '(' . implode(' AND ', $whereAndTerms) . ')'; + } + $whereClause = '(' . implode(' OR ', $whereOrTerms) . ')'; + } + + return $this->fetchAll($whereClause); + } + + /** + * Fetches all rows. + * + * Honors the Zend_Db_Adapter fetch mode. + * + * @param string|array|Zend_Db_Table_Select $where OPTIONAL An SQL WHERE clause or Zend_Db_Table_Select object. + * @param string|array $order OPTIONAL An SQL ORDER clause. + * @param int $count OPTIONAL An SQL LIMIT count. + * @param int $offset OPTIONAL An SQL LIMIT offset. + * @return Zend_Db_Table_Rowset_Abstract The row results per the Zend_Db_Adapter fetch mode. + */ + public function fetchAll($where = null, $order = null, $count = null, $offset = null) + { + if (!($where instanceof Zend_Db_Table_Select)) { + $select = $this->select(); + + if ($where !== null) { + $this->_where($select, $where); + } + + if ($order !== null) { + $this->_order($select, $order); + } + + if ($count !== null || $offset !== null) { + $select->limit($count, $offset); + } + + } else { + $select = $where; + } + + $rows = $this->_fetch($select); + + $data = array( + 'table' => $this, + 'data' => $rows, + 'readOnly' => $select->isReadOnly(), + 'rowClass' => $this->_rowClass, + 'stored' => true + ); + + @Zend_Loader::loadClass($this->_rowsetClass); + return new $this->_rowsetClass($data); + } + + /** + * Fetches one row in an object of type Zend_Db_Table_Row_Abstract, + * or returns Boolean false if no row matches the specified criteria. + * + * @param string|array|Zend_Db_Table_Select $where OPTIONAL An SQL WHERE clause or Zend_Db_Table_Select object. + * @param string|array $order OPTIONAL An SQL ORDER clause. + * @return Zend_Db_Table_Row_Abstract The row results per the + * Zend_Db_Adapter fetch mode, or null if no row found. + */ + public function fetchRow($where = null, $order = null) + { + if (!($where instanceof Zend_Db_Table_Select)) { + $select = $this->select(); + + if ($where !== null) { + $this->_where($select, $where); + } + + if ($order !== null) { + $this->_order($select, $order); + } + + $select->limit(1); + + } else { + $select = $where->limit(1); + } + + $rows = $this->_fetch($select); + + if (count($rows) == 0) { + return null; + } + + $data = array( + 'table' => $this, + 'data' => $rows[0], + 'readOnly' => $select->isReadOnly(), + 'stored' => true + ); + + @Zend_Loader::loadClass($this->_rowClass); + return new $this->_rowClass($data); + } + + /** + * Fetches a new blank row (not from the database). + * + * @return Zend_Db_Table_Row_Abstract + * @deprecated since 0.9.3 - use createRow() instead. + */ + public function fetchNew() + { + return $this->createRow(); + } + + /** + * Fetches a new blank row (not from the database). + * + * @param array $data OPTIONAL data to populate in the new row. + * @param string $defaultSource OPTIONAL flag to force default values into new row + * @return Zend_Db_Table_Row_Abstract + */ + public function createRow(array $data = array(), $defaultSource = null) + { + $cols = $this->_getCols(); + $defaults = array_combine($cols, array_fill(0, count($cols), null)); + + // nothing provided at call-time, take the class value + if ($defaultSource == null) { + $defaultSource = $this->_defaultSource; + } + + if (!in_array($defaultSource, array(self::DEFAULT_CLASS, self::DEFAULT_DB, self::DEFAULT_NONE))) { + $defaultSource = self::DEFAULT_NONE; + } + + if ($defaultSource == self::DEFAULT_DB) { + foreach ($this->_metadata as $metadataName => $metadata) { + if (($metadata['DEFAULT'] != null) && + ($metadata['NULLABLE'] !== true || ($metadata['NULLABLE'] === true && isset($this->_defaultValues[$metadataName]) && $this->_defaultValues[$metadataName] === true)) && + (!(isset($this->_defaultValues[$metadataName]) && $this->_defaultValues[$metadataName] === false))) { + $defaults[$metadataName] = $metadata['DEFAULT']; + } + } + } elseif ($defaultSource == self::DEFAULT_CLASS && $this->_defaultValues) { + foreach ($this->_defaultValues as $defaultName => $defaultValue) { + if (array_key_exists($defaultName, $defaults)) { + $defaults[$defaultName] = $defaultValue; + } + } + } + + $config = array( + 'table' => $this, + 'data' => $defaults, + 'readOnly' => false, + 'stored' => false + ); + + @Zend_Loader::loadClass($this->_rowClass); + $row = new $this->_rowClass($config); + $row->setFromArray($data); + return $row; + } + + /** + * Generate WHERE clause from user-supplied string or array + * + * @param string|array $where OPTIONAL An SQL WHERE clause. + * @return Zend_Db_Table_Select + */ + protected function _where(Zend_Db_Table_Select $select, $where) + { + $where = (array) $where; + + foreach ($where as $key => $val) { + // is $key an int? + if (is_int($key)) { + // $val is the full condition + $select->where($val); + } else { + // $key is the condition with placeholder, + // and $val is quoted into the condition + $select->where($key, $val); + } + } + + return $select; + } + + /** + * Generate ORDER clause from user-supplied string or array + * + * @param string|array $order OPTIONAL An SQL ORDER clause. + * @return Zend_Db_Table_Select + */ + protected function _order(Zend_Db_Table_Select $select, $order) + { + if (!is_array($order)) { + $order = array($order); + } + + foreach ($order as $val) { + $select->order($val); + } + + return $select; + } + + /** + * Support method for fetching rows. + * + * @param Zend_Db_Table_Select $select query options. + * @return array An array containing the row results in FETCH_ASSOC mode. + */ + protected function _fetch(Zend_Db_Table_Select $select) + { + $stmt = $this->_db->query($select); + $data = $stmt->fetchAll(Zend_Db::FETCH_ASSOC); + return $data; + } + +} diff --git a/libs/Zend/Db/Table/Exception.php b/libs/Zend/Db/Table/Exception.php new file mode 100644 index 0000000..377de5b --- /dev/null +++ b/libs/Zend/Db/Table/Exception.php @@ -0,0 +1,37 @@ + value). + * The keys must match the physical names of columns in the + * table for which this row is defined. + * + * @var array + */ + protected $_data = array(); + + /** + * This is set to a copy of $_data when the data is fetched from + * a database, specified as a new tuple in the constructor, or + * when dirty data is posted to the database with save(). + * + * @var array + */ + protected $_cleanData = array(); + + /** + * Tracks columns where data has been updated. Allows more specific insert and + * update operations. + * + * @var array + */ + protected $_modifiedFields = array(); + + /** + * Zend_Db_Table_Abstract parent class or instance. + * + * @var Zend_Db_Table_Abstract + */ + protected $_table = null; + + /** + * Connected is true if we have a reference to a live + * Zend_Db_Table_Abstract object. + * This is false after the Rowset has been deserialized. + * + * @var boolean + */ + protected $_connected = true; + + /** + * A row is marked read only if it contains columns that are not physically represented within + * the database schema (e.g. evaluated columns/Zend_Db_Expr columns). This can also be passed + * as a run-time config options as a means of protecting row data. + * + * @var boolean + */ + protected $_readOnly = false; + + /** + * Name of the class of the Zend_Db_Table_Abstract object. + * + * @var string + */ + protected $_tableClass = null; + + /** + * Primary row key(s). + * + * @var array + */ + protected $_primary; + + /** + * Constructor. + * + * Supported params for $config are:- + * - table = class name or object of type Zend_Db_Table_Abstract + * - data = values of columns in this row. + * + * @param array $config OPTIONAL Array of user-specified config options. + * @return void + * @throws Zend_Db_Table_Row_Exception + */ + public function __construct(array $config = array()) + { + if (isset($config['table']) && $config['table'] instanceof Zend_Db_Table_Abstract) { + $this->_table = $config['table']; + $this->_tableClass = get_class($this->_table); + } + + if (isset($config['data'])) { + if (!is_array($config['data'])) { + require_once 'Zend/Db/Table/Row/Exception.php'; + throw new Zend_Db_Table_Row_Exception('Data must be an array'); + } + $this->_data = $config['data']; + } + if (isset($config['stored']) && $config['stored'] === true) { + $this->_cleanData = $this->_data; + } + + if (isset($config['readOnly']) && $config['readOnly'] === true) { + $this->setReadOnly(true); + } + + // Retrieve primary keys from table schema + if (($table = $this->_getTable())) { + $info = $table->info(); + $this->_primary = (array) $info['primary']; + } + + $this->init(); + } + + /** + * Transform a column name from the user-specified form + * to the physical form used in the database. + * You can override this method in a custom Row class + * to implement column name mappings, for example inflection. + * + * @param string $columnName Column name given. + * @return string The column name after transformation applied (none by default). + * @throws Zend_Db_Table_Row_Exception if the $columnName is not a string. + */ + protected function _transformColumn($columnName) + { + if (!is_string($columnName)) { + require_once 'Zend/Db/Table/Row/Exception.php'; + throw new Zend_Db_Table_Row_Exception('Specified column is not a string'); + } + // Perform no transformation by default + return $columnName; + } + + /** + * Retrieve row field value + * + * @param string $columnName The user-specified column name. + * @return string The corresponding column value. + * @throws Zend_Db_Table_Row_Exception if the $columnName is not a column in the row. + */ + public function __get($columnName) + { + $columnName = $this->_transformColumn($columnName); + if (!array_key_exists($columnName, $this->_data)) { + require_once 'Zend/Db/Table/Row/Exception.php'; + throw new Zend_Db_Table_Row_Exception("Specified column \"$columnName\" is not in the row"); + } + return $this->_data[$columnName]; + } + + /** + * Set row field value + * + * @param string $columnName The column key. + * @param mixed $value The value for the property. + * @return void + * @throws Zend_Db_Table_Row_Exception + */ + public function __set($columnName, $value) + { + $columnName = $this->_transformColumn($columnName); + if (!array_key_exists($columnName, $this->_data)) { + require_once 'Zend/Db/Table/Row/Exception.php'; + throw new Zend_Db_Table_Row_Exception("Specified column \"$columnName\" is not in the row"); + } + $this->_data[$columnName] = $value; + $this->_modifiedFields[$columnName] = true; + } + + /** + * Test existence of row field + * + * @param string $columnName The column key. + * @return boolean + */ + public function __isset($columnName) + { + $columnName = $this->_transformColumn($columnName); + return array_key_exists($columnName, $this->_data); + } + + /** + * Store table, primary key and data in serialized object + * + * @return array + */ + public function __sleep() + { + return array('_tableClass', '_primary', '_data', '_cleanData', '_readOnly' ,'_modifiedFields'); + } + + /** + * Setup to do on wakeup. + * A de-serialized Row should not be assumed to have access to a live + * database connection, so set _connected = false. + * + * @return void + */ + public function __wakeup() + { + $this->_connected = false; + } + + /** + * Proxy to __isset + * Required by the ArrayAccess implementation + * + * @param string $offset + * @return boolean + */ + public function offsetExists($offset) + { + return $this->__isset($offset); + } + + /** + * Proxy to __get + * Required by the ArrayAccess implementation + * + * @param string $offset + * @return string + */ + public function offsetGet($offset) + { + return $this->__get($offset); + } + + /** + * Proxy to __set + * Required by the ArrayAccess implementation + * + * @param string $offset + * @param mixed $value + */ + public function offsetSet($offset, $value) + { + $this->__set($offset, $value); + } + + /** + * Does nothing + * Required by the ArrayAccess implementation + * + * @param string $offset + */ + public function offsetUnset($offset) + { + } + + /** + * Initialize object + * + * Called from {@link __construct()} as final step of object instantiation. + * + * @return void + */ + public function init() + { + } + + /** + * Returns the table object, or null if this is disconnected row + * + * @return Zend_Db_Table_Abstract|null + */ + public function getTable() + { + return $this->_table; + } + + /** + * Set the table object, to re-establish a live connection + * to the database for a Row that has been de-serialized. + * + * @param Zend_Db_Table_Abstract $table + * @return boolean + * @throws Zend_Db_Table_Row_Exception + */ + public function setTable(Zend_Db_Table_Abstract $table = null) + { + if ($table == null) { + $this->_table = null; + $this->_connected = false; + return false; + } + + $tableClass = get_class($table); + if (! $table instanceof $this->_tableClass) { + require_once 'Zend/Db/Table/Row/Exception.php'; + throw new Zend_Db_Table_Row_Exception("The specified Table is of class $tableClass, expecting class to be instance of $this->_tableClass"); + } + + $this->_table = $table; + $this->_tableClass = $tableClass; + + $info = $this->_table->info(); + + if ($info['cols'] != array_keys($this->_data)) { + require_once 'Zend/Db/Table/Row/Exception.php'; + throw new Zend_Db_Table_Row_Exception('The specified Table does not have the same columns as the Row'); + } + + if (! array_intersect((array) $this->_primary, $info['primary']) == (array) $this->_primary) { + + require_once 'Zend/Db/Table/Row/Exception.php'; + throw new Zend_Db_Table_Row_Exception("The specified Table '$tableClass' does not have the same primary key as the Row"); + } + + $this->_connected = true; + return true; + } + + /** + * Query the class name of the Table object for which this + * Row was created. + * + * @return string + */ + public function getTableClass() + { + return $this->_tableClass; + } + + /** + * Test the connected status of the row. + * + * @return boolean + */ + public function isConnected() + { + return $this->_connected; + } + + /** + * Test the read-only status of the row. + * + * @return boolean + */ + public function isReadOnly() + { + return $this->_readOnly; + } + + /** + * Set the read-only status of the row. + * + * @param boolean $flag + * @return boolean + */ + public function setReadOnly($flag) + { + $this->_readOnly = (bool) $flag; + } + + /** + * Returns an instance of the parent table's Zend_Db_Table_Select object. + * + * @return Zend_Db_Table_Select + */ + public function select() + { + return $this->getTable()->select(); + } + + /** + * Saves the properties to the database. + * + * This performs an intelligent insert/update, and reloads the + * properties with fresh data from the table on success. + * + * @return mixed The primary key value(s), as an associative array if the + * key is compound, or a scalar if the key is single-column. + */ + public function save() + { + /** + * If the _cleanData array is empty, + * this is an INSERT of a new row. + * Otherwise it is an UPDATE. + */ + if (empty($this->_cleanData)) { + return $this->_doInsert(); + } else { + return $this->_doUpdate(); + } + } + + /** + * @return mixed The primary key value(s), as an associative array if the + * key is compound, or a scalar if the key is single-column. + */ + protected function _doInsert() + { + /** + * A read-only row cannot be saved. + */ + if ($this->_readOnly === true) { + require_once 'Zend/Db/Table/Row/Exception.php'; + throw new Zend_Db_Table_Row_Exception('This row has been marked read-only'); + } + + /** + * Run pre-INSERT logic + */ + $this->_insert(); + + /** + * Execute the INSERT (this may throw an exception) + */ + $data = array_intersect_key($this->_data, $this->_modifiedFields); + $primaryKey = $this->_getTable()->insert($data); + + /** + * Normalize the result to an array indexed by primary key column(s). + * The table insert() method may return a scalar. + */ + if (is_array($primaryKey)) { + $newPrimaryKey = $primaryKey; + } else { + $newPrimaryKey = array(current((array) $this->_primary) => $primaryKey); + } + + /** + * Save the new primary key value in _data. The primary key may have + * been generated by a sequence or auto-increment mechanism, and this + * merge should be done before the _postInsert() method is run, so the + * new values are available for logging, etc. + */ + $this->_data = array_merge($this->_data, $newPrimaryKey); + + /** + * Run post-INSERT logic + */ + $this->_postInsert(); + + /** + * Update the _cleanData to reflect that the data has been inserted. + */ + $this->_refresh(); + + return $primaryKey; + } + + /** + * @return mixed The primary key value(s), as an associative array if the + * key is compound, or a scalar if the key is single-column. + */ + protected function _doUpdate() + { + /** + * A read-only row cannot be saved. + */ + if ($this->_readOnly === true) { + require_once 'Zend/Db/Table/Row/Exception.php'; + throw new Zend_Db_Table_Row_Exception('This row has been marked read-only'); + } + + /** + * Get expressions for a WHERE clause + * based on the primary key value(s). + */ + $where = $this->_getWhereQuery(false); + + /** + * Run pre-UPDATE logic + */ + $this->_update(); + + /** + * Compare the data to the modified fields array to discover + * which columns have been changed. + */ + $diffData = array_intersect_key($this->_data, $this->_modifiedFields); + + /** + * Were any of the changed columns part of the primary key? + */ + $pkDiffData = array_intersect_key($diffData, array_flip((array)$this->_primary)); + + /** + * Execute cascading updates against dependent tables. + * Do this only if primary key value(s) were changed. + */ + if (count($pkDiffData) > 0) { + $depTables = $this->_getTable()->getDependentTables(); + if (!empty($depTables)) { + $db = $this->_getTable()->getAdapter(); + $pkNew = $this->_getPrimaryKey(true); + $pkOld = $this->_getPrimaryKey(false); + foreach ($depTables as $tableClass) { + try { + @Zend_Loader::loadClass($tableClass); + } catch (Zend_Exception $e) { + require_once 'Zend/Db/Table/Row/Exception.php'; + throw new Zend_Db_Table_Row_Exception($e->getMessage()); + } + $t = new $tableClass(array('db' => $db)); + $t->_cascadeUpdate($this->getTableClass(), $pkOld, $pkNew); + } + } + } + + /** + * Execute the UPDATE (this may throw an exception) + * Do this only if data values were changed. + * Use the $diffData variable, so the UPDATE statement + * includes SET terms only for data values that changed. + */ + if (count($diffData) > 0) { + $this->_getTable()->update($diffData, $where); + } + + /** + * Run post-UPDATE logic. Do this before the _refresh() + * so the _postUpdate() function can tell the difference + * between changed data and clean (pre-changed) data. + */ + $this->_postUpdate(); + + /** + * Refresh the data just in case triggers in the RDBMS changed + * any columns. Also this resets the _cleanData. + */ + $this->_refresh(); + + /** + * Return the primary key value(s) as an array + * if the key is compound or a scalar if the key + * is a scalar. + */ + $primaryKey = $this->_getPrimaryKey(true); + if (count($primaryKey) == 1) { + return current($primaryKey); + } + + return $primaryKey; + } + + /** + * Deletes existing rows. + * + * @return int The number of rows deleted. + */ + public function delete() + { + /** + * A read-only row cannot be deleted. + */ + if ($this->_readOnly === true) { + require_once 'Zend/Db/Table/Row/Exception.php'; + throw new Zend_Db_Table_Row_Exception('This row has been marked read-only'); + } + + $where = $this->_getWhereQuery(); + + /** + * Execute pre-DELETE logic + */ + $this->_delete(); + + /** + * Execute cascading deletes against dependent tables + */ + $depTables = $this->_getTable()->getDependentTables(); + if (!empty($depTables)) { + $db = $this->_getTable()->getAdapter(); + $pk = $this->_getPrimaryKey(); + foreach ($depTables as $tableClass) { + try { + @Zend_Loader::loadClass($tableClass); + } catch (Zend_Exception $e) { + require_once 'Zend/Db/Table/Row/Exception.php'; + throw new Zend_Db_Table_Row_Exception($e->getMessage()); + } + $t = new $tableClass(array('db' => $db)); + $t->_cascadeDelete($this->getTableClass(), $pk); + } + } + + /** + * Execute the DELETE (this may throw an exception) + */ + $result = $this->_getTable()->delete($where); + + /** + * Execute post-DELETE logic + */ + $this->_postDelete(); + + /** + * Reset all fields to null to indicate that the row is not there + */ + $this->_data = array_combine( + array_keys($this->_data), + array_fill(0, count($this->_data), null) + ); + + return $result; + } + + /** + * Returns the column/value data as an array. + * + * @return array + */ + public function toArray() + { + return (array)$this->_data; + } + + /** + * Sets all data in the row from an array. + * + * @param array $data + * @return Zend_Db_Table_Row_Abstract Provides a fluent interface + */ + public function setFromArray(array $data) + { + $data = array_intersect_key($data, $this->_data); + + foreach ($data as $columnName => $value) { + $this->__set($columnName, $value); + } + + return $this; + } + + /** + * Refreshes properties from the database. + * + * @return void + */ + public function refresh() + { + return $this->_refresh(); + } + + /** + * Retrieves an instance of the parent table. + * + * @return Zend_Db_Table_Abstract + */ + protected function _getTable() + { + if (!$this->_connected) { + require_once 'Zend/Db/Table/Row/Exception.php'; + throw new Zend_Db_Table_Row_Exception('Cannot save a Row unless it is connected'); + } + return $this->_table; + } + + /** + * Retrieves an associative array of primary keys. + * + * @param bool $useDirty + * @return array + */ + protected function _getPrimaryKey($useDirty = true) + { + if (!is_array($this->_primary)) { + require_once 'Zend/Db/Table/Row/Exception.php'; + throw new Zend_Db_Table_Row_Exception("The primary key must be set as an array"); + } + + $primary = array_flip($this->_primary); + if ($useDirty) { + $array = array_intersect_key($this->_data, $primary); + } else { + $array = array_intersect_key($this->_cleanData, $primary); + } + if (count($primary) != count($array)) { + require_once 'Zend/Db/Table/Row/Exception.php'; + throw new Zend_Db_Table_Row_Exception("The specified Table '$this->_tableClass' does not have the same primary key as the Row"); + } + return $array; + } + + /** + * Constructs where statement for retrieving row(s). + * + * @param bool $useDirty + * @return array + */ + protected function _getWhereQuery($useDirty = true) + { + $where = array(); + $db = $this->_getTable()->getAdapter(); + $primaryKey = $this->_getPrimaryKey($useDirty); + $info = $this->_getTable()->info(); + $metadata = $info[Zend_Db_Table_Abstract::METADATA]; + + // retrieve recently updated row using primary keys + $where = array(); + foreach ($primaryKey as $column => $value) { + $tableName = $db->quoteIdentifier($info[Zend_Db_Table_Abstract::NAME], true); + $type = $metadata[$column]['DATA_TYPE']; + $columnName = $db->quoteIdentifier($column, true); + $where[] = $db->quoteInto("{$tableName}.{$columnName} = ?", $value, $type); + } + return $where; + } + + /** + * Refreshes properties from the database. + * + * @return void + */ + protected function _refresh() + { + $where = $this->_getWhereQuery(); + $row = $this->_getTable()->fetchRow($where); + + if (null === $row) { + require_once 'Zend/Db/Table/Row/Exception.php'; + throw new Zend_Db_Table_Row_Exception('Cannot refresh row as parent is missing'); + } + + $this->_data = $row->toArray(); + $this->_cleanData = $this->_data; + $this->_modifiedFields = array(); + } + + /** + * Allows pre-insert logic to be applied to row. + * Subclasses may override this method. + * + * @return void + */ + protected function _insert() + { + } + + /** + * Allows post-insert logic to be applied to row. + * Subclasses may override this method. + * + * @return void + */ + protected function _postInsert() + { + } + + /** + * Allows pre-update logic to be applied to row. + * Subclasses may override this method. + * + * @return void + */ + protected function _update() + { + } + + /** + * Allows post-update logic to be applied to row. + * Subclasses may override this method. + * + * @return void + */ + protected function _postUpdate() + { + } + + /** + * Allows pre-delete logic to be applied to row. + * Subclasses may override this method. + * + * @return void + */ + protected function _delete() + { + } + + /** + * Allows post-delete logic to be applied to row. + * Subclasses may override this method. + * + * @return void + */ + protected function _postDelete() + { + } + + /** + * Prepares a table reference for lookup. + * + * Ensures all reference keys are set and properly formatted. + * + * @param Zend_Db_Table_Abstract $dependentTable + * @param Zend_Db_Table_Abstract $parentTable + * @param string $ruleKey + * @return array + */ + protected function _prepareReference(Zend_Db_Table_Abstract $dependentTable, Zend_Db_Table_Abstract $parentTable, $ruleKey) + { + $map = $dependentTable->getReference(get_class($parentTable), $ruleKey); + + if (!isset($map[Zend_Db_Table_Abstract::REF_COLUMNS])) { + $parentInfo = $parentTable->info(); + $map[Zend_Db_Table_Abstract::REF_COLUMNS] = array_values((array) $parentInfo['primary']); + } + + $map[Zend_Db_Table_Abstract::COLUMNS] = (array) $map[Zend_Db_Table_Abstract::COLUMNS]; + $map[Zend_Db_Table_Abstract::REF_COLUMNS] = (array) $map[Zend_Db_Table_Abstract::REF_COLUMNS]; + + return $map; + } + + /** + * Query a dependent table to retrieve rows matching the current row. + * + * @param string|Zend_Db_Table_Abstract $dependentTable + * @param string OPTIONAL $ruleKey + * @param Zend_Db_Table_Select OPTIONAL $select + * @return Zend_Db_Table_Rowset_Abstract Query result from $dependentTable + * @throws Zend_Db_Table_Row_Exception If $dependentTable is not a table or is not loadable. + */ + public function findDependentRowset($dependentTable, $ruleKey = null, Zend_Db_Table_Select $select = null) + { + $db = $this->_getTable()->getAdapter(); + + if (is_string($dependentTable)) { + try { + @Zend_Loader::loadClass($dependentTable); + } catch (Zend_Exception $e) { + require_once 'Zend/Db/Table/Row/Exception.php'; + throw new Zend_Db_Table_Row_Exception($e->getMessage()); + } + $dependentTable = new $dependentTable(array('db' => $db)); + } + if (! $dependentTable instanceof Zend_Db_Table_Abstract) { + $type = gettype($dependentTable); + if ($type == 'object') { + $type = get_class($dependentTable); + } + require_once 'Zend/Db/Table/Row/Exception.php'; + throw new Zend_Db_Table_Row_Exception("Dependent table must be a Zend_Db_Table_Abstract, but it is $type"); + } + + if ($select === null) { + $select = $dependentTable->select(); + } else { + $select->setTable($dependentTable); + } + + $map = $this->_prepareReference($dependentTable, $this->_getTable(), $ruleKey); + + for ($i = 0; $i < count($map[Zend_Db_Table_Abstract::COLUMNS]); ++$i) { + $parentColumnName = $db->foldCase($map[Zend_Db_Table_Abstract::REF_COLUMNS][$i]); + $value = $this->_data[$parentColumnName]; + // Use adapter from dependent table to ensure correct query construction + $dependentDb = $dependentTable->getAdapter(); + $dependentColumnName = $dependentDb->foldCase($map[Zend_Db_Table_Abstract::COLUMNS][$i]); + $dependentColumn = $dependentDb->quoteIdentifier($dependentColumnName, true); + $dependentInfo = $dependentTable->info(); + $type = $dependentInfo[Zend_Db_Table_Abstract::METADATA][$dependentColumnName]['DATA_TYPE']; + $select->where("$dependentColumn = ?", $value, $type); + } + + return $dependentTable->fetchAll($select); + } + + /** + * Query a parent table to retrieve the single row matching the current row. + * + * @param string|Zend_Db_Table_Abstract $parentTable + * @param string OPTIONAL $ruleKey + * @return Zend_Db_Table_Row_Abstract Query result from $parentTable + * @throws Zend_Db_Table_Row_Exception If $parentTable is not a table or is not loadable. + */ + public function findParentRow($parentTable, $ruleKey = null, Zend_Db_Table_Select $select = null) + { + $db = $this->_getTable()->getAdapter(); + + if (is_string($parentTable)) { + try { + @Zend_Loader::loadClass($parentTable); + } catch (Zend_Exception $e) { + require_once 'Zend/Db/Table/Row/Exception.php'; + throw new Zend_Db_Table_Row_Exception($e->getMessage()); + } + $parentTable = new $parentTable(array('db' => $db)); + } + if (! $parentTable instanceof Zend_Db_Table_Abstract) { + $type = gettype($parentTable); + if ($type == 'object') { + $type = get_class($parentTable); + } + require_once 'Zend/Db/Table/Row/Exception.php'; + throw new Zend_Db_Table_Row_Exception("Parent table must be a Zend_Db_Table_Abstract, but it is $type"); + } + + if ($select === null) { + $select = $parentTable->select(); + } else { + $select->setTable($parentTable); + } + + $map = $this->_prepareReference($this->_getTable(), $parentTable, $ruleKey); + + for ($i = 0; $i < count($map[Zend_Db_Table_Abstract::COLUMNS]); ++$i) { + $dependentColumnName = $db->foldCase($map[Zend_Db_Table_Abstract::COLUMNS][$i]); + $value = $this->_data[$dependentColumnName]; + // Use adapter from parent table to ensure correct query construction + $parentDb = $parentTable->getAdapter(); + $parentColumnName = $parentDb->foldCase($map[Zend_Db_Table_Abstract::REF_COLUMNS][$i]); + $parentColumn = $parentDb->quoteIdentifier($parentColumnName, true); + $parentInfo = $parentTable->info(); + $type = $parentInfo[Zend_Db_Table_Abstract::METADATA][$parentColumnName]['DATA_TYPE']; + $select->where("$parentColumn = ?", $value, $type); + } + + return $parentTable->fetchRow($select); + } + + /** + * @param string|Zend_Db_Table_Abstract $matchTable + * @param string|Zend_Db_Table_Abstract $intersectionTable + * @param string OPTIONAL $primaryRefRule + * @param string OPTIONAL $matchRefRule + * @return Zend_Db_Table_Rowset_Abstract Query result from $matchTable + * @throws Zend_Db_Table_Row_Exception If $matchTable or $intersectionTable is not a table class or is not loadable. + */ + public function findManyToManyRowset($matchTable, $intersectionTable, $callerRefRule = null, + $matchRefRule = null, Zend_Db_Table_Select $select = null) + { + $db = $this->_getTable()->getAdapter(); + + if (is_string($intersectionTable)) { + try { + @Zend_Loader::loadClass($intersectionTable); + } catch (Zend_Exception $e) { + require_once 'Zend/Db/Table/Row/Exception.php'; + throw new Zend_Db_Table_Row_Exception($e->getMessage()); + } + $intersectionTable = new $intersectionTable(array('db' => $db)); + } + if (! $intersectionTable instanceof Zend_Db_Table_Abstract) { + $type = gettype($intersectionTable); + if ($type == 'object') { + $type = get_class($intersectionTable); + } + require_once 'Zend/Db/Table/Row/Exception.php'; + throw new Zend_Db_Table_Row_Exception("Intersection table must be a Zend_Db_Table_Abstract, but it is $type"); + } + + if (is_string($matchTable)) { + try { + @Zend_Loader::loadClass($matchTable); + } catch (Zend_Exception $e) { + require_once 'Zend/Db/Table/Row/Exception.php'; + throw new Zend_Db_Table_Row_Exception($e->getMessage()); + } + $matchTable = new $matchTable(array('db' => $db)); + } + if (! $matchTable instanceof Zend_Db_Table_Abstract) { + $type = gettype($matchTable); + if ($type == 'object') { + $type = get_class($matchTable); + } + require_once 'Zend/Db/Table/Row/Exception.php'; + throw new Zend_Db_Table_Row_Exception("Match table must be a Zend_Db_Table_Abstract, but it is $type"); + } + + if ($select === null) { + $select = $matchTable->select(); + } else { + $select->setTable($matchTable); + } + + // Use adapter from intersection table to ensure correct query construction + $interInfo = $intersectionTable->info(); + $interDb = $intersectionTable->getAdapter(); + $interName = $interInfo['name']; + $matchInfo = $matchTable->info(); + $matchName = $matchInfo['name']; + + $matchMap = $this->_prepareReference($intersectionTable, $matchTable, $matchRefRule); + + for ($i = 0; $i < count($matchMap[Zend_Db_Table_Abstract::COLUMNS]); ++$i) { + $interCol = $interDb->quoteIdentifier('i' . '.' . $matchMap[Zend_Db_Table_Abstract::COLUMNS][$i], true); + $matchCol = $interDb->quoteIdentifier('m' . '.' . $matchMap[Zend_Db_Table_Abstract::REF_COLUMNS][$i], true); + $joinCond[] = "$interCol = $matchCol"; + } + $joinCond = implode(' AND ', $joinCond); + + $select->from(array('i' => $interName)) + ->joinInner(array('m' => $matchName), $joinCond) + ->setIntegrityCheck(false); + + $callerMap = $this->_prepareReference($intersectionTable, $this->_getTable(), $callerRefRule); + + for ($i = 0; $i < count($callerMap[Zend_Db_Table_Abstract::COLUMNS]); ++$i) { + $callerColumnName = $db->foldCase($callerMap[Zend_Db_Table_Abstract::REF_COLUMNS][$i]); + $value = $this->_data[$callerColumnName]; + $interColumnName = $interDb->foldCase($callerMap[Zend_Db_Table_Abstract::COLUMNS][$i]); + $interCol = $interDb->quoteIdentifier("i.$interColumnName", true); + $interInfo = $intersectionTable->info(); + $type = $interInfo[Zend_Db_Table_Abstract::METADATA][$interColumnName]['DATA_TYPE']; + $select->where($interDb->quoteInto("$interCol = ?", $value, $type)); + } + + $stmt = $select->query(); + + $config = array( + 'table' => $matchTable, + 'data' => $stmt->fetchAll(Zend_Db::FETCH_ASSOC), + 'rowClass' => $matchTable->getRowClass(), + 'readOnly' => false, + 'stored' => true + ); + + $rowsetClass = $matchTable->getRowsetClass(); + try { + @Zend_Loader::loadClass($rowsetClass); + } catch (Zend_Exception $e) { + require_once 'Zend/Db/Table/Row/Exception.php'; + throw new Zend_Db_Table_Row_Exception($e->getMessage()); + } + $rowset = new $rowsetClass($config); + return $rowset; + } + + /** + * Turn magic function calls into non-magic function calls + * to the above methods. + * + * @param string $method + * @param array $args OPTIONAL Zend_Db_Table_Select query modifier + * @return Zend_Db_Table_Row_Abstract|Zend_Db_Table_Rowset_Abstract + * @throws Zend_Db_Table_Row_Exception If an invalid method is called. + */ + public function __call($method, array $args) + { + $matches = array(); + + if (count($args) && $args[0] instanceof Zend_Db_Table_Select) { + $select = $args[0]; + } else { + $select = null; + } + + /** + * Recognize methods for Has-Many cases: + * findParent() + * findParentBy() + * Use the non-greedy pattern repeat modifier e.g. \w+? + */ + if (preg_match('/^findParent(\w+?)(?:By(\w+))?$/', $method, $matches)) { + $class = $matches[1]; + $ruleKey1 = isset($matches[2]) ? $matches[2] : null; + return $this->findParentRow($class, $ruleKey1, $select); + } + + /** + * Recognize methods for Many-to-Many cases: + * findVia() + * findViaBy() + * findViaByAnd() + * Use the non-greedy pattern repeat modifier e.g. \w+? + */ + if (preg_match('/^find(\w+?)Via(\w+?)(?:By(\w+?)(?:And(\w+))?)?$/', $method, $matches)) { + $class = $matches[1]; + $viaClass = $matches[2]; + $ruleKey1 = isset($matches[3]) ? $matches[3] : null; + $ruleKey2 = isset($matches[4]) ? $matches[4] : null; + return $this->findManyToManyRowset($class, $viaClass, $ruleKey1, $ruleKey2, $select); + } + + /** + * Recognize methods for Belongs-To cases: + * find() + * findBy() + * Use the non-greedy pattern repeat modifier e.g. \w+? + */ + if (preg_match('/^find(\w+?)(?:By(\w+))?$/', $method, $matches)) { + $class = $matches[1]; + $ruleKey1 = isset($matches[2]) ? $matches[2] : null; + return $this->findDependentRowset($class, $ruleKey1, $select); + } + + require_once 'Zend/Db/Table/Row/Exception.php'; + throw new Zend_Db_Table_Row_Exception("Unrecognized method '$method()'"); + } + +} diff --git a/libs/Zend/Db/Table/Row/Exception.php b/libs/Zend/Db/Table/Row/Exception.php new file mode 100644 index 0000000..1dd2198 --- /dev/null +++ b/libs/Zend/Db/Table/Row/Exception.php @@ -0,0 +1,37 @@ +_table = $config['table']; + $this->_tableClass = get_class($this->_table); + } + if (isset($config['rowClass'])) { + $this->_rowClass = $config['rowClass']; + } + @Zend_Loader::loadClass($this->_rowClass); + if (isset($config['data'])) { + $this->_data = $config['data']; + } + if (isset($config['readOnly'])) { + $this->_readOnly = $config['readOnly']; + } + if (isset($config['stored'])) { + $this->_stored = $config['stored']; + } + + // set the count of rows + $this->_count = count($this->_data); + + $this->init(); + } + + /** + * Store data, class names, and state in serialized object + * + * @return array + */ + public function __sleep() + { + return array('_data', '_tableClass', '_rowClass', '_pointer', '_count', '_rows', '_stored', + '_readOnly'); + } + + /** + * Setup to do on wakeup. + * A de-serialized Rowset should not be assumed to have access to a live + * database connection, so set _connected = false. + * + * @return void + */ + public function __wakeup() + { + $this->_connected = false; + } + + /** + * Initialize object + * + * Called from {@link __construct()} as final step of object instantiation. + * + * @return void + */ + public function init() + { + } + + /** + * Return the connected state of the rowset. + * + * @return boolean + */ + public function isConnected() + { + return $this->_connected; + } + + /** + * Returns the table object, or null if this is disconnected rowset + * + * @return Zend_Db_Table_Abstract + */ + public function getTable() + { + return $this->_table; + } + + /** + * Set the table object, to re-establish a live connection + * to the database for a Rowset that has been de-serialized. + * + * @param Zend_Db_Table_Abstract $table + * @return boolean + * @throws Zend_Db_Table_Row_Exception + */ + public function setTable(Zend_Db_Table_Abstract $table) + { + $this->_table = $table; + $this->_connected = false; + // @todo This works only if we have iterated through + // the result set once to instantiate the rows. + foreach ($this as $row) { + $connected = $row->setTable($table); + if ($connected == true) { + $this->_connected = true; + } + } + return $this->_connected; + } + + /** + * Query the class name of the Table object for which this + * Rowset was created. + * + * @return string + */ + public function getTableClass() + { + return $this->_tableClass; + } + + /** + * Rewind the Iterator to the first element. + * Similar to the reset() function for arrays in PHP. + * Required by interface Iterator. + * + * @return Zend_Db_Table_Rowset_Abstract Fluent interface. + */ + public function rewind() + { + $this->_pointer = 0; + return $this; + } + + /** + * Return the current element. + * Similar to the current() function for arrays in PHP + * Required by interface Iterator. + * + * @return Zend_Db_Table_Row_Abstract current element from the collection + */ + public function current() + { + if ($this->valid() === false) { + return null; + } + + // do we already have a row object for this position? + if (empty($this->_rows[$this->_pointer])) { + $this->_rows[$this->_pointer] = new $this->_rowClass( + array( + 'table' => $this->_table, + 'data' => $this->_data[$this->_pointer], + 'stored' => $this->_stored, + 'readOnly' => $this->_readOnly + ) + ); + } + + // return the row object + return $this->_rows[$this->_pointer]; + } + + /** + * Return the identifying key of the current element. + * Similar to the key() function for arrays in PHP. + * Required by interface Iterator. + * + * @return int + */ + public function key() + { + return $this->_pointer; + } + + /** + * Move forward to next element. + * Similar to the next() function for arrays in PHP. + * Required by interface Iterator. + * + * @return void + */ + public function next() + { + ++$this->_pointer; + } + + /** + * Check if there is a current element after calls to rewind() or next(). + * Used to check if we've iterated to the end of the collection. + * Required by interface Iterator. + * + * @return bool False if there's nothing more to iterate over + */ + public function valid() + { + return $this->_pointer < $this->_count; + } + + /** + * Returns the number of elements in the collection. + * + * Implements Countable::count() + * + * @return int + */ + public function count() + { + return $this->_count; + } + + /** + * Take the Iterator to position $position + * Required by interface SeekableIterator. + * + * @param int $position the position to seek to + * @return Zend_Db_Table_Rowset_Abstract + * @throws Zend_Db_Table_Rowset_Exception + */ + public function seek($position) + { + $position = (int) $position; + if ($position < 0 || $position > $this->_count) { + require_once 'Zend/Db/Table/Rowset/Exception.php'; + throw new Zend_Db_Table_Rowset_Exception("Illegal index $position"); + } + $this->_pointer = $position; + return $this; + } + + /** + * Check if an offset exists + * Required by the ArrayAccess implementation + * + * @param string $offset + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->_data[(int) $offset]); + } + + /** + * Get the row for the given offset + * Required by the ArrayAccess implementation + * + * @param string $offset + * @return Zend_Db_Table_Row_Abstract + */ + public function offsetGet($offset) + { + $this->_pointer = (int) $offset; + + return $this->current(); + } + + /** + * Does nothing + * Required by the ArrayAccess implementation + * + * @param string $offset + * @param mixed $value + */ + public function offsetSet($offset, $value) + { + } + + /** + * Does nothing + * Required by the ArrayAccess implementation + * + * @param string $offset + */ + public function offsetUnset($offset) + { + } + + /** + * Returns a Zend_Db_Table_Row from a known position into the Iterator + * + * @param int $position the position of the row expected + * @param bool $seek wether or not seek the iterator to that position after + * @return Zend_Db_Table_Row + * @throws Zend_Db_Table_Rowset_Exception + */ + public function getRow($position, $seek = false) + { + $key = $this->key(); + try { + $this->seek($position); + $row = $this->current(); + } catch (Zend_Db_Table_Rowset_Exception $e) { + require_once 'Zend/Db/Table/Rowset/Exception.php'; + throw new Zend_Db_Table_Rowset_Exception('No row could be found at position ' . (int) $position); + } + if ($seek == false) { + $this->seek($key); + } + return $row; + } + + /** + * Returns all data as an array. + * + * Updates the $_data property with current row object values. + * + * @return array + */ + public function toArray() + { + // @todo This works only if we have iterated through + // the result set once to instantiate the rows. + foreach ($this->_rows as $i => $row) { + $this->_data[$i] = $row->toArray(); + } + return $this->_data; + } + +} diff --git a/libs/Zend/Db/Table/Rowset/Exception.php b/libs/Zend/Db/Table/Rowset/Exception.php new file mode 100644 index 0000000..23a1407 --- /dev/null +++ b/libs/Zend/Db/Table/Rowset/Exception.php @@ -0,0 +1,36 @@ +getAdapter()); + $this->setTable($table); + } + + /** + * Return the table that created this select object + * + * @return Zend_Db_Table_Abstract + */ + public function getTable() + { + return $this->_table; + } + + /** + * Sets the primary table name and retrieves the table schema. + * + * @param Zend_Db_Table_Abstract $adapter + * @return Zend_Db_Select This Zend_Db_Select object. + */ + public function setTable(Zend_Db_Table_Abstract $table) + { + $this->_adapter = $table->getAdapter(); + $this->_info = $table->info(); + $this->_table = $table; + + return $this; + } + + /** + * Sets the integrity check flag. + * + * Setting this flag to false skips the checks for table joins, allowing + * 'hybrid' table rows to be created. + * + * @param Zend_Db_Table_Abstract $adapter + * @return Zend_Db_Select This Zend_Db_Select object. + */ + public function setIntegrityCheck($flag = true) + { + $this->_integrityCheck = $flag; + return $this; + } + + /** + * Tests query to determine if expressions or aliases columns exist. + * + * @return boolean + */ + public function isReadOnly() + { + $readOnly = false; + $fields = $this->getPart(Zend_Db_Table_Select::COLUMNS); + $cols = $this->_info[Zend_Db_Table_Abstract::COLS]; + + if (!count($fields)) { + return $readOnly; + } + + foreach ($fields as $columnEntry) { + $column = $columnEntry[1]; + $alias = $columnEntry[2]; + + if ($alias !== null) { + $column = $alias; + } + + switch (true) { + case ($column == self::SQL_WILDCARD): + break; + + case ($column instanceof Zend_Db_Expr): + case (!in_array($column, $cols)): + $readOnly = true; + break 2; + } + } + + return $readOnly; + } + + /** + * Adds a FROM table and optional columns to the query. + * + * The table name can be expressed + * + * @param array|string|Zend_Db_Expr|Zend_Db_Table_Abstract $name The table name or an + associative array relating + table name to correlation + name. + * @param array|string|Zend_Db_Expr $cols The columns to select from this table. + * @param string $schema The schema name to specify, if any. + * @return Zend_Db_Table_Select This Zend_Db_Table_Select object. + */ + public function from($name, $cols = self::SQL_WILDCARD, $schema = null) + { + if ($name instanceof Zend_Db_Table_Abstract) { + $info = $name->info(); + $name = $info[Zend_Db_Table_Abstract::NAME]; + if (isset($info[Zend_Db_Table_Abstract::SCHEMA])) { + $schema = $info[Zend_Db_Table_Abstract::SCHEMA]; + } + } + + return $this->joinInner($name, null, $cols, $schema); + } + + /** + * Performs a validation on the select query before passing back to the parent class. + * Ensures that only columns from the primary Zend_Db_Table are returned in the result. + * + * @return string This object as a SELECT string. + */ + public function assemble() + { + $fields = $this->getPart(Zend_Db_Table_Select::COLUMNS); + $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 ($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'); + } + } + } + } + + return parent::assemble(); + } +} diff --git a/libs/Zend/Db/Table/Select/Exception.php b/libs/Zend/Db/Table/Select/Exception.php new file mode 100644 index 0000000..f93f4df --- /dev/null +++ b/libs/Zend/Db/Table/Select/Exception.php @@ -0,0 +1,38 @@ + tags, cleans up newlines and indents, and runs + * htmlentities() before output. + * + * @param mixed $var The variable to dump. + * @param string $label OPTIONAL Label to prepend to output. + * @param bool $echo OPTIONAL Echo output if true. + * @return string + */ + public static function dump($var, $label=null, $echo=true) + { + // format the label + $label = ($label===null) ? '' : rtrim($label) . ' '; + + // var_dump the variable into a buffer and keep the output + ob_start(); + var_dump($var); + $output = ob_get_clean(); + + // neaten the newlines and indents + $output = preg_replace("/\]\=\>\n(\s+)/m", "] => ", $output); + if (self::getSapi() == 'cli') { + $output = PHP_EOL . $label + . PHP_EOL . $output + . PHP_EOL; + } else { + if(!extension_loaded('xdebug')) { + $output = htmlspecialchars($output, ENT_QUOTES); + } + + $output = '
'
+                    . $label
+                    . $output
+                    . '
'; + } + + if ($echo) { + echo($output); + } + return $output; + } + +} diff --git a/libs/Zend/Dojo.php b/libs/Zend/Dojo.php new file mode 100644 index 0000000..cbb3bda --- /dev/null +++ b/libs/Zend/Dojo.php @@ -0,0 +1,87 @@ +addPrefixPath('Zend_Dojo_Form_Decorator', 'Zend/Dojo/Form/Decorator', 'decorator') + ->addPrefixPath('Zend_Dojo_Form_Element', 'Zend/Dojo/Form/Element', 'element') + ->addElementPrefixPath('Zend_Dojo_Form_Decorator', 'Zend/Dojo/Form/Decorator', 'decorator') + ->addDisplayGroupPrefixPath('Zend_Dojo_Form_Decorator', 'Zend/Dojo/Form/Decorator') + ->setDefaultDisplayGroupClass('Zend_Dojo_Form_DisplayGroup'); + + foreach ($form->getSubForms() as $subForm) { + self::enableForm($subForm); + } + + if (null !== ($view = $form->getView())) { + self::enableView($view); + } + } + + /** + * Dojo-enable a view instance + * + * @param Zend_View_Interface $view + * @return void + */ + public static function enableView(Zend_View_Interface $view) + { + if (false === $view->getPluginLoader('helper')->getPaths('Zend_Dojo_View_Helper')) { + $view->addHelperPath('Zend/Dojo/View/Helper', 'Zend_Dojo_View_Helper'); + } + } +} + diff --git a/libs/Zend/Dojo/Data.php b/libs/Zend/Dojo/Data.php new file mode 100644 index 0000000..48885e8 --- /dev/null +++ b/libs/Zend/Dojo/Data.php @@ -0,0 +1,563 @@ +setIdentifier($identifier); + } + if (null !== $items) { + $this->setItems($items); + } + if (null !== $label) { + $this->setLabel($label); + } + } + + /** + * Set the items to collect + * + * @param array|Traversable $items + * @return Zend_Dojo_Data + */ + public function setItems($items) + { + $this->clearItems(); + return $this->addItems($items); + } + + /** + * Set an individual item, optionally by identifier (overwrites) + * + * @param array|object $item + * @param string|null $identifier + * @return Zend_Dojo_Data + */ + public function setItem($item, $id = null) + { + $item = $this->_normalizeItem($item, $id); + $this->_items[$item['id']] = $item['data']; + return $this; + } + + /** + * Add an individual item, optionally by identifier + * + * @param array|object $item + * @param string|null $id + * @return Zend_Dojo_Data + */ + public function addItem($item, $id = null) + { + $item = $this->_normalizeItem($item, $id); + + if ($this->hasItem($item['id'])) { + require_once 'Zend/Dojo/Exception.php'; + throw new Zend_Dojo_Exception('Overwriting items using addItem() is not allowed'); + } + + $this->_items[$item['id']] = $item['data']; + + return $this; + } + + /** + * Add multiple items at once + * + * @param array|Traversable $items + * @return Zend_Dojo_Data + */ + public function addItems($items) + { + if (!is_array($items) && (!is_object($items) || !($items instanceof Traversable))) { + require_once 'Zend/Dojo/Exception.php'; + throw new Zend_Dojo_Exception('Only arrays and Traversable objects may be added to ' . __CLASS__); + } + + foreach ($items as $item) { + $this->addItem($item); + } + + return $this; + } + + /** + * Get all items as an array + * + * Serializes items to arrays. + * + * @return array + */ + public function getItems() + { + return $this->_items; + } + + /** + * Does an item with the given identifier exist? + * + * @param string|int $id + * @return bool + */ + public function hasItem($id) + { + return array_key_exists($id, $this->_items); + } + + /** + * Retrieve an item by identifier + * + * Item retrieved will be flattened to an array. + * + * @param string $id + * @return array + */ + public function getItem($id) + { + if (!$this->hasItem($id)) { + return null; + } + + return $this->_items[$id]; + } + + /** + * Remove item by identifier + * + * @param string $id + * @return Zend_Dojo_Data + */ + public function removeItem($id) + { + if ($this->hasItem($id)) { + unset($this->_items[$id]); + } + + return $this; + } + + /** + * Remove all items at once + * + * @return Zend_Dojo_Data + */ + public function clearItems() + { + $this->_items = array(); + return $this; + } + + + /** + * Set identifier for item lookups + * + * @param string|int|null $identifier + * @return Zend_Dojo_Data + */ + public function setIdentifier($identifier) + { + if (null === $identifier) { + $this->_identifier = null; + } elseif (is_string($identifier)) { + $this->_identifier = $identifier; + } elseif (is_numeric($identifier)) { + $this->_identifier = (int) $identifier; + } else { + require_once 'Zend/Dojo/Exception.php'; + throw new Zend_Dojo_Exception('Invalid identifier; please use a string or integer'); + } + + return $this; + } + + /** + * Retrieve current item identifier + * + * @return string|int|null + */ + public function getIdentifier() + { + return $this->_identifier; + } + + + /** + * Set label to use for displaying item associations + * + * @param string|null $label + * @return Zend_Dojo_Data + */ + public function setLabel($label) + { + if (null === $label) { + $this->_label = null; + } else { + $this->_label = (string) $label; + } + return $this; + } + + /** + * Retrieve item association label + * + * @return string|null + */ + public function getLabel() + { + return $this->_label; + } + + /** + * Set metadata by key or en masse + * + * @param string|array $spec + * @param mixed $value + * @return Zend_Dojo_Data + */ + public function setMetadata($spec, $value = null) + { + if (is_string($spec) && (null !== $value)) { + $this->_metadata[$spec] = $value; + } elseif (is_array($spec)) { + foreach ($spec as $key => $value) { + $this->setMetadata($key, $value); + } + } + return $this; + } + + /** + * Get metadata item or all metadata + * + * @param null|string $key Metadata key when pulling single metadata item + * @return mixed + */ + public function getMetadata($key = null) + { + if (null === $key) { + return $this->_metadata; + } + + if (array_key_exists($key, $this->_metadata)) { + return $this->_metadata[$key]; + } + + return null; + } + + /** + * Clear individual or all metadata item(s) + * + * @param null|string $key + * @return Zend_Dojo_Data + */ + public function clearMetadata($key = null) + { + if (null === $key) { + $this->_metadata = array(); + } elseif (array_key_exists($key, $this->_metadata)) { + unset($this->_metadata[$key]); + } + return $this; + } + + /** + * Load object from array + * + * @param array $data + * @return Zend_Dojo_Data + */ + public function fromArray(array $data) + { + if (array_key_exists('identifier', $data)) { + $this->setIdentifier($data['identifier']); + } + if (array_key_exists('label', $data)) { + $this->setLabel($data['label']); + } + if (array_key_exists('items', $data) && is_array($data['items'])) { + $this->setItems($data['items']); + } else { + $this->clearItems(); + } + return $this; + } + + /** + * Load object from JSON + * + * @param string $json + * @return Zend_Dojo_Data + */ + public function fromJson($json) + { + if (!is_string($json)) { + require_once 'Zend/Dojo/Exception.php'; + throw new Zend_Dojo_Exception('fromJson() expects JSON input'); + } + require_once 'Zend/Json.php'; + $data = Zend_Json::decode($json); + return $this->fromArray($data); + } + + /** + * Seralize entire data structure, including identifier and label, to array + * + * @return array + */ + public function toArray() + { + if (null === ($identifier = $this->getIdentifier())) { + require_once 'Zend/Dojo/Exception.php'; + throw new Zend_Dojo_Exception('Serialization requires that an identifier be present in the object; first call setIdentifier()'); + } + + $array = array( + 'identifier' => $identifier, + 'items' => array_values($this->getItems()), + ); + + $metadata = $this->getMetadata(); + if (!empty($metadata)) { + foreach ($metadata as $key => $value) { + $array[$key] = $value; + } + } + + if (null !== ($label = $this->getLabel())) { + $array['label'] = $label; + } + + return $array; + } + + /** + * Serialize to JSON (dojo.data format) + * + * @return string + */ + public function toJson() + { + require_once 'Zend/Json.php'; + return Zend_Json::encode($this->toArray()); + } + + /** + * Serialize to string (proxy to {@link toJson()}) + * + * @return string + */ + public function __toString() + { + return $this->toJson(); + } + + /** + * ArrayAccess: does offset exist? + * + * @param string|int $offset + * @return bool + */ + public function offsetExists($offset) + { + return (null !== $this->getItem($offset)); + } + + /** + * ArrayAccess: retrieve by offset + * + * @param string|int $offset + * @return array + */ + public function offsetGet($offset) + { + return $this->getItem($offset); + } + + /** + * ArrayAccess: set value by offset + * + * @param string $offset + * @param array|object|null $value + * @return void + */ + public function offsetSet($offset, $value) + { + $this->setItem($value, $offset); + } + + /** + * ArrayAccess: unset value by offset + * + * @param string $offset + * @return void + */ + public function offsetUnset($offset) + { + $this->removeItem($offset); + } + + /** + * Iterator: get current value + * + * @return array + */ + public function current() + { + return current($this->_items); + } + + /** + * Iterator: get current key + * + * @return string|int + */ + public function key() + { + return key($this->_items); + } + + /** + * Iterator: get next item + * + * @return void + */ + public function next() + { + return next($this->_items); + } + + /** + * Iterator: rewind to first value in collection + * + * @return void + */ + public function rewind() + { + return reset($this->_items); + } + + /** + * Iterator: is item valid? + * + * @return bool + */ + public function valid() + { + return (bool) $this->current(); + } + + /** + * Countable: how many items are present + * + * @return int + */ + public function count() + { + return count($this->_items); + } + + /** + * Normalize an item to attach to the collection + * + * @param array|object $item + * @param string|int|null $id + * @return array + */ + protected function _normalizeItem($item, $id) + { + if (null === ($identifier = $this->getIdentifier())) { + require_once 'Zend/Dojo/Exception.php'; + throw new Zend_Dojo_Exception('You must set an identifier prior to adding items'); + } + + if (!is_object($item) && !is_array($item)) { + require_once 'Zend/Dojo/Exception.php'; + throw new Zend_Dojo_Exception('Only arrays and objects may be attached'); + } + + if (is_object($item)) { + if (method_exists($item, 'toArray')) { + $item = $item->toArray(); + } else { + $item = get_object_vars($item); + } + } + + if ((null === $id) && !array_key_exists($identifier, $item)) { + require_once 'Zend/Dojo/Exception.php'; + throw new Zend_Dojo_Exception('Item must contain a column matching the currently set identifier'); + } elseif (null === $id) { + $id = $item[$identifier]; + } else { + $item[$identifier] = $id; + } + + return array( + 'id' => $id, + 'data' => $item, + ); + } +} diff --git a/libs/Zend/Dojo/Exception.php b/libs/Zend/Dojo/Exception.php new file mode 100644 index 0000000..e4d3d1e --- /dev/null +++ b/libs/Zend/Dojo/Exception.php @@ -0,0 +1,35 @@ +addPrefixPath('Zend_Dojo_Form_Decorator', 'Zend/Dojo/Form/Decorator', 'decorator') + ->addPrefixPath('Zend_Dojo_Form_Element', 'Zend/Dojo/Form/Element', 'element') + ->addElementPrefixPath('Zend_Dojo_Form_Decorator', 'Zend/Dojo/Form/Decorator', 'decorator') + ->addDisplayGroupPrefixPath('Zend_Dojo_Form_Decorator', 'Zend/Dojo/Form/Decorator') + ->setDefaultDisplayGroupClass('Zend_Dojo_Form_DisplayGroup'); + parent::__construct($options); + } + + /** + * Load the default decorators + * + * @return void + */ + public function loadDefaultDecorators() + { + if ($this->loadDefaultDecoratorsIsDisabled()) { + return; + } + + $decorators = $this->getDecorators(); + if (empty($decorators)) { + $this->addDecorator('FormElements') + ->addDecorator('HtmlTag', array('tag' => 'dl', 'class' => 'zend_form_dojo')) + ->addDecorator('DijitForm'); + } + } + + /** + * Set the view object + * + * Ensures that the view object has the dojo view helper path set. + * + * @param Zend_View_Interface $view + * @return Zend_Dojo_Form_Element_Dijit + */ + public function setView(Zend_View_Interface $view = null) + { + if (null !== $view) { + if (false === $view->getPluginLoader('helper')->getPaths('Zend_Dojo_View_Helper')) { + $view->addHelperPath('Zend/Dojo/View/Helper', 'Zend_Dojo_View_Helper'); + } + } + return parent::setView($view); + } +} diff --git a/libs/Zend/Dojo/Form/Decorator/AccordionContainer.php b/libs/Zend/Dojo/Form/Decorator/AccordionContainer.php new file mode 100644 index 0000000..cd8e02d --- /dev/null +++ b/libs/Zend/Dojo/Form/Decorator/AccordionContainer.php @@ -0,0 +1,43 @@ +_helper) { + require_once 'Zend/Form/Decorator/Exception.php'; + throw new Zend_Form_Decorator_Exception('No view helper specified fo DijitContainer decorator'); + } + return $this->_helper; + } + + /** + * Get element attributes + * + * @return array + */ + public function getAttribs() + { + if (null === $this->_attribs) { + $attribs = $this->getElement()->getAttribs(); + if (array_key_exists('dijitParams', $attribs)) { + unset($attribs['dijitParams']); + } + $this->_attribs = $attribs; + } + return $this->_attribs; + } + + /** + * Get dijit option parameters + * + * @return array + */ + public function getDijitParams() + { + if (null === $this->_dijitParams) { + $attribs = $this->getElement()->getAttribs(); + if (array_key_exists('dijitParams', $attribs)) { + $this->_dijitParams = $attribs['dijitParams']; + } else { + $this->_dijitParams = array(); + } + + $options = $this->getOptions(); + if (array_key_exists('dijitParams', $options)) { + $this->_dijitParams = array_merge($this->_dijitParams, $options['dijitParams']); + $this->removeOption('dijitParams'); + } + } + + // Ensure we have a title param + if (!array_key_exists('title', $this->_dijitParams)) { + $this->_dijitParams['title'] = $this->getTitle(); + } + + return $this->_dijitParams; + } + + /** + * Get title + * + * @return string + */ + public function getTitle() + { + if (null === $this->_title) { + $title = null; + if (null !== ($element = $this->getElement())) { + if (method_exists($element, 'getLegend')) { + $title = $element->getLegend(); + } + } + if (empty($title) && (null !== ($title = $this->getOption('legend')))) { + $this->removeOption('legend'); + } + if (empty($title) && (null !== ($title = $this->getOption('title')))) { + $this->removeOption('title'); + } + + if (!empty($title)) { + if (null !== ($translator = $element->getTranslator())) { + $title = $translator->translate($title); + } + $this->_title = $title; + } + } + + return (empty($this->_title) ? '' : $this->_title); + } + + /** + * Render a dijit layout container + * + * Replaces $content entirely from currently set element. + * + * @param string $content + * @return string + */ + public function render($content) + { + $element = $this->getElement(); + $view = $element->getView(); + if (null === $view) { + return $content; + } + + $dijitParams = $this->getDijitParams(); + $attribs = array_merge($this->getAttribs(), $this->getOptions()); + + if (array_key_exists('legend', $attribs)) { + if (!array_key_exists('title', $dijitParams) || empty($dijitParams['title'])) { + $dijitParams['title'] = $attribs['legend']; + } + unset($attribs['legend']); + } + + $helper = $this->getHelper(); + $id = $element->getId() . '-' . $helper; + + if ($view->dojo()->hasDijit($id)) { + trigger_error(sprintf('Duplicate dijit ID detected for id "%s; temporarily generating uniqid"', $id), E_USER_WARNING); + $base = $id; + do { + $id = $base . '-' . uniqid(); + } while ($view->dojo()->hasDijit($id)); + } + + 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 new file mode 100644 index 0000000..42de172 --- /dev/null +++ b/libs/Zend/Dojo/Form/Decorator/DijitElement.php @@ -0,0 +1,195 @@ +_attribs) { + $this->_attribs = parent::getElementAttribs(); + if (array_key_exists('dijitParams', $this->_attribs)) { + $this->setDijitParams($this->_attribs['dijitParams']); + unset($this->_attribs['dijitParams']); + } + } + + return $this->_attribs; + } + + /** + * Set a single dijit option parameter + * + * @param string $key + * @param mixed $value + * @return Zend_Dojo_Form_Decorator_DijitContainer + */ + public function setDijitParam($key, $value) + { + $this->_dijitParams[(string) $key] = $value; + return $this; + } + + /** + * Set dijit option parameters + * + * @param array $params + * @return Zend_Dojo_Form_Decorator_DijitContainer + */ + public function setDijitParams(array $params) + { + $this->_dijitParams = array_merge($this->_dijitParams, $params); + return $this; + } + + /** + * Retrieve a single dijit option parameter + * + * @param string $key + * @return mixed|null + */ + public function getDijitParam($key) + { + $this->getElementAttribs(); + $key = (string) $key; + if (array_key_exists($key, $this->_dijitParams)) { + return $this->_dijitParams[$key]; + } + + return null; + } + + /** + * Get dijit option parameters + * + * @return array + */ + public function getDijitParams() + { + $this->getElementAttribs(); + return $this->_dijitParams; + } + + /** + * Render an element using a view helper + * + * 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 + */ + public function render($content) + { + $element = $this->getElement(); + $view = $element->getView(); + if (null === $view) { + require_once 'Zend/Form/Decorator/Exception.php'; + throw new Zend_Form_Decorator_Exception('DijitElement decorator cannot render without a registered view object'); + } + + $options = null; + if (method_exists($element, 'getMultiOptions')) { + $options = $element->getMultiOptions(); + } + + $helper = $this->getHelper(); + $separator = $this->getSeparator(); + $value = $this->getValue($element); + $attribs = $this->getElementAttribs(); + $name = $element->getFullyQualifiedName(); + + $dijitParams = $this->getDijitParams(); + if ($element->isRequired()) { + $dijitParams['required'] = true; + } + + $id = $element->getId(); + if ($view->dojo()->hasDijit($id)) { + trigger_error(sprintf('Duplicate dijit ID detected for id "%s; temporarily generating uniqid"', $id), E_USER_NOTICE); + $base = $id; + do { + $id = $base . '-' . uniqid(); + } while ($view->dojo()->hasDijit($id)); + } + $attribs['id'] = $id; + + $elementContent = $view->$helper($name, $value, $dijitParams, $attribs, $options); + switch ($this->getPlacement()) { + case self::APPEND: + return $content . $separator . $elementContent; + case self::PREPEND: + return $elementContent . $separator . $content; + default: + return $elementContent; + } + } +} diff --git a/libs/Zend/Dojo/Form/Decorator/DijitForm.php b/libs/Zend/Dojo/Form/Decorator/DijitForm.php new file mode 100644 index 0000000..5cc7323 --- /dev/null +++ b/libs/Zend/Dojo/Form/Decorator/DijitForm.php @@ -0,0 +1,61 @@ +getElement(); + $view = $element->getView(); + if (null === $view) { + return $content; + } + + $dijitParams = $this->getDijitParams(); + $attribs = array_merge($this->getAttribs(), $this->getOptions()); + + return $view->form($element->getName(), $attribs, $content); + } +} diff --git a/libs/Zend/Dojo/Form/Decorator/SplitContainer.php b/libs/Zend/Dojo/Form/Decorator/SplitContainer.php new file mode 100644 index 0000000..5d5365f --- /dev/null +++ b/libs/Zend/Dojo/Form/Decorator/SplitContainer.php @@ -0,0 +1,43 @@ +addPrefixPath('Zend_Dojo_Form_Decorator', 'Zend/Dojo/Form/Decorator'); + } + + /** + * Set the view object + * + * Ensures that the view object has the dojo view helper path set. + * + * @param Zend_View_Interface $view + * @return Zend_Dojo_Form_Element_Dijit + */ + public function setView(Zend_View_Interface $view = null) + { + if (null !== $view) { + if (false === $view->getPluginLoader('helper')->getPaths('Zend_Dojo_View_Helper')) { + $view->addHelperPath('Zend/Dojo/View/Helper', 'Zend_Dojo_View_Helper'); + } + } + return parent::setView($view); + } +} diff --git a/libs/Zend/Dojo/Form/Element/Button.php b/libs/Zend/Dojo/Form/Element/Button.php new file mode 100644 index 0000000..4b697f3 --- /dev/null +++ b/libs/Zend/Dojo/Form/Element/Button.php @@ -0,0 +1,121 @@ + $options); + } + + parent::__construct($spec, $options); + } + + /** + * Return label + * + * If no label is present, returns the currently set name. + * + * If a translator is present, returns the translated label. + * + * @return string + */ + public function getLabel() + { + $value = parent::getLabel(); + + if (null === $value) { + $value = $this->getName(); + } + + if (null !== ($translator = $this->getTranslator())) { + return $translator->translate($value); + } + + return $value; + } + + /** + * Has this submit button been selected? + * + * @return bool + */ + public function isChecked() + { + $value = $this->getValue(); + + if (empty($value)) { + return false; + } + if ($value != $this->getLabel()) { + return false; + } + + return true; + } + + /** + * Default decorators + * + * Uses only 'DijitElement' and 'DtDdWrapper' decorators by default. + * + * @return void + */ + public function loadDefaultDecorators() + { + if ($this->loadDefaultDecoratorsIsDisabled()) { + return; + } + + $decorators = $this->getDecorators(); + if (empty($decorators)) { + $this->addDecorator('DijitElement') + ->addDecorator('DtDdWrapper'); + } + } +} diff --git a/libs/Zend/Dojo/Form/Element/CheckBox.php b/libs/Zend/Dojo/Form/Element/CheckBox.php new file mode 100644 index 0000000..35b8c31 --- /dev/null +++ b/libs/Zend/Dojo/Form/Element/CheckBox.php @@ -0,0 +1,212 @@ +setCheckedValue($options['checkedValue']); + unset($options['checkedValue']); + } + if (array_key_exists('uncheckedValue', $options)) { + $this->setUncheckedValue($options['uncheckedValue']); + unset($options['uncheckedValue']); + } + parent::setOptions($options); + + $curValue = $this->getValue(); + $test = array($this->getCheckedValue(), $this->getUncheckedValue()); + if (!in_array($curValue, $test)) { + $this->setValue($curValue); + } + + return $this; + } + + /** + * Set value + * + * 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 + * value, and the checked flag to be set as false. + * + * + * @param mixed $value + * @return Zend_Form_Element_Checkbox + */ + public function setValue($value) + { + if ($value == $this->getCheckedValue()) { + parent::setValue($value); + $this->checked = true; + } else { + parent::setValue($this->getUncheckedValue()); + $this->checked = false; + } + return $this; + } + + /** + * Set checked value + * + * @param string $value + * @return Zend_Form_Element_Checkbox + */ + public function setCheckedValue($value) + { + $this->_checkedValue = (string) $value; + return $this; + } + + /** + * Get value when checked + * + * @return string + */ + public function getCheckedValue() + { + return $this->_checkedValue; + } + + /** + * Set unchecked value + * + * @param string $value + * @return Zend_Form_Element_Checkbox + */ + public function setUncheckedValue($value) + { + $this->_uncheckedValue = (string) $value; + return $this; + } + + /** + * Get value when not checked + * + * @return string + */ + public function getUncheckedValue() + { + return $this->_uncheckedValue; + } + + /** + * Set checked flag + * + * @param bool $flag + * @return Zend_Form_Element_Checkbox + */ + public function setChecked($flag) + { + $this->checked = (bool) $flag; + if ($this->checked) { + $this->setValue($this->getCheckedValue()); + } else { + $this->setValue($this->getUncheckedValue()); + } + return $this; + } + + /** + * Get checked flag + * + * @return bool + */ + public function isChecked() + { + return $this->checked; + } + + /** + * Render + * + * Ensure that options property is set when rendering. + * + * @param Zend_View_Interface $view + * @return string + */ + public function render(Zend_View_Interface $view = null) + { + $this->options = array( + 'checked' => $this->getCheckedValue(), + 'unChecked' => $this->getUncheckedValue(), + ); + return parent::render($view); + } +} + diff --git a/libs/Zend/Dojo/Form/Element/ComboBox.php b/libs/Zend/Dojo/Form/Element/ComboBox.php new file mode 100644 index 0000000..4be378d --- /dev/null +++ b/libs/Zend/Dojo/Form/Element/ComboBox.php @@ -0,0 +1,186 @@ +hasDijitParam('store')) { + $this->dijitParams['store'] = array(); + } + return $this->dijitParams['store']; + } + + /** + * Set datastore identifier + * + * @param string $identifier + * @return Zend_Dojo_Form_Element_ComboBox + */ + public function setStoreId($identifier) + { + $store = $this->getStoreInfo(); + $store['store'] = (string) $identifier; + $this->setDijitParam('store', $store); + return $this; + } + + /** + * Get datastore identifier + * + * @return string|null + */ + public function getStoreId() + { + $store = $this->getStoreInfo(); + if (array_key_exists('store', $store)) { + return $store['store']; + } + return null; + } + + /** + * Set datastore dijit type + * + * @param string $dojoType + * @return Zend_Dojo_Form_Element_ComboBox + */ + public function setStoreType($dojoType) + { + $store = $this->getStoreInfo(); + $store['type'] = (string) $dojoType; + $this->setDijitParam('store', $store); + return $this; + } + + /** + * Get datastore dijit type + * + * @return string|null + */ + public function getStoreType() + { + $store = $this->getStoreInfo(); + if (array_key_exists('type', $store)) { + return $store['type']; + } + return null; + } + + /** + * Set datastore parameters + * + * @param array $params + * @return Zend_Dojo_Form_Element_ComboBox + */ + public function setStoreParams(array $params) + { + $store = $this->getStoreInfo(); + $store['params'] = $params; + $this->setDijitParam('store', $store); + return $this; + } + + /** + * Get datastore params + * + * @return array + */ + public function getStoreParams() + { + $store = $this->getStoreInfo(); + if (array_key_exists('params', $store)) { + return $store['params']; + } + return array(); + } + + /** + * Set autocomplete flag + * + * @param bool $flag + * @return Zend_Dojo_Form_Element_ComboBox + */ + public function setAutocomplete($flag) + { + $this->setDijitParam('autocomplete', (bool) $flag); + return $this; + } + + /** + * Get autocomplete flag + * + * @return bool + */ + public function getAutocomplete() + { + if (!$this->hasDijitParam('autocomplete')) { + return false; + } + return $this->getDijitParam('autocomplete'); + } + + /** + * Is the value valid? + * + * @param string $value + * @param mixed $context + * @return bool + */ + public function isValid($value, $context = null) + { + $storeInfo = $this->getStoreInfo(); + if (!empty($storeInfo)) { + $this->setRegisterInArrayValidator(false); + } + return parent::isValid($value, $context); + } +} diff --git a/libs/Zend/Dojo/Form/Element/CurrencyTextBox.php b/libs/Zend/Dojo/Form/Element/CurrencyTextBox.php new file mode 100644 index 0000000..6a6c1d2 --- /dev/null +++ b/libs/Zend/Dojo/Form/Element/CurrencyTextBox.php @@ -0,0 +1,120 @@ +setDijitParam('currency', (string) $currency); + return $this; + } + + /** + * Retrieve currency + * + * @return string|null + */ + public function getCurrency() + { + return $this->getDijitParam('currency'); + } + + /** + * Set currency symbol + * + * Casts to string, uppercases, and trims to three characters. + * + * @param string $symbol + * @return Zend_Dojo_Form_Element_CurrencyTextBox + */ + public function setSymbol($symbol) + { + $symbol = strtoupper((string) $symbol); + $length = strlen($symbol); + if (3 > $length) { + require_once 'Zend/Form/Element/Exception.php'; + throw new Zend_Form_Element_Exception('Invalid symbol provided; please provide ISO 4217 alphabetic currency code'); + } + if (3 < $length) { + $symbol = substr($symbol, 0, 3); + } + + $this->setConstraint('symbol', $symbol); + return $this; + } + + /** + * Retrieve symbol + * + * @return string|null + */ + public function getSymbol() + { + return $this->getConstraint('symbol'); + } + + /** + * Set whether currency is fractional + * + * @param bool $flag + * @return Zend_Dojo_Form_Element_CurrencyTextBox + */ + public function setFractional($flag) + { + $this->setConstraint('fractional', (bool) $flag); + return $this; + } + + /** + * Get whether or not to present fractional values + * + * @return bool + */ + public function getFractional() + { + return ('true' == $this->getConstraint('fractional')); + } +} diff --git a/libs/Zend/Dojo/Form/Element/DateTextBox.php b/libs/Zend/Dojo/Form/Element/DateTextBox.php new file mode 100644 index 0000000..2a1af1f --- /dev/null +++ b/libs/Zend/Dojo/Form/Element/DateTextBox.php @@ -0,0 +1,214 @@ +setConstraint('am,pm', (bool) $flag); + return $this; + } + + /** + * Retrieve am,pm flag + * + * @return bool + */ + public function getAmPm() + { + if (!$this->hasConstraint('am,pm')) { + return false; + } + return ('true' ==$this->getConstraint('am,pm')); + } + + /** + * Set strict flag + * + * @param bool $strict + * @return Zend_Dojo_Form_Element_DateTextBox + */ + public function setStrict($flag) + { + $this->setConstraint('strict', (bool) $flag); + return $this; + } + + /** + * Retrieve strict flag + * + * @return bool + */ + public function getStrict() + { + if (!$this->hasConstraint('strict')) { + return false; + } + return ('true' == $this->getConstraint('strict')); + } + + /** + * Set locale + * + * @param string $locale + * @return Zend_Dojo_Form_Element_DateTextBox + */ + public function setLocale($locale) + { + $this->setConstraint('locale', (string) $locale); + return $this; + } + + /** + * Retrieve locale + * + * @return string|null + */ + public function getLocale() + { + return $this->getConstraint('locale'); + } + + /** + * Set date format pattern + * + * @param string $pattern + * @return Zend_Dojo_Form_Element_NumberTextBox + */ + public function setDatePattern($pattern) + { + $this->setConstraint('datePattern', (string) $pattern); + return $this; + } + + /** + * Retrieve date format pattern + * + * @return string|null + */ + public function getDatePattern() + { + return $this->getConstraint('datePattern'); + } + + /** + * Set numeric format formatLength + * + * @see $_allowedFormatTypes + * @param string $formatLength + * @return Zend_Dojo_Form_Element_NumberTextBox + */ + public function setFormatLength($formatLength) + { + $formatLength = strtolower($formatLength); + if (!in_array($formatLength, $this->_allowedFormatTypes)) { + require_once 'Zend/Form/Element/Exception.php'; + throw new Zend_Form_Element_Exception(sprintf('Invalid formatLength "%s" specified', $formatLength)); + } + + $this->setConstraint('formatLength', $formatLength); + return $this; + } + + /** + * Retrieve formatLength + * + * @return string|null + */ + public function getFormatLength() + { + return $this->getConstraint('formatLength'); + } + + /** + * Set numeric format Selector + * + * @see $_allowedSelectorTypes + * @param string $selector + * @return Zend_Dojo_Form_Element_NumberTextBox + */ + public function setSelector($selector) + { + $selector = strtolower($selector); + if (!in_array($selector, $this->_allowedSelectorTypes)) { + require_once 'Zend/Form/Element/Exception.php'; + throw new Zend_Form_Element_Exception(sprintf('Invalid Selector "%s" specified', $selector)); + } + + $this->setConstraint('selector', $selector); + return $this; + } + + /** + * Retrieve selector + * + * @return string|null + */ + public function getSelector() + { + return $this->getConstraint('selector'); + } +} diff --git a/libs/Zend/Dojo/Form/Element/Dijit.php b/libs/Zend/Dojo/Form/Element/Dijit.php new file mode 100644 index 0000000..013b851 --- /dev/null +++ b/libs/Zend/Dojo/Form/Element/Dijit.php @@ -0,0 +1,188 @@ +addPrefixPath('Zend_Dojo_Form_Decorator', 'Zend/Dojo/Form/Decorator', 'decorator'); + parent::__construct($spec, $options); + } + + /** + * Set a dijit parameter + * + * @param string $key + * @param mixed $value + * @return Zend_Dojo_Form_Element_Dijit + */ + public function setDijitParam($key, $value) + { + $key = (string) $key; + $this->dijitParams[$key] = $value; + return $this; + } + + /** + * Set multiple dijit params at once + * + * @param array $params + * @return Zend_Dojo_Form_Element_Dijit + */ + public function setDijitParams(array $params) + { + $this->dijitParams = array_merge($this->dijitParams, $params); + return $this; + } + + /** + * Does the given dijit parameter exist? + * + * @param string $key + * @return bool + */ + public function hasDijitParam($key) + { + return array_key_exists($key, $this->dijitParams); + } + + /** + * Get a single dijit parameter + * + * @param string $key + * @return mixed + */ + public function getDijitParam($key) + { + $key = (string) $key; + if ($this->hasDijitParam($key)) { + return $this->dijitParams[$key]; + } + return null; + } + + /** + * Retrieve all dijit parameters + * + * @return array + */ + public function getDijitParams() + { + return $this->dijitParams; + } + + /** + * Remove a single dijit parameter + * + * @param string $key + * @return Zend_Dojo_Form_Element_Dijit + */ + public function removeDijitParam($key) + { + $key = (string) $key; + if (array_key_exists($key, $this->dijitParams)) { + unset($this->dijitParams[$key]); + } + return $this; + } + + /** + * Clear all dijit parameters + * + * @return Zend_Dojo_Form_Element_Dijit + */ + public function clearDijitParams() + { + $this->dijitParams = array(); + return $this; + } + + /** + * Load default decorators + * + * @return void + */ + public function loadDefaultDecorators() + { + if ($this->loadDefaultDecoratorsIsDisabled()) { + return; + } + + $decorators = $this->getDecorators(); + if (empty($decorators)) { + $this->addDecorator('DijitElement') + ->addDecorator('Errors') + ->addDecorator('HtmlTag', array('tag' => 'dd')) + ->addDecorator('Label', array('tag' => 'dt')); + } + } + + /** + * Set the view object + * + * Ensures that the view object has the dojo view helper path set. + * + * @param Zend_View_Interface $view + * @return Zend_Dojo_Form_Element_Dijit + */ + public function setView(Zend_View_Interface $view = null) + { + if (null !== $view) { + if (false === $view->getPluginLoader('helper')->getPaths('Zend_Dojo_View_Helper')) { + $view->addHelperPath('Zend/Dojo/View/Helper', 'Zend_Dojo_View_Helper'); + } + } + return parent::setView($view); + } +} diff --git a/libs/Zend/Dojo/Form/Element/DijitMulti.php b/libs/Zend/Dojo/Form/Element/DijitMulti.php new file mode 100644 index 0000000..08d6505 --- /dev/null +++ b/libs/Zend/Dojo/Form/Element/DijitMulti.php @@ -0,0 +1,304 @@ +'. + * @var string + */ + protected $_separator = '
'; + + /** + * Which values are translated already? + * @var array + */ + protected $_translated = array(); + + /** + * Retrieve separator + * + * @return mixed + */ + public function getSeparator() + { + return $this->_separator; + } + + /** + * Set separator + * + * @param mixed $separator + * @return self + */ + public function setSeparator($separator) + { + $this->_separator = $separator; + return $this; + } + + /** + * Retrieve options array + * + * @return array + */ + protected function _getMultiOptions() + { + if (null === $this->options || !is_array($this->options)) { + $this->options = array(); + } + + return $this->options; + } + + /** + * Add an option + * + * @param string $option + * @param string $value + * @return Zend_Form_Element_Multi + */ + public function addMultiOption($option, $value = '') + { + $option = (string) $option; + $this->_getMultiOptions(); + if (!$this->_translateOption($option, $value)) { + $this->options[$option] = $value; + } + + return $this; + } + + /** + * Add many options at once + * + * @param array $options + * @return Zend_Form_Element_Multi + */ + public function addMultiOptions(array $options) + { + foreach ($options as $option => $value) { + if (is_array($value) + && array_key_exists('key', $value) + && array_key_exists('value', $value) + ) { + $this->addMultiOption($value['key'], $value['value']); + } else { + $this->addMultiOption($option, $value); + } + } + return $this; + } + + /** + * Set all options at once (overwrites) + * + * @param array $options + * @return Zend_Form_Element_Multi + */ + public function setMultiOptions(array $options) + { + $this->clearMultiOptions(); + return $this->addMultiOptions($options); + } + + /** + * Retrieve single multi option + * + * @param string $option + * @return mixed + */ + public function getMultiOption($option) + { + $option = (string) $option; + $this->_getMultiOptions(); + if (isset($this->options[$option])) { + $this->_translateOption($option, $this->options[$option]); + return $this->options[$option]; + } + + return null; + } + + /** + * Retrieve options + * + * @return array + */ + public function getMultiOptions() + { + $this->_getMultiOptions(); + foreach ($this->options as $option => $value) { + $this->_translateOption($option, $value); + } + return $this->options; + } + + /** + * Remove a single multi option + * + * @param string $option + * @return bool + */ + public function removeMultiOption($option) + { + $option = (string) $option; + $this->_getMultiOptions(); + if (isset($this->options[$option])) { + unset($this->options[$option]); + if (isset($this->_translated[$option])) { + unset($this->_translated[$option]); + } + return true; + } + + return false; + } + + /** + * Clear all options + * + * @return Zend_Form_Element_Multi + */ + public function clearMultiOptions() + { + $this->options = array(); + $this->_translated = array(); + return $this; + } + + /** + * Set flag indicating whether or not to auto-register inArray validator + * + * @param bool $flag + * @return Zend_Form_Element_Multi + */ + public function setRegisterInArrayValidator($flag) + { + $this->_registerInArrayValidator = (bool) $flag; + return $this; + } + + /** + * Get status of auto-register inArray validator flag + * + * @return bool + */ + public function registerInArrayValidator() + { + return $this->_registerInArrayValidator; + } + + /** + * Is the value provided valid? + * + * Autoregisters InArray validator if necessary. + * + * @param string $value + * @param mixed $context + * @return bool + */ + public function isValid($value, $context = null) + { + if ($this->registerInArrayValidator()) { + if (!$this->getValidator('InArray')) { + $options = $this->getMultiOptions(); + $this->addValidator( + 'InArray', + true, + array(array_keys($options)) + ); + } + } + return parent::isValid($value, $context); + } + + /** + * Translate an option + * + * @param string $option + * @param string $value + * @return bool + */ + protected function _translateOption($option, $value) + { + if (!isset($this->_translated[$option])) { + $this->options[$option] = $this->_translateValue($value); + if ($this->options[$option] === $value) { + return false; + } + $this->_translated[$option] = true; + return true; + } + + return false; + } + + /** + * Translate a value + * + * @param array|string $value + * @return array|string + */ + protected function _translateValue($value) + { + if (is_array($value)) { + foreach ($value as $key => $val) { + $value[$key] = $this->_translateValue($val); + } + return $value; + } else { + if (null !== ($translator = $this->getTranslator())) { + if ($translator->isTranslated($value)) { + return $translator->translate($value); + } + } + return $value; + } + } +} diff --git a/libs/Zend/Dojo/Form/Element/Editor.php b/libs/Zend/Dojo/Form/Element/Editor.php new file mode 100644 index 0000000..f89b3ae --- /dev/null +++ b/libs/Zend/Dojo/Form/Element/Editor.php @@ -0,0 +1,598 @@ +getCaptureEvents(); + if (in_array($event, $captureEvents)) { + return $this; + } + + $captureEvents[] = (string) $event; + $this->setDijitParam('captureEvents', $captureEvents); + return $this; + } + + /** + * Add multiple capture events + * + * @param array $events + * @return Zend_Dojo_Form_Element_Editor + */ + public function addCaptureEvents(array $events) + { + foreach ($events as $event) { + $this->addCaptureEvent($event); + } + return $this; + } + + /** + * Overwrite many capture events at once + * + * @param array $events + * @return Zend_Dojo_Form_Element_Editor + */ + public function setCaptureEvents(array $events) + { + $this->clearCaptureEvents(); + $this->addCaptureEvents($events); + return $this; + } + + /** + * Get all capture events + * + * @return array + */ + public function getCaptureEvents() + { + if (!$this->hasDijitParam('captureEvents')) { + return array(); + } + return $this->getDijitParam('captureEvents'); + } + + /** + * Is a given capture event registered? + * + * @param string $event + * @return bool + */ + public function hasCaptureEvent($event) + { + $captureEvents = $this->getCaptureEvents(); + return in_array((string) $event, $captureEvents); + } + + /** + * Remove a given capture event + * + * @param string $event + * @return Zend_Dojo_Form_Element_Editor + */ + public function removeCaptureEvent($event) + { + $event = (string) $event; + $captureEvents = $this->getCaptureEvents(); + if (false === ($index = array_search($event, $captureEvents))) { + return $this; + } + unset($captureEvents[$index]); + $this->setDijitParam('captureEvents', $captureEvents); + return $this; + } + + /** + * Clear all capture events + * + * @return Zend_Dojo_Form_Element_Editor + */ + public function clearCaptureEvents() + { + return $this->removeDijitParam('captureEvents'); + } + + /** + * Add a single event to the dijit + * + * @param string $event + * @return Zend_Dojo_Form_Element_Editor + */ + public function addEvent($event) + { + $event = (string) $event; + $events = $this->getEvents(); + if (in_array($event, $events)) { + return $this; + } + + $events[] = (string) $event; + $this->setDijitParam('events', $events); + return $this; + } + + /** + * Add multiple events + * + * @param array $events + * @return Zend_Dojo_Form_Element_Editor + */ + public function addEvents(array $events) + { + foreach ($events as $event) { + $this->addEvent($event); + } + return $this; + } + + /** + * Overwrite many events at once + * + * @param array $events + * @return Zend_Dojo_Form_Element_Editor + */ + public function setEvents(array $events) + { + $this->clearEvents(); + $this->addEvents($events); + return $this; + } + + /** + * Get all events + * + * @return array + */ + public function getEvents() + { + if (!$this->hasDijitParam('events')) { + return array(); + } + return $this->getDijitParam('events'); + } + + /** + * Is a given event registered? + * + * @param string $event + * @return bool + */ + public function hasEvent($event) + { + $events = $this->getEvents(); + return in_array((string) $event, $events); + } + + /** + * Remove a given event + * + * @param string $event + * @return Zend_Dojo_Form_Element_Editor + */ + public function removeEvent($event) + { + $events = $this->getEvents(); + if (false === ($index = array_search($event, $events))) { + return $this; + } + unset($events[$index]); + $this->setDijitParam('events', $events); + return $this; + } + + /** + * Clear all events + * + * @return Zend_Dojo_Form_Element_Editor + */ + public function clearEvents() + { + return $this->removeDijitParam('events'); + } + + /** + * Add a single editor plugin + * + * @param string $plugin + * @return Zend_Dojo_Form_Element_Editor + */ + public function addPlugin($plugin) + { + $plugin = (string) $plugin; + $plugins = $this->getPlugins(); + if (in_array($plugin, $plugins)) { + return $this; + } + + $plugins[] = (string) $plugin; + $this->setDijitParam('plugins', $plugins); + return $this; + } + + /** + * Add multiple plugins + * + * @param array $plugins + * @return Zend_Dojo_Form_Element_Editor + */ + public function addPlugins(array $plugins) + { + foreach ($plugins as $plugin) { + $this->addPlugin($plugin); + } + return $this; + } + + /** + * Overwrite many plugins at once + * + * @param array $plugins + * @return Zend_Dojo_Form_Element_Editor + */ + public function setPlugins(array $plugins) + { + $this->clearPlugins(); + $this->addPlugins($plugins); + return $this; + } + + /** + * Get all plugins + * + * @return array + */ + public function getPlugins() + { + if (!$this->hasDijitParam('plugins')) { + return array(); + } + return $this->getDijitParam('plugins'); + } + + /** + * Is a given plugin registered? + * + * @param string $plugin + * @return bool + */ + public function hasPlugin($plugin) + { + $plugins = $this->getPlugins(); + return in_array((string) $plugin, $plugins); + } + + /** + * Remove a given plugin + * + * @param string $plugin + * @return Zend_Dojo_Form_Element_Editor + */ + public function removePlugin($plugin) + { + $plugins = $this->getPlugins(); + if (false === ($index = array_search($plugin, $plugins))) { + return $this; + } + unset($plugins[$index]); + $this->setDijitParam('plugins', $plugins); + return $this; + } + + /** + * Clear all plugins + * + * @return Zend_Dojo_Form_Element_Editor + */ + public function clearPlugins() + { + return $this->removeDijitParam('plugins'); + } + + /** + * Set edit action interval + * + * @param int $interval + * @return Zend_Dojo_Form_Element_Editor + */ + public function setEditActionInterval($interval) + { + return $this->setDijitParam('editActionInterval', (int) $interval); + } + + /** + * Get edit action interval; defaults to 3 + * + * @return int + */ + public function getEditActionInterval() + { + if (!$this->hasDijitParam('editActionInterval')) { + $this->setEditActionInterval(3); + } + return $this->getDijitParam('editActionInterval'); + } + + /** + * Set focus on load flag + * + * @param bool $flag + * @return Zend_Dojo_Form_Element_Editor + */ + public function setFocusOnLoad($flag) + { + return $this->setDijitParam('focusOnLoad', (bool) $flag); + } + + /** + * Retrieve focus on load flag + * + * @return bool + */ + public function getFocusOnLoad() + { + if (!$this->hasDijitParam('focusOnLoad')) { + return false; + } + return $this->getDijitParam('focusOnLoad'); + } + + /** + * Set editor height + * + * @param string|int $height + * @return Zend_Dojo_Form_Element_Editor + */ + public function setHeight($height) + { + if (!preg_match('/^\d+(em|px|%)?$/i', $height)) { + require_once 'Zend/Form/Element/Exception.php'; + throw new Zend_Form_Element_Exception('Invalid height provided; must be integer or CSS measurement'); + } + if (!preg_match('/(em|px|%)$/', $height)) { + $height .= 'px'; + } + return $this->setDijitParam('height', $height); + } + + /** + * Retrieve height + * + * @return string + */ + public function getHeight() + { + if (!$this->hasDijitParam('height')) { + return '300px'; + } + return $this->getDijitParam('height'); + } + + /** + * Set whether or not to inherit parent's width + * + * @param bool $flag + * @return Zend_Dojo_Form_Element_Editor + */ + public function setInheritWidth($flag) + { + return $this->setDijitParam('inheritWidth', (bool) $flag); + } + + /** + * Whether or not to inherit the parent's width + * + * @return bool + */ + public function getInheritWidth() + { + if (!$this->hasDijitParam('inheritWidth')) { + return false; + } + return $this->getDijitParam('inheritWidth'); + } + + /** + * Set minimum height of editor + * + * @param string|int $minHeight + * @return Zend_Dojo_Form_Element_Editor + */ + public function setMinHeight($minHeight) + { + if (!preg_match('/^\d+(em)?$/i', $minHeight)) { + require_once 'Zend/Form/Element/Exception.php'; + throw new Zend_Form_Element_Exception('Invalid minHeight provided; must be integer or CSS measurement'); + } + if ('em' != substr($minHeight, -2)) { + $minHeight .= 'em'; + } + return $this->setDijitParam('minHeight', $minHeight); + } + + /** + * Get minimum height of editor + * + * @return string + */ + public function getMinHeight() + { + if (!$this->hasDijitParam('minHeight')) { + return '1em'; + } + return $this->getDijitParam('minHeight'); + } + + /** + * Add a custom stylesheet + * + * @param string $styleSheet + * @return Zend_Dojo_Form_Element_Editor + */ + public function addStyleSheet($styleSheet) + { + $stylesheets = $this->getStyleSheets(); + if (strstr($stylesheets, ';')) { + $stylesheets = explode(';', $stylesheets); + } elseif (!empty($stylesheets)) { + $stylesheets = (array) $stylesheets; + } else { + $stylesheets = array(); + } + if (!in_array($styleSheet, $stylesheets)) { + $stylesheets[] = (string) $styleSheet; + } + return $this->setDijitParam('styleSheets', implode(';', $stylesheets)); + } + + /** + * Add multiple custom stylesheets + * + * @param array $styleSheets + * @return Zend_Dojo_Form_Element_Editor + */ + public function addStyleSheets(array $styleSheets) + { + foreach ($styleSheets as $styleSheet) { + $this->addStyleSheet($styleSheet); + } + return $this; + } + + /** + * Overwrite all stylesheets + * + * @param array $styleSheets + * @return Zend_Dojo_Form_Element_Editor + */ + public function setStyleSheets(array $styleSheets) + { + $this->clearStyleSheets(); + return $this->addStyleSheets($styleSheets); + } + + /** + * Get all stylesheets + * + * @return string + */ + public function getStyleSheets() + { + if (!$this->hasDijitParam('styleSheets')) { + return ''; + } + return $this->getDijitParam('styleSheets'); + } + + /** + * Is a given stylesheet registered? + * + * @param string $styleSheet + * @return bool + */ + public function hasStyleSheet($styleSheet) + { + $styleSheets = $this->getStyleSheets(); + $styleSheets = explode(';', $styleSheets); + return in_array($styleSheet, $styleSheets); + } + + /** + * Remove a single stylesheet + * + * @param string $styleSheet + * @return Zend_Dojo_Form_Element_Editor + */ + public function removeStyleSheet($styleSheet) + { + $styleSheets = $this->getStyleSheets(); + $styleSheets = explode(';', $styleSheets); + if (false !== ($index = array_search($styleSheet, $styleSheets))) { + unset($styleSheets[$index]); + $this->setDijitParam('styleSheets', implode(';', $styleSheets)); + } + return $this; + } + + /** + * Clear all stylesheets + * + * @return Zend_Dojo_Form_Element_Editor + */ + public function clearStyleSheets() + { + if ($this->hasDijitParam('styleSheets')) { + $this->removeDijitParam('styleSheets'); + } + return $this; + } + + /** + * Set update interval + * + * @param int $interval + * @return Zend_Dojo_Form_Element_Editor + */ + public function setUpdateInterval($interval) + { + return $this->setDijitParam('updateInterval', (int) $interval); + } + + /** + * Get update interval + * + * @return int + */ + public function getUpdateInterval() + { + if (!$this->hasDijitParam('updateInterval')) { + return 200; + } + return $this->getDijitParam('updateInterval'); + } +} diff --git a/libs/Zend/Dojo/Form/Element/FilteringSelect.php b/libs/Zend/Dojo/Form/Element/FilteringSelect.php new file mode 100644 index 0000000..ada0ba5 --- /dev/null +++ b/libs/Zend/Dojo/Form/Element/FilteringSelect.php @@ -0,0 +1,48 @@ +hasDijitParam('topDecoration')) { + return $this->getDijitParam('topDecoration'); + } + return array(); + } + + /** + * Set dijit to use with top decoration + * + * @param mixed $dijit + * @return Zend_Dojo_Form_Element_HorizontalSlider + */ + public function setTopDecorationDijit($dijit) + { + $decoration = $this->getTopDecoration(); + $decoration['dijit'] = (string) $dijit; + $this->setDijitParam('topDecoration', $decoration); + return $this; + } + + /** + * Set container to use with top decoration + * + * @param mixed $container + * @return Zend_Dojo_Form_Element_HorizontalSlider + */ + public function setTopDecorationContainer($container) + { + $decoration = $this->getTopDecoration(); + $decoration['container'] = (string) $container; + $this->setDijitParam('topDecoration', $decoration); + return $this; + } + + /** + * Set labels to use with top decoration + * + * @param array $labels + * @return Zend_Dojo_Form_Element_HorizontalSlider + */ + public function setTopDecorationLabels(array $labels) + { + $decoration = $this->getTopDecoration(); + $decoration['labels'] = array_values($labels); + $this->setDijitParam('topDecoration', $decoration); + return $this; + } + + /** + * Set params to use with top decoration + * + * @param array $params + * @return Zend_Dojo_Form_Element_HorizontalSlider + */ + public function setTopDecorationParams(array $params) + { + $decoration = $this->getTopDecoration(); + $decoration['params'] = $params; + $this->setDijitParam('topDecoration', $decoration); + return $this; + } + + /** + * Set attribs to use with top decoration + * + * @param array $attribs + * @return Zend_Dojo_Form_Element_HorizontalSlider + */ + public function setTopDecorationAttribs(array $attribs) + { + $decoration = $this->getTopDecoration(); + $decoration['attribs'] = $attribs; + $this->setDijitParam('topDecoration', $decoration); + return $this; + } + + /** + * Get bottom decoration data + * + * @return array + */ + public function getBottomDecoration() + { + if ($this->hasDijitParam('bottomDecoration')) { + return $this->getDijitParam('bottomDecoration'); + } + return array(); + } + + /** + * Set dijit to use with bottom decoration + * + * @param mixed $dijit + * @return Zend_Dojo_Form_Element_HorizontalSlider + */ + public function setBottomDecorationDijit($dijit) + { + $decoration = $this->getBottomDecoration(); + $decoration['dijit'] = (string) $dijit; + $this->setDijitParam('bottomDecoration', $decoration); + return $this; + } + + /** + * Set container to use with bottom decoration + * + * @param mixed $container + * @return Zend_Dojo_Form_Element_HorizontalSlider + */ + public function setBottomDecorationContainer($container) + { + $decoration = $this->getBottomDecoration(); + $decoration['container'] = (string) $container; + $this->setDijitParam('bottomDecoration', $decoration); + return $this; + } + + /** + * Set labels to use with bottom decoration + * + * @param array $labels + * @return Zend_Dojo_Form_Element_HorizontalSlider + */ + public function setBottomDecorationLabels(array $labels) + { + $decoration = $this->getBottomDecoration(); + $decoration['labels'] = array_values($labels); + $this->setDijitParam('bottomDecoration', $decoration); + return $this; + } + + /** + * Set params to use with bottom decoration + * + * @param array $params + * @return Zend_Dojo_Form_Element_HorizontalSlider + */ + public function setBottomDecorationParams(array $params) + { + $decoration = $this->getBottomDecoration(); + $decoration['params'] = $params; + $this->setDijitParam('bottomDecoration', $decoration); + return $this; + } + + /** + * Set attribs to use with bottom decoration + * + * @param array $attribs + * @return Zend_Dojo_Form_Element_HorizontalSlider + */ + public function setBottomDecorationAttribs(array $attribs) + { + $decoration = $this->getBottomDecoration(); + $decoration['attribs'] = $attribs; + $this->setDijitParam('bottomDecoration', $decoration); + return $this; + } +} diff --git a/libs/Zend/Dojo/Form/Element/NumberSpinner.php b/libs/Zend/Dojo/Form/Element/NumberSpinner.php new file mode 100644 index 0000000..b88075b --- /dev/null +++ b/libs/Zend/Dojo/Form/Element/NumberSpinner.php @@ -0,0 +1,245 @@ +setDijitParam('defaultTimeout', (int) $timeout); + return $this; + } + + /** + * Retrieve defaultTimeout + * + * @return int|null + */ + public function getDefaultTimeout() + { + return $this->getDijitParam('defaultTimeout'); + } + + /** + * Set timeoutChangeRate + * + * @param int $rate + * @return Zend_Dojo_Form_Element_NumberSpinner + */ + public function setTimeoutChangeRate($rate) + { + $this->setDijitParam('timeoutChangeRate', (int) $rate); + return $this; + } + + /** + * Retrieve timeoutChangeRate + * + * @return int|null + */ + public function getTimeoutChangeRate() + { + return $this->getDijitParam('timeoutChangeRate'); + } + + /** + * Set largeDelta + * + * @param int $delta + * @return Zend_Dojo_Form_Element_NumberSpinner + */ + public function setLargeDelta($delta) + { + $this->setDijitParam('largeDelta', (int) $delta); + return $this; + } + + /** + * Retrieve largeDelta + * + * @return int|null + */ + public function getLargeDelta() + { + return $this->getDijitParam('largeDelta'); + } + + /** + * Set smallDelta + * + * @param int $delta + * @return Zend_Dojo_Form_Element_NumberSpinner + */ + public function setSmallDelta($delta) + { + $this->setDijitParam('smallDelta', (int) $delta); + return $this; + } + + /** + * Retrieve smallDelta + * + * @return int|null + */ + public function getSmallDelta() + { + return $this->getDijitParam('smallDelta'); + } + + /** + * Set intermediateChanges flag + * + * @param bool $flag + * @return Zend_Dojo_Form_Element_TextBox + */ + public function setIntermediateChanges($flag) + { + $this->setDijitParam('intermediateChanges', (bool) $flag); + return $this; + } + + /** + * Retrieve intermediateChanges flag + * + * @return bool + */ + public function getIntermediateChanges() + { + if (!$this->hasDijitParam('intermediateChanges')) { + return false; + } + return $this->getDijitParam('intermediateChanges'); + } + + /** + * Set rangeMessage + * + * @param string $message + * @return Zend_Dojo_Form_Element_NumberSpinner + */ + public function setRangeMessage($message) + { + $this->setDijitParam('rangeMessage', (string) $message); + return $this; + } + + /** + * Retrieve rangeMessage + * + * @return string|null + */ + public function getRangeMessage() + { + return $this->getDijitParam('rangeMessage'); + } + + /** + * Set minimum value + * + * @param int $value + * @return Zend_Dojo_Form_Element_NumberSpinner + */ + public function setMin($value) + { + $constraints = array(); + if ($this->hasDijitParam('constraints')) { + $constraints = $this->getDijitParam('constraints'); + } + $constraints['min'] = (int) $value; + $this->setDijitParam('constraints', $constraints); + return $this; + } + + /** + * Get minimum value + * + * @return null|int + */ + public function getMin() + { + if (!$this->hasDijitParam('constraints')) { + return null; + } + $constraints = $this->getDijitParam('constraints'); + if (!array_key_exists('min', $constraints)) { + return null; + } + return $constraints['min']; + } + + /** + * Set maximum value + * + * @param int $value + * @return Zend_Dojo_Form_Element_NumberSpinner + */ + public function setMax($value) + { + $constraints = array(); + if ($this->hasDijitParam('constraints')) { + $constraints = $this->getDijitParam('constraints'); + } + $constraints['max'] = (int) $value; + $this->setDijitParam('constraints', $constraints); + return $this; + } + + /** + * Get maximum value + * + * @return null|int + */ + public function getMax() + { + if (!$this->hasDijitParam('constraints')) { + return null; + } + $constraints = $this->getDijitParam('constraints'); + if (!array_key_exists('max', $constraints)) { + return null; + } + return $constraints['max']; + } +} diff --git a/libs/Zend/Dojo/Form/Element/NumberTextBox.php b/libs/Zend/Dojo/Form/Element/NumberTextBox.php new file mode 100644 index 0000000..138925a --- /dev/null +++ b/libs/Zend/Dojo/Form/Element/NumberTextBox.php @@ -0,0 +1,173 @@ +setConstraint('locale', (string) $locale); + return $this; + } + + /** + * Retrieve locale + * + * @return string|null + */ + public function getLocale() + { + return $this->getConstraint('locale'); + } + + /** + * Set numeric format pattern + * + * @param string $pattern + * @return Zend_Dojo_Form_Element_NumberTextBox + */ + public function setPattern($pattern) + { + $this->setConstraint('pattern', (string) $pattern); + return $this; + } + + /** + * Retrieve numeric format pattern + * + * @return string|null + */ + public function getPattern() + { + return $this->getConstraint('pattern'); + } + + /** + * Set numeric format type + * + * @see $_allowedTypes + * @param string $type + * @return Zend_Dojo_Form_Element_NumberTextBox + */ + public function setType($type) + { + $type = strtolower($type); + if (!in_array($type, $this->_allowedTypes)) { + require_once 'Zend/Form/Element/Exception.php'; + throw new Zend_Form_Element_Exception(sprintf('Invalid numeric type "%s" specified', $type)); + } + + $this->setConstraint('type', $type); + return $this; + } + + /** + * Retrieve type + * + * @return string|null + */ + public function getType() + { + return $this->getConstraint('type'); + } + + /** + * Set decimal places + * + * @param int $places + * @return Zend_Dojo_Form_Element_NumberTextBox + */ + public function setPlaces($places) + { + $this->setConstraint('places', (int) $places); + return $this; + } + + /** + * Retrieve decimal places + * + * @return int|null + */ + public function getPlaces() + { + return $this->getConstraint('places'); + } + + /** + * Set strict flag + * + * @param bool $strict + * @return Zend_Dojo_Form_Element_NumberTextBox + */ + public function setStrict($flag) + { + $this->setConstraint('strict', (bool) $flag); + return $this; + } + + /** + * Retrieve strict flag + * + * @return bool + */ + public function getStrict() + { + if (!$this->hasConstraint('strict')) { + return false; + } + return ('true' == $this->getConstraint('strict')); + } +} diff --git a/libs/Zend/Dojo/Form/Element/PasswordTextBox.php b/libs/Zend/Dojo/Form/Element/PasswordTextBox.php new file mode 100644 index 0000000..67f1281 --- /dev/null +++ b/libs/Zend/Dojo/Form/Element/PasswordTextBox.php @@ -0,0 +1,42 @@ +setDijitParam('clickSelect', (bool) $flag); + return $this; + } + + /** + * Retrieve clickSelect flag + * + * @return bool + */ + public function getClickSelect() + { + if (!$this->hasDijitParam('clickSelect')) { + return false; + } + return $this->getDijitParam('clickSelect'); + } + + /** + * Set intermediateChanges flag + * + * @param bool $intermediateChanges + * @return Zend_Dojo_Form_Element_TextBox + */ + public function setIntermediateChanges($flag) + { + $this->setDijitParam('intermediateChanges', (bool) $flag); + return $this; + } + + /** + * Retrieve intermediateChanges flag + * + * @return bool + */ + public function getIntermediateChanges() + { + if (!$this->hasDijitParam('intermediateChanges')) { + return false; + } + return $this->getDijitParam('intermediateChanges'); + } + + /** + * Set showButtons flag + * + * @param bool $showButtons + * @return Zend_Dojo_Form_Element_TextBox + */ + public function setShowButtons($flag) + { + $this->setDijitParam('showButtons', (bool) $flag); + return $this; + } + + /** + * Retrieve showButtons flag + * + * @return bool + */ + public function getShowButtons() + { + if (!$this->hasDijitParam('showButtons')) { + return false; + } + return $this->getDijitParam('showButtons'); + } + + /** + * Set discreteValues + * + * @param int $value + * @return Zend_Dojo_Form_Element_TextBox + */ + public function setDiscreteValues($value) + { + $this->setDijitParam('discreteValues', (int) $value); + return $this; + } + + /** + * Retrieve discreteValues + * + * @return int|null + */ + public function getDiscreteValues() + { + return $this->getDijitParam('discreteValues'); + } + + /** + * Set maximum + * + * @param int $value + * @return Zend_Dojo_Form_Element_TextBox + */ + public function setMaximum($value) + { + $this->setDijitParam('maximum', (int) $value); + return $this; + } + + /** + * Retrieve maximum + * + * @return int|null + */ + public function getMaximum() + { + return $this->getDijitParam('maximum'); + } + + /** + * Set minimum + * + * @param int $value + * @return Zend_Dojo_Form_Element_TextBox + */ + public function setMinimum($value) + { + $this->setDijitParam('minimum', (int) $value); + return $this; + } + + /** + * Retrieve minimum + * + * @return int|null + */ + public function getMinimum() + { + return $this->getDijitParam('minimum'); + } + + /** + * Set pageIncrement + * + * @param int $value + * @return Zend_Dojo_Form_Element_TextBox + */ + public function setPageIncrement($value) + { + $this->setDijitParam('pageIncrement', (int) $value); + return $this; + } + + /** + * Retrieve pageIncrement + * + * @return int|null + */ + public function getPageIncrement() + { + return $this->getDijitParam('pageIncrement'); + } +} diff --git a/libs/Zend/Dojo/Form/Element/SubmitButton.php b/libs/Zend/Dojo/Form/Element/SubmitButton.php new file mode 100644 index 0000000..e793269 --- /dev/null +++ b/libs/Zend/Dojo/Form/Element/SubmitButton.php @@ -0,0 +1,42 @@ +setDijitParam('lowercase', (bool) $flag); + return $this; + } + + /** + * Retrieve lowercase flag + * + * @return bool + */ + public function getLowercase() + { + if (!$this->hasDijitParam('lowercase')) { + return false; + } + return $this->getDijitParam('lowercase'); + } + + /** + * Set propercase flag + * + * @param bool $propercase + * @return Zend_Dojo_Form_Element_TextBox + */ + public function setPropercase($flag) + { + $this->setDijitParam('propercase', (bool) $flag); + return $this; + } + + /** + * Retrieve propercase flag + * + * @return bool + */ + public function getPropercase() + { + if (!$this->hasDijitParam('propercase')) { + return false; + } + return $this->getDijitParam('propercase'); + } + + /** + * Set uppercase flag + * + * @param bool $uppercase + * @return Zend_Dojo_Form_Element_TextBox + */ + public function setUppercase($flag) + { + $this->setDijitParam('uppercase', (bool) $flag); + return $this; + } + + /** + * Retrieve uppercase flag + * + * @return bool + */ + public function getUppercase() + { + if (!$this->hasDijitParam('uppercase')) { + return false; + } + return $this->getDijitParam('uppercase'); + } + + /** + * Set trim flag + * + * @param bool $trim + * @return Zend_Dojo_Form_Element_TextBox + */ + public function setTrim($flag) + { + $this->setDijitParam('trim', (bool) $flag); + return $this; + } + + /** + * Retrieve trim flag + * + * @return bool + */ + public function getTrim() + { + if (!$this->hasDijitParam('trim')) { + return false; + } + return $this->getDijitParam('trim'); + } + + /** + * Set maxLength + * + * @param int $length + * @return Zend_Dojo_Form_Element_TextBox + */ + public function setMaxLength($length) + { + $this->setDijitParam('maxLength', (int) $length); + return $this; + } + + /** + * Retrieve maxLength + * + * @return int|null + */ + public function getMaxLength() + { + return $this->getDijitParam('maxLength'); + } +} diff --git a/libs/Zend/Dojo/Form/Element/Textarea.php b/libs/Zend/Dojo/Form/Element/Textarea.php new file mode 100644 index 0000000..b7ac682 --- /dev/null +++ b/libs/Zend/Dojo/Form/Element/Textarea.php @@ -0,0 +1,42 @@ +setConstraint('timePattern', (string) $pattern); + return $this; + } + + /** + * Retrieve time format pattern + * + * @return string|null + */ + public function getTimePattern() + { + return $this->getConstraint('timePattern'); + } + + /** + * Set clickableIncrement + * + * @param string $format + * @return Zend_Dojo_Form_Element_NumberTextBox + */ + public function setClickableIncrement($format) + { + $format = (string) $format; + $this->_validateIso8601($format); + $this->setConstraint('clickableIncrement', $format); + return $this; + } + + /** + * Retrieve clickableIncrement + * + * @return string|null + */ + public function getClickableIncrement() + { + return $this->getConstraint('clickableIncrement'); + } + + /** + * Set visibleIncrement + * + * @param string $format + * @return Zend_Dojo_Form_Element_NumberTextBox + */ + public function setVisibleIncrement($format) + { + $format = (string) $format; + $this->_validateIso8601($format); + $this->setConstraint('visibleIncrement', $format); + return $this; + } + + /** + * Retrieve visibleIncrement + * + * @return string|null + */ + public function getVisibleIncrement() + { + return $this->getConstraint('visibleIncrement'); + } + + /** + * Set visibleRange + * + * @param string $format + * @return Zend_Dojo_Form_Element_NumberTextBox + */ + public function setVisibleRange($format) + { + $format = (string) $format; + $this->_validateIso8601($format); + $this->setConstraint('visibleRange', $format); + return $this; + } + + /** + * Retrieve visibleRange + * + * @return string|null + */ + public function getVisibleRange() + { + return $this->getConstraint('visibleRange'); + } +} diff --git a/libs/Zend/Dojo/Form/Element/ValidationTextBox.php b/libs/Zend/Dojo/Form/Element/ValidationTextBox.php new file mode 100644 index 0000000..81a6635 --- /dev/null +++ b/libs/Zend/Dojo/Form/Element/ValidationTextBox.php @@ -0,0 +1,218 @@ +setDijitParam('invalidMessage', (string) $message); + return $this; + } + + /** + * Retrieve invalidMessage + * + * @return string|null + */ + public function getInvalidMessage() + { + return $this->getDijitParam('invalidMessage'); + } + + /** + * Set promptMessage + * + * @param string $message + * @return Zend_Dojo_Form_Element_ValidationTextBox + */ + public function setPromptMessage($message) + { + $this->setDijitParam('promptMessage', (string) $message); + return $this; + } + + /** + * Retrieve promptMessage + * + * @return string|null + */ + public function getPromptMessage() + { + return $this->getDijitParam('promptMessage'); + } + + /** + * Set regExp + * + * @param string $regexp + * @return Zend_Dojo_Form_Element_ValidationTextBox + */ + public function setRegExp($regexp) + { + $this->setDijitParam('regExp', (string) $regexp); + return $this; + } + + /** + * Retrieve regExp + * + * @return string|null + */ + public function getRegExp() + { + return $this->getDijitParam('regExp'); + } + + /** + * Set an individual constraint + * + * @param string $key + * @param mixed $value + * @return Zend_Dojo_Form_Element_ValidationTextBox + */ + public function setConstraint($key, $value) + { + $constraints = $this->getConstraints(); + $constraints[(string) $key] = $value; + $this->setConstraints($constraints); + return $this; + } + + /** + * Set validation constraints + * + * Refer to Dojo dijit.form.ValidationTextBox documentation for valid + * structure. + * + * @param array $constraints + * @return Zend_Dojo_Form_Element_ValidationTextBox + */ + public function setConstraints(array $constraints) + { + array_walk_recursive($constraints, array($this, '_castBoolToString')); + $this->setDijitParam('constraints', $constraints); + return $this; + } + + /** + * Is the given constraint set? + * + * @param string $key + * @return bool + */ + public function hasConstraint($key) + { + $constraints = $this->getConstraints(); + return array_key_exists((string)$key, $constraints); + } + + /** + * Get an individual constraint + * + * @param string $key + * @return mixed + */ + public function getConstraint($key) + { + $key = (string) $key; + if (!$this->hasConstraint($key)) { + return null; + } + return $this->dijitParams['constraints'][$key]; + } + + /** + * Get constraints + * + * @return array + */ + public function getConstraints() + { + if ($this->hasDijitParam('constraints')) { + return $this->getDijitParam('constraints'); + } + return array(); + } + + /** + * Remove a single constraint + * + * @param string $key + * @return Zend_Dojo_Form_Element_ValidationTextBox + */ + public function removeConstraint($key) + { + $key = (string) $key; + if ($this->hasConstraint($key)) { + unset($this->dijitParams['constraints'][$key]); + } + return $this; + } + + /** + * Clear all constraints + * + * @return Zend_Dojo_Form_Element_ValidationTextBox + */ + public function clearConstraints() + { + return $this->removeDijitParam('constraints'); + } + + /** + * Cast a boolean value to a string + * + * @param mixed $item + * @param string $key + * @return void + */ + protected function _castBoolToString(&$item, $key) + { + if (is_bool($item)) { + $item = ($item) ? 'true' : 'false'; + } + } +} diff --git a/libs/Zend/Dojo/Form/Element/VerticalSlider.php b/libs/Zend/Dojo/Form/Element/VerticalSlider.php new file mode 100644 index 0000000..0784af0 --- /dev/null +++ b/libs/Zend/Dojo/Form/Element/VerticalSlider.php @@ -0,0 +1,208 @@ +hasDijitParam('leftDecoration')) { + return $this->getDijitParam('leftDecoration'); + } + return array(); + } + + /** + * Set dijit to use with left decoration + * + * @param mixed $dijit + * @return Zend_Dojo_Form_Element_HorizontalSlider + */ + public function setLeftDecorationDijit($dijit) + { + $decoration = $this->getLeftDecoration(); + $decoration['dijit'] = (string) $dijit; + $this->setDijitParam('leftDecoration', $decoration); + return $this; + } + + /** + * Set container to use with left decoration + * + * @param mixed $container + * @return Zend_Dojo_Form_Element_HorizontalSlider + */ + public function setLeftDecorationContainer($container) + { + $decoration = $this->getLeftDecoration(); + $decoration['container'] = (string) $container; + $this->setDijitParam('leftDecoration', $decoration); + return $this; + } + + /** + * Set labels to use with left decoration + * + * @param array $labels + * @return Zend_Dojo_Form_Element_HorizontalSlider + */ + public function setLeftDecorationLabels(array $labels) + { + $decoration = $this->getLeftDecoration(); + $decoration['labels'] = array_values($labels); + $this->setDijitParam('leftDecoration', $decoration); + return $this; + } + + /** + * Set params to use with left decoration + * + * @param array $params + * @return Zend_Dojo_Form_Element_HorizontalSlider + */ + public function setLeftDecorationParams(array $params) + { + $decoration = $this->getLeftDecoration(); + $decoration['params'] = $params; + $this->setDijitParam('leftDecoration', $decoration); + return $this; + } + + /** + * Set attribs to use with left decoration + * + * @param array $attribs + * @return Zend_Dojo_Form_Element_HorizontalSlider + */ + public function setLeftDecorationAttribs(array $attribs) + { + $decoration = $this->getLeftDecoration(); + $decoration['attribs'] = $attribs; + $this->setDijitParam('leftDecoration', $decoration); + return $this; + } + + /** + * Get right decoration data + * + * @return array + */ + public function getRightDecoration() + { + if ($this->hasDijitParam('rightDecoration')) { + return $this->getDijitParam('rightDecoration'); + } + return array(); + } + + /** + * Set dijit to use with right decoration + * + * @param mixed $dijit + * @return Zend_Dojo_Form_Element_HorizontalSlider + */ + public function setRightDecorationDijit($dijit) + { + $decoration = $this->getRightDecoration(); + $decoration['dijit'] = (string) $dijit; + $this->setDijitParam('rightDecoration', $decoration); + return $this; + } + + /** + * Set container to use with right decoration + * + * @param mixed $container + * @return Zend_Dojo_Form_Element_HorizontalSlider + */ + public function setRightDecorationContainer($container) + { + $decoration = $this->getRightDecoration(); + $decoration['container'] = (string) $container; + $this->setDijitParam('rightDecoration', $decoration); + return $this; + } + + /** + * Set labels to use with right decoration + * + * @param array $labels + * @return Zend_Dojo_Form_Element_HorizontalSlider + */ + public function setRightDecorationLabels(array $labels) + { + $decoration = $this->getRightDecoration(); + $decoration['labels'] = array_values($labels); + $this->setDijitParam('rightDecoration', $decoration); + return $this; + } + + /** + * Set params to use with right decoration + * + * @param array $params + * @return Zend_Dojo_Form_Element_HorizontalSlider + */ + public function setRightDecorationParams(array $params) + { + $decoration = $this->getRightDecoration(); + $decoration['params'] = $params; + $this->setDijitParam('rightDecoration', $decoration); + return $this; + } + + /** + * Set attribs to use with right decoration + * + * @param array $attribs + * @return Zend_Dojo_Form_Element_HorizontalSlider + */ + public function setRightDecorationAttribs(array $attribs) + { + $decoration = $this->getRightDecoration(); + $decoration['attribs'] = $attribs; + $this->setDijitParam('rightDecoration', $decoration); + return $this; + } +} diff --git a/libs/Zend/Dojo/Form/SubForm.php b/libs/Zend/Dojo/Form/SubForm.php new file mode 100644 index 0000000..182061a --- /dev/null +++ b/libs/Zend/Dojo/Form/SubForm.php @@ -0,0 +1,94 @@ +addPrefixPath('Zend_Dojo_Form_Decorator', 'Zend/Dojo/Form/Decorator', 'decorator') + ->addPrefixPath('Zend_Dojo_Form_Element', 'Zend/Dojo/Form/Element', 'element') + ->addElementPrefixPath('Zend_Dojo_Form_Decorator', 'Zend/Dojo/Form/Decorator', 'decorator') + ->addDisplayGroupPrefixPath('Zend_Dojo_Form_Decorator', 'Zend/Dojo/Form/Decorator') + ->setDefaultDisplayGroupClass('Zend_Dojo_Form_DisplayGroup'); + parent::__construct($options); + } + + /** + * Load the default decorators + * + * @return void + */ + public function loadDefaultDecorators() + { + if ($this->loadDefaultDecoratorsIsDisabled()) { + return; + } + + $decorators = $this->getDecorators(); + if (empty($decorators)) { + $this->addDecorator('FormElements') + ->addDecorator('HtmlTag', array('tag' => 'dl')) + ->addDecorator('ContentPane'); + } + } + + /** + * Get view + * + * @return Zend_View_Interface + */ + public function getView() + { + $view = parent::getView(); + if (!$this->_dojoViewPathRegistered) { + if (false === $view->getPluginLoader('helper')->getPaths('Zend_Dojo_View_Helper')) { + $view->addHelperPath('Zend/Dojo/View/Helper', 'Zend_Dojo_View_Helper'); + } + $this->_dojoViewPathRegistered = true; + } + return $view; + } +} diff --git a/libs/Zend/Dojo/View/Exception.php b/libs/Zend/Dojo/View/Exception.php new file mode 100644 index 0000000..a456237 --- /dev/null +++ b/libs/Zend/Dojo/View/Exception.php @@ -0,0 +1,6 @@ +_createLayoutContainer($id, $content, $params, $attribs); + } +} diff --git a/libs/Zend/Dojo/View/Helper/AccordionPane.php b/libs/Zend/Dojo/View/Helper/AccordionPane.php new file mode 100644 index 0000000..8895cd9 --- /dev/null +++ b/libs/Zend/Dojo/View/Helper/AccordionPane.php @@ -0,0 +1,66 @@ +_createLayoutContainer($id, $content, $params, $attribs); + } +} diff --git a/libs/Zend/Dojo/View/Helper/BorderContainer.php b/libs/Zend/Dojo/View/Helper/BorderContainer.php new file mode 100644 index 0000000..64ab746 --- /dev/null +++ b/libs/Zend/Dojo/View/Helper/BorderContainer.php @@ -0,0 +1,79 @@ +_styleIsRegistered) { + $this->view->headStyle()->appendStyle('html, body { height: 100%; width: 100%; margin: 0; padding: 0; }'); + $this->_styleIsRegistered = true; + } + + // and now we create it: + return $this->_createLayoutContainer($id, $content, $params, $attribs); + } +} diff --git a/libs/Zend/Dojo/View/Helper/Button.php b/libs/Zend/Dojo/View/Helper/Button.php new file mode 100644 index 0000000..6fb9577 --- /dev/null +++ b/libs/Zend/Dojo/View/Helper/Button.php @@ -0,0 +1,68 @@ +_prepareDijit($attribs, $params, 'element'); + + return $this->view->formButton($id, $value, $attribs); + } +} diff --git a/libs/Zend/Dojo/View/Helper/CheckBox.php b/libs/Zend/Dojo/View/Helper/CheckBox.php new file mode 100644 index 0000000..49821cd --- /dev/null +++ b/libs/Zend/Dojo/View/Helper/CheckBox.php @@ -0,0 +1,100 @@ +_prepareDijit($attribs, $params, 'element'); + + // strip options so they don't show up in markup + if (array_key_exists('options', $attribs)) { + unset($attribs['options']); + } + + // and now we create it: + $html = ''; + if (!strstr($id, '[]')) { + // hidden element for unchecked value + $html .= $this->_renderHiddenElement($id, $checkboxInfo['unCheckedValue']); + } + + // and final element + $html .= $this->_createFormElement($id, $checkboxInfo['checkedValue'], $params, $attribs); + + return $html; + } +} diff --git a/libs/Zend/Dojo/View/Helper/ComboBox.php b/libs/Zend/Dojo/View/Helper/ComboBox.php new file mode 100644 index 0000000..e51d63e --- /dev/null +++ b/libs/Zend/Dojo/View/Helper/ComboBox.php @@ -0,0 +1,151 @@ +_renderStore($params['store']))) { + $params['store'] = $params['store']['store']; + if (is_string($store)) { + $html .= $store; + } + $html .= $this->_createFormElement($id, $value, $params, $attribs); + return $html; + } + unset($params['store']); + } elseif (array_key_exists('store', $params)) { + if (array_key_exists('storeType', $params)) { + $storeParams = array( + 'store' => $params['store'], + 'type' => $params['storeType'], + ); + unset($params['storeType']); + if (array_key_exists('storeParams', $params)) { + $storeParams['params'] = $params['storeParams']; + unset($params['storeParams']); + } + if (false !== ($store = $this->_renderStore($storeParams))) { + if (is_string($store)) { + $html .= $store; + } + } + } + $html .= $this->_createFormElement($id, $value, $params, $attribs); + return $html; + } + + // do as normal select + $attribs = $this->_prepareDijit($attribs, $params, 'element'); + return $this->view->formSelect($id, $value, $attribs, $options); + } + + /** + * Render data store element + * + * Renders to dojo view helper + * + * @param array $params + * @return string|false + */ + protected function _renderStore(array $params) + { + if (!array_key_exists('store', $params) || !array_key_exists('type', $params)) { + return false; + } + + $this->dojo->requireModule($params['type']); + + $extraParams = array(); + $storeParams = array( + 'dojoType' => $params['type'], + 'jsId' => $params['store'], + ); + + if (array_key_exists('params', $params)) { + $storeParams = array_merge($storeParams, $params['params']); + $extraParams = $params['params']; + } + + if ($this->_useProgrammatic()) { + if (!$this->_useProgrammaticNoScript()) { + $this->dojo->addJavascript('var ' . $storeParams['jsId'] . ';'); + require_once 'Zend/Json.php'; + $js = "function() {\n" + . ' ' . $storeParams['jsId'] . ' = ' + . 'new ' . $storeParams['dojoType'] . '(' + . Zend_Json::encode($extraParams) + . ");\n}"; + $this->dojo->addOnLoad($js); + } + return true; + } + + return '_htmlAttribs($storeParams) . '>'; + } +} diff --git a/libs/Zend/Dojo/View/Helper/ContentPane.php b/libs/Zend/Dojo/View/Helper/ContentPane.php new file mode 100644 index 0000000..eb8e939 --- /dev/null +++ b/libs/Zend/Dojo/View/Helper/ContentPane.php @@ -0,0 +1,66 @@ +_createLayoutContainer($id, $content, $params, $attribs); + } +} diff --git a/libs/Zend/Dojo/View/Helper/CurrencyTextBox.php b/libs/Zend/Dojo/View/Helper/CurrencyTextBox.php new file mode 100644 index 0000000..8e7338b --- /dev/null +++ b/libs/Zend/Dojo/View/Helper/CurrencyTextBox.php @@ -0,0 +1,68 @@ +_createFormElement($id, $value, $params, $attribs); + } +} diff --git a/libs/Zend/Dojo/View/Helper/DateTextBox.php b/libs/Zend/Dojo/View/Helper/DateTextBox.php new file mode 100644 index 0000000..cd90f8e --- /dev/null +++ b/libs/Zend/Dojo/View/Helper/DateTextBox.php @@ -0,0 +1,68 @@ +_createFormElement($id, $value, $params, $attribs); + } +} diff --git a/libs/Zend/Dojo/View/Helper/Dijit.php b/libs/Zend/Dojo/View/Helper/Dijit.php new file mode 100644 index 0000000..84e8da8 --- /dev/null +++ b/libs/Zend/Dojo/View/Helper/Dijit.php @@ -0,0 +1,311 @@ +dojo = $this->view->dojo(); + $this->dojo->enable(); + return $this; + } + + /** + * Whether or not to use declarative dijit creation + * + * @return bool + */ + protected function _useDeclarative() + { + return Zend_Dojo_View_Helper_Dojo::useDeclarative(); + } + + /** + * Whether or not to use programmatic dijit creation + * + * @return bool + */ + protected function _useProgrammatic() + { + return Zend_Dojo_View_Helper_Dojo::useProgrammatic(); + } + + /** + * Whether or not to use programmatic dijit creation w/o script creation + * + * @return bool + */ + protected function _useProgrammaticNoScript() + { + return Zend_Dojo_View_Helper_Dojo::useProgrammaticNoScript(); + } + + /** + * Create a layout container + * + * @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) . '>' + . $content + . "\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 + * @return string + */ + public function _createFormElement($id, $value, array $params, array $attribs, $dijit = null) + { + if (!array_key_exists('id', $attribs)) { + $attribs['id'] = $id; + } + $attribs['name'] = $id; + $attribs['value'] = (string) $value; + $attribs['type'] = $this->_elementType; + + $attribs = $this->_prepareDijit($attribs, $params, 'element', $dijit); + + $html = '_htmlAttribs($attribs) + . $this->getClosingBracket(); + return $html; + } + + /** + * Merge attributes and parameters + * + * Also sets up requires + * + * @param array $attribs + * @param array $params + * @param string $type + * @param string $dijit Dijit type to use (otherwise, pull from $_dijit) + * @return array + */ + protected function _prepareDijit(array $attribs, array $params, $type, $dijit = null) + { + $this->dojo->requireModule($this->_module); + + switch ($type) { + case 'layout': + $stripParams = array('id'); + break; + case 'element': + $stripParams = array('id', 'name', 'value', 'type'); + foreach (array('checked', 'disabled', 'readonly') as $attrib) { + if (array_key_exists($attrib, $attribs)) { + if ($attribs[$attrib]) { + $attribs[$attrib] = $attrib; + } else { + unset($attribs[$attrib]); + } + } + } + break; + case 'textarea': + $stripParams = array('id', 'name', 'type'); + break; + default: + } + + foreach ($stripParams as $param) { + if (array_key_exists($param, $params)) { + unset($params[$param]); + } + } + + // Normalize constraints, if present + foreach ($this->_jsonParams as $param) { + if (array_key_exists($param, $params)) { + require_once 'Zend/Json.php'; + + if (is_array($params[$param])) { + $values = array(); + foreach ($params[$param] as $key => $value) { + if (!is_scalar($value)) { + continue; + } + $values[$key] = $value; + } + } elseif (is_string($params[$param])) { + $values = (array) $params[$param]; + } else { + $values = array(); + } + $values = Zend_Json::encode($values); + if ($this->_useDeclarative()) { + $values = str_replace('"', "'", $values); + } + $params[$param] = $values; + } + } + + $dijit = (null === $dijit) ? $this->_dijit : $dijit; + if ($this->_useDeclarative()) { + $attribs = array_merge($attribs, $params); + $attribs['dojoType'] = $dijit; + } elseif (!$this->_useProgrammaticNoScript()) { + $this->_createDijit($dijit, $attribs['id'], $params); + } + + return $attribs; + } + + /** + * Create a dijit programmatically + * + * @param string $dijit + * @param string $id + * @param array $params + * @return void + */ + protected function _createDijit($dijit, $id, array $params) + { + $params['dojoType'] = $dijit; + + array_walk_recursive($params, array($this, '_castBoolToString')); + + $this->dojo->setDijit($id, $params); + } + + /** + * Cast a boolean to a string value + * + * @param mixed $item + * @param string $key + * @return void + */ + protected function _castBoolToString(&$item, $key) + { + if (!is_bool($item)) { + return; + } + $item = ($item) ? "true" : "false"; + } + + /** + * Render a hidden element to hold a value + * + * @param string $id + * @param string|int|float $value + * @return string + */ + protected function _renderHiddenElement($id, $value) + { + $hiddenAttribs = array( + 'name' => $id, + 'value' => (string) $value, + 'type' => 'hidden', + ); + return '_htmlAttribs($hiddenAttribs) . $this->getClosingBracket(); + } + + /** + * Create JS function for retrieving parent form + * + * @return void + */ + protected function _createGetParentFormFunction() + { + $function =<<dojo->addJavascript($function); + } +} diff --git a/libs/Zend/Dojo/View/Helper/DijitContainer.php b/libs/Zend/Dojo/View/Helper/DijitContainer.php new file mode 100644 index 0000000..2b1e5d4 --- /dev/null +++ b/libs/Zend/Dojo/View/Helper/DijitContainer.php @@ -0,0 +1,92 @@ +_captureLock)) { + require_once 'Zend/Dojo/View/Exception.php'; + throw new Zend_Dojo_View_Exception(sprintf('Lock already exists for id "%s"', $id)); + } + + $this->_captureLock[$id] = true; + $this->_captureInfo[$id] = array( + 'params' => $params, + 'attribs' => $attribs, + ); + + ob_start(); + return; + } + + /** + * Finish capturing content for layout container + * + * @param string $id + * @return string + */ + public function captureEnd($id) + { + if (!array_key_exists($id, $this->_captureLock)) { + require_once 'Zend/Dojo/View/Exception.php'; + throw new Zend_Dojo_View_Exception(sprintf('No capture lock exists for id "%s"; nothing to capture', $id)); + } + + $content = ob_get_clean(); + extract($this->_captureInfo[$id]); + unset($this->_captureLock[$id], $this->_captureInfo[$id]); + return $this->_createLayoutContainer($id, $content, $params, $attribs); + } +} diff --git a/libs/Zend/Dojo/View/Helper/Dojo.php b/libs/Zend/Dojo/View/Helper/Dojo.php new file mode 100644 index 0000000..cfecf92 --- /dev/null +++ b/libs/Zend/Dojo/View/Helper/Dojo.php @@ -0,0 +1,176 @@ +_container = $registry[__CLASS__]; + } + + /** + * Set view object + * + * @param Zend_Dojo_View_Interface $view + * @return void + */ + public function setView(Zend_View_Interface $view) + { + $this->view = $view; + $this->_container->setView($view); + } + + /** + * Return dojo container + * + * @return Zend_Dojo_View_Helper_Dojo_Container + */ + public function dojo() + { + return $this->_container; + } + + /** + * Proxy to container methods + * + * @param string $method + * @param array $args + * @return mixed + * @throws Zend_Dojo_View_Exception For invalid method calls + */ + public function __call($method, $args) + { + if (!method_exists($this->_container, $method)) { + require_once 'Zend/Dojo/View/Exception.php'; + throw new Zend_Dojo_View_Exception(sprintf('Invalid method "%s" called on dojo view helper', $method)); + } + + return call_user_func_array(array($this->_container, $method), $args); + } + + /** + * Set whether or not dijits should be created declaratively + * + * @return void + */ + public static function setUseDeclarative() + { + self::$_useProgrammatic = false; + } + + /** + * Set whether or not dijits should be created programmatically + * + * Optionally, specifiy whether or not dijit helpers should generate the + * programmatic dojo. + * + * @param int $style + * @return void + */ + public static function setUseProgrammatic($style = self::PROGRAMMATIC_SCRIPT) + { + if (!in_array($style, array(self::PROGRAMMATIC_SCRIPT, self::PROGRAMMATIC_NOSCRIPT))) { + $style = self::PROGRAMMATIC_SCRIPT; + } + self::$_useProgrammatic = $style; + } + + /** + * Should dijits be created declaratively? + * + * @return bool + */ + public static function useDeclarative() + { + return (false === self::$_useProgrammatic); + } + + /** + * Should dijits be created programmatically? + * + * @return bool + */ + public static function useProgrammatic() + { + return (false !== self::$_useProgrammatic); + } + + /** + * Should dijits be created programmatically but without scripts? + * + * @return bool + */ + public static function useProgrammaticNoScript() + { + return (self::PROGRAMMATIC_NOSCRIPT === self::$_useProgrammatic); + } +} diff --git a/libs/Zend/Dojo/View/Helper/Dojo/Container.php b/libs/Zend/Dojo/View/Helper/Dojo/Container.php new file mode 100644 index 0000000..5315efc --- /dev/null +++ b/libs/Zend/Dojo/View/Helper/Dojo/Container.php @@ -0,0 +1,1070 @@ +view = $view; + } + + /** + * Enable dojo + * + * @return Zend_Dojo_View_Helper_Dojo_Container + */ + public function enable() + { + $this->_enabled = true; + return $this; + } + + /** + * Disable dojo + * + * @return Zend_Dojo_View_Helper_Dojo_Container + */ + public function disable() + { + $this->_enabled = false; + return $this; + } + + /** + * Is dojo enabled? + * + * @return bool + */ + public function isEnabled() + { + return $this->_enabled; + } + + /** + * Specify a module to require + * + * @param string $module + * @return Zend_Dojo_View_Helper_Dojo_Container + */ + public function requireModule($module) + { + if (!is_string($module) && !is_array($module)) { + require_once 'Zend/Dojo/View/Exception.php'; + throw new Zend_Dojo_View_Exception('Invalid module name specified; must be a string or an array of strings'); + } + + $module = (array) $module; + + foreach ($module as $mod) { + if (!preg_match('/^[a-z][a-z0-9._-]+$/i', $mod)) { + require_once 'Zend/Dojo/View/Exception.php'; + throw new Zend_Dojo_View_Exception(sprintf('Module name specified, "%s", contains invalid characters', (string) $mod)); + } + + if (!in_array($mod, $this->_modules)) { + $this->_modules[] = $mod; + } + } + + return $this; + } + + /** + * Retrieve list of modules to require + * + * @return array + */ + public function getModules() + { + return $this->_modules; + } + + /** + * Register a module path + * + * @param string $path + * @return Zend_Dojo_View_Helper_Dojo_Container + */ + public function registerModulePath($module, $path) + { + $path = (string) $path; + if (!in_array($module, $this->_modulePaths)) { + $this->_modulePaths[$module] = $path; + } + + return $this; + } + + /** + * List registered module paths + * + * @return array + */ + public function getModulePaths() + { + return $this->_modulePaths; + } + + /** + * Add layer (custom build) path + * + * @param string $path + * @return Zend_Dojo_View_Helper_Dojo_Container + */ + public function addLayer($path) + { + $path = (string) $path; + if (!in_array($path, $this->_layers)) { + $this->_layers[] = $path; + } + return $this; + } + + /** + * Get registered layers + * + * @return array + */ + public function getLayers() + { + return $this->_layers; + } + + /** + * Remove a registered layer + * + * @param string $path + * @return Zend_Dojo_View_Helper_Dojo_Container + */ + public function removeLayer($path) + { + $path = (string) $path; + $layers = array_flip($this->_layers); + if (array_key_exists($path, $layers)) { + unset($layers[$path]); + $this->_layers = array_keys($layers); + } + return $this; + } + + /** + * Clear all registered layers + * + * @return Zend_Dojo_View_Helper_Dojo_Container + */ + public function clearLayers() + { + $this->_layers = array(); + return $this; + } + + /** + * Set CDN base path + * + * @param string $url + * @return Zend_Dojo_View_Helper_Dojo_Container + */ + public function setCdnBase($url) + { + $this->_cdnBase = (string) $url; + return $this; + } + + /** + * Return CDN base URL + * + * @return string + */ + public function getCdnBase() + { + return $this->_cdnBase; + } + + /** + * Use CDN, using version specified + * + * @param string $version + * @return Zend_Dojo_View_Helper_Dojo_Container + */ + public function setCdnVersion($version = null) + { + $this->enable(); + if (preg_match('/^[1-9]\.[0-9](\.[0-9])?$/', $version)) { + $this->_cdnVersion = $version; + } + return $this; + } + + /** + * Get CDN version + * + * @return string + */ + public function getCdnVersion() + { + return $this->_cdnVersion; + } + + /** + * Set CDN path to dojo (relative to CDN base + version) + * + * @param string $path + * @return Zend_Dojo_View_Helper_Dojo_Container + */ + public function setCdnDojoPath($path) + { + $this->_cdnDojoPath = (string) $path; + return $this; + } + + /** + * Get CDN path to dojo (relative to CDN base + version) + * + * @return string + */ + public function getCdnDojoPath() + { + return $this->_cdnDojoPath; + } + + /** + * Are we using the CDN? + * + * @return bool + */ + public function useCdn() + { + return !$this->useLocalPath(); + } + + /** + * Set path to local dojo + * + * @param string $path + * @return Zend_Dojo_View_Helper_Dojo_Container + */ + public function setLocalPath($path) + { + $this->enable(); + $this->_localPath = (string) $path; + return $this; + } + + /** + * Get local path to dojo + * + * @return string + */ + public function getLocalPath() + { + return $this->_localPath; + } + + /** + * 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 + * @return Zend_Dojo_View_Helper_Dojo_Container + */ + public function setDjConfig(array $config) + { + $this->_djConfig = $config; + return $this; + } + + /** + * Set Dojo configuration option + * + * @param string $option + * @param mixed $value + * @return Zend_Dojo_View_Helper_Dojo_Container + */ + public function setDjConfigOption($option, $value) + { + $option = (string) $option; + $this->_djConfig[$option] = $value; + return $this; + } + + /** + * Retrieve dojo configuration values + * + * @return array + */ + public function getDjConfig() + { + return $this->_djConfig; + } + + /** + * Get dojo configuration value + * + * @param string $option + * @param mixed $default + * @return mixed + */ + public function getDjConfigOption($option, $default = null) + { + $option = (string) $option; + if (array_key_exists($option, $this->_djConfig)) { + return $this->_djConfig[$option]; + } + return $default; + } + + /** + * Add a stylesheet by module name + * + * @param string $module + * @return Zend_Dojo_View_Helper_Dojo_Container + */ + public function addStylesheetModule($module) + { + if (!preg_match('/^[a-z0-9]+\.[a-z0-9_-]+(\.[a-z0-9_-]+)*$/i', $module)) { + require_once 'Zend/Dojo/View/Exception.php'; + throw new Zend_Dojo_View_Exception('Invalid stylesheet module specified'); + } + if (in_array($module, $this->_stylesheetModules)) { + return $this; + } + $this->_stylesheetModules[] = $module; + return $this; + } + + /** + * Get all stylesheet modules currently registered + * + * @return array + */ + public function getStylesheetModules() + { + return $this->_stylesheetModules; + } + + /** + * Add a stylesheet + * + * @param string $path + * @return Zend_Dojo_View_Helper_Dojo_Container + */ + public function addStylesheet($path) + { + $path = (string) $path; + if (!in_array($path, $this->_stylesheets)) { + $this->_stylesheets[] = (string) $path; + } + return $this; + } + + /** + * Register the dojo.css stylesheet? + * + * 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 + */ + public function registerDojoStylesheet($flag = null) + { + if (null === $flag) { + return $this->_registerDojoStylesheet; + } + + $this->_registerDojoStylesheet = (bool) $flag; + return $this; + } + + /** + * Retrieve registered stylesheets + * + * @return array + */ + public function getStylesheets() + { + return $this->_stylesheets; + } + + /** + * Add a script to execute onLoad + * + * dojo.addOnLoad accepts: + * - function name + * - lambda + * + * @param string $callback Lambda + * @return Zend_Dojo_View_Helper_Dojo_Container + */ + public function addOnLoad($callback) + { + if (!in_array($callback, $this->_onLoadActions, true)) { + $this->_onLoadActions[] = $callback; + } + return $this; + } + + /** + * Retrieve all registered onLoad actions + * + * @return array + */ + public function getOnLoadActions() + { + return $this->_onLoadActions; + } + + /** + * Start capturing routines to run onLoad + * + * @return bool + */ + public function onLoadCaptureStart() + { + if ($this->_captureLock) { + require_once 'Zend/Dojo/View/Exception.php'; + throw new Zend_Dojo_View_Exception('Cannot nest onLoad captures'); + } + + $this->_captureLock = true; + ob_start(); + return; + } + + /** + * Stop capturing routines to run onLoad + * + * @return bool + */ + public function onLoadCaptureEnd() + { + $data = ob_get_clean(); + $this->_captureLock = false; + + $this->addOnLoad($data); + return true; + } + + /** + * Add a programmatic dijit + * + * @param string $id + * @param array $params + * @return Zend_Dojo_View_Helper_Dojo_Container + */ + public function addDijit($id, array $params) + { + if (array_key_exists($id, $this->_dijits)) { + require_once 'Zend/Dojo/View/Exception.php'; + throw new Zend_Dojo_View_Exception(sprintf('Duplicate dijit with id "%s" already registered', $id)); + } + + $this->_dijits[$id] = array( + 'id' => $id, + 'params' => $params, + ); + + return $this; + } + + /** + * Set a programmatic dijit (overwrites) + * + * @param string $id + * @param array $params + * @return Zend_Dojo_View_Helper_Dojo_Container + */ + public function setDijit($id, array $params) + { + $this->removeDijit($id); + return $this->addDijit($id, $params); + } + + /** + * Add multiple dijits at once + * + * Expects an array of id => array $params pairs + * + * @param array $dijits + * @return Zend_Dojo_View_Helper_Dojo_Container + */ + public function addDijits(array $dijits) + { + foreach ($dijits as $id => $params) { + $this->addDijit($id, $params); + } + return $this; + } + + /** + * Set multiple dijits at once (overwrites) + * + * Expects an array of id => array $params pairs + * + * @param array $dijits + * @return Zend_Dojo_View_Helper_Dojo_Container + */ + public function setDijits(array $dijits) + { + $this->clearDijits(); + return $this->addDijits($dijits); + } + + /** + * Is the given programmatic dijit already registered? + * + * @param string $id + * @return bool + */ + public function hasDijit($id) + { + return array_key_exists($id, $this->_dijits); + } + + /** + * Retrieve a dijit by id + * + * @param string $id + * @return array|null + */ + public function getDijit($id) + { + if ($this->hasDijit($id)) { + return $this->_dijits[$id]['params']; + } + return null; + } + + /** + * Retrieve all dijits + * + * Returns dijits as an array of assoc arrays + * + * @return array + */ + public function getDijits() + { + return array_values($this->_dijits); + } + + /** + * Remove a programmatic dijit if it exists + * + * @param string $id + * @return Zend_Dojo_View_Helper_Dojo_Container + */ + public function removeDijit($id) + { + if (array_key_exists($id, $this->_dijits)) { + unset($this->_dijits[$id]); + } + + return $this; + } + + /** + * Clear all dijits + * + * @return Zend_Dojo_View_Helper_Dojo_Container + */ + public function clearDijits() + { + $this->_dijits = array(); + return $this; + } + + /** + * Render dijits as JSON structure + * + * @return string + */ + public function dijitsToJson() + { + require_once 'Zend/Json.php'; + return Zend_Json::encode($this->getDijits()); + } + + /** + * Create dijit loader functionality + * + * @return void + */ + public function registerDijitLoader() + { + if (!$this->_dijitLoaderRegistered) { + $js =<<requireModule('dojo.parser'); + $this->addOnLoad($js); + $this->addJavascript('var zendDijits = ' . $this->dijitsToJson() . ';'); + $this->_dijitLoaderRegistered = true; + } + } + + /** + * Add arbitrary javascript to execute in dojo JS container + * + * @param string $js + * @return Zend_Dojo_View_Helper_Dojo_Container + */ + public function addJavascript($js) + { + $js = preg_replace('/^\s*(.*?)\s*$/s', '$1', $js); + if (!in_array(substr($js, -1), array(';', '}'))) { + $js .= ';'; + } + + if (in_array($js, $this->_javascriptStatements)) { + return $this; + } + + $this->_javascriptStatements[] = $js; + return $this; + } + + /** + * Return all registered javascript statements + * + * @return array + */ + public function getJavascript() + { + return $this->_javascriptStatements; + } + + /** + * Clear arbitrary javascript stack + * + * @return Zend_Dojo_View_Helper_Dojo_Container + */ + public function clearJavascript() + { + $this->_javascriptStatements = array(); + return $this; + } + + /** + * Capture arbitrary javascript to include in dojo script + * + * @return void + */ + public function javascriptCaptureStart() + { + if ($this->_captureLock) { + require_once 'Zend/Dojo/View/Exception.php'; + throw new Zend_Dojo_View_Exception('Cannot nest captures'); + } + + $this->_captureLock = true; + ob_start(); + return; + } + + /** + * Finish capturing arbitrary javascript to include in dojo script + * + * @return true + */ + public function javascriptCaptureEnd() + { + $data = ob_get_clean(); + $this->_captureLock = false; + + $this->addJavascript($data); + return true; + } + + /** + * String representation of dojo environment + * + * @return string + */ + public function __toString() + { + if (!$this->isEnabled()) { + return ''; + } + + $this->_isXhtml = $this->view->doctype()->isXhtml(); + + if (Zend_Dojo_View_Helper_Dojo::useDeclarative()) { + if (null === $this->getDjConfigOption('parseOnLoad')) { + $this->setDjConfigOption('parseOnLoad', true); + } + } + + if (!empty($this->_dijits)) { + $this->registerDijitLoader(); + } + + $html = $this->_renderStylesheets() . PHP_EOL + . $this->_renderDjConfig() . PHP_EOL + . $this->_renderDojoScriptTag() . PHP_EOL + . $this->_renderLayers() . PHP_EOL + . $this->_renderExtras(); + return $html; + } + + /** + * Retrieve local path to dojo resources for building relative paths + * + * @return string + */ + protected function _getLocalRelativePath() + { + if (null === $this->_localRelativePath) { + $localPath = $this->getLocalPath(); + $localPath = preg_replace('|[/\\\\]dojo[/\\\\]dojo.js[^/\\\\]*$|i', '', $localPath); + $this->_localRelativePath = $localPath; + } + return $this->_localRelativePath; + } + + /** + * Render dojo stylesheets + * + * @return string + */ + protected function _renderStylesheets() + { + if ($this->useCdn()) { + $base = $this->getCdnBase() + . $this->getCdnVersion(); + } else { + $base = $this->_getLocalRelativePath(); + } + + $registeredStylesheets = $this->getStylesheetModules(); + foreach ($registeredStylesheets as $stylesheet) { + $themeName = substr($stylesheet, strrpos($stylesheet, '.') + 1); + $stylesheet = str_replace('.', '/', $stylesheet); + $stylesheets[] = $base . '/' . $stylesheet . '/' . $themeName . '.css'; + } + + foreach ($this->getStylesheets() as $stylesheet) { + $stylesheets[] = $stylesheet; + } + + if ($this->_registerDojoStylesheet) { + $stylesheets[] = $base . '/dojo/resources/dojo.css'; + } + + if (empty($stylesheets)) { + return ''; + } + + array_reverse($stylesheets); + $style = ''; + + return $style; + } + + /** + * Render DjConfig values + * + * @return string + */ + protected function _renderDjConfig() + { + $djConfigValues = $this->getDjConfig(); + if (empty($djConfigValues)) { + return ''; + } + + require_once 'Zend/Json.php'; + $scriptTag = ''; + + return $scriptTag; + } + + /** + * 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 + * with that attribute. + * + * @return string + */ + protected function _renderDojoScriptTag() + { + if ($this->useCdn()) { + $source = $this->getCdnBase() + . $this->getCdnVersion() + . $this->getCdnDojoPath(); + } else { + $source = $this->getLocalPath(); + } + + $scriptTag = ''; + return $scriptTag; + } + + /** + * Render layers (custom builds) as script tags + * + * @return string + */ + protected function _renderLayers() + { + $layers = $this->getLayers(); + if (empty($layers)) { + return ''; + } + + $html = array(); + foreach ($layers as $path) { + $html[] = sprintf( + '', + htmlentities($path, ENT_QUOTES) + ); + } + + return implode("\n", $html); + } + + /** + * Render dojo module paths and requires + * + * @return string + */ + protected function _renderExtras() + { + $js = array(); + $modulePaths = $this->getModulePaths(); + if (!empty($modulePaths)) { + foreach ($modulePaths as $module => $path) { + $js[] = 'dojo.registerModulePath("' . $this->view->escape($module) . '", "' . $this->view->escape($path) . '");'; + } + } + + $modules = $this->getModules(); + if (!empty($modules)) { + foreach ($modules as $module) { + $js[] = 'dojo.require("' . $this->view->escape($module) . '");'; + } + } + + $onLoadActions = array(); + foreach ($this->getOnLoadActions() as $callback) { + $onLoadActions[] = 'dojo.addOnLoad(' . $callback . ');'; + } + + $javascript = implode("\n ", $this->getJavascript()); + + $content = ''; + if (!empty($js)) { + $content .= implode("\n ", $js) . "\n"; + } + + if (!empty($onLoadActions)) { + $content .= implode("\n ", $onLoadActions) . "\n"; + } + + if (!empty($javascript)) { + $content .= $javascript . "\n"; + } + + if (preg_match('/^\s*$/s', $content)) { + return ''; + } + + $html = ''; + return $html; + } +} diff --git a/libs/Zend/Dojo/View/Helper/Editor.php b/libs/Zend/Dojo/View/Helper/Editor.php new file mode 100644 index 0000000..236107d --- /dev/null +++ b/libs/Zend/Dojo/View/Helper/Editor.php @@ -0,0 +1,132 @@ +_normalizeId($hiddenId); + + $textareaName = $this->_normalizeEditorName($hiddenName); + $textareaId = $hiddenId . '-Editor'; + + $hiddenAttribs = array( + 'id' => $hiddenId, + 'name' => $hiddenName, + 'value' => $value, + 'type' => 'hidden', + ); + $attribs['id'] = $textareaId; + + $this->_createGetParentFormFunction(); + $this->_createEditorOnSubmit($hiddenId, $textareaId); + + $html = '_htmlAttribs($hiddenAttribs) . $this->getClosingBracket() + . $this->textarea($textareaName, $value, $params, $attribs); + + return $html; + } + + /** + * Normalize editor element name + * + * @param string $name + * @return string + */ + protected function _normalizeEditorName($name) + { + if ('[]' == substr($name, -2)) { + $name = substr($name, 0, strlen($name) - 2); + $name .= '[Editor][]'; + } else { + $name .= '[Editor]'; + } + return $name; + } + + /** + * Create onSubmit binding for element + * + * @param string $hiddenId + * @param string $editorId + * @return void + */ + protected function _createEditorOnSubmit($hiddenId, $editorId) + { + $this->dojo->onLoadCaptureStart(); + echo <<dojo->onLoadCaptureEnd(); + } +} diff --git a/libs/Zend/Dojo/View/Helper/FilteringSelect.php b/libs/Zend/Dojo/View/Helper/FilteringSelect.php new file mode 100644 index 0000000..34b646a --- /dev/null +++ b/libs/Zend/Dojo/View/Helper/FilteringSelect.php @@ -0,0 +1,63 @@ +comboBox($id, $value, $params, $attribs, $options); + } +} diff --git a/libs/Zend/Dojo/View/Helper/Form.php b/libs/Zend/Dojo/View/Helper/Form.php new file mode 100644 index 0000000..c0589d4 --- /dev/null +++ b/libs/Zend/Dojo/View/Helper/Form.php @@ -0,0 +1,96 @@ +_prepareDijit($attribs, array(), 'layout'); + + return $this->getFormHelper()->form($id, $attribs, $content); + } + + /** + * Get standard form helper + * + * @return Zend_View_Helper_Form + */ + public function getFormHelper() + { + if (null === $this->_helper) { + require_once 'Zend/View/Helper/Form.php'; + $this->_helper = new Zend_View_Helper_Form; + $this->_helper->setView($this->view); + } + return $this->_helper; + } +} diff --git a/libs/Zend/Dojo/View/Helper/HorizontalSlider.php b/libs/Zend/Dojo/View/Helper/HorizontalSlider.php new file mode 100644 index 0000000..75c3627 --- /dev/null +++ b/libs/Zend/Dojo/View/Helper/HorizontalSlider.php @@ -0,0 +1,62 @@ +prepareSlider($id, $value, $params, $attribs); + } +} diff --git a/libs/Zend/Dojo/View/Helper/NumberSpinner.php b/libs/Zend/Dojo/View/Helper/NumberSpinner.php new file mode 100644 index 0000000..69bb2cf --- /dev/null +++ b/libs/Zend/Dojo/View/Helper/NumberSpinner.php @@ -0,0 +1,90 @@ +_createFormElement($id, $value, $params, $attribs); + } +} diff --git a/libs/Zend/Dojo/View/Helper/NumberTextBox.php b/libs/Zend/Dojo/View/Helper/NumberTextBox.php new file mode 100644 index 0000000..0723549 --- /dev/null +++ b/libs/Zend/Dojo/View/Helper/NumberTextBox.php @@ -0,0 +1,68 @@ +_createFormElement($id, $value, $params, $attribs); + } +} diff --git a/libs/Zend/Dojo/View/Helper/PasswordTextBox.php b/libs/Zend/Dojo/View/Helper/PasswordTextBox.php new file mode 100644 index 0000000..b446742 --- /dev/null +++ b/libs/Zend/Dojo/View/Helper/PasswordTextBox.php @@ -0,0 +1,56 @@ +_createFormElement($id, $value, $params, $attribs); + } +} diff --git a/libs/Zend/Dojo/View/Helper/RadioButton.php b/libs/Zend/Dojo/View/Helper/RadioButton.php new file mode 100644 index 0000000..cc9eb5e --- /dev/null +++ b/libs/Zend/Dojo/View/Helper/RadioButton.php @@ -0,0 +1,89 @@ +\n" + ) { + $attribs['name'] = $id; + if (!array_key_exists('id', $attribs)) { + $attribs['id'] = $id; + } + $attribs = $this->_prepareDijit($attribs, $params, 'element'); + + if (is_array($options) && $this->_useProgrammatic() && !$this->_useProgrammaticNoScript()) { + $baseId = $id; + if (array_key_exists('id', $attribs)) { + $baseId = $attribs['id']; + } + require_once 'Zend/Filter/Alnum.php'; + $filter = new Zend_Filter_Alnum(); + foreach (array_keys($options) as $key) { + $optId = $baseId . '-' . $filter->filter($key); + $this->_createDijit($this->_dijit, $optId, array()); + } + } + + return $this->view->formRadio($id, $value, $attribs, $options, $listsep); + } +} diff --git a/libs/Zend/Dojo/View/Helper/SimpleTextarea.php b/libs/Zend/Dojo/View/Helper/SimpleTextarea.php new file mode 100644 index 0000000..5f9f048 --- /dev/null +++ b/libs/Zend/Dojo/View/Helper/SimpleTextarea.php @@ -0,0 +1,77 @@ +_elementType; + + $attribs = $this->_prepareDijit($attribs, $params, 'textarea'); + + $html = '_htmlAttribs($attribs) . '>' + . $this->view->escape($value) + . "\n"; + + return $html; + } +} diff --git a/libs/Zend/Dojo/View/Helper/Slider.php b/libs/Zend/Dojo/View/Helper/Slider.php new file mode 100644 index 0000000..df043ab --- /dev/null +++ b/libs/Zend/Dojo/View/Helper/Slider.php @@ -0,0 +1,239 @@ +_sliderType = strtolower($this->_sliderType); + + // Prepare two items: a hidden element to store the value, and the slider + $hidden = $this->_renderHiddenElement($id, $value); + $hidden = preg_replace('/(name=")([^"]*)"/', 'id="$2" $1$2"', $hidden); + + foreach ($this->_requiredParams as $param) { + if (!array_key_exists($param, $params)) { + require_once 'Zend/Dojo/View/Exception.php'; + throw new Zend_Dojo_View_Exception('prepareSlider() requires minimally the "minimum", "maximum", and "discreteValues" parameters'); + } + } + + $content = ''; + $params['value'] = $value; + + if (!array_key_exists('onChange', $attribs)) { + $attribs['onChange'] = "dojo.byId('" . $id . "').value = arguments[0];"; + } + + $id = str_replace('][', '-', $id); + $id = str_replace(array('[', ']'), '-', $id); + $id = rtrim($id, '-'); + $id .= '-slider'; + + switch ($this->_sliderType) { + case 'horizontal': + if (array_key_exists('topDecoration', $params)) { + $content .= $this->_prepareDecoration('topDecoration', $id, $params['topDecoration']); + unset($params['topDecoration']); + } + + if (array_key_exists('bottomDecoration', $params)) { + $content .= $this->_prepareDecoration('bottomDecoration', $id, $params['bottomDecoration']); + unset($params['bottomDecoration']); + } + + if (array_key_exists('leftDecoration', $params)) { + unset($params['leftDecoration']); + } + + if (array_key_exists('rightDecoration', $params)) { + unset($params['rightDecoration']); + } + break; + case 'vertical': + if (array_key_exists('leftDecoration', $params)) { + $content .= $this->_prepareDecoration('leftDecoration', $id, $params['leftDecoration']); + unset($params['leftDecoration']); + } + + if (array_key_exists('rightDecoration', $params)) { + $content .= $this->_prepareDecoration('rightDecoration', $id, $params['rightDecoration']); + unset($params['rightDecoration']); + } + + if (array_key_exists('topDecoration', $params)) { + unset($params['topDecoration']); + } + + if (array_key_exists('bottomDecoration', $params)) { + unset($params['bottomDecoration']); + } + break; + default: + require_once 'Zend/Dojo/View/Exception.php'; + throw new Zend_Dojo_View_Exception('Invalid slider type; slider must be horizontal or vertical'); + } + + return $hidden . $this->_createLayoutContainer($id, $content, $params, $attribs); + } + + /** + * Prepare slider decoration + * + * @param string $position + * @param string $id + * @param array $decInfo + * @return string + */ + protected function _prepareDecoration($position, $id, $decInfo) + { + if (!in_array($position, array('topDecoration', 'bottomDecoration', 'leftDecoration', 'rightDecoration'))) { + return ''; + } + + if (!is_array($decInfo) + || !array_key_exists('labels', $decInfo) + || !is_array($decInfo['labels']) + ) { + return ''; + } + + $id .= '-' . $position; + + if (!array_key_exists('dijit', $decInfo)) { + $dijit = 'dijit.form.' . ucfirst($this->_sliderType) . 'Rule'; + } else { + $dijit = $decInfo['dijit']; + if ('dijit.form.' != substr($dijit, 0, 10)) { + $dijit = 'dijit.form.' . $dijit; + } + } + + $params = array(); + $attribs = array(); + $labels = $decInfo['labels']; + if (array_key_exists('params', $decInfo)) { + $params = $decInfo['params']; + } + if (array_key_exists('attribs', $decInfo)) { + $attribs = $decInfo['attribs']; + } + + $containerParams = null; + if (array_key_exists('container', $params)) { + $containerParams = $params['container']; + unset($params['container']); + } + + if (array_key_exists('labels', $params)) { + $labelsParams = $params['labels']; + unset($params['labels']); + } else { + $labelsParams = $params; + } + + if (null === $containerParams) { + $containerParams = $params; + } + + $containerAttribs = null; + if (array_key_exists('container', $attribs)) { + $containerAttribs = $attribs['container']; + unset($attribs['container']); + } + + if (array_key_exists('labels', $attribs)) { + $labelsAttribs = $attribs['labels']; + unset($attribs['labels']); + } else { + $labelsAttribs = $attribs; + } + + if (null === $containerAttribs) { + $containerAttribs = $attribs; + } + + $containerParams['container'] = $position; + $labelsParams['container'] = $position; + + $labelList = $this->_prepareLabelsList($id, $labelsParams, $labelsAttribs, $labels); + + return $this->_createLayoutContainer($id, $labelList, $containerParams, $containerAttribs, $dijit); + } + + /** + * Prepare slider label list + * + * @param string $id + * @param array $params + * @param array $attribs + * @param array $labels + * @return string + */ + protected function _prepareLabelsList($id, array $params, array $attribs, array $labels) + { + $attribs['id'] = $id . '-labels'; + $dijit = 'dijit.form.' . ucfirst($this->_sliderType) . 'RuleLabels'; + $attribs = $this->_prepareDijit($attribs, $params, 'layout', $dijit); + + return $this->view->htmlList($labels, true, $attribs); + } +} diff --git a/libs/Zend/Dojo/View/Helper/SplitContainer.php b/libs/Zend/Dojo/View/Helper/SplitContainer.php new file mode 100644 index 0000000..eaffb24 --- /dev/null +++ b/libs/Zend/Dojo/View/Helper/SplitContainer.php @@ -0,0 +1,66 @@ +_createLayoutContainer($id, $content, $params, $attribs); + } +} diff --git a/libs/Zend/Dojo/View/Helper/StackContainer.php b/libs/Zend/Dojo/View/Helper/StackContainer.php new file mode 100644 index 0000000..c34acbb --- /dev/null +++ b/libs/Zend/Dojo/View/Helper/StackContainer.php @@ -0,0 +1,66 @@ +_createLayoutContainer($id, $content, $params, $attribs); + } +} diff --git a/libs/Zend/Dojo/View/Helper/SubmitButton.php b/libs/Zend/Dojo/View/Helper/SubmitButton.php new file mode 100644 index 0000000..8fac8c4 --- /dev/null +++ b/libs/Zend/Dojo/View/Helper/SubmitButton.php @@ -0,0 +1,58 @@ +_createFormElement($id, $value, $params, $attribs); + } +} diff --git a/libs/Zend/Dojo/View/Helper/TabContainer.php b/libs/Zend/Dojo/View/Helper/TabContainer.php new file mode 100644 index 0000000..80d467c --- /dev/null +++ b/libs/Zend/Dojo/View/Helper/TabContainer.php @@ -0,0 +1,66 @@ +_createLayoutContainer($id, $content, $params, $attribs); + } +} diff --git a/libs/Zend/Dojo/View/Helper/TextBox.php b/libs/Zend/Dojo/View/Helper/TextBox.php new file mode 100644 index 0000000..91aeae2 --- /dev/null +++ b/libs/Zend/Dojo/View/Helper/TextBox.php @@ -0,0 +1,68 @@ +_createFormElement($id, $value, $params, $attribs); + } +} diff --git a/libs/Zend/Dojo/View/Helper/Textarea.php b/libs/Zend/Dojo/View/Helper/Textarea.php new file mode 100644 index 0000000..44d2f8c --- /dev/null +++ b/libs/Zend/Dojo/View/Helper/Textarea.php @@ -0,0 +1,80 @@ +_elementType; + + $attribs = $this->_prepareDijit($attribs, $params, 'textarea'); + + $html = '_htmlAttribs($attribs) . '>' + . $value + . "\n"; + + return $html; + } +} diff --git a/libs/Zend/Dojo/View/Helper/TimeTextBox.php b/libs/Zend/Dojo/View/Helper/TimeTextBox.php new file mode 100644 index 0000000..1ecabec --- /dev/null +++ b/libs/Zend/Dojo/View/Helper/TimeTextBox.php @@ -0,0 +1,68 @@ +_createFormElement($id, $value, $params, $attribs); + } +} diff --git a/libs/Zend/Dojo/View/Helper/ValidationTextBox.php b/libs/Zend/Dojo/View/Helper/ValidationTextBox.php new file mode 100644 index 0000000..8865e4d --- /dev/null +++ b/libs/Zend/Dojo/View/Helper/ValidationTextBox.php @@ -0,0 +1,68 @@ +_createFormElement($id, $value, $params, $attribs); + } +} diff --git a/libs/Zend/Dojo/View/Helper/VerticalSlider.php b/libs/Zend/Dojo/View/Helper/VerticalSlider.php new file mode 100644 index 0000000..af13d4a --- /dev/null +++ b/libs/Zend/Dojo/View/Helper/VerticalSlider.php @@ -0,0 +1,62 @@ +prepareSlider($id, $value, $params, $attribs); + } +} diff --git a/libs/Zend/Dom/Exception.php b/libs/Zend/Dom/Exception.php new file mode 100644 index 0000000..5f38950 --- /dev/null +++ b/libs/Zend/Dom/Exception.php @@ -0,0 +1,7 @@ +setDocument($document); + } + } + + /** + * Set document to query + * + * @param string $document + * @return Zend_Dom_Query + */ + public function setDocument($document) + { + if ('setDocumentXml($document); + } + if (strstr($document, 'DTD XHTML')) { + return $this->setDocumentXhtml($document); + } + return $this->setDocumentHtml($document); + } + + /** + * Register HTML document + * + * @param string $document + * @return Zend_Dom_Query + */ + public function setDocumentHtml($document) + { + $this->_document = (string) $document; + $this->_docType = self::DOC_HTML; + return $this; + } + + /** + * Register XHTML document + * + * @param string $document + * @return Zend_Dom_Query + */ + public function setDocumentXhtml($document) + { + $this->_document = (string) $document; + $this->_docType = self::DOC_XHTML; + return $this; + } + + /** + * Register XML document + * + * @param string $document + * @return Zend_Dom_Query + */ + public function setDocumentXml($document) + { + $this->_document = (string) $document; + $this->_docType = self::DOC_XML; + return $this; + } + + /** + * Retrieve current document + * + * @return string + */ + public function getDocument() + { + return $this->_document; + } + + /** + * Get document type + * + * @return string + */ + public function getDocumentType() + { + return $this->_docType; + } + + /** + * Perform a CSS selector query + * + * @param string $query + * @return Zend_Dom_Query_Result + */ + public function query($query) + { + $xpathQuery = Zend_Dom_Query_Css2Xpath::transform($query); + return $this->queryXpath($xpathQuery, $query); + } + + /** + * Perform an XPath query + * + * @param string $xpathQuery + * @param string $query CSS selector query + * @return Zend_Dom_Query_Result + */ + public function queryXpath($xpathQuery, $query = null) + { + if (null === ($document = $this->getDocument())) { + require_once 'Zend/Dom/Exception.php'; + throw new Zend_Dom_Exception('Cannot query; no document registered'); + } + + $domDoc = new DOMDocument; + $type = $this->getDocumentType(); + switch ($type) { + case self::DOC_XML: + $success = @$domDoc->loadXML($document); + break; + case self::DOC_HTML: + case self::DOC_XHTML: + default: + $success = @$domDoc->loadHTML($document); + break; + } + + if (!$success) { + require_once 'Zend/Dom/Exception.php'; + throw new Zend_Dom_Exception(sprintf('Error parsing document (type == %s)', $type)); + } + + $nodeList = $this->_getNodeList($domDoc, $xpathQuery); + return new Zend_Dom_Query_Result($query, $xpathQuery, $domDoc, $nodeList); + } + + /** + * Prepare node list + * + * @param DOMDocument $document + * @param string|array $xpathQuery + * @return array + */ + protected function _getNodeList($document, $xpathQuery) + { + $xpath = new DOMXPath($document); + $xpathQuery = (string) $xpathQuery; + if (preg_match_all('|\[contains\((@[a-z0-9_-]+),\s?\' |i', $xpathQuery, $matches)) { + foreach ($matches[1] as $attribute) { + $queryString = '//*[' . $attribute . ']'; + $attributeName = substr($attribute, 1); + $nodes = $xpath->query($queryString); + foreach ($nodes as $node) { + $attr = $node->attributes->getNamedItem($attributeName); + $attr->value = ' ' . $attr->value . ' '; + } + } + } + return $xpath->query($xpathQuery); + } +} diff --git a/libs/Zend/Dom/Query/Css2Xpath.php b/libs/Zend/Dom/Query/Css2Xpath.php new file mode 100644 index 0000000..f00f53e --- /dev/null +++ b/libs/Zend/Dom/Query/Css2Xpath.php @@ -0,0 +1,141 @@ + $segment) { + $pathSegment = self::_tokenize($segment); + if (0 == $key) { + if (0 === strpos($pathSegment, '[contains(@class')) { + $paths[0] .= '*' . $pathSegment; + } else { + $paths[0] .= $pathSegment; + } + continue; + } + if (0 === strpos($pathSegment, '[contains(@class')) { + foreach ($paths as $key => $xpath) { + $paths[$key] .= '//*' . $pathSegment; + $paths[] = $xpath . $pathSegment; + } + } else { + foreach ($paths as $key => $xpath) { + $paths[$key] .= '//' . $pathSegment; + } + } + } + + if (1 == count($paths)) { + return $paths[0]; + } + return implode(' | ', $paths); + } + + /** + * Tokenize CSS expressions to XPath + * + * @param string $expression + * @return string + */ + protected static function _tokenize($expression) + { + // Child selectors + $expression = str_replace('>', '/', $expression); + + // IDs + $expression = preg_replace('|#([a-z][a-z0-9_-]*)|i', '[@id=\'$1\']', $expression); + $expression = preg_replace('|(?_cssQuery = $cssQuery; + $this->_xpathQuery = $xpathQuery; + $this->_document = $document; + $this->_nodeList = $nodeList; + } + + /** + * Retrieve CSS Query + * + * @return string + */ + public function getCssQuery() + { + return $this->_cssQuery; + } + + /** + * Retrieve XPath query + * + * @return string + */ + public function getXpathQuery() + { + return $this->_xpathQuery; + } + + /** + * Retrieve DOMDocument + * + * @return DOMDocument + */ + public function getDocument() + { + return $this->_document; + } + + /** + * Iterator: rewind to first element + * + * @return void + */ + public function rewind() + { + $this->_position = 0; + return $this->_nodeList->item(0); + } + + /** + * Iterator: is current position valid? + * + * @return bool + */ + public function valid() + { + if (in_array($this->_position, range(0, $this->_nodeList->length - 1)) && $this->_nodeList->length > 0) { + return true; + } + return false; + } + + /** + * Iterator: return current element + * + * @return DOMElement + */ + public function current() + { + return $this->_nodeList->item($this->_position); + } + + /** + * Iterator: return key of current element + * + * @return int + */ + public function key() + { + return $this->_position; + } + + /** + * Iterator: move to next element + * + * @return void + */ + public function next() + { + ++$this->_position; + return $this->_nodeList->item($this->_position); + } + + /** + * Countable: get count + * + * @return int + */ + public function count() + { + return $this->_nodeList->length; + } +} diff --git a/libs/Zend/Exception.php b/libs/Zend/Exception.php new file mode 100644 index 0000000..599d8a0 --- /dev/null +++ b/libs/Zend/Exception.php @@ -0,0 +1,30 @@ + 'http://a9.com/-/spec/opensearchrss/1.0/', + 'atom' => 'http://www.w3.org/2005/Atom', + 'rss' => 'http://blogs.law.harvard.edu/tech/rss', + ); + + + /** + * Set the HTTP client instance + * + * Sets the HTTP client object to use for retrieving the feeds. + * + * @param Zend_Http_Client $httpClient + * @return void + */ + public static function setHttpClient(Zend_Http_Client $httpClient) + { + self::$_httpClient = $httpClient; + } + + + /** + * Gets the HTTP client object. If none is set, a new Zend_Http_Client will be used. + * + * @return Zend_Http_Client_Abstract + */ + public static function getHttpClient() + { + if (!self::$_httpClient instanceof Zend_Http_Client) { + /** + * @see Zend_Http_Client + */ + require_once 'Zend/Http/Client.php'; + self::$_httpClient = new Zend_Http_Client(); + } + + return self::$_httpClient; + } + + + /** + * Toggle using POST instead of PUT and DELETE HTTP methods + * + * Some feed implementations do not accept PUT and DELETE HTTP + * methods, or they can't be used because of proxies or other + * measures. This allows turning on using POST where PUT and + * DELETE would normally be used; in addition, an + * X-Method-Override header will be sent with a value of PUT or + * DELETE as appropriate. + * + * @param boolean $override Whether to override PUT and DELETE. + * @return void + */ + public static function setHttpMethodOverride($override = true) + { + self::$_httpMethodOverride = $override; + } + + + /** + * Get the HTTP override state + * + * @return boolean + */ + public static function getHttpMethodOverride() + { + return self::$_httpMethodOverride; + } + + + /** + * Get the full version of a namespace prefix + * + * Looks up a prefix (atom:, etc.) in the list of registered + * namespaces and returns the full namespace URI if + * available. Returns the prefix, unmodified, if it's not + * registered. + * + * @return string + */ + public static function lookupNamespace($prefix) + { + return isset(self::$_namespaces[$prefix]) ? + self::$_namespaces[$prefix] : + $prefix; + } + + + /** + * Add a namespace and prefix to the registered list + * + * Takes a prefix and a full namespace URI and adds them to the + * list of registered namespaces for use by + * Zend_Feed::lookupNamespace(). + * + * @param string $prefix The namespace prefix + * @param string $namespaceURI The full namespace URI + * @return void + */ + public static function registerNamespace($prefix, $namespaceURI) + { + self::$_namespaces[$prefix] = $namespaceURI; + } + + + /** + * Imports a feed located at $uri. + * + * @param string $uri + * @throws Zend_Feed_Exception + * @return Zend_Feed_Abstract + */ + public static function import($uri) + { + $client = self::getHttpClient(); + $client->setUri($uri); + $response = $client->request('GET'); + if ($response->getStatus() !== 200) { + /** + * @see Zend_Feed_Exception + */ + require_once 'Zend/Feed/Exception.php'; + throw new Zend_Feed_Exception('Feed failed to load, got response code ' . $response->getStatus()); + } + $feed = $response->getBody(); + return self::importString($feed); + } + + + /** + * Imports a feed represented by $string. + * + * @param string $string + * @throws Zend_Feed_Exception + * @return Zend_Feed_Abstract + */ + public static function importString($string) + { + // Load the feed as an XML DOMDocument object + @ini_set('track_errors', 1); + $doc = new DOMDocument; + $status = @$doc->loadXML($string); + @ini_restore('track_errors'); + + 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)'; + } + } + + /** + * @see Zend_Feed_Exception + */ + require_once 'Zend/Feed/Exception.php'; + throw new Zend_Feed_Exception("DOMDocument cannot parse XML: $php_errormsg"); + } + + // Try to find the base feed element or a single of an Atom feed + if ($doc->getElementsByTagName('feed')->item(0) || + $doc->getElementsByTagName('entry')->item(0)) { + /** + * @see Zend_Feed_Atom + */ + require_once 'Zend/Feed/Atom.php'; + // return a newly created Zend_Feed_Atom object + return new Zend_Feed_Atom(null, $string); + } + + // Try to find the base feed element of an RSS feed + if ($doc->getElementsByTagName('channel')->item(0)) { + /** + * @see Zend_Feed_Rss + */ + require_once 'Zend/Feed/Rss.php'; + // return a newly created Zend_Feed_Rss object + return new Zend_Feed_Rss(null, $string); + } + + // $string does not appear to be a valid feed of the supported types + /** + * @see Zend_Feed_Exception + */ + require_once 'Zend/Feed/Exception.php'; + throw new Zend_Feed_Exception('Invalid or unsupported feed format'); + } + + + /** + * Imports a feed from a file located at $filename. + * + * @param string $filename + * @throws Zend_Feed_Exception + * @return Zend_Feed_Abstract + */ + public static function importFile($filename) + { + @ini_set('track_errors', 1); + $feed = @file_get_contents($filename); + @ini_restore('track_errors'); + if ($feed === false) { + /** + * @see Zend_Feed_Exception + */ + require_once 'Zend/Feed/Exception.php'; + throw new Zend_Feed_Exception("File could not be loaded: $php_errormsg"); + } + return self::importString($feed); + } + + + /** + * Attempts to find feeds at $uri referenced by tags. Returns an + * array of the feeds referenced at $uri. + * + * @todo Allow findFeeds() to follow one, but only one, code 302. + * + * @param string $uri + * @throws Zend_Feed_Exception + * @return array + */ + public static function findFeeds($uri) + { + // Get the HTTP response from $uri and save the contents + $client = self::getHttpClient(); + $client->setUri($uri); + $response = $client->request(); + if ($response->getStatus() !== 200) { + /** + * @see Zend_Feed_Exception + */ + require_once 'Zend/Feed/Exception.php'; + throw new Zend_Feed_Exception("Failed to access $uri, got response code " . $response->getStatus()); + } + $contents = $response->getBody(); + + // Parse the contents for appropriate tags + @ini_set('track_errors', 1); + $pattern = '~(]+)/?>~i'; + $result = @preg_match_all($pattern, $contents, $matches); + @ini_restore('track_errors'); + if ($result === false) { + /** + * @see Zend_Feed_Exception + */ + require_once 'Zend/Feed/Exception.php'; + throw new Zend_Feed_Exception("Internal error: $php_errormsg"); + } + + // Try to fetch a feed for each link tag that appears to refer to a feed + $feeds = array(); + if (isset($matches[1]) && count($matches[1]) > 0) { + foreach ($matches[1] as $link) { + // force string to be an utf-8 one + if (!mb_check_encoding($link, 'UTF-8')) { + $link = mb_convert_encoding($link, 'UTF-8'); + } + $xml = @simplexml_load_string(rtrim($link, ' /') . ' />'); + if ($xml === false) { + continue; + } + $attributes = $xml->attributes(); + if (!isset($attributes['rel']) || !@preg_match('~^(?:alternate|service\.feed)~i', $attributes['rel'])) { + continue; + } + if (!isset($attributes['type']) || + !@preg_match('~^application/(?:atom|rss|rdf)\+xml~', $attributes['type'])) { + continue; + } + if (!isset($attributes['href'])) { + continue; + } + try { + // checks if we need to canonize the given uri + try { + $uri = Zend_Uri::factory((string) $attributes['href']); + } catch (Zend_Uri_Exception $e) { + // canonize the uri + $path = (string) $attributes['href']; + $query = $fragment = ''; + if (substr($path, 0, 1) != '/') { + // add the current root path to this one + $path = rtrim($client->getUri()->getPath(), '/') . '/' . $path; + } + if (strpos($path, '?') !== false) { + list($path, $query) = explode('?', $path, 2); + } + if (strpos($query, '#') !== false) { + list($query, $fragment) = explode('#', $query, 2); + } + $uri = Zend_Uri::factory($client->getUri(true)); + $uri->setPath($path); + $uri->setQuery($query); + $uri->setFragment($fragment); + } + + $feed = self::import($uri); + } catch (Exception $e) { + continue; + } + $feeds[] = $feed; + } + } + + // Return the fetched feeds + return $feeds; + } + + /** + * Construct a new Zend_Feed_Abstract object from a custom array + * + * @param array $data + * @param string $format (rss|atom) the requested output format + * @return Zend_Feed_Abstract + */ + public static function importArray(array $data, $format = 'atom') + { + $obj = 'Zend_Feed_' . ucfirst(strtolower($format)); + /** + * @see Zend_Loader + */ + require_once 'Zend/Loader.php'; + Zend_Loader::loadClass($obj); + Zend_Loader::loadClass('Zend_Feed_Builder'); + + return new $obj(null, null, new Zend_Feed_Builder($data)); + } + + /** + * Construct a new Zend_Feed_Abstract object from a Zend_Feed_Builder_Interface data source + * + * @param Zend_Feed_Builder_Interface $builder this object will be used to extract the data of the feed + * @param string $format (rss|atom) the requested output format + * @return Zend_Feed_Abstract + */ + public static function importBuilder(Zend_Feed_Builder_Interface $builder, $format = 'atom') + { + $obj = 'Zend_Feed_' . ucfirst(strtolower($format)); + /** + * @see Zend_Loader + */ + require_once 'Zend/Loader.php'; + Zend_Loader::loadClass($obj); + + return new $obj(null, null, $builder); + } +} diff --git a/libs/Zend/Feed/Abstract.php b/libs/Zend/Feed/Abstract.php new file mode 100644 index 0000000..be881d4 --- /dev/null +++ b/libs/Zend/Feed/Abstract.php @@ -0,0 +1,259 @@ +setUri($uri); + $response = $client->request('GET'); + if ($response->getStatus() !== 200) { + /** + * @see Zend_Feed_Exception + */ + require_once 'Zend/Feed/Exception.php'; + throw new Zend_Feed_Exception('Feed failed to load, got response code ' . $response->getStatus()); + } + $this->_element = $response->getBody(); + $this->__wakeup(); + } elseif ($string !== null) { + // Retrieve the feed from $string + $this->_element = $string; + $this->__wakeup(); + } else { + // Generate the feed from the array + $header = $builder->getHeader(); + $this->_element = new DOMDocument('1.0', $header['charset']); + $root = $this->_mapFeedHeaders($header); + $this->_mapFeedEntries($root, $builder->getEntries()); + $this->_element = $root; + $this->_buildEntryCache(); + } + } + + + /** + * Load the feed as an XML DOMDocument object + * + * @return void + * @throws Zend_Feed_Exception + */ + public function __wakeup() + { + @ini_set('track_errors', 1); + $doc = new DOMDocument; + $status = @$doc->loadXML($this->_element); + @ini_restore('track_errors'); + + 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)'; + } + } + + /** + * @see Zend_Feed_Exception + */ + require_once 'Zend/Feed/Exception.php'; + throw new Zend_Feed_Exception("DOMDocument cannot parse XML: $php_errormsg"); + } + + $this->_element = $doc; + } + + + /** + * Prepare for serialiation + * + * @return array + */ + public function __sleep() + { + $this->_element = $this->saveXML(); + + return array('_element'); + } + + + /** + * Cache the individual feed elements so they don't need to be + * searched for on every operation. + * + * @return void + */ + protected function _buildEntryCache() + { + $this->_entries = array(); + foreach ($this->_element->childNodes as $child) { + if ($child->localName == $this->_entryElementName) { + $this->_entries[] = $child; + } + } + } + + + /** + * Get the number of entries in this feed object. + * + * @return integer Entry count. + */ + public function count() + { + return count($this->_entries); + } + + + /** + * Required by the Iterator interface. + * + * @return void + */ + public function rewind() + { + $this->_entryIndex = 0; + } + + + /** + * Required by the Iterator interface. + * + * @return mixed The current row, or null if no rows. + */ + public function current() + { + return new $this->_entryClassName( + null, + $this->_entries[$this->_entryIndex]); + } + + + /** + * Required by the Iterator interface. + * + * @return mixed The current row number (starts at 0), or NULL if no rows + */ + public function key() + { + return $this->_entryIndex; + } + + + /** + * Required by the Iterator interface. + * + * @return mixed The next row, or null if no more rows. + */ + public function next() + { + ++$this->_entryIndex; + } + + + /** + * Required by the Iterator interface. + * + * @return boolean Whether the iteration is valid + */ + public function valid() + { + return 0 <= $this->_entryIndex && $this->_entryIndex < $this->count(); + } + + /** + * Generate the header of the feed when working in write mode + * + * @param array $array the data to use + * @return DOMElement root node + */ + abstract protected function _mapFeedHeaders($array); + + /** + * Generate the entries of the feed when working in write mode + * + * @param DOMElement $root the root node to use + * @param array $array the data to use + * @return DOMElement root node + */ + abstract protected function _mapFeedEntries(DOMElement $root, $array); + + /** + * Send feed to a http client with the correct header + * + * @throws Zend_Feed_Exception if headers have already been sent + * @return void + */ + abstract public function send(); +} diff --git a/libs/Zend/Feed/Atom.php b/libs/Zend/Feed/Atom.php new file mode 100644 index 0000000..cdadb48 --- /dev/null +++ b/libs/Zend/Feed/Atom.php @@ -0,0 +1,390 @@ + + * elements). + * + * @var string + */ + protected $_entryElementName = 'entry'; + + /** + * The default namespace for Atom feeds. + * + * @var string + */ + protected $_defaultNamespace = 'atom'; + + + /** + * Override Zend_Feed_Abstract to set up the $_element and $_entries aliases. + * + * @return void + * @throws Zend_Feed_Exception + */ + public function __wakeup() + { + parent::__wakeup(); + + // Find the base feed element and create an alias to it. + $element = $this->_element->getElementsByTagName('feed')->item(0); + if (!$element) { + // 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'; + throw new Zend_Feed_Exception('No root or <' . $this->_entryElementName + . '> element found, cannot parse feed.'); + } + + $doc = new DOMDocument($this->_element->version, + $this->_element->actualEncoding); + $feed = $doc->appendChild($doc->createElement('feed')); + $feed->appendChild($doc->importNode($element, true)); + $element = $feed; + } + + $this->_element = $element; + + // Find the entries and save a pointer to them for speed and + // simplicity. + $this->_buildEntryCache(); + } + + + /** + * Easy access to tags keyed by "rel" attributes. + * + * If $elt->link() is called with no arguments, we will attempt to + * return the value of the tag(s) like all other + * method-syntax attribute access. If an argument is passed to + * link(), however, then we will return the "href" value of the + * first tag that has a "rel" attribute matching $rel: + * + * $elt->link(): returns the value of the link tag. + * $elt->link('self'): returns the href from the first in the entry. + * + * @param string $rel The "rel" attribute to look for. + * @return mixed + */ + public function link($rel = null) + { + if ($rel === null) { + return parent::__call('link', null); + } + + // index link tags by their "rel" attribute. + $links = parent::__get('link'); + if (!is_array($links)) { + if ($links instanceof Zend_Feed_Element) { + $links = array($links); + } else { + return $links; + } + } + + foreach ($links as $link) { + if (empty($link['rel'])) { + continue; + } + if ($rel == $link['rel']) { + return $link['href']; + } + } + + return null; + } + + + /** + * Make accessing some individual elements of the feed easier. + * + * Special accessors 'entry' and 'entries' are provided so that if + * you wish to iterate over an Atom feed's entries, you can do so + * using foreach ($feed->entries as $entry) or foreach + * ($feed->entry as $entry). + * + * @param string $var The property to access. + * @return mixed + */ + public function __get($var) + { + switch ($var) { + case 'entry': + // fall through to the next case + case 'entries': + return $this; + + default: + return parent::__get($var); + } + } + + /** + * Generate the header of the feed when working in write mode + * + * @param array $array the data to use + * @return DOMElement root node + */ + protected function _mapFeedHeaders($array) + { + $feed = $this->_element->createElement('feed'); + $feed->setAttribute('xmlns', 'http://www.w3.org/2005/Atom'); + + $id = $this->_element->createElement('id', $array->link); + $feed->appendChild($id); + + $title = $this->_element->createElement('title'); + $title->appendChild($this->_element->createCDATASection($array->title)); + $feed->appendChild($title); + + if (isset($array->author)) { + $author = $this->_element->createElement('author'); + $name = $this->_element->createElement('name', $array->author); + $author->appendChild($name); + if (isset($array->email)) { + $email = $this->_element->createElement('email', $array->email); + $author->appendChild($email); + } + $feed->appendChild($author); + } + + $updated = isset($array->lastUpdate) ? $array->lastUpdate : time(); + $updated = $this->_element->createElement('updated', date(DATE_ATOM, $updated)); + $feed->appendChild($updated); + + if (isset($array->published)) { + $published = $this->_element->createElement('published', date(DATE_ATOM, $array->published)); + $feed->appendChild($published); + } + + $link = $this->_element->createElement('link'); + $link->setAttribute('rel', 'self'); + $link->setAttribute('href', $array->link); + if (isset($array->language)) { + $link->setAttribute('hreflang', $array->language); + } + $feed->appendChild($link); + + if (isset($array->description)) { + $subtitle = $this->_element->createElement('subtitle'); + $subtitle->appendChild($this->_element->createCDATASection($array->description)); + $feed->appendChild($subtitle); + } + + if (isset($array->copyright)) { + $copyright = $this->_element->createElement('rights', $array->copyright); + $feed->appendChild($copyright); + } + + if (isset($array->image)) { + $image = $this->_element->createElement('logo', $array->image); + $feed->appendChild($image); + } + + $generator = !empty($array->generator) ? $array->generator : 'Zend_Feed'; + $generator = $this->_element->createElement('generator', $generator); + $feed->appendChild($generator); + + return $feed; + } + + /** + * Generate the entries of the feed when working in write mode + * + * The following nodes are constructed for each feed entry + * + * url to feed entry + * entry title + * last update + * + * short text + * long version, can contain html + * + * + * @param array $array the data to use + * @param DOMElement $root the root node to use + * @return void + */ + protected function _mapFeedEntries(DOMElement $root, $array) + { + foreach ($array as $dataentry) { + $entry = $this->_element->createElement('entry'); + + $id = $this->_element->createElement('id', isset($dataentry->guid) ? $dataentry->guid : $dataentry->link); + $entry->appendChild($id); + + $title = $this->_element->createElement('title'); + $title->appendChild($this->_element->createCDATASection($dataentry->title)); + $entry->appendChild($title); + + $updated = isset($dataentry->lastUpdate) ? $dataentry->lastUpdate : time(); + $updated = $this->_element->createElement('updated', date(DATE_ATOM, $updated)); + $entry->appendChild($updated); + + $link = $this->_element->createElement('link'); + $link->setAttribute('rel', 'alternate'); + $link->setAttribute('href', $dataentry->link); + $entry->appendChild($link); + + $summary = $this->_element->createElement('summary'); + $summary->appendChild($this->_element->createCDATASection($dataentry->description)); + $entry->appendChild($summary); + + if (isset($dataentry->content)) { + $content = $this->_element->createElement('content'); + $content->setAttribute('type', 'html'); + $content->appendChild($this->_element->createCDATASection($dataentry->content)); + $entry->appendChild($content); + } + + if (isset($dataentry->category)) { + foreach ($dataentry->category as $category) { + $node = $this->_element->createElement('category'); + $node->setAttribute('term', $category['term']); + if (isset($category['scheme'])) { + $node->setAttribute('scheme', $category['scheme']); + } + $entry->appendChild($node); + } + } + + if (isset($dataentry->source)) { + $source = $this->_element->createElement('source'); + $title = $this->_element->createElement('title', $dataentry->source['title']); + $source->appendChild($title); + $link = $this->_element->createElement('link', $dataentry->source['title']); + $link->setAttribute('rel', 'alternate'); + $link->setAttribute('href', $dataentry->source['url']); + $source->appendChild($link); + } + + if (isset($dataentry->enclosure)) { + foreach ($dataentry->enclosure as $enclosure) { + $node = $this->_element->createElement('link'); + $node->setAttribute('rel', 'enclosure'); + $node->setAttribute('href', $enclosure['url']); + if (isset($enclosure['type'])) { + $node->setAttribute('type', $enclosure['type']); + } + if (isset($enclosure['length'])) { + $node->setAttribute('length', $enclosure['length']); + } + $entry->appendChild($node); + } + } + + if (isset($dataentry->comments)) { + $comments = $this->_element->createElementNS('http://wellformedweb.org/CommentAPI/', + 'wfw:comment', + $dataentry->comments); + $entry->appendChild($comments); + } + if (isset($dataentry->commentRss)) { + $comments = $this->_element->createElementNS('http://wellformedweb.org/CommentAPI/', + 'wfw:commentRss', + $dataentry->commentRss); + $entry->appendChild($comments); + } + + $root->appendChild($entry); + } + } + + /** + * Override Zend_Feed_Element to allow formated feeds + * + * @return string + */ + public function saveXml() + { + // Return a complete document including XML prologue. + $doc = new DOMDocument($this->_element->ownerDocument->version, + $this->_element->ownerDocument->actualEncoding); + $doc->appendChild($doc->importNode($this->_element, true)); + $doc->formatOutput = true; + + return $doc->saveXML(); + } + + /** + * Send feed to a http client with the correct header + * + * @return void + * @throws Zend_Feed_Exception if headers have already been sent + */ + public function send() + { + if (headers_sent()) { + /** + * @see Zend_Feed_Exception + */ + require_once 'Zend/Feed/Exception.php'; + throw new Zend_Feed_Exception('Cannot send ATOM because headers have already been sent.'); + } + + header('Content-Type: application/atom+xml; charset=' . $this->_element->ownerDocument->actualEncoding); + + echo $this->saveXML(); + } +} diff --git a/libs/Zend/Feed/Builder.php b/libs/Zend/Feed/Builder.php new file mode 100644 index 0000000..343a312 --- /dev/null +++ b/libs/Zend/Feed/Builder.php @@ -0,0 +1,395 @@ + + * array( + * 'title' => 'title of the feed', //required + * 'link' => 'canonical url to the feed', //required + * 'lastUpdate' => 'timestamp of the update date', // optional + * 'published' => 'timestamp of the publication date', //optional + * 'charset' => 'charset', // required + * 'description' => 'short description of the feed', //optional + * 'author' => 'author/publisher of the feed', //optional + * 'email' => 'email of the author', //optional + * 'webmaster' => 'email address for person responsible for technical issues' // optional, ignored if atom is used + * 'copyright' => 'copyright notice', //optional + * 'image' => 'url to image', //optional + * 'generator' => 'generator', // optional + * 'language' => 'language the feed is written in', // optional + * 'ttl' => 'how long in minutes a feed can be cached before refreshing', // optional, ignored if atom is used + * 'rating' => 'The PICS rating for the channel.', // optional, ignored if atom is used + * 'cloud' => array( + * 'domain' => 'domain of the cloud, e.g. rpc.sys.com' // required + * 'port' => 'port to connect to' // optional, default to 80 + * 'path' => 'path of the cloud, e.g. /RPC2 //required + * 'registerProcedure' => 'procedure to call, e.g. myCloud.rssPleaseNotify' // required + * 'protocol' => 'protocol to use, e.g. soap or xml-rpc' // required + * ), a cloud to be notified of updates // optional, ignored if atom is used + * 'textInput' => array( + * 'title' => 'the label of the Submit button in the text input area' // required, + * 'description' => 'explains the text input area' // required + * 'name' => 'the name of the text object in the text input area' // required + * 'link' => 'the URL of the CGI script that processes text input requests' // required + * ) // a text input box that can be displayed with the feed // optional, ignored if atom is used + * 'skipHours' => array( + * 'hour in 24 format', // e.g 13 (1pm) + * // up to 24 rows whose value is a number between 0 and 23 + * ) // Hint telling aggregators which hours they can skip // optional, ignored if atom is used + * 'skipDays ' => array( + * 'a day to skip', // e.g Monday + * // up to 7 rows whose value is a Monday, Tuesday, Wednesday, Thursday, Friday, Saturday or Sunday + * ) // Hint telling aggregators which days they can skip // optional, ignored if atom is used + * 'itunes' => array( + * 'author' => 'Artist column' // optional, default to the main author value + * 'owner' => array( + * 'name' => 'name of the owner' // optional, default to main author value + * 'email' => 'email of the owner' // optional, default to main email value + * ) // Owner of the podcast // optional + * 'image' => 'album/podcast art' // optional, default to the main image value + * 'subtitle' => 'short description' // optional, default to the main description value + * 'summary' => 'longer description' // optional, default to the main description value + * 'block' => 'Prevent an episode from appearing (yes|no)' // optional + * 'category' => array( + * array('main' => 'main category', // required + * 'sub' => 'sub category' // optional + * ), + * // up to 3 rows + * ) // 'Category column and in iTunes Music Store Browse' // required + * 'explicit' => 'parental advisory graphic (yes|no|clean)' // optional + * 'keywords' => 'a comma separated list of 12 keywords maximum' // optional + * 'new-feed-url' => 'used to inform iTunes of new feed URL location' // optional + * ) // Itunes extension data // optional, ignored if atom is used + * 'entries' => array( + * array( + * 'title' => 'title of the feed entry', //required + * 'link' => 'url to a feed entry', //required + * 'description' => 'short version of a feed entry', // only text, no html, required + * 'guid' => 'id of the article, if not given link value will used', //optional + * 'content' => 'long version', // can contain html, optional + * 'lastUpdate' => 'timestamp of the publication date', // optional + * 'comments' => 'comments page of the feed entry', // optional + * 'commentRss' => 'the feed url of the associated comments', // optional + * 'source' => array( + * 'title' => 'title of the original source' // required, + * 'url' => 'url of the original source' // required + * ) // original source of the feed entry // optional + * 'category' => array( + * array( + * 'term' => 'first category label' // required, + * 'scheme' => 'url that identifies a categorization scheme' // optional + * ), + * array( + * //data for the second category and so on + * ) + * ) // list of the attached categories // optional + * 'enclosure' => array( + * array( + * 'url' => 'url of the linked enclosure' // required + * 'type' => 'mime type of the enclosure' // optional + * 'length' => 'length of the linked content in octets' // optional + * ), + * array( + * //data for the second enclosure and so on + * ) + * ) // list of the enclosures of the feed entry // optional + * ), + * array( + * //data for the second entry and so on + * ) + * ) + * ); + * + * + * @param array $data + * @return void + */ + public function __construct(array $data) + { + $this->_data = $data; + $this->_createHeader($data); + if (isset($data['entries'])) { + $this->_createEntries($data['entries']); + } + } + + /** + * Returns an instance of Zend_Feed_Builder_Header + * describing the header of the feed + * + * @return Zend_Feed_Builder_Header + */ + public function getHeader() + { + return $this->_header; + } + + /** + * Returns an array of Zend_Feed_Builder_Entry instances + * describing the entries of the feed + * + * @return array of Zend_Feed_Builder_Entry + */ + public function getEntries() + { + return $this->_entries; + } + + /** + * Create the Zend_Feed_Builder_Header instance + * + * @param array $data + * @throws Zend_Feed_Builder_Exception + * @return void + */ + private function _createHeader(array $data) + { + $mandatories = array('title', 'link', 'charset'); + foreach ($mandatories as $mandatory) { + if (!isset($data[$mandatory])) { + /** + * @see Zend_Feed_Builder_Exception + */ + require_once 'Zend/Feed/Builder/Exception.php'; + throw new Zend_Feed_Builder_Exception("$mandatory key is missing"); + } + } + $this->_header = new Zend_Feed_Builder_Header($data['title'], $data['link'], $data['charset']); + if (isset($data['lastUpdate'])) { + $this->_header->setLastUpdate($data['lastUpdate']); + } + if (isset($data['published'])) { + $this->_header->setPublishedDate($data['published']); + } + if (isset($data['description'])) { + $this->_header->setDescription($data['description']); + } + if (isset($data['author'])) { + $this->_header->setAuthor($data['author']); + } + if (isset($data['email'])) { + $this->_header->setEmail($data['email']); + } + if (isset($data['webmaster'])) { + $this->_header->setWebmaster($data['webmaster']); + } + if (isset($data['copyright'])) { + $this->_header->setCopyright($data['copyright']); + } + if (isset($data['image'])) { + $this->_header->setImage($data['image']); + } + if (isset($data['generator'])) { + $this->_header->setGenerator($data['generator']); + } + if (isset($data['language'])) { + $this->_header->setLanguage($data['language']); + } + if (isset($data['ttl'])) { + $this->_header->setTtl($data['ttl']); + } + if (isset($data['rating'])) { + $this->_header->setRating($data['rating']); + } + if (isset($data['cloud'])) { + $mandatories = array('domain', 'path', 'registerProcedure', 'protocol'); + foreach ($mandatories as $mandatory) { + if (!isset($data['cloud'][$mandatory])) { + /** + * @see Zend_Feed_Builder_Exception + */ + require_once 'Zend/Feed/Builder/Exception.php'; + throw new Zend_Feed_Builder_Exception("you have to define $mandatory property of your cloud"); + } + } + $uri_str = 'http://' . $data['cloud']['domain'] . $data['cloud']['path']; + $this->_header->setCloud($uri_str, $data['cloud']['registerProcedure'], $data['cloud']['protocol']); + } + if (isset($data['textInput'])) { + $mandatories = array('title', 'description', 'name', 'link'); + foreach ($mandatories as $mandatory) { + if (!isset($data['textInput'][$mandatory])) { + /** + * @see Zend_Feed_Builder_Exception + */ + require_once 'Zend/Feed/Builder/Exception.php'; + throw new Zend_Feed_Builder_Exception("you have to define $mandatory property of your textInput"); + } + } + $this->_header->setTextInput($data['textInput']['title'], + $data['textInput']['description'], + $data['textInput']['name'], + $data['textInput']['link']); + } + if (isset($data['skipHours'])) { + $this->_header->setSkipHours($data['skipHours']); + } + if (isset($data['skipDays'])) { + $this->_header->setSkipDays($data['skipDays']); + } + if (isset($data['itunes'])) { + $itunes = new Zend_Feed_Builder_Header_Itunes($data['itunes']['category']); + if (isset($data['itunes']['author'])) { + $itunes->setAuthor($data['itunes']['author']); + } + if (isset($data['itunes']['owner'])) { + $name = isset($data['itunes']['owner']['name']) ? $data['itunes']['owner']['name'] : ''; + $email = isset($data['itunes']['owner']['email']) ? $data['itunes']['owner']['email'] : ''; + $itunes->setOwner($name, $email); + } + if (isset($data['itunes']['image'])) { + $itunes->setImage($data['itunes']['image']); + } + if (isset($data['itunes']['subtitle'])) { + $itunes->setSubtitle($data['itunes']['subtitle']); + } + if (isset($data['itunes']['summary'])) { + $itunes->setSummary($data['itunes']['summary']); + } + if (isset($data['itunes']['block'])) { + $itunes->setBlock($data['itunes']['block']); + } + if (isset($data['itunes']['explicit'])) { + $itunes->setExplicit($data['itunes']['explicit']); + } + if (isset($data['itunes']['keywords'])) { + $itunes->setKeywords($data['itunes']['keywords']); + } + if (isset($data['itunes']['new-feed-url'])) { + $itunes->setNewFeedUrl($data['itunes']['new-feed-url']); + } + + $this->_header->setITunes($itunes); + } + } + + /** + * Create the array of article entries + * + * @param array $data + * @throws Zend_Feed_Builder_Exception + * @return void + */ + private function _createEntries(array $data) + { + foreach ($data as $row) { + $mandatories = array('title', 'link', 'description'); + foreach ($mandatories as $mandatory) { + if (!isset($row[$mandatory])) { + /** + * @see Zend_Feed_Builder_Exception + */ + require_once 'Zend/Feed/Builder/Exception.php'; + throw new Zend_Feed_Builder_Exception("$mandatory key is missing"); + } + } + $entry = new Zend_Feed_Builder_Entry($row['title'], $row['link'], $row['description']); + if (isset($row['guid'])) { + $entry->setId($row['guid']); + } + if (isset($row['content'])) { + $entry->setContent($row['content']); + } + if (isset($row['lastUpdate'])) { + $entry->setLastUpdate($row['lastUpdate']); + } + if (isset($row['comments'])) { + $entry->setCommentsUrl($row['comments']); + } + if (isset($row['commentRss'])) { + $entry->setCommentsRssUrl($row['commentRss']); + } + if (isset($row['source'])) { + $mandatories = array('title', 'url'); + foreach ($mandatories as $mandatory) { + if (!isset($row['source'][$mandatory])) { + /** + * @see Zend_Feed_Builder_Exception + */ + require_once 'Zend/Feed/Builder/Exception.php'; + throw new Zend_Feed_Builder_Exception("$mandatory key of source property is missing"); + } + } + $entry->setSource($row['source']['title'], $row['source']['url']); + } + if (isset($row['category'])) { + $entry->setCategories($row['category']); + } + if (isset($row['enclosure'])) { + $entry->setEnclosures($row['enclosure']); + } + + $this->_entries[] = $entry; + } + } +} \ No newline at end of file diff --git a/libs/Zend/Feed/Builder/Entry.php b/libs/Zend/Feed/Builder/Entry.php new file mode 100644 index 0000000..0482ca8 --- /dev/null +++ b/libs/Zend/Feed/Builder/Entry.php @@ -0,0 +1,285 @@ +offsetSet('title', $title); + $this->offsetSet('link', $link); + $this->offsetSet('description', $description); + $this->setLastUpdate(time()); + } + + /** + * Read only properties accessor + * + * @param string $name property to read + * @return mixed + */ + public function __get($name) + { + if (!$this->offsetExists($name)) { + return NULL; + } + + return $this->offsetGet($name); + } + + /** + * Write properties accessor + * + * @param string $name name of the property to set + * @param mixed $value value to set + * @return void + */ + public function __set($name, $value) + { + $this->offsetSet($name, $value); + } + + /** + * Isset accessor + * + * @param string $key + * @return boolean + */ + public function __isset($key) + { + return $this->offsetExists($key); + } + + /** + * Unset accessor + * + * @param string $key + * @return void + */ + public function __unset($key) + { + if ($this->offsetExists($key)) { + $this->offsetUnset($key); + } + } + + /** + * Sets the id/guid of the entry + * + * @param string $id + * @return Zend_Feed_Builder_Entry + */ + public function setId($id) + { + $this->offsetSet('guid', $id); + return $this; + } + + /** + * Sets the full html content of the entry + * + * @param string $content + * @return Zend_Feed_Builder_Entry + */ + public function setContent($content) + { + $this->offsetSet('content', $content); + return $this; + } + + /** + * Timestamp of the update date + * + * @param int $lastUpdate + * @return Zend_Feed_Builder_Entry + */ + public function setLastUpdate($lastUpdate) + { + $this->offsetSet('lastUpdate', $lastUpdate); + return $this; + } + + /** + * Sets the url of the commented page associated to the entry + * + * @param string $comments + * @return Zend_Feed_Builder_Entry + */ + public function setCommentsUrl($comments) + { + $this->offsetSet('comments', $comments); + return $this; + } + + /** + * Sets the url of the comments feed link + * + * @param string $commentRss + * @return Zend_Feed_Builder_Entry + */ + public function setCommentsRssUrl($commentRss) + { + $this->offsetSet('commentRss', $commentRss); + return $this; + } + + /** + * Defines a reference to the original source + * + * @param string $title + * @param string $url + * @return Zend_Feed_Builder_Entry + */ + public function setSource($title, $url) + { + $this->offsetSet('source', array('title' => $title, + 'url' => $url)); + return $this; + } + + /** + * Sets the categories of the entry + * Format of the array: + * + * array( + * array( + * 'term' => 'first category label', + * 'scheme' => 'url that identifies a categorization scheme' // optional + * ), + * // second category and so one + * ) + * + * + * @param array $categories + * @return Zend_Feed_Builder_Entry + */ + public function setCategories(array $categories) + { + foreach ($categories as $category) { + $this->addCategory($category); + } + return $this; + } + + /** + * Add a category to the entry + * + * @param array $category see Zend_Feed_Builder_Entry::setCategories() for format + * @return Zend_Feed_Builder_Entry + * @throws Zend_Feed_Builder_Exception + */ + public function addCategory(array $category) + { + if (empty($category['term'])) { + /** + * @see Zend_Feed_Builder_Exception + */ + require_once 'Zend/Feed/Builder/Exception.php'; + throw new Zend_Feed_Builder_Exception("you have to define the name of the category"); + } + + if (!$this->offsetExists('category')) { + $categories = array($category); + } else { + $categories = $this->offsetGet('category'); + $categories[] = $category; + } + $this->offsetSet('category', $categories); + return $this; + } + + /** + * Sets the enclosures of the entry + * Format of the array: + * + * array( + * array( + * 'url' => 'url of the linked enclosure', + * 'type' => 'mime type of the enclosure' // optional + * 'length' => 'length of the linked content in octets' // optional + * ), + * // second enclosure and so one + * ) + * + * + * @param array $enclosures + * @return Zend_Feed_Builder_Entry + * @throws Zend_Feed_Builder_Exception + */ + public function setEnclosures(array $enclosures) + { + foreach ($enclosures as $enclosure) { + if (empty($enclosure['url'])) { + /** + * @see Zend_Feed_Builder_Exception + */ + require_once 'Zend/Feed/Builder/Exception.php'; + throw new Zend_Feed_Builder_Exception("you have to supply an url for your enclosure"); + } + $type = isset($enclosure['type']) ? $enclosure['type'] : ''; + $length = isset($enclosure['length']) ? $enclosure['length'] : ''; + $this->addEnclosure($enclosure['url'], $type, $length); + } + return $this; + } + + /** + * Add an enclosure to the entry + * + * @param string $url + * @param string $type + * @param string $length + * @return Zend_Feed_Builder_Entry + */ + public function addEnclosure($url, $type = '', $length = '') + { + if (!$this->offsetExists('enclosure')) { + $enclosure = array(); + } else { + $enclosure = $this->offsetGet('enclosure'); + } + $enclosure[] = array('url' => $url, + 'type' => $type, + 'length' => $length); + $this->offsetSet('enclosure', $enclosure); + return $this; + } +} diff --git a/libs/Zend/Feed/Builder/Exception.php b/libs/Zend/Feed/Builder/Exception.php new file mode 100644 index 0000000..d2efcab --- /dev/null +++ b/libs/Zend/Feed/Builder/Exception.php @@ -0,0 +1,40 @@ +offsetSet('title', $title); + $this->offsetSet('link', $link); + $this->offsetSet('charset', $charset); + $this->setLastUpdate(time()) + ->setGenerator('Zend_Feed'); + } + + /** + * Read only properties accessor + * + * @param string $name property to read + * @return mixed + */ + public function __get($name) + { + if (!$this->offsetExists($name)) { + return NULL; + } + + return $this->offsetGet($name); + } + + /** + * Write properties accessor + * + * @param string $name name of the property to set + * @param mixed $value value to set + * @return void + */ + public function __set($name, $value) + { + $this->offsetSet($name, $value); + } + + /** + * Isset accessor + * + * @param string $key + * @return boolean + */ + public function __isset($key) + { + return $this->offsetExists($key); + } + + /** + * Unset accessor + * + * @param string $key + * @return void + */ + public function __unset($key) + { + if ($this->offsetExists($key)) { + $this->offsetUnset($key); + } + } + + /** + * Timestamp of the update date + * + * @param int $lastUpdate + * @return Zend_Feed_Builder_Header + */ + public function setLastUpdate($lastUpdate) + { + $this->offsetSet('lastUpdate', $lastUpdate); + return $this; + } + + /** + * Timestamp of the publication date + * + * @param int $published + * @return Zend_Feed_Builder_Header + */ + public function setPublishedDate($published) + { + $this->offsetSet('published', $published); + return $this; + } + + /** + * Short description of the feed + * + * @param string $description + * @return Zend_Feed_Builder_Header + */ + public function setDescription($description) + { + $this->offsetSet('description', $description); + return $this; + } + + /** + * Sets the author of the feed + * + * @param string $author + * @return Zend_Feed_Builder_Header + */ + public function setAuthor($author) + { + $this->offsetSet('author', $author); + return $this; + } + + /** + * Sets the author's email + * + * @param string $email + * @return Zend_Feed_Builder_Header + * @throws Zend_Feed_Builder_Exception + */ + public function setEmail($email) + { + Zend_Loader::loadClass('Zend_Validate_EmailAddress'); + $validate = new Zend_Validate_EmailAddress(); + if (!$validate->isValid($email)) { + /** + * @see Zend_Feed_Builder_Exception + */ + require_once 'Zend/Feed/Builder/Exception.php'; + throw new Zend_Feed_Builder_Exception("you have to set a valid email address into the email property"); + } + $this->offsetSet('email', $email); + return $this; + } + + /** + * Sets the copyright notice + * + * @param string $copyright + * @return Zend_Feed_Builder_Header + */ + public function setCopyright($copyright) + { + $this->offsetSet('copyright', $copyright); + return $this; + } + + /** + * Sets the image of the feed + * + * @param string $image + * @return Zend_Feed_Builder_Header + */ + public function setImage($image) + { + $this->offsetSet('image', $image); + return $this; + } + + /** + * Sets the generator of the feed + * + * @param string $generator + * @return Zend_Feed_Builder_Header + */ + public function setGenerator($generator) + { + $this->offsetSet('generator', $generator); + return $this; + } + + /** + * Sets the language of the feed + * + * @param string $language + * @return Zend_Feed_Builder_Header + */ + public function setLanguage($language) + { + $this->offsetSet('language', $language); + return $this; + } + + /** + * Email address for person responsible for technical issues + * Ignored if atom is used + * + * @param string $webmaster + * @return Zend_Feed_Builder_Header + * @throws Zend_Feed_Builder_Exception + */ + public function setWebmaster($webmaster) + { + Zend_Loader::loadClass('Zend_Validate_EmailAddress'); + $validate = new Zend_Validate_EmailAddress(); + if (!$validate->isValid($webmaster)) { + /** + * @see Zend_Feed_Builder_Exception + */ + require_once 'Zend/Feed/Builder/Exception.php'; + throw new Zend_Feed_Builder_Exception("you have to set a valid email address into the webmaster property"); + } + $this->offsetSet('webmaster', $webmaster); + return $this; + } + + /** + * How long in minutes a feed can be cached before refreshing + * Ignored if atom is used + * + * @param int $ttl + * @return Zend_Feed_Builder_Header + * @throws Zend_Feed_Builder_Exception + */ + public function setTtl($ttl) + { + Zend_Loader::loadClass('Zend_Validate_Int'); + $validate = new Zend_Validate_Int(); + if (!$validate->isValid($ttl)) { + /** + * @see Zend_Feed_Builder_Exception + */ + require_once 'Zend/Feed/Builder/Exception.php'; + throw new Zend_Feed_Builder_Exception("you have to set an integer value to the ttl property"); + } + $this->offsetSet('ttl', $ttl); + return $this; + } + + /** + * PICS rating for the feed + * Ignored if atom is used + * + * @param string $rating + * @return Zend_Feed_Builder_Header + */ + public function setRating($rating) + { + $this->offsetSet('rating', $rating); + return $this; + } + + /** + * Cloud to be notified of updates of the feed + * Ignored if atom is used + * + * @param string|Zend_Uri_Http $uri + * @param string $procedure procedure to call, e.g. myCloud.rssPleaseNotify + * @param string $protocol protocol to use, e.g. soap or xml-rpc + * @return Zend_Feed_Builder_Header + * @throws Zend_Feed_Builder_Exception + */ + public function setCloud($uri, $procedure, $protocol) + { + if (is_string($uri) && Zend_Uri_Http::check($uri)) { + $uri = Zend_Uri::factory($uri); + } + if (!$uri instanceof Zend_Uri_Http) { + /** + * @see Zend_Feed_Builder_Exception + */ + require_once 'Zend/Feed/Builder/Exception.php'; + throw new Zend_Feed_Builder_Exception('Passed parameter is not a valid HTTP URI'); + } + if (!$uri->getPort()) { + $uri->setPort(80); + } + $this->offsetSet('cloud', array('uri' => $uri, + 'procedure' => $procedure, + 'protocol' => $protocol)); + return $this; + } + + /** + * A text input box that can be displayed with the feed + * Ignored if atom is used + * + * @param string $title the label of the Submit button in the text input area + * @param string $description explains the text input area + * @param string $name the name of the text object in the text input area + * @param string $link the URL of the CGI script that processes text input requests + * @return Zend_Feed_Builder_Header + */ + public function setTextInput($title, $description, $name, $link) + { + $this->offsetSet('textInput', array('title' => $title, + 'description' => $description, + 'name' => $name, + 'link' => $link)); + return $this; + } + + /** + * Hint telling aggregators which hours they can skip + * Ignored if atom is used + * + * @param array $hours list of hours in 24 format + * @return Zend_Feed_Builder_Header + * @throws Zend_Feed_Builder_Exception + */ + public function setSkipHours(array $hours) + { + if (count($hours) > 24) { + /** + * @see Zend_Feed_Builder_Exception + */ + require_once 'Zend/Feed/Builder/Exception.php'; + throw new Zend_Feed_Builder_Exception("you can not have more than 24 rows in the skipHours property"); + } + foreach ($hours as $hour) { + if ($hour < 0 || $hour > 23) { + /** + * @see Zend_Feed_Builder_Exception + */ + require_once 'Zend/Feed/Builder/Exception.php'; + throw new Zend_Feed_Builder_Exception("$hour has te be between 0 and 23"); + } + } + $this->offsetSet('skipHours', $hours); + return $this; + } + + /** + * Hint telling aggregators which days they can skip + * Ignored if atom is used + * + * @param array $days list of days to skip, e.g. Monday + * @return Zend_Feed_Builder_Header + * @throws Zend_Feed_Builder_Exception + */ + public function setSkipDays(array $days) + { + if (count($days) > 7) { + /** + * @see Zend_Feed_Builder_Exception + */ + require_once 'Zend/Feed/Builder/Exception.php'; + throw new Zend_Feed_Builder_Exception("you can not have more than 7 days in the skipDays property"); + } + $valid = array('monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday'); + foreach ($days as $day) { + if (!in_array(strtolower($day), $valid)) { + /** + * @see Zend_Feed_Builder_Exception + */ + require_once 'Zend/Feed/Builder/Exception.php'; + throw new Zend_Feed_Builder_Exception("$day is not a valid day"); + } + } + $this->offsetSet('skipDays', $days); + return $this; + } + + /** + * Sets the iTunes rss extension + * + * @param Zend_Feed_Builder_Header_Itunes $itunes + * @return Zend_Feed_Builder_Header + */ + public function setITunes(Zend_Feed_Builder_Header_Itunes $itunes) + { + $this->offsetSet('itunes', $itunes); + return $this; + } +} diff --git a/libs/Zend/Feed/Builder/Header/Itunes.php b/libs/Zend/Feed/Builder/Header/Itunes.php new file mode 100644 index 0000000..b8c3cff --- /dev/null +++ b/libs/Zend/Feed/Builder/Header/Itunes.php @@ -0,0 +1,285 @@ +setCategories($categories); + } + + /** + * Sets the categories column and in iTunes Music Store Browse + * $categories must conform to the following format: + * + * array(array('main' => 'main category', + * 'sub' => 'sub category' // optionnal + * ), + * // up to 3 rows + * ) + * + * + * @param array $categories + * @return Zend_Feed_Builder_Header_Itunes + * @throws Zend_Feed_Builder_Exception + */ + public function setCategories(array $categories) + { + $nb = count($categories); + if (0 === $nb) { + /** + * @see Zend_Feed_Builder_Exception + */ + require_once 'Zend/Feed/Builder/Exception.php'; + throw new Zend_Feed_Builder_Exception("you have to set at least one itunes category"); + } + if ($nb > 3) { + /** + * @see Zend_Feed_Builder_Exception + */ + require_once 'Zend/Feed/Builder/Exception.php'; + throw new Zend_Feed_Builder_Exception("you have to set at most three itunes categories"); + } + foreach ($categories as $i => $category) { + if (empty($category['main'])) { + /** + * @see Zend_Feed_Builder_Exception + */ + require_once 'Zend/Feed/Builder/Exception.php'; + throw new Zend_Feed_Builder_Exception("you have to set the main category (category #$i)"); + } + } + $this->offsetSet('category', $categories); + return $this; + } + + /** + * Sets the artist value, default to the feed's author value + * + * @param string $author + * @return Zend_Feed_Builder_Header_Itunes + */ + public function setAuthor($author) + { + $this->offsetSet('author', $author); + return $this; + } + + /** + * Sets the owner of the postcast + * + * @param string $name default to the feed's author value + * @param string $email default to the feed's email value + * @return Zend_Feed_Builder_Header_Itunes + * @throws Zend_Feed_Builder_Exception + */ + public function setOwner($name = '', $email = '') + { + if (!empty($email)) { + Zend_Loader::loadClass('Zend_Validate_EmailAddress'); + $validate = new Zend_Validate_EmailAddress(); + if (!$validate->isValid($email)) { + /** + * @see Zend_Feed_Builder_Exception + */ + require_once 'Zend/Feed/Builder/Exception.php'; + throw new Zend_Feed_Builder_Exception("you have to set a valid email address into the itunes owner's email property"); + } + } + $this->offsetSet('owner', array('name' => $name, 'email' => $email)); + return $this; + } + + /** + * Sets the album/podcast art picture + * Default to the feed's image value + * + * @param string $image + * @return Zend_Feed_Builder_Header_Itunes + */ + public function setImage($image) + { + $this->offsetSet('image', $image); + return $this; + } + + /** + * Sets the short description of the podcast + * Default to the feed's description + * + * @param string $subtitle + * @return Zend_Feed_Builder_Header_Itunes + */ + public function setSubtitle($subtitle) + { + $this->offsetSet('subtitle', $subtitle); + return $this; + } + + /** + * Sets the longer description of the podcast + * Default to the feed's description + * + * @param string $summary + * @return Zend_Feed_Builder_Header_Itunes + */ + public function setSummary($summary) + { + $this->offsetSet('summary', $summary); + return $this; + } + + /** + * Prevent a feed from appearing + * + * @param string $block can be 'yes' or 'no' + * @return Zend_Feed_Builder_Header_Itunes + * @throws Zend_Feed_Builder_Exception + */ + public function setBlock($block) + { + $block = strtolower($block); + if (!in_array($block, array('yes', 'no'))) { + /** + * @see Zend_Feed_Builder_Exception + */ + require_once 'Zend/Feed/Builder/Exception.php'; + throw new Zend_Feed_Builder_Exception("you have to set yes or no to the itunes block property"); + } + $this->offsetSet('block', $block); + return $this; + } + + /** + * Configuration of the parental advisory graphic + * + * @param string $explicit can be 'yes', 'no' or 'clean' + * @return Zend_Feed_Builder_Header_Itunes + * @throws Zend_Feed_Builder_Exception + */ + public function setExplicit($explicit) + { + $explicit = strtolower($explicit); + if (!in_array($explicit, array('yes', 'no', 'clean'))) { + /** + * @see Zend_Feed_Builder_Exception + */ + require_once 'Zend/Feed/Builder/Exception.php'; + throw new Zend_Feed_Builder_Exception("you have to set yes, no or clean to the itunes explicit property"); + } + $this->offsetSet('explicit', $explicit); + return $this; + } + + /** + * Sets a comma separated list of 12 keywords maximum + * + * @param string $keywords + * @return Zend_Feed_Builder_Header_Itunes + */ + public function setKeywords($keywords) + { + $this->offsetSet('keywords', $keywords); + return $this; + } + + /** + * Sets the new feed URL location + * + * @param string $url + * @return Zend_Feed_Builder_Header_Itunes + */ + public function setNewFeedUrl($url) + { + $this->offsetSet('new_feed_url', $url); + return $this; + } + + /** + * Read only properties accessor + * + * @param string $name property to read + * @return mixed + */ + public function __get($name) + { + if (!$this->offsetExists($name)) { + return NULL; + } + + return $this->offsetGet($name); + } + + /** + * Write properties accessor + * + * @param string $name name of the property to set + * @param mixed $value value to set + * @return void + */ + public function __set($name, $value) + { + $this->offsetSet($name, $value); + } + + /** + * Isset accessor + * + * @param string $key + * @return boolean + */ + public function __isset($key) + { + return $this->offsetExists($key); + } + + /** + * Unset accessor + * + * @param string $key + * @return void + */ + public function __unset($key) + { + if ($this->offsetExists($key)) { + $this->offsetUnset($key); + } + } + +} \ No newline at end of file diff --git a/libs/Zend/Feed/Builder/Interface.php b/libs/Zend/Feed/Builder/Interface.php new file mode 100644 index 0000000..0c04143 --- /dev/null +++ b/libs/Zend/Feed/Builder/Interface.php @@ -0,0 +1,52 @@ +_element = $element; + } + + + /** + * Get a DOM representation of the element + * + * Returns the underlying DOM object, which can then be + * manipulated with full DOM methods. + * + * @return DOMDocument + */ + public function getDOM() + { + return $this->_element; + } + + + /** + * Update the object from a DOM element + * + * Take a DOMElement object, which may be originally from a call + * to getDOM() or may be custom created, and use it as the + * DOM tree for this Zend_Feed_Element. + * + * @param DOMElement $element + * @return void + */ + public function setDOM(DOMElement $element) + { + $this->_element = $this->_element->ownerDocument->importNode($element, true); + } + + /** + * Set the parent element of this object to another + * Zend_Feed_Element. + * + * @param Zend_Feed_Element $element + * @return void + */ + public function setParent(Zend_Feed_Element $element) + { + $this->_parentElement = $element; + $this->_appended = false; + } + + + /** + * Appends this element to its parent if necessary. + * + * @return void + */ + protected function ensureAppended() + { + if (!$this->_appended) { + $this->_parentElement->getDOM()->appendChild($this->_element); + $this->_appended = true; + $this->_parentElement->ensureAppended(); + } + } + + + /** + * Get an XML string representation of this element + * + * Returns a string of this element's XML, including the XML + * prologue. + * + * @return string + */ + public function saveXml() + { + // Return a complete document including XML prologue. + $doc = new DOMDocument($this->_element->ownerDocument->version, + $this->_element->ownerDocument->actualEncoding); + $doc->appendChild($doc->importNode($this->_element, true)); + return $doc->saveXML(); + } + + + /** + * Get the XML for only this element + * + * Returns a string of this element's XML without prologue. + * + * @return string + */ + public function saveXmlFragment() + { + return $this->_element->ownerDocument->saveXML($this->_element); + } + + + /** + * Map variable access onto the underlying entry representation. + * + * Get-style access returns a Zend_Feed_Element representing the + * child element accessed. To get string values, use method syntax + * with the __call() overriding. + * + * @param string $var The property to access. + * @return mixed + */ + public function __get($var) + { + $nodes = $this->_children($var); + $length = count($nodes); + + if ($length == 1) { + return new Zend_Feed_Element($nodes[0]); + } elseif ($length > 1) { + return array_map(create_function('$e', 'return new Zend_Feed_Element($e);'), $nodes); + } else { + // When creating anonymous nodes for __set chaining, don't + // call appendChild() on them. Instead we pass the current + // element to them as an extra reference; the child is + // then responsible for appending itself when it is + // actually set. This way "if ($foo->bar)" doesn't create + // a phantom "bar" element in our tree. + if (strpos($var, ':') !== false) { + list($ns, $elt) = explode(':', $var, 2); + $node = $this->_element->ownerDocument->createElementNS(Zend_Feed::lookupNamespace($ns), $elt); + } else { + $node = $this->_element->ownerDocument->createElement($var); + } + $node = new self($node); + $node->setParent($this); + return $node; + } + } + + + /** + * Map variable sets onto the underlying entry representation. + * + * @param string $var The property to change. + * @param string $val The property's new value. + * @return void + * @throws Zend_Feed_Exception + */ + public function __set($var, $val) + { + $this->ensureAppended(); + + $nodes = $this->_children($var); + if (!$nodes) { + if (strpos($var, ':') !== false) { + list($ns, $elt) = explode(':', $var, 2); + $node = $this->_element->ownerDocument->createElementNS(Zend_Feed::lookupNamespace($ns), $var, $val); + $this->_element->appendChild($node); + } else { + $node = $this->_element->ownerDocument->createElement($var, $val); + $this->_element->appendChild($node); + } + } elseif (count($nodes) > 1) { + /** + * @see Zend_Feed_Exception + */ + require_once 'Zend/Feed/Exception.php'; + throw new Zend_Feed_Exception('Cannot set the value of multiple tags simultaneously.'); + } else { + $nodes[0]->nodeValue = $val; + } + } + + + /** + * Map isset calls onto the underlying entry representation. + * + * @param string $var + * @return boolean + */ + public function __isset($var) + { + // Look for access of the form {ns:var}. We don't use + // _children() here because we can break out of the loop + // immediately once we find something. + if (strpos($var, ':') !== false) { + list($ns, $elt) = explode(':', $var, 2); + foreach ($this->_element->childNodes as $child) { + if ($child->localName == $elt && $child->prefix == $ns) { + return true; + } + } + } else { + foreach ($this->_element->childNodes as $child) { + if ($child->localName == $var) { + return true; + } + } + } + } + + + /** + * Get the value of an element with method syntax. + * + * Map method calls to get the string value of the requested + * element. If there are multiple elements that match, this will + * return an array of those objects. + * + * @param string $var The element to get the string value of. + * @param mixed $unused This parameter is not used. + * @return mixed The node's value, null, or an array of nodes. + */ + public function __call($var, $unused) + { + $nodes = $this->_children($var); + + if (!$nodes) { + return null; + } elseif (count($nodes) > 1) { + return $nodes; + } else { + return $nodes[0]->nodeValue; + } + } + + + /** + * Remove all children matching $var. + * + * @param string $var + * @return void + */ + public function __unset($var) + { + $nodes = $this->_children($var); + foreach ($nodes as $node) { + $parent = $node->parentNode; + $parent->removeChild($node); + } + } + + + /** + * Returns the nodeValue of this element when this object is used + * in a string context. + * + * @return string + */ + public function __toString() + { + return $this->_element->nodeValue; + } + + + /** + * Finds children with tagnames matching $var + * + * Similar to SimpleXML's children() method. + * + * @param string $var Tagname to match, can be either namespace:tagName or just tagName. + * @return array + */ + protected function _children($var) + { + $found = array(); + + // Look for access of the form {ns:var}. + if (strpos($var, ':') !== false) { + list($ns, $elt) = explode(':', $var, 2); + foreach ($this->_element->childNodes as $child) { + if ($child->localName == $elt && $child->prefix == $ns) { + $found[] = $child; + } + } + } else { + foreach ($this->_element->childNodes as $child) { + if ($child->localName == $var) { + $found[] = $child; + } + } + } + + return $found; + } + + + /** + * Required by the ArrayAccess interface. + * + * @param string $offset + * @return boolean + */ + public function offsetExists($offset) + { + if (strpos($offset, ':') !== false) { + list($ns, $attr) = explode(':', $offset, 2); + return $this->_element->hasAttributeNS(Zend_Feed::lookupNamespace($ns), $attr); + } else { + return $this->_element->hasAttribute($offset); + } + } + + + /** + * Required by the ArrayAccess interface. + * + * @param string $offset + * @return string + */ + public function offsetGet($offset) + { + if (strpos($offset, ':') !== false) { + list($ns, $attr) = explode(':', $offset, 2); + return $this->_element->getAttributeNS(Zend_Feed::lookupNamespace($ns), $attr); + } else { + return $this->_element->getAttribute($offset); + } + } + + + /** + * Required by the ArrayAccess interface. + * + * @param string $offset + * @param string $value + * @return string + */ + public function offsetSet($offset, $value) + { + $this->ensureAppended(); + + if (strpos($offset, ':') !== false) { + list($ns, $attr) = explode(':', $offset, 2); + return $this->_element->setAttributeNS(Zend_Feed::lookupNamespace($ns), $attr, $value); + } else { + return $this->_element->setAttribute($offset, $value); + } + } + + + /** + * Required by the ArrayAccess interface. + * + * @param string $offset + * @return boolean + */ + public function offsetUnset($offset) + { + if (strpos($offset, ':') !== false) { + list($ns, $attr) = explode(':', $offset, 2); + return $this->_element->removeAttributeNS(Zend_Feed::lookupNamespace($ns), $attr); + } else { + return $this->_element->removeAttribute($offset); + } + } + +} diff --git a/libs/Zend/Feed/Entry/Abstract.php b/libs/Zend/Feed/Entry/Abstract.php new file mode 100644 index 0000000..370cb17 --- /dev/null +++ b/libs/Zend/Feed/Entry/Abstract.php @@ -0,0 +1,124 @@ +loadXML($element); + @ini_restore('track_errors'); + + 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)'; + } + } + + /** + * @see Zend_Feed_Exception + */ + require_once 'Zend/Feed/Exception.php'; + throw new Zend_Feed_Exception("DOMDocument cannot parse XML: $php_errormsg"); + } + + $element = $doc->getElementsByTagName($this->_rootElement)->item(0); + if (!$element) { + /** + * @see Zend_Feed_Exception + */ + require_once 'Zend/Feed/Exception.php'; + throw new Zend_Feed_Exception('No root <' . $this->_rootElement . '> element found, cannot parse feed.'); + } + } else { + $doc = new DOMDocument('1.0', 'utf-8'); + if ($this->_rootNamespace !== null) { + $element = $doc->createElementNS(Zend_Feed::lookupNamespace($this->_rootNamespace), $this->_rootElement); + } else { + $element = $doc->createElement($this->_rootElement); + } + } + } + + parent::__construct($element); + } + +} diff --git a/libs/Zend/Feed/Entry/Atom.php b/libs/Zend/Feed/Entry/Atom.php new file mode 100644 index 0000000..c43d6f8 --- /dev/null +++ b/libs/Zend/Feed/Entry/Atom.php @@ -0,0 +1,274 @@ +link('edit'); + if (!$deleteUri) { + /** + * @see Zend_Feed_Exception + */ + require_once 'Zend/Feed/Exception.php'; + throw new Zend_Feed_Exception('Cannot delete entry; no link rel="edit" is present.'); + } + + // DELETE + $client = Zend_Feed::getHttpClient(); + do { + $client->setUri($deleteUri); + if (Zend_Feed::getHttpMethodOverride()) { + $client->setHeader('X-HTTP-Method-Override', 'DELETE'); + $response = $client->request('POST'); + } else { + $response = $client->request('DELETE'); + } + $httpStatus = $response->getStatus(); + switch ((int) $httpStatus / 100) { + // Success + case 2: + return true; + // Redirect + case 3: + $deleteUri = $response->getHeader('Location'); + continue; + // Error + default: + /** + * @see Zend_Feed_Exception + */ + require_once 'Zend/Feed/Exception.php'; + throw new Zend_Feed_Exception("Expected response code 2xx, got $httpStatus"); + } + } while (true); + } + + + /** + * Save a new or updated Atom entry. + * + * Save is used to either create new entries or to save changes to + * existing ones. If we have a link rel="edit", we are changing + * an existing entry. In this case we re-serialize the entry and + * PUT it to the edit URI, checking for a 200 OK result. + * + * For posting new entries, you must specify the $postUri + * parameter to save() to tell the object where to post itself. + * We use $postUri and POST the serialized entry there, checking + * for a 201 Created response. If the insert is successful, we + * then parse the response from the POST to get any values that + * the server has generated: an id, an updated time, and its new + * link rel="edit". + * + * @param string $postUri Location to POST for creating new entries. + * @return void + * @throws Zend_Feed_Exception + */ + public function save($postUri = null) + { + if ($this->id()) { + // If id is set, look for link rel="edit" in the + // entry object and PUT. + $editUri = $this->link('edit'); + if (!$editUri) { + /** + * @see Zend_Feed_Exception + */ + require_once 'Zend/Feed/Exception.php'; + throw new Zend_Feed_Exception('Cannot edit entry; no link rel="edit" is present.'); + } + + $client = Zend_Feed::getHttpClient(); + $client->setUri($editUri); + if (Zend_Feed::getHttpMethodOverride()) { + $client->setHeaders(array('X-HTTP-Method-Override: PUT', + 'Content-Type: application/atom+xml')); + $client->setRawData($this->saveXML()); + $response = $client->request('POST'); + } else { + $client->setHeaders('Content-Type', 'application/atom+xml'); + $client->setRawData($this->saveXML()); + $response = $client->request('PUT'); + } + if ($response->getStatus() !== 200) { + /** + * @see Zend_Feed_Exception + */ + require_once 'Zend/Feed/Exception.php'; + throw new Zend_Feed_Exception('Expected response code 200, got ' . $response->getStatus()); + } + } else { + if ($postUri === null) { + /** + * @see Zend_Feed_Exception + */ + require_once 'Zend/Feed/Exception.php'; + throw new Zend_Feed_Exception('PostURI must be specified to save new entries.'); + } + $client = Zend_Feed::getHttpClient(); + $client->setUri($postUri); + $client->setRawData($this->saveXML()); + $response = $client->request('POST'); + + if ($response->getStatus() !== 201) { + /** + * @see Zend_Feed_Exception + */ + require_once 'Zend/Feed/Exception.php'; + throw new Zend_Feed_Exception('Expected response code 201, got ' + . $response->getStatus()); + } + } + + // Update internal properties using $client->responseBody; + @ini_set('track_errors', 1); + $newEntry = new DOMDocument; + $status = @$newEntry->loadXML($response->getBody()); + @ini_restore('track_errors'); + + 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)'; + } + } + + /** + * @see Zend_Feed_Exception + */ + require_once 'Zend/Feed/Exception.php'; + throw new Zend_Feed_Exception('XML cannot be parsed: ' . $php_errormsg); + } + + $newEntry = $newEntry->getElementsByTagName($this->_rootElement)->item(0); + if (!$newEntry) { + /** + * @see Zend_Feed_Exception + */ + require_once 'Zend/Feed/Exception.php'; + throw new Zend_Feed_Exception('No root element found in server response:' + . "\n\n" . $client->responseBody); + } + + if ($this->_element->parentNode) { + $oldElement = $this->_element; + $this->_element = $oldElement->ownerDocument->importNode($newEntry, true); + $oldElement->parentNode->replaceChild($this->_element, $oldElement); + } else { + $this->_element = $newEntry; + } + } + + + /** + * Easy access to tags keyed by "rel" attributes. + * + * If $elt->link() is called with no arguments, we will attempt to + * return the value of the tag(s) like all other + * method-syntax attribute access. If an argument is passed to + * link(), however, then we will return the "href" value of the + * first tag that has a "rel" attribute matching $rel: + * + * $elt->link(): returns the value of the link tag. + * $elt->link('self'): returns the href from the first in the entry. + * + * @param string $rel The "rel" attribute to look for. + * @return mixed + */ + public function link($rel = null) + { + if ($rel === null) { + return parent::__call('link', null); + } + + // index link tags by their "rel" attribute. + $links = parent::__get('link'); + if (!is_array($links)) { + if ($links instanceof Zend_Feed_Element) { + $links = array($links); + } else { + return $links; + } + } + + foreach ($links as $link) { + if (empty($link['rel'])) { + continue; + } + if ($rel == $link['rel']) { + return $link['href']; + } + } + + return null; + } + +} diff --git a/libs/Zend/Feed/Entry/Rss.php b/libs/Zend/Feed/Entry/Rss.php new file mode 100644 index 0000000..ea060f9 --- /dev/null +++ b/libs/Zend/Feed/Entry/Rss.php @@ -0,0 +1,122 @@ +_element->lookupPrefix('http://purl.org/rss/1.0/modules/content/'); + return parent::__get("$prefix:encoded"); + default: + return parent::__get($var); + } + } + + /** + * Overwrites parent::_set method to enable write access + * to content:encoded element. + * + * @param string $var The property to change. + * @param string $val The property's new value. + * @return void + */ + public function __set($var, $value) + { + switch ($var) { + case 'content': + parent::__set('content:encoded', $value); + break; + default: + parent::__set($var, $value); + } + } + + /** + * Overwrites parent::_isset method to enable access + * to content:encoded element. + * + * @param string $var + * @return boolean + */ + public function __isset($var) + { + switch ($var) { + case 'content': + // don't use other callback to prevent invalid returned value + return $this->content() !== null; + default: + return parent::__isset($var); + } + } + + /** + * Overwrites parent::_call method to enable read access + * to content:encoded element. + * Please note that method-style write access is not currently supported + * by parent method, consequently this method doesn't as well. + * + * @param string $var The element to get the string value of. + * @param mixed $unused This parameter is not used. + * @return mixed The node's value, null, or an array of nodes. + */ + public function __call($var, $unused) + { + switch ($var) { + case 'content': + $prefix = $this->_element->lookupPrefix('http://purl.org/rss/1.0/modules/content/'); + return parent::__call("$prefix:encoded", $unused); + default: + return parent::__call($var, $unused); + } + } +} diff --git a/libs/Zend/Feed/Exception.php b/libs/Zend/Feed/Exception.php new file mode 100644 index 0000000..4d905af --- /dev/null +++ b/libs/Zend/Feed/Exception.php @@ -0,0 +1,42 @@ +s). + * + * @var string + */ + protected $_entryElementName = 'item'; + + /** + * The default namespace for RSS channels. + * + * @var string + */ + protected $_defaultNamespace = 'rss'; + + /** + * Override Zend_Feed_Abstract to set up the $_element and $_entries aliases. + * + * @return void + * @throws Zend_Feed_Exception + */ + public function __wakeup() + { + parent::__wakeup(); + + // Find the base channel element and create an alias to it. + $this->_element = $this->_element->getElementsByTagName('channel')->item(0); + if (!$this->_element) { + /** + * @see Zend_Feed_Exception + */ + require_once 'Zend/Feed/Exception.php'; + throw new Zend_Feed_Exception('No root element found, cannot parse channel.'); + } + + // Find the entries and save a pointer to them for speed and + // simplicity. + $this->_buildEntryCache(); + } + + + /** + * Make accessing some individual elements of the channel easier. + * + * Special accessors 'item' and 'items' are provided so that if + * you wish to iterate over an RSS channel's items, you can do so + * using foreach ($channel->items as $item) or foreach + * ($channel->item as $item). + * + * @param string $var The property to access. + * @return mixed + */ + public function __get($var) + { + switch ($var) { + case 'item': + // fall through to the next case + case 'items': + return $this; + + default: + return parent::__get($var); + } + } + + /** + * Generate the header of the feed when working in write mode + * + * @param array $array the data to use + * @return DOMElement root node + */ + protected function _mapFeedHeaders($array) + { + $channel = $this->_element->createElement('channel'); + + $title = $this->_element->createElement('title'); + $title->appendChild($this->_element->createCDATASection($array->title)); + $channel->appendChild($title); + + $link = $this->_element->createElement('link', $array->link); + $channel->appendChild($link); + + $desc = isset($array->description) ? $array->description : ''; + $description = $this->_element->createElement('description'); + $description->appendChild($this->_element->createCDATASection($desc)); + $channel->appendChild($description); + + $pubdate = isset($array->lastUpdate) ? $array->lastUpdate : time(); + $pubdate = $this->_element->createElement('pubDate', gmdate('r', $pubdate)); + $channel->appendChild($pubdate); + + if (isset($array->published)) { + $lastBuildDate = $this->_element->createElement('lastBuildDate', gmdate('r', $array->published)); + } + + $editor = ''; + if (!empty($array->email)) { + $editor .= $array->email; + } + if (!empty($array->author)) { + $editor .= ' (' . $array->author . ')'; + } + if (!empty($editor)) { + $author = $this->_element->createElement('managingEditor', ltrim($editor)); + $channel->appendChild($author); + } + if (isset($array->webmaster)) { + $channel->appendChild($this->_element->createElement('webMaster', $array->webmaster)); + } + + if (!empty($array->copyright)) { + $copyright = $this->_element->createElement('copyright', $array->copyright); + $channel->appendChild($copyright); + } + + if (!empty($array->image)) { + $image = $this->_element->createElement('image'); + $url = $this->_element->createElement('url', $array->image); + $image->appendChild($url); + $imagetitle = $this->_element->createElement('title', $array->title); + $image->appendChild($imagetitle); + $imagelink = $this->_element->createElement('link', $array->link); + $image->appendChild($imagelink); + + $channel->appendChild($image); + } + + $generator = !empty($array->generator) ? $array->generator : 'Zend_Feed'; + $generator = $this->_element->createElement('generator', $generator); + $channel->appendChild($generator); + + if (!empty($array->language)) { + $language = $this->_element->createElement('language', $array->language); + $channel->appendChild($language); + } + + $doc = $this->_element->createElement('docs', 'http://blogs.law.harvard.edu/tech/rss'); + $channel->appendChild($doc); + + if (isset($array->cloud)) { + $cloud = $this->_element->createElement('cloud'); + $cloud->setAttribute('domain', $array->cloud['uri']->getHost()); + $cloud->setAttribute('port', $array->cloud['uri']->getPort()); + $cloud->setAttribute('path', $array->cloud['uri']->getPath()); + $cloud->setAttribute('registerProcedure', $array->cloud['procedure']); + $cloud->setAttribute('protocol', $array->cloud['protocol']); + $channel->appendChild($cloud); + } + + if (isset($array->rating)) { + $rating = $this->_element->createElement('rating', $array->rating); + $channel->appendChild($rating); + } + + if (isset($array->textInput)) { + $textinput = $this->_element->createElement('textInput'); + $textinput->appendChild($this->_element->createElement('title', $array->textInput['title'])); + $textinput->appendChild($this->_element->createElement('description', $array->textInput['description'])); + $textinput->appendChild($this->_element->createElement('name', $array->textInput['name'])); + $textinput->appendChild($this->_element->createElement('link', $array->textInput['link'])); + $channel->appendChild($textinput); + } + + if (isset($array->skipHours)) { + $skipHours = $this->_element->createElement('skipHours'); + foreach ($array->skipHours as $hour) { + $skipHours->appendChild($this->_element->createElement('hour', $hour)); + } + $channel->appendChild($skipHours); + } + + if (isset($array->skipDays)) { + $skipDays = $this->_element->createElement('skipDays'); + foreach ($array->skipDays as $day) { + $skipDays->appendChild($this->_element->createElement('day', $day)); + } + $channel->appendChild($skipDays); + } + + if (isset($array->itunes)) { + $this->_buildiTunes($channel, $array); + } + + return $channel; + } + + /** + * Adds the iTunes extensions to a root node + * + * @param DOMElement $root + * @param array $array + * @return void + */ + private function _buildiTunes(DOMElement $root, $array) + { + /* author node */ + $author = ''; + if (isset($array->itunes->author)) { + $author = $array->itunes->author; + } elseif (isset($array->author)) { + $author = $array->author; + } + if (!empty($author)) { + $node = $this->_element->createElementNS('http://www.itunes.com/DTDs/Podcast-1.0.dtd', 'itunes:author', $author); + $root->appendChild($node); + } + + /* owner node */ + $author = ''; + $email = ''; + if (isset($array->itunes->owner)) { + if (isset($array->itunes->owner['name'])) { + $author = $array->itunes->owner['name']; + } + if (isset($array->itunes->owner['email'])) { + $email = $array->itunes->owner['email']; + } + } + if (empty($author) && isset($array->author)) { + $author = $array->author; + } + if (empty($email) && isset($array->email)) { + $email = $array->email; + } + if (!empty($author) || !empty($email)) { + $owner = $this->_element->createElementNS('http://www.itunes.com/DTDs/Podcast-1.0.dtd', 'itunes:owner'); + if (!empty($author)) { + $node = $this->_element->createElementNS('http://www.itunes.com/DTDs/Podcast-1.0.dtd', 'itunes:name', $author); + $owner->appendChild($node); + } + if (!empty($email)) { + $node = $this->_element->createElementNS('http://www.itunes.com/DTDs/Podcast-1.0.dtd', 'itunes:email', $email); + $owner->appendChild($node); + } + $root->appendChild($owner); + } + $image = ''; + if (isset($array->itunes->image)) { + $image = $array->itunes->image; + } elseif (isset($array->image)) { + $image = $array->image; + } + if (!empty($image)) { + $node = $this->_element->createElementNS('http://www.itunes.com/DTDs/Podcast-1.0.dtd', 'itunes:image'); + $node->setAttribute('href', $image); + $root->appendChild($node); + } + $subtitle = ''; + if (isset($array->itunes->subtitle)) { + $subtitle = $array->itunes->subtitle; + } elseif (isset($array->description)) { + $subtitle = $array->description; + } + if (!empty($subtitle)) { + $node = $this->_element->createElementNS('http://www.itunes.com/DTDs/Podcast-1.0.dtd', 'itunes:subtitle', $subtitle); + $root->appendChild($node); + } + $summary = ''; + if (isset($array->itunes->summary)) { + $summary = $array->itunes->summary; + } elseif (isset($array->description)) { + $summary = $array->description; + } + if (!empty($summary)) { + $node = $this->_element->createElementNS('http://www.itunes.com/DTDs/Podcast-1.0.dtd', 'itunes:summary', $summary); + $root->appendChild($node); + } + if (isset($array->itunes->block)) { + $node = $this->_element->createElementNS('http://www.itunes.com/DTDs/Podcast-1.0.dtd', 'itunes:block', $array->itunes->block); + $root->appendChild($node); + } + if (isset($array->itunes->explicit)) { + $node = $this->_element->createElementNS('http://www.itunes.com/DTDs/Podcast-1.0.dtd', 'itunes:explicit', $array->itunes->explicit); + $root->appendChild($node); + } + if (isset($array->itunes->keywords)) { + $node = $this->_element->createElementNS('http://www.itunes.com/DTDs/Podcast-1.0.dtd', 'itunes:keywords', $array->itunes->keywords); + $root->appendChild($node); + } + if (isset($array->itunes->new_feed_url)) { + $node = $this->_element->createElementNS('http://www.itunes.com/DTDs/Podcast-1.0.dtd', 'itunes:new-feed-url', $array->itunes->new_feed_url); + $root->appendChild($node); + } + if (isset($array->itunes->category)) { + foreach ($array->itunes->category as $i => $category) { + $node = $this->_element->createElementNS('http://www.itunes.com/DTDs/Podcast-1.0.dtd', 'itunes:category'); + $node->setAttribute('text', $category['main']); + $root->appendChild($node); + $add_end_category = false; + if (!empty($category['sub'])) { + $add_end_category = true; + $node = $this->_element->createElementNS('http://www.itunes.com/DTDs/Podcast-1.0.dtd', 'itunes:category'); + $node->setAttribute('text', $category['sub']); + $root->appendChild($node); + } + if ($i > 0 || $add_end_category) { + $node = $this->_element->createElementNS('http://www.itunes.com/DTDs/Podcast-1.0.dtd', 'itunes:category'); + $root->appendChild($node); + } + } + } + } + + /** + * Generate the entries of the feed when working in write mode + * + * The following nodes are constructed for each feed entry + * + * entry title + * url to feed entry + * url to feed entry + * short text + * long version, can contain html + * + * + * @param DOMElement $root the root node to use + * @param array $array the data to use + * @return void + */ + protected function _mapFeedEntries(DOMElement $root, $array) + { + Zend_Feed::registerNamespace('content', 'http://purl.org/rss/1.0/modules/content/'); + + foreach ($array as $dataentry) { + $item = $this->_element->createElement('item'); + + $title = $this->_element->createElement('title'); + $title->appendChild($this->_element->createCDATASection($dataentry->title)); + $item->appendChild($title); + + $link = $this->_element->createElement('link', $dataentry->link); + $item->appendChild($link); + + if (isset($dataentry->guid)) { + $guid = $this->_element->createElement('guid', $dataentry->guid); + $item->appendChild($guid); + } + + $description = $this->_element->createElement('description'); + $description->appendChild($this->_element->createCDATASection($dataentry->description)); + $item->appendChild($description); + + if (isset($dataentry->content)) { + $content = $this->_element->createElement('content:encoded'); + $content->appendChild($this->_element->createCDATASection($dataentry->content)); + $item->appendChild($content); + } + + $pubdate = isset($dataentry->lastUpdate) ? $dataentry->lastUpdate : time(); + $pubdate = $this->_element->createElement('pubDate', gmdate('r', $pubdate)); + $item->appendChild($pubdate); + + if (isset($dataentry->category)) { + foreach ($dataentry->category as $category) { + $node = $this->_element->createElement('category', $category['term']); + if (isset($category['scheme'])) { + $node->setAttribute('domain', $category['scheme']); + } + $item->appendChild($node); + } + } + + if (isset($dataentry->source)) { + $source = $this->_element->createElement('source', $dataentry->source['title']); + $source->setAttribute('url', $dataentry->source['url']); + $item->appendChild($source); + } + + if (isset($dataentry->comments)) { + $comments = $this->_element->createElement('comments', $dataentry->comments); + $item->appendChild($comments); + } + if (isset($dataentry->commentRss)) { + $comments = $this->_element->createElementNS('http://wellformedweb.org/CommentAPI/', + 'wfw:commentRss', + $dataentry->commentRss); + $item->appendChild($comments); + } + + + if (isset($dataentry->enclosure)) { + foreach ($dataentry->enclosure as $enclosure) { + $node = $this->_element->createElement('enclosure'); + $node->setAttribute('url', $enclosure['url']); + if (isset($enclosure['type'])) { + $node->setAttribute('type', $enclosure['type']); + } + if (isset($enclosure['length'])) { + $node->setAttribute('length', $enclosure['length']); + } + $item->appendChild($node); + } + } + + $root->appendChild($item); + } + } + + /** + * Override Zend_Feed_Element to include root node + * + * @return string + */ + public function saveXml() + { + // Return a complete document including XML prologue. + $doc = new DOMDocument($this->_element->ownerDocument->version, + $this->_element->ownerDocument->actualEncoding); + $root = $doc->createElement('rss'); + + // Use rss version 2.0 + $root->setAttribute('version', '2.0'); + + // Content namespace + $root->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:content', 'http://purl.org/rss/1.0/modules/content/'); + $root->appendChild($doc->importNode($this->_element, true)); + + // Append root node + $doc->appendChild($root); + + // Format output + $doc->formatOutput = true; + + return $doc->saveXML(); + } + + /** + * Send feed to a http client with the correct header + * + * @return void + * @throws Zend_Feed_Exception if headers have already been sent + */ + public function send() + { + if (headers_sent()) { + /** + * @see Zend_Feed_Exception + */ + require_once 'Zend/Feed/Exception.php'; + throw new Zend_Feed_Exception('Cannot send RSS because headers have already been sent.'); + } + + header('Content-Type: application/rss+xml; charset=' . $this->_element->ownerDocument->actualEncoding); + + echo $this->saveXml(); + } + +} diff --git a/libs/Zend/File/Transfer.php b/libs/Zend/File/Transfer.php new file mode 100644 index 0000000..ce774ae --- /dev/null +++ b/libs/Zend/File/Transfer.php @@ -0,0 +1,57 @@ +_adapter = new $adapter(); + if (!$this->_adapter instanceof Zend_File_Transfer_Adapter) { + require_once 'Zend/File/Transfer/Exception.php'; + throw new Zend_File_Transfer_Exception("Adapter " . $adapter . " does not extend Zend_File_Transfer_Adapter'"); + } + + return $this->_adapter; + } +} diff --git a/libs/Zend/File/Transfer/Adapter/Abstract.php b/libs/Zend/File/Transfer/Adapter/Abstract.php new file mode 100644 index 0000000..7f89e69 --- /dev/null +++ b/libs/Zend/File/Transfer/Adapter/Abstract.php @@ -0,0 +1,1250 @@ + array( - Form is the name within the form or, if not set the filename + * name, - Original name of this file + * type, - Mime type of this file + * size, - Filesize in bytes + * tmp_name, - Internalally temporary filename for uploaded files + * error, - Error which has occured + * destination, - New destination for this file + * validators, - Set validator names for this file + * files - Set file names for this file + * )) + * + * @var array + */ + protected $_files = array(); + + /** + * TMP directory + * @var string + */ + protected $_tmpDir; + + /** + * Available options for file transfers + */ + protected $_options = array( + 'ignoreNoFile' => false + ); + + /** + * Send file + * + * @param mixed $options + * @return bool + */ + abstract public function send($options = null); + + /** + * Receive file + * + * @param mixed $options + * @return bool + */ + abstract public function receive($options = null); + + /** + * Is file sent? + * + * @param array|string|null $files + * @return bool + */ + abstract public function isSent($files = null); + + /** + * Is file received? + * + * @param array|string|null $files + * @return bool + */ + abstract public function isReceived($files = null); + + /** + * Has a file been uploaded ? + * + * @param array|string|null $files + * @return bool + */ + abstract public function isUploaded($files = null); + + /** + * Has the file been filtered ? + * + * @param array|string|null $files + * @return bool + */ + abstract public function isFiltered($files = null); + + /** + * Retrieve progress of transfer + * + * @return float + */ + abstract public function getProgress(); + + /** + * Set plugin loader to use for validator or filter chain + * + * @param Zend_Loader_PluginLoader_Interface $loader + * @param string $type 'filter', or 'validate' + * @return Zend_File_Transfer_Adapter_Abstract + * @throws Zend_File_Transfer_Exception on invalid type + */ + public function setPluginLoader(Zend_Loader_PluginLoader_Interface $loader, $type) + { + $type = strtoupper($type); + switch ($type) { + case self::FILTER: + case self::VALIDATE: + $this->_loaders[$type] = $loader; + return $this; + default: + require_once 'Zend/File/Transfer/Exception.php'; + throw new Zend_File_Transfer_Exception(sprintf('Invalid type "%s" provided to setPluginLoader()', $type)); + } + } + + /** + * Retrieve plugin loader for validator or filter chain + * + * Instantiates with default rules if none available for that type. Use + * 'filter' or 'validate' for $type. + * + * @param string $type + * @return Zend_Loader_PluginLoader + * @throws Zend_File_Transfer_Exception on invalid type. + */ + public function getPluginLoader($type) + { + $type = strtoupper($type); + switch ($type) { + case self::FILTER: + case self::VALIDATE: + $prefixSegment = ucfirst(strtolower($type)); + $pathSegment = $prefixSegment; + if (!isset($this->_loaders[$type])) { + $paths = array( + 'Zend_' . $prefixSegment . '_' => 'Zend/' . $pathSegment . '/', + 'Zend_' . $prefixSegment . '_File' => 'Zend/' . $pathSegment . '/File', + ); + + require_once 'Zend/Loader/PluginLoader.php'; + $this->_loaders[$type] = new Zend_Loader_PluginLoader($paths); + } + return $this->_loaders[$type]; + default: + require_once 'Zend/File/Transfer/Exception.php'; + throw new Zend_File_Transfer_Exception(sprintf('Invalid type "%s" provided to getPluginLoader()', $type)); + } + } + + /** + * Add prefix path for plugin loader + * + * If no $type specified, assumes it is a base path for both filters and + * validators, and sets each according to the following rules: + * - filters: $prefix = $prefix . '_Filter' + * - validators: $prefix = $prefix . '_Validate' + * + * Otherwise, the path prefix is set on the appropriate plugin loader. + * + * @param string $path + * @return Zend_File_Transfer_Adapter_Abstract + * @throws Zend_File_Transfer_Exception for invalid type + */ + public function addPrefixPath($prefix, $path, $type = null) + { + $type = strtoupper($type); + switch ($type) { + case self::FILTER: + case self::VALIDATE: + $loader = $this->getPluginLoader($type); + $loader->addPrefixPath($prefix, $path); + return $this; + case null: + $prefix = rtrim($prefix, '_'); + $path = rtrim($path, DIRECTORY_SEPARATOR); + foreach (array(self::FILTER, self::VALIDATE) as $type) { + $cType = ucfirst(strtolower($type)); + $pluginPath = $path . DIRECTORY_SEPARATOR . $cType . DIRECTORY_SEPARATOR; + $pluginPrefix = $prefix . '_' . $cType; + $loader = $this->getPluginLoader($type); + $loader->addPrefixPath($pluginPrefix, $pluginPath); + } + return $this; + default: + require_once 'Zend/File/Transfer/Exception.php'; + throw new Zend_File_Transfer_Exception(sprintf('Invalid type "%s" provided to getPluginLoader()', $type)); + } + } + + /** + * Add many prefix paths at once + * + * @param array $spec + * @return Zend_File_Transfer_Exception + */ + public function addPrefixPaths(array $spec) + { + if (isset($spec['prefix']) && isset($spec['path'])) { + return $this->addPrefixPath($spec['prefix'], $spec['path']); + } + foreach ($spec as $type => $paths) { + if (is_numeric($type) && is_array($paths)) { + $type = null; + if (isset($paths['prefix']) && isset($paths['path'])) { + if (isset($paths['type'])) { + $type = $paths['type']; + } + $this->addPrefixPath($paths['prefix'], $paths['path'], $type); + } + } elseif (!is_numeric($type)) { + if (!isset($paths['prefix']) || !isset($paths['path'])) { + foreach ($paths as $prefix => $spec) { + if (is_array($spec)) { + foreach ($spec as $path) { + if (!is_string($path)) { + continue; + } + $this->addPrefixPath($prefix, $path, $type); + } + } elseif (is_string($spec)) { + $this->addPrefixPath($prefix, $spec, $type); + } + } + } else { + $this->addPrefixPath($paths['prefix'], $paths['path'], $type); + } + } + } + return $this; + } + + /** + * Adds a new validator for this class + * + * @param string|array $validator Type of validator to add + * @param boolean $breakChainOnFailure If the validation chain should stop an failure + * @param string|array $options Options to set for the validator + * @param string|array $files Files to limit this validator to + * @return Zend_File_Transfer_Adapter + */ + public function addValidator($validator, $breakChainOnFailure = false, $options = null, $files = null) + { + if ($validator instanceof Zend_Validate_Interface) { + $name = get_class($validator); + } elseif (is_string($validator)) { + $name = $this->getPluginLoader(self::VALIDATE)->load($validator); + $validator = new $name($options); + } else { + require_once 'Zend/File/Transfer/Exception.php'; + throw new Zend_File_Transfer_Exception('Invalid validator provided to addValidator; must be string or Zend_Validate_Interface'); + } + + $this->_validators[$name] = $validator; + $this->_break[$name] = $breakChainOnFailure; + $files = $this->_getFiles($files, true, true); + foreach ($files as $file) { + $this->_files[$file]['validators'][] = $name; + $this->_files[$file]['validated'] = false; + } + + return $this; + } + + /** + * Add Multiple validators at once + * + * @param array $validators + * @param string|array $files + * @return Zend_File_Transfer_Adapter_Abstract + */ + public function addValidators(array $validators, $files = null) + { + foreach ($validators as $name => $validatorInfo) { + if ($validatorInfo instanceof Zend_Validate_Interface) { + $this->addValidator($validatorInfo, null, null, $files); + } else if (is_string($validatorInfo)) { + if (!is_int($name)) { + $this->addValidator($name, null, $validatorInfo, $files); + } else { + $this->addValidator($validatorInfo, null, null, $files); + } + } else if (is_array($validatorInfo)) { + $argc = count($validatorInfo); + $breakChainOnFailure = false; + $options = array(); + if (isset($validatorInfo['validator'])) { + $validator = $validatorInfo['validator']; + if (isset($validatorInfo['breakChainOnFailure'])) { + $breakChainOnFailure = $validatorInfo['breakChainOnFailure']; + } + + if (isset($validatorInfo['options'])) { + $options = $validatorInfo['options']; + } + + $this->addValidator($validator, $breakChainOnFailure, $options, $files); + } else { + if (is_string($name)) { + $validator = $name; + $options = $validatorInfo; + $this->addValidator($validator, $breakChainOnFailure, $options, $files); + } else { + switch (true) { + case (0 == $argc): + break; + case (1 <= $argc): + $validator = array_shift($validatorInfo); + case (2 <= $argc): + $breakChainOnFailure = array_shift($validatorInfo); + case (3 <= $argc): + $options = array_shift($validatorInfo); + case (4 <= $argc): + $files = array_shift($validatorInfo); + default: + $this->addValidator($validator, $breakChainOnFailure, $options, $files); + break; + } + } + } + } else { + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception('Invalid validator passed to addValidators()'); + } + } + + return $this; + } + + /** + * Sets a validator for the class, erasing all previous set + * + * @param string|array $validator Validator to set + * @param string|array $files Files to limit this validator to + * @return Zend_File_Transfer_Adapter + */ + public function setValidators(array $validators, $files = null) + { + $this->clearValidators(); + return $this->addValidators($validators, $files); + } + + /** + * Determine if a given validator has already been registered + * + * @param string $name + * @return bool + */ + public function hasValidator($name) + { + return (false !== $this->_getValidatorIdentifier($name)); + } + + /** + * Retrieve individual validator + * + * @param string $name + * @return Zend_Validate_Interface|null + */ + public function getValidator($name) + { + if (false === ($identifier = $this->_getValidatorIdentifier($name))) { + return null; + } + return $this->_validators[$identifier]; + } + + /** + * Returns all set validators + * + * @param string|array $files (Optional) Returns the validator for this files + * @return null|array List of set validators + */ + public function getValidators($files = null) + { + $files = $this->_getFiles($files, true, true); + + if (empty($files)) { + return $this->_validators; + } + + $validators = array(); + foreach ($files as $file) { + if (!empty($this->_files[$file]['validators'])) { + $validators += $this->_files[$file]['validators']; + } + } + $validators = array_unique($validators); + + $result = array(); + foreach ($validators as $validator) { + $result[$validator] = $this->_validators[$validator]; + } + return $result; + } + + /** + * Remove an individual validator + * + * @param string $name + * @return Zend_File_Transfer_Adapter_Abstract + */ + public function removeValidator($name) + { + if (false === ($key = $this->_getValidatorIdentifier($name))) { + return $this; + } + + unset($this->_validators[$key]); + foreach (array_keys($this->_files) as $file) { + if (!$index = array_search($key, $this->_files[$file]['validators'])) { + continue; + } + unset($this->_files[$file]['validators'][$index]); + $this->_files[$file]['validated'] = false; + } + + return $this; + } + + /** + * Remove all validators + * + * @return Zend_File_Transfer_Adapter_Abstract + */ + public function clearValidators() + { + $this->_validators = array(); + foreach (array_keys($this->_files) as $file) { + $this->_files[$file]['validators'] = array(); + $this->_files[$file]['validated'] = false; + } + + return $this; + } + + /** + * Sets Options for adapters + * + * @param array $options Options to set + * @param array $files (Optional) Files to set the options for + */ + public function setOptions($options = array(), $files = null) { + $file = $this->_getFiles($files, false, true); + + if (is_array($options)) { + foreach ($options as $name => $value) { + foreach ($file as $key => $content) { + if (array_key_exists($name, $this->_options)) { + $this->_files[$key]['options'][$name] = (boolean) $value; + } else { + require_once 'Zend/File/Transfer/Exception.php'; + throw new Zend_File_Transfer_Exception("Unknown option: $name = $value"); + } + } + } + } + + return $this; + } + + /** + * Returns set options for adapters or files + * + * @param array $files (Optional) Files to return the options for + * @return array Options for given files + */ + public function getOptions($files = null) { + $file = $this->_getFiles($files, false, true); + + foreach ($file as $key => $content) { + if (isset($this->_files[$key]['options'])) { + $options[$key] = $this->_files[$key]['options']; + } else { + $options[$key] = array(); + } + } + + return $options; + } + + /** + * Checks if the files are valid + * + * @param string|array $files (Optional) Files to check + * @return boolean True if all checks are valid + */ + public function isValid($files = null) + { + $check = $this->_getFiles($files); + $translator = $this->getTranslator(); + $this->_messages = array(); + $break = false; + foreach ($check as $key => $content) { + $fileerrors = array(); + if ($content['validated'] === true) { + continue; + } + + if (array_key_exists('validators', $content)) { + foreach ($content['validators'] as $class) { + $validator = $this->_validators[$class]; + if (method_exists($validator, 'setTranslator')) { + $validator->setTranslator($translator); + } + + if (!$validator->isValid($content['tmp_name'], $content)) { + $fileerrors += $validator->getMessages(); + } + + if (!empty($content['options']['ignoreNoFile']) and (isset($fileerrors['fileUploadErrorNoFile']))) { + unset($fileerrors['fileUploadErrorNoFile']); + break; + } + + if (($class === 'Zend_Validate_File_Upload') and (count($fileerrors) > 0)) { + break; + } + + if (($this->_break[$class]) and (count($fileerrors) > 0)) { + $break = true; + break; + } + } + } + + if (count($fileerrors) > 0) { + $this->_files[$key]['validated'] = false; + } else { + $this->_files[$key]['validated'] = true; + } + + $this->_messages += $fileerrors; + if ($break) { + break; + } + } + + if (count($this->_messages) > 0) { + return false; + } + + return true; + } + + /** + * Returns found validation messages + * + * @return array + */ + public function getMessages() + { + return $this->_messages; + } + + /** + * Retrieve error codes + * + * @return array + */ + public function getErrors() + { + return array_keys($this->_messages); + } + + /** + * Are there errors registered? + * + * @return boolean + */ + public function hasErrors() + { + return (!empty($this->_messages)); + } + + /** + * Adds a new filter for this class + * + * @param string|array $filter Type of filter to add + * @param string|array $options Options to set for the filter + * @param string|array $files Files to limit this filter to + * @return Zend_File_Transfer_Adapter + */ + public function addFilter($filter, $options = null, $files = null) + { + if ($filter instanceof Zend_Filter_Interface) { + $class = get_class($filter); + } elseif (is_string($filter)) { + $class = $this->getPluginLoader(self::FILTER)->load($filter); + $filter = new $class($options); + } else { + require_once 'Zend/File/Transfer/Exception.php'; + throw new Zend_File_Transfer_Exception('Invalid filter specified'); + } + + $this->_filters[$class] = $filter; + $files = $this->_getFiles($files, true, true); + foreach ($files as $file) { + $this->_files[$file]['filters'][] = $class; + } + + return $this; + } + + /** + * Add Multiple filters at once + * + * @param array $filters + * @param string|array $files + * @return Zend_File_Transfer_Adapter_Abstract + */ + public function addFilters(array $filters, $files = null) + { + foreach ($filters as $key => $spec) { + if ($spec instanceof Zend_Filter_Interface) { + $this->addFilter($spec, null, $files); + continue; + } + + if (is_string($key)) { + $this->addFilter($key, $spec, $files); + continue; + } + + if (is_int($key)) { + if (is_string($spec)) { + $this->addFilter($spec, null, $files); + continue; + } + + if (is_array($spec)) { + if (!array_key_exists('filter', $spec)) { + continue; + } + + $filter = $spec['filter']; + unset($spec['filter']); + $this->addFilter($filter, $spec, $files); + continue; + } + + continue; + } + } + + return $this; + } + + /** + * Sets a filter for the class, erasing all previous set + * + * @param string|array $filter Filter to set + * @param string|array $files Files to limit this filter to + * @return Zend_File_Transfer_Adapter + */ + public function setFilters(array $filters, $files = null) + { + $this->clearFilters(); + return $this->addFilters($filters, $files); + } + + /** + * Determine if a given filter has already been registered + * + * @param string $name + * @return bool + */ + public function hasFilter($name) + { + return (false !== $this->_getFilterIdentifier($name)); + } + + /** + * Retrieve individual filter + * + * @param string $name + * @return Zend_Filter_Interface|null + */ + public function getFilter($name) + { + if (false === ($identifier = $this->_getFilterIdentifier($name))) { + return null; + } + return $this->_filters[$identifier]; + } + + /** + * Returns all set filters + * + * @param string|array $files (Optional) Returns the filter for this files + * @return array List of set filters + * @throws Zend_File_Transfer_Exception When file not found + */ + public function getFilters($files = null) + { + if ($files === null) { + return $this->_filters; + } + + $files = $this->_getFiles($files, true, true); + $filters = array(); + foreach ($files as $file) { + if (!empty($this->_files[$file]['filters'])) { + $filters += $this->_files[$file]['filters']; + } + } + + $filters = array_unique($filters); + $result = array(); + foreach ($filters as $filter) { + $result[] = $this->_filters[$filter]; + } + + return $result; + } + + /** + * Remove an individual filter + * + * @param string $name + * @return Zend_File_Transfer_Adapter_Abstract + */ + public function removeFilter($name) + { + if (false === ($key = $this->_getFilterIdentifier($name))) { + return $this; + } + + unset($this->_filters[$key]); + foreach (array_keys($this->_files) as $file) { + if (!$index = array_search($key, $this->_files[$file]['filters'])) { + continue; + } + unset($this->_files[$file]['filters'][$index]); + } + return $this; + } + + /** + * Remove all filters + * + * @return Zend_File_Transfer_Adapter_Abstract + */ + public function clearFilters() + { + $this->_filters = array(); + foreach (array_keys($this->_files) as $file) { + $this->_files[$file]['filters'] = array(); + } + return $this; + } + + /** + * Returns all set files + * + * @return array List of set files + * @throws Zend_File_Transfer_Exception Not implemented + */ + public function getFile() + { + require_once 'Zend/File/Transfer/Exception.php'; + throw new Zend_File_Transfer_Exception('Method not implemented'); + } + + /** + * Retrieves the filename of transferred files. + * + * @param string $fileelement (Optional) Element to return the filename for + * @param boolean $path (Optional) Should the path also be returned ? + * @return string|array + */ + public function getFileName($file = null, $path = true) + { + $files = $this->_getFiles($file, true, true); + + $result = array(); + $directory = ""; + foreach($files as $file) { + if ($path === true) { + $directory = $this->getDestination($file) . DIRECTORY_SEPARATOR; + } + + $result[$file] = $directory . $this->_files[$file]['name']; + } + + if (count($result) == 1) { + return current($result); + } + + return $result; + } + + /** + * Retrieve additional internal file informations for files + * + * @param string $file (Optional) File to get informations for + * @return array + */ + public function getFileInfo($file = null) + { + return $this->_getFiles($file); + } + + /** + * Adds one or more files + * + * @param string|array $file File to add + * @param string|array $validator Validators to use for this file, must be set before + * @param string|array $filter Filters to use for this file, must be set before + * @return Zend_File_Transfer_Adapter_Abstract + * @throws Zend_File_Transfer_Exception Not implemented + */ + public function addFile($file, $validator = null, $filter = null) + { + require_once 'Zend/File/Transfer/Exception.php'; + throw new Zend_File_Transfer_Exception('Method not implemented'); + } + + /** + * Returns all set types + * + * @return array List of set types + * @throws Zend_File_Transfer_Exception Not implemented + */ + public function getType() + { + require_once 'Zend/File/Transfer/Exception.php'; + throw new Zend_File_Transfer_Exception('Method not implemented'); + } + + /** + * Adds one or more type of files + * + * @param string|array $type Type of files to add + * @param string|array $validator Validators to use for this file, must be set before + * @param string|array $filter Filters to use for this file, must be set before + * @return Zend_File_Transfer_Adapter_Abstract + * @throws Zend_File_Transfer_Exception Not implemented + */ + public function addType($type, $validator = null, $filter = null) + { + require_once 'Zend/File/Transfer/Exception.php'; + throw new Zend_File_Transfer_Exception('Method not implemented'); + } + + /** + * Sets a new destination for the given files + * + * @deprecated Will be changed to be a filter!!! + * @param string $destination New destination directory + * @param string|array $files Files to set the new destination for + * @return Zend_File_Transfer_Abstract + * @throws Zend_File_Transfer_Exception when the given destination is not a directory or does not exist + */ + public function setDestination($destination, $files = null) + { + $orig = $files; + $destination = rtrim($destination, "/\\"); + if (!is_dir($destination)) { + require_once 'Zend/File/Transfer/Exception.php'; + throw new Zend_File_Transfer_Exception('The given destination is no directory or does not exist'); + } + + if ($files === null) { + foreach ($this->_files as $file => $content) { + $this->_files[$file]['destination'] = $destination; + } + } else { + $files = $this->_getFiles($files, true, true); + if (empty($this->_files) and is_string($orig)) { + $this->_files[$orig]['destination'] = $destination; + } + + foreach ($files as $file) { + $this->_files[$file]['destination'] = $destination; + } + } + + return $this; + } + + /** + * Retrieve destination directory value + * + * @param null|string|array $files + * @return null|string|array + */ + public function getDestination($files = null) + { + $files = $this->_getFiles($files, false); + $destinations = array(); + foreach ($files as $key => $content) { + if (isset($this->_files[$key]['destination'])) { + $destinations[$key] = $this->_files[$key]['destination']; + } else { + $tmpdir = $this->_getTmpDir(); + $this->setDestination($tmpdir, $key); + $destinations[$key] = $tmpdir; + } + } + + if (empty($destinations)) { + $destinations = $this->_getTmpDir(); + } else if (count($destinations) == 1) { + $destinations = current($destinations); + } + + return $destinations; + } + + /** + * Set translator object for localization + * + * @param Zend_Translate|null $translator + * @return Zend_File_Transfer_Abstract + */ + public function setTranslator($translator = null) + { + if (null === $translator) { + $this->_translator = null; + } elseif ($translator instanceof Zend_Translate_Adapter) { + $this->_translator = $translator; + } elseif ($translator instanceof Zend_Translate) { + $this->_translator = $translator->getAdapter(); + } else { + require_once 'Zend/File/Transfer/Exception.php'; + throw new Zend_File_Transfer_Exception('Invalid translator specified'); + } + + return $this; + } + + /** + * Retrieve localization translator object + * + * @return Zend_Translate_Adapter|null + */ + public function getTranslator() + { + if ($this->translatorIsDisabled()) { + return null; + } + + return $this->_translator; + } + + /** + * Indicate whether or not translation should be disabled + * + * @param bool $flag + * @return Zend_File_Transfer_Abstract + */ + public function setDisableTranslator($flag) + { + $this->_translatorDisabled = (bool) $flag; + return $this; + } + + /** + * Is translation disabled? + * + * @return bool + */ + public function translatorIsDisabled() + { + return $this->_translatorDisabled; + } + + /** + * Returns the hash for a given file + * + * @param string $hash Hash algorithm to use + * @param string|array $files Files to return the hash for + * @return string|array Hashstring + * @throws Zend_File_Transfer_Exception On unknown hash algorithm + */ + public function getHash($hash = 'crc32', $files = null) + { + $algorithms = hash_algos(); + if (!isset($algorithms[$hash])) { + require_once 'Zend/File/Transfer/Exception.php'; + throw new Zend_File_Transfer_Exception('Unknown hash algorithm'); + } + + $files = $this->_getFiles($files); + $result = array(); + foreach($files as $key => $value) { + if (file_exists($value['name'])) { + $result[$key] = hash_file($hash, $value['name']); + } else if (file_exists($value['tmp_name'])) { + $result[$key] = hash_file($hash, $value['tmp_name']); + } + } + + if (count($result) == 1) { + return current($result); + } + + return $result; + } + + /** + * Internal function to filter all given files + * + * @param string|array $files (Optional) Files to check + * @return boolean False on error + */ + protected function _filter($files = null) + { + $check = $this->_getFiles($files); + foreach ($check as $name => $content) { + if (array_key_exists('filters', $content)) { + foreach ($content['filters'] as $class) { + $filter = $this->_filters[$class]; + try { + $result = $filter->filter($this->getFileName($name)); + + $this->_files[$name]['destination'] = dirname($result); + $this->_files[$name]['name'] = basename($result); + } catch (Zend_Filter_Exception $e) { + $this->_messages += array($e->getMessage()); + } + } + } + } + + if (count($this->_messages) > 0) { + return false; + } + + return true; + } + + /** + * Determine system TMP directory + * + * @return string + * @throws Zend_File_Transfer_Exception if unable to determine directory + */ + protected function _getTmpDir() + { + if (null === $this->_tmpDir) { + if (function_exists('sys_get_temp_dir')) { + $tmpdir = sys_get_temp_dir(); + } elseif (!empty($_ENV['TMP'])) { + $tmpdir = realpath($_ENV['TMP']); + } elseif (!empty($_ENV['TMPDIR'])) { + $tmpdir = realpath($_ENV['TMPDIR']); + } else if (!empty($_ENV['TEMP'])) { + $tmpdir = realpath($_ENV['TEMP']); + } else { + // Attemp to detect by creating a temporary file + $tempFile = tempnam(md5(uniqid(rand(), TRUE)), ''); + if ($tempFile) { + $tmpdir = realpath(dirname($tempFile)); + unlink($tempFile); + } else { + require_once 'Zend/File/Transfer/Exception.php'; + throw new Zend_File_Transfer_Exception('Could not determine temp directory'); + } + } + $this->_tmpDir = rtrim($tmpdir, "/\\"); + } + return $this->_tmpDir; + } + + /** + * Returns found files based on internal file array and given files + * + * @param string|array $files (Optional) Files to return + * @param boolean $names (Optional) Returns only names on true, else complete info + * @param boolean $noexception (Optional) Allows throwing an exception, otherwise returns an empty array + * @return array Found files + * @throws Zend_File_Transfer_Exception On false filename + */ + protected function _getFiles($files, $names = false, $noexception = false) + { + $check = array(); + + if (is_string($files)) { + $files = array($files); + } + + if (is_array($files)) { + foreach ($files as $find) { + $found = array(); + foreach ($this->_files as $file => $content) { + if ($file === $find) { + $found[] = $file; + break; + } + + if (strpos($file, ($find . '_')) !== false) { + $found[] = $file; + } + + if (!isset($content['name'])) { + continue; + } + + if ($content['name'] === $find) { + $found[] = $file; + break; + } + } + + if (empty($found)) { + if ($noexception !== false) { + return array(); + } + + require_once 'Zend/File/Transfer/Exception.php'; + throw new Zend_File_Transfer_Exception(sprintf('"%s" not found by file transfer adapter', $find)); + } + + foreach ($found as $checked) { + $check[$checked] = $this->_files[$checked]; + } + } + } + + if ($files === null) { + $check = $this->_files; + } + + if ($names) { + $check = array_keys($check); + } + + return $check; + } + + /** + * Retrieve internal identifier for a named validator + * + * @param string $name + * @return string + */ + protected function _getValidatorIdentifier($name) + { + if (array_key_exists($name, $this->_validators)) { + return $name; + } + + foreach (array_keys($this->_validators) as $test) { + if (preg_match('/' . preg_quote($name) . '$/i', $test)) { + return $test; + } + } + + return false; + } + + /** + * Retrieve internal identifier for a named filter + * + * @param string $name + * @return string + */ + protected function _getFilterIdentifier($name) + { + if (array_key_exists($name, $this->_filters)) { + return $name; + } + + foreach (array_keys($this->_filters) as $test) { + if (preg_match('/' . preg_quote($name) . '$/i', $test)) { + return $test; + } + } + + return false; + } +} diff --git a/libs/Zend/File/Transfer/Adapter/Http.php b/libs/Zend/File/Transfer/Adapter/Http.php new file mode 100644 index 0000000..4d5b6f5 --- /dev/null +++ b/libs/Zend/File/Transfer/Adapter/Http.php @@ -0,0 +1,231 @@ +_files = $this->_prepareFiles($_FILES); + $this->addValidator('Upload', null, $this->_files); + + if (is_array($options)) { + $this->setOptions($options); + } + } + + /** + * Sets a validator for the class, erasing all previous set + * + * @param string|array $validator Validator to set + * @param string|array $files Files to limit this validator to + * @return Zend_File_Transfer_Adapter + */ + public function setValidators(array $validators, $files = null) + { + $this->clearValidators(); + $this->addValidator('Upload', null, $this->_files); + return $this->addValidators($validators, $files); + } + + /** + * Send the file to the client (Download) + * + * @param string|array $options Options for the file(s) to send + * @return void + * @throws Zend_File_Transfer_Exception Not implemented + */ + public function send($options = null) + { + require_once 'Zend/File/Transfer/Exception.php'; + throw new Zend_File_Transfer_Exception('Method not implemented'); + } + + /** + * Receive the file from the client (Upload) + * + * @param string|array $files (Optional) Files to receive + * @return bool + */ + public function receive($files = null) + { + if (!$this->isValid($files)) { + return false; + } + + $check = $this->_getFiles($files); + foreach ($check as $file => $content) { + $directory = ''; + $destination = $this->getDestination($file); + if ($destination !== null) { + $directory = $destination . DIRECTORY_SEPARATOR; + } + + // Should never return false when it's tested by the upload validator + if (!move_uploaded_file($content['tmp_name'], ($directory . $content['name']))) { + if ($content['options']['ignoreNoFile']) { + $this->_files[$file]['received'] = true; + $this->_files[$file]['filtered'] = true; + continue; + } + + $this->_files[$file]['received'] = false; + return false; + } + + $this->_files[$file]['received'] = true; + if (!$this->_filter($file)) { + $this->_files[$file]['filtered'] = false; + return false; + } + + $this->_files[$file]['filtered'] = true; + } + + return true; + } + + /** + * Checks if the file was already sent + * + * @param string|array $file Files to check + * @return bool + * @throws Zend_File_Transfer_Exception Not implemented + */ + public function isSent($files = null) + { + require_once 'Zend/File/Transfer/Exception.php'; + throw new Zend_File_Transfer_Exception('Method not implemented'); + } + + /** + * Checks if the file was already received + * + * @param string|array $files (Optional) Files to check + * @return bool + */ + public function isReceived($files = null) + { + $files = $this->_getFiles($files); + foreach ($files as $key => $content) { + if ($content['received'] !== true) { + return false; + } + } + + return true; + } + + /** + * Checks if the file was already filtered + * + * @param string|array $files (Optional) Files to check + * @return bool + */ + public function isFiltered($files = null) + { + $files = $this->_getFiles($files); + foreach ($files as $key => $content) { + if ($content['filtered'] !== true) { + return false; + } + } + + return true; + } + + /** + * Has a file been uploaded ? + * + * @param array|string|null $file + * @return bool + */ + public function isUploaded($files = null) + { + $files = $this->_getFiles($files); + foreach ($files as $file) { + if (empty($file['name'])) { + return false; + } + } + + return true; + } + + /** + * Returns the actual progress of file up-/downloads + * + * @return string Returns the state + * @return int + * @throws Zend_File_Transfer_Exception Not implemented + */ + public function getProgress() + { + require_once 'Zend/File/Transfer/Exception.php'; + throw new Zend_File_Transfer_Exception('Method not implemented'); + } + + /** + * Prepare the $_FILES array to match the internal syntax of one file per entry + * + * @param array $files + * @return array + */ + protected function _prepareFiles(array $files = array()) + { + $result = array(); + foreach ($files as $form => $content) { + if (is_array($content['name'])) { + foreach ($content as $param => $file) { + foreach ($file as $number => $target) { + $result[$form . '_' . $number . '_'][$param] = $target; + $result[$form . '_' . $number . '_']['options'] = $this->_options; + $result[$form . '_' . $number . '_']['validated'] = false; + $result[$form . '_' . $number . '_']['received'] = false; + $result[$form . '_' . $number . '_']['filtered'] = false; + } + } + } else { + $result[$form] = $content; + $result[$form]['options'] = $this->_options; + $result[$form]['validated'] = false; + $result[$form]['received'] = false; + $result[$form]['filtered'] = false; + } + } + + return $result; + } +} diff --git a/libs/Zend/File/Transfer/Exception.php b/libs/Zend/File/Transfer/Exception.php new file mode 100644 index 0000000..06ccf2d --- /dev/null +++ b/libs/Zend/File/Transfer/Exception.php @@ -0,0 +1,55 @@ +_fileerror = $fileerror; + parent::__construct($message); + } + + /** + * Returns the transfer error code for the exception + * This is not the exception code !!! + * + * @return integer + */ + public function getFileError() + { + return $this->_fileerror; + } +} diff --git a/libs/Zend/Filter.php b/libs/Zend/Filter.php new file mode 100644 index 0000000..23bec21 --- /dev/null +++ b/libs/Zend/Filter.php @@ -0,0 +1,115 @@ +_filters[] = $filter; + return $this; + } + + /** + * Returns $value filtered through each filter in the chain + * + * Filters are run in the order in which they were added to the chain (FIFO) + * + * @param mixed $value + * @return mixed + */ + public function filter($value) + { + $valueFiltered = $value; + foreach ($this->_filters as $filter) { + $valueFiltered = $filter->filter($valueFiltered); + } + return $valueFiltered; + } + + /** + * Returns a value filtered through a specified filter class, without requiring separate + * instantiation of the filter object. + * + * The first argument of this method is a data input value, that you would have filtered. + * The second argument is a string, which corresponds to the basename of the filter class, + * relative to the Zend_Filter namespace. This method automatically loads the class, + * creates an instance, and applies the filter() method to the data input. You can also pass + * an array of constructor arguments, if they are needed for the filter class. + * + * @param mixed $value + * @param string $classBaseName + * @param array $args OPTIONAL + * @param array|string $namespaces OPTIONAL + * @return mixed + * @throws Zend_Filter_Exception + */ + public static function get($value, $classBaseName, array $args = array(), $namespaces = array()) + { + require_once 'Zend/Loader.php'; + $namespaces = array_merge(array('Zend_Filter'), (array) $namespaces); + foreach ($namespaces as $namespace) { + $className = $namespace . '_' . ucfirst($classBaseName); + try { + @Zend_Loader::loadClass($className); + } catch (Zend_Exception $ze) { + continue; + } + $class = new ReflectionClass($className); + if ($class->implementsInterface('Zend_Filter_Interface')) { + if ($class->hasMethod('__construct')) { + $object = $class->newInstanceArgs($args); + } else { + $object = $class->newInstance(); + } + return $object->filter($value); + } + } + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception("Filter class not found from basename '$classBaseName'"); + } +} diff --git a/libs/Zend/Filter/Alnum.php b/libs/Zend/Filter/Alnum.php new file mode 100644 index 0000000..e81b198 --- /dev/null +++ b/libs/Zend/Filter/Alnum.php @@ -0,0 +1,115 @@ +allowWhiteSpace = (boolean) $allowWhiteSpace; + if (null === self::$_unicodeEnabled) { + self::$_unicodeEnabled = (@preg_match('/\pL/u', 'a')) ? true : false; + } + + if (null === self::$_meansEnglishAlphabet) { + $this->_locale = new Zend_Locale(Zend_Locale::BROWSER); + self::$_meansEnglishAlphabet = in_array($this->_locale->getLanguage(), + array('ja') + ); + } + + } + + /** + * Defined by Zend_Filter_Interface + * + * Returns the string $value, removing all but alphabetic and digit characters + * + * @param string $value + * @return string + */ + public function filter($value) + { + $whiteSpace = $this->allowWhiteSpace ? '\s' : ''; + if (!self::$_unicodeEnabled) { + // POSIX named classes are not supported, use alternative a-zA-Z0-9 match + $pattern = '/[^a-zA-Z0-9' . $whiteSpace . ']/'; + } else if (self::$_meansEnglishAlphabet) { + //The Alphabet means english alphabet. + $pattern = '/[^a-zA-Z0-9' . $whiteSpace . ']/u'; + } else { + //The Alphabet means each language's alphabet. + $pattern = '/[^\p{L}\p{N}' . $whiteSpace . ']/u'; + } + + return preg_replace($pattern, '', (string) $value); + } +} diff --git a/libs/Zend/Filter/Alpha.php b/libs/Zend/Filter/Alpha.php new file mode 100644 index 0000000..a19125f --- /dev/null +++ b/libs/Zend/Filter/Alpha.php @@ -0,0 +1,115 @@ +allowWhiteSpace = (boolean) $allowWhiteSpace; + if (null === self::$_unicodeEnabled) { + self::$_unicodeEnabled = (@preg_match('/\pL/u', 'a')) ? true : false; + } + + if (null === self::$_meansEnglishAlphabet) { + $this->_locale = new Zend_Locale(Zend_Locale::BROWSER); + self::$_meansEnglishAlphabet = in_array($this->_locale->getLanguage(), + array('ja') + ); + } + + } + + /** + * Defined by Zend_Filter_Interface + * + * Returns the string $value, removing all but alphabetic characters + * + * @param string $value + * @return string + */ + public function filter($value) + { + $whiteSpace = $this->allowWhiteSpace ? '\s' : ''; + if (!self::$_unicodeEnabled) { + // POSIX named classes are not supported, use alternative a-zA-Z match + $pattern = '/[^a-zA-Z' . $whiteSpace . ']/'; + } else if (self::$_meansEnglishAlphabet) { + //The Alphabet means english alphabet. + $pattern = '/[^a-zA-Z' . $whiteSpace . ']/u'; + } else { + //The Alphabet means each language's alphabet. + $pattern = '/[^\p{L}' . $whiteSpace . ']/u'; + } + + return preg_replace($pattern, '', (string) $value); + } +} diff --git a/libs/Zend/Filter/BaseName.php b/libs/Zend/Filter/BaseName.php new file mode 100644 index 0000000..a0652ab --- /dev/null +++ b/libs/Zend/Filter/BaseName.php @@ -0,0 +1,50 @@ + Source filename or directory which will be renamed + * 'target' => Target filename or directory, the new name of the sourcefile + * 'overwrite' => Shall existing files be overwritten ? + * + * @param string|array $options Target file or directory to be renamed + * @param string $target Source filename or directory (deprecated) + * @param bool $overwrite Should existing files be overwritten (deprecated) + * @return void + */ + public function __construct($options) + { + if ($options instanceof Zend_Config) { + $options = $options->toArray(); + } elseif (is_string($options)) { + $options = array('target' => $options); + } elseif (!is_array($options)) { + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception('Invalid options argument provided to rename filter'); + } + + if (1 < func_num_args()) { + trigger_error('Support for multiple arguments is deprecated in favor of a single options array', E_USER_NOTICE); + $argv = func_get_args(); + array_shift($argv); + $source = array_shift($argv); + $overwrite = false; + if (!empty($argv)) { + $overwrite = array_shift($argv); + } + $options['source'] = $source; + $options['overwrite'] = $overwrite; + } + + $this->setFile($options); + } + + /** + * Returns the files to rename and their new name and location + * + * @return array + */ + public function getFile() + { + return $this->_files; + } + + /** + * Sets a new file or directory as target, deleting existing ones + * + * Array accepts the following keys: + * 'source' => Source filename or directory which will be renamed + * 'target' => Target filename or directory, the new name of the sourcefile + * 'overwrite' => Shall existing files be overwritten ? + * + * @param string|array $options Old file or directory to be rewritten + * @return Zend_Filter_File_Rename + */ + public function setFile($options) + { + $this->_files = array(); + $this->addFile($options); + + return $this; + } + + /** + * Adds a new file or directory as target to the existing ones + * + * Array accepts the following keys: + * 'source' => Source filename or directory which will be renamed + * 'target' => Target filename or directory, the new name of the sourcefile + * 'overwrite' => Shall existing files be overwritten ? + * + * @param string|array $options Old file or directory to be rewritten + * @return Zend_Filter_File_Rename + */ + public function addFile($options) + { + if (is_string($options)) { + $options = array('target' => $options); + } elseif (!is_array($options)) { + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception ('Invalid options to rename filter provided'); + } + + $this->_convertOptions($options); + + return $this; + } + + /** + * Defined by Zend_Filter_Interface + * + * Renames the file $value to the new name set before + * Returns the file $value, removing all but digit characters + * + * @param string $value Full path of file to change + * @return string The new filename which has been set, or false when there were errors + */ + public function filter($value) + { + $file = $this->_getFileName($value); + if ($file['source'] == $file['target']) { + return $value; + } + + if (!file_exists($file['source'])) { + return $value; + } + + if (($file['overwrite'] == true) and (file_exists($file['target']))) { + unlink($file['target']); + } + + if (file_exists($file['target'])) { + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception(sprintf("File '%s' could not be renamed. It already exists.", $value)); + } + + $result = rename($file['source'], $file['target']); + + if ($result === true) { + return $file['target']; + } + + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception(sprintf("File '%s' could not be renamed. An error occured while processing the file.", $value)); + } + + /** + * Internal method for creating the file array + * Supports single and nested arrays + * + * @param array $options + * @return array + */ + protected function _convertOptions($options) { + $files = array(); + foreach ($options as $key => $value) { + if (is_array($value)) { + $this->_convertOptions($value); + continue; + } + + switch ($key) { + case "source": + $files['source'] = (string) $value; + break; + + case 'target' : + $files['target'] = (string) $value; + break; + + case 'overwrite' : + $files['overwrite'] = (boolean) $value; + break; + + default: + break; + } + } + + if (empty($files)) { + return $this; + } + + if (empty($files['source'])) { + $files['source'] = '*'; + } + + if (empty($files['target'])) { + $files['target'] = '*'; + } + + if (empty($files['overwrite'])) { + $files['overwrite'] = false; + } + + $found = false; + foreach ($this->_files as $key => $value) { + if ($value['source'] == $files['source']) { + $this->_files[$key] = $files; + $found = true; + } + } + + if (!$found) { + $count = count($this->_files); + $this->_files[$count] = $files; + } + + return $this; + } + + /** + * Internal method to resolve the requested source + * and return all other related parameters + * + * @param string $file Filename to get the informations for + * @return array + */ + protected function _getFileName($file) + { + $rename = array(); + foreach ($this->_files as $value) { + if ($value['source'] == '*') { + if (!isset($rename['source'])) { + $rename = $value; + $rename['source'] = $file; + } + } + + if ($value['source'] == $file) { + $rename = $value; + } + } + + if (!isset($rename['source'])) { + return $file; + } + + if (!isset($rename['target']) or ($rename['target'] == '*')) { + $rename['target'] = $rename['source']; + } + + if (is_dir($rename['target'])) { + $name = basename($rename['source']); + $last = $rename['target'][strlen($rename['target']) - 1]; + if (($last != '/') and ($last != '\\')) { + $rename['target'] .= DIRECTORY_SEPARATOR; + } + + $rename['target'] .= $name; + } + + return $rename; + } +} diff --git a/libs/Zend/Filter/File/UpperCase.php b/libs/Zend/Filter/File/UpperCase.php new file mode 100644 index 0000000..f5da317 --- /dev/null +++ b/libs/Zend/Filter/File/UpperCase.php @@ -0,0 +1,72 @@ +_quoteStyle = $quoteStyle; + $this->_charSet = $charSet; + } + + /** + * Returns the quoteStyle option + * + * @return integer + */ + public function getQuoteStyle() + { + return $this->_quoteStyle; + } + + /** + * Sets the quoteStyle option + * + * @param integer $quoteStyle + * @return Zend_Filter_HtmlEntities Provides a fluent interface + */ + public function setQuoteStyle($quoteStyle) + { + $this->_quoteStyle = $quoteStyle; + return $this; + } + + /** + * Returns the charSet option + * + * @return string + */ + public function getCharSet() + { + return $this->_charSet; + } + + /** + * Sets the charSet option + * + * @param string $charSet + * @return Zend_Filter_HtmlEntities Provides a fluent interface + */ + public function setCharSet($charSet) + { + $this->_charSet = $charSet; + return $this; + } + + /** + * Defined by Zend_Filter_Interface + * + * Returns the string $value, converting characters to their corresponding HTML entity + * equivalents where they exist + * + * @param string $value + * @return string + */ + public function filter($value) + { + return htmlentities((string) $value, $this->_quoteStyle, $this->_charSet); + } +} diff --git a/libs/Zend/Filter/Inflector.php b/libs/Zend/Filter/Inflector.php new file mode 100644 index 0000000..4e7e493 --- /dev/null +++ b/libs/Zend/Filter/Inflector.php @@ -0,0 +1,497 @@ +setConfig($target); + } else { + if ((null !== $target) && is_string($target)) { + $this->setTarget($target); + } + + if (null !== $rules) { + $this->addRules($rules); + } + + if ($throwTargetExceptionsOn !== null) { + $this->setThrowTargetExceptionsOn($throwTargetExceptionsOn); + } + + if ($targetReplacementIdentifer != '') { + $this->setTargetReplacementIdentifier($targetReplacementIdentifer); + } + } + } + + /** + * Retreive PluginLoader + * + * @return Zend_Loader_PluginLoader_Interface + */ + public function getPluginLoader() + { + if (!$this->_pluginLoader instanceof Zend_Loader_PluginLoader_Interface) { + $this->_pluginLoader = new Zend_Loader_PluginLoader(array('Zend_Filter_' => 'Zend/Filter/'), __CLASS__); + } + + return $this->_pluginLoader; + } + + /** + * Set PluginLoader + * + * @param Zend_Loader_PluginLoader_Interface $pluginLoader + * @return Zend_Filter_Inflector + */ + public function setPluginLoader(Zend_Loader_PluginLoader_Interface $pluginLoader) + { + $this->_pluginLoader = $pluginLoader; + return $this; + } + + /** + * Use Zend_Config object to set object state + * + * @param Zend_Config $config + * @return Zend_Filter_Inflector + */ + public function setConfig(Zend_Config $config) + { + foreach ($config as $key => $value) { + switch ($key) { + case 'target': + $this->setTarget($value); + break; + case 'filterPrefixPath': + if (is_scalar($value)) { + break; + } + $paths = $value->toArray(); + foreach ($paths as $prefix => $path) { + $this->addFilterPrefixPath($prefix, $path); + } + break; + case 'throwTargetExceptionsOn': + $this->setThrowTargetExceptionsOn($value); + break; + case 'targetReplacementIdentifier': + $this->setTargetReplacementIdentifier($value); + break; + case 'rules': + $this->addRules($value->toArray()); + break; + default: + break; + } + } + return $this; + } + + /** + * Convienence method to add prefix and path to PluginLoader + * + * @param string $prefix + * @param string $path + * @return Zend_Filter_Inflector + */ + public function addFilterPrefixPath($prefix, $path) + { + $this->getPluginLoader()->addPrefixPath($prefix, $path); + return $this; + } + + /** + * Set Whether or not the inflector should throw an exception when a replacement + * identifier is still found within an inflected target. + * + * @param bool $throwTargetExceptions + * @return Zend_Filter_Inflector + */ + public function setThrowTargetExceptionsOn($throwTargetExceptionsOn) + { + $this->_throwTargetExceptionsOn = ($throwTargetExceptionsOn == true) ? true : false; + return $this; + } + + /** + * Will exceptions be thrown? + * + * @return bool + */ + public function isThrowTargetExceptionsOn() + { + return $this->_throwTargetExceptionsOn; + } + + /** + * Set the Target Replacement Identifier, by default ':' + * + * @param string $targetReplacementIdentifier + * @return Zend_Filter_Inflector + */ + public function setTargetReplacementIdentifier($targetReplacementIdentifier) + { + $this->_targetReplacementIdentifier = (string) $targetReplacementIdentifier; + return $this; + } + + /** + * Get Target Replacement Identifier + * + * @return string + */ + public function getTargetReplacementIdentifier() + { + return $this->_targetReplacementIdentifier; + } + + /** + * Set a Target + * ex: 'scripts/:controller/:action.:suffix' + * + * @param string + * @return Zend_Filter_Inflector + */ + public function setTarget($target) + { + $this->_target = (string) $target; + return $this; + } + + /** + * Retrieve target + * + * @return string + */ + public function getTarget() + { + return $this->_target; + } + + /** + * Set Target Reference + * + * @param reference $target + * @return Zend_Filter_Inflector + */ + public function setTargetReference(&$target) + { + $this->_target =& $target; + return $this; + } + + /** + * SetRules() is the same as calling addRules() with the exception that it + * clears the rules before adding them. + * + * @param array $rules + * @return Zend_Filter_Inflector + */ + public function setRules(Array $rules) + { + $this->clearRules(); + $this->addRules($rules); + return $this; + } + + /** + * AddRules(): multi-call to setting filter rules. + * + * If prefixed with a ":" (colon), a filter rule will be added. If not + * prefixed, a static replacement will be added. + * + * ex: + * array( + * ':controller' => array('CamelCaseToUnderscore','StringToLower'), + * ':action' => array('CamelCaseToUnderscore','StringToLower'), + * 'suffix' => 'phtml' + * ); + * + * @param array + * @return Zend_Filter_Inflector + */ + public function addRules(Array $rules) + { + $keys = array_keys($rules); + foreach ($keys as $spec) { + if ($spec[0] == ':') { + $this->addFilterRule($spec, $rules[$spec]); + } else { + $this->setStaticRule($spec, $rules[$spec]); + } + } + + return $this; + } + + /** + * Get rules + * + * By default, returns all rules. If a $spec is provided, will return those + * rules if found, false otherwise. + * + * @param string $spec + * @return array|false + */ + public function getRules($spec = null) + { + if (null !== $spec) { + $spec = $this->_normalizeSpec($spec); + if (isset($this->_rules[$spec])) { + return $this->_rules[$spec]; + } + return false; + } + + return $this->_rules; + } + + /** + * getRule() returns a rule set by setFilterRule(), a numeric index must be provided + * + * @param string $spec + * @param int $index + * @return Zend_Filter_Interface|false + */ + public function getRule($spec, $index) + { + $spec = $this->_normalizeSpec($spec); + if (isset($this->_rules[$spec]) && is_array($this->_rules[$spec])) { + if (isset($this->_rules[$spec][$index])) { + return $this->_rules[$spec][$index]; + } + } + return false; + } + + /** + * ClearRules() clears the rules currently in the inflector + * + * @return Zend_Filter_Inflector + */ + public function clearRules() + { + $this->_rules = array(); + return $this; + } + + /** + * Set a filtering rule for a spec. $ruleSet can be a string, Filter object + * or an array of strings or filter objects. + * + * @param string $spec + * @param array|string|Zend_Filter_Interface $ruleSet + * @return Zend_Filter_Inflector + */ + public function setFilterRule($spec, $ruleSet) + { + $spec = $this->_normalizeSpec($spec); + $this->_rules[$spec] = array(); + return $this->addFilterRule($spec, $ruleSet); + } + + /** + * Add a filter rule for a spec + * + * @param mixed $spec + * @param mixed $ruleSet + * @return void + */ + public function addFilterRule($spec, $ruleSet) + { + $spec = $this->_normalizeSpec($spec); + if (!isset($this->_rules[$spec])) { + $this->_rules[$spec] = array(); + } + if (!is_array($ruleSet)) { + $ruleSet = array($ruleSet); + } + foreach ($ruleSet as $rule) { + $this->_rules[$spec][] = $this->_getRule($rule); + } + return $this; + } + + /** + * Set a static rule for a spec. This is a single string value + * + * @param string $name + * @param string $value + * @return Zend_Filter_Inflector + */ + public function setStaticRule($name, $value) + { + $name = $this->_normalizeSpec($name); + $this->_rules[$name] = (string) $value; + return $this; + } + + /** + * Set Static Rule Reference. + * + * This allows a consuming class to pass a property or variable + * in to be referenced when its time to build the output string from the + * target. + * + * @param string $name + * @param mixed $reference + * @return Zend_Filter_Inflector + */ + public function setStaticRuleReference($name, &$reference) + { + $name = $this->_normalizeSpec($name); + $this->_rules[$name] =& $reference; + return $this; + } + + /** + * Inflect + * + * @param string|array $source + * @return string + */ + public function filter($source) + { + // clean source + foreach ( (array) $source as $sourceName => $sourceValue) { + $source[ltrim($sourceName, ':')] = $sourceValue; + } + + $pregQuotedTargetReplacementIdentifier = preg_quote($this->_targetReplacementIdentifier, '#'); + $processedParts = array(); + + foreach ($this->_rules as $ruleName => $ruleValue) { + if (isset($source[$ruleName])) { + if (is_string($ruleValue)) { + // overriding the set rule + $processedParts['#'.$pregQuotedTargetReplacementIdentifier.$ruleName.'#'] = str_replace('\\', '\\\\', $source[$ruleName]); + } elseif (is_array($ruleValue)) { + $processedPart = $source[$ruleName]; + foreach ($ruleValue as $ruleFilter) { + $processedPart = $ruleFilter->filter($processedPart); + } + $processedParts['#'.$pregQuotedTargetReplacementIdentifier.$ruleName.'#'] = str_replace('\\', '\\\\', $processedPart); + } + } elseif (is_string($ruleValue)) { + $processedParts['#'.$pregQuotedTargetReplacementIdentifier.$ruleName.'#'] = str_replace('\\', '\\\\', $ruleValue); + } + } + + // all of the values of processedParts would have been str_replace('\\', '\\\\', ..)'d to disable preg_replace backreferences + $inflectedTarget = preg_replace(array_keys($processedParts), array_values($processedParts), $this->_target); + + if ($this->_throwTargetExceptionsOn && (preg_match('#(?='.$pregQuotedTargetReplacementIdentifier.'[A-Za-z]{1})#', $inflectedTarget) == true)) { + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception('A replacement identifier ' . $this->_targetReplacementIdentifier . ' was found inside the inflected target, perhaps a rule was not satisfied with a target source? Unsatisfied inflected target: ' . $inflectedTarget); + } + + return $inflectedTarget; + } + + /** + * Normalize spec string + * + * @param string $spec + * @return string + */ + protected function _normalizeSpec($spec) + { + return ltrim((string) $spec, ':&'); + } + + /** + * Resolve named filters and convert them to filter objects. + * + * @param string $rule + * @return Zend_Filter_Interface + */ + protected function _getRule($rule) + { + if ($rule instanceof Zend_Filter_Interface) { + return $rule; + } + + $rule = (string) $rule; + + $className = $this->getPluginLoader()->load($rule); + $ruleObject = new $className(); + if (!$ruleObject instanceof Zend_Filter_Interface) { + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception('No class named ' . $rule . ' implementing Zend_Filter_Interface could be found'); + } + + return $ruleObject; + } + +} diff --git a/libs/Zend/Filter/Input.php b/libs/Zend/Filter/Input.php new file mode 100644 index 0000000..a6782a3 --- /dev/null +++ b/libs/Zend/Filter/Input.php @@ -0,0 +1,926 @@ + false, + self::BREAK_CHAIN => false, + self::ESCAPE_FILTER => 'HtmlEntities', + self::MISSING_MESSAGE => "Field '%field%' is required by rule '%rule%', but the field is missing", + self::NOT_EMPTY_MESSAGE => "You must give a non-empty value for field '%field%'", + self::PRESENCE => self::PRESENCE_OPTIONAL + ); + + /** + * @var boolean Set to False initially, this is set to True after the + * input data have been processed. Reset to False in setData() method. + */ + protected $_processed = false; + + /** + * @param array $filterRules + * @param array $validatorRules + * @param array $data OPTIONAL + * @param array $options OPTIONAL + */ + public function __construct($filterRules, $validatorRules, array $data = null, array $options = null) + { + if ($options) { + $this->setOptions($options); + } + + $this->_filterRules = (array) $filterRules; + $this->_validatorRules = (array) $validatorRules; + + if ($data) { + $this->setData($data); + } + } + + /** + * @param mixed $namespaces + * @return Zend_Filter_Input + * @deprecated since 1.5.0RC1 - use addFilterPrefixPath() or addValidatorPrefixPath instead. + */ + public function addNamespace($namespaces) + { + if (!is_array($namespaces)) { + $namespaces = array($namespaces); + } + + foreach ($namespaces as $namespace) { + $prefix = $namespace; + $path = str_replace('_', DIRECTORY_SEPARATOR, $prefix); + $this->addFilterPrefixPath($prefix, $path); + $this->addValidatorPrefixPath($prefix, $path); + } + + return $this; + } + + /** + * Add prefix path for all elements + * + * @param string $prefix + * @param string $path + * @return Zend_Filter_Input + */ + public function addFilterPrefixPath($prefix, $path) + { + $this->getPluginLoader(self::FILTER)->addPrefixPath($prefix, $path); + + return $this; + } + + /** + * Add prefix path for all elements + * + * @param string $prefix + * @param string $path + * @return Zend_Filter_Input + */ + public function addValidatorPrefixPath($prefix, $path) + { + $this->getPluginLoader(self::VALIDATE)->addPrefixPath($prefix, $path); + + return $this; + } + + /** + * Set plugin loaders for use with decorators and elements + * + * @param Zend_Loader_PluginLoader_Interface $loader + * @param string $type 'filter' or 'validate' + * @return Zend_Filter_Input + * @throws Zend_Filter_Exception on invalid type + */ + public function setPluginLoader(Zend_Loader_PluginLoader_Interface $loader, $type) + { + $type = strtolower($type); + switch ($type) { + case self::FILTER: + case self::VALIDATE: + $this->_loaders[$type] = $loader; + return $this; + default: + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception(sprintf('Invalid type "%s" provided to setPluginLoader()', $type)); + } + + return $this; + } + + /** + * Retrieve plugin loader for given type + * + * $type may be one of: + * - filter + * - validator + * + * If a plugin loader does not exist for the given type, defaults are + * created. + * + * @param string $type 'filter' or 'validate' + * @return Zend_Loader_PluginLoader_Interface + * @throws Zend_Filter_Exception on invalid type + */ + public function getPluginLoader($type) + { + $type = strtolower($type); + if (!isset($this->_loaders[$type])) { + switch ($type) { + case self::FILTER: + $prefixSegment = 'Zend_Filter_'; + $pathSegment = 'Zend/Filter/'; + break; + case self::VALIDATE: + $prefixSegment = 'Zend_Validate_'; + $pathSegment = 'Zend/Validate/'; + break; + default: + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception(sprintf('Invalid type "%s" provided to getPluginLoader()', $type)); + } + + require_once 'Zend/Loader/PluginLoader.php'; + $this->_loaders[$type] = new Zend_Loader_PluginLoader( + array($prefixSegment => $pathSegment) + ); + } + + return $this->_loaders[$type]; + } + + /** + * @return array + */ + public function getMessages() + { + $this->_process(); + return array_merge($this->_invalidMessages, $this->_missingFields); + } + + /** + * @return array + */ + public function getErrors() + { + $this->_process(); + return $this->_invalidErrors; + } + + /** + * @return array + */ + public function getInvalid() + { + $this->_process(); + return $this->_invalidMessages; + } + + /** + * @return array + */ + public function getMissing() + { + $this->_process(); + return $this->_missingFields; + } + + /** + * @return array + */ + public function getUnknown() + { + $this->_process(); + return $this->_unknownFields; + } + + /** + * @param string $fieldName OPTIONAL + * @return mixed + */ + public function getEscaped($fieldName = null) + { + $this->_process(); + $this->_getDefaultEscapeFilter(); + + if ($fieldName === null) { + return $this->_escapeRecursive($this->_validFields); + } + if (array_key_exists($fieldName, $this->_validFields)) { + return $this->_escapeRecursive($this->_validFields[$fieldName]); + } + return null; + } + + /** + * @param mixed $value + * @return mixed + */ + protected function _escapeRecursive($data) + { + if (!is_array($data)) { + return $this->_getDefaultEscapeFilter()->filter($data); + } + foreach ($data as &$element) { + $element = $this->_escapeRecursive($element); + } + return $data; + } + + /** + * @param string $fieldName OPTIONAL + * @return mixed + */ + public function getUnescaped($fieldName = null) + { + $this->_process(); + if ($fieldName === null) { + return $this->_validFields; + } + if (array_key_exists($fieldName, $this->_validFields)) { + return $this->_validFields[$fieldName]; + } + return null; + } + + /** + * @param string $fieldName + * @return mixed + */ + public function __get($fieldName) + { + return $this->getEscaped($fieldName); + } + + /** + * @return boolean + */ + public function hasInvalid() + { + $this->_process(); + return !(empty($this->_invalidMessages)); + } + + /** + * @return boolean + */ + public function hasMissing() + { + $this->_process(); + return !(empty($this->_missingFields)); + } + + /** + * @return boolean + */ + public function hasUnknown() + { + $this->_process(); + return !(empty($this->_unknownFields)); + } + + /** + * @return boolean + */ + public function hasValid() + { + $this->_process(); + return !(empty($this->_validFields)); + } + + /** + * @param string $fieldName + * @return boolean + */ + public function isValid($fieldName = null) + { + $this->_process(); + if ($fieldName === null) { + return !($this->hasMissing() || $this->hasInvalid()); + } + return array_key_exists($fieldName, $this->_validFields); + } + + /** + * @param string $fieldName + * @return boolean + */ + public function __isset($fieldName) + { + $this->_process(); + return isset($this->_validFields[$fieldName]); + } + + /** + * @return Zend_Filter_Input + * @throws Zend_Filter_Exception + */ + public function process() + { + $this->_process(); + if ($this->hasInvalid()) { + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception("Input has invalid fields"); + } + if ($this->hasMissing()) { + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception("Input has missing fields"); + } + + return $this; + } + + /** + * @param array $data + * @return Zend_Filter_Input + */ + public function setData(array $data) + { + $this->_data = $data; + + /** + * Reset to initial state + */ + $this->_validFields = array(); + $this->_invalidMessages = array(); + $this->_invalidErrors = array(); + $this->_missingFields = array(); + $this->_unknownFields = array(); + + $this->_processed = false; + + return $this; + } + + /** + * @param mixed $escapeFilter + * @return Zend_Filter_Interface + */ + public function setDefaultEscapeFilter($escapeFilter) + { + if (is_string($escapeFilter) || is_array($escapeFilter)) { + $escapeFilter = $this->_getFilter($escapeFilter); + } + if (!$escapeFilter instanceof Zend_Filter_Interface) { + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception('Escape filter specified does not implement Zend_Filter_Interface'); + } + $this->_defaultEscapeFilter = $escapeFilter; + return $escapeFilter; + } + + /** + * @param array $options + * @return Zend_Filter_Input + * @throws Zend_Filter_Exception if an unknown option is given + */ + public function setOptions(array $options) + { + foreach ($options as $option => $value) { + switch ($option) { + case self::ESCAPE_FILTER: + $this->setDefaultEscapeFilter($value); + break; + case self::INPUT_NAMESPACE: + $this->addNamespace($value); + break; + case self::ALLOW_EMPTY: + case self::BREAK_CHAIN: + case self::MISSING_MESSAGE: + case self::NOT_EMPTY_MESSAGE: + case self::PRESENCE: + $this->_defaults[$option] = $value; + break; + default: + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception("Unknown option '$option'"); + break; + } + } + + return $this; + } + + /* + * Protected methods + */ + + /** + * @return void + */ + protected function _filter() + { + foreach ($this->_filterRules as $ruleName => &$filterRule) { + /** + * Make sure we have an array representing this filter chain. + * Don't typecast to (array) because it might be a Zend_Filter object + */ + if (!is_array($filterRule)) { + $filterRule = array($filterRule); + } + + /** + * Filters are indexed by integer, metacommands are indexed by string. + * Pick out the filters. + */ + $filterList = array(); + foreach ($filterRule as $key => $value) { + if (is_int($key)) { + $filterList[] = $value; + } + } + + /** + * Use defaults for filter metacommands. + */ + $filterRule[self::RULE] = $ruleName; + if (!isset($filterRule[self::FIELDS])) { + $filterRule[self::FIELDS] = $ruleName; + } + + /** + * Load all the filter classes and add them to the chain. + */ + if (!isset($filterRule[self::FILTER_CHAIN])) { + $filterRule[self::FILTER_CHAIN] = new Zend_Filter(); + foreach ($filterList as $filter) { + if (is_string($filter) || is_array($filter)) { + $filter = $this->_getFilter($filter); + } + $filterRule[self::FILTER_CHAIN]->addFilter($filter); + } + } + + /** + * If the ruleName is the special wildcard rule, + * then apply the filter chain to all input data. + * Else just process the field named by the rule. + */ + if ($ruleName == self::RULE_WILDCARD) { + foreach (array_keys($this->_data) as $field) { + $this->_filterRule(array_merge($filterRule, array(self::FIELDS => $field))); + } + } else { + $this->_filterRule($filterRule); + } + } + } + + /** + * @param array $filterRule + * @return void + */ + protected function _filterRule(array $filterRule) + { + $field = $filterRule[self::FIELDS]; + if (!array_key_exists($field, $this->_data)) { + return; + } + if (is_array($this->_data[$field])) { + foreach ($this->_data[$field] as $key => $value) { + $this->_data[$field][$key] = $filterRule[self::FILTER_CHAIN]->filter($value); + } + } else { + $this->_data[$field] = + $filterRule[self::FILTER_CHAIN]->filter($this->_data[$field]); + } + } + + /** + * @return Zend_Filter_Interface + */ + protected function _getDefaultEscapeFilter() + { + if ($this->_defaultEscapeFilter !== null) { + return $this->_defaultEscapeFilter; + } + return $this->setDefaultEscapeFilter($this->_defaults[self::ESCAPE_FILTER]); + } + + /** + * @param string $rule + * @param string $field + * @return string + */ + protected function _getMissingMessage($rule, $field) + { + $message = $this->_defaults[self::MISSING_MESSAGE]; + $message = str_replace('%rule%', $rule, $message); + $message = str_replace('%field%', $field, $message); + return $message; + } + + /** + * @return string + */ + protected function _getNotEmptyMessage($rule, $field) + { + $message = $this->_defaults[self::NOT_EMPTY_MESSAGE]; + $message = str_replace('%rule%', $rule, $message); + $message = str_replace('%field%', $field, $message); + return $message; + } + + /** + * @return void + */ + protected function _process() + { + if ($this->_processed === false) { + $this->_filter(); + $this->_validate(); + $this->_processed = true; + } + } + + /** + * @return void + */ + protected function _validate() + { + /** + * Special case: if there are no validators, treat all fields as valid. + */ + if (!$this->_validatorRules) { + $this->_validFields = $this->_data; + $this->_data = array(); + return; + } + + foreach ($this->_validatorRules as $ruleName => &$validatorRule) { + /** + * Make sure we have an array representing this validator chain. + * Don't typecast to (array) because it might be a Zend_Validate object + */ + if (!is_array($validatorRule)) { + $validatorRule = array($validatorRule); + } + + /** + * Validators are indexed by integer, metacommands are indexed by string. + * Pick out the validators. + */ + $validatorList = array(); + foreach ($validatorRule as $key => $value) { + if (is_int($key)) { + $validatorList[] = $value; + } + } + + /** + * Use defaults for validation metacommands. + */ + $validatorRule[self::RULE] = $ruleName; + if (!isset($validatorRule[self::FIELDS])) { + $validatorRule[self::FIELDS] = $ruleName; + } + if (!isset($validatorRule[self::BREAK_CHAIN])) { + $validatorRule[self::BREAK_CHAIN] = $this->_defaults[self::BREAK_CHAIN]; + } + if (!isset($validatorRule[self::PRESENCE])) { + $validatorRule[self::PRESENCE] = $this->_defaults[self::PRESENCE]; + } + 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])) { + $validatorRule[self::MESSAGES] = array($validatorRule[self::MESSAGES]); + } + + /** + * Load all the validator classes and add them to the chain. + */ + if (!isset($validatorRule[self::VALIDATOR_CHAIN])) { + $validatorRule[self::VALIDATOR_CHAIN] = new Zend_Validate(); + $i = 0; + foreach ($validatorList as $validator) { + + if (is_string($validator) || is_array($validator)) { + $validator = $this->_getValidator($validator); + } + if (isset($validatorRule[self::MESSAGES][$i])) { + $value = $validatorRule[self::MESSAGES][$i]; + if (is_array($value)) { + $validator->setMessages($value); + } else { + $validator->setMessage($value); + } + } + + $validatorRule[self::VALIDATOR_CHAIN]->addValidator($validator, $validatorRule[self::BREAK_CHAIN]); + ++$i; + } + $validatorRule[self::VALIDATOR_CHAIN_COUNT] = $i; + } + + /** + * If the ruleName is the special wildcard rule, + * then apply the validator chain to all input data. + * Else just process the field named by the rule. + */ + if ($ruleName == self::RULE_WILDCARD) { + foreach (array_keys($this->_data) as $field) { + $this->_validateRule(array_merge($validatorRule, array(self::FIELDS => $field))); + } + } else { + $this->_validateRule($validatorRule); + } + } + + /** + * Unset fields in $_data that have been added to other arrays. + * We have to wait until all rules have been processed because + * a given field may be referenced by multiple rules. + */ + foreach (array_merge(array_keys($this->_missingFields), array_keys($this->_invalidMessages)) as $rule) { + foreach ((array) $this->_validatorRules[$rule][self::FIELDS] as $field) { + unset($this->_data[$field]); + } + } + foreach ($this->_validFields as $field => $value) { + unset($this->_data[$field]); + } + + /** + * Anything left over in $_data is an unknown field. + */ + $this->_unknownFields = $this->_data; + } + + /** + * @param array $validatorRule + * @return void + */ + protected function _validateRule(array $validatorRule) + { + /** + * Get one or more data values from input, and check for missing fields. + * Apply defaults if fields are missing. + */ + $data = array(); + foreach ((array) $validatorRule[self::FIELDS] as $field) { + if (array_key_exists($field, $this->_data)) { + $data[$field] = $this->_data[$field]; + } else + if (array_key_exists(self::DEFAULT_VALUE, $validatorRule)) { + if (is_array($validatorRule[self::DEFAULT_VALUE])) { + $key = array_search($field, (array) $validatorRule[self::FIELDS]); + if (array_key_exists($key, $validatorRule[self::DEFAULT_VALUE])) { + $data[$field] = $validatorRule[self::DEFAULT_VALUE][$key]; + } + } else { + $data[$field] = $validatorRule[self::DEFAULT_VALUE]; + } + } else + if ($validatorRule[self::PRESENCE] == self::PRESENCE_REQUIRED) { + $this->_missingFields[$validatorRule[self::RULE]][] = + $this->_getMissingMessage($validatorRule[self::RULE], $field); + } + } + + /** + * If any required fields are missing, break the loop. + */ + if (isset($this->_missingFields[$validatorRule[self::RULE]]) && count($this->_missingFields[$validatorRule[self::RULE]]) > 0) { + return; + } + + /** + * Evaluate the inputs against the validator chain. + */ + if (count((array) $validatorRule[self::FIELDS]) > 1) { + 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(); + return; + } + } else { + $failed = false; + foreach ($data as $fieldKey => $field) { + if (!is_array($field)) { + $field = array($field); + } + foreach ($field as $value) { + if (empty($value)) { + if ($validatorRule[self::ALLOW_EMPTY] == true) { + continue; + } + if ($validatorRule[self::VALIDATOR_CHAIN_COUNT] == 0) { + $notEmptyValidator = $this->_getValidator('NotEmpty'); + $notEmptyValidator->setMessage($this->_getNotEmptyMessage($validatorRule[self::RULE], $fieldKey)); + $validatorRule[self::VALIDATOR_CHAIN]->addValidator($notEmptyValidator); + } + } + if (!$validatorRule[self::VALIDATOR_CHAIN]->isValid($value)) { + $this->_invalidMessages[$validatorRule[self::RULE]] = + $validatorRule[self::VALIDATOR_CHAIN]->getMessages(); + $this->_invalidErrors[$validatorRule[self::RULE]] = + $validatorRule[self::VALIDATOR_CHAIN]->getErrors(); + unset($this->_validFields[$fieldKey]); + $failed = true; + if ($validatorRule[self::BREAK_CHAIN]) { + return; + } + } + } + } + if ($failed) { + return; + } + } + + /** + * If we got this far, the inputs for this rule pass validation. + */ + foreach ((array) $validatorRule[self::FIELDS] as $field) { + if (array_key_exists($field, $data)) { + $this->_validFields[$field] = $data[$field]; + } + } + } + + /** + * @param mixed $classBaseName + * @return Zend_Filter_Interface + */ + protected function _getFilter($classBaseName) + { + return $this->_getFilterOrValidator(self::FILTER, $classBaseName); + } + + /** + * @param mixed $classBaseName + * @return Zend_Validate_Interface + */ + protected function _getValidator($classBaseName) + { + return $this->_getFilterOrValidator(self::VALIDATE, $classBaseName); + } + + /** + * @param string $type + * @param mixed $classBaseName + * @return Zend_Filter_Interface|Zend_Validate_Interface + * @throws Zend_Filter_Exception + */ + protected function _getFilterOrValidator($type, $classBaseName) + { + $args = array(); + + if (is_array($classBaseName)) { + $args = $classBaseName; + $classBaseName = array_shift($args); + } + + $interfaceName = 'Zend_' . ucfirst($type) . '_Interface'; + $className = $this->getPluginLoader($type)->load(ucfirst($classBaseName)); + + $class = new ReflectionClass($className); + + if (!$class->implementsInterface($interfaceName)) { + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception("Class based on basename '$classBaseName' must implement the '$interfaceName' interface"); + } + + if ($class->hasMethod('__construct')) { + $object = $class->newInstanceArgs($args); + } else { + $object = $class->newInstance(); + } + + return $object; + } + +} diff --git a/libs/Zend/Filter/Int.php b/libs/Zend/Filter/Int.php new file mode 100644 index 0000000..39c3d6d --- /dev/null +++ b/libs/Zend/Filter/Int.php @@ -0,0 +1,50 @@ +setMatchPattern($matchPattern); + } + + if ($replacement) { + $this->setReplacement($replacement); + } + } + + /** + * Set the match pattern for the regex being called within filter() + * + * @param mixed $match - same as the first argument of preg_replace + * @return Zend_Filter_PregReplace + */ + public function setMatchPattern($match) + { + $this->_matchPattern = $match; + return $this; + } + + /** + * Get currently set match pattern + * + * @return string + */ + public function getMatchPattern() + { + return $this->_matchPattern; + } + + /** + * Set the Replacement pattern/string for the preg_replace called in filter + * + * @param mixed $replacement - same as the second argument of preg_replace + * @return Zend_Filter_PregReplace + */ + public function setReplacement($replacement) + { + $this->_replacement = $replacement; + return $this; + } + + /** + * Get currently set replacement value + * + * @return string + */ + public function getReplacement() + { + return $this->_replacement; + } + + /** + * Perform regexp replacement as filter + * + * @param string $value + * @return string + */ + public function filter($value) + { + if ($this->_matchPattern == null) { + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception(get_class($this) . ' does not have a valid MatchPattern set.'); + } + + return preg_replace($this->_matchPattern, $this->_replacement, $value); + } + +} diff --git a/libs/Zend/Filter/RealPath.php b/libs/Zend/Filter/RealPath.php new file mode 100644 index 0000000..f94de32 --- /dev/null +++ b/libs/Zend/Filter/RealPath.php @@ -0,0 +1,50 @@ +_encoding = $encoding; + } + + /** + * Defined by Zend_Filter_Interface + * + * Returns the string $value, converting characters to lowercase as necessary + * + * @param string $value + * @return string + */ + public function filter($value) + { + if ($this->_encoding) { + return mb_strtolower((string) $value, $this->_encoding); + } + + return strtolower((string) $value); + } +} diff --git a/libs/Zend/Filter/StringToUpper.php b/libs/Zend/Filter/StringToUpper.php new file mode 100644 index 0000000..bd68aae --- /dev/null +++ b/libs/Zend/Filter/StringToUpper.php @@ -0,0 +1,76 @@ +_encoding = $encoding; + } + + /** + * Defined by Zend_Filter_Interface + * + * Returns the string $value, converting characters to uppercase as necessary + * + * @param string $value + * @return string + */ + public function filter($value) + { + if ($this->_encoding) { + return mb_strtoupper((string) $value, $this->_encoding); + } + + return strtoupper((string) $value); + } +} diff --git a/libs/Zend/Filter/StringTrim.php b/libs/Zend/Filter/StringTrim.php new file mode 100644 index 0000000..af22900 --- /dev/null +++ b/libs/Zend/Filter/StringTrim.php @@ -0,0 +1,97 @@ +_charList = $charList; + } + + /** + * Returns the charList option + * + * @return string|null + */ + public function getCharList() + { + return $this->_charList; + } + + /** + * Sets the charList option + * + * @param string|null $charList + * @return Zend_Filter_StringTrim Provides a fluent interface + */ + public function setCharList($charList) + { + $this->_charList = $charList; + return $this; + } + + /** + * Defined by Zend_Filter_Interface + * + * Returns the string $value with characters stripped from the beginning and end + * + * @param string $value + * @return string + */ + public function filter($value) + { + if (null === $this->_charList) { + return trim((string) $value); + } else { + return trim((string) $value, $this->_charList); + } + } +} diff --git a/libs/Zend/Filter/StripNewlines.php b/libs/Zend/Filter/StripNewlines.php new file mode 100644 index 0000000..b2dd042 --- /dev/null +++ b/libs/Zend/Filter/StripNewlines.php @@ -0,0 +1,48 @@ +setTagsAllowed($tagsAllowed); + $this->setAttributesAllowed($attributesAllowed); + $this->commentsAllowed = (boolean) $commentsAllowed; + } + + /** + * Returns the tagsAllowed option + * + * @return array + */ + public function getTagsAllowed() + { + return $this->_tagsAllowed; + } + + /** + * Sets the tagsAllowed option + * + * @param array|string $tagsAllowed + * @return Zend_Filter_StripTags Provides a fluent interface + */ + public function setTagsAllowed($tagsAllowed) + { + if (!is_array($tagsAllowed)) { + $tagsAllowed = array($tagsAllowed); + } + + foreach ($tagsAllowed as $index => $element) { + // If the tag was provided without attributes + if (is_int($index) && is_string($element)) { + // Canonicalize the tag name + $tagName = strtolower($element); + // Store the tag as allowed with no attributes + $this->_tagsAllowed[$tagName] = array(); + } + // Otherwise, if a tag was provided with attributes + else if (is_string($index) && (is_array($element) || is_string($element))) { + // Canonicalize the tag name + $tagName = strtolower($index); + // Canonicalize the attributes + if (is_string($element)) { + $element = array($element); + } + // Store the tag as allowed with the provided attributes + $this->_tagsAllowed[$tagName] = array(); + foreach ($element as $attribute) { + if (is_string($attribute)) { + // Canonicalize the attribute name + $attributeName = strtolower($attribute); + $this->_tagsAllowed[$tagName][$attributeName] = null; + } + } + } + } + + return $this; + } + + /** + * Returns the attributesAllowed option + * + * @return array + */ + public function getAttributesAllowed() + { + return $this->_attributesAllowed; + } + + /** + * Sets the attributesAllowed option + * + * @param array|string $attributesAllowed + * @return Zend_Filter_StripTags Provides a fluent interface + */ + public function setAttributesAllowed($attributesAllowed) + { + if (!is_array($attributesAllowed)) { + $attributesAllowed = array($attributesAllowed); + } + + // Store each attribute as allowed + foreach ($attributesAllowed as $attribute) { + if (is_string($attribute)) { + // Canonicalize the attribute name + $attributeName = strtolower($attribute); + $this->_attributesAllowed[$attributeName] = null; + } + } + + return $this; + } + + /** + * Defined by Zend_Filter_Interface + * + * @todo improve docblock descriptions + * + * @param string $value + * @return string + */ + public function filter($value) + { + $valueCopy = (string) $value; + + // If comments are allowed, then replace them with unique identifiers + if ($this->commentsAllowed) { + preg_match_all('/<\!--.*?--\s*>/s' , (string) $valueCopy, $matches); + $comments = array_unique($matches[0]); + foreach ($comments as $k => $v) { + $valueCopy = str_replace($v, self::UNIQUE_ID_PREFIX . $k, $valueCopy); + } + } + + // Initialize accumulator for filtered data + $dataFiltered = ''; + // Parse the input data iteratively as regular pre-tag text followed by a + // tag; either may be empty strings + preg_match_all('/([^<]*)(]*>?)/', (string) $valueCopy, $matches); + // Iterate over each set of matches + foreach ($matches[1] as $index => $preTag) { + // If the pre-tag text is non-empty, strip any ">" characters from it + if (strlen($preTag)) { + $preTag = str_replace('>', '', $preTag); + } + // If a tag exists in this match, then filter the tag + $tag = $matches[2][$index]; + if (strlen($tag)) { + $tagFiltered = $this->_filterTag($tag); + } else { + $tagFiltered = ''; + } + // Add the filtered pre-tag text and filtered tag to the data buffer + $dataFiltered .= $preTag . $tagFiltered; + } + + // If comments are allowed, then replace the unique identifiers with the corresponding comments + if ($this->commentsAllowed) { + foreach ($comments as $k => $v) { + $dataFiltered = str_replace(self::UNIQUE_ID_PREFIX . $k, $v, $dataFiltered); + } + } + + // Return the filtered data + return $dataFiltered; + } + + /** + * Filters a single tag against the current option settings + * + * @param string $tag + * @return string + */ + protected function _filterTag($tag) + { + // Parse the tag into: + // 1. a starting delimiter (mandatory) + // 2. a tag name (if available) + // 3. a string of attributes (if available) + // 4. an ending delimiter (if available) + $isMatch = preg_match('~()|[^/>])*)(/?>)~', $tag, $matches); + // If the tag does not match, then strip the tag entirely + if (!$isMatch) { + return ''; + } + // Save the matches to more meaningfully named variables + $tagStart = $matches[1]; + $tagName = strtolower($matches[2]); + $tagAttributes = $matches[3]; + $tagEnd = $matches[5]; + // If the tag is not an allowed tag, then remove the tag entirely + if (!isset($this->_tagsAllowed[$tagName])) { + return ''; + } + // Trim the attribute string of whitespace at the ends + $tagAttributes = trim($tagAttributes); + // If there are non-whitespace characters in the attribute string + if (strlen($tagAttributes)) { + // Parse iteratively for well-formed attributes + preg_match_all('/(\w+)=([\'"])((.(?!=\2))+)\2/s', $tagAttributes, $matches); + // Initialize valid attribute accumulator + $tagAttributes = ''; + // Iterate over each matched attribute + foreach ($matches[1] as $index => $attributeName) { + $attributeName = strtolower($attributeName); + $attributeDelimiter = $matches[2][$index]; + $attributeValue = $matches[3][$index]; + // If the attribute is not allowed, then remove it entirely + if (!array_key_exists($attributeName, $this->_tagsAllowed[$tagName]) + && !array_key_exists($attributeName, $this->_attributesAllowed)) { + continue; + } + // Add the attribute to the accumulator + $tagAttributes .= " $attributeName=" . $attributeDelimiter + . $attributeValue . $attributeDelimiter; + } + } + // Reconstruct tags ending with "/>" as backwards-compatible XHTML tag + if (strpos($tagEnd, '/') !== false) { + $tagEnd = " $tagEnd"; + } + // Return the filtered tag + return $tagStart . $tagName . $tagAttributes . $tagEnd; + } +} diff --git a/libs/Zend/Filter/Word/CamelCaseToDash.php b/libs/Zend/Filter/Word/CamelCaseToDash.php new file mode 100644 index 0000000..c4717f2 --- /dev/null +++ b/libs/Zend/Filter/Word/CamelCaseToDash.php @@ -0,0 +1,44 @@ +_separator . '\1', $this->_separator . '\1')); + } else { + parent::setMatchPattern(array('#(?<=(?:[A-Z]))([A-Z]+)([A-Z][A-z])#', '#(?<=(?:[a-z]))([A-Z])#')); + parent::setReplacement(array('\1' . $this->_separator . '\2', $this->_separator . '\1')); + } + + return parent::filter($value); + } + +} diff --git a/libs/Zend/Filter/Word/CamelCaseToUnderscore.php b/libs/Zend/Filter/Word/CamelCaseToUnderscore.php new file mode 100644 index 0000000..659dfb4 --- /dev/null +++ b/libs/Zend/Filter/Word/CamelCaseToUnderscore.php @@ -0,0 +1,44 @@ +setMatchPattern('#-#'); + $this->setReplacement($this->_separator); + return parent::filter($value); + } +} diff --git a/libs/Zend/Filter/Word/DashToUnderscore.php b/libs/Zend/Filter/Word/DashToUnderscore.php new file mode 100644 index 0000000..404598a --- /dev/null +++ b/libs/Zend/Filter/Word/DashToUnderscore.php @@ -0,0 +1,45 @@ +setSeparator($separator); + } + + /** + * Sets a new seperator + * + * @param string $separator Seperator + * @return $this + */ + public function setSeparator($separator) + { + if ($separator == null) { + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception('"' . $separator . '" is not a valid separator.'); + } + $this->_separator = $separator; + return $this; + } + + /** + * Returns the actual set seperator + * + * @return string + */ + public function getSeparator() + { + return $this->_separator; + } + +} \ No newline at end of file diff --git a/libs/Zend/Filter/Word/SeparatorToCamelCase.php b/libs/Zend/Filter/Word/SeparatorToCamelCase.php new file mode 100644 index 0000000..853ec1b --- /dev/null +++ b/libs/Zend/Filter/Word/SeparatorToCamelCase.php @@ -0,0 +1,52 @@ +_separator, '#'); + + if (self::isUnicodeSupportEnabled()) { + parent::setMatchPattern(array('#('.$pregQuotedSeparator.')(\p{L}{1})#e','#(^\p{Ll}{1})#e')); + parent::setReplacement(array("strtoupper('\\2')","strtoupper('\\1')")); + } else { + parent::setMatchPattern(array('#('.$pregQuotedSeparator.')([A-Z]{1})#e','#(^[a-z]{1})#e')); + parent::setReplacement(array("strtoupper('\\2')","strtoupper('\\1')")); + } + + return parent::filter($value); + } + +} diff --git a/libs/Zend/Filter/Word/SeparatorToDash.php b/libs/Zend/Filter/Word/SeparatorToDash.php new file mode 100644 index 0000000..d5eab06 --- /dev/null +++ b/libs/Zend/Filter/Word/SeparatorToDash.php @@ -0,0 +1,46 @@ +setSearchSeparator($searchSeparator); + $this->setReplacementSeparator($replacementSeparator); + } + + /** + * Sets a new seperator to search for + * + * @param string $separator Seperator to search for + * @return $this + */ + public function setSearchSeparator($separator) + { + $this->_searchSeparator = $separator; + return $this; + } + + /** + * Returns the actual set seperator to search for + * + * @return string + */ + public function getSearchSeparator() + { + return $this->_searchSeparator; + } + + /** + * Sets a new seperator which replaces the searched one + * + * @param string $separator Seperator which replaces the searched one + * @return $this + */ + public function setReplacementSeparator($separator) + { + $this->_replacementSeparator = $separator; + return $this; + } + + /** + * Returns the actual set seperator which replaces the searched one + * + * @return string + */ + public function getReplacementSeparator() + { + return $this->_replacementSeparator; + } + + /** + * Defined by Zend_Filter_Interface + * + * Returns the string $value, replacing the searched seperators with the defined ones + * + * @param string $value + * @return string + */ + public function filter($value) + { + return $this->_separatorToSeparatorFilter($value); + } + + /** + * Do the real work, replaces the seperator to search for with the replacement seperator + * + * Returns the replaced string + * + * @param string $value + * @return string + */ + protected function _separatorToSeparatorFilter($value) + { + if ($this->_searchSeparator == null) { + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception('You must provide a search separator for this filter to work.'); + } + + $this->setMatchPattern('#' . preg_quote($this->_searchSeparator, '#') . '#'); + $this->setReplacement($this->_replacementSeparator); + return parent::filter($value); + } + +} \ No newline at end of file diff --git a/libs/Zend/Filter/Word/UnderscoreToCamelCase.php b/libs/Zend/Filter/Word/UnderscoreToCamelCase.php new file mode 100644 index 0000000..aabbba9 --- /dev/null +++ b/libs/Zend/Filter/Word/UnderscoreToCamelCase.php @@ -0,0 +1,44 @@ +setOptions($options); + } elseif ($options instanceof Zend_Config) { + $this->setConfig($options); + } + + // Extensions... + $this->init(); + + $this->loadDefaultDecorators(); + } + + /** + * Clone form object and all children + * + * @return void + */ + public function __clone() + { + $elements = array(); + foreach ($this->getElements() as $name => $element) { + $elements[] = clone $element; + } + $this->setElements($elements); + + $subForms = array(); + foreach ($this->getSubForms() as $name => $subForm) { + $subForms[$name] = clone $subForm; + } + $this->setSubForms($subForms); + + $displayGroups = array(); + foreach ($this->_displayGroups as $group) { + $clone = clone $group; + $elements = array(); + foreach ($clone->getElements() as $name => $e) { + $elements[] = $this->getElement($name); + } + $clone->setElements($elements); + $displayGroups[] = $clone; + } + $this->setDisplayGroups($displayGroups); + } + + /** + * Reset values of form + * + * @return Zend_Form + */ + public function reset() + { + foreach ($this->getElements() as $element) { + $element->setValue(null); + } + foreach ($this->getSubForms() as $subForm) { + $subForm->reset(); + } + + return $this; + } + + /** + * Initialize form (used by extending classes) + * + * @return void + */ + public function init() + { + } + + /** + * Set form state from options array + * + * @param array $options + * @return Zend_Form + */ + public function setOptions(array $options) + { + if (isset($options['prefixPath'])) { + $this->addPrefixPaths($options['prefixPath']); + unset($options['prefixPath']); + } + + if (isset($options['elementPrefixPath'])) { + $this->addElementPrefixPaths($options['elementPrefixPath']); + unset($options['elementPrefixPath']); + } + + if (isset($options['displayGroupPrefixPath'])) { + $this->addDisplayGroupPrefixPaths($options['displayGroupPrefixPath']); + unset($options['displayGroupPrefixPath']); + } + + if (isset($options['elements'])) { + $this->setElements($options['elements']); + unset($options['elements']); + } + + if (isset($options['elementDecorators'])) { + $elementDecorators = $options['elementDecorators']; + unset($options['elementDecorators']); + } + + if (isset($options['defaultDisplayGroupClass'])) { + $this->setDefaultDisplayGroupClass($options['defaultDisplayGroupClass']); + unset($options['defaultDisplayGroupClass']); + } + + if (isset($options['displayGroupDecorators'])) { + $displayGroupDecorators = $options['displayGroupDecorators']; + unset($options['displayGroupDecorators']); + } + + if (isset($options['elementsBelongTo'])) { + $elementsBelongTo = $options['elementsBelongTo']; + unset($options['elementsBelongTo']); + } + + if (isset($options['attribs'])) { + $this->addAttribs($options['attribs']); + unset($options['attribs']); + } + + $forbidden = array( + 'Options', 'Config', 'PluginLoader', 'SubForms', 'View', 'Translator', + 'Attrib', 'Default', + ); + + foreach ($options as $key => $value) { + $normalized = ucfirst($key); + if (in_array($normalized, $forbidden)) { + continue; + } + + $method = 'set' . $normalized; + if (method_exists($this, $method)) { + $this->$method($value); + } else { + $this->setAttrib($key, $value); + } + } + + if (isset($elementDecorators)) { + $this->setElementDecorators($elementDecorators); + } + + if (isset($displayGroupDecorators)) { + $this->setDisplayGroupDecorators($displayGroupDecorators); + } + + if (isset($elementsBelongTo)) { + $this->setElementsBelongTo($elementsBelongTo); + } + + return $this; + } + + /** + * Set form state from config object + * + * @param Zend_Config $config + * @return Zend_Form + */ + public function setConfig(Zend_Config $config) + { + return $this->setOptions($config->toArray()); + } + + + // Loaders + + /** + * Set plugin loaders for use with decorators and elements + * + * @param Zend_Loader_PluginLoader_Interface $loader + * @param string $type 'decorator' or 'element' + * @return Zend_Form + * @throws Zend_Form_Exception on invalid type + */ + public function setPluginLoader(Zend_Loader_PluginLoader_Interface $loader, $type = null) + { + $type = strtoupper($type); + switch ($type) { + case self::DECORATOR: + case self::ELEMENT: + $this->_loaders[$type] = $loader; + return $this; + default: + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception(sprintf('Invalid type "%s" provided to setPluginLoader()', $type)); + } + } + + /** + * Retrieve plugin loader for given type + * + * $type may be one of: + * - decorator + * - element + * + * If a plugin loader does not exist for the given type, defaults are + * created. + * + * @param string $type + * @return Zend_Loader_PluginLoader_Interface + */ + public function getPluginLoader($type = null) + { + $type = strtoupper($type); + if (!isset($this->_loaders[$type])) { + switch ($type) { + case self::DECORATOR: + $prefixSegment = 'Form_Decorator'; + $pathSegment = 'Form/Decorator'; + break; + case self::ELEMENT: + $prefixSegment = 'Form_Element'; + $pathSegment = 'Form/Element'; + break; + default: + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception(sprintf('Invalid type "%s" provided to getPluginLoader()', $type)); + } + + require_once 'Zend/Loader/PluginLoader.php'; + $this->_loaders[$type] = new Zend_Loader_PluginLoader( + array('Zend_' . $prefixSegment . '_' => 'Zend/' . $pathSegment . '/') + ); + } + + return $this->_loaders[$type]; + } + + /** + * Add prefix path for plugin loader + * + * If no $type specified, assumes it is a base path for both filters and + * validators, and sets each according to the following rules: + * - decorators: $prefix = $prefix . '_Decorator' + * - elements: $prefix = $prefix . '_Element' + * + * Otherwise, the path prefix is set on the appropriate plugin loader. + * + * If $type is 'decorators', sets the path in the decorator plugin loader + * for all elements. Additionally, if no $type is provided, + * {@link Zend_Form_Element::addPrefixPath()} is called on each element. + * + * @param string $path + * @return Zend_Form + * @throws Zend_Form_Exception for invalid type + */ + public function addPrefixPath($prefix, $path, $type = null) + { + $type = strtoupper($type); + switch ($type) { + case self::DECORATOR: + case self::ELEMENT: + $loader = $this->getPluginLoader($type); + $loader->addPrefixPath($prefix, $path); + return $this; + case null: + $prefix = rtrim($prefix, '_'); + $path = rtrim($path, DIRECTORY_SEPARATOR); + foreach (array(self::DECORATOR, self::ELEMENT) as $type) { + $cType = ucfirst(strtolower($type)); + $pluginPath = $path . DIRECTORY_SEPARATOR . $cType . DIRECTORY_SEPARATOR; + $pluginPrefix = $prefix . '_' . $cType; + $loader = $this->getPluginLoader($type); + $loader->addPrefixPath($pluginPrefix, $pluginPath); + } + return $this; + default: + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception(sprintf('Invalid type "%s" provided to getPluginLoader()', $type)); + } + } + + /** + * Add many prefix paths at once + * + * @param array $spec + * @return Zend_Form + */ + public function addPrefixPaths(array $spec) + { + if (isset($spec['prefix']) && isset($spec['path'])) { + return $this->addPrefixPath($spec['prefix'], $spec['path']); + } + foreach ($spec as $type => $paths) { + if (is_numeric($type) && is_array($paths)) { + $type = null; + if (isset($paths['prefix']) && isset($paths['path'])) { + if (isset($paths['type'])) { + $type = $paths['type']; + } + $this->addPrefixPath($paths['prefix'], $paths['path'], $type); + } + } elseif (!is_numeric($type)) { + if (!isset($paths['prefix']) || !isset($paths['path'])) { + continue; + } + $this->addPrefixPath($paths['prefix'], $paths['path'], $type); + } + } + return $this; + } + + /** + * Add prefix path for all elements + * + * @param string $prefix + * @param string $path + * @param string $type + * @return Zend_Form + */ + public function addElementPrefixPath($prefix, $path, $type = null) + { + $this->_elementPrefixPaths[] = array( + 'prefix' => $prefix, + 'path' => $path, + 'type' => $type, + ); + + foreach ($this->getElements() as $element) { + $element->addPrefixPath($prefix, $path, $type); + } + + foreach ($this->getSubForms() as $subForm) { + $subForm->addElementPrefixPath($prefix, $path, $type); + } + + return $this; + } + + /** + * Add prefix paths for all elements + * + * @param array $spec + * @return Zend_Form + */ + public function addElementPrefixPaths(array $spec) + { + $this->_elementPrefixPaths = $this->_elementPrefixPaths + $spec; + + foreach ($this->getElements() as $element) { + $element->addPrefixPaths($spec); + } + + return $this; + } + + /** + * Add prefix path for all display groups + * + * @param string $prefix + * @param string $path + * @return Zend_Form + */ + public function addDisplayGroupPrefixPath($prefix, $path) + { + $this->_displayGroupPrefixPaths[] = array( + 'prefix' => $prefix, + 'path' => $path, + ); + + foreach ($this->getDisplayGroups() as $group) { + $group->addPrefixPath($prefix, $path); + } + + return $this; + } + + /** + * Add multiple display group prefix paths at once + * + * @param array $spec + * @return Zend_Form + */ + public function addDisplayGroupPrefixPaths(array $spec) + { + foreach ($spec as $key => $value) { + if (is_string($value) && !is_numeric($key)) { + $this->addDisplayGroupPrefixPath($key, $value); + continue; + } + + if (is_string($value) && is_numeric($key)) { + continue; + } + + if (is_array($value)) { + $count = count($value); + if (array_keys($value) === range(0, $count - 1)) { + if ($count < 2) { + continue; + } + $prefix = array_shift($value); + $path = array_shift($value); + $this->addDisplayGroupPrefixPath($prefix, $path); + continue; + } + if (array_key_exists('prefix', $value) && array_key_exists('path', $value)) { + $this->addDisplayGroupPrefixPath($value['prefix'], $value['path']); + } + } + } + return $this; + } + + // Form metadata: + + /** + * Set form attribute + * + * @param string $key + * @param mixed $value + * @return Zend_Form + */ + public function setAttrib($key, $value) + { + $key = (string) $key; + $this->_attribs[$key] = $value; + return $this; + } + + /** + * Add multiple form attributes at once + * + * @param array $attribs + * @return Zend_Form + */ + public function addAttribs(array $attribs) + { + foreach ($attribs as $key => $value) { + $this->setAttrib($key, $value); + } + return $this; + } + + /** + * Set multiple form attributes at once + * + * Overwrites any previously set attributes. + * + * @param array $attribs + * @return Zend_Form + */ + public function setAttribs(array $attribs) + { + $this->clearAttribs(); + return $this->addAttribs($attribs); + } + + /** + * Retrieve a single form attribute + * + * @param string $key + * @return mixed + */ + public function getAttrib($key) + { + $key = (string) $key; + if (!isset($this->_attribs[$key])) { + return null; + } + + return $this->_attribs[$key]; + } + + /** + * Retrieve all form attributes/metadata + * + * @return array + */ + public function getAttribs() + { + return $this->_attribs; + } + + /** + * Remove attribute + * + * @param string $key + * @return bool + */ + public function removeAttrib($key) + { + if (isset($this->_attribs[$key])) { + unset($this->_attribs[$key]); + return true; + } + + return false; + } + + /** + * Clear all form attributes + * + * @return Zend_Form + */ + public function clearAttribs() + { + $this->_attribs = array(); + return $this; + } + + /** + * Set form action + * + * @param string $action + * @return Zend_Form + */ + public function setAction($action) + { + return $this->setAttrib('action', (string) $action); + } + + /** + * Get form action + * + * Sets default to '' if not set. + * + * @return string + */ + public function getAction() + { + $action = $this->getAttrib('action'); + if (null === $action) { + $action = ''; + $this->setAction($action); + } + return $action; + } + + /** + * Set form method + * + * Only values in {@link $_methods()} allowed + * + * @param string $method + * @return Zend_Form + * @throws Zend_Form_Exception + */ + public function setMethod($method) + { + $method = strtolower($method); + if (!in_array($method, $this->_methods)) { + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception(sprintf('"%s" is an invalid form method', $method)); + } + $this->setAttrib('method', $method); + return $this; + } + + /** + * Retrieve form method + * + * @return string + */ + public function getMethod() + { + if (null === ($method = $this->getAttrib('method'))) { + $method = self::METHOD_POST; + $this->setAttrib('method', $method); + } + return strtolower($method); + } + + /** + * Set encoding type + * + * @param string $value + * @return Zend_Form + */ + public function setEnctype($value) + { + $this->setAttrib('enctype', $value); + return $this; + } + + /** + * Get encoding type + * + * @return string + */ + public function getEnctype() + { + if (null === ($enctype = $this->getAttrib('enctype'))) { + $enctype = self::ENCTYPE_URLENCODED; + $this->setAttrib('enctype', $enctype); + } + return $this->getAttrib('enctype'); + } + + /** + * Filter a name to only allow valid variable characters + * + * @param string $value + * @param bool $allowBrackets + * @return string + */ + public function filterName($value, $allowBrackets = false) + { + $charset = '^a-zA-Z0-9_\x7f-\xff'; + if ($allowBrackets) { + $charset .= '\[\]'; + } + return preg_replace('/[' . $charset . ']/', '', (string) $value); + } + + /** + * Set form name + * + * @param string $name + * @return Zend_Form + */ + public function setName($name) + { + $name = $this->filterName($name); + if (('0' !== $name) && empty($name)) { + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception('Invalid name provided; must contain only valid variable characters and be non-empty'); + } + + return $this->setAttrib('name', $name); + } + + /** + * Get name attribute + * + * @return null|string + */ + public function getName() + { + return $this->getAttrib('name'); + } + + /** + * Get fully qualified name + * + * Places name as subitem of array and/or appends brackets. + * + * @return string + */ + public function getFullyQualifiedName() + { + return $this->getName(); + } + + /** + * Get element id + * + * @return string + */ + public function getId() + { + if (null !== ($id = $this->getAttrib('id'))) { + return $id; + } + + $id = $this->getFullyQualifiedName(); + + // Bail early if no array notation detected + if (!strstr($id, '[')) { + return $id; + } + + // Strip array notation + if ('[]' == substr($id, -2)) { + $id = substr($id, 0, strlen($id) - 2); + } + $id = str_replace('][', '-', $id); + $id = str_replace(array(']', '['), '-', $id); + $id = trim($id, '-'); + + return $id; + } + + /** + * Set form legend + * + * @param string $value + * @return Zend_Form + */ + public function setLegend($value) + { + $this->_legend = (string) $value; + return $this; + } + + /** + * Get form legend + * + * @return string + */ + public function getLegend() + { + return $this->_legend; + } + + /** + * Set form description + * + * @param string $value + * @return Zend_Form + */ + public function setDescription($value) + { + $this->_description = (string) $value; + return $this; + } + + /** + * Retrieve form description + * + * @return string + */ + public function getDescription() + { + return $this->_description; + } + + /** + * Set form order + * + * @param int $index + * @return Zend_Form + */ + public function setOrder($index) + { + $this->_formOrder = (int) $index; + return $this; + } + + /** + * Get form order + * + * @return int|null + */ + public function getOrder() + { + return $this->_formOrder; + } + + // Element interaction: + + /** + * Add a new element + * + * $element may be either a string element type, or an object of type + * Zend_Form_Element. If a string element type is provided, $name must be + * provided, and $options may be optionally provided for configuring the + * element. + * + * If a Zend_Form_Element is provided, $name may be optionally provided, + * and any provided $options will be ignored. + * + * @param string|Zend_Form_Element $element + * @param string $name + * @param array|Zend_Config $options + * @return Zend_Form + */ + public function addElement($element, $name = null, $options = null) + { + if (is_string($element)) { + if (null === $name) { + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception('Elements specified by string must have an accompanying name'); + } + + $this->_elements[$name] = $this->createElement($element, $name, $options); + } elseif ($element instanceof Zend_Form_Element) { + $prefixPaths = array(); + $prefixPaths['decorator'] = $this->getPluginLoader('decorator')->getPaths(); + if (!empty($this->_elementPrefixPaths)) { + $prefixPaths = array_merge($prefixPaths, $this->_elementPrefixPaths); + } + + if (null === $name) { + $name = $element->getName(); + } + + $this->_elements[$name] = $element; + $this->_elements[$name]->addPrefixPaths($prefixPaths); + } + + $this->_order[$name] = $this->_elements[$name]->getOrder(); + $this->_orderUpdated = true; + $this->_setElementsBelongTo($name); + + return $this; + } + + /** + * Create an element + * + * Acts as a factory for creating elements. Elements created with this + * method will not be attached to the form, but will contain element + * settings as specified in the form object (including plugin loader + * prefix paths, default decorators, etc.). + * + * @param string $type + * @param string $name + * @param array|Zend_Config $options + * @return Zend_Form_Element + */ + public function createElement($type, $name, $options = null) + { + if (!is_string($type)) { + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception('Element type must be a string indicating type'); + } + + if (!is_string($name)) { + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception('Element name must be a string'); + } + + $prefixPaths = array(); + $prefixPaths['decorator'] = $this->getPluginLoader('decorator')->getPaths(); + if (!empty($this->_elementPrefixPaths)) { + $prefixPaths = array_merge($prefixPaths, $this->_elementPrefixPaths); + } + + if ($options instanceof Zend_Config) { + $options = $options->toArray(); + } + + if ((null === $options) || !is_array($options)) { + $options = array('prefixPath' => $prefixPaths); + } elseif (is_array($options)) { + if (array_key_exists('prefixPath', $options)) { + $options['prefixPath'] = array_merge($prefixPaths, $options['prefixPath']); + } else { + $options['prefixPath'] = $prefixPaths; + } + } + + $class = $this->getPluginLoader(self::ELEMENT)->load($type); + $element = new $class($name, $options); + + return $element; + } + + /** + * Add multiple elements at once + * + * @param array $elements + * @return Zend_Form + */ + public function addElements(array $elements) + { + foreach ($elements as $key => $spec) { + $name = null; + if (!is_numeric($key)) { + $name = $key; + } + + if (is_string($spec) || ($spec instanceof Zend_Form_Element)) { + $this->addElement($spec, $name); + continue; + } + + if (is_array($spec)) { + $argc = count($spec); + $options = array(); + if (isset($spec['type'])) { + $type = $spec['type']; + if (isset($spec['name'])) { + $name = $spec['name']; + } + if (isset($spec['options'])) { + $options = $spec['options']; + } + $this->addElement($type, $name, $options); + } else { + switch ($argc) { + case 0: + continue; + case (1 <= $argc): + $type = array_shift($spec); + case (2 <= $argc): + if (null === $name) { + $name = array_shift($spec); + } else { + $options = array_shift($spec); + } + case (3 <= $argc): + if (empty($options)) { + $options = array_shift($spec); + } + default: + $this->addElement($type, $name, $options); + } + } + } + } + return $this; + } + + /** + * Set form elements (overwrites existing elements) + * + * @param array $elements + * @return Zend_Form + */ + public function setElements(array $elements) + { + $this->clearElements(); + return $this->addElements($elements); + } + + /** + * Retrieve a single element + * + * @param string $name + * @return Zend_Form_Element|null + */ + public function getElement($name) + { + if (array_key_exists($name, $this->_elements)) { + return $this->_elements[$name]; + } + return null; + } + + /** + * Retrieve all elements + * + * @return array + */ + public function getElements() + { + return $this->_elements; + } + + /** + * Remove element + * + * @param string $name + * @return boolean + */ + public function removeElement($name) + { + $name = (string) $name; + if (isset($this->_elements[$name])) { + unset($this->_elements[$name]); + if (array_key_exists($name, $this->_order)) { + unset($this->_order[$name]); + $this->_orderUpdated = true; + } else { + foreach ($this->_displayGroups as $group) { + if (null !== $group->getElement($name)) { + $group->removeElement($name); + } + } + } + return true; + } + + return false; + } + + /** + * Remove all form elements + * + * @return Zend_Form + */ + public function clearElements() + { + foreach (array_keys($this->_elements) as $key) { + if (array_key_exists($key, $this->_order)) { + unset($this->_order[$key]); + } + } + $this->_elements = array(); + $this->_orderUpdated = true; + return $this; + } + + /** + * 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. + * + * @param array $defaults + * @return Zend_Form + */ + public function setDefaults(array $defaults) + { + foreach ($this->getElements() as $name => $element) { + if (array_key_exists($name, $defaults)) { + $this->setDefault($name, $defaults[$name]); + } + } + foreach ($this->getSubForms() as $name => $form) { + if (array_key_exists($name, $defaults)) { + $form->setDefaults($defaults[$name]); + } else { + $form->setDefaults($defaults); + } + } + return $this; + } + + /** + * Set default value for an element + * + * @param string $name + * @param mixed $value + * @return Zend_Form + */ + public function setDefault($name, $value) + { + $name = (string) $name; + if ($element = $this->getElement($name)) { + $element->setValue($value); + } else { + if (is_scalar($value)) { + foreach ($this->getSubForms() as $subForm) { + $subForm->setDefault($name, $value); + } + } elseif (is_array($value) && ($subForm = $this->getSubForm($name))) { + $subForm->setDefaults($value); + } + } + return $this; + } + + /** + * Retrieve value for single element + * + * @param string $name + * @return mixed + */ + public function getValue($name) + { + if ($element = $this->getElement($name)) { + return $element->getValue(); + } + + if ($subForm = $this->getSubForm($name)) { + return $subForm->getValues(true); + } + + foreach ($this->getSubForms() as $subForm) { + if ($name == $subForm->getElementsBelongTo()) { + return $subForm->getValues(true); + } + } + return null; + } + + /** + * Retrieve all form element values + * + * @param bool $suppressArrayNotation + * @return array + */ + public function getValues($suppressArrayNotation = false) + { + $values = array(); + foreach ($this->getElements() as $key => $element) { + if (!$element->getIgnore()) { + $values[$key] = $element->getValue(); + } + } + foreach ($this->getSubForms() as $key => $subForm) { + $fValues = $this->_attachToArray($subForm->getValues(true), $subForm->getElementsBelongTo()); + $values = array_merge($values, $fValues); + } + + if (!$suppressArrayNotation && $this->isArray()) { + $values = $this->_attachToArray($values, $this->getElementsBelongTo()); + } + + return $values; + } + + /** + * Get unfiltered element value + * + * @param string $name + * @return mixed + */ + public function getUnfilteredValue($name) + { + if ($element = $this->getElement($name)) { + return $element->getUnfilteredValue(); + } + return null; + } + + /** + * Retrieve all unfiltered element values + * + * @return array + */ + public function getUnfilteredValues() + { + $values = array(); + foreach ($this->getElements() as $key => $element) { + $values[$key] = $element->getUnfilteredValue(); + } + + return $values; + } + + /** + * Set all elements' filters + * + * @param array $filters + * @return Zend_Form + */ + public function setElementFilters(array $filters) + { + foreach ($this->getElements() as $element) { + $element->setFilters($filters); + } + return $this; + } + + /** + * Set name of array elements belong to + * + * @param string $array + * @return Zend_Form + */ + public function setElementsBelongTo($array) + { + $origName = $this->getElementsBelongTo(); + $name = $this->filterName($array, true); + if (empty($name)) { + $name = null; + } + $this->_elementsBelongTo = $name; + + if (null === $name) { + $this->setIsArray(false); + if (null !== $origName) { + $this->_setElementsBelongTo(); + } + } else { + $this->setIsArray(true); + $this->_setElementsBelongTo(); + } + + return $this; + } + + /** + * Set array to which elements belong + * + * @param string $name Element name + * @return void + */ + protected function _setElementsBelongTo($name = null) + { + $array = $this->getElementsBelongTo(); + + if (null === $array) { + return; + } + + if (null === $name) { + foreach ($this->getElements() as $element) { + $element->setBelongsTo($array); + } + } else { + if (null !== ($element = $this->getElement($name))) { + $element->setBelongsTo($array); + } + } + } + + /** + * Get name of array elements belong to + * + * @return string|null + */ + public function getElementsBelongTo() + { + if ((null === $this->_elementsBelongTo) && $this->isArray()) { + $name = $this->getName(); + if (!empty($name)) { + return $name; + } + } + return $this->_elementsBelongTo; + } + + /** + * Set flag indicating elements belong to array + * + * @param bool $flag Value of flag + * @return Zend_Form + */ + public function setIsArray($flag) + { + $this->_isArray = (bool) $flag; + return $this; + } + + /** + * Get flag indicating if elements belong to an array + * + * @return bool + */ + public function isArray() + { + return $this->_isArray; + } + + // Element groups: + + /** + * Add a form group/subform + * + * @param Zend_Form $form + * @param string $name + * @param int $order + * @return Zend_Form + */ + public function addSubForm(Zend_Form $form, $name, $order = null) + { + $name = (string) $name; + foreach ($this->_loaders as $type => $loader) { + $loaderPaths = $loader->getPaths(); + foreach ($loaderPaths as $prefix => $paths) { + foreach ($paths as $path) { + $form->addPrefixPath($prefix, $path, $type); + } + } + } + + if (!empty($this->_elementPrefixPaths)) { + foreach ($this->_elementPrefixPaths as $spec) { + list($prefix, $path, $type) = array_values($spec); + $form->addElementPrefixPath($prefix, $path, $type); + } + } + + if (!empty($this->_displayGroupPrefixPaths)) { + foreach ($this->_displayGroupPrefixPaths as $spec) { + list($prefix, $path) = array_values($spec); + $form->addDisplayGroupPrefixPath($prefix, $path); + } + } + + if (null !== $order) { + $form->setOrder($order); + } + + $form->setName($name); + $this->_subForms[$name] = $form; + $this->_order[$name] = $order; + $this->_orderUpdated = true; + return $this; + } + + /** + * Add multiple form subForms/subforms at once + * + * @param array $subForms + * @return Zend_Form + */ + public function addSubForms(array $subForms) + { + foreach ($subForms as $key => $spec) { + $name = null; + if (!is_numeric($key)) { + $name = $key; + } + + if ($spec instanceof Zend_Form) { + $this->addSubForm($spec, $name); + continue; + } + + if (is_array($spec)) { + $argc = count($spec); + $order = null; + switch ($argc) { + case 0: + continue; + case (1 <= $argc): + $subForm = array_shift($spec); + case (2 <= $argc): + $name = array_shift($spec); + case (3 <= $argc): + $order = array_shift($spec); + default: + $this->addSubForm($subForm, $name, $order); + } + } + } + return $this; + } + + /** + * Set multiple form subForms/subforms (overwrites) + * + * @param array $subForms + * @return Zend_Form + */ + public function setSubForms(array $subForms) + { + $this->clearSubForms(); + return $this->addSubForms($subForms); + } + + /** + * Retrieve a form subForm/subform + * + * @param string $name + * @return Zend_Form|null + */ + public function getSubForm($name) + { + $name = (string) $name; + if (isset($this->_subForms[$name])) { + return $this->_subForms[$name]; + } + return null; + } + + /** + * Retrieve all form subForms/subforms + * + * @return array + */ + public function getSubForms() + { + return $this->_subForms; + } + + /** + * Remove form subForm/subform + * + * @param string $name + * @return boolean + */ + public function removeSubForm($name) + { + $name = (string) $name; + if (array_key_exists($name, $this->_subForms)) { + unset($this->_subForms[$name]); + if (array_key_exists($name, $this->_order)) { + unset($this->_order[$name]); + $this->_orderUpdated = true; + } + return true; + } + + return false; + } + + /** + * Remove all form subForms/subforms + * + * @return Zend_Form + */ + public function clearSubForms() + { + foreach (array_keys($this->_subForms) as $key) { + if (array_key_exists($key, $this->_order)) { + unset($this->_order[$key]); + } + } + $this->_subForms = array(); + $this->_orderUpdated = true; + return $this; + } + + + // Display groups: + + /** + * Set default display group class + * + * @param string $class + * @return Zend_Form + */ + public function setDefaultDisplayGroupClass($class) + { + $this->_defaultDisplayGroupClass = (string) $class; + return $this; + } + + /** + * Retrieve default display group class + * + * @return string + */ + public function getDefaultDisplayGroupClass() + { + return $this->_defaultDisplayGroupClass; + } + + /** + * Add a display group + * + * Groups named elements for display purposes. + * + * If a referenced element does not yet exist in the form, it is omitted. + * + * @param array $elements + * @param string $name + * @param array|Zend_Config $options + * @return Zend_Form + * @throws Zend_Form_Exception if no valid elements provided + */ + public function addDisplayGroup(array $elements, $name, $options = null) + { + $group = array(); + foreach ($elements as $element) { + if (isset($this->_elements[$element])) { + $add = $this->getElement($element); + if (null !== $add) { + unset($this->_order[$element]); + $group[] = $add; + } + } + } + if (empty($group)) { + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception('No valid elements specified for display group'); + } + + $name = (string) $name; + + if (is_array($options)) { + $options['elements'] = $group; + } elseif ($options instanceof Zend_Config) { + $options = $options->toArray(); + $options['elements'] = $group; + } else { + $options = array('elements' => $group); + } + + if (isset($options['displayGroupClass'])) { + $class = $options['displayGroupClass']; + unset($options['displayGroupClass']); + } else { + $class = $this->getDefaultDisplayGroupClass(); + } + + if (!class_exists($class)) { + require_once 'Zend/Loader.php'; + Zend_Loader::loadClass($class); + } + $this->_displayGroups[$name] = new $class( + $name, + $this->getPluginLoader(self::DECORATOR), + $options + ); + + if (!empty($this->_displayGroupPrefixPaths)) { + $this->_displayGroups[$name]->addPrefixPaths($this->_displayGroupPrefixPaths); + } + + $this->_order[$name] = $this->_displayGroups[$name]->getOrder(); + $this->_orderUpdated = true; + return $this; + } + + /** + * Add a display group object (used with cloning) + * + * @param Zend_Form_DisplayGroup $group + * @param string|null $name + * @return Zend_Form + */ + protected function _addDisplayGroupObject(Zend_Form_DisplayGroup $group, $name = null) + { + if (null === $name) { + $name = $group->getName(); + if (empty($name)) { + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception('Invalid display group added; requires name'); + } + } + + $this->_displayGroups[$name] = $group; + + if (!empty($this->_displayGroupPrefixPaths)) { + $this->_displayGroups[$name]->addPrefixPaths($this->_displayGroupPrefixPaths); + } + + $this->_order[$name] = $this->_displayGroups[$name]->getOrder(); + $this->_orderUpdated = true; + return $this; + } + + /** + * Add multiple display groups at once + * + * @param array $groups + * @return Zend_Form + */ + public function addDisplayGroups(array $groups) + { + foreach ($groups as $key => $spec) { + $name = null; + if (!is_numeric($key)) { + $name = $key; + } + + if ($spec instanceof Zend_Form_DisplayGroup) { + $this->_addDisplayGroupObject($spec); + } + + if (!is_array($spec) || empty($spec)) { + continue; + } + + $argc = count($spec); + $options = array(); + + if (isset($spec['elements'])) { + $elements = $spec['elements']; + if (isset($spec['name'])) { + $name = $spec['name']; + } + if (isset($spec['options'])) { + $options = $spec['options']; + } + $this->addDisplayGroup($elements, $name, $options); + } else { + switch ($argc) { + case (1 <= $argc): + $elements = array_shift($spec); + if (!is_array($elements) && (null !== $name)) { + $elements = array_merge((array) $elements, $spec); + $this->addDisplayGroup($elements, $name); + break; + } + case (2 <= $argc): + if (null !== $name) { + $options = array_shift($spec); + $this->addDisplayGroup($elements, $name, $options); + break; + } + $name = array_shift($spec); + case (3 <= $argc): + $options = array_shift($spec); + default: + $this->addDisplayGroup($elements, $name, $options); + } + } + } + return $this; + } + + /** + * Add multiple display groups (overwrites) + * + * @param array $groups + * @return Zend_Form + */ + public function setDisplayGroups(array $groups) + { + return $this->clearDisplayGroups() + ->addDisplayGroups($groups); + } + + /** + * Return a display group + * + * @param string $name + * @return array|null + */ + public function getDisplayGroup($name) + { + $name = (string) $name; + if (isset($this->_displayGroups[$name])) { + return $this->_displayGroups[$name]; + } + + return null; + } + + /** + * Return all display groups + * + * @return array + */ + public function getDisplayGroups() + { + return $this->_displayGroups; + } + + /** + * Remove a display group by name + * + * @param string $name + * @return boolean + */ + public function removeDisplayGroup($name) + { + $name = (string) $name; + if (array_key_exists($name, $this->_displayGroups)) { + foreach ($this->_displayGroups[$name] as $key => $element) { + if (array_key_exists($key, $this->_elements)) { + $this->_order[$key] = $element->getOrder(); + $this->_orderUpdated = true; + } + } + unset($this->_displayGroups[$name]); + + if (array_key_exists($name, $this->_order)) { + unset($this->_order[$name]); + $this->_orderUpdated = true; + } + return true; + } + + return false; + } + + /** + * Remove all display groups + * + * @return Zend_Form + */ + public function clearDisplayGroups() + { + foreach ($this->_displayGroups as $key => $group) { + if (array_key_exists($key, $this->_order)) { + unset($this->_order[$key]); + } + foreach ($group as $name => $element) { + if (isset($this->_elements[$name])) { + $this->_order[$name] = $element->getOrder(); + } + $this->_order[$name] = $element->getOrder(); + } + } + $this->_displayGroups = array(); + $this->_orderUpdated = true; + return $this; + } + + + // Processing + + /** + * Populate form + * + * Proxies to {@link setDefaults()} + * + * @param array $values + * @return Zend_Form + */ + public function populate(array $values) + { + return $this->setDefaults($values); + } + + /** + * Determine array key name from given value + * + * Given a value such as foo[bar][baz], returns the last element (in this case, 'baz'). + * + * @param string $value + * @return string + */ + protected function _getArrayName($value) + { + if (empty($value) || !is_string($value)) { + return $value; + } + + if (!strstr($value, '[')) { + return $value; + } + + $endPos = strlen($value) - 1; + if (']' != $value[$endPos]) { + return $value; + } + + $start = strrpos($value, '[') + 1; + $name = substr($value, $start, $endPos - $start); + return $name; + } + + /** + * Extract the value by walking the array using given array path. + * + * Given an array path such as foo[bar][baz], returns the value of the last + * element (in this case, 'baz'). + * + * @param array $value Array to walk + * @param string $arrayPath Array notation path of the part to extract + * @return string + */ + protected function _dissolveArrayValue($value, $arrayPath) + { + // As long as we have more levels + while ($arrayPos = strpos($arrayPath, '[')) { + // Get the next key in the path + $arrayKey = trim(substr($arrayPath, 0, $arrayPos), ']'); + + // Set the potentially final value or the next search point in the array + if (isset($value[$arrayKey])) { + $value = $value[$arrayKey]; + } + + // Set the next search point in the path + $arrayPath = trim(substr($arrayPath, $arrayPos + 1), ']'); + } + + if (isset($value[$arrayPath])) { + $value = $value[$arrayPath]; + } + + return $value; + } + + /** + * Converts given arrayPath to an array and attaches given value at the end of it. + * + * @param mixed $value The value to attach + * @param string $arrayPath Given array path to convert and attach to. + * @return array + */ + protected function _attachToArray($value, $arrayPath) + { + // As long as we have more levels + while ($arrayPos = strrpos($arrayPath, '[')) { + // Get the next key in the path + $arrayKey = trim(substr($arrayPath, $arrayPos + 1), ']'); + + // Attach + $value = array($arrayKey => $value); + + // Set the next search point in the path + $arrayPath = trim(substr($arrayPath, 0, $arrayPos), ']'); + } + + $value = array($arrayPath => $value); + + return $value; + } + + /** + * Validate the form + * + * @param array $data + * @return boolean + */ + public function isValid($data) + { + if (!is_array($data)) { + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception(__CLASS__ . '::' . __METHOD__ . ' expects an array'); + } + $translator = $this->getTranslator(); + $valid = true; + + if ($this->isArray()) { + $data = $this->_dissolveArrayValue($data, $this->getElementsBelongTo()); + } + + foreach ($this->getElements() as $key => $element) { + $element->setTranslator($translator); + if (!isset($data[$key])) { + $valid = $element->isValid(null, $data) && $valid; + } else { + $valid = $element->isValid($data[$key], $data) && $valid; + } + } + foreach ($this->getSubForms() as $key => $form) { + $form->setTranslator($translator); + if (isset($data[$key])) { + $valid = $form->isValid($data[$key]) && $valid; + } else { + $valid = $form->isValid($data) && $valid; + } + } + + $this->_errorsExist = !$valid; + return $valid; + } + + /** + * Validate a partial form + * + * Does not check for required flags. + * + * @param array $data + * @return boolean + */ + public function isValidPartial(array $data) + { + if ($this->isArray()) { + $data = $this->_dissolveArrayValue($data, $this->getElementsBelongTo()); + } + + $translator = $this->getTranslator(); + $valid = true; + $validatedSubForms = array(); + + foreach ($data as $key => $value) { + if (null !== ($element = $this->getElement($key))) { + if (null !== $translator) { + $element->setTranslator($translator); + } + $valid = $element->isValid($value, $data) && $valid; + } elseif (null !== ($subForm = $this->getSubForm($key))) { + if (null !== $translator) { + $subForm->setTranslator($translator); + } + $valid = $subForm->isValidPartial($data[$key]) && $valid; + $validatedSubForms[] = $key; + } + } + foreach ($this->getSubForms() as $key => $subForm) { + if (!in_array($key, $validatedSubForms)) { + if (null !== $translator) { + $subForm->setTranslator($translator); + } + + $valid = $subForm->isValidPartial($data) && $valid; + } + } + + $this->_errorsExist = !$valid; + return $valid; + } + + /** + * Process submitted AJAX data + * + * Checks if provided $data is valid, via {@link isValidPartial()}. If so, + * it returns JSON-encoded boolean true. If not, it returns JSON-encoded + * error messages (as returned by {@link getMessages()}). + * + * @param array $data + * @return string JSON-encoded boolean true or error messages + */ + public function processAjax(array $data) + { + require_once 'Zend/Json.php'; + if ($this->isValidPartial($data)) { + return Zend_Json::encode(true); + } + $messages = $this->getMessages(); + return Zend_Json::encode($messages); + } + + /** + * Add a custom error message to return in the event of failed validation + * + * @param string $message + * @return Zend_Form + */ + public function addErrorMessage($message) + { + $this->_errorMessages[] = (string) $message; + return $this; + } + + /** + * Add multiple custom error messages to return in the event of failed validation + * + * @param array $messages + * @return Zend_Form + */ + public function addErrorMessages(array $messages) + { + foreach ($messages as $message) { + $this->addErrorMessage($message); + } + return $this; + } + + /** + * Same as addErrorMessages(), but clears custom error message stack first + * + * @param array $messages + * @return Zend_Form + */ + public function setErrorMessages(array $messages) + { + $this->clearErrorMessages(); + return $this->addErrorMessages($messages); + } + + /** + * Retrieve custom error messages + * + * @return array + */ + public function getErrorMessages() + { + return $this->_errorMessages; + } + + /** + * Clear custom error messages stack + * + * @return Zend_Form + */ + public function clearErrorMessages() + { + $this->_errorMessages = array(); + return $this; + } + + /** + * Mark the element as being in a failed validation state + * + * @return Zend_Form + */ + public function markAsError() + { + $this->_errorsExist = true; + return $this; + } + + /** + * Add an error message and mark element as failed validation + * + * @param string $message + * @return Zend_Form + */ + public function addError($message) + { + $this->addErrorMessage($message); + $this->markAsError(); + return $this; + } + + /** + * Add multiple error messages and flag element as failed validation + * + * @param array $messages + * @return Zend_Form + */ + public function addErrors(array $messages) + { + foreach ($messages as $message) { + $this->addError($message); + } + return $this; + } + + /** + * Overwrite any previously set error messages and flag as failed validation + * + * @param array $messages + * @return Zend_Form + */ + public function setErrors(array $messages) + { + $this->clearErrorMessages(); + return $this->addErrors($messages); + } + + + public function persistData() + { + } + + /** + * Are there errors in the form? + * + * @return bool + */ + public function isErrors() + { + return $this->_errorsExist; + } + + /** + * Get error codes for all elements failing validation + * + * @param string $name + * @return array + */ + public function getErrors($name = null) + { + $errors = array(); + if ((null !== $name) && isset($this->_elements[$name])) { + $errors = $this->getElement($name)->getErrors(); + } elseif ((null !== $name) && isset($this->_subForms[$name])) { + $errors = $this->getSubForm($name)->getErrors(); + } else { + foreach ($this->_elements as $key => $element) { + $errors[$key] = $element->getErrors(); + } + foreach ($this->getSubForms() as $key => $subForm) { + $fErrors = $this->_attachToArray($subForm->getErrors(), $subForm->getElementsBelongTo()); + $errors = array_merge($errors, $fErrors); + } + } + return $errors; + } + + /** + * Retrieve error messages from elements failing validations + * + * @param string $name + * @param bool $suppressArrayNotation + * @return array + */ + public function getMessages($name = null, $suppressArrayNotation = false) + { + if ((null !== $name) && isset($this->_elements[$name])) { + return $this->getElement($name)->getMessages(); + } + + if ((null !== $name) && isset($this->_subForms[$name])) { + return $this->getSubForm($name)->getMessages(null, true); + } + + $arrayKeys = array(); + foreach ($this->getSubForms() as $key => $subForm) { + $array = $this->_getArrayName($subForm->getElementsBelongTo()); + if (!empty($array)) { + if ($name == $array) { + return $subForm->getMessages(null, true); + } + $arrayKeys[$key] = $subForm->getElementsBelongTo(); + } + } + + $customMessages = $this->_getErrorMessages(); + if ($this->isErrors() && !empty($customMessages)) { + return $customMessages; + } + + $messages = array(); + + foreach ($this->getElements() as $name => $element) { + $eMessages = $element->getMessages(); + if (!empty($eMessages)) { + $messages[$name] = $eMessages; + } + } + + foreach ($this->getSubForms() as $key => $subForm) { + $fMessages = $subForm->getMessages(null, true); + if (!empty($fMessages)) { + if (array_key_exists($key, $arrayKeys)) { + $fMessages = $this->_attachToArray($fMessages, $arrayKeys[$key]); + $messages = array_merge($messages, $fMessages); + } else { + $messages[$key] = $fMessages; + } + } + } + + if (!$suppressArrayNotation && $this->isArray()) { + $messages = $this->_attachToArray($messages, $this->getElementsBelongTo()); + } + + return $messages; + } + + + // Rendering + + /** + * Set view object + * + * @param Zend_View_Interface $view + * @return Zend_Form + */ + public function setView(Zend_View_Interface $view = null) + { + $this->_view = $view; + return $this; + } + + /** + * Retrieve view object + * + * If none registered, attempts to pull from ViewRenderer. + * + * @return Zend_View_Interface|null + */ + public function getView() + { + if (null === $this->_view) { + require_once 'Zend/Controller/Action/HelperBroker.php'; + $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer'); + $this->setView($viewRenderer->view); + } + + return $this->_view; + } + + /** + * Instantiate a decorator based on class name or class name fragment + * + * @param string $name + * @param null|array $options + * @return Zend_Form_Decorator_Interface + */ + protected function _getDecorator($name, $options) + { + $class = $this->getPluginLoader(self::DECORATOR)->load($name); + if (null === $options) { + $decorator = new $class; + } else { + $r = new ReflectionClass($class); + $decorator = $r->newInstance($options); + } + + return $decorator; + } + + /** + * Add a decorator for rendering the element + * + * @param string|Zend_Form_Decorator_Interface $decorator + * @param array|Zend_Config $options Options with which to initialize decorator + * @return Zend_Form + */ + public function addDecorator($decorator, $options = null) + { + if ($decorator instanceof Zend_Form_Decorator_Interface) { + $name = get_class($decorator); + } elseif (is_string($decorator)) { + $name = $decorator; + $decorator = array( + 'decorator' => $name, + 'options' => $options, + ); + } elseif (is_array($decorator)) { + foreach ($decorator as $name => $spec) { + break; + } + if (is_numeric($name)) { + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception('Invalid alias provided to addDecorator; must be alphanumeric string'); + } + if (is_string($spec)) { + $decorator = array( + 'decorator' => $spec, + 'options' => $options, + ); + } elseif ($spec instanceof Zend_Form_Decorator_Interface) { + $decorator = $spec; + } + } else { + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception('Invalid decorator provided to addDecorator; must be string or Zend_Form_Decorator_Interface'); + } + + $this->_decorators[$name] = $decorator; + + return $this; + } + + /** + * Add many decorators at once + * + * @param array $decorators + * @return Zend_Form + */ + public function addDecorators(array $decorators) + { + foreach ($decorators as $decoratorInfo) { + if (is_string($decoratorInfo)) { + $this->addDecorator($decoratorInfo); + } elseif ($decoratorInfo instanceof Zend_Form_Decorator_Interface) { + $this->addDecorator($decoratorInfo); + } elseif (is_array($decoratorInfo)) { + $argc = count($decoratorInfo); + $options = array(); + if (isset($decoratorInfo['decorator'])) { + $decorator = $decoratorInfo['decorator']; + if (isset($decoratorInfo['options'])) { + $options = $decoratorInfo['options']; + } + $this->addDecorator($decorator, $options); + } else { + switch (true) { + case (0 == $argc): + break; + case (1 <= $argc): + $decorator = array_shift($decoratorInfo); + case (2 <= $argc): + $options = array_shift($decoratorInfo); + default: + $this->addDecorator($decorator, $options); + break; + } + } + } else { + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception('Invalid decorator passed to addDecorators()'); + } + } + + return $this; + } + + /** + * Overwrite all decorators + * + * @param array $decorators + * @return Zend_Form + */ + public function setDecorators(array $decorators) + { + $this->clearDecorators(); + return $this->addDecorators($decorators); + } + + /** + * Retrieve a registered decorator + * + * @param string $name + * @return false|Zend_Form_Decorator_Abstract + */ + public function getDecorator($name) + { + if (!isset($this->_decorators[$name])) { + $len = strlen($name); + foreach ($this->_decorators as $localName => $decorator) { + if ($len > strlen($localName)) { + continue; + } + + if (0 === substr_compare($localName, $name, -$len, $len, true)) { + if (is_array($decorator)) { + return $this->_loadDecorator($decorator, $localName); + } + return $decorator; + } + } + return false; + } + + if (is_array($this->_decorators[$name])) { + return $this->_loadDecorator($this->_decorators[$name], $name); + } + + return $this->_decorators[$name]; + } + + /** + * Retrieve all decorators + * + * @return array + */ + public function getDecorators() + { + foreach ($this->_decorators as $key => $value) { + if (is_array($value)) { + $this->_loadDecorator($value, $key); + } + } + return $this->_decorators; + } + + /** + * Remove a single decorator + * + * @param string $name + * @return bool + */ + public function removeDecorator($name) + { + $decorator = $this->getDecorator($name); + if ($decorator) { + if (array_key_exists($name, $this->_decorators)) { + unset($this->_decorators[$name]); + } else { + $class = get_class($decorator); + if (!array_key_exists($class, $this->_decorators)) { + return false; + } + unset($this->_decorators[$class]); + } + return true; + } + + return false; + } + + /** + * Clear all decorators + * + * @return Zend_Form + */ + public function clearDecorators() + { + $this->_decorators = array(); + return $this; + } + + /** + * Set all element decorators as specified + * + * @param array $decorators + * @param array|null $elements Specific elements to decorate or exclude from decoration + * @param bool $include Whether $elements is an inclusion or exclusion list + * @return Zend_Form + */ + public function setElementDecorators(array $decorators, array $elements = null, $include = true) + { + if (is_array($elements)) { + if ($include) { + $elementObjs = array(); + foreach ($elements as $name) { + if (null !== ($element = $this->getElement($name))) { + $elementObjs[] = $element; + } + } + } else { + $elementObjs = $this->getElements(); + foreach ($elements as $name) { + if (array_key_exists($name, $elementObjs)) { + unset($elementObjs[$name]); + } + } + } + } else { + $elementObjs = $this->getElements(); + } + + foreach ($elementObjs as $element) { + $element->setDecorators($decorators); + } + + return $this; + } + + /** + * Set all display group decorators as specified + * + * @param array $decorators + * @return Zend_Form + */ + public function setDisplayGroupDecorators(array $decorators) + { + foreach ($this->getDisplayGroups() as $group) { + $group->setDecorators($decorators); + } + + return $this; + } + + /** + * Set all subform decorators as specified + * + * @param array $decorators + * @return Zend_Form + */ + public function setSubFormDecorators(array $decorators) + { + foreach ($this->getSubForms() as $form) { + $form->setDecorators($decorators); + } + + return $this; + } + + /** + * Render form + * + * @param Zend_View_Interface $view + * @return string + */ + public function render(Zend_View_Interface $view = null) + { + if (null !== $view) { + $this->setView($view); + } + + $content = ''; + foreach ($this->getDecorators() as $decorator) { + $decorator->setElement($this); + $content = $decorator->render($content); + } + return $content; + } + + /** + * Serialize as string + * + * Proxies to {@link render()}. + * + * @return string + */ + public function __toString() + { + try { + $return = $this->render(); + return $return; + } catch (Exception $e) { + $message = "Exception caught by form: " . $e->getMessage() + . "\nStack Trace:\n" . $e->getTraceAsString(); + trigger_error($message, E_USER_WARNING); + return ''; + } + } + + + // Localization: + + /** + * Set translator object + * + * @param Zend_Translate|Zend_Translate_Adapter|null $translator + * @return Zend_Form + */ + public function setTranslator($translator = null) + { + if (null === $translator) { + $this->_translator = null; + } elseif ($translator instanceof Zend_Translate_Adapter) { + $this->_translator = $translator; + } elseif ($translator instanceof Zend_Translate) { + $this->_translator = $translator->getAdapter(); + } else { + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception('Invalid translator specified'); + } + + return $this; + } + + /** + * Set global default translator object + * + * @param Zend_Translate|Zend_Translate_Adapter|null $translator + * @return void + */ + public static function setDefaultTranslator($translator = null) + { + if (null === $translator) { + self::$_translatorDefault = null; + } elseif ($translator instanceof Zend_Translate_Adapter) { + self::$_translatorDefault = $translator; + } elseif ($translator instanceof Zend_Translate) { + self::$_translatorDefault = $translator->getAdapter(); + } else { + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception('Invalid translator specified'); + } + } + + /** + * Retrieve translator object + * + * @return Zend_Translate|null + */ + public function getTranslator() + { + if ($this->translatorIsDisabled()) { + return null; + } + + if (null === $this->_translator) { + return self::getDefaultTranslator(); + } + + return $this->_translator; + } + + /** + * Get global default translator object + * + * @return null|Zend_Translate + */ + public static function getDefaultTranslator() + { + if (null === self::$_translatorDefault) { + require_once 'Zend/Registry.php'; + if (Zend_Registry::isRegistered('Zend_Translate')) { + $translator = Zend_Registry::get('Zend_Translate'); + if ($translator instanceof Zend_Translate_Adapter) { + return $translator; + } elseif ($translator instanceof Zend_Translate) { + return $translator->getAdapter(); + } + } + } + return self::$_translatorDefault; + } + + /** + * Indicate whether or not translation should be disabled + * + * @param bool $flag + * @return Zend_Form + */ + public function setDisableTranslator($flag) + { + $this->_translatorDisabled = (bool) $flag; + return $this; + } + + /** + * Is translation disabled? + * + * @return bool + */ + public function translatorIsDisabled() + { + return $this->_translatorDisabled; + } + + /** + * Overloading: access to elements, form groups, and display groups + * + * @param string $name + * @return Zend_Form_Element|Zend_Form|null + */ + public function __get($name) + { + if (isset($this->_elements[$name])) { + return $this->_elements[$name]; + } elseif (isset($this->_subForms[$name])) { + return $this->_subForms[$name]; + } elseif (isset($this->_displayGroups[$name])) { + return $this->_displayGroups[$name]; + } + + return null; + } + + /** + * Overloading: access to elements, form groups, and display groups + * + * @param string $name + * @param Zend_Form_Element|Zend_Form $value + * @return void + * @throws Zend_Form_Exception for invalid $value + */ + public function __set($name, $value) + { + if ($value instanceof Zend_Form_Element) { + $this->addElement($value, $name); + return; + } elseif ($value instanceof Zend_Form) { + $this->addSubForm($value, $name); + return; + } elseif (is_array($value)) { + $this->addDisplayGroup($value, $name); + return; + } + + require_once 'Zend/Form/Exception.php'; + if (is_object($value)) { + $type = get_class($value); + } else { + $type = gettype($value); + } + throw new Zend_Form_Exception('Only form elements and groups may be overloaded; variable of type "' . $type . '" provided'); + } + + /** + * Overloading: access to elements, form groups, and display groups + * + * @param string $name + * @return boolean + */ + public function __isset($name) + { + if (isset($this->_elements[$name]) + || isset($this->_subForms[$name]) + || isset($this->_displayGroups[$name])) + { + return true; + } + + return false; + } + + /** + * Overloading: access to elements, form groups, and display groups + * + * @param string $name + * @return void + */ + public function __unset($name) + { + if (isset($this->_elements[$name])) { + unset($this->_elements[$name]); + } elseif (isset($this->_subForms[$name])) { + unset($this->_subForms[$name]); + } elseif (isset($this->_displayGroups[$name])) { + unset($this->_displayGroups[$name]); + } + } + + /** + * Overloading: allow rendering specific decorators + * + * Call renderDecoratorName() to render a specific decorator. + * + * @param string $method + * @param array $args + * @return string + * @throws Zend_Form_Exception for invalid decorator or invalid method call + */ + public function __call($method, $args) + { + if ('render' == substr($method, 0, 6)) { + $decoratorName = substr($method, 6); + if (false !== ($decorator = $this->getDecorator($decoratorName))) { + $decorator->setElement($this); + $seed = ''; + if (0 < count($args)) { + $seed = array_shift($args); + } + return $decorator->render($seed); + } + + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception(sprintf('Decorator by name %s does not exist', $decoratorName)); + } + + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception(sprintf('Method %s does not exist', $method)); + } + + // Interfaces: Iterator, Countable + + /** + * Current element/subform/display group + * + * @return Zend_Form_Element|Zend_Form_DisplayGroup|Zend_Form + */ + public function current() + { + $this->_sort(); + current($this->_order); + $key = key($this->_order); + + if (isset($this->_elements[$key])) { + return $this->getElement($key); + } elseif (isset($this->_subForms[$key])) { + return $this->getSubForm($key); + } elseif (isset($this->_displayGroups[$key])) { + return $this->getDisplayGroup($key); + } else { + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception(sprintf('Corruption detected in form; invalid key ("%s") found in internal iterator', (string) $key)); + } + } + + /** + * Current element/subform/display group name + * + * @return string + */ + public function key() + { + $this->_sort(); + return key($this->_order); + } + + /** + * Move pointer to next element/subform/display group + * + * @return void + */ + public function next() + { + $this->_sort(); + next($this->_order); + } + + /** + * Move pointer to beginning of element/subform/display group loop + * + * @return void + */ + public function rewind() + { + $this->_sort(); + reset($this->_order); + } + + /** + * Determine if current element/subform/display group is valid + * + * @return bool + */ + public function valid() + { + $this->_sort(); + return (current($this->_order) !== false); + } + + /** + * Count of elements/subforms that are iterable + * + * @return int + */ + public function count() + { + return count($this->_order); + } + + /** + * Set flag to disable loading default decorators + * + * @param bool $flag + * @return Zend_Form + */ + public function setDisableLoadDefaultDecorators($flag) + { + $this->_disableLoadDefaultDecorators = (bool) $flag; + return $this; + } + + /** + * Should we load the default decorators? + * + * @return bool + */ + public function loadDefaultDecoratorsIsDisabled() + { + return $this->_disableLoadDefaultDecorators; + } + + /** + * Load the default decorators + * + * @return void + */ + public function loadDefaultDecorators() + { + if ($this->loadDefaultDecoratorsIsDisabled()) { + return; + } + + $decorators = $this->getDecorators(); + if (empty($decorators)) { + $this->addDecorator('FormElements') + ->addDecorator('HtmlTag', array('tag' => 'dl', 'class' => 'zend_form')) + ->addDecorator('Form'); + } + } + + /** + * Sort items according to their order + * + * @return void + */ + protected function _sort() + { + if ($this->_orderUpdated) { + $items = array(); + $index = 0; + foreach ($this->_order as $key => $order) { + if (null === $order) { + if (null === ($order = $this->{$key}->getOrder())) { + while (array_search($index, $this->_order, true)) { + ++$index; + } + $items[$index] = $key; + ++$index; + } else { + $items[$order] = $key; + } + } else { + $items[$order] = $key; + } + } + + $items = array_flip($items); + asort($items); + $this->_order = $items; + $this->_orderUpdated = false; + } + } + + /** + * Lazy-load a decorator + * + * @param array $decorator Decorator type and options + * @param mixed $name Decorator name or alias + * @return Zend_Form_Decorator_Interface + */ + protected function _loadDecorator(array $decorator, $name) + { + $sameName = false; + if ($name == $decorator['decorator']) { + $sameName = true; + } + + $instance = $this->_getDecorator($decorator['decorator'], $decorator['options']); + if ($sameName) { + $newName = get_class($instance); + $decoratorNames = array_keys($this->_decorators); + $order = array_flip($decoratorNames); + $order[$newName] = $order[$name]; + $decoratorsExchange = array(); + unset($order[$name]); + asort($order); + foreach ($order as $key => $index) { + if ($key == $newName) { + $decoratorsExchange[$key] = $instance; + continue; + } + $decoratorsExchange[$key] = $this->_decorators[$key]; + } + $this->_decorators = $decoratorsExchange; + } else { + $this->_decorators[$name] = $instance; + } + + return $instance; + } + + /** + * Retrieve optionally translated custom error messages + * + * @return array + */ + protected function _getErrorMessages() + { + $messages = $this->getErrorMessages(); + $translator = $this->getTranslator(); + if (null !== $translator) { + foreach ($messages as $key => $message) { + $messages[$key] = $translator->translate($message); + } + } + return $messages; + } +} diff --git a/libs/Zend/Form/Decorator/Abstract.php b/libs/Zend/Form/Decorator/Abstract.php new file mode 100644 index 0000000..4192d45 --- /dev/null +++ b/libs/Zend/Form/Decorator/Abstract.php @@ -0,0 +1,254 @@ +setOptions($options); + } elseif ($options instanceof Zend_Config) { + $this->setConfig($options); + } + } + + /** + * Set options + * + * @param array $options + * @return Zend_Form_Decorator_Abstract + */ + public function setOptions(array $options) + { + $this->_options = $options; + return $this; + } + + /** + * Set options from config object + * + * @param Zend_Config $config + * @return Zend_Form_Decorator_Abstract + */ + public function setConfig(Zend_Config $config) + { + return $this->setOptions($config->toArray()); + } + + /** + * Set option + * + * @param string $key + * @param mixed $value + * @return Zend_Form_Decorator_Abstract + */ + public function setOption($key, $value) + { + $this->_options[(string) $key] = $value; + return $this; + } + + /** + * Get option + * + * @param string $key + * @return mixed + */ + public function getOption($key) + { + $key = (string) $key; + if (isset($this->_options[$key])) { + return $this->_options[$key]; + } + + return null; + } + + /** + * Retrieve options + * + * @return array + */ + public function getOptions() + { + return $this->_options; + } + + /** + * Remove single option + * + * @param mixed $key + * @return void + */ + public function removeOption($key) + { + if (null !== $this->getOption($key)) { + unset($this->_options[$key]); + return true; + } + + return false; + } + + /** + * Clear all options + * + * @return Zend_Form_Decorator_Abstract + */ + public function clearOptions() + { + $this->_options = array(); + return $this; + } + + /** + * Set current form element + * + * @param Zend_Form_Element|Zend_Form $element + * @return Zend_Form_Decorator_Abstract + * @throws Zend_Form_Decorator_Exception on invalid element type + */ + public function setElement($element) + { + if ((!$element instanceof Zend_Form_Element) + && (!$element instanceof Zend_Form) + && (!$element instanceof Zend_Form_DisplayGroup)) + { + require_once 'Zend/Form/Decorator/Exception.php'; + throw new Zend_Form_Decorator_Exception('Invalid element type passed to decorator'); + } + + $this->_element = $element; + return $this; + } + + /** + * Retrieve current element + * + * @return Zend_Form_Element|Zend_Form + */ + public function getElement() + { + return $this->_element; + } + + /** + * Determine if decorator should append or prepend content + * + * @return string + */ + public function getPlacement() + { + $placement = $this->_placement; + if (null !== ($placementOpt = $this->getOption('placement'))) { + $placementOpt = strtoupper($placementOpt); + switch ($placementOpt) { + case self::APPEND: + case self::PREPEND: + $placement = $this->_placement = $placementOpt; + break; + case false: + $placement = $this->_placement = null; + break; + default: + break; + } + $this->removeOption('placement'); + } + + return $placement; + } + + /** + * Retrieve separator to use between old and new content + * + * @return string + */ + public function getSeparator() + { + $separator = $this->_separator; + if (null !== ($separatorOpt = $this->getOption('separator'))) { + $separator = $this->_separator = (string) $separatorOpt; + $this->removeOption('separator'); + } + return $separator; + } + + /** + * Decorate content and/or element + * + * @param string $content + * @return string + * @throws Zend_Dorm_Decorator_Exception when unimplemented + */ + public function render($content) + { + require_once 'Zend/Form/Decorator/Exception.php'; + throw new Zend_Form_Decorator_Exception('render() not implemented'); + } +} diff --git a/libs/Zend/Form/Decorator/Callback.php b/libs/Zend/Form/Decorator/Callback.php new file mode 100644 index 0000000..94ee292 --- /dev/null +++ b/libs/Zend/Form/Decorator/Callback.php @@ -0,0 +1,136 @@ +_callback = $callback; + return $this; + } + + /** + * Get registered callback + * + * If not previously registered, checks to see if it exists in registered + * options. + * + * @return null|string|array + */ + public function getCallback() + { + if (null === $this->_callback) { + if (null !== ($callback = $this->getOption('callback'))) { + $this->setCallback($callback); + $this->removeOption('callback'); + } + } + + return $this->_callback; + } + + /** + * Render + * + * If no callback registered, returns callback. Otherwise, gets return + * value of callback and either appends, prepends, or replaces passed in + * content. + * + * @param string $content + * @return string + */ + public function render($content) + { + $callback = $this->getCallback(); + if (null === $callback) { + return $content; + } + + $placement = $this->getPlacement(); + $separator = $this->getSeparator(); + + $response = call_user_func($callback, $content, $this->getElement(), $this->getOptions()); + + switch ($placement) { + case self::APPEND: + return $content . $separator . $response; + case self::PREPEND: + return $response . $separator . $content; + default: + // replace content + return $response; + } + } +} diff --git a/libs/Zend/Form/Decorator/Captcha.php b/libs/Zend/Form/Decorator/Captcha.php new file mode 100644 index 0000000..f81cde4 --- /dev/null +++ b/libs/Zend/Form/Decorator/Captcha.php @@ -0,0 +1,72 @@ +getElement(); + if (!method_exists($element, 'getCaptcha')) { + return $content; + } + + $view = $element->getView(); + if (null === $view) { + return $content; + } + + $placement = $this->getPlacement(); + $separator = $this->getSeparator(); + + $captcha = $element->getCaptcha(); + $markup = $captcha->render($view, $element); + switch ($placement) { + case 'PREPEND': + $content = $markup . $separator . $content; + break; + case 'APPEND': + default: + $content = $content . $separator . $markup; + } + return $content; + } +} diff --git a/libs/Zend/Form/Decorator/Captcha/Word.php b/libs/Zend/Form/Decorator/Captcha/Word.php new file mode 100644 index 0000000..b6283b5 --- /dev/null +++ b/libs/Zend/Form/Decorator/Captcha/Word.php @@ -0,0 +1,73 @@ +getElement(); + $view = $element->getView(); + if (null === $view) { + return $content; + } + + $name = $element->getFullyQualifiedName(); + + $hiddenName = $name . '[id]'; + $textName = $name . '[input]'; + + $placement = $this->getPlacement(); + $separator = $this->getSeparator(); + + $hidden = $view->formHidden($hiddenName, $element->getValue(), $element->getAttribs()); + $text = $view->formText($textName, '', $element->getAttribs()); + switch ($placement) { + case 'PREPEND': + $content = $hidden . $separator . $text . $separator . $content; + break; + case 'APPEND': + default: + $content = $content . $separator . $hidden . $separator . $text; + } + return $content; + } +} diff --git a/libs/Zend/Form/Decorator/Description.php b/libs/Zend/Form/Decorator/Description.php new file mode 100644 index 0000000..5ff1f0d --- /dev/null +++ b/libs/Zend/Form/Decorator/Description.php @@ -0,0 +1,199 @@ +_tag = (string) $tag; + return $this; + } + + /** + * Get HTML tag, if any, with which to surround description + * + * @return string + */ + public function getTag() + { + if (null === $this->_tag) { + $tag = $this->getOption('tag'); + if (null !== $tag) { + $this->removeOption('tag'); + } else { + $tag = 'p'; + } + + $this->setTag($tag); + return $tag; + } + + return $this->_tag; + } + + /** + * Get class with which to define description + * + * Defaults to 'hint' + * + * @return string + */ + public function getClass() + { + $class = $this->getOption('class'); + if (null === $class) { + $class = 'hint'; + $this->setOption('class', $class); + } + + return $class; + } + + /** + * Set whether or not to escape description + * + * @param bool $flag + * @return Zend_Form_Decorator_Description + */ + public function setEscape($flag) + { + $this->_escape = (bool) $flag; + return $this; + } + + /** + * Get escape flag + * + * @return true + */ + public function getEscape() + { + if (null === $this->_escape) { + if (null !== ($escape = $this->getOption('escape'))) { + $this->setEscape($escape); + $this->removeOption('escape'); + } else { + $this->setEscape(true); + } + } + + return $this->_escape; + } + + /** + * Render a description + * + * @param string $content + * @return string + */ + public function render($content) + { + $element = $this->getElement(); + $view = $element->getView(); + if (null === $view) { + return $content; + } + + $description = $element->getDescription(); + $description = trim($description); + + if (!empty($description) && (null !== ($translator = $element->getTranslator()))) { + $description = $translator->translate($description); + } + + if (empty($description)) { + return $content; + } + + $separator = $this->getSeparator(); + $placement = $this->getPlacement(); + $tag = $this->getTag(); + $class = $this->getClass(); + $escape = $this->getEscape(); + + $options = $this->getOptions(); + + if ($escape) { + $description = $view->escape($description); + } + + if (!empty($tag)) { + require_once 'Zend/Form/Decorator/HtmlTag.php'; + $options['tag'] = $tag; + $decorator = new Zend_Form_Decorator_HtmlTag($options); + $description = $decorator->render($description); + } + + switch ($placement) { + case self::PREPEND: + return $description . $separator . $content; + case self::APPEND: + default: + return $content . $separator . $description; + } + } +} diff --git a/libs/Zend/Form/Decorator/DtDdWrapper.php b/libs/Zend/Form/Decorator/DtDdWrapper.php new file mode 100644 index 0000000..7955ac7 --- /dev/null +++ b/libs/Zend/Form/Decorator/DtDdWrapper.php @@ -0,0 +1,60 @@ + item, and wraps the content in a
. Used as a + * default decorator for subforms and display groups. + * + * @category Zend + * @package Zend_Form + * @subpackage Decorator + * @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: DtDdWrapper.php 9309 2008-04-25 16:06:59Z matthew $ + */ +class Zend_Form_Decorator_DtDdWrapper extends Zend_Form_Decorator_Abstract +{ + /** + * Default placement: surround content + * @var string + */ + protected $_placement = null; + + /** + * Render + * + * Renders as the following: + *
+ *
$content
+ * + * @param string $content + * @return string + */ + public function render($content) + { + return '
 
' . $content . '
'; + } +} diff --git a/libs/Zend/Form/Decorator/Errors.php b/libs/Zend/Form/Decorator/Errors.php new file mode 100644 index 0000000..d432fde --- /dev/null +++ b/libs/Zend/Form/Decorator/Errors.php @@ -0,0 +1,69 @@ +getElement(); + $view = $element->getView(); + if (null === $view) { + return $content; + } + + $errors = $element->getMessages(); + if (empty($errors)) { + return $content; + } + + $separator = $this->getSeparator(); + $placement = $this->getPlacement(); + $errors = $view->formErrors($errors, $this->getOptions()); + + switch ($placement) { + case self::APPEND: + return $content . $separator . $errors; + case self::PREPEND: + return $errors . $separator . $content; + } + } +} diff --git a/libs/Zend/Form/Decorator/Exception.php b/libs/Zend/Form/Decorator/Exception.php new file mode 100644 index 0000000..9c6800a --- /dev/null +++ b/libs/Zend/Form/Decorator/Exception.php @@ -0,0 +1,37 @@ +getElement())) { + $attribs = $element->getAttribs(); + $options = array_merge($options, $attribs); + $this->setOptions($options); + } + return $options; + } + + /** + * Set legend + * + * @param string $value + * @return Zend_Form_Decorator_Fieldset + */ + public function setLegend($value) + { + $this->_legend = (string) $value; + return $this; + } + + /** + * Get legend + * + * @return string + */ + public function getLegend() + { + $legend = $this->_legend; + if ((null === $legend) && (null !== ($element = $this->getElement()))) { + if (method_exists($element, 'getLegend')) { + $legend = $element->getLegend(); + $this->setLegend($legend); + } + } + if ((null === $legend) && (null !== ($legend = $this->getOption('legend')))) { + $this->setLegend($legend); + $this->removeOption('legend'); + } + + return $legend; + } + + /** + * Render a fieldset + * + * @param string $content + * @return string + */ + public function render($content) + { + $element = $this->getElement(); + $view = $element->getView(); + if (null === $view) { + return $content; + } + + $legend = $this->getLegend(); + $attribs = $this->getOptions(); + $name = $element->getFullyQualifiedName(); + + $id = $element->getId(); + if (!empty($id)) { + $attribs['id'] = 'fieldset-' . $id; + } + + if (null !== $legend) { + if (null !== ($translator = $element->getTranslator())) { + $legend = $translator->translate($legend); + } + + $attribs['legend'] = $legend; + } + + foreach (array_keys($attribs) as $attrib) { + $testAttrib = strtolower($attrib); + if (in_array($testAttrib, $this->stripAttribs)) { + unset($attribs[$attrib]); + } + } + + return $view->fieldset($name, $content, $attribs); + } +} diff --git a/libs/Zend/Form/Decorator/File.php b/libs/Zend/Form/Decorator/File.php new file mode 100644 index 0000000..64d741a --- /dev/null +++ b/libs/Zend/Form/Decorator/File.php @@ -0,0 +1,128 @@ +getOptions(); + + if (null !== ($element = $this->getElement())) { + $attribs = array_merge($attribs, $element->getAttribs()); + } + + foreach ($this->_attribBlacklist as $key) { + if (array_key_exists($key, $attribs)) { + unset($attribs[$key]); + } + } + + return $attribs; + } + + /** + * Render a form file + * + * @param string $content + * @return string + */ + public function render($content) + { + $element = $this->getElement(); + if (!$element instanceof Zend_Form_Element) { + return $content; + } + + $view = $element->getView(); + if (!$view instanceof Zend_View_Interface) { + return $content; + } + + $name = $element->getName(); + $attribs = $this->getAttribs(); + if (!array_key_exists('id', $attribs)) { + $attribs['id'] = $name; + } + + $separator = $this->getSeparator(); + $placement = $this->getPlacement(); + $markup = array(); + $size = $element->getMaxFileSize(); + if ($size > 0) { + $element->setMaxFileSize(0); + $markup[] = $view->formHidden('MAX_FILE_SIZE', $size); + } + + if ($element->isArray()) { + $name .= "[]"; + $count = $element->getMultiFile(); + for ($i = 0; $i < $count; ++$i) { + $htmlAttribs = $attribs; + $htmlAttribs['id'] .= '-' . $i; + $markup[] = $view->formFile($name, $htmlAttribs); + } + } else { + $markup[] = $view->formFile($name, $attribs); + } + + $markup = implode($separator, $markup); + + switch ($placement) { + case self::PREPEND: + return $markup . $separator . $content; + case self::APPEND: + default: + return $content . $separator . $markup; + } + } +} diff --git a/libs/Zend/Form/Decorator/Form.php b/libs/Zend/Form/Decorator/Form.php new file mode 100644 index 0000000..8bb8fcd --- /dev/null +++ b/libs/Zend/Form/Decorator/Form.php @@ -0,0 +1,134 @@ +_helper = (string) $helper; + return $this; + } + + /** + * Get view helper for rendering form + * + * @return string + */ + public function getHelper() + { + if (null !== ($helper = $this->getOption('helper'))) { + $this->setHelper($helper); + $this->removeOption('helper'); + } + return $this->_helper; + } + + /** + * Retrieve decorator options + * + * Assures that form action and method are set, and sets appropriate + * encoding type if current method is POST. + * + * @return array + */ + public function getOptions() + { + if (null !== ($element = $this->getElement())) { + if ($element instanceof Zend_Form) { + $element->getAction(); + $method = $element->getMethod(); + if ($method == Zend_Form::METHOD_POST) { + $this->setOption('enctype', 'application/x-www-form-urlencoded'); + } + foreach ($element->getAttribs() as $key => $value) { + $this->setOption($key, $value); + } + } elseif ($element instanceof Zend_Form_DisplayGroup) { + foreach ($element->getAttribs() as $key => $value) { + $this->setOption($key, $value); + } + } + } + + if (isset($this->_options['method'])) { + $this->_options['method'] = strtolower($this->_options['method']); + } + + return $this->_options; + } + + /** + * Render a form + * + * Replaces $content entirely from currently set element. + * + * @param string $content + * @return string + */ + public function render($content) + { + $form = $this->getElement(); + $view = $form->getView(); + if (null === $view) { + return $content; + } + + $helper = $this->getHelper(); + $attribs = $this->getOptions(); + $name = $form->getFullyQualifiedName(); + $attribs['id'] = $form->getId(); + return $view->$helper($name, $attribs, $content); + } +} diff --git a/libs/Zend/Form/Decorator/FormElements.php b/libs/Zend/Form/Decorator/FormElements.php new file mode 100644 index 0000000..a3ac7e5 --- /dev/null +++ b/libs/Zend/Form/Decorator/FormElements.php @@ -0,0 +1,112 @@ +getElement(); + if ((!$form instanceof Zend_Form) && (!$form instanceof Zend_Form_DisplayGroup)) { + return $content; + } + + $belongsTo = ($form instanceof Zend_Form) ? $form->getElementsBelongTo() : null; + $elementContent = ''; + $separator = $this->getSeparator(); + $translator = $form->getTranslator(); + $items = array(); + $view = $form->getView(); + foreach ($form as $item) { + $item->setView($view) + ->setTranslator($translator); + if ($item instanceof Zend_Form_Element) { + $item->setBelongsTo($belongsTo); + } elseif (!empty($belongsTo) && ($item instanceof Zend_Form)) { + if ($item->isArray()) { + $name = $this->mergeBelongsTo($belongsTo, $item->getElementsBelongTo()); + $item->setElementsBelongTo($name, true); + } else { + $item->setElementsBelongTo($belongsTo, true); + } + } elseif (!empty($belongsTo) && ($item instanceof Zend_Form_DisplayGroup)) { + foreach ($item as $element) { + $element->setBelongsTo($belongsTo); + } + } + $items[] = $item->render(); + } + $elementContent = implode($separator, $items); + + switch ($this->getPlacement()) { + case self::PREPEND: + return $elementContent . $separator . $content; + case self::APPEND: + default: + return $content . $separator . $elementContent; + } + } +} diff --git a/libs/Zend/Form/Decorator/FormErrors.php b/libs/Zend/Form/Decorator/FormErrors.php new file mode 100644 index 0000000..c7c92c8 --- /dev/null +++ b/libs/Zend/Form/Decorator/FormErrors.php @@ -0,0 +1,397 @@ + false, + 'markupElementLabelEnd' => '', + 'markupElementLabelStart' => '', + 'markupListEnd' => '', + 'markupListItemEnd' => '', + 'markupListItemStart' => '
  • ', + 'markupListStart' => '
      ', + ); + + /**#@+ + * Markup options + * @var string + */ + protected $_ignoreSubForms; + protected $_markupElementLabelEnd; + protected $_markupElementLabelStart; + protected $_markupListEnd; + protected $_markupListItemEnd; + protected $_markupListItemStart; + protected $_markupListStart; + /**#@-*/ + + /** + * Render errors + * + * @param string $content + * @return string + */ + public function render($content) + { + $form = $this->getElement(); + if (!$form instanceof Zend_Form) { + return $content; + } + + $view = $form->getView(); + if (null === $view) { + return $content; + } + + $this->initOptions(); + $markup = $this->_recurseForm($form, $view); + + if (empty($markup)) { + return $content; + } + + $markup = $this->getMarkupListStart() + . $markup + . $this->getMarkupListEnd(); + + switch ($this->getPlacement()) { + case self::APPEND: + return $content . $this->getSeparator() . $markup; + case self::PREPEND: + return $markup . $this->getSeparator() . $content; + } + } + + /** + * Initialize options + * + * @return void + */ + public function initOptions() + { + $this->getMarkupElementLabelEnd(); + $this->getMarkupElementLabelStart(); + $this->getMarkupListEnd(); + $this->getMarkupListItemEnd(); + $this->getMarkupListItemStart(); + $this->getMarkupListStart(); + $this->getPlacement(); + $this->getSeparator(); + $this->ignoreSubForms(); + } + + /** + * Retrieve markupElementLabelStart + * + * @return string + */ + public function getMarkupElementLabelStart() + { + if (null === $this->_markupElementLabelStart) { + if (null === ($markupElementLabelStart = $this->getOption('markupElementLabelStart'))) { + $this->setMarkupElementLabelStart($this->_defaults['markupElementLabelStart']); + } else { + $this->setMarkupElementLabelStart($markupElementLabelStart); + $this->removeOption('markupElementLabelStart'); + } + } + + return $this->_markupElementLabelStart; + } + + /** + * Set markupElementLabelStart + * + * @param string $markupElementLabelStart + * @return Zend_Form_Decorator_FormErrors + */ + public function setMarkupElementLabelStart($markupElementLabelStart) + { + $this->_markupElementLabelStart = $markupElementLabelStart; + return $this; + } + + /** + * Retrieve markupElementLabelEnd + * + * @return string + */ + public function getMarkupElementLabelEnd() + { + if (null === $this->_markupElementLabelEnd) { + if (null === ($markupElementLabelEnd = $this->getOption('markupElementLabelEnd'))) { + $this->setMarkupElementLabelEnd($this->_defaults['markupElementLabelEnd']); + } else { + $this->setMarkupElementLabelEnd($markupElementLabelEnd); + $this->removeOption('markupElementLabelEnd'); + } + } + + return $this->_markupElementLabelEnd; + } + + /** + * Set markupElementLabelEnd + * + * @param string $markupElementLabelEnd + * @return Zend_Form_Decorator_FormErrors + */ + public function setMarkupElementLabelEnd($markupElementLabelEnd) + { + $this->_markupElementLabelEnd = $markupElementLabelEnd; + return $this; + } + + /** + * Retrieve markupListStart + * + * @return string + */ + public function getMarkupListStart() + { + if (null === $this->_markupListStart) { + if (null === ($markupListStart = $this->getOption('markupListStart'))) { + $this->setMarkupListStart($this->_defaults['markupListStart']); + } else { + $this->setMarkupListStart($markupListStart); + $this->removeOption('markupListStart'); + } + } + + return $this->_markupListStart; + } + + /** + * Set markupListStart + * + * @param string $markupListStart + * @return Zend_Form_Decorator_FormErrors + */ + public function setMarkupListStart($markupListStart) + { + $this->_markupListStart = $markupListStart; + return $this; + } + + /** + * Retrieve markupListEnd + * + * @return string + */ + public function getMarkupListEnd() + { + if (null === $this->_markupListEnd) { + if (null === ($markupListEnd = $this->getOption('markupListEnd'))) { + $this->setMarkupListEnd($this->_defaults['markupListEnd']); + } else { + $this->setMarkupListEnd($markupListEnd); + $this->removeOption('markupListEnd'); + } + } + + return $this->_markupListEnd; + } + + /** + * Set markupListEnd + * + * @param string $markupListEnd + * @return Zend_Form_Decorator_FormErrors + */ + public function setMarkupListEnd($markupListEnd) + { + $this->_markupListEnd = $markupListEnd; + return $this; + } + + /** + * Retrieve markupListItemStart + * + * @return string + */ + public function getMarkupListItemStart() + { + if (null === $this->_markupListItemStart) { + if (null === ($markupListItemStart = $this->getOption('markupListItemStart'))) { + $this->setMarkupListItemStart($this->_defaults['markupListItemStart']); + } else { + $this->setMarkupListItemStart($markupListItemStart); + $this->removeOption('markupListItemStart'); + } + } + + return $this->_markupListItemStart; + } + + /** + * Set markupListItemStart + * + * @param string $markupListItemStart + * @return Zend_Form_Decorator_FormErrors + */ + public function setMarkupListItemStart($markupListItemStart) + { + $this->_markupListItemStart = $markupListItemStart; + return $this; + } + + /** + * Retrieve markupListItemEnd + * + * @return string + */ + public function getMarkupListItemEnd() + { + if (null === $this->_markupListItemEnd) { + if (null === ($markupListItemEnd = $this->getOption('markupListItemEnd'))) { + $this->setMarkupListItemEnd($this->_defaults['markupListItemEnd']); + } else { + $this->setMarkupListItemEnd($markupListItemEnd); + $this->removeOption('markupListItemEnd'); + } + } + + return $this->_markupListItemEnd; + } + + /** + * Set markupListItemEnd + * + * @param string $markupListItemEnd + * @return Zend_Form_Decorator_FormErrors + */ + public function setMarkupListItemEnd($markupListItemEnd) + { + $this->_markupListItemEnd = $markupListItemEnd; + return $this; + } + + /** + * Retrieve ignoreSubForms + * + * @return bool + */ + public function ignoreSubForms() + { + if (null === $this->_ignoreSubForms) { + if (null === ($ignoreSubForms = $this->getOption('ignoreSubForms'))) { + $this->setIgnoreSubForms($this->_defaults['ignoreSubForms']); + } else { + $this->setIgnoreSubForms($ignoreSubForms); + $this->removeOption('ignoreSubForms'); + } + } + + return $this->_ignoreSubForms; + } + + /** + * Set ignoreSubForms + * + * @param bool $ignoreSubForms + * @return Zend_Form_Decorator_FormErrors + */ + public function setIgnoreSubForms($ignoreSubForms) + { + $this->_ignoreSubForms = (bool) $ignoreSubForms; + return $this; + } + + /** + * Render element label + * + * @param Zend_Form_Element $element + * @param Zend_View_Interface $view + * @return string + */ + public function renderLabel(Zend_Form_Element $element, Zend_View_Interface $view) + { + $label = $element->getLabel(); + if (empty($label)) { + $label = $element->getName(); + } + + return $this->getMarkupElementLabelStart() + . $view->escape($label) + . $this->getMarkupElementLabelEnd(); + } + + /** + * Recurse through a form object, rendering errors + * + * @param Zend_Form $form + * @param Zend_View_Interface $view + * @return string + */ + protected function _recurseForm(Zend_Form $form, Zend_View_Interface $view) + { + $content = ''; + $errors = $form->getMessages(); + if ($form instanceof Zend_Form_SubForm) { + $name = $form->getName(); + if ((1 == count($errors)) && array_key_exists($name, $errors)) { + $errors = $errors[$name]; + } + } + if (empty($errors)) { + return $content; + } + + foreach ($errors as $name => $list) { + $element = $form->$name; + if ($element instanceof Zend_Form_Element) { + $element->setView($view); + $content .= $this->getMarkupListItemStart() + . $this->renderLabel($element, $view) + . $view->formErrors($list, $this->getOptions()) + . $this->getMarkupListItemEnd(); + } elseif (!$this->ignoreSubForms() && ($element instanceof Zend_Form)) { + $content .= $this->getMarkupListStart() + . $this->_recurseForm($element, $view) + . $this->getMarkupListEnd(); + } + } + + return $content; + } +} diff --git a/libs/Zend/Form/Decorator/HtmlTag.php b/libs/Zend/Form/Decorator/HtmlTag.php new file mode 100644 index 0000000..76639eb --- /dev/null +++ b/libs/Zend/Form/Decorator/HtmlTag.php @@ -0,0 +1,219 @@ + $val) { + $key = htmlspecialchars($key, ENT_COMPAT, 'UTF-8'); + if (is_array($val)) { + $val = implode(' ', $val); + } + $val = htmlspecialchars($val, ENT_COMPAT, 'UTF-8'); + $xhtml .= " $key=\"$val\""; + } + return $xhtml; + } + + /** + * Normalize tag + * + * Ensures tag is alphanumeric characters only, and all lowercase. + * + * @param string $tag + * @return string + */ + public function normalizeTag($tag) + { + if (!isset($this->_tagFilter)) { + require_once 'Zend/Filter.php'; + require_once 'Zend/Filter/Alnum.php'; + require_once 'Zend/Filter/StringToLower.php'; + $this->_tagFilter = new Zend_Filter(); + $this->_tagFilter->addFilter(new Zend_Filter_Alnum()) + ->addFilter(new Zend_Filter_StringToLower()); + } + return $this->_tagFilter->filter($tag); + } + + /** + * Set tag to use + * + * @param string $tag + * @return Zend_Form_Decorator_HtmlTag + */ + public function setTag($tag) + { + $this->_tag = $this->normalizeTag($tag); + return $this; + } + + /** + * Get tag + * + * If no tag is registered, either via setTag() or as an option, uses 'div'. + * + * @return string + */ + public function getTag() + { + if (null === $this->_tag) { + if (null === ($tag = $this->getOption('tag'))) { + $this->setTag('div'); + } else { + $this->setTag($tag); + $this->removeOption('tag'); + } + } + + return $this->_tag; + } + + /** + * Get the formatted open tag + * + * @param string $tag + * @param array $attribs + * @return string + */ + protected function _getOpenTag($tag, array $attribs = null) + { + $html = '<' . $tag; + if (null !== $attribs) { + $html .= $this->_htmlAttribs($attribs); + } + $html .= '>'; + return $html; + } + + /** + * Get formatted closing tag + * + * @param string $tag + * @return string + */ + protected function _getCloseTag($tag) + { + return ''; + } + + /** + * Render content wrapped in an HTML tag + * + * @param string $content + * @return string + */ + public function render($content) + { + $tag = $this->getTag(); + $placement = $this->getPlacement(); + $noAttribs = $this->getOption('noAttribs'); + $openOnly = $this->getOption('openOnly'); + $closeOnly = $this->getOption('closeOnly'); + $this->removeOption('noAttribs'); + $this->removeOption('openOnly'); + $this->removeOption('closeOnly'); + + $attribs = null; + if (!$noAttribs) { + $attribs = $this->getOptions(); + } + + switch ($placement) { + case self::APPEND: + if ($closeOnly) { + return $content . $this->_getCloseTag($tag); + } + if ($openOnly) { + return $content . $this->_getOpenTag($tag, $attribs); + } + return $content + . $this->_getOpenTag($tag, $attribs) + . $this->_getCloseTag($tag); + case self::PREPEND: + if ($closeOnly) { + return $this->_getCloseTag($tag) . $content; + } + if ($openOnly) { + return $this->_getOpenTag($tag, $attribs) . $content; + } + return $this->_getOpenTag($tag, $attribs) + . $this->_getCloseTag($tag) + . $content; + default: + return (($openOnly || !$closeOnly) ? $this->_getOpenTag($tag, $attribs) : '') + . $content + . (($closeOnly || !$openOnly) ? $this->_getCloseTag($tag) : ''); + } + } +} diff --git a/libs/Zend/Form/Decorator/Image.php b/libs/Zend/Form/Decorator/Image.php new file mode 100644 index 0000000..a106afc --- /dev/null +++ b/libs/Zend/Form/Decorator/Image.php @@ -0,0 +1,154 @@ +_tag = (string) $tag; + return $this; + } + + /** + * Get HTML tag, if any, with which to surround label + * + * @return void + */ + public function getTag() + { + if (null === $this->_tag) { + $tag = $this->getOption('tag'); + if (null !== $tag) { + $this->removeOption('tag'); + $this->setTag($tag); + } + return $tag; + } + + return $this->_tag; + } + + /** + * Get attributes to pass to image helper + * + * @return array + */ + public function getAttribs() + { + $attribs = $this->getOptions(); + + if (null !== ($element = $this->getElement())) { + $attribs['alt'] = $element->getLabel(); + $attribs = array_merge($attribs, $element->getAttribs()); + } + + foreach ($this->_attribBlacklist as $key) { + if (array_key_exists($key, $attribs)) { + unset($attribs[$key]); + } + } + + return $attribs; + } + + /** + * Render a form image + * + * @param string $content + * @return string + */ + public function render($content) + { + $element = $this->getElement(); + $view = $element->getView(); + if (null === $view) { + return $content; + } + + $tag = $this->getTag(); + $placement = $this->getPlacement(); + $separator = $this->getSeparator(); + $name = $element->getFullyQualifiedName(); + $attribs = $this->getAttribs(); + $attribs['id'] = $element->getId(); + + $image = $view->formImage($name, $element->getImageValue(), $attribs); + + if (null !== $tag) { + require_once 'Zend/Form/Decorator/HtmlTag.php'; + $decorator = new Zend_Form_Decorator_HtmlTag(); + $decorator->setOptions(array('tag' => $tag)); + $image = $decorator->render($image); + } + + switch ($placement) { + case self::PREPEND: + return $image . $separator . $content; + case self::APPEND: + default: + return $content . $separator . $image; + } + } +} diff --git a/libs/Zend/Form/Decorator/Interface.php b/libs/Zend/Form/Decorator/Interface.php new file mode 100644 index 0000000..c4cb834 --- /dev/null +++ b/libs/Zend/Form/Decorator/Interface.php @@ -0,0 +1,123 @@ +setOption('id', $id); + return $this; + } + + /** + * Retrieve element ID (used in 'for' attribute) + * + * If none set in decorator, looks first for element 'id' attribute, and + * defaults to element name. + * + * @return string + */ + public function getId() + { + $id = $this->getOption('id'); + if (null === $id) { + if (null !== ($element = $this->getElement())) { + $id = $element->getId(); + $this->setId($id); + } + } + + return $id; + } + + /** + * Set HTML tag with which to surround label + * + * @param string $tag + * @return Zend_Form_Decorator_Label + */ + public function setTag($tag) + { + if (empty($tag)) { + $this->_tag = null; + } else { + $this->_tag = (string) $tag; + } + return $this; + } + + /** + * Get HTML tag, if any, with which to surround label + * + * @return void + */ + public function getTag() + { + if (null === $this->_tag) { + $tag = $this->getOption('tag'); + if (null !== $tag) { + $this->removeOption('tag'); + $this->setTag($tag); + } + return $tag; + } + + return $this->_tag; + } + + /** + * Get class with which to define label + * + * Appends either 'optional' or 'required' to class, depending on whether + * or not the element is required. + * + * @return string + */ + public function getClass() + { + $class = ''; + $element = $this->getElement(); + + $decoratorClass = $this->getOption('class'); + if (!empty($decoratorClass)) { + $class .= ' ' . $decoratorClass; + } + + $type = $element->isRequired() ? 'required' : 'optional'; + + if (!strstr($class, $type)) { + $class .= ' ' . $type; + $class = trim($class); + } + + return $class; + } + + /** + * Load an optional/required suffix/prefix key + * + * @param string $key + * @return void + */ + protected function _loadOptReqKey($key) + { + if (!isset($this->$key)) { + $value = $this->getOption($key); + $this->$key = (string) $value; + if (null !== $value) { + $this->removeOption($key); + } + } + } + + /** + * Overloading + * + * Currently overloads: + * + * - getOpt(ional)Prefix() + * - getOpt(ional)Suffix() + * - getReq(uired)Prefix() + * - getReq(uired)Suffix() + * - setOpt(ional)Prefix() + * - setOpt(ional)Suffix() + * - setReq(uired)Prefix() + * - setReq(uired)Suffix() + * + * @param string $method + * @param array $args + * @return mixed + * @throws Zend_Form_Exception for unsupported methods + */ + public function __call($method, $args) + { + $tail = substr($method, -6); + $head = substr($method, 0, 3); + if (in_array($head, array('get', 'set')) + && (('Prefix' == $tail) || ('Suffix' == $tail)) + ) { + $position = substr($method, -6); + $type = strtolower(substr($method, 3, 3)); + switch ($type) { + case 'req': + $key = 'required' . $position; + break; + case 'opt': + $key = 'optional' . $position; + break; + default: + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception(sprintf('Invalid method "%s" called in Label decorator, and detected as type %s', $method, $type)); + } + + switch ($head) { + case 'set': + if (0 === count($args)) { + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception(sprintf('Method "%s" requires at least one argument; none provided', $method)); + } + $value = array_shift($args); + $this->$key = $value; + return $this; + case 'get': + default: + if (null === ($element = $this->getElement())) { + $this->_loadOptReqKey($key); + } elseif (isset($element->$key)) { + $this->$key = (string) $element->$key; + } else { + $this->_loadOptReqKey($key); + } + return $this->$key; + } + } + + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception(sprintf('Invalid method "%s" called in Label decorator', $method)); + } + + /** + * Get label to render + * + * @return void + */ + public function getLabel() + { + if (null === ($element = $this->getElement())) { + return ''; + } + + $label = $element->getLabel(); + $label = trim($label); + + if (empty($label)) { + return ''; + } + + if (null !== ($translator = $element->getTranslator())) { + $label = $translator->translate($label); + } + + $optPrefix = $this->getOptPrefix(); + $optSuffix = $this->getOptSuffix(); + $reqPrefix = $this->getReqPrefix(); + $reqSuffix = $this->getReqSuffix(); + $separator = $this->getSeparator(); + + if (!empty($label)) { + if ($element->isRequired()) { + $label = $reqPrefix . $label . $reqSuffix; + } else { + $label = $optPrefix . $label . $optSuffix; + } + } + + return $label; + } + + + /** + * Render a label + * + * @param string $content + * @return string + */ + public function render($content) + { + $element = $this->getElement(); + $view = $element->getView(); + if (null === $view) { + return $content; + } + + $label = $this->getLabel(); + $separator = $this->getSeparator(); + $placement = $this->getPlacement(); + $tag = $this->getTag(); + $id = $this->getId(); + $class = $this->getClass(); + $options = $this->getOptions(); + + + if (empty($label) && empty($tag)) { + return $content; + } + + if (!empty($label)) { + $options['class'] = $class; + $label = $view->formLabel($element->getFullyQualifiedName(), trim($label), $options); + } else { + $label = ' '; + } + + if (null !== $tag) { + require_once 'Zend/Form/Decorator/HtmlTag.php'; + $decorator = new Zend_Form_Decorator_HtmlTag(); + $decorator->setOptions(array('tag' => $tag)); + $label = $decorator->render($label); + } + + switch ($placement) { + case self::APPEND: + return $content . $separator . $label; + case self::PREPEND: + return $label . $separator . $content; + } + } +} diff --git a/libs/Zend/Form/Decorator/PrepareElements.php b/libs/Zend/Form/Decorator/PrepareElements.php new file mode 100644 index 0000000..f13b992 --- /dev/null +++ b/libs/Zend/Form/Decorator/PrepareElements.php @@ -0,0 +1,90 @@ +getElement(); + if ((!$form instanceof Zend_Form) && (!$form instanceof Zend_Form_DisplayGroup)) { + return $content; + } + + $this->_recursivelyPrepareForm($form); + + return $content; + } + + protected function _recursivelyPrepareForm(Zend_Form $form) + { + $belongsTo = ($form instanceof Zend_Form) ? $form->getElementsBelongTo() : null; + $elementContent = ''; + $separator = $this->getSeparator(); + $translator = $form->getTranslator(); + $view = $form->getView(); + + foreach ($form as $item) { + $item->setView($view) + ->setTranslator($translator); + if ($item instanceof Zend_Form_Element) { + $item->setBelongsTo($belongsTo); + } elseif (!empty($belongsTo) && ($item instanceof Zend_Form)) { + if ($item->isArray()) { + $name = $this->mergeBelongsTo($belongsTo, $item->getElementsBelongTo()); + $item->setElementsBelongTo($name, true); + } else { + $item->setElementsBelongTo($belongsTo, true); + } + $this->_recursivelyPrepareForm($item); + } elseif (!empty($belongsTo) && ($item instanceof Zend_Form_DisplayGroup)) { + foreach ($item as $element) { + $element->setBelongsTo($belongsTo); + } + } + } + } +} diff --git a/libs/Zend/Form/Decorator/ViewHelper.php b/libs/Zend/Form/Decorator/ViewHelper.php new file mode 100644 index 0000000..beb130f --- /dev/null +++ b/libs/Zend/Form/Decorator/ViewHelper.php @@ -0,0 +1,251 @@ +_helper = (string) $helper; + return $this; + } + + /** + * Retrieve view helper for rendering element + * + * @return string + */ + public function getHelper() + { + if (null === $this->_helper) { + $options = $this->getOptions(); + if (isset($options['helper'])) { + $this->setHelper($options['helper']); + $this->removeOption('helper'); + } else { + $element = $this->getElement(); + if (null !== $element) { + if (null !== ($helper = $element->getAttrib('helper'))) { + $this->setHelper($helper); + } else { + $type = $element->getType(); + if ($pos = strrpos($type, '_')) { + $type = substr($type, $pos + 1); + } + $this->setHelper('form' . ucfirst($type)); + } + } + } + } + + return $this->_helper; + } + + /** + * Get name + * + * If element is a Zend_Form_Element, will attempt to namespace it if the + * element belongs to an array. + * + * @return string + */ + public function getName() + { + if (null === ($element = $this->getElement())) { + return ''; + } + + $name = $element->getName(); + + if (!$element instanceof Zend_Form_Element) { + return $name; + } + + if (null !== ($belongsTo = $element->getBelongsTo())) { + $name = $belongsTo . '[' + . $name + . ']'; + } + + if ($element->isArray()) { + $name .= '[]'; + } + + return $name; + } + + /** + * Retrieve element attributes + * + * Set id to element name and/or array item. + * + * @return array + */ + public function getElementAttribs() + { + if (null === ($element = $this->getElement())) { + return null; + } + + $attribs = $element->getAttribs(); + if (isset($attribs['helper'])) { + unset($attribs['helper']); + } + + if (method_exists($element, 'getSeparator')) { + if (null !== ($listsep = $element->getSeparator())) { + $attribs['listsep'] = $listsep; + } + } + + if (isset($attribs['id'])) { + return $attribs; + } + + $id = $element->getName(); + + if ($element instanceof Zend_Form_Element) { + if (null !== ($belongsTo = $element->getBelongsTo())) { + $belongsTo = preg_replace('/\[([^\]]+)\]/', '-$1', $belongsTo); + $id = $belongsTo . '-' . $id; + } + } + + $element->setAttrib('id', $id); + $attribs['id'] = $id; + + return $attribs; + } + + /** + * Get value + * + * If element type is one of the button types, returns the label. + * + * @param Zend_Form_Element $element + * @return string|null + */ + public function getValue($element) + { + if (!$element instanceof Zend_Form_Element) { + return null; + } + + foreach ($this->_buttonTypes as $type) { + if ($element instanceof $type) { + if (stristr($type, 'button')) { + $element->content = $element->getLabel(); + return null; + } + return $element->getLabel(); + } + } + + return $element->getValue(); + } + + /** + * Render an element using a view helper + * + * 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 + */ + public function render($content) + { + $element = $this->getElement(); + + $view = $element->getView(); + if (null === $view) { + require_once 'Zend/Form/Decorator/Exception.php'; + throw new Zend_Form_Decorator_Exception('ViewHelper decorator cannot render without a registered view object'); + } + + if (method_exists($element, 'getMultiOptions')) { + $element->getMultiOptions(); + } + + $helper = $this->getHelper(); + $separator = $this->getSeparator(); + $value = $this->getValue($element); + $attribs = $this->getElementAttribs(); + $name = $element->getFullyQualifiedName(); + $id = $element->getId(); + $attribs['id'] = $id; + + $elementContent = $view->$helper($name, $value, $attribs, $element->options); + switch ($this->getPlacement()) { + case self::APPEND: + return $content . $separator . $elementContent; + case self::PREPEND: + return $elementContent . $separator . $content; + default: + return $elementContent; + } + } +} diff --git a/libs/Zend/Form/Decorator/ViewScript.php b/libs/Zend/Form/Decorator/ViewScript.php new file mode 100644 index 0000000..dcc8436 --- /dev/null +++ b/libs/Zend/Form/Decorator/ViewScript.php @@ -0,0 +1,144 @@ + + * // in view script: + * echo $this->element->getLabel(); + * + * + * Any options other than separator, placement, and viewScript are passed to + * the partial as local variables. + * + * @category Zend + * @package Zend_Form + * @subpackage Decorator + * @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: ViewScript.php 8651 2008-03-07 20:24:34Z matthew $ + */ +class Zend_Form_Decorator_ViewScript extends Zend_Form_Decorator_Abstract +{ + /** + * Default placement: append + * @var string + */ + protected $_placement = 'APPEND'; + + /** + * View script to render + * @var string + */ + protected $_viewScript; + + /** + * Set view script + * + * @param string $script + * @return Zend_Form_Decorator_ViewScript + */ + public function setViewScript($script) + { + $this->_viewScript = (string) $script; + return $this; + } + + /** + * Get view script + * + * @return string|null + */ + public function getViewScript() + { + if (null === $this->_viewScript) { + if (null !== ($element = $this->getElement())) { + if (null !== ($viewScript = $element->getAttrib('viewScript'))) { + $this->setViewScript($viewScript); + return $viewScript; + } + } + + if (null !== ($viewScript = $this->getOption('viewScript'))) { + $this->setViewScript($viewScript) + ->removeOption('viewScript'); + } + } + + return $this->_viewScript; + } + + /** + * Render a view script + * + * @param string $content + * @return string + */ + public function render($content) + { + $element = $this->getElement(); + $view = $element->getView(); + if (null === $view) { + return $content; + } + + $viewScript = $this->getViewScript(); + if (empty($viewScript)) { + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception('No view script registered with ViewScript decorator'); + } + + $separator = $this->getSeparator(); + $placement = $this->getPlacement(); + + $vars = $this->getOptions(); + $vars['element'] = $element; + $vars['content'] = $content; + $vars['decorator'] = $this; + + $renderedContent = $view->partial($viewScript, $vars); + + // Get placement again to see if it has changed + $placement = $this->getPlacement(); + + switch ($placement) { + case self::PREPEND: + return $renderedContent . $separator . $content; + case self::APPEND: + return $content . $separator . $renderedContent; + default: + return $renderedContent; + } + } +} diff --git a/libs/Zend/Form/DisplayGroup.php b/libs/Zend/Form/DisplayGroup.php new file mode 100644 index 0000000..4f2d2a0 --- /dev/null +++ b/libs/Zend/Form/DisplayGroup.php @@ -0,0 +1,1127 @@ +setName($name); + + $this->setPluginLoader($loader); + + if (is_array($options)) { + $this->setOptions($options); + } elseif ($options instanceof Zend_Config) { + $this->setConfig($options); + } + + // Extensions... + $this->init(); + + $this->loadDefaultDecorators(); + } + + /** + * Initialize object; used by extending classes + * + * @return void + */ + public function init() + { + } + + /** + * Set options + * + * @param array $options + * @return Zend_Form_DisplayGroup + */ + public function setOptions(array $options) + { + $forbidden = array( + 'Options', 'Config', 'PluginLoader', 'View', + 'Translator', 'Attrib' + ); + foreach ($options as $key => $value) { + $normalized = ucfirst($key); + + if (in_array($normalized, $forbidden)) { + continue; + } + + $method = 'set' . $normalized; + if (method_exists($this, $method)) { + $this->$method($value); + } else { + $this->setAttrib($key, $value); + } + } + return $this; + } + + /** + * Set options from config object + * + * @param Zend_Config $config + * @return Zend_Form_DisplayGroup + */ + public function setConfig(Zend_Config $config) + { + return $this->setOptions($config->toArray()); + } + + /** + * Set group attribute + * + * @param string $key + * @param mixed $value + * @return Zend_Form_DisplayGroup + */ + public function setAttrib($key, $value) + { + $key = (string) $key; + $this->_attribs[$key] = $value; + return $this; + } + + /** + * Add multiple form attributes at once + * + * @param array $attribs + * @return Zend_Form_DisplayGroup + */ + public function addAttribs(array $attribs) + { + foreach ($attribs as $key => $value) { + $this->setAttrib($key, $value); + } + return $this; + } + + /** + * Set multiple form attributes at once + * + * Overwrites any previously set attributes. + * + * @param array $attribs + * @return Zend_Form_DisplayGroup + */ + public function setAttribs(array $attribs) + { + $this->clearAttribs(); + return $this->addAttribs($attribs); + } + + /** + * Retrieve a single form attribute + * + * @param string $key + * @return mixed + */ + public function getAttrib($key) + { + $key = (string) $key; + if (!isset($this->_attribs[$key])) { + return null; + } + + return $this->_attribs[$key]; + } + + /** + * Retrieve all form attributes/metadata + * + * @return array + */ + public function getAttribs() + { + return $this->_attribs; + } + + /** + * Remove attribute + * + * @param string $key + * @return bool + */ + public function removeAttrib($key) + { + if (array_key_exists($key, $this->_attribs)) { + unset($this->_attribs[$key]); + return true; + } + + return false; + } + + /** + * Clear all form attributes + * + * @return Zend_Form + */ + public function clearAttribs() + { + $this->_attribs = array(); + return $this; + } + + /** + * Filter a name to only allow valid variable characters + * + * @param string $value + * @return string + */ + public function filterName($value) + { + return preg_replace('/[^a-zA-Z0-9_\x7f-\xff]/', '', (string) $value); + } + + /** + * Set group name + * + * @param string $name + * @return Zend_Form_DisplayGroup + */ + public function setName($name) + { + $name = $this->filtername($name); + if (('0' !== $name) && empty($name)) { + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception('Invalid name provided; must contain only valid variable characters and be non-empty'); + } + + $this->_name = $name; + return $this; + } + + /** + * Retrieve group name + * + * @return string + */ + public function getName() + { + return $this->_name; + } + + /** + * Get fully qualified name + * + * Places name as subitem of array and/or appends brackets. + * + * @return string + */ + public function getFullyQualifiedName() + { + return $this->getName(); + } + + /** + * Get element id + * + * @return string + */ + public function getId() + { + if (isset($this->id)) { + return $this->id; + } + + $id = $this->getFullyQualifiedName(); + + // Bail early if no array notation detected + if (!strstr($id, '[')) { + return $id; + } + + // Strip array notation + if ('[]' == substr($id, -2)) { + $id = substr($id, 0, strlen($id) - 2); + } + $id = str_replace('][', '-', $id); + $id = str_replace(array(']', '['), '-', $id); + $id = trim($id, '-'); + + return $id; + } + + /** + * Set group legend + * + * @param string $legend + * @return Zend_Form_DisplayGroup + */ + public function setLegend($legend) + { + return $this->setAttrib('legend', (string) $legend); + } + + /** + * Retrieve group legend + * + * @return string + */ + public function getLegend() + { + return $this->getAttrib('legend'); + } + + /** + * Set description + * + * @param string $value + * @return Zend_Form_DisplayGroup + */ + public function setDescription($value) + { + $this->_description = (string) $value; + return $this; + } + + /** + * Get description + * + * @return string + */ + public function getDescription() + { + return $this->_description; + } + + /** + * Set group order + * + * @param int $order + * @return Zend_Form_Element + */ + public function setOrder($order) + { + $this->_order = (int) $order; + return $this; + } + + /** + * Retrieve group order + * + * @return int + */ + public function getOrder() + { + return $this->_order; + } + + // Elements + + /** + * Add element to stack + * + * @param Zend_Form_Element $element + * @return Zend_Form_DisplayGroup + */ + public function addElement(Zend_Form_Element $element) + { + $this->_elements[$element->getName()] = $element; + $this->_groupUpdated = true; + return $this; + } + + /** + * Add multiple elements at once + * + * @param array $elements + * @return Zend_Form_DisplayGroup + * @throws Zend_Form_Exception if any element is not a Zend_Form_Element + */ + public function addElements(array $elements) + { + foreach ($elements as $element) { + if (!$element instanceof Zend_Form_Element) { + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception('elements passed via array to addElements() must be Zend_Form_Elements only'); + } + $this->addElement($element); + } + return $this; + } + + /** + * Set multiple elements at once (overwrites) + * + * @param array $elements + * @return Zend_Form_DisplayGroup + */ + public function setElements(array $elements) + { + $this->clearElements(); + return $this->addElements($elements); + } + + /** + * Retrieve element + * + * @param string $name + * @return Zend_Form_Element|null + */ + public function getElement($name) + { + $name = (string) $name; + if (isset($this->_elements[$name])) { + return $this->_elements[$name]; + } + + return null; + } + + /** + * Retrieve elements + * @return array + */ + public function getElements() + { + return $this->_elements; + } + + /** + * Remove a single element + * + * @param string $name + * @return boolean + */ + public function removeElement($name) + { + $name = (string) $name; + if (array_key_exists($name, $this->_elements)) { + unset($this->_elements[$name]); + $this->_groupUpdated = true; + return true; + } + + return false; + } + + /** + * Remove all elements + * + * @return Zend_Form_DisplayGroup + */ + public function clearElements() + { + $this->_elements = array(); + $this->_groupUpdated = true; + return $this; + } + + // Plugin loader (for decorators) + + /** + * Set plugin loader + * + * @param Zend_Loader_PluginLoader $loader + * @return Zend_Form_DisplayGroup + */ + public function setPluginLoader(Zend_Loader_PluginLoader $loader) + { + $this->_loader = $loader; + return $this; + } + + /** + * Retrieve plugin loader + * + * @return Zend_Loader_PluginLoader + */ + public function getPluginLoader() + { + return $this->_loader; + } + + /** + * Add a prefix path for the plugin loader + * + * @param string $prefix + * @param string $path + * @return Zend_Form_DisplayGroup + */ + public function addPrefixPath($prefix, $path) + { + $this->getPluginLoader()->addPrefixPath($prefix, $path); + return $this; + } + + /** + * Add several prefix paths at once + * + * @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; + if (isset($paths['prefix']) && isset($paths['path'])) { + $this->addPrefixPath($paths['prefix'], $paths['path']); + } + } elseif (!is_numeric($prefix)) { + if (is_string($paths)) { + $this->addPrefixPath($prefix, $paths); + } elseif (is_array($paths)) { + foreach ($paths as $path) { + $this->addPrefixPath($prefix, $path); + } + } + } + } + return $this; + } + + // Decorators + + /** + * Set flag to disable loading default decorators + * + * @param bool $flag + * @return Zend_Form_Element + */ + public function setDisableLoadDefaultDecorators($flag) + { + $this->_disableLoadDefaultDecorators = (bool) $flag; + return $this; + } + + /** + * Should we load the default decorators? + * + * @return bool + */ + public function loadDefaultDecoratorsIsDisabled() + { + return $this->_disableLoadDefaultDecorators; + } + + /** + * Load default decorators + * + * @return void + */ + public function loadDefaultDecorators() + { + if ($this->loadDefaultDecoratorsIsDisabled()) { + return; + } + + $decorators = $this->getDecorators(); + if (empty($decorators)) { + $this->addDecorator('FormElements') + ->addDecorator('HtmlTag', array('tag' => 'dl')) + ->addDecorator('Fieldset') + ->addDecorator('DtDdWrapper'); + } + } + + /** + * Instantiate a decorator based on class name or class name fragment + * + * @param string $name + * @param null|array $options + * @return Zend_Form_Decorator_Interface + */ + protected function _getDecorator($name, $options = null) + { + $class = $this->getPluginLoader()->load($name); + if (null === $options) { + $decorator = new $class; + } else { + $r = new ReflectionClass($class); + $decorator = $r->newInstance($options); + } + + return $decorator; + } + + /** + * Add a decorator for rendering the group + * + * @param string|Zend_Form_Decorator_Interface $decorator + * @param array|Zend_Config $options Options with which to initialize decorator + * @return Zend_Form_DisplayGroup + */ + public function addDecorator($decorator, $options = null) + { + if ($decorator instanceof Zend_Form_Decorator_Interface) { + $name = get_class($decorator); + } elseif (is_string($decorator)) { + $name = $decorator; + $decorator = array( + 'decorator' => $name, + 'options' => $options, + ); + } elseif (is_array($decorator)) { + foreach ($decorator as $name => $spec) { + break; + } + if (is_numeric($name)) { + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception('Invalid alias provided to addDecorator; must be alphanumeric string'); + } + if (is_string($spec)) { + $decorator = array( + 'decorator' => $spec, + 'options' => $options, + ); + } elseif ($spec instanceof Zend_Form_Decorator_Interface) { + $decorator = $spec; + } + } else { + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception('Invalid decorator provided to addDecorator; must be string or Zend_Form_Decorator_Interface'); + } + + $this->_decorators[$name] = $decorator; + + return $this; + } + + /** + * Add many decorators at once + * + * @param array $decorators + * @return Zend_Form_DisplayGroup + */ + public function addDecorators(array $decorators) + { + foreach ($decorators as $decoratorInfo) { + if (is_string($decoratorInfo)) { + $this->addDecorator($decoratorInfo); + } elseif ($decoratorInfo instanceof Zend_Form_Decorator_Interface) { + $this->addDecorator($decoratorInfo); + } elseif (is_array($decoratorInfo)) { + $argc = count($decoratorInfo); + $options = array(); + if (isset($decoratorInfo['decorator'])) { + $decorator = $decoratorInfo['decorator']; + if (isset($decoratorInfo['options'])) { + $options = $decoratorInfo['options']; + } + $this->addDecorator($decorator, $options); + } else { + switch (true) { + case (0 == $argc): + break; + case (1 <= $argc): + $decorator = array_shift($decoratorInfo); + case (2 <= $argc): + $options = array_shift($decoratorInfo); + default: + $this->addDecorator($decorator, $options); + break; + } + } + } else { + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception('Invalid decorator passed to addDecorators()'); + } + } + + return $this; + } + + /** + * Overwrite all decorators + * + * @param array $decorators + * @return Zend_Form_DisplayGroup + */ + public function setDecorators(array $decorators) + { + $this->clearDecorators(); + return $this->addDecorators($decorators); + } + + /** + * Retrieve a registered decorator + * + * @param string $name + * @return false|Zend_Form_Decorator_Abstract + */ + public function getDecorator($name) + { + if (!isset($this->_decorators[$name])) { + $len = strlen($name); + foreach ($this->_decorators as $localName => $decorator) { + if ($len > strlen($localName)) { + continue; + } + + if (0 === substr_compare($localName, $name, -$len, $len, true)) { + if (is_array($decorator)) { + return $this->_loadDecorator($decorator, $localName); + } + return $decorator; + } + } + return false; + } + + if (is_array($this->_decorators[$name])) { + return $this->_loadDecorator($this->_decorators[$name], $name); + } + + return $this->_decorators[$name]; + } + + /** + * Retrieve all decorators + * + * @return array + */ + public function getDecorators() + { + foreach ($this->_decorators as $key => $value) { + if (is_array($value)) { + $this->_loadDecorator($value, $key); + } + } + return $this->_decorators; + } + + /** + * Remove a single decorator + * + * @param string $name + * @return bool + */ + public function removeDecorator($name) + { + $decorator = $this->getDecorator($name); + if ($decorator) { + if (array_key_exists($name, $this->_decorators)) { + unset($this->_decorators[$name]); + } else { + $class = get_class($decorator); + unset($this->_decorators[$class]); + } + return true; + } + + return false; + } + + /** + * Clear all decorators + * + * @return Zend_Form_DisplayGroup + */ + public function clearDecorators() + { + $this->_decorators = array(); + return $this; + } + + /** + * Set view + * + * @param Zend_View_Interface $view + * @return Zend_Form_DisplayGroup + */ + public function setView(Zend_View_Interface $view = null) + { + $this->_view = $view; + return $this; + } + + /** + * Retrieve view + * + * @return Zend_View_Interface + */ + public function getView() + { + if (null === $this->_view) { + require_once 'Zend/Controller/Action/HelperBroker.php'; + $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer'); + $this->setView($viewRenderer->view); + } + + return $this->_view; + } + + /** + * Render display group + * + * @return string + */ + public function render(Zend_View_Interface $view = null) + { + if (null !== $view) { + $this->setView($view); + } + $content = ''; + foreach ($this->getDecorators() as $decorator) { + $decorator->setElement($this); + $content = $decorator->render($content); + } + return $content; + } + + /** + * String representation of group + * + * @return string + */ + public function __toString() + { + try { + $return = $this->render(); + return $return; + } catch (Exception $e) { + trigger_error($e->getMessage(), E_USER_WARNING); + return ''; + } + } + + /** + * Set translator object + * + * @param Zend_Translate|Zend_Translate_Adapter|null $translator + * @return Zend_Form_DisplayGroup + */ + public function setTranslator($translator = null) + { + if ((null === $translator) || ($translator instanceof Zend_Translate_Adapter)) { + $this->_translator = $translator; + } elseif ($translator instanceof Zend_Translate) { + $this->_translator = $translator->getAdapter(); + } else { + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception('Invalid translator specified'); + } + return $this; + } + + /** + * Retrieve translator object + * + * @return Zend_Translate_Adapter|null + */ + public function getTranslator() + { + if ($this->translatorIsDisabled()) { + return null; + } + + if (null === $this->_translator) { + require_once 'Zend/Form.php'; + return Zend_Form::getDefaultTranslator(); + } + + return $this->_translator; + } + + /** + * Indicate whether or not translation should be disabled + * + * @param bool $flag + * @return Zend_Form_DisplayGroup + */ + public function setDisableTranslator($flag) + { + $this->_translatorDisabled = (bool) $flag; + return $this; + } + + /** + * Is translation disabled? + * + * @return bool + */ + public function translatorIsDisabled() + { + return $this->_translatorDisabled; + } + + /** + * Overloading: allow rendering specific decorators + * + * Call renderDecoratorName() to render a specific decorator. + * + * @param string $method + * @param array $args + * @return string + * @throws Zend_Form_Exception for invalid decorator or invalid method call + */ + public function __call($method, $args) + { + if ('render' == substr($method, 0, 6)) { + $decoratorName = substr($method, 6); + if (false !== ($decorator = $this->getDecorator($decoratorName))) { + $decorator->setElement($this); + $seed = ''; + if (0 < count($args)) { + $seed = array_shift($args); + } + return $decorator->render($seed); + } + + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception(sprintf('Decorator by name %s does not exist', $decoratorName)); + } + + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception(sprintf('Method %s does not exist', $method)); + } + + // Interfaces: Iterator, Countable + + /** + * Current element + * + * @return Zend_Form_Element + */ + public function current() + { + $this->_sort(); + current($this->_elementOrder); + $key = key($this->_elementOrder); + return $this->getElement($key); + } + + /** + * Current element + * + * @return string + */ + public function key() + { + $this->_sort(); + return key($this->_elementOrder); + } + + /** + * Move pointer to next element + * + * @return void + */ + public function next() + { + $this->_sort(); + next($this->_elementOrder); + } + + /** + * Move pointer to beginning of element loop + * + * @return void + */ + public function rewind() + { + $this->_sort(); + reset($this->_elementOrder); + } + + /** + * Determine if current element/subform/display group is valid + * + * @return bool + */ + public function valid() + { + $this->_sort(); + return (current($this->_elementOrder) !== false); + } + + /** + * Count of elements/subforms that are iterable + * + * @return int + */ + public function count() + { + return count($this->_elements); + } + + /** + * Sort items according to their order + * + * @return void + */ + protected function _sort() + { + if ($this->_groupUpdated || !is_array($this->_elementOrder)) { + $elementOrder = array(); + foreach ($this->getElements() as $key => $element) { + $elementOrder[$key] = $element->getOrder(); + } + + $items = array(); + $index = 0; + foreach ($elementOrder as $key => $order) { + if (null === $order) { + while (array_search($index, $elementOrder, true)) { + ++$index; + } + $items[$index] = $key; + ++$index; + } else { + $items[$order] = $key; + } + } + + $items = array_flip($items); + asort($items); + $this->_elementOrder = $items; + $this->_groupUpdated = false; + } + } + + /** + * Lazy-load a decorator + * + * @param array $decorator Decorator type and options + * @param mixed $name Decorator name or alias + * @return Zend_Form_Decorator_Interface + */ + protected function _loadDecorator(array $decorator, $name) + { + $sameName = false; + if ($name == $decorator['decorator']) { + $sameName = true; + } + + $instance = $this->_getDecorator($decorator['decorator'], $decorator['options']); + if ($sameName) { + $newName = get_class($instance); + $decoratorNames = array_keys($this->_decorators); + $order = array_flip($decoratorNames); + $order[$newName] = $order[$name]; + $decoratorsExchange = array(); + unset($order[$name]); + asort($order); + foreach ($order as $key => $index) { + if ($key == $newName) { + $decoratorsExchange[$key] = $instance; + continue; + } + $decoratorsExchange[$key] = $this->_decorators[$key]; + } + $this->_decorators = $decoratorsExchange; + } else { + $this->_decorators[$name] = $instance; + } + + return $instance; + } +} diff --git a/libs/Zend/Form/Element.php b/libs/Zend/Form/Element.php new file mode 100644 index 0000000..2038172 --- /dev/null +++ b/libs/Zend/Form/Element.php @@ -0,0 +1,2122 @@ +setName($spec); + } elseif (is_array($spec)) { + $this->setOptions($spec); + } elseif ($spec instanceof Zend_Config) { + $this->setConfig($spec); + } + + if (is_string($spec) && is_array($options)) { + $this->setOptions($options); + } elseif (is_string($spec) && ($options instanceof Zend_Config)) { + $this->setConfig($options); + } + + if (null === $this->getName()) { + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception('Zend_Form_Element requires each element to have a name'); + } + + /** + * Extensions + */ + $this->init(); + + /** + * Register ViewHelper decorator by default + */ + $this->loadDefaultDecorators(); + } + + /** + * Initialize object; used by extending classes + * + * @return void + */ + public function init() + { + } + + /** + * Set flag to disable loading default decorators + * + * @param bool $flag + * @return Zend_Form_Element + */ + public function setDisableLoadDefaultDecorators($flag) + { + $this->_disableLoadDefaultDecorators = (bool) $flag; + return $this; + } + + /** + * Should we load the default decorators? + * + * @return bool + */ + public function loadDefaultDecoratorsIsDisabled() + { + return $this->_disableLoadDefaultDecorators; + } + + /** + * Load default decorators + * + * @return void + */ + public function loadDefaultDecorators() + { + if ($this->loadDefaultDecoratorsIsDisabled()) { + return; + } + + $decorators = $this->getDecorators(); + if (empty($decorators)) { + $this->addDecorator('ViewHelper') + ->addDecorator('Errors') + ->addDecorator('Description', array('tag' => 'p', 'class' => 'description')) + ->addDecorator('HtmlTag', array('tag' => 'dd')) + ->addDecorator('Label', array('tag' => 'dt')); + } + } + + /** + * Set object state from options array + * + * @param array $options + * @return Zend_Form_Element + */ + public function setOptions(array $options) + { + if (isset($options['prefixPath'])) { + $this->addPrefixPaths($options['prefixPath']); + unset($options['prefixPath']); + } + + if (isset($options['disableTranslator'])) { + $this->setDisableTranslator($options['disableTranslator']); + unset($options['disableTranslator']); + } + + unset($options['options']); + unset($options['config']); + + foreach ($options as $key => $value) { + $method = 'set' . ucfirst($key); + + if (in_array($method, array('setTranslator', 'setPluginLoader', 'setView'))) { + if (!is_object($value)) { + continue; + } + } + + if (method_exists($this, $method)) { + // Setter exists; use it + $this->$method($value); + } else { + // Assume it's metadata + $this->setAttrib($key, $value); + } + } + return $this; + } + + /** + * Set object state from Zend_Config object + * + * @param Zend_Config $config + * @return Zend_Form_Element + */ + public function setConfig(Zend_Config $config) + { + return $this->setOptions($config->toArray()); + } + + + // Localization: + + /** + * Set translator object for localization + * + * @param Zend_Translate|null $translator + * @return Zend_Form_Element + */ + public function setTranslator($translator = null) + { + if (null === $translator) { + $this->_translator = null; + } elseif ($translator instanceof Zend_Translate_Adapter) { + $this->_translator = $translator; + } elseif ($translator instanceof Zend_Translate) { + $this->_translator = $translator->getAdapter(); + } else { + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception('Invalid translator specified'); + } + return $this; + } + + /** + * Retrieve localization translator object + * + * @return Zend_Translate_Adapter|null + */ + public function getTranslator() + { + if ($this->translatorIsDisabled()) { + return null; + } + + if (null === $this->_translator) { + require_once 'Zend/Form.php'; + return Zend_Form::getDefaultTranslator(); + } + return $this->_translator; + } + + /** + * Indicate whether or not translation should be disabled + * + * @param bool $flag + * @return Zend_Form_Element + */ + public function setDisableTranslator($flag) + { + $this->_translatorDisabled = (bool) $flag; + return $this; + } + + /** + * Is translation disabled? + * + * @return bool + */ + public function translatorIsDisabled() + { + return $this->_translatorDisabled; + } + + // Metadata + + /** + * Filter a name to only allow valid variable characters + * + * @param string $value + * @param bool $allowBrackets + * @return string + */ + public function filterName($value, $allowBrackets = false) + { + $charset = '^a-zA-Z0-9_\x7f-\xff'; + if ($allowBrackets) { + $charset .= '\[\]'; + } + return preg_replace('/[' . $charset . ']/', '', (string) $value); + } + + /** + * Set element name + * + * @param string $name + * @return Zend_Form_Element + */ + public function setName($name) + { + $name = $this->filterName($name); + if ('' === $name) { + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception('Invalid name provided; must contain only valid variable characters and be non-empty'); + } + + $this->_name = $name; + return $this; + } + + /** + * Return element name + * + * @return string + */ + public function getName() + { + return $this->_name; + } + + /** + * Get fully qualified name + * + * Places name as subitem of array and/or appends brackets. + * + * @return string + */ + public function getFullyQualifiedName() + { + $name = $this->getName(); + + if (null !== ($belongsTo = $this->getBelongsTo())) { + $name = $belongsTo . '[' . $name . ']'; + } + + if ($this->isArray()) { + $name .= '[]'; + } + + return $name; + } + + /** + * Get element id + * + * @return string + */ + public function getId() + { + if (isset($this->id)) { + return $this->id; + } + + $id = $this->getFullyQualifiedName(); + + // Bail early if no array notation detected + if (!strstr($id, '[')) { + return $id; + } + + // Strip array notation + if ('[]' == substr($id, -2)) { + $id = substr($id, 0, strlen($id) - 2); + } + $id = str_replace('][', '-', $id); + $id = str_replace(array(']', '['), '-', $id); + $id = trim($id, '-'); + + return $id; + } + + /** + * Set element value + * + * @param mixed $value + * @return Zend_Form_Element + */ + public function setValue($value) + { + $this->_value = $value; + return $this; + } + + /** + * Filter a value + * + * @param string $value + * @param string $key + * @return void + */ + protected function _filterValue(&$value, &$key) + { + foreach ($this->getFilters() as $filter) { + $value = $filter->filter($value); + } + } + + /** + * Retrieve filtered element value + * + * @return mixed + */ + public function getValue() + { + $valueFiltered = $this->_value; + + if ($this->isArray() && is_array($valueFiltered)) { + array_walk_recursive($valueFiltered, array($this, '_filterValue')); + } else { + $this->_filterValue($valueFiltered, $valueFiltered); + } + + return $valueFiltered; + } + + /** + * Retrieve unfiltered element value + * + * @return mixed + */ + public function getUnfilteredValue() + { + return $this->_value; + } + + /** + * Set element label + * + * @param string $label + * @return Zend_Form_Element + */ + public function setLabel($label) + { + $this->_label = (string) $label; + return $this; + } + + /** + * Retrieve element label + * + * @return string + */ + public function getLabel() + { + return $this->_label; + } + + /** + * Set element order + * + * @param int $order + * @return Zend_Form_Element + */ + public function setOrder($order) + { + $this->_order = (int) $order; + return $this; + } + + /** + * Retrieve element order + * + * @return int + */ + public function getOrder() + { + return $this->_order; + } + + /** + * Set required flag + * + * @param bool $flag Default value is true + * @return Zend_Form_Element + */ + public function setRequired($flag = true) + { + $this->_required = (bool) $flag; + return $this; + } + + /** + * Is the element required? + * + * @return bool + */ + public function isRequired() + { + return $this->_required; + } + + /** + * Set flag indicating whether a NotEmpty validator should be inserted when element is required + * + * @param bool $flag + * @return Zend_Form_Element + */ + public function setAutoInsertNotEmptyValidator($flag) + { + $this->_autoInsertNotEmptyValidator = (bool) $flag; + return $this; + } + + /** + * Get flag indicating whether a NotEmpty validator should be inserted when element is required + * + * @return bool + */ + public function autoInsertNotEmptyValidator() + { + return $this->_autoInsertNotEmptyValidator; + } + + /** + * Set element description + * + * @param string $description + * @return Zend_Form_Element + */ + public function setDescription($description) + { + $this->_description = (string) $description; + return $this; + } + + /** + * Retrieve element description + * + * @return string + */ + public function getDescription() + { + return $this->_description; + } + + /** + * Set 'allow empty' flag + * + * When the allow empty flag is enabled and the required flag is false, the + * element will validate with empty values. + * + * @param bool $flag + * @return Zend_Form_Element + */ + public function setAllowEmpty($flag) + { + $this->_allowEmpty = (bool) $flag; + return $this; + } + + /** + * Get 'allow empty' flag + * + * @return bool + */ + public function getAllowEmpty() + { + return $this->_allowEmpty; + } + + /** + * Set ignore flag (used when retrieving values at form level) + * + * @param bool $flag + * @return Zend_Form_Element + */ + public function setIgnore($flag) + { + $this->_ignore = (bool) $flag; + return $this; + } + + /** + * Get ignore flag (used when retrieving values at form level) + * + * @return bool + */ + public function getIgnore() + { + return $this->_ignore; + } + + /** + * Set flag indicating if element represents an array + * + * @param bool $flag + * @return Zend_Form_Element + */ + public function setIsArray($flag) + { + $this->_isArray = (bool) $flag; + return $this; + } + + /** + * Is the element representing an array? + * + * @return bool + */ + public function isArray() + { + return $this->_isArray; + } + + /** + * Set array to which element belongs + * + * @param string $array + * @return Zend_Form_Element + */ + public function setBelongsTo($array) + { + $array = $this->filterName($array, true); + if (!empty($array)) { + $this->_belongsTo = $array; + } + + return $this; + } + + /** + * Return array name to which element belongs + * + * @return string + */ + public function getBelongsTo() + { + return $this->_belongsTo; + } + + /** + * Return element type + * + * @return string + */ + public function getType() + { + if (null === $this->_type) { + $this->_type = get_class($this); + } + + return $this->_type; + } + + /** + * Set element attribute + * + * @param string $name + * @param mixed $value + * @return Zend_Form_Element + * @throws Zend_Form_Exception for invalid $name values + */ + public function setAttrib($name, $value) + { + $name = (string) $name; + if ('_' == $name[0]) { + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception(sprintf('Invalid attribute "%s"; must not contain a leading underscore', $name)); + } + + if (null === $value) { + unset($this->$name); + } else { + $this->$name = $value; + } + + return $this; + } + + /** + * Set multiple attributes at once + * + * @param array $attribs + * @return Zend_Form_Element + */ + public function setAttribs(array $attribs) + { + foreach ($attribs as $key => $value) { + $this->setAttrib($key, $value); + } + + return $this; + } + + /** + * Retrieve element attribute + * + * @param string $name + * @return string + */ + public function getAttrib($name) + { + $name = (string) $name; + if (isset($this->$name)) { + return $this->$name; + } + + return null; + } + + /** + * Return all attributes + * + * @return array + */ + public function getAttribs() + { + $attribs = get_object_vars($this); + foreach ($attribs as $key => $value) { + if ('_' == substr($key, 0, 1)) { + unset($attribs[$key]); + } + } + + return $attribs; + } + + /** + * Overloading: retrieve object property + * + * Prevents access to properties beginning with '_'. + * + * @param string $key + * @return mixed + */ + public function __get($key) + { + if ('_' == $key[0]) { + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception(sprintf('Cannot retrieve value for protected/private property "%s"', $key)); + } + + if (!isset($this->$key)) { + return null; + } + + return $this->$key; + } + + /** + * Overloading: set object property + * + * @param string $key + * @param mixed $value + * @return voide + */ + public function __set($key, $value) + { + $this->setAttrib($key, $value); + } + + /** + * Overloading: allow rendering specific decorators + * + * Call renderDecoratorName() to render a specific decorator. + * + * @param string $method + * @param array $args + * @return string + * @throws Zend_Form_Exception for invalid decorator or invalid method call + */ + public function __call($method, $args) + { + if ('render' == substr($method, 0, 6)) { + $decoratorName = substr($method, 6); + if (false !== ($decorator = $this->getDecorator($decoratorName))) { + $decorator->setElement($this); + $seed = ''; + if (0 < count($args)) { + $seed = array_shift($args); + } + return $decorator->render($seed); + } + + require_once 'Zend/Form/Element/Exception.php'; + throw new Zend_Form_Element_Exception(sprintf('Decorator by name %s does not exist', $decoratorName)); + } + + require_once 'Zend/Form/Element/Exception.php'; + throw new Zend_Form_Element_Exception(sprintf('Method %s does not exist', $method)); + } + + // Loaders + + /** + * Set plugin loader to use for validator or filter chain + * + * @param Zend_Loader_PluginLoader_Interface $loader + * @param string $type 'decorator', 'filter', or 'validate' + * @return Zend_Form_Element + * @throws Zend_Form_Exception on invalid type + */ + public function setPluginLoader(Zend_Loader_PluginLoader_Interface $loader, $type) + { + $type = strtoupper($type); + switch ($type) { + case self::DECORATOR: + case self::FILTER: + case self::VALIDATE: + $this->_loaders[$type] = $loader; + return $this; + default: + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception(sprintf('Invalid type "%s" provided to setPluginLoader()', $type)); + } + } + + /** + * Retrieve plugin loader for validator or filter chain + * + * Instantiates with default rules if none available for that type. Use + * 'decorator', 'filter', or 'validate' for $type. + * + * @param string $type + * @return Zend_Loader_PluginLoader + * @throws Zend_Loader_Exception on invalid type. + */ + public function getPluginLoader($type) + { + $type = strtoupper($type); + switch ($type) { + case self::FILTER: + case self::VALIDATE: + $prefixSegment = ucfirst(strtolower($type)); + $pathSegment = $prefixSegment; + case self::DECORATOR: + if (!isset($prefixSegment)) { + $prefixSegment = 'Form_Decorator'; + $pathSegment = 'Form/Decorator'; + } + if (!isset($this->_loaders[$type])) { + require_once 'Zend/Loader/PluginLoader.php'; + $this->_loaders[$type] = new Zend_Loader_PluginLoader( + array('Zend_' . $prefixSegment . '_' => 'Zend/' . $pathSegment . '/') + ); + } + return $this->_loaders[$type]; + default: + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception(sprintf('Invalid type "%s" provided to getPluginLoader()', $type)); + } + } + + /** + * Add prefix path for plugin loader + * + * If no $type specified, assumes it is a base path for both filters and + * validators, and sets each according to the following rules: + * - decorators: $prefix = $prefix . '_Decorator' + * - filters: $prefix = $prefix . '_Filter' + * - validators: $prefix = $prefix . '_Validate' + * + * Otherwise, the path prefix is set on the appropriate plugin loader. + * + * @param string $path + * @return Zend_Form_Element + * @throws Zend_Form_Exception for invalid type + */ + public function addPrefixPath($prefix, $path, $type = null) + { + $type = strtoupper($type); + switch ($type) { + case self::DECORATOR: + case self::FILTER: + case self::VALIDATE: + $loader = $this->getPluginLoader($type); + $loader->addPrefixPath($prefix, $path); + return $this; + case null: + $prefix = rtrim($prefix, '_'); + $path = rtrim($path, DIRECTORY_SEPARATOR); + foreach (array(self::DECORATOR, self::FILTER, self::VALIDATE) as $type) { + $cType = ucfirst(strtolower($type)); + $pluginPath = $path . DIRECTORY_SEPARATOR . $cType . DIRECTORY_SEPARATOR; + $pluginPrefix = $prefix . '_' . $cType; + $loader = $this->getPluginLoader($type); + $loader->addPrefixPath($pluginPrefix, $pluginPath); + } + return $this; + default: + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception(sprintf('Invalid type "%s" provided to getPluginLoader()', $type)); + } + } + + /** + * Add many prefix paths at once + * + * @param array $spec + * @return Zend_Form_Element + */ + public function addPrefixPaths(array $spec) + { + if (isset($spec['prefix']) && isset($spec['path'])) { + return $this->addPrefixPath($spec['prefix'], $spec['path']); + } + foreach ($spec as $type => $paths) { + if (is_numeric($type) && is_array($paths)) { + $type = null; + if (isset($paths['prefix']) && isset($paths['path'])) { + if (isset($paths['type'])) { + $type = $paths['type']; + } + $this->addPrefixPath($paths['prefix'], $paths['path'], $type); + } + } elseif (!is_numeric($type)) { + if (!isset($paths['prefix']) || !isset($paths['path'])) { + foreach ($paths as $prefix => $spec) { + if (is_array($spec)) { + foreach ($spec as $path) { + if (!is_string($path)) { + continue; + } + $this->addPrefixPath($prefix, $path, $type); + } + } elseif (is_string($spec)) { + $this->addPrefixPath($prefix, $spec, $type); + } + } + } else { + $this->addPrefixPath($paths['prefix'], $paths['path'], $type); + } + } + } + return $this; + } + + // Validation + + /** + * Add validator to validation chain + * + * Note: will overwrite existing validators if they are of the same class. + * + * @param string|Zend_Validate_Interface $validator + * @param bool $breakChainOnFailure + * @param array $options + * @return Zend_Form_Element + * @throws Zend_Form_Exception if invalid validator type + */ + public function addValidator($validator, $breakChainOnFailure = false, $options = array()) + { + if ($validator instanceof Zend_Validate_Interface) { + $name = get_class($validator); + + if (!isset($validator->zfBreakChainOnFailure)) { + $validator->zfBreakChainOnFailure = $breakChainOnFailure; + } + } elseif (is_string($validator)) { + $name = $validator; + $validator = array( + 'validator' => $validator, + 'breakChainOnFailure' => $breakChainOnFailure, + 'options' => $options, + ); + } else { + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception('Invalid validator provided to addValidator; must be string or Zend_Validate_Interface'); + } + + + $this->_validators[$name] = $validator; + + return $this; + } + + /** + * Add multiple validators + * + * @param array $validators + * @return Zend_Form_Element + */ + public function addValidators(array $validators) + { + foreach ($validators as $validatorInfo) { + if (is_string($validatorInfo)) { + $this->addValidator($validatorInfo); + } elseif ($validatorInfo instanceof Zend_Validate_Interface) { + $this->addValidator($validatorInfo); + } elseif (is_array($validatorInfo)) { + $argc = count($validatorInfo); + $breakChainOnFailure = false; + $options = array(); + if (isset($validatorInfo['validator'])) { + $validator = $validatorInfo['validator']; + if (isset($validatorInfo['breakChainOnFailure'])) { + $breakChainOnFailure = $validatorInfo['breakChainOnFailure']; + } + if (isset($validatorInfo['options'])) { + $options = $validatorInfo['options']; + } + $this->addValidator($validator, $breakChainOnFailure, $options); + } else { + switch (true) { + case (0 == $argc): + break; + case (1 <= $argc): + $validator = array_shift($validatorInfo); + case (2 <= $argc): + $breakChainOnFailure = array_shift($validatorInfo); + case (3 <= $argc): + $options = array_shift($validatorInfo); + default: + $this->addValidator($validator, $breakChainOnFailure, $options); + break; + } + } + } else { + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception('Invalid validator passed to addValidators()'); + } + } + + return $this; + } + + /** + * Set multiple validators, overwriting previous validators + * + * @param array $validators + * @return Zend_Form_Element + */ + public function setValidators(array $validators) + { + $this->clearValidators(); + return $this->addValidators($validators); + } + + /** + * Retrieve a single validator by name + * + * @param string $name + * @return Zend_Validate_Interface|false False if not found, validator otherwise + */ + public function getValidator($name) + { + if (!isset($this->_validators[$name])) { + $len = strlen($name); + foreach ($this->_validators as $localName => $validator) { + if ($len > strlen($localName)) { + continue; + } + if (0 === substr_compare($localName, $name, -$len, $len, true)) { + if (is_array($validator)) { + return $this->_loadValidator($validator); + } + return $validator; + } + } + return false; + } + + if (is_array($this->_validators[$name])) { + return $this->_loadValidator($this->_validators[$name]); + } + + return $this->_validators[$name]; + } + + /** + * Retrieve all validators + * + * @return array + */ + public function getValidators() + { + $validators = array(); + foreach ($this->_validators as $key => $value) { + if ($value instanceof Zend_Validate_Interface) { + $validators[$key] = $value; + continue; + } + $validator = $this->_loadValidator($value); + $validators[get_class($validator)] = $validator; + } + return $validators; + } + + /** + * Remove a single validator by name + * + * @param string $name + * @return bool + */ + public function removeValidator($name) + { + if (isset($this->_validators[$name])) { + unset($this->_validators[$name]); + } else { + $len = strlen($name); + foreach (array_keys($this->_validators) as $validator) { + if ($len > strlen($validator)) { + continue; + } + if (0 === substr_compare($validator, $name, -$len, $len, true)) { + unset($this->_validators[$validator]); + break; + } + } + } + + return $this; + } + + /** + * Clear all validators + * + * @return Zend_Form_Element + */ + public function clearValidators() + { + $this->_validators = array(); + return $this; + } + + /** + * Validate element value + * + * If a translation adapter is registered, any error messages will be + * translated according to the current locale, using the given error code; + * if no matching translation is found, the original message will be + * utilized. + * + * Note: The *filtered* value is validated. + * + * @param mixed $value + * @param mixed $context + * @return boolean + */ + public function isValid($value, $context = null) + { + $this->setValue($value); + $value = $this->getValue(); + + if ((('' === $value) || (null === $value)) + && !$this->isRequired() + && $this->getAllowEmpty() + ) { + return true; + } + + if ($this->isRequired() + && $this->autoInsertNotEmptyValidator() + && !$this->getValidator('NotEmpty')) + { + $validators = $this->getValidators(); + $notEmpty = array('validator' => 'NotEmpty', 'breakChainOnFailure' => true); + array_unshift($validators, $notEmpty); + $this->setValidators($validators); + } + + $this->_messages = array(); + $this->_errors = array(); + $result = true; + $translator = $this->getTranslator(); + $isArray = $this->isArray(); + foreach ($this->getValidators() as $key => $validator) { + if (method_exists($validator, 'setTranslator')) { + $validator->setTranslator($translator); + } + + if ($isArray && is_array($value)) { + $messages = array(); + $errors = array(); + foreach ($value as $val) { + if (!$validator->isValid($val, $context)) { + $result = false; + if ($this->_hasErrorMessages()) { + $messages = $this->_getErrorMessages(); + $errors = $messages; + } else { + $messages = array_merge($messages, $validator->getMessages()); + $errors = array_merge($errors, $validator->getErrors()); + } + } + } + if ($result) { + continue; + } + } elseif ($validator->isValid($value, $context)) { + continue; + } else { + $result = false; + if ($this->_hasErrorMessages()) { + $messages = $this->_getErrorMessages(); + $errors = $messages; + } else { + $messages = $validator->getMessages(); + $errors = array_keys($messages); + } + } + + $result = false; + $this->_messages = array_merge($this->_messages, $messages); + $this->_errors = array_merge($this->_errors, $errors); + + if ($validator->zfBreakChainOnFailure) { + break; + } + } + + return $result; + } + + /** + * Add a custom error message to return in the event of failed validation + * + * @param string $message + * @return Zend_Form_Element + */ + public function addErrorMessage($message) + { + $this->_errorMessages[] = (string) $message; + return $this; + } + + /** + * Add multiple custom error messages to return in the event of failed validation + * + * @param array $messages + * @return Zend_Form_Element + */ + public function addErrorMessages(array $messages) + { + foreach ($messages as $message) { + $this->addErrorMessage($message); + } + return $this; + } + + /** + * Same as addErrorMessages(), but clears custom error message stack first + * + * @param array $messages + * @return Zend_Form_Element + */ + public function setErrorMessages(array $messages) + { + $this->clearErrorMessages(); + return $this->addErrorMessages($messages); + } + + /** + * Retrieve custom error messages + * + * @return array + */ + public function getErrorMessages() + { + return $this->_errorMessages; + } + + /** + * Clear custom error messages stack + * + * @return Zend_Form_Element + */ + public function clearErrorMessages() + { + $this->_errorMessages = array(); + return $this; + } + + /** + * Mark the element as being in a failed validation state + * + * @return Zend_Form_Element + */ + public function markAsError() + { + $messages = $this->getMessages(); + $customMessages = $this->_getErrorMessages(); + $messages = $messages + $customMessages; + if (empty($messages)) { + $this->_isError = true; + } else { + $this->_messages = $messages; + } + return $this; + } + + /** + * Add an error message and mark element as failed validation + * + * @param string $message + * @return Zend_Form_Element + */ + public function addError($message) + { + $this->addErrorMessage($message); + $this->markAsError(); + return $this; + } + + /** + * Add multiple error messages and flag element as failed validation + * + * @param array $messages + * @return Zend_Form_Element + */ + public function addErrors(array $messages) + { + foreach ($messages as $message) { + $this->addError($message); + } + return $this; + } + + /** + * Overwrite any previously set error messages and flag as failed validation + * + * @param array $messages + * @return Zend_Form_Element + */ + public function setErrors(array $messages) + { + $this->clearErrorMessages(); + return $this->addErrors($messages); + } + + /** + * Are there errors registered? + * + * @return bool + */ + public function hasErrors() + { + return (!empty($this->_messages) || $this->_isError); + } + + /** + * Retrieve validator chain errors + * + * @return array + */ + public function getErrors() + { + return $this->_errors; + } + + /** + * Retrieve error messages + * + * @return array + */ + public function getMessages() + { + return $this->_messages; + } + + + // Filtering + + /** + * Add a filter to the element + * + * @param string|Zend_Filter_Interface $filter + * @return Zend_Form_Element + */ + public function addFilter($filter, $options = array()) + { + if ($filter instanceof Zend_Filter_Interface) { + $name = get_class($filter); + } elseif (is_string($filter)) { + $name = $filter; + $filter = array( + 'filter' => $filter, + 'options' => $options, + ); + $this->_filters[$name] = $filter; + } else { + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception('Invalid filter provided to addFilter; must be string or Zend_Filter_Interface'); + } + + $this->_filters[$name] = $filter; + + return $this; + } + + /** + * Add filters to element + * + * @param array $filters + * @return Zend_Form_Element + */ + public function addFilters(array $filters) + { + foreach ($filters as $filterInfo) { + if (is_string($filterInfo)) { + $this->addFilter($filterInfo); + } elseif ($filterInfo instanceof Zend_Filter_Interface) { + $this->addFilter($filterInfo); + } elseif (is_array($filterInfo)) { + $argc = count($filterInfo); + $options = array(); + if (isset($filterInfo['filter'])) { + $filter = $filterInfo['filter']; + if (isset($filterInfo['options'])) { + $options = $filterInfo['options']; + } + $this->addFilter($filter, $options); + } else { + switch (true) { + case (0 == $argc): + break; + case (1 <= $argc): + $filter = array_shift($filterInfo); + case (2 <= $argc): + $options = array_shift($filterInfo); + default: + $this->addFilter($filter, $options); + break; + } + } + } else { + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception('Invalid filter passed to addFilters()'); + } + } + + return $this; + } + + /** + * Add filters to element, overwriting any already existing + * + * @param array $filters + * @return Zend_Form_Element + */ + public function setFilters(array $filters) + { + $this->clearFilters(); + return $this->addFilters($filters); + } + + /** + * Retrieve a single filter by name + * + * @param string $name + * @return Zend_Filter_Interface + */ + public function getFilter($name) + { + if (!isset($this->_filters[$name])) { + $len = strlen($name); + foreach ($this->_filters as $localName => $filter) { + if ($len > strlen($localName)) { + continue; + } + + if (0 === substr_compare($localName, $name, -$len, $len, true)) { + if (is_array($filter)) { + return $this->_loadFilter($filter); + } + return $filter; + } + } + return false; + } + + if (is_array($this->_filters[$name])) { + return $this->_loadFilter($this->_filters[$name]); + } + + return $this->_filters[$name]; + } + + /** + * Get all filters + * + * @return array + */ + public function getFilters() + { + $filters = array(); + foreach ($this->_filters as $key => $value) { + if ($value instanceof Zend_Filter_Interface) { + $filters[$key] = $value; + continue; + } + $filter = $this->_loadFilter($value); + $filters[get_class($filter)] = $filter; + } + return $filters; + } + + /** + * Remove a filter by name + * + * @param string $name + * @return Zend_Form_Element + */ + public function removeFilter($name) + { + if (isset($this->_filters[$name])) { + unset($this->_filters[$name]); + } else { + $len = strlen($name); + foreach (array_keys($this->_filters) as $filter) { + if ($len > strlen($filter)) { + continue; + } + if (0 === substr_compare($filter, $name, -$len, $len, true)) { + unset($this->_filters[$filter]); + break; + } + } + } + + return $this; + } + + /** + * Clear all filters + * + * @return Zend_Form_Element + */ + public function clearFilters() + { + $this->_filters = array(); + return $this; + } + + // Rendering + + /** + * Set view object + * + * @param Zend_View_Interface $view + * @return Zend_Form_Element + */ + public function setView(Zend_View_Interface $view = null) + { + $this->_view = $view; + return $this; + } + + /** + * Retrieve view object + * + * Retrieves from ViewRenderer if none previously set. + * + * @return null|Zend_View_Interface + */ + public function getView() + { + if (null === $this->_view) { + require_once 'Zend/Controller/Action/HelperBroker.php'; + $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer'); + $this->setView($viewRenderer->view); + } + return $this->_view; + } + + /** + * Instantiate a decorator based on class name or class name fragment + * + * @param string $name + * @param null|array $options + * @return Zend_Form_Decorator_Interface + */ + protected function _getDecorator($name, $options) + { + $class = $this->getPluginLoader(self::DECORATOR)->load($name); + if (null === $options) { + $decorator = new $class; + } else { + $r = new ReflectionClass($class); + $decorator = $r->newInstance($options); + } + + return $decorator; + } + + /** + * Add a decorator for rendering the element + * + * @param string|Zend_Form_Decorator_Interface $decorator + * @param array|Zend_Config $options Options with which to initialize decorator + * @return Zend_Form_Element + */ + public function addDecorator($decorator, $options = null) + { + if ($decorator instanceof Zend_Form_Decorator_Interface) { + $name = get_class($decorator); + } elseif (is_string($decorator)) { + $name = $decorator; + $decorator = array( + 'decorator' => $name, + 'options' => $options, + ); + } elseif (is_array($decorator)) { + foreach ($decorator as $name => $spec) { + break; + } + if (is_numeric($name)) { + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception('Invalid alias provided to addDecorator; must be alphanumeric string'); + } + if (is_string($spec)) { + $decorator = array( + 'decorator' => $spec, + 'options' => $options, + ); + } elseif ($spec instanceof Zend_Form_Decorator_Interface) { + $decorator = $spec; + } + } else { + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception('Invalid decorator provided to addDecorator; must be string or Zend_Form_Decorator_Interface'); + } + + $this->_decorators[$name] = $decorator; + + return $this; + } + + /** + * Add many decorators at once + * + * @param array $decorators + * @return Zend_Form_Element + */ + public function addDecorators(array $decorators) + { + foreach ($decorators as $decoratorInfo) { + if (is_string($decoratorInfo)) { + $this->addDecorator($decoratorInfo); + } elseif ($decoratorInfo instanceof Zend_Form_Decorator_Interface) { + $this->addDecorator($decoratorInfo); + } elseif (is_array($decoratorInfo)) { + $argc = count($decoratorInfo); + $options = array(); + if (isset($decoratorInfo['decorator'])) { + $decorator = $decoratorInfo['decorator']; + if (isset($decoratorInfo['options'])) { + $options = $decoratorInfo['options']; + } + $this->addDecorator($decorator, $options); + } else { + switch (true) { + case (0 == $argc): + break; + case (1 <= $argc): + $decorator = array_shift($decoratorInfo); + case (2 <= $argc): + $options = array_shift($decoratorInfo); + default: + $this->addDecorator($decorator, $options); + break; + } + } + } else { + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception('Invalid decorator passed to addDecorators()'); + } + } + + return $this; + } + + /** + * Overwrite all decorators + * + * @param array $decorators + * @return Zend_Form_Element + */ + public function setDecorators(array $decorators) + { + $this->clearDecorators(); + return $this->addDecorators($decorators); + } + + /** + * Retrieve a registered decorator + * + * @param string $name + * @return false|Zend_Form_Decorator_Abstract + */ + public function getDecorator($name) + { + if (!isset($this->_decorators[$name])) { + $len = strlen($name); + foreach ($this->_decorators as $localName => $decorator) { + if ($len > strlen($localName)) { + continue; + } + + if (0 === substr_compare($localName, $name, -$len, $len, true)) { + if (is_array($decorator)) { + return $this->_loadDecorator($decorator, $localName); + } + return $decorator; + } + } + return false; + } + + if (is_array($this->_decorators[$name])) { + return $this->_loadDecorator($this->_decorators[$name], $name); + } + + return $this->_decorators[$name]; + } + + /** + * Retrieve all decorators + * + * @return array + */ + public function getDecorators() + { + foreach ($this->_decorators as $key => $value) { + if (is_array($value)) { + $this->_loadDecorator($value, $key); + } + } + return $this->_decorators; + } + + /** + * Remove a single decorator + * + * @param string $name + * @return bool + */ + public function removeDecorator($name) + { + if (isset($this->_decorators[$name])) { + unset($this->_decorators[$name]); + } else { + $len = strlen($name); + foreach (array_keys($this->_decorators) as $decorator) { + if ($len > strlen($decorator)) { + continue; + } + if (0 === substr_compare($decorator, $name, -$len, $len, true)) { + unset($this->_decorators[$decorator]); + break; + } + } + } + + return $this; + } + + /** + * Clear all decorators + * + * @return Zend_Form_Element + */ + public function clearDecorators() + { + $this->_decorators = array(); + return $this; + } + + /** + * Render form element + * + * @param Zend_View_Interface $view + * @return string + */ + public function render(Zend_View_Interface $view = null) + { + if (null !== $view) { + $this->setView($view); + } + + $content = ''; + foreach ($this->getDecorators() as $decorator) { + $decorator->setElement($this); + $content = $decorator->render($content); + } + return $content; + } + + /** + * String representation of form element + * + * Proxies to {@link render()}. + * + * @return string + */ + public function __toString() + { + try { + $return = $this->render(); + return $return; + } catch (Exception $e) { + trigger_error($e->getMessage(), E_USER_WARNING); + return ''; + } + } + + /** + * Lazy-load a filter + * + * @param array $filter + * @return Zend_Filter_Interface + */ + protected function _loadFilter(array $filter) + { + $origName = $filter['filter']; + $name = $this->getPluginLoader(self::FILTER)->load($filter['filter']); + + if (array_key_exists($name, $this->_filters)) { + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception(sprintf('Filter instance already exists for filter "%s"', $origName)); + } + + if (empty($filter['options'])) { + $instance = new $name; + } else { + $r = new ReflectionClass($name); + if ($r->hasMethod('__construct')) { + $instance = $r->newInstanceArgs((array) $filter['options']); + } else { + $instance = $r->newInstance(); + } + } + + if ($origName != $name) { + $filterNames = array_keys($this->_filters); + $order = array_flip($filterNames); + $order[$name] = $order[$origName]; + $filtersExchange = array(); + unset($order[$origName]); + asort($order); + foreach ($order as $key => $index) { + if ($key == $name) { + $filtersExchange[$key] = $instance; + continue; + } + $filtersExchange[$key] = $this->_filters[$key]; + } + $this->_filters = $filtersExchange; + } else { + $this->_filters[$name] = $instance; + } + + return $instance; + } + + /** + * Lazy-load a validator + * + * @param array $validator Validator definition + * @return Zend_Validate_Interface + */ + protected function _loadValidator(array $validator) + { + $origName = $validator['validator']; + $name = $this->getPluginLoader(self::VALIDATE)->load($validator['validator']); + + if (array_key_exists($name, $this->_validators)) { + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception(sprintf('Validator instance already exists for validator "%s"', $origName)); + } + + if (empty($validator['options'])) { + $instance = new $name; + } else { + $messages = false; + if (isset($validator['options']['messages'])) { + $messages = $validator['options']['messages']; + unset($validator['options']['messages']); + } + + $r = new ReflectionClass($name); + if ($r->hasMethod('__construct')) { + $instance = $r->newInstanceArgs((array) $validator['options']); + } else { + $instance = $r->newInstance(); + } + + if ($messages) { + if (is_array($messages)) { + $instance->setMessages($messages); + } elseif (is_string($messages)) { + $instance->setMessage($messages); + } + } + } + + $instance->zfBreakChainOnFailure = $validator['breakChainOnFailure']; + + if ($origName != $name) { + $validatorNames = array_keys($this->_validators); + $order = array_flip($validatorNames); + $order[$name] = $order[$origName]; + $validatorsExchange = array(); + unset($order[$origName]); + asort($order); + foreach ($order as $key => $index) { + if ($key == $name) { + $validatorsExchange[$key] = $instance; + continue; + } + $validatorsExchange[$key] = $this->_validators[$key]; + } + $this->_validators = $validatorsExchange; + } else { + $this->_validators[$name] = $instance; + } + + return $instance; + } + + /** + * Lazy-load a decorator + * + * @param array $decorator Decorator type and options + * @param mixed $name Decorator name or alias + * @return Zend_Form_Decorator_Interface + */ + protected function _loadDecorator(array $decorator, $name) + { + $sameName = false; + if ($name == $decorator['decorator']) { + $sameName = true; + } + + $instance = $this->_getDecorator($decorator['decorator'], $decorator['options']); + if ($sameName) { + $newName = get_class($instance); + $decoratorNames = array_keys($this->_decorators); + $order = array_flip($decoratorNames); + $order[$newName] = $order[$name]; + $decoratorsExchange = array(); + unset($order[$name]); + asort($order); + foreach ($order as $key => $index) { + if ($key == $newName) { + $decoratorsExchange[$key] = $instance; + continue; + } + $decoratorsExchange[$key] = $this->_decorators[$key]; + } + $this->_decorators = $decoratorsExchange; + } else { + $this->_decorators[$name] = $instance; + } + + return $instance; + } + + /** + * Retrieve error messages and perform translation and value substitution + * + * @return array + */ + protected function _getErrorMessages() + { + $translator = $this->getTranslator(); + $messages = $this->getErrorMessages(); + $value = $this->getValue(); + foreach ($messages as $key => $message) { + if (null !== $translator) { + $message = $translator->translate($message); + } + if ($this->isArray() || is_array($value)) { + $aggregateMessages = array(); + foreach ($value as $val) { + $aggregateMessages[] = str_replace('%value%', $val, $message); + } + $messages[$key] = $aggregateMessages; + } else { + $messages[$key] = str_replace('%value%', $value, $message); + } + } + return $messages; + } + + /** + * Are there custom error messages registered? + * + * @return bool + */ + protected function _hasErrorMessages() + { + return !empty($this->_errorMessages); + } +} diff --git a/libs/Zend/Form/Element/Button.php b/libs/Zend/Form/Element/Button.php new file mode 100644 index 0000000..2d72add --- /dev/null +++ b/libs/Zend/Form/Element/Button.php @@ -0,0 +1,42 @@ +_captcha; + } + + /** + * Set captcha adapter + * + * @param string|array|Zend_Captcha_Adapter $captcha + * @param array $options + */ + public function setCaptcha($captcha, $options = array()) + { + if ($captcha instanceof Zend_Captcha_Adapter) { + $instance = $captcha; + } else { + if (is_array($captcha)) { + if (array_key_exists('captcha', $captcha)) { + $name = $captcha['captcha']; + unset($captcha['captcha']); + } else { + $name = array_shift($captcha); + } + $options = array_merge($options, $captcha); + } else { + $name = $captcha; + } + + $name = $this->getPluginLoader(self::CAPTCHA)->load($name); + if (empty($options)) { + $instance = new $name; + } else { + $r = new ReflectionClass($name); + if ($r->hasMethod('__construct')) { + $instance = $r->newInstanceArgs(array($options)); + } else { + $instance = $r->newInstance(); + } + } + } + + $this->_captcha = $instance; + $this->_captcha->setName($this->getName()); + return $this; + } + + /** + * Constructor + * + * $spec may be: + * - string: name of element + * - array: options with which to configure element + * - Zend_Config: Zend_Config with options for configuring element + * + * @param string|array|Zend_Config $spec + * @return void + */ + public function __construct($spec, $options = null) + { + parent::__construct($spec, $options); + $this->setAllowEmpty(true) + ->setRequired(true) + ->setAutoInsertNotEmptyValidator(false) + ->addValidator($this->getCaptcha(), true); + } + + /** + * Set options + * + * Overrides to allow passing captcha options + * + * @param array $options + * @return Zend_Form_Element_Captcha + */ + public function setOptions(array $options) + { + if (array_key_exists('captcha', $options)) { + if (array_key_exists('captchaOptions', $options)) { + $this->setCaptcha($options['captcha'], $options['captchaOptions']); + unset($options['captchaOptions']); + } else { + $this->setCaptcha($options['captcha']); + } + unset($options['captcha']); + } + return parent::setOptions($options); + } + + /** + * Render form element + * + * @param Zend_View_Interface $view + * @return string + */ + public function render(Zend_View_Interface $view = null) + { + $captcha = $this->getCaptcha(); + $captcha->setName($this->getFullyQualifiedName()); + + $decorators = $this->getDecorators(); + + $decorator = $captcha->getDecorator(); + if (!empty($decorator)) { + array_unshift($decorators, $decorator); + } + + $decorator = array('Captcha', array('captcha' => $captcha)); + array_unshift($decorators, $decorator); + + $this->setDecorators($decorators); + + $this->setValue($this->getCaptcha()->generate()); + + return parent::render($view); + } + + /** + * Retrieve plugin loader for validator or filter chain + * + * Support for plugin loader for Captcha adapters + * + * @param string $type + * @return Zend_Loader_PluginLoader + * @throws Zend_Loader_Exception on invalid type. + */ + public function getPluginLoader($type) + { + $type = strtoupper($type); + if ($type == self::CAPTCHA) { + if (!isset($this->_loaders[$type])) { + require_once 'Zend/Loader/PluginLoader.php'; + $this->_loaders[$type] = new Zend_Loader_PluginLoader( + array('Zend_Captcha' => 'Zend/Captcha/') + ); + } + return $this->_loaders[$type]; + } else { + return parent::getPluginLoader($type); + } + } + + /** + * Add prefix path for plugin loader for captcha adapters + * + * This method handles the captcha type, the rest is handled by + * the parent + * + * @param string $path + * @return Zend_Form_Element + * @see Zend_Form_Element::addPrefixPath + */ + public function addPrefixPath($prefix, $path, $type = null) + { + $type = strtoupper($type); + switch ($type) { + case null: + $loader = $this->getPluginLoader(self::CAPTCHA); + $cPrefix = rtrim($prefix, '_') . '_Captcha'; + $cPath = rtrim($path, '/\\') . '/Captcha'; + $loader->addPrefixPath($cPrefix, $cPath); + return parent::addPrefixPath($prefix, $path); + case self::CAPTCHA: + $loader = $this->getPluginLoader($type); + $loader->addPrefixPath($prefix, $path); + return $this; + default: + return parent::addPrefixPath($prefix, $path, $type); + } + } + + /** + * Load default decorators + * + * @return void + */ + public function loadDefaultDecorators() + { + if ($this->loadDefaultDecoratorsIsDisabled()) { + return; + } + + $decorators = $this->getDecorators(); + if (empty($decorators)) { + $this->addDecorator('Errors') + ->addDecorator('Description', array('tag' => 'p', 'class' => 'description')) + ->addDecorator('HtmlTag', array('tag' => 'dd')) + ->addDecorator('Label', array('tag' => 'dt')); + } + } + + /** + * Is the captcha valid? + * + * @param mixed $value + * @param mixed $context + * @return boolean + */ + public function isValid($value, $context = null) + { + $this->getCaptcha()->setName($this->getName()); + $belongsTo = $this->getBelongsTo(); + if (empty($belongsTo) || !is_array($context)) { + return parent::isValid($value, $context); + } + + $name = $this->getFullyQualifiedName(); + $root = substr($name, 0, strpos($name, '[')); + $segments = substr($name, strpos($name, '[')); + $segments = ltrim($segments, '['); + $segments = rtrim($segments, ']'); + $segments = explode('][', $segments); + array_unshift($segments, $root); + array_pop($segments); + $newContext = $context; + foreach ($segments as $segment) { + if (array_key_exists($segment, $newContext)) { + $newContext = $newContext[$segment]; + } + } + + return parent::isValid($value, $newContext); + } +} diff --git a/libs/Zend/Form/Element/Checkbox.php b/libs/Zend/Form/Element/Checkbox.php new file mode 100644 index 0000000..5f16a8d --- /dev/null +++ b/libs/Zend/Form/Element/Checkbox.php @@ -0,0 +1,209 @@ +setCheckedValue($options['checkedValue']); + unset($options['checkedValue']); + } + if (array_key_exists('uncheckedValue', $options)) { + $this->setUncheckedValue($options['uncheckedValue']); + unset($options['uncheckedValue']); + } + parent::setOptions($options); + + $curValue = $this->getValue(); + $test = array($this->getCheckedValue(), $this->getUncheckedValue()); + if (!in_array($curValue, $test)) { + $this->setValue($curValue); + } + + return $this; + } + + /** + * Set value + * + * 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 + * value, and the checked flag to be set as false. + * + * + * @param mixed $value + * @return Zend_Form_Element_Checkbox + */ + public function setValue($value) + { + if ($value == $this->getCheckedValue()) { + parent::setValue($value); + $this->checked = true; + } else { + parent::setValue($this->getUncheckedValue()); + $this->checked = false; + } + return $this; + } + + /** + * Set checked value + * + * @param string $value + * @return Zend_Form_Element_Checkbox + */ + public function setCheckedValue($value) + { + $this->_checkedValue = (string) $value; + return $this; + } + + /** + * Get value when checked + * + * @return string + */ + public function getCheckedValue() + { + return $this->_checkedValue; + } + + /** + * Set unchecked value + * + * @param string $value + * @return Zend_Form_Element_Checkbox + */ + public function setUncheckedValue($value) + { + $this->_uncheckedValue = (string) $value; + return $this; + } + + /** + * Get value when not checked + * + * @return string + */ + public function getUncheckedValue() + { + return $this->_uncheckedValue; + } + + /** + * Set checked flag + * + * @param bool $flag + * @return Zend_Form_Element_Checkbox + */ + public function setChecked($flag) + { + $this->checked = (bool) $flag; + if ($this->checked) { + $this->setValue($this->getCheckedValue()); + } else { + $this->setValue($this->getUncheckedValue()); + } + return $this; + } + + /** + * Get checked flag + * + * @return bool + */ + public function isChecked() + { + return $this->checked; + } + + /** + * Render + * + * Ensure that options property is set when rendering. + * + * @param Zend_View_Interface $view + * @return string + */ + public function render(Zend_View_Interface $view = null) + { + $this->options = array( + 'checked' => $this->getCheckedValue(), + 'unChecked' => $this->getUncheckedValue(), + ); + return parent::render($view); + } +} diff --git a/libs/Zend/Form/Element/Exception.php b/libs/Zend/Form/Element/Exception.php new file mode 100644 index 0000000..976ef89 --- /dev/null +++ b/libs/Zend/Form/Element/Exception.php @@ -0,0 +1,37 @@ +loadDefaultDecoratorsIsDisabled()) { + return; + } + + $decorators = $this->getDecorators(); + if (empty($decorators)) { + $this->addDecorator('File') + ->addDecorator('Errors') + ->addDecorator('HtmlTag', array('tag' => 'dd')) + ->addDecorator('Label', array('tag' => 'dt')); + } + } + + /** + * Set plugin loader + * + * @param Zend_Loader_PluginLoader_Interface $loader + * @param string $type + * @return Zend_Form_Element_File + */ + public function setPluginLoader(Zend_Loader_PluginLoader_Interface $loader, $type) + { + $type = strtoupper($type); + + if ($type != self::TRANSFER_ADAPTER) { + return parent::setPluginLoader($loader, $type); + } + + $this->_loaders[$type] = $loader; + return $this; + } + + /** + * Get Plugin Loader + * + * @param string $type + * @return Zend_Loader_PluginLoader_Interface + */ + public function getPluginLoader($type) + { + $type = strtoupper($type); + + if ($type != self::TRANSFER_ADAPTER) { + return parent::getPluginLoader($type); + } + + if (!array_key_exists($type, $this->_loaders)) { + require_once 'Zend/Loader/PluginLoader.php'; + $loader = new Zend_Loader_PluginLoader(array( + 'Zend_File_Transfer_Adapter' => 'Zend/File/Transfer/Adapter/', + )); + $this->setPluginLoader($loader, self::TRANSFER_ADAPTER); + } + + return $this->_loaders[$type]; + } + + /** + * Add prefix path for plugin loader + * + * @param string $prefix + * @param string $path + * @param string $type + * @return Zend_Form_Element_File + */ + public function addPrefixPath($prefix, $path, $type = null) + { + $type = strtoupper($type); + if (!empty($type) && ($type != self::TRANSFER_ADAPTER)) { + return parent::addPrefixPath($prefix, $path, $type); + } + + if (empty($type)) { + $pluginPrefix = rtrim($prefix, '_') . '_Transfer_Adapter'; + $pluginPath = rtrim($path, DIRECTORY_SEPARATOR) . '/Transfer/Adapter/'; + $loader = $this->getPluginLoader(self::TRANSFER_ADAPTER); + $loader->addPrefixPath($pluginPrefix, $pluginPath); + return parent::addPrefixPath($prefix, $path, null); + } + + $loader = $this->getPluginLoader($type); + $loader->addPrefixPath($prefix, $path); + return $this; + } + + /** + * Set transfer adapter + * + * @param string|Zend_File_Transfer_Adapter_Abstract $adapter + * @return Zend_Form_Element_File + */ + public function setTransferAdapter($adapter) + { + if ($adapter instanceof Zend_File_Transfer_Adapter_Abstract) { + $this->_adapter = $adapter; + } elseif (is_string($adapter)) { + $loader = $this->getPluginLoader(self::TRANSFER_ADAPTER); + $class = $loader->load($adapter); + $this->_adapter = new $class; + } else { + require_once 'Zend/Form/Element/Exception.php'; + throw new Zend_Form_Element_Exception('Invalid adapter specified'); + } + + return $this; + } + + /** + * Get transfer adapter + * + * Lazy loads HTTP transfer adapter when no adapter registered. + * + * @return Zend_File_Transfer_Adapter_Abstract + */ + public function getTransferAdapter() + { + if (null === $this->_adapter) { + $this->setTransferAdapter('Http'); + } + return $this->_adapter; + } + + /** + * Add Validator; proxy to adapter + * + * @param string|Zend_Validate_Interface $validator + * @param bool $breakChainOnFailure + * @param mixed $options + * @return Zend_Form_Element_File + */ + public function addValidator($validator, $breakChainOnFailure = false, $options = array()) + { + $adapter = $this->getTransferAdapter(); + $adapter->addValidator($validator, $breakChainOnFailure, $options, $this->getName()); + $this->_validated = false; + + return $this; + } + + /** + * Add multiple validators at once; proxy to adapter + * + * @param array $validators + * @return Zend_Form_Element_File + */ + public function addValidators(array $validators) + { + $adapter = $this->getTransferAdapter(); + $adapter->addValidators($validators, $this->getName()); + $this->_validated = false; + + return $this; + } + + /** + * Add multiple validators at once, overwriting; proxy to adapter + * + * @param array $validators + * @return Zend_Form_Element_File + */ + public function setValidators(array $validators) + { + $adapter = $this->getTransferAdapter(); + $adapter->setValidators($validators, $this->getName()); + $this->_validated = false; + + return $this; + } + + /** + * Retrieve validator by name; proxy to adapter + * + * @param string $name + * @return Zend_Validate_Interface|null + */ + public function getValidator($name) + { + $adapter = $this->getTransferAdapter(); + return $adapter->getValidator($name); + } + + /** + * Retrieve all validators; proxy to adapter + * + * @return array + */ + public function getValidators() + { + $adapter = $this->getTransferAdapter(); + $validators = $adapter->getValidators($this->getName()); + if ($validators === null) { + $validators = array(); + } + + return $validators; + } + + /** + * Remove validator by name; proxy to adapter + * + * @param string $name + * @return Zend_Form_Element_File + */ + public function removeValidator($name) + { + $adapter = $this->getTransferAdapter(); + $adapter->removeValidator($name); + $this->_validated = false; + + return $this; + } + + /** + * Remove all validators; proxy to adapter + * + * @return Zend_Form_Element_File + */ + public function clearValidators() + { + $adapter = $this->getTransferAdapter(); + $adapter->clearValidators(); + $this->_validated = false; + + return $this; + } + + /** + * Add Filter; proxy to adapter + * + * @param string|array $filter Type of filter to add + * @param string|array $options Options to set for the filter + * @return Zend_Form_Element_File + */ + public function addFilter($filter, $options = null) + { + $adapter = $this->getTransferAdapter(); + $adapter->addFilter($filter, $options, $this->getName()); + + return $this; + } + + /** + * Add Multiple filters at once; proxy to adapter + * + * @param array $filters + * @return Zend_Form_Element_File + */ + public function addFilters(array $filters) + { + $adapter = $this->getTransferAdapter(); + $adapter->addFilters($filters, $this->getName()); + + return $this; + } + + /** + * Sets a filter for the class, erasing all previous set; proxy to adapter + * + * @param string|array $filter Filter to set + * @return Zend_Form_Element_File + */ + public function setFilters(array $filters) + { + $adapter = $this->getTransferAdapter(); + $adapter->setFilters($filters, $this->getName()); + + return $this; + } + + /** + * Retrieve individual filter; proxy to adapter + * + * @param string $name + * @return Zend_Filter_Interface|null + */ + public function getFilter($name) + { + $adapter = $this->getTransferAdapter(); + return $adapter->getFilter($name); + } + + /** + * Returns all set filters; proxy to adapter + * + * @return array List of set filters + */ + public function getFilters() + { + $adapter = $this->getTransferAdapter(); + $filters = $adapter->getFilters($this->getName()); + + if ($filters === null) { + $filters = array(); + } + return $filters; + } + + /** + * Remove an individual filter; proxy to adapter + * + * @param string $name + * @return Zend_Form_Element_File + */ + public function removeFilter($name) + { + $adapter = $this->getTransferAdapter(); + $adapter->removeFilter($name); + + return $this; + } + + /** + * Remove all filters; proxy to adapter + * + * @return Zend_Form_Element_File + */ + public function clearFilters() + { + $adapter = $this->getTransferAdapter(); + $adapter->clearFilters(); + + return $this; + } + + /** + * Validate upload + * + * @param string $value File, can be optional, give null to validate all files + * @param mixed $context + * @return bool + */ + public function isValid($value, $context = null) + { + if ($this->_validated) { + return true; + } + + $adapter = $this->getTransferAdapter(); + + if (!$this->isRequired()) { + $adapter->setOptions(array('ignoreNoFile' => true), $this->getName()); + } else { + $adapter->setOptions(array('ignoreNoFile' => false), $this->getName()); + if ($this->autoInsertNotEmptyValidator() and + !$this->getValidator('NotEmpty')) + { + $validators = $this->getValidators(); + $notEmpty = array('validator' => 'NotEmpty', 'breakChainOnFailure' => true); + array_unshift($validators, $notEmpty); + $this->setValidators($validators); + } + } + + if($adapter->isValid($this->getName())) { + $this->_validated = true; + return true; + } + + $this->_validated = false; + return false; + } + + /** + * Receive the uploaded file + * + * @param string $value + * @return boolean + */ + public function receive($value = null) + { + if (!$this->_validated) { + if (!$this->isValid($value)) { + return false; + } + } + + $adapter = $this->getTransferAdapter(); + if ($adapter->receive($this->getName())) { + return true; + } + + return false; + } + + /** + * Retrieve error codes; proxy to transfer adapter + * + * @return array + */ + public function getErrors() + { + return $this->getTransferAdapter()->getErrors(); + } + + /** + * Are there errors registered? + * + * @return bool + */ + public function hasErrors() + { + return $this->getTransferAdapter()->hasErrors(); + } + + /** + * Retrieve error messages; proxy to transfer adapter + * + * @return array + */ + public function getMessages() + { + return $this->getTransferAdapter()->getMessages(); + } + + /** + * Set the upload destination + * + * @param string $path + * @return Zend_Form_Element_File + */ + public function setDestination($path) + { + $this->getTransferAdapter()->setDestination($path, $this->getName()); + return $this; + } + + /** + * Get the upload destination + * + * @return string + */ + public function getDestination() + { + return $this->getTransferAdapter()->getDestination($this->getName()); + } + + /** + * Get the final filename + * + * @param string $value (Optional) Element or file to return + * @return string + */ + public function getFileName($value = null) + { + if (empty($value)) { + $value = $this->getName(); + } + + return $this->getTransferAdapter()->getFileName($value); + } + + /** + * Set a multifile element + * + * @param integer $count Number of file elements + * @return Zend_Form_Element_File Provides fluent interface + */ + public function setMultiFile($count) + { + if ((integer) $count < 2) { + $this->setIsArray(false); + $this->_counter = 1; + } else { + $this->setIsArray(true); + $this->_counter = (integer) $count; + } + + return $this; + } + + /** + * Returns the multifile element number + * + * @return integer + */ + public function getMultiFile() + { + return $this->_counter; + } + + /** + * Sets the maximum file size of the form + * + * @param integer $size + * @return integer + */ + public function setMaxFileSize($size) + { + self::$_maxFileSize = $size; + return $this; + } + + /** + * Sets the maximum file size of the form + * + * @return integer + */ + public function getMaxFileSize() + { + return self::$_maxFileSize; + } + + /** + * Processes the file, returns null or the filename only + * For the complete path, use getFileName + * + * @return null|string + */ + public function getValue() + { + if (!is_null($this->_value)) { + return $this->_value; + } + + $content = current($this->getTransferAdapter()->getFileInfo($this->getName())); + if (!isset($content['name'])) { + return null; + } + + if (!$this->isValid(null)) { + return null; + } + + if (!$this->receive()) { + return null; + } + + $filename = basename($this->getFileName()); + $this->_value = $filename; + return $filename; + } + + /** + * Disallow setting the value + * + * @param mixed $value + * @return Zend_Form_Element_File + */ + public function setValue($value) + { + return $this; + } +} diff --git a/libs/Zend/Form/Element/Hash.php b/libs/Zend/Form/Element/Hash.php new file mode 100644 index 0000000..6af4ada --- /dev/null +++ b/libs/Zend/Form/Element/Hash.php @@ -0,0 +1,259 @@ +setAllowEmpty(false) + ->setRequired(true) + ->initCsrfValidator(); + } + + /** + * Set session object + * + * @param Zend_Session_Namespace $session + * @return Zend_Form_Element_Hash + */ + public function setSession($session) + { + $this->_session = $session; + return $this; + } + + /** + * Get session object + * + * Instantiate session object if none currently exists + * + * @return Zend_Session_Namespace + */ + public function getSession() + { + if (null === $this->_session) { + require_once 'Zend/Session/Namespace.php'; + $this->_session = new Zend_Session_Namespace($this->getSessionName()); + } + return $this->_session; + } + + /** + * Initialize CSRF validator + * + * Creates Session namespace, and initializes CSRF token in session. + * Additionally, adds validator for validating CSRF token. + * + * @return Zend_Form_Element_Hash + */ + public function initCsrfValidator() + { + $session = $this->getSession(); + if (isset($session->hash)) { + $rightHash = $session->hash; + } else { + $rightHash = null; + } + + $this->addValidator('Identical', true, array($rightHash)); + return $this; + } + + /** + * Salt for CSRF token + * + * @param string $salt + * @return Zend_Form_Element_Hash + */ + public function setSalt($salt) + { + $this->_salt = (string) $salt; + return $this; + } + + /** + * Retrieve salt for CSRF token + * + * @return string + */ + public function getSalt() + { + return $this->_salt; + } + + /** + * Retrieve CSRF token + * + * If no CSRF token currently exists, generates one. + * + * @return string + */ + public function getHash() + { + if (null === $this->_hash) { + $this->_generateHash(); + } + return $this->_hash; + } + + /** + * Get session namespace for CSRF token + * + * Generates a session namespace based on salt, element name, and class. + * + * @return string + */ + public function getSessionName() + { + return __CLASS__ . '_' . $this->getSalt() . '_' . $this->getName(); + } + + /** + * Set timeout for CSRF session token + * + * @param int $ttl + * @return Zend_Form_Element_Hash + */ + public function setTimeout($ttl) + { + $this->_timeout = (int) $ttl; + return $this; + } + + /** + * Get CSRF session token timeout + * + * @return int + */ + public function getTimeout() + { + return $this->_timeout; + } + + /** + * Override getLabel() to always be empty + * + * @return null + */ + public function getLabel() + { + return null; + } + + /** + * Initialize CSRF token in session + * + * @return void + */ + public function initCsrfToken() + { + $session = $this->getSession(); + $session->setExpirationHops(1, null, true); + $session->setExpirationSeconds($this->getTimeout()); + $session->hash = $this->getHash(); + } + + /** + * Render CSRF token in form + * + * @param Zend_View_Interface $view + * @return string + */ + public function render(Zend_View_Interface $view = null) + { + $this->initCsrfToken(); + return parent::render($view); + } + + /** + * Generate CSRF token + * + * 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->setValue($this->_hash); + } +} diff --git a/libs/Zend/Form/Element/Hidden.php b/libs/Zend/Form/Element/Hidden.php new file mode 100644 index 0000000..c7eaed3 --- /dev/null +++ b/libs/Zend/Form/Element/Hidden.php @@ -0,0 +1,42 @@ +loadDefaultDecoratorsIsDisabled()) { + return; + } + + $decorators = $this->getDecorators(); + if (empty($decorators)) { + $this->addDecorator('Image') + ->addDecorator('Errors') + ->addDecorator('HtmlTag', array('tag' => 'dd')) + ->addDecorator('Label', array('tag' => 'dt')); + } + } + + /** + * Set image path + * + * @param string $path + * @return Zend_Form_Element_Image + */ + public function setImage($path) + { + $this->src = (string) $path; + return $this; + } + + /** + * Get image path + * + * @return string + */ + public function getImage() + { + return $this->src; + } + + /** + * Set image value to use when submitted + * + * @param mixed $value + * @return Zend_Form_Element_Image + */ + public function setImageValue($value) + { + $this->_imageValue = $value; + return $this; + } + + /** + * Get image value to use when submitted + * + * @return mixed + */ + public function getImageValue() + { + return $this->_imageValue; + } + + /** + * Was this element used to submit the form? + * + * @return bool + */ + public function isChecked() + { + $imageValue = $this->getImageValue(); + return ((null !== $imageValue) && ($this->getValue() == $imageValue)); + } +} diff --git a/libs/Zend/Form/Element/Multi.php b/libs/Zend/Form/Element/Multi.php new file mode 100644 index 0000000..58d9722 --- /dev/null +++ b/libs/Zend/Form/Element/Multi.php @@ -0,0 +1,318 @@ +'. + * @var string + */ + protected $_separator = '
      '; + + /** + * Which values are translated already? + * @var array + */ + protected $_translated = array(); + + /** + * Retrieve separator + * + * @return mixed + */ + public function getSeparator() + { + return $this->_separator; + } + + /** + * Set separator + * + * @param mixed $separator + * @return self + */ + public function setSeparator($separator) + { + $this->_separator = $separator; + return $this; + } + + /** + * Retrieve options array + * + * @return array + */ + protected function _getMultiOptions() + { + if (null === $this->options || !is_array($this->options)) { + $this->options = array(); + } + + return $this->options; + } + + /** + * Add an option + * + * @param string $option + * @param string $value + * @return Zend_Form_Element_Multi + */ + public function addMultiOption($option, $value = '') + { + $option = (string) $option; + $this->_getMultiOptions(); + if (!$this->_translateOption($option, $value)) { + $this->options[$option] = $value; + } + + return $this; + } + + /** + * Add many options at once + * + * @param array $options + * @return Zend_Form_Element_Multi + */ + public function addMultiOptions(array $options) + { + foreach ($options as $option => $value) { + if (is_array($value) + && array_key_exists('key', $value) + && array_key_exists('value', $value) + ) { + $this->addMultiOption($value['key'], $value['value']); + } else { + $this->addMultiOption($option, $value); + } + } + return $this; + } + + /** + * Set all options at once (overwrites) + * + * @param array $options + * @return Zend_Form_Element_Multi + */ + public function setMultiOptions(array $options) + { + $this->clearMultiOptions(); + return $this->addMultiOptions($options); + } + + /** + * Retrieve single multi option + * + * @param string $option + * @return mixed + */ + public function getMultiOption($option) + { + $option = (string) $option; + $this->_getMultiOptions(); + if (isset($this->options[$option])) { + $this->_translateOption($option, $this->options[$option]); + return $this->options[$option]; + } + + return null; + } + + /** + * Retrieve options + * + * @return array + */ + public function getMultiOptions() + { + $this->_getMultiOptions(); + foreach ($this->options as $option => $value) { + $this->_translateOption($option, $value); + } + return $this->options; + } + + /** + * Remove a single multi option + * + * @param string $option + * @return bool + */ + public function removeMultiOption($option) + { + $option = (string) $option; + $this->_getMultiOptions(); + if (isset($this->options[$option])) { + unset($this->options[$option]); + if (isset($this->_translated[$option])) { + unset($this->_translated[$option]); + } + return true; + } + + return false; + } + + /** + * Clear all options + * + * @return Zend_Form_Element_Multi + */ + public function clearMultiOptions() + { + $this->options = array(); + $this->_translated = array(); + return $this; + } + + /** + * Set flag indicating whether or not to auto-register inArray validator + * + * @param bool $flag + * @return Zend_Form_Element_Multi + */ + public function setRegisterInArrayValidator($flag) + { + $this->_registerInArrayValidator = (bool) $flag; + return $this; + } + + /** + * Get status of auto-register inArray validator flag + * + * @return bool + */ + public function registerInArrayValidator() + { + return $this->_registerInArrayValidator; + } + + /** + * Is the value provided valid? + * + * Autoregisters InArray validator if necessary. + * + * @param string $value + * @param mixed $context + * @return bool + */ + public function isValid($value, $context = null) + { + if ($this->registerInArrayValidator()) { + if (!$this->getValidator('InArray')) { + $multiOptions = $this->getMultiOptions(); + $options = array(); + + foreach ($multiOptions as $opt_value => $opt_label) { + // optgroup instead of option label + if (is_array($opt_label)) { + $options = array_merge($options, array_keys($opt_label)); + } + else { + $options[] = $opt_value; + } + } + + $this->addValidator( + 'InArray', + true, + array($options) + ); + } + } + return parent::isValid($value, $context); + } + + /** + * Translate an option + * + * @param string $option + * @param string $value + * @return bool + */ + protected function _translateOption($option, $value) + { + if ($this->translatorIsDisabled()) { + return true; + } + + if (!isset($this->_translated[$option]) && !empty($value)) { + $this->options[$option] = $this->_translateValue($value); + if ($this->options[$option] === $value) { + return false; + } + $this->_translated[$option] = true; + return true; + } + + return false; + } + + /** + * Translate a multi option value + * + * @param string $value + * @return string + */ + protected function _translateValue($value) + { + if (is_array($value)) { + foreach ($value as $key => $val) { + $value[$key] = $this->_translateValue($val); + } + return $value; + } else { + if (null !== ($translator = $this->getTranslator())) { + if ($translator->isTranslated($value)) { + return $translator->translate($value); + } + } + return $value; + } + } +} diff --git a/libs/Zend/Form/Element/MultiCheckbox.php b/libs/Zend/Form/Element/MultiCheckbox.php new file mode 100644 index 0000000..af99342 --- /dev/null +++ b/libs/Zend/Form/Element/MultiCheckbox.php @@ -0,0 +1,52 @@ +renderPassword = (bool) $flag; + return $this; + } + + /** + * Get value of renderPassword flag + * + * @return bool + */ + public function renderPassword() + { + return $this->renderPassword; + } + + /** + * Override isValid() + * + * Ensure that validation error messages mask password value. + * + * @param string $value + * @param mixed $context + * @return bool + */ + public function isValid($value, $context = null) + { + foreach ($this->getValidators() as $validator) { + if ($validator instanceof Zend_Validate_Abstract) { + $validator->setObscureValue(true); + } + } + return parent::isValid($value, $context); + } +} diff --git a/libs/Zend/Form/Element/Radio.php b/libs/Zend/Form/Element/Radio.php new file mode 100644 index 0000000..c26c4cb --- /dev/null +++ b/libs/Zend/Form/Element/Radio.php @@ -0,0 +1,42 @@ + $options); + } + + parent::__construct($spec, $options); + } + + /** + * Return label + * + * If no label is present, returns the currently set name. + * + * If a translator is present, returns the translated label. + * + * @return string + */ + public function getLabel() + { + $value = parent::getLabel(); + + if (null === $value) { + $value = $this->getName(); + } + + if (null !== ($translator = $this->getTranslator())) { + return $translator->translate($value); + } + + return $value; + } + + /** + * Has this submit button been selected? + * + * @return bool + */ + public function isChecked() + { + $value = $this->getValue(); + + if (empty($value)) { + return false; + } + if ($value != $this->getLabel()) { + return false; + } + + return true; + } + + /** + * Default decorators + * + * Uses only 'Submit' and 'DtDdWrapper' decorators by default. + * + * @return void + */ + public function loadDefaultDecorators() + { + if ($this->loadDefaultDecoratorsIsDisabled()) { + return; + } + + $decorators = $this->getDecorators(); + if (empty($decorators)) { + $this->addDecorator('ViewHelper') + ->addDecorator('DtDdWrapper'); + } + } +} diff --git a/libs/Zend/Form/Element/Text.php b/libs/Zend/Form/Element/Text.php new file mode 100644 index 0000000..ed8fd4a --- /dev/null +++ b/libs/Zend/Form/Element/Text.php @@ -0,0 +1,42 @@ +loadDefaultDecoratorsIsDisabled()) { + return; + } + + $decorators = $this->getDecorators(); + if (empty($decorators)) { + $this->addDecorator('FormElements') + ->addDecorator('HtmlTag', array('tag' => 'dl')) + ->addDecorator('Fieldset') + ->addDecorator('DtDdWrapper'); + } + } +} diff --git a/libs/Zend/Gdata.php b/libs/Zend/Gdata.php new file mode 100644 index 0000000..1b51297 --- /dev/null +++ b/libs/Zend/Gdata.php @@ -0,0 +1,223 @@ + 'http://a9.com/-/spec/opensearchrss/1.0/', + 'rss' => 'http://blogs.law.harvard.edu/tech/rss', + 'gd' => 'http://schemas.google.com/g/2005'); + + /** + * Client object used to communicate + * + * @var Zend_Gdata_HttpClient + */ + protected $_httpClient; + + /** + * Client object used to communicate in static context + * + * @var Zend_Gdata_HttpClient + */ + protected static $_staticHttpClient = null; + + /** + * Create Gdata object + * + * @param Zend_Http_Client $client + * @param string $applicationId The identity of the app in the form of + * Company-AppName-Version + */ + public function __construct($client = null, $applicationId = 'MyCompany-MyApp-1.0') + { + parent::__construct($client, $applicationId); + } + + /** + * Imports a feed located at $uri. + * + * @param string $uri + * @param Zend_Http_Client $client The client used for communication + * @param string $className The class which is used as the return type + * @throws Zend_Gdata_App_Exception + * @return Zend_Gdata_App_Feed + */ + public static function import($uri, $client = null, $className='Zend_Gdata_Feed') + { + $app = new Zend_Gdata($client); + $requestData = $app->decodeRequest('GET', $uri); + $response = $app->performHttpRequest($requestData['method'], $requestData['url']); + + $feedContent = $response->getBody(); + $feed = self::importString($feedContent, $className); + if ($client != null) { + $feed->setHttpClient($client); + } + return $feed; + } + + /** + * Retreive feed object + * + * @param mixed $location The location as string or Zend_Gdata_Query + * @param string $className The class type to use for returning the feed + * @throws Zend_Gdata_App_InvalidArgumentException + * @return Zend_Gdata_Feed + */ + public function getFeed($location, $className='Zend_Gdata_Feed') + { + if (is_string($location)) { + $uri = $location; + } elseif ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'You must specify the location as either a string URI ' . + 'or a child of Zend_Gdata_Query'); + } + return parent::getFeed($uri, $className); + } + + /** + * Retreive entry object + * + * @param mixed $location The location as string or Zend_Gdata_Query + * @return Zend_Gdata_Feed + */ + public function getEntry($location, $className='Zend_Gdata_Entry') + { + if (is_string($location)) { + $uri = $location; + } elseif ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'You must specify the location as either a string URI ' . + 'or a child of Zend_Gdata_Query'); + } + return parent::getEntry($uri, $className); + } + + /** + * Performs a HTTP request using the specified method. + * + * Overrides the definition in the parent (Zend_Gdata_App) + * and uses the Zend_Gdata_HttpClient functionality + * to filter the HTTP requests and responses. + * + * @param string $method The HTTP method for the request - + * 'GET', 'POST', 'PUT', 'DELETE' + * @param string $url The URL to which this request is being performed, + * or null if found in $data + * @param array $headers An associative array of HTTP headers + * for this request + * @param string $body The body of the HTTP request + * @param string $contentType The value for the content type of the + * request body + * @param int $remainingRedirects Number of redirects to follow + * if requests results in one + * @return Zend_Http_Response The response object + */ + public function performHttpRequest($method, $url, $headers = array(), $body = null, $contentType = null, $remainingRedirects = null) + { + if ($this->_httpClient instanceof Zend_Gdata_HttpClient) { + $filterResult = $this->_httpClient->filterHttpRequest($method, $url, $headers, $body, $contentType); + $method = $filterResult['method']; + $url = $filterResult['url']; + $body = $filterResult['body']; + $headers = $filterResult['headers']; + $contentType = $filterResult['contentType']; + return $this->_httpClient->filterHttpResponse(parent::performHttpRequest($method, $url, $headers, $body, $contentType, $remainingRedirects)); + } else { + return parent::performHttpRequest($method, $url, $headers, $body, $contentType, $remainingRedirects); + } + } + + /** + * Determines whether service object is authenticated. + * + * @return boolean True if service object is authenticated, false otherwise. + */ + public function isAuthenticated() + { + $client = parent::getHttpClient(); + if ($client->getClientLoginToken() || + $client->getAuthSubToken()) { + return true; + } + + return false; + } +} diff --git a/libs/Zend/Gdata/App.php b/libs/Zend/Gdata/App.php new file mode 100644 index 0000000..d90950f --- /dev/null +++ b/libs/Zend/Gdata/App.php @@ -0,0 +1,1067 @@ += 1 is considered valid. + * + * Under most circumtances, this will be automatically set by + * Zend_Gdata_App subclasses. + * + * @see setMajorProtocolVersion() + * @see getMajorProtocolVersion() + */ + protected $_majorProtocolVersion; + + /** + * Indicates the minor protocol version that should be used. Can be set + * to either an integer >= 0, or NULL if no minor version should be sent + * to the server. + * + * At present, this field is not used by any Google services, but may be + * used in the future. + * + * Under most circumtances, this will be automatically set by + * Zend_Gdata_App subclasses. + * + * @see setMinorProtocolVersion() + * @see getMinorProtocolVersion() + */ + protected $_minorProtocolVersion; + + /** + * Create Gdata object + * + * @param Zend_Http_Client $client + * @param string $applicationId + */ + public function __construct($client = null, $applicationId = 'MyCompany-MyApp-1.0') + { + $this->setHttpClient($client, $applicationId); + // Set default protocol version. Subclasses should override this as + // needed once a given service supports a new version. + $this->setMajorProtocolVersion(self::DEFAULT_MAJOR_PROTOCOL_VERSION); + $this->setMinorProtocolVersion(self::DEFAULT_MINOR_PROTOCOL_VERSION); + } + + /** + * Adds a Zend Framework package to the $_registeredPackages array. + * This array is searched when using the magic __call method below + * to instantiante new objects. + * + * @param string $name The name of the package (eg Zend_Gdata_App) + * @return void + */ + public function registerPackage($name) + { + array_unshift($this->_registeredPackages, $name); + } + + /** + * Retreive feed object + * + * @param string $uri The uri from which to retrieve the feed + * @param string $className The class which is used as the return type + * @return Zend_Gdata_App_Feed + */ + public function getFeed($uri, $className='Zend_Gdata_App_Feed') + { + return $this->importUrl($uri, $className); + } + + /** + * Retreive entry object + * + * @param string $uri + * @param string $className The class which is used as the return type + * @return Zend_Gdata_App_Entry + */ + public function getEntry($uri, $className='Zend_Gdata_App_Entry') + { + return $this->importUrl($uri, $className); + } + + /** + * Get the Zend_Http_Client object used for communication + * + * @return Zend_Http_Client + */ + public function getHttpClient() + { + return $this->_httpClient; + } + + /** + * Set the Zend_Http_Client object used for communication + * + * @param Zend_Http_Client $client The client to use for communication + * @throws Zend_Gdata_App_HttpException + * @return Zend_Gdata_App Provides a fluent interface + */ + public function setHttpClient($client, $applicationId = 'MyCompany-MyApp-1.0') + { + if ($client === null) { + $client = new Zend_Http_Client(); + } + if (!$client instanceof Zend_Http_Client) { + require_once 'Zend/Gdata/App/HttpException.php'; + throw new Zend_Gdata_App_HttpException('Argument is not an instance of Zend_Http_Client.'); + } + $userAgent = $applicationId . ' Zend_Framework_Gdata/' . Zend_Version::VERSION; + $client->setHeaders('User-Agent', $userAgent); + $client->setConfig(array( + 'strictredirects' => true + ) + ); + $this->_httpClient = $client; + Zend_Gdata::setStaticHttpClient($client); + return $this; + } + + /** + * Set the static HTTP client instance + * + * Sets the static HTTP client object to use for retrieving the feed. + * + * @param Zend_Http_Client $httpClient + * @return void + */ + public static function setStaticHttpClient(Zend_Http_Client $httpClient) + { + self::$_staticHttpClient = $httpClient; + } + + + /** + * Gets the HTTP client object. If none is set, a new Zend_Http_Client will be used. + * + * @return Zend_Http_Client + */ + public static function getStaticHttpClient() + { + if (!self::$_staticHttpClient instanceof Zend_Http_Client) { + $client = new Zend_Http_Client(); + $userAgent = 'Zend_Framework_Gdata/' . Zend_Version::VERSION; + $client->setHeaders('User-Agent', $userAgent); + $client->setConfig(array( + 'strictredirects' => true + ) + ); + self::$_staticHttpClient = $client; + } + return self::$_staticHttpClient; + } + + /** + * Toggle using POST instead of PUT and DELETE HTTP methods + * + * Some feed implementations do not accept PUT and DELETE HTTP + * methods, or they can't be used because of proxies or other + * measures. This allows turning on using POST where PUT and + * DELETE would normally be used; in addition, an + * X-Method-Override header will be sent with a value of PUT or + * DELETE as appropriate. + * + * @param boolean $override Whether to override PUT and DELETE with POST. + * @return void + */ + public static function setHttpMethodOverride($override = true) + { + self::$_httpMethodOverride = $override; + } + + /** + * Get the HTTP override state + * + * @return boolean + */ + public static function getHttpMethodOverride() + { + return self::$_httpMethodOverride; + } + + /** + * Toggle requesting gzip encoded responses + * + * @param boolean $enabled Whether or not to enable gzipped responses + * @return void + */ + public static function setGzipEnabled($enabled = false) + { + if ($enabled && !function_exists('gzinflate')) { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'You cannot enable gzipped responses if the zlib module ' . + 'is not enabled in your PHP installation.'); + + } + self::$_gzipEnabled = $enabled; + } + + /** + * Get the HTTP override state + * + * @return boolean + */ + public static function getGzipEnabled() + { + return self::$_gzipEnabled; + } + + /** + * Get whether to use verbose exception messages + * + * In the case of HTTP errors, use the body of the HTTP response + * in the exception message. + * + * @return boolean + */ + public static function getVerboseExceptionMessages() + { + return self::$_verboseExceptionMessages; + } + + /** + * Set whether to use verbose exception messages + * + * In the case of HTTP errors, use the body of the HTTP response + * in the exception message. + * + * @param boolean $verbose Whether to use verbose exception messages + */ + public static function setVerboseExceptionMessages($verbose) + { + self::$_verboseExceptionMessages = $verbose; + } + + /** + * Set the maximum number of redirects to follow during HTTP operations + * + * @param int $maxRedirects Maximum number of redirects to follow + * @return void + */ + public static function setMaxRedirects($maxRedirects) + { + self::$_maxRedirects = $maxRedirects; + } + + /** + * Get the maximum number of redirects to follow during HTTP operations + * + * @return int Maximum number of redirects to follow + */ + public static function getMaxRedirects() + { + return self::$_maxRedirects; + } + + /** + * Set the major protocol version that should be used. Values < 1 will + * cause a Zend_Gdata_App_InvalidArgumentException to be thrown. + * + * @see _majorProtocolVersion + * @param int $value The major protocol version to use. + * @throws Zend_Gdata_App_InvalidArgumentException + */ + public function setMajorProtocolVersion($value) + { + if (!($value >= 1)) { + require_once('Zend/Gdata/App/InvalidArgumentException.php'); + throw new Zend_Gdata_App_InvalidArgumentException( + 'Major protocol version must be >= 1'); + } + $this->_majorProtocolVersion = $value; + } + + /** + * Get the major protocol version that is in use. + * + * @see _majorProtocolVersion + * @return int The major protocol version in use. + */ + public function getMajorProtocolVersion() + { + return $this->_majorProtocolVersion; + } + + /** + * Set the minor protocol version that should be used. If set to NULL, no + * minor protocol version will be sent to the server. Values < 0 will + * cause a Zend_Gdata_App_InvalidArgumentException to be thrown. + * + * @see _minorProtocolVersion + * @param (int|NULL) $value The minor protocol version to use. + * @throws Zend_Gdata_App_InvalidArgumentException + */ + public function setMinorProtocolVersion($value) + { + if (!($value >= 0)) { + require_once('Zend/Gdata/App/InvalidArgumentException.php'); + throw new Zend_Gdata_App_InvalidArgumentException( + 'Minor protocol version must be >= 0'); + } + $this->_minorProtocolVersion = $value; + } + + /** + * Get the minor protocol version that is in use. + * + * @see _minorProtocolVersion + * @return (int|NULL) The major protocol version in use, or NULL if no + * minor version is specified. + */ + public function getMinorProtocolVersion() + { + return $this->_minorProtocolVersion; + } + + /** + * Provides pre-processing for HTTP requests to APP services. + * + * 1. Checks the $data element and, if it's an entry, extracts the XML, + * multipart data, edit link (PUT,DELETE), etc. + * 2. If $data is a string, sets the default content-type header as + * 'application/atom+xml' if it's not already been set. + * 3. Adds a x-http-method override header and changes the HTTP method + * to 'POST' if necessary as per getHttpMethodOverride() + * + * @param string $method The HTTP method for the request - 'GET', 'POST', + * 'PUT', 'DELETE' + * @param string $url The URL to which this request is being performed, + * or null if found in $data + * @param array $headers An associative array of HTTP headers for this + * request + * @param mixed $data The Zend_Gdata_App_Entry or XML for the + * body of the request + * @param string $contentTypeOverride The override value for the + * content type of the request body + * @return array An associative array containing the determined + * 'method', 'url', 'data', 'headers', 'contentType' + */ + public function prepareRequest($method, + $url = null, + $headers = array(), + $data = null, + $contentTypeOverride = null) + { + // As a convenience, if $headers is null, we'll convert it back to + // an empty array. + if (is_null($headers)) { + $headers = array(); + } + + $rawData = null; + $finalContentType = null; + if ($url == null) { + $url = $this->_defaultPostUri; + } + + if (is_string($data)) { + $rawData = $data; + if ($contentTypeOverride === null) { + $finalContentType = 'application/atom+xml'; + } + } elseif ($data instanceof Zend_Gdata_App_MediaEntry) { + $rawData = $data->encode(); + if ($data->getMediaSource() !== null) { + $finalContentType = 'multipart/related; boundary="' . $data->getBoundary() . '"'; + $headers['MIME-version'] = '1.0'; + $headers['Slug'] = $data->getMediaSource()->getSlug(); + } else { + $finalContentType = 'application/atom+xml'; + } + if ($method == 'PUT' || $method == 'DELETE') { + $editLink = $data->getEditLink(); + if ($editLink != null) { + $url = $editLink->getHref(); + } + } + } elseif ($data instanceof Zend_Gdata_App_Entry) { + $rawData = $data->saveXML(); + $finalContentType = 'application/atom+xml'; + if ($method == 'PUT' || $method == 'DELETE') { + $editLink = $data->getEditLink(); + if ($editLink != null) { + $url = $editLink->getHref(); + } + } + } elseif ($data instanceof Zend_Gdata_App_MediaSource) { + $rawData = $data->encode(); + if ($data->getSlug() !== null) { + $headers['Slug'] = $data->getSlug(); + } + $finalContentType = $data->getContentType(); + } + + if ($method == 'DELETE') { + $rawData = null; + } + + // Set an If-Match header if: + // - This isn't a DELETE + // - If this isn't a GET, the Etag isn't weak + // - A similar header (If-Match/If-None-Match) hasn't already been + // set. + if ($method != 'DELETE' && ( + !array_key_exists('If-Match', $headers) && + !array_key_exists('If-None-Match', $headers) + ) ) { + $allowWeak = $method == 'GET'; + if ($ifMatchHeader = $this->generateIfMatchHeaderData( + $data, $allowWeak)) { + $headers['If-Match'] = $ifMatchHeader; + } + } + + if ($method != 'POST' && $method != 'GET' && Zend_Gdata_App::getHttpMethodOverride()) { + $headers['x-http-method-override'] = $method; + $method = 'POST'; + } else { + $headers['x-http-method-override'] = null; + } + + if ($contentTypeOverride != null) { + $finalContentType = $contentTypeOverride; + } + + return array('method' => $method, 'url' => $url, 'data' => $rawData, 'headers' => $headers, 'contentType' => $finalContentType); + } + + /** + * Performs a HTTP request using the specified method + * + * @param string $method The HTTP method for the request - 'GET', 'POST', + * 'PUT', 'DELETE' + * @param string $url The URL to which this request is being performed + * @param array $headers An associative array of HTTP headers + * for this request + * @param string $body The body of the HTTP request + * @param string $contentType The value for the content type + * of the request body + * @param int $remainingRedirects Number of redirects to follow if request + * s results in one + * @return Zend_Http_Response The response object + */ + public function performHttpRequest($method, $url, $headers = null, $body = null, $contentType = null, $remainingRedirects = null) + { + require_once 'Zend/Http/Client/Exception.php'; + if ($remainingRedirects === null) { + $remainingRedirects = self::getMaxRedirects(); + } + if ($headers === null) { + $headers = array(); + } + // Append a Gdata version header if protocol v2 or higher is in use. + // (Protocol v1 does not use this header.) + $major = $this->getMajorProtocolVersion(); + $minor = $this->getMinorProtocolVersion(); + if ($major >= 2) { + $headers['GData-Version'] = $major + + (is_null($minor) ? '.' + $minor : ''); + } + + // check the overridden method + if (($method == 'POST' || $method == 'PUT') && $body === null && $headers['x-http-method-override'] != 'DELETE') { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'You must specify the data to post as either a ' . + 'string or a child of Zend_Gdata_App_Entry'); + } + if ($url === null) { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException('You must specify an URI to which to post.'); + } + $headers['Content-Type'] = $contentType; + if (Zend_Gdata_App::getGzipEnabled()) { + // some services require the word 'gzip' to be in the user-agent header + // in addition to the accept-encoding header + if (strpos($this->_httpClient->getHeader('User-Agent'), 'gzip') === false) { + $headers['User-Agent'] = $this->_httpClient->getHeader('User-Agent') . ' (gzip)'; + } + $headers['Accept-encoding'] = 'gzip, deflate'; + } else { + $headers['Accept-encoding'] = 'identity'; + } + + // Make sure the HTTP client object is 'clean' before making a request + // In addition to standard headers to reset via resetParameters(), + // also reset the Slug header + $this->_httpClient->resetParameters(); + $this->_httpClient->setHeaders('Slug', null); + + // Set the params for the new request to be performed + $this->_httpClient->setHeaders($headers); + $this->_httpClient->setUri($url); + $this->_httpClient->setConfig(array('maxredirects' => 0)); + $this->_httpClient->setRawData($body, $contentType); + try { + $response = $this->_httpClient->request($method); + } catch (Zend_Http_Client_Exception $e) { + require_once 'Zend/Gdata/App/HttpException.php'; + throw new Zend_Gdata_App_HttpException($e->getMessage(), $e); + } + if ($response->isRedirect() && $response->getStatus() != '304') { + if ($remainingRedirects > 0) { + $newUrl = $response->getHeader('Location'); + $response = $this->performHttpRequest($method, $newUrl, $headers, $body, $contentType, $remainingRedirects); + } else { + require_once 'Zend/Gdata/App/HttpException.php'; + throw new Zend_Gdata_App_HttpException( + 'Number of redirects exceeds maximum', null, $response); + } + } + if (!$response->isSuccessful()) { + require_once 'Zend/Gdata/App/HttpException.php'; + $exceptionMessage = 'Expected response code 200, got ' . $response->getStatus(); + if (self::getVerboseExceptionMessages()) { + $exceptionMessage .= "\n" . $response->getBody(); + } + $exception = new Zend_Gdata_App_HttpException($exceptionMessage); + $exception->setResponse($response); + throw $exception; + } + return $response; + } + + /** + * Imports a feed located at $uri. + * + * @param string $uri + * @param Zend_Http_Client $client The client used for communication + * @param string $className The class which is used as the return type + * @throws Zend_Gdata_App_Exception + * @return Zend_Gdata_App_Feed + */ + public static function import($uri, $client = null, $className='Zend_Gdata_App_Feed') + { + $app = new Zend_Gdata_App($client); + $requestData = $app->prepareRequest('GET', $uri); + $response = $app->performHttpRequest($requestData['method'], $requestData['url']); + + $feedContent = $response->getBody(); + $feed = self::importString($feedContent, $className); + if ($client != null) { + $feed->setHttpClient($client); + } + return $feed; + } + + /** + * Imports the specified URL (non-statically). + * + * @param string $url The URL to import + * @param string $className The class which is used as the return type + * @param array $extraHeaders Extra headers to add to the request, as an + * array of string-based key/value pairs. + * @throws Zend_Gdata_App_Exception + * @return Zend_Gdata_App_Feed + */ + public function importUrl($url, $className='Zend_Gdata_App_Feed', $extraHeaders = array()) + { + $response = $this->get($url, $extraHeaders); + + $feedContent = $response->getBody(); + $feed = self::importString($feedContent, $className); + + $etag = $response->getHeader('ETag'); + if (!is_null($etag)) { + $feed->setEtag($etag); + } + + if ($this->getHttpClient() != null) { + $feed->setHttpClient($this->getHttpClient()); + } + return $feed; + } + + + /** + * Imports a feed represented by $string. + * + * @param string $string + * @param string $className The class which is used as the return type + * @throws Zend_Gdata_App_Exception + * @return Zend_Gdata_App_Feed + */ + public static function importString($string, $className='Zend_Gdata_App_Feed') + { + // Load the feed as an XML DOMDocument object + @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'; + throw new Zend_Gdata_App_Exception("DOMDocument cannot parse XML: $php_errormsg"); + } + $feed = new $className($string); + $feed->setHttpClient(self::getstaticHttpClient()); + return $feed; + } + + + /** + * Imports a feed from a file located at $filename. + * + * @param string $filename + * @param string $className The class which is used as the return type + * @param string $useIncludePath Whether the include_path should be searched + * @throws Zend_Gdata_App_Exception + * @return Zend_Gdata_Feed + */ + public static function importFile($filename, + $className='Zend_Gdata_App_Feed', $useIncludePath = false) + { + @ini_set('track_errors', 1); + $feed = @file_get_contents($filename, $useIncludePath); + @ini_restore('track_errors'); + if ($feed === false) { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception("File could not be loaded: $php_errormsg"); + } + return self::importString($feed, $className); + } + + /** + * GET a URI using client object. + * + * @param string $uri GET URI + * @param array $extraHeaders Extra headers to add to the request, as an + * array of string-based key/value pairs. + * @throws Zend_Gdata_App_HttpException + * @return Zend_Http_Response + */ + public function get($uri, $extraHeaders = array()) + { + $requestData = $this->prepareRequest('GET', $uri, $extraHeaders); + return $this->performHttpRequest($requestData['method'], $requestData['url'], $requestData['headers']); + } + + /** + * POST data with client object + * + * @param mixed $data The Zend_Gdata_App_Entry or XML to post + * @param string $uri POST URI + * @param array $headers Additional HTTP headers to insert. + * @param string $contentType Content-type of the data + * @param array $extraHeaders Extra headers to add to the request, as an + * array of string-based key/value pairs. + * @return Zend_Http_Response + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_App_InvalidArgumentException + */ + public function post($data, $uri = null, $remainingRedirects = null, + $contentType = null, $extraHeaders = null) + { + $requestData = $this->prepareRequest('POST', $uri, $extraHeaders, + $data, $contentType); + return $this->performHttpRequest( + $requestData['method'], $requestData['url'], + $requestData['headers'], $requestData['data'], + $requestData['contentType']); + } + + /** + * PUT data with client object + * + * @param mixed $data The Zend_Gdata_App_Entry or XML to post + * @param string $uri PUT URI + * @param array $headers Additional HTTP headers to insert. + * @param string $contentType Content-type of the data + * @param array $extraHeaders Extra headers to add to the request, as an + * array of string-based key/value pairs. + * @return Zend_Http_Response + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_App_InvalidArgumentException + */ + public function put($data, $uri = null, $remainingRedirects = null, + $contentType = null, $extraHeaders = null) + { + $requestData = $this->prepareRequest('PUT', $uri, $extraHeaders, $data, $contentType); + return $this->performHttpRequest( + $requestData['method'], $requestData['url'], + $requestData['headers'], $requestData['data'], + $requestData['contentType']); + } + + /** + * DELETE entry with client object + * + * @param mixed $data The Zend_Gdata_App_Entry or URL to delete + * @return void + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_App_InvalidArgumentException + */ + public function delete($data, $remainingRedirects = null) + { + if (is_string($data)) { + $requestData = $this->prepareRequest('DELETE', $data); + } else { + $headers = array(); + + $requestData = $this->prepareRequest('DELETE', null, $headers, $data); + } + return $this->performHttpRequest($requestData['method'], + $requestData['url'], + $requestData['headers'], + '', + $requestData['contentType'], + $remainingRedirects); + } + + /** + * Inserts an entry to a given URI and returns the response as a fully formed Entry. + * @param mixed $data The Zend_Gdata_App_Entry or XML to post + * @param string $uri POST URI + * @param string $className The class of entry to be returned. + * @param array $extraHeaders Extra headers to add to the request, as an + * array of string-based key/value pairs. + * @return Zend_Gdata_App_Entry The entry returned by the service after insertion. + */ + public function insertEntry($data, $uri, $className='Zend_Gdata_App_Entry', $extraHeaders = array()) + { + $response = $this->post($data, $uri, null, null, $extraHeaders); + + $returnEntry = new $className($response->getBody()); + $returnEntry->setHttpClient(self::getstaticHttpClient()); + + $etag = $response->getHeader('ETag'); + if (!is_null($etag)) { + $returnEntry->setEtag($etag); + } + + return $returnEntry; + } + + /** + * Update an entry + * + * @param mixed $data Zend_Gdata_App_Entry or XML (w/ID and link rel='edit') + * @param string|null The URI to send requests to, or null if $data + * contains the URI. + * @param string|null The name of the class that should be deserialized + * from the server response. If null, then 'Zend_Gdata_App_Entry' + * will be used. + * @param array $extraHeaders Extra headers to add to the request, as an + * array of string-based key/value pairs. + * @return Zend_Gdata_App_Entry The entry returned from the server + * @throws Zend_Gdata_App_Exception + */ + public function updateEntry($data, $uri = null, $className = null, $extraHeaders = array()) + { + if ($className === null && $data instanceof Zend_Gdata_App_Entry) { + $className = get_class($data); + } elseif ($className === null) { + $className = 'Zend_Gdata_App_Entry'; + } + + $response = $this->put($data, $uri, null, null, $extraHeaders); + $returnEntry = new $className($response->getBody()); + $returnEntry->setHttpClient(self::getstaticHttpClient()); + + $etag = $response->getHeader('ETag'); + if (!is_null($etag)) { + $returnEntry->setEtag($etag); + } + + return $returnEntry; + } + + /** + * Provides a magic factory method to instantiate new objects with + * shorter syntax than would otherwise be required by the Zend Framework + * naming conventions. For instance, to construct a new + * Zend_Gdata_Calendar_Extension_Color, a developer simply needs to do + * $gCal->newColor(). For this magic constructor, packages are searched + * in the same order as which they appear in the $_registeredPackages + * array + * + * @param string $method The method name being called + * @param array $args The arguments passed to the call + * @throws Zend_Gdata_App_Exception + */ + public function __call($method, $args) + { + if (preg_match('/^new(\w+)/', $method, $matches)) { + $class = $matches[1]; + $foundClassName = null; + foreach ($this->_registeredPackages as $name) { + try { + @Zend_Loader::loadClass("${name}_${class}"); + $foundClassName = "${name}_${class}"; + break; + } catch (Zend_Exception $e) { + // package wasn't here- continue searching + } + } + if ($foundClassName != null) { + $reflectionObj = new ReflectionClass($foundClassName); + $instance = $reflectionObj->newInstanceArgs($args); + if ($instance instanceof Zend_Gdata_App_FeedEntryParent) { + $instance->setHttpClient($this->_httpClient); + } + return $instance; + } else { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception( + "Unable to find '${class}' in registered packages"); + } + } else { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception("No such method ${method}"); + } + } + + /** + * Retrieve all entries for a feed, iterating through pages as necessary. + * Be aware that calling this function on a large dataset will take a + * significant amount of time to complete. In some cases this may cause + * execution to timeout without proper precautions in place. + * + * @param $feed The feed to iterate through. + * @return mixed A new feed of the same type as the one originally + * passed in, containing all relevent entries. + */ + public function retrieveAllEntriesForFeed($feed) { + $feedClass = get_class($feed); + $reflectionObj = new ReflectionClass($feedClass); + $result = $reflectionObj->newInstance(); + do { + foreach ($feed as $entry) { + $result->addEntry($entry); + } + + $next = $feed->getLink('next'); + if ($next !== null) { + $feed = $this->getFeed($next->href, $feedClass); + } else { + $feed = null; + } + } + while ($feed != null); + return $result; + } + + /** + * This method enables logging of requests by changing the + * Zend_Http_Client_Adapter used for performing the requests. + * NOTE: This will not work if you have customized the adapter + * already to use a proxy server or other interface. + * + * @param $logfile The logfile to use when logging the requests + */ + public function enableRequestDebugLogging($logfile) + { + $this->_httpClient->setConfig(array( + 'adapter' => 'Zend_Gdata_App_LoggingHttpClientAdapterSocket', + 'logfile' => $logfile + )); + } + + /** + * Retrieve next set of results based on a given feed. + * + * @param Zend_Gdata_App_Feed $feed The feed from which to + * retreive the next set of results. + * @param string $className (optional) The class of feed to be returned. + * If null, the next feed (if found) will be the same class as + * the feed that was given as the first argument. + * @return Zend_Gdata_App_Feed|null Returns a + * Zend_Gdata_App_Feed or null if no next set of results + * exists. + */ + public function getNextFeed($feed, $className = null) + { + $nextLink = $feed->getNextLink(); + if (!$nextLink) { + return null; + } + $nextLinkHref = $nextLink->getHref(); + + if (is_null($className)) { + $className = get_class($feed); + } + + return $this->getFeed($nextLinkHref, $className); + } + + /** + * Retrieve previous set of results based on a given feed. + * + * @param Zend_Gdata_App_Feed $feed The feed from which to + * retreive the previous set of results. + * @param string $className (optional) The class of feed to be returned. + * If null, the previous feed (if found) will be the same class as + * the feed that was given as the first argument. + * @return Zend_Gdata_App_Feed|null Returns a + * Zend_Gdata_App_Feed or null if no previous set of results + * exists. + */ + public function getPreviousFeed($feed, $className = null) + { + $previousLink = $feed->getPreviousLink(); + if (!$previousLink) { + return null; + } + $previousLinkHref = $previousLink->getHref(); + + if (is_null($className)) { + $className = get_class($feed); + } + + return $this->getFeed($previousLinkHref, $className); + } + + /** + * Returns the data for an If-Match header based on the current Etag + * property. If Etags are not supported by the server or cannot be + * extracted from the data, then null will be returned. + * + * @param boolean $allowWeak If false, then if a weak Etag is detected, + * then return null rather than the Etag. + * @return string|null $data + */ + public function generateIfMatchHeaderData($data, $allowWeek) + { + $result = ''; + // Set an If-Match header if an ETag has been set (version >= 2 only) + if ($this->_majorProtocolVersion >= 2 && + $data instanceof Zend_Gdata_App_Entry) { + $etag = $data->getEtag(); + if (!is_null($etag) && + ($allowWeek || substr($etag, 0, 2) != 'W/')) { + $result = $data->getEtag(); + } + } + return $result; + } + +} diff --git a/libs/Zend/Gdata/App/AuthException.php b/libs/Zend/Gdata/App/AuthException.php new file mode 100644 index 0000000..24510dd --- /dev/null +++ b/libs/Zend/Gdata/App/AuthException.php @@ -0,0 +1,40 @@ + array( + 1 => array( + 0 => 'http://www.w3.org/2005/Atom' + ) + ), + 'app' => array( + 1 => array( + 0 => 'http://purl.org/atom/app#' + ), + 2 => array( + 0 => 'http://www.w3.org/2007/app' + ) + ) + ); + + public function __construct() + { + } + + /** + * Returns the child text node of this element + * This represents any raw text contained within the XML element + * + * @return string Child text node + */ + public function getText($trim = true) + { + if ($trim) { + return trim($this->_text); + } else { + return $this->_text; + } + } + + /** + * Sets the child text node of this element + * This represents any raw text contained within the XML element + * + * @param string $value Child text node + * @return Zend_Gdata_App_Base Returns an object of the same type as 'this' to provide a fluent interface. + */ + public function setText($value) + { + $this->_text = $value; + return $this; + } + + /** + * Returns an array of all elements not matched to data model classes + * during the parsing of the XML + * + * @return array All elements not matched to data model classes during parsing + */ + public function getExtensionElements() + { + return $this->_extensionElements; + } + + /** + * Sets an array of all elements not matched to data model classes + * during the parsing of the XML. This method can be used to add arbitrary + * child XML elements to any data model class. + * + * @param array $value All extension elements + * @return Zend_Gdata_App_Base Returns an object of the same type as 'this' to provide a fluent interface. + */ + public function setExtensionElements($value) + { + $this->_extensionElements = $value; + return $this; + } + + /** + * Returns an array of all extension attributes not transformed into data + * model properties during parsing of the XML. Each element of the array + * is a hashed array of the format: + * array('namespaceUri' => string, 'name' => string, 'value' => string); + * + * @return array All extension attributes + */ + public function getExtensionAttributes() + { + return $this->_extensionAttributes; + } + + /** + * Sets an array of all extension attributes not transformed into data + * model properties during parsing of the XML. Each element of the array + * is a hashed array of the format: + * array('namespaceUri' => string, 'name' => string, 'value' => string); + * This can be used to add arbitrary attributes to any data model element + * + * @param array $value All extension attributes + * @return Zend_Gdata_App_Base Returns an object of the same type as 'this' to provide a fluent interface. + */ + public function setExtensionAttributes($value) + { + $this->_extensionAttributes = $value; + return $this; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + if (is_null($doc)) { + $doc = new DOMDocument('1.0', 'utf-8'); + } + if ($this->_rootNamespaceURI != null) { + $element = $doc->createElementNS($this->_rootNamespaceURI, $this->_rootElement); + } elseif ($this->_rootNamespace !== null) { + if (strpos($this->_rootElement, ':') === false) { + $elementName = $this->_rootNamespace . ':' . $this->_rootElement; + } else { + $elementName = $this->_rootElement; + } + $element = $doc->createElementNS($this->lookupNamespace($this->_rootNamespace), $elementName); + } else { + $element = $doc->createElement($this->_rootElement); + } + if ($this->_text != null) { + $element->appendChild($element->ownerDocument->createTextNode($this->_text)); + } + foreach ($this->_extensionElements as $extensionElement) { + $element->appendChild($extensionElement->getDOM($element->ownerDocument)); + } + foreach ($this->_extensionAttributes as $attribute) { + $element->setAttribute($attribute['name'], $attribute['value']); + } + return $element; + } + + /** + * Given a child DOMNode, tries to determine how to map the data into + * object instance members. If no mapping is defined, Extension_Element + * objects are created and stored in an array. + * + * @param DOMNode $child The DOMNode needed to be handled + */ + protected function takeChildFromDOM($child) + { + if ($child->nodeType == XML_TEXT_NODE) { + $this->_text = $child->nodeValue; + } else { + $extensionElement = new Zend_Gdata_App_Extension_Element(); + $extensionElement->transferFromDOM($child); + $this->_extensionElements[] = $extensionElement; + } + } + + /** + * Given a DOMNode representing an attribute, tries to map the data into + * instance members. If no mapping is defined, the name and value are + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + $arrayIndex = ($attribute->namespaceURI != '')?( + $attribute->namespaceURI . ':' . $attribute->name): + $attribute->name; + $this->_extensionAttributes[$arrayIndex] = + array('namespaceUri' => $attribute->namespaceURI, + 'name' => $attribute->localName, + 'value' => $attribute->nodeValue); + } + + /** + * Transfers each child and attribute into member variables. + * This is called when XML is received over the wire and the data + * model needs to be built to represent this XML. + * + * @param DOMNode $node The DOMNode that represents this object's data + */ + public function transferFromDOM($node) + { + foreach ($node->childNodes as $child) { + $this->takeChildFromDOM($child); + } + foreach ($node->attributes as $attribute) { + $this->takeAttributeFromDOM($attribute); + } + } + + /** + * Parses the provided XML text and generates data model classes for + * each know element by turning the XML text into a DOM tree and calling + * transferFromDOM($element). The first data model element with the same + * name as $this->_rootElement is used and the child elements are + * recursively parsed. + * + * @param string $xml The XML text to parse + */ + public function transferFromXML($xml) + { + if ($xml) { + // Load the feed as an XML DOMDocument object + @ini_set('track_errors', 1); + $doc = new DOMDocument(); + $success = @$doc->loadXML($xml); + @ini_restore('track_errors'); + if (!$success) { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception("DOMDocument cannot parse XML: $php_errormsg"); + } + $element = $doc->getElementsByTagName($this->_rootElement)->item(0); + if (!$element) { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception('No root <' . $this->_rootElement . '> element'); + } + $this->transferFromDOM($element); + } else { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception('XML passed to transferFromXML cannot be null'); + } + } + + /** + * Converts this element and all children into XML text using getDOM() + * + * @return string XML content + */ + public function saveXML() + { + $element = $this->getDOM(); + return $element->ownerDocument->saveXML($element); + } + + /** + * Alias for saveXML() returns XML content for this element and all + * children + * + * @return string XML content + */ + public function getXML() + { + return $this->saveXML(); + } + + /** + * Alias for saveXML() + * + * Can be overridden by children to provide more complex representations + * of entries. + * + * @return string Encoded string content + */ + public function encode() + { + return $this->saveXML(); + } + + /** + * Get the full version of a namespace prefix + * + * Looks up a prefix (atom:, etc.) in the list of registered + * namespaces and returns the full namespace URI if + * available. Returns the prefix, unmodified, if it's not + * registered. + * + * @param string $prefix The namespace prefix to lookup. + * @param integer $majorVersion The major protocol version in effect. + * Defaults to '1'. + * @param integer $minorVersion The minor protocol version in effect. + * Defaults to null (use latest). + * @return string + */ + public function lookupNamespace($prefix, + $majorVersion = 1, + $minorVersion = null) + { + // If no match, return the prefix by default + $result = $prefix; + + // Find tuple of keys that correspond to the namespace we should use + if (isset($this->_namespaces[$prefix])) { + // Major version search + $nsData = $this->_namespaces[$prefix]; + $foundMajorV = Zend_Gdata_App_Util::findGreatestBoundedValue( + $majorVersion, $nsData); + // Minor version search + $nsData = $nsData[$foundMajorV]; + $foundMinorV = Zend_Gdata_App_Util::findGreatestBoundedValue( + $minorVersion, $nsData); + // Extract NS + $result = $nsData[$foundMinorV]; + } + + return $result; + } + + /** + * Add a namespace and prefix to the registered list + * + * Takes a prefix and a full namespace URI and adds them to the + * list of registered namespaces for use by + * $this->lookupNamespace(). + * + * @param string $prefix The namespace prefix + * @param string $namespaceUri The full namespace URI + * @param integer $majorVersion The major protocol version in effect. + * Defaults to '1'. + * @param integer $minorVersion The minor protocol version in effect. + * Defaults to null (use latest). + * @return void + */ + public function registerNamespace($prefix, + $namespaceUri, + $majorVersion = 1, + $minorVersion = null) + { + $this->_namespaces[$prefix][$majorVersion][$minorVersion] = + $namespaceUri; + } + + /** + * Magic getter to allow access like $entry->foo to call $entry->getFoo() + * Alternatively, if no getFoo() is defined, but a $_foo protected variable + * is defined, this is returned. + * + * TODO Remove ability to bypass getFoo() methods?? + * + * @param string $name The variable name sought + */ + public function __get($name) + { + $method = 'get'.ucfirst($name); + if (method_exists($this, $method)) { + return call_user_func(array(&$this, $method)); + } else if (property_exists($this, "_${name}")) { + return $this->{'_' . $name}; + } else { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'Property ' . $name . ' does not exist'); + } + } + + /** + * Magic setter to allow acces like $entry->foo='bar' to call + * $entry->setFoo('bar') automatically. + * + * Alternatively, if no setFoo() is defined, but a $_foo protected variable + * is defined, this is returned. + * + * TODO Remove ability to bypass getFoo() methods?? + * + * @param string $name + * @param string $value + */ + public function __set($name, $val) + { + $method = 'set'.ucfirst($name); + if (method_exists($this, $method)) { + return call_user_func(array(&$this, $method), $val); + } else if (isset($this->{'_' . $name}) || is_null($this->{'_' . $name})) { + $this->{'_' . $name} = $val; + } else { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'Property ' . $name . ' does not exist'); + } + } + + /** + * Magic __isset method + * + * @param string $name + */ + public function __isset($name) + { + $rc = new ReflectionClass(get_class($this)); + $privName = '_' . $name; + if (!($rc->hasProperty($privName))) { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'Property ' . $name . ' does not exist'); + } else { + if (isset($this->{$privName})) { + if (is_array($this->{$privName})) { + if (count($this->{$privName}) > 0) { + return true; + } else { + return false; + } + } else { + return true; + } + } else { + return false; + } + } + } + + /** + * Magic __unset method + * + * @param string $name + */ + public function __unset($name) + { + if (isset($this->{'_' . $name})) { + if (is_array($this->{'_' . $name})) { + $this->{'_' . $name} = array(); + } else { + $this->{'_' . $name} = null; + } + } + } + + /** + * Magic toString method allows using this directly via echo + * Works best in PHP >= 4.2.0 + * + * @return string The text representation of this object + */ + public function __toString() + { + return $this->getText(); + } + +} diff --git a/libs/Zend/Gdata/App/BaseMediaSource.php b/libs/Zend/Gdata/App/BaseMediaSource.php new file mode 100644 index 0000000..2a1b08c --- /dev/null +++ b/libs/Zend/Gdata/App/BaseMediaSource.php @@ -0,0 +1,177 @@ +_contentType; + } + + /** + * Set the content type for the file attached (example image/png) + * + * @param string $value The content type + * @return Zend_Gdata_App_MediaFileSource Provides a fluent interface + */ + public function setContentType($value) + { + $this->_contentType = $value; + return $this; + } + + /** + * 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 + */ + public function getSlug(){ + return $this->_slug; + } + + /** + * 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 + * @return Zend_Gdata_App_MediaSource Provides a fluent interface + */ + public function setSlug($value){ + $this->_slug = $value; + return $this; + } + + + /** + * Magic getter to allow acces like $source->foo to call $source->getFoo() + * Alternatively, if no getFoo() is defined, but a $_foo protected variable + * is defined, this is returned. + * + * TODO Remove ability to bypass getFoo() methods?? + * + * @param string $name The variable name sought + */ + public function __get($name) + { + $method = 'get'.ucfirst($name); + if (method_exists($this, $method)) { + return call_user_func(array(&$this, $method)); + } else if (property_exists($this, "_${name}")) { + return $this->{'_' . $name}; + } else { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'Property ' . $name . ' does not exist'); + } + } + + /** + * Magic setter to allow acces like $source->foo='bar' to call + * $source->setFoo('bar') automatically. + * + * Alternatively, if no setFoo() is defined, but a $_foo protected variable + * is defined, this is returned. + * + * @param string $name + * @param string $value + */ + public function __set($name, $val) + { + $method = 'set'.ucfirst($name); + if (method_exists($this, $method)) { + return call_user_func(array(&$this, $method), $val); + } else if (isset($this->{'_' . $name}) || is_null($this->{'_' . $name})) { + $this->{'_' . $name} = $val; + } else { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'Property ' . $name . ' does not exist'); + } + } + + /** + * Magic __isset method + * + * @param string $name + */ + public function __isset($name) + { + $rc = new ReflectionClass(get_class($this)); + $privName = '_' . $name; + if (!($rc->hasProperty($privName))) { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'Property ' . $name . ' does not exist'); + } else { + if (isset($this->{$privName})) { + if (is_array($this->{$privName})) { + if (count($this->{$privName}) > 0) { + return true; + } else { + return false; + } + } else { + return true; + } + } else { + return false; + } + } + } + +} diff --git a/libs/Zend/Gdata/App/CaptchaRequiredException.php b/libs/Zend/Gdata/App/CaptchaRequiredException.php new file mode 100644 index 0000000..d55912c --- /dev/null +++ b/libs/Zend/Gdata/App/CaptchaRequiredException.php @@ -0,0 +1,92 @@ +captchaToken = $captchaToken; + $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/Entry.php b/libs/Zend/Gdata/App/Entry.php new file mode 100644 index 0000000..9aba349 --- /dev/null +++ b/libs/Zend/Gdata/App/Entry.php @@ -0,0 +1,367 @@ +_content != null) { + $element->appendChild($this->_content->getDOM($element->ownerDocument)); + } + if ($this->_published != null) { + $element->appendChild($this->_published->getDOM($element->ownerDocument)); + } + if ($this->_source != null) { + $element->appendChild($this->_source->getDOM($element->ownerDocument)); + } + if ($this->_summary != null) { + $element->appendChild($this->_summary->getDOM($element->ownerDocument)); + } + if ($this->_control != null) { + $element->appendChild($this->_control->getDOM($element->ownerDocument)); + } + return $element; + } + + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('atom') . ':' . 'content': + $content = new Zend_Gdata_App_Extension_Content(); + $content->transferFromDOM($child); + $this->_content = $content; + break; + case $this->lookupNamespace('atom') . ':' . 'published': + $published = new Zend_Gdata_App_Extension_Published(); + $published->transferFromDOM($child); + $this->_published = $published; + break; + case $this->lookupNamespace('atom') . ':' . 'source': + $source = new Zend_Gdata_App_Extension_Source(); + $source->transferFromDOM($child); + $this->_source = $source; + break; + case $this->lookupNamespace('atom') . ':' . 'summary': + $summary = new Zend_Gdata_App_Extension_Summary(); + $summary->transferFromDOM($child); + $this->_summary = $summary; + break; + case $this->lookupNamespace('app') . ':' . 'control': + $control = new Zend_Gdata_App_Extension_Control(); + $control->transferFromDOM($child); + $this->_control = $control; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + /** + * Uploads changes in this entry to the server using Zend_Gdata_App + * + * @param string|null $uri The URI to send requests to, or null if $data + * contains the URI. + * @param string|null $className The name of the class that should we + * deserializing the server response. If null, then + * 'Zend_Gdata_App_Entry' will be used. + * @param array $extraHeaders Extra headers to add to the request, as an + * array of string-based key/value pairs. + * @return Zend_Gdata_App_Entry The updated entry. + * @throws Zend_Gdata_App_Exception + */ + public function save($uri = null, $className = null, $extraHeaders = array()) + { + return $this->getService()->updateEntry($this, + $uri, + $className, + $extraHeaders); + } + + /** + * Deletes this entry to the server using the referenced + * Zend_Http_Client to do a HTTP DELETE to the edit link stored in this + * entry's link collection. + * + * @return void + * @throws Zend_Gdata_App_Exception + */ + public function delete() + { + $this->getService()->delete($this); + } + + /** + * Reload the current entry. Returns a new copy of the entry as returned + * by the server, or null if no changes exist. This does not + * modify the current entry instance. + * + * @param string|null The URI to send requests to, or null if $data + * contains the URI. + * @param string|null The name of the class that should we deserializing + * the server response. If null, then 'Zend_Gdata_App_Entry' will + * be used. + * @param array $extraHeaders Extra headers to add to the request, as an + * array of string-based key/value pairs. + * @return mixed A new instance of the current entry with updated data, or + * null if the server reports that no changes have been made. + * @throws Zend_Gdata_App_Exception + */ + public function reload($uri = null, $className = null, $extraHeaders = array()) + { + // Get URI + $editLink = $this->getEditLink(); + if (is_null($uri) && $editLink != null) { + $uri = $editLink->getHref(); + } + + // Set classname to current class, if not otherwise set + if (is_null($className)) { + $className = get_class($this); + } + + // Append ETag, if present (Gdata v2 and above, only) and doesn't + // conflict with existing headers + if ($this->_etag != null + && !array_key_exists('If-Match', $extraHeaders) + && !array_key_exists('If-None-Match', $extraHeaders)) { + $extraHeaders['If-None-Match'] = $this->_etag; + } + + // If an HTTP 304 status (Not Modified)is returned, then we return + // null. + $result = null; + try { + $result = $this->service->importUrl($uri, $className, $extraHeaders); + } catch (Zend_Gdata_App_HttpException $e) { + if ($e->getResponse()->getStatus() != '304') + throw $e; + } + + return $result; + } + + /** + * Gets the value of the atom:content element + * + * @return Zend_Gdata_App_Extension_Content + */ + public function getContent() + { + return $this->_content; + } + + /** + * Sets the value of the atom:content element + * + * @param Zend_Gdata_App_Extension_Content $value + * @return Zend_Gdata_App_Entry Provides a fluent interface + */ + public function setContent($value) + { + $this->_content = $value; + return $this; + } + + /** + * Sets the value of the atom:published element + * This represents the publishing date for an entry + * + * @return Zend_Gdata_App_Extension_Published + */ + public function getPublished() + { + return $this->_published; + } + + /** + * Sets the value of the atom:published element + * This represents the publishing date for an entry + * + * @param Zend_Gdata_App_Extension_Published $value + * @return Zend_Gdata_App_Entry Provides a fluent interface + */ + public function setPublished($value) + { + $this->_published = $value; + return $this; + } + + /** + * Gets the value of the atom:source element + * + * @return Zend_Gdata_App_Extension_Source + */ + public function getSource() + { + return $this->_source; + } + + /** + * Sets the value of the atom:source element + * + * @param Zend_Gdata_App_Extension_Source $value + * @return Zend_Gdata_App_Entry Provides a fluent interface + */ + public function setSource($value) + { + $this->_source = $value; + return $this; + } + + /** + * Gets the value of the atom:summary element + * This represents a textual summary of this entry's content + * + * @return Zend_Gdata_App_Extension_Summary + */ + public function getSummary() + { + return $this->_summary; + } + + /** + * Sets the value of the atom:summary element + * This represents a textual summary of this entry's content + * + * @param Zend_Gdata_App_Extension_Summary $value + * @return Zend_Gdata_App_Entry Provides a fluent interface + */ + public function setSummary($value) + { + $this->_summary = $value; + return $this; + } + + /** + * Gets the value of the app:control element + * + * @return Zend_Gdata_App_Extension_Control + */ + public function getControl() + { + return $this->_control; + } + + /** + * Sets the value of the app:control element + * + * @param Zend_Gdata_App_Extension_Control $value + * @return Zend_Gdata_App_Entry Provides a fluent interface + */ + public function setControl($value) + { + $this->_control = $value; + return $this; + } + +} diff --git a/libs/Zend/Gdata/App/Exception.php b/libs/Zend/Gdata/App/Exception.php new file mode 100644 index 0000000..7c3c417 --- /dev/null +++ b/libs/Zend/Gdata/App/Exception.php @@ -0,0 +1,41 @@ +_term = $term; + $this->_scheme = $scheme; + $this->_label = $label; + } + + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_term !== null) { + $element->setAttribute('term', $this->_term); + } + if ($this->_scheme !== null) { + $element->setAttribute('scheme', $this->_scheme); + } + if ($this->_label !== null) { + $element->setAttribute('label', $this->_label); + } + return $element; + } + + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'term': + $this->_term = $attribute->nodeValue; + break; + case 'scheme': + $this->_scheme = $attribute->nodeValue; + break; + case 'label': + $this->_label = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * @return string|null + */ + public function getTerm() + { + return $this->_term; + } + + /** + * @param string|null $value + * @return Zend_Gdata_App_Extension_Category Provides a fluent interface + */ + public function setTerm($value) + { + $this->_term = $value; + return $this; + } + + /** + * @return string|null + */ + public function getScheme() + { + return $this->_scheme; + } + + /** + * @param string|null $value + * @return Zend_Gdata_App_Extension_Category Provides a fluent interface + */ + public function setScheme($value) + { + $this->_scheme = $value; + return $this; + } + + /** + * @return string|null + */ + public function getLabel() + { + return $this->_label; + } + + /** + * @param string|null $value + * @return Zend_Gdata_App_Extension_Category Provides a fluent interface + */ + public function setLabel($value) + { + $this->_label = $value; + return $this; + } + +} diff --git a/libs/Zend/Gdata/App/Extension/Content.php b/libs/Zend/Gdata/App/Extension/Content.php new file mode 100644 index 0000000..c497fc7 --- /dev/null +++ b/libs/Zend/Gdata/App/Extension/Content.php @@ -0,0 +1,86 @@ +_src = $src; + } + + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_src !== null) { + $element->setAttribute('src', $this->_src); + } + return $element; + } + + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'src': + $this->_src = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * @return Zend_Gdata_App_Extension_Src + */ + public function getSrc() + { + return $this->_src; + } + + /** + * @param Zend_Gdata_App_Extension_Src $value + * @return Zend_Gdata_App_Entry Provides a fluent interface + */ + public function setSrc($value) + { + $this->_src = $value; + return $this; + } + +} diff --git a/libs/Zend/Gdata/App/Extension/Contributor.php b/libs/Zend/Gdata/App/Extension/Contributor.php new file mode 100644 index 0000000..84735a6 --- /dev/null +++ b/libs/Zend/Gdata/App/Extension/Contributor.php @@ -0,0 +1,41 @@ +_draft = $draft; + } + + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_draft != null) { + $element->appendChild($this->_draft->getDOM($element->ownerDocument)); + } + return $element; + } + + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('app') . ':' . 'draft': + $draft = new Zend_Gdata_App_Extension_Draft(); + $draft->transferFromDOM($child); + $this->_draft = $draft; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + /** + * @return Zend_Gdata_App_Extension_Draft + */ + public function getDraft() + { + return $this->_draft; + } + + /** + * @param Zend_Gdata_App_Extension_Draft $value + * @return Zend_Gdata_App_Entry Provides a fluent interface + */ + public function setDraft($value) + { + $this->_draft = $value; + return $this; + } + +} diff --git a/libs/Zend/Gdata/App/Extension/Draft.php b/libs/Zend/Gdata/App/Extension/Draft.php new file mode 100644 index 0000000..7c3ddda --- /dev/null +++ b/libs/Zend/Gdata/App/Extension/Draft.php @@ -0,0 +1,48 @@ +_text = $text; + } + +} diff --git a/libs/Zend/Gdata/App/Extension/Element.php b/libs/Zend/Gdata/App/Extension/Element.php new file mode 100644 index 0000000..7e80e2a --- /dev/null +++ b/libs/Zend/Gdata/App/Extension/Element.php @@ -0,0 +1,56 @@ +_rootElement = $rootElement; + $this->_rootNamespace = $rootNamespace; + $this->_rootNamespaceURI = $rootNamespaceURI; + $this->_text = $text; + } + + public function transferFromDOM($node) + { + parent::transferFromDOM($node); + $this->_rootNamespace = null; + $this->_rootNamespaceURI = $node->namespaceURI; + $this->_rootElement = $node->localName; + } + +} diff --git a/libs/Zend/Gdata/App/Extension/Email.php b/libs/Zend/Gdata/App/Extension/Email.php new file mode 100644 index 0000000..3ab2395 --- /dev/null +++ b/libs/Zend/Gdata/App/Extension/Email.php @@ -0,0 +1,47 @@ +_text = $text; + } + +} diff --git a/libs/Zend/Gdata/App/Extension/Generator.php b/libs/Zend/Gdata/App/Extension/Generator.php new file mode 100644 index 0000000..768d633 --- /dev/null +++ b/libs/Zend/Gdata/App/Extension/Generator.php @@ -0,0 +1,113 @@ +_text = $text; + $this->_uri = $uri; + $this->_version = $version; + } + + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_uri !== null) { + $element->setAttribute('uri', $this->_uri); + } + if ($this->_version !== null) { + $element->setAttribute('version', $this->_version); + } + return $element; + } + + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'uri': + $this->_uri = $attribute->nodeValue; + break; + case 'version': + $this->_version= $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * @return Zend_Gdata_App_Extension_Uri + */ + public function getUri() + { + return $this->_uri; + } + + /** + * @param Zend_Gdata_App_Extension_Uri $value + * @return Zend_Gdata_App_Entry Provides a fluent interface + */ + public function setUri($value) + { + $this->_uri = $value; + return $this; + } + + /** + * @return Zend_Gdata_App_Extension_Version + */ + public function getVersion() + { + return $this->_version; + } + + /** + * @param Zend_Gdata_App_Extension_Version $value + * @return Zend_Gdata_App_Entry Provides a fluent interface + */ + public function setVersion($value) + { + $this->_version = $value; + return $this; + } + +} diff --git a/libs/Zend/Gdata/App/Extension/Icon.php b/libs/Zend/Gdata/App/Extension/Icon.php new file mode 100644 index 0000000..d711d51 --- /dev/null +++ b/libs/Zend/Gdata/App/Extension/Icon.php @@ -0,0 +1,47 @@ +_text = $text; + } + +} diff --git a/libs/Zend/Gdata/App/Extension/Id.php b/libs/Zend/Gdata/App/Extension/Id.php new file mode 100644 index 0000000..329449b --- /dev/null +++ b/libs/Zend/Gdata/App/Extension/Id.php @@ -0,0 +1,47 @@ +_text = $text; + } + +} diff --git a/libs/Zend/Gdata/App/Extension/Link.php b/libs/Zend/Gdata/App/Extension/Link.php new file mode 100644 index 0000000..3041122 --- /dev/null +++ b/libs/Zend/Gdata/App/Extension/Link.php @@ -0,0 +1,217 @@ +_href = $href; + $this->_rel = $rel; + $this->_type = $type; + $this->_hrefLang = $hrefLang; + $this->_title = $title; + $this->_length = $length; + } + + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_href !== null) { + $element->setAttribute('href', $this->_href); + } + if ($this->_rel !== null) { + $element->setAttribute('rel', $this->_rel); + } + if ($this->_type !== null) { + $element->setAttribute('type', $this->_type); + } + if ($this->_hrefLang !== null) { + $element->setAttribute('hreflang', $this->_hrefLang); + } + if ($this->_title !== null) { + $element->setAttribute('title', $this->_title); + } + if ($this->_length !== null) { + $element->setAttribute('length', $this->_length); + } + return $element; + } + + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'href': + $this->_href = $attribute->nodeValue; + break; + case 'rel': + $this->_rel = $attribute->nodeValue; + break; + case 'type': + $this->_type = $attribute->nodeValue; + break; + case 'hreflang': + $this->_hrefLang = $attribute->nodeValue; + break; + case 'title': + $this->_title = $attribute->nodeValue; + break; + case 'length': + $this->_length = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * @return string|null + */ + public function getHref() + { + return $this->_href; + } + + /** + * @param string|null $value + * @return Zend_Gdata_App_Entry Provides a fluent interface + */ + public function setHref($value) + { + $this->_href = $value; + return $this; + } + + /** + * @return string|null + */ + public function getRel() + { + return $this->_rel; + } + + /** + * @param string|null $value + * @return Zend_Gdata_App_Entry Provides a fluent interface + */ + public function setRel($value) + { + $this->_rel = $value; + return $this; + } + + /** + * @return string|null + */ + public function getType() + { + return $this->_type; + } + + /** + * @param string|null $value + * @return Zend_Gdata_App_Entry Provides a fluent interface + */ + public function setType($value) + { + $this->_type = $value; + return $this; + } + + /** + * @return string|null + */ + public function getHrefLang() + { + return $this->_hrefLang; + } + + /** + * @param string|null $value + * @return Zend_Gdata_App_Entry Provides a fluent interface + */ + public function setHrefLang($value) + { + $this->_hrefLang = $value; + return $this; + } + + /** + * @return string|null + */ + public function getTitle() + { + return $this->_title; + } + + /** + * @param string|null $value + * @return Zend_Gdata_App_Entry Provides a fluent interface + */ + public function setTitle($value) + { + $this->_title = $value; + return $this; + } + + /** + * @return string|null + */ + public function getLength() + { + return $this->_length; + } + + /** + * @param string|null $value + * @return Zend_Gdata_App_Entry Provides a fluent interface + */ + public function setLength($value) + { + $this->_length = $value; + return $this; + } + +} diff --git a/libs/Zend/Gdata/App/Extension/Logo.php b/libs/Zend/Gdata/App/Extension/Logo.php new file mode 100644 index 0000000..e513dfb --- /dev/null +++ b/libs/Zend/Gdata/App/Extension/Logo.php @@ -0,0 +1,47 @@ +_text = $text; + } + +} diff --git a/libs/Zend/Gdata/App/Extension/Name.php b/libs/Zend/Gdata/App/Extension/Name.php new file mode 100644 index 0000000..e896290 --- /dev/null +++ b/libs/Zend/Gdata/App/Extension/Name.php @@ -0,0 +1,46 @@ +_text = $text; + } +} diff --git a/libs/Zend/Gdata/App/Extension/Person.php b/libs/Zend/Gdata/App/Extension/Person.php new file mode 100644 index 0000000..f59ba77 --- /dev/null +++ b/libs/Zend/Gdata/App/Extension/Person.php @@ -0,0 +1,161 @@ +_name = $name; + $this->_email = $email; + $this->_uri = $uri; + } + + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_name != null) { + $element->appendChild($this->_name->getDOM($element->ownerDocument)); + } + if ($this->_email != null) { + $element->appendChild($this->_email->getDOM($element->ownerDocument)); + } + if ($this->_uri != null) { + $element->appendChild($this->_uri->getDOM($element->ownerDocument)); + } + return $element; + } + + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('atom') . ':' . 'name': + $name = new Zend_Gdata_App_Extension_Name(); + $name->transferFromDOM($child); + $this->_name = $name; + break; + case $this->lookupNamespace('atom') . ':' . 'email': + $email = new Zend_Gdata_App_Extension_Email(); + $email->transferFromDOM($child); + $this->_email = $email; + break; + case $this->lookupNamespace('atom') . ':' . 'uri': + $uri = new Zend_Gdata_App_Extension_Uri(); + $uri->transferFromDOM($child); + $this->_uri = $uri; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + /** + * @return Zend_Gdata_App_Extension_Name + */ + public function getName() + { + return $this->_name; + } + + /** + * @param Zend_Gdata_App_Extension_Name $value + * @return Zend_Gdata_App_Entry Provides a fluent interface + */ + public function setName($value) + { + $this->_name = $value; + return $this; + } + + /** + * @return Zend_Gdata_App_Extension_Email + */ + public function getEmail() + { + return $this->_email; + } + + /** + * @param Zend_Gdata_App_Extension_Email $value + * @return Zend_Gdata_App_Extension_Person Provides a fluent interface + */ + public function setEmail($value) + { + $this->_email = $value; + return $this; + } + + /** + * @return Zend_Gdata_App_Extension_Uri + */ + public function getUri() + { + return $this->_uri; + } + + /** + * @param Zend_Gdata_App_Extension_Uri $value + * @return Zend_Gdata_App_Extension_Person Provides a fluent interface + */ + public function setUri($value) + { + $this->_uri = $value; + return $this; + } + +} diff --git a/libs/Zend/Gdata/App/Extension/Published.php b/libs/Zend/Gdata/App/Extension/Published.php new file mode 100644 index 0000000..b60485b --- /dev/null +++ b/libs/Zend/Gdata/App/Extension/Published.php @@ -0,0 +1,47 @@ +_text = $text; + } + +} diff --git a/libs/Zend/Gdata/App/Extension/Rights.php b/libs/Zend/Gdata/App/Extension/Rights.php new file mode 100644 index 0000000..d095514 --- /dev/null +++ b/libs/Zend/Gdata/App/Extension/Rights.php @@ -0,0 +1,47 @@ +_text = $text; + } + +} diff --git a/libs/Zend/Gdata/App/Extension/Source.php b/libs/Zend/Gdata/App/Extension/Source.php new file mode 100644 index 0000000..a29ab89 --- /dev/null +++ b/libs/Zend/Gdata/App/Extension/Source.php @@ -0,0 +1,44 @@ +_text = $text; + $this->_type = $type; + } + + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_type !== null) { + $element->setAttribute('type', $this->_type); + } + return $element; + } + + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'type': + $this->_type = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /* + * @return Zend_Gdata_App_Extension_Type + */ + public function getType() + { + return $this->_type; + } + + /* + * @param string $value + * @return Zend_Gdata_App_Extension_Text Provides a fluent interface + */ + public function setType($value) + { + $this->_type = $value; + return $this; + } + +} diff --git a/libs/Zend/Gdata/App/Extension/Title.php b/libs/Zend/Gdata/App/Extension/Title.php new file mode 100644 index 0000000..3bd579f --- /dev/null +++ b/libs/Zend/Gdata/App/Extension/Title.php @@ -0,0 +1,41 @@ +_text = $text; + } + +} diff --git a/libs/Zend/Gdata/App/Extension/Uri.php b/libs/Zend/Gdata/App/Extension/Uri.php new file mode 100644 index 0000000..fd17190 --- /dev/null +++ b/libs/Zend/Gdata/App/Extension/Uri.php @@ -0,0 +1,47 @@ +_text = $text; + } + +} diff --git a/libs/Zend/Gdata/App/Feed.php b/libs/Zend/Gdata/App/Feed.php new file mode 100644 index 0000000..e27b800 --- /dev/null +++ b/libs/Zend/Gdata/App/Feed.php @@ -0,0 +1,311 @@ +entries as $entry) or foreach + * ($feed->entry as $entry). + * + * @param string $var The property to get. + * @return mixed + */ + public function __get($var) + { + switch ($var) { + case 'entries': + return $this; + default: + return parent::__get($var); + } + } + + /** + * Retrieves the DOM model representing this object and all children + * + * @param DOMDocument $doc + * @return DOMElement + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + foreach ($this->_entry as $entry) { + $element->appendChild($entry->getDOM($element->ownerDocument)); + } + return $element; + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them in the $_entry array based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('atom') . ':' . 'entry': + $newEntry = new $this->_entryClassName($child); + $newEntry->setHttpClient($this->getHttpClient()); + $this->_entry[] = $newEntry; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + /** + * Get the number of entries in this feed object. + * + * @return integer Entry count. + */ + public function count() + { + return count($this->_entry); + } + + /** + * Required by the Iterator interface. + * + * @return void + */ + public function rewind() + { + $this->_entryIndex = 0; + } + + /** + * Required by the Iterator interface. + * + * @return mixed The current row, or null if no rows. + */ + public function current() + { + return $this->_entry[$this->_entryIndex]; + } + + /** + * Required by the Iterator interface. + * + * @return mixed The current row number (starts at 0), or NULL if no rows + */ + public function key() + { + return $this->_entryIndex; + } + + /** + * Required by the Iterator interface. + * + * @return mixed The next row, or null if no more rows. + */ + public function next() + { + ++$this->_entryIndex; + } + + /** + * Required by the Iterator interface. + * + * @return boolean Whether the iteration is valid + */ + public function valid() + { + return 0 <= $this->_entryIndex && $this->_entryIndex < $this->count(); + } + + /** + * Gets the array of atom:entry elements contained within this + * atom:feed representation + * + * @return array Zend_Gdata_App_Entry array + */ + public function getEntry() + { + return $this->_entry; + } + + /** + * Sets the array of atom:entry elements contained within this + * atom:feed representation + * + * @param array $value The array of Zend_Gdata_App_Entry elements + * @return Zend_Gdata_App_Feed Provides a fluent interface + */ + public function setEntry($value) + { + $this->_entry = $value; + return $this; + } + + /** + * Adds an entry representation to the array of entries + * contained within this feed + * + * @param Zend_Gdata_App_Entry An individual entry to add. + * @return Zend_Gdata_App_Feed Provides a fluent interface + */ + public function addEntry($value) + { + $this->_entry[] = $value; + return $this; + } + + /** + * Required by the ArrayAccess interface + * + * @param int $key The index to set + * @param Zend_Gdata_App_Entry $value The value to set + * @return void + */ + public function offsetSet($key, $value) + { + $this->_entry[$key] = $value; + } + + /** + * Required by the ArrayAccess interface + * + * @param int $key The index to get + * @param Zend_Gdata_App_Entry $value The value to set + */ + public function offsetGet($key) + { + if (array_key_exists($key, $this->_entry)) { + return $this->_entry[$key]; + } + } + + /** + * Required by the ArrayAccess interface + * + * @param int $key The index to set + * @param Zend_Gdata_App_Entry $value The value to set + */ + public function offsetUnset($key) + { + if (array_key_exists($key, $this->_entry)) { + unset($this->_entry[$key]); + } + } + + /** + * Required by the ArrayAccess interface + * + * @param int $key The index to check for existence + * @return boolean + */ + public function offsetExists($key) + { + return (array_key_exists($key, $this->_entry)); + } + + /** + * Retrieve the next set of results from this feed. + * + * @throws Zend_Gdata_App_Exception + * @return mixed|null Returns the next set of results as a feed of the same + * class as this feed, or null if no results exist. + */ + public function getNextFeed() + { + $nextLink = $this->getNextLink(); + if (!$nextLink) { + require_once 'Zend/Gdata/App/HttpException.php'; + throw new Zend_Gdata_App_Exception('No link to next set ' . + 'of results found.'); + } + $nextLinkHref = $nextLink->getHref(); + $service = new Zend_Gdata_App($this->getHttpClient()); + + return $service->getFeed($nextLinkHref, get_class($this)); + } + + /** + * Retrieve the previous set of results from this feed. + * + * @throws Zend_Gdata_App_Exception + * @return mixed|null Returns the previous set of results as a feed of + * the same class as this feed, or null if no results exist. + */ + public function getPreviousFeed() + { + $previousLink = $this->getPreviousLink(); + if (!$previousLink) { + require_once 'Zend/Gdata/App/HttpException.php'; + throw new Zend_Gdata_App_Exception('No link to previous set ' . + 'of results found.'); + } + $previousLinkHref = $previousLink->getHref(); + $service = new Zend_Gdata_App($this->getHttpClient()); + + return $service->getFeed($previousLinkHref, get_class($this)); + } + +} diff --git a/libs/Zend/Gdata/App/FeedEntryParent.php b/libs/Zend/Gdata/App/FeedEntryParent.php new file mode 100644 index 0000000..a599f5a --- /dev/null +++ b/libs/Zend/Gdata/App/FeedEntryParent.php @@ -0,0 +1,576 @@ +loadXML($element); + @ini_restore('track_errors'); + if (!$success) { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception("DOMDocument cannot parse XML: $php_errormsg"); + } + $element = $doc->getElementsByTagName($this->_rootElement)->item(0); + if (!$element) { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception('No root <' . $this->_rootElement . '> element found, cannot parse feed.'); + } + $this->transferFromDOM($element); + } + } else { + $this->transferFromDOM($element); + } + } + + /** + * Set the HTTP client instance + * + * Sets the HTTP client object to use for retrieving the feed. + * + * @deprecated Deprecated as of Zend Framework 1.7. Use + * setService() instead. + * @param Zend_Http_Client $httpClient + * @return Zend_Gdata_App_Feed Provides a fluent interface + */ + public function setHttpClient(Zend_Http_Client $httpClient) + { + if (!$this->_service) { + $this->_service = new Zend_Gdata_App(); + } + $this->_service->setHttpClient($httpClient); + return $this; + } + + /** + * Gets the HTTP client object. If none is set, a new Zend_Http_Client + * will be used. + * + * @deprecated Deprecated as of Zend Framework 1.7. Use + * getService() instead. + * @return Zend_Http_Client_Abstract + */ + public function getHttpClient() + { + if (!$this->_service) { + $this->_service = new Zend_Gdata_App(); + } + $client = $this->_service->getHttpClient(); + return $client; + } + + /** + * Set the active service instance for this object. This will be used to + * perform network requests, such as when calling save() and delete(). + * + * @param Zend_Gdata_App $instance The new service instance. + * @return Zend_Gdata_App_FeedEntryParent Provides a fluent interface. + */ + public function setService($instance) + { + $this->_service = $instance; + return $this; + } + + /** + * Get the active service instance for this object. This will be used to + * perform network requests, such as when calling save() and delete(). + * + * @return Zend_Gdata_App|null The current service instance, or null if + * not set. + */ + public function getService() + { + return $this->_service; + } + + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + foreach ($this->_author as $author) { + $element->appendChild($author->getDOM($element->ownerDocument)); + } + foreach ($this->_category as $category) { + $element->appendChild($category->getDOM($element->ownerDocument)); + } + foreach ($this->_contributor as $contributor) { + $element->appendChild($contributor->getDOM($element->ownerDocument)); + } + if ($this->_id != null) { + $element->appendChild($this->_id->getDOM($element->ownerDocument)); + } + foreach ($this->_link as $link) { + $element->appendChild($link->getDOM($element->ownerDocument)); + } + if ($this->_rights != null) { + $element->appendChild($this->_rights->getDOM($element->ownerDocument)); + } + if ($this->_title != null) { + $element->appendChild($this->_title->getDOM($element->ownerDocument)); + } + if ($this->_updated != null) { + $element->appendChild($this->_updated->getDOM($element->ownerDocument)); + } + return $element; + } + + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('atom') . ':' . 'author': + $author = new Zend_Gdata_App_Extension_Author(); + $author->transferFromDOM($child); + $this->_author[] = $author; + break; + case $this->lookupNamespace('atom') . ':' . 'category': + $category = new Zend_Gdata_App_Extension_Category(); + $category->transferFromDOM($child); + $this->_category[] = $category; + break; + case $this->lookupNamespace('atom') . ':' . 'contributor': + $contributor = new Zend_Gdata_App_Extension_Contributor(); + $contributor->transferFromDOM($child); + $this->_contributor[] = $contributor; + break; + case $this->lookupNamespace('atom') . ':' . 'id': + $id = new Zend_Gdata_App_Extension_Id(); + $id->transferFromDOM($child); + $this->_id = $id; + break; + case $this->lookupNamespace('atom') . ':' . 'link': + $link = new Zend_Gdata_App_Extension_Link(); + $link->transferFromDOM($child); + $this->_link[] = $link; + break; + case $this->lookupNamespace('atom') . ':' . 'rights': + $rights = new Zend_Gdata_App_Extension_Rights(); + $rights->transferFromDOM($child); + $this->_rights = $rights; + break; + case $this->lookupNamespace('atom') . ':' . 'title': + $title = new Zend_Gdata_App_Extension_Title(); + $title->transferFromDOM($child); + $this->_title = $title; + break; + case $this->lookupNamespace('atom') . ':' . 'updated': + $updated = new Zend_Gdata_App_Extension_Updated(); + $updated->transferFromDOM($child); + $this->_updated = $updated; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + /** + * @return Zend_Gdata_App_Extension_Author + */ + public function getAuthor() + { + return $this->_author; + } + + /** + * Sets the list of the authors of this feed/entry. In an atom feed, each + * author is represented by an atom:author element + * + * @param array $value + * @return Zend_Gdata_App_FeedEntryParent Provides a fluent interface + */ + public function setAuthor($value) + { + $this->_author = $value; + return $this; + } + + /** + * Returns the array of categories that classify this feed/entry. Each + * category is represented in an atom feed by an atom:category element. + * + * @return array Array of Zend_Gdata_App_Extension_Category + */ + public function getCategory() + { + return $this->_category; + } + + /** + * Sets the array of categories that classify this feed/entry. Each + * category is represented in an atom feed by an atom:category element. + * + * @param array $value Array of Zend_Gdata_App_Extension_Category + * @return Zend_Gdata_App_FeedEntryParent Provides a fluent interface + */ + public function setCategory($value) + { + $this->_category = $value; + return $this; + } + + /** + * Returns the array of contributors to this feed/entry. Each contributor + * is represented in an atom feed by an atom:contributor XML element + * + * @return array An array of Zend_Gdata_App_Extension_Contributor + */ + public function getContributor() + { + return $this->_contributor; + } + + /** + * Sets the array of contributors to this feed/entry. Each contributor + * is represented in an atom feed by an atom:contributor XML element + * + * @param array $value + * @return Zend_Gdata_App_FeedEntryParent Provides a fluent interface + */ + public function setContributor($value) + { + $this->_contributor = $value; + return $this; + } + + /** + * @return Zend_Gdata_App_Extension_Id + */ + public function getId() + { + return $this->_id; + } + + /** + * @param Zend_Gdata_App_Extension_Id $value + * @return Zend_Gdata_App_FeedEntryParent Provides a fluent interface + */ + public function setId($value) + { + $this->_id = $value; + return $this; + } + + /** + * Given a particular 'rel' value, this method returns a matching + * Zend_Gdata_App_Extension_Link element. If the 'rel' value + * is not provided, the full array of Zend_Gdata_App_Extension_Link + * elements is returned. In an atom feed, each link is represented + * by an atom:link element. The 'rel' value passed to this function + * is the atom:link/@rel attribute. Example rel values include 'self', + * 'edit', and 'alternate'. + * + * @param string $rel The rel value of the link to be found. If null, + * the array of Zend_Gdata_App_Extension_link elements is returned + * @return mixed Either a single Zend_Gdata_App_Extension_link element, + * an array of the same or null is returned depending on the rel value + * supplied as the argument to this function + */ + public function getLink($rel = null) + { + if ($rel == null) { + return $this->_link; + } else { + foreach ($this->_link as $link) { + if ($link->rel == $rel) { + return $link; + } + } + return null; + } + } + + /** + * Returns the Zend_Gdata_App_Extension_Link element which represents + * the URL used to edit this resource. This link is in the atom feed/entry + * as an atom:link with a rel attribute value of 'edit'. + * + * @return Zend_Gdata_App_Extension_Link The link, or null if not found + */ + public function getEditLink() + { + return $this->getLink('edit'); + } + + /** + * Returns the Zend_Gdata_App_Extension_Link element which represents + * the URL used to retrieve the next chunk of results when paging through + * a feed. This link is in the atom feed as an atom:link with a + * rel attribute value of 'next'. + * + * @return Zend_Gdata_App_Extension_Link The link, or null if not found + */ + public function getNextLink() + { + return $this->getLink('next'); + } + + /** + * Returns the Zend_Gdata_App_Extension_Link element which represents + * the URL used to retrieve the previous chunk of results when paging + * through a feed. This link is in the atom feed as an atom:link with a + * rel attribute value of 'previous'. + * + * @return Zend_Gdata_App_Extension_Link The link, or null if not found + */ + public function getPreviousLink() + { + return $this->getLink('previous'); + } + + /** + * @return Zend_Gdata_App_Extension_Link + */ + public function getLicenseLink() + { + return $this->getLink('license'); + } + + /** + * Returns the Zend_Gdata_App_Extension_Link element which represents + * the URL used to retrieve the entry or feed represented by this object + * This link is in the atom feed/entry as an atom:link with a + * rel attribute value of 'self'. + * + * @return Zend_Gdata_App_Extension_Link The link, or null if not found + */ + public function getSelfLink() + { + return $this->getLink('self'); + } + + /** + * Returns the Zend_Gdata_App_Extension_Link element which represents + * the URL for an alternate view of the data represented by this feed or + * entry. This alternate view is commonly a user-facing webpage, blog + * post, etc. The MIME type for the data at the URL is available from the + * returned Zend_Gdata_App_Extension_Link element. + * This link is in the atom feed/entry as an atom:link with a + * rel attribute value of 'self'. + * + * @return Zend_Gdata_App_Extension_Link The link, or null if not found + */ + public function getAlternateLink() + { + return $this->getLink('alternate'); + } + + /** + * @param array $value The array of Zend_Gdata_App_Extension_Link elements + * @return Zend_Gdata_App_FeedEntryParent Provides a fluent interface + */ + public function setLink($value) + { + $this->_link = $value; + return $this; + } + + /** + * @return Zend_Gdata_AppExtension_Rights + */ + public function getRights() + { + return $this->_rights; + } + + /** + * @param Zend_Gdata_App_Extension_Rights $value + * @return Zend_Gdata_App_FeedEntryParent Provides a fluent interface + */ + public function setRights($value) + { + $this->_rights = $value; + return $this; + } + + /** + * Returns the title of this feed or entry. The title is an extremely + * short textual representation of this resource and is found as + * an atom:title element in a feed or entry + * + * @return Zend_Gdata_App_Extension_Title + */ + public function getTitle() + { + return $this->_title; + } + + /** + * Returns a string representation of the title of this feed or entry. + * The title is an extremely short textual representation of this + * resource and is found as an atom:title element in a feed or entry + * + * @return string + */ + public function getTitleValue() + { + if (($titleObj = $this->getTitle()) != null) { + return $titleObj->getText(); + } else { + return null; + } + } + + /** + * Returns the title of this feed or entry. The title is an extremely + * short textual representation of this resource and is found as + * an atom:title element in a feed or entry + * + * @param Zend_Gdata_App_Extension_Title $value + * @return Zend_Gdata_App_Feed_Entry_Parent Provides a fluent interface + */ + public function setTitle($value) + { + $this->_title = $value; + return $this; + } + + /** + * @return Zend_Gdata_App_Extension_Updated + */ + public function getUpdated() + { + return $this->_updated; + } + + /** + * @param Zend_Gdata_App_Extension_Updated $value + * @return Zend_Gdata_App_Feed_Entry_Parent Provides a fluent interface + */ + public function setUpdated($value) + { + $this->_updated = $value; + return $this; + } + + /** + * Set the Etag for the current entry to $value. Setting $value to null + * unsets the Etag. + * + * @param string|null $value + * @return Zend_Gdata_App_Entry Provides a fluent interface + */ + public function setEtag($value) { + $this->_etag = $value; + return $this; + } + + /** + * Return the Etag for the current entry, or null if not set. + * + * @return string|null + */ + public function getEtag() { + return $this->_etag; + } + +} diff --git a/libs/Zend/Gdata/App/FeedSourceParent.php b/libs/Zend/Gdata/App/FeedSourceParent.php new file mode 100644 index 0000000..7ac9aed --- /dev/null +++ b/libs/Zend/Gdata/App/FeedSourceParent.php @@ -0,0 +1,265 @@ +_entry as $entry) { + $entry->setHttpClient($httpClient); + } + 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 + * save() and delete(). + * + * @param Zend_Gdata_App $instance The new service instance. + * @return Zend_Gdata_App_FeedEntryParent Provides a fluent interface. + */ + public function setService($instance) + { + parent::setService($instance); + foreach ($this->_entry as $entry) { + $entry->setService($instance); + } + return $this; + } + + /** + * Make accessing some individual elements of the feed easier. + * + * Special accessors 'entry' and 'entries' are provided so that if + * you wish to iterate over an Atom feed's entries, you can do so + * using foreach ($feed->entries as $entry) or foreach + * ($feed->entry as $entry). + * + * @param string $var The property to access. + * @return mixed + */ + public function __get($var) + { + switch ($var) { + default: + return parent::__get($var); + } + } + + + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_generator != null) { + $element->appendChild($this->_generator->getDOM($element->ownerDocument)); + } + if ($this->_icon != null) { + $element->appendChild($this->_icon->getDOM($element->ownerDocument)); + } + if ($this->_logo != null) { + $element->appendChild($this->_logo->getDOM($element->ownerDocument)); + } + if ($this->_subtitle != null) { + $element->appendChild($this->_subtitle->getDOM($element->ownerDocument)); + } + return $element; + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them in the $_entry array based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('atom') . ':' . 'generator': + $generator = new Zend_Gdata_App_Extension_Generator(); + $generator->transferFromDOM($child); + $this->_generator = $generator; + break; + case $this->lookupNamespace('atom') . ':' . 'icon': + $icon = new Zend_Gdata_App_Extension_Icon(); + $icon->transferFromDOM($child); + $this->_icon = $icon; + break; + case $this->lookupNamespace('atom') . ':' . 'logo': + $logo = new Zend_Gdata_App_Extension_Logo(); + $logo->transferFromDOM($child); + $this->_logo = $logo; + break; + case $this->lookupNamespace('atom') . ':' . 'subtitle': + $subtitle = new Zend_Gdata_App_Extension_Subtitle(); + $subtitle->transferFromDOM($child); + $this->_subtitle = $subtitle; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + /** + * @return Zend_Gdata_AppExtension_Generator + */ + public function getGenerator() + { + return $this->_generator; + } + + /** + * @param Zend_Gdata_App_Extension_Generator $value + * @return Zend_Gdata_App_FeedSourceParent Provides a fluent interface + */ + public function setGenerator($value) + { + $this->_generator = $value; + return $this; + } + + /** + * @return Zend_Gdata_AppExtension_Icon + */ + public function getIcon() + { + return $this->_icon; + } + + /** + * @param Zend_Gdata_App_Extension_Icon $value + * @return Zend_Gdata_App_FeedSourceParent Provides a fluent interface + */ + public function setIcon($value) + { + $this->_icon = $value; + return $this; + } + + /** + * @return Zend_Gdata_AppExtension_logo + */ + public function getlogo() + { + return $this->_logo; + } + + /** + * @param Zend_Gdata_App_Extension_logo $value + * @return Zend_Gdata_App_FeedSourceParent Provides a fluent interface + */ + public function setlogo($value) + { + $this->_logo = $value; + return $this; + } + + /** + * @return Zend_Gdata_AppExtension_Subtitle + */ + public function getSubtitle() + { + return $this->_subtitle; + } + + /** + * @param Zend_Gdata_App_Extension_Subtitle $value + * @return Zend_Gdata_App_FeedSourceParent Provides a fluent interface + */ + public function setSubtitle($value) + { + $this->_subtitle = $value; + return $this; + } + +} diff --git a/libs/Zend/Gdata/App/HttpException.php b/libs/Zend/Gdata/App/HttpException.php new file mode 100644 index 0000000..e957eff --- /dev/null +++ b/libs/Zend/Gdata/App/HttpException.php @@ -0,0 +1,119 @@ +_httpClientException = $e; + $this->_response = $response; + parent::__construct($message); + } + + /** + * Get the Zend_Http_Client_Exception. + * + * @return Zend_Http_Client_Exception + */ + public function getHttpClientException() + { + return $this->_httpClientException; + } + + /** + * Set the Zend_Http_Client_Exception. + * + * @param Zend_Http_Client_Exception $value + */ + public function setHttpClientException($value) + { + $this->_httpClientException = $value; + return $this; + } + + /** + * Set the Zend_Http_Response. + * + * @param Zend_Http_Response $response + */ + public function setResponse($response) + { + $this->_response = $response; + return $this; + } + + /** + * Get the Zend_Http_Response. + * + * @return Zend_Http_Response + */ + public function getResponse() + { + return $this->_response; + } + + /** + * Get the body of the Zend_Http_Response + * + * @return string + */ + public function getRawResponseBody() + { + if ($this->getResponse()) { + $response = $this->getResponse(); + return $response->getRawBody(); + } + return null; + } + +} diff --git a/libs/Zend/Gdata/App/IOException.php b/libs/Zend/Gdata/App/IOException.php new file mode 100644 index 0000000..e2607ab --- /dev/null +++ b/libs/Zend/Gdata/App/IOException.php @@ -0,0 +1,41 @@ +log_handle == null) { + $this->log_handle = fopen($this->config['logfile'], 'a'); + } + fwrite($this->log_handle, $message); + } + + /** + * Connect to the remote server + * + * @param string $host + * @param int $port + * @param boolean $secure + * @param int $timeout + */ + public function connect($host, $port = 80, $secure = false) + { + $this->log("Connecting to: ${host}:${port}"); + return parent::connect($host, $port, $secure); + } + + /** + * Send request to the remote server + * + * @param string $method + * @param Zend_Uri_Http $uri + * @param string $http_ver + * @param array $headers + * @param string $body + * @return string Request as string + */ + public function write($method, $uri, $http_ver = '1.1', $headers = array(), $body = '') + { + $request = parent::write($method, $uri, $http_ver, $headers, $body); + $this->log("\n\n" . $request); + return $request; + } + + /** + * Read response from server + * + * @return string + */ + public function read() + { + $response = parent::read(); + $this->log("${response}\n\n"); + return $response; + } + + /** + * Close the connection to the server + * + */ + public function close() + { + $this->log("Closing socket\n\n"); + parent::close(); + } + +} diff --git a/libs/Zend/Gdata/App/MediaEntry.php b/libs/Zend/Gdata/App/MediaEntry.php new file mode 100644 index 0000000..dba2a5d --- /dev/null +++ b/libs/Zend/Gdata/App/MediaEntry.php @@ -0,0 +1,161 @@ +_mime = new Zend_Mime(); + $this->_mediaSource = $mediaSource; + } + + /** + * Return the Zend_Mime object associated with this MediaEntry. This + * object is used to generate the media boundaries. + * + * @return Zend_Mime The Zend_Mime object associated with this MediaEntry. + */ + public function getMime() + { + return $this->_mime; + } + + /** + * Return the MIME multipart representation of this MediaEntry. + * + * @return string The MIME multipart representation of this MediaEntry + */ + public function encode() + { + $xmlData = $this->saveXML(); + if ($this->getMediaSource() === null) { + // No attachment, just send XML for entry + return $xmlData; + } else { + $mimeMessage = new Zend_Mime_Message(); + $mimeMessage->setMime($this->_mime); + + $xmlPart = new Zend_Mime_Part($xmlData); + $xmlPart->type = 'application/atom+xml'; + $xmlPart->encoding = null; + $mimeMessage->addPart($xmlPart); + + $binaryPart = new Zend_Mime_Part($this->getMediaSource()->encode()); + $binaryPart->type = $this->getMediaSource()->getContentType(); + $binaryPart->encoding = null; + $mimeMessage->addPart($binaryPart); + + return $mimeMessage->generateMessage(); + } + } + + /** + * Return the MediaSource object representing the file attached to this + * MediaEntry. + * + * @return Zend_Gdata_App_MediaSource The attached MediaSource/file + */ + public function getMediaSource() + { + return $this->_mediaSource; + } + + /** + * Set the MediaSource object (file) for this MediaEntry + * + * @param Zend_Gdata_App_MediaSource $value The attached MediaSource/file + * @return Zend_Gdata_App_MediaEntry Provides a fluent interface + */ + public function setMediaSource($value) + { + if ($value instanceof Zend_Gdata_App_MediaSource) { + $this->_mediaSource = $value; + } else { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'You must specify the media data as a class that conforms to Zend_Gdata_App_MediaSource.'); + } + return $this; + } + + /** + * Return the boundary used in the MIME multipart message + * + * @return string The boundary used in the MIME multipart message + */ + public function getBoundary() + { + return $this->_mime->boundary(); + } + +} diff --git a/libs/Zend/Gdata/App/MediaFileSource.php b/libs/Zend/Gdata/App/MediaFileSource.php new file mode 100644 index 0000000..5078723 --- /dev/null +++ b/libs/Zend/Gdata/App/MediaFileSource.php @@ -0,0 +1,144 @@ +setFilename($filename); + } + + /** + * Return the MIME multipart representation of this MediaEntry. + * + * @return string + * @throws Zend_Gdata_App_IOException + */ + public function encode() + { + if ($this->getFilename() !== null && + is_readable($this->getFilename())) { + + // Retrieves the file, using the include path + $fileHandle = fopen($this->getFilename(), 'r', true); + $result = fread($fileHandle, filesize($this->getFilename())); + if ($result === false) { + require_once 'Zend/Gdata/App/IOException.php'; + throw new Zend_Gdata_App_IOException("Error reading file - " . + $this->getFilename() . '. Read failed.'); + } + fclose($fileHandle); + return $result; + } else { + require_once 'Zend/Gdata/App/IOException.php'; + throw new Zend_Gdata_App_IOException("Error reading file - " . + $this->getFilename() . '. File is not readable.'); + } + } + + /** + * Get the filename associated with this reader. + * + * @return string + */ + public function getFilename() + { + return $this->_filename; + } + + /** + * Set the filename which is to be read. + * + * @param string $value The desired file handle. + * @return Zend_Gdata_App_MediaFileSource Provides a fluent interface. + */ + public function setFilename($value) + { + $this->_filename = $value; + return $this; + } + + /** + * The content type for the file attached (example image/png) + * + * @return string The content type + */ + public function getContentType() + { + return $this->_contentType; + } + + /** + * Set the content type for the file attached (example image/png) + * + * @param string $value The content type + * @return Zend_Gdata_App_MediaFileSource Provides a fluent interface + */ + public function setContentType($value) + { + $this->_contentType = $value; + return $this; + } + + /** + * Alias for getFilename(). + * + * @return string + */ + public function __toString() + { + return $this->getFilename(); + } + +} diff --git a/libs/Zend/Gdata/App/MediaSource.php b/libs/Zend/Gdata/App/MediaSource.php new file mode 100644 index 0000000..cfd7b8e --- /dev/null +++ b/libs/Zend/Gdata/App/MediaSource.php @@ -0,0 +1,71 @@ + 0) { + // timestamp is already properly formatted + return $timestamp; + } else { + $ts = strtotime($timestamp); + if ($ts === false) { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException("Invalid timestamp: $timestamp."); + } + return date('Y-m-d\TH:i:s', $ts); + } + } + + /** Find the greatest key that is less than or equal to a given upper + * bound, and return the value associated with that key. + * + * @param integer|null $maximumKey The upper bound for keys. If null, the + * maxiumum valued key will be found. + * @param array $collection An two-dimensional array of key/value pairs + * to search through. + * @returns mixed The value corresponding to the located key. + * @throws Zend_Gdata_App_Exception Thrown if $collection is empty. + */ + public static function findGreatestBoundedValue($maximumKey, $collection) + { + $found = false; + $foundKey = $maximumKey; + + // Sanity check: Make sure that the collection isn't empty + if (sizeof($collection) == 0) { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception("Empty namespace collection encountered."); + } + + if (is_null($maximumKey)) { + // If the key is null, then we return the maximum available + $keys = array_keys($collection); + sort($keys); + $found = true; + $foundKey = end($keys); + } else { + // Otherwise, we optimistically guess that the current version + // will have a matching namespce. If that fails, we decrement the + // version until we find a match. + while (!$found && $foundKey >= 0) { + if (array_key_exists($foundKey, $collection)) + $found = true; + else + $foundKey--; + } + } + + // Guard: A namespace wasn't found. Either none were registered, or + // the current protcol version is lower than the maximum namespace. + if (!$found) { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception("Namespace compatible with current protocol not found."); + } + + return $foundKey; + } + +} diff --git a/libs/Zend/Gdata/AuthSub.php b/libs/Zend/Gdata/AuthSub.php new file mode 100644 index 0000000..dc7332b --- /dev/null +++ b/libs/Zend/Gdata/AuthSub.php @@ -0,0 +1,243 @@ +filterHttpRequest('GET', $request_uri); + $url = $filterResult['url']; + $headers = $filterResult['headers']; + $client->setHeaders($headers); + $client->setUri($url); + } else { + $client->setUri($request_uri); + } + + try { + $response = $client->request('GET'); + } catch (Zend_Http_Client_Exception $e) { + require_once 'Zend/Gdata/App/HttpException.php'; + throw new Zend_Gdata_App_HttpException($e->getMessage(), $e); + } + + // Parse Google's response + if ($response->isSuccessful()) { + $goog_resp = array(); + foreach (explode("\n", $response->getBody()) as $l) { + $l = chop($l); + if ($l) { + list($key, $val) = explode('=', chop($l), 2); + $goog_resp[$key] = $val; + } + } + return $goog_resp['Token']; + } else { + require_once 'Zend/Gdata/App/AuthException.php'; + throw new Zend_Gdata_App_AuthException( + 'Token upgrade failed. Reason: ' . $response->getBody()); + } + } + + /** + * Revoke a token + * + * @param string $token The token to revoke + * @param Zend_Http_Client $client (optional) HTTP client to use to make the request + * @param string $request_uri (optional) URI to which to direct the revokation request + * @return boolean Whether the revokation was successful + * @throws Zend_Gdata_App_HttpException + */ + public static function AuthSubRevokeToken($token, $client = null, + $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']; + $headers = $filterResult['headers']; + $client->setHeaders($headers); + $client->setUri($url); + $client->resetParameters(); + } else { + $client->setUri($request_uri); + } + + ob_start(); + try { + $response = $client->request('GET'); + } catch (Zend_Http_Client_Exception $e) { + require_once 'Zend/Gdata/App/HttpException.php'; + throw new Zend_Gdata_App_HttpException($e->getMessage(), $e); + } + ob_end_clean(); + // Parse Google's response + if ($response->isSuccessful()) { + return true; + } else { + return false; + } + } + + + /** + * get token information + * + * @param string $token The token to retrieve information about + * @param Zend_Http_Client $client (optional) HTTP client to use to + * make the request + * @param string $request_uri (optional) URI to which to direct + * the information request + */ + public static function getAuthSubTokenInfo( + $token, $client = null, $request_uri = self::AUTHSUB_TOKEN_INFO_URI) + { + $client = self::getHttpClient($token, $client); + + if ($client instanceof Zend_Gdata_HttpClient) { + $filterResult = $client->filterHttpRequest('GET', $request_uri); + $url = $filterResult['url']; + $headers = $filterResult['headers']; + $client->setHeaders($headers); + $client->setUri($url); + } else { + $client->setUri($request_uri); + } + + ob_start(); + try { + $response = $client->request('GET'); + } catch (Zend_Http_Client_Exception $e) { + require_once 'Zend/Gdata/App/HttpException.php'; + throw new Zend_Gdata_App_HttpException($e->getMessage(), $e); + } + ob_end_clean(); + return $response->getBody(); + } + + /** + * Retrieve a HTTP client object with AuthSub credentials attached + * as the Authorization header + * + * @param string $token The token to retrieve information about + * @param Zend_Gdata_HttpClient $client (optional) HTTP client to use to make the request + */ + public static function getHttpClient($token, $client = null) + { + if ($client == null) { + $client = new Zend_Gdata_HttpClient(); + } + if (!$client instanceof Zend_Http_Client) { + require_once 'Zend/Gdata/App/HttpException.php'; + throw new Zend_Gdata_App_HttpException('Client is not an instance of Zend_Http_Client.'); + } + $useragent = 'Zend_Framework_Gdata/' . Zend_Version::VERSION; + $client->setConfig(array( + 'strictredirects' => true, + 'useragent' => $useragent + ) + ); + $client->setAuthSubToken($token); + return $client; + } + +} diff --git a/libs/Zend/Gdata/Books.php b/libs/Zend/Gdata/Books.php new file mode 100755 index 0000000..4d50349 --- /dev/null +++ b/libs/Zend/Gdata/Books.php @@ -0,0 +1,194 @@ + 'http://schemas.google.com/books/2008', + 'dc' => 'http://purl.org/dc/terms' + ); + + /** + * Create Zend_Gdata_Books object + * + * @param Zend_Http_Client $client (optional) The HTTP client to use when + * when communicating with the Google servers. + * @param string $applicationId The identity of the app in the form of Company-AppName-Version + */ + public function __construct($client = null, $applicationId = 'MyCompany-MyApp-1.0') + { + $this->registerPackage('Zend_Gdata_Books'); + $this->registerPackage('Zend_Gdata_Books_Extension'); + parent::__construct($client, $applicationId); + $this->_httpClient->setParameterPost('service', self::AUTH_SERVICE_NAME); + } + + /** + * Retrieves a feed of volumes. + * + * @param Zend_Gdata_Query|string|null $location (optional) The URL to + * query or a Zend_Gdata_Query object from which a URL can be + * determined. + * @return Zend_Gdata_Books_VolumeFeed The feed of volumes found at the + * specified URL. + */ + public function getVolumeFeed($location = null) + { + if ($location == null) { + $uri = self::VOLUME_FEED_URI; + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getFeed($uri, 'Zend_Gdata_Books_VolumeFeed'); + } + + /** + * Retrieves a specific volume entry. + * + * @param string|null $volumeId The volumeId of interest. + * @param Zend_Gdata_Query|string|null $location (optional) The URL to + * query or a Zend_Gdata_Query object from which a URL can be + * determined. + * @return Zend_Gdata_Books_VolumeEntry The feed of volumes found at the + * specified URL. + */ + public function getVolumeEntry($volumeId = null, $location = null) + { + if ($volumeId !== null) { + $uri = self::VOLUME_FEED_URI . "/" . $volumeId; + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getEntry($uri, 'Zend_Gdata_Books_VolumeEntry'); + } + + /** + * Retrieves a feed of volumes, by default the User library feed. + * + * @param Zend_Gdata_Query|string|null $location (optional) The URL to + * query. + * @return Zend_Gdata_Books_VolumeFeed The feed of volumes found at the + * specified URL. + */ + public function getUserLibraryFeed($location = null) + { + if ($location == null) { + $uri = self::MY_LIBRARY_FEED_URI; + } else { + $uri = $location; + } + return parent::getFeed($uri, 'Zend_Gdata_Books_VolumeFeed'); + } + + /** + * Retrieves a feed of volumes, by default the User annotation feed + * + * @param Zend_Gdata_Query|string|null $location (optional) The URL to + * query. + * @return Zend_Gdata_Books_VolumeFeed The feed of volumes found at the + * specified URL. + */ + public function getUserAnnotationFeed($location = null) + { + if ($location == null) { + $uri = self::MY_ANNOTATION_FEED_URI; + } else { + $uri = $location; + } + return parent::getFeed($uri, 'Zend_Gdata_Books_VolumeFeed'); + } + + /** + * Insert a Volume / Annotation + * + * @param Zend_Gdata_Books_VolumeEntry $entry + * @param Zend_Gdata_Query|string|null $location (optional) The URL to + * query + * @return Zend_Gdata_Books_VolumeEntry The inserted volume entry. + */ + public function insertVolume($entry, $location = null) + { + if ($location == null) { + $uri = self::MY_LIBRARY_FEED_URI; + } else { + $uri = $location; + } + return parent::insertEntry( + $entry, $uri, 'Zend_Gdata_Books_VolumeEntry'); + } + + /** + * Delete a Volume + * + * @param Zend_Gdata_Books_VolumeEntry $entry + * @return void + */ + public function deleteVolume($entry) + { + $entry->delete(); + } + +} diff --git a/libs/Zend/Gdata/Books/CollectionEntry.php b/libs/Zend/Gdata/Books/CollectionEntry.php new file mode 100644 index 0000000..9e259e7 --- /dev/null +++ b/libs/Zend/Gdata/Books/CollectionEntry.php @@ -0,0 +1,58 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct($element); + } + + +} + diff --git a/libs/Zend/Gdata/Books/CollectionFeed.php b/libs/Zend/Gdata/Books/CollectionFeed.php new file mode 100644 index 0000000..c8f5f9e --- /dev/null +++ b/libs/Zend/Gdata/Books/CollectionFeed.php @@ -0,0 +1,64 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct($element); + } + + /** + * The classname for individual feed elements. + * + * @var string + */ + protected $_entryClassName = 'Zend_Gdata_Books_CollectionEntry'; + +} + diff --git a/libs/Zend/Gdata/Books/Extension/AnnotationLink.php b/libs/Zend/Gdata/Books/Extension/AnnotationLink.php new file mode 100644 index 0000000..9659364 --- /dev/null +++ b/libs/Zend/Gdata/Books/Extension/AnnotationLink.php @@ -0,0 +1,65 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct($href, $rel, $type, $hrefLang, $title, $length); + } + +} + diff --git a/libs/Zend/Gdata/Books/Extension/BooksCategory.php b/libs/Zend/Gdata/Books/Extension/BooksCategory.php new file mode 100644 index 0000000..6f12af3 --- /dev/null +++ b/libs/Zend/Gdata/Books/Extension/BooksCategory.php @@ -0,0 +1,61 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct($term, $scheme, $label); + } + +} diff --git a/libs/Zend/Gdata/Books/Extension/BooksLink.php b/libs/Zend/Gdata/Books/Extension/BooksLink.php new file mode 100644 index 0000000..91ad027 --- /dev/null +++ b/libs/Zend/Gdata/Books/Extension/BooksLink.php @@ -0,0 +1,63 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct($href, $rel, $type, $hrefLang, $title, $length); + } + + +} + diff --git a/libs/Zend/Gdata/Books/Extension/Embeddability.php b/libs/Zend/Gdata/Books/Extension/Embeddability.php new file mode 100644 index 0000000..c6d7a86 --- /dev/null +++ b/libs/Zend/Gdata/Books/Extension/Embeddability.php @@ -0,0 +1,124 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->_value = $value; + } + + /** + * Retrieves DOMElement which corresponds to this element and all + * child properties. This is used to build this object back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistance. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc); + if ($this->_value !== null) { + $element->setAttribute('value', $this->_value); + } + return $element; + } + + /** + * Extracts XML attributes from the DOM and converts them to the + * appropriate object members. + * + * @param DOMNode $attribute The DOMNode attribute to be handled. + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'value': + $this->_value = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Returns the programmatic value that describes the embeddability of a + * volume in Google Book Search + * + * @return string|null The value + */ + public function getValue() + { + return $this->_value; + } + + /** + * Sets the programmatic value that describes the embeddability of a + * volume in Google Book Search + * + * @param string|null $value Programmatic value that describes the + * embeddability of a volume in Google Book Search + * @return Zend_Gdata_Books_Extension_Embeddability Provides a fluent + * interface + */ + public function setValue($value) + { + $this->_value = $value; + return $this; + } + +} + diff --git a/libs/Zend/Gdata/Books/Extension/InfoLink.php b/libs/Zend/Gdata/Books/Extension/InfoLink.php new file mode 100644 index 0000000..5dbbbd6 --- /dev/null +++ b/libs/Zend/Gdata/Books/Extension/InfoLink.php @@ -0,0 +1,62 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct($href, $rel, $type, $hrefLang, $title, $length); + } + +} diff --git a/libs/Zend/Gdata/Books/Extension/PreviewLink.php b/libs/Zend/Gdata/Books/Extension/PreviewLink.php new file mode 100644 index 0000000..c2d8130 --- /dev/null +++ b/libs/Zend/Gdata/Books/Extension/PreviewLink.php @@ -0,0 +1,62 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct($href, $rel, $type, $hrefLang, $title, $length); + } + +} diff --git a/libs/Zend/Gdata/Books/Extension/Review.php b/libs/Zend/Gdata/Books/Extension/Review.php new file mode 100644 index 0000000..b5d8c49 --- /dev/null +++ b/libs/Zend/Gdata/Books/Extension/Review.php @@ -0,0 +1,154 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->_lang = $lang; + $this->_type = $type; + $this->_text = $value; + } + + /** + * Retrieves DOMElement which corresponds to this element and all + * child properties. This is used to build this object back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistance. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc); + if ($this->_lang !== null) { + $element->setAttribute('lang', $this->_lang); + } + if ($this->_type !== null) { + $element->setAttribute('type', $this->_type); + } + return $element; + } + + /** + * Extracts XML attributes from the DOM and converts them to the + * appropriate object members. + * + * @param DOMNode $attribute The DOMNode attribute to be handled. + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'lang': + $this->_lang = $attribute->nodeValue; + break; + case 'type': + $this->_type = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Returns the language of link title + * + * @return string The lang + */ + public function getLang() + { + return $this->_lang; + } + + /** + * Returns the type of text construct (typically 'text', 'html' or 'xhtml') + * + * @return string The type + */ + public function getType() + { + return $this->_type; + } + + /** + * Sets the language of link title + * + * @param string $lang language of link title + * @return Zend_Gdata_Books_Extension_Review Provides a fluent interface + */ + public function setLang($lang) + { + $this->_lang = $lang; + return $this; + } + + /** + * Sets the type of text construct (typically 'text', 'html' or 'xhtml') + * + * @param string $type type of text construct (typically 'text', 'html' or 'xhtml') + * @return Zend_Gdata_Books_Extension_Review Provides a fluent interface + */ + public function setType($type) + { + $this->_type = $type; + return $this; + } + + +} + diff --git a/libs/Zend/Gdata/Books/Extension/ThumbnailLink.php b/libs/Zend/Gdata/Books/Extension/ThumbnailLink.php new file mode 100644 index 0000000..90f876a --- /dev/null +++ b/libs/Zend/Gdata/Books/Extension/ThumbnailLink.php @@ -0,0 +1,62 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct($href, $rel, $type, $hrefLang, $title, $length); + } + +} diff --git a/libs/Zend/Gdata/Books/Extension/Viewability.php b/libs/Zend/Gdata/Books/Extension/Viewability.php new file mode 100644 index 0000000..56a18ce --- /dev/null +++ b/libs/Zend/Gdata/Books/Extension/Viewability.php @@ -0,0 +1,125 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->_value = $value; + } + + /** + * Retrieves DOMElement which corresponds to this element and all + * child properties. This is used to build this object back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistance. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc); + if ($this->_value !== null) { + $element->setAttribute('value', $this->_value); + } + return $element; + } + + /** + * Extracts XML attributes from the DOM and converts them to the + * appropriate object members. + * + * @param DOMNode $attribute The DOMNode attribute to be handled. + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'value': + $this->_value = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Returns the programmatic value that describes the viewability of a volume + * in Google Book Search + * + * @return string The value + */ + public function getValue() + { + return $this->_value; + } + + /** + * Sets the programmatic value that describes the viewability of a volume in + * Google Book Search + * + * @param string $value programmatic value that describes the viewability + * of a volume in Googl eBook Search + * @return Zend_Gdata_Books_Extension_Viewability Provides a fluent + * interface + */ + public function setValue($value) + { + $this->_value = $value; + return $this; + } + + +} + diff --git a/libs/Zend/Gdata/Books/VolumeEntry.php b/libs/Zend/Gdata/Books/VolumeEntry.php new file mode 100644 index 0000000..a2ab78e --- /dev/null +++ b/libs/Zend/Gdata/Books/VolumeEntry.php @@ -0,0 +1,689 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct($element); + } + + /** + * Retrieves DOMElement which corresponds to this element and all + * child properties. This is used to build this object back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistance. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc); + if ($this->_creators !== null) { + foreach ($this->_creators as $creators) { + $element->appendChild($creators->getDOM( + $element->ownerDocument)); + } + } + if ($this->_dates !== null) { + foreach ($this->_dates as $dates) { + $element->appendChild($dates->getDOM($element->ownerDocument)); + } + } + if ($this->_descriptions !== null) { + foreach ($this->_descriptions as $descriptions) { + $element->appendChild($descriptions->getDOM( + $element->ownerDocument)); + } + } + if ($this->_formats !== null) { + foreach ($this->_formats as $formats) { + $element->appendChild($formats->getDOM( + $element->ownerDocument)); + } + } + if ($this->_identifiers !== null) { + foreach ($this->_identifiers as $identifiers) { + $element->appendChild($identifiers->getDOM( + $element->ownerDocument)); + } + } + if ($this->_languages !== null) { + foreach ($this->_languages as $languages) { + $element->appendChild($languages->getDOM( + $element->ownerDocument)); + } + } + if ($this->_publishers !== null) { + foreach ($this->_publishers as $publishers) { + $element->appendChild($publishers->getDOM( + $element->ownerDocument)); + } + } + if ($this->_subjects !== null) { + foreach ($this->_subjects as $subjects) { + $element->appendChild($subjects->getDOM( + $element->ownerDocument)); + } + } + if ($this->_titles !== null) { + foreach ($this->_titles as $titles) { + $element->appendChild($titles->getDOM($element->ownerDocument)); + } + } + if ($this->_comments !== null) { + $element->appendChild($this->_comments->getDOM( + $element->ownerDocument)); + } + if ($this->_embeddability !== null) { + $element->appendChild($this->_embeddability->getDOM( + $element->ownerDocument)); + } + if ($this->_rating !== null) { + $element->appendChild($this->_rating->getDOM( + $element->ownerDocument)); + } + if ($this->_review !== null) { + $element->appendChild($this->_review->getDOM( + $element->ownerDocument)); + } + if ($this->_viewability !== null) { + $element->appendChild($this->_viewability->getDOM( + $element->ownerDocument)); + } + return $element; + } + + /** + * Creates individual objects of the appropriate type and stores + * them in this object based upon DOM data. + * + * @param DOMNode $child The DOMNode to process. + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('dc') . ':' . 'creator': + $creators = new Zend_Gdata_DublinCore_Extension_Creator(); + $creators->transferFromDOM($child); + $this->_creators[] = $creators; + break; + case $this->lookupNamespace('dc') . ':' . 'date': + $dates = new Zend_Gdata_DublinCore_Extension_Date(); + $dates->transferFromDOM($child); + $this->_dates[] = $dates; + break; + case $this->lookupNamespace('dc') . ':' . 'description': + $descriptions = new Zend_Gdata_DublinCore_Extension_Description(); + $descriptions->transferFromDOM($child); + $this->_descriptions[] = $descriptions; + break; + case $this->lookupNamespace('dc') . ':' . 'format': + $formats = new Zend_Gdata_DublinCore_Extension_Format(); + $formats->transferFromDOM($child); + $this->_formats[] = $formats; + break; + case $this->lookupNamespace('dc') . ':' . 'identifier': + $identifiers = new Zend_Gdata_DublinCore_Extension_Identifier(); + $identifiers->transferFromDOM($child); + $this->_identifiers[] = $identifiers; + break; + case $this->lookupNamespace('dc') . ':' . 'language': + $languages = new Zend_Gdata_DublinCore_Extension_Language(); + $languages->transferFromDOM($child); + $this->_languages[] = $languages; + break; + case $this->lookupNamespace('dc') . ':' . 'publisher': + $publishers = new Zend_Gdata_DublinCore_Extension_Publisher(); + $publishers->transferFromDOM($child); + $this->_publishers[] = $publishers; + break; + case $this->lookupNamespace('dc') . ':' . 'subject': + $subjects = new Zend_Gdata_DublinCore_Extension_Subject(); + $subjects->transferFromDOM($child); + $this->_subjects[] = $subjects; + break; + case $this->lookupNamespace('dc') . ':' . 'title': + $titles = new Zend_Gdata_DublinCore_Extension_Title(); + $titles->transferFromDOM($child); + $this->_titles[] = $titles; + break; + case $this->lookupNamespace('gd') . ':' . 'comments': + $comments = new Zend_Gdata_Extension_Comments(); + $comments->transferFromDOM($child); + $this->_comments = $comments; + break; + case $this->lookupNamespace('gbs') . ':' . 'embeddability': + $embeddability = new Zend_Gdata_Books_Extension_Embeddability(); + $embeddability->transferFromDOM($child); + $this->_embeddability = $embeddability; + break; + case $this->lookupNamespace('gd') . ':' . 'rating': + $rating = new Zend_Gdata_Extension_Rating(); + $rating->transferFromDOM($child); + $this->_rating = $rating; + break; + case $this->lookupNamespace('gbs') . ':' . 'review': + $review = new Zend_Gdata_Books_Extension_Review(); + $review->transferFromDOM($child); + $this->_review = $review; + break; + case $this->lookupNamespace('gbs') . ':' . 'viewability': + $viewability = new Zend_Gdata_Books_Extension_Viewability(); + $viewability->transferFromDOM($child); + $this->_viewability = $viewability; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + /** + * Returns the Comments class + * + * @return Zend_Gdata_Extension_Comments|null The comments + */ + public function getComments() + { + return $this->_comments; + } + + /** + * Returns the creators + * + * @return array The creators + */ + public function getCreators() + { + return $this->_creators; + } + + /** + * Returns the dates + * + * @return array The dates + */ + public function getDates() + { + return $this->_dates; + } + + /** + * Returns the descriptions + * + * @return array The descriptions + */ + public function getDescriptions() + { + return $this->_descriptions; + } + + /** + * Returns the embeddability + * + * @return Zend_Gdata_Books_Extension_Embeddability|null The embeddability + */ + public function getEmbeddability() + { + return $this->_embeddability; + } + + /** + * Returns the formats + * + * @return array The formats + */ + public function getFormats() + { + return $this->_formats; + } + + /** + * Returns the identifiers + * + * @return array The identifiers + */ + public function getIdentifiers() + { + return $this->_identifiers; + } + + /** + * Returns the languages + * + * @return array The languages + */ + public function getLanguages() + { + return $this->_languages; + } + + /** + * Returns the publishers + * + * @return array The publishers + */ + public function getPublishers() + { + return $this->_publishers; + } + + /** + * Returns the rating + * + * @return Zend_Gdata_Extension_Rating|null The rating + */ + public function getRating() + { + return $this->_rating; + } + + /** + * Returns the review + * + * @return Zend_Gdata_Books_Extension_Review|null The review + */ + public function getReview() + { + return $this->_review; + } + + /** + * Returns the subjects + * + * @return array The subjects + */ + public function getSubjects() + { + return $this->_subjects; + } + + /** + * Returns the titles + * + * @return array The titles + */ + public function getTitles() + { + return $this->_titles; + } + + /** + * Returns the viewability + * + * @return Zend_Gdata_Books_Extension_Viewability|null The viewability + */ + public function getViewability() + { + return $this->_viewability; + } + + /** + * Sets the Comments class + * + * @param Zend_Gdata_Extension_Comments|null $comments Comments class + * @return Zend_Gdata_Books_VolumeEntry Provides a fluent interface + */ + public function setComments($comments) + { + $this->_comments = $comments; + return $this; + } + + /** + * Sets the creators + * + * @param array $creators Creators|null + * @return Zend_Gdata_Books_VolumeEntry Provides a fluent interface + */ + public function setCreators($creators) + { + $this->_creators = $creators; + return $this; + } + + /** + * Sets the dates + * + * @param array $dates dates + * @return Zend_Gdata_Books_VolumeEntry Provides a fluent interface + */ + public function setDates($dates) + { + $this->_dates = $dates; + return $this; + } + + /** + * Sets the descriptions + * + * @param array $descriptions descriptions + * @return Zend_Gdata_Books_VolumeEntry Provides a fluent interface + */ + public function setDescriptions($descriptions) + { + $this->_descriptions = $descriptions; + return $this; + } + + /** + * Sets the embeddability + * + * @param Zend_Gdata_Books_Extension_Embeddability|null $embeddability + * embeddability + * @return Zend_Gdata_Books_VolumeEntry Provides a fluent interface + */ + public function setEmbeddability($embeddability) + { + $this->_embeddability = $embeddability; + return $this; + } + + /** + * Sets the formats + * + * @param array $formats formats + * @return Zend_Gdata_Books_VolumeEntry Provides a fluent interface + */ + public function setFormats($formats) + { + $this->_formats = $formats; + return $this; + } + + /** + * Sets the identifiers + * + * @param array $identifiers identifiers + * @return Zend_Gdata_Books_VolumeEntry Provides a fluent interface + */ + public function setIdentifiers($identifiers) + { + $this->_identifiers = $identifiers; + return $this; + } + + /** + * Sets the languages + * + * @param array $languages languages + * @return Zend_Gdata_Books_VolumeEntry Provides a fluent interface + */ + public function setLanguages($languages) + { + $this->_languages = $languages; + return $this; + } + + /** + * Sets the publishers + * + * @param array $publishers publishers + * @return Zend_Gdata_Books_VolumeEntry Provides a fluent interface + */ + public function setPublishers($publishers) + { + $this->_publishers = $publishers; + return $this; + } + + /** + * Sets the rating + * + * @param Zend_Gdata_Extension_Rating|null $rating rating + * @return Zend_Gdata_Books_VolumeEntry Provides a fluent interface + */ + public function setRating($rating) + { + $this->_rating = $rating; + return $this; + } + + /** + * Sets the review + * + * @param Zend_Gdata_Books_Extension_Review|null $review review + * @return Zend_Gdata_Books_VolumeEntry Provides a fluent interface + */ + public function setReview($review) + { + $this->_review = $review; + return $this; + } + + /** + * Sets the subjects + * + * @param array $subjects subjects + * @return Zend_Gdata_Books_VolumeEntry Provides a fluent interface + */ + public function setSubjects($subjects) + { + $this->_subjects = $subjects; + return $this; + } + + /** + * Sets the titles + * + * @param array $titles titles + * @return Zend_Gdata_Books_VolumeEntry Provides a fluent interface + */ + public function setTitles($titles) + { + $this->_titles = $titles; + return $this; + } + + /** + * Sets the viewability + * + * @param Zend_Gdata_Books_Extension_Viewability|null $viewability + * viewability + * @return Zend_Gdata_Books_VolumeEntry Provides a fluent interface + */ + public function setViewability($viewability) + { + $this->_viewability = $viewability; + return $this; + } + + + /** + * Gets the volume ID based upon the atom:id value + * + * @return string The volume ID + * @throws Zend_Gdata_App_Exception + */ + public function getVolumeId() + { + $fullId = $this->getId()->getText(); + $position = strrpos($fullId, '/'); + if ($position === false) { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception('Slash not found in atom:id'); + } else { + return substr($fullId, strrpos($fullId,'/') + 1); + } + } + + /** + * Gets the thumbnail link + * + * @return Zend_Gdata_App_Extension_link|null The thumbnail link + */ + public function getThumbnailLink() + { + return $this->getLink(self::THUMBNAIL_LINK_REL); + } + + /** + * Gets the preview link + * + * @return Zend_Gdata_App_Extension_Link|null The preview link + */ + public function getPreviewLink() + { + return $this->getLink(self::PREVIEW_LINK_REL); + } + + /** + * Gets the info link + * + * @return Zend_Gdata_App_Extension_Link|null The info link + */ + public function getInfoLink() + { + return $this->getLink(self::INFO_LINK_REL); + } + + /** + * Gets the annotations link + * + * @return Zend_Gdata_App_Extension_Link|null The annotations link + */ + public function getAnnotationLink() + { + return $this->getLink(self::ANNOTATION_LINK_REL); + } + +} diff --git a/libs/Zend/Gdata/Books/VolumeFeed.php b/libs/Zend/Gdata/Books/VolumeFeed.php new file mode 100644 index 0000000..412427f --- /dev/null +++ b/libs/Zend/Gdata/Books/VolumeFeed.php @@ -0,0 +1,64 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct($element); + } + + /** + * The classname for individual feed elements. + * + * @var string + */ + protected $_entryClassName = 'Zend_Gdata_Books_VolumeEntry'; + +} + diff --git a/libs/Zend/Gdata/Books/VolumeQuery.php b/libs/Zend/Gdata/Books/VolumeQuery.php new file mode 100755 index 0000000..10603a1 --- /dev/null +++ b/libs/Zend/Gdata/Books/VolumeQuery.php @@ -0,0 +1,110 @@ +_params['min-viewability'] = 'full'; + break; + case 'partial_view': + $this->_params['min-viewability'] = 'partial'; + break; + case null: + unset($this->_params['min-viewability']); + break; + } + return $this; + } + + /** + * Minimum viewability of volumes to include in search results + * + * @return string|null min-viewability + */ + public function getMinViewability() + { + if (array_key_exists('min-viewability', $this->_params)) { + return $this->_params['min-viewability']; + } else { + return null; + } + } + + /** + * Returns the generated full query URL + * + * @return string The URL + */ + public function getQueryUrl() + { + if (isset($this->_url)) { + $url = $this->_url; + } else { + $url = Zend_Gdata_Books::VOLUME_FEED_URI; + } + if ($this->getCategory() !== null) { + $url .= '/-/' . $this->getCategory(); + } + $url = $url . $this->getQueryString(); + return $url; + } + +} diff --git a/libs/Zend/Gdata/Calendar.php b/libs/Zend/Gdata/Calendar.php new file mode 100644 index 0000000..453eaa0 --- /dev/null +++ b/libs/Zend/Gdata/Calendar.php @@ -0,0 +1,161 @@ + 'http://schemas.google.com/gCal/2005'); + + /** + * Create Gdata_Calendar object + * + * @param Zend_Http_Client $client (optional) The HTTP client to use when + * when communicating with the Google servers. + * @param string $applicationId The identity of the app in the form of Company-AppName-Version + */ + public function __construct($client = null, $applicationId = 'MyCompany-MyApp-1.0') + { + $this->registerPackage('Zend_Gdata_Calendar'); + $this->registerPackage('Zend_Gdata_Calendar_Extension'); + parent::__construct($client, $applicationId); + $this->_httpClient->setParameterPost('service', self::AUTH_SERVICE_NAME); + } + + /** + * Retreive feed object + * + * @param mixed $location The location for the feed, as a URL or Query + * @return Zend_Gdata_Calendar_EventFeed + */ + public function getCalendarEventFeed($location = null) + { + if ($location == null) { + $uri = self::CALENDAR_EVENT_FEED_URI; + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getFeed($uri, 'Zend_Gdata_Calendar_EventFeed'); + } + + /** + * Retreive entry object + * + * @return Zend_Gdata_Calendar_EventEntry + */ + public function getCalendarEventEntry($location = null) + { + if ($location == null) { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'Location must not be null'); + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getEntry($uri, 'Zend_Gdata_Calendar_EventEntry'); + } + + + /** + * Retrieve feed object + * + * @return Zend_Gdata_Calendar_ListFeed + */ + public function getCalendarListFeed() + { + $uri = self::CALENDAR_FEED_URI . '/default'; + return parent::getFeed($uri,'Zend_Gdata_Calendar_ListFeed'); + } + + /** + * Retreive entryobject + * + * @return Zend_Gdata_Calendar_ListEntry + */ + public function getCalendarListEntry($location = null) + { + if ($location == null) { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'Location must not be null'); + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getEntry($uri,'Zend_Gdata_Calendar_ListEntry'); + } + + public function insertEvent($event, $uri=null) + { + if ($uri == null) { + $uri = $this->_defaultPostUri; + } + $newEvent = $this->insertEntry($event, $uri, 'Zend_Gdata_Calendar_EventEntry'); + return $newEvent; + } + +} diff --git a/libs/Zend/Gdata/Calendar/EventEntry.php b/libs/Zend/Gdata/Calendar/EventEntry.php new file mode 100644 index 0000000..f147e4f --- /dev/null +++ b/libs/Zend/Gdata/Calendar/EventEntry.php @@ -0,0 +1,160 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct($element); + } + + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_sendEventNotifications != null) { + $element->appendChild($this->_sendEventNotifications->getDOM($element->ownerDocument)); + } + if ($this->_timezone != null) { + $element->appendChild($this->_timezone->getDOM($element->ownerDocument)); + } + if ($this->_quickadd != null) { + $element->appendChild($this->_quickadd->getDOM($element->ownerDocument)); + } + return $element; + } + + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + + switch ($absoluteNodeName) { + case $this->lookupNamespace('gCal') . ':' . 'sendEventNotifications'; + $sendEventNotifications = new Zend_Gdata_Calendar_Extension_SendEventNotifications(); + $sendEventNotifications->transferFromDOM($child); + $this->_sendEventNotifications = $sendEventNotifications; + break; + case $this->lookupNamespace('gCal') . ':' . 'timezone'; + $timezone = new Zend_Gdata_Calendar_Extension_Timezone(); + $timezone->transferFromDOM($child); + $this->_timezone = $timezone; + break; + case $this->lookupNamespace('atom') . ':' . 'link'; + $link = new Zend_Gdata_Calendar_Extension_Link(); + $link->transferFromDOM($child); + $this->_link[] = $link; + break; + case $this->lookupNamespace('gCal') . ':' . 'quickadd'; + $quickadd = new Zend_Gdata_Calendar_Extension_QuickAdd(); + $quickadd->transferFromDOM($child); + $this->_quickadd = $quickadd; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + public function getSendEventNotifications() + { + return $this->_sendEventNotifications; + } + + public function setSendEventNotifications($value) + { + $this->_sendEventNotifications = $value; + return $this; + } + + public function getTimezone() + { + return $this->_timezone; + } + + /** + * @param Zend_Gdata_Calendar_Extension_Timezone $value + * @return Zend_Gdata_Extension_EventEntry Provides a fluent interface + */ + public function setTimezone($value) + { + $this->_timezone = $value; + return $this; + } + + public function getQuickAdd() + { + return $this->_quickadd; + } + + /** + * @param Zend_Gdata_Calendar_Extension_QuickAdd $value + * @return Zend_Gdata_Extension_ListEntry Provides a fluent interface + */ + public function setQuickAdd($value) + { + $this->_quickadd = $value; + return $this; + } + +} diff --git a/libs/Zend/Gdata/Calendar/EventFeed.php b/libs/Zend/Gdata/Calendar/EventFeed.php new file mode 100644 index 0000000..b41cb45 --- /dev/null +++ b/libs/Zend/Gdata/Calendar/EventFeed.php @@ -0,0 +1,107 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct($element); + + } + + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_timezone != null) { + $element->appendChild($this->_timezone->getDOM($element->ownerDocument)); + } + + return $element; + } + + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + + switch ($absoluteNodeName) { + case $this->lookupNamespace('gCal') . ':' . 'timezone'; + $timezone = new Zend_Gdata_Calendar_Extension_Timezone(); + $timezone->transferFromDOM($child); + $this->_timezone = $timezone; + break; + + default: + parent::takeChildFromDOM($child); + break; + } + } + + public function getTimezone() + { + return $this->_timezone; + } + + public function setTimezone($value) + { + $this->_timezone = $value; + return $this; + } + +} diff --git a/libs/Zend/Gdata/Calendar/EventQuery.php b/libs/Zend/Gdata/Calendar/EventQuery.php new file mode 100644 index 0000000..7667015 --- /dev/null +++ b/libs/Zend/Gdata/Calendar/EventQuery.php @@ -0,0 +1,445 @@ +_comments = $value; + return $this; + } + + /** + * @param string $value + * @return Zend_Gdata_Calendar_EventQuery Provides a fluent interface + */ + public function setEvent($value) + { + $this->_event = $value; + return $this; + } + + /** + * @param string $value + * @return Zend_Gdata_Calendar_EventQuery Provides a fluent interface + */ + public function setProjection($value) + { + $this->_projection = $value; + return $this; + } + + /** + * @param string $value + * @return Zend_Gdata_Calendar_EventQuery Provides a fluent interface + */ + public function setUser($value) + { + $this->_user = $value; + return $this; + } + + /** + * @param bool $value + * @return Zend_Gdata_Calendar_EventQuery Provides a fluent interface + */ + public function setVisibility($value) + { + $this->_visibility = $value; + return $this; + } + + /** + * @return string comments + */ + public function getComments() + { + return $this->_comments; + } + + /** + * @return string event + */ + public function getEvent() + { + return $this->_event; + } + + /** + * @return string projection + */ + public function getProjection() + { + return $this->_projection; + } + + /** + * @return string user + */ + public function getUser() + { + return $this->_user; + } + + /** + * @return string visibility + */ + public function getVisibility() + { + return $this->_visibility; + } + + /** + * @param int $value + * @return Zend_Gdata_Calendar_EventQuery Provides a fluent interface + */ + public function setStartMax($value) + { + if ($value != null) { + $this->_params['start-max'] = Zend_Gdata_App_Util::formatTimestamp($value); + } else { + unset($this->_params['start-max']); + } + return $this; + } + + /** + * @param int $value + * @return Zend_Gdata_Calendar_EventQuery Provides a fluent interface + */ + public function setStartMin($value) + { + if ($value != null) { + $this->_params['start-min'] = Zend_Gdata_App_Util::formatTimestamp($value); + } else { + unset($this->_params['start-min']); + } + return $this; + } + + /** + * @param string $value + * @return Zend_Gdata_Calendar_EventQuery Provides a fluent interface + */ + public function setOrderBy($value) + { + if ($value != null) { + $this->_params['orderby'] = $value; + } else { + unset($this->_params['orderby']); + } + return $this; + } + + /** + * @return int start-max + */ + public function getStartMax() + { + if (array_key_exists('start-max', $this->_params)) { + return $this->_params['start-max']; + } else { + return null; + } + } + + /** + * @return int start-min + */ + public function getStartMin() + { + if (array_key_exists('start-min', $this->_params)) { + return $this->_params['start-min']; + } else { + return null; + } + } + + /** + * @return string orderby + */ + public function getOrderBy() + { + if (array_key_exists('orderby', $this->_params)) { + return $this->_params['orderby']; + } else { + return null; + } + } + + /** + * @return string sortorder + */ + public function getSortOrder() + { + if (array_key_exists('sortorder', $this->_params)) { + return $this->_params['sortorder']; + } else { + return null; + } + } + + /** + * @return string sortorder + */ + public function setSortOrder($value) + { + if ($value != null) { + $this->_params['sortorder'] = $value; + } else { + unset($this->_params['sortorder']); + } + return $this; + } + + /** + * @return string recurrence-expansion-start + */ + public function getRecurrenceExpansionStart() + { + if (array_key_exists('recurrence-expansion-start', $this->_params)) { + return $this->_params['recurrence-expansion-start']; + } else { + return null; + } + } + + /** + * @return string recurrence-expansion-start + */ + public function setRecurrenceExpansionStart($value) + { + if ($value != null) { + $this->_params['recurrence-expansion-start'] = Zend_Gdata_App_Util::formatTimestamp($value); + } else { + unset($this->_params['recurrence-expansion-start']); + } + return $this; + } + + + /** + * @return string recurrence-expansion-end + */ + public function getRecurrenceExpansionEnd() + { + if (array_key_exists('recurrence-expansion-end', $this->_params)) { + return $this->_params['recurrence-expansion-end']; + } else { + return null; + } + } + + /** + * @return string recurrence-expansion-end + */ + public function setRecurrenceExpansionEnd($value) + { + if ($value != null) { + $this->_params['recurrence-expansion-end'] = Zend_Gdata_App_Util::formatTimestamp($value); + } else { + unset($this->_params['recurrence-expansion-end']); + } + return $this; + } + + /** + * @param string $value Also accepts bools. + * @return Zend_Gdata_Calendar_EventQuery Provides a fluent interface + */ + public function getSingleEvents() + { + if (array_key_exists('singleevents', $this->_params)) { + $value = $this->_params['singleevents']; + switch ($value) { + case 'true': + return true; + break; + case 'false': + return false; + break; + default: + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception( + 'Invalid query param value for futureevents: ' . + $value . ' It must be a boolean.'); + } + } else { + return null; + } + } + + /** + * @param string $value Also accepts bools. If using a string, must be either "true" or "false". + * @return Zend_Gdata_Calendar_EventQuery Provides a fluent interface + */ + public function setSingleEvents($value) + { + if (!is_null($value)) { + if (is_bool($value)) { + $this->_params['singleevents'] = ($value?'true':'false'); + } elseif ($value == 'true' | $value == 'false') { + $this->_params['singleevents'] = $value; + } else { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception( + 'Invalid query param value for futureevents: ' . + $value . ' It must be a boolean.'); + } + } else { + unset($this->_params['singleevents']); + } + return $this; + } + + /** + * @return string futureevents + */ + public function getFutureEvents() + { + if (array_key_exists('futureevents', $this->_params)) { + $value = $this->_params['futureevents']; + switch ($value) { + case 'true': + return true; + break; + case 'false': + return false; + break; + default: + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception( + 'Invalid query param value for futureevents: ' . + $value . ' It must be a boolean.'); + } + } else { + return null; + } + } + + /** + * @param string $value Also accepts bools. If using a string, must be either "true" or "false" or + * an exception will be thrown on retrieval. + * @return Zend_Gdata_Calendar_EventQuery Provides a fluent interface + */ + public function setFutureEvents($value) + { + if (!is_null($value)) { + if (is_bool($value)) { + $this->_params['futureevents'] = ($value?'true':'false'); + } elseif ($value == 'true' | $value == 'false') { + $this->_params['futureevents'] = $value; + } else { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception( + 'Invalid query param value for futureevents: ' . + $value . ' It must be a boolean.'); + } + } else { + unset($this->_params['futureevents']); + } + return $this; + } + + /** + * @return string url + */ + public function getQueryUrl() + { + if (isset($this->_url)) { + $uri = $this->_url; + } else { + $uri = $this->_defaultFeedUri; + } + if ($this->getUser() != null) { + $uri .= '/' . $this->getUser(); + } else { + $uri .= '/default'; + } + if ($this->getVisibility() != null) { + $uri .= '/' . $this->getVisibility(); + } else { + $uri .= '/public'; + } + if ($this->getProjection() != null) { + $uri .= '/' . $this->getProjection(); + } else { + $uri .= '/full'; + } + if ($this->getEvent() != null) { + $uri .= '/' . $this->getEvent(); + if ($this->getComments() != null) { + $uri .= '/comments/' . $this->getComments(); + } + } + $uri .= $this->getQueryString(); + return $uri; + } + +} diff --git a/libs/Zend/Gdata/Calendar/Extension/AccessLevel.php b/libs/Zend/Gdata/Calendar/Extension/AccessLevel.php new file mode 100644 index 0000000..70c544a --- /dev/null +++ b/libs/Zend/Gdata/Calendar/Extension/AccessLevel.php @@ -0,0 +1,129 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->_value = $value; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_value != null) { + $element->setAttribute('value', $this->_value); + } + 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 + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'value': + $this->_value = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Get the value for this element's value attribute. + * + * @return string The attribute being modified. + */ + public function getValue() + { + return $this->_value; + } + + + /** + * Set the value for this element's value attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Calendar_Extension_Selected The element being modified. + */ + public function setValue($value) + { + $this->_value = $value; + return $this; + } + + /** + * Magic toString method allows using this directly via echo + * Works best in PHP >= 4.2.0 + */ + public function __toString() + { + return $this->getValue(); + } + +} diff --git a/libs/Zend/Gdata/Calendar/Extension/Color.php b/libs/Zend/Gdata/Calendar/Extension/Color.php new file mode 100644 index 0000000..0b2d14d --- /dev/null +++ b/libs/Zend/Gdata/Calendar/Extension/Color.php @@ -0,0 +1,124 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->_value = $value; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_value != null) { + $element->setAttribute('value', $this->_value); + } + 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 + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'value': + $this->_value = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Get the value for this element's value attribute. + * + * @return string The value associated with this attribute. + */ + public function getValue() + { + return $this->_value; + } + + /** + * Set the value for this element's value attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Calendar_Extension_Color The element being modified. + */ + public function setValue($value) + { + $this->_value = $value; + return $this; + } + + /** + * Magic toString method allows using this directly via echo + * Works best in PHP >= 4.2.0 + */ + public function __toString() + { + return $this->_value; + } + +} diff --git a/libs/Zend/Gdata/Calendar/Extension/Hidden.php b/libs/Zend/Gdata/Calendar/Extension/Hidden.php new file mode 100644 index 0000000..eb9c714 --- /dev/null +++ b/libs/Zend/Gdata/Calendar/Extension/Hidden.php @@ -0,0 +1,133 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->_value = $value; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_value !== null) { + $element->setAttribute('value', ($this->_value ? "true" : "false")); + } + 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 + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'value': + if ($attribute->nodeValue == "true") { + $this->_value = true; + } + else if ($attribute->nodeValue == "false") { + $this->_value = false; + } + else { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException("Expected 'true' or 'false' for gCal:selected#value."); + } + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Get the value for this element's value attribute. + * + * @return string The requested attribute. + */ + public function getValue() + { + return $this->_value; + } + + /** + * Set the value for this element's value attribute. + * + * @param bool $value The desired value for this attribute. + * @return Zend_Gdata_Calendar_Extension_Hidden The element being modified. + */ + public function setValue($value) + { + $this->_value = $value; + return $this; + } + + /** + * Magic toString method allows using this directly via echo + * Works best in PHP >= 4.2.0 + */ + public function __toString() + { + return $this->_value; + } + +} + diff --git a/libs/Zend/Gdata/Calendar/Extension/Link.php b/libs/Zend/Gdata/Calendar/Extension/Link.php new file mode 100644 index 0000000..b218a76 --- /dev/null +++ b/libs/Zend/Gdata/Calendar/Extension/Link.php @@ -0,0 +1,125 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct($href, $rel, $type, $hrefLang, $title, $length); + $this->_webContent = $webContent; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_webContent != null) { + $element->appendChild($this->_webContent->getDOM($element->ownerDocument)); + } + return $element; + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them as members of this entry based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('gCal') . ':' . 'webContent': + $webContent = new Zend_Gdata_Calendar_Extension_WebContent(); + $webContent->transferFromDOM($child); + $this->_webContent = $webContent; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + /** + * Get the value for this element's WebContent attribute. + * + * @return Zend_Gdata_Calendar_Extension_Webcontent The WebContent value + */ + public function getWebContent() + { + return $this->_webContent; + } + + /** + * Set the value for this element's WebContent attribute. + * + * @param Zend_Gdata_Calendar_Extension_WebContent $value The desired value for this attribute. + * @return Zend_Calendar_Extension_Link The element being modified. Provides a fluent interface. + */ + public function setWebContent($value) + { + $this->_webContent = $value; + return $this; + } + + +} + diff --git a/libs/Zend/Gdata/Calendar/Extension/QuickAdd.php b/libs/Zend/Gdata/Calendar/Extension/QuickAdd.php new file mode 100644 index 0000000..719560b --- /dev/null +++ b/libs/Zend/Gdata/Calendar/Extension/QuickAdd.php @@ -0,0 +1,131 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->_value = $value; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_value !== null) { + $element->setAttribute('value', ($this->_value ? "true" : "false")); + } + 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 + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'value': + if ($attribute->nodeValue == "true") { + $this->_value = true; + } + else if ($attribute->nodeValue == "false") { + $this->_value = false; + } + else { + throw new Zend_Gdata_App_InvalidArgumentException("Expected 'true' or 'false' for gCal:selected#value."); + } + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Get the value for this element's value attribute. + * + * @return string The value associated with this attribute. + */ + public function getValue() + { + return $this->_value; + } + + /** + * Set the value for this element's value attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Calendar_Extension_QuickAdd The element being modified. + */ + public function setValue($value) + { + $this->_value = $value; + return $this; + } + + /** + * Magic toString method allows using this directly via echo + * Works best in PHP >= 4.2.0 + */ + public function __toString() + { + return $this->getValue(); + } + +} diff --git a/libs/Zend/Gdata/Calendar/Extension/Selected.php b/libs/Zend/Gdata/Calendar/Extension/Selected.php new file mode 100644 index 0000000..cd8d444 --- /dev/null +++ b/libs/Zend/Gdata/Calendar/Extension/Selected.php @@ -0,0 +1,132 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->_value = $value; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_value !== null) { + $element->setAttribute('value', ($this->_value ? "true" : "false")); + } + 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 + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'value': + if ($attribute->nodeValue == "true") { + $this->_value = true; + } + else if ($attribute->nodeValue == "false") { + $this->_value = false; + } + else { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException("Expected 'true' or 'false' for gCal:selected#value."); + } + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Get the value for this element's value attribute. + * + * @return bool The value associated with this attribute. + */ + public function getValue() + { + return $this->_value; + } + + /** + * Set the value for this element's value attribute. + * + * @param bool $value The desired value for this attribute. + * @return Zend_Gdata_Calendar_Extension_Selected The element being modified. + */ + public function setValue($value) + { + $this->_value = $value; + return $this; + } + + /** + * Magic toString method allows using this directly via echo + * Works best in PHP >= 4.2.0 + */ + public function __toString() + { + return $this->_value; + } + +} diff --git a/libs/Zend/Gdata/Calendar/Extension/SendEventNotifications.php b/libs/Zend/Gdata/Calendar/Extension/SendEventNotifications.php new file mode 100644 index 0000000..fe04cc3 --- /dev/null +++ b/libs/Zend/Gdata/Calendar/Extension/SendEventNotifications.php @@ -0,0 +1,131 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->_value = $value; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_value !== null) { + $element->setAttribute('value', ($this->_value ? "true" : "false")); + } + 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 + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'value': + if ($attribute->nodeValue == "true") { + $this->_value = true; + } + else if ($attribute->nodeValue == "false") { + $this->_value = false; + } + else { + throw new Zend_Gdata_App_InvalidArgumentException("Expected 'true' or 'false' for gCal:selected#value."); + } + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Get the value for this element's Value attribute. + * + * @return string The requested attribute. + */ + public function getValue() + { + return $this->_value; + } + + /** + * Set the value for this element's Value attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Extension_SendEventNotifications The element being modified. + */ + public function setValue($value) + { + $this->_value = $value; + return $this; + } + + /** + * Magic toString method allows using this directly via echo + * Works best in PHP >= 4.2.0 + */ + public function __toString() + { + return $this->getValue(); + } + +} + diff --git a/libs/Zend/Gdata/Calendar/Extension/Timezone.php b/libs/Zend/Gdata/Calendar/Extension/Timezone.php new file mode 100644 index 0000000..a330f37 --- /dev/null +++ b/libs/Zend/Gdata/Calendar/Extension/Timezone.php @@ -0,0 +1,123 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->_value = $value; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_value != null) { + $element->setAttribute('value', $this->_value); + } + 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 + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'value': + $this->_value = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Get the value for this element's value attribute. + * + * @return string The value associated with this attribute. + */ + public function getValue() + { + return $this->_value; + } + + /** + * Set the value for this element's value attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Calendar_Extension_Timezone The element being modified. + */ + public function setValue($value) + { + $this->_value = $value; + return $this; + } + + /** + * Magic toString method allows using this directly via echo + * Works best in PHP >= 4.2.0 + */ + public function __toString() + { + return $this->getValue(); + } + +} diff --git a/libs/Zend/Gdata/Calendar/Extension/WebContent.php b/libs/Zend/Gdata/Calendar/Extension/WebContent.php new file mode 100644 index 0000000..ee450bf --- /dev/null +++ b/libs/Zend/Gdata/Calendar/Extension/WebContent.php @@ -0,0 +1,176 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->_url = $url; + $this->_height = $height; + $this->_width = $width; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->url != null) { + $element->setAttribute('url', $this->_url); + } + if ($this->height != null) { + $element->setAttribute('height', $this->_height); + } + if ($this->width != null) { + $element->setAttribute('width', $this->_width); + } + 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 + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'url': + $this->_url = $attribute->nodeValue; + break; + case 'height': + $this->_height = $attribute->nodeValue; + break; + case 'width': + $this->_width = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Get the value for this element's URL attribute. + * + * @return string The desired value for this attribute. + */ + public function getURL() + { + return $this->_url; + } + + /** + * Set the value for this element's URL attribute. + * + * @param bool $value The desired value for this attribute. + * @return Zend_Gdata_Calendar_Extension_WebContent The element being modified. + */ + public function setURL($value) + { + $this->_url = $value; + return $this; + } + + /** + * Get the value for this element's height attribute. + * + * @return int The desired value for this attribute. + */ + public function getHeight() + { + return $this->_height; + } + + /** + * Set the value for this element's height attribute. + * + * @param int $value The desired value for this attribute. + * @return Zend_Gdata_Calendar_Extension_WebContent The element being modified. + */ + public function setHeight($value) + { + $this->_height = $value; + return $this; + } + + /** + * Get the value for this element's height attribute. + * + * @return int The desired value for this attribute. + */ + public function getWidth() + { + return $this->_width; + } + + /** + * Set the value for this element's height attribute. + * + * @param int $value The desired value for this attribute. + * @return Zend_Gdata_Calendar_Extension_WebContent The element being modified. + */ + public function setWidth($value) + { + $this->_width = $value; + return $this; + } + +} diff --git a/libs/Zend/Gdata/Calendar/ListEntry.php b/libs/Zend/Gdata/Calendar/ListEntry.php new file mode 100644 index 0000000..b92cb88 --- /dev/null +++ b/libs/Zend/Gdata/Calendar/ListEntry.php @@ -0,0 +1,246 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct($element); + } + + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_accessLevel != null) { + $element->appendChild($this->_accessLevel->getDOM($element->ownerDocument)); + } + if ($this->_color != null) { + $element->appendChild($this->_color->getDOM($element->ownerDocument)); + } + if ($this->_hidden != null) { + $element->appendChild($this->_hidden->getDOM($element->ownerDocument)); + } + if ($this->_selected != null) { + $element->appendChild($this->_selected->getDOM($element->ownerDocument)); + } + if ($this->_timezone != null) { + $element->appendChild($this->_timezone->getDOM($element->ownerDocument)); + } + if ($this->_where != null) { + foreach ($this->_where as $where) { + $element->appendChild($where->getDOM($element->ownerDocument)); + } + } + return $element; + } + + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('gCal') . ':' . 'accesslevel'; + $accessLevel = new Zend_Gdata_Calendar_Extension_AccessLevel(); + $accessLevel->transferFromDOM($child); + $this->_accessLevel = $accessLevel; + break; + case $this->lookupNamespace('gCal') . ':' . 'color'; + $color = new Zend_Gdata_Calendar_Extension_Color(); + $color->transferFromDOM($child); + $this->_color = $color; + break; + case $this->lookupNamespace('gCal') . ':' . 'hidden'; + $hidden = new Zend_Gdata_Calendar_Extension_Hidden(); + $hidden->transferFromDOM($child); + $this->_hidden = $hidden; + break; + case $this->lookupNamespace('gCal') . ':' . 'selected'; + $selected = new Zend_Gdata_Calendar_Extension_Selected(); + $selected->transferFromDOM($child); + $this->_selected = $selected; + break; + case $this->lookupNamespace('gCal') . ':' . 'timezone'; + $timezone = new Zend_Gdata_Calendar_Extension_Timezone(); + $timezone->transferFromDOM($child); + $this->_timezone = $timezone; + break; + case $this->lookupNamespace('gd') . ':' . 'where'; + $where = new Zend_Gdata_Extension_Where(); + $where->transferFromDOM($child); + $this->_where[] = $where; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + public function getAccessLevel() + { + return $this->_accessLevel; + } + + /** + * @param Zend_Gdata_Calendar_Extension_AccessLevel $value + * @return Zend_Gdata_Extension_ListEntry Provides a fluent interface + */ + public function setAccessLevel($value) + { + $this->_accessLevel = $value; + return $this; + } + public function getColor() + { + return $this->_color; + } + + /** + * @param Zend_Gdata_Calendar_Extension_Color $value + * @return Zend_Gdata_Extension_ListEntry Provides a fluent interface + */ + public function setColor($value) + { + $this->_color = $value; + return $this; + } + + public function getHidden() + { + return $this->_hidden; + } + + /** + * @param Zend_Gdata_Calendar_Extension_Hidden $value + * @return Zend_Gdata_Extension_ListEntry Provides a fluent interface + */ + public function setHidden($value) + { + $this->_hidden = $value; + return $this; + } + + public function getSelected() + { + return $this->_selected; + } + + /** + * @param Zend_Gdata_Calendar_Extension_Selected $value + * @return Zend_Gdata_Extension_ListEntry Provides a fluent interface + */ + public function setSelected($value) + { + $this->_selected = $value; + return $this; + } + + public function getTimezone() + { + return $this->_timezone; + } + + /** + * @param Zend_Gdata_Calendar_Extension_Timezone $value + * @return Zend_Gdata_Extension_ListEntry Provides a fluent interface + */ + public function setTimezone($value) + { + $this->_timezone = $value; + return $this; + } + + public function getWhere() + { + return $this->_where; + } + + /** + * @param Zend_Gdata_Extension_Where $value + * @return Zend_Gdata_Extension_ListEntry Provides a fluent interface + */ + public function setWhere($value) + { + $this->_where = $value; + return $this; + } + +} diff --git a/libs/Zend/Gdata/Calendar/ListFeed.php b/libs/Zend/Gdata/Calendar/ListFeed.php new file mode 100644 index 0000000..d0b0ffb --- /dev/null +++ b/libs/Zend/Gdata/Calendar/ListFeed.php @@ -0,0 +1,106 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct($element); + } + + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_timezone != null) { + $element->appendChild($this->_timezone->getDOM($element->ownerDocument)); + } + return $element; + } + + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('gCal') . ':' . 'timezone'; + $timezone = new Zend_Gdata_Calendar_Extension_Timezone(); + $timezone->transferFromDOM($child); + $this->_timezone = $timezone; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + public function getTimezone() + { + return $this->_timezone; + } + + /** + * @param Zend_Gdata_Calendar_Extension_Timezone $value + * @return Zend_Gdata_Extension_ListEntry Provides a fluent interface + */ + public function setTimezone($value) + { + $this->_timezone = $value; + return $this; + } + +} diff --git a/libs/Zend/Gdata/ClientLogin.php b/libs/Zend/Gdata/ClientLogin.php new file mode 100644 index 0000000..18c4358 --- /dev/null +++ b/libs/Zend/Gdata/ClientLogin.php @@ -0,0 +1,180 @@ +setUri($loginUri); + $useragent = $source . ' Zend_Framework_Gdata/' . Zend_Version::VERSION; + $client->setConfig(array( + 'maxredirects' => 0, + 'strictredirects' => true, + 'useragent' => $useragent + ) + ); + $client->setParameterPost('accountType', $accountType); + $client->setParameterPost('Email', (string) $email); + $client->setParameterPost('Passwd', (string) $password); + $client->setParameterPost('service', (string) $service); + $client->setParameterPost('source', (string) $source); + if ($loginToken || $loginCaptcha) { + if($loginToken && $loginCaptcha) { + $client->setParameterPost('logintoken', (string) $loginToken); + $client->setParameterPost('logincaptcha', + (string) $loginCaptcha); + } + else { + require_once 'Zend/Gdata/App/AuthException.php'; + throw new Zend_Gdata_App_AuthException( + 'Please provide both a token ID and a user\'s response ' . + 'to the CAPTCHA challenge.'); + } + } + + // Send the authentication request + // For some reason Google's server causes an SSL error. We use the + // output buffer to supress an error from being shown. Ugly - but works! + ob_start(); + try { + $response = $client->request('POST'); + } catch (Zend_Http_Client_Exception $e) { + require_once 'Zend/Gdata/App/HttpException.php'; + throw new Zend_Gdata_App_HttpException($e->getMessage(), $e); + } + ob_end_clean(); + + // Parse Google's response + $goog_resp = array(); + foreach (explode("\n", $response->getBody()) as $l) { + $l = chop($l); + if ($l) { + list($key, $val) = explode('=', chop($l), 2); + $goog_resp[$key] = $val; + } + } + + if ($response->getStatus() == 200) { + $client = new Zend_Gdata_HttpClient(); + $client->setClientLoginToken($goog_resp['Auth']); + $useragent = $source . ' Zend_Framework_Gdata/' . Zend_Version::VERSION; + $client->setConfig(array( + 'strictredirects' => true, + 'useragent' => $useragent + ) + ); + return $client; + + } elseif ($response->getStatus() == 403) { + // Check if the server asked for a CAPTCHA + if (array_key_exists('Error', $goog_resp) && + $goog_resp['Error'] == 'CaptchaRequired') { + require_once 'Zend/Gdata/App/CaptchaRequiredException.php'; + throw new Zend_Gdata_App_CaptchaRequiredException( + $goog_resp['CaptchaToken'], $goog_resp['CaptchaUrl']); + } + else { + require_once 'Zend/Gdata/App/AuthException.php'; + throw new Zend_Gdata_App_AuthException('Authentication with Google failed. Reason: ' . + (isset($goog_resp['Error']) ? $goog_resp['Error'] : 'Unspecified.')); + } + } + } + +} + diff --git a/libs/Zend/Gdata/Docs.php b/libs/Zend/Gdata/Docs.php new file mode 100755 index 0000000..29aa3b4 --- /dev/null +++ b/libs/Zend/Gdata/Docs.php @@ -0,0 +1,255 @@ +'text/csv', + 'DOC'=>'application/msword', + 'ODS'=>'application/vnd.oasis.opendocument.spreadsheet', + 'ODT'=>'application/vnd.oasis.opendocument.text', + 'RTF'=>'application/rtf', + 'SXW'=>'application/vnd.sun.xml.writer', + 'TXT'=>'text/plain', + 'XLS'=>'application/vnd.ms-excel'); + + /** + * Create Gdata_Docs object + * + * @param Zend_Http_Client $client (optional) The HTTP client to use when + * when communicating with the Google servers. + * @param string $applicationId The identity of the app in the form of Company-AppName-Version + */ + public function __construct($client = null, $applicationId = 'MyCompany-MyApp-1.0') + { + $this->registerPackage('Zend_Gdata_Docs'); + parent::__construct($client, $applicationId); + $this->_httpClient->setParameterPost('service', self::AUTH_SERVICE_NAME); + } + + /** + * 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 + * the upload HTTP POST request. + * + * @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. + */ + public static function lookupMimeType($fileExtension) { + return self::$SUPPORTED_FILETYPES[strtoupper($fileExtension)]; + } + + /** + * Retreive feed object containing entries for the user's documents. + * + * @param mixed $location The location for the feed, as a URL or Query + * @return Zend_Gdata_Docs_DocumentListFeed + */ + public function getDocumentListFeed($location = null) + { + if ($location === null) { + $uri = self::DOCUMENTS_LIST_FEED_URI; + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getFeed($uri, 'Zend_Gdata_Docs_DocumentListFeed'); + } + + /** + * Retreive entry object representing a single document. + * + * @param mixed $location The location for the entry, as a URL or Query + * @return Zend_Gdata_Docs_DocumentListEntry + */ + public function getDocumentListEntry($location = null) + { + if ($location === null) { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'Location must not be null'); + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getEntry($uri, 'Zend_Gdata_Docs_DocumentListEntry'); + } + + /** + * Retreive entry object representing a single document. + * + * 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: + * 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/' . + $docType . '%3A' . $docId; + return $this->getDocumentListEntry($location); + } + + /** + * Retreive entry object for the desired word processing document. + * + * @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: + * 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: + * dcmg89gw_21gtrjcn + */ + public function getPresentation($id) { + return $this->getDoc($id, 'presentation'); + } + + /** + * 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 + * 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 + * mimeType is provided, this method attempts to determine the + * 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 + * which are enumerated in SUPPORTED_FILETYPES. + * @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 + * created Google Document. + */ + 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) { + $slugHeader = $title; + } 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 + // for the original file. + $fs->setSlug($slugHeader); + + // Set the mime type of the data. + if ($mimeType === null) { + $slugHeader = $fs->getSlug(); + $filenameParts = explode('.', $slugHeader); + $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); + } + + /** + * Inserts an entry to a given URI and returns the response as an Entry. + * + * @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 have the correct slug header and mime type. + * @param string $uri POST URI + * @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 + * service after insertion. + */ + 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 new file mode 100755 index 0000000..23c2e76 --- /dev/null +++ b/libs/Zend/Gdata/Docs/DocumentListEntry.php @@ -0,0 +1,54 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct($element); + } + +} diff --git a/libs/Zend/Gdata/Docs/DocumentListFeed.php b/libs/Zend/Gdata/Docs/DocumentListFeed.php new file mode 100755 index 0000000..31c61c0 --- /dev/null +++ b/libs/Zend/Gdata/Docs/DocumentListFeed.php @@ -0,0 +1,68 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct($element); + } + +} diff --git a/libs/Zend/Gdata/Docs/Query.php b/libs/Zend/Gdata/Docs/Query.php new file mode 100755 index 0000000..f90baa2 --- /dev/null +++ b/libs/Zend/Gdata/Docs/Query.php @@ -0,0 +1,220 @@ +_projection = $value; + return $this; + } + + /** + * Sets the visibility for this query. Common values for visibility + * include 'private'. + * + * @return Zend_Gdata_Docs_Query Provides a fluent interface + */ + public function setVisibility($value) + { + $this->_visibility = $value; + return $this; + } + + /** + * Gets the projection for this query. + * + * @return string projection + */ + public function getProjection() + { + return $this->_projection; + } + + /** + * Gets the visibility for this query. + * + * @return string visibility + */ + public function getVisibility() + { + return $this->_visibility; + } + + /** + * Sets the title attribute for this query. The title parameter is used + * to restrict the results to documents whose titles either contain or + * completely match the title. + * + * @param string $value + * @return Zend_Gdata_Docs_Query Provides a fluent interface + */ + public function setTitle($value) + { + if ($value !== null) { + $this->_params['title'] = $value; + } else { + unset($this->_params['title']); + } + return $this; + } + + /** + * Gets the title attribute for this query. + * + * @return string title + */ + public function getTitle() + { + if (array_key_exists('title', $this->_params)) { + return $this->_params['title']; + } else { + return null; + } + } + + /** + * Sets the title-exact attribute for this query. + * If title-exact is set to true, the title query parameter will be used + * in an exact match. Only documents with a title identical to the + * title parameter will be returned. + * + * @param boolean $value Use either true or false + * @return Zend_Gdata_Docs_Query Provides a fluent interface + */ + public function setTitleExact($value) + { + if ($value) { + $this->_params['title-exact'] = $value; + } else { + unset($this->_params['title-exact']); + } + return $this; + } + + /** + * Gets the title-exact attribute for this query. + * + * @return string title-exact + */ + public function getTitleExact() + { + if (array_key_exists('title-exact', $this->_params)) { + return $this->_params['title-exact']; + } else { + return false; + } + } + + /** + * Gets the full query URL for this query. + * + * @return string url + */ + public function getQueryUrl() + { + $uri = $this->_defaultFeedUri; + + if ($this->_visibility !== null) { + $uri .= '/' . $this->_visibility; + } else { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception( + 'A visibility must be provided for cell queries.'); + } + + if ($this->_projection !== null) { + $uri .= '/' . $this->_projection; + } else { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception( + 'A projection must be provided for cell queries.'); + } + + $uri .= $this->getQueryString(); + return $uri; + } + +} diff --git a/libs/Zend/Gdata/DublinCore.php b/libs/Zend/Gdata/DublinCore.php new file mode 100755 index 0000000..9617079 --- /dev/null +++ b/libs/Zend/Gdata/DublinCore.php @@ -0,0 +1,58 @@ + 'http://purl.org/dc/terms' + ); + + /** + * Create Zend_Gdata_DublinCore object + * + * @param Zend_Http_Client $client (optional) The HTTP client to use when + * when communicating with the Google servers. + * @param string $applicationId The identity of the app in the form of Company-AppName-Version + */ + public function __construct($client = null, $applicationId = 'MyCompany-MyApp-1.0') + { + $this->registerPackage('Zend_Gdata_DublinCore'); + $this->registerPackage('Zend_Gdata_DublinCore_Extension'); + parent::__construct($client, $applicationId); + } + +} diff --git a/libs/Zend/Gdata/DublinCore/Extension/Creator.php b/libs/Zend/Gdata/DublinCore/Extension/Creator.php new file mode 100644 index 0000000..0cd4e34 --- /dev/null +++ b/libs/Zend/Gdata/DublinCore/Extension/Creator.php @@ -0,0 +1,60 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->_text = $value; + } + +} diff --git a/libs/Zend/Gdata/DublinCore/Extension/Date.php b/libs/Zend/Gdata/DublinCore/Extension/Date.php new file mode 100644 index 0000000..bd26497 --- /dev/null +++ b/libs/Zend/Gdata/DublinCore/Extension/Date.php @@ -0,0 +1,62 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->_text = $value; + } + +} diff --git a/libs/Zend/Gdata/DublinCore/Extension/Description.php b/libs/Zend/Gdata/DublinCore/Extension/Description.php new file mode 100644 index 0000000..dfe3390 --- /dev/null +++ b/libs/Zend/Gdata/DublinCore/Extension/Description.php @@ -0,0 +1,60 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->_text = $value; + } + +} diff --git a/libs/Zend/Gdata/DublinCore/Extension/Format.php b/libs/Zend/Gdata/DublinCore/Extension/Format.php new file mode 100644 index 0000000..9903fa4 --- /dev/null +++ b/libs/Zend/Gdata/DublinCore/Extension/Format.php @@ -0,0 +1,60 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->_text = $value; + } + +} diff --git a/libs/Zend/Gdata/DublinCore/Extension/Identifier.php b/libs/Zend/Gdata/DublinCore/Extension/Identifier.php new file mode 100644 index 0000000..8387315 --- /dev/null +++ b/libs/Zend/Gdata/DublinCore/Extension/Identifier.php @@ -0,0 +1,60 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->_text = $value; + } + +} diff --git a/libs/Zend/Gdata/DublinCore/Extension/Language.php b/libs/Zend/Gdata/DublinCore/Extension/Language.php new file mode 100644 index 0000000..d795974 --- /dev/null +++ b/libs/Zend/Gdata/DublinCore/Extension/Language.php @@ -0,0 +1,60 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->_text = $value; + } + +} diff --git a/libs/Zend/Gdata/DublinCore/Extension/Publisher.php b/libs/Zend/Gdata/DublinCore/Extension/Publisher.php new file mode 100644 index 0000000..14458ce --- /dev/null +++ b/libs/Zend/Gdata/DublinCore/Extension/Publisher.php @@ -0,0 +1,60 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->_text = $value; + } + +} diff --git a/libs/Zend/Gdata/DublinCore/Extension/Rights.php b/libs/Zend/Gdata/DublinCore/Extension/Rights.php new file mode 100644 index 0000000..77201f4 --- /dev/null +++ b/libs/Zend/Gdata/DublinCore/Extension/Rights.php @@ -0,0 +1,60 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->_text = $value; + } + +} diff --git a/libs/Zend/Gdata/DublinCore/Extension/Subject.php b/libs/Zend/Gdata/DublinCore/Extension/Subject.php new file mode 100644 index 0000000..a12ae97 --- /dev/null +++ b/libs/Zend/Gdata/DublinCore/Extension/Subject.php @@ -0,0 +1,60 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->_text = $value; + } + +} diff --git a/libs/Zend/Gdata/DublinCore/Extension/Title.php b/libs/Zend/Gdata/DublinCore/Extension/Title.php new file mode 100644 index 0000000..185071a --- /dev/null +++ b/libs/Zend/Gdata/DublinCore/Extension/Title.php @@ -0,0 +1,60 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->_text = $value; + } + +} diff --git a/libs/Zend/Gdata/Entry.php b/libs/Zend/Gdata/Entry.php new file mode 100644 index 0000000..8fefdc4 --- /dev/null +++ b/libs/Zend/Gdata/Entry.php @@ -0,0 +1,126 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct($element); + } + + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + // ETags are special. We only support them in protocol >= 2.X. + // This will be duplicated by the HTTP ETag header. + if ($majorVersion >= 2) { + if ($this->_etag != null) { + $element->setAttributeNS($this->lookupNamespace('gd'), + 'gd:etag', + $this->_etag); + } + } + return $element; + } + + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('atom') . ':' . 'content': + $content = new Zend_Gdata_App_Extension_Content(); + $content->transferFromDOM($child); + $this->_content = $content; + break; + case $this->lookupNamespace('atom') . ':' . 'published': + $published = new Zend_Gdata_App_Extension_Published(); + $published->transferFromDOM($child); + $this->_published = $published; + break; + case $this->lookupNamespace('atom') . ':' . 'source': + $source = new Zend_Gdata_App_Extension_Source(); + $source->transferFromDOM($child); + $this->_source = $source; + break; + case $this->lookupNamespace('atom') . ':' . 'summary': + $summary = new Zend_Gdata_App_Extension_Summary(); + $summary->transferFromDOM($child); + $this->_summary = $summary; + break; + case $this->lookupNamespace('app') . ':' . 'control': + $control = new Zend_Gdata_App_Extension_Control(); + $control->transferFromDOM($child); + $this->_control = $control; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + /** + * Given a DOMNode representing an attribute, tries to map the data into + * instance members. If no mapping is defined, the name and value are + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'etag': + // ETags are special, since they can be conveyed by either the + // HTTP ETag header or as an XML attribute. + $etag = $attribute->nodeValue; + if (is_null($this->_etag)) { + $this->_etag = $etag; + } + elseif ($this->_etag != $etag) { + require_once('Zend/Gdata/App/IOException.php'); + throw new Zend_Gdata_App_IOException("ETag mismatch"); + } + break; + default: + parent::takeAttributeFromDOM($attribute); + break; + } + } + +} diff --git a/libs/Zend/Gdata/Exif.php b/libs/Zend/Gdata/Exif.php new file mode 100755 index 0000000..f49117e --- /dev/null +++ b/libs/Zend/Gdata/Exif.php @@ -0,0 +1,57 @@ + 'http://schemas.google.com/photos/exif/2007'); + + /** + * Create Zend_Gdata_Exif object + * + * @param Zend_Http_Client $client (optional) The HTTP client to use when + * when communicating with the Google servers. + * @param string $applicationId The identity of the app in the form of Company-AppName-Version + */ + public function __construct($client = null, $applicationId = 'MyCompany-MyApp-1.0') + { + $this->registerPackage('Zend_Gdata_Exif'); + $this->registerPackage('Zend_Gdata_Exif_Extension'); + parent::__construct($client, $applicationId); + } + +} diff --git a/libs/Zend/Gdata/Exif/Entry.php b/libs/Zend/Gdata/Exif/Entry.php new file mode 100755 index 0000000..2ce5251 --- /dev/null +++ b/libs/Zend/Gdata/Exif/Entry.php @@ -0,0 +1,145 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct($element); + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_tags != null) { + $element->appendChild($this->_tags->getDOM($element->ownerDocument)); + } + return $element; + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them as members of this entry based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('exif') . ':' . 'tags': + $tags = new Zend_Gdata_Exif_Extension_Tags(); + $tags->transferFromDOM($child); + $this->_tags = $tags; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + /** + * Retrieve the tags for this entry. + * + * @see setTags + * @return Zend_Gdata_Exif_Extension_Tags The requested object + * or null if not set. + */ + public function getTags() + { + return $this->_tags; + } + + /** + * Set the tags property for this entry. This property contains + * various Exif data. + * + * This corresponds to the property in the Google Data + * protocol. + * + * @param Zend_Gdata_Exif_Extension_Tags $value The desired value + * this element, or null to unset. + * @return Zend_Gdata_Exif_Entry Provides a fluent interface + */ + public function setTags($value) + { + $this->_tags = $value; + return $this; + } + +} diff --git a/libs/Zend/Gdata/Exif/Extension/Distance.php b/libs/Zend/Gdata/Exif/Extension/Distance.php new file mode 100755 index 0000000..a1ff3b2 --- /dev/null +++ b/libs/Zend/Gdata/Exif/Extension/Distance.php @@ -0,0 +1,61 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->setText($text); + } + +} diff --git a/libs/Zend/Gdata/Exif/Extension/Exposure.php b/libs/Zend/Gdata/Exif/Extension/Exposure.php new file mode 100755 index 0000000..bbaee2d --- /dev/null +++ b/libs/Zend/Gdata/Exif/Extension/Exposure.php @@ -0,0 +1,61 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->setText($text); + } + +} diff --git a/libs/Zend/Gdata/Exif/Extension/FStop.php b/libs/Zend/Gdata/Exif/Extension/FStop.php new file mode 100755 index 0000000..48bf094 --- /dev/null +++ b/libs/Zend/Gdata/Exif/Extension/FStop.php @@ -0,0 +1,61 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->setText($text); + } + +} diff --git a/libs/Zend/Gdata/Exif/Extension/Flash.php b/libs/Zend/Gdata/Exif/Extension/Flash.php new file mode 100755 index 0000000..52b0ff3 --- /dev/null +++ b/libs/Zend/Gdata/Exif/Extension/Flash.php @@ -0,0 +1,61 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->setText($text); + } + +} diff --git a/libs/Zend/Gdata/Exif/Extension/FocalLength.php b/libs/Zend/Gdata/Exif/Extension/FocalLength.php new file mode 100755 index 0000000..8e256da --- /dev/null +++ b/libs/Zend/Gdata/Exif/Extension/FocalLength.php @@ -0,0 +1,61 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->setText($text); + } + +} diff --git a/libs/Zend/Gdata/Exif/Extension/ImageUniqueId.php b/libs/Zend/Gdata/Exif/Extension/ImageUniqueId.php new file mode 100755 index 0000000..8c14481 --- /dev/null +++ b/libs/Zend/Gdata/Exif/Extension/ImageUniqueId.php @@ -0,0 +1,61 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->setText($text); + } + +} diff --git a/libs/Zend/Gdata/Exif/Extension/Iso.php b/libs/Zend/Gdata/Exif/Extension/Iso.php new file mode 100755 index 0000000..71c0af9 --- /dev/null +++ b/libs/Zend/Gdata/Exif/Extension/Iso.php @@ -0,0 +1,61 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->setText($text); + } + +} diff --git a/libs/Zend/Gdata/Exif/Extension/Make.php b/libs/Zend/Gdata/Exif/Extension/Make.php new file mode 100755 index 0000000..c8236d8 --- /dev/null +++ b/libs/Zend/Gdata/Exif/Extension/Make.php @@ -0,0 +1,61 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->setText($text); + } + +} diff --git a/libs/Zend/Gdata/Exif/Extension/Model.php b/libs/Zend/Gdata/Exif/Extension/Model.php new file mode 100755 index 0000000..21cde50 --- /dev/null +++ b/libs/Zend/Gdata/Exif/Extension/Model.php @@ -0,0 +1,61 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->setText($text); + } + +} diff --git a/libs/Zend/Gdata/Exif/Extension/Tags.php b/libs/Zend/Gdata/Exif/Extension/Tags.php new file mode 100755 index 0000000..822f0db --- /dev/null +++ b/libs/Zend/Gdata/Exif/Extension/Tags.php @@ -0,0 +1,549 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->setDistance($distance); + $this->setExposure($exposure); + $this->setFlash($flash); + $this->setFocalLength($focalLength); + $this->setFStop($fStop); + $this->setImageUniqueId($imageUniqueId); + $this->setIso($iso); + $this->setMake($make); + $this->setModel($model); + $this->setTime($time); + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_distance !== null) { + $element->appendChild($this->_distance->getDOM($element->ownerDocument)); + } + if ($this->_exposure !== null) { + $element->appendChild($this->_exposure->getDOM($element->ownerDocument)); + } + if ($this->_flash !== null) { + $element->appendChild($this->_flash->getDOM($element->ownerDocument)); + } + if ($this->_focalLength !== null) { + $element->appendChild($this->_focalLength->getDOM($element->ownerDocument)); + } + if ($this->_fStop !== null) { + $element->appendChild($this->_fStop->getDOM($element->ownerDocument)); + } + if ($this->_imageUniqueId !== null) { + $element->appendChild($this->_imageUniqueId->getDOM($element->ownerDocument)); + } + if ($this->_iso !== null) { + $element->appendChild($this->_iso->getDOM($element->ownerDocument)); + } + if ($this->_make !== null) { + $element->appendChild($this->_make->getDOM($element->ownerDocument)); + } + if ($this->_model !== null) { + $element->appendChild($this->_model->getDOM($element->ownerDocument)); + } + if ($this->_time !== null) { + $element->appendChild($this->_time->getDOM($element->ownerDocument)); + } + return $element; + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them as members of this entry based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('exif') . ':' . 'distance'; + $distance = new Zend_Gdata_Exif_Extension_Distance(); + $distance->transferFromDOM($child); + $this->_distance = $distance; + break; + case $this->lookupNamespace('exif') . ':' . 'exposure'; + $exposure = new Zend_Gdata_Exif_Extension_Exposure(); + $exposure->transferFromDOM($child); + $this->_exposure = $exposure; + break; + case $this->lookupNamespace('exif') . ':' . 'flash'; + $flash = new Zend_Gdata_Exif_Extension_Flash(); + $flash->transferFromDOM($child); + $this->_flash = $flash; + break; + case $this->lookupNamespace('exif') . ':' . 'focallength'; + $focalLength = new Zend_Gdata_Exif_Extension_FocalLength(); + $focalLength->transferFromDOM($child); + $this->_focalLength = $focalLength; + break; + case $this->lookupNamespace('exif') . ':' . 'fstop'; + $fStop = new Zend_Gdata_Exif_Extension_FStop(); + $fStop->transferFromDOM($child); + $this->_fStop = $fStop; + break; + case $this->lookupNamespace('exif') . ':' . 'imageUniqueID'; + $imageUniqueId = new Zend_Gdata_Exif_Extension_ImageUniqueId(); + $imageUniqueId->transferFromDOM($child); + $this->_imageUniqueId = $imageUniqueId; + break; + case $this->lookupNamespace('exif') . ':' . 'iso'; + $iso = new Zend_Gdata_Exif_Extension_Iso(); + $iso->transferFromDOM($child); + $this->_iso = $iso; + break; + case $this->lookupNamespace('exif') . ':' . 'make'; + $make = new Zend_Gdata_Exif_Extension_Make(); + $make->transferFromDOM($child); + $this->_make = $make; + break; + case $this->lookupNamespace('exif') . ':' . 'model'; + $model = new Zend_Gdata_Exif_Extension_Model(); + $model->transferFromDOM($child); + $this->_model = $model; + break; + case $this->lookupNamespace('exif') . ':' . 'time'; + $time = new Zend_Gdata_Exif_Extension_Time(); + $time->transferFromDOM($child); + $this->_time = $time; + break; + } + } + + /** + * Get the value for this element's distance attribute. + * + * @see setDistance + * @return Zend_Gdata_Exif_Extension_Distance The requested attribute. + */ + public function getDistance() + { + return $this->_distance; + } + + /** + * Set the value for this element's distance attribute. + * + * @param Zend_Gdata_Exif_Extension_Distance $value The desired value for this attribute. + * @return Zend_Gdata_Exif_Extension_Tags Provides a fluent interface + */ + public function setDistance($value) + { + $this->_distance = $value; + return $this; + } + + /** + * Get the value for this element's exposure attribute. + * + * @see setExposure + * @return Zend_Gdata_Exif_Extension_Exposure The requested attribute. + */ + public function getExposure() + { + return $this->_exposure; + } + + /** + * Set the value for this element's exposure attribute. + * + * @param Zend_Gdata_Exif_Extension_Exposure $value The desired value for this attribute. + * @return Zend_Gdata_Exif_Extension_Tags Provides a fluent interface + */ + public function setExposure($value) + { + $this->_exposure = $value; + return $this; + } + + /** + * Get the value for this element's flash attribute. + * + * @see setFlash + * @return Zend_Gdata_Exif_Extension_Flash The requested attribute. + */ + public function getFlash() + { + return $this->_flash; + } + + /** + * Set the value for this element's flash attribute. + * + * @param Zend_Gdata_Exif_Extension_Flash $value The desired value for this attribute. + * @return Zend_Gdata_Exif_Extension_Tags Provides a fluent interface + */ + public function setFlash($value) + { + $this->_flash = $value; + return $this; + } + + /** + * Get the value for this element's name attribute. + * + * @see setFocalLength + * @return Zend_Gdata_Exif_Extension_FocalLength The requested attribute. + */ + public function getFocalLength() + { + return $this->_focalLength; + } + + /** + * Set the value for this element's focalLength attribute. + * + * @param Zend_Gdata_Exif_Extension_FocalLength $value The desired value for this attribute. + * @return Zend_Gdata_Exif_Extension_Tags Provides a fluent interface + */ + public function setFocalLength($value) + { + $this->_focalLength = $value; + return $this; + } + + /** + * Get the value for this element's fStop attribute. + * + * @see setFStop + * @return Zend_Gdata_Exif_Extension_FStop The requested attribute. + */ + public function getFStop() + { + return $this->_fStop; + } + + /** + * Set the value for this element's fStop attribute. + * + * @param Zend_Gdata_Exif_Extension_FStop $value The desired value for this attribute. + * @return Zend_Gdata_Exif_Extension_Tags Provides a fluent interface + */ + public function setFStop($value) + { + $this->_fStop = $value; + return $this; + } + + /** + * Get the value for this element's imageUniqueId attribute. + * + * @see setImageUniqueId + * @return Zend_Gdata_Exif_Extension_ImageUniqueId The requested attribute. + */ + public function getImageUniqueId() + { + return $this->_imageUniqueId; + } + + /** + * Set the value for this element's imageUniqueId attribute. + * + * @param Zend_Gdata_Exif_Extension_ImageUniqueId $value The desired value for this attribute. + * @return Zend_Gdata_Exif_Extension_Tags Provides a fluent interface + */ + public function setImageUniqueId($value) + { + $this->_imageUniqueId = $value; + return $this; + } + + /** + * Get the value for this element's iso attribute. + * + * @see setIso + * @return Zend_Gdata_Exif_Extension_Iso The requested attribute. + */ + public function getIso() + { + return $this->_iso; + } + + /** + * Set the value for this element's iso attribute. + * + * @param Zend_Gdata_Exif_Extension_Iso $value The desired value for this attribute. + * @return Zend_Gdata_Exif_Extension_Tags Provides a fluent interface + */ + public function setIso($value) + { + $this->_iso = $value; + return $this; + } + /** + * Get the value for this element's make attribute. + * + * @see setMake + * @return Zend_Gdata_Exif_Extension_Make The requested attribute. + */ + public function getMake() + { + return $this->_make; + } + + /** + * Set the value for this element's make attribute. + * + * @param Zend_Gdata_Exif_Extension_Make $value The desired value for this attribute. + * @return Zend_Gdata_Exif_Extension_Tags Provides a fluent interface + */ + public function setMake($value) + { + $this->_make = $value; + return $this; + } + + /** + * Get the value for this element's model attribute. + * + * @see setModel + * @return Zend_Gdata_Exif_Extension_Model The requested attribute. + */ + public function getModel() + { + return $this->_model; + } + + /** + * Set the value for this element's model attribute. + * + * @param Zend_Gdata_Exif_Extension_Model $value The desired value for this attribute. + * @return Zend_Gdata_Exif_Extension_Tags Provides a fluent interface + */ + public function setModel($value) + { + $this->_model = $value; + return $this; + } + + /** + * Get the value for this element's time attribute. + * + * @see setTime + * @return Zend_Gdata_Exif_Extension_Time The requested attribute. + */ + public function getTime() + { + return $this->_time; + } + + /** + * Set the value for this element's time attribute. + * + * @param Zend_Gdata_Exif_Extension_Time $value The desired value for this attribute. + * @return Zend_Gdata_Exif_Extension_Tags Provides a fluent interface + */ + public function setTime($value) + { + $this->_time = $value; + return $this; + } + +} diff --git a/libs/Zend/Gdata/Exif/Extension/Time.php b/libs/Zend/Gdata/Exif/Extension/Time.php new file mode 100755 index 0000000..cab2c35 --- /dev/null +++ b/libs/Zend/Gdata/Exif/Extension/Time.php @@ -0,0 +1,61 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->setText($text); + } + +} diff --git a/libs/Zend/Gdata/Exif/Feed.php b/libs/Zend/Gdata/Exif/Feed.php new file mode 100755 index 0000000..e8df1d5 --- /dev/null +++ b/libs/Zend/Gdata/Exif/Feed.php @@ -0,0 +1,70 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct($element); + } + +} diff --git a/libs/Zend/Gdata/Extension.php b/libs/Zend/Gdata/Extension.php new file mode 100644 index 0000000..b9714ba --- /dev/null +++ b/libs/Zend/Gdata/Extension.php @@ -0,0 +1,52 @@ +registerNamespace('openSearch', + 'http://a9.com/-/spec/opensearchrss/1.0/'); + $this->registerNamespace('rss', + 'http://blogs.law.harvard.edu/tech/rss'); + $this->registerNamespace('gd', + 'http://schemas.google.com/g/2005'); + parent::__construct(); + } + +} diff --git a/libs/Zend/Gdata/Extension/AttendeeStatus.php b/libs/Zend/Gdata/Extension/AttendeeStatus.php new file mode 100644 index 0000000..0346c16 --- /dev/null +++ b/libs/Zend/Gdata/Extension/AttendeeStatus.php @@ -0,0 +1,120 @@ +_value = $value; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_value !== null) { + $element->setAttribute('value', $this->_value); + } + 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 + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'value': + $this->_value = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Get the value for this element's Value attribute. + * + * @return string The requested attribute. + */ + public function getValue() + { + return $this->_value; + } + + /** + * Set the value for this element's Value attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Extension_Visibility The element being modified. + */ + public function setValue($value) + { + $this->_value = $value; + return $this; + } + + /** + * Magic toString method allows using this directly via echo + * Works best in PHP >= 4.2.0 + */ + public function __toString() + { + return $this->getValue(); + } + +} + diff --git a/libs/Zend/Gdata/Extension/AttendeeType.php b/libs/Zend/Gdata/Extension/AttendeeType.php new file mode 100644 index 0000000..7ccd76c --- /dev/null +++ b/libs/Zend/Gdata/Extension/AttendeeType.php @@ -0,0 +1,120 @@ +_value = $value; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_value !== null) { + $element->setAttribute('value', $this->_value); + } + 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 + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'value': + $this->_value = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Get the value for this element's Value attribute. + * + * @return string The requested attribute. + */ + public function getValue() + { + return $this->_value; + } + + /** + * Set the value for this element's Value attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Extension_Visibility The element being modified. + */ + public function setValue($value) + { + $this->_value = $value; + return $this; + } + + /** + * Magic toString method allows using this directly via echo + * Works best in PHP >= 4.2.0 + */ + public function __toString() + { + return $this->getValue(); + } + +} + diff --git a/libs/Zend/Gdata/Extension/Comments.php b/libs/Zend/Gdata/Extension/Comments.php new file mode 100644 index 0000000..12a0e2d --- /dev/null +++ b/libs/Zend/Gdata/Extension/Comments.php @@ -0,0 +1,114 @@ +_rel = $rel; + $this->_feedLink = $feedLink; + } + + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_rel !== null) { + $element->setAttribute('rel', $this->_rel); + } + if ($this->_feedLink !== null) { + $element->appendChild($this->_feedLink->getDOM($element->ownerDocument)); + } + return $element; + } + + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('gd') . ':' . 'feedLink'; + $feedLink = new Zend_Gdata_Extension_FeedLink(); + $feedLink->transferFromDOM($child); + $this->_feedLink = $feedLink; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'rel': + $this->_rel = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + public function getRel() + { + return $this->_rel; + } + + public function setRel($value) + { + $this->_rel = $value; + return $this; + } + + public function getFeedLink() + { + return $this->_feedLink; + } + + public function setFeedLink($value) + { + $this->_feedLink = $value; + return $this; + } + +} diff --git a/libs/Zend/Gdata/Extension/EntryLink.php b/libs/Zend/Gdata/Extension/EntryLink.php new file mode 100644 index 0000000..cb65dc1 --- /dev/null +++ b/libs/Zend/Gdata/Extension/EntryLink.php @@ -0,0 +1,164 @@ +_href = $href; + $this->_readOnly = $readOnly; + $this->_rel = $rel; + $this->_entry = $entry; + } + + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_href !== null) { + $element->setAttribute('href', $this->_href); + } + if ($this->_readOnly !== null) { + $element->setAttribute('readOnly', ($this->_readOnly ? "true" : "false")); + } + if ($this->_rel !== null) { + $element->setAttribute('rel', $this->_rel); + } + if ($this->_entry !== null) { + $element->appendChild($this->_entry->getDOM($element->ownerDocument)); + } + return $element; + } + + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('atom') . ':' . 'entry'; + $entry = new Zend_Gdata_Entry(); + $entry->transferFromDOM($child); + $this->_entry = $entry; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'href': + $this->_href = $attribute->nodeValue; + break; + case 'readOnly': + if ($attribute->nodeValue == "true") { + $this->_readOnly = true; + } + else if ($attribute->nodeValue == "false") { + $this->_readOnly = false; + } + else { + throw new Zend_Gdata_App_InvalidArgumentException("Expected 'true' or 'false' for gCal:selected#value."); + } + break; + case 'rel': + $this->_rel = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * @return string + */ + public function getHref() + { + return $this->_href; + } + + public function setHref($value) + { + $this->_href = $value; + return $this; + } + + public function getReadOnly() + { + return $this->_readOnly; + } + + public function setReadOnly($value) + { + $this->_readOnly = $value; + return $this; + } + + public function getRel() + { + return $this->_rel; + } + + public function setRel($value) + { + $this->_rel = $value; + return $this; + } + + public function getEntry() + { + return $this->_entry; + } + + public function setEntry($value) + { + $this->_entry = $value; + return $this; + } + +} diff --git a/libs/Zend/Gdata/Extension/EventStatus.php b/libs/Zend/Gdata/Extension/EventStatus.php new file mode 100644 index 0000000..8fa08ed --- /dev/null +++ b/libs/Zend/Gdata/Extension/EventStatus.php @@ -0,0 +1,98 @@ +_value = $value; + } + + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_value !== null) { + $element->setAttribute('value', $this->_value); + } + return $element; + } + + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'value': + $this->_value = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Get the value for this element's Value attribute. + * + * @return string The requested attribute. + */ + public function getValue() + { + return $this->_value; + } + + /** + * Set the value for this element's Value attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Extension_Visibility The element being modified. + */ + public function setValue($value) + { + $this->_value = $value; + return $this; + } + + /** + * Magic toString method allows using this directly via echo + * Works best in PHP >= 4.2.0 + */ + public function __toString() + { + return $this->getValue(); + } + +} diff --git a/libs/Zend/Gdata/Extension/ExtendedProperty.php b/libs/Zend/Gdata/Extension/ExtendedProperty.php new file mode 100644 index 0000000..ab309a6 --- /dev/null +++ b/libs/Zend/Gdata/Extension/ExtendedProperty.php @@ -0,0 +1,103 @@ +_name = $name; + $this->_value = $value; + } + + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_name !== null) { + $element->setAttribute('name', $this->_name); + } + if ($this->_value !== null) { + $element->setAttribute('value', $this->_value); + } + return $element; + } + + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'name': + $this->_name = $attribute->nodeValue; + break; + case 'value': + $this->_value = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + public function __toString() + { + return $this->getName() . '=' . $this->getValue(); + } + + public function getName() + { + return $this->_name; + } + + public function setName($value) + { + $this->_name = $value; + return $this; + } + + public function getValue() + { + return $this->_value; + } + + public function setValue($value) + { + $this->_value = $value; + return $this; + } + +} diff --git a/libs/Zend/Gdata/Extension/FeedLink.php b/libs/Zend/Gdata/Extension/FeedLink.php new file mode 100644 index 0000000..92519ad --- /dev/null +++ b/libs/Zend/Gdata/Extension/FeedLink.php @@ -0,0 +1,172 @@ +_countHint = $countHint; + $this->_href = $href; + $this->_readOnly = $readOnly; + $this->_rel = $rel; + $this->_feed = $feed; + } + + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_countHint !== null) { + $element->setAttribute('countHint', $this->_countHint); + } + if ($this->_href !== null) { + $element->setAttribute('href', $this->_href); + } + if ($this->_readOnly !== null) { + $element->setAttribute('readOnly', ($this->_readOnly ? "true" : "false")); + } + if ($this->_rel !== null) { + $element->setAttribute('rel', $this->_rel); + } + if ($this->_feed !== null) { + $element->appendChild($this->_feed->getDOM($element->ownerDocument)); + } + return $element; + } + + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('atom') . ':' . 'feed'; + $feed = new Zend_Gdata_Feed(); + $feed->transferFromDOM($child); + $this->_feed = $feed; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'countHint': + $this->_countHint = $attribute->nodeValue; + break; + case 'href': + $this->_href = $attribute->nodeValue; + break; + case 'readOnly': + if ($attribute->nodeValue == "true") { + $this->_readOnly = true; + } + else if ($attribute->nodeValue == "false") { + $this->_readOnly = false; + } + else { + throw new Zend_Gdata_App_InvalidArgumentException("Expected 'true' or 'false' for gCal:selected#value."); + } + break; + case 'rel': + $this->_rel = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * @return string + */ + public function getHref() + { + return $this->_href; + } + + public function setHref($value) + { + $this->_href = $value; + return $this; + } + + public function getReadOnly() + { + return $this->_readOnly; + } + + public function setReadOnly($value) + { + $this->_readOnly = $value; + return $this; + } + + public function getRel() + { + return $this->_rel; + } + + public function setRel($value) + { + $this->_rel = $value; + return $this; + } + + public function getFeed() + { + return $this->_feed; + } + + public function setFeed($value) + { + $this->_feed = $value; + return $this; + } + +} diff --git a/libs/Zend/Gdata/Extension/OpenSearchItemsPerPage.php b/libs/Zend/Gdata/Extension/OpenSearchItemsPerPage.php new file mode 100644 index 0000000..443cb1f --- /dev/null +++ b/libs/Zend/Gdata/Extension/OpenSearchItemsPerPage.php @@ -0,0 +1,47 @@ +_text = $text; + } + +} diff --git a/libs/Zend/Gdata/Extension/OpenSearchStartIndex.php b/libs/Zend/Gdata/Extension/OpenSearchStartIndex.php new file mode 100644 index 0000000..249bd03 --- /dev/null +++ b/libs/Zend/Gdata/Extension/OpenSearchStartIndex.php @@ -0,0 +1,47 @@ +_text = $text; + } + +} diff --git a/libs/Zend/Gdata/Extension/OpenSearchTotalResults.php b/libs/Zend/Gdata/Extension/OpenSearchTotalResults.php new file mode 100644 index 0000000..fb88012 --- /dev/null +++ b/libs/Zend/Gdata/Extension/OpenSearchTotalResults.php @@ -0,0 +1,47 @@ +_text = $text; + } + +} diff --git a/libs/Zend/Gdata/Extension/OriginalEvent.php b/libs/Zend/Gdata/Extension/OriginalEvent.php new file mode 100644 index 0000000..8f4e99b --- /dev/null +++ b/libs/Zend/Gdata/Extension/OriginalEvent.php @@ -0,0 +1,139 @@ +_id = $id; + $this->_href = $href; + $this->_when = $when; + } + + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_id !== null) { + $element->setAttribute('id', $this->_id); + } + if ($this->_href !== null) { + $element->setAttribute('href', $this->_href); + } + if ($this->_when !== null) { + $element->appendChild($this->_when->getDOM($element->ownerDocument)); + } + return $element; + } + + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'id': + $this->_id = $attribute->nodeValue; + break; + case 'href': + $this->_href = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('gd') . ':' . 'when'; + $when = new Zend_Gdata_Extension_When(); + $when->transferFromDOM($child); + $this->_when = $when; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + public function getId() + { + return $this->_id; + } + + public function setId($value) + { + $this->_id = $value; + return $this; + } + + public function getHref() + { + return $this->_href; + } + + public function setHref($value) + { + $this->_href = $value; + return $this; + } + + public function getWhen() + { + return $this->_when; + } + + public function setWhen($value) + { + $this->_when = $value; + return $this; + } + + +} diff --git a/libs/Zend/Gdata/Extension/Rating.php b/libs/Zend/Gdata/Extension/Rating.php new file mode 100644 index 0000000..a435544 --- /dev/null +++ b/libs/Zend/Gdata/Extension/Rating.php @@ -0,0 +1,238 @@ +_average = $average; + $this->_min = $min; + $this->_max = $max; + $this->_numRaters = $numRaters; + $this->_value = $value; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_min !== null) { + $element->setAttribute('min', $this->_min); + } + if ($this->_max !== null) { + $element->setAttribute('max', $this->_max); + } + if ($this->_numRaters !== null) { + $element->setAttribute('numRaters', $this->_numRaters); + } + if ($this->_average !== null) { + $element->setAttribute('average', $this->_average); + } + if ($this->_value !== null) { + $element->setAttribute('value', $this->_value); + } + + 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 + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'min': + $this->_min = $attribute->nodeValue; + break; + case 'max': + $this->_max = $attribute->nodeValue; + break; + case 'numRaters': + $this->_numRaters = $attribute->nodeValue; + break; + case 'average': + $this->_average = $attribute->nodeValue; + break; + case 'value': + $this->_value = $atttribute->nodeValue; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Get the value for this element's min attribute. + * + * @return integer The requested attribute. + */ + public function getMin() + { + return $this->_min; + } + + /** + * Set the value for this element's min attribute. + * + * @param bool $value The desired value for this attribute. + * @return Zend_Gdata_Extension_Rating The element being modified. + */ + public function setMin($value) + { + $this->_min = $value; + return $this; + } + + /** + * Get the value for this element's numRaters attribute. + * + * @return integer The requested attribute. + */ + public function getNumRaters() + { + return $this->_numRaters; + } + + /** + * Set the value for this element's numRaters attribute. + * + * @param bool $value The desired value for this attribute. + * @return Zend_Gdata_Extension_Rating The element being modified. + */ + public function setNumRaters($value) + { + $this->_numRaters = $value; + return $this; + } + + /** + * Get the value for this element's average attribute. + * + * @return integer The requested attribute. + */ + public function getAverage() + { + return $this->_average; + } + + /** + * Set the value for this element's average attribute. + * + * @param bool $value The desired value for this attribute. + * @return Zend_Gdata_Extension_Rating The element being modified. + */ + public function setAverage($value) + { + $this->_average = $value; + return $this; + } + + /** + * Get the value for this element's max attribute. + * + * @return integer The requested attribute. + */ + public function getMax() + { + return $this->_max; + } + + /** + * Set the value for this element's max attribute. + * + * @param bool $value The desired value for this attribute. + * @return Zend_Gdata_Extension_Rating The element being modified. + */ + public function setMax($value) + { + $this->_max = $value; + return $this; + } + + /** + * Get the value for this element's value attribute. + * + * @return integer The requested attribute. + */ + public function getValue() + { + return $this->_value; + } + + /** + * Set the value for this element's value attribute. + * + * @param bool $value The desired value for this attribute. + * @return Zend_Gdata_Extension_Rating The element being modified. + */ + public function setValue($value) + { + $this->_value = $value; + return $this; + } + +} diff --git a/libs/Zend/Gdata/Extension/Recurrence.php b/libs/Zend/Gdata/Extension/Recurrence.php new file mode 100644 index 0000000..4bb7760 --- /dev/null +++ b/libs/Zend/Gdata/Extension/Recurrence.php @@ -0,0 +1,46 @@ +_text = $text; + } + +} diff --git a/libs/Zend/Gdata/Extension/RecurrenceException.php b/libs/Zend/Gdata/Extension/RecurrenceException.php new file mode 100644 index 0000000..c2cc8f7 --- /dev/null +++ b/libs/Zend/Gdata/Extension/RecurrenceException.php @@ -0,0 +1,202 @@ +_specialized = $specialized; + $this->_entryLink = $entryLink; + $this->_originalEvent = $originalEvent; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_specialized !== null) { + $element->setAttribute('specialized', ($this->_specialized ? "true" : "false")); + } + if ($this->_entryLink !== null) { + $element->appendChild($this->_entryLink->getDOM($element->ownerDocument)); + } + if ($this->_originalEvent !== null) { + $element->appendChild($this->_originalEvent->getDOM($element->ownerDocument)); + } + 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 + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'specialized': + if ($attribute->nodeValue == "true") { + $this->_specialized = true; + } + else if ($attribute->nodeValue == "false") { + $this->_specialized = false; + } + else { + throw new Zend_Gdata_App_InvalidArgumentException("Expected 'true' or 'false' for gCal:selected#value."); + } + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them as members of this entry based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('gd') . ':' . 'entryLink': + $entryLink = new Zend_Gdata_Extension_EntryLink(); + $entryLink->transferFromDOM($child); + $this->_entryLink = $entryLink; + break; + case $this->lookupNamespace('gd') . ':' . 'originalEvent': + $originalEvent = new Zend_Gdata_Extension_OriginalEvent(); + $originalEvent->transferFromDOM($child); + $this->_originalEvent = $originalEvent; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + /** + * Get the value for this element's Specialized attribute. + * + * @return bool The requested attribute. + */ + public function getSpecialized() + { + return $this->_specialized; + } + + /** + * Set the value for this element's Specialized attribute. + * + * @param bool $value The desired value for this attribute. + * @return Zend_Gdata_Extension_RecurrenceException The element being modified. + */ + public function setSpecialized($value) + { + $this->_specialized = $value; + return $this; + } + + /** + * Get the value for this element's EntryLink attribute. + * + * @return Zend_Gdata_Extension_EntryLink The requested attribute. + */ + public function getEntryLink() + { + return $this->_entryLink; + } + + /** + * Set the value for this element's EntryLink attribute. + * + * @param Zend_Gdata_Extension_EntryLink $value The desired value for this attribute. + * @return Zend_Gdata_Extension_RecurrenceException The element being modified. + */ + public function setEntryLink($value) + { + $this->_entryLink = $value; + return $this; + } + + /** + * Get the value for this element's Specialized attribute. + * + * @return Zend_Gdata_Extension_OriginalEvent The requested attribute. + */ + public function getOriginalEvent() + { + return $this->_originalEvent; + } + + /** + * Set the value for this element's Specialized attribute. + * + * @param Zend_Gdata_Extension_OriginalEvent $value The desired value for this attribute. + * @return Zend_Gdata_Extension_RecurrenceException The element being modified. + */ + public function setOriginalEvent($value) + { + $this->_originalEvent = $value; + return $this; + } + +} + diff --git a/libs/Zend/Gdata/Extension/Reminder.php b/libs/Zend/Gdata/Extension/Reminder.php new file mode 100644 index 0000000..fd85d18 --- /dev/null +++ b/libs/Zend/Gdata/Extension/Reminder.php @@ -0,0 +1,168 @@ +_absoluteTime = $absoluteTime; + $this->_method = $method; + $this->_days = $days; + $this->_hours = $hours; + $this->_minutes = $minutes; + } + + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_absoluteTime !== null) { + $element->setAttribute('absoluteTime', $this->_absoluteTime); + } + if ($this->_method !== null) { + $element->setAttribute('method', $this->_method); + } + if ($this->_days !== null) { + $element->setAttribute('days', $this->_days); + } + if ($this->_hours !== null) { + $element->setAttribute('hours', $this->_hours); + } + if ($this->_minutes !== null) { + $element->setAttribute('minutes', $this->_minutes); + } + return $element; + } + + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'absoluteTime': + $this->_absoluteTime = $attribute->nodeValue; + break; + case 'method': + $this->_method = $attribute->nodeValue; + break; + case 'days': + $this->_days = $attribute->nodeValue; + break; + case 'hours': + $this->_hours = $attribute->nodeValue; + break; + case 'minutes': + $this->_minutes = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + public function __toString() + { + $s; + if ($absoluteTime) + $s = "at" . $absoluteTime; + else if ($days) + $s = "in" . $days . "days"; + else if ($hours) + $s = "in" . $hours . "hours"; + else if ($minutes) + $s = "in" . $minutes . "minutes"; + return $method . $s; + } + + public function getAbsoluteTime() + { + return $this->_absoluteTime; + } + + public function setAbsoluteTime($value) + { + $this->_absoluteTime = $value; + return $this; + } + + public function getDays() + { + return $this->_days; + } + + public function setDays($value) + { + $this->_days = $value; + return $this; + } + public function getHours() + { + return $this->_hours; + } + + public function setHours($value) + { + $this->_hours = $value; + return $this; + } + + public function getMinutes() + { + return $this->_minutes; + } + + public function setMinutes($value) + { + $this->_minutes = $value; + return $this; + } + + public function getMethod() + { + return $this->_method; + } + + public function setMethod($value) + { + $this->_method = $value; + return $this; + } + +} diff --git a/libs/Zend/Gdata/Extension/Transparency.php b/libs/Zend/Gdata/Extension/Transparency.php new file mode 100644 index 0000000..014ce09 --- /dev/null +++ b/libs/Zend/Gdata/Extension/Transparency.php @@ -0,0 +1,120 @@ +_value = $value; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_value !== null) { + $element->setAttribute('value', $this->_value); + } + 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 + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'value': + $this->_value = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Get the value for this element's Value attribute. + * + * @return bool The requested attribute. + */ + public function getValue() + { + return $this->_value; + } + + /** + * Set the value for this element's Value attribute. + * + * @param bool $value The desired value for this attribute. + * @return Zend_Gdata_Extension_Transparency The element being modified. + */ + public function setValue($value) + { + $this->_value = $value; + return $this; + } + + /** + * Magic toString method allows using this directly via echo + * Works best in PHP >= 4.2.0 + */ + public function __toString() + { + return $this->getValue(); + } + +} + diff --git a/libs/Zend/Gdata/Extension/Visibility.php b/libs/Zend/Gdata/Extension/Visibility.php new file mode 100644 index 0000000..46737ce --- /dev/null +++ b/libs/Zend/Gdata/Extension/Visibility.php @@ -0,0 +1,120 @@ +_value = $value; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_value !== null) { + $element->setAttribute('value', $this->_value); + } + 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 + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'value': + $this->_value = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Get the value for this element's Value attribute. + * + * @return bool The requested attribute. + */ + public function getValue() + { + return $this->_value; + } + + /** + * Set the value for this element's Value attribute. + * + * @param bool $value The desired value for this attribute. + * @return Zend_Gdata_Extension_Visibility The element being modified. + */ + public function setValue($value) + { + $this->_value = $value; + return $this; + } + + /** + * Magic toString method allows using this directly via echo + * Works best in PHP >= 4.2.0 + */ + public function __toString() + { + return $this->getValue(); + } + +} + diff --git a/libs/Zend/Gdata/Extension/When.php b/libs/Zend/Gdata/Extension/When.php new file mode 100644 index 0000000..4ac3cbc --- /dev/null +++ b/libs/Zend/Gdata/Extension/When.php @@ -0,0 +1,166 @@ +_startTime = $startTime; + $this->_endTime = $endTime; + $this->_valueString = $valueString; + $this->_reminders = $reminders; + } + + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_startTime !== null) { + $element->setAttribute('startTime', $this->_startTime); + } + if ($this->_endTime !== null) { + $element->setAttribute('endTime', $this->_endTime); + } + if ($this->_valueString !== null) { + $element->setAttribute('valueString', $this->_valueString); + } + if ($this->_reminders !== null) { + foreach ($this->_reminders as $reminder) { + $element->appendChild( + $reminder->getDOM($element->ownerDocument)); + } + } + return $element; + } + + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('gd') . ':' . 'reminder'; + $reminder = new Zend_Gdata_Extension_Reminder(); + $reminder->transferFromDOM($child); + $this->_reminders[] = $reminder; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'startTime': + $this->_startTime = $attribute->nodeValue; + break; + case 'endTime': + $this->_endTime = $attribute->nodeValue; + break; + case 'valueString': + $this->_valueString = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + public function __toString() + { + if ($valueString) + return $valueString; + else { + return 'Starts: ' . $this->getStartTime() . ' ' . + 'Ends: ' . $this->getEndTime(); + } + } + + public function getStartTime() + { + return $this->_startTime; + } + + public function setStartTime($value) + { + $this->_startTime = $value; + return $this; + } + + public function getEndTime() + { + return $this->_endTime; + } + + public function setEndTime($value) + { + $this->_endTime = $value; + return $this; + } + + public function getValueString() + { + return $this->_valueString; + } + + public function setValueString($value) + { + $this->_valueString = $value; + return $this; + } + + public function getReminders() + { + return $this->_reminders; + } + + public function setReminders($value) + { + $this->_reminders = $value; + return $this; + } + +} diff --git a/libs/Zend/Gdata/Extension/Where.php b/libs/Zend/Gdata/Extension/Where.php new file mode 100644 index 0000000..c693252 --- /dev/null +++ b/libs/Zend/Gdata/Extension/Where.php @@ -0,0 +1,163 @@ +_valueString = $valueString; + $this->_label = $label; + $this->_rel = $rel; + $this->_entryLink = $entryLink; + } + + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_label !== null) { + $element->setAttribute('label', $this->_label); + } + if ($this->_rel !== null) { + $element->setAttribute('rel', $this->_rel); + } + if ($this->_valueString !== null) { + $element->setAttribute('valueString', $this->_valueString); + } + if ($this->entryLink !== null) { + $element->appendChild($this->_entryLink->getDOM($element->ownerDocument)); + } + return $element; + } + + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'label': + $this->_label = $attribute->nodeValue; + break; + case 'rel': + $this->_rel = $attribute->nodeValue; + break; + case 'valueString': + $this->_valueString = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them in the $_entry array based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('gd') . ':' . 'entryLink': + $entryLink = new Zend_Gdata_Extension_EntryLink(); + $entryLink->transferFromDOM($child); + $this->_entryLink = $entryLink; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + public function __toString() + { + if ($this->_valueString != null) { + return $this->_valueString; + } + else { + return parent::__toString(); + } + } + + public function getLabel() + { + return $this->_label; + } + + public function setLabel($value) + { + $this->_label = $value; + return $this; + } + + public function getRel() + { + return $this->_rel; + } + + public function setRel($value) + { + $this->_rel = $value; + return $this; + } + + public function getValueString() + { + return $this->_valueString; + } + + public function setValueString($value) + { + $this->_valueString = $value; + return $this; + } + + public function getEntryLink() + { + return $this->_entryLink; + } + + public function setEntryLink($value) + { + $this->_entryLink = $value; + return $this; + } + +} diff --git a/libs/Zend/Gdata/Extension/Who.php b/libs/Zend/Gdata/Extension/Who.php new file mode 100644 index 0000000..364d9cc --- /dev/null +++ b/libs/Zend/Gdata/Extension/Who.php @@ -0,0 +1,291 @@ +_email = $email; + $this->_rel = $rel; + $this->_valueString = $valueString; + $this->_attendeeStatus = $attendeeStatus; + $this->_attendeeType = $attendeeType; + $this->_entryLink = $entryLink; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_email !== null) { + $element->setAttribute('email', $this->_email); + } + if ($this->_rel !== null) { + $element->setAttribute('rel', $this->_rel); + } + if ($this->_valueString !== null) { + $element->setAttribute('valueString', $this->_valueString); + } + if ($this->_attendeeStatus !== null) { + $element->appendChild($this->_attendeeStatus->getDOM($element->ownerDocument)); + } + if ($this->_attendeeType !== null) { + $element->appendChild($this->_attendeeType->getDOM($element->ownerDocument)); + } + if ($this->_entryLink !== null) { + $element->appendChild($this->_entryLink->getDOM($element->ownerDocument)); + } + 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 + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'email': + $this->_email = $attribute->nodeValue; + break; + case 'rel': + $this->_rel = $attribute->nodeValue; + break; + case 'valueString': + $this->_valueString = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them as members of this entry based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('gd') . ':' . 'attendeeStatus': + $attendeeStatus = new Zend_Gdata_Extension_AttendeeStatus(); + $attendeeStatus->transferFromDOM($child); + $this->_attendeeStatus = $attendeeStatus; + break; + case $this->lookupNamespace('gd') . ':' . 'attendeeType': + $attendeeType = new Zend_Gdata_Extension_AttendeeType(); + $attendeeType->transferFromDOM($child); + $this->_attendeeType = $attendeeType; + break; + case $this->lookupNamespace('gd') . ':' . 'entryLink': + $entryLink = new Zend_Gdata_Extension_EntryLink(); + $entryLink->transferFromDOM($child); + $this->_entryLink = $entryLink; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + /** + * Retrieves a human readable string describing this attribute's value. + * + * @return string The attribute value. + */ + public function __toString() + { + if ($this->_valueString != null) { + return $this->_valueString; + } + else { + return parent::__toString(); + } + } + + /** + * Get the value for this element's ValueString attribute. + * + * @return string The requested attribute. + */ + public function getValueString() + { + return $this->_valueString; + } + + /** + * Set the value for this element's ValueString attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Extension_Who The element being modified. + */ + public function setValueString($value) + { + $this->_valueString = $value; + return $this; + } + + /** + * Get the value for this element's Email attribute. + * + * @return string The requested attribute. + */ + public function getEmail() + { + return $this->_email; + } + + /** + * Set the value for this element's Email attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Extension_Who The element being modified. + */ + public function setEmail($value) + { + $this->_email = $value; + return $this; + } + + /** + * Get the value for this element's Rel attribute. + * + * @return string The requested attribute. + */ + public function getRel() + { + return $this->_rel; + } + + /** + * Set the value for this element's Rel attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Extension_Who The element being modified. + */ + public function setRel($value) + { + $this->_rel = $value; + return $this; + } + + /** + * Get this entry's AttendeeStatus element. + * + * @return Zend_Gdata_Extension_AttendeeStatus The requested entry. + */ + public function getAttendeeStatus() + { + return $this->_attendeeStatus; + } + + /** + * Set the child's AttendeeStatus element. + * + * @param Zend_Gdata_Extension_AttendeeStatus $value The desired value for this attribute. + * @return Zend_Gdata_Extension_Who The element being modified. + */ + public function setAttendeeStatus($value) + { + $this->_attendeeStatus = $value; + return $this; + } + + /** + * Get this entry's AttendeeType element. + * + * @return Zend_Gdata_Extension_AttendeeType The requested entry. + */ + public function getAttendeeType() + { + return $this->_attendeeType; + } + + /** + * Set the child's AttendeeType element. + * + * @param Zend_Gdata_Extension_AttendeeType $value The desired value for this attribute. + * @return Zend_Gdata_Extension_Who The element being modified. + */ + public function setAttendeeType($value) + { + $this->_attendeeType = $value; + return $this; + } + +} diff --git a/libs/Zend/Gdata/Feed.php b/libs/Zend/Gdata/Feed.php new file mode 100644 index 0000000..28c26ab --- /dev/null +++ b/libs/Zend/Gdata/Feed.php @@ -0,0 +1,167 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct($element); + } + + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_totalResults != null) { + $element->appendChild($this->_totalResults->getDOM($element->ownerDocument)); + } + if ($this->_startIndex != null) { + $element->appendChild($this->_startIndex->getDOM($element->ownerDocument)); + } + if ($this->_itemsPerPage != null) { + $element->appendChild($this->_itemsPerPage->getDOM($element->ownerDocument)); + } + return $element; + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them in the $_entry array based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('openSearch') . ':' . 'totalResults': + $totalResults = new Zend_Gdata_Extension_OpenSearchTotalResults(); + $totalResults->transferFromDOM($child); + $this->_totalResults = $totalResults; + break; + case $this->lookupNamespace('openSearch') . ':' . 'startIndex': + $startIndex = new Zend_Gdata_Extension_OpenSearchStartIndex(); + $startIndex->transferFromDOM($child); + $this->_startIndex = $startIndex; + break; + case $this->lookupNamespace('openSearch') . ':' . 'itemsPerPage': + $itemsPerPage = new Zend_Gdata_Extension_OpenSearchItemsPerPage(); + $itemsPerPage->transferFromDOM($child); + $this->_itemsPerPage = $itemsPerPage; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + function setTotalResults($value) { + $this->_totalResults = $value; + return $this; + } + + function getTotalResults() { + return $this->_totalResults; + } + + function setStartIndex($value) { + $this->_startIndex = $value; + return $this; + } + + function getStartIndex() { + return $this->_startIndex; + } + + function setItemsPerPage($value) { + $this->_itemsPerPage = $value; + return $this; + } + + function getItemsPerPage() { + return $this->_itemsPerPage; + } + +} diff --git a/libs/Zend/Gdata/Gapps.php b/libs/Zend/Gdata/Gapps.php new file mode 100644 index 0000000..89231bd --- /dev/null +++ b/libs/Zend/Gdata/Gapps.php @@ -0,0 +1,1076 @@ + 'http://schemas.google.com/apps/2006'); + + /** + * Create Gdata_Gapps object + * + * @param Zend_Http_Client $client (optional) The HTTP client to use when + * when communicating with the Google Apps servers. + * @param string $domain (optional) The Google Apps domain which is to be + * accessed. + * @param string $applicationId The identity of the app in the form of Company-AppName-Version + */ + public function __construct($client = null, $domain = null, $applicationId = 'MyCompany-MyApp-1.0') + { + $this->registerPackage('Zend_Gdata_Gapps'); + $this->registerPackage('Zend_Gdata_Gapps_Extension'); + parent::__construct($client, $applicationId); + $this->_httpClient->setParameterPost('service', self::AUTH_SERVICE_NAME); + $this->_domain = $domain; + } + + /** + * Convert an exception to an ServiceException if an AppsForYourDomain + * XML document is contained within the original exception's HTTP + * response. If conversion fails, throw the original error. + * + * @param Zend_Gdata_Exception $e The exception to convert. + * @throws Zend_Gdata_Gapps_ServiceException + * @throws mixed + */ + public static function throwServiceExceptionIfDetected($e) { + try { + // Check to see if there is an AppsForYourDomainErrors + // datastructure in the response. If so, convert it to + // an exception and throw it. + require_once 'Zend/Gdata/Gapps/ServiceException.php'; + $error = new Zend_Gdata_Gapps_ServiceException(); + $error->importFromString($e->getResponse()->getBody()); + throw $error; + } catch (Zend_Gdata_App_Exception $e2) { + // Unable to convert the response to a ServiceException, + // most likely because the server didn't return an + // AppsForYourDomainErrors document. Throw the original + // exception. + throw $e; + } + } + + /** + * Imports a feed located at $uri. + * This method overrides the default behavior of Zend_Gdata_App, + * providing support for Zend_Gdata_Gapps_ServiceException. + * + * @param string $uri + * @param Zend_Http_Client $client (optional) The client used for + * communication + * @param string $className (optional) The class which is used as the + * return type + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + * @return Zend_Gdata_App_Feed + */ + public static function import($uri, $client = null, $className='Zend_Gdata_App_Feed') + { + try { + return parent::import($uri, $client, $className); + } catch (Zend_Gdata_App_HttpException $e) { + self::throwServiceExceptionIfDetected($e); + } + } + + /** + * GET a URI using client object. + * This method overrides the default behavior of Zend_Gdata_App, + * providing support for Zend_Gdata_Gapps_ServiceException. + * + * @param string $uri GET URI + * @param array $extraHeaders Extra headers to add to the request, as an + * array of string-based key/value pairs. + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + * @return Zend_Http_Response + */ + public function get($uri, $extraHeaders = array()) + { + try { + return parent::get($uri, $extraHeaders); + } catch (Zend_Gdata_App_HttpException $e) { + self::throwServiceExceptionIfDetected($e); + } + } + + /** + * POST data with client object. + * This method overrides the default behavior of Zend_Gdata_App, + * providing support for Zend_Gdata_Gapps_ServiceException. + * + * @param mixed $data The Zend_Gdata_App_Entry or XML to post + * @param string $uri (optional) POST URI + * @param integer $remainingRedirects (optional) + * @param string $contentType Content-type of the data + * @param array $extraHaders Extra headers to add tot he request + * @return Zend_Http_Response + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_App_InvalidArgumentException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function post($data, $uri = null, $remainingRedirects = null, + $contentType = null, $extraHeaders = null) + { + try { + return parent::post($data, $uri, $remainingRedirects, $contentType, $extraHeaders); + } catch (Zend_Gdata_App_HttpException $e) { + self::throwServiceExceptionIfDetected($e); + } + } + + /** + * PUT data with client object + * This method overrides the default behavior of Zend_Gdata_App, + * providing support for Zend_Gdata_Gapps_ServiceException. + * + * @param mixed $data The Zend_Gdata_App_Entry or XML to post + * @param string $uri (optional) PUT URI + * @param integer $remainingRedirects (optional) + * @param string $contentType Content-type of the data + * @param array $extraHaders Extra headers to add tot he request + * @return Zend_Http_Response + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_App_InvalidArgumentException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function put($data, $uri = null, $remainingRedirects = null, + $contentType = null, $extraHeaders = null) + { + try { + return parent::put($data, $uri, $remainingRedirects, $contentType, $extraHeaders); + } catch (Zend_Gdata_App_HttpException $e) { + self::throwServiceExceptionIfDetected($e); + } + } + + /** + * DELETE entry with client object + * This method overrides the default behavior of Zend_Gdata_App, + * providing support for Zend_Gdata_Gapps_ServiceException. + * + * @param mixed $data The Zend_Gdata_App_Entry or URL to delete + * @param integer $remainingRedirects (optional) + * @return void + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_App_InvalidArgumentException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function delete($data, $remainingRedirects = null) + { + try { + return parent::delete($data, $remainingRedirects); + } catch (Zend_Gdata_App_HttpException $e) { + self::throwServiceExceptionIfDetected($e); + } + } + + /** + * 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 + * Apps provisioning service. + * + * @param string $value The domain to be used for this session. + */ + public function setDomain($value) + { + $this->_domain = $value; + } + + /** + * 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. + * + * @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 + * overridden by providing a fully qualified domain as $domain. + * + * @param string $domain (optional) A fully-qualified domain to use + * instead of the default domain for this service instance. + * @throws Zend_Gdata_App_InvalidArgumentException + */ + public function getBaseUrl($domain = null) + { + if ($domain !== null) { + return self::APPS_BASE_FEED_URI . '/' . $domain; + } else if ($this->_domain !== null) { + return self::APPS_BASE_FEED_URI . '/' . $this->_domain; + } else { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'Domain must be specified.'); + } + } + + /** + * Retrieve a UserFeed containing multiple UserEntry objects. + * + * @param mixed $location (optional) The location for the feed, as a URL + * or Query. + * @return Zend_Gdata_Gapps_UserFeed + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function getUserFeed($location = null) + { + if ($location === null) { + $uri = $this->getBaseUrl() . self::APPS_USER_PATH; + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getFeed($uri, 'Zend_Gdata_Gapps_UserFeed'); + } + + /** + * Retreive NicknameFeed object containing multiple NicknameEntry objects. + * + * @param mixed $location (optional) The location for the feed, as a URL + * or Query. + * @return Zend_Gdata_Gapps_NicknameFeed + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function getNicknameFeed($location = null) + { + if ($location === null) { + $uri = $this->getBaseUrl() . self::APPS_NICKNAME_PATH; + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getFeed($uri, 'Zend_Gdata_Gapps_NicknameFeed'); + } + + /** + * Retreive EmailListFeed object containing multiple EmailListEntry + * objects. + * + * @param mixed $location (optional) The location for the feed, as a URL + * or Query. + * @return Zend_Gdata_Gapps_EmailListFeed + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function getEmailListFeed($location = null) + { + if ($location === null) { + $uri = $this->getBaseUrl() . self::APPS_NICKNAME_PATH; + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getFeed($uri, 'Zend_Gdata_Gapps_EmailListFeed'); + } + + /** + * Retreive EmailListRecipientFeed object containing multiple + * EmailListRecipientEntry objects. + * + * @param mixed $location The location for the feed, as a URL or Query. + * @return Zend_Gdata_Gapps_EmailListRecipientFeed + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function getEmailListRecipientFeed($location) + { + if ($location === null) { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'Location must not be null'); + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getFeed($uri, 'Zend_Gdata_Gapps_EmailListRecipientFeed'); + } + + /** + * Retreive a single UserEntry object. + * + * @param mixed $location The location for the feed, as a URL or Query. + * @return Zend_Gdata_Gapps_UserEntry + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function getUserEntry($location) + { + if ($location === null) { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'Location must not be null'); + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getEntry($uri, 'Zend_Gdata_Gapps_UserEntry'); + } + + /** + * Retreive a single NicknameEntry object. + * + * @param mixed $location The location for the feed, as a URL or Query. + * @return Zend_Gdata_Gapps_NicknameEntry + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function getNicknameEntry($location) + { + if ($location === null) { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'Location must not be null'); + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getEntry($uri, 'Zend_Gdata_Gapps_NicknameEntry'); + } + + /** + * Retreive a single EmailListEntry object. + * + * @param mixed $location The location for the feed, as a URL or Query. + * @return Zend_Gdata_Gapps_EmailListEntry + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function getEmailListEntry($location) + { + if ($location === null) { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'Location must not be null'); + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getEntry($uri, 'Zend_Gdata_Gapps_EmailListEntry'); + } + + /** + * Retreive a single EmailListRecipientEntry object. + * + * @param mixed $location The location for the feed, as a URL or Query. + * @return Zend_Gdata_Gapps_EmailListRecipientEntry + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function getEmailListRecipientEntry($location) + { + if ($location === null) { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'Location must not be null'); + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getEntry($uri, 'Zend_Gdata_Gapps_EmailListRecipientEntry'); + } + + /** + * Create a new user from a UserEntry. + * + * @param Zend_Gdata_Gapps_UserEntry $user The user entry to insert. + * @param string $uri (optional) The URI where the user should be + * uploaded to. If null, the default user creation URI for + * this domain will be used. + * @return Zend_Gdata_Gapps_UserEntry The inserted user entry as + * returned by the server. + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function insertUser($user, $uri = null) + { + if ($uri === null) { + $uri = $this->getBaseUrl() . self::APPS_USER_PATH; + } + $newEntry = $this->insertEntry($user, $uri, 'Zend_Gdata_Gapps_UserEntry'); + return $newEntry; + } + + /** + * Create a new nickname from a NicknameEntry. + * + * @param Zend_Gdata_Gapps_NicknameEntry $nickname The nickname entry to + * insert. + * @param string $uri (optional) The URI where the nickname should be + * uploaded to. If null, the default nickname creation URI for + * this domain will be used. + * @return Zend_Gdata_Gapps_NicknameEntry The inserted nickname entry as + * returned by the server. + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function insertNickname($nickname, $uri = null) + { + if ($uri === null) { + $uri = $this->getBaseUrl() . self::APPS_NICKNAME_PATH; + } + $newEntry = $this->insertEntry($nickname, $uri, 'Zend_Gdata_Gapps_NicknameEntry'); + return $newEntry; + } + + /** + * Create a new email list from an EmailListEntry. + * + * @param Zend_Gdata_Gapps_EmailListEntry $emailList The email list entry + * to insert. + * @param string $uri (optional) The URI where the email list should be + * uploaded to. If null, the default email list creation URI for + * this domain will be used. + * @return Zend_Gdata_Gapps_EmailListEntry The inserted email list entry + * as returned by the server. + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function insertEmailList($emailList, $uri = null) + { + if ($uri === null) { + $uri = $this->getBaseUrl() . self::APPS_EMAIL_LIST_PATH; + } + $newEntry = $this->insertEntry($emailList, $uri, 'Zend_Gdata_Gapps_EmailListEntry'); + return $newEntry; + } + + /** + * Create a new email list recipient from an EmailListRecipientEntry. + * + * @param Zend_Gdata_Gapps_EmailListRecipientEntry $recipient The recipient + * entry to insert. + * @param string $uri (optional) The URI where the recipient should be + * uploaded to. If null, the default recipient creation URI for + * this domain will be used. + * @return Zend_Gdata_Gapps_EmailListRecipientEntry The inserted + * recipient entry as returned by the server. + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function insertEmailListRecipient($recipient, $uri = null) + { + if ($uri === null) { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'URI must not be null'); + } elseif ($uri instanceof Zend_Gdata_Gapps_EmailListEntry) { + $uri = $uri->getLink('edit')->href; + } + $newEntry = $this->insertEntry($recipient, $uri, 'Zend_Gdata_Gapps_EmailListRecipientEntry'); + return $newEntry; + } + + /** + * Provides a magic factory method to instantiate new objects with + * shorter syntax than would otherwise be required by the Zend Framework + * naming conventions. For more information, see Zend_Gdata_App::__call(). + * + * This overrides the default behavior of __call() so that query classes + * do not need to have their domain manually set when created with + * a magic factory method. + * + * @see Zend_Gdata_App::__call() + * @param string $method The method name being called + * @param array $args The arguments passed to the call + * @throws Zend_Gdata_App_Exception + */ + public function __call($method, $args) { + if (preg_match('/^new(\w+Query)/', $method, $matches)) { + $class = $matches[1]; + $foundClassName = null; + foreach ($this->_registeredPackages as $name) { + try { + require_once 'Zend/Loader.php'; + @Zend_Loader::loadClass("${name}_${class}"); + $foundClassName = "${name}_${class}"; + break; + } catch (Zend_Exception $e) { + // package wasn't here- continue searching + } + } + if ($foundClassName != null) { + $reflectionObj = new ReflectionClass($foundClassName); + // Prepend the domain to the query + $args = array_merge(array($this->getDomain()), $args); + return $reflectionObj->newInstanceArgs($args); + } else { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception( + "Unable to find '${class}' in registered packages"); + } + } else { + return parent::__call($method, $args); + } + + } + + // Convenience methods + // Specified at http://code.google.com/apis/apps/gdata_provisioning_api_v2.0_reference.html#appendix_e + + /** + * Create a new user entry and send it to the Google Apps servers. + * + * @param string $username The username for the new user. + * @param string $givenName The given name for the new user. + * @param string $familyName The family name for the new user. + * @param string $password The password for the new user as a plaintext string + * (if $passwordHashFunction is null) or a SHA-1 hashed + * value (if $passwordHashFunction = 'SHA-1'). + * @param string $quotaLimitInMB (optional) The quota limit for the new user in MB. + * @return Zend_Gdata_Gapps_UserEntry (optional) The new user entry as returned by + * server. + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function createUser ($username, $givenName, $familyName, $password, + $passwordHashFunction = null, $quotaLimitInMB = null) { + $user = $this->newUserEntry(); + $user->login = $this->newLogin(); + $user->login->username = $username; + $user->login->password = $password; + $user->login->hashFunctionName = $passwordHashFunction; + $user->name = $this->newName(); + $user->name->givenName = $givenName; + $user->name->familyName = $familyName; + if ($quotaLimitInMB !== null) { + $user->quota = $this->newQuota(); + $user->quota->limit = $quotaLimitInMB; + } + return $this->insertUser($user); + } + + /** + * Retrieve a user based on their username. + * + * @param string $username The username to search for. + * @return Zend_Gdata_Gapps_UserEntry The username to search for, or null + * if no match found. + * @throws Zend_Gdata_App_InvalidArgumentException + * @throws Zend_Gdata_App_HttpException + */ + public function retrieveUser ($username) { + $query = $this->newUserQuery($username); + try { + $user = $this->getUserEntry($query); + } catch (Zend_Gdata_Gapps_ServiceException $e) { + // Set the user to null if not found + if ($e->hasError(Zend_Gdata_Gapps_Error::ENTITY_DOES_NOT_EXIST)) { + $user = null; + } else { + throw $e; + } + } + return $user; + } + + /** + * Retrieve a page of users in alphabetical order, starting with the + * provided username. + * + * @param string $startUsername (optional) The first username to retrieve. + * If null or not declared, the page will begin with the first + * user in the domain. + * @return Zend_Gdata_Gapps_UserFeed Collection of Zend_Gdata_UserEntry + * objects representing all users in the domain. + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function retrievePageOfUsers ($startUsername = null) { + $query = $this->newUserQuery(); + $query->setStartUsername($startUsername); + return $this->getUserFeed($query); + } + + /** + * Retrieve all users in the current domain. Be aware that + * calling this function on a domain with many users will take a + * signifigant amount of time to complete. On larger domains this may + * may cause execution to timeout without proper precautions in place. + * + * @return Zend_Gdata_Gapps_UserFeed Collection of Zend_Gdata_UserEntry + * objects representing all users in the domain. + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function retrieveAllUsers () { + return $this->retrieveAllEntriesForFeed($this->retrievePageOfUsers()); + } + + /** + * Overwrite a specified username with the provided UserEntry. The + * UserEntry does not need to contain an edit link. + * + * This method is provided for compliance with the Google Apps + * Provisioning API specification. Normally users will instead want to + * call UserEntry::save() instead. + * + * @see Zend_Gdata_App_Entry::save + * @param string $username The username whose data will be overwritten. + * @param Zend_Gdata_Gapps_UserEntry $userEntry The user entry which + * will be overwritten. + * @return Zend_Gdata_Gapps_UserEntry The UserEntry returned by the + * server. + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function updateUser($username, $userEntry) { + return $this->updateEntry($userEntry, $this->getBaseUrl() . + self::APPS_USER_PATH . '/' . $username); + } + + /** + * Mark a given user as suspended. + * + * @param string $username The username associated with the user who + * should be suspended. + * @return Zend_Gdata_Gapps_UserEntry The UserEntry for the modified + * user. + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function suspendUser($username) { + $user = $this->retrieveUser($username); + $user->login->suspended = true; + return $user->save(); + } + + /** + * Mark a given user as not suspended. + * + * @param string $username The username associated with the user who + * should be restored. + * @return Zend_Gdata_Gapps_UserEntry The UserEntry for the modified + * user. + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function restoreUser($username) { + $user = $this->retrieveUser($username); + $user->login->suspended = false; + return $user->save(); + } + + /** + * Delete a user by username. + * + * @param string $username The username associated with the user who + * should be deleted. + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function deleteUser($username) { + $this->delete($this->getBaseUrl() . self::APPS_USER_PATH . '/' . + $username); + } + + /** + * Create a nickname for a given user. + * + * @param string $username The username to which the new nickname should + * be associated. + * @param string $nickname The new nickname to be created. + * @return Zend_Gdata_Gapps_NicknameEntry The nickname entry which was + * created by the server. + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function createNickname($username, $nickname) { + $entry = $this->newNicknameEntry(); + $nickname = $this->newNickname($nickname); + $login = $this->newLogin($username); + $entry->nickname = $nickname; + $entry->login = $login; + return $this->insertNickname($entry); + } + + /** + * Retrieve the entry for a specified nickname. + * + * @param string $nickname The nickname to be retrieved. + * @return Zend_Gdata_Gapps_NicknameEntry The requested nickname entry. + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function retrieveNickname($nickname) { + $query = $this->newNicknameQuery(); + $query->setNickname($nickname); + try { + $nickname = $this->getNicknameEntry($query); + } catch (Zend_Gdata_Gapps_ServiceException $e) { + // Set the nickname to null if not found + if ($e->hasError(Zend_Gdata_Gapps_Error::ENTITY_DOES_NOT_EXIST)) { + $nickname = null; + } else { + throw $e; + } + } + return $nickname; + } + + /** + * Retrieve all nicknames associated with a specific username. + * + * @param string $username The username whose nicknames should be + * returned. + * @return Zend_Gdata_Gapps_NicknameFeed A feed containing all nicknames + * for the given user, or null if + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function retrieveNicknames($username) { + $query = $this->newNicknameQuery(); + $query->setUsername($username); + $nicknameFeed = $this->retrieveAllEntriesForFeed( + $this->getNicknameFeed($query)); + return $nicknameFeed; + } + + /** + * Retrieve a page of nicknames in alphabetical order, starting with the + * provided nickname. + * + * @param string $startNickname (optional) The first nickname to + * retrieve. If null or not declared, the page will begin with + * the first nickname in the domain. + * @return Zend_Gdata_Gapps_NicknameFeed Collection of Zend_Gdata_NicknameEntry + * objects representing all nicknames in the domain. + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function retrievePageOfNicknames ($startNickname = null) { + $query = $this->newNicknameQuery(); + $query->setStartNickname($startNickname); + return $this->getNicknameFeed($query); + } + + /** + * Retrieve all nicknames in the current domain. Be aware that + * calling this function on a domain with many nicknames will take a + * signifigant amount of time to complete. On larger domains this may + * may cause execution to timeout without proper precautions in place. + * + * @return Zend_Gdata_Gapps_NicknameFeed Collection of Zend_Gdata_NicknameEntry + * objects representing all nicknames in the domain. + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function retrieveAllNicknames () { + return $this->retrieveAllEntriesForFeed($this->retrievePageOfNicknames()); + } + + /** + * Delete a specified nickname. + * + * @param string $nickname The name of the nickname to be deleted. + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function deleteNickname($nickname) { + $this->delete($this->getBaseUrl() . self::APPS_NICKNAME_PATH . '/' . $nickname); + } + + /** + * Create a new email list. + * + * @param string $emailList The name of the email list to be created. + * @return Zend_Gdata_Gapps_EmailListEntry The email list entry + * as created on the server. + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function createEmailList($emailList) { + $entry = $this->newEmailListEntry(); + $list = $this->newEmailList(); + $list->name = $emailList; + $entry->emailList = $list; + return $this->insertEmailList($entry); + } + + /** + * Retrieve all email lists associated with a recipient. + * + * @param string $username The recipient whose associated email lists + * should be returned. + * @return Zend_Gdata_Gapps_EmailListFeed The list of email lists found as + * Zend_Gdata_EmailListEntry objects. + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function retrieveEmailLists($recipient) { + $query = $this->newEmailListQuery(); + $query->recipient = $recipient; + return $this->getEmailListFeed($query); + } + + /** + * Retrieve a page of email lists in alphabetical order, starting with the + * provided email list. + * + * @param string $startEmailListName (optional) The first list to + * retrieve. If null or not defined, the page will begin + * with the first email list in the domain. + * @return Zend_Gdata_Gapps_EmailListFeed Collection of Zend_Gdata_EmailListEntry + * objects representing all nicknames in the domain. + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function retrievePageOfEmailLists ($startNickname = null) { + $query = $this->newEmailListQuery(); + $query->setStartEmailListName($startNickname); + return $this->getEmailListFeed($query); + } + + /** + * Retrieve all email lists associated with the curent domain. Be aware that + * calling this function on a domain with many email lists will take a + * signifigant amount of time to complete. On larger domains this may + * may cause execution to timeout without proper precautions in place. + * + * @return Zend_Gdata_Gapps_EmailListFeed The list of email lists found + * as Zend_Gdata_Gapps_EmailListEntry objects. + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function retrieveAllEmailLists() { + return $this->retrieveAllEntriesForFeed($this->retrievePageOfEmailLists()); + } + + /** + * Delete a specified email list. + * + * @param string $emailList The name of the emailList to be deleted. + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function deleteEmailList($emailList) { + $this->delete($this->getBaseUrl() . self::APPS_EMAIL_LIST_PATH . '/' + . $emailList); + } + + /** + * Add a specified recipient to an existing emailList. + * + * @param string $recipientAddress The address of the recipient to be + * added to the email list. + * @param string $emailList The name of the email address to which the + * recipient should be added. + * @return Zend_Gdata_Gapps_EmailListRecipientEntry The recipient entry + * created by the server. + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function addRecipientToEmailList($recipientAddress, $emailList) { + $entry = $this->newEmailListRecipientEntry(); + $who = $this->newWho(); + $who->email = $recipientAddress; + $entry->who = $who; + $address = $this->getBaseUrl() . self::APPS_EMAIL_LIST_PATH . '/' . + $emailList . self::APPS_EMAIL_LIST_RECIPIENT_POSTFIX . '/'; + return $this->insertEmailListRecipient($entry, $address); + } + + /** + * Retrieve a page of email list recipients in alphabetical order, + * starting with the provided email list recipient. + * + * @param string $emaiList The email list which should be searched. + * @param string $startRecipient (optinal) The address of the first + * recipient, or null to start with the first recipient in + * the list. + * @return Zend_Gdata_Gapps_EmailListRecipientFeed Collection of + * Zend_Gdata_EmailListRecipientEntry objects representing all + * recpients in the specified list. + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function retrievePageOfRecipients ($emailList, + $startRecipient = null) { + $query = $this->newEmailListRecipientQuery(); + $query->setEmailListName($emailList); + $query->setStartRecipient($startRecipient); + return $this->getEmailListRecipientFeed($query); + } + + /** + * Retrieve all recipients associated with an email list. Be aware that + * calling this function on a domain with many email lists will take a + * signifigant amount of time to complete. On larger domains this may + * may cause execution to timeout without proper precautions in place. + * + * @param string $emaiList The email list which should be searched. + * @return Zend_Gdata_Gapps_EmailListRecipientFeed The list of email lists + * found as Zend_Gdata_Gapps_EmailListRecipientEntry objects. + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function retrieveAllRecipients($emailList) { + return $this->retrieveAllEntriesForFeed( + $this->retrievePageOfRecipients($emailList)); + } + + /** + * Remove a specified recipient from an email list. + * + * @param string $recipientAddress The recipient to be removed. + * @param string $emailList The list from which the recipient should + * be removed. + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function removeRecipientFromEmailList($recipientAddress, $emailList) { + $this->delete($this->getBaseUrl() . self::APPS_EMAIL_LIST_PATH . '/' + . $emailList . self::APPS_EMAIL_LIST_RECIPIENT_POSTFIX . '/' + . $recipientAddress); + } + +} diff --git a/libs/Zend/Gdata/Gapps/EmailListEntry.php b/libs/Zend/Gdata/Gapps/EmailListEntry.php new file mode 100644 index 0000000..0377ab6 --- /dev/null +++ b/libs/Zend/Gdata/Gapps/EmailListEntry.php @@ -0,0 +1,214 @@ + in the Google Data protocol. + * + * @category Zend + * @package Zend_Gdata + * @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_Gdata_Gapps_EmailListEntry extends Zend_Gdata_Entry +{ + + protected $_entryClassName = 'Zend_Gdata_Gapps_EmailListEntry'; + + /** + * child element containing general information about + * this email list. + * + * @var Zend_Gdata_Gapps_Extension_EmailList + */ + protected $_emailList = null; + + /** + * element containing information about other feeds + * relevant to this entry. + * + * @var Zend_Gdata_Extension_FeedLink + */ + protected $_feedLink = array(); + + /** + * Create a new instance. + * + * @param DOMElement $element (optional) DOMElement from which this + * object should be constructed. + */ + public function __construct($element = null) + { + foreach (Zend_Gdata_Gapps::$namespaces as $nsPrefix => $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct($element); + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_emailList !== null) { + $element->appendChild($this->_emailList->getDOM($element->ownerDocument)); + } + foreach ($this->_feedLink as $feedLink) { + $element->appendChild($feedLink->getDOM($element->ownerDocument)); + } + return $element; + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them as members of this entry based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + + switch ($absoluteNodeName) { + case $this->lookupNamespace('apps') . ':' . 'emailList'; + $emailList = new Zend_Gdata_Gapps_Extension_EmailList(); + $emailList->transferFromDOM($child); + $this->_emailList = $emailList; + break; + case $this->lookupNamespace('gd') . ':' . 'feedLink'; + $feedLink = new Zend_Gdata_Extension_FeedLink(); + $feedLink->transferFromDOM($child); + $this->_feedLink[] = $feedLink; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + /** + * Retrieve the email list property for this entry. + * + * @see setEmailList + * @return Zend_Gdata_Gapps_Extension_EmailList The requested object + * or null if not set. + */ + public function getEmailList() + { + return $this->_emailList; + } + + /** + * Set the email list property for this entry. This property contains + * information such as the name of this email list. + * + * This corresponds to the property in the Google Data + * protocol. + * + * @param Zend_Gdata_Gapps_Extension_EmailList $value The desired value + * this element, or null to unset. + * @return Zend_Gdata_Gapps_EventEntry Provides a fluent interface + */ + public function setEmailList($value) + { + $this->_emailList = $value; + return $this; + } + + /** + * Get the feed link property for this entry. + * + * @see setFeedLink + * @param string $rel (optional) The rel value of the link to be found. + * If null, the array of links is returned. + * @return mixed If $rel is specified, a Zend_Gdata_Extension_FeedLink + * object corresponding to the requested rel value is returned + * if found, or null if the requested value is not found. If + * $rel is null or not specified, an array of all available + * feed links for this entry is returned, or null if no feed + * links are set. + */ + public function getFeedLink($rel = null) + { + if ($rel == null) { + return $this->_feedLink; + } else { + foreach ($this->_feedLink as $feedLink) { + if ($feedLink->rel == $rel) { + return $feedLink; + } + } + return null; + } + } + + /** + * Set the feed link property for this entry. Feed links provide + * information about other feeds associated with this entry. + * + * This corresponds to the property in the Google Data + * protocol. + * + * @param array $value A collection of Zend_Gdata_Gapps_Extension_FeedLink + * instances representing all feed links for this entry, or + * null to unset. + * @return Zend_Gdata_Gapps_EventEntry Provides a fluent interface + */ + public function setFeedLink($value) + { + $this->_feedLink = $value; + return $this; + } + +} diff --git a/libs/Zend/Gdata/Gapps/EmailListFeed.php b/libs/Zend/Gdata/Gapps/EmailListFeed.php new file mode 100644 index 0000000..1267575 --- /dev/null +++ b/libs/Zend/Gdata/Gapps/EmailListFeed.php @@ -0,0 +1,51 @@ +setEmailListName($emailListName); + $this->setRecipient($recipient); + $this->setStartEmailListName($startEmailListName); + } + + /** + * 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, + * or null to disable. + */ + public function setEmailListName($value) + { + $this->_emailListName = $value; + } + + /** + * 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. + */ + public function getEmailListName() + { + return $this->_emailListName; + } + + /** + * 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 + * results by, or null to disable. + */ + public function setRecipient($value) + { + if ($value !== null) { + $this->_params['recipient'] = $value; + } + else { + unset($this->_params['recipient']); + } + } + + /** + * 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, + * or null if disabled. + */ + public function getRecipient() + { + if (array_key_exists('recipient', $this->_params)) { + return $this->_params['recipient']; + } else { + return null; + } + } + + /** + * 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 + * disable. + */ + public function setStartEmailListName($value) + { + if ($value !== null) { + $this->_params['startEmailListName'] = $value; + } else { + unset($this->_params['startEmailListName']); + } + } + + /** + * 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 + * disable. + */ + public function getStartEmailListName() + { + if (array_key_exists('startEmailListName', $this->_params)) { + return $this->_params['startEmailListName']; + } else { + return null; + } + } + + /** + * 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) { + $uri .= '/' . $this->_emailListName; + } + $uri .= $this->getQueryString(); + return $uri; + } + +} diff --git a/libs/Zend/Gdata/Gapps/EmailListRecipientEntry.php b/libs/Zend/Gdata/Gapps/EmailListRecipientEntry.php new file mode 100644 index 0000000..8e0f9e8 --- /dev/null +++ b/libs/Zend/Gdata/Gapps/EmailListRecipientEntry.php @@ -0,0 +1,146 @@ + in the Google Data protocol. + * + * @category Zend + * @package Zend_Gdata + * @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_Gdata_Gapps_EmailListRecipientEntry extends Zend_Gdata_Entry +{ + + protected $_entryClassName = 'Zend_Gdata_Gapps_EmailListRecipientEntry'; + + /** + * element used to store the email address of the current + * recipient. Only the email property of this element should be + * populated. + * + * @var Zend_Gdata_Extension_Who + */ + protected $_who = null; + + /** + * Create a new instance. + * + * @param DOMElement $element (optional) DOMElement from which this + * object should be constructed. + */ + public function __construct($element = null) + { + foreach (Zend_Gdata_Gapps::$namespaces as $nsPrefix => $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct($element); + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_who !== null) { + $element->appendChild($this->_who->getDOM($element->ownerDocument)); + } + return $element; + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them as members of this entry based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + + switch ($absoluteNodeName) { + case $this->lookupNamespace('gd') . ':' . 'who'; + $who = new Zend_Gdata_Extension_Who(); + $who->transferFromDOM($child); + $this->_who = $who; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + /** + * Get the value of the who property for this object. + * + * @see setWho + * @return Zend_Gdata_Extension_Who The requested object. + */ + public function getWho() + { + return $this->_who; + } + + /** + * Set the value of the who property for this object. This property + * is used to store the email address of the current recipient. + * + * @param Zend_Gdata_Extension_Who $value The desired value for this + * instance's who property. + * @return Zend_Gdata_Gapps_EventEntry Provides a fluent interface. + */ + public function setWho($value) + { + $this->_who = $value; + return $this; + } + +} diff --git a/libs/Zend/Gdata/Gapps/EmailListRecipientFeed.php b/libs/Zend/Gdata/Gapps/EmailListRecipientFeed.php new file mode 100644 index 0000000..93fd164 --- /dev/null +++ b/libs/Zend/Gdata/Gapps/EmailListRecipientFeed.php @@ -0,0 +1,51 @@ +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 + * null to disable filtering by list name. + * + * @param string $value The email list name to filter search results by, + * or null to disable. + */ + public function setEmailListName($value) + { + $this->_emailListName = $value; + } + + /** + * 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, + * or null if disabled. + */ + public function getEmailListName() + { + return $this->_emailListName; + } + + /** + * 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 + * disable. + */ + public function setStartRecipient($value) + { + if ($value !== null) { + $this->_params['startRecipient'] = $value; + } else { + unset($this->_params['startRecipient']); + } + } + + /** + * 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 + * disabled. + */ + public function getStartRecipient() + { + if (array_key_exists('startRecipient', $this->_params)) { + return $this->_params['startRecipient']; + } else { + return null; + } + } + + /** + * 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) { + $uri .= '/' . $this->_emailListName; + } else { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'EmailListName must not be null'); + } + $uri .= Zend_Gdata_Gapps::APPS_EMAIL_LIST_RECIPIENT_POSTFIX . '/'; + $uri .= $this->getQueryString(); + return $uri; + } + +} diff --git a/libs/Zend/Gdata/Gapps/Error.php b/libs/Zend/Gdata/Gapps/Error.php new file mode 100644 index 0000000..900e103 --- /dev/null +++ b/libs/Zend/Gdata/Gapps/Error.php @@ -0,0 +1,231 @@ +_errorCode = $errorCode; + $this->_reason = $reason; + $this->_invalidInput = $invalidInput; + } + + /** + * 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 + * available as constants within this class. These values are: + * + * UNKNOWN_ERROR (1000) + * USER_DELETED_RECENTLY (1100) + * USER_SUSPENDED (1101) + * DOMAIN_USER_LIMIT_EXCEEDED (1200) + * DOMAIN_ALIAS_LIMIT_EXCEEDED (1201) + * DOMAIN_SUSPENDED (1202) + * DOMAIN_FEATURE_UNAVAILABLE (1203) + * ENTITY_EXISTS (1300) + * ENTITY_DOES_NOT_EXIST (1301) + * ENTITY_NAME_IS_RESERVED (1302) + * ENTITY_NAME_NOT_VALID (1303) + * INVALID_GIVEN_NAME (1400) + * INVALID_FAMILY_NAME (1401) + * INVALID_PASSWORD (1402) + * INVALID_USERNAME (1403) + * INVALID_HASH_FUNCTION_NAME (1404) + * INVALID_HASH_DIGEST_LENGTH (1405) + * 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 + * error codes may be added at any time. + * + * 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. + */ + 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. + */ + public function getReason() { + return $this->_reason; + } + + /** + * 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 + * and eventually XML text for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_errorCode !== null) { + $element->setAttribute('errorCode', $this->_errorCode); + } + if ($this->_reason !== null) { + $element->setAttribute('reason', $this->_reason); + } + if ($this->_invalidInput !== null) { + $element->setAttribute('invalidInput', $this->_invalidInput); + } + 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 + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'errorCode': + $this->_errorCode = $attribute->nodeValue; + break; + case 'reason': + $this->_reason = $attribute->nodeValue; + break; + case 'invalidInput': + $this->_invalidInput = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Get a human readable version of this exception. + * + * @return string + */ + public function __toString() { + return "Error " . $this->getErrorCode() . ": " . $this->getReason() . + "\n\tInvalid Input: \"" . $this->getInvalidInput() . "\""; + } + +} diff --git a/libs/Zend/Gdata/Gapps/Extension/EmailList.php b/libs/Zend/Gdata/Gapps/Extension/EmailList.php new file mode 100644 index 0000000..1c0c4b5 --- /dev/null +++ b/libs/Zend/Gdata/Gapps/Extension/EmailList.php @@ -0,0 +1,144 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->_name = $name; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_name !== null) { + $element->setAttribute('name', $this->_name); + } + 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 + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'name': + $this->_name = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Get the value for this element's name attribute. + * + * @see setName + * @return string The requested attribute. + */ + public function getName() + { + return $this->_name; + } + + /** + * Set the value for this element's name attribute. This is the unique + * name which will be used to identify this email list within this + * domain, and will be used to form this email list's email address. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Gapps_Extension_EmailList The element being modified. + */ + public function setName($value) + { + $this->_name = $value; + return $this; + } + + /** + * Magic toString method allows using this directly via echo + * Works best in PHP >= 4.2.0 + * + * @return string + */ + public function __toString() + { + return $this->getName(); + } + +} diff --git a/libs/Zend/Gdata/Gapps/Extension/Login.php b/libs/Zend/Gdata/Gapps/Extension/Login.php new file mode 100644 index 0000000..cea1d76 --- /dev/null +++ b/libs/Zend/Gdata/Gapps/Extension/Login.php @@ -0,0 +1,485 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->_username = $username; + $this->_password = $password; + $this->_hashFunctionName = $hashFunctionName; + $this->_admin = $admin; + $this->_agreedToTerms = $agreedToTerms; + $this->_suspended = $suspended; + $this->_changePasswordAtNextLogin = $changePasswordAtNextLogin; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_username !== null) { + $element->setAttribute('userName', $this->_username); + } + if ($this->_password !== null) { + $element->setAttribute('password', $this->_password); + } + if ($this->_hashFunctionName !== null) { + $element->setAttribute('hashFunctionName', $this->_hashFunctionName); + } + if ($this->_admin !== null) { + $element->setAttribute('admin', ($this->_admin ? "true" : "false")); + } + if ($this->_agreedToTerms !== null) { + $element->setAttribute('agreedToTerms', ($this->_agreedToTerms ? "true" : "false")); + } + if ($this->_suspended !== null) { + $element->setAttribute('suspended', ($this->_suspended ? "true" : "false")); + } + if ($this->_changePasswordAtNextLogin !== null) { + $element->setAttribute('changePasswordAtNextLogin', ($this->_changePasswordAtNextLogin ? "true" : "false")); + } + + 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 + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + * @throws Zend_Gdata_App_InvalidArgumentException + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'userName': + $this->_username = $attribute->nodeValue; + break; + case 'password': + $this->_password = $attribute->nodeValue; + break; + case 'hashFunctionName': + $this->_hashFunctionName = $attribute->nodeValue; + break; + case 'admin': + if ($attribute->nodeValue == "true") { + $this->_admin = true; + } + else if ($attribute->nodeValue == "false") { + $this->_admin = false; + } + else { + require_once('Zend/Gdata/App/InvalidArgumentException.php'); + throw new Zend_Gdata_App_InvalidArgumentException("Expected 'true' or 'false' for apps:login#admin."); + } + break; + case 'agreedToTerms': + if ($attribute->nodeValue == "true") { + $this->_agreedToTerms = true; + } + else if ($attribute->nodeValue == "false") { + $this->_agreedToTerms = false; + } + else { + require_once('Zend/Gdata/App/InvalidArgumentException.php'); + throw new Zend_Gdata_App_InvalidArgumentException("Expected 'true' or 'false' for apps:login#agreedToTerms."); + } + break; + case 'suspended': + if ($attribute->nodeValue == "true") { + $this->_suspended = true; + } + else if ($attribute->nodeValue == "false") { + $this->_suspended = false; + } + else { + require_once('Zend/Gdata/App/InvalidArgumentException.php'); + throw new Zend_Gdata_App_InvalidArgumentException("Expected 'true' or 'false' for apps:login#suspended."); + } + break; + case 'changePasswordAtNextLogin': + if ($attribute->nodeValue == "true") { + $this->_changePasswordAtNextLogin = true; + } + else if ($attribute->nodeValue == "false") { + $this->_changePasswordAtNextLogin = false; + } + else { + require_once('Zend/Gdata/App/InvalidArgumentException.php'); + throw new Zend_Gdata_App_InvalidArgumentException("Expected 'true' or 'false' for apps:login#changePasswordAtNextLogin."); + } + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Get the value for this element's username attribute. + * + * @see setUsername + * @return string The attribute being modified. + */ + public function getUsername() + { + return $this->_username; + } + + /** + * Set the value for this element's username attribute. This string + * is used to uniquely identify the user in this domian and is used + * to form this user's email address. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Gapps_Extension_Login Provides a fluent interface. + */ + public function setUsername($value) + { + $this->_username = $value; + return $this; + } + + /** + * Get the value for this element's password attribute. + * + * @see setPassword + * @return string The requested attribute. + */ + public function getPassword() + { + return $this->_password; + } + + /** + * Set the value for this element's password attribute. As of this + * writing, this can be either be provided as plaintext or hashed using + * the SHA-1 algorithm for protection. If using a hash function, + * this must be indicated by calling setHashFunctionName(). + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Gapps_Extension_Login Provides a fluent interface. + */ + public function setPassword($value) + { + $this->_password = $value; + return $this; + } + + /** + * Get the value for this element's hashFunctionName attribute. + * + * @see setHashFunctionName + * @return string The requested attribute. + */ + public function getHashFunctionName() + { + return $this->_hashFunctionName; + } + + /** + * Set the value for this element's hashFunctionName attribute. This + * indicates whether the password supplied with setPassword() is in + * plaintext or has had a hash function applied to it. If null, + * plaintext is assumed. As of this writing, the only valid hash + * function is 'SHA-1'. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Gapps_Extension_Login Provides a fluent interface. + */ + public function setHashFunctionName($value) + { + $this->_hashFunctionName = $value; + return $this; + } + + /** + * Get the value for this element's admin attribute. + * + * @see setAdmin + * @return boolean The requested attribute. + * @throws Zend_Gdata_App_InvalidArgumentException + */ + public function getAdmin() + { + if (!(is_bool($this->_admin))) { + require_once('Zend/Gdata/App/InvalidArgumentException.php'); + throw new Zend_Gdata_App_InvalidArgumentException('Expected boolean for admin.'); + } + return $this->_admin; + } + + /** + * Set the value for this element's admin attribute. This indicates + * whether this user is an administrator for this domain. + * + * @param boolean $value The desired value for this attribute. + * @return Zend_Gdata_Gapps_Extension_Login Provides a fluent interface. + * @throws Zend_Gdata_App_InvalidArgumentException + */ + public function setAdmin($value) + { + if (!(is_bool($value))) { + require_once('Zend/Gdata/App/InvalidArgumentException.php'); + throw new Zend_Gdata_App_InvalidArgumentException('Expected boolean for $value.'); + } + $this->_admin = $value; + return $this; + } + + /** + * Get the value for this element's agreedToTerms attribute. + * + * @see setAgreedToTerms + * @return boolean The requested attribute. + * @throws Zend_Gdata_App_InvalidArgumentException + */ + public function getAgreedToTerms() + { + if (!(is_bool($this->_agreedToTerms))) { + require_once('Zend/Gdata/App/InvalidArgumentException.php'); + throw new Zend_Gdata_App_InvalidArgumentException('Expected boolean for agreedToTerms.'); + } + return $this->_agreedToTerms; + } + + /** + * Set the value for this element's agreedToTerms attribute. This + * indicates whether this user has agreed to the terms of service. + * + * @param boolean $value The desired value for this attribute. + * @return Zend_Gdata_Gapps_Extension_Login Provides a fluent interface. + * @throws Zend_Gdata_App_InvalidArgumentException + */ + public function setAgreedToTerms($value) + { + if (!(is_bool($value))) { + require_once('Zend/Gdata/App/InvalidArgumentException.php'); + throw new Zend_Gdata_App_InvalidArgumentException('Expected boolean for $value.'); + } + $this->_agreedToTerms = $value; + return $this; + } + + /** + * Get the value for this element's suspended attribute. + * + * @see setSuspended + * @return boolean The requested attribute. + * @throws Zend_Gdata_App_InvalidArgumentException + */ + public function getSuspended() + { + if (!(is_bool($this->_suspended))) { + require_once('Zend/Gdata/App/InvalidArgumentException.php'); + throw new Zend_Gdata_App_InvalidArgumentException('Expected boolean for suspended.'); + } + return $this->_suspended; + } + + /** + * Set the value for this element's suspended attribute. If true, the + * user will not be able to login to this domain until unsuspended. + * + * @param boolean $value The desired value for this attribute. + * @return Zend_Gdata_Gapps_Extension_Login Provides a fluent interface. + * @throws Zend_Gdata_App_InvalidArgumentException + */ + public function setSuspended($value) + { + if (!(is_bool($value))) { + require_once('Zend/Gdata/App/InvalidArgumentException.php'); + throw new Zend_Gdata_App_InvalidArgumentException('Expected boolean for $value.'); + } + $this->_suspended = $value; + return $this; + } + + /** + * Get the value for this element's changePasswordAtNextLogin attribute. + * + * @see setChangePasswordAtNextLogin + * @return boolean The requested attribute. + * @throws Zend_Gdata_App_InvalidArgumentException + */ + public function getChangePasswordAtNextLogin() + { + if (!(is_bool($this->_changePasswordAtNextLogin))) { + require_once('Zend/Gdata/App/InvalidArgumentException.php'); + throw new Zend_Gdata_App_InvalidArgumentException('Expected boolean for changePasswordAtNextLogin.'); + } + return $this->_changePasswordAtNextLogin; + } + + /** + * Set the value for this element's changePasswordAtNextLogin attribute. + * If true, the user will be forced to set a new password the next + * time they login. + * + * @param boolean $value The desired value for this attribute. + * @return Zend_Gdata_Gapps_Extension_Login Provides a fluent interface. + * @throws Zend_Gdata_App_InvalidArgumentException + */ + public function setChangePasswordAtNextLogin($value) + { + if (!(is_bool($value))) { + require_once('Zend/Gdata/App/InvalidArgumentException.php'); + throw new Zend_Gdata_App_InvalidArgumentException('Expected boolean for $value.'); + } + $this->_changePasswordAtNextLogin = $value; + return $this; + } + + /** + * Magic toString method allows using this directly via echo + * Works best in PHP >= 4.2.0 + */ + public function __toString() + { + return "Username: " . $this->getUsername() . + "\nPassword: " . (is_null($this->getPassword()) ? "NOT SET" : "SET") . + "\nPassword Hash Function: " . $this->getHashFunctionName() . + "\nAdministrator: " . ($this->getAdmin() ? "Yes" : "No") . + "\nAgreed To Terms: " . ($this->getAgreedToTerms() ? "Yes" : "No") . + "\nSuspended: " . ($this->getSuspended() ? "Yes" : "No"); + } +} diff --git a/libs/Zend/Gdata/Gapps/Extension/Name.php b/libs/Zend/Gdata/Gapps/Extension/Name.php new file mode 100644 index 0000000..33455bb --- /dev/null +++ b/libs/Zend/Gdata/Gapps/Extension/Name.php @@ -0,0 +1,181 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->_familyName = $familyName; + $this->_givenName = $givenName; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_familyName !== null) { + $element->setAttribute('familyName', $this->_familyName); + } + if ($this->_givenName !== null) { + $element->setAttribute('givenName', $this->_givenName); + } + 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 + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'familyName': + $this->_familyName = $attribute->nodeValue; + break; + case 'givenName': + $this->_givenName = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Get the value for this element's familyName attribute. + * + * @see setFamilyName + * @return string The requested attribute. + */ + public function getFamilyName() + { + return $this->_familyName; + } + + /** + * Set the value for this element's familyName attribute. This + * represents a user's family name. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Gapps_Extension_Name Provides a fluent interface.. + */ + public function setFamilyName($value) + { + $this->_familyName = $value; + return $this; + } + + /** + * Get the value for this element's givenName attribute. + * + * @see setGivenName + * @return string The requested attribute. + */ + public function getGivenName() + { + return $this->_givenName; + } + + /** + * Set the value for this element's givenName attribute. This + * represents a user's given name. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Gapps_Extension_Name Provides a fluent interface. + */ + public function setGivenName($value) + { + $this->_givenName = $value; + return $this; + } + + /** + * Magic toString method allows using this directly via echo + * Works best in PHP >= 4.2.0 + */ + public function __toString() + { + return $this->getGivenName() . ' ' . $this->getFamilyName(); + } + +} diff --git a/libs/Zend/Gdata/Gapps/Extension/Nickname.php b/libs/Zend/Gdata/Gapps/Extension/Nickname.php new file mode 100644 index 0000000..a887b9a --- /dev/null +++ b/libs/Zend/Gdata/Gapps/Extension/Nickname.php @@ -0,0 +1,142 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->_name = $name; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_name !== null) { + $element->setAttribute('name', $this->_name); + } + 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 + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'name': + $this->_name = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Get the value for this element's name attribute. + * + * @see setName + * @return string The requested attribute. + */ + public function getName() + { + return $this->_name; + } + + /** + * Set the value for this element's name attribute. This name uniquely + * describes this nickname within the domain. Emails addressed to this + * name will be delivered to the user who owns this nickname. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Gapps_Extension_Nickname Provides a fluent + * interface. + */ + public function setName($value) + { + $this->_name = $value; + return $this; + } + + /** + * Magic toString method allows using this directly via echo + * Works best in PHP >= 4.2.0 + */ + public function __toString() + { + return $this->getName(); + } + +} diff --git a/libs/Zend/Gdata/Gapps/Extension/Quota.php b/libs/Zend/Gdata/Gapps/Extension/Quota.php new file mode 100644 index 0000000..b5717c9 --- /dev/null +++ b/libs/Zend/Gdata/Gapps/Extension/Quota.php @@ -0,0 +1,142 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->_limit = $limit; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_limit !== null) { + $element->setAttribute('limit', $this->_limit); + } + 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 + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'limit': + $this->_limit = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Get the value for this element's limit attribute. + * + * @see setLimit + * @return string The requested attribute. + */ + public function getLimit() + { + return $this->_limit; + } + + /** + * Set the value for this element's limit attribute. This is the amount + * of storage space, in bytes, that should be made available to + * the associated user. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Gapps_Extension_Quota Provides a fluent interface. + */ + public function setLimit($value) + { + $this->_limit = $value; + return $this; + } + + /** + * Magic toString method allows using this directly via echo + * Works best in PHP >= 4.2.0 + */ + public function __toString() + { + return $this->getLimit(); + } + +} diff --git a/libs/Zend/Gdata/Gapps/NicknameEntry.php b/libs/Zend/Gdata/Gapps/NicknameEntry.php new file mode 100644 index 0000000..455b503 --- /dev/null +++ b/libs/Zend/Gdata/Gapps/NicknameEntry.php @@ -0,0 +1,189 @@ + in the Google Data protocol. + * + * @category Zend + * @package Zend_Gdata + * @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_Gdata_Gapps_NicknameEntry extends Zend_Gdata_Entry +{ + + protected $_entryClassName = 'Zend_Gdata_Gapps_NicknameEntry'; + + /** + * element used to hold information about the owner + * of this nickname, including their username. + * + * @var Zend_Gdata_Gapps_Extension_Login + */ + protected $_login = null; + + /** + * element used to hold the name of this nickname. + * + * @var Zend_Gdata_Gapps_Extension_Nickname + */ + protected $_nickname = null; + + /** + * Create a new instance. + * + * @param DOMElement $element (optional) DOMElement from which this + * object should be constructed. + */ + public function __construct($element = null) + { + foreach (Zend_Gdata_Gapps::$namespaces as $nsPrefix => $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct($element); + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_login !== null) { + $element->appendChild($this->_login->getDOM($element->ownerDocument)); + } + if ($this->_nickname !== null) { + $element->appendChild($this->_nickname->getDOM($element->ownerDocument)); + } + return $element; + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them as members of this entry based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + + switch ($absoluteNodeName) { + case $this->lookupNamespace('apps') . ':' . 'login'; + $login = new Zend_Gdata_Gapps_Extension_Login(); + $login->transferFromDOM($child); + $this->_login = $login; + break; + case $this->lookupNamespace('apps') . ':' . 'nickname'; + $nickname = new Zend_Gdata_Gapps_Extension_Nickname(); + $nickname->transferFromDOM($child); + $this->_nickname = $nickname; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + /** + * Get the value of the login property for this object. + * + * @see setLogin + * @return Zend_Gdata_Gapps_Extension_Login The requested object. + */ + public function getLogin() + { + return $this->_login; + } + + /** + * Set the value of the login property for this object. This property + * is used to store the username address of the current user. + * + * @param Zend_Gdata_Gapps_Extension_Login $value The desired value for + * this instance's login property. + * @return Zend_Gdata_Gapps_NicknameEntry Provides a fluent interface. + */ + public function setLogin($value) + { + $this->_login = $value; + return $this; + } + + /** + * Get the value of the nickname property for this object. + * + * @see setNickname + * @return Zend_Gdata_Gapps_Extension_Nickname The requested object. + */ + public function getNickname() + { + return $this->_nickname; + } + + /** + * Set the value of the nickname property for this object. This property + * is used to store the the name of the current nickname. + * + * @param Zend_Gdata_Gapps_Extension_Nickname $value The desired value for + * this instance's nickname property. + * @return Zend_Gdata_Gapps_NicknameEntry Provides a fluent interface. + */ + public function setNickname($value) + { + $this->_nickname = $value; + return $this; + } + +} diff --git a/libs/Zend/Gdata/Gapps/NicknameFeed.php b/libs/Zend/Gdata/Gapps/NicknameFeed.php new file mode 100644 index 0000000..8c0e06a --- /dev/null +++ b/libs/Zend/Gdata/Gapps/NicknameFeed.php @@ -0,0 +1,51 @@ +setNickname($nickname); + $this->setUsername($username); + $this->setStartNickname($startNickname); + } + + /** + * 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 + * to disable. + */ + public function setNickname($value) + { + $this->_nickname = $value; + } + + /** + * 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 + * disabled. + */ + public function getNickname() + { + return $this->_nickname; + } + + /** + * 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 + * to disable. + */ + public function setUsername($value) + { + if ($value !== null) { + $this->_params['username'] = $value; + } + else { + unset($this->_params['username']); + } + } + + /** + * 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 + * disabled. + */ + public function getUsername() + { + if (array_key_exists('username', $this->_params)) { + return $this->_params['username']; + } else { + return null; + } + } + + /** + * 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 + * disable. + */ + public function setStartNickname($value) + { + if ($value !== null) { + $this->_params['startNickname'] = $value; + } else { + unset($this->_params['startNickname']); + } + } + + /** + * 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 + * disable. + */ + public function getStartNickname() + { + if (array_key_exists('startNickname', $this->_params)) { + return $this->_params['startNickname']; + } else { + return null; + } + } + + /** + * 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) { + $uri .= '/' . $this->_nickname; + } + $uri .= $this->getQueryString(); + return $uri; + } + +} diff --git a/libs/Zend/Gdata/Gapps/Query.php b/libs/Zend/Gdata/Gapps/Query.php new file mode 100644 index 0000000..370464c --- /dev/null +++ b/libs/Zend/Gdata/Gapps/Query.php @@ -0,0 +1,121 @@ +_domain = $domain; + } + + /** + * 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 + * Apps provisioning service. + * + * @param string $value The domain to be used for this session. + */ + public function setDomain($value) + { + $this->_domain = $value; + } + + /** + * 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 + * 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 + * overridden by providing a fully qualified domain as $domain. + * + * @see setDomain + * @param string $domain (optional) A fully-qualified domain to use + * instead of the default domain for this service instance. + */ + public function getBaseUrl($domain = null) + { + if ($domain !== null) { + return Zend_Gdata_Gapps::APPS_BASE_FEED_URI . '/' . $domain; + } + else if ($this->_domain !== null) { + return Zend_Gdata_Gapps::APPS_BASE_FEED_URI . '/' . $this->_domain; + } + else { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'Domain must be specified.'); + } + } + +} diff --git a/libs/Zend/Gdata/Gapps/ServiceException.php b/libs/Zend/Gdata/Gapps/ServiceException.php new file mode 100644 index 0000000..4537ea6 --- /dev/null +++ b/libs/Zend/Gdata/Gapps/ServiceException.php @@ -0,0 +1,206 @@ +setErrors($errors); + } + } + + /** + * 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 + * 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 + // 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 + * AppsForYourDomainErrors tag. + * + * @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 + */ + public function setErrors($array) { + $this->_errors = array(); + foreach ($array as $error) { + $this->addError($error); + } + } + + /** + * Get the list of errors as sent by the server inside of an + * AppsForYourDomainErrors tag. + * + * @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 + * if not found. + */ + public function getError($errorCode) { + if (array_key_exists($errorCode, $this->_errors)) { + $result = $this->_errors[$errorCode]; + return $result; + } else { + return null; + } + } + + /** + * 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 + * 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 + */ + public function importFromString($string) { + 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 + // 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 + // 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); + if (!$rootElement) { + 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(); + $error->transferFromDom($errorNode); + $this->addError($error); + } + } + return $this; + } else { + 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() { + $result = "The server encountered the following errors processing the request:"; + foreach ($this->_errors as $error) { + $result .= "\n" . $error->__toString(); + } + return $result; + } +} diff --git a/libs/Zend/Gdata/Gapps/UserEntry.php b/libs/Zend/Gdata/Gapps/UserEntry.php new file mode 100644 index 0000000..5d64ed5 --- /dev/null +++ b/libs/Zend/Gdata/Gapps/UserEntry.php @@ -0,0 +1,295 @@ + in the Google Data protocol. + * + * @category Zend + * @package Zend_Gdata + * @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_Gdata_Gapps_UserEntry extends Zend_Gdata_Entry +{ + + protected $_entryClassName = 'Zend_Gdata_Gapps_UserEntry'; + + /** + * element containing information about this user's + * account, including their username and permissions. + * + * @var Zend_Gdata_Gapps_Extension_Login + */ + protected $_login = null; + + /** + * element containing the user's actual name. + * + * @var Zend_Gdata_Gapps_Extension_Name + */ + protected $_name = null; + + /** + * element describing any storage quotas in place for + * this user. + * + * @var Zend_Gdata_Gapps_Extension_Quota + */ + protected $_quota = null; + + /** + * element containing information about other feeds + * relevant to this entry. + * + * @var Zend_Gdata_Extension_FeedLink + */ + protected $_feedLink = array(); + + /** + * Create a new instance. + * + * @param DOMElement $element (optional) DOMElement from which this + * object should be constructed. + */ + public function __construct($element = null) + { + foreach (Zend_Gdata_Gapps::$namespaces as $nsPrefix => $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct($element); + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_login !== null) { + $element->appendChild($this->_login->getDOM($element->ownerDocument)); + } + if ($this->_name !== null) { + $element->appendChild($this->_name->getDOM($element->ownerDocument)); + } + if ($this->_quota !== null) { + $element->appendChild($this->_quota->getDOM($element->ownerDocument)); + } + foreach ($this->_feedLink as $feedLink) { + $element->appendChild($feedLink->getDOM($element->ownerDocument)); + } + return $element; + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them as members of this entry based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + + switch ($absoluteNodeName) { + case $this->lookupNamespace('apps') . ':' . 'login'; + $login = new Zend_Gdata_Gapps_Extension_Login(); + $login->transferFromDOM($child); + $this->_login = $login; + break; + case $this->lookupNamespace('apps') . ':' . 'name'; + $name = new Zend_Gdata_Gapps_Extension_Name(); + $name->transferFromDOM($child); + $this->_name = $name; + break; + case $this->lookupNamespace('apps') . ':' . 'quota'; + $quota = new Zend_Gdata_Gapps_Extension_Quota(); + $quota->transferFromDOM($child); + $this->_quota = $quota; + break; + case $this->lookupNamespace('gd') . ':' . 'feedLink'; + $feedLink = new Zend_Gdata_Extension_FeedLink(); + $feedLink->transferFromDOM($child); + $this->_feedLink[] = $feedLink; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + /** + * Get the value of the login property for this object. + * + * @see setLogin + * @return Zend_Gdata_Gapps_Extension_Login The requested object. + */ + public function getLogin() + { + return $this->_login; + } + + /** + * Set the value of the login property for this object. This property + * is used to store the username address of the current user. + * + * @param Zend_Gdata_Gapps_Extension_Login $value The desired value for + * this instance's login property. + * @return Zend_Gdata_Gapps_UserEntry Provides a fluent interface. + */ + public function setLogin($value) + { + $this->_login = $value; + return $this; + } + + /** + * Get the value of the name property for this object. + * + * @see setName + * @return Zend_Gdata_Gapps_Extension_Name The requested object. + */ + public function getName() + { + return $this->_name; + } + + /** + * Set the value of the name property for this object. This property + * is used to store the full name of the current user. + * + * @param Zend_Gdata_Gapps_Extension_Name $value The desired value for + * this instance's name property. + * @return Zend_Gdata_Gapps_UserEntry Provides a fluent interface. + */ + public function setName($value) + { + $this->_name = $value; + return $this; + } + + /** + * Get the value of the quota property for this object. + * + * @see setQuota + * @return Zend_Gdata_Gapps_Extension_Quota The requested object. + */ + public function getQuota() + { + return $this->_quota; + } + + /** + * Set the value of the quota property for this object. This property + * is used to store the amount of storage available for the current + * user. Quotas may not be modifiable depending on the domain used. + * + * @param Zend_Gdata_Gapps_Extension_Quota $value The desired value for + * this instance's quota property. + * @return Zend_Gdata_Gapps_UserEntry Provides a fluent interface. + */ + public function setQuota($value) + { + $this->_quota = $value; + return $this; + } + + /** + * Returns all feed links for this entry, or if a rel value is + * specified, the feed link associated with that value is returned. + * + * @param string $rel The rel value of the link to be found. If null, + * the array of links is returned instead. + * @return mixed Either an array of Zend_Gdata_Extension_FeedLink + * objects if $rel is null, a single + * Zend_Gdata_Extension_FeedLink object if $rel is specified + * and a matching feed link is found, or null if $rel is + * specified and no matching feed link is found. + */ + public function getFeedLink($rel = null) + { + if ($rel == null) { + return $this->_feedLink; + } else { + foreach ($this->_feedLink as $feedLink) { + if ($feedLink->rel == $rel) { + return $feedLink; + } + } + return null; + } + } + + /** + * Set the value of the feed link property for this object. This property + * is used to provide links to alternative feeds relevant to this entry. + * + * @param array $value A collection of + * Zend_Gdata_Gapps_Extension_FeedLink objects. + * @return Zend_Gdata_Gapps_EventEntry Provides a fluent interface. + */ + public function setFeedLink($value) + { + $this->_feedLink = $value; + return $this; + } + +} diff --git a/libs/Zend/Gdata/Gapps/UserFeed.php b/libs/Zend/Gdata/Gapps/UserFeed.php new file mode 100644 index 0000000..26e9208 --- /dev/null +++ b/libs/Zend/Gdata/Gapps/UserFeed.php @@ -0,0 +1,51 @@ +setUsername($username); + $this->setStartUsername($startUsername); + } + + /** + * 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 + * disable. + */ + public function setUsername($value) + { + $this->_username = $value; + } + + /** + * 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 + * null if disabled. + */ + public function getUsername() + { + return $this->_username; + } + + /** + * 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 + * disable. + */ + public function setStartUsername($value) + { + if ($value !== null) { + $this->_params['startUsername'] = $value; + } else { + unset($this->_params['startUsername']); + } + } + + /** + * 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 + * disabled. + */ + public function getStartUsername() + { + if (array_key_exists('startUsername', $this->_params)) { + return $this->_params['startUsername']; + } else { + return null; + } + } + + /** + * Returns the query URL generated by this query instance. + * + * @return string The query URL for this instance. + */ + public function getQueryUrl() + { + $uri = $this->getBaseUrl(); + $uri .= Zend_Gdata_Gapps::APPS_USER_PATH; + if ($this->_username !== null) { + $uri .= '/' . $this->_username; + } + $uri .= $this->getQueryString(); + return $uri; + } + +} diff --git a/libs/Zend/Gdata/Gbase.php b/libs/Zend/Gdata/Gbase.php new file mode 100644 index 0000000..9a1bb57 --- /dev/null +++ b/libs/Zend/Gdata/Gbase.php @@ -0,0 +1,201 @@ + 'http://base.google.com/ns/1.0', + 'batch' => 'http://schemas.google.com/gdata/batch'); + + /** + * Create Zend_Gdata_Gbase object + * + * @param Zend_Http_Client $client (optional) The HTTP client to use when + * when communicating with the Google Apps servers. + * @param string $applicationId The identity of the app in the form of Company-AppName-Version + */ + public function __construct($client = null, $applicationId = 'MyCompany-MyApp-1.0') + { + $this->registerPackage('Zend_Gdata_Gbase'); + $this->registerPackage('Zend_Gdata_Gbase_Extension'); + parent::__construct($client, $applicationId); + $this->_httpClient->setParameterPost('service', self::AUTH_SERVICE_NAME); + } + + /** + * Retreive feed object + * + * @param mixed $location The location for the feed, as a URL or Query + * @return Zend_Gdata_Gbase_ItemFeed + */ + public function getGbaseItemFeed($location = null) + { + if ($location === null) { + $uri = self::GBASE_ITEM_FEED_URI; + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getFeed($uri, 'Zend_Gdata_Gbase_ItemFeed'); + } + + /** + * Retreive entry object + * + * @param mixed $location The location for the feed, as a URL or Query + * @return Zend_Gdata_Gbase_ItemEntry + */ + public function getGbaseItemEntry($location = null) + { + if ($location === null) { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'Location must not be null'); + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getEntry($uri, 'Zend_Gdata_Gbase_ItemEntry'); + } + + /** + * Insert an entry + * + * @param Zend_Gdata_Gbase_ItemEntry $entry The Base entry to upload + * @param boolean $dryRun Flag for the 'dry-run' parameter + * @return Zend_Gdata_Gbase_ItemFeed + */ + public function insertGbaseItem($entry, $dryRun = false) + { + if ($dryRun == false) { + $uri = $this->_defaultPostUri; + } else { + $uri = $this->_defaultPostUri . '?dry-run=true'; + } + $newitem = $this->insertEntry($entry, $uri, 'Zend_Gdata_Gbase_ItemEntry'); + return $newitem; + } + + /** + * Update an entry + * + * @param Zend_Gdata_Gbase_ItemEntry $entry The Base entry to be updated + * @param boolean $dryRun Flag for the 'dry-run' parameter + * @return Zend_Gdata_Gbase_ItemEntry + */ + public function updateGbaseItem($entry, $dryRun = false) + { + $returnedEntry = $entry->save($dryRun); + return $returnedEntry; + } + + /** + * Delete an entry + * + * @param Zend_Gdata_Gbase_ItemEntry $entry The Base entry to remove + * @param boolean $dryRun Flag for the 'dry-run' parameter + * @return Zend_Gdata_Gbase_ItemFeed + */ + public function deleteGbaseItem($entry, $dryRun = false) + { + $entry->delete($dryRun); + return $this; + } + + /** + * Retrieve feed object + * + * @param mixed $location The location for the feed, as a URL or Query + * @return Zend_Gdata_Gbase_SnippetFeed + */ + public function getGbaseSnippetFeed($location = null) + { + if ($location === null) { + $uri = self::GBASE_SNIPPET_FEED_URI; + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getFeed($uri, 'Zend_Gdata_Gbase_SnippetFeed'); + } +} diff --git a/libs/Zend/Gdata/Gbase/Entry.php b/libs/Zend/Gdata/Gbase/Entry.php new file mode 100644 index 0000000..702a37b --- /dev/null +++ b/libs/Zend/Gdata/Gbase/Entry.php @@ -0,0 +1,151 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct($element); + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + foreach ($this->_baseAttributes as $baseAttribute) { + $element->appendChild($baseAttribute->getDOM($element->ownerDocument)); + } + return $element; + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them as members of this entry based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + + if (strstr($absoluteNodeName, $this->lookupNamespace('g') . ':')) { + $baseAttribute = new Zend_Gdata_Gbase_Extension_BaseAttribute(); + $baseAttribute->transferFromDOM($child); + $this->_baseAttributes[] = $baseAttribute; + } else { + parent::takeChildFromDOM($child); + } + } + + /** + * Get the value of the itme_type + * + * @return Zend_Gdata_Gbase_Extension_ItemType The requested object. + */ + public function getItemType() + { + $itemType = $this->getGbaseAttribute('item_type'); + if (is_object($itemType[0])) { + return $itemType[0]; + } else { + return null; + } + } + + /** + * Return all the Base attributes + * @return Zend_Gdata_Gbase_Extension_BaseAttribute + */ + public function getGbaseAttributes() { + return $this->_baseAttributes; + } + + /** + * Return an array of Base attributes that match the given attribute name + * + * @param string $name The name of the Base attribute to look for + * @return array $matches Array that contains the matching list of Base attributes + */ + public function getGbaseAttribute($name) + { + $matches = array(); + for ($i = 0; $i < count($this->_baseAttributes); $i++) { + $baseAttribute = $this->_baseAttributes[$i]; + if ($baseAttribute->rootElement == $name && + $baseAttribute->rootNamespaceURI == $this->lookupNamespace('g')) { + $matches[] = &$this->_baseAttributes[$i]; + } + } + return $matches; + } + +} diff --git a/libs/Zend/Gdata/Gbase/Extension/BaseAttribute.php b/libs/Zend/Gdata/Gbase/Extension/BaseAttribute.php new file mode 100644 index 0000000..dfc8ff9 --- /dev/null +++ b/libs/Zend/Gdata/Gbase/Extension/BaseAttribute.php @@ -0,0 +1,116 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + if ($type !== null) { + $attr = array('name' => 'type', 'value' => $type); + $typeAttr = array('type' => $attr); + $this->setExtensionAttributes($typeAttr); + } + parent::__construct($name, + $this->_rootNamespace, + $this->lookupNamespace($this->_rootNamespace), + $text); + } + + /** + * Get the name of the attribute + * + * @return attribute name The requested object. + */ + public function getName() { + return $this->_rootElement; + } + + /** + * Get the type of the attribute + * + * @return attribute type The requested object. + */ + public function getType() { + $typeAttr = $this->getExtensionAttributes(); + return $typeAttr['type']['value']; + } + + /** + * Set the 'name' of the Base attribute object: + * <g:[$name] type='[$type]'>[$value]</g:[$name]> + * + * @param Zend_Gdata_App_Extension_Element $attribute The attribute object + * @param string $name The name of the Base attribute + * @return Zend_Gdata_Extension_ItemEntry Provides a fluent interface + */ + public function setName($name) { + $this->_rootElement = $name; + return $this; + } + + /** + * Set the 'type' of the Base attribute object: + * <g:[$name] type='[$type]'>[$value]</g:[$name]> + * + * @param Zend_Gdata_App_Extension_Element $attribute The attribute object + * @param string $type The type of the Base attribute + * @return Zend_Gdata_Extension_ItemEntry Provides a fluent interface + */ + public function setType($type) { + $attr = array('name' => 'type', 'value' => $type); + $typeAttr = array('type' => $attr); + $this->setExtensionAttributes($typeAttr); + return $this; + } + +} diff --git a/libs/Zend/Gdata/Gbase/Feed.php b/libs/Zend/Gdata/Gbase/Feed.php new file mode 100644 index 0000000..64d2b5e --- /dev/null +++ b/libs/Zend/Gdata/Gbase/Feed.php @@ -0,0 +1,60 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct($element); + } +} diff --git a/libs/Zend/Gdata/Gbase/ItemEntry.php b/libs/Zend/Gdata/Gbase/ItemEntry.php new file mode 100644 index 0000000..df545e8 --- /dev/null +++ b/libs/Zend/Gdata/Gbase/ItemEntry.php @@ -0,0 +1,159 @@ +addGbaseAttribute('item_type', $value, 'text'); + return $this; + } + + /** + * Adds a custom attribute to the entry in the following format: + * <g:[$name] type='[$type]'>[$value]</g:[$name]> + * + * @param string $name The name of the attribute + * @param string $value The text value of the attribute + * @param string $type (optional) The type of the attribute. + * e.g.: 'text', 'number', 'floatUnit' + * @return Zend_Gdata_Gbase_ItemEntry Provides a fluent interface + */ + public function addGbaseAttribute($name, $text, $type = null) { + $newBaseAttribute = new Zend_Gdata_Gbase_Extension_BaseAttribute($name, $text, $type); + $this->_baseAttributes[] = $newBaseAttribute; + return $this; + } + + /** + * 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 + */ + public function removeGbaseAttribute($baseAttribute) { + $baseAttributes = $this->_baseAttributes; + for ($i = 0; $i < count($this->_baseAttributes); $i++) { + if ($this->_baseAttributes[$i] == $baseAttribute) { + array_splice($baseAttributes, $i, 1); + break; + } + } + $this->_baseAttributes = $baseAttributes; + return $this; + } + + /** + * Uploads changes in this entry to the server using Zend_Gdata_App + * + * @param boolean $dryRun Whether the transaction is dry run or not. + * @param string|null $uri The URI to send requests to, or null if $data + * contains the URI. + * @param string|null $className The name of the class that should we + * deserializing the server response. If null, then + * 'Zend_Gdata_App_Entry' will be used. + * @param array $extraHeaders Extra headers to add to the request, as an + * array of string-based key/value pairs. + * @return Zend_Gdata_App_Entry The updated entry + * @throws Zend_Gdata_App_Exception + */ + public function save($dryRun = false, + $uri = null, + $className = null, + $extraHeaders = array()) + { + if ($dryRun == true) { + $editLink = $this->getEditLink(); + if ($uri == null && $editLink !== null) { + $uri = $editLink->getHref() . '?dry-run=true'; + } + if ($uri === null) { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException('You must specify an URI which needs deleted.'); + } + $service = new Zend_Gdata_App($this->getHttpClient()); + return $service->updateEntry($this, + $uri, + $className, + $extraHeaders); + } else { + parent::save($uri, $className, $extraHeaders); + } + } + + /** + * Deletes this entry to the server using the referenced + * Zend_Http_Client to do a HTTP DELETE to the edit link stored in this + * entry's link collection. + * + * @param boolean $dyrRun Whether the transaction is dry run or not + * @return void + * @throws Zend_Gdata_App_Exception + */ + public function delete($dryRun = false) + { + $uri = null; + + if ($dryRun == true) { + $editLink = $this->getEditLink(); + if ($editLink !== null) { + $uri = $editLink->getHref() . '?dry-run=true'; + } + if ($uri === null) { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException('You must specify an URI which needs deleted.'); + } + parent::delete($uri); + } else { + parent::delete(); + } + } + +} diff --git a/libs/Zend/Gdata/Gbase/ItemFeed.php b/libs/Zend/Gdata/Gbase/ItemFeed.php new file mode 100644 index 0000000..ef2deac --- /dev/null +++ b/libs/Zend/Gdata/Gbase/ItemFeed.php @@ -0,0 +1,46 @@ +_id = $value; + return $this; + } + + /* + * @return string id + */ + public function getId() + { + return $this->_id; + } + + /** + * Returns the query URL generated by this query instance. + * + * @return string The query URL for this instance. + */ + public function getQueryUrl() + { + $uri = $this->_defaultFeedUri; + if ($this->getId() !== null) { + $uri .= '/' . $this->getId(); + } else { + $uri .= $this->getQueryString(); + } + return $uri; + } + +} diff --git a/libs/Zend/Gdata/Gbase/Query.php b/libs/Zend/Gdata/Gbase/Query.php new file mode 100644 index 0000000..8a5f69b --- /dev/null +++ b/libs/Zend/Gdata/Gbase/Query.php @@ -0,0 +1,266 @@ +_params['key'] = $value; + } else { + unset($this->_params['key']); + } + return $this; + } + + /** + * @param string $value + * @return Zend_Gdata_Gbase_ItemQuery Provides a fluent interface + */ + public function setBq($value) + { + if ($value !== null) { + $this->_params['bq'] = $value; + } else { + unset($this->_params['bq']); + } + return $this; + } + + /** + * @param string $value + * @return Zend_Gdata_Gbase_ItemQuery Provides a fluent interface + */ + public function setRefine($value) + { + if ($value !== null) { + $this->_params['refine'] = $value; + } else { + unset($this->_params['refine']); + } + return $this; + } + + /** + * @param string $value + * @return Zend_Gdata_Gbase_ItemQuery Provides a fluent interface + */ + public function setContent($value) + { + if ($value !== null) { + $this->_params['content'] = $value; + } else { + unset($this->_params['content']); + } + return $this; + } + + /** + * @param string $value + * @return Zend_Gdata_Gbase_ItemQuery Provides a fluent interface + */ + public function setOrderBy($value) + { + if ($value !== null) { + $this->_params['orderby'] = $value; + } else { + unset($this->_params['orderby']); + } + return $this; + } + + /** + * @param string $value + * @return Zend_Gdata_Gbase_ItemQuery Provides a fluent interface + */ + public function setSortOrder($value) + { + if ($value !== null) { + $this->_params['sortorder'] = $value; + } else { + unset($this->_params['sortorder']); + } + return $this; + } + + /** + * @param string $value + * @return Zend_Gdata_Gbase_ItemQuery Provides a fluent interface + */ + public function setCrowdBy($value) + { + if ($value !== null) { + $this->_params['crowdby'] = $value; + } else { + unset($this->_params['crowdby']); + } + return $this; + } + + /** + * @param string $value + * @return Zend_Gdata_Gbase_ItemQuery Provides a fluent interface + */ + public function setAdjust($value) + { + if ($value !== null) { + $this->_params['adjust'] = $value; + } else { + unset($this->_params['adjust']); + } + return $this; + } + + /** + * @return string key + */ + public function getKey() + { + if (array_key_exists('key', $this->_params)) { + return $this->_params['key']; + } else { + return null; + } + } + + /** + * @return string bq + */ + public function getBq() + { + if (array_key_exists('bq', $this->_params)) { + return $this->_params['bq']; + } else { + return null; + } + } + + /** + * @return string refine + */ + public function getRefine() + { + if (array_key_exists('refine', $this->_params)) { + return $this->_params['refine']; + } else { + return null; + } + } + + /** + * @return string content + */ + public function getContent() + { + if (array_key_exists('content', $this->_params)) { + return $this->_params['content']; + } else { + return null; + } + } + + /** + * @return string orderby + */ + public function getOrderBy() + { + if (array_key_exists('orderby', $this->_params)) { + return $this->_params['orderby']; + } else { + return null; + } + } + + /** + * @return string sortorder + */ + public function getSortOrder() + { + if (array_key_exists('sortorder', $this->_params)) { + return $this->_params['sortorder']; + } else { + return null; + } + } + + /** + * @return string crowdby + */ + public function getCrowdBy() + { + if (array_key_exists('crowdby', $this->_params)) { + return $this->_params['crowdby']; + } else { + return null; + } + } + + /** + * @return string adjust + */ + public function getAdjust() + { + if (array_key_exists('adjust', $this->_params)) { + return $this->_params['adjust']; + } else { + return null; + } + } + +} diff --git a/libs/Zend/Gdata/Gbase/SnippetEntry.php b/libs/Zend/Gdata/Gbase/SnippetEntry.php new file mode 100644 index 0000000..0c15fac --- /dev/null +++ b/libs/Zend/Gdata/Gbase/SnippetEntry.php @@ -0,0 +1,46 @@ +_defaultFeedUri; + if ($this->getCategory() !== null) { + $uri .= '/-/' . $this->getCategory(); + } + $uri .= $this->getQueryString(); + return $uri; + } + +} diff --git a/libs/Zend/Gdata/Geo.php b/libs/Zend/Gdata/Geo.php new file mode 100755 index 0000000..2cdef16 --- /dev/null +++ b/libs/Zend/Gdata/Geo.php @@ -0,0 +1,61 @@ + 'http://www.georss.org/georss', + 'gml' => 'http://www.opengis.net/gml'); + + /** + * Create Zend_Gdata_Geo object + * + * @param Zend_Http_Client $client (optional) The HTTP client to use when + * when communicating with the Google Apps servers. + * @param string $applicationId The identity of the app in the form of Company-AppName-Version + */ + public function __construct($client = null, $applicationId = 'MyCompany-MyApp-1.0') + { + $this->registerPackage('Zend_Gdata_Geo'); + $this->registerPackage('Zend_Gdata_Geo_Extension'); + parent::__construct($client, $applicationId); + } + +} diff --git a/libs/Zend/Gdata/Geo/Entry.php b/libs/Zend/Gdata/Geo/Entry.php new file mode 100755 index 0000000..e2c649d --- /dev/null +++ b/libs/Zend/Gdata/Geo/Entry.php @@ -0,0 +1,97 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct($element); + } + + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_where != null) { + $element->appendChild($this->_where->getDOM($element->ownerDocument)); + } + return $element; + } + + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('georss') . ':' . 'where': + $where = new Zend_Gdata_Geo_Extension_GeoRssWhere(); + $where->transferFromDOM($child); + $this->_where = $where; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + public function getWhere() + { + return $this->_where; + } + + public function setWhere($value) + { + $this->_where = $value; + return $this; + } + + +} diff --git a/libs/Zend/Gdata/Geo/Extension/GeoRssWhere.php b/libs/Zend/Gdata/Geo/Extension/GeoRssWhere.php new file mode 100755 index 0000000..8f81654 --- /dev/null +++ b/libs/Zend/Gdata/Geo/Extension/GeoRssWhere.php @@ -0,0 +1,135 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->setPoint($point); + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_point !== null) { + $element->appendChild($this->_point->getDOM($element->ownerDocument)); + } + return $element; + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them as members of this entry based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + + switch ($absoluteNodeName) { + case $this->lookupNamespace('gml') . ':' . 'Point'; + $point = new Zend_Gdata_Geo_Extension_GmlPoint(); + $point->transferFromDOM($child); + $this->_point = $point; + break; + } + } + + /** + * Get the value for this element's point attribute. + * + * @see setPoint + * @return Zend_Gdata_Geo_Extension_GmlPoint The requested attribute. + */ + public function getPoint() + { + return $this->_point; + } + + /** + * Set the value for this element's point attribute. + * + * @param Zend_Gdata_Geo_Extension_GmlPoint $value The desired value for this attribute. + * @return Zend_Gdata_Geo_Extension_GeoRssWhere Provides a fluent interface + */ + public function setPoint($value) + { + $this->_point = $value; + return $this; + } + +} diff --git a/libs/Zend/Gdata/Geo/Extension/GmlPoint.php b/libs/Zend/Gdata/Geo/Extension/GmlPoint.php new file mode 100755 index 0000000..afbe4ae --- /dev/null +++ b/libs/Zend/Gdata/Geo/Extension/GmlPoint.php @@ -0,0 +1,136 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->setPos($pos); + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_pos !== null) { + $element->appendChild($this->_pos->getDOM($element->ownerDocument)); + } + return $element; + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them as members of this entry based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + + switch ($absoluteNodeName) { + case $this->lookupNamespace('gml') . ':' . 'pos'; + $pos = new Zend_Gdata_Geo_Extension_GmlPos(); + $pos->transferFromDOM($child); + $this->_pos = $pos; + break; + } + } + + /** + * Get the value for this element's pos attribute. + * + * @see setPos + * @return Zend_Gdata_Geo_Extension_GmlPos The requested attribute. + */ + public function getPos() + { + return $this->_pos; + } + + /** + * Set the value for this element's distance attribute. + * + * @param Zend_Gdata_Geo_Extension_GmlPos $value The desired value for this attribute + * @return Zend_Gdata_Geo_Extension_GmlPoint Provides a fluent interface + */ + public function setPos($value) + { + $this->_pos = $value; + return $this; + } + + +} diff --git a/libs/Zend/Gdata/Geo/Extension/GmlPos.php b/libs/Zend/Gdata/Geo/Extension/GmlPos.php new file mode 100755 index 0000000..644764a --- /dev/null +++ b/libs/Zend/Gdata/Geo/Extension/GmlPos.php @@ -0,0 +1,61 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->setText($text); + } + +} diff --git a/libs/Zend/Gdata/Geo/Feed.php b/libs/Zend/Gdata/Geo/Feed.php new file mode 100755 index 0000000..32763d0 --- /dev/null +++ b/libs/Zend/Gdata/Geo/Feed.php @@ -0,0 +1,64 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct($element); + } + +} diff --git a/libs/Zend/Gdata/HttpClient.php b/libs/Zend/Gdata/HttpClient.php new file mode 100644 index 0000000..bf5a76e --- /dev/null +++ b/libs/Zend/Gdata/HttpClient.php @@ -0,0 +1,245 @@ +setAuthSubPrivateKey($key, $passphrase); + fclose($fp); + } + + /** + * Sets the PEM formatted private key to be used for secure AuthSub auth. + * + * In order to call this method, openssl must be enabled in your PHP + * installation. Otherwise, a Zend_Gdata_App_InvalidArgumentException + * will be thrown. + * + * @param string $key The private key + * @param string $passphrase The optional private key passphrase + * @throws Zend_Gdata_App_InvalidArgumentException + * @return Zend_Gdata_HttpClient Provides a fluent interface + */ + public function setAuthSubPrivateKey($key, $passphrase = null) { + if ($key != null && !function_exists('openssl_pkey_get_private')) { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'You cannot enable secure AuthSub if the openssl module ' . + 'is not enabled in your PHP installation.'); + } + $this->_authSubPrivateKeyId = openssl_pkey_get_private( + $key, $passphrase); + return $this; + } + + /** + * Gets the openssl private key id + * + * @return string The private key + */ + public function getAuthSubPrivateKeyId() { + return $this->_authSubPrivateKeyId; + } + + /** + * Gets the AuthSub token used for authentication + * + * @return string The token + */ + public function getAuthSubToken() { + return $this->_authSubToken; + } + + /** + * Sets the AuthSub token used for authentication + * + * @param string $token The token + * @return Zend_Gdata_HttpClient Provides a fluent interface + */ + public function setAuthSubToken($token) { + $this->_authSubToken = $token; + return $this; + } + + /** + * Gets the ClientLogin token used for authentication + * + * @return string The token + */ + public function getClientLoginToken() { + return $this->_clientLoginToken; + } + + /** + * Sets the ClientLogin token used for authentication + * + * @param string $token The token + * @return Zend_Gdata_HttpClient Provides a fluent interface + */ + public function setClientLoginToken($token) { + $this->_clientLoginToken = $token; + return $this; + } + + /** + * Filters the HTTP requests being sent to add the Authorization header. + * + * If both AuthSub and ClientLogin tokens are set, + * AuthSub takes precedence. If an AuthSub key is set, then + * secure AuthSub authentication is used, and the request is signed. + * Requests must be signed only with the private key corresponding to the + * public key registered with Google. If an AuthSub key is set, but + * openssl support is not enabled in the PHP installation, an exception is + * thrown. + * + * @param string $method The HTTP method + * @param string $url The URL + * @param array $headers An associate array of headers to be + * sent with the request or null + * @param string $body The body of the request or null + * @param string $contentType The MIME content type of the body or null + * @throws Zend_Gdata_App_Exception if there was a signing failure + * @return array The processed values in an associative array, + * using the same names as the params + */ + public function filterHttpRequest($method, $url, $headers = array(), $body = null, $contentType = null) { + if ($this->getAuthSubToken() != null) { + // AuthSub authentication + if ($this->getAuthSubPrivateKeyId() != null) { + // secure AuthSub + $time = time(); + $nonce = mt_rand(0, 999999999); + $dataToSign = $method . ' ' . $url . ' ' . $time . ' ' . $nonce; + + // compute signature + $pKeyId = $this->getAuthSubPrivateKeyId(); + $signSuccess = openssl_sign($dataToSign, $signature, $pKeyId, + OPENSSL_ALGO_SHA1); + if (!$signSuccess) { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception( + 'openssl_signing failure - returned false'); + } + // encode signature + $encodedSignature = base64_encode($signature); + + // final header + $headers['authorization'] = 'AuthSub token="' . $this->getAuthSubToken() . '" ' . + 'data="' . $dataToSign . '" ' . + 'sig="' . $encodedSignature . '" ' . + 'sigalg="rsa-sha1"'; + } else { + // AuthSub without secure tokens + $headers['authorization'] = 'AuthSub token="' . $this->getAuthSubToken() . '"'; + } + } elseif ($this->getClientLoginToken() != null) { + $headers['authorization'] = 'GoogleLogin auth=' . $this->getClientLoginToken(); + } + return array('method' => $method, 'url' => $url, 'body' => $body, 'headers' => $headers, 'contentType' => $contentType); + } + + /** + * Method for filtering the HTTP response, though no filtering is + * currently done. + * + * @param Zend_Http_Response $response The response object to filter + * @return Zend_Http_Response The filterd response object + */ + public function filterHttpResponse($response) { + return $response; + } + +} diff --git a/libs/Zend/Gdata/Kind/EventEntry.php b/libs/Zend/Gdata/Kind/EventEntry.php new file mode 100644 index 0000000..d728bc5 --- /dev/null +++ b/libs/Zend/Gdata/Kind/EventEntry.php @@ -0,0 +1,430 @@ +_who != null) { + foreach ($this->_who as $who) { + $element->appendChild($who->getDOM($element->ownerDocument)); + } + } + if ($this->_when != null) { + foreach ($this->_when as $when) { + $element->appendChild($when->getDOM($element->ownerDocument)); + } + } + if ($this->_where != null) { + foreach ($this->_where as $where) { + $element->appendChild($where->getDOM($element->ownerDocument)); + } + } + if ($this->_recurrenceException != null) { + foreach ($this->_recurrenceException as $recurrenceException) { + $element->appendChild($recurrenceException->getDOM($element->ownerDocument)); + } + } + if ($this->_extendedProperty != null) { + foreach ($this->_extendedProperty as $extProp) { + $element->appendChild($extProp->getDOM($element->ownerDocument)); + } + } + + if ($this->_recurrence != null) { + $element->appendChild($this->_recurrence->getDOM($element->ownerDocument)); + } + if ($this->_eventStatus != null) { + $element->appendChild($this->_eventStatus->getDOM($element->ownerDocument)); + } + if ($this->_comments != null) { + $element->appendChild($this->_comments->getDOM($element->ownerDocument)); + } + if ($this->_transparency != null) { + $element->appendChild($this->_transparency->getDOM($element->ownerDocument)); + } + if ($this->_visibility != null) { + $element->appendChild($this->_visibility->getDOM($element->ownerDocument)); + } + if ($this->_originalEvent != null) { + $element->appendChild($this->_originalEvent->getDOM($element->ownerDocument)); + } + if ($this->_entryLink != null) { + $element->appendChild($this->_entryLink->getDOM($element->ownerDocument)); + } + + + return $element; + } + + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('gd') . ':' . 'where'; + $where = new Zend_Gdata_Extension_Where(); + $where->transferFromDOM($child); + $this->_where[] = $where; + break; + case $this->lookupNamespace('gd') . ':' . 'when'; + $when = new Zend_Gdata_Extension_When(); + $when->transferFromDOM($child); + $this->_when[] = $when; + break; + case $this->lookupNamespace('gd') . ':' . 'who'; + $who = new Zend_Gdata_Extension_Who(); + $who ->transferFromDOM($child); + $this->_who[] = $who; + break; + case $this->lookupNamespace('gd') . ':' . 'recurrence'; + $recurrence = new Zend_Gdata_Extension_Recurrence(); + $recurrence->transferFromDOM($child); + $this->_recurrence = $recurrence; + break; + case $this->lookupNamespace('gd') . ':' . 'eventStatus'; + $eventStatus = new Zend_Gdata_Extension_EventStatus(); + $eventStatus->transferFromDOM($child); + $this->_eventStatus = $eventStatus; + break; + case $this->lookupNamespace('gd') . ':' . 'comments'; + $comments = new Zend_Gdata_Extension_Comments(); + $comments->transferFromDOM($child); + $this->_comments = $comments; + break; + case $this->lookupNamespace('gd') . ':' . 'transparency'; + $transparency = new Zend_Gdata_Extension_Transparency(); + $transparency ->transferFromDOM($child); + $this->_transparency = $transparency; + break; + case $this->lookupNamespace('gd') . ':' . 'visibility'; + $visiblity = new Zend_Gdata_Extension_Visibility(); + $visiblity ->transferFromDOM($child); + $this->_visibility = $visiblity; + break; + case $this->lookupNamespace('gd') . ':' . 'recurrenceException'; + $recurrenceException = new Zend_Gdata_Extension_RecurrenceException(); + $recurrenceException ->transferFromDOM($child); + $this->_recurrenceException[] = $recurrenceException; + break; + case $this->lookupNamespace('gd') . ':' . 'originalEvent'; + $originalEvent = new Zend_Gdata_Extension_OriginalEvent(); + $originalEvent ->transferFromDOM($child); + $this->_originalEvent = $originalEvent; + break; + case $this->lookupNamespace('gd') . ':' . 'extendedProperty'; + $extProp = new Zend_Gdata_Extension_ExtendedProperty(); + $extProp->transferFromDOM($child); + $this->_extendedProperty[] = $extProp; + break; + case $this->lookupNamespace('gd') . ':' . 'entryLink': + $entryLink = new Zend_Gdata_Extension_EntryLink(); + $entryLink->transferFromDOM($child); + $this->_entryLink = $entryLink; + break; + + default: + parent::takeChildFromDOM($child); + break; + } + } + + public function getWhen() + { + return $this->_when; + } + + /** + * @param array $value + * @return Zend_Gdata_Kind_EventEntry Provides a fluent interface + */ + public function setWhen($value) + { + $this->_when = $value; + return $this; + } + + public function getWhere() + { + return $this->_where; + } + + /** + * @param array $value + * @return Zend_Gdata_Kind_EventEntry Provides a fluent interface + */ + public function setWhere($value) + { + $this->_where = $value; + return $this; + } + + public function getWho() + { + return $this->_who; + } + + /** + * @param array $value + * @return Zend_Gdata_Kind_EventEntry Provides a fluent interface + */ + public function setWho($value) + { + $this->_who = $value; + return $this; + } + + public function getRecurrence() + { + return $this->_recurrence; + } + + /** + * @param array $value + * @return Zend_Gdata_Kind_EventEntry Provides a fluent interface + */ + public function setRecurrence($value) + { + $this->_recurrence = $value; + return $this; + } + + public function getEventStatus() + { + return $this->_eventStatus; + } + + /** + * @param array $value + * @return Zend_Gdata_Kind_EventEntry Provides a fluent interface + */ + public function setEventStatus($value) + { + $this->_eventStatus = $value; + return $this; + } + + public function getComments() + { + return $this->_comments; + } + + /** + * @param array $value + * @return Zend_Gdata_Kind_EventEntry Provides a fluent interface + */ + public function setComments($value) + { + $this->_comments = $value; + return $this; + } + + public function getTransparency() + { + return $this->_transparency; + } + + /** + * @param Zend_Gdata_Transparency $value + * @return Zend_Gdata_Kind_EventEntry Provides a fluent interface + */ + public function setTransparency($value) + { + $this->_transparency = $value; + return $this; + } + + public function getVisibility() + { + return $this->_visibility; + } + + /** + * @param Zend_Gdata_Visibility $value + * @return Zend_Gdata_Kind_EventEntry Provides a fluent interface + */ + public function setVisibility($value) + { + $this->_visibility = $value; + return $this; + } + + public function getRecurrenceExcption() + { + return $this->_recurrenceException; + } + + /** + * @param array $value + * @return Zend_Gdata_Kind_EventEntry Provides a fluent interface + */ + public function setRecurrenceException($value) + { + $this->_recurrenceException = $value; + return $this; + } + + public function getExtendedProperty() + { + return $this->_extendedProperty; + } + + /** + * @param array $value + * @return Zend_Gdata_Kind_EventEntry Provides a fluent interface + */ + public function setExtendedProperty($value) + { + $this->_extendedProperty = $value; + return $this; + } + + public function getOriginalEvent() + { + return $this->_originalEvent; + } + + /** + * @param Zend_Gdata_Extension_OriginalEvent $value + * @return Zend_Gdata_Kind_EventEntry Provides a fluent interface + */ + public function setOriginalEvent($value) + { + $this->_originalEvent = $value; + return $this; + } + + /** + * Get this entry's EntryLink element. + * + * @return Zend_Gdata_Extension_EntryLink The requested entry. + */ + public function getEntryLink() + { + return $this->_entryLink; + } + + /** + * Set the child's EntryLink element. + * + * @param Zend_Gdata_Extension_EntryLink $value The desired value for this attribute. + * @return Zend_Gdata_Extension_Who The element being modified. + */ + public function setEntryLink($value) + { + $this->_entryLink = $value; + return $this; + } + + +} diff --git a/libs/Zend/Gdata/Media.php b/libs/Zend/Gdata/Media.php new file mode 100755 index 0000000..c63d24a --- /dev/null +++ b/libs/Zend/Gdata/Media.php @@ -0,0 +1,57 @@ + 'http://search.yahoo.com/mrss/'); + + /** + * Create Gdata_Media object + * + * @param Zend_Http_Client $client (optional) The HTTP client to use when + * when communicating with the Google Apps servers. + * @param string $applicationId The identity of the app in the form of Company-AppName-Version + */ + public function __construct($client = null, $applicationId = 'MyCompany-MyApp-1.0') + { + $this->registerPackage('Zend_Gdata_Media'); + $this->registerPackage('Zend_Gdata_Media_Extension'); + parent::__construct($client, $applicationId); + } + +} diff --git a/libs/Zend/Gdata/Media/Entry.php b/libs/Zend/Gdata/Media/Entry.php new file mode 100755 index 0000000..f2b1050 --- /dev/null +++ b/libs/Zend/Gdata/Media/Entry.php @@ -0,0 +1,134 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct($element); + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_mediaGroup != null) { + $element->appendChild($this->_mediaGroup->getDOM($element->ownerDocument)); + } + return $element; + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them as members of this entry based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('media') . ':' . 'group': + $mediaGroup = new Zend_Gdata_Media_Extension_MediaGroup(); + $mediaGroup->transferFromDOM($child); + $this->_mediaGroup = $mediaGroup; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + /** + * Returns the entry's mediaGroup object. + * + * @return Zend_Gdata_Media_Extension_MediaGroup + */ + public function getMediaGroup() + { + return $this->_mediaGroup; + } + + /** + * Sets the entry's mediaGroup object. + * + * @param Zend_Gdata_Media_Extension_MediaGroup $mediaGroup + * @return Zend_Gdata_Media_Entry Provides a fluent interface + */ + public function setMediaGroup($mediaGroup) + { + $this->_mediaGroup = $mediaGroup; + return $this; + } + + +} diff --git a/libs/Zend/Gdata/Media/Extension/MediaCategory.php b/libs/Zend/Gdata/Media/Extension/MediaCategory.php new file mode 100755 index 0000000..f0d9a13 --- /dev/null +++ b/libs/Zend/Gdata/Media/Extension/MediaCategory.php @@ -0,0 +1,148 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->_text = $text; + $this->_scheme = $scheme; + $this->_label = $label; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_scheme !== null) { + $element->setAttribute('scheme', $this->_scheme); + } + if ($this->_label !== null) { + $element->setAttribute('label', $this->_label); + } + 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 + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'scheme': + $this->_scheme = $attribute->nodeValue; + break; + case 'label': + $this->_label = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Returns the URI that identifies the categorization scheme + * Optional. + * + * @return string URI that identifies the categorization scheme + */ + public function getScheme() + { + return $this->_scheme; + } + + /** + * @param string $value URI that identifies the categorization scheme + * @return Zend_Gdata_Media_Extension_MediaCategory Provides a fluent interface + */ + public function setScheme($value) + { + $this->_scheme = $value; + return $this; + } + + /** + * @return string Human-readable label to be displayed in applications + */ + public function getLabel() + { + return $this->_label; + } + + /** + * @param string $value Human-readable label to be displayed in applications + * @return Zend_Gdata_Media_Extension_MediaCategory Provides a fluent interface + */ + public function setLabel($value) + { + $this->_label = $value; + return $this; + } + +} diff --git a/libs/Zend/Gdata/Media/Extension/MediaContent.php b/libs/Zend/Gdata/Media/Extension/MediaContent.php new file mode 100755 index 0000000..85a2d09 --- /dev/null +++ b/libs/Zend/Gdata/Media/Extension/MediaContent.php @@ -0,0 +1,522 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->_url = $url; + $this->_fileSize = $fileSize; + $this->_type = $type; + $this->_medium = $medium; + $this->_isDefault = $isDefault; + $this->_expression = $expression; + $this->_bitrate = $bitrate; + $this->_framerate = $framerate; + $this->_samplingrate = $samplingrate; + $this->_channels = $channels; + $this->_duration = $duration; + $this->_height = $height; + $this->_width = $width; + $this->_lang = $lang; + } + + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_url !== null) { + $element->setAttribute('url', $this->_url); + } + if ($this->_fileSize !== null) { + $element->setAttribute('fileSize', $this->_fileSize); + } + if ($this->_type !== null) { + $element->setAttribute('type', $this->_type); + } + if ($this->_medium !== null) { + $element->setAttribute('medium', $this->_medium); + } + if ($this->_isDefault !== null) { + $element->setAttribute('isDefault', $this->_isDefault); + } + if ($this->_expression !== null) { + $element->setAttribute('expression', $this->_expression); + } + if ($this->_bitrate !== null) { + $element->setAttribute('bitrate', $this->_bitrate); + } + if ($this->_framerate !== null) { + $element->setAttribute('framerate', $this->_framerate); + } + if ($this->_samplingrate !== null) { + $element->setAttribute('samplingrate', $this->_samplingrate); + } + if ($this->_channels !== null) { + $element->setAttribute('channels', $this->_channels); + } + if ($this->_duration !== null) { + $element->setAttribute('duration', $this->_duration); + } + if ($this->_height !== null) { + $element->setAttribute('height', $this->_height); + } + if ($this->_width !== null) { + $element->setAttribute('width', $this->_width); + } + if ($this->_lang !== null) { + $element->setAttribute('lang', $this->_lang); + } + 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 + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'url': + $this->_url = $attribute->nodeValue; + break; + case 'fileSize': + $this->_fileSize = $attribute->nodeValue; + break; + case 'type': + $this->_type = $attribute->nodeValue; + break; + case 'medium': + $this->_medium = $attribute->nodeValue; + break; + case 'isDefault': + $this->_isDefault = $attribute->nodeValue; + break; + case 'expression': + $this->_expression = $attribute->nodeValue; + break; + case 'bitrate': + $this->_bitrate = $attribute->nodeValue; + break; + case 'framerate': + $this->_framerate = $attribute->nodeValue; + break; + case 'samplingrate': + $this->_samplingrate = $attribute->nodeValue; + break; + case 'channels': + $this->_channels = $attribute->nodeValue; + break; + case 'duration': + $this->_duration = $attribute->nodeValue; + break; + case 'height': + $this->_height = $attribute->nodeValue; + break; + case 'width': + $this->_width = $attribute->nodeValue; + break; + case 'lang': + $this->_lang = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Returns the URL representing this MediaContent object + * + * @return string The URL representing this MediaContent object. + */ + public function __toString() + { + return $this->getUrl(); + } + + /** + * @return string The direct URL to the media object + */ + public function getUrl() + { + return $this->_url; + } + + /** + * @param string $value The direct URL to the media object + * @return Zend_Gdata_Media_Extension_MediaContent Provides a fluent interface + */ + public function setUrl($value) + { + $this->_url = $value; + return $this; + } + + /** + * @return int The size of the media in bytes + */ + public function getFileSize() + { + return $this->_fileSize; + } + + /** + * @param int $value + * @return Zend_Gdata_Media_Extension_MediaContent Provides a fluent interface + */ + public function setFileSize($value) + { + $this->_fileSize = $value; + return $this; + } + + /** + * @return string + */ + public function getType() + { + return $this->_type; + } + + /** + * @param string $value + * @return Zend_Gdata_Media_Extension_MediaContent Provides a fluent interface + */ + public function setType($value) + { + $this->_type = $value; + return $this; + } + + /** + * @return string + */ + public function getMedium() + { + return $this->_medium; + } + + /** + * @param string $value + * @return Zend_Gdata_Media_Extension_MediaContent Provides a fluent interface + */ + public function setMedium($value) + { + $this->_medium = $value; + return $this; + } + + /** + * @return bool + */ + public function getIsDefault() + { + return $this->_isDefault; + } + + /** + * @param bool $value + * @return Zend_Gdata_Media_Extension_MediaContent Provides a fluent interface + */ + public function setIsDefault($value) + { + $this->_isDefault = $value; + return $this; + } + + /** + * @return string + */ + public function getExpression() + { + return $this->_expression; + } + + /** + * @param string + * @return Zend_Gdata_Media_Extension_MediaContent Provides a fluent interface + */ + public function setExpression($value) + { + $this->_expression = $value; + return $this; + } + + /** + * @return int + */ + public function getBitrate() + { + return $this->_bitrate; + } + + /** + * @param int + * @return Zend_Gdata_Media_Extension_MediaContent Provides a fluent interface + */ + public function setBitrate($value) + { + $this->_bitrate = $value; + return $this; + } + + /** + * @return int + */ + public function getFramerate() + { + return $this->_framerate; + } + + /** + * @param int + * @return Zend_Gdata_Media_Extension_MediaContent Provides a fluent interface + */ + public function setFramerate($value) + { + $this->_framerate = $value; + return $this; + } + + /** + * @return int + */ + public function getSamplingrate() + { + return $this->_samplingrate; + } + + /** + * @param int + * @return Zend_Gdata_Media_Extension_MediaContent Provides a fluent interface + */ + public function setSamplingrate($value) + { + $this->_samplingrate = $value; + return $this; + } + + /** + * @return int + */ + public function getChannels() + { + return $this->_channels; + } + + /** + * @param int + * @return Zend_Gdata_Media_Extension_MediaContent Provides a fluent interface + */ + public function setChannels($value) + { + $this->_channels = $value; + return $this; + } + + /** + * @return int + */ + public function getDuration() + { + return $this->_duration; + } + + /** + * + * @param int + * @return Zend_Gdata_Media_Extension_MediaContent Provides a fluent interface + */ + public function setDuration($value) + { + $this->_duration = $value; + return $this; + } + + /** + * @return int + */ + public function getHeight() + { + return $this->_height; + } + + /** + * @param int + * @return Zend_Gdata_Media_Extension_MediaContent Provides a fluent interface + */ + public function setHeight($value) + { + $this->_height = $value; + return $this; + } + + /** + * @return int + */ + public function getWidth() + { + return $this->_width; + } + + /** + * @param int + * @return Zend_Gdata_Media_Extension_MediaContent Provides a fluent interface + */ + public function setWidth($value) + { + $this->_width = $value; + return $this; + } + + /** + * @return string + */ + public function getLang() + { + return $this->_lang; + } + + /** + * @param string + * @return Zend_Gdata_Media_Extension_MediaContent Provides a fluent interface + */ + public function setLang($value) + { + $this->_lang = $value; + return $this; + } + +} diff --git a/libs/Zend/Gdata/Media/Extension/MediaCopyright.php b/libs/Zend/Gdata/Media/Extension/MediaCopyright.php new file mode 100755 index 0000000..40eb977 --- /dev/null +++ b/libs/Zend/Gdata/Media/Extension/MediaCopyright.php @@ -0,0 +1,116 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->_text = $text; + $this->_url = $url; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_url !== null) { + $element->setAttribute('url', $this->_url); + } + 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 + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'url': + $this->_url = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * @return string + */ + public function getUrl() + { + return $this->_url; + } + + /** + * @param string $value + * @return Zend_Gdata_Media_Extension_MediaCopyright Provides a fluent interface + */ + public function setUrl($value) + { + $this->_url = $value; + return $this; + } + +} diff --git a/libs/Zend/Gdata/Media/Extension/MediaCredit.php b/libs/Zend/Gdata/Media/Extension/MediaCredit.php new file mode 100755 index 0000000..ced90b8 --- /dev/null +++ b/libs/Zend/Gdata/Media/Extension/MediaCredit.php @@ -0,0 +1,149 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->_text = $text; + $this->_role = $role; + $this->_scheme = $scheme; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_role !== null) { + $element->setAttribute('role', $this->_role); + } + if ($this->_scheme !== null) { + $element->setAttribute('scheme', $this->_scheme); + } + 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 + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'role': + $this->_role = $attribute->nodeValue; + break; + case 'scheme': + $this->_scheme = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * @return string + */ + public function getRole() + { + return $this->_role; + } + + /** + * @param string $value + * @return Zend_Gdata_Media_Extension_MediaCredit Provides a fluent interface + */ + public function setRole($value) + { + $this->_role = $value; + return $this; + } + + /** + * @return string + */ + public function getScheme() + { + return $this->_scheme; + } + + /** + * @param string $value + * @return Zend_Gdata_Media_Extension_MediaCredit Provides a fluent interface + */ + public function setScheme($value) + { + $this->_scheme = $value; + return $this; + } + +} diff --git a/libs/Zend/Gdata/Media/Extension/MediaDescription.php b/libs/Zend/Gdata/Media/Extension/MediaDescription.php new file mode 100755 index 0000000..d022484 --- /dev/null +++ b/libs/Zend/Gdata/Media/Extension/MediaDescription.php @@ -0,0 +1,116 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->_type = $type; + $this->_text = $text; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_type !== null) { + $element->setAttribute('type', $this->_type); + } + 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 + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'type': + $this->_type = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * @return string + */ + public function getType() + { + return $this->_type; + } + + /** + * @param string $value + * @return Zend_Gdata_Media_Extension_MediaDescription Provides a fluent interface + */ + public function setType($value) + { + $this->_type = $value; + return $this; + } + +} diff --git a/libs/Zend/Gdata/Media/Extension/MediaGroup.php b/libs/Zend/Gdata/Media/Extension/MediaGroup.php new file mode 100755 index 0000000..bc67b56 --- /dev/null +++ b/libs/Zend/Gdata/Media/Extension/MediaGroup.php @@ -0,0 +1,566 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct($element); + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + foreach ($this->_content as $content) { + $element->appendChild($content->getDOM($element->ownerDocument)); + } + foreach ($this->_category as $category) { + $element->appendChild($category->getDOM($element->ownerDocument)); + } + foreach ($this->_credit as $credit) { + $element->appendChild($credit->getDOM($element->ownerDocument)); + } + foreach ($this->_player as $player) { + $element->appendChild($player->getDOM($element->ownerDocument)); + } + foreach ($this->_rating as $rating) { + $element->appendChild($rating->getDOM($element->ownerDocument)); + } + foreach ($this->_restriction as $restriction) { + $element->appendChild($restriction->getDOM($element->ownerDocument)); + } + foreach ($this->_mediaText as $text) { + $element->appendChild($text->getDOM($element->ownerDocument)); + } + foreach ($this->_thumbnail as $thumbnail) { + $element->appendChild($thumbnail->getDOM($element->ownerDocument)); + } + if ($this->_copyright != null) { + $element->appendChild( + $this->_copyright->getDOM($element->ownerDocument)); + } + if ($this->_description != null) { + $element->appendChild( + $this->_description->getDOM($element->ownerDocument)); + } + foreach ($this->_hash as $hash) { + $element->appendChild($hash->getDOM($element->ownerDocument)); + } + if ($this->_keywords != null) { + $element->appendChild( + $this->_keywords->getDOM($element->ownerDocument)); + } + if ($this->_title != null) { + $element->appendChild( + $this->_title->getDOM($element->ownerDocument)); + } + return $element; + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them in the $_entry array based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('media') . ':' . 'content'; + $content = new Zend_Gdata_Media_Extension_MediaContent(); + $content->transferFromDOM($child); + $this->_content[] = $content; + break; + case $this->lookupNamespace('media') . ':' . 'category'; + $category = new Zend_Gdata_Media_Extension_MediaCategory(); + $category->transferFromDOM($child); + $this->_category[] = $category; + break; + case $this->lookupNamespace('media') . ':' . 'copyright'; + $copyright = new Zend_Gdata_Media_Extension_MediaCopyright(); + $copyright->transferFromDOM($child); + $this->_copyright = $copyright; + break; + case $this->lookupNamespace('media') . ':' . 'credit'; + $credit = new Zend_Gdata_Media_Extension_MediaCredit(); + $credit->transferFromDOM($child); + $this->_credit[] = $credit; + break; + case $this->lookupNamespace('media') . ':' . 'description'; + $description = new Zend_Gdata_Media_Extension_MediaDescription(); + $description->transferFromDOM($child); + $this->_description = $description; + break; + case $this->lookupNamespace('media') . ':' . 'hash'; + $hash = new Zend_Gdata_Media_Extension_MediaHash(); + $hash->transferFromDOM($child); + $this->_hash[] = $hash; + break; + case $this->lookupNamespace('media') . ':' . 'keywords'; + $keywords = new Zend_Gdata_Media_Extension_MediaKeywords(); + $keywords->transferFromDOM($child); + $this->_keywords = $keywords; + break; + case $this->lookupNamespace('media') . ':' . 'player'; + $player = new Zend_Gdata_Media_Extension_MediaPlayer(); + $player->transferFromDOM($child); + $this->_player[] = $player; + break; + case $this->lookupNamespace('media') . ':' . 'rating'; + $rating = new Zend_Gdata_Media_Extension_MediaRating(); + $rating->transferFromDOM($child); + $this->_rating[] = $rating; + break; + case $this->lookupNamespace('media') . ':' . 'restriction'; + $restriction = new Zend_Gdata_Media_Extension_MediaRestriction(); + $restriction->transferFromDOM($child); + $this->_restriction[] = $restriction; + break; + case $this->lookupNamespace('media') . ':' . 'text'; + $text = new Zend_Gdata_Media_Extension_MediaText(); + $text->transferFromDOM($child); + $this->_mediaText[] = $text; + break; + case $this->lookupNamespace('media') . ':' . 'thumbnail'; + $thumbnail = new Zend_Gdata_Media_Extension_MediaThumbnail(); + $thumbnail->transferFromDOM($child); + $this->_thumbnail[] = $thumbnail; + break; + case $this->lookupNamespace('media') . ':' . 'title'; + $title = new Zend_Gdata_Media_Extension_MediaTitle(); + $title->transferFromDOM($child); + $this->_title = $title; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + /** + * @return array + */ + public function getContent() + { + return $this->_content; + } + + /** + * @param array $value + * @return Zend_Gdata_Media_MediaGroup Provides a fluent interface + */ + public function setContent($value) + { + $this->_content = $value; + return $this; + } + + /** + * @return array + */ + public function getCategory() + { + return $this->_category; + } + + /** + * @param array $value + * @return Zend_Gdata_Media_Extension_MediaGroup + */ + public function setCategory($value) + { + $this->_category = $value; + return $this; + } + + /** + * @return Zend_Gdata_Media_Extension_MediaCopyright + */ + public function getCopyright() + { + return $this->_copyright; + } + + /** + * @param Zend_Gdata_Media_Extension_MediaCopyright $value + * @return Zend_Gdata_Media_Extension_MediaGroup + */ + public function setCopyright($value) + { + $this->_copyright = $value; + return $this; + } + + /** + * @return array + */ + public function getCredit() + { + return $this->_credit; + } + + /** + * @param array $value + * @return Zend_Gdata_Media_Extension_MediaGroup + */ + public function setCredit($value) + { + $this->_credit = $value; + return $this; + } + + /** + * @return Zend_Gdata_Media_Extension_MediaTitle + */ + public function getTitle() + { + return $this->_title; + } + + /** + * @param Zend_Gdata_Media_Extension_MediaTitle $value + * @return Zend_Gdata_Media_Extension_MediaGroup + */ + public function setTitle($value) + { + $this->_title = $value; + return $this; + } + + /** + * @return Zend_Gdata_Media_Extension_MediaDescription + */ + public function getDescription() + { + return $this->_description; + } + + /** + * @param Zend_Gdata_Media_Extension_MediaDescription $value + * @return Zend_Gdata_Media_Extension_MediaGroup + */ + public function setDescription($value) + { + $this->_description = $value; + return $this; + } + + /** + * @return array + */ + public function getHash() + { + return $this->_hash; + } + + /** + * @param array $value + * @return Zend_Gdata_Media_Extension_MediaGroup + */ + public function setHash($value) + { + $this->_hash = $value; + return $this; + } + + /** + * @return Zend_Gdata_Media_Extension_MediaKeywords + */ + public function getKeywords() + { + return $this->_keywords; + } + + /** + * @param array $value + * @return Zend_Gdata_Media_Extension_MediaGroup Provides a fluent interface + */ + public function setKeywords($value) + { + $this->_keywords = $value; + return $this; + } + + /** + * @return array + */ + public function getPlayer() + { + return $this->_player; + } + + /** + * @param array + * @return Zend_Gdata_Media_Extension_MediaGroup + */ + public function setPlayer($value) + { + $this->_player = $value; + return $this; + } + + /** + * @return array + */ + public function getRating() + { + return $this->_rating; + } + + /** + * @param array + * @return Zend_Gdata_Media_Extension_MediaGroup + */ + public function setRating($value) + { + $this->_rating = $value; + return $this; + } + + /** + * @return array + */ + public function getRestriction() + { + return $this->_restriction; + } + + /** + * @param array + * @return Zend_Gdata_Media_Extension_MediaGroup + */ + public function setRestriction($value) + { + $this->_restriction = $value; + return $this; + } + + /** + * @return array + */ + public function getThumbnail() + { + return $this->_thumbnail; + } + + /** + * @param array + * @return Zend_Gdata_Media_Extension_MediaGroup + */ + public function setThumbnail($value) + { + $this->_thumbnail = $value; + return $this; + } + + /** + * @return array + */ + public function getMediaText() + { + return $this->_mediaText; + } + + /** + * @param array + * @return Zend_Gdata_Media_Extension_MediaGroup + */ + public function setMediaText($value) + { + $this->_mediaText = $value; + return $this; + } + +} diff --git a/libs/Zend/Gdata/Media/Extension/MediaHash.php b/libs/Zend/Gdata/Media/Extension/MediaHash.php new file mode 100755 index 0000000..dd69162 --- /dev/null +++ b/libs/Zend/Gdata/Media/Extension/MediaHash.php @@ -0,0 +1,115 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->_text = $text; + $this->_algo = $algo; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_algo !== null) { + $element->setAttribute('algo', $this->_algo); + } + 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 + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + * @throws Zend_Gdata_App_InvalidArgumentException + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'algo': + $this->_algo = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * @return string The algo + */ + public function getAlgo() + { + return $this->_algo; + } + + /** + * @param string $value + * @return Zend_Gdata_Media_Extension_MediaHash Provides a fluent interface + */ + public function setAlgo($value) + { + $this->_algo = $value; + return $this; + } + +} diff --git a/libs/Zend/Gdata/Media/Extension/MediaKeywords.php b/libs/Zend/Gdata/Media/Extension/MediaKeywords.php new file mode 100755 index 0000000..1a9a7b6 --- /dev/null +++ b/libs/Zend/Gdata/Media/Extension/MediaKeywords.php @@ -0,0 +1,52 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + } + +} diff --git a/libs/Zend/Gdata/Media/Extension/MediaPlayer.php b/libs/Zend/Gdata/Media/Extension/MediaPlayer.php new file mode 100755 index 0000000..10cdd13 --- /dev/null +++ b/libs/Zend/Gdata/Media/Extension/MediaPlayer.php @@ -0,0 +1,178 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->_url = $url; + $this->_width = $width; + $this->_height = $height; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_url !== null) { + $element->setAttribute('url', $this->_url); + } + if ($this->_width !== null) { + $element->setAttribute('width', $this->_width); + } + if ($this->_height !== null) { + $element->setAttribute('height', $this->_height); + } + 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 + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'url': + $this->_url = $attribute->nodeValue; + break; + case 'width': + $this->_width = $attribute->nodeValue; + break; + case 'height': + $this->_height = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * @return string + */ + public function getUrl() + { + return $this->_url; + } + + /** + * @param string $value + * @return Zend_Gdata_Media_Extension_MediaPlayer Provides a fluent interface + */ + public function setUrl($value) + { + $this->_url = $value; + return $this; + } + + /** + * @return int + */ + public function getWidth() + { + return $this->_width; + } + + /** + * @param int $value + * @return Zend_Gdata_Media_Extension_MediaPlayer Provides a fluent interface + */ + public function setWidth($value) + { + $this->_width = $value; + return $this; + } + + /** + * @return int + */ + public function getHeight() + { + return $this->_height; + } + + /** + * @param int $value + * @return Zend_Gdata_Media_Extension_MediaPlayer Provides a fluent interface + */ + public function setHeight($value) + { + $this->_height = $value; + return $this; + } + +} diff --git a/libs/Zend/Gdata/Media/Extension/MediaRating.php b/libs/Zend/Gdata/Media/Extension/MediaRating.php new file mode 100755 index 0000000..ae76e67 --- /dev/null +++ b/libs/Zend/Gdata/Media/Extension/MediaRating.php @@ -0,0 +1,118 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->_scheme = $scheme; + $this->_text = $text; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_scheme !== null) { + $element->setAttribute('scheme', $this->_scheme); + } + 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 + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'scheme': + $this->_scheme = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * @return string + */ + public function getScheme() + { + return $this->_scheme; + } + + /** + * @param string $value + * @return Zend_Gdata_Media_Extension_MediaRating Provides a fluent interface + */ + public function setScheme($value) + { + $this->_scheme = $value; + return $this; + } + +} diff --git a/libs/Zend/Gdata/Media/Extension/MediaRestriction.php b/libs/Zend/Gdata/Media/Extension/MediaRestriction.php new file mode 100755 index 0000000..ca6fbb1 --- /dev/null +++ b/libs/Zend/Gdata/Media/Extension/MediaRestriction.php @@ -0,0 +1,149 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->_text = $text; + $this->_relationship = $relationship; + $this->_type = $type; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_relationship !== null) { + $element->setAttribute('relationship', $this->_relationship); + } + if ($this->_type !== null) { + $element->setAttribute('type', $this->_type); + } + 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 + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'relationship': + $this->_relationship = $attribute->nodeValue; + break; + case 'type': + $this->_type = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * @return string + */ + public function getRelationship() + { + return $this->_relationship; + } + + /** + * @param string $value + * @return Zend_Gdata_Media_Extension_MediaRestriction Provides a fluent interface + */ + public function setRelationship($value) + { + $this->_relationship = $value; + return $this; + } + + /** + * @return string + */ + public function getType() + { + return $this->_type; + } + + /** + * @param string $value + * @return Zend_Gdata_Media_Extension_MediaRestriction Provides a fluent interface + */ + public function setType($value) + { + $this->_type = $value; + return $this; + } + +} diff --git a/libs/Zend/Gdata/Media/Extension/MediaText.php b/libs/Zend/Gdata/Media/Extension/MediaText.php new file mode 100755 index 0000000..58561fd --- /dev/null +++ b/libs/Zend/Gdata/Media/Extension/MediaText.php @@ -0,0 +1,211 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->_text = $text; + $this->_type = $type; + $this->_lang = $lang; + $this->_start = $start; + $this->_end = $end; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_type !== null) { + $element->setAttribute('type', $this->_type); + } + if ($this->_lang !== null) { + $element->setAttribute('lang', $this->_lang); + } + if ($this->_start !== null) { + $element->setAttribute('start', $this->_start); + } + if ($this->_end !== null) { + $element->setAttribute('end', $this->_end); + } + 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 + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'type': + $this->_type = $attribute->nodeValue; + break; + case 'lang': + $this->_lang = $attribute->nodeValue; + break; + case 'start': + $this->_start = $attribute->nodeValue; + break; + case 'end': + $this->_end = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * @return string + */ + public function getType() + { + return $this->_type; + } + + /** + * @param string $value + * @return Zend_Gdata_Media_Extension_MediaText Provides a fluent interface + */ + public function setType($value) + { + $this->_type = $value; + return $this; + } + + /** + * @return string + */ + public function getLang() + { + return $this->_lang; + } + + /** + * @param string $value + * @return Zend_Gdata_Media_Extension_MediaText Provides a fluent interface + */ + public function setLang($value) + { + $this->_lang = $value; + return $this; + } + + /** + * @return string + */ + public function getStart() + { + return $this->_start; + } + + /** + * @param string $value + * @return Zend_Gdata_Media_Extension_MediaText Provides a fluent interface + */ + public function setStart($value) + { + $this->_start = $value; + return $this; + } + + /** + * @return string + */ + public function getEnd() + { + return $this->_end; + } + + /** + * @param string $value + * @return Zend_Gdata_Media_Extension_MediaText Provides a fluent interface + */ + public function setEnd($value) + { + $this->_end = $value; + return $this; + } +} diff --git a/libs/Zend/Gdata/Media/Extension/MediaThumbnail.php b/libs/Zend/Gdata/Media/Extension/MediaThumbnail.php new file mode 100755 index 0000000..b05fb2b --- /dev/null +++ b/libs/Zend/Gdata/Media/Extension/MediaThumbnail.php @@ -0,0 +1,210 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->_url = $url; + $this->_width = $width; + $this->_height = $height; + $this->_time = $time ; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_url !== null) { + $element->setAttribute('url', $this->_url); + } + if ($this->_width !== null) { + $element->setAttribute('width', $this->_width); + } + if ($this->_height !== null) { + $element->setAttribute('height', $this->_height); + } + if ($this->_time !== null) { + $element->setAttribute('time', $this->_time); + } + 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 + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'url': + $this->_url = $attribute->nodeValue; + break; + case 'width': + $this->_width = $attribute->nodeValue; + break; + case 'height': + $this->_height = $attribute->nodeValue; + break; + case 'time': + $this->_time = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * @return string + */ + public function getUrl() + { + return $this->_url; + } + + /** + * @param string $value + * @return Zend_Gdata_Media_Extension_MediaThumbnail Provides a fluent interface + */ + public function setUrl($value) + { + $this->_url = $value; + return $this; + } + + /** + * @return int + */ + public function getWidth() + { + return $this->_width; + } + + /** + * @param int $value + * @return Zend_Gdata_Media_Extension_MediaThumbnail Provides a fluent interface + */ + public function setWidth($value) + { + $this->_width = $value; + return $this; + } + + /** + * @return int + */ + public function getHeight() + { + return $this->_height; + } + + /** + * @param int $value + * @return Zend_Gdata_Media_Extension_MediaThumbnail Provides a fluent interface + */ + public function setHeight($value) + { + $this->_height = $value; + return $this; + } + + /** + * @return string + */ + public function getTime() + { + return $this->_time; + } + + /** + * @param string $value + * @return Zend_Gdata_Media_Extension_MediaThumbnail Provides a fluent interface + */ + public function setTime($value) + { + $this->_time = $value; + return $this; + } + +} diff --git a/libs/Zend/Gdata/Media/Extension/MediaTitle.php b/libs/Zend/Gdata/Media/Extension/MediaTitle.php new file mode 100755 index 0000000..bfa25da --- /dev/null +++ b/libs/Zend/Gdata/Media/Extension/MediaTitle.php @@ -0,0 +1,118 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->_type = $type; + $this->_text = $text; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_type !== null) { + $element->setAttribute('type', $this->_type); + } + 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 + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'type': + $this->_type = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * @return string + */ + public function getType() + { + return $this->_type; + } + + /** + * @param string $value + * @return Zend_Gdata_Media_Extension_MediaTitle Provides a fluent interface + */ + public function setType($value) + { + $this->_type = $value; + return $this; + } + +} diff --git a/libs/Zend/Gdata/Media/Feed.php b/libs/Zend/Gdata/Media/Feed.php new file mode 100755 index 0000000..7c42c46 --- /dev/null +++ b/libs/Zend/Gdata/Media/Feed.php @@ -0,0 +1,70 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct($element); + } + +} diff --git a/libs/Zend/Gdata/Photos.php b/libs/Zend/Gdata/Photos.php new file mode 100755 index 0000000..d2c1513 --- /dev/null +++ b/libs/Zend/Gdata/Photos.php @@ -0,0 +1,568 @@ + 'http://schemas.google.com/photos/2007', + 'photo' => 'http://www.pheed.com/pheed/', + 'exif' => 'http://schemas.google.com/photos/exif/2007', + 'georss' => 'http://www.georss.org/georss', + 'gml' => 'http://www.opengis.net/gml', + 'media' => 'http://search.yahoo.com/mrss/'); + + /** + * Create Zend_Gdata_Photos object + * + * @param Zend_Http_Client $client (optional) The HTTP client to use when + * when communicating with the servers. + * @param string $applicationId The identity of the app in the form of Company-AppName-Version + */ + public function __construct($client = null, $applicationId = 'MyCompany-MyApp-1.0') + { + $this->registerPackage('Zend_Gdata_Photos'); + $this->registerPackage('Zend_Gdata_Photos_Extension'); + parent::__construct($client, $applicationId); + $this->_httpClient->setParameterPost('service', self::AUTH_SERVICE_NAME); + } + + /** + * Retrieve a UserFeed containing AlbumEntries, PhotoEntries and + * TagEntries associated with a given user. + * + * @param string $userName The userName of interest + * @param mixed $location (optional) The location for the feed, as a URL + * or Query. If not provided, a default URL will be used instead. + * @return Zend_Gdata_Photos_UserFeed + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + */ + public function getUserFeed($userName = null, $location = null) + { + if ($location instanceof Zend_Gdata_Photos_UserQuery) { + $location->setType('feed'); + if ($userName !== null) { + $location->setUser($userName); + } + $uri = $location->getQueryUrl(); + } else if ($location instanceof Zend_Gdata_Query) { + if ($userName !== null) { + $location->setUser($userName); + } + $uri = $location->getQueryUrl(); + } else if ($location !== null) { + $uri = $location; + } else if ($userName !== null) { + $uri = self::PICASA_BASE_FEED_URI . '/' . + self::DEFAULT_PROJECTION . '/' . self::USER_PATH . '/' . + $userName; + } else { + $uri = self::PICASA_BASE_FEED_URI . '/' . + self::DEFAULT_PROJECTION . '/' . self::USER_PATH . '/' . + self::DEFAULT_USER; + } + + return parent::getFeed($uri, 'Zend_Gdata_Photos_UserFeed'); + } + + /** + * Retreive AlbumFeed object containing multiple PhotoEntry or TagEntry + * objects. + * + * @param mixed $location (optional) The location for the feed, as a URL or Query. + * @return Zend_Gdata_Photos_AlbumFeed + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + */ + public function getAlbumFeed($location = null) + { + if ($location === null) { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'Location must not be null'); + } else if ($location instanceof Zend_Gdata_Photos_UserQuery) { + $location->setType('feed'); + $uri = $location->getQueryUrl(); + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getFeed($uri, 'Zend_Gdata_Photos_AlbumFeed'); + } + + /** + * Retreive PhotoFeed object containing comments and tags associated + * with a given photo. + * + * @param mixed $location (optional) The location for the feed, as a URL + * or Query. If not specified, the community search feed will + * be returned instead. + * @return Zend_Gdata_Photos_PhotoFeed + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + */ + public function getPhotoFeed($location = null) + { + if ($location === null) { + $uri = self::PICASA_BASE_FEED_URI . '/' . + self::DEFAULT_PROJECTION . '/' . + self::COMMUNITY_SEARCH_PATH; + } else if ($location instanceof Zend_Gdata_Photos_UserQuery) { + $location->setType('feed'); + $uri = $location->getQueryUrl(); + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getFeed($uri, 'Zend_Gdata_Photos_PhotoFeed'); + } + + /** + * Retreive a single UserEntry object. + * + * @param mixed $location The location for the feed, as a URL or Query. + * @return Zend_Gdata_Photos_UserEntry + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + */ + public function getUserEntry($location) + { + if ($location === null) { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'Location must not be null'); + } else if ($location instanceof Zend_Gdata_Photos_UserQuery) { + $location->setType('entry'); + $uri = $location->getQueryUrl(); + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getEntry($uri, 'Zend_Gdata_Photos_UserEntry'); + } + + /** + * Retreive a single AlbumEntry object. + * + * @param mixed $location The location for the feed, as a URL or Query. + * @return Zend_Gdata_Photos_AlbumEntry + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + */ + public function getAlbumEntry($location) + { + if ($location === null) { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'Location must not be null'); + } else if ($location instanceof Zend_Gdata_Photos_UserQuery) { + $location->setType('entry'); + $uri = $location->getQueryUrl(); + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getEntry($uri, 'Zend_Gdata_Photos_AlbumEntry'); + } + + /** + * Retreive a single PhotoEntry object. + * + * @param mixed $location The location for the feed, as a URL or Query. + * @return Zend_Gdata_Photos_PhotoEntry + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + */ + public function getPhotoEntry($location) + { + if ($location === null) { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'Location must not be null'); + } else if ($location instanceof Zend_Gdata_Photos_UserQuery) { + $location->setType('entry'); + $uri = $location->getQueryUrl(); + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getEntry($uri, 'Zend_Gdata_Photos_PhotoEntry'); + } + + /** + * Retreive a single TagEntry object. + * + * @param mixed $location The location for the feed, as a URL or Query. + * @return Zend_Gdata_Photos_TagEntry + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + */ + public function getTagEntry($location) + { + if ($location === null) { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'Location must not be null'); + } else if ($location instanceof Zend_Gdata_Photos_UserQuery) { + $location->setType('entry'); + $uri = $location->getQueryUrl(); + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getEntry($uri, 'Zend_Gdata_Photos_TagEntry'); + } + + /** + * Retreive a single CommentEntry object. + * + * @param mixed $location The location for the feed, as a URL or Query. + * @return Zend_Gdata_Photos_CommentEntry + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + */ + public function getCommentEntry($location) + { + if ($location === null) { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'Location must not be null'); + } else if ($location instanceof Zend_Gdata_Photos_UserQuery) { + $location->setType('entry'); + $uri = $location->getQueryUrl(); + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getEntry($uri, 'Zend_Gdata_Photos_CommentEntry'); + } + + /** + * Create a new album from a AlbumEntry. + * + * @param Zend_Gdata_Photos_AlbumEntry $album The album entry to + * insert. + * @param string $url (optional) The URI that the album should be + * uploaded to. If null, the default album creation URI for + * this domain will be used. + * @return Zend_Gdata_Photos_AlbumEntry The inserted album entry as + * returned by the server. + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + */ + public function insertAlbumEntry($album, $uri = null) + { + if ($uri === null) { + $uri = self::PICASA_BASE_FEED_URI . '/' . + self::DEFAULT_PROJECTION . '/' . self::USER_PATH . '/' . + self::DEFAULT_USER; + } + $newEntry = $this->insertEntry($album, $uri, 'Zend_Gdata_Photos_AlbumEntry'); + return $newEntry; + } + + /** + * Create a new photo from a PhotoEntry. + * + * @param Zend_Gdata_Photos_PhotoEntry $photo The photo to insert. + * @param string $url The URI that the photo should be uploaded + * to. Alternatively, an AlbumEntry can be provided and the + * photo will be added to that album. + * @return Zend_Gdata_Photos_PhotoEntry The inserted photo entry + * as returned by the server. + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + */ + public function insertPhotoEntry($photo, $uri = null) + { + if ($uri instanceof Zend_Gdata_Photos_AlbumEntry) { + $uri = $uri->getLink(self::FEED_LINK_PATH)->href; + } + if ($uri === null) { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'URI must not be null'); + } + $newEntry = $this->insertEntry($photo, $uri, 'Zend_Gdata_Photos_PhotoEntry'); + return $newEntry; + } + + /** + * Create a new tag from a TagEntry. + * + * @param Zend_Gdata_Photos_TagEntry $tag The tag entry to insert. + * @param string $url The URI where the tag should be + * uploaded to. Alternatively, a PhotoEntry can be provided and + * the tag will be added to that photo. + * @return Zend_Gdata_Photos_TagEntry The inserted tag entry as returned + * by the server. + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + */ + public function insertTagEntry($tag, $uri = null) + { + if ($uri instanceof Zend_Gdata_Photos_PhotoEntry) { + $uri = $uri->getLink(self::FEED_LINK_PATH)->href; + } + if ($uri === null) { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'URI must not be null'); + } + $newEntry = $this->insertEntry($tag, $uri, 'Zend_Gdata_Photos_TagEntry'); + return $newEntry; + } + + /** + * Create a new comment from a CommentEntry. + * + * @param Zend_Gdata_Photos_CommentEntry $comment The comment entry to + * insert. + * @param string $url The URI where the comment should be uploaded to. + * Alternatively, a PhotoEntry can be provided and + * the comment will be added to that photo. + * @return Zend_Gdata_Photos_CommentEntry The inserted comment entry + * as returned by the server. + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + */ + public function insertCommentEntry($comment, $uri = null) + { + if ($uri instanceof Zend_Gdata_Photos_PhotoEntry) { + $uri = $uri->getLink(self::FEED_LINK_PATH)->href; + } + if ($uri === null) { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'URI must not be null'); + } + $newEntry = $this->insertEntry($comment, $uri, 'Zend_Gdata_Photos_CommentEntry'); + return $newEntry; + } + + /** + * Delete an AlbumEntry. + * + * @param Zend_Gdata_Photos_AlbumEntry $album The album entry to + * delete. + * @param boolean $catch Whether to catch an exception when + * modified and re-delete or throw + * @return void. + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + */ + public function deleteAlbumEntry($album, $catch) + { + if ($catch) { + try { + $this->delete($album); + } catch (Zend_Gdata_App_HttpException $e) { + if ($e->getResponse()->getStatus() === 409) { + $entry = new Zend_Gdata_Photos_AlbumEntry($e->getResponse()->getBody()); + $this->delete($entry->getLink('edit')->href); + } else { + throw $e; + } + } + } else { + $this->delete($album); + } + } + + /** + * Delete a PhotoEntry. + * + * @param Zend_Gdata_Photos_PhotoEntry $photo The photo entry to + * delete. + * @param boolean $catch Whether to catch an exception when + * modified and re-delete or throw + * @return void. + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + */ + public function deletePhotoEntry($photo, $catch) + { + if ($catch) { + try { + $this->delete($photo); + } catch (Zend_Gdata_App_HttpException $e) { + if ($e->getResponse()->getStatus() === 409) { + $entry = new Zend_Gdata_Photos_PhotoEntry($e->getResponse()->getBody()); + $this->delete($entry->getLink('edit')->href); + } else { + throw $e; + } + } + } else { + $this->delete($photo); + } + } + + /** + * Delete a CommentEntry. + * + * @param Zend_Gdata_Photos_CommentEntry $comment The comment entry to + * delete. + * @param boolean $catch Whether to catch an exception when + * modified and re-delete or throw + * @return void. + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + */ + public function deleteCommentEntry($comment, $catch) + { + if ($catch) { + try { + $this->delete($comment); + } catch (Zend_Gdata_App_HttpException $e) { + if ($e->getResponse()->getStatus() === 409) { + $entry = new Zend_Gdata_Photos_CommentEntry($e->getResponse()->getBody()); + $this->delete($entry->getLink('edit')->href); + } else { + throw $e; + } + } + } else { + $this->delete($comment); + } + } + + /** + * Delete a TagEntry. + * + * @param Zend_Gdata_Photos_TagEntry $tag The tag entry to + * delete. + * @param boolean $catch Whether to catch an exception when + * modified and re-delete or throw + * @return void. + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + */ + public function deleteTagEntry($tag, $catch) + { + if ($catch) { + try { + $this->delete($tag); + } catch (Zend_Gdata_App_HttpException $e) { + if ($e->getResponse()->getStatus() === 409) { + $entry = new Zend_Gdata_Photos_TagEntry($e->getResponse()->getBody()); + $this->delete($entry->getLink('edit')->href); + } else { + throw $e; + } + } + } else { + $this->delete($tag); + } + } + +} diff --git a/libs/Zend/Gdata/Photos/AlbumEntry.php b/libs/Zend/Gdata/Photos/AlbumEntry.php new file mode 100755 index 0000000..fdaba86 --- /dev/null +++ b/libs/Zend/Gdata/Photos/AlbumEntry.php @@ -0,0 +1,610 @@ + in the Google Data protocol. + * + * @category Zend + * @package Zend_Gdata + * @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_Gdata_Photos_AlbumEntry extends Zend_Gdata_Entry +{ + + protected $_entryClassName = 'Zend_Gdata_Photos_AlbumEntry'; + + /** + * gphoto:id element + * + * @var Zend_Gdata_Photos_Extension_Id + */ + protected $_gphotoId = null; + + /** + * gphoto:access element + * + * @var Zend_Gdata_Photos_Extension_Access + */ + protected $_gphotoAccess = null; + + /** + * gphoto:location element + * + * @var Zend_Gdata_Photos_Extension_Location + */ + protected $_gphotoLocation = null; + + /** + * gphoto:user element + * + * @var Zend_Gdata_Photos_Extension_User + */ + protected $_gphotoUser = null; + + /** + * gphoto:nickname element + * + * @var Zend_Gdata_Photos_Extension_Nickname + */ + protected $_gphotoNickname = null; + + /** + * gphoto:timestamp element + * + * @var Zend_Gdata_Photos_Extension_Timestamp + */ + protected $_gphotoTimestamp = null; + + /** + * gphoto:name element + * + * @var Zend_Gdata_Photos_Extension_Name + */ + protected $_gphotoName = null; + + /** + * gphoto:numphotos element + * + * @var Zend_Gdata_Photos_Extension_NumPhotos + */ + protected $_gphotoNumPhotos = null; + + /** + * gphoto:commentCount element + * + * @var Zend_Gdata_Photos_Extension_CommentCount + */ + protected $_gphotoCommentCount = null; + + /** + * gphoto:commentingEnabled element + * + * @var Zend_Gdata_Photos_Extension_CommentingEnabled + */ + protected $_gphotoCommentingEnabled = null; + + /** + * media:group element + * + * @var Zend_Gdata_Media_MediaGroup + */ + protected $_mediaGroup = null; + + /** + * georss:where element + * + * @var Zend_Gdata_Geo_Extension_GeoRssWhere + */ + protected $_geoRssWhere = null; + + /** + * Create a new instance. + * + * @param DOMElement $element (optional) DOMElement from which this + * object should be constructed. + */ + public function __construct($element = null) + { + foreach (Zend_Gdata_Photos::$namespaces as $nsPrefix => $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct($element); + + $category = new Zend_Gdata_App_Extension_Category( + 'http://schemas.google.com/photos/2007#album', + 'http://schemas.google.com/g/2005#kind'); + $this->setCategory(array($category)); + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_gphotoTimestamp !== null) { + $element->appendChild($this->_gphotoTimestamp->getDOM($element->ownerDocument)); + } + if ($this->_gphotoUser !== null) { + $element->appendChild($this->_gphotoUser->getDOM($element->ownerDocument)); + } + if ($this->_gphotoNickname !== null) { + $element->appendChild($this->_gphotoNickname->getDOM($element->ownerDocument)); + } + if ($this->_gphotoAccess !== null) { + $element->appendChild($this->_gphotoAccess->getDOM($element->ownerDocument)); + } + if ($this->_gphotoLocation !== null) { + $element->appendChild($this->_gphotoLocation->getDOM($element->ownerDocument)); + } + if ($this->_gphotoName !== null) { + $element->appendChild($this->_gphotoName->getDOM($element->ownerDocument)); + } + if ($this->_gphotoNumPhotos !== null) { + $element->appendChild($this->_gphotoNumPhotos->getDOM($element->ownerDocument)); + } + if ($this->_gphotoCommentCount !== null) { + $element->appendChild($this->_gphotoCommentCount->getDOM($element->ownerDocument)); + } + if ($this->_gphotoCommentingEnabled !== null) { + $element->appendChild($this->_gphotoCommentingEnabled->getDOM($element->ownerDocument)); + } + if ($this->_gphotoId !== null) { + $element->appendChild($this->_gphotoId->getDOM($element->ownerDocument)); + } + if ($this->_mediaGroup !== null) { + $element->appendChild($this->_mediaGroup->getDOM($element->ownerDocument)); + } + return $element; + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them as members of this entry based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + + switch ($absoluteNodeName) { + case $this->lookupNamespace('gphoto') . ':' . 'access'; + $access = new Zend_Gdata_Photos_Extension_Access(); + $access->transferFromDOM($child); + $this->_gphotoAccess = $access; + break; + case $this->lookupNamespace('gphoto') . ':' . 'location'; + $location = new Zend_Gdata_Photos_Extension_Location(); + $location->transferFromDOM($child); + $this->_gphotoLocation = $location; + break; + case $this->lookupNamespace('gphoto') . ':' . 'name'; + $name = new Zend_Gdata_Photos_Extension_Name(); + $name->transferFromDOM($child); + $this->_gphotoName = $name; + break; + case $this->lookupNamespace('gphoto') . ':' . 'numphotos'; + $numPhotos = new Zend_Gdata_Photos_Extension_NumPhotos(); + $numPhotos->transferFromDOM($child); + $this->_gphotoNumPhotos = $numPhotos; + break; + case $this->lookupNamespace('gphoto') . ':' . 'commentCount'; + $commentCount = new Zend_Gdata_Photos_Extension_CommentCount(); + $commentCount->transferFromDOM($child); + $this->_gphotoCommentCount = $commentCount; + break; + case $this->lookupNamespace('gphoto') . ':' . 'commentingEnabled'; + $commentingEnabled = new Zend_Gdata_Photos_Extension_CommentingEnabled(); + $commentingEnabled->transferFromDOM($child); + $this->_gphotoCommentingEnabled = $commentingEnabled; + break; + case $this->lookupNamespace('gphoto') . ':' . 'id'; + $id = new Zend_Gdata_Photos_Extension_Id(); + $id->transferFromDOM($child); + $this->_gphotoId = $id; + break; + case $this->lookupNamespace('gphoto') . ':' . 'user'; + $user = new Zend_Gdata_Photos_Extension_User(); + $user->transferFromDOM($child); + $this->_gphotoUser = $user; + break; + case $this->lookupNamespace('gphoto') . ':' . 'timestamp'; + $timestamp = new Zend_Gdata_Photos_Extension_Timestamp(); + $timestamp->transferFromDOM($child); + $this->_gphotoTimestamp = $timestamp; + break; + case $this->lookupNamespace('gphoto') . ':' . 'nickname'; + $nickname = new Zend_Gdata_Photos_Extension_Nickname(); + $nickname->transferFromDOM($child); + $this->_gphotoNickname = $nickname; + break; + case $this->lookupNamespace('georss') . ':' . 'where'; + $geoRssWhere = new Zend_Gdata_Geo_Extension_GeoRssWhere(); + $geoRssWhere->transferFromDOM($child); + $this->_geoRssWhere = $geoRssWhere; + break; + case $this->lookupNamespace('media') . ':' . 'group'; + $mediaGroup = new Zend_Gdata_Media_Extension_MediaGroup(); + $mediaGroup->transferFromDOM($child); + $this->_mediaGroup = $mediaGroup; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + /** + * Get the value for this element's gphoto:access attribute. + * + * @see setGphotoAccess + * @return string The requested attribute. + */ + public function getGphotoAccess() + { + return $this->_gphotoAccess; + } + + /** + * Set the value for this element's gphoto:access attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Access The element being modified. + */ + public function setGphotoAccess($value) + { + $this->_gphotoAccess = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:location attribute. + * + * @see setGphotoLocation + * @return string The requested attribute. + */ + public function getGphotoLocation() + { + return $this->_gphotoLocation; + } + + /** + * Set the value for this element's gphoto:location attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Location The element being modified. + */ + public function setGphotoLocation($value) + { + $this->_location = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:name attribute. + * + * @see setGphotoName + * @return string The requested attribute. + */ + public function getGphotoName() + { + return $this->_gphotoName; + } + + /** + * Set the value for this element's gphoto:name attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Name The element being modified. + */ + public function setGphotoName($value) + { + $this->_gphotoName = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:numphotos attribute. + * + * @see setGphotoNumPhotos + * @return string The requested attribute. + */ + public function getGphotoNumPhotos() + { + return $this->_gphotoNumPhotos; + } + + /** + * Set the value for this element's gphoto:numphotos attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_NumPhotos The element being modified. + */ + public function setGphotoNumPhotos($value) + { + $this->_gphotoNumPhotos = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:commentCount attribute. + * + * @see setGphotoCommentCount + * @return string The requested attribute. + */ + public function getGphotoCommentCount() + { + return $this->_gphotoCommentCount; + } + + /** + * Set the value for this element's gphoto:commentCount attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_CommentCount The element being modified. + */ + public function setGphotoCommentCount($value) + { + $this->_gphotoCommentCount = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:commentingEnabled attribute. + * + * @see setGphotoCommentingEnabled + * @return string The requested attribute. + */ + public function getGphotoCommentingEnabled() + { + return $this->_gphotoCommentingEnabled; + } + + /** + * Set the value for this element's gphoto:commentingEnabled attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_CommentingEnabled The element being modified. + */ + public function setGphotoCommentingEnabled($value) + { + $this->_gphotoCommentingEnabled = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:id attribute. + * + * @see setGphotoId + * @return string The requested attribute. + */ + public function getGphotoId() + { + return $this->_gphotoId; + } + + /** + * Set the value for this element's gphoto:id attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Id The element being modified. + */ + public function setGphotoId($value) + { + $this->_gphotoId = $value; + return $this; + } + + /** + * Get the value for this element's georss:where attribute. + * + * @see setGeoRssWhere + * @return string The requested attribute. + */ + public function getGeoRssWhere() + { + return $this->_geoRssWhere; + } + + /** + * Set the value for this element's georss:where attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Geo_Extension_GeoRssWhere The element being modified. + */ + public function setGeoRssWhere($value) + { + $this->_geoRssWhere = $value; + return $this; + } + + /** + * Get the value for this element's media:group attribute. + * + * @see setMediaGroup + * @return string The requested attribute. + */ + public function getMediaGroup() + { + return $this->_mediaGroup; + } + + /** + * Set the value for this element's media:group attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Media_Extension_MediaGroup The element being modified. + */ + public function setMediaGroup($value) + { + $this->_mediaGroup = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:user attribute. + * + * @see setGphotoUser + * @return string The requested attribute. + */ + public function getGphotoUser() + { + return $this->_gphotoUser; + } + + /** + * Set the value for this element's gphoto:user attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_User The element being modified. + */ + public function setGphotoUser($value) + { + $this->_gphotoUser = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:nickname attribute. + * + * @see setGphotoNickname + * @return string The requested attribute. + */ + public function getGphotoNickname() + { + return $this->_gphotoNickname; + } + + /** + * Set the value for this element's gphoto:nickname attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Nickname The element being modified. + */ + public function setGphotoNickname($value) + { + $this->_gphotoNickname = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:timestamp attribute. + * + * @see setGphotoTimestamp + * @return string The requested attribute. + */ + public function getGphotoTimestamp() + { + return $this->_gphotoTimestamp; + } + + /** + * Set the value for this element's gphoto:timestamp attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Timestamp The element being modified. + */ + public function setGphotoTimestamp($value) + { + $this->_gphotoTimestamp = $value; + return $this; + } +} diff --git a/libs/Zend/Gdata/Photos/AlbumFeed.php b/libs/Zend/Gdata/Photos/AlbumFeed.php new file mode 100755 index 0000000..31a8f67 --- /dev/null +++ b/libs/Zend/Gdata/Photos/AlbumFeed.php @@ -0,0 +1,509 @@ + 'Zend_Gdata_Photos_PhotoEntry', + 'http://schemas.google.com/photos/2007#comment' => 'Zend_Gdata_Photos_CommentEntry', + 'http://schemas.google.com/photos/2007#tag' => 'Zend_Gdata_Photos_TagEntry' + ); + + public function __construct($element = null) + { + foreach (Zend_Gdata_Photos::$namespaces as $nsPrefix => $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct($element); + } + + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_gphotoId != null) { + $element->appendChild($this->_gphotoId->getDOM($element->ownerDocument)); + } + if ($this->_gphotoUser != null) { + $element->appendChild($this->_gphotoUser->getDOM($element->ownerDocument)); + } + if ($this->_gphotoNickname != null) { + $element->appendChild($this->_gphotoNickname->getDOM($element->ownerDocument)); + } + if ($this->_gphotoName != null) { + $element->appendChild($this->_gphotoName->getDOM($element->ownerDocument)); + } + if ($this->_gphotoLocation != null) { + $element->appendChild($this->_gphotoLocation->getDOM($element->ownerDocument)); + } + if ($this->_gphotoAccess != null) { + $element->appendChild($this->_gphotoAccess->getDOM($element->ownerDocument)); + } + if ($this->_gphotoTimestamp != null) { + $element->appendChild($this->_gphotoTimestamp->getDOM($element->ownerDocument)); + } + if ($this->_gphotoNumPhotos != null) { + $element->appendChild($this->_gphotoNumPhotos->getDOM($element->ownerDocument)); + } + if ($this->_gphotoCommentingEnabled != null) { + $element->appendChild($this->_gphotoCommentingEnabled->getDOM($element->ownerDocument)); + } + if ($this->_gphotoCommentCount != null) { + $element->appendChild($this->_gphotoCommentCount->getDOM($element->ownerDocument)); + } + + return $element; + } + + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + + switch ($absoluteNodeName) { + case $this->lookupNamespace('gphoto') . ':' . 'id'; + $id = new Zend_Gdata_Photos_Extension_Id(); + $id->transferFromDOM($child); + $this->_gphotoId = $id; + break; + case $this->lookupNamespace('gphoto') . ':' . 'user'; + $user = new Zend_Gdata_Photos_Extension_User(); + $user->transferFromDOM($child); + $this->_gphotoUser = $user; + break; + case $this->lookupNamespace('gphoto') . ':' . 'nickname'; + $nickname = new Zend_Gdata_Photos_Extension_Nickname(); + $nickname->transferFromDOM($child); + $this->_gphotoNickname = $nickname; + break; + case $this->lookupNamespace('gphoto') . ':' . 'name'; + $name = new Zend_Gdata_Photos_Extension_Name(); + $name->transferFromDOM($child); + $this->_gphotoName = $name; + break; + case $this->lookupNamespace('gphoto') . ':' . 'location'; + $location = new Zend_Gdata_Photos_Extension_Location(); + $location->transferFromDOM($child); + $this->_gphotoLocation = $location; + break; + case $this->lookupNamespace('gphoto') . ':' . 'access'; + $access = new Zend_Gdata_Photos_Extension_Access(); + $access->transferFromDOM($child); + $this->_gphotoAccess = $access; + break; + case $this->lookupNamespace('gphoto') . ':' . 'timestamp'; + $timestamp = new Zend_Gdata_Photos_Extension_Timestamp(); + $timestamp->transferFromDOM($child); + $this->_gphotoTimestamp = $timestamp; + break; + case $this->lookupNamespace('gphoto') . ':' . 'numphotos'; + $numphotos = new Zend_Gdata_Photos_Extension_NumPhotos(); + $numphotos->transferFromDOM($child); + $this->_gphotoNumPhotos = $numphotos; + break; + case $this->lookupNamespace('gphoto') . ':' . 'commentingEnabled'; + $commentingEnabled = new Zend_Gdata_Photos_Extension_CommentingEnabled(); + $commentingEnabled->transferFromDOM($child); + $this->_gphotoCommentingEnabled = $commentingEnabled; + break; + case $this->lookupNamespace('gphoto') . ':' . 'commentCount'; + $commentCount = new Zend_Gdata_Photos_Extension_CommentCount(); + $commentCount->transferFromDOM($child); + $this->_gphotoCommentCount = $commentCount; + break; + case $this->lookupNamespace('atom') . ':' . 'entry': + $entryClassName = $this->_entryClassName; + $tmpEntry = new Zend_Gdata_App_Entry($child); + $categories = $tmpEntry->getCategory(); + foreach ($categories as $category) { + if ($category->scheme == Zend_Gdata_Photos::KIND_PATH && + $this->_entryKindClassMapping[$category->term] != "") { + $entryClassName = $this->_entryKindClassMapping[$category->term]; + break; + } else { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception('Entry is missing kind declaration.'); + } + } + + $newEntry = new $entryClassName($child); + $newEntry->setHttpClient($this->getHttpClient()); + $this->_entry[] = $newEntry; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + /** + * Get the value for this element's gphoto:user attribute. + * + * @see setGphotoUser + * @return string The requested attribute. + */ + public function getGphotoUser() + { + return $this->_gphotoUser; + } + + /** + * Set the value for this element's gphoto:user attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_User The element being modified. + */ + public function setGphotoUser($value) + { + $this->_gphotoUser = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:access attribute. + * + * @see setGphotoAccess + * @return string The requested attribute. + */ + public function getGphotoAccess() + { + return $this->_gphotoAccess; + } + + /** + * Set the value for this element's gphoto:access attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Access The element being modified. + */ + public function setGphotoAccess($value) + { + $this->_gphotoAccess = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:location attribute. + * + * @see setGphotoLocation + * @return string The requested attribute. + */ + public function getGphotoLocation() + { + return $this->_gphotoLocation; + } + + /** + * Set the value for this element's gphoto:location attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Location The element being modified. + */ + public function setGphotoLocation($value) + { + $this->_gphotoLocation = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:name attribute. + * + * @see setGphotoName + * @return string The requested attribute. + */ + public function getGphotoName() + { + return $this->_gphotoName; + } + + /** + * Set the value for this element's gphoto:name attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Name The element being modified. + */ + public function setGphotoName($value) + { + $this->_gphotoName = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:numphotos attribute. + * + * @see setGphotoNumPhotos + * @return string The requested attribute. + */ + public function getGphotoNumPhotos() + { + return $this->_gphotoNumPhotos; + } + + /** + * Set the value for this element's gphoto:numphotos attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_NumPhotos The element being modified. + */ + public function setGphotoNumPhotos($value) + { + $this->_gphotoNumPhotos = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:commentCount attribute. + * + * @see setGphotoCommentCount + * @return string The requested attribute. + */ + public function getGphotoCommentCount() + { + return $this->_gphotoCommentCount; + } + + /** + * Set the value for this element's gphoto:commentCount attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_CommentCount The element being modified. + */ + public function setGphotoCommentCount($value) + { + $this->_gphotoCommentCount = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:commentingEnabled attribute. + * + * @see setGphotoCommentingEnabled + * @return string The requested attribute. + */ + public function getGphotoCommentingEnabled() + { + return $this->_gphotoCommentingEnabled; + } + + /** + * Set the value for this element's gphoto:commentingEnabled attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_CommentingEnabled The element being modified. + */ + public function setGphotoCommentingEnabled($value) + { + $this->_gphotoCommentingEnabled = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:id attribute. + * + * @see setGphotoId + * @return string The requested attribute. + */ + public function getGphotoId() + { + return $this->_gphotoId; + } + + /** + * Set the value for this element's gphoto:id attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Id The element being modified. + */ + public function setGphotoId($value) + { + $this->_gphotoId = $value; + return $this; + } + + /** + * Get the value for this element's georss:where attribute. + * + * @see setGeoRssWhere + * @return string The requested attribute. + */ + public function getGeoRssWhere() + { + return $this->_geoRssWhere; + } + + /** + * Set the value for this element's georss:where attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Geo_Extension_GeoRssWhere The element being modified. + */ + public function setGeoRssWhere($value) + { + $this->_geoRssWhere = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:nickname attribute. + * + * @see setGphotoNickname + * @return string The requested attribute. + */ + public function getGphotoNickname() + { + return $this->_gphotoNickname; + } + + /** + * Set the value for this element's gphoto:nickname attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Nickname The element being modified. + */ + public function setGphotoNickname($value) + { + $this->_gphotoNickname = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:timestamp attribute. + * + * @see setGphotoTimestamp + * @return string The requested attribute. + */ + public function getGphotoTimestamp() + { + return $this->_gphotoTimestamp; + } + + /** + * Set the value for this element's gphoto:timestamp attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Timestamp The element being modified. + */ + public function setGphotoTimestamp($value) + { + $this->_gphotoTimestamp = $value; + return $this; + } + +} diff --git a/libs/Zend/Gdata/Photos/AlbumQuery.php b/libs/Zend/Gdata/Photos/AlbumQuery.php new file mode 100755 index 0000000..b6b7959 --- /dev/null +++ b/libs/Zend/Gdata/Photos/AlbumQuery.php @@ -0,0 +1,147 @@ +_albumId = null; + $this->_albumName = $value; + + return $this; + } + + /** + * Get the album name which is to be returned. + * + * @see setAlbumName + * @return string The name of the album to retrieve. + */ + public function getAlbumName() + { + return $this->_albumName; + } + + /** + * Set the album ID to query for. When set, this album's photographs + * be returned. If not set or null, the default user's feed will be + * returned instead. + * + * NOTE: Album and AlbumId are mutually exclusive. Setting one will + * automatically set the other to null. + * + * @param string $value The ID of the album to retrieve, or null to + * clear. + * @return Zend_Gdata_Photos_AlbumQuery The query object. + */ + public function setAlbumId($value) + { + $this->_albumName = null; + $this->_albumId = $value; + + return $this; + } + + /** + * Get the album ID which is to be returned. + * + * @see setAlbum + * @return string The ID of the album to retrieve. + */ + public function getAlbumId() + { + return $this->_albumId; + } + + /** + * 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($incomingUri = '') + { + $uri = ''; + if ($this->getAlbumName() !== null && $this->getAlbumId() === null) { + $uri .= '/album/' . $this->getAlbumName(); + } elseif ($this->getAlbumName() === null && $this->getAlbumId() !== null) { + $uri .= '/albumid/' . $this->getAlbumId(); + } elseif ($this->getAlbumName() !== null && $this->getAlbumId() !== null) { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'AlbumName and AlbumId cannot both be non-null'); + } else { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'AlbumName and AlbumId cannot both be null'); + } + $uri .= $incomingUri; + return parent::getQueryUrl($uri); + } + +} diff --git a/libs/Zend/Gdata/Photos/CommentEntry.php b/libs/Zend/Gdata/Photos/CommentEntry.php new file mode 100755 index 0000000..7111c51 --- /dev/null +++ b/libs/Zend/Gdata/Photos/CommentEntry.php @@ -0,0 +1,195 @@ + in the Google Data protocol. + * + * @category Zend + * @package Zend_Gdata + * @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_Gdata_Photos_CommentEntry extends Zend_Gdata_Entry +{ + + protected $_entryClassName = 'Zend_Gdata_Photos_CommentEntry'; + + /** + * gphoto:id element + * + * @var Zend_Gdata_Photos_Extension_Id + */ + protected $_gphotoId = null; + + /** + * gphoto:photoid element, differs from gphoto:id as this is an + * actual identification number unique exclusively to photo entries, + * whereas gphoto:id can refer to all gphoto objects + * + * @var Zend_Gdata_Photos_Extension_PhotoId + */ + protected $_gphotoPhotoId = null; + + /** + * Create a new instance. + * + * @param DOMElement $element (optional) DOMElement from which this + * object should be constructed. + */ + public function __construct($element = null) + { + foreach (Zend_Gdata_Photos::$namespaces as $nsPrefix => $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct($element); + + $category = new Zend_Gdata_App_Extension_Category( + 'http://schemas.google.com/photos/2007#comment', + 'http://schemas.google.com/g/2005#kind'); + $this->setCategory(array($category)); + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_gphotoId !== null) { + $element->appendChild($this->_gphotoId->getDOM($element->ownerDocument)); + } + if ($this->_gphotoPhotoId !== null) { + $element->appendChild($this->_gphotoPhotoId->getDOM($element->ownerDocument)); + } + return $element; + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them as members of this entry based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + + switch ($absoluteNodeName) { + case $this->lookupNamespace('gphoto') . ':' . 'id'; + $id = new Zend_Gdata_Photos_Extension_Id(); + $id->transferFromDOM($child); + $this->_gphotoId = $id; + break; + case $this->lookupNamespace('gphoto') . ':' . 'photoid'; + $photoid = new Zend_Gdata_Photos_Extension_PhotoId(); + $photoid->transferFromDOM($child); + $this->_gphotoPhotoId = $photoid; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + /** + * Get the value for this element's gphoto:photoid attribute. + * + * @see setGphotoPhotoId + * @return string The requested attribute. + */ + public function getGphotoPhotoId() + { + return $this->_gphotoPhotoId; + } + + /** + * Set the value for this element's gphoto:photoid attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_PhotoId The element being modified. + */ + public function setGphotoPhotoId($value) + { + $this->_gphotoPhotoId = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:id attribute. + * + * @see setGphotoId + * @return string The requested attribute. + */ + public function getGphotoId() + { + return $this->_gphotoId; + } + + /** + * Set the value for this element's gphoto:id attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Id The element being modified. + */ + public function setGphotoId($value) + { + $this->_gphotoId = $value; + return $this; + } +} diff --git a/libs/Zend/Gdata/Photos/Extension/Access.php b/libs/Zend/Gdata/Photos/Extension/Access.php new file mode 100755 index 0000000..0cd688a --- /dev/null +++ b/libs/Zend/Gdata/Photos/Extension/Access.php @@ -0,0 +1,63 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->setText($text); + } + +} diff --git a/libs/Zend/Gdata/Photos/Extension/AlbumId.php b/libs/Zend/Gdata/Photos/Extension/AlbumId.php new file mode 100755 index 0000000..b8917d9 --- /dev/null +++ b/libs/Zend/Gdata/Photos/Extension/AlbumId.php @@ -0,0 +1,63 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->setText($text); + } + +} diff --git a/libs/Zend/Gdata/Photos/Extension/BytesUsed.php b/libs/Zend/Gdata/Photos/Extension/BytesUsed.php new file mode 100755 index 0000000..3981ae4 --- /dev/null +++ b/libs/Zend/Gdata/Photos/Extension/BytesUsed.php @@ -0,0 +1,62 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->setText($text); + } + +} diff --git a/libs/Zend/Gdata/Photos/Extension/Checksum.php b/libs/Zend/Gdata/Photos/Extension/Checksum.php new file mode 100755 index 0000000..e20a572 --- /dev/null +++ b/libs/Zend/Gdata/Photos/Extension/Checksum.php @@ -0,0 +1,63 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->setText($text); + } + +} diff --git a/libs/Zend/Gdata/Photos/Extension/Client.php b/libs/Zend/Gdata/Photos/Extension/Client.php new file mode 100755 index 0000000..9f0fa48 --- /dev/null +++ b/libs/Zend/Gdata/Photos/Extension/Client.php @@ -0,0 +1,63 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->setText($text); + } + +} diff --git a/libs/Zend/Gdata/Photos/Extension/CommentCount.php b/libs/Zend/Gdata/Photos/Extension/CommentCount.php new file mode 100755 index 0000000..4a0a027 --- /dev/null +++ b/libs/Zend/Gdata/Photos/Extension/CommentCount.php @@ -0,0 +1,63 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->setText($text); + } + +} diff --git a/libs/Zend/Gdata/Photos/Extension/CommentingEnabled.php b/libs/Zend/Gdata/Photos/Extension/CommentingEnabled.php new file mode 100755 index 0000000..156a5c3 --- /dev/null +++ b/libs/Zend/Gdata/Photos/Extension/CommentingEnabled.php @@ -0,0 +1,64 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->setText($text); + } + +} diff --git a/libs/Zend/Gdata/Photos/Extension/Height.php b/libs/Zend/Gdata/Photos/Extension/Height.php new file mode 100755 index 0000000..7c96dfb --- /dev/null +++ b/libs/Zend/Gdata/Photos/Extension/Height.php @@ -0,0 +1,62 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->setText($text); + } + +} diff --git a/libs/Zend/Gdata/Photos/Extension/Id.php b/libs/Zend/Gdata/Photos/Extension/Id.php new file mode 100755 index 0000000..9eb6047 --- /dev/null +++ b/libs/Zend/Gdata/Photos/Extension/Id.php @@ -0,0 +1,62 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->setText($text); + } + +} diff --git a/libs/Zend/Gdata/Photos/Extension/Location.php b/libs/Zend/Gdata/Photos/Extension/Location.php new file mode 100755 index 0000000..5a77a7a --- /dev/null +++ b/libs/Zend/Gdata/Photos/Extension/Location.php @@ -0,0 +1,62 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->setText($text); + } + +} diff --git a/libs/Zend/Gdata/Photos/Extension/MaxPhotosPerAlbum.php b/libs/Zend/Gdata/Photos/Extension/MaxPhotosPerAlbum.php new file mode 100755 index 0000000..57d91a5 --- /dev/null +++ b/libs/Zend/Gdata/Photos/Extension/MaxPhotosPerAlbum.php @@ -0,0 +1,63 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->setText($text); + } + +} diff --git a/libs/Zend/Gdata/Photos/Extension/Name.php b/libs/Zend/Gdata/Photos/Extension/Name.php new file mode 100755 index 0000000..1b5835b --- /dev/null +++ b/libs/Zend/Gdata/Photos/Extension/Name.php @@ -0,0 +1,62 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->setText($text); + } + +} diff --git a/libs/Zend/Gdata/Photos/Extension/Nickname.php b/libs/Zend/Gdata/Photos/Extension/Nickname.php new file mode 100755 index 0000000..770502c --- /dev/null +++ b/libs/Zend/Gdata/Photos/Extension/Nickname.php @@ -0,0 +1,62 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->setText($text); + } + +} diff --git a/libs/Zend/Gdata/Photos/Extension/NumPhotos.php b/libs/Zend/Gdata/Photos/Extension/NumPhotos.php new file mode 100755 index 0000000..34b625f --- /dev/null +++ b/libs/Zend/Gdata/Photos/Extension/NumPhotos.php @@ -0,0 +1,62 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->setText($text); + } + +} diff --git a/libs/Zend/Gdata/Photos/Extension/NumPhotosRemaining.php b/libs/Zend/Gdata/Photos/Extension/NumPhotosRemaining.php new file mode 100755 index 0000000..cc51a90 --- /dev/null +++ b/libs/Zend/Gdata/Photos/Extension/NumPhotosRemaining.php @@ -0,0 +1,62 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->setText($text); + } + +} diff --git a/libs/Zend/Gdata/Photos/Extension/PhotoId.php b/libs/Zend/Gdata/Photos/Extension/PhotoId.php new file mode 100755 index 0000000..6cd1e11 --- /dev/null +++ b/libs/Zend/Gdata/Photos/Extension/PhotoId.php @@ -0,0 +1,61 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->setText($text); + } + +} diff --git a/libs/Zend/Gdata/Photos/Extension/Position.php b/libs/Zend/Gdata/Photos/Extension/Position.php new file mode 100755 index 0000000..1d65768 --- /dev/null +++ b/libs/Zend/Gdata/Photos/Extension/Position.php @@ -0,0 +1,62 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->setText($text); + } + +} diff --git a/libs/Zend/Gdata/Photos/Extension/QuotaCurrent.php b/libs/Zend/Gdata/Photos/Extension/QuotaCurrent.php new file mode 100755 index 0000000..7bf413b --- /dev/null +++ b/libs/Zend/Gdata/Photos/Extension/QuotaCurrent.php @@ -0,0 +1,62 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->setText($text); + } + +} diff --git a/libs/Zend/Gdata/Photos/Extension/QuotaLimit.php b/libs/Zend/Gdata/Photos/Extension/QuotaLimit.php new file mode 100755 index 0000000..4a37113 --- /dev/null +++ b/libs/Zend/Gdata/Photos/Extension/QuotaLimit.php @@ -0,0 +1,63 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->setText($text); + } + +} diff --git a/libs/Zend/Gdata/Photos/Extension/Rotation.php b/libs/Zend/Gdata/Photos/Extension/Rotation.php new file mode 100755 index 0000000..ccd3dae --- /dev/null +++ b/libs/Zend/Gdata/Photos/Extension/Rotation.php @@ -0,0 +1,63 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->setText($text); + } + +} diff --git a/libs/Zend/Gdata/Photos/Extension/Size.php b/libs/Zend/Gdata/Photos/Extension/Size.php new file mode 100755 index 0000000..9ecd966 --- /dev/null +++ b/libs/Zend/Gdata/Photos/Extension/Size.php @@ -0,0 +1,62 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->setText($text); + } + +} diff --git a/libs/Zend/Gdata/Photos/Extension/Thumbnail.php b/libs/Zend/Gdata/Photos/Extension/Thumbnail.php new file mode 100755 index 0000000..b2cb940 --- /dev/null +++ b/libs/Zend/Gdata/Photos/Extension/Thumbnail.php @@ -0,0 +1,62 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->setText($text); + } + +} diff --git a/libs/Zend/Gdata/Photos/Extension/Timestamp.php b/libs/Zend/Gdata/Photos/Extension/Timestamp.php new file mode 100755 index 0000000..2dbd767 --- /dev/null +++ b/libs/Zend/Gdata/Photos/Extension/Timestamp.php @@ -0,0 +1,63 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->setText($text); + } + +} diff --git a/libs/Zend/Gdata/Photos/Extension/User.php b/libs/Zend/Gdata/Photos/Extension/User.php new file mode 100755 index 0000000..deb4713 --- /dev/null +++ b/libs/Zend/Gdata/Photos/Extension/User.php @@ -0,0 +1,62 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->setText($text); + } + +} diff --git a/libs/Zend/Gdata/Photos/Extension/Version.php b/libs/Zend/Gdata/Photos/Extension/Version.php new file mode 100755 index 0000000..fa4f07d --- /dev/null +++ b/libs/Zend/Gdata/Photos/Extension/Version.php @@ -0,0 +1,63 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->setText($text); + } + +} diff --git a/libs/Zend/Gdata/Photos/Extension/Weight.php b/libs/Zend/Gdata/Photos/Extension/Weight.php new file mode 100755 index 0000000..6ea10cd --- /dev/null +++ b/libs/Zend/Gdata/Photos/Extension/Weight.php @@ -0,0 +1,63 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->setText($text); + } + +} diff --git a/libs/Zend/Gdata/Photos/Extension/Width.php b/libs/Zend/Gdata/Photos/Extension/Width.php new file mode 100755 index 0000000..258ad10 --- /dev/null +++ b/libs/Zend/Gdata/Photos/Extension/Width.php @@ -0,0 +1,62 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->setText($text); + } + +} diff --git a/libs/Zend/Gdata/Photos/PhotoEntry.php b/libs/Zend/Gdata/Photos/PhotoEntry.php new file mode 100755 index 0000000..9d5c8fd --- /dev/null +++ b/libs/Zend/Gdata/Photos/PhotoEntry.php @@ -0,0 +1,691 @@ + in the Google Data protocol. + * + * @category Zend + * @package Zend_Gdata + * @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_Gdata_Photos_PhotoEntry extends Zend_Gdata_Media_Entry +{ + + protected $_entryClassName = 'Zend_Gdata_Photos_PhotoEntry'; + + /** + * gphoto:id element + * + * @var Zend_Gdata_Photos_Extension_Id + */ + protected $_gphotoId = null; + + /** + * gphoto:albumid element + * + * @var Zend_Gdata_Photos_Extension_AlbumId + */ + protected $_gphotoAlbumId = null; + + /** + * gphoto:version element + * + * @var Zend_Gdata_Photos_Extension_Version + */ + protected $_gphotoVersion = null; + + /** + * gphoto:width element + * + * @var Zend_Gdata_Photos_Extension_Width + */ + protected $_gphotoWidth = null; + + /** + * gphoto:height element + * + * @var Zend_Gdata_Photos_Extension_Height + */ + protected $_gphotoHeight = null; + + /** + * gphoto:size element + * + * @var Zend_Gdata_Photos_Extension_Size + */ + protected $_gphotoSize = null; + + /** + * gphoto:client element + * + * @var Zend_Gdata_Photos_Extension_Client + */ + protected $_gphotoClient = null; + + /** + * gphoto:checksum element + * + * @var Zend_Gdata_Photos_Extension_Checksum + */ + protected $_gphotoChecksum = null; + + /** + * gphoto:timestamp element + * + * @var Zend_Gdata_Photos_Extension_Timestamp + */ + protected $_gphotoTimestamp = null; + + /** + * gphoto:commentCount element + * + * @var Zend_Gdata_Photos_Extension_CommentCount + */ + protected $_gphotoCommentCount = null; + + /** + * gphoto:commentingEnabled element + * + * @var Zend_Gdata_Photos_Extension_CommentingEnabled + */ + protected $_gphotoCommentingEnabled = null; + + /** + * exif:tags element + * + * @var Zend_Gdata_Exif_Extension_Tags + */ + protected $_exifTags = null; + + /** + * georss:where element + * + * @var Zend_Gdata_Geo_Extension_GeoRssWhere + */ + protected $_geoRssWhere = null; + + /** + * Create a new instance. + * + * @param DOMElement $element (optional) DOMElement from which this + * object should be constructed. + */ + public function __construct($element = null) + { + foreach (Zend_Gdata_Photos::$namespaces as $nsPrefix => $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct($element); + + $category = new Zend_Gdata_App_Extension_Category( + 'http://schemas.google.com/photos/2007#photo', + 'http://schemas.google.com/g/2005#kind'); + $this->setCategory(array($category)); + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_gphotoAlbumId !== null) { + $element->appendChild($this->_gphotoAlbumId->getDOM($element->ownerDocument)); + } + if ($this->_gphotoId !== null) { + $element->appendChild($this->_gphotoId->getDOM($element->ownerDocument)); + } + if ($this->_gphotoVersion !== null) { + $element->appendChild($this->_gphotoVersion->getDOM($element->ownerDocument)); + } + if ($this->_gphotoWidth !== null) { + $element->appendChild($this->_gphotoWidth->getDOM($element->ownerDocument)); + } + if ($this->_gphotoHeight !== null) { + $element->appendChild($this->_gphotoHeight->getDOM($element->ownerDocument)); + } + if ($this->_gphotoSize !== null) { + $element->appendChild($this->_gphotoSize->getDOM($element->ownerDocument)); + } + if ($this->_gphotoClient !== null) { + $element->appendChild($this->_gphotoClient->getDOM($element->ownerDocument)); + } + if ($this->_gphotoChecksum !== null) { + $element->appendChild($this->_gphotoChecksum->getDOM($element->ownerDocument)); + } + if ($this->_gphotoTimestamp !== null) { + $element->appendChild($this->_gphotoTimestamp->getDOM($element->ownerDocument)); + } + if ($this->_gphotoCommentingEnabled !== null) { + $element->appendChild($this->_gphotoCommentingEnabled->getDOM($element->ownerDocument)); + } + if ($this->_gphotoCommentCount !== null) { + $element->appendChild($this->_gphotoCommentCount->getDOM($element->ownerDocument)); + } + if ($this->_exifTags !== null) { + $element->appendChild($this->_exifTags->getDOM($element->ownerDocument)); + } + if ($this->_geoRssWhere !== null) { + $element->appendChild($this->_geoRssWhere->getDOM($element->ownerDocument)); + } + return $element; + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them as members of this entry based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + + switch ($absoluteNodeName) { + case $this->lookupNamespace('gphoto') . ':' . 'albumid'; + $albumId = new Zend_Gdata_Photos_Extension_AlbumId(); + $albumId->transferFromDOM($child); + $this->_gphotoAlbumId = $albumId; + break; + case $this->lookupNamespace('gphoto') . ':' . 'id'; + $id = new Zend_Gdata_Photos_Extension_Id(); + $id->transferFromDOM($child); + $this->_gphotoId = $id; + break; + case $this->lookupNamespace('gphoto') . ':' . 'version'; + $version = new Zend_Gdata_Photos_Extension_Version(); + $version->transferFromDOM($child); + $this->_gphotoVersion = $version; + break; + case $this->lookupNamespace('gphoto') . ':' . 'width'; + $width = new Zend_Gdata_Photos_Extension_Width(); + $width->transferFromDOM($child); + $this->_gphotoWidth = $width; + break; + case $this->lookupNamespace('gphoto') . ':' . 'height'; + $height = new Zend_Gdata_Photos_Extension_Height(); + $height->transferFromDOM($child); + $this->_gphotoHeight = $height; + break; + case $this->lookupNamespace('gphoto') . ':' . 'size'; + $size = new Zend_Gdata_Photos_Extension_Size(); + $size->transferFromDOM($child); + $this->_gphotoSize = $size; + break; + case $this->lookupNamespace('gphoto') . ':' . 'client'; + $client = new Zend_Gdata_Photos_Extension_Client(); + $client->transferFromDOM($child); + $this->_gphotoClient = $client; + break; + case $this->lookupNamespace('gphoto') . ':' . 'checksum'; + $checksum = new Zend_Gdata_Photos_Extension_Checksum(); + $checksum->transferFromDOM($child); + $this->_gphotoChecksum = $checksum; + break; + case $this->lookupNamespace('gphoto') . ':' . 'timestamp'; + $timestamp = new Zend_Gdata_Photos_Extension_Timestamp(); + $timestamp->transferFromDOM($child); + $this->_gphotoTimestamp = $timestamp; + break; + case $this->lookupNamespace('gphoto') . ':' . 'commentingEnabled'; + $commentingEnabled = new Zend_Gdata_Photos_Extension_CommentingEnabled(); + $commentingEnabled->transferFromDOM($child); + $this->_gphotoCommentingEnabled = $commentingEnabled; + break; + case $this->lookupNamespace('gphoto') . ':' . 'commentCount'; + $commentCount = new Zend_Gdata_Photos_Extension_CommentCount(); + $commentCount->transferFromDOM($child); + $this->_gphotoCommentCount = $commentCount; + break; + case $this->lookupNamespace('exif') . ':' . 'tags'; + $exifTags = new Zend_Gdata_Exif_Extension_Tags(); + $exifTags->transferFromDOM($child); + $this->_exifTags = $exifTags; + break; + case $this->lookupNamespace('georss') . ':' . 'where'; + $geoRssWhere = new Zend_Gdata_Geo_Extension_GeoRssWhere(); + $geoRssWhere->transferFromDOM($child); + $this->_geoRssWhere = $geoRssWhere; + break; + default: + parent::takeChildFromDOM($child); + break; + + } + } + + /** + * Get the value for this element's gphoto:albumid attribute. + * + * @see setGphotoAlbumId + * @return string The requested attribute. + */ + public function getGphotoAlbumId() + { + return $this->_gphotoAlbumId; + } + + /** + * Set the value for this element's gphoto:albumid attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_AlbumId The element being modified. + */ + public function setGphotoAlbumId($value) + { + $this->_gphotoAlbumId = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:id attribute. + * + * @see setGphotoId + * @return string The requested attribute. + */ + public function getGphotoId() + { + return $this->_gphotoId; + } + + /** + * Set the value for this element's gphoto:id attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Id The element being modified. + */ + public function setGphotoId($value) + { + $this->_gphotoId = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:version attribute. + * + * @see setGphotoVersion + * @return string The requested attribute. + */ + public function getGphotoVersion() + { + return $this->_gphotoVersion; + } + + /** + * Set the value for this element's gphoto:version attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Version The element being modified. + */ + public function setGphotoVersion($value) + { + $this->_gphotoVersion = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:width attribute. + * + * @see setGphotoWidth + * @return string The requested attribute. + */ + public function getGphotoWidth() + { + return $this->_gphotoWidth; + } + + /** + * Set the value for this element's gphoto:width attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Width The element being modified. + */ + public function setGphotoWidth($value) + { + $this->_gphotoWidth = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:height attribute. + * + * @see setGphotoHeight + * @return string The requested attribute. + */ + public function getGphotoHeight() + { + return $this->_gphotoHeight; + } + + /** + * Set the value for this element's gphoto:height attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Height The element being modified. + */ + public function setGphotoHeight($value) + { + $this->_gphotoHeight = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:size attribute. + * + * @see setGphotoSize + * @return string The requested attribute. + */ + public function getGphotoSize() + { + return $this->_gphotoSize; + } + + /** + * Set the value for this element's gphoto:size attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Size The element being modified. + */ + public function setGphotoSize($value) + { + $this->_gphotoSize = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:client attribute. + * + * @see setGphotoClient + * @return string The requested attribute. + */ + public function getGphotoClient() + { + return $this->_gphotoClient; + } + + /** + * Set the value for this element's gphoto:client attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Client The element being modified. + */ + public function setGphotoClient($value) + { + $this->_gphotoClient = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:checksum attribute. + * + * @see setGphotoChecksum + * @return string The requested attribute. + */ + public function getGphotoChecksum() + { + return $this->_gphotoChecksum; + } + + /** + * Set the value for this element's gphoto:checksum attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Checksum The element being modified. + */ + public function setGphotoChecksum($value) + { + $this->_gphotoChecksum = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:timestamp attribute. + * + * @see setGphotoTimestamp + * @return string The requested attribute. + */ + public function getGphotoTimestamp() + { + return $this->_gphotoTimestamp; + } + + /** + * Set the value for this element's gphoto:timestamp attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Timestamp The element being modified. + */ + public function setGphotoTimestamp($value) + { + $this->_gphotoTimestamp = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:commentCount attribute. + * + * @see setGphotoCommentCount + * @return string The requested attribute. + */ + public function getGphotoCommentCount() + { + return $this->_gphotoCommentCount; + } + + /** + * Set the value for this element's gphoto:commentCount attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_CommentCount The element being modified. + */ + public function setGphotoCommentCount($value) + { + $this->_gphotoCommentCount = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:commentingEnabled attribute. + * + * @see setGphotoCommentingEnabled + * @return string The requested attribute. + */ + public function getGphotoCommentingEnabled() + { + return $this->_gphotoCommentingEnabled; + } + + /** + * Set the value for this element's gphoto:commentingEnabled attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_CommentingEnabled The element being modified. + */ + public function setGphotoCommentingEnabled($value) + { + $this->_gphotoCommentingEnabled = $value; + return $this; + } + + /** + * Get the value for this element's exif:tags attribute. + * + * @see setExifTags + * @return string The requested attribute. + */ + public function getExifTags() + { + return $this->_exifTags; + } + + /** + * Set the value for this element's exif:tags attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Exif_Extension_Tags The element being modified. + */ + public function setExifTags($value) + { + $this->_exifTags = $value; + return $this; + } + + /** + * Get the value for this element's georss:where attribute. + * + * @see setGeoRssWhere + * @return string The requested attribute. + */ + public function getGeoRssWhere() + { + return $this->_geoRssWhere; + } + + /** + * Set the value for this element's georss:where attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Geo_Extension_GeoRssWhere The element being modified. + */ + public function setGeoRssWhere($value) + { + $this->_geoRssWhere = $value; + return $this; + } + + /** + * Get the value for this element's media:group attribute. + * + * @see setMediaGroup + * @return string The requested attribute. + */ + public function getMediaGroup() + { + return $this->_mediaGroup; + } + + /** + * Set the value for this element's media:group attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Media_Extension_MediaGroup The element being modified. + */ + public function setMediaGroup($value) + { + $this->_mediaGroup = $value; + return $this; + } + +} diff --git a/libs/Zend/Gdata/Photos/PhotoFeed.php b/libs/Zend/Gdata/Photos/PhotoFeed.php new file mode 100755 index 0000000..59c2f58 --- /dev/null +++ b/libs/Zend/Gdata/Photos/PhotoFeed.php @@ -0,0 +1,559 @@ + 'Zend_Gdata_Photos_CommentEntry', + 'http://schemas.google.com/photos/2007#tag' => 'Zend_Gdata_Photos_TagEntry' + ); + + public function __construct($element = null) + { + foreach (Zend_Gdata_Photos::$namespaces as $nsPrefix => $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct($element); + } + + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_gphotoId != null) { + $element->appendChild($this->_gphotoId->getDOM($element->ownerDocument)); + } + if ($this->_gphotoVersion != null) { + $element->appendChild($this->_gphotoVersion->getDOM($element->ownerDocument)); + } + if ($this->_gphotoWidth != null) { + $element->appendChild($this->_gphotoWidth->getDOM($element->ownerDocument)); + } + if ($this->_gphotoHeight != null) { + $element->appendChild($this->_gphotoHeight->getDOM($element->ownerDocument)); + } + if ($this->_gphotoSize != null) { + $element->appendChild($this->_gphotoSize->getDOM($element->ownerDocument)); + } + if ($this->_gphotoClient != null) { + $element->appendChild($this->_gphotoClient->getDOM($element->ownerDocument)); + } + if ($this->_gphotoChecksum != null) { + $element->appendChild($this->_gphotoChecksum->getDOM($element->ownerDocument)); + } + if ($this->_gphotoTimestamp != null) { + $element->appendChild($this->_gphotoTimestamp->getDOM($element->ownerDocument)); + } + if ($this->_gphotoCommentingEnabled != null) { + $element->appendChild($this->_gphotoCommentingEnabled->getDOM($element->ownerDocument)); + } + if ($this->_gphotoCommentCount != null) { + $element->appendChild($this->_gphotoCommentCount->getDOM($element->ownerDocument)); + } + if ($this->_mediaGroup != null) { + $element->appendChild($this->_mediaGroup->getDOM($element->ownerDocument)); + } + + return $element; + } + + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + + switch ($absoluteNodeName) { + case $this->lookupNamespace('gphoto') . ':' . 'id'; + $id = new Zend_Gdata_Photos_Extension_Id(); + $id->transferFromDOM($child); + $this->_gphotoId = $id; + break; + case $this->lookupNamespace('gphoto') . ':' . 'version'; + $version = new Zend_Gdata_Photos_Extension_Version(); + $version->transferFromDOM($child); + $this->_gphotoVersion = $version; + break; + case $this->lookupNamespace('gphoto') . ':' . 'albumid'; + $albumid = new Zend_Gdata_Photos_Extension_AlbumId(); + $albumid->transferFromDOM($child); + $this->_gphotoAlbumId = $albumid; + break; + case $this->lookupNamespace('gphoto') . ':' . 'width'; + $width = new Zend_Gdata_Photos_Extension_Width(); + $width->transferFromDOM($child); + $this->_gphotoWidth = $width; + break; + case $this->lookupNamespace('gphoto') . ':' . 'height'; + $height = new Zend_Gdata_Photos_Extension_Height(); + $height->transferFromDOM($child); + $this->_gphotoHeight = $height; + break; + case $this->lookupNamespace('gphoto') . ':' . 'size'; + $size = new Zend_Gdata_Photos_Extension_Size(); + $size->transferFromDOM($child); + $this->_gphotoSize = $size; + break; + case $this->lookupNamespace('gphoto') . ':' . 'client'; + $client = new Zend_Gdata_Photos_Extension_Client(); + $client->transferFromDOM($child); + $this->_gphotoClient = $client; + break; + case $this->lookupNamespace('gphoto') . ':' . 'checksum'; + $checksum = new Zend_Gdata_Photos_Extension_Checksum(); + $checksum->transferFromDOM($child); + $this->_gphotoChecksum = $checksum; + break; + case $this->lookupNamespace('gphoto') . ':' . 'timestamp'; + $timestamp = new Zend_Gdata_Photos_Extension_Timestamp(); + $timestamp->transferFromDOM($child); + $this->_gphotoTimestamp = $timestamp; + break; + case $this->lookupNamespace('gphoto') . ':' . 'commentingEnabled'; + $commentingEnabled = new Zend_Gdata_Photos_Extension_CommentingEnabled(); + $commentingEnabled->transferFromDOM($child); + $this->_gphotoCommentingEnabled = $commentingEnabled; + break; + case $this->lookupNamespace('gphoto') . ':' . 'commentCount'; + $commentCount = new Zend_Gdata_Photos_Extension_CommentCount(); + $commentCount->transferFromDOM($child); + $this->_gphotoCommentCount = $commentCount; + break; + case $this->lookupNamespace('media') . ':' . 'group'; + $mediaGroup = new Zend_Gdata_Media_Extension_MediaGroup(); + $mediaGroup->transferFromDOM($child); + $this->_mediaGroup = $mediaGroup; + break; + case $this->lookupNamespace('atom') . ':' . 'entry': + $entryClassName = $this->_entryClassName; + $tmpEntry = new Zend_Gdata_App_Entry($child); + $categories = $tmpEntry->getCategory(); + foreach ($categories as $category) { + if ($category->scheme == Zend_Gdata_Photos::KIND_PATH && + $this->_entryKindClassMapping[$category->term] != "") { + $entryClassName = $this->_entryKindClassMapping[$category->term]; + break; + } else { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception('Entry is missing kind declaration.'); + } + } + + $newEntry = new $entryClassName($child); + $newEntry->setHttpClient($this->getHttpClient()); + $this->_entry[] = $newEntry; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + /** + * Get the value for this element's gphoto:id attribute. + * + * @see setGphotoId + * @return string The requested attribute. + */ + public function getGphotoId() + { + return $this->_gphotoId; + } + + /** + * Set the value for this element's gphoto:id attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Id The element being modified. + */ + public function setGphotoId($value) + { + $this->_gphotoId = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:version attribute. + * + * @see setGphotoVersion + * @return string The requested attribute. + */ + public function getGphotoVersion() + { + return $this->_gphotoVersion; + } + + /** + * Set the value for this element's gphoto:version attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Version The element being modified. + */ + public function setGphotoVersion($value) + { + $this->_gphotoVersion = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:albumid attribute. + * + * @see setGphotoAlbumId + * @return string The requested attribute. + */ + public function getGphotoAlbumId() + { + return $this->_gphotoAlbumId; + } + + /** + * Set the value for this element's gphoto:albumid attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_AlbumId The element being modified. + */ + public function setGphotoAlbumId($value) + { + $this->_gphotoAlbumId = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:width attribute. + * + * @see setGphotoWidth + * @return string The requested attribute. + */ + public function getGphotoWidth() + { + return $this->_gphotoWidth; + } + + /** + * Set the value for this element's gphoto:width attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Width The element being modified. + */ + public function setGphotoWidth($value) + { + $this->_gphotoWidth = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:height attribute. + * + * @see setGphotoHeight + * @return string The requested attribute. + */ + public function getGphotoHeight() + { + return $this->_gphotoHeight; + } + + /** + * Set the value for this element's gphoto:height attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Height The element being modified. + */ + public function setGphotoHeight($value) + { + $this->_gphotoHeight = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:size attribute. + * + * @see setGphotoSize + * @return string The requested attribute. + */ + public function getGphotoSize() + { + return $this->_gphotoSize; + } + + /** + * Set the value for this element's gphoto:size attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Size The element being modified. + */ + public function setGphotoSize($value) + { + $this->_gphotoSize = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:client attribute. + * + * @see setGphotoClient + * @return string The requested attribute. + */ + public function getGphotoClient() + { + return $this->_gphotoClient; + } + + /** + * Set the value for this element's gphoto:client attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Client The element being modified. + */ + public function setGphotoClient($value) + { + $this->_gphotoClient = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:checksum attribute. + * + * @see setGphotoChecksum + * @return string The requested attribute. + */ + public function getGphotoChecksum() + { + return $this->_gphotoChecksum; + } + + /** + * Set the value for this element's gphoto:checksum attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Checksum The element being modified. + */ + public function setGphotoChecksum($value) + { + $this->_gphotoChecksum = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:timestamp attribute. + * + * @see setGphotoTimestamp + * @return string The requested attribute. + */ + public function getGphotoTimestamp() + { + return $this->_gphotoTimestamp; + } + + /** + * Set the value for this element's gphoto:timestamp attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Timestamp The element being modified. + */ + public function setGphotoTimestamp($value) + { + $this->_gphotoTimestamp = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:commentCount attribute. + * + * @see setGphotoCommentCount + * @return string The requested attribute. + */ + public function getGphotoCommentCount() + { + return $this->_gphotoCommentCount; + } + + /** + * Set the value for this element's gphoto:commentCount attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_CommentCount The element being modified. + */ + public function setGphotoCommentCount($value) + { + $this->_gphotoCommentCount = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:commentingEnabled attribute. + * + * @see setGphotoCommentingEnabled + * @return string The requested attribute. + */ + public function getGphotoCommentingEnabled() + { + return $this->_gphotoCommentingEnabled; + } + + /** + * Set the value for this element's gphoto:commentingEnabled attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_CommentingEnabled The element being modified. + */ + public function setGphotoCommentingEnabled($value) + { + $this->_gphotoCommentingEnabled = $value; + return $this; + } + + /** + * Get the value for this element's media:group attribute. + * + * @see setMediaGroup + * @return string The requested attribute. + */ + public function getMediaGroup() + { + return $this->_mediaGroup; + } + + /** + * Set the value for this element's media:group attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Media_Extension_MediaGroup The element being modified. + */ + public function setMediaGroup($value) + { + $this->_mediaGroup = $value; + return $this; + } + +} diff --git a/libs/Zend/Gdata/Photos/PhotoQuery.php b/libs/Zend/Gdata/Photos/PhotoQuery.php new file mode 100755 index 0000000..d968bf0 --- /dev/null +++ b/libs/Zend/Gdata/Photos/PhotoQuery.php @@ -0,0 +1,96 @@ +_photoId = $value; + } + + /** + * Get the photo ID which is to be returned. + * + * @see setPhoto + * @return string The ID of the photo to retrieve. + */ + public function getPhotoId() + { + return $this->_photoId; + } + + /** + * 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($incomingUri = '') + { + $uri = ''; + if ($this->getPhotoId() !== null) { + $uri .= '/photoid/' . $this->getPhotoId(); + } else { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'PhotoId cannot be null'); + } + $uri .= $incomingUri; + return parent::getQueryUrl($uri); + } + +} diff --git a/libs/Zend/Gdata/Photos/TagEntry.php b/libs/Zend/Gdata/Photos/TagEntry.php new file mode 100755 index 0000000..410e794 --- /dev/null +++ b/libs/Zend/Gdata/Photos/TagEntry.php @@ -0,0 +1,140 @@ + in the Google Data protocol. + * + * @category Zend + * @package Zend_Gdata + * @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_Gdata_Photos_TagEntry extends Zend_Gdata_Entry +{ + + protected $_entryClassName = 'Zend_Gdata_Photos_TagEntry'; + + protected $_gphotoWeight = null; + + /** + * Create a new instance. + * + * @param DOMElement $element (optional) DOMElement from which this + * object should be constructed. + */ + public function __construct($element = null) + { + foreach (Zend_Gdata_Photos::$namespaces as $nsPrefix => $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct($element); + + $category = new Zend_Gdata_App_Extension_Category( + 'http://schemas.google.com/photos/2007#tag', + 'http://schemas.google.com/g/2005#kind'); + $this->setCategory(array($category)); + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_gphotoWeight !== null) { + $element->appendChild($this->_gphotoWeight->getDOM($element->ownerDocument)); + } + return $element; + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them as members of this entry based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + + switch ($absoluteNodeName) { + case $this->lookupNamespace('gphoto') . ':' . 'weight'; + $weight = new Zend_Gdata_Photos_Extension_Weight(); + $weight->transferFromDOM($child); + $this->_gphotoWeight = $weight; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + /** + * Get the value for this element's gphoto:weight attribute. + * + * @see setGphotoWeight + * @return string The requested attribute. + */ + public function getGphotoWeight() + { + return $this->_gphotoWeight; + } + + /** + * Set the value for this element's gphoto:weight attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Weight The element being modified. + */ + public function setGphotoWeight($value) + { + $this->_gphotoWeight = $value; + return $this; + } +} diff --git a/libs/Zend/Gdata/Photos/UserEntry.php b/libs/Zend/Gdata/Photos/UserEntry.php new file mode 100755 index 0000000..67ffcd5 --- /dev/null +++ b/libs/Zend/Gdata/Photos/UserEntry.php @@ -0,0 +1,366 @@ + in the Google Data protocol. + * + * @category Zend + * @package Zend_Gdata + * @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_Gdata_Photos_UserEntry extends Zend_Gdata_Entry +{ + + protected $_entryClassName = 'Zend_Gdata_Photos_UserEntry'; + + /** + * gphoto:nickname element + * + * @var Zend_Gdata_Photos_Extension_Nickname + */ + protected $_gphotoNickname = null; + + /** + * gphoto:user element + * + * @var Zend_Gdata_Photos_Extension_User + */ + protected $_gphotoUser = null; + + /** + * gphoto:thumbnail element + * + * @var Zend_Gdata_Photos_Extension_Thumbnail + */ + protected $_gphotoThumbnail = null; + + /** + * gphoto:quotalimit element + * + * @var Zend_Gdata_Photos_Extension_QuotaLimit + */ + protected $_gphotoQuotaLimit = null; + + /** + * gphoto:quotacurrent element + * + * @var Zend_Gdata_Photos_Extension_QuotaCurrent + */ + protected $_gphotoQuotaCurrent = null; + + /** + * gphoto:maxPhotosPerAlbum element + * + * @var Zend_Gdata_Photos_Extension_MaxPhotosPerAlbum + */ + protected $_gphotoMaxPhotosPerAlbum = null; + + /** + * Create a new instance. + * + * @param DOMElement $element (optional) DOMElement from which this + * object should be constructed. + */ + public function __construct($element = null) + { + foreach (Zend_Gdata_Photos::$namespaces as $nsPrefix => $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct($element); + + $category = new Zend_Gdata_App_Extension_Category( + 'http://schemas.google.com/photos/2007#user', + 'http://schemas.google.com/g/2005#kind'); + $this->setCategory(array($category)); + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_gphotoNickname !== null) { + $element->appendChild($this->_gphotoNickname->getDOM($element->ownerDocument)); + } + if ($this->_gphotoThumbnail !== null) { + $element->appendChild($this->_gphotoThumbnail->getDOM($element->ownerDocument)); + } + if ($this->_gphotoUser !== null) { + $element->appendChild($this->_gphotoUser->getDOM($element->ownerDocument)); + } + if ($this->_gphotoQuotaCurrent !== null) { + $element->appendChild($this->_gphotoQuotaCurrent->getDOM($element->ownerDocument)); + } + if ($this->_gphotoQuotaLimit !== null) { + $element->appendChild($this->_gphotoQuotaLimit->getDOM($element->ownerDocument)); + } + if ($this->_gphotoMaxPhotosPerAlbum !== null) { + $element->appendChild($this->_gphotoMaxPhotosPerAlbum->getDOM($element->ownerDocument)); + } + return $element; + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them as members of this entry based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + + switch ($absoluteNodeName) { + case $this->lookupNamespace('gphoto') . ':' . 'nickname'; + $nickname = new Zend_Gdata_Photos_Extension_Nickname(); + $nickname->transferFromDOM($child); + $this->_gphotoNickname = $nickname; + break; + case $this->lookupNamespace('gphoto') . ':' . 'thumbnail'; + $thumbnail = new Zend_Gdata_Photos_Extension_Thumbnail(); + $thumbnail->transferFromDOM($child); + $this->_gphotoThumbnail = $thumbnail; + break; + case $this->lookupNamespace('gphoto') . ':' . 'user'; + $user = new Zend_Gdata_Photos_Extension_User(); + $user->transferFromDOM($child); + $this->_gphotoUser = $user; + break; + case $this->lookupNamespace('gphoto') . ':' . 'quotacurrent'; + $quotaCurrent = new Zend_Gdata_Photos_Extension_QuotaCurrent(); + $quotaCurrent->transferFromDOM($child); + $this->_gphotoQuotaCurrent = $quotaCurrent; + break; + case $this->lookupNamespace('gphoto') . ':' . 'quotalimit'; + $quotaLimit = new Zend_Gdata_Photos_Extension_QuotaLimit(); + $quotaLimit->transferFromDOM($child); + $this->_gphotoQuotaLimit = $quotaLimit; + break; + case $this->lookupNamespace('gphoto') . ':' . 'maxPhotosPerAlbum'; + $maxPhotosPerAlbum = new Zend_Gdata_Photos_Extension_MaxPhotosPerAlbum(); + $maxPhotosPerAlbum->transferFromDOM($child); + $this->_gphotoMaxPhotosPerAlbum = $maxPhotosPerAlbum; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + /** + * Get the value for this element's gphoto:nickname attribute. + * + * @see setGphotoNickname + * @return string The requested attribute. + */ + public function getGphotoNickname() + { + return $this->_gphotoNickname; + } + + /** + * Set the value for this element's gphoto:nickname attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Nickname The element being modified. + */ + public function setGphotoNickname($value) + { + $this->_gphotoNickname = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:thumbnail attribute. + * + * @see setGphotoThumbnail + * @return string The requested attribute. + */ + public function getGphotoThumbnail() + { + return $this->_gphotoThumbnail; + } + + /** + * Set the value for this element's gphoto:thumbnail attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Thumbnail The element being modified. + */ + public function setGphotoThumbnail($value) + { + $this->_gphotoThumbnail = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:quotacurrent attribute. + * + * @see setGphotoQuotaCurrent + * @return string The requested attribute. + */ + public function getGphotoQuotaCurrent() + { + return $this->_gphotoThumbnail; + } + + /** + * Set the value for this element's gphoto:quotacurrent attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_QuotaCurrent The element being modified. + */ + public function setGphotoQuotaCurrent($value) + { + $this->_gphotoThumbnail = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:quotalimit attribute. + * + * @see setGphotoQuotaLimit + * @return string The requested attribute. + */ + public function getGphotoQuotaLimit() + { + return $this->_gphotoQuotaLimit; + } + + /** + * Set the value for this element's gphoto:quotalimit attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_QuotaLimit The element being modified. + */ + public function setGphotoQuotaLimit($value) + { + $this->_gphotoQuotaLimit = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:maxPhotosPerAlbum attribute. + * + * @see setGphotoMaxPhotosPerAlbum + * @return string The requested attribute. + */ + public function getGphotoMaxPhotosPerAlbum() + { + return $this->_gphotoMaxPhotosPerAlbum; + } + + /** + * Set the value for this element's gphoto:maxPhotosPerAlbum attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_MaxPhotosPerAlbum The element being modified. + */ + public function setGphotoMaxPhotosPerAlbum($value) + { + $this->_gphotoMaxPhotosPerAlbum = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:user attribute. + * + * @see setGphotoUser + * @return string The requested attribute. + */ + public function getGphotoUser() + { + return $this->_gphotoUser; + } + + /** + * Set the value for this element's gphoto:user attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_User The element being modified. + */ + public function setGphotoUser($value) + { + $this->_gphotoUser = $value; + return $this; + } + +} diff --git a/libs/Zend/Gdata/Photos/UserFeed.php b/libs/Zend/Gdata/Photos/UserFeed.php new file mode 100755 index 0000000..b4d6a44 --- /dev/null +++ b/libs/Zend/Gdata/Photos/UserFeed.php @@ -0,0 +1,247 @@ + 'Zend_Gdata_Photos_AlbumEntry', + 'http://schemas.google.com/photos/2007#photo' => 'Zend_Gdata_Photos_PhotoEntry', + 'http://schemas.google.com/photos/2007#comment' => 'Zend_Gdata_Photos_CommentEntry', + 'http://schemas.google.com/photos/2007#tag' => 'Zend_Gdata_Photos_TagEntry' + ); + + public function __construct($element = null) + { + foreach (Zend_Gdata_Photos::$namespaces as $nsPrefix => $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct($element); + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them in the $_entry array based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('gphoto') . ':' . 'user'; + $user = new Zend_Gdata_Photos_Extension_User(); + $user->transferFromDOM($child); + $this->_gphotoUser = $user; + break; + case $this->lookupNamespace('gphoto') . ':' . 'nickname'; + $nickname = new Zend_Gdata_Photos_Extension_Nickname(); + $nickname->transferFromDOM($child); + $this->_gphotoNickname = $nickname; + break; + case $this->lookupNamespace('gphoto') . ':' . 'thumbnail'; + $thumbnail = new Zend_Gdata_Photos_Extension_Thumbnail(); + $thumbnail->transferFromDOM($child); + $this->_gphotoThumbnail = $thumbnail; + break; + case $this->lookupNamespace('atom') . ':' . 'entry': + $entryClassName = $this->_entryClassName; + $tmpEntry = new Zend_Gdata_App_Entry($child); + $categories = $tmpEntry->getCategory(); + foreach ($categories as $category) { + if ($category->scheme == Zend_Gdata_Photos::KIND_PATH && + $this->_entryKindClassMapping[$category->term] != "") { + $entryClassName = $this->_entryKindClassMapping[$category->term]; + break; + } else { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception('Entry is missing kind declaration.'); + } + } + + $newEntry = new $entryClassName($child); + $newEntry->setHttpClient($this->getHttpClient()); + $this->_entry[] = $newEntry; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_gphotoUser != null) { + $element->appendChild($this->_gphotoUser->getDOM($element->ownerDocument)); + } + if ($this->_gphotoNickname != null) { + $element->appendChild($this->_gphotoNickname->getDOM($element->ownerDocument)); + } + if ($this->_gphotoThumbnail != null) { + $element->appendChild($this->_gphotoThumbnail->getDOM($element->ownerDocument)); + } + + return $element; + } + + /** + * Get the value for this element's gphoto:user attribute. + * + * @see setGphotoUser + * @return string The requested attribute. + */ + public function getGphotoUser() + { + return $this->_gphotoUser; + } + + /** + * Set the value for this element's gphoto:user attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_User The element being modified. + */ + public function setGphotoUser($value) + { + $this->_gphotoUser = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:nickname attribute. + * + * @see setGphotoNickname + * @return string The requested attribute. + */ + public function getGphotoNickname() + { + return $this->_gphotoNickname; + } + + /** + * Set the value for this element's gphoto:nickname attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Nickname The element being modified. + */ + public function setGphotoNickname($value) + { + $this->_gphotoNickname = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:thumbnail attribute. + * + * @see setGphotoThumbnail + * @return string The requested attribute. + */ + public function getGphotoThumbnail() + { + return $this->_gphotoThumbnail; + } + + /** + * Set the value for this element's gphoto:thumbnail attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Thumbnail The element being modified. + */ + public function setGphotoThumbnail($value) + { + $this->_gphotoThumbnail = $value; + return $this; + } + +} diff --git a/libs/Zend/Gdata/Photos/UserQuery.php b/libs/Zend/Gdata/Photos/UserQuery.php new file mode 100755 index 0000000..f1c9bd1 --- /dev/null +++ b/libs/Zend/Gdata/Photos/UserQuery.php @@ -0,0 +1,353 @@ +_projection = $value; + return $this; + } + + /** + * Gets the format of data in returned in Atom feeds. + * + * @see setProjection + * @return string projection + */ + public function getProjection() + { + return $this->_projection; + } + + /** + * 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 + * @return Zend_Gdata_Photos_UserQuery Provides a fluent interface + */ + public function setType($value) + { + $this->_type = $value; + return $this; + } + + /** + * Gets the type of data in returned in queries. + * + * @see setType + * @return string type + */ + public function getType() + { + return $this->_type; + } + + /** + * Set the user to query for. When set, this user's feed will be + * returned. If not set or null, the default user's feed will be returned + * instead. + * + * @param string $value The user to retrieve, or null for the default + * user. + */ + public function setUser($value) + { + if ($value !== null) { + $this->_user = $value; + } else { + $this->_user = Zend_Gdata_Photos::DEFAULT_USER; + } + } + + /** + * Get the user which is to be returned. + * + * @see setUser + * @return string The visibility to retrieve. + */ + public function getUser() + { + return $this->_user; + } + + /** + * 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 + * default value. + */ + public function setAccess($value) + { + if ($value !== null) { + $this->_params['access'] = $value; + } else { + unset($this->_params['access']); + } + } + + /** + * Get the visibility filter for entries returned. + * + * @see setAccess + * @return string The visibility to filter by, or null for the default + * user. + */ + public function getAccess() + { + return $this->_params['access']; + } + + /** + * 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. + * + * @param string $value The tag to filter by, or null if no + * filter is to be applied. + */ + public function setTag($value) + { + if ($value !== null) { + $this->_params['tag'] = $value; + } else { + unset($this->_params['tag']); + } + } + + /** + * Get the tag filter for entries returned. + * + * @see setTag + * @return string The tag to filter by, or null if no filter + * is to be applied. + */ + public function getTag() + { + return $this->_params['tag']; + } + + /** + * 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. + * + * @param string $value The kind to filter by, or null if no + * filter is to be applied. + */ + public function setKind($value) + { + if ($value !== null) { + $this->_params['kind'] = $value; + } else { + unset($this->_params['kind']); + } + } + + /** + * Get the kind of entries to be returned. + * + * @see setKind + * @return string The kind to filter by, or null if no filter + * is to be applied. + */ + public function getKind() + { + return $this->_params['kind']; + } + + /** + * 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. + * + * @param string $value The image size to filter by, or null if no + * filter is to be applied. + */ + public function setImgMax($value) + { + if ($value !== null) { + $this->_params['imgmax'] = $value; + } else { + unset($this->_params['imgmax']); + } + } + + /** + * Get the maximum image size filter for entries returned. + * + * @see setImgMax + * @return string The image size size to filter by, or null if no filter + * is to be applied. + */ + public function getImgMax() + { + return $this->_params['imgmax']; + } + + /** + * 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. + * + * @param string $value The thumbnail size to filter by, or null if no + * filter is to be applied. + */ + public function setThumbsize($value) + { + if ($value !== null) { + $this->_params['thumbsize'] = $value; + } else { + unset($this->_params['thumbsize']); + } + } + + /** + * Get the thumbnail size filter for entries returned. + * + * @see setThumbsize + * @return string The thumbnail size to filter by, or null if no filter + * is to be applied. + */ + public function getThumbsize() + { + return $this->_params['thumbsize']; + } + + /** + * 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($incomingUri = null) + { + $uri = Zend_Gdata_Photos::PICASA_BASE_URI; + + if ($this->getType() !== null) { + $uri .= '/' . $this->getType(); + } else { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'Type must be feed or entry, not null'); + } + + if ($this->getProjection() !== null) { + $uri .= '/' . $this->getProjection(); + } else { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'Projection must not be null'); + } + + if ($this->getUser() !== null) { + $uri .= '/user/' . $this->getUser(); + } else { + // Should never occur due to setter behavior + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'User must not be null'); + } + + $uri .= $incomingUri; + $uri .= $this->getQueryString(); + return $uri; + } + +} diff --git a/libs/Zend/Gdata/Query.php b/libs/Zend/Gdata/Query.php new file mode 100644 index 0000000..3ef90da --- /dev/null +++ b/libs/Zend/Gdata/Query.php @@ -0,0 +1,415 @@ +_url = $url; + } + + /** + * @return string querystring + */ + public function getQueryString() + { + $queryArray = array(); + foreach ($this->_params as $name => $value) { + if (substr($name, 0, 1) == '_') { + continue; + } + $queryArray[] = urlencode($name) . '=' . urlencode($value); + } + if (count($queryArray) > 0) { + return '?' . implode('&', $queryArray); + } else { + return ''; + } + } + + /** + * + */ + public function resetParameters() + { + $this->_params = array(); + } + + /** + * @return string url + */ + public function getQueryUrl() + { + if ($this->_url == null) { + $url = $this->_defaultFeedUri; + } else { + $url = $this->_url; + } + if ($this->getCategory() !== null) { + $url .= '/-/' . $this->getCategory(); + } + $url .= $this->getQueryString(); + return $url; + } + + /** + * @param string $name + * @param string $value + * @return Zend_Gdata_Query Provides a fluent interface + */ + public function setParam($name, $value) + { + $this->_params[$name] = $value; + return $this; + } + + /** + * @param string $name + */ + public function getParam($name) + { + return $this->_params[$name]; + } + + /** + * @param string $value + * @return Zend_Gdata_Query Provides a fluent interface + */ + public function setAlt($value) + { + if ($value != null) { + $this->_params['alt'] = $value; + } else { + unset($this->_params['alt']); + } + return $this; + } + + /** + * @param int $value + * @return Zend_Gdata_Query Provides a fluent interface + */ + public function setMaxResults($value) + { + if ($value != null) { + $this->_params['max-results'] = $value; + } else { + unset($this->_params['max-results']); + } + return $this; + } + + /** + * @param string $value + * @return Zend_Gdata_Query Provides a fluent interface + */ + public function setQuery($value) + { + if ($value != null) { + $this->_params['q'] = $value; + } else { + unset($this->_params['q']); + } + return $this; + } + + /** + * @param int $value + * @return Zend_Gdata_Query Provides a fluent interface + */ + public function setStartIndex($value) + { + if ($value != null) { + $this->_params['start-index'] = $value; + } else { + unset($this->_params['start-index']); + } + return $this; + } + + /** + * @param string $value + * @return Zend_Gdata_Query Provides a fluent interface + */ + public function setUpdatedMax($value) + { + if ($value != null) { + $this->_params['updated-max'] = Zend_Gdata_App_Util::formatTimestamp($value); + } else { + unset($this->_params['updated-max']); + } + return $this; + } + + /** + * @param string $value + * @return Zend_Gdata_Query Provides a fluent interface + */ + public function setUpdatedMin($value) + { + if ($value != null) { + $this->_params['updated-min'] = Zend_Gdata_App_Util::formatTimestamp($value); + } else { + unset($this->_params['updated-min']); + } + return $this; + } + + /** + * @param string $value + * @return Zend_Gdata_Query Provides a fluent interface + */ + public function setPublishedMax($value) + { + if ($value !== null) { + $this->_params['published-max'] = Zend_Gdata_App_Util::formatTimestamp($value); + } else { + unset($this->_params['published-max']); + } + return $this; + } + + /** + * @param string $value + * @return Zend_Gdata_Query Provides a fluent interface + */ + public function setPublishedMin($value) + { + if ($value != null) { + $this->_params['published-min'] = Zend_Gdata_App_Util::formatTimestamp($value); + } else { + unset($this->_params['published-min']); + } + return $this; + } + + /** + * @param string $value + * @return Zend_Gdata_Query Provides a fluent interface + */ + public function setAuthor($value) + { + if ($value != null) { + $this->_params['author'] = $value; + } else { + unset($this->_params['author']); + } + return $this; + } + + /** + * @return string rss or atom + */ + public function getAlt() + { + if (array_key_exists('alt', $this->_params)) { + return $this->_params['alt']; + } else { + return null; + } + } + + /** + * @return int maxResults + */ + public function getMaxResults() + { + if (array_key_exists('max-results', $this->_params)) { + return intval($this->_params['max-results']); + } else { + return null; + } + } + + /** + * @return string query + */ + public function getQuery() + { + if (array_key_exists('q', $this->_params)) { + return $this->_params['q']; + } else { + return null; + } + } + + /** + * @return int startIndex + */ + public function getStartIndex() + { + if (array_key_exists('start-index', $this->_params)) { + return intval($this->_params['start-index']); + } else { + return null; + } + } + + /** + * @return string updatedMax + */ + public function getUpdatedMax() + { + if (array_key_exists('updated-max', $this->_params)) { + return $this->_params['updated-max']; + } else { + return null; + } + } + + /** + * @return string updatedMin + */ + public function getUpdatedMin() + { + if (array_key_exists('updated-min', $this->_params)) { + return $this->_params['updated-min']; + } else { + return null; + } + } + + /** + * @return string publishedMax + */ + public function getPublishedMax() + { + if (array_key_exists('published-max', $this->_params)) { + return $this->_params['published-max']; + } else { + return null; + } + } + + /** + * @return string publishedMin + */ + public function getPublishedMin() + { + if (array_key_exists('published-min', $this->_params)) { + return $this->_params['published-min']; + } else { + return null; + } + } + + /** + * @return string author + */ + public function getAuthor() + { + if (array_key_exists('author', $this->_params)) { + return $this->_params['author']; + } else { + return null; + } + } + + /** + * @param string $value + * @return Zend_Gdata_Query Provides a fluent interface + */ + public function setCategory($value) + { + $this->_category = $value; + return $this; + } + + /* + * @return string id + */ + public function getCategory() + { + return $this->_category; + } + + + public function __get($name) + { + $method = 'get'.ucfirst($name); + if (method_exists($this, $method)) { + return call_user_func(array(&$this, $method)); + } else { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception('Property ' . $name . ' does not exist'); + } + } + + public function __set($name, $val) + { + $method = 'set'.ucfirst($name); + if (method_exists($this, $method)) { + return call_user_func(array(&$this, $method), $val); + } else { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception('Property ' . $name . ' does not exist'); + } + } + +} diff --git a/libs/Zend/Gdata/Spreadsheets.php b/libs/Zend/Gdata/Spreadsheets.php new file mode 100644 index 0000000..45aac6b --- /dev/null +++ b/libs/Zend/Gdata/Spreadsheets.php @@ -0,0 +1,436 @@ + 'http://schemas.google.com/spreadsheets/2006', + 'gsx' => 'http://schemas.google.com/spreadsheets/2006/extended'); + + /** + * Create Gdata_Spreadsheets object + * + * @param Zend_Http_Client $client (optional) The HTTP client to use when + * when communicating with the Google servers. + * @param string $applicationId The identity of the app in the form of Company-AppName-Version + */ + public function __construct($client = null, $applicationId = 'MyCompany-MyApp-1.0') + { + $this->registerPackage('Zend_Gdata_Spreadsheets'); + $this->registerPackage('Zend_Gdata_Spreadsheets_Extension'); + parent::__construct($client, $applicationId); + $this->_httpClient->setParameterPost('service', self::AUTH_SERVICE_NAME); + $this->_server = 'spreadsheets.google.com'; + } + + /** + * Gets a spreadsheet feed. + * + * @param mixed $location A DocumentQuery or a string URI specifying the feed location. + * @return Zend_Gdata_Spreadsheets_SpreadsheetFeed + */ + public function getSpreadsheetFeed($location = null) + { + if ($location == null) { + $uri = self::SPREADSHEETS_FEED_URI; + } else if ($location instanceof Zend_Gdata_Spreadsheets_DocumentQuery) { + if ($location->getDocumentType() == null) { + $location->setDocumentType('spreadsheets'); + } + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + + return parent::getFeed($uri, 'Zend_Gdata_Spreadsheets_SpreadsheetFeed'); + } + + /** + * Gets a spreadsheet entry. + * + * @param string $location A DocumentQuery or a URI specifying the entry location. + * @return SpreadsheetEntry + */ + public function getSpreadsheetEntry($location) + { + if ($location instanceof Zend_Gdata_Spreadsheets_DocumentQuery) { + if ($location->getDocumentType() == null) { + $location->setDocumentType('spreadsheets'); + } + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + + return parent::getEntry($uri, 'Zend_Gdata_Spreadsheets_SpreadsheetEntry'); + } + + /** + * Gets a worksheet feed. + * + * @param mixed $location A DocumentQuery, SpreadsheetEntry, or a string URI + * @return Zend_Gdata_Spreadsheets_WorksheetFeed The feed of worksheets + */ + public function getWorksheetFeed($location) + { + if ($location instanceof Zend_Gdata_Spreadsheets_DocumentQuery) { + if ($location->getDocumentType() == null) { + $location->setDocumentType('worksheets'); + } + $uri = $location->getQueryUrl(); + } else if ($location instanceof Zend_Gdata_Spreadsheets_SpreadsheetEntry) { + $uri = $location->getLink(self::WORKSHEETS_FEED_LINK_URI)->href; + } else { + $uri = $location; + } + + return parent::getFeed($uri, 'Zend_Gdata_Spreadsheets_WorksheetFeed'); + } + + /** + * Gets a worksheet entry. + * + * @param string $location A DocumentQuery or a URI specifying the entry location. + * @return WorksheetEntry + */ + public function GetWorksheetEntry($location) + { + if ($location instanceof Zend_Gdata_Spreadsheets_DocumentQuery) { + if ($location->getDocumentType() == null) { + $location->setDocumentType('worksheets'); + } + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + + return parent::getEntry($uri, 'Zend_Gdata_Spreadsheets_WorksheetEntry'); + } + + /** + * Gets a cell feed. + * + * @param string $location A CellQuery, WorksheetEntry or a URI specifying the feed location. + * @return CellFeed + */ + public function getCellFeed($location) + { + if ($location instanceof Zend_Gdata_Spreadsheets_CellQuery) { + $uri = $location->getQueryUrl(); + } else if ($location instanceof Zend_Gdata_Spreadsheets_WorksheetEntry) { + $uri = $location->getLink(self::CELL_FEED_LINK_URI)->href; + } else { + $uri = $location; + } + return parent::getFeed($uri, 'Zend_Gdata_Spreadsheets_CellFeed'); + } + + /** + * Gets a cell entry. + * + * @param string $location A CellQuery or a URI specifying the entry location. + * @return CellEntry + */ + public function getCellEntry($location) + { + if ($location instanceof Zend_Gdata_Spreadsheets_CellQuery) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + + return parent::getEntry($uri, 'Zend_Gdata_Spreadsheets_CellEntry'); + } + + /** + * Gets a list feed. + * + * @param mixed $location A ListQuery, WorksheetEntry or string URI specifying the feed location. + * @return ListFeed + */ + public function getListFeed($location) + { + if ($location instanceof Zend_Gdata_Spreadsheets_ListQuery) { + $uri = $location->getQueryUrl(); + } else if ($location instanceof Zend_Gdata_Spreadsheets_WorksheetEntry) { + $uri = $location->getLink(self::LIST_FEED_LINK_URI)->href; + } else { + $uri = $location; + } + + return parent::getFeed($uri, 'Zend_Gdata_Spreadsheets_ListFeed'); + } + + /** + * Gets a list entry. + * + * @param string $location A ListQuery or a URI specifying the entry location. + * @return ListEntry + */ + public function getListEntry($location) + { + if ($location instanceof Zend_Gdata_Spreadsheets_ListQuery) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + + return parent::getEntry($uri, 'Zend_Gdata_Spreadsheets_ListEntry'); + } + + /** + * Updates an existing cell. + * + * @param int $row The row containing the cell to update + * @param int $col The column containing the cell to update + * @param int $inputValue The new value for the cell + * @param string $key The key for the spreadsheet to be updated + * @param string $wkshtId (optional) The worksheet to be updated + * @return CellEntry The updated cell entry. + */ + public function updateCell($row, $col, $inputValue, $key, $wkshtId = 'default') + { + $cell = 'R'.$row.'C'.$col; + + $query = new Zend_Gdata_Spreadsheets_CellQuery(); + $query->setSpreadsheetKey($key); + $query->setWorksheetId($wkshtId); + $query->setCellId($cell); + + $entry = $this->getCellEntry($query); + $entry->setCell(new Zend_Gdata_Spreadsheets_Extension_Cell(null, $row, $col, $inputValue)); + $response = $entry->save(); + return $response; + } + + /** + * Inserts a new row with provided data. + * + * @param array $rowData An array of column header to row data + * @param string $key The key of the spreadsheet to modify + * @param string $wkshtId (optional) The worksheet to modify + * @return ListEntry The inserted row + */ + public function insertRow($rowData, $key, $wkshtId = 'default') + { + $newEntry = new Zend_Gdata_Spreadsheets_ListEntry(); + $newCustomArr = array(); + foreach ($rowData as $k => $v) { + $newCustom = new Zend_Gdata_Spreadsheets_Extension_Custom(); + $newCustom->setText($v)->setColumnName($k); + $newEntry->addCustom($newCustom); + } + + $query = new Zend_Gdata_Spreadsheets_ListQuery(); + $query->setSpreadsheetKey($key); + $query->setWorksheetId($wkshtId); + + $feed = $this->getListFeed($query); + $editLink = $feed->getLink('http://schemas.google.com/g/2005#post'); + + return $this->insertEntry($newEntry->saveXML(), $editLink->href, 'Zend_Gdata_Spreadsheets_ListEntry'); + } + + /** + * Updates an existing row with provided data. + * + * @param ListEntry $entry The row entry to update + * @param array $newRowData An array of column header to row data + */ + public function updateRow($entry, $newRowData) + { + $newCustomArr = array(); + foreach ($newRowData as $k => $v) { + $newCustom = new Zend_Gdata_Spreadsheets_Extension_Custom(); + $newCustom->setText($v)->setColumnName($k); + $newCustomArr[] = $newCustom; + } + $entry->setCustom($newCustomArr); + + return $entry->save(); + } + + /** + * Deletes an existing row . + * + * @param ListEntry $entry The row to delete + */ + public function deleteRow($entry) + { + $entry->delete(); + } + + /** + * Returns the content of all rows as an associative array + * + * @param mixed $location A ListQuery or string URI specifying the feed location. + * @return array An array of rows. Each element of the array is an associative array of data + */ + public function getSpreadsheetListFeedContents($location) + { + $listFeed = $this->getListFeed($location); + $listFeed = $this->retrieveAllEntriesForFeed($listFeed); + $spreadsheetContents = array(); + foreach ($listFeed as $listEntry) { + $rowContents = array(); + $customArray = $listEntry->getCustom(); + foreach ($customArray as $custom) { + $rowContents[$custom->getColumnName()] = $custom->getText(); + } + $spreadsheetContents[] = $rowContents; + } + return $spreadsheetContents; + } + + /** + * Returns the content of all cells as an associative array, indexed + * off the cell location (ie 'A1', 'D4', etc). Each element of + * the array is an associative array with a 'value' and a 'function'. + * Only non-empty cells are returned by default. 'range' is the + * value of the 'range' query parameter specified at: + * http://code.google.com/apis/spreadsheets/reference.html#cells_Parameters + * + * @param mixed $location A CellQuery, WorksheetEntry or a URL (w/o query string) specifying the feed location. + * @param string $range The range of cells to retrieve + * @param boolean $empty Whether to retrieve empty cells + * @return array An associative array of cells + */ + public function getSpreadsheetCellFeedContents($location, $range = null, $empty = false) + { + $cellQuery = null; + if ($location instanceof Zend_Gdata_Spreadsheets_CellQuery) { + $cellQuery = $location; + } else if ($location instanceof Zend_Gdata_Spreadsheets_WorksheetEntry) { + $url = $location->getLink(self::CELL_FEED_LINK_URI)->href; + $cellQuery = new Zend_Gdata_Spreadsheets_CellQuery($url); + } else { + $url = $location; + $cellQuery = new Zend_Gdata_Spreadsheets_CellQuery($url); + } + + if ($range != null) { + $cellQuery->setRange($range); + } + $cellQuery->setReturnEmpty($empty); + + $cellFeed = $this->getCellFeed($cellQuery); + $cellFeed = $this->retrieveAllEntriesForFeed($cellFeed); + $spreadsheetContents = array(); + foreach ($cellFeed as $cellEntry) { + $cellContents = array(); + $cell = $cellEntry->getCell(); + $cellContents['formula'] = $cell->getInputValue(); + $cellContents['value'] = $cell->getText(); + $spreadsheetContents[$cellEntry->getTitle()->getText()] = $cellContents; + } + return $spreadsheetContents; + } + + /** + * Alias for getSpreadsheetFeed + * + * @param mixed $location A DocumentQuery or a string URI specifying the feed location. + * @return Zend_Gdata_Spreadsheets_SpreadsheetFeed + */ + public function getSpreadsheets($location = null) + { + return $this->getSpreadsheetFeed($location = null); + } + +} diff --git a/libs/Zend/Gdata/Spreadsheets/CellEntry.php b/libs/Zend/Gdata/Spreadsheets/CellEntry.php new file mode 100644 index 0000000..d085707 --- /dev/null +++ b/libs/Zend/Gdata/Spreadsheets/CellEntry.php @@ -0,0 +1,103 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct($element); + } + + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_cell != null) { + $element->appendChild($this->_cell->getDOM($element->ownerDocument)); + } + return $element; + } + + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('gs') . ':' . 'cell'; + $cell = new Zend_Gdata_Spreadsheets_Extension_Cell(); + $cell->transferFromDOM($child); + $this->_cell = $cell; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + /** + * Gets the Cell element of this Cell Entry. + * @return Zend_Gdata_Spreadsheets_Extension_Cell + */ + public function getCell() + { + return $this->_cell; + } + + /** + * Sets the Cell element of this Cell Entry. + * @param $cell Zend_Gdata_Spreadsheets_Extension_Cell $cell + */ + public function setCell($cell) + { + $this->_cell = $cell; + return $this; + } + +} diff --git a/libs/Zend/Gdata/Spreadsheets/CellFeed.php b/libs/Zend/Gdata/Spreadsheets/CellFeed.php new file mode 100644 index 0000000..7c1e807 --- /dev/null +++ b/libs/Zend/Gdata/Spreadsheets/CellFeed.php @@ -0,0 +1,158 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct($element); + } + + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->rowCount != null) { + $element->appendChild($this->_rowCount->getDOM($element->ownerDocument)); + } + if ($this->colCount != null) { + $element->appendChild($this->_colCount->getDOM($element->ownerDocument)); + } + return $element; + } + + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('gs') . ':' . 'rowCount'; + $rowCount = new Zend_Gdata_Spreadsheets_Extension_RowCount(); + $rowCount->transferFromDOM($child); + $this->_rowCount = $rowCount; + break; + case $this->lookupNamespace('gs') . ':' . 'colCount'; + $colCount = new Zend_Gdata_Spreadsheets_Extension_ColCount(); + $colCount->transferFromDOM($child); + $this->_colCount = $colCount; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + /** + * Gets the row count for this feed. + * @return string The row count for the feed. + */ + public function getRowCount() + { + return $this->_rowCount; + } + + /** + * Gets the column count for this feed. + * @return string The column count for the feed. + */ + public function getColumnCount() + { + return $this->_colCount; + } + + /** + * Sets the row count for this feed. + * @param string $rowCount The new row count for the feed. + */ + public function setRowCount($rowCount) + { + $this->_rowCount = $rowCount; + return $this; + } + + /** + * Sets the column count for this feed. + * @param string $colCount The new column count for the feed. + */ + public function setColumnCount($colCount) + { + $this->_colCount = $colCount; + return $this; + } + +} diff --git a/libs/Zend/Gdata/Spreadsheets/CellQuery.php b/libs/Zend/Gdata/Spreadsheets/CellQuery.php new file mode 100644 index 0000000..24cd252 --- /dev/null +++ b/libs/Zend/Gdata/Spreadsheets/CellQuery.php @@ -0,0 +1,415 @@ +_spreadsheetKey = $value; + return $this; + } + + /** + * Gets the spreadsheet key for this query. + * + * @return string spreadsheet key + */ + public function getSpreadsheetKey() + { + return $this->_spreadsheetKey; + } + + /** + * Sets the worksheet id for this query. + * + * @param string $value + * @return Zend_Gdata_Spreadsheets_CellQuery Provides a fluent interface + */ + public function setWorksheetId($value) + { + $this->_worksheetId = $value; + return $this; + } + + /** + * Gets the worksheet id for this query. + * + * @return string worksheet id + */ + public function getWorksheetId() + { + return $this->_worksheetId; + } + + /** + * Sets the cell id for this query. + * + * @param string $value + * @return Zend_Gdata_Spreadsheets_CellQuery Provides a fluent interface + */ + public function setCellId($value) + { + $this->_cellId = $value; + return $this; + } + + /** + * Gets the cell id for this query. + * + * @return string cell id + */ + public function getCellId() + { + return $this->_cellId; + } + + /** + * Sets the projection for this query. + * + * @param string $value + * @return Zend_Gdata_Spreadsheets_CellQuery Provides a fluent interface + */ + public function setProjection($value) + { + $this->_projection = $value; + return $this; + } + + /** + * Sets the visibility for this query. + * + * @return Zend_Gdata_Spreadsheets_CellQuery Provides a fluent interface + */ + public function setVisibility($value) + { + $this->_visibility = $value; + return $this; + } + + /** + * Gets the projection for this query. + * + * @return string projection + */ + public function getProjection() + { + return $this->_projection; + } + + /** + * Gets the visibility for this query. + * + * @return string visibility + */ + public function getVisibility() + { + return $this->_visibility; + } + + /** + * Sets the min-row attribute for this query. + * + * @param string $value + * @return Zend_Gdata_Spreadsheets_CellQuery Provides a fluent interface + */ + public function setMinRow($value) + { + if ($value != null) { + $this->_params['min-row'] = $value; + } else { + unset($this->_params['min-row']); + } + return $this; + } + + /** + * Gets the min-row attribute for this query. + * + * @return string min-row + */ + public function getMinRow() + { + if (array_key_exists('min-row', $this->_params)) { + return $this->_params['min-row']; + } else { + return null; + } + } + + /** + * Sets the max-row attribute for this query. + * + * @param string $value + * @return Zend_Gdata_Spreadsheets_CellQuery Provides a fluent interface + */ + public function setMaxRow($value) + { + if ($value != null) { + $this->_params['max-row'] = $value; + } else { + unset($this->_params['max-row']); + } + return $this; + } + + /** + * Gets the max-row attribute for this query. + * + * @return string max-row + */ + public function getMaxRow() + { + if (array_key_exists('max-row', $this->_params)) { + return $this->_params['max-row']; + } else { + return null; + } + } + + /** + * Sets the min-col attribute for this query. + * + * @param string $value + * @return Zend_Gdata_Spreadsheets_CellQuery Provides a fluent interface + */ + public function setMinCol($value) + { + if ($value != null) { + $this->_params['min-col'] = $value; + } else { + unset($this->_params['min-col']); + } + return $this; + } + + /** + * Gets the min-col attribute for this query. + * + * @return string min-col + */ + public function getMinCol() + { + if (array_key_exists('min-col', $this->_params)) { + return $this->_params['min-col']; + } else { + return null; + } + } + + /** + * Sets the max-col attribute for this query. + * + * @param string $value + * @return Zend_Gdata_Spreadsheets_CellQuery Provides a fluent interface + */ + public function setMaxCol($value) + { + if ($value != null) { + $this->_params['max-col'] = $value; + } else { + unset($this->_params['max-col']); + } + return $this; + } + + /** + * Gets the max-col attribute for this query. + * + * @return string max-col + */ + public function getMaxCol() + { + if (array_key_exists('max-col', $this->_params)) { + return $this->_params['max-col']; + } else { + return null; + } + } + + /** + * Sets the range attribute for this query. + * + * @param string $value + * @return Zend_Gdata_Spreadsheets_CellQuery Provides a fluent interface + */ + public function setRange($value) + { + if ($value != null) { + $this->_params['range'] = $value; + } else { + unset($this->_params['range']); + } + return $this; + } + + /** + * Gets the range attribute for this query. + * + * @return string range + */ + public function getRange() + { + if (array_key_exists('range', $this->_params)) { + return $this->_params['range']; + } else { + return null; + } + } + + /** + * Sets the return-empty attribute for this query. + * + * @param mixed $value String or bool value for whether to return empty cells + * @return Zend_Gdata_Spreadsheets_CellQuery Provides a fluent interface + */ + public function setReturnEmpty($value) + { + if (is_bool($value)) { + $this->_params['return-empty'] = ($value?'true':'false'); + } else if ($value != null) { + $this->_params['return-empty'] = $value; + } else { + unset($this->_params['return-empty']); + } + return $this; + } + + /** + * Gets the return-empty attribute for this query. + * + * @return string return-empty + */ + public function getReturnEmpty() + { + if (array_key_exists('return-empty', $this->_params)) { + return $this->_params['return-empty']; + } else { + return null; + } + } + + /** + * Gets the full query URL for this query. + * + * @return string url + */ + public function getQueryUrl() + { + if ($this->_url == null) { + $uri = $this->_defaultFeedUri; + + if ($this->_spreadsheetKey != null) { + $uri .= '/'.$this->_spreadsheetKey; + } else { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception('A spreadsheet key must be provided for cell queries.'); + } + + if ($this->_worksheetId != null) { + $uri .= '/'.$this->_worksheetId; + } else { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception('A worksheet id must be provided for cell queries.'); + } + + if ($this->_visibility != null) { + $uri .= '/'.$this->_visibility; + } else { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception('A visibility must be provided for cell queries.'); + } + + if ($this->_projection != null) { + $uri .= '/'.$this->_projection; + } else { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception('A projection must be provided for cell queries.'); + } + + if ($this->_cellId != null) { + $uri .= '/'.$this->_cellId; + } + } else { + $uri = $this->_url; + } + + $uri .= $this->getQueryString(); + return $uri; + } + + /** + * Gets the attribute query string for this query. + * + * @return string query string + */ + public function getQueryString() + { + return parent::getQueryString(); + } + +} diff --git a/libs/Zend/Gdata/Spreadsheets/DocumentQuery.php b/libs/Zend/Gdata/Spreadsheets/DocumentQuery.php new file mode 100644 index 0000000..7a47fe5 --- /dev/null +++ b/libs/Zend/Gdata/Spreadsheets/DocumentQuery.php @@ -0,0 +1,286 @@ +_spreadsheetKey = $value; + return $this; + } + + /** + * Gets the spreadsheet key for this query. + * @return string spreadsheet key + */ + public function getSpreadsheetKey() + { + return $this->_spreadsheetKey; + } + + /** + * Sets the worksheet id for this query. + * @param string $value + * @return Zend_Gdata_Spreadsheets_CellQuery Provides a fluent interface + */ + public function setWorksheetId($value) + { + $this->_worksheetId = $value; + return $this; + } + + /** + * Gets the worksheet id for this query. + * @return string worksheet id + */ + public function getWorksheetId() + { + return $this->_worksheetId; + } + + /** + * Sets the document type for this query. + * @param string $value spreadsheets or worksheets + * @return Zend_Gdata_Spreadsheets_DocumentQuery Provides a fluent interface + */ + public function setDocumentType($value) + { + $this->_documentType = $value; + return $this; + } + + /** + * Gets the document type for this query. + * @return string document type + */ + public function getDocumentType() + { + return $this->_documentType; + } + + /** + * Sets the projection for this query. + * @param string $value + * @return Zend_Gdata_Spreadsheets_DocumentQuery Provides a fluent interface + */ + public function setProjection($value) + { + $this->_projection = $value; + return $this; + } + + /** + * Sets the visibility for this query. + * @return Zend_Gdata_Spreadsheets_DocumentQuery Provides a fluent interface + */ + public function setVisibility($value) + { + $this->_visibility = $value; + return $this; + } + + /** + * Gets the projection for this query. + * @return string projection + */ + public function getProjection() + { + return $this->_projection; + } + + /** + * Gets the visibility for this query. + * @return string visibility + */ + public function getVisibility() + { + return $this->_visibility; + } + + /** + * Sets the title attribute for this query. + * @param string $value + * @return Zend_Gdata_Spreadsheets_DocumentQuery Provides a fluent interface + */ + public function setTitle($value) + { + if ($value != null) { + $this->_params['title'] = $value; + } else { + unset($this->_params['title']); + } + return $this; + } + + /** + * Sets the title-exact attribute for this query. + * @param string $value + * @return Zend_Gdata_Spreadsheets_DocumentQuery Provides a fluent interface + */ + public function setTitleExact($value) + { + if ($value != null) { + $this->_params['title-exact'] = $value; + } else { + unset($this->_params['title-exact']); + } + return $this; + } + + /** + * Gets the title attribute for this query. + * @return string title + */ + public function getTitle() + { + if (array_key_exists('title', $this->_params)) { + return $this->_params['title']; + } else { + return null; + } + } + + /** + * Gets the title-exact attribute for this query. + * @return string title-exact + */ + public function getTitleExact() + { + if (array_key_exists('title-exact', $this->_params)) { + return $this->_params['title-exact']; + } else { + return null; + } + } + + private function appendVisibilityProjection() + { + $uri = ''; + + if ($this->_visibility != null) { + $uri .= '/'.$this->_visibility; + } else { + 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'; + throw new Zend_Gdata_App_Exception('A projection must be provided for document queries.'); + } + + return $uri; + } + + + /** + * Gets the full query URL for this query. + * @return string url + */ + public function getQueryUrl() + { + $uri = $this->_defaultFeedUri; + + if ($this->_documentType != null) { + $uri .= '/'.$this->_documentType; + } else { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception('A document type must be provided for document queries.'); + } + + if ($this->_documentType == 'spreadsheets') { + $uri .= $this->appendVisibilityProjection(); + if ($this->_spreadsheetKey != null) { + $uri .= '/'.$this->_spreadsheetKey; + } + } else if ($this->_documentType == 'worksheets') { + if ($this->_spreadsheetKey != null) { + $uri .= '/'.$this->_spreadsheetKey; + } else { + 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(); + if ($this->_worksheetId != null) { + $uri .= '/'.$this->_worksheetId; + } + } + + $uri .= $this->getQueryString(); + return $uri; + } + + /** + * Gets the attribute query string for this query. + * @return string query string + */ + public function getQueryString() + { + return parent::getQueryString(); + } + +} diff --git a/libs/Zend/Gdata/Spreadsheets/Extension/Cell.php b/libs/Zend/Gdata/Spreadsheets/Extension/Cell.php new file mode 100644 index 0000000..1b99a60 --- /dev/null +++ b/libs/Zend/Gdata/Spreadsheets/Extension/Cell.php @@ -0,0 +1,201 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->_text = $text; + $this->_row = $row; + $this->_col = $col; + $this->_inputValue = $inputValue; + $this->_numericValue = $numericValue; + } + + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + $element->setAttribute('row', $this->_row); + $element->setAttribute('col', $this->_col); + if ($this->_inputValue) $element->setAttribute('inputValue', $this->_inputValue); + if ($this->_numericValue) $element->setAttribute('numericValue', $this->_numericValue); + return $element; + } + + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'row': + $this->_row = $attribute->nodeValue; + break; + case 'col': + $this->_col = $attribute->nodeValue; + break; + case 'inputValue': + $this->_inputValue = $attribute->nodeValue; + break; + case 'numericValue': + $this->_numericValue = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Gets the row attribute of the Cell element. + * @return string Row of the Cell. + */ + public function getRow() + { + return $this->_row; + } + + /** + * Gets the column attribute of the Cell element. + * @return string Column of the Cell. + */ + public function getColumn() + { + return $this->_col; + } + + /** + * Gets the input value attribute of the Cell element. + * @return string Input value of the Cell. + */ + public function getInputValue() + { + return $this->_inputValue; + } + + /** + * Gets the numeric value attribute of the Cell element. + * @return string Numeric value of the Cell. + */ + public function getNumericValue() + { + return $this->_numericValue; + } + + /** + * Sets the row attribute of the Cell element. + * @param string $row New row of the Cell. + */ + public function setRow($row) + { + $this->_row = $row; + return $this; + } + + /** + * Sets the column attribute of the Cell element. + * @param string $col New column of the Cell. + */ + public function setColumn($col) + { + $this->_col = $col; + return $this; + } + + /** + * Sets the input value attribute of the Cell element. + * @param string $inputValue New input value of the Cell. + */ + public function setInputValue($inputValue) + { + $this->_inputValue = $inputValue; + return $this; + } + + /** + * Sets the numeric value attribute of the Cell element. + * @param string $numericValue New numeric value of the Cell. + */ + public function setNumericValue($numericValue) + { + $this->_numericValue = $numericValue; + } + +} diff --git a/libs/Zend/Gdata/Spreadsheets/Extension/ColCount.php b/libs/Zend/Gdata/Spreadsheets/Extension/ColCount.php new file mode 100644 index 0000000..37bcc26 --- /dev/null +++ b/libs/Zend/Gdata/Spreadsheets/Extension/ColCount.php @@ -0,0 +1,59 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->_text = $text; + } +} diff --git a/libs/Zend/Gdata/Spreadsheets/Extension/Custom.php b/libs/Zend/Gdata/Spreadsheets/Extension/Custom.php new file mode 100644 index 0000000..2e70b81 --- /dev/null +++ b/libs/Zend/Gdata/Spreadsheets/Extension/Custom.php @@ -0,0 +1,100 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->_text = $value; + $this->_rootElement = $column; + } + + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + return $element; + } + + /** + * Transfers each child and attribute into member variables. + * This is called when XML is received over the wire and the data + * model needs to be built to represent this XML. + * + * @param DOMNode $node The DOMNode that represents this object's data + */ + public function transferFromDOM($node) + { + parent::transferFromDOM($node); + $this->_rootElement = $node->localName; + } + + /** + * Sets the column/tag name of the element. + * @param string $column The new column name. + */ + public function setColumnName($column) + { + $this->_rootElement = $column; + return $this; + } + + /** + * Gets the column name of the element + * @return string The column name. + */ + public function getColumnName() + { + return $this->_rootElement; + } + +} diff --git a/libs/Zend/Gdata/Spreadsheets/Extension/RowCount.php b/libs/Zend/Gdata/Spreadsheets/Extension/RowCount.php new file mode 100644 index 0000000..1adb538 --- /dev/null +++ b/libs/Zend/Gdata/Spreadsheets/Extension/RowCount.php @@ -0,0 +1,60 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->_text = $text; + } + +} diff --git a/libs/Zend/Gdata/Spreadsheets/ListEntry.php b/libs/Zend/Gdata/Spreadsheets/ListEntry.php new file mode 100644 index 0000000..cb08a6f --- /dev/null +++ b/libs/Zend/Gdata/Spreadsheets/ListEntry.php @@ -0,0 +1,208 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct($element); + } + + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if (!empty($this->_custom)) { + foreach ($this->_custom as $custom) { + $element->appendChild($custom->getDOM($element->ownerDocument)); + } + } + return $element; + } + + protected function takeChildFromDOM($child) + { + switch ($child->namespaceURI) { + case $this->lookupNamespace('gsx'); + $custom = new Zend_Gdata_Spreadsheets_Extension_Custom($child->localName); + $custom->transferFromDOM($child); + $this->addCustom($custom); + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + /** + * Gets the row elements contained by this list entry. + * @return array The custom row elements in this list entry + */ + public function getCustom() + { + return $this->_custom; + } + + /** + * Gets a single row element contained by this list entry using its name. + * @param string $name The name of a custom element to return. If null + * or not defined, an array containing all custom elements + * indexed by name will be returned. + * @return mixed If a name is specified, the + * Zend_Gdata_Spreadsheets_Extension_Custom element requested, + * is returned or null if not found. Otherwise, an array of all + * Zend_Gdata_Spreadsheets_Extension_Custom elements is returned + * indexed by name. + */ + public function getCustomByName($name = null) + { + if ($name === null) { + return $this->_customByName; + } else { + if (array_key_exists($name, $this->customByName)) { + return $this->_customByName[$name]; + } else { + return null; + } + } + } + + /** + * Sets the row elements contained by this list entry. If any + * custom row elements were previously stored, they will be overwritten. + * @param array $custom The custom row elements to be contained in this + * list entry. + * @return Zend_Gdata_Spreadsheets_ListEntry Provides a fluent interface. + */ + public function setCustom($custom) + { + $this->_custom = array(); + foreach ($custom as $c) { + $this->addCustom($c); + } + return $this; + } + + /** + * Add an individual custom row element to this list entry. + * @param Zend_Gdata_Spreadsheets_Extension_Custom $custom The custom + * element to be added. + * @return Zend_Gdata_Spreadsheets_ListEntry Provides a fluent interface. + */ + public function addCustom($custom) + { + $this->_custom[] = $custom; + $this->_customByName[$custom->getColumnName()] = $custom; + return $this; + } + + /** + * Remove an individual row element from this list entry by index. This + * will cause the array to be re-indexed. + * @param int $index The index of the custom element to be deleted. + * @return Zend_Gdata_Spreadsheets_ListEntry Provides a fluent interface. + * @throws Zend_Gdata_App_InvalidArgumentException + */ + public function removeCustom($index) + { + if (array_key_exists($index, $this->_custom)) { + $element = $this->_custom[$index]; + // Remove element + unset($this->_custom[$index]); + // Re-index the array + $this->_custom = array_values($this->_custom); + // Be sure to delete form both arrays! + $key = array_search($element, $this->_customByName); + unset($this->_customByName[$key]); + } else { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'Element does not exist.'); + } + return $this; + } + + /** + * Remove an individual row element from this list entry by name. + * @param string $name The name of the custom element to be deleted. + * @return Zend_Gdata_Spreadsheets_ListEntry Provides a fluent interface. + * @throws Zend_Gdata_App_InvalidArgumentException + */ + public function removeCustomByName($name) + { + if (array_key_exists($name, $this->_customByName)) { + $element = $this->_customByName[$name]; + // Remove element + unset($this->_customByName[$name]); + // Be sure to delete from both arrays! + $key = array_search($element, $this->_custom); + unset($this->_custom[$key]); + } else { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'Element does not exist.'); + } + return $this; + } + +} diff --git a/libs/Zend/Gdata/Spreadsheets/ListFeed.php b/libs/Zend/Gdata/Spreadsheets/ListFeed.php new file mode 100644 index 0000000..dcfe3de --- /dev/null +++ b/libs/Zend/Gdata/Spreadsheets/ListFeed.php @@ -0,0 +1,64 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct($element); + } + +} diff --git a/libs/Zend/Gdata/Spreadsheets/ListQuery.php b/libs/Zend/Gdata/Spreadsheets/ListQuery.php new file mode 100644 index 0000000..0a10a90 --- /dev/null +++ b/libs/Zend/Gdata/Spreadsheets/ListQuery.php @@ -0,0 +1,303 @@ +_spreadsheetKey = $value; + return $this; + } + + /** + * Gets the spreadsheet key for the query. + * @return string spreadsheet key + */ + public function getSpreadsheetKey() + { + return $this->_spreadsheetKey; + } + + /** + * Sets the worksheet id for the query. + * @param string $value + * @return Zend_Gdata_Spreadsheets_CellQuery Provides a fluent interface + */ + public function setWorksheetId($value) + { + $this->_worksheetId = $value; + return $this; + } + + /** + * Gets the worksheet id for the query. + * @return string worksheet id + */ + public function getWorksheetId() + { + return $this->_worksheetId; + } + + /** + * Sets the row id for the query. + * @param string $value row id + * @return Zend_Gdata_Spreadsheets_CellQuery Provides a fluent interface + */ + public function setRowId($value) + { + $this->_rowId = $value; + return $this; + } + + /** + * Gets the row id for the query. + * @return string row id + */ + public function getRowId() + { + return $this->_rowId; + } + + /** + * Sets the projection for the query. + * @param string $value Projection + * @return Zend_Gdata_Spreadsheets_ListQuery Provides a fluent interface + */ + public function setProjection($value) + { + $this->_projection = $value; + return $this; + } + + /** + * Sets the visibility for this query. + * @param string $value visibility + * @return Zend_Gdata_Spreadsheets_ListQuery Provides a fluent interface + */ + public function setVisibility($value) + { + $this->_visibility = $value; + return $this; + } + + /** + * Gets the projection for this query. + * @return string projection + */ + public function getProjection() + { + return $this->_projection; + } + + /** + * Gets the visibility for this query. + * @return string visibility + */ + public function getVisibility() + { + return $this->_visibility; + } + + /** + * Sets the spreadsheet key for this query. + * @param string $value + * @return Zend_Gdata_Spreadsheets_DocumentQuery Provides a fluent interface + */ + public function setSpreadsheetQuery($value) + { + if ($value != null) { + $this->_params['sq'] = $value; + } else { + unset($this->_params['sq']); + } + return $this; + } + + /** + * Gets the spreadsheet key for this query. + * @return string spreadsheet query + */ + public function getSpreadsheetQuery() + { + if (array_key_exists('sq', $this->_params)) { + return $this->_params['sq']; + } else { + return null; + } + } + + /** + * Sets the orderby attribute for this query. + * @param string $value + * @return Zend_Gdata_Spreadsheets_DocumentQuery Provides a fluent interface + */ + public function setOrderBy($value) + { + if ($value != null) { + $this->_params['orderby'] = $value; + } else { + unset($this->_params['orderby']); + } + return $this; + } + + /** + * Gets the orderby attribute for this query. + * @return string orderby + */ + public function getOrderBy() + { + if (array_key_exists('orderby', $this->_params)) { + return $this->_params['orderby']; + } else { + return null; + } + } + + /** + * Sets the reverse attribute for this query. + * @param string $value + * @return Zend_Gdata_Spreadsheets_DocumentQuery Provides a fluent interface + */ + public function setReverse($value) + { + if ($value != null) { + $this->_params['reverse'] = $value; + } else { + unset($this->_params['reverse']); + } + return $this; + } + + /** + * Gets the reverse attribute for this query. + * @return string reverse + */ + public function getReverse() + { + + + if (array_key_exists('reverse', $this->_params)) { + return $this->_params['reverse']; + } else { + return null; + } + } + + /** + * Gets the full query URL for this query. + * @return string url + */ + public function getQueryUrl() + { + + $uri = $this->_defaultFeedUri; + + if ($this->_spreadsheetKey != null) { + $uri .= '/'.$this->_spreadsheetKey; + } else { + 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'; + 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'; + 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'; + throw new Zend_Gdata_App_Exception('A projection must be provided for list queries.'); + } + + if ($this->_rowId != null) { + $uri .= '/'.$this->_rowId; + } + + $uri .= $this->getQueryString(); + return $uri; + } + + /** + * Gets the attribute query string for this query. + * @return string query string + */ + public function getQueryString() + { + return parent::getQueryString(); + } + +} diff --git a/libs/Zend/Gdata/Spreadsheets/SpreadsheetEntry.php b/libs/Zend/Gdata/Spreadsheets/SpreadsheetEntry.php new file mode 100644 index 0000000..9220a8a --- /dev/null +++ b/libs/Zend/Gdata/Spreadsheets/SpreadsheetEntry.php @@ -0,0 +1,64 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct($element); + } + + /** + * Returns the worksheets in this spreadsheet + * + * @return Zend_Gdata_Spreadsheets_WorksheetFeed The worksheets + */ + public function getWorksheets() + { + $service = new Zend_Gdata_Spreadsheets($this->getHttpClient()); + return $service->getWorksheetFeed($this); + } + +} diff --git a/libs/Zend/Gdata/Spreadsheets/SpreadsheetFeed.php b/libs/Zend/Gdata/Spreadsheets/SpreadsheetFeed.php new file mode 100644 index 0000000..3505cda --- /dev/null +++ b/libs/Zend/Gdata/Spreadsheets/SpreadsheetFeed.php @@ -0,0 +1,64 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct($element); + } + +} diff --git a/libs/Zend/Gdata/Spreadsheets/WorksheetEntry.php b/libs/Zend/Gdata/Spreadsheets/WorksheetEntry.php new file mode 100644 index 0000000..505ef6a --- /dev/null +++ b/libs/Zend/Gdata/Spreadsheets/WorksheetEntry.php @@ -0,0 +1,187 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct($element); + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_rowCount != null) { + $element->appendChild($this->_rowCount->getDOM($element->ownerDocument)); + } + if ($this->_colCount != null) { + $element->appendChild($this->_colCount->getDOM($element->ownerDocument)); + } + return $element; + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them in the $_entry array based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('gs') . ':' . 'rowCount'; + $rowCount = new Zend_Gdata_Spreadsheets_Extension_RowCount(); + $rowCount->transferFromDOM($child); + $this->_rowCount = $rowCount; + break; + case $this->lookupNamespace('gs') . ':' . 'colCount'; + $colCount = new Zend_Gdata_Spreadsheets_Extension_ColCount(); + $colCount->transferFromDOM($child); + $this->_colCount = $colCount; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + + /** + * Gets the row count for this entry. + * + * @return string The row count for the entry. + */ + public function getRowCount() + { + return $this->_rowCount; + } + + /** + * Gets the column count for this entry. + * + * @return string The column count for the entry. + */ + public function getColumnCount() + { + return $this->_colCount; + } + + /** + * Sets the row count for this entry. + * + * @param string $rowCount The new row count for the entry. + */ + public function setRowCount($rowCount) + { + $this->_rowCount = $rowCount; + return $this; + } + + /** + * Sets the column count for this entry. + * + * @param string $colCount The new column count for the entry. + */ + public function setColumnCount($colCount) + { + $this->_colCount = $colCount; + return $this; + } + + /** + * Returns the content of all rows as an associative array + * + * @return array An array of rows. Each element of the array is an associative array of data + */ + public function getContentsAsRows() + { + $service = new Zend_Gdata_Spreadsheets($this->getHttpClient()); + return $service->getSpreadsheetListFeedContents($this); + } + + /** + * Returns the content of all cells as an associative array, indexed + * off the cell location (ie 'A1', 'D4', etc). Each element of + * the array is an associative array with a 'value' and a 'function'. + * Only non-empty cells are returned by default. 'range' is the + * value of the 'range' query parameter specified at: + * http://code.google.com/apis/spreadsheets/reference.html#cells_Parameters + * + * @param string $range The range of cells to retrieve + * @param boolean $empty Whether to retrieve empty cells + * @return array An associative array of cells + */ + public function getContentsAsCells($range = null, $empty = false) + { + $service = new Zend_Gdata_Spreadsheets($this->getHttpClient()); + return $service->getSpreadsheetCellFeedContents($this, $range, $empty); + } + +} diff --git a/libs/Zend/Gdata/Spreadsheets/WorksheetFeed.php b/libs/Zend/Gdata/Spreadsheets/WorksheetFeed.php new file mode 100644 index 0000000..96ea9c0 --- /dev/null +++ b/libs/Zend/Gdata/Spreadsheets/WorksheetFeed.php @@ -0,0 +1,64 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct($element); + } + + /** + * The classname for individual feed elements. + * + * @var string + */ + protected $_entryClassName = 'Zend_Gdata_Spreadsheets_WorksheetEntry'; + + /** + * The classname for the feed. + * + * @var string + */ + protected $_feedClassName = 'Zend_Gdata_Spreadsheets_WorksheetFeed'; + +} diff --git a/libs/Zend/Gdata/YouTube.php b/libs/Zend/Gdata/YouTube.php new file mode 100644 index 0000000..afd63e0 --- /dev/null +++ b/libs/Zend/Gdata/YouTube.php @@ -0,0 +1,590 @@ + 'http://gdata.youtube.com/schemas/2007', + 'georss' => 'http://www.georss.org/georss', + 'gml' => 'http://www.opengis.net/gml', + 'media' => 'http://search.yahoo.com/mrss/', + 'app' => 'http://purl.org/atom/app#'); + + /** + * Create Zend_Gdata_YouTube object + * + * @param Zend_Http_Client $client (optional) The HTTP client to use when + * when communicating with the Google servers. + * @param string $applicationId The identity of the app in the form of Company-AppName-Version + * @param string $clientId The clientId issued by the YouTube dashboard + * @param string $developerKey The developerKey issued by the YouTube dashboard + */ + public function __construct($client = null, $applicationId = 'MyCompany-MyApp-1.0', $clientId = null, $developerKey = null) + { + $this->registerPackage('Zend_Gdata_YouTube'); + $this->registerPackage('Zend_Gdata_YouTube_Extension'); + $this->registerPackage('Zend_Gdata_Media'); + $this->registerPackage('Zend_Gdata_Media_Extension'); + + + // NOTE This constructor no longer calls the parent constructor + $this->setHttpClient($client, $applicationId, $clientId, $developerKey); + } + + /** + * Set the Zend_Http_Client object used for communication + * + * @param Zend_Http_Client $client The client to use for communication + * @throws Zend_Gdata_App_HttpException + * @return Zend_Gdata_App Provides a fluent interface + */ + public function setHttpClient($client, $applicationId = 'MyCompany-MyApp-1.0', $clientId = null, $developerKey = null) + { + if ($client === null) { + $client = new Zend_Http_Client(); + } + if (!$client instanceof Zend_Http_Client) { + require_once 'Zend/Gdata/App/HttpException.php'; + throw new Zend_Gdata_App_HttpException('Argument is not an instance of Zend_Http_Client.'); + } + + if ($clientId != null) { + $client->setHeaders('X-GData-Client', $clientId); + } + + if ($developerKey != null) { + $client->setHeaders('X-GData-Key', 'key='. $developerKey); + } + + return parent::setHttpClient($client, $applicationId); + } + + /** + * Retrieves a feed of videos. + * + * @param mixed $location (optional) The URL to query or a + * Zend_Gdata_Query object from which a URL can be determined + * @return Zend_Gdata_YouTube_VideoFeed The feed of videos found at the + * specified URL. + */ + public function getVideoFeed($location = null) + { + if ($location == null) { + $uri = self::VIDEO_URI; + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getFeed($uri, 'Zend_Gdata_YouTube_VideoFeed'); + } + + /** + * Retrieves a specific video entry. + * + * @param mixed $videoId The ID of the video to retrieve. + * @param mixed $location (optional) The URL to query or a + * Zend_Gdata_Query object from which a URL can be determined. + * @param boolean $fullEntry (optional) Retrieve the full metadata for the + * entry. Only possible if entry belongs to currently authenticated + * user. An exception will be thrown otherwise. + * @throws Zend_Gdata_App_HttpException + * @return Zend_Gdata_YouTube_VideoEntry The video entry found at the + * specified URL. + */ + public function getVideoEntry($videoId = null, $location = null, + $fullEntry = false) + { + if ($videoId !== null) { + if ($fullEntry) { + return $this->getFullVideoEntry($videoId); + } else { + $uri = self::VIDEO_URI . "/" . $videoId; + } + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getEntry($uri, 'Zend_Gdata_YouTube_VideoEntry'); + } + + /** + * Retrieves a video entry from the user's upload feed. + * + * @param mixed $videoID The ID of the video to retrieve. + * @throws Zend_Gdata_App_HttpException + * @return Zend_Gdata_YouTube_VideoEntry|null The video entry to be + * retrieved, or null if it was not found or the user requesting it + * did not have the appropriate permissions. + */ + public function getFullVideoEntry($videoId) + { + $uri = self::USER_URI . "/default/" . + self::UPLOADS_URI_SUFFIX . "/$videoId"; + return parent::getEntry($uri, 'Zend_Gdata_YouTube_VideoEntry'); + } + + /** + * Retrieves a feed of videos related to the specified video ID. + * + * @param string $videoId The videoId of interest + * @param mixed $location (optional) The URL to query or a + * Zend_Gdata_Query object from which a URL can be determined + * @return Zend_Gdata_YouTube_VideoFeed The feed of videos found at the + * specified URL. + */ + public function getRelatedVideoFeed($videoId = null, $location = null) + { + if ($videoId !== null) { + $uri = self::VIDEO_URI . "/" . $videoId . "/" . self::RELATED_URI_SUFFIX; + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getFeed($uri, 'Zend_Gdata_YouTube_VideoFeed'); + } + + /** + * Retrieves a feed of video responses related to the specified video ID. + * + * @param string $videoId The videoId of interest + * @param mixed $location (optional) The URL to query or a + * Zend_Gdata_Query object from which a URL can be determined + * @return Zend_Gdata_YouTube_VideoFeed The feed of videos found at the + * specified URL. + */ + public function getVideoResponseFeed($videoId = null, $location = null) + { + if ($videoId !== null) { + $uri = self::VIDEO_URI . "/" . $videoId . "/" . self::RESPONSES_URI_SUFFIX; + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getFeed($uri, 'Zend_Gdata_YouTube_VideoFeed'); + } + + /** + * Retrieves a feed of comments related to the specified video ID. + * + * @param string $videoId The videoId of interest + * @param mixed $location (optional) The URL to query or a + * Zend_Gdata_Query object from which a URL can be determined + * @return Zend_Gdata_YouTube_CommentFeed The feed of videos found at the + * specified URL. + */ + public function getVideoCommentFeed($videoId = null, $location = null) + { + if ($videoId !== null) { + $uri = self::VIDEO_URI . "/" . $videoId . "/comments"; + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getFeed($uri, 'Zend_Gdata_YouTube_CommentFeed'); + } + + /** + * Retrieves a feed of comments related to the specified video ID. + * + * @param mixed $location (optional) The URL to query or a + * Zend_Gdata_Query object from which a URL can be determined + * @return Zend_Gdata_YouTube_CommentFeed The feed of videos found at the + * specified URL. + */ + public function getTopRatedVideoFeed($location = null) + { + if ($location == null) { + $uri = self::STANDARD_TOP_RATED_URI; + } else if ($location instanceof Zend_Gdata_Query) { + if ($location instanceof Zend_Gdata_YouTube_VideoQuery) { + if (!isset($location->url)) { + $location->setFeedType('top rated'); + } + } + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getFeed($uri, 'Zend_Gdata_YouTube_VideoFeed'); + } + + + /** + * Retrieves a feed of the most viewed videos. + * + * @param mixed $location (optional) The URL to query or a + * Zend_Gdata_Query object from which a URL can be determined + * @return Zend_Gdata_YouTube_VideoFeed The feed of videos found at the + * specified URL. + */ + public function getMostViewedVideoFeed($location = null) + { + if ($location == null) { + $uri = self::STANDARD_MOST_VIEWED_URI; + } else if ($location instanceof Zend_Gdata_Query) { + if ($location instanceof Zend_Gdata_YouTube_VideoQuery) { + if (!isset($location->url)) { + $location->setFeedType('most viewed'); + } + } + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getFeed($uri, 'Zend_Gdata_YouTube_VideoFeed'); + } + + /** + * Retrieves a feed of recently featured videos. + * + * @param mixed $location (optional) The URL to query or a + * Zend_Gdata_Query object from which a URL can be determined + * @return Zend_Gdata_YouTube_VideoFeed The feed of videos found at the + * specified URL. + */ + public function getRecentlyFeaturedVideoFeed($location = null) + { + if ($location == null) { + $uri = self::STANDARD_RECENTLY_FEATURED_URI; + } else if ($location instanceof Zend_Gdata_Query) { + if ($location instanceof Zend_Gdata_YouTube_VideoQuery) { + if (!isset($location->url)) { + $location->setFeedType('recently featured'); + } + } + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getFeed($uri, 'Zend_Gdata_YouTube_VideoFeed'); + } + + /** + * Retrieves a feed of videos recently featured for mobile devices. + * These videos will have RTSP links in the $entry->mediaGroup->content + * + * @param mixed $location (optional) The URL to query or a + * Zend_Gdata_Query object from which a URL can be determined + * @return Zend_Gdata_YouTube_VideoFeed The feed of videos found at the + * specified URL. + */ + public function getWatchOnMobileVideoFeed($location = null) + { + if ($location == null) { + $uri = self::STANDARD_WATCH_ON_MOBILE_URI; + } else if ($location instanceof Zend_Gdata_Query) { + if ($location instanceof Zend_Gdata_YouTube_VideoQuery) { + if (!isset($location->url)) { + $location->setFeedType('watch on mobile'); + } + } + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getFeed($uri, 'Zend_Gdata_YouTube_VideoFeed'); + } + + /** + * Retrieves a feed which lists a user's playlist + * + * @param string $user (optional) The username of interest + * @param mixed $location (optional) The URL to query or a + * Zend_Gdata_Query object from which a URL can be determined + * @return Zend_Gdata_YouTube_PlaylistListFeed The feed of playlists + */ + public function getPlaylistListFeed($user = null, $location = null) + { + if ($user !== null) { + $uri = self::USER_URI . '/' . $user . '/playlists'; + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getFeed($uri, 'Zend_Gdata_YouTube_PlaylistListFeed'); + } + + /** + * Retrieves a feed of videos in a particular playlist + * + * @param mixed $location (optional) The URL to query or a + * Zend_Gdata_Query object from which a URL can be determined + * @return Zend_Gdata_YouTube_PlaylistVideoFeed The feed of videos found at + * the specified URL. + */ + public function getPlaylistVideoFeed($location) + { + if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getFeed($uri, 'Zend_Gdata_YouTube_PlaylistVideoFeed'); + } + + /** + * Retrieves a feed of a user's subscriptions + * + * @param string $user (optional) The username of interest + * @param mixed $location (optional) The URL to query or a + * Zend_Gdata_Query object from which a URL can be determined + * @return Zend_Gdata_YouTube_SubscriptionListFeed The feed of subscriptions + */ + public function getSubscriptionFeed($user = null, $location = null) + { + if ($user !== null) { + $uri = self::USER_URI . '/' . $user . '/subscriptions'; + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getFeed($uri, 'Zend_Gdata_YouTube_SubscriptionFeed'); + } + + /** + * Retrieves a feed of a user's contacts + * + * @param string $user (optional) The username of interest + * @param mixed $location (optional) The URL to query or a + * Zend_Gdata_Query object from which a URL can be determined + * @return Zend_Gdata_YouTube_ContactFeed The feed of contacts + */ + public function getContactFeed($user = null, $location = null) + { + if ($user !== null) { + $uri = self::USER_URI . '/' . $user . '/contacts'; + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getFeed($uri, 'Zend_Gdata_YouTube_ContactFeed'); + } + + /** + * Retrieves a user's uploads + * + * @param string $user (optional) The username of interest + * @param mixed $location (optional) The URL to query or a + * Zend_Gdata_Query object from which a URL can be determined + * @return Zend_Gdata_YouTube_VideoFeed The videos uploaded by the user + */ + public function getUserUploads($user = null, $location = null) + { + if ($user !== null) { + $uri = self::USER_URI . '/' . $user . '/' . + self::UPLOADS_URI_SUFFIX; + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getFeed($uri, 'Zend_Gdata_YouTube_VideoFeed'); + } + + /** + * Retrieves a user's favorites + * + * @param string $user (optional) The username of interest + * @param mixed $location (optional) The URL to query or a + * Zend_Gdata_Query object from which a URL can be determined + * @return Zend_Gdata_YouTube_VideoFeed The videos favorited by the user + */ + public function getUserFavorites($user = null, $location = null) + { + if ($user !== null) { + $uri = self::USER_URI . '/' . $user . '/' . + self::FAVORITES_URI_SUFFIX; + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getFeed($uri, 'Zend_Gdata_YouTube_VideoFeed'); + } + + /** + * Retrieves a user's profile as an entry + * + * @param string $user (optional) The username of interest + * @param mixed $location (optional) The URL to query or a + * Zend_Gdata_Query object from which a URL can be determined + * @return Zend_Gdata_YouTube_UserProfileEntry The user profile entry + */ + public function getUserProfile($user = null, $location = null) + { + if ($user !== null) { + $uri = self::USER_URI . '/' . $user; + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getEntry($uri, 'Zend_Gdata_YouTube_UserProfileEntry'); + } + + /** + * Helper function for parsing a YouTube token response + * + * @param string $response The service response + * @throws Zend_Gdata_App_Exception + * @return array An array containing the token and URL + */ + public static function parseFormUploadTokenResponse($response) + { + // Load the feed as an XML DOMDocument object + @ini_set('track_errors', 1); + $doc = new DOMDocument(); + $success = @$doc->loadXML($response); + @ini_restore('track_errors'); + + if (!$success) { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception("Zend_Gdata_YouTube::parseFormUploadTokenResponse - " . + "DOMDocument cannot parse XML: $php_errormsg"); + } + $responseElement = $doc->getElementsByTagName('response')->item(0); + + $urlText = null; + $tokenText = null; + if ($responseElement != null) { + $urlElement = $responseElement->getElementsByTagName('url')->item(0); + $tokenElement = $responseElement->getElementsByTagName('token')->item(0); + + if ($urlElement && $urlElement->hasChildNodes() && + $tokenElement && $tokenElement->hasChildNodes()) { + + $urlText = $urlElement->firstChild->nodeValue; + $tokenText = $tokenElement->firstChild->nodeValue; + } + } + + if ($tokenText != null && $urlText != null) { + return array('token' => $tokenText, 'url' => $urlText); + } else { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception("form upload token not found in response"); + } + } + + /** + * Retrieves a YouTube token + * + * @param Zend_Gdata_YouTube_VideoEntry $videoEntry The video entry + * @param string $url The location as a string URL + * @throws Zend_Gdata_App_Exception + * @return array An array containing a token and URL + */ + public function getFormUploadToken($videoEntry, $url='http://gdata.youtube.com/action/GetUploadToken') + { + if ($url != null && is_string($url)) { + // $response is a Zend_Http_response object + $response = $this->post($videoEntry, $url); + return self::parseFormUploadTokenResponse($response->getBody()); + } else { + require_once 'Zend/Gdata/App/HttpException.php'; + throw new Zend_Gdata_App_Exception('Url must be provided as a string URL'); + } + } +} diff --git a/libs/Zend/Gdata/YouTube/CommentEntry.php b/libs/Zend/Gdata/YouTube/CommentEntry.php new file mode 100644 index 0000000..c1d0b41 --- /dev/null +++ b/libs/Zend/Gdata/YouTube/CommentEntry.php @@ -0,0 +1,46 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct($element); + } + +} diff --git a/libs/Zend/Gdata/YouTube/ContactEntry.php b/libs/Zend/Gdata/YouTube/ContactEntry.php new file mode 100644 index 0000000..b917cf2 --- /dev/null +++ b/libs/Zend/Gdata/YouTube/ContactEntry.php @@ -0,0 +1,136 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct($element); + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_status != null) { + $element->appendChild($this->_status->getDOM($element->ownerDocument)); + } + return $element; + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them in the $_entry array based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('yt') . ':' . 'status': + $status = new Zend_Gdata_YouTube_Extension_Status(); + $status->transferFromDOM($child); + $this->_status = $status; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + /** + * Sets the status + * + * @param Zend_Gdata_YouTube_Extension_Status $status The status + * @return Zend_Gdata_YouTube_ContactEntry Provides a fluent interface + */ + public function setStatus($status = null) + { + $this->_status = $status; + return $this; + } + + /** + * Returns the status + * + * @return Zend_Gdata_YouTube_Extension_Status The status + */ + public function getStatus() + { + return $this->_status; + } + +} diff --git a/libs/Zend/Gdata/YouTube/ContactFeed.php b/libs/Zend/Gdata/YouTube/ContactFeed.php new file mode 100644 index 0000000..57ada9e --- /dev/null +++ b/libs/Zend/Gdata/YouTube/ContactFeed.php @@ -0,0 +1,68 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct($element); + } + +} diff --git a/libs/Zend/Gdata/YouTube/Extension/Age.php b/libs/Zend/Gdata/YouTube/Extension/Age.php new file mode 100644 index 0000000..edaceaa --- /dev/null +++ b/libs/Zend/Gdata/YouTube/Extension/Age.php @@ -0,0 +1,51 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->_text = $text; + } + +} diff --git a/libs/Zend/Gdata/YouTube/Extension/Books.php b/libs/Zend/Gdata/YouTube/Extension/Books.php new file mode 100644 index 0000000..5a66414 --- /dev/null +++ b/libs/Zend/Gdata/YouTube/Extension/Books.php @@ -0,0 +1,51 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->_text = $text; + } + +} diff --git a/libs/Zend/Gdata/YouTube/Extension/Company.php b/libs/Zend/Gdata/YouTube/Extension/Company.php new file mode 100644 index 0000000..0d3027b --- /dev/null +++ b/libs/Zend/Gdata/YouTube/Extension/Company.php @@ -0,0 +1,51 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->_text = $text; + } + +} diff --git a/libs/Zend/Gdata/YouTube/Extension/Control.php b/libs/Zend/Gdata/YouTube/Extension/Control.php new file mode 100755 index 0000000..ae63b92 --- /dev/null +++ b/libs/Zend/Gdata/YouTube/Extension/Control.php @@ -0,0 +1,133 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct($draft); + $this->_state = $state; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_state != null) { + $element->appendChild($this->_state->getDOM($element->ownerDocument)); + } + return $element; + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them as members of this entry based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('yt') . ':' . 'state': + $state = new Zend_Gdata_YouTube_Extension_State(); + $state->transferFromDOM($child); + $this->_state = $state; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + /** + * Get the value for this element's state attribute. + * + * @return Zend_Gdata_YouTube_Extension_State The state element. + */ + public function getState() + { + return $this->_state; + } + + /** + * Set the value for this element's state attribute. + * + * @param Zend_Gdata_YouTube_Extension_State $value The desired value for this attribute. + * @return Zend_YouTube_Extension_Control The element being modified. + */ + public function setState($value) + { + $this->_state = $value; + return $this; + } + + /** + * Get the value of this element's state attribute. + * + * @return string The state's text value + */ + public function getStateValue() + { + return $this->getState()->getText(); + } + +} diff --git a/libs/Zend/Gdata/YouTube/Extension/Description.php b/libs/Zend/Gdata/YouTube/Extension/Description.php new file mode 100644 index 0000000..269798c --- /dev/null +++ b/libs/Zend/Gdata/YouTube/Extension/Description.php @@ -0,0 +1,51 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->_text = $text; + } + +} diff --git a/libs/Zend/Gdata/YouTube/Extension/Duration.php b/libs/Zend/Gdata/YouTube/Extension/Duration.php new file mode 100644 index 0000000..151ecbc --- /dev/null +++ b/libs/Zend/Gdata/YouTube/Extension/Duration.php @@ -0,0 +1,126 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->_seconds = $seconds; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_seconds !== null) { + $element->setAttribute('seconds', $this->_seconds); + } + return $element; + } + + /** + * Given a DOMNode representing an attribute, tries to map the data into + * instance members. If no mapping is defined, the name and valueare + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'seconds': + $this->_seconds = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Get the value for this element's seconds attribute. + * + * @return int The value associated with this attribute. + */ + public function getSeconds() + { + return $this->_seconds; + } + + /** + * Set the value for this element's seconds attribute. + * + * @param int $value The desired value for this attribute. + * @return Zend_Gdata_YouTube_Extension_Duration The element being modified. + */ + public function setSeconds($value) + { + $this->_seconds = $value; + return $this; + } + + /** + * Magic toString method allows using this directly via echo + * Works best in PHP >= 4.2.0 + * + * @return string The duration in seconds + */ + public function __toString() + { + return $this->_seconds; + } + +} diff --git a/libs/Zend/Gdata/YouTube/Extension/Gender.php b/libs/Zend/Gdata/YouTube/Extension/Gender.php new file mode 100644 index 0000000..e3c48e7 --- /dev/null +++ b/libs/Zend/Gdata/YouTube/Extension/Gender.php @@ -0,0 +1,51 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->_text = $text; + } + +} diff --git a/libs/Zend/Gdata/YouTube/Extension/Hobbies.php b/libs/Zend/Gdata/YouTube/Extension/Hobbies.php new file mode 100644 index 0000000..9b501de --- /dev/null +++ b/libs/Zend/Gdata/YouTube/Extension/Hobbies.php @@ -0,0 +1,51 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->_text = $text; + } + +} diff --git a/libs/Zend/Gdata/YouTube/Extension/Hometown.php b/libs/Zend/Gdata/YouTube/Extension/Hometown.php new file mode 100644 index 0000000..3f54985 --- /dev/null +++ b/libs/Zend/Gdata/YouTube/Extension/Hometown.php @@ -0,0 +1,51 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->_text = $text; + } + +} diff --git a/libs/Zend/Gdata/YouTube/Extension/Link.php b/libs/Zend/Gdata/YouTube/Extension/Link.php new file mode 100755 index 0000000..93257d6 --- /dev/null +++ b/libs/Zend/Gdata/YouTube/Extension/Link.php @@ -0,0 +1,133 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct($href, $rel, $type, $hrefLang, $title, $length); + $this->_token = $token; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_token != null) { + $element->appendChild($this->_token->getDOM($element->ownerDocument)); + } + return $element; + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them as members of this entry based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('yt') . ':' . 'token': + $token = new Zend_Gdata_YouTube_Extension_Token(); + $token->transferFromDOM($child); + $this->_token = $token; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + /** + * Get the value for this element's token attribute. + * + * @return Zend_Gdata_YouTube_Extension_Token The token element. + */ + public function getToken() + { + return $this->_token; + } + + /** + * Set the value for this element's token attribute. + * + * @param Zend_Gdata_YouTube_Extension_Token $value The desired value for this attribute. + * @return Zend_YouTube_Extension_Link The element being modified. + */ + public function setToken($value) + { + $this->_token = $value; + return $this; + } + + /** + * Get the value of this element's token attribute. + * + * @return string The token's text value + */ + public function getTokenValue() + { + return $this->getToken()->getText(); + } + +} diff --git a/libs/Zend/Gdata/YouTube/Extension/Location.php b/libs/Zend/Gdata/YouTube/Extension/Location.php new file mode 100644 index 0000000..85c4619 --- /dev/null +++ b/libs/Zend/Gdata/YouTube/Extension/Location.php @@ -0,0 +1,51 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->_text = $text; + } + +} diff --git a/libs/Zend/Gdata/YouTube/Extension/MediaContent.php b/libs/Zend/Gdata/YouTube/Extension/MediaContent.php new file mode 100755 index 0000000..5d7e92d --- /dev/null +++ b/libs/Zend/Gdata/YouTube/Extension/MediaContent.php @@ -0,0 +1,120 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_format!= null) { + $element->setAttributeNS($this->lookupNamespace('yt'), 'yt:format', $this->_format); + } + 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 + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + $absoluteAttrName = $attribute->namespaceURI . ':' . $attribute->localName; + if ($absoluteAttrName == $this->lookupNamespace('yt') . ':' . 'format') { + $this->_format = $attribute->nodeValue; + } else { + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Returns the format of the media + * Optional. + * + * @return int The format of the media + */ + public function getFormat() + { + return $this->_format; + } + + /** + * Sets the format of the media + * + * @param int $value Format of the media + * @return Zend_Gdata_YouTube_Extension_MediaContent Provides a fluent interface + * + */ + public function setFormat($value) + { + $this->_format = $value; + return $this; + } + +} diff --git a/libs/Zend/Gdata/YouTube/Extension/MediaGroup.php b/libs/Zend/Gdata/YouTube/Extension/MediaGroup.php new file mode 100755 index 0000000..41b17fa --- /dev/null +++ b/libs/Zend/Gdata/YouTube/Extension/MediaGroup.php @@ -0,0 +1,159 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct($element); + } + + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_duration !== null) { + $element->appendChild($this->_duration->getDOM($element->ownerDocument)); + } + if ($this->_private !== null) { + $element->appendChild($this->_private->getDOM($element->ownerDocument)); + } + return $element; + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them in the $_entry array based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('media') . ':' . 'content': + $content = new Zend_Gdata_YouTube_Extension_MediaContent(); + $content->transferFromDOM($child); + $this->_content[] = $content; + break; + case $this->lookupNamespace('yt') . ':' . 'duration': + $duration = new Zend_Gdata_YouTube_Extension_Duration(); + $duration->transferFromDOM($child); + $this->_duration = $duration; + break; + case $this->lookupNamespace('yt') . ':' . 'private': + $private = new Zend_Gdata_YouTube_Extension_Private(); + $private->transferFromDOM($child); + $this->_private = $private; + break; + + default: + parent::takeChildFromDOM($child); + break; + } + } + + /** + * Returns the duration value of this element + * + * @return Zend_Gdata_YouTube_Extension_Duration + */ + public function getDuration() + { + return $this->_duration; + } + + /** + * Sets the duration value of this element + * + * @param Zend_Gdata_YouTube_Extension_Duration $value The duration value + * @return Zend_Gdata_YouTube_Extension_MediaGroup Provides a fluent interface + */ + public function setDuration($value) + { + $this->_duration = $value; + return $this; + } + + /** + * Returns the private value of this element + * + * @return Zend_Gdata_YouTube_Extension_Private + */ + public function getPrivate() + { + return $this->_private; + } + + /** + * Sets the private value of this element + * + * @param Zend_Gdata_YouTube_Extension_Private $value The private value + * @return Zend_Gdata_YouTube_Extension_MediaGroup Provides a fluent interface + */ + public function setPrivate($value) + { + $this->_private = $value; + return $this; + } + +} diff --git a/libs/Zend/Gdata/YouTube/Extension/Movies.php b/libs/Zend/Gdata/YouTube/Extension/Movies.php new file mode 100644 index 0000000..13602dc --- /dev/null +++ b/libs/Zend/Gdata/YouTube/Extension/Movies.php @@ -0,0 +1,51 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->_text = $text; + } + +} diff --git a/libs/Zend/Gdata/YouTube/Extension/Music.php b/libs/Zend/Gdata/YouTube/Extension/Music.php new file mode 100644 index 0000000..50f5c71 --- /dev/null +++ b/libs/Zend/Gdata/YouTube/Extension/Music.php @@ -0,0 +1,51 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->_text = $text; + } + +} diff --git a/libs/Zend/Gdata/YouTube/Extension/NoEmbed.php b/libs/Zend/Gdata/YouTube/Extension/NoEmbed.php new file mode 100644 index 0000000..0a42bf5 --- /dev/null +++ b/libs/Zend/Gdata/YouTube/Extension/NoEmbed.php @@ -0,0 +1,54 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + } + +} diff --git a/libs/Zend/Gdata/YouTube/Extension/Occupation.php b/libs/Zend/Gdata/YouTube/Extension/Occupation.php new file mode 100644 index 0000000..d5c0bbf --- /dev/null +++ b/libs/Zend/Gdata/YouTube/Extension/Occupation.php @@ -0,0 +1,51 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->_text = $text; + } + +} diff --git a/libs/Zend/Gdata/YouTube/Extension/Position.php b/libs/Zend/Gdata/YouTube/Extension/Position.php new file mode 100644 index 0000000..3ade9cd --- /dev/null +++ b/libs/Zend/Gdata/YouTube/Extension/Position.php @@ -0,0 +1,90 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->_text = $value; + } + + /** + * Get the value for the position in the playlist + * + * @return int The 1-based position in the playlist + */ + public function getValue() + { + return $this->_text; + } + + /** + * Set the value for the position in the playlist + * + * @param int $value The 1-based position in the playlist + * @return Zend_Gdata_Extension_Visibility The element being modified + */ + public function setValue($value) + { + $this->_text = $value; + return $this; + } + + /** + * Magic toString method allows using this directly via echo + * Works best in PHP >= 4.2.0 + * + * @return string + */ + public function __toString() + { + return $this->getValue(); + } + +} + diff --git a/libs/Zend/Gdata/YouTube/Extension/Private.php b/libs/Zend/Gdata/YouTube/Extension/Private.php new file mode 100755 index 0000000..8b1d16c --- /dev/null +++ b/libs/Zend/Gdata/YouTube/Extension/Private.php @@ -0,0 +1,81 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + return $element; + } + + /** + * Given a DOMNode representing an attribute, tries to map the data into + * instance members. If no mapping is defined, the name and valueare + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + parent::takeAttributeFromDOM($attribute); + } + +} diff --git a/libs/Zend/Gdata/YouTube/Extension/Racy.php b/libs/Zend/Gdata/YouTube/Extension/Racy.php new file mode 100644 index 0000000..483e521 --- /dev/null +++ b/libs/Zend/Gdata/YouTube/Extension/Racy.php @@ -0,0 +1,124 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->_state = $state; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_state !== null) { + $element->setAttribute('state', $this->_state); + } + 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 + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'state': + $this->_state = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Get the value for this element's state attribute. + * + * @return bool The value associated with this attribute. + */ + public function getState() + { + return $this->_state; + } + + /** + * Set the value for this element's state attribute. + * + * @param bool $value The desired value for this attribute. + * @return Zend_Gdata_YouTube_Extension_Racy The element being modified. + */ + public function setState($value) + { + $this->_state = $value; + return $this; + } + + /** + * Magic toString method allows using this directly via echo + * Works best in PHP >= 4.2.0 + */ + public function __toString() + { + return $this->_state; + } + +} diff --git a/libs/Zend/Gdata/YouTube/Extension/Recorded.php b/libs/Zend/Gdata/YouTube/Extension/Recorded.php new file mode 100644 index 0000000..88364f4 --- /dev/null +++ b/libs/Zend/Gdata/YouTube/Extension/Recorded.php @@ -0,0 +1,51 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->_text = $text; + } + +} diff --git a/libs/Zend/Gdata/YouTube/Extension/Relationship.php b/libs/Zend/Gdata/YouTube/Extension/Relationship.php new file mode 100644 index 0000000..9d881b3 --- /dev/null +++ b/libs/Zend/Gdata/YouTube/Extension/Relationship.php @@ -0,0 +1,51 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->_text = $text; + } + +} diff --git a/libs/Zend/Gdata/YouTube/Extension/ReleaseDate.php b/libs/Zend/Gdata/YouTube/Extension/ReleaseDate.php new file mode 100644 index 0000000..c430bb0 --- /dev/null +++ b/libs/Zend/Gdata/YouTube/Extension/ReleaseDate.php @@ -0,0 +1,51 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->_text = $text; + } + +} diff --git a/libs/Zend/Gdata/YouTube/Extension/School.php b/libs/Zend/Gdata/YouTube/Extension/School.php new file mode 100644 index 0000000..e0f6e49 --- /dev/null +++ b/libs/Zend/Gdata/YouTube/Extension/School.php @@ -0,0 +1,51 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->_text = $text; + } + +} diff --git a/libs/Zend/Gdata/YouTube/Extension/State.php b/libs/Zend/Gdata/YouTube/Extension/State.php new file mode 100644 index 0000000..1b9c684 --- /dev/null +++ b/libs/Zend/Gdata/YouTube/Extension/State.php @@ -0,0 +1,193 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->_text = $explanation; + $this->_name = $name; + $this->_reasonCode = $reasonCode; + $this->_helpUrl = $reasonCode; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_name !== null) { + $element->setAttribute('name', $this->_name); + } + if ($this->_reasonCode !== null) { + $element->setAttribute('reasonCode', $this->_reasonCode); + } + if ($this->_helpUrl !== null) { + $element->setAttribute('helpUrl', $this->_helpUrl); + } + return $element; + } + + /** + * Given a DOMNode representing an attribute, tries to map the data into + * instance members. If no mapping is defined, the name and valueare + * stored in an array. + * TODO: Convert attributes to proper types + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'name': + $this->_name = $attribute->nodeValue; + break; + case 'reasonCode': + $this->_reasonCode = $attribute->nodeValue; + break; + case 'helpUrl': + $this->_helpUrl = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Get the value for this element's name attribute. + * + * @return int The value associated with this attribute. + */ + public function getName() + { + return $this->_name; + } + + /** + * Set the value for this element's name attribute. + * + * @param int $value The desired value for this attribute. + * @return Zend_Gdata_YouTube_Extension_State The element being modified. + */ + public function setName($value) + { + $this->_name = $value; + return $this; + } + + /** + * Get the value for this element's reasonCode attribute. + * + * @return int The value associated with this attribute. + */ + public function getReasonCode() + { + return $this->_reasonCode; + } + + /** + * Set the value for this element's reasonCode attribute. + * + * @param int $value The desired value for this attribute. + * @return Zend_Gdata_YouTube_Extension_State The element being modified. + */ + public function setReasonCode($value) + { + $this->_reasonCode = $value; + return $this; + } + + /** + * Get the value for this element's helpUrl attribute. + * + * @return int The value associated with this attribute. + */ + public function getHelpUrl() + { + return $this->_helpUrl; + } + + /** + * Set the value for this element's helpUrl attribute. + * + * @param int $value The desired value for this attribute. + * @return Zend_Gdata_YouTube_Extension_State The element being modified. + */ + public function setHelpUrl($value) + { + $this->_helpUrl = $value; + return $this; + } + + /** + * Magic toString method allows using this directly via echo + * Works best in PHP >= 4.2.0 + * + * @return string + */ + public function __toString() + { + return $this->_text; + } + +} diff --git a/libs/Zend/Gdata/YouTube/Extension/Statistics.php b/libs/Zend/Gdata/YouTube/Extension/Statistics.php new file mode 100644 index 0000000..d1ead4c --- /dev/null +++ b/libs/Zend/Gdata/YouTube/Extension/Statistics.php @@ -0,0 +1,158 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->_viewCount = $viewCount; + $this->_watchCount = $watchCount; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_viewCount !== null) { + $element->setAttribute('viewCount', $this->_viewCount); + } + if ($this->_watchCount !== null) { + $element->setAttribute('watchCount', $this->_watchCount); + } + return $element; + } + + /** + * Given a DOMNode representing an attribute, tries to map the data into + * instance members. If no mapping is defined, the name and valueare + * stored in an array. + * TODO: Convert attributes to proper types + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'viewCount': + $this->_viewCount = $attribute->nodeValue; + break; + case 'watchCount': + $this->_watchCount = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Get the value for this element's viewCount attribute. + * + * @return int The value associated with this attribute. + */ + public function getViewCount() + { + return $this->_viewCount; + } + + /** + * Set the value for this element's viewCount attribute. + * + * @param int $value The desired value for this attribute. + * @return Zend_Gdata_YouTube_Extension_Statistics The element being modified. + */ + public function setViewCount($value) + { + $this->_viewCount = $value; + return $this; + } + + /** + * Get the value for this element's watchCount attribute. + * + * @return int The value associated with this attribute. + */ + public function getWatchCount() + { + return $this->_watchCount; + } + + /** + * Set the value for this element's watchCount attribute. + * + * @param int $value The desired value for this attribute. + * @return Zend_Gdata_YouTube_Extension_Statistics The element being modified. + */ + public function setWatchCount($value) + { + $this->_watchCount = $value; + return $this; + } + + /** + * Magic toString method allows using this directly via echo + * Works best in PHP >= 4.2.0 + * + * @return string + */ + public function __toString() + { + return 'View Count=' . $this->_viewCount; + } + +} diff --git a/libs/Zend/Gdata/YouTube/Extension/Status.php b/libs/Zend/Gdata/YouTube/Extension/Status.php new file mode 100644 index 0000000..867be11 --- /dev/null +++ b/libs/Zend/Gdata/YouTube/Extension/Status.php @@ -0,0 +1,51 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->_text = $text; + } + +} diff --git a/libs/Zend/Gdata/YouTube/Extension/Token.php b/libs/Zend/Gdata/YouTube/Extension/Token.php new file mode 100755 index 0000000..105e4cf --- /dev/null +++ b/libs/Zend/Gdata/YouTube/Extension/Token.php @@ -0,0 +1,70 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->_text = $text; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + return $element; + } + +} diff --git a/libs/Zend/Gdata/YouTube/Extension/Username.php b/libs/Zend/Gdata/YouTube/Extension/Username.php new file mode 100644 index 0000000..3a24e4c --- /dev/null +++ b/libs/Zend/Gdata/YouTube/Extension/Username.php @@ -0,0 +1,51 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct(); + $this->_text = $text; + } + +} diff --git a/libs/Zend/Gdata/YouTube/MediaEntry.php b/libs/Zend/Gdata/YouTube/MediaEntry.php new file mode 100755 index 0000000..9dcd930 --- /dev/null +++ b/libs/Zend/Gdata/YouTube/MediaEntry.php @@ -0,0 +1,79 @@ +namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('media') . ':' . 'group': + $mediaGroup = new Zend_Gdata_YouTube_Extension_MediaGroup(); + $mediaGroup->transferFromDOM($child); + $this->_mediaGroup = $mediaGroup; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + +} diff --git a/libs/Zend/Gdata/YouTube/PlaylistListEntry.php b/libs/Zend/Gdata/YouTube/PlaylistListEntry.php new file mode 100644 index 0000000..6121f92 --- /dev/null +++ b/libs/Zend/Gdata/YouTube/PlaylistListEntry.php @@ -0,0 +1,206 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct($element); + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_description != null) { + $element->appendChild($this->_description->getDOM($element->ownerDocument)); + } + if ($this->_feedLink != null) { + foreach ($this->_feedLink as $feedLink) { + $element->appendChild($feedLink->getDOM($element->ownerDocument)); + } + } + return $element; + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them in the $_entry array based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('yt') . ':' . 'description': + $description = new Zend_Gdata_YouTube_Extension_Description(); + $description->transferFromDOM($child); + $this->_description = $description; + break; + case $this->lookupNamespace('gd') . ':' . 'feedLink': + $feedLink = new Zend_Gdata_Extension_FeedLink(); + $feedLink->transferFromDOM($child); + $this->_feedLink[] = $feedLink; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + /** + * Sets the description relating to the playlist. + * + * @param Zend_Gdata_YouTube_Extension_Description $description The description relating to the video + * @return Zend_Gdata_YouTube_PlaylistListEntry Provides a fluent interface + */ + public function setDescription($description = null) + { + $this->_description = $description; + return $this; + } + + /** + * Returns the description relating to the video. + * + * @return Zend_Gdata_YouTube_Extension_Description The description relating to the video + */ + public function getDescription() + { + return $this->_description; + } + + /** + * Sets the array of embedded feeds related to the video + * + * @param array $feedLink The array of embedded feeds relating to the video + * @return Zend_Gdata_YouTube_PlaylistListEntry Provides a fluent interface + */ + public function setFeedLink($feedLink = null) + { + $this->_feedLink = $feedLink; + return $this; + } + + /** + * Get the feed link property for this entry. + * + * @see setFeedLink + * @param string $rel (optional) The rel value of the link to be found. + * If null, the array of links is returned. + * @return mixed If $rel is specified, a Zend_Gdata_Extension_FeedLink + * object corresponding to the requested rel value is returned + * if found, or null if the requested value is not found. If + * $rel is null or not specified, an array of all available + * feed links for this entry is returned, or null if no feed + * links are set. + */ + public function getFeedLink($rel = null) + { + if ($rel == null) { + return $this->_feedLink; + } else { + foreach ($this->_feedLink as $feedLink) { + if ($feedLink->rel == $rel) { + return $feedLink; + } + } + return null; + } + } + + /** + * Returns the URL of the playlist video feed + * + * @return string The URL of the playlist video feed + */ + public function getPlaylistVideoFeedUrl() + { + return $this->getFeedLink(Zend_Gdata_YouTube::PLAYLIST_REL)->href; + } + +} diff --git a/libs/Zend/Gdata/YouTube/PlaylistListFeed.php b/libs/Zend/Gdata/YouTube/PlaylistListFeed.php new file mode 100644 index 0000000..b2eea88 --- /dev/null +++ b/libs/Zend/Gdata/YouTube/PlaylistListFeed.php @@ -0,0 +1,68 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct($element); + } + +} diff --git a/libs/Zend/Gdata/YouTube/PlaylistVideoEntry.php b/libs/Zend/Gdata/YouTube/PlaylistVideoEntry.php new file mode 100644 index 0000000..14ccd0d --- /dev/null +++ b/libs/Zend/Gdata/YouTube/PlaylistVideoEntry.php @@ -0,0 +1,132 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct($element); + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_position !== null) { + $element->appendChild($this->_position->getDOM($element->ownerDocument)); + } + return $element; + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them in the $_entry array based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('yt') . ':' . 'position': + $position = new Zend_Gdata_YouTube_Extension_Position(); + $position->transferFromDOM($child); + $this->_position = $position; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + + /** + * Sets the array of embedded feeds related to the video + * + * @param Zend_Gdata_YouTube_Extension_Position $position + * The position of the entry in the feed, as specified by the user. + * @return Zend_Gdata_YouTube_PlaylistVideoEntry Provides a fluent interface + */ + public function setPosition($position = null) + { + $this->_position = $position; + return $this; + } + + /** + * Returns the position of the entry in the feed, as specified by the user + * + * @return Zend_Gdata_YouTube_Extension_Position The position + */ + public function getPosition() + { + return $this->_position; + } + +} diff --git a/libs/Zend/Gdata/YouTube/PlaylistVideoFeed.php b/libs/Zend/Gdata/YouTube/PlaylistVideoFeed.php new file mode 100644 index 0000000..d1f47cd --- /dev/null +++ b/libs/Zend/Gdata/YouTube/PlaylistVideoFeed.php @@ -0,0 +1,68 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct($element); + } + +} diff --git a/libs/Zend/Gdata/YouTube/SubscriptionEntry.php b/libs/Zend/Gdata/YouTube/SubscriptionEntry.php new file mode 100644 index 0000000..7e99d49 --- /dev/null +++ b/libs/Zend/Gdata/YouTube/SubscriptionEntry.php @@ -0,0 +1,154 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct($element); + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_feedLink != null) { + foreach ($this->_feedLink as $feedLink) { + $element->appendChild($feedLink->getDOM($element->ownerDocument)); + } + } + return $element; + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them in the $_entry array based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('gd') . ':' . 'feedLink': + $feedLink = new Zend_Gdata_Extension_FeedLink(); + $feedLink->transferFromDOM($child); + $this->_feedLink[] = $feedLink; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + /** + * Sets the array of embedded feeds related to the video + * + * @param array $feedLink The array of embedded feeds relating to the video + * @return Zend_Gdata_YouTube_SubscriptionEntry Provides a fluent interface + */ + public function setFeedLink($feedLink = null) + { + $this->_feedLink = $feedLink; + return $this; + } + + /** + * Get the feed link property for this entry. + * + * @see setFeedLink + * @param string $rel (optional) The rel value of the link to be found. + * If null, the array of links is returned. + * @return mixed If $rel is specified, a Zend_Gdata_Extension_FeedLink + * object corresponding to the requested rel value is returned + * if found, or null if the requested value is not found. If + * $rel is null or not specified, an array of all available + * feed links for this entry is returned, or null if no feed + * links are set. + */ + public function getFeedLink($rel = null) + { + if ($rel == null) { + return $this->_feedLink; + } else { + foreach ($this->_feedLink as $feedLink) { + if ($feedLink->rel == $rel) { + return $feedLink; + } + } + return null; + } + } + +} diff --git a/libs/Zend/Gdata/YouTube/SubscriptionFeed.php b/libs/Zend/Gdata/YouTube/SubscriptionFeed.php new file mode 100644 index 0000000..ee39c73 --- /dev/null +++ b/libs/Zend/Gdata/YouTube/SubscriptionFeed.php @@ -0,0 +1,68 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct($element); + } + +} diff --git a/libs/Zend/Gdata/YouTube/UserProfileEntry.php b/libs/Zend/Gdata/YouTube/UserProfileEntry.php new file mode 100644 index 0000000..5a25920 --- /dev/null +++ b/libs/Zend/Gdata/YouTube/UserProfileEntry.php @@ -0,0 +1,782 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct($element); + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_description != null) { + $element->appendChild($this->_description->getDOM($element->ownerDocument)); + } + if ($this->_age != null) { + $element->appendChild($this->_age->getDOM($element->ownerDocument)); + } + if ($this->_username != null) { + $element->appendChild($this->_username->getDOM($element->ownerDocument)); + } + if ($this->_books != null) { + $element->appendChild($this->_books->getDOM($element->ownerDocument)); + } + if ($this->_company != null) { + $element->appendChild($this->_company->getDOM($element->ownerDocument)); + } + if ($this->_hobbies != null) { + $element->appendChild($this->_hobbies->getDOM($element->ownerDocument)); + } + if ($this->_hometown != null) { + $element->appendChild($this->_hometown->getDOM($element->ownerDocument)); + } + if ($this->_location != null) { + $element->appendChild($this->_location->getDOM($element->ownerDocument)); + } + if ($this->_movies != null) { + $element->appendChild($this->_movies->getDOM($element->ownerDocument)); + } + if ($this->_music != null) { + $element->appendChild($this->_music->getDOM($element->ownerDocument)); + } + if ($this->_occupation != null) { + $element->appendChild($this->_occupation->getDOM($element->ownerDocument)); + } + if ($this->_school != null) { + $element->appendChild($this->_school->getDOM($element->ownerDocument)); + } + if ($this->_gender != null) { + $element->appendChild($this->_gender->getDOM($element->ownerDocument)); + } + if ($this->_relationship != null) { + $element->appendChild($this->_relationship->getDOM($element->ownerDocument)); + } + if ($this->_feedLink != null) { + foreach ($this->_feedLink as $feedLink) { + $element->appendChild($feedLink->getDOM($element->ownerDocument)); + } + } + return $element; + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them in the $_entry array based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('yt') . ':' . 'description': + $description = new Zend_Gdata_YouTube_Extension_Description(); + $description->transferFromDOM($child); + $this->_description = $description; + break; + case $this->lookupNamespace('yt') . ':' . 'age': + $age = new Zend_Gdata_YouTube_Extension_Age(); + $age->transferFromDOM($child); + $this->_age = $age; + break; + case $this->lookupNamespace('yt') . ':' . 'username': + $username = new Zend_Gdata_YouTube_Extension_Username(); + $username->transferFromDOM($child); + $this->_username = $username; + break; + case $this->lookupNamespace('yt') . ':' . 'books': + $books = new Zend_Gdata_YouTube_Extension_Books(); + $books->transferFromDOM($child); + $this->_books = $books; + break; + case $this->lookupNamespace('yt') . ':' . 'company': + $company = new Zend_Gdata_YouTube_Extension_Company(); + $company->transferFromDOM($child); + $this->_company = $company; + break; + case $this->lookupNamespace('yt') . ':' . 'hobbies': + $hobbies = new Zend_Gdata_YouTube_Extension_Hobbies(); + $hobbies->transferFromDOM($child); + $this->_hobbies = $hobbies; + break; + case $this->lookupNamespace('yt') . ':' . 'hometown': + $hometown = new Zend_Gdata_YouTube_Extension_Hometown(); + $hometown->transferFromDOM($child); + $this->_hometown = $hometown; + break; + case $this->lookupNamespace('yt') . ':' . 'location': + $location = new Zend_Gdata_YouTube_Extension_Location(); + $location->transferFromDOM($child); + $this->_location = $location; + break; + case $this->lookupNamespace('yt') . ':' . 'movies': + $movies = new Zend_Gdata_YouTube_Extension_Movies(); + $movies->transferFromDOM($child); + $this->_movies = $movies; + break; + case $this->lookupNamespace('yt') . ':' . 'music': + $music = new Zend_Gdata_YouTube_Extension_Music(); + $music->transferFromDOM($child); + $this->_music = $music; + break; + case $this->lookupNamespace('yt') . ':' . 'occupation': + $occupation = new Zend_Gdata_YouTube_Extension_Occupation(); + $occupation->transferFromDOM($child); + $this->_occupation = $occupation; + break; + case $this->lookupNamespace('yt') . ':' . 'school': + $school = new Zend_Gdata_YouTube_Extension_School(); + $school->transferFromDOM($child); + $this->_school = $school; + break; + case $this->lookupNamespace('yt') . ':' . 'gender': + $gender = new Zend_Gdata_YouTube_Extension_Gender(); + $gender->transferFromDOM($child); + $this->_gender = $gender; + break; + case $this->lookupNamespace('yt') . ':' . 'relationship': + $relationship = new Zend_Gdata_YouTube_Extension_Relationship(); + $relationship->transferFromDOM($child); + $this->_relationship = $relationship; + break; + case $this->lookupNamespace('gd') . ':' . 'feedLink': + $feedLink = new Zend_Gdata_Extension_FeedLink(); + $feedLink->transferFromDOM($child); + $this->_feedLink[] = $feedLink; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + /** + * Sets the age + * + * @param Zend_Gdata_YouTube_Extension_Age $age The age + * @return Zend_Gdata_YouTube_UserProfileEntry Provides a fluent interface + */ + public function setAge($age = null) + { + $this->_age = $age; + return $this; + } + + /** + * Returns the age + * + * @return Zend_Gdata_YouTube_Extension_Age The age + */ + public function getAge() + { + return $this->_age; + } + + /** + * Sets the username + * + * @param Zend_Gdata_YouTube_Extension_Username $username The username + * @return Zend_Gdata_YouTube_UserProfileEntry Provides a fluent interface + */ + public function setUsername($username = null) + { + $this->_username = $username; + return $this; + } + + /** + * Returns the username + * + * @return Zend_Gdata_YouTube_Extension_Username The username + */ + public function getUsername() + { + return $this->_username; + } + + /** + * Sets the books + * + * @param Zend_Gdata_YouTube_Extension_Books $books The books + * @return Zend_Gdata_YouTube_UserProfileEntry Provides a fluent interface + */ + public function setBooks($books = null) + { + $this->_books = $books; + return $this; + } + + /** + * Returns the books + * + * @return Zend_Gdata_YouTube_Extension_Books The books + */ + public function getBooks() + { + return $this->_books; + } + + /** + * Sets the company + * + * @param Zend_Gdata_YouTube_Extension_Company $company The company + * @return Zend_Gdata_YouTube_UserProfileEntry Provides a fluent interface + */ + public function setCompany($company = null) + { + $this->_company = $company; + return $this; + } + + /** + * Returns the company + * + * @return Zend_Gdata_YouTube_Extension_Company The company + */ + public function getCompany() + { + return $this->_company; + } + + /** + * Sets the hobbies + * + * @param Zend_Gdata_YouTube_Extension_Hobbies $hobbies The hobbies + * @return Zend_Gdata_YouTube_UserProfileEntry Provides a fluent interface + */ + public function setHobbies($hobbies = null) + { + $this->_hobbies = $hobbies; + return $this; + } + + /** + * Returns the hobbies + * + * @return Zend_Gdata_YouTube_Extension_Hobbies The hobbies + */ + public function getHobbies() + { + return $this->_hobbies; + } + + /** + * Sets the hometown + * + * @param Zend_Gdata_YouTube_Extension_Hometown $hometown The hometown + * @return Zend_Gdata_YouTube_UserProfileEntry Provides a fluent interface + */ + public function setHometown($hometown = null) + { + $this->_hometown = $hometown; + return $this; + } + + /** + * Returns the hometown + * + * @return Zend_Gdata_YouTube_Extension_Hometown The hometown + */ + public function getHometown() + { + return $this->_hometown; + } + + /** + * Sets the location + * + * @param Zend_Gdata_YouTube_Extension_Location $location The location + * @return Zend_Gdata_YouTube_UserProfileEntry Provides a fluent interface + */ + public function setLocation($location = null) + { + $this->_location = $location; + return $this; + } + + /** + * Returns the location + * + * @return Zend_Gdata_YouTube_Extension_Location The location + */ + public function getLocation() + { + return $this->_location; + } + + /** + * Sets the movies + * + * @param Zend_Gdata_YouTube_Extension_Movies $movies The movies + * @return Zend_Gdata_YouTube_UserProfileEntry Provides a fluent interface + */ + public function setMovies($movies = null) + { + $this->_movies = $movies; + return $this; + } + + /** + * Returns the movies + * + * @return Zend_Gdata_YouTube_Extension_Movies The movies + */ + public function getMovies() + { + return $this->_movies; + } + + /** + * Sets the music + * + * @param Zend_Gdata_YouTube_Extension_Music $music The music + * @return Zend_Gdata_YouTube_UserProfileEntry Provides a fluent interface + */ + public function setMusic($music = null) + { + $this->_music = $music; + return $this; + } + + /** + * Returns the music + * + * @return Zend_Gdata_YouTube_Extension_Music The music + */ + public function getMusic() + { + return $this->_music; + } + + /** + * Sets the occupation + * + * @param Zend_Gdata_YouTube_Extension_Occupation $occupation The occupation + * @return Zend_Gdata_YouTube_UserProfileEntry Provides a fluent interface + */ + public function setOccupation($occupation = null) + { + $this->_occupation = $occupation; + return $this; + } + + /** + * Returns the occupation + * + * @return Zend_Gdata_YouTube_Extension_Occupation The occupation + */ + public function getOccupation() + { + return $this->_occupation; + } + + /** + * Sets the school + * + * @param Zend_Gdata_YouTube_Extension_School $school The school + * @return Zend_Gdata_YouTube_UserProfileEntry Provides a fluent interface + */ + public function setSchool($school = null) + { + $this->_school = $school; + return $this; + } + + /** + * Returns the school + * + * @return Zend_Gdata_YouTube_Extension_School The school + */ + public function getSchool() + { + return $this->_school; + } + + /** + * Sets the gender + * + * @param Zend_Gdata_YouTube_Extension_Gender $gender The gender + * @return Zend_Gdata_YouTube_UserProfileEntry Provides a fluent interface + */ + public function setGender($gender = null) + { + $this->_gender = $gender; + return $this; + } + + /** + * Returns the gender + * + * @return Zend_Gdata_YouTube_Extension_Gender The gender + */ + public function getGender() + { + return $this->_gender; + } + + /** + * Sets the relationship + * + * @param Zend_Gdata_YouTube_Extension_Relationship $relationship The relationship + * @return Zend_Gdata_YouTube_UserProfileEntry Provides a fluent interface + */ + public function setRelationship($relationship = null) + { + $this->_relationship = $relationship; + return $this; + } + + /** + * Returns the relationship + * + * @return Zend_Gdata_YouTube_Extension_Relationship The relationship + */ + public function getRelationship() + { + return $this->_relationship; + } + + /** + * Sets the array of embedded feeds related to the video + * + * @param array $feedLink The array of embedded feeds relating to the video + * @return Zend_Gdata_YouTube_UserProfileEntry Provides a fluent interface + */ + public function setFeedLink($feedLink = null) + { + $this->_feedLink = $feedLink; + return $this; + } + + /** + * Get the feed link property for this entry. + * + * @see setFeedLink + * @param string $rel (optional) The rel value of the link to be found. + * If null, the array of links is returned. + * @return mixed If $rel is specified, a Zend_Gdata_Extension_FeedLink + * object corresponding to the requested rel value is returned + * if found, or null if the requested value is not found. If + * $rel is null or not specified, an array of all available + * feed links for this entry is returned, or null if no feed + * links are set. + */ + public function getFeedLink($rel = null) + { + if ($rel == null) { + return $this->_feedLink; + } else { + foreach ($this->_feedLink as $feedLink) { + if ($feedLink->rel == $rel) { + return $feedLink; + } + } + return null; + } + } + + /** + * Returns the URL in the gd:feedLink with the provided rel value + * + * @param string $rel The rel value to find + * @return mixed Either the URL as a string or null if a feedLink wasn't + * found with the provided rel value + */ + public function getFeedLinkHref($rel) + { + $feedLink = $this->getFeedLink($rel); + if ($feedLink !== null) { + return $feedLink->href; + } else { + return null; + } + } + + /** + * Returns the URL of the playlist list feed + * + * @return string The URL of the playlist video feed + */ + public function getPlaylistListFeedUrl() + { + return getFeedLinkHref(Zend_Gdata_YouTube::USER_PLAYLISTS_REL); + } + + /** + * Returns the URL of the uploads feed + * + * @return string The URL of the uploads video feed + */ + public function getUploadsFeedUrl() + { + return getFeedLinkHref(Zend_Gdata_YouTube::USER_UPLOADS_REL); + } + + /** + * Returns the URL of the subscriptions feed + * + * @return string The URL of the subscriptions feed + */ + public function getSubscriptionsFeedUrl() + { + return getFeedLinkHref(Zend_Gdata_YouTube::USER_SUBSCRIPTIONS_REL); + } + + /** + * Returns the URL of the contacts feed + * + * @return string The URL of the contacts feed + */ + public function getContactsFeedUrl() + { + return getFeedLinkHref(Zend_Gdata_YouTube::USER_CONTACTS_REL); + } + + /** + * Returns the URL of the favorites feed + * + * @return string The URL of the favorites feed + */ + public function getFavoritesFeedUrl() + { + return getFeedLinkHref(Zend_Gdata_YouTube::USER_FAVORITES_REL); + } + +} diff --git a/libs/Zend/Gdata/YouTube/VideoEntry.php b/libs/Zend/Gdata/YouTube/VideoEntry.php new file mode 100644 index 0000000..d46b0b9 --- /dev/null +++ b/libs/Zend/Gdata/YouTube/VideoEntry.php @@ -0,0 +1,1031 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + + parent::__construct($element); + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_noEmbed != null) { + $element->appendChild($this->_noEmbed->getDOM( + $element->ownerDocument)); + } + if ($this->_statistics != null) { + $element->appendChild($this->_statistics->getDOM( + $element->ownerDocument)); + } + if ($this->_racy != null) { + $element->appendChild($this->_racy->getDOM( + $element->ownerDocument)); + } + if ($this->_recorded != null) { + $element->appendChild($this->_recorded->getDOM( + $element->ownerDocument)); + } + if ($this->_rating != null) { + $element->appendChild($this->_rating->getDOM( + $element->ownerDocument)); + } + if ($this->_comments != null) { + $element->appendChild($this->_comments->getDOM( + $element->ownerDocument)); + } + if ($this->_feedLink != null) { + foreach ($this->_feedLink as $feedLink) { + $element->appendChild($feedLink->getDOM( + $element->ownerDocument)); + } + } + if ($this->_where != null) { + $element->appendChild($this->_where->getDOM( + $element->ownerDocument)); + } + return $element; + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them in the $_entry array based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('yt') . ':' . 'statistics': + $statistics = new Zend_Gdata_YouTube_Extension_Statistics(); + $statistics->transferFromDOM($child); + $this->_statistics = $statistics; + break; + case $this->lookupNamespace('yt') . ':' . 'racy': + $racy = new Zend_Gdata_YouTube_Extension_Racy(); + $racy->transferFromDOM($child); + $this->_racy = $racy; + break; + case $this->lookupNamespace('yt') . ':' . 'recorded': + $recorded = new Zend_Gdata_YouTube_Extension_Recorded(); + $recorded->transferFromDOM($child); + $this->_recorded = $recorded; + break; + case $this->lookupNamespace('gd') . ':' . 'rating': + $rating = new Zend_Gdata_Extension_Rating(); + $rating->transferFromDOM($child); + $this->_rating = $rating; + break; + case $this->lookupNamespace('gd') . ':' . 'comments': + $comments = new Zend_Gdata_Extension_Comments(); + $comments->transferFromDOM($child); + $this->_comments = $comments; + break; + case $this->lookupNamespace('yt') . ':' . 'noembed': + $noEmbed = new Zend_Gdata_YouTube_Extension_NoEmbed(); + $noEmbed->transferFromDOM($child); + $this->_noEmbed = $noEmbed; + break; + case $this->lookupNamespace('gd') . ':' . 'feedLink': + $feedLink = new Zend_Gdata_Extension_FeedLink(); + $feedLink->transferFromDOM($child); + $this->_feedLink[] = $feedLink; + break; + case $this->lookupNamespace('georss') . ':' . 'where': + $where = new Zend_Gdata_Geo_Extension_GeoRssWhere(); + $where->transferFromDOM($child); + $this->_where = $where; + break; + case $this->lookupNamespace('atom') . ':' . 'link'; + $link = new Zend_Gdata_YouTube_Extension_Link(); + $link->transferFromDOM($child); + $this->_link[] = $link; + break; + case $this->lookupNamespace('app') . ':' . 'control': + $control = new Zend_Gdata_YouTube_Extension_Control(); + $control->transferFromDOM($child); + $this->_control = $control; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + /** + * Sets when the video was recorded. + * + * @param Zend_Gdata_YouTube_Extension_Recorded $recorded When the video was recorded + * @return Zend_Gdata_YouTube_VideoEntry Provides a fluent interface + */ + public function setRecorded($recorded = null) + { + $this->_recorded = $recorded; + return $this; + } + + /** + * Gets the date that the video was recorded. + * + * @return Zend_Gdata_YouTube_Extension_Recorded|null + */ + public function getRecorded() + { + return $this->_recorded; + } + + /** + * If an instance of Zend_Gdata_YouTube_Extension_NoEmbed is passed in, + * the video cannot be embedded. Otherwise, if null is passsed in, the + * video is able to be embedded. + * + * @param Zend_Gdata_YouTube_Extension_NoEmbed $noEmbed Whether or not the + * video can be embedded. + * @return Zend_Gdata_YouTube_VideoEntry Provides a fluent interface + */ + public function setNoEmbed($noEmbed = null) + { + $this->_noEmbed = $noEmbed; + return $this; + } + + /** + * If the return value is an instance of + * Zend_Gdata_YouTube_Extension_NoEmbed, this video cannot be embedded. + * + * @return Zend_Gdata_YouTube_Extension_NoEmbed|null Whether or not the video can be embedded + */ + public function getNoEmbed() + { + return $this->_noEmbed; + } + + /** + * Checks whether the video is embeddable. + * + * @return bool Returns true if the video is embeddable. + */ + public function isVideoEmbeddable() + { + if ($this->getNoEmbed() == null) { + return true; + } else { + return false; + } + } + + /** + * Sets the statistics relating to the video. + * + * @param Zend_Gdata_YouTube_Extension_Statistics $statistics The statistics relating to the video + * @return Zend_Gdata_YouTube_VideoEntry Provides a fluent interface + */ + public function setStatistics($statistics = null) + { + $this->_statistics = $statistics; + return $this; + } + + /** + * Returns the statistics relating to the video. + * + * @return Zend_Gdata_YouTube_Extension_Statistics The statistics relating to the video + */ + public function getStatistics() + { + return $this->_statistics; + } + + /** + * Specifies that the video has racy content. + * + * @param Zend_Gdata_YouTube_Extension_Racy $racy The racy flag object + * @return Zend_Gdata_YouTube_VideoEntry Provides a fluent interface + */ + public function setRacy($racy = null) + { + $this->_racy = $racy; + return $this; + } + + /** + * Returns the racy flag object. + * + * @return Zend_Gdata_YouTube_Extension_Racy|null The racy flag object + */ + public function getRacy() + { + return $this->_racy; + } + + /** + * Sets the rating relating to the video. + * + * @param Zend_Gdata_Extension_Rating $rating The rating relating to the video + * @return Zend_Gdata_YouTube_VideoEntry Provides a fluent interface + */ + public function setRating($rating = null) + { + $this->_rating = $rating; + return $this; + } + + /** + * Returns the rating relating to the video. + * + * @return Zend_Gdata_Extension_Rating The rating relating to the video + */ + public function getRating() + { + return $this->_rating; + } + + /** + * Sets the comments relating to the video. + * + * @param Zend_Gdata_Extension_Comments $comments The comments relating to the video + * @return Zend_Gdata_YouTube_VideoEntry Provides a fluent interface + */ + public function setComments($comments = null) + { + $this->_comments = $comments; + return $this; + } + + /** + * Returns the comments relating to the video. + * + * @return Zend_Gdata_Extension_Comments The comments relating to the video + */ + public function getComments() + { + return $this->_comments; + } + + /** + * Sets the array of embedded feeds related to the video + * + * @param array $feedLink The array of embedded feeds relating to the video + * @return Zend_Gdata_YouTube_VideoEntry Provides a fluent interface + */ + public function setFeedLink($feedLink = null) + { + $this->_feedLink = $feedLink; + return $this; + } + + /** + * Get the feed link property for this entry. + * + * @see setFeedLink + * @param string $rel (optional) The rel value of the link to be found. + * If null, the array of links is returned. + * @return mixed If $rel is specified, a Zend_Gdata_Extension_FeedLink + * object corresponding to the requested rel value is returned + * if found, or null if the requested value is not found. If + * $rel is null or not specified, an array of all available + * feed links for this entry is returned, or null if no feed + * links are set. + */ + public function getFeedLink($rel = null) + { + if ($rel == null) { + return $this->_feedLink; + } else { + foreach ($this->_feedLink as $feedLink) { + if ($feedLink->rel == $rel) { + return $feedLink; + } + } + return null; + } + } + + /** + * Returns the link element relating to video responses. + * + * @return Zend_Gdata_App_Extension_Link + */ + public function getVideoResponsesLink() + { + return $this->getLink(Zend_Gdata_YouTube::VIDEO_RESPONSES_REL); + } + + /** + * Returns the link element relating to video ratings. + * + * @return Zend_Gdata_App_Extension_Link + */ + public function getVideoRatingsLink() + { + return $this->getLink(Zend_Gdata_YouTube::VIDEO_RATINGS_REL); + } + + /** + * Returns the link element relating to video complaints. + * + * @return Zend_Gdata_App_Extension_Link + */ + public function getVideoComplaintsLink() + { + return $this->getLink(Zend_Gdata_YouTube::VIDEO_COMPLAINTS_REL); + } + + /** + * Gets the YouTube video ID based upon the atom:id value + * + * @return string The video ID + */ + public function getVideoId() + { + $fullId = $this->getId()->getText(); + $position = strrpos($fullId, '/'); + if ($position === false) { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception('Slash not found in atom:id'); + } else { + return substr($fullId, strrpos($fullId,'/') + 1); + } + } + + /** + * Gets the date that the video was recorded. + * + * @return string|null The date that the video was recorded + */ + public function getVideoRecorded() + { + $recorded = $this->getRecorded(); + if ($recorded != null) { + return $recorded->getText(); + } else { + return null; + } + } + + /** + * Sets the date that the video was recorded. + * + * @param string $recorded The date that the video was recorded, in the + * format of '2001-06-19' + */ + public function setVideoRecorded($recorded) + { + $this->setRecorded( + new Zend_Gdata_YouTube_Extension_Recorded($recorded)); + return $this; + } + + /** + * Gets the georss:where element + * + * @return Zend_Gdata_Geo_Extension_GeoRssWhere + */ + public function getWhere() + { + return $this->_where; + } + + /** + * Sets the georss:where element + * + * @param Zend_Gdata_Geo_Extension_GeoRssWhere $value The georss:where class value + * @return Zend_Gdata_YouTube_VideoEntry Provides a fluent interface + */ + public function setWhere($value) + { + $this->_where = $value; + return $this; + } + + /** + * Gets the title of the video as a string. null is returned + * if the video title is not available. + * + * @return string|null The title of the video + */ + public function getVideoTitle() + { + $this->ensureMediaGroupIsNotNull(); + if ($this->getMediaGroup()->getTitle() != null) { + return $this->getMediaGroup()->getTitle()->getText(); + } else { + return null; + } + } + + /** + * Sets the title of the video as a string. + * + * @param string $title Title for the video + * @return Zend_Gdata_YouTube_VideoEntry Provides a fluent interface + */ + public function setVideoTitle($title) + { + $this->ensureMediaGroupIsNotNull(); + $this->getMediaGroup()->setTitle( + new Zend_Gdata_Media_Extension_MediaTitle($title)); + return $this; + } + + /** + * Sets the description of the video as a string. + * + * @param string $description Description for the video + * @return Zend_Gdata_YouTube_VideoEntry Provides a fluent interface + */ + public function setVideoDescription($description) + { + $this->ensureMediaGroupIsNotNull(); + $this->getMediaGroup()->setDescription( + new Zend_Gdata_Media_Extension_MediaDescription($description)); + return $this; + } + + + /** + * Gets the description of the video as a string. null is returned + * if the video description is not available. + * + * @return string|null The description of the video + */ + public function getVideoDescription() + { + $this->ensureMediaGroupIsNotNull(); + if ($this->getMediaGroup()->getDescription() != null) { + return $this->getMediaGroup()->getDescription()->getText(); + } else { + return null; + } + } + + /** + * Gets the URL of the YouTube video watch page. null is returned + * if the video watch page URL is not available. + * + * @return string|null The URL of the YouTube video watch page + */ + public function getVideoWatchPageUrl() + { + $this->ensureMediaGroupIsNotNull(); + if ($this->getMediaGroup()->getPlayer() != null && + array_key_exists(0, $this->getMediaGroup()->getPlayer())) { + $players = $this->getMediaGroup()->getPlayer(); + return $players[0]->getUrl(); + } else { + return null; + } + } + + /** + * Gets an array of the thumbnails representing the video. + * Each thumbnail is an element of the array, and is an + * array of the thumbnail properties - time, height, width, + * and url. For convient usage inside a foreach loop, an + * empty array is returned if there are no thumbnails. + * + * @return array An array of video thumbnails. + */ + public function getVideoThumbnails() + { + $this->ensureMediaGroupIsNotNull(); + if ($this->getMediaGroup()->getThumbnail() != null) { + + $thumbnailArray = array(); + + foreach ($this->getMediaGroup()->getThumbnail() as $thumbnailObj) { + $thumbnail = array(); + $thumbnail['time'] = $thumbnailObj->time; + $thumbnail['height'] = $thumbnailObj->height; + $thumbnail['width'] = $thumbnailObj->width; + $thumbnail['url'] = $thumbnailObj->url; + $thumbnailArray[] = $thumbnail; + } + return $thumbnailArray; + } else { + return array(); + } + } + + /** + * Gets the URL of the flash player SWF. null is returned if the + * duration value is not available. + * + * @return string|null The URL of the flash player SWF + */ + public function getFlashPlayerUrl() + { + $this->ensureMediaGroupIsNotNull(); + foreach ($this->getMediaGroup()->getContent() as $content) { + if ($content->getType() === 'application/x-shockwave-flash') { + return $content->getUrl(); + } + } + return null; + } + + /** + * Gets the duration of the video, in seconds. null is returned + * if the duration value is not available. + * + * @return string|null The duration of the video, in seconds. + */ + public function getVideoDuration() + { + $this->ensureMediaGroupIsNotNull(); + if ($this->getMediaGroup()->getDuration() != null) { + return $this->getMediaGroup()->getDuration()->getSeconds(); + } else { + return null; + } + } + + /** + * Checks whether the video is private. + * + * @return bool Return true if video is private + */ + public function isVideoPrivate() + { + $this->ensureMediaGroupIsNotNull(); + if ($this->getMediaGroup()->getPrivate() != null) { + return true; + } else { + return false; + } + } + + /** + * Sets video to private. + * + * @return Zend_Gdata_YouTube_VideoEntry Provides a fluent interface + */ + public function setVideoPrivate() + { + $this->ensureMediaGroupIsNotNull(); + $this->getMediaGroup()->setPrivate(new Zend_Gdata_YouTube_Extension_Private()); + return $this; + } + + /** + * Sets a private video to be public. + * + * @return Zend_Gdata_YouTube_VideoEntry Provides a fluent interface + */ + public function setVideoPublic() + { + $this->ensureMediaGroupIsNotNull(); + $this->getMediaGroup()->private = null; + return $this; + } + + /** + * Gets an array of the tags assigned to this video. For convient + * usage inside a foreach loop, an empty array is returned when there + * are no tags assigned. + * + * @return array An array of the tags assigned to this video + */ + public function getVideoTags() + { + $this->ensureMediaGroupIsNotNull(); + if ($this->getMediaGroup()->getKeywords() != null) { + + $keywords = $this->getMediaGroup()->getKeywords(); + $keywordsString = $keywords->getText(); + if (strlen(trim($keywordsString)) > 0) { + return split('(, *)|,', $keywordsString); + } + } + return array(); + } + + /** + * Sets the keyword tags for a video. + * + * @param mixed $tags Either a comma-separated string or an array + * of tags for the video + * @return Zend_Gdata_YouTube_VideoEntry Provides a fluent interface + */ + public function setVideoTags($tags) + { + $this->ensureMediaGroupIsNotNull(); + $keywords = new Zend_Gdata_Media_Extension_MediaKeywords(); + if (is_array($tags)) { + $tags = implode(', ', $tags); + } + $keywords->setText($tags); + $this->getMediaGroup()->setKeywords($keywords); + return $this; + } + + /** + * Gets the number of views for this video. null is returned if the + * number of views is not available. + * + * @return string|null The number of views for this video + */ + public function getVideoViewCount() + { + if ($this->getStatistics() != null) { + return $this->getStatistics()->getViewCount(); + } else { + return null; + } + } + + /** + * Gets the location specified for this video, if available. The location + * is returned as an array containing the keys 'longitude' and 'latitude'. + * null is returned if the location is not available. + * + * @return array|null The location specified for this video + */ + public function getVideoGeoLocation() + { + if ($this->getWhere() != null && + $this->getWhere()->getPoint() != null && + ($position = $this->getWhere()->getPoint()->getPos()) != null) { + + $positionString = $position->__toString(); + + if (strlen(trim($positionString)) > 0) { + $positionArray = explode(' ', trim($positionString)); + if (count($positionArray) == 2) { + $returnArray = array(); + $returnArray['latitude'] = $positionArray[0]; + $returnArray['longitude'] = $positionArray[1]; + return $returnArray; + } + } + } + return null; + } + + /** + * Gets the rating information for this video, if available. The rating + * is returned as an array containing the keys 'average' and 'numRaters'. + * null is returned if the rating information is not available. + * + * @return array|null The rating information for this video + */ + public function getVideoRatingInfo() + { + if ($this->getRating() != null) { + $returnArray = array(); + $returnArray['average'] = $this->getRating()->getAverage(); + $returnArray['numRaters'] = $this->getRating()->getNumRaters(); + return $returnArray; + } else { + return null; + } + } + + /** + * Gets the category of this video, if available. The category is returned + * as a string. Valid categories are found at: + * http://gdata.youtube.com/schemas/2007/categories.cat + * If the category is not set, null is returned. + * + * @return string|null The category of this video + */ + public function getVideoCategory() + { + $this->ensureMediaGroupIsNotNull(); + $categories = $this->getMediaGroup()->getCategory(); + if ($categories != null) { + foreach($categories as $category) { + if ($category->getScheme() == self::YOUTUBE_CATEGORY_SCHEMA) { + return $category->getText(); + } + } + } + return null; + } + + /** + * Sets the category of the video as a string. + * + * @param string $category Categories for the video + * @return Zend_Gdata_YouTube_VideoEntry Provides a fluent interface + */ + public function setVideoCategory($category) + { + $this->ensureMediaGroupIsNotNull(); + $this->getMediaGroup()->setCategory(array(new Zend_Gdata_Media_Extension_MediaCategory($category, self::YOUTUBE_CATEGORY_SCHEMA))); + return $this; + } + + /** + * Gets the developer tags for the video, if available and if client is + * authenticated with a valid developerKey. The tags are returned + * as an array. + * If no tags are set, null is returned. + * + * @return array|null The developer tags for this video or null if none were set. + */ + public function getVideoDeveloperTags() + { + $developerTags = null; + $this->ensureMediaGroupIsNotNull(); + + $categoryArray = $this->getMediaGroup()->getCategory(); + if ($categoryArray != null) { + foreach ($categoryArray as $category) { + if ($category instanceof Zend_Gdata_Media_Extension_MediaCategory) { + if ($category->getScheme() == self::YOUTUBE_DEVELOPER_TAGS_SCHEMA) { + $developerTags[] = $category->getText(); + } + } + } + return $developerTags; + } + return null; + } + + /** + * Adds a developer tag to array of tags for the video. + * + * @param string $developerTag DeveloperTag for the video + * @return Zend_Gdata_YouTube_VideoEntry Provides a fluent interface + */ + public function addVideoDeveloperTag($developerTag) + { + $this->ensureMediaGroupIsNotNull(); + $newCategory = new Zend_Gdata_Media_Extension_MediaCategory($developerTag, self::YOUTUBE_DEVELOPER_TAGS_SCHEMA); + + if ($this->getMediaGroup()->getCategory() == null) { + $this->getMediaGroup()->setCategory($newCategory); + } else { + $categories = $this->getMediaGroup()->getCategory(); + $categories[] = $newCategory; + $this->getMediaGroup()->setCategory($categories); + } + return $this; + } + + /** + * Set multiple developer tags for the video as strings. + * + * @param array $developerTags Array of developerTag for the video + * @return Zend_Gdata_YouTube_VideoEntry Provides a fluent interface + */ + public function setVideoDeveloperTags($developerTags) + { + foreach($developerTags as $developerTag) { + $this->addVideoDeveloperTag($developerTag); + } + return $this; + } + + + /** + * Get the current publishing state of the video. + * + * @return Zend_Gdata_YouTube_Extension_State|null The publishing state of this video + */ + public function getVideoState() + { + $control = $this->getControl(); + if ($control != null && + $control->getDraft() != null && + $control->getDraft()->getText() == 'yes') { + + return $control->getState(); + } + return null; + } + + /** + * Get the VideoEntry's Zend_Gdata_YouTube_Extension_MediaGroup object. + * If the mediaGroup does not exist, then set it. + * + * @return void + */ + public function ensureMediaGroupIsNotNull() + { + if ($this->getMediagroup() == null) { + $this->setMediagroup(new Zend_Gdata_YouTube_Extension_MediaGroup()); + } + } + + /** + * Helper function to conveniently set a video's rating. + * + * @param integer $ratingValue A number representing the rating. Must + * be between 1 and 5 inclusive. + * @throws Zend_Gdata_Exception + * @return Zend_Gdata_YouTube_VideoEntry Provides a fluent interface. + */ + public function setVideoRating($ratingValue) + { + if ($ratingValue < 1 || $ratingValue > 5) { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'Rating for video entry must be between 1 and 5 inclusive.'); + } + + require_once 'Zend/Gdata/Extension/Rating.php'; + $rating = new Zend_Gdata_Extension_Rating(null, 1, 5, null, + $ratingValue); + $this->setRating($rating); + return $this; + } + + /** + * Retrieve the URL for a video's comment feed. + * + * @return string|null The URL if found, or null if not found. + */ + public function getVideoCommentFeedUrl() + { + $commentsExtension = $this->getComments(); + $commentsFeedUrl = null; + if ($commentsExtension) { + $commentsFeedLink = $commentsExtension->getFeedLink(); + if ($commentsFeedLink) { + $commentsFeedUrl = $commentsFeedLink->getHref(); + } + } + return $commentsFeedUrl; + } + +} diff --git a/libs/Zend/Gdata/YouTube/VideoFeed.php b/libs/Zend/Gdata/YouTube/VideoFeed.php new file mode 100644 index 0000000..9ff4a53 --- /dev/null +++ b/libs/Zend/Gdata/YouTube/VideoFeed.php @@ -0,0 +1,65 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct($element); + } + +} diff --git a/libs/Zend/Gdata/YouTube/VideoQuery.php b/libs/Zend/Gdata/YouTube/VideoQuery.php new file mode 100644 index 0000000..9650e76 --- /dev/null +++ b/libs/Zend/Gdata/YouTube/VideoQuery.php @@ -0,0 +1,297 @@ +_url = Zend_Gdata_YouTube::STANDARD_TOP_RATED_URI; + break; + case 'most viewed': + $this->_url = Zend_Gdata_YouTube::STANDARD_MOST_VIEWED_URI; + break; + case 'recently featured': + $this->_url = Zend_Gdata_YouTube::STANDARD_RECENTLY_FEATURED_URI; + break; + case 'mobile': + $this->_url = Zend_Gdata_YouTube::STANDARD_WATCH_ON_MOBILE_URI; + break; + case 'related': + if ($videoId === null) { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception('Video ID must be set for feed of type: ' . $feedType); + } else { + $this->_url = Zend_Gdata_YouTube::VIDEO_URI . '/' . $videoId . '/related'; + } + break; + case 'responses': + if ($videoId === null) { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception('Video ID must be set for feed of type: ' . $feedType); + } else { + $this->_url = Zend_Gdata_YouTube::VIDEO_URI . '/' . $videoId . 'responses'; + } + break; + case 'comments': + if ($videoId === null) { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception('Video ID must be set for feed of type: ' . $feedType); + } else { + $this->_url = Zend_Gdata_YouTube::VIDEO_URI . '/' . $videoId . 'comments'; + if ($entry !== null) { + $this->_url .= '/' . $entry; + } + } + break; + default: + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception('Unknown feed type'); + break; + } + } + + + /** + * Sets the time period over which this query should apply + * + * @param string $value + * @return Zend_Gdata_YouTube_VideoQuery Provides a fluent interface + */ + public function setTime($value = null) + { + switch ($value) { + case 'today': + $this->_params['time'] = 'today'; + break; + case 'this_week': + $this->_params['time'] = 'this_week'; + break; + case 'this_month': + $this->_params['time'] = 'this_month'; + break; + case 'all_time': + $this->_params['time'] = 'all_time'; + break; + case null: + unset($this->_params['time']); + default: + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception('Unknown time value'); + break; + } + return $this; + } + + /** + * Sets the formatted video query (vq) URL param value + * + * @param string $value + * @return Zend_Gdata_YouTube_VideoQuery Provides a fluent interface + */ + public function setVideoQuery($value = null) + { + if ($value != null) { + $this->_params['vq'] = $value; + } else { + unset($this->_params['vq']); + } + return $this; + } + + /** + * Sets the param to return videos of a specific format + * + * @param string $value + * @return Zend_Gdata_YouTube_VideoQuery Provides a fluent interface + */ + public function setFormat($value = null) + { + if ($value != null) { + $this->_params['format'] = $value; + } else { + unset($this->_params['format']); + } + return $this; + } + + /** + * Sets whether or not to include racy videos in the search results + * + * @param string $value + * @return Zend_Gdata_YouTube_VideoQuery Provides a fluent interface + */ + public function setRacy($value = null) + { + switch ($value) { + case 'include': + $this->_params['racy'] = $value; + break; + case 'exclude': + $this->_params['racy'] = $value; + break; + case null: + unset($this->_params['racy']); + break; + } + return $this; + } + + /** + * @param string $value + * @return Zend_Gdata_YouTube_Query Provides a fluent interface + */ + public function setOrderBy($value) + { + if ($value != null) { + $this->_params['orderby'] = $value; + } else { + unset($this->_params['orderby']); + } + return $this; + } + + /** + * Whether or not to include racy videos in the search results + * + * @return string racy + */ + public function getRacy() + { + if (array_key_exists('racy', $this->_params)) { + return $this->_params['racy']; + } else { + return null; + } + } + + /** + * The format used for videos + * + * @return string format + */ + public function getFormat() + { + if (array_key_exists('format', $this->_params)) { + return $this->_params['format']; + } else { + return null; + } + } + + /** + * The video query + * + * @return string video query + */ + public function getVideoQuery() + { + if (array_key_exists('vq', $this->_params)) { + return $this->_params['vq']; + } else { + return null; + } + } + + /** + * The time + * + * @return string time + */ + public function getTime() + { + if (array_key_exists('time', $this->_params)) { + return $this->_params['time']; + } else { + return null; + } + } + + /** + * @return string orderby + */ + public function getOrderBy() + { + if (array_key_exists('orderby', $this->_params)) { + return $this->_params['orderby']; + } else { + return null; + } + } + + /** + * Returns the generated full query URL + * + * @return string The URL + */ + public function getQueryUrl() + { + if (isset($this->_url)) { + $url = $this->_url; + } else { + $url = Zend_Gdata_YouTube::VIDEO_URI; + } + if ($this->getCategory() !== null) { + $url .= '/-/' . $this->getCategory(); + } + $url = $url . $this->getQueryString(); + return $url; + } + +} diff --git a/libs/Zend/Http/Client.php b/libs/Zend/Http/Client.php new file mode 100644 index 0000000..3964adb --- /dev/null +++ b/libs/Zend/Http/Client.php @@ -0,0 +1,1199 @@ + 5, + 'strictredirects' => false, + 'useragent' => 'Zend_Http_Client', + 'timeout' => 10, + 'adapter' => 'Zend_Http_Client_Adapter_Socket', + 'httpversion' => self::HTTP_1, + 'keepalive' => false, + 'storeresponse' => true, + 'strict' => true + ); + + /** + * The adapter used to preform the actual connection to the server + * + * @var Zend_Http_Client_Adapter_Interface + */ + protected $adapter = null; + + /** + * Request URI + * + * @var Zend_Uri_Http + */ + protected $uri; + + /** + * Associative array of request headers + * + * @var array + */ + protected $headers = array(); + + /** + * HTTP request method + * + * @var string + */ + protected $method = self::GET; + + /** + * Associative array of GET parameters + * + * @var array + */ + protected $paramsGet = array(); + + /** + * Assiciative array of POST parameters + * + * @var array + */ + protected $paramsPost = array(); + + /** + * Request body content type (for POST requests) + * + * @var string + */ + protected $enctype = null; + + /** + * The raw post data to send. Could be set by setRawData($data, $enctype). + * + * @var string + */ + protected $raw_post_data = null; + + /** + * HTTP Authentication settings + * + * Expected to be an associative array with this structure: + * $this->auth = array('user' => 'username', 'password' => 'password', 'type' => 'basic') + * Where 'type' should be one of the supported authentication types (see the AUTH_* + * constants), for example 'basic' or 'digest'. + * + * If null, no authentication will be used. + * + * @var array|null + */ + protected $auth; + + /** + * File upload arrays (used in POST requests) + * + * An associative array, where each element is of the format: + * 'name' => array('filename.txt', 'text/plain', 'This is the actual file contents') + * + * @var array + */ + protected $files = array(); + + /** + * The client's cookie jar + * + * @var Zend_Http_CookieJar + */ + protected $cookiejar = null; + + /** + * The last HTTP request sent by the client, as string + * + * @var string + */ + protected $last_request = null; + + /** + * The last HTTP response received by the client + * + * @var Zend_Http_Response + */ + protected $last_response = null; + + /** + * Redirection counter + * + * @var int + */ + protected $redirectCounter = 0; + + /** + * Fileinfo magic database resource + * + * This varaiable is populated the first time _detectFileMimeType is called + * and is then reused on every call to this method + * + * @var resource + */ + static protected $_fileInfoDb = null; + + /** + * Contructor method. Will create a new HTTP client. Accepts the target + * URL and optionally configuration array. + * + * @param Zend_Uri_Http|string $uri + * @param array $config Configuration key-value pairs. + */ + public function __construct($uri = null, $config = null) + { + if ($uri !== null) $this->setUri($uri); + if ($config !== null) $this->setConfig($config); + } + + /** + * Set the URI for the next request + * + * @param Zend_Uri_Http|string $uri + * @return Zend_Http_Client + * @throws Zend_Http_Client_Exception + */ + public function setUri($uri) + { + if (is_string($uri)) { + $uri = Zend_Uri::factory($uri); + } + + if (!$uri instanceof Zend_Uri_Http) { + /** @see Zend_Http_Client_Exception */ + require_once 'Zend/Http/Client/Exception.php'; + throw new Zend_Http_Client_Exception('Passed parameter is not a valid HTTP URI.'); + } + + // We have no ports, set the defaults + if (! $uri->getPort()) { + $uri->setPort(($uri->getScheme() == 'https' ? 443 : 80)); + } + + $this->uri = $uri; + + return $this; + } + + /** + * Get the URI for the next request + * + * @param boolean $as_string If true, will return the URI as a string + * @return Zend_Uri_Http|string + */ + public function getUri($as_string = false) + { + if ($as_string && $this->uri instanceof Zend_Uri_Http) { + return $this->uri->__toString(); + } else { + return $this->uri; + } + } + + /** + * Set configuration parameters for this HTTP client + * + * @param array $config + * @return Zend_Http_Client + * @throws Zend_Http_Client_Exception + */ + public function setConfig($config = array()) + { + if (! is_array($config)) { + /** @see Zend_Http_Client_Exception */ + require_once 'Zend/Http/Client/Exception.php'; + throw new Zend_Http_Client_Exception('Expected array parameter, given ' . gettype($config)); + } + + foreach ($config as $k => $v) + $this->config[strtolower($k)] = $v; + + // Pass configuration options to the adapter if it exists + if ($this->adapter instanceof Zend_Http_Client_Adapter_Interface) { + $this->adapter->setConfig($config); + } + + return $this; + } + + /** + * Set the next request's method + * + * Validated the passed method and sets it. If we have files set for + * POST requests, and the new method is not POST, the files are silently + * dropped. + * + * @param string $method + * @return Zend_Http_Client + * @throws Zend_Http_Client_Exception + */ + public function setMethod($method = self::GET) + { + $regex = '/^[^\x00-\x1f\x7f-\xff\(\)<>@,;:\\\\"\/\[\]\?={}\s]+$/'; + if (! preg_match($regex, $method)) { + /** @see Zend_Http_Client_Exception */ + require_once 'Zend/Http/Client/Exception.php'; + throw new Zend_Http_Client_Exception("'{$method}' is not a valid HTTP request method."); + } + + if ($method == self::POST && $this->enctype === null) + $this->setEncType(self::ENC_URLENCODED); + + $this->method = $method; + + return $this; + } + + /** + * Set one or more request headers + * + * This function can be used in several ways to set the client's request + * headers: + * 1. By providing two parameters: $name as the header to set (eg. 'Host') + * and $value as it's value (eg. 'www.example.com'). + * 2. By providing a single header string as the only parameter + * eg. 'Host: www.example.com' + * 3. By providing an array of headers as the first parameter + * eg. array('host' => 'www.example.com', 'x-foo: bar'). In This case + * the function will call itself recursively for each array item. + * + * @param string|array $name Header name, full header string ('Header: value') + * or an array of headers + * @param mixed $value Header value or null + * @return Zend_Http_Client + * @throws Zend_Http_Client_Exception + */ + public function setHeaders($name, $value = null) + { + // If we got an array, go recusive! + if (is_array($name)) { + foreach ($name as $k => $v) { + if (is_string($k)) { + $this->setHeaders($k, $v); + } else { + $this->setHeaders($v, null); + } + } + } else { + // Check if $name needs to be split + if ($value === null && (strpos($name, ':') > 0)) + list($name, $value) = explode(':', $name, 2); + + // Make sure the name is valid if we are in strict mode + if ($this->config['strict'] && (! preg_match('/^[a-zA-Z0-9-]+$/', $name))) { + /** @see Zend_Http_Client_Exception */ + require_once 'Zend/Http/Client/Exception.php'; + throw new Zend_Http_Client_Exception("{$name} is not a valid HTTP header name"); + } + + $normalized_name = strtolower($name); + + // If $value is null or false, unset the header + if ($value === null || $value === false) { + unset($this->headers[$normalized_name]); + + // Else, set the header + } else { + // Header names are storred lowercase internally. + if (is_string($value)) $value = trim($value); + $this->headers[$normalized_name] = array($name, $value); + } + } + + return $this; + } + + /** + * Get the value of a specific header + * + * Note that if the header has more than one value, an array + * will be returned. + * + * @param string $key + * @return string|array|null The header value or null if it is not set + */ + public function getHeader($key) + { + $key = strtolower($key); + if (isset($this->headers[$key])) { + return $this->headers[$key][1]; + } else { + return null; + } + } + + /** + * Set a GET parameter for the request. Wrapper around _setParameter + * + * @param string|array $name + * @param string $value + * @return Zend_Http_Client + */ + public function setParameterGet($name, $value = null) + { + if (is_array($name)) { + foreach ($name as $k => $v) + $this->_setParameter('GET', $k, $v); + } else { + $this->_setParameter('GET', $name, $value); + } + + return $this; + } + + /** + * Set a POST parameter for the request. Wrapper around _setParameter + * + * @param string|array $name + * @param string $value + * @return Zend_Http_Client + */ + public function setParameterPost($name, $value = null) + { + if (is_array($name)) { + foreach ($name as $k => $v) + $this->_setParameter('POST', $k, $v); + } else { + $this->_setParameter('POST', $name, $value); + } + + return $this; + } + + /** + * Set a GET or POST parameter - used by SetParameterGet and SetParameterPost + * + * @param string $type GET or POST + * @param string $name + * @param string $value + * @return null + */ + protected function _setParameter($type, $name, $value) + { + $parray = array(); + $type = strtolower($type); + switch ($type) { + case 'get': + $parray = &$this->paramsGet; + break; + case 'post': + $parray = &$this->paramsPost; + break; + } + + if ($value === null) { + if (isset($parray[$name])) unset($parray[$name]); + } else { + $parray[$name] = $value; + } + } + + /** + * Get the number of redirections done on the last request + * + * @return int + */ + public function getRedirectionsCount() + { + return $this->redirectCounter; + } + + /** + * Set HTTP authentication parameters + * + * $type should be one of the supported types - see the self::AUTH_* + * constants. + * + * To enable authentication: + * + * $this->setAuth('shahar', 'secret', Zend_Http_Client::AUTH_BASIC); + * + * + * To disable authentication: + * + * $this->setAuth(false); + * + * + * @see http://www.faqs.org/rfcs/rfc2617.html + * @param string|false $user User name or false disable authentication + * @param string $password Password + * @param string $type Authentication type + * @return Zend_Http_Client + * @throws Zend_Http_Client_Exception + */ + public function setAuth($user, $password = '', $type = self::AUTH_BASIC) + { + // If we got false or null, disable authentication + if ($user === false || $user === null) { + $this->auth = null; + + // Else, set up authentication + } else { + // Check we got a proper authentication type + if (! defined('self::AUTH_' . strtoupper($type))) { + /** @see Zend_Http_Client_Exception */ + require_once 'Zend/Http/Client/Exception.php'; + throw new Zend_Http_Client_Exception("Invalid or not supported authentication type: '$type'"); + } + + $this->auth = array( + 'user' => (string) $user, + 'password' => (string) $password, + 'type' => $type + ); + } + + return $this; + } + + /** + * Set the HTTP client's cookie jar. + * + * A cookie jar is an object that holds and maintains cookies across HTTP requests + * and responses. + * + * @param Zend_Http_CookieJar|boolean $cookiejar Existing cookiejar object, true to create a new one, false to disable + * @return Zend_Http_Client + * @throws Zend_Http_Client_Exception + */ + public function setCookieJar($cookiejar = true) + { + if (! class_exists('Zend_Http_CookieJar')) + require_once 'Zend/Http/CookieJar.php'; + + if ($cookiejar instanceof Zend_Http_CookieJar) { + $this->cookiejar = $cookiejar; + } elseif ($cookiejar === true) { + $this->cookiejar = new Zend_Http_CookieJar(); + } elseif (! $cookiejar) { + $this->cookiejar = null; + } else { + /** @see Zend_Http_Client_Exception */ + require_once 'Zend/Http/Client/Exception.php'; + throw new Zend_Http_Client_Exception('Invalid parameter type passed as CookieJar'); + } + + return $this; + } + + /** + * Return the current cookie jar or null if none. + * + * @return Zend_Http_CookieJar|null + */ + public function getCookieJar() + { + return $this->cookiejar; + } + + /** + * Add a cookie to the request. If the client has no Cookie Jar, the cookies + * will be added directly to the headers array as "Cookie" headers. + * + * @param Zend_Http_Cookie|string $cookie + * @param string|null $value If "cookie" is a string, this is the cookie value. + * @return Zend_Http_Client + * @throws Zend_Http_Client_Exception + */ + public function setCookie($cookie, $value = null) + { + if (! class_exists('Zend_Http_Cookie')) + require_once 'Zend/Http/Cookie.php'; + + if (is_array($cookie)) { + foreach ($cookie as $c => $v) { + if (is_string($c)) { + $this->setCookie($c, $v); + } else { + $this->setCookie($v); + } + } + + return $this; + } + + if ($value !== null) $value = urlencode($value); + + if (isset($this->cookiejar)) { + if ($cookie instanceof Zend_Http_Cookie) { + $this->cookiejar->addCookie($cookie); + } elseif (is_string($cookie) && $value !== null) { + $cookie = Zend_Http_Cookie::fromString("{$cookie}={$value}", $this->uri); + $this->cookiejar->addCookie($cookie); + } + } else { + if ($cookie instanceof Zend_Http_Cookie) { + $name = $cookie->getName(); + $value = $cookie->getValue(); + $cookie = $name; + } + + if (preg_match("/[=,; \t\r\n\013\014]/", $cookie)) { + /** @see Zend_Http_Client_Exception */ + require_once 'Zend/Http/Client/Exception.php'; + throw new Zend_Http_Client_Exception("Cookie name cannot contain these characters: =,; \t\r\n\013\014 ({$cookie})"); + } + + $value = addslashes($value); + + if (! isset($this->headers['cookie'])) $this->headers['cookie'] = array('Cookie', ''); + $this->headers['cookie'][1] .= $cookie . '=' . $value . '; '; + } + + return $this; + } + + /** + * Set a file to upload (using a POST request) + * + * Can be used in two ways: + * + * 1. $data is null (default): $filename is treated as the name if a local file which + * will be read and sent. Will try to guess the content type using mime_content_type(). + * 2. $data is set - $filename is sent as the file name, but $data is sent as the file + * contents and no file is read from the file system. In this case, you need to + * manually set the Content-Type ($ctype) or it will default to + * application/octet-stream. + * + * @param string $filename Name of file to upload, or name to save as + * @param string $formname Name of form element to send as + * @param string $data Data to send (if null, $filename is read and sent) + * @param string $ctype Content type to use (if $data is set and $ctype is + * null, will be application/octet-stream) + * @return Zend_Http_Client + * @throws Zend_Http_Client_Exception + */ + public function setFileUpload($filename, $formname, $data = null, $ctype = null) + { + if ($data === null) { + if (($data = @file_get_contents($filename)) === false) { + /** @see Zend_Http_Client_Exception */ + require_once 'Zend/Http/Client/Exception.php'; + throw new Zend_Http_Client_Exception("Unable to read file '{$filename}' for upload"); + } + + if (! $ctype) $ctype = $this->_detectFileMimeType($filename); + } + + // Force enctype to multipart/form-data + $this->setEncType(self::ENC_FORMDATA); + + $this->files[$formname] = array(basename($filename), $ctype, $data); + + return $this; + } + + /** + * Set the encoding type for POST data + * + * @param string $enctype + * @return Zend_Http_Client + */ + public function setEncType($enctype = self::ENC_URLENCODED) + { + $this->enctype = $enctype; + + return $this; + } + + /** + * Set the raw (already encoded) POST data. + * + * This function is here for two reasons: + * 1. For advanced user who would like to set their own data, already encoded + * 2. For backwards compatibilty: If someone uses the old post($data) method. + * this method will be used to set the encoded data. + * + * @param string $data + * @param string $enctype + * @return Zend_Http_Client + */ + public function setRawData($data, $enctype = null) + { + $this->raw_post_data = $data; + $this->setEncType($enctype); + + return $this; + } + + /** + * Clear all GET and POST parameters + * + * Should be used to reset the request parameters if the client is + * used for several concurrent requests. + * + * @return Zend_Http_Client + */ + public function resetParameters() + { + // Reset parameter data + $this->paramsGet = array(); + $this->paramsPost = array(); + $this->files = array(); + $this->raw_post_data = null; + + // Clear outdated headers + if (isset($this->headers[strtolower(self::CONTENT_TYPE)])) + unset($this->headers[strtolower(self::CONTENT_TYPE)]); + if (isset($this->headers[strtolower(self::CONTENT_LENGTH)])) + unset($this->headers[strtolower(self::CONTENT_LENGTH)]); + + return $this; + } + + /** + * Get the last HTTP request as string + * + * @return string + */ + public function getLastRequest() + { + return $this->last_request; + } + + /** + * Get the last HTTP response received by this client + * + * If $config['storeresponse'] is set to false, or no response was + * stored yet, will return null + * + * @return Zend_Http_Response or null if none + */ + public function getLastResponse() + { + return $this->last_response; + } + + /** + * Load the connection adapter + * + * While this method is not called more than one for a client, it is + * seperated from ->request() to preserve logic and readability + * + * @param Zend_Http_Client_Adapter_Interface|string $adapter + * @return null + * @throws Zend_Http_Client_Exception + */ + public function setAdapter($adapter) + { + if (is_string($adapter)) { + try { + Zend_Loader::loadClass($adapter); + } catch (Zend_Exception $e) { + /** @see Zend_Http_Client_Exception */ + require_once 'Zend/Http/Client/Exception.php'; + throw new Zend_Http_Client_Exception("Unable to load adapter '$adapter': {$e->getMessage()}"); + } + + $adapter = new $adapter; + } + + if (! $adapter instanceof Zend_Http_Client_Adapter_Interface) { + /** @see Zend_Http_Client_Exception */ + require_once 'Zend/Http/Client/Exception.php'; + throw new Zend_Http_Client_Exception('Passed adapter is not a HTTP connection adapter'); + } + + $this->adapter = $adapter; + $config = $this->config; + unset($config['adapter']); + $this->adapter->setConfig($config); + } + + /** + * Send the HTTP request and return an HTTP response object + * + * @param string $method + * @return Zend_Http_Response + * @throws Zend_Http_Client_Exception + */ + public function request($method = null) + { + if (! $this->uri instanceof Zend_Uri_Http) { + /** @see Zend_Http_Client_Exception */ + require_once 'Zend/Http/Client/Exception.php'; + throw new Zend_Http_Client_Exception('No valid URI has been passed to the client'); + } + + if ($method) $this->setMethod($method); + $this->redirectCounter = 0; + $response = null; + + // Make sure the adapter is loaded + if ($this->adapter == null) $this->setAdapter($this->config['adapter']); + + // Send the first request. If redirected, continue. + do { + // Clone the URI and add the additional GET parameters to it + $uri = clone $this->uri; + if (! empty($this->paramsGet)) { + $query = $uri->getQuery(); + if (! empty($query)) $query .= '&'; + $query .= http_build_query($this->paramsGet, null, '&'); + + $uri->setQuery($query); + } + + $body = $this->_prepareBody(); + $headers = $this->_prepareHeaders(); + + // Open the connection, send the request and read the response + $this->adapter->connect($uri->getHost(), $uri->getPort(), + ($uri->getScheme() == 'https' ? true : false)); + + $this->last_request = $this->adapter->write($this->method, + $uri, $this->config['httpversion'], $headers, $body); + + $response = $this->adapter->read(); + if (! $response) { + /** @see Zend_Http_Client_Exception */ + require_once 'Zend/Http/Client/Exception.php'; + throw new Zend_Http_Client_Exception('Unable to read response, or response is empty'); + } + + $response = Zend_Http_Response::fromString($response); + if ($this->config['storeresponse']) $this->last_response = $response; + + // Load cookies into cookie jar + if (isset($this->cookiejar)) $this->cookiejar->addCookiesFromResponse($response, $uri); + + // If we got redirected, look for the Location header + if ($response->isRedirect() && ($location = $response->getHeader('location'))) { + + // Check whether we send the exact same request again, or drop the parameters + // and send a GET request + if ($response->getStatus() == 303 || + ((! $this->config['strictredirects']) && ($response->getStatus() == 302 || + $response->getStatus() == 301))) { + + $this->resetParameters(); + $this->setMethod(self::GET); + } + + // If we got a well formed absolute URI + if (Zend_Uri_Http::check($location)) { + $this->setHeaders('host', null); + $this->setUri($location); + + } else { + + // Split into path and query and set the query + if (strpos($location, '?') !== false) { + list($location, $query) = explode('?', $location, 2); + } else { + $query = ''; + } + $this->uri->setQuery($query); + + // Else, if we got just an absolute path, set it + if(strpos($location, '/') === 0) { + $this->uri->setPath($location); + + // Else, assume we have a relative path + } else { + // Get the current path directory, removing any trailing slashes + $path = $this->uri->getPath(); + $path = rtrim(substr($path, 0, strrpos($path, '/')), "/"); + $this->uri->setPath($path . '/' . $location); + } + } + ++$this->redirectCounter; + + } else { + // If we didn't get any location, stop redirecting + break; + } + + } while ($this->redirectCounter < $this->config['maxredirects']); + + return $response; + } + + /** + * Prepare the request headers + * + * @return array + */ + protected function _prepareHeaders() + { + $headers = array(); + + // Set the host header + if (! isset($this->headers['host'])) { + $host = $this->uri->getHost(); + + // If the port is not default, add it + if (! (($this->uri->getScheme() == 'http' && $this->uri->getPort() == 80) || + ($this->uri->getScheme() == 'https' && $this->uri->getPort() == 443))) { + $host .= ':' . $this->uri->getPort(); + } + + $headers[] = "Host: {$host}"; + } + + // Set the connection header + if (! isset($this->headers['connection'])) { + if (! $this->config['keepalive']) $headers[] = "Connection: close"; + } + + // Set the Accept-encoding header if not set - depending on whether + // zlib is available or not. + if (! isset($this->headers['accept-encoding'])) { + if (function_exists('gzinflate')) { + $headers[] = 'Accept-encoding: gzip, deflate'; + } else { + $headers[] = 'Accept-encoding: identity'; + } + } + + // Set the Content-Type header + if ($this->method == self::POST && + (! isset($this->headers[strtolower(self::CONTENT_TYPE)]) && isset($this->enctype))) { + + $headers[] = self::CONTENT_TYPE . ': ' . $this->enctype; + } + + // Set the user agent header + if (! isset($this->headers['user-agent']) && isset($this->config['useragent'])) { + $headers[] = "User-Agent: {$this->config['useragent']}"; + } + + // Set HTTP authentication if needed + if (is_array($this->auth)) { + $auth = self::encodeAuthHeader($this->auth['user'], $this->auth['password'], $this->auth['type']); + $headers[] = "Authorization: {$auth}"; + } + + // Load cookies from cookie jar + if (isset($this->cookiejar)) { + $cookstr = $this->cookiejar->getMatchingCookies($this->uri, + true, Zend_Http_CookieJar::COOKIE_STRING_CONCAT); + + if ($cookstr) $headers[] = "Cookie: {$cookstr}"; + } + + // Add all other user defined headers + foreach ($this->headers as $header) { + list($name, $value) = $header; + if (is_array($value)) + $value = implode(', ', $value); + + $headers[] = "$name: $value"; + } + + return $headers; + } + + /** + * Prepare the request body (for POST and PUT requests) + * + * @return string + * @throws Zend_Http_Client_Exception + */ + protected function _prepareBody() + { + // According to RFC2616, a TRACE request should not have a body. + if ($this->method == self::TRACE) { + return ''; + } + + // If we have raw_post_data set, just use it as the body. + if (isset($this->raw_post_data)) { + $this->setHeaders(self::CONTENT_LENGTH, strlen($this->raw_post_data)); + return $this->raw_post_data; + } + + $body = ''; + + // If we have files to upload, force enctype to multipart/form-data + if (count ($this->files) > 0) $this->setEncType(self::ENC_FORMDATA); + + // If we have POST parameters or files, encode and add them to the body + if (count($this->paramsPost) > 0 || count($this->files) > 0) { + switch($this->enctype) { + case self::ENC_FORMDATA: + // Encode body as multipart/form-data + $boundary = '---ZENDHTTPCLIENT-' . md5(microtime()); + $this->setHeaders(self::CONTENT_TYPE, self::ENC_FORMDATA . "; boundary={$boundary}"); + + // Get POST parameters and encode them + $params = $this->_getParametersRecursive($this->paramsPost); + foreach ($params as $pp) { + $body .= self::encodeFormData($boundary, $pp[0], $pp[1]); + } + + // Encode files + foreach ($this->files as $name => $file) { + $fhead = array(self::CONTENT_TYPE => $file[1]); + $body .= self::encodeFormData($boundary, $name, $file[2], $file[0], $fhead); + } + + $body .= "--{$boundary}--\r\n"; + break; + + case self::ENC_URLENCODED: + // Encode body as application/x-www-form-urlencoded + $this->setHeaders(self::CONTENT_TYPE, self::ENC_URLENCODED); + $body = http_build_query($this->paramsPost, '', '&'); + break; + + default: + /** @see Zend_Http_Client_Exception */ + require_once 'Zend/Http/Client/Exception.php'; + throw new Zend_Http_Client_Exception("Cannot handle content type '{$this->enctype}' automatically." . + " Please use Zend_Http_Client::setRawData to send this kind of content."); + break; + } + } + + // Set the Content-Length if we have a body or if request is POST/PUT + if ($body || $this->method == self::POST || $this->method == self::PUT) { + $this->setHeaders(self::CONTENT_LENGTH, strlen($body)); + } + + return $body; + } + + /** + * Helper method that gets a possibly multi-level parameters array (get or + * post) and flattens it. + * + * The method returns an array of (key, value) pairs (because keys are not + * necessarily unique. If one of the parameters in as array, it will also + * add a [] suffix to the key. + * + * @param array $parray The parameters array + * @param bool $urlencode Whether to urlencode the name and value + * @return array + */ + protected function _getParametersRecursive($parray, $urlencode = false) + { + if (! is_array($parray)) return $parray; + $parameters = array(); + + foreach ($parray as $name => $value) { + if ($urlencode) $name = urlencode($name); + + // If $value is an array, iterate over it + if (is_array($value)) { + $name .= ($urlencode ? '%5B%5D' : '[]'); + foreach ($value as $subval) { + if ($urlencode) $subval = urlencode($subval); + $parameters[] = array($name, $subval); + } + } else { + if ($urlencode) $value = urlencode($value); + $parameters[] = array($name, $value); + } + } + + return $parameters; + } + + /** + * Attempt to detect the MIME type of a file using available extensions + * + * This method will try to detect the MIME type of a file. If the fileinfo + * extension is available, it will be used. If not, the mime_magic + * extension which is deprected but is still available in many PHP setups + * will be tried. + * + * If neither extension is available, the default application/octet-stream + * MIME type will be returned + * + * @param string $file File path + * @return string MIME type + */ + protected function _detectFileMimeType($file) + { + $type = null; + + // First try with fileinfo functions + if (function_exists('finfo_open')) { + if (self::$_fileInfoDb === null) { + self::$_fileInfoDb = @finfo_open(FILEINFO_MIME); + } + + if (self::$_fileInfoDb) { + $type = finfo_file(self::$_fileInfoDb, $file); + } + + } elseif (function_exists('mime_content_type')) { + $type = mime_content_type($file); + } + + // Fallback to the default application/octet-stream + if (! $type) { + $type = 'application/octet-stream'; + } + + return $type; + } + + /** + * Encode data to a multipart/form-data part suitable for a POST request. + * + * @param string $boundary + * @param string $name + * @param mixed $value + * @param string $filename + * @param array $headers Associative array of optional headers @example ("Content-Transfer-Encoding" => "binary") + * @return string + */ + public static function encodeFormData($boundary, $name, $value, $filename = null, $headers = array()) { + $ret = "--{$boundary}\r\n" . + 'Content-Disposition: form-data; name="' . $name .'"'; + + if ($filename) $ret .= '; filename="' . $filename . '"'; + $ret .= "\r\n"; + + foreach ($headers as $hname => $hvalue) { + $ret .= "{$hname}: {$hvalue}\r\n"; + } + $ret .= "\r\n"; + + $ret .= "{$value}\r\n"; + + return $ret; + } + + /** + * Create a HTTP authentication "Authorization:" header according to the + * specified user, password and authentication method. + * + * @see http://www.faqs.org/rfcs/rfc2617.html + * @param string $user + * @param string $password + * @param string $type + * @return string + * @throws Zend_Http_Client_Exception + */ + public static function encodeAuthHeader($user, $password, $type = self::AUTH_BASIC) + { + $authHeader = null; + + switch ($type) { + case self::AUTH_BASIC: + // In basic authentication, the user name cannot contain ":" + if (strpos($user, ':') !== false) { + /** @see Zend_Http_Client_Exception */ + require_once 'Zend/Http/Client/Exception.php'; + throw new Zend_Http_Client_Exception("The user name cannot contain ':' in 'Basic' HTTP authentication"); + } + + $authHeader = 'Basic ' . base64_encode($user . ':' . $password); + break; + + //case self::AUTH_DIGEST: + /** + * @todo Implement digest authentication + */ + // break; + + default: + /** @see Zend_Http_Client_Exception */ + require_once 'Zend/Http/Client/Exception.php'; + throw new Zend_Http_Client_Exception("Not a supported HTTP authentication type: '$type'"); + } + + return $authHeader; + } +} diff --git a/libs/Zend/Http/Client/Adapter/Exception.php b/libs/Zend/Http/Client/Adapter/Exception.php new file mode 100644 index 0000000..dfbe904 --- /dev/null +++ b/libs/Zend/Http/Client/Adapter/Exception.php @@ -0,0 +1,33 @@ + 'ssl', + 'proxy_host' => '', + 'proxy_port' => 8080, + 'proxy_user' => '', + 'proxy_pass' => '', + 'proxy_auth' => Zend_Http_Client::AUTH_BASIC, + 'persistent' => false + ); + + /** + * Whether HTTPS CONNECT was already negotiated with the proxy or not + * + * @var boolean + */ + protected $negotiated = false; + + /** + * Connect to the remote server + * + * Will try to connect to the proxy server. If no proxy was set, will + * fall back to the target server (behave like regular Socket adapter) + * + * @param string $host + * @param int $port + * @param boolean $secure + * @param int $timeout + */ + public function connect($host, $port = 80, $secure = false) + { + // If no proxy is set, fall back to Socket adapter + if (! $this->config['proxy_host']) return parent::connect($host, $port, $secure); + + // Go through a proxy - the connection is actually to the proxy server + $host = $this->config['proxy_host']; + $port = $this->config['proxy_port']; + + // If we are connected to the wrong proxy, disconnect first + if (($this->connected_to[0] != $host || $this->connected_to[1] != $port)) { + if (is_resource($this->socket)) $this->close(); + } + + // Now, if we are not connected, connect + if (! is_resource($this->socket) || ! $this->config['keepalive']) { + $this->socket = @fsockopen($host, $port, $errno, $errstr, (int) $this->config['timeout']); + if (! $this->socket) { + $this->close(); + require_once 'Zend/Http/Client/Adapter/Exception.php'; + throw new Zend_Http_Client_Adapter_Exception( + 'Unable to Connect to proxy server ' . $host . ':' . $port . '. Error #' . $errno . ': ' . $errstr); + } + + // Set the stream timeout + if (!stream_set_timeout($this->socket, (int) $this->config['timeout'])) { + require_once 'Zend/Http/Client/Adapter/Exception.php'; + throw new Zend_Http_Client_Adapter_Exception('Unable to set the connection timeout'); + } + + // Update connected_to + $this->connected_to = array($host, $port); + } + } + + /** + * Send request to the proxy server + * + * @param string $method + * @param Zend_Uri_Http $uri + * @param string $http_ver + * @param array $headers + * @param string $body + * @return string Request as string + */ + public function write($method, $uri, $http_ver = '1.1', $headers = array(), $body = '') + { + // If no proxy is set, fall back to default Socket adapter + if (! $this->config['proxy_host']) return parent::write($method, $uri, $http_ver, $headers, $body); + + // Make sure we're properly connected + if (! $this->socket) { + require_once 'Zend/Http/Client/Adapter/Exception.php'; + throw new Zend_Http_Client_Adapter_Exception("Trying to write but we are not connected"); + } + + $host = $this->config['proxy_host']; + $port = $this->config['proxy_port']; + + if ($this->connected_to[0] != $host || $this->connected_to[1] != $port) { + require_once 'Zend/Http/Client/Adapter/Exception.php'; + throw new Zend_Http_Client_Adapter_Exception("Trying to write but we are connected to the wrong proxy server"); + } + + // Add Proxy-Authorization header + if ($this->config['proxy_user'] && ! isset($headers['proxy-authorization'])) { + $headers['proxy-authorization'] = Zend_Http_Client::encodeAuthHeader( + $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; + + // Build request headers + $request = "{$method} {$uri->__toString()} HTTP/{$http_ver}\r\n"; + + // Add all headers to the request string + foreach ($headers as $k => $v) { + if (is_string($k)) $v = "$k: $v"; + $request .= "$v\r\n"; + } + + // Add the request body + $request .= "\r\n" . $body; + + // Send the request + if (! @fwrite($this->socket, $request)) { + require_once 'Zend/Http/Client/Adapter/Exception.php'; + throw new Zend_Http_Client_Adapter_Exception("Error writing request to proxy server"); + } + + return $request; + } + + /** + * Preform handshaking with HTTPS proxy using CONNECT method + * + * @param string $host + * @param integer $port + * @param string $http_ver + * @param array $headers + */ + protected function connectHandshake($host, $port = 443, $http_ver = '1.1', array &$headers = array()) + { + $request = "CONNECT $host:$port HTTP/$http_ver\r\n" . + "Host: " . $this->config['proxy_host'] . "\r\n"; + + // Add the user-agent header + if (isset($this->config['useragent'])) { + $request .= "User-agent: " . $this->config['useragent'] . "\r\n"; + } + + // If the proxy-authorization header is set, send it to proxy but remove + // it from headers sent to target host + if (isset($headers['proxy-authorization'])) { + $request .= "Proxy-authorization: " . $headers['proxy-authorization'] . "\r\n"; + unset($headers['proxy-authorization']); + } + + $request .= "\r\n"; + + // Send the request + if (! @fwrite($this->socket, $request)) { + require_once 'Zend/Http/Client/Adapter/Exception.php'; + throw new Zend_Http_Client_Adapter_Exception("Error writing request to proxy server"); + } + + // Read response headers only + $response = ''; + $gotStatus = false; + while ($line = @fgets($this->socket)) { + $gotStatus = $gotStatus || (strpos($line, 'HTTP') !== false); + if ($gotStatus) { + $response .= $line; + if (!chop($line)) break; + } + } + + // Check that the response from the proxy is 200 + if (Zend_Http_Response::extractCode($response) != 200) { + require_once 'Zend/Http/Client/Adapter/Exception.php'; + throw new Zend_Http_Client_Adapter_Exception("Unable to connect to HTTPS proxy. Server response: " . $response); + } + + // If all is good, switch socket to secure mode. We have to fall back + // through the different modes + $modes = array( + STREAM_CRYPTO_METHOD_TLS_CLIENT, + STREAM_CRYPTO_METHOD_SSLv3_CLIENT, + STREAM_CRYPTO_METHOD_SSLv23_CLIENT, + STREAM_CRYPTO_METHOD_SSLv2_CLIENT + ); + + $success = false; + foreach($modes as $mode) { + $success = stream_socket_enable_crypto($this->socket, true, $mode); + if ($success) break; + } + + if (! $success) { + require_once 'Zend/Http/Client/Adapter/Exception.php'; + throw new Zend_Http_Client_Adapter_Exception("Unable to connect to" . + " HTTPS server through proxy: could not negotiate secure connection."); + } + } + + /** + * Close the connection to the server + * + */ + public function close() + { + parent::close(); + $this->negotiated = false; + } + + /** + * Destructor: make sure the socket is disconnected + * + */ + public function __destruct() + { + if ($this->socket) $this->close(); + } +} diff --git a/libs/Zend/Http/Client/Adapter/Socket.php b/libs/Zend/Http/Client/Adapter/Socket.php new file mode 100644 index 0000000..6849c88 --- /dev/null +++ b/libs/Zend/Http/Client/Adapter/Socket.php @@ -0,0 +1,338 @@ + false, + 'ssltransport' => 'ssl', + 'sslcert' => null, + 'sslpassphrase' => null + ); + + /** + * Request method - will be set by write() and might be used by read() + * + * @var string + */ + protected $method = null; + + /** + * Adapter constructor, currently empty. Config is set using setConfig() + * + */ + public function __construct() + { + } + + /** + * Set the configuration array for the adapter + * + * @param array $config + */ + public function setConfig($config = array()) + { + if (! is_array($config)) { + require_once 'Zend/Http/Client/Adapter/Exception.php'; + throw new Zend_Http_Client_Adapter_Exception( + '$concig expects an array, ' . gettype($config) . ' recieved.'); + } + + foreach ($config as $k => $v) { + $this->config[strtolower($k)] = $v; + } + } + + /** + * Connect to the remote server + * + * @param string $host + * @param int $port + * @param boolean $secure + * @param int $timeout + */ + public function connect($host, $port = 80, $secure = false) + { + // If the URI should be accessed via SSL, prepend the Hostname with ssl:// + $host = ($secure ? $this->config['ssltransport'] : 'tcp') . '://' . $host; + + // If we are connected to the wrong host, disconnect first + if (($this->connected_to[0] != $host || $this->connected_to[1] != $port)) { + if (is_resource($this->socket)) $this->close(); + } + + // Now, if we are not connected, connect + if (! is_resource($this->socket) || ! $this->config['keepalive']) { + $context = stream_context_create(); + if ($secure) { + if ($this->config['sslcert'] !== null) { + if (! stream_context_set_option($context, 'ssl', 'local_cert', + $this->config['sslcert'])) { + require_once 'Zend/Http/Client/Adapter/Exception.php'; + throw new Zend_Http_Client_Adapter_Exception('Unable to set sslcert option'); + } + } + if ($this->config['sslpassphrase'] !== null) { + if (! stream_context_set_option($context, 'ssl', 'passphrase', + $this->config['sslpassphrase'])) { + require_once 'Zend/Http/Client/Adapter/Exception.php'; + throw new Zend_Http_Client_Adapter_Exception('Unable to set sslpassphrase option'); + } + } + } + + $flags = STREAM_CLIENT_CONNECT; + if ($this->config['persistent']) $flags |= STREAM_CLIENT_PERSISTENT; + + $this->socket = @stream_socket_client($host . ':' . $port, + $errno, + $errstr, + (int) $this->config['timeout'], + $flags, + $context); + if (! $this->socket) { + $this->close(); + require_once 'Zend/Http/Client/Adapter/Exception.php'; + throw new Zend_Http_Client_Adapter_Exception( + 'Unable to Connect to ' . $host . ':' . $port . '. Error #' . $errno . ': ' . $errstr); + } + + // Set the stream timeout + if (! stream_set_timeout($this->socket, (int) $this->config['timeout'])) { + require_once 'Zend/Http/Client/Adapter/Exception.php'; + throw new Zend_Http_Client_Adapter_Exception('Unable to set the connection timeout'); + } + + // Update connected_to + $this->connected_to = array($host, $port); + } + } + + /** + * Send request to the remote server + * + * @param string $method + * @param Zend_Uri_Http $uri + * @param string $http_ver + * @param array $headers + * @param string $body + * @return string Request as string + */ + public function write($method, $uri, $http_ver = '1.1', $headers = array(), $body = '') + { + // Make sure we're properly connected + if (! $this->socket) { + require_once 'Zend/Http/Client/Adapter/Exception.php'; + throw new Zend_Http_Client_Adapter_Exception('Trying to write but we are not connected'); + } + + $host = $uri->getHost(); + $host = (strtolower($uri->getScheme()) == 'https' ? $this->config['ssltransport'] : 'tcp') . '://' . $host; + if ($this->connected_to[0] != $host || $this->connected_to[1] != $uri->getPort()) { + require_once 'Zend/Http/Client/Adapter/Exception.php'; + throw new Zend_Http_Client_Adapter_Exception('Trying to write but we are connected to the wrong host'); + } + + // Save request method for later + $this->method = $method; + + // Build request headers + $path = $uri->getPath(); + if ($uri->getQuery()) $path .= '?' . $uri->getQuery(); + $request = "{$method} {$path} HTTP/{$http_ver}\r\n"; + foreach ($headers as $k => $v) { + if (is_string($k)) $v = ucfirst($k) . ": $v"; + $request .= "$v\r\n"; + } + + // Add the request body + $request .= "\r\n" . $body; + + // Send the request + if (! @fwrite($this->socket, $request)) { + require_once 'Zend/Http/Client/Adapter/Exception.php'; + throw new Zend_Http_Client_Adapter_Exception('Error writing request to server'); + } + + return $request; + } + + /** + * Read response from server + * + * @return string + */ + public function read() + { + // First, read headers only + $response = ''; + $gotStatus = false; + while (($line = @fgets($this->socket)) !== false) { + $gotStatus = $gotStatus || (strpos($line, 'HTTP') !== false); + if ($gotStatus) { + $response .= $line; + if (rtrim($line) === '') break; + } + } + + $statusCode = Zend_Http_Response::extractCode($response); + + // Handle 100 and 101 responses internally by restarting the read again + if ($statusCode == 100 || $statusCode == 101) return $this->read(); + + /** + * Responses to HEAD requests and 204 or 304 responses are not expected + * to have a body - stop reading here + */ + if ($statusCode == 304 || $statusCode == 204 || + $this->method == Zend_Http_Client::HEAD) return $response; + + // Check headers to see what kind of connection / transfer encoding we have + $headers = Zend_Http_Response::extractHeaders($response); + + // If we got a 'transfer-encoding: chunked' header + if (isset($headers['transfer-encoding'])) { + if ($headers['transfer-encoding'] == 'chunked') { + do { + $line = @fgets($this->socket); + $chunk = $line; + + // Figure out the next chunk size + $chunksize = trim($line); + if (! ctype_xdigit($chunksize)) { + $this->close(); + require_once 'Zend/Http/Client/Adapter/Exception.php'; + throw new Zend_Http_Client_Adapter_Exception('Invalid chunk size "' . + $chunksize . '" unable to read chunked body'); + } + + // Convert the hexadecimal value to plain integer + $chunksize = hexdec($chunksize); + + // Read chunk + $left_to_read = $chunksize; + while ($left_to_read > 0) { + $line = @fread($this->socket, $left_to_read); + $chunk .= $line; + $left_to_read -= strlen($line); + + // Break if the connection ended prematurely + if (feof($this->socket)) break; + } + + $chunk .= @fgets($this->socket); + $response .= $chunk; + } while ($chunksize > 0); + + } else { + throw new Zend_Http_Client_Adapter_Exception('Cannot handle "' . + $headers['transfer-encoding'] . '" transfer encoding'); + } + + // Else, if we got the content-length header, read this number of bytes + } elseif (isset($headers['content-length'])) { + $left_to_read = $headers['content-length']; + $chunk = ''; + while ($left_to_read > 0) { + $chunk = @fread($this->socket, $left_to_read); + $left_to_read -= strlen($chunk); + $response .= $chunk; + + // Break if the connection ended prematurely + if (feof($this->socket)) break; + } + + // Fallback: just read the response until EOF + } else { + while (($buff = @fread($this->socket, 8192)) !== false) { + $response .= $buff; + if (feof($this->socket)) break; + } + + $this->close(); + } + + // Close the connection if requested to do so by the server + if (isset($headers['connection']) && $headers['connection'] == 'close') { + $this->close(); + } + + return $response; + } + + /** + * Close the connection to the server + * + */ + public function close() + { + if (is_resource($this->socket)) @fclose($this->socket); + $this->socket = null; + $this->connected_to = array(null, null); + } + + /** + * Destructor: make sure the socket is disconnected + * + * If we are in persistent TCP mode, will not close the connection + * + */ + public function __destruct() + { + if (! $this->config['persistent']) { + if ($this->socket) $this->close(); + } + } +} diff --git a/libs/Zend/Http/Client/Adapter/Test.php b/libs/Zend/Http/Client/Adapter/Test.php new file mode 100644 index 0000000..d3e27d3 --- /dev/null +++ b/libs/Zend/Http/Client/Adapter/Test.php @@ -0,0 +1,193 @@ + $v) { + $this->config[strtolower($k)] = $v; + } + } + + /** + * Connect to the remote server + * + * @param string $host + * @param int $port + * @param boolean $secure + * @param int $timeout + */ + public function connect($host, $port = 80, $secure = false) + { } + + /** + * Send request to the remote server + * + * @param string $method + * @param Zend_Uri_Http $uri + * @param string $http_ver + * @param array $headers + * @param string $body + * @return string Request as string + */ + public function write($method, $uri, $http_ver = '1.1', $headers = array(), $body = '') + { + $host = $uri->getHost(); + $host = (strtolower($uri->getScheme()) == 'https' ? 'sslv2://' . $host : $host); + + // Build request headers + $path = $uri->getPath(); + if ($uri->getQuery()) $path .= '?' . $uri->getQuery(); + $request = "{$method} {$path} HTTP/{$http_ver}\r\n"; + foreach ($headers as $k => $v) { + if (is_string($k)) $v = ucfirst($k) . ": $v"; + $request .= "$v\r\n"; + } + + // Add the request body + $request .= "\r\n" . $body; + + // Do nothing - just return the request as string + + return $request; + } + + /** + * Return the response set in $this->setResponse() + * + * @return string + */ + public function read() + { + if ($this->responseIndex >= count($this->responses)) { + $this->responseIndex = 0; + } + return $this->responses[$this->responseIndex++]; + } + + /** + * Close the connection (dummy) + * + */ + public function close() + { } + + /** + * Set the HTTP response(s) to be returned by this adapter + * + * @param Zend_Http_Response|array|string $response + */ + public function setResponse($response) + { + if ($response instanceof Zend_Http_Response) { + $response = $response->asString(); + } + + $this->responses = (array)$response; + $this->responseIndex = 0; + } + + /** + * Add another response to the response buffer. + * + * @param string $response + */ + public function addResponse($response) + { + $this->responses[] = $response; + } + + /** + * Sets the position of the response buffer. Selects which + * response will be returned on the next call to read(). + * + * @param integer $index + */ + public function setResponseIndex($index) + { + if ($index < 0 || $index >= count($this->responses)) { + require_once 'Zend/Http/Client/Adapter/Exception.php'; + throw new Zend_Http_Client_Adapter_Exception( + 'Index out of range of response buffer size'); + } + $this->responseIndex = $index; + } +} diff --git a/libs/Zend/Http/Client/Exception.php b/libs/Zend/Http/Client/Exception.php new file mode 100644 index 0000000..70c8e01 --- /dev/null +++ b/libs/Zend/Http/Client/Exception.php @@ -0,0 +1,33 @@ +name = (string) $name) { + require_once 'Zend/Http/Exception.php'; + throw new Zend_Http_Exception('Cookies must have a name'); + } + + if (! $this->domain = (string) $domain) { + require_once 'Zend/Http/Exception.php'; + throw new Zend_Http_Exception('Cookies must have a domain'); + } + + $this->value = (string) $value; + $this->expires = ($expires === null ? null : (int) $expires); + $this->path = ($path ? $path : '/'); + $this->secure = $secure; + } + + /** + * Get Cookie name + * + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * Get cookie value + * + * @return string + */ + public function getValue() + { + return $this->value; + } + + /** + * Get cookie domain + * + * @return string + */ + public function getDomain() + { + return $this->domain; + } + + /** + * Get the cookie path + * + * @return string + */ + public function getPath() + { + return $this->path; + } + + /** + * Get the expiry time of the cookie, or null if no expiry time is set + * + * @return int|null + */ + public function getExpiryTime() + { + return $this->expires; + } + + /** + * Check whether the cookie should only be sent over secure connections + * + * @return boolean + */ + public function isSecure() + { + return $this->secure; + } + + /** + * Check whether the cookie has expired + * + * Always returns false if the cookie is a session cookie (has no expiry time) + * + * @param int $now Timestamp to consider as "now" + * @return boolean + */ + public function isExpired($now = null) + { + if ($now === null) $now = time(); + if (is_int($this->expires) && $this->expires < $now) { + return true; + } else { + return false; + } + } + + /** + * Check whether the cookie is a session cookie (has no expiry time set) + * + * @return boolean + */ + public function isSessionCookie() + { + return ($this->expires === null); + } + + /** + * Checks whether the cookie should be sent or not in a specific scenario + * + * @param string|Zend_Uri_Http $uri URI to check against (secure, domain, path) + * @param boolean $matchSessionCookies Whether to send session cookies + * @param int $now Override the current time when checking for expiry time + * @return boolean + */ + public function match($uri, $matchSessionCookies = true, $now = null) + { + if (is_string ($uri)) { + $uri = Zend_Uri_Http::factory($uri); + } + + // Make sure we have a valid Zend_Uri_Http object + if (! ($uri->valid() && ($uri->getScheme() == 'http' || $uri->getScheme() =='https'))) { + require_once 'Zend/Http/Exception.php'; + throw new Zend_Http_Exception('Passed URI is not a valid HTTP or HTTPS URI'); + } + + // Check that the cookie is secure (if required) and not expired + if ($this->secure && $uri->getScheme() != 'https') return false; + if ($this->isExpired($now)) return false; + if ($this->isSessionCookie() && ! $matchSessionCookies) return false; + + // Validate domain and path + // Domain is validated using tail match, while path is validated using head match + $domain_preg = preg_quote($this->getDomain(), "/"); + if (! preg_match("/{$domain_preg}$/", $uri->getHost())) return false; + $path_preg = preg_quote($this->getPath(), "/"); + if (! preg_match("/^{$path_preg}/", $uri->getPath())) return false; + + // If we didn't die until now, return true. + return true; + } + + /** + * Get the cookie as a string, suitable for sending as a "Cookie" header in an + * HTTP request + * + * @return string + */ + public function __toString() + { + return $this->name . '=' . urlencode($this->value) . ';'; + } + + /** + * Generate a new Cookie object from a cookie string + * (for example the value of the Set-Cookie HTTP header) + * + * @param string $cookieStr + * @param Zend_Uri_Http|string $ref_uri Reference URI for default values (domain, path) + * @return Zend_Http_Cookie A new Zend_Http_Cookie object or false on failure. + */ + public static function fromString($cookieStr, $ref_uri = null) + { + // Set default values + if (is_string($ref_uri)) { + $ref_uri = Zend_Uri_Http::factory($ref_uri); + } + + $name = ''; + $value = ''; + $domain = ''; + $path = ''; + $expires = null; + $secure = false; + $parts = explode(';', $cookieStr); + + // If first part does not include '=', fail + if (strpos($parts[0], '=') === false) return false; + + // Get the name and value of the cookie + list($name, $value) = explode('=', trim(array_shift($parts)), 2); + $name = trim($name); + $value = urldecode(trim($value)); + + // Set default domain and path + if ($ref_uri instanceof Zend_Uri_Http) { + $domain = $ref_uri->getHost(); + $path = $ref_uri->getPath(); + $path = substr($path, 0, strrpos($path, '/')); + } + + // Set other cookie parameters + foreach ($parts as $part) { + $part = trim($part); + if (strtolower($part) == 'secure') { + $secure = true; + continue; + } + + $keyValue = explode('=', $part, 2); + if (count($keyValue) == 2) { + list($k, $v) = $keyValue; + switch (strtolower($k)) { + case 'expires': + $expires = strtotime($v); + break; + case 'path': + $path = $v; + break; + case 'domain': + $domain = $v; + break; + default: + break; + } + } + } + + if ($name !== '') { + return new Zend_Http_Cookie($name, $value, $domain, $expires, $path, $secure); + } else { + return false; + } + } +} diff --git a/libs/Zend/Http/CookieJar.php b/libs/Zend/Http/CookieJar.php new file mode 100644 index 0000000..c11174e --- /dev/null +++ b/libs/Zend/Http/CookieJar.php @@ -0,0 +1,350 @@ +getDomain(); + $path = $cookie->getPath(); + if (! isset($this->cookies[$domain])) $this->cookies[$domain] = array(); + if (! isset($this->cookies[$domain][$path])) $this->cookies[$domain][$path] = array(); + $this->cookies[$domain][$path][$cookie->getName()] = $cookie; + } else { + require_once 'Zend/Http/Exception.php'; + throw new Zend_Http_Exception('Supplient argument is not a valid cookie string or object'); + } + } + + /** + * Parse an HTTP response, adding all the cookies set in that response + * to the cookie jar. + * + * @param Zend_Http_Response $response + * @param Zend_Uri_Http|string $ref_uri Requested URI + */ + public function addCookiesFromResponse($response, $ref_uri) + { + if (! $response instanceof Zend_Http_Response) { + require_once 'Zend/Http/Exception.php'; + throw new Zend_Http_Exception('$response is expected to be a Response object, ' . + gettype($response) . ' was passed'); + } + + $cookie_hdrs = $response->getHeader('Set-Cookie'); + + if (is_array($cookie_hdrs)) { + foreach ($cookie_hdrs as $cookie) { + $this->addCookie($cookie, $ref_uri); + } + } elseif (is_string($cookie_hdrs)) { + $this->addCookie($cookie_hdrs, $ref_uri); + } + } + + /** + * Get all cookies in the cookie jar as an array + * + * @param int $ret_as Whether to return cookies as objects of Zend_Http_Cookie or as strings + * @return array|string + */ + public function getAllCookies($ret_as = self::COOKIE_OBJECT) + { + $cookies = $this->_flattenCookiesArray($this->cookies, $ret_as); + return $cookies; + } + + /** + * Return an array of all cookies matching a specific request according to the request URI, + * whether session cookies should be sent or not, and the time to consider as "now" when + * checking cookie expiry time. + * + * @param string|Zend_Uri_Http $uri URI to check against (secure, domain, path) + * @param boolean $matchSessionCookies Whether to send session cookies + * @param int $ret_as Whether to return cookies as objects of Zend_Http_Cookie or as strings + * @param int $now Override the current time when checking for expiry time + * @return array|string + */ + public function getMatchingCookies($uri, $matchSessionCookies = true, + $ret_as = self::COOKIE_OBJECT, $now = null) + { + if (is_string($uri)) $uri = Zend_Uri::factory($uri); + if (! $uri instanceof Zend_Uri_Http) { + require_once 'Zend/Http/Exception.php'; + throw new Zend_Http_Exception("Invalid URI string or object passed"); + } + + // Set path + $path = $uri->getPath(); + $path = substr($path, 0, strrpos($path, '/')); + if (! $path) $path = '/'; + + // First, reduce the array of cookies to only those matching domain and path + $cookies = $this->_matchDomain($uri->getHost()); + $cookies = $this->_matchPath($cookies, $path); + $cookies = $this->_flattenCookiesArray($cookies, self::COOKIE_OBJECT); + + // Next, run Cookie->match on all cookies to check secure, time and session mathcing + $ret = array(); + foreach ($cookies as $cookie) + if ($cookie->match($uri, $matchSessionCookies, $now)) + $ret[] = $cookie; + + // Now, use self::_flattenCookiesArray again - only to convert to the return format ;) + $ret = $this->_flattenCookiesArray($ret, $ret_as); + + return $ret; + } + + /** + * Get a specific cookie according to a URI and name + * + * @param Zend_Uri_Http|string $uri The uri (domain and path) to match + * @param string $cookie_name The cookie's name + * @param int $ret_as Whether to return cookies as objects of Zend_Http_Cookie or as strings + * @return Zend_Http_Cookie|string + */ + public function getCookie($uri, $cookie_name, $ret_as = self::COOKIE_OBJECT) + { + if (is_string($uri)) { + $uri = Zend_Uri::factory($uri); + } + + if (! $uri instanceof Zend_Uri_Http) { + require_once 'Zend/Http/Exception.php'; + throw new Zend_Http_Exception('Invalid URI specified'); + } + + // Get correct cookie path + $path = $uri->getPath(); + $path = substr($path, 0, strrpos($path, '/')); + if (! $path) $path = '/'; + + if (isset($this->cookies[$uri->getHost()][$path][$cookie_name])) { + $cookie = $this->cookies[$uri->getHost()][$path][$cookie_name]; + + switch ($ret_as) { + case self::COOKIE_OBJECT: + return $cookie; + break; + + case self::COOKIE_STRING_ARRAY: + case self::COOKIE_STRING_CONCAT: + return $cookie->__toString(); + break; + + default: + require_once 'Zend/Http/Exception.php'; + throw new Zend_Http_Exception("Invalid value passed for \$ret_as: {$ret_as}"); + break; + } + } else { + return false; + } + } + + /** + * Helper function to recursivly flatten an array. Shoud be used when exporting the + * cookies array (or parts of it) + * + * @param Zend_Http_Cookie|array $ptr + * @param int $ret_as What value to return + * @return array|string + */ + protected function _flattenCookiesArray($ptr, $ret_as = self::COOKIE_OBJECT) { + if (is_array($ptr)) { + $ret = ($ret_as == self::COOKIE_STRING_CONCAT ? '' : array()); + foreach ($ptr as $item) { + if ($ret_as == self::COOKIE_STRING_CONCAT) { + $ret .= $this->_flattenCookiesArray($item, $ret_as); + } else { + $ret = array_merge($ret, $this->_flattenCookiesArray($item, $ret_as)); + } + } + return $ret; + } elseif ($ptr instanceof Zend_Http_Cookie) { + switch ($ret_as) { + case self::COOKIE_STRING_ARRAY: + return array($ptr->__toString()); + break; + + case self::COOKIE_STRING_CONCAT: + return $ptr->__toString(); + break; + + case self::COOKIE_OBJECT: + default: + return array($ptr); + break; + } + } + + return null; + } + + /** + * Return a subset of the cookies array matching a specific domain + * + * Returned array is actually an array of pointers to items in the $this->cookies array. + * + * @param string $domain + * @return array + */ + protected function _matchDomain($domain) { + $ret = array(); + + foreach (array_keys($this->cookies) as $cdom) { + $regex = "/" . preg_quote($cdom, "/") . "$/i"; + if (preg_match($regex, $domain)) $ret[$cdom] = &$this->cookies[$cdom]; + } + + return $ret; + } + + /** + * Return a subset of a domain-matching cookies that also match a specified path + * + * Returned array is actually an array of pointers to items in the $passed array. + * + * @param array $dom_array + * @param string $path + * @return array + */ + protected function _matchPath($domains, $path) { + $ret = array(); + if (substr($path, -1) != '/') $path .= '/'; + + foreach ($domains as $dom => $paths_array) { + foreach (array_keys($paths_array) as $cpath) { + $regex = "|^" . preg_quote($cpath, "|") . "|i"; + if (preg_match($regex, $path)) { + if (! isset($ret[$dom])) $ret[$dom] = array(); + $ret[$dom][$cpath] = &$paths_array[$cpath]; + } + } + } + + return $ret; + } + + /** + * Create a new CookieJar object and automatically load into it all the + * cookies set in an Http_Response object. If $uri is set, it will be + * considered as the requested URI for setting default domain and path + * of the cookie. + * + * @param Zend_Http_Response $response HTTP Response object + * @param Zend_Uri_Http|string $uri The requested URI + * @return Zend_Http_CookieJar + * @todo Add the $uri functionality. + */ + public static function fromResponse(Zend_Http_Response $response, $ref_uri) + { + $jar = new self(); + $jar->addCookiesFromResponse($response, $ref_uri); + return $jar; + } +} diff --git a/libs/Zend/Http/Exception.php b/libs/Zend/Http/Exception.php new file mode 100644 index 0000000..76e2a8d --- /dev/null +++ b/libs/Zend/Http/Exception.php @@ -0,0 +1,33 @@ + 'Continue', + 101 => 'Switching Protocols', + + // Success 2xx + 200 => 'OK', + 201 => 'Created', + 202 => 'Accepted', + 203 => 'Non-Authoritative Information', + 204 => 'No Content', + 205 => 'Reset Content', + 206 => 'Partial Content', + + // Redirection 3xx + 300 => 'Multiple Choices', + 301 => 'Moved Permanently', + 302 => 'Found', // 1.1 + 303 => 'See Other', + 304 => 'Not Modified', + 305 => 'Use Proxy', + // 306 is deprecated but reserved + 307 => 'Temporary Redirect', + + // Client Error 4xx + 400 => 'Bad Request', + 401 => 'Unauthorized', + 402 => 'Payment Required', + 403 => 'Forbidden', + 404 => 'Not Found', + 405 => 'Method Not Allowed', + 406 => 'Not Acceptable', + 407 => 'Proxy Authentication Required', + 408 => 'Request Timeout', + 409 => 'Conflict', + 410 => 'Gone', + 411 => 'Length Required', + 412 => 'Precondition Failed', + 413 => 'Request Entity Too Large', + 414 => 'Request-URI Too Long', + 415 => 'Unsupported Media Type', + 416 => 'Requested Range Not Satisfiable', + 417 => 'Expectation Failed', + + // Server Error 5xx + 500 => 'Internal Server Error', + 501 => 'Not Implemented', + 502 => 'Bad Gateway', + 503 => 'Service Unavailable', + 504 => 'Gateway Timeout', + 505 => 'HTTP Version Not Supported', + 509 => 'Bandwidth Limit Exceeded' + ); + + /** + * The HTTP version (1.0, 1.1) + * + * @var string + */ + protected $version; + + /** + * The HTTP response code + * + * @var int + */ + protected $code; + + /** + * The HTTP response code as string + * (e.g. 'Not Found' for 404 or 'Internal Server Error' for 500) + * + * @var string + */ + protected $message; + + /** + * The HTTP response headers array + * + * @var array + */ + protected $headers = array(); + + /** + * The HTTP response body + * + * @var string + */ + protected $body; + + /** + * HTTP response constructor + * + * In most cases, you would use Zend_Http_Response::fromString to parse an HTTP + * response string and create a new Zend_Http_Response object. + * + * NOTE: The constructor no longer accepts nulls or empty values for the code and + * headers and will throw an exception if the passed values do not form a valid HTTP + * responses. + * + * If no message is passed, the message will be guessed according to the response code. + * + * @param int $code Response code (200, 404, ...) + * @param array $headers Headers array + * @param string $body Response body + * @param string $version HTTP version + * @param string $message Response code as text + * @throws Zend_Http_Exception + */ + public function __construct($code, $headers, $body = null, $version = '1.1', $message = null) + { + // Make sure the response code is valid and set it + if (self::responseCodeAsText($code) === null) { + require_once 'Zend/Http/Exception.php'; + throw new Zend_Http_Exception("{$code} is not a valid HTTP response code"); + } + + $this->code = $code; + + // Make sure we got valid headers and set them + if (! is_array($headers)) { + require_once 'Zend/Http/Exception.php'; + throw new Zend_Http_Exception('No valid headers were passed'); + } + + foreach ($headers as $name => $value) { + if (is_int($name)) + list($name, $value) = explode(": ", $value, 1); + + $this->headers[ucwords(strtolower($name))] = $value; + } + + // Set the body + $this->body = $body; + + // Set the HTTP version + if (! preg_match('|^\d\.\d$|', $version)) { + require_once 'Zend/Http/Exception.php'; + throw new Zend_Http_Exception("Invalid HTTP response version: $version"); + } + + $this->version = $version; + + // If we got the response message, set it. Else, set it according to + // the response code + if (is_string($message)) { + $this->message = $message; + } else { + $this->message = self::responseCodeAsText($code); + } + } + + /** + * Check whether the response is an error + * + * @return boolean + */ + public function isError() + { + $restype = floor($this->code / 100); + if ($restype == 4 || $restype == 5) { + return true; + } + + return false; + } + + /** + * Check whether the response in successful + * + * @return boolean + */ + public function isSuccessful() + { + $restype = floor($this->code / 100); + if ($restype == 2 || $restype == 1) { // Shouldn't 3xx count as success as well ??? + return true; + } + + return false; + } + + /** + * Check whether the response is a redirection + * + * @return boolean + */ + public function isRedirect() + { + $restype = floor($this->code / 100); + if ($restype == 3) { + return true; + } + + return false; + } + + /** + * Get the response body as string + * + * This method returns the body of the HTTP response (the content), as it + * should be in it's readable version - that is, after decoding it (if it + * was decoded), deflating it (if it was gzip compressed), etc. + * + * If you want to get the raw body (as transfered on wire) use + * $this->getRawBody() instead. + * + * @return string + */ + public function getBody() + { + $body = ''; + + // Decode the body if it was transfer-encoded + switch ($this->getHeader('transfer-encoding')) { + + // Handle chunked body + case 'chunked': + $body = self::decodeChunkedBody($this->body); + break; + + // No transfer encoding, or unknown encoding extension: + // return body as is + default: + $body = $this->body; + break; + } + + // Decode any content-encoding (gzip or deflate) if needed + switch (strtolower($this->getHeader('content-encoding'))) { + + // Handle gzip encoding + case 'gzip': + $body = self::decodeGzip($body); + break; + + // Handle deflate encoding + case 'deflate': + $body = self::decodeDeflate($body); + break; + + default: + break; + } + + return $body; + } + + /** + * Get the raw response body (as transfered "on wire") as string + * + * If the body is encoded (with Transfer-Encoding, not content-encoding - + * IE "chunked" body), gzip compressed, etc. it will not be decoded. + * + * @return string + */ + public function getRawBody() + { + return $this->body; + } + + /** + * Get the HTTP version of the response + * + * @return string + */ + public function getVersion() + { + return $this->version; + } + + /** + * Get the HTTP response status code + * + * @return int + */ + public function getStatus() + { + return $this->code; + } + + /** + * Return a message describing the HTTP response code + * (Eg. "OK", "Not Found", "Moved Permanently") + * + * @return string + */ + public function getMessage() + { + return $this->message; + } + + /** + * Get the response headers + * + * @return array + */ + public function getHeaders() + { + return $this->headers; + } + + /** + * Get a specific header as string, or null if it is not set + * + * @param string$header + * @return string|array|null + */ + public function getHeader($header) + { + $header = ucwords(strtolower($header)); + if (! is_string($header) || ! isset($this->headers[$header])) return null; + + return $this->headers[$header]; + } + + /** + * Get all headers as string + * + * @param boolean $status_line Whether to return the first status line (IE "HTTP 200 OK") + * @param string $br Line breaks (eg. "\n", "\r\n", "
      ") + * @return string + */ + public function getHeadersAsString($status_line = true, $br = "\n") + { + $str = ''; + + if ($status_line) { + $str = "HTTP/{$this->version} {$this->code} {$this->message}{$br}"; + } + + // Iterate over the headers and stringify them + foreach ($this->headers as $name => $value) + { + if (is_string($value)) + $str .= "{$name}: {$value}{$br}"; + + elseif (is_array($value)) { + foreach ($value as $subval) { + $str .= "{$name}: {$subval}{$br}"; + } + } + } + + return $str; + } + + /** + * Get the entire response as string + * + * @param string $br Line breaks (eg. "\n", "\r\n", "
      ") + * @return string + */ + public function asString($br = "\n") + { + return $this->getHeadersAsString(true, $br) . $br . $this->getRawBody(); + } + + /** + * A convenience function that returns a text representation of + * HTTP response codes. Returns 'Unknown' for unknown codes. + * Returns array of all codes, if $code is not specified. + * + * Conforms to HTTP/1.1 as defined in RFC 2616 (except for 'Unknown') + * See http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10 for reference + * + * @param int $code HTTP response code + * @param boolean $http11 Use HTTP version 1.1 + * @return string + */ + public static function responseCodeAsText($code = null, $http11 = true) + { + $messages = self::$messages; + if (! $http11) $messages[302] = 'Moved Temporarily'; + + if ($code === null) { + return $messages; + } elseif (isset($messages[$code])) { + return $messages[$code]; + } else { + return 'Unknown'; + } + } + + /** + * Extract the response code from a response string + * + * @param string $response_str + * @return int + */ + public static function extractCode($response_str) + { + preg_match("|^HTTP/[\d\.x]+ (\d+)|", $response_str, $m); + + if (isset($m[1])) { + return (int) $m[1]; + } else { + return false; + } + } + + /** + * Extract the HTTP message from a response + * + * @param string $response_str + * @return string + */ + public static function extractMessage($response_str) + { + preg_match("|^HTTP/[\d\.x]+ \d+ ([^\r\n]+)|", $response_str, $m); + + if (isset($m[1])) { + return $m[1]; + } else { + return false; + } + } + + /** + * Extract the HTTP version from a response + * + * @param string $response_str + * @return string + */ + public static function extractVersion($response_str) + { + preg_match("|^HTTP/([\d\.x]+) \d+|", $response_str, $m); + + if (isset($m[1])) { + return $m[1]; + } else { + return false; + } + } + + /** + * Extract the headers from a response string + * + * @param string $response_str + * @return array + */ + public static function extractHeaders($response_str) + { + $headers = array(); + + // First, split body and headers + $parts = preg_split('|(?:\r?\n){2}|m', $response_str, 2); + if (! $parts[0]) return $headers; + + // Split headers part to lines + $lines = explode("\n", $parts[0]); + unset($parts); + $last_header = null; + + foreach($lines as $line) { + $line = trim($line, "\r\n"); + if ($line == "") break; + + if (preg_match("|^([\w-]+):\s+(.+)|", $line, $m)) { + unset($last_header); + $h_name = strtolower($m[1]); + $h_value = $m[2]; + + if (isset($headers[$h_name])) { + if (! is_array($headers[$h_name])) { + $headers[$h_name] = array($headers[$h_name]); + } + + $headers[$h_name][] = $h_value; + } else { + $headers[$h_name] = $h_value; + } + $last_header = $h_name; + } elseif (preg_match("|^\s+(.+)$|", $line, $m) && $last_header !== null) { + if (is_array($headers[$last_header])) { + end($headers[$last_header]); + $last_header_key = key($headers[$last_header]); + $headers[$last_header][$last_header_key] .= $m[1]; + } else { + $headers[$last_header] .= $m[1]; + } + } + } + + return $headers; + } + + /** + * Extract the body from a response string + * + * @param string $response_str + * @return string + */ + public static function extractBody($response_str) + { + $parts = preg_split('|(?:\r?\n){2}|m', $response_str, 2); + if (isset($parts[1])) { + return $parts[1]; + } + return ''; + } + + /** + * Decode a "chunked" transfer-encoded body and return the decoded text + * + * @param string $body + * @return string + */ + public static function decodeChunkedBody($body) + { + $decBody = ''; + + while (trim($body)) { + if (! preg_match("/^([\da-fA-F]+)[^\r\n]*\r\n/sm", $body, $m)) { + require_once 'Zend/Http/Exception.php'; + throw new Zend_Http_Exception("Error parsing body - doesn't seem to be a chunked message"); + } + + $length = hexdec(trim($m[1])); + $cut = strlen($m[0]); + + $decBody .= substr($body, $cut, $length); + $body = substr($body, $cut + $length + 2); + } + + return $decBody; + } + + /** + * Decode a gzip encoded message (when Content-encoding = gzip) + * + * Currently requires PHP with zlib support + * + * @param string $body + * @return string + */ + public static function decodeGzip($body) + { + if (! function_exists('gzinflate')) { + require_once 'Zend/Http/Exception.php'; + throw new Zend_Http_Exception('Unable to decode gzipped response ' . + 'body: perhaps the zlib extension is not loaded?'); + } + + return gzinflate(substr($body, 10)); + } + + /** + * Decode a zlib deflated message (when Content-encoding = deflate) + * + * Currently requires PHP with zlib support + * + * @param string $body + * @return string + */ + public static function decodeDeflate($body) + { + if (! function_exists('gzuncompress')) { + require_once 'Zend/Http/Exception.php'; + throw new Zend_Http_Exception('Unable to decode deflated response ' . + 'body: perhaps the zlib extension is not loaded?'); + } + + return gzuncompress($body); + } + + /** + * Create a new Zend_Http_Response object from a string + * + * @param string $response_str + * @return Zend_Http_Response + */ + public static function fromString($response_str) + { + $code = self::extractCode($response_str); + $headers = self::extractHeaders($response_str); + $body = self::extractBody($response_str); + $version = self::extractVersion($response_str); + $message = self::extractMessage($response_str); + + return new Zend_Http_Response($code, $headers, $body, $version, $message); + } +} diff --git a/libs/Zend/InfoCard.php b/libs/Zend/InfoCard.php new file mode 100644 index 0000000..d33c8e8 --- /dev/null +++ b/libs/Zend/InfoCard.php @@ -0,0 +1,488 @@ +_keyPairs = array(); + + if(!extension_loaded('mcrypt')) { + throw new Zend_InfoCard_Exception("Use of the Zend_InfoCard component requires the mcrypt extension to be enabled in PHP"); + } + + if(!extension_loaded('openssl')) { + throw new Zend_InfoCard_Exception("Use of the Zend_InfoCard component requires the openssl extension to be enabled in PHP"); + } + } + + /** + * Sets the adapter uesd for callbacks into the application using the component, used + * when doing things such as storing / retrieving assertions, etc. + * + * @param Zend_InfoCard_Adapter_Interface $a The Adapter instance + * @return Zend_InfoCard The instnace + */ + public function setAdapter(Zend_InfoCard_Adapter_Interface $a) + { + $this->_adapter = $a; + return $this; + } + + /** + * Retrieves the adapter used for callbacks into the application using the component. + * If no adapter was set then an instance of Zend_InfoCard_Adapter_Default is used + * + * @return Zend_InfoCard_Adapter_Interface The Adapter instance + */ + public function getAdapter() + { + if(is_null($this->_adapter)) { + require_once 'Zend/InfoCard/Adapter/Default.php'; + $this->setAdapter(new Zend_InfoCard_Adapter_Default()); + } + + return $this->_adapter; + } + + /** + * Gets the Public Key Cipher object used in this instance + * + * @return Zend_InfoCard_Cipher_Pki_Interface + */ + public function getPkiCipherObject() + { + return $this->_pkiCipherObj; + } + + /** + * Sets the Public Key Cipher Object used in this instance + * + * @param Zend_InfoCard_Cipher_Pki_Interface $cipherObj + * @return Zend_InfoCard + */ + public function setPkiCipherObject(Zend_InfoCard_Cipher_Pki_Interface $cipherObj) + { + $this->_pkiCipherObj = $cipherObj; + return $this; + } + + /** + * Get the Symmetric Cipher Object used in this instance + * + * @return Zend_InfoCard_Cipher_Symmetric_Interface + */ + public function getSymCipherObject() + { + return $this->_symCipherObj; + } + + /** + * Sets the Symmetric Cipher Object used in this instance + * + * @param Zend_InfoCard_Cipher_Symmetric_Interface $cipherObj + * @return Zend_InfoCard + */ + public function setSymCipherObject($cipherObj) + { + $this->_symCipherObj = $cipherObj; + return $this; + } + + /** + * Remove a Certificate Pair by Key ID from the search list + * + * @throws Zend_InfoCard_Exception + * @param string $key_id The Certificate Key ID returned from adding the certificate pair + * @return Zend_InfoCard + */ + public function removeCertificatePair($key_id) + { + + if(!key_exists($key_id, $this->_keyPairs)) { + throw new Zend_InfoCard_Exception("Attempted to remove unknown key id: $key_id"); + } + + unset($this->_keyPairs[$key_id]); + return $this; + } + + /** + * Add a Certificate Pair to the list of certificates searched by the component + * + * @throws Zend_InfoCard_Exception + * @param string $private_key_file The path to the private key file for the pair + * @param string $public_key_file The path to the certificate / public key for the pair + * @param string $type (optional) The URI for the type of key pair this is (default RSA with OAEP padding) + * @param string $password (optional) The password for the private key file if necessary + * @return string A key ID representing this key pair in the component + */ + public function addCertificatePair($private_key_file, $public_key_file, $type = Zend_InfoCard_Cipher::ENC_RSA_OAEP_MGF1P, $password = null) + { + if(!file_exists($private_key_file) || + !file_exists($public_key_file)) { + throw new Zend_InfoCard_Exception("Could not locate the public and private certificate pair files: $private_key_file, $public_key_file"); + } + + if(!is_readable($private_key_file) || + !is_readable($public_key_file)) { + throw new Zend_InfoCard_Exception("Could not read the public and private certificate pair files (check permissions): $private_key_file, $public_key_file"); + } + + $key_id = md5($private_key_file.$public_key_file); + + if(key_exists($key_id, $this->_keyPairs)) { + throw new Zend_InfoCard_Exception("Attempted to add previously existing certificate pair: $private_key_file, $public_key_file"); + } + + switch($type) { + case Zend_InfoCard_Cipher::ENC_RSA: + case Zend_InfoCard_Cipher::ENC_RSA_OAEP_MGF1P: + $this->_keyPairs[$key_id] = array('private' => $private_key_file, + 'public' => $public_key_file, + 'type_uri' => $type); + + if(!is_null($password)) { + $this->_keyPairs[$key_id]['password'] = $password; + } else { + $this->_keyPairs[$key_id]['password'] = null; + } + + return $key_id; + break; + default: + throw new Zend_InfoCard_Exception("Invalid Certificate Pair Type specified: $type"); + } + } + + /** + * Return a Certificate Pair from a key ID + * + * @throws Zend_InfoCard_Exception + * @param string $key_id The Key ID of the certificate pair in the component + * @return array An array containing the path to the private/public key files, + * the type URI and the password if provided + */ + public function getCertificatePair($key_id) + { + if(key_exists($key_id, $this->_keyPairs)) { + return $this->_keyPairs[$key_id]; + } + + throw new Zend_InfoCard_Exception("Invalid Certificate Pair ID provided: $key_id"); + } + + /** + * Retrieve the digest of a given public key / certificate using the provided digest + * method + * + * @throws Zend_InfoCard_Exception + * @param string $key_id The certificate key id in the component + * @param string $digestMethod The URI of the digest method to use (default SHA1) + * @return string The digest value in binary format + */ + protected function _getPublicKeyDigest($key_id, $digestMethod = self::DIGEST_SHA1) + { + $certificatePair = $this->getCertificatePair($key_id); + + $temp = file($certificatePair['public']); + unset($temp[count($temp)-1]); + unset($temp[0]); + $certificateData = base64_decode(implode("\n", $temp)); + + switch($digestMethod) { + case self::DIGEST_SHA1: + $digest_retval = sha1($certificateData, true); + break; + default: + throw new Zend_InfoCard_Exception("Invalid Digest Type Provided: $digestMethod"); + } + + return $digest_retval; + } + + /** + * Find a certificate pair based on a digest of its public key / certificate file + * + * @param string $digest The digest value of the public key wanted in binary form + * @param string $digestMethod The URI of the digest method used to calculate the digest + * @return mixed The Key ID of the matching certificate pair or false if not found + */ + protected function _findCertifiatePairByDigest($digest, $digestMethod = self::DIGEST_SHA1) + { + + foreach($this->_keyPairs as $key_id => $certificate_data) { + + $cert_digest = $this->_getPublicKeyDigest($key_id, $digestMethod); + + if($cert_digest == $digest) { + return $key_id; + } + } + + return false; + } + + /** + * Extracts the Signed Token from an EncryptedData block + * + * @throws Zend_InfoCard_Exception + * @param string $strXmlToken The EncryptedData XML block + * @return string The XML of the Signed Token inside of the EncryptedData block + */ + protected function _extractSignedToken($strXmlToken) + { + $encryptedData = Zend_InfoCard_Xml_EncryptedData::getInstance($strXmlToken); + + // Determine the Encryption Method used to encrypt the token + + switch($encryptedData->getEncryptionMethod()) { + case Zend_InfoCard_Cipher::ENC_AES128CBC: + case Zend_InfoCard_Cipher::ENC_AES256CBC: + break; + default: + throw new Zend_InfoCard_Exception("Unknown Encryption Method used in the secure token"); + } + + // Figure out the Key we are using to decrypt the token + + $keyinfo = $encryptedData->getKeyInfo(); + + if(!($keyinfo instanceof Zend_InfoCard_Xml_KeyInfo_XmlDSig)) { + throw new Zend_InfoCard_Exception("Expected a XML digital signature KeyInfo, but was not found"); + } + + + $encryptedKey = $keyinfo->getEncryptedKey(); + + switch($encryptedKey->getEncryptionMethod()) { + case Zend_InfoCard_Cipher::ENC_RSA: + case Zend_InfoCard_Cipher::ENC_RSA_OAEP_MGF1P: + break; + default: + throw new Zend_InfoCard_Exception("Unknown Key Encryption Method used in secure token"); + } + + $securityTokenRef = $encryptedKey->getKeyInfo()->getSecurityTokenReference(); + + $key_id = $this->_findCertifiatePairByDigest($securityTokenRef->getKeyReference()); + + if(!$key_id) { + throw new Zend_InfoCard_Exception("Unable to find key pair used to encrypt symmetric InfoCard Key"); + } + + $certificate_pair = $this->getCertificatePair($key_id); + + // Santity Check + + if($certificate_pair['type_uri'] != $encryptedKey->getEncryptionMethod()) { + throw new Zend_InfoCard_Exception("Certificate Pair which matches digest is not of same algorithm type as document, check addCertificate()"); + } + + $PKcipher = Zend_InfoCard_Cipher::getInstanceByURI($encryptedKey->getEncryptionMethod()); + + $base64DecodeSupportsStrictParam = version_compare(PHP_VERSION, '5.2.0', '>='); + + if ($base64DecodeSupportsStrictParam) { + $keyCipherValueBase64Decoded = base64_decode($encryptedKey->getCipherValue(), true); + } else { + $keyCipherValueBase64Decoded = base64_decode($encryptedKey->getCipherValue()); + } + + $symmetricKey = $PKcipher->decrypt( + $keyCipherValueBase64Decoded, + file_get_contents($certificate_pair['private']), + $certificate_pair['password'] + ); + + $symCipher = Zend_InfoCard_Cipher::getInstanceByURI($encryptedData->getEncryptionMethod()); + + if ($base64DecodeSupportsStrictParam) { + $dataCipherValueBase64Decoded = base64_decode($encryptedData->getCipherValue(), true); + } else { + $dataCipherValueBase64Decoded = base64_decode($encryptedData->getCipherValue()); + } + + $signedToken = $symCipher->decrypt($dataCipherValueBase64Decoded, $symmetricKey); + + return $signedToken; + } + + /** + * Process an input Infomation Card EncryptedData block sent from the client, + * validate it, and return the claims contained within it on success or an error message on error + * + * @param string $strXmlToken The XML token sent to the server from the client + * @return Zend_Infocard_Claims The Claims object containing the claims, or any errors which occurred + */ + public function process($strXmlToken) + { + + $retval = new Zend_InfoCard_Claims(); + + try { + $signedAssertionsXml = $this->_extractSignedToken($strXmlToken); + } catch(Zend_InfoCard_Exception $e) { + $retval->setError('Failed to extract assertion document'); + $retval->setCode(Zend_InfoCard_Claims::RESULT_PROCESSING_FAILURE); + return $retval; + } + + try { + $assertions = Zend_InfoCard_Xml_Assertion::getInstance($signedAssertionsXml); + } catch(Zend_InfoCard_Exception $e) { + $retval->setError('Failure processing assertion document'); + $retval->setCode(Zend_InfoCard_Claims::RESULT_PROCESSING_FAILURE); + return $retval; + } + + if(!($assertions instanceof Zend_InfoCard_Xml_Assertion_Interface)) { + throw new Zend_InfoCard_Exception("Invalid Assertion Object returned"); + } + + if(!($reference_id = Zend_InfoCard_Xml_Security::validateXMLSignature($assertions->asXML()))) { + $retval->setError("Failure Validating the Signature of the assertion document"); + $retval->setCode(Zend_InfoCard_Claims::RESULT_VALIDATION_FAILURE); + return $retval; + } + + // The reference id should be locally scoped as far as I know + if($reference_id[0] == '#') { + $reference_id = substr($reference_id, 1); + } else { + $retval->setError("Reference of document signature does not reference the local document"); + $retval->setCode(Zend_InfoCard_Claims::RESULT_VALIDATION_FAILURE); + return $retval; + } + + // Make sure the signature is in reference to the same document as the assertions + if($reference_id != $assertions->getAssertionID()) { + $retval->setError("Reference of document signature does not reference the local document"); + $retval->setCode(Zend_InfoCard_Claims::RESULT_VALIDATION_FAILURE); + } + + // Validate we haven't seen this before and the conditions are acceptable + $conditions = $this->getAdapter()->retrieveAssertion($assertions->getAssertionURI(), $assertions->getAssertionID()); + + if($conditions === false) { + $conditions = $assertions->getConditions(); + } + + + if(is_array($condition_error = $assertions->validateConditions($conditions))) { + $retval->setError("Conditions of assertion document are not met: {$condition_error[1]} ({$condition_error[0]})"); + $retval->setCode(Zend_InfoCard_Claims::RESULT_VALIDATION_FAILURE); + } + + $attributes = $assertions->getAttributes(); + + $retval->setClaims($attributes); + + if($retval->getCode() == 0) { + $retval->setCode(Zend_InfoCard_Claims::RESULT_SUCCESS); + } + + return $retval; + } +} diff --git a/libs/Zend/InfoCard/Adapter/Default.php b/libs/Zend/InfoCard/Adapter/Default.php new file mode 100644 index 0000000..a8a8dc7 --- /dev/null +++ b/libs/Zend/InfoCard/Adapter/Default.php @@ -0,0 +1,84 @@ +_padding = $padding; + break; + default: + throw new Zend_InfoCard_Cipher_Exception("Invalid Padding Type Provided"); + } + + return $this; + } + + /** + * Retruns the public-key padding used + * + * @return integer One of the padding constants in this class + */ + public function getPadding() + { + return $this->_padding; + } +} diff --git a/libs/Zend/InfoCard/Cipher/Pki/Adapter/Rsa.php b/libs/Zend/InfoCard/Cipher/Pki/Adapter/Rsa.php new file mode 100644 index 0000000..d719937 --- /dev/null +++ b/libs/Zend/InfoCard/Cipher/Pki/Adapter/Rsa.php @@ -0,0 +1,117 @@ +setPadding($padding); + } + + /** + * Decrypts RSA encrypted data using the given private key + * + * @throws Zend_InfoCard_Cipher_Exception + * @param string $encryptedData The encrypted data in binary format + * @param string $privateKey The private key in binary format + * @param string $password The private key passphrase + * @param integer $padding The padding to use during decryption (of not provided object value will be used) + * @return string The decrypted data + */ + public function decrypt($encryptedData, $privateKey, $password = null, $padding = null) + { + $private_key = openssl_pkey_get_private(array($privateKey, $password)); + + if(!$private_key) { + throw new Zend_InfoCard_Cipher_Exception("Failed to load private key"); + } + + if(!is_null($padding)) { + try { + $this->setPadding($padding); + } catch(Exception $e) { + openssl_free_key($private_key); + throw $e; + } + } + + switch($this->getPadding()) { + case self::NO_PADDING: + $openssl_padding = OPENSSL_NO_PADDING; + break; + case self::OAEP_PADDING: + $openssl_padding = OPENSSL_PKCS1_OAEP_PADDING; + break; + } + + $result = openssl_private_decrypt($encryptedData, $decryptedData, $private_key, $openssl_padding); + + openssl_free_key($private_key); + + if(!$result) { + throw new Zend_InfoCard_Cipher_Exception("Unable to Decrypt Value using provided private key"); + } + + if($this->getPadding() == self::NO_PADDING) { + $decryptedData = substr($decryptedData, 2); + $start = strpos($decryptedData, 0) + 1; + $decryptedData = substr($decryptedData, $start); + } + + return $decryptedData; + } +} diff --git a/libs/Zend/InfoCard/Cipher/Pki/Interface.php b/libs/Zend/InfoCard/Cipher/Pki/Interface.php new file mode 100644 index 0000000..c43ecda --- /dev/null +++ b/libs/Zend/InfoCard/Cipher/Pki/Interface.php @@ -0,0 +1,33 @@ + 0) { + $mcrypt_iv = substr($encryptedData, 0, $iv_length); + $encryptedData = substr($encryptedData, $iv_length); + } + + $decrypted = mcrypt_decrypt(self::MCRYPT_CIPHER, $decryptionKey, $encryptedData, self::MCRYPT_MODE, $mcrypt_iv); + + if(!$decrypted) { + throw new Zend_InfoCard_Cipher_Exception("Failed to decrypt data using AES256CBC Algorithm"); + } + + $decryptedLength = strlen($decrypted); + $paddingLength = substr($decrypted, $decryptedLength -1, 1); + $decrypted = substr($decrypted, 0, $decryptedLength - ord($paddingLength)); + + return rtrim($decrypted, "\0"); + } +} diff --git a/libs/Zend/InfoCard/Cipher/Symmetric/Aes128cbc/Interface.php b/libs/Zend/InfoCard/Cipher/Symmetric/Aes128cbc/Interface.php new file mode 100644 index 0000000..8dcedc2 --- /dev/null +++ b/libs/Zend/InfoCard/Cipher/Symmetric/Aes128cbc/Interface.php @@ -0,0 +1,38 @@ +_isValid = true; + return $this; + } + + /** + * Retrieve the PPI (Private Personal Identifier) associated with the information card + * + * @return string the private personal identifier + */ + public function getCardID() + { + return $this->getClaim('http://schemas.xmlsoap.org/ws/2005/05/identity/claims/privatepersonalidentifier'); + } + + /** + * Retrieves the default namespace used in this information card. If a default namespace was not + * set, it figures out which one to consider 'default' by taking the first namespace sorted by use-count + * in claims + * + * @throws Zend_InfoCard_Exception + * @return string The default namespace + */ + public function getDefaultNamespace() + { + + if(is_null($this->_defaultNamespace)) { + + $namespaces = array(); + $leader = ''; + foreach($this->_claims as $claim) { + + if(!isset($namespaces[$claim['namespace']])) { + $namespaces[$claim['namespace']] = 1; + } else { + $namespaces[$claim['namespace']]++; + } + + if(empty($leader) || ($namespaces[$claim['namespace']] > $leader)) { + $leader = $claim['namespace']; + } + } + + if(empty($leader)) { + throw new Zend_InfoCard_Exception("Failed to determine default namespace"); + } + + $this->setDefaultNamespace($leader); + } + + return $this->_defaultNamespace; + } + + /** + * Set the default namespace, overriding any existing default + * + * @throws Zend_InfoCard_Exception + * @param string $namespace The default namespace to use + * @return Zend_InfoCard_Claims + */ + public function setDefaultNamespace($namespace) + { + + foreach($this->_claims as $claim) { + if($namespace == $claim['namespace']) { + $this->_defaultNamespace = $namespace; + return $this; + } + } + + throw new Zend_InfoCard_Exception("At least one claim must exist in specified namespace to make it the default namespace"); + } + + /** + * Indicates if this claim object contains validated claims or not + * + * @return bool + */ + public function isValid() + { + return $this->_isValid; + } + + /** + * Set the error message contained within the claims object + * + * @param string $error The error message + * @return Zend_InfoCard_Claims + */ + public function setError($error) + { + $this->_error = $error; + $this->_isValid = false; + return $this; + } + + /** + * Retrieve the error message contained within the claims object + * + * @return string The error message + */ + public function getErrorMsg() + { + return $this->_error; + } + + /** + * Set the claims for the claims object. Can only be set once and is done + * by the component itself. Internal use only. + * + * @throws Zend_InfoCard_Exception + * @param array $claims + * @return Zend_InfoCard_Claims + */ + public function setClaims(Array $claims) + { + if(!is_null($this->_claims)) { + throw new Zend_InfoCard_Exception("Claim objects are read-only"); + } + + $this->_claims = $claims; + return $this; + } + + /** + * Set the result code of the claims object. + * + * @throws Zend_InfoCard_Exception + * @param int $code The result code + * @return Zend_InfoCard_Claims + */ + public function setCode($code) + { + switch($code) { + case self::RESULT_PROCESSING_FAILURE: + case self::RESULT_SUCCESS: + case self::RESULT_VALIDATION_FAILURE: + $this->_code = $code; + return $this; + } + + throw new Zend_InfoCard_Exception("Attempted to set unknown error code"); + } + + /** + * Gets the result code of the claims object + * + * @return integer The result code + */ + public function getCode() + { + return $this->_code; + } + + /** + * Get a claim by providing its complete claim URI + * + * @param string $claimURI The complete claim URI to retrieve + * @return mixed The claim matching that specific URI or null if not found + */ + public function getClaim($claimURI) + { + if($this->claimExists($claimURI)) { + return $this->_claims[$claimURI]['value']; + } + + return null; + } + + /** + * Indicates if a specific claim URI exists or not within the object + * + * @param string $claimURI The complete claim URI to check + * @return bool true if the claim exists, false if not found + */ + public function claimExists($claimURI) + { + return isset($this->_claims[$claimURI]); + } + + /** + * Magic helper function + * @throws Zend_InfoCard_Exception + */ + public function __unset($k) + { + throw new Zend_InfoCard_Exception("Claim objects are read-only"); + } + + /** + * Magic helper function + */ + public function __isset($k) + { + return $this->claimExists("{$this->getDefaultNamespace()}/$k"); + } + + /** + * Magic helper function + */ + public function __get($k) + { + return $this->getClaim("{$this->getDefaultNamespace()}/$k"); + } + + /** + * Magic helper function + * @throws Zend_InfoCard_Exception + */ + public function __set($k, $v) + { + throw new Zend_InfoCard_Exception("Claim objects are read-only"); + } +} diff --git a/libs/Zend/InfoCard/Exception.php b/libs/Zend/InfoCard/Exception.php new file mode 100644 index 0000000..85b9e95 --- /dev/null +++ b/libs/Zend/InfoCard/Exception.php @@ -0,0 +1,43 @@ +asXML(); + } else if (is_string($xmlData)) { + $strXmlData = $xmlData; + } else { + throw new Zend_InfoCard_Xml_Exception("Invalid Data provided to create instance"); + } + + $sxe = simplexml_load_string($strXmlData); + + $namespaces = $sxe->getDocNameSpaces(); + + foreach($namespaces as $namespace) { + switch($namespace) { + case self::TYPE_SAML: + include_once 'Zend/InfoCard/Xml/Assertion/Saml.php'; + return simplexml_load_string($strXmlData, 'Zend_InfoCard_Xml_Assertion_Saml', null); + } + } + + throw new Zend_InfoCard_Xml_Exception("Unable to determine Assertion type by Namespace"); + } +} diff --git a/libs/Zend/InfoCard/Xml/Assertion/Interface.php b/libs/Zend/InfoCard/Xml/Assertion/Interface.php new file mode 100644 index 0000000..bb67271 --- /dev/null +++ b/libs/Zend/InfoCard/Xml/Assertion/Interface.php @@ -0,0 +1,69 @@ + $conditionValue) { + switch(strtolower($condition)) { + case 'audiencerestrictioncondition': + + $serverName = $this->_getServerName(); + $serverPort = $this->_getServerPort(); + + $self_aliases[] = $serverName; + $self_aliases[] = "{{$serverName}:{$serverPort}"; + + $found = false; + if(is_array($conditionValue)) { + foreach($conditionValue as $audience) { + + list(,,$audience) = explode('/', $audience); + if(in_array($audience, $self_aliases)) { + $found = true; + break; + } + } + } + + if(!$found) { + return array($condition, 'Could not find self in allowed audience list'); + } + + break; + case 'notbefore': + $notbeforetime = strtotime($conditionValue); + + if($currentTime < $notbeforetime) { + if($currentTime + self::CONDITION_TIME_ADJ < $notbeforetime) { + return array($condition, 'Current time is before specified window'); + } + } + + break; + case 'notonorafter': + $notonoraftertime = strtotime($conditionValue); + + if($currentTime >= $notonoraftertime) { + if($currentTime - self::CONDITION_TIME_ADJ >= $notonoraftertime) { + return array($condition, 'Current time is after specified window'); + } + } + + break; + + } + } + } + return true; + } + + /** + * Get the Assertion URI for this type of Assertion + * + * @return string the Assertion URI + */ + public function getAssertionURI() + { + return Zend_InfoCard_Xml_Assertion::TYPE_SAML; + } + + /** + * Get the Major Version of the SAML Assertion + * + * @return integer The major version number + */ + public function getMajorVersion() + { + return (int)(string)$this['MajorVersion']; + } + + /** + * The Minor Version of the SAML Assertion + * + * @return integer The minor version number + */ + public function getMinorVersion() + { + return (int)(string)$this['MinorVersion']; + } + + /** + * Get the Assertion ID of the assertion + * + * @return string The Assertion ID + */ + public function getAssertionID() + { + return (string)$this['AssertionID']; + } + + /** + * Get the Issuer URI of the assertion + * + * @return string the URI of the assertion Issuer + */ + public function getIssuer() + { + return (string)$this['Issuer']; + } + + /** + * Get the Timestamp of when the assertion was issued + * + * @return integer a UNIX timestamp representing when the assertion was issued + */ + public function getIssuedTimestamp() + { + return strtotime((string)$this['IssueInstant']); + } + + /** + * Return an array of conditions which the assertions are predicated on + * + * @throws Zend_InfoCard_Xml_Exception + * @return array an array of conditions + */ + public function getConditions() + { + + list($conditions) = $this->xpath("//saml:Conditions"); + + if(!($conditions instanceof Zend_InfoCard_Xml_Element)) { + throw new Zend_InfoCard_Xml_Exception("Unable to find the saml:Conditions block"); + } + + $retval = array(); + + foreach($conditions->children('urn:oasis:names:tc:SAML:1.0:assertion') as $key => $value) { + switch($key) { + case self::CONDITION_AUDIENCE: + foreach($value->children('urn:oasis:names:tc:SAML:1.0:assertion') as $audience_key => $audience_value) { + if($audience_key == 'Audience') { + $retval[$key][] = (string)$audience_value; + } + } + break; + } + } + + $retval['NotBefore'] = (string)$conditions['NotBefore']; + $retval['NotOnOrAfter'] = (string)$conditions['NotOnOrAfter']; + + return $retval; + } + + /** + * Get they KeyInfo element for the Subject KeyInfo block + * + * @todo Not Yet Implemented + * @ignore + */ + public function getSubjectKeyInfo() + { + /** + * @todo Not sure if this is part of the scope for now.. + */ + + if($this->getConfirmationMethod() == self::CONFIRMATION_BEARER) { + throw new Zend_InfoCard_Xml_Exception("Cannot get Subject Key Info when Confirmation Method was Bearer"); + } + } + + /** + * Return the Confirmation Method URI used in the Assertion + * + * @return string The confirmation method URI + */ + public function getConfirmationMethod() + { + list($confirmation) = $this->xPath("//saml:ConfirmationMethod"); + return (string)$confirmation; + } + + /** + * Return an array of attributes (claims) contained within the assertion + * + * @return array An array of attributes / claims within the assertion + */ + public function getAttributes() + { + $attributes = $this->xPath('//saml:Attribute'); + + $retval = array(); + foreach($attributes as $key => $value) { + + $retkey = (string)$value['AttributeNamespace'].'/'.(string)$value['AttributeName']; + + $retval[$retkey]['name'] = (string)$value['AttributeName']; + $retval[$retkey]['namespace'] = (string)$value['AttributeNamespace']; + + list($aValue) = $value->children('urn:oasis:names:tc:SAML:1.0:assertion'); + $retval[$retkey]['value'] = (string)$aValue; + } + + return $retval; + } +} diff --git a/libs/Zend/InfoCard/Xml/Element.php b/libs/Zend/InfoCard/Xml/Element.php new file mode 100644 index 0000000..47e9cc8 --- /dev/null +++ b/libs/Zend/InfoCard/Xml/Element.php @@ -0,0 +1,112 @@ +asXML(); + } + + /** + * Converts an XML Element object into a DOM object + * + * @throws Zend_InfoCard_Xml_Exception + * @param Zend_InfoCard_Xml_Element $e The object to convert + * @return DOMElement A DOMElement representation of the same object + */ + static public function convertToDOM(Zend_InfoCard_Xml_Element $e) + { + $dom = dom_import_simplexml($e); + + if(!($dom instanceof DOMElement)) { + // Zend_InfoCard_Xml_Element exntes SimpleXMLElement, so this should *never* fail + // @codeCoverageIgnoreStart + throw new Zend_InfoCard_Xml_Exception("Failed to convert between SimpleXML and DOM"); + // @codeCoverageIgnoreEnd + } + + return $dom; + } + + /** + * Converts a DOMElement object into the specific class + * + * @throws Zend_InfoCard_Xml_Exception + * @param DOMElement $e The DOMElement object to convert + * @param string $classname The name of the class to convert it to (must inhert from Zend_InfoCard_Xml_Element) + * @return Zend_InfoCard_Xml_Element a Xml Element object from the DOM element + */ + static public function convertToObject(DOMElement $e, $classname) + { + + Zend_Loader::loadClass($classname); + + $reflection = new ReflectionClass($classname); + + if(!$reflection->isSubclassOf('Zend_InfoCard_Xml_Element')) { + throw new Zend_InfoCard_Xml_Exception("DOM element must be converted to an instance of Zend_InfoCard_Xml_Element"); + } + + $sxe = simplexml_import_dom($e, $classname); + + if(!($sxe instanceof Zend_InfoCard_Xml_Element)) { + // Since we just checked to see if this was a subclass of Zend_infoCard_Xml_Element this shoudl never fail + // @codeCoverageIgnoreStart + throw new Zend_InfoCard_Xml_Exception("Failed to convert between DOM and SimpleXML"); + // @codeCoverageIgnoreEnd + } + + return $sxe; + } +} diff --git a/libs/Zend/InfoCard/Xml/Element/Interface.php b/libs/Zend/InfoCard/Xml/Element/Interface.php new file mode 100644 index 0000000..e170945 --- /dev/null +++ b/libs/Zend/InfoCard/Xml/Element/Interface.php @@ -0,0 +1,44 @@ +asXML(); + } else if (is_string($xmlData)) { + $strXmlData = $xmlData; + } else { + throw new Zend_InfoCard_Xml_Exception("Invalid Data provided to create instance"); + } + + $sxe = simplexml_load_string($strXmlData); + + switch($sxe['Type']) { + case 'http://www.w3.org/2001/04/xmlenc#Element': + include_once 'Zend/InfoCard/Xml/EncryptedData/XmlEnc.php'; + return simplexml_load_string($strXmlData, 'Zend_InfoCard_Xml_EncryptedData_XmlEnc'); + default: + throw new Zend_InfoCard_Xml_Exception("Unknown EncryptedData type found"); + } + } +} diff --git a/libs/Zend/InfoCard/Xml/EncryptedData/Abstract.php b/libs/Zend/InfoCard/Xml/EncryptedData/Abstract.php new file mode 100644 index 0000000..0fc75ac --- /dev/null +++ b/libs/Zend/InfoCard/Xml/EncryptedData/Abstract.php @@ -0,0 +1,92 @@ +KeyInfo[0]); + } + + /** + * Return the Encryption method used to encrypt the assertion document + * (the symmetric cipher) + * + * @throws Zend_InfoCard_Xml_Exception + * @return string The URI of the Symmetric Encryption Method used + */ + public function getEncryptionMethod() + { + + /** + * @todo This is pretty hacky unless we can always be confident that the first + * EncryptionMethod block is the correct one (the AES or compariable symetric algorithm).. + * the second is the PK method if provided. + */ + list($encryption_method) = $this->xpath("//enc:EncryptionMethod"); + + if(!($encryption_method instanceof Zend_InfoCard_Xml_Element)) { + throw new Zend_InfoCard_Xml_Exception("Unable to find the enc:EncryptionMethod symmetric encryption block"); + } + + $dom = self::convertToDOM($encryption_method); + + if(!$dom->hasAttribute('Algorithm')) { + throw new Zend_InfoCard_Xml_Exception("Unable to determine the encryption algorithm in the Symmetric enc:EncryptionMethod XML block"); + } + + return $dom->getAttribute('Algorithm'); + } + + /** + * Returns the value of the encrypted block + * + * @return string the value of the encrypted CipherValue block + */ + abstract function getCipherValue(); +} diff --git a/libs/Zend/InfoCard/Xml/EncryptedData/XmlEnc.php b/libs/Zend/InfoCard/Xml/EncryptedData/XmlEnc.php new file mode 100644 index 0000000..f18085b --- /dev/null +++ b/libs/Zend/InfoCard/Xml/EncryptedData/XmlEnc.php @@ -0,0 +1,64 @@ +registerXPathNamespace('enc', 'http://www.w3.org/2001/04/xmlenc#'); + + list(,$cipherdata) = $this->xpath("//enc:CipherData"); + + if(!($cipherdata instanceof Zend_InfoCard_Xml_Element)) { + throw new Zend_InfoCard_Xml_Exception("Unable to find the enc:CipherData block"); + } + + list(,$ciphervalue) = $cipherdata->xpath("//enc:CipherValue"); + + if(!($ciphervalue instanceof Zend_InfoCard_Xml_Element)) { + throw new Zend_InfoCard_Xml_Exception("Unable to fidn the enc:CipherValue block"); + } + + return (string)$ciphervalue; + } +} diff --git a/libs/Zend/InfoCard/Xml/EncryptedKey.php b/libs/Zend/InfoCard/Xml/EncryptedKey.php new file mode 100644 index 0000000..704df76 --- /dev/null +++ b/libs/Zend/InfoCard/Xml/EncryptedKey.php @@ -0,0 +1,174 @@ +asXML(); + } else if (is_string($xmlData)) { + $strXmlData = $xmlData; + } else { + throw new Zend_InfoCard_Xml_Exception("Invalid Data provided to create instance"); + } + + $sxe = simplexml_load_string($strXmlData); + + if($sxe->getName() != "EncryptedKey") { + throw new Zend_InfoCard_Xml_Exception("Invalid XML Block provided for EncryptedKey"); + } + + return simplexml_load_string($strXmlData, "Zend_InfoCard_Xml_EncryptedKey"); + } + + /** + * Returns the Encyption Method Algorithm URI of the block + * + * @throws Zend_InfoCard_Xml_Exception + * @return string the Encryption method algorithm URI + */ + public function getEncryptionMethod() + { + + $this->registerXPathNamespace('e', 'http://www.w3.org/2001/04/xmlenc#'); + list($encryption_method) = $this->xpath("//e:EncryptionMethod"); + + if(!($encryption_method instanceof Zend_InfoCard_Xml_Element)) { + throw new Zend_InfoCard_Xml_Exception("Unable to find the e:EncryptionMethod KeyInfo encryption block"); + } + + $dom = self::convertToDOM($encryption_method); + + if(!$dom->hasAttribute('Algorithm')) { + throw new Zend_InfoCard_Xml_Exception("Unable to determine the encryption algorithm in the Symmetric enc:EncryptionMethod XML block"); + } + + return $dom->getAttribute('Algorithm'); + + } + + /** + * Returns the Digest Method Algorithm URI used + * + * @throws Zend_InfoCard_Xml_Exception + * @return string the Digest Method Algorithm URI + */ + public function getDigestMethod() + { + $this->registerXPathNamespace('e', 'http://www.w3.org/2001/04/xmlenc#'); + list($encryption_method) = $this->xpath("//e:EncryptionMethod"); + + if(!($encryption_method instanceof Zend_InfoCard_Xml_Element)) { + throw new Zend_InfoCard_Xml_Exception("Unable to find the e:EncryptionMethod KeyInfo encryption block"); + } + + if(!($encryption_method->DigestMethod instanceof Zend_InfoCard_Xml_Element)) { + throw new Zend_InfoCard_Xml_Exception("Unable to find the DigestMethod block"); + } + + $dom = self::convertToDOM($encryption_method->DigestMethod); + + if(!$dom->hasAttribute('Algorithm')) { + throw new Zend_InfoCard_Xml_Exception("Unable to determine the digest algorithm for the symmetric Keyinfo"); + } + + return $dom->getAttribute('Algorithm'); + + } + + /** + * Returns the KeyInfo block object + * + * @throws Zend_InfoCard_Xml_Exception + * @return Zend_InfoCard_Xml_KeyInfo_Abstract + */ + public function getKeyInfo() + { + + if(isset($this->KeyInfo)) { + return Zend_InfoCard_Xml_KeyInfo::getInstance($this->KeyInfo); + } + + throw new Zend_InfoCard_Xml_Exception("Unable to locate a KeyInfo block"); + } + + /** + * Return the encrypted value of the block in base64 format + * + * @throws Zend_InfoCard_Xml_Exception + * @return string The Value of the CipherValue block in base64 format + */ + public function getCipherValue() + { + + $this->registerXPathNamespace('e', 'http://www.w3.org/2001/04/xmlenc#'); + + list($cipherdata) = $this->xpath("//e:CipherData"); + + if(!($cipherdata instanceof Zend_InfoCard_Xml_Element)) { + throw new Zend_InfoCard_Xml_Exception("Unable to find the e:CipherData block"); + } + + $cipherdata->registerXPathNameSpace('enc', 'http://www.w3.org/2001/04/xmlenc#'); + list($ciphervalue) = $cipherdata->xpath("//enc:CipherValue"); + + if(!($ciphervalue instanceof Zend_InfoCard_Xml_Element)) { + throw new Zend_InfoCard_Xml_Exception("Unable to fidn the enc:CipherValue block"); + } + + return (string)$ciphervalue; + } +} diff --git a/libs/Zend/InfoCard/Xml/Exception.php b/libs/Zend/InfoCard/Xml/Exception.php new file mode 100644 index 0000000..b723ac7 --- /dev/null +++ b/libs/Zend/InfoCard/Xml/Exception.php @@ -0,0 +1,37 @@ +asXML(); + } else if (is_string($xmlData)) { + $strXmlData = $xmlData; + } else { + throw new Zend_InfoCard_Xml_Exception("Invalid Data provided to create instance"); + } + + $sxe = simplexml_load_string($strXmlData); + + $namespaces = $sxe->getDocNameSpaces(); + + if(!empty($namespaces)) { + foreach($sxe->getDocNameSpaces() as $namespace) { + switch($namespace) { + case 'http://www.w3.org/2000/09/xmldsig#': + include_once 'Zend/InfoCard/Xml/KeyInfo/XmlDSig.php'; + return simplexml_load_string($strXmlData, 'Zend_InfoCard_Xml_KeyInfo_XmlDSig'); + default: + + throw new Zend_InfoCard_Xml_Exception("Unknown KeyInfo Namespace provided"); + // We are ignoring these lines, as XDebug reports each as a "non executed" line + // which breaks my coverage % + // @codeCoverageIgnoreStart + } + } + } + // @codeCoverageIgnoreEnd + + include_once 'Zend/InfoCard/Xml/KeyInfo/Default.php'; + return simplexml_load_string($strXmlData, 'Zend_InfoCard_Xml_KeyInfo_Default'); + } +} diff --git a/libs/Zend/InfoCard/Xml/KeyInfo/Abstract.php b/libs/Zend/InfoCard/Xml/KeyInfo/Abstract.php new file mode 100644 index 0000000..b8d8a7d --- /dev/null +++ b/libs/Zend/InfoCard/Xml/KeyInfo/Abstract.php @@ -0,0 +1,37 @@ + block which doesn't provide a namespace + * In this context, it is assumed to mean that it is the type of KeyInfo block which + * contains the SecurityTokenReference + * + * @category Zend + * @package Zend_InfoCard + * @subpackage Zend_InfoCard_Xml + * @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_InfoCard_Xml_KeyInfo_Default extends Zend_InfoCard_Xml_KeyInfo_Abstract +{ + /** + * Returns the object representation of the SecurityTokenReference block + * + * @throws Zend_InfoCard_Xml_Exception + * @return Zend_InfoCard_Xml_SecurityTokenReference + */ + public function getSecurityTokenReference() + { + $this->registerXPathNamespace('o', 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd'); + + list($sectokenref) = $this->xpath('//o:SecurityTokenReference'); + + if(!($sectokenref instanceof Zend_InfoCard_Xml_Element)) { + throw new Zend_InfoCard_Xml_Exception('Could not locate the Security Token Reference'); + } + + return Zend_InfoCard_Xml_SecurityTokenReference::getInstance($sectokenref); + } +} diff --git a/libs/Zend/InfoCard/Xml/KeyInfo/Interface.php b/libs/Zend/InfoCard/Xml/KeyInfo/Interface.php new file mode 100644 index 0000000..9920f68 --- /dev/null +++ b/libs/Zend/InfoCard/Xml/KeyInfo/Interface.php @@ -0,0 +1,38 @@ +registerXPathNamespace('e', 'http://www.w3.org/2001/04/xmlenc#'); + list($encryptedkey) = $this->xpath('//e:EncryptedKey'); + + if(!($encryptedkey instanceof Zend_InfoCard_Xml_Element)) { + throw new Zend_InfoCard_Xml_Exception("Failed to retrieve encrypted key"); + } + + return Zend_InfoCard_Xml_EncryptedKey::getInstance($encryptedkey); + } + + /** + * Returns the KeyInfo Block within the encrypted key + * + * @return Zend_InfoCard_Xml_KeyInfo_Default + */ + public function getKeyInfo() + { + return $this->getEncryptedKey()->getKeyInfo(); + } +} diff --git a/libs/Zend/InfoCard/Xml/Security.php b/libs/Zend/InfoCard/Xml/Security.php new file mode 100644 index 0000000..5e188c2 --- /dev/null +++ b/libs/Zend/InfoCard/Xml/Security.php @@ -0,0 +1,292 @@ +Signature)) { + throw new Zend_InfoCard_Xml_Security_Exception("Could not identify XML Signature element"); + } + + if(!isset($sxe->Signature->SignedInfo)) { + throw new Zend_InfoCard_Xml_Security_Exception("Signature is missing a SignedInfo block"); + } + + if(!isset($sxe->Signature->SignatureValue)) { + throw new Zend_InfoCard_Xml_Security_Exception("Signature is missing a SignatureValue block"); + } + + if(!isset($sxe->Signature->KeyInfo)) { + throw new Zend_InfoCard_Xml_Security_Exception("Signature is missing a KeyInfo block"); + } + + if(!isset($sxe->Signature->KeyInfo->KeyValue)) { + throw new Zend_InfoCard_Xml_Security_Exception("Signature is missing a KeyValue block"); + } + + switch((string)$sxe->Signature->SignedInfo->CanonicalizationMethod['Algorithm']) { + case self::CANONICAL_METHOD_C14N_EXC: + $cMethod = (string)$sxe->Signature->SignedInfo->CanonicalizationMethod['Algorithm']; + break; + default: + throw new Zend_InfoCard_Xml_Security_Exception("Unknown or unsupported CanonicalizationMethod Requested"); + } + + switch((string)$sxe->Signature->SignedInfo->SignatureMethod['Algorithm']) { + case self::SIGNATURE_METHOD_SHA1: + $sMethod = (string)$sxe->Signature->SignedInfo->SignatureMethod['Algorithm']; + break; + default: + throw new Zend_InfoCard_Xml_Security_Exception("Unknown or unsupported SignatureMethod Requested"); + } + + switch((string)$sxe->Signature->SignedInfo->Reference->DigestMethod['Algorithm']) { + case self::DIGEST_METHOD_SHA1: + $dMethod = (string)$sxe->Signature->SignedInfo->Reference->DigestMethod['Algorithm']; + break; + default: + throw new Zend_InfoCard_Xml_Security_Exception("Unknown or unsupported DigestMethod Requested"); + } + + $base64DecodeSupportsStrictParam = version_compare(PHP_VERSION, '5.2.0', '>='); + + if ($base64DecodeSupportsStrictParam) { + $dValue = base64_decode((string)$sxe->Signature->SignedInfo->Reference->DigestValue, true); + } else { + $dValue = base64_decode((string)$sxe->Signature->SignedInfo->Reference->DigestValue); + } + + if ($base64DecodeSupportsStrictParam) { + $signatureValue = base64_decode((string)$sxe->Signature->SignatureValue, true); + } else { + $signatureValue = base64_decode((string)$sxe->Signature->SignatureValue); + } + + $transformer = new Zend_InfoCard_Xml_Security_Transform(); + + foreach($sxe->Signature->SignedInfo->Reference->Transforms->children() as $transform) { + $transformer->addTransform((string)$transform['Algorithm']); + } + + $transformed_xml = $transformer->applyTransforms($strXMLInput); + + $transformed_xml_binhash = pack("H*", sha1($transformed_xml)); + + if($transformed_xml_binhash != $dValue) { + throw new Zend_InfoCard_Xml_Security_Exception("Locally Transformed XML does not match XML Document. Cannot Verify Signature"); + } + + $public_key = null; + + switch(true) { + case isset($sxe->Signature->KeyInfo->KeyValue->X509Certificate): + + $certificate = (string)$sxe->Signature->KeyInfo->KeyValue->X509Certificate; + + + $pem = "-----BEGIN CERTIFICATE-----\n" . + wordwrap($certificate, 64, "\n", true) . + "\n-----END CERTIFICATE-----"; + + $public_key = openssl_pkey_get_public($pem); + + if(!$public_key) { + throw new Zend_InfoCard_Xml_Security_Exception("Unable to extract and prcoess X509 Certificate from KeyValue"); + } + + break; + case isset($sxe->Signature->KeyInfo->KeyValue->RSAKeyValue): + + if(!isset($sxe->Signature->KeyInfo->KeyValue->RSAKeyValue->Modulus) || + !isset($sxe->Signature->KeyInfo->KeyValue->RSAKeyValue->Exponent)) { + throw new Zend_InfoCard_Xml_Security_Exception("RSA Key Value not in Modulus/Exponent form"); + } + + $modulus = base64_decode((string)$sxe->Signature->KeyInfo->KeyValue->RSAKeyValue->Modulus); + $exponent = base64_decode((string)$sxe->Signature->KeyInfo->KeyValue->RSAKeyValue->Exponent); + + $pem_public_key = self::_getPublicKeyFromModExp($modulus, $exponent); + + $public_key = openssl_pkey_get_public ($pem_public_key); + + break; + default: + throw new Zend_InfoCard_Xml_Security_Exception("Unable to determine or unsupported representation of the KeyValue block"); + } + + $transformer = new Zend_InfoCard_Xml_Security_Transform(); + $transformer->addTransform((string)$sxe->Signature->SignedInfo->CanonicalizationMethod['Algorithm']); + + // The way we are doing our XML processing requires that we specifically add this + // (even though it's in the parent-block).. otherwise, our canonical form + // fails signature verification + $sxe->Signature->SignedInfo->addAttribute('xmlns', 'http://www.w3.org/2000/09/xmldsig#'); + + $canonical_signedinfo = $transformer->applyTransforms($sxe->Signature->SignedInfo->asXML()); + + if(@openssl_verify($canonical_signedinfo, $signatureValue, $public_key)) { + return (string)$sxe->Signature->SignedInfo->Reference['URI']; + } + + return false; + } + + /** + * Transform an RSA Key in Modulus/Exponent format into a PEM encoding and + * return an openssl resource for it + * + * @param string $modulus The RSA Modulus in binary format + * @param string $exponent The RSA exponent in binary format + * @return string The PEM encoded version of the key + */ + static protected function _getPublicKeyFromModExp($modulus, $exponent) + { + $modulusInteger = self::_encodeValue($modulus, self::ASN_TYPE_INTEGER); + $exponentInteger = self::_encodeValue($exponent, self::ASN_TYPE_INTEGER); + $modExpSequence = self::_encodeValue($modulusInteger . $exponentInteger, self::ASN_TYPE_SEQUENCE); + $modExpBitString = self::_encodeValue($modExpSequence, self::ASN_TYPE_BITSTRING); + + $binRsaKeyIdentifier = pack( "H*", self::RSA_KEY_IDENTIFIER ); + + $publicKeySequence = self::_encodeValue($binRsaKeyIdentifier . $modExpBitString, self::ASN_TYPE_SEQUENCE); + + $publicKeyInfoBase64 = base64_encode( $publicKeySequence ); + + $publicKeyString = "-----BEGIN PUBLIC KEY-----\n"; + $publicKeyString .= wordwrap($publicKeyInfoBase64, 64, "\n", true); + $publicKeyString .= "\n-----END PUBLIC KEY-----\n"; + + return $publicKeyString; + } + + /** + * Encode a limited set of data types into ASN.1 encoding format + * which is used in X.509 certificates + * + * @param string $data The data to encode + * @param const $type The encoding format constant + * @return string The encoded value + * @throws Zend_InfoCard_Xml_Security_Exception + */ + static protected function _encodeValue($data, $type) + { + // Null pad some data when we get it (integer values > 128 and bitstrings) + if( (($type == self::ASN_TYPE_INTEGER) && (ord($data) > 0x7f)) || + ($type == self::ASN_TYPE_BITSTRING)) { + $data = "\0$data"; + } + + $len = strlen($data); + + // encode the value based on length of the string + // I'm fairly confident that this is by no means a complete implementation + // but it is enough for our purposes + switch(true) { + case ($len < 128): + return sprintf("%c%c%s", $type, $len, $data); + case ($len < 0x0100): + return sprintf("%c%c%c%s", $type, 0x81, $len, $data); + case ($len < 0x010000): + return sprintf("%c%c%c%c%s", $type, 0x82, $len / 0x0100, $len % 0x0100, $data); + default: + throw new Zend_InfoCard_Xml_Security_Exception("Could not encode value"); + } + + throw new Zend_InfoCard_Xml_Security_Exception("Invalid code path"); + } +} \ No newline at end of file diff --git a/libs/Zend/InfoCard/Xml/Security/Exception.php b/libs/Zend/InfoCard/Xml/Security/Exception.php new file mode 100644 index 0000000..f62182b --- /dev/null +++ b/libs/Zend/InfoCard/Xml/Security/Exception.php @@ -0,0 +1,37 @@ +_findClassbyURI($uri); + + $this->_transformList[] = array('uri' => $uri, + 'class' => $class); + return $this; + } + + /** + * Return the list of transforms to perform + * + * @return array The list of transforms + */ + public function getTransformList() + { + return $this->_transformList; + } + + /** + * Apply the transforms in the transform list to the input XML document + * + * @param string $strXmlDocument The input XML + * @return string The XML after the transformations have been applied + */ + public function applyTransforms($strXmlDocument) + { + foreach($this->_transformList as $transform) { + Zend_Loader::loadClass($transform['class']); + + $transformer = new $transform['class']; + + // We can't really test this check because it would require logic changes in the component itself + // @codeCoverageIgnoreStart + if(!($transformer instanceof Zend_InfoCard_Xml_Security_Transform_Interface)) { + throw new Zend_InfoCard_Xml_Security_Exception("Transforms must implement the Transform Interface"); + } + // @codeCoverageIgnoreEnd + + $strXmlDocument = $transformer->transform($strXmlDocument); + } + + return $strXmlDocument; + } +} diff --git a/libs/Zend/InfoCard/Xml/Security/Transform/EnvelopedSignature.php b/libs/Zend/InfoCard/Xml/Security/Transform/EnvelopedSignature.php new file mode 100644 index 0000000..c50ef1e --- /dev/null +++ b/libs/Zend/InfoCard/Xml/Security/Transform/EnvelopedSignature.php @@ -0,0 +1,64 @@ +Signature) { + throw new Zend_InfoCard_Xml_Security_Transform_Exception("Unable to locate Signature Block for EnvelopedSignature Transform"); + } + + unset($sxe->Signature); + + return $sxe->asXML(); + } +} diff --git a/libs/Zend/InfoCard/Xml/Security/Transform/Exception.php b/libs/Zend/InfoCard/Xml/Security/Transform/Exception.php new file mode 100644 index 0000000..285460b --- /dev/null +++ b/libs/Zend/InfoCard/Xml/Security/Transform/Exception.php @@ -0,0 +1,37 @@ +loadXML($strXMLData); + + if(method_exists($dom, 'C14N')) { + return $dom->C14N(true, false); + } + + throw new Zend_InfoCard_Xml_Security_Transform_Exception("This transform requires the C14N() method to exist in the DOM extension"); + } +} diff --git a/libs/Zend/InfoCard/Xml/SecurityTokenReference.php b/libs/Zend/InfoCard/Xml/SecurityTokenReference.php new file mode 100644 index 0000000..fc8a861 --- /dev/null +++ b/libs/Zend/InfoCard/Xml/SecurityTokenReference.php @@ -0,0 +1,173 @@ +asXML(); + } else if (is_string($xmlData)) { + $strXmlData = $xmlData; + } else { + throw new Zend_InfoCard_Xml_Exception("Invalid Data provided to create instance"); + } + + $sxe = simplexml_load_string($strXmlData); + + if($sxe->getName() != "SecurityTokenReference") { + throw new Zend_InfoCard_Xml_Exception("Invalid XML Block provided for SecurityTokenReference"); + } + + return simplexml_load_string($strXmlData, "Zend_InfoCard_Xml_SecurityTokenReference"); + } + + /** + * Return the Key Identifier XML Object + * + * @return Zend_InfoCard_Xml_Element + * @throws Zend_InfoCard_Xml_Exception + */ + protected function _getKeyIdentifier() + { + $this->registerXPathNamespace('o', 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd'); + list($keyident) = $this->xpath('//o:KeyIdentifier'); + + if(!($keyident instanceof Zend_InfoCard_Xml_Element)) { + throw new Zend_InfoCard_Xml_Exception("Failed to retrieve Key Identifier"); + } + + return $keyident; + } + + /** + * Return the Key URI identifying the thumbprint type used + * + * @return string The thumbprint type URI + * @throws Zend_InfoCard_Xml_Exception + */ + public function getKeyThumbprintType() + { + + $keyident = $this->_getKeyIdentifier(); + + $dom = self::convertToDOM($keyident); + + if(!$dom->hasAttribute('ValueType')) { + throw new Zend_InfoCard_Xml_Exception("Key Identifier did not provide a type for the value"); + } + + return $dom->getAttribute('ValueType'); + } + + + /** + * Return the thumbprint encoding type used as a URI + * + * @return string the URI of the thumbprint encoding used + * @throws Zend_InfoCard_Xml_Exception + */ + public function getKeyThumbprintEncodingType() + { + + $keyident = $this->_getKeyIdentifier(); + + $dom = self::convertToDOM($keyident); + + if(!$dom->hasAttribute('EncodingType')) { + throw new Zend_InfoCard_Xml_Exception("Unable to determine the encoding type for the key identifier"); + } + + return $dom->getAttribute('EncodingType'); + } + + /** + * Get the key reference data used to identify the public key + * + * @param bool $decode if true, will return a decoded version of the key + * @return string the key reference thumbprint, either in binary or encoded form + * @throws Zend_InfoCard_Xml_Exception + */ + public function getKeyReference($decode = true) + { + $keyIdentifier = $this->_getKeyIdentifier(); + + $dom = self::convertToDOM($keyIdentifier); + $encoded = $dom->nodeValue; + + if(empty($encoded)) { + throw new Zend_InfoCard_Xml_Exception("Could not find the Key Reference Encoded Value"); + } + + if($decode) { + + $decoded = ""; + switch($this->getKeyThumbprintEncodingType()) { + case self::ENCODING_BASE64BIN: + + if(version_compare(PHP_VERSION, "5.2.0", ">=")) { + $decoded = base64_decode($encoded, true); + } else { + $decoded = base64_decode($encoded); + } + + break; + default: + throw new Zend_InfoCard_Xml_Exception("Unknown Key Reference Encoding Type: {$this->getKeyThumbprintEncodingType()}"); + } + + if(!$decoded || empty($decoded)) { + throw new Zend_InfoCard_Xml_Exception("Failed to decode key reference"); + } + + return $decoded; + } + + return $encoded; + } +} diff --git a/libs/Zend/Json.php b/libs/Zend/Json.php new file mode 100644 index 0000000..cf8f7c1 --- /dev/null +++ b/libs/Zend/Json.php @@ -0,0 +1,246 @@ +toJson(); + } + + if (function_exists('json_encode') && self::$useBuiltinEncoderDecoder !== true) { + return json_encode($valueToEncode); + } + + require_once 'Zend/Json/Encoder.php'; + return Zend_Json_Encoder::encode($valueToEncode, $cycleCheck, $options); + } + + /** + * fromXml - Converts XML to JSON + * + * Converts a XML formatted string into a JSON formatted string. + * The value returned will be a string in JSON format. + * + * The caller of this function needs to provide only the first parameter, + * which is an XML formatted String. The second parameter is optional, which + * lets the user to select if the XML attributes in the input XML string + * should be included or ignored in xml2json conversion. + * + * This function converts the XML formatted string into a PHP array by + * calling a recursive (protected static) function in this class. Then, it + * converts that PHP array into JSON by calling the "encode" static funcion. + * + * Throws a Zend_Json_Exception if the input not a XML formatted string. + * + * @static + * @access public + * @param string $xmlStringContents XML String to be converted + * @param boolean $ignoreXmlAttributes Include or exclude XML attributes in + * the xml2json conversion process. + * @return mixed - JSON formatted string on success + * @throws Zend_Json_Exception + */ + public static function fromXml ($xmlStringContents, $ignoreXmlAttributes=true) { + // Load the XML formatted string into a Simple XML Element object. + $simpleXmlElementObject = simplexml_load_string($xmlStringContents); + + // If it is not a valid XML content, throw an exception. + if ($simpleXmlElementObject == null) { + throw new Zend_Json_Exception('Function fromXml was called with an invalid XML formatted string.'); + } // End of if ($simpleXmlElementObject == null) + + $resultArray = null; + + // Call the recursive function to convert the XML into a PHP array. + $resultArray = self::_processXml($simpleXmlElementObject, $ignoreXmlAttributes); + + // Convert the PHP array to JSON using Zend_Json encode method. + // It is just that simple. + $jsonStringOutput = self::encode($resultArray); + return($jsonStringOutput); + } // End of function fromXml. + + /** + * _processXml - Contains the logic for xml2json + * + * The logic in this function is a recursive one. + * + * The main caller of this function (i.e. fromXml) needs to provide + * only the first two parameters i.e. the SimpleXMLElement object and + * the flag for ignoring or not ignoring XML attributes. The third parameter + * will be used internally within this function during the recursive calls. + * + * This function converts the SimpleXMLElement object into a PHP array by + * calling a recursive (protected static) function in this class. Once all + * the XML elements are stored in the PHP array, it is returned to the caller. + * + * Throws a Zend_Json_Exception if the XML tree is deeper than the allowed limit. + * + * @static + * @access protected + * @param SimpleXMLElement $simpleXmlElementObject XML element to be converted + * @param boolean $ignoreXmlAttributes Include or exclude XML attributes in + * the xml2json conversion process. + * @param int $recursionDepth Current recursion depth of this function + * @return mixed - On success, a PHP associative array of traversed XML elements + * @throws Zend_Json_Exception + */ + protected static function _processXml ($simpleXmlElementObject, $ignoreXmlAttributes, $recursionDepth=0) { + // Keep an eye on how deeply we are involved in recursion. + if ($recursionDepth > self::$maxRecursionDepthAllowed) { + // XML tree is too deep. Exit now by throwing an exception. + throw new Zend_Json_Exception( + "Function _processXml exceeded the allowed recursion depth of " . + self::$maxRecursionDepthAllowed); + } // End of if ($recursionDepth > self::$maxRecursionDepthAllowed) + + if ($recursionDepth == 0) { + // Store the original SimpleXmlElementObject sent by the caller. + // We will need it at the very end when we return from here for good. + $callerProvidedSimpleXmlElementObject = $simpleXmlElementObject; + } // End of if ($recursionDepth == 0) + + if ($simpleXmlElementObject instanceof SimpleXMLElement) { + // Get a copy of the simpleXmlElementObject + $copyOfSimpleXmlElementObject = $simpleXmlElementObject; + // Get the object variables in the SimpleXmlElement object for us to iterate. + $simpleXmlElementObject = get_object_vars($simpleXmlElementObject); + } // End of if (get_class($simpleXmlElementObject) == "SimpleXMLElement") + + // It needs to be an array of object variables. + if (is_array($simpleXmlElementObject)) { + // Initialize a result array. + $resultArray = array(); + // Is the input array size 0? Then, we reached the rare CDATA text if any. + if (count($simpleXmlElementObject) <= 0) { + // Let us return the lonely CDATA. It could even be + // an empty element or just filled with whitespaces. + return (trim(strval($copyOfSimpleXmlElementObject))); + } // End of if (count($simpleXmlElementObject) <= 0) + + // Let us walk through the child elements now. + foreach($simpleXmlElementObject as $key=>$value) { + // Check if we need to ignore the XML attributes. + // If yes, you can skip processing the XML attributes. + // Otherwise, add the XML attributes to the result array. + if(($ignoreXmlAttributes == true) && (is_string($key)) && ($key == "@attributes")) { + continue; + } // End of if(($ignoreXmlAttributes == true) && ($key == "@attributes")) + + // Let us recursively process the current XML element we just visited. + // Increase the recursion depth by one. + $recursionDepth++; + $resultArray[$key] = self::_processXml ($value, $ignoreXmlAttributes, $recursionDepth); + + // Decrease the recursion depth by one. + $recursionDepth--; + } // End of foreach($simpleXmlElementObject as $key=>$value) { + + if ($recursionDepth == 0) { + // That is it. We are heading to the exit now. + // Set the XML root element name as the root [top-level] key of + // the associative array that we are going to return to the original + // caller of this recursive function. + $tempArray = $resultArray; + $resultArray = array(); + $resultArray[$callerProvidedSimpleXmlElementObject->getName()] = $tempArray; + } // End of if ($recursionDepth == 0) + + return($resultArray); + } else { + // We are now looking at either the XML attribute text or + // the text between the XML tags. + return (trim(strval($simpleXmlElementObject))); + } // End of if (is_array($simpleXmlElementObject)) + } // End of function _processXml. +} + diff --git a/libs/Zend/Json/Decoder.php b/libs/Zend/Json/Decoder.php new file mode 100644 index 0000000..c5f1f25 --- /dev/null +++ b/libs/Zend/Json/Decoder.php @@ -0,0 +1,457 @@ +_source = $source; + $this->_sourceLength = strlen($source); + $this->_token = self::EOF; + $this->_offset = 0; + + // Normalize and set $decodeType + if (!in_array($decodeType, array(Zend_Json::TYPE_ARRAY, Zend_Json::TYPE_OBJECT))) + { + $decodeType = Zend_Json::TYPE_ARRAY; + } + $this->_decodeType = $decodeType; + + // Set pointer at first token + $this->_getNextToken(); + } + + /** + * Decode a JSON source string + * + * Decodes a JSON encoded string. The value returned will be one of the + * following: + * - integer + * - float + * - boolean + * - null + * - StdClass + * - array + * - array of one or more of the above types + * + * By default, decoded objects will be returned as associative arrays; to + * return a StdClass object instead, pass {@link Zend_Json::TYPE_OBJECT} to + * the $objectDecodeType parameter. + * + * Throws a Zend_Json_Exception if the source string is null. + * + * @static + * @access public + * @param string $source String to be decoded + * @param int $objectDecodeType How objects should be decoded; should be + * either or {@link Zend_Json::TYPE_ARRAY} or + * {@link Zend_Json::TYPE_OBJECT}; defaults to TYPE_ARRAY + * @return mixed + * @throws Zend_Json_Exception + */ + public static function decode($source = null, $objectDecodeType = Zend_Json::TYPE_ARRAY) + { + if (null === $source) { + throw new Zend_Json_Exception('Must specify JSON encoded source for decoding'); + } elseif (!is_string($source)) { + throw new Zend_Json_Exception('Can only decode JSON encoded strings'); + } + + $decoder = new self($source, $objectDecodeType); + + return $decoder->_decodeValue(); + } + + + /** + * Recursive driving rountine for supported toplevel tops + * + * @return mixed + */ + protected function _decodeValue() + { + switch ($this->_token) { + case self::DATUM: + $result = $this->_tokenValue; + $this->_getNextToken(); + return($result); + break; + case self::LBRACE: + return($this->_decodeObject()); + break; + case self::LBRACKET: + return($this->_decodeArray()); + break; + default: + return null; + break; + } + } + + /** + * Decodes an object of the form: + * { "attribute: value, "attribute2" : value,...} + * + * If Zend_Json_Encoder was used to encode the original object then + * a special attribute called __className which specifies a class + * name that should wrap the data contained within the encoded source. + * + * Decodes to either an array or StdClass object, based on the value of + * {@link $_decodeType}. If invalid $_decodeType present, returns as an + * array. + * + * @return array|StdClass + */ + protected function _decodeObject() + { + $members = array(); + $tok = $this->_getNextToken(); + + while ($tok && $tok != self::RBRACE) { + if ($tok != self::DATUM || ! is_string($this->_tokenValue)) { + throw new Zend_Json_Exception('Missing key in object encoding: ' . $this->_source); + } + + $key = $this->_tokenValue; + $tok = $this->_getNextToken(); + + if ($tok != self::COLON) { + throw new Zend_Json_Exception('Missing ":" in object encoding: ' . $this->_source); + } + + $tok = $this->_getNextToken(); + $members[$key] = $this->_decodeValue(); + $tok = $this->_token; + + if ($tok == self::RBRACE) { + break; + } + + if ($tok != self::COMMA) { + throw new Zend_Json_Exception('Missing "," in object encoding: ' . $this->_source); + } + + $tok = $this->_getNextToken(); + } + + switch ($this->_decodeType) { + case Zend_Json::TYPE_OBJECT: + // Create new StdClass and populate with $members + $result = new StdClass(); + foreach ($members as $key => $value) { + $result->$key = $value; + } + break; + case Zend_Json::TYPE_ARRAY: + default: + $result = $members; + break; + } + + $this->_getNextToken(); + return $result; + } + + /** + * Decodes a JSON array format: + * [element, element2,...,elementN] + * + * @return array + */ + protected function _decodeArray() + { + $result = array(); + $starttok = $tok = $this->_getNextToken(); // Move past the '[' + $index = 0; + + while ($tok && $tok != self::RBRACKET) { + $result[$index++] = $this->_decodeValue(); + + $tok = $this->_token; + + if ($tok == self::RBRACKET || !$tok) { + break; + } + + if ($tok != self::COMMA) { + throw new Zend_Json_Exception('Missing "," in array encoding: ' . $this->_source); + } + + $tok = $this->_getNextToken(); + } + + $this->_getNextToken(); + return($result); + } + + + /** + * Removes whitepsace characters from the source input + */ + protected function _eatWhitespace() + { + if (preg_match( + '/([\t\b\f\n\r ])*/s', + $this->_source, + $matches, + PREG_OFFSET_CAPTURE, + $this->_offset) + && $matches[0][1] == $this->_offset) + { + $this->_offset += strlen($matches[0][0]); + } + } + + + /** + * Retrieves the next token from the source stream + * + * @return int Token constant value specified in class definition + */ + protected function _getNextToken() + { + $this->_token = self::EOF; + $this->_tokenValue = null; + $this->_eatWhitespace(); + + if ($this->_offset >= $this->_sourceLength) { + return(self::EOF); + } + + $str = $this->_source; + $str_length = $this->_sourceLength; + $i = $this->_offset; + $start = $i; + + switch ($str{$i}) { + case '{': + $this->_token = self::LBRACE; + break; + case '}': + $this->_token = self::RBRACE; + break; + case '[': + $this->_token = self::LBRACKET; + break; + case ']': + $this->_token = self::RBRACKET; + break; + case ',': + $this->_token = self::COMMA; + break; + case ':': + $this->_token = self::COLON; + break; + case '"': + $result = ''; + do { + $i++; + if ($i >= $str_length) { + break; + } + + $chr = $str{$i}; + if ($chr == '\\') { + $i++; + if ($i >= $str_length) { + break; + } + $chr = $str{$i}; + switch ($chr) { + case '"' : + $result .= '"'; + break; + case '\\': + $result .= '\\'; + break; + case '/' : + $result .= '/'; + break; + case 'b' : + $result .= chr(8); + break; + case 'f' : + $result .= chr(12); + break; + case 'n' : + $result .= chr(10); + break; + case 'r' : + $result .= chr(13); + break; + case 't' : + $result .= chr(9); + break; + case '\'' : + $result .= '\''; + break; + default: + throw new Zend_Json_Exception("Illegal escape " + . "sequence '" . $chr . "'"); + } + } elseif ($chr == '"') { + break; + } else { + $result .= $chr; + } + } while ($i < $str_length); + + $this->_token = self::DATUM; + //$this->_tokenValue = substr($str, $start + 1, $i - $start - 1); + $this->_tokenValue = $result; + break; + case 't': + if (($i+ 3) < $str_length && substr($str, $start, 4) == "true") { + $this->_token = self::DATUM; + } + $this->_tokenValue = true; + $i += 3; + break; + case 'f': + if (($i+ 4) < $str_length && substr($str, $start, 5) == "false") { + $this->_token = self::DATUM; + } + $this->_tokenValue = false; + $i += 4; + break; + case 'n': + if (($i+ 3) < $str_length && substr($str, $start, 4) == "null") { + $this->_token = self::DATUM; + } + $this->_tokenValue = NULL; + $i += 3; + break; + } + + if ($this->_token != self::EOF) { + $this->_offset = $i + 1; // Consume the last token character + return($this->_token); + } + + $chr = $str{$i}; + if ($chr == '-' || $chr == '.' || ($chr >= '0' && $chr <= '9')) { + if (preg_match('/-?([0-9])*(\.[0-9]*)?((e|E)((-|\+)?)[0-9]+)?/s', + $str, $matches, PREG_OFFSET_CAPTURE, $start) && $matches[0][1] == $start) { + + $datum = $matches[0][0]; + + if (is_numeric($datum)) { + if (preg_match('/^0\d+$/', $datum)) { + throw new Zend_Json_Exception("Octal notation not supported by JSON (value: $datum)"); + } else { + $val = intval($datum); + $fVal = floatval($datum); + $this->_tokenValue = ($val == $fVal ? $val : $fVal); + } + } else { + throw new Zend_Json_Exception("Illegal number format: $datum"); + } + + $this->_token = self::DATUM; + $this->_offset = $start + strlen($datum); + } + } else { + throw new Zend_Json_Exception('Illegal Token'); + } + + return($this->_token); + } +} + diff --git a/libs/Zend/Json/Encoder.php b/libs/Zend/Json/Encoder.php new file mode 100644 index 0000000..ddb865b --- /dev/null +++ b/libs/Zend/Json/Encoder.php @@ -0,0 +1,438 @@ +_cycleCheck = $cycleCheck; + $this->_options = $options; + } + + /** + * Use the JSON encoding scheme for the value specified + * + * @param mixed $value The value to be encoded + * @param boolean $cycleCheck Whether or not to check for possible object recursion when encoding + * @param array $options Additional options used during encoding + * @return string The encoded value + */ + public static function encode($value, $cycleCheck = false, $options = array()) + { + $encoder = new self(($cycleCheck) ? true : false, $options); + + return $encoder->_encodeValue($value); + } + + /** + * Recursive driver which determines the type of value to be encoded + * and then dispatches to the appropriate method. $values are either + * - objects (returns from {@link _encodeObject()}) + * - arrays (returns from {@link _encodeArray()}) + * - basic datums (e.g. numbers or strings) (returns from {@link _encodeDatum()}) + * + * @param $value mixed The value to be encoded + * @return string Encoded value + */ + protected function _encodeValue(&$value) + { + if (is_object($value)) { + return $this->_encodeObject($value); + } else if (is_array($value)) { + return $this->_encodeArray($value); + } + + return $this->_encodeDatum($value); + } + + + + /** + * Encode an object to JSON by encoding each of the public properties + * + * A special property is added to the JSON object called '__className' + * that contains the name of the class of $value. This is used to decode + * the object on the client into a specific class. + * + * @param $value object + * @return string + * @throws Zend_Json_Exception If recursive checks are enabled and the object has been serialized previously + */ + protected function _encodeObject(&$value) + { + if ($this->_cycleCheck) { + if ($this->_wasVisited($value)) { + + if (isset($this->_options['silenceCyclicalExceptions']) + && $this->_options['silenceCyclicalExceptions']===true) { + + return '"* RECURSION (' . get_class($value) . ') *"'; + + } else { + throw new Zend_Json_Exception( + 'Cycles not supported in JSON encoding, cycle introduced by ' + . 'class "' . get_class($value) . '"' + ); + } + } + + $this->_visited[] = $value; + } + + $props = ''; + + if ($value instanceof Iterator) { + $propCollection = $value; + } else { + $propCollection = get_object_vars($value); + } + + foreach ($propCollection as $name => $propValue) { + if (isset($propValue)) { + $props .= ',' + . $this->_encodeValue($name) + . ':' + . $this->_encodeValue($propValue); + } + } + + return '{"__className":"' . get_class($value) . '"' + . $props . '}'; + } + + + /** + * Determine if an object has been serialized already + * + * @param mixed $value + * @return boolean + */ + protected function _wasVisited(&$value) + { + if (in_array($value, $this->_visited, true)) { + return true; + } + + return false; + } + + + /** + * JSON encode an array value + * + * Recursively encodes each value of an array and returns a JSON encoded + * array string. + * + * Arrays are defined as integer-indexed arrays starting at index 0, where + * the last index is (count($array) -1); any deviation from that is + * considered an associative array, and will be encoded as such. + * + * @param $array array + * @return string + */ + protected function _encodeArray(&$array) + { + $tmpArray = array(); + + // Check for associative array + if (!empty($array) && (array_keys($array) !== range(0, count($array) - 1))) { + // Associative array + $result = '{'; + foreach ($array as $key => $value) { + $key = (string) $key; + $tmpArray[] = $this->_encodeString($key) + . ':' + . $this->_encodeValue($value); + } + $result .= implode(',', $tmpArray); + $result .= '}'; + } else { + // Indexed array + $result = '['; + $length = count($array); + for ($i = 0; $i < $length; $i++) { + $tmpArray[] = $this->_encodeValue($array[$i]); + } + $result .= implode(',', $tmpArray); + $result .= ']'; + } + + return $result; + } + + + /** + * JSON encode a basic data type (string, number, boolean, null) + * + * If value type is not a string, number, boolean, or null, the string + * 'null' is returned. + * + * @param $value mixed + * @return string + */ + protected function _encodeDatum(&$value) + { + $result = 'null'; + + if (is_int($value) || is_float($value)) { + $result = (string) $value; + } elseif (is_string($value)) { + $result = $this->_encodeString($value); + } elseif (is_bool($value)) { + $result = $value ? 'true' : 'false'; + } + + return $result; + } + + + /** + * JSON encode a string value by escaping characters as necessary + * + * @param $value string + * @return string + */ + protected function _encodeString(&$string) + { + // Escape these characters with a backslash: + // " \ / \n \r \t \b \f + $search = array('\\', "\n", "\t", "\r", "\b", "\f", '"'); + $replace = array('\\\\', '\\n', '\\t', '\\r', '\\b', '\\f', '\"'); + $string = str_replace($search, $replace, $string); + + // Escape certain ASCII characters: + // 0x08 => \b + // 0x0c => \f + $string = str_replace(array(chr(0x08), chr(0x0C)), array('\b', '\f'), $string); + + return '"' . $string . '"'; + } + + + /** + * Encode the constants associated with the ReflectionClass + * parameter. The encoding format is based on the class2 format + * + * @param $cls ReflectionClass + * @return string Encoded constant block in class2 format + */ + private static function _encodeConstants(ReflectionClass $cls) + { + $result = "constants : {"; + $constants = $cls->getConstants(); + + $tmpArray = array(); + if (!empty($constants)) { + foreach ($constants as $key => $value) { + $tmpArray[] = "$key: " . self::encode($value); + } + + $result .= implode(', ', $tmpArray); + } + + return $result . "}"; + } + + + /** + * Encode the public methods of the ReflectionClass in the + * class2 format + * + * @param $cls ReflectionClass + * @return string Encoded method fragment + * + */ + private static function _encodeMethods(ReflectionClass $cls) + { + $methods = $cls->getMethods(); + $result = 'methods:{'; + + $started = false; + foreach ($methods as $method) { + if (! $method->isPublic() || !$method->isUserDefined()) { + continue; + } + + if ($started) { + $result .= ','; + } + $started = true; + + $result .= '' . $method->getName(). ':function('; + + if ('__construct' != $method->getName()) { + $parameters = $method->getParameters(); + $paramCount = count($parameters); + $argsStarted = false; + + $argNames = "var argNames=["; + foreach ($parameters as $param) { + if ($argsStarted) { + $result .= ','; + } + + $result .= $param->getName(); + + if ($argsStarted) { + $argNames .= ','; + } + + $argNames .= '"' . $param->getName() . '"'; + + $argsStarted = true; + } + $argNames .= "];"; + + $result .= "){" + . $argNames + . 'var result = ZAjaxEngine.invokeRemoteMethod(' + . "this, '" . $method->getName() + . "',argNames,arguments);" + . 'return(result);}'; + } else { + $result .= "){}"; + } + } + + return $result . "}"; + } + + + /** + * Encode the public properties of the ReflectionClass in the class2 + * format. + * + * @param $cls ReflectionClass + * @return string Encode properties list + * + */ + private static function _encodeVariables(ReflectionClass $cls) + { + $properties = $cls->getProperties(); + $propValues = get_class_vars($cls->getName()); + $result = "variables:{"; + $cnt = 0; + + $tmpArray = array(); + foreach ($properties as $prop) { + if (! $prop->isPublic()) { + continue; + } + + $tmpArray[] = $prop->getName() + . ':' + . self::encode($propValues[$prop->getName()]); + } + $result .= implode(',', $tmpArray); + + return $result . "}"; + } + + /** + * Encodes the given $className into the class2 model of encoding PHP + * classes into JavaScript class2 classes. + * NOTE: Currently only public methods and variables are proxied onto + * the client machine + * + * @param $className string The name of the class, the class must be + * instantiable using a null constructor + * @param $package string Optional package name appended to JavaScript + * proxy class name + * @return string The class2 (JavaScript) encoding of the class + * @throws Zend_Json_Exception + */ + public static function encodeClass($className, $package = '') + { + $cls = new ReflectionClass($className); + if (! $cls->isInstantiable()) { + throw new Zend_Json_Exception("$className must be instantiable"); + } + + return "Class.create('$package$className',{" + . self::_encodeConstants($cls) ."," + . self::_encodeMethods($cls) ."," + . self::_encodeVariables($cls) .'});'; + } + + + /** + * Encode several classes at once + * + * Returns JSON encoded classes, using {@link encodeClass()}. + * + * @param array $classNames + * @param string $package + * @return string + */ + public static function encodeClasses(array $classNames, $package = '') + { + $result = ''; + foreach ($classNames as $className) { + $result .= self::encodeClass($className, $package); + } + + return $result; + } + +} + diff --git a/libs/Zend/Json/Exception.php b/libs/Zend/Json/Exception.php new file mode 100644 index 0000000..5b99095 --- /dev/null +++ b/libs/Zend/Json/Exception.php @@ -0,0 +1,36 @@ + count($function)))) { + require_once 'Zend/Json/Server/Exception.php'; + throw new Zend_Json_Server_Exception('Unable to attach function; invalid'); + } + + if (!is_callable($function)) { + require_once 'Zend/Json/Server/Exception.php'; + throw new Zend_Json_Server_Exception('Unable to attach function; does not exist'); + } + + $argv = null; + if (2 < func_num_args()) { + $argv = func_get_args(); + $argv = array_slice($argv, 2); + } + + require_once 'Zend/Server/Reflection.php'; + if (is_string($function)) { + $method = Zend_Server_Reflection::reflectFunction($function, $argv, $namespace); + } else { + $class = array_shift($function); + $action = array_shift($function); + $reflection = Zend_Server_Reflection::reflectClass($class, $argv, $namespace); + $methods = $reflection->getMethods(); + $found = false; + foreach ($methods as $method) { + if ($action == $method->getName()) { + $found = true; + break; + } + } + if (!$found) { + $this->fault('Method not found', -32601); + return $this; + } + } + + $definition = $this->_buildSignature($method); + $this->_addMethodServiceMap($definition); + + return $this; + } + + /** + * Register a class with the server + * + * @param string $class + * @param string $namespace Ignored + * @param mixed $argv Ignored + * @return Zend_Json_Server + */ + public function setClass($class, $namespace = '', $argv = null) + { + $argv = null; + if (3 < func_num_args()) { + $argv = func_get_args(); + $argv = array_slice($argv, 3); + } + + require_once 'Zend/Server/Reflection.php'; + $reflection = Zend_Server_Reflection::reflectClass($class, $argv, $namespace); + + foreach ($reflection->getMethods() as $method) { + $definition = $this->_buildSignature($method, $class); + $this->_addMethodServiceMap($definition); + } + return $this; + } + + /** + * Indicate fault response + * + * @param string $fault + * @param int $code + * @return false + */ + public function fault($fault = null, $code = 404, $data = null) + { + require_once 'Zend/Json/Server/Error.php'; + $error = new Zend_Json_Server_Error($fault, $code, $data); + $this->getResponse()->setError($error); + return $error; + } + + /** + * Handle request + * + * @param Zend_Json_Server_Request $request + * @return null|Zend_Json_Server_Response + */ + public function handle($request = false) + { + if ((false !== $request) && (!$request instanceof Zend_Json_Server_Request)) { + require_once 'Zend/Json/Server/Exception.php'; + throw new Zend_Json_Server_Exception('Invalid request type provided; cannot handle'); + } elseif ($request) { + $this->setRequest($request); + } + + // Handle request + $this->_handle(); + + // Get response + $response = $this->_getReadyResponse(); + + // Emit response? + if ($this->autoEmitResponse()) { + echo $response; + return; + } + + // or return it? + return $response; + } + + /** + * Load function definitions + * + * @param array|Zend_Server_Definition $definition + * @return void + */ + public function loadFunctions($definition) + { + if (!is_array($definition) && (!$definition instanceof Zend_Server_Definition)) { + require_once 'Zend/Json/Server/Exception.php'; + throw new Zend_Json_Server_Exception('Invalid definition provided to loadFunctions()'); + } + + foreach ($definition as $key => $method) { + $this->_table->addMethod($method, $key); + $this->_addMethodServiceMap($method); + } + } + + public function setPersistence($mode) + { + } + + /** + * Set request object + * + * @param Zend_Json_Server_Request $request + * @return Zend_Json_Server + */ + public function setRequest(Zend_Json_Server_Request $request) + { + $this->_request = $request; + return $this; + } + + /** + * Get JSON-RPC request object + * + * @return Zend_Json_Server_Request + */ + public function getRequest() + { + if (null === ($request = $this->_request)) { + require_once 'Zend/Json/Server/Request/Http.php'; + $this->setRequest(new Zend_Json_Server_Request_Http()); + } + return $this->_request; + } + + /** + * Set response object + * + * @param Zend_Json_Server_Response $response + * @return Zend_Json_Server + */ + public function setResponse(Zend_Json_Server_Response $response) + { + $this->_response = $response; + return $this; + } + + /** + * Get response object + * + * @return Zend_Json_Server_Response + */ + public function getResponse() + { + if (null === ($response = $this->_response)) { + require_once 'Zend/Json/Server/Response/Http.php'; + $this->setResponse(new Zend_Json_Server_Response_Http()); + } + return $this->_response; + } + + /** + * Set flag indicating whether or not to auto-emit response + * + * @param bool $flag + * @return Zend_Json_Server + */ + public function setAutoEmitResponse($flag) + { + $this->_autoEmitResponse = (bool) $flag; + return $this; + } + + /** + * Will we auto-emit the response? + * + * @return bool + */ + public function autoEmitResponse() + { + return $this->_autoEmitResponse; + } + + // overloading for SMD metadata + /** + * Overload to accessors of SMD object + * + * @param string $method + * @param array $args + * @return mixed + */ + public function __call($method, $args) + { + if (preg_match('/^(set|get)/', $method, $matches)) { + if (in_array($method, $this->_getSmdMethods())) { + if ('set' == $matches[1]) { + $value = array_shift($args); + $this->getServiceMap()->$method($value); + return $this; + } else { + return $this->getServiceMap()->$method(); + } + } + } + return null; + } + + /** + * Retrieve SMD object + * + * @return Zend_Json_Server_Smd + */ + public function getServiceMap() + { + if (null === $this->_serviceMap) { + require_once 'Zend/Json/Server/Smd.php'; + $this->_serviceMap = new Zend_Json_Server_Smd(); + } + return $this->_serviceMap; + } + + /** + * Add service method to service map + * + * @param Zend_Server_Reflection_Function $method + * @return void + */ + protected function _addMethodServiceMap(Zend_Server_Method_Definition $method) + { + $serviceInfo = array( + 'name' => $method->getName(), + 'return' => $this->_getReturnType($method), + ); + $params = $this->_getParams($method); + $serviceInfo['params'] = $params; + $serviceMap = $this->getServiceMap(); + if (false !== $serviceMap->getService($serviceInfo['name'])) { + $serviceMap->removeService($serviceInfo['name']); + } + $serviceMap->addService($serviceInfo); + } + + /** + * Translate PHP type to JSON type + * + * @param string $type + * @return string + */ + protected function _fixType($type) + { + return $type; + } + + /** + * Get default params from signature + * + * @param array $args + * @param array $params + * @return array + */ + protected function _getDefaultParams(array $args, array $params) + { + $defaultParams = array_slice($params, count($args)); + foreach ($defaultParams as $param) { + $value = null; + if (array_key_exists('default', $param)) { + $value = $param['default']; + } + array_push($args, $value); + } + return $args; + } + + /** + * Get method param type + * + * @param Zend_Server_Reflection_Function_Abstract $method + * @return string|array + */ + protected function _getParams(Zend_Server_Method_Definition $method) + { + $params = array(); + foreach ($method->getPrototypes() as $prototype) { + foreach ($prototype->getParameterObjects() as $key => $parameter) { + if (!isset($params[$key])) { + $params[$key] = array( + 'type' => $parameter->getType(), + 'name' => $parameter->getName(), + 'optional' => $parameter->isOptional(), + ); + if (null !== ($default = $parameter->getDefaultValue())) { + $params[$key]['default'] = $default; + } + $description = $parameter->getDescription(); + if (!empty($description)) { + $params[$key]['description'] = $description; + } + continue; + } + $newType = $parameter->getType(); + if (!is_array($params[$key]['type'])) { + if ($params[$key]['type'] == $newType) { + continue; + } + $params[$key]['type'] = (array) $params[$key]['type']; + } elseif (in_array($newType, $params[$key]['type'])) { + continue; + } + array_push($params[$key]['type'], $parameter->getType()); + } + } + return $params; + } + + /** + * Set response state + * + * @return Zend_Json_Server_Response + */ + protected function _getReadyResponse() + { + $request = $this->getRequest(); + $response = $this->getResponse(); + + $response->setServiceMap($this->getServiceMap()); + if (null !== ($id = $request->getId())) { + $response->setId($id); + } + if (null !== ($version = $request->getVersion())) { + $response->setVersion($version); + } + + return $response; + } + + /** + * Get method return type + * + * @param Zend_Server_Reflection_Function_Abstract $method + * @return string|array + */ + protected function _getReturnType(Zend_Server_Method_Definition $method) + { + $return = array(); + foreach ($method->getPrototypes() as $prototype) { + $return[] = $prototype->getReturnType(); + } + if (1 == count($return)) { + return $return[0]; + } + return $return; + } + + /** + * Retrieve list of allowed SMD methods for proxying + * + * @return array + */ + protected function _getSmdMethods() + { + if (null === $this->_smdMethods) { + $this->_smdMethods = array(); + require_once 'Zend/Json/Server/Smd.php'; + $methods = get_class_methods('Zend_Json_Server_Smd'); + foreach ($methods as $key => $method) { + if (!preg_match('/^(set|get)/', $method)) { + continue; + } + if (strstr($method, 'Service')) { + continue; + } + $this->_smdMethods[] = $method; + } + } + return $this->_smdMethods; + } + + /** + * Internal method for handling request + * + * @return void + */ + protected function _handle() + { + $request = $this->getRequest(); + + if (!$request->isMethodError() && (null === $request->getMethod())) { + return $this->fault('Invalid Request', -32600); + } + + if ($request->isMethodError()) { + return $this->fault('Invalid Request', -32600); + } + + $method = $request->getMethod(); + if (!$this->_table->hasMethod($method)) { + return $this->fault('Method not found', -32601); + } + + $params = $request->getParams(); + $invocable = $this->_table->getMethod($method); + $serviceMap = $this->getServiceMap(); + $service = $serviceMap->getService($method); + $serviceParams = $service->getParams(); + + if (count($params) < count($serviceParams)) { + $params = $this->_getDefaultParams($params, $serviceParams); + } + + try { + $result = $this->_dispatch($invocable, $params); + } catch (Exception $e) { + return $this->fault($e->getMessage(), $e->getCode()); + } + + $this->getResponse()->setResult($result); + } +} diff --git a/libs/Zend/Json/Server/Cache.php b/libs/Zend/Json/Server/Cache.php new file mode 100644 index 0000000..a7e0237 --- /dev/null +++ b/libs/Zend/Json/Server/Cache.php @@ -0,0 +1,102 @@ +getServiceMap()->toJson())) { + return false; + } + + return true; + } + + /** + * Retrieve a cached SMD + * + * On success, returns the cached SMD (a JSON string); an failure, returns + * boolean false. + * + * @param string $filename + * @return string|false + */ + public static function getSmd($filename) + { + if (!is_string($filename) + || !file_exists($filename) + || !is_readable($filename)) + { + return false; + } + + + if (false === ($smd = @file_get_contents($filename))) { + return false; + } + + return $smd; + } + + /** + * Delete a file containing a cached SMD + * + * @param string $filename + * @return bool + */ + public static function deleteSmd($filename) + { + if (is_string($filename) && file_exists($filename)) { + unlink($filename); + return true; + } + + return false; + } +} diff --git a/libs/Zend/Json/Server/Error.php b/libs/Zend/Json/Server/Error.php new file mode 100644 index 0000000..e67218a --- /dev/null +++ b/libs/Zend/Json/Server/Error.php @@ -0,0 +1,197 @@ +setMessage($message) + ->setCode($code) + ->setData($data); + } + + /** + * Set error code + * + * @param int $code + * @return Zend_Json_Server_Error + */ + public function setCode($code) + { + if (!is_scalar($code)) { + return $this; + } + + $code = (int) $code; + if (in_array($code, $this->_allowedCodes)) { + $this->_code = $code; + } elseif (in_array($code, range(-32099, -32000))) { + $this->_code = $code; + } + + return $this; + } + + /** + * Get error code + * + * @return int|null + */ + public function getCode() + { + return $this->_code; + } + + /** + * Set error message + * + * @param string $message + * @return Zend_Json_Server_Error + */ + public function setMessage($message) + { + if (!is_scalar($message)) { + return $this; + } + + $this->_message = (string) $message; + return $this; + } + + /** + * Get error message + * + * @return string + */ + public function getMessage() + { + return $this->_message; + } + + /** + * Set error data + * + * @param mixed $data + * @return Zend_Json_Server_Error + */ + public function setData($data) + { + $this->_data = $data; + return $this; + } + + /** + * Get error data + * + * @return mixed + */ + public function getData() + { + return $this->_data; + } + + /** + * Cast error to array + * + * @return array + */ + public function toArray() + { + return array( + 'code' => $this->getCode(), + 'message' => $this->getMessage(), + 'data' => $this->getData(), + ); + } + + /** + * Cast error to JSON + * + * @return string + */ + public function toJson() + { + require_once 'Zend/Json.php'; + return Zend_Json::encode($this->toArray()); + } + + /** + * Cast to string (JSON) + * + * @return string + */ + public function __toString() + { + return $this->toJson(); + } +} + diff --git a/libs/Zend/Json/Server/Exception.php b/libs/Zend/Json/Server/Exception.php new file mode 100644 index 0000000..48612ea --- /dev/null +++ b/libs/Zend/Json/Server/Exception.php @@ -0,0 +1,35 @@ + $value) { + $method = 'set' . ucfirst($key); + if (in_array($method, $methods)) { + $this->$method($value); + } elseif ($key == 'jsonrpc') { + $this->setVersion($value); + } + } + return $this; + } + + /** + * Add a parameter to the request + * + * @param mixed $value + * @param string $key + * @return Zend_Json_Server_Request + */ + public function addParam($value, $key = null) + { + if ((null === $key) || !is_string($key)) { + $index = count($this->_params); + $this->_params[$index] = $value; + } else { + $this->_params[$key] = $value; + } + + return $this; + } + + /** + * Add many params + * + * @param array $params + * @return Zend_Json_Server_Request + */ + public function addParams(array $params) + { + foreach ($params as $key => $value) { + $this->addParam($value, $key); + } + return $this; + } + + /** + * Overwrite params + * + * @param array $params + * @return Zend_Json_Server_Request + */ + public function setParams(array $params) + { + $this->_params = array(); + return $this->addParams($params); + } + + /** + * Retrieve param by index or key + * + * @param int|string $index + * @return mixed|null Null when not found + */ + public function getParam($index) + { + if (array_key_exists($index, $this->_params)) { + return $this->_params[$index]; + } + + return null; + } + + /** + * Retrieve parameters + * + * @return array + */ + public function getParams() + { + return $this->_params; + } + + /** + * Set request method + * + * @param string $name + * @return Zend_Json_Server_Request + */ + public function setMethod($name) + { + if (!preg_match($this->_methodRegex, $name)) { + $this->_isMethodError = true; + } else { + $this->_method = $name; + } + return $this; + } + + /** + * Get request method name + * + * @return string + */ + public function getMethod() + { + return $this->_method; + } + + /** + * Was a bad method provided? + * + * @return bool + */ + public function isMethodError() + { + return $this->_isMethodError; + } + + /** + * Set request identifier + * + * @param mixed $name + * @return Zend_Json_Server_Request + */ + public function setId($name) + { + $this->_id = (string) $name; + return $this; + } + + /** + * Retrieve request identifier + * + * @return mixed + */ + public function getId() + { + return $this->_id; + } + + /** + * Set JSON-RPC version + * + * @param string $version + * @return Zend_Json_Server_Request + */ + public function setVersion($version) + { + if ('2.0' == $version) { + $this->_version = '2.0'; + } else { + $this->_version = '1.0'; + } + return $this; + } + + /** + * Retrieve JSON-RPC version + * + * @return string + */ + public function getVersion() + { + return $this->_version; + } + + /** + * Set request state based on JSON + * + * @param string $json + * @return void + */ + public function loadJson($json) + { + require_once 'Zend/Json.php'; + $options = Zend_Json::decode($json); + $this->setOptions($options); + } + + /** + * Cast request to JSON + * + * @return string + */ + public function toJson() + { + $jsonArray = array( + 'method' => $this->getMethod() + ); + if (null !== ($id = $this->getId())) { + $jsonArray['id'] = $id; + } + $params = $this->getParams(); + if (!empty($params)) { + $jsonArray['params'] = $params; + } + if ('2.0' == $this->getVersion()) { + $jsonArray['jsonrpc'] = '2.0'; + } + + require_once 'Zend/Json.php'; + return Zend_Json::encode($jsonArray); + } + + /** + * Cast request to string (JSON) + * + * @return string + */ + public function __toString() + { + return $this->toJson(); + } +} diff --git a/libs/Zend/Json/Server/Request/Http.php b/libs/Zend/Json/Server/Request/Http.php new file mode 100644 index 0000000..ea43852 --- /dev/null +++ b/libs/Zend/Json/Server/Request/Http.php @@ -0,0 +1,65 @@ +_rawJson = $json; + if (!empty($json)) { + $this->loadJson($json); + } + } + + /** + * Get JSON from raw POST body + * + * @return string + */ + public function getRawJson() + { + return $this->_rawJson; + } +} diff --git a/libs/Zend/Json/Server/Response.php b/libs/Zend/Json/Server/Response.php new file mode 100644 index 0000000..e2e32d9 --- /dev/null +++ b/libs/Zend/Json/Server/Response.php @@ -0,0 +1,247 @@ +_result = $value; + return $this; + } + + /** + * Get result + * + * @return mixed + */ + public function getResult() + { + return $this->_result; + } + + // RPC error, if response results in fault + /** + * Set result error + * + * @param Zend_Json_Server_Error $error + * @return Zend_Json_Server_Response + */ + public function setError(Zend_Json_Server_Error $error) + { + $this->_error = $error; + return $this; + } + + /** + * Get response error + * + * @return null|Zend_Json_Server_Error + */ + public function getError() + { + return $this->_error; + } + + /** + * Is the response an error? + * + * @return bool + */ + public function isError() + { + return $this->getError() instanceof Zend_Json_Server_Error; + } + + /** + * Set request ID + * + * @param mixed $name + * @return Zend_Json_Server_Response + */ + public function setId($name) + { + $this->_id = $name; + return $this; + } + + /** + * Get request ID + * + * @return mixed + */ + public function getId() + { + return $this->_id; + } + + /** + * Set JSON-RPC version + * + * @param string $version + * @return Zend_Json_Server_Response + */ + public function setVersion($version) + { + $version = (string) $version; + if ('2.0' == $version) { + $this->_version = '2.0'; + } else { + $this->_version = null; + } + + return $this; + } + + /** + * Retrieve JSON-RPC version + * + * @return string + */ + public function getVersion() + { + return $this->_version; + } + + /** + * Cast to JSON + * + * @return string + */ + public function toJson() + { + if ($this->isError()) { + $response = array( + 'error' => $this->getError()->toArray(), + 'id' => $this->getId(), + ); + } else { + $response = array( + 'result' => $this->getResult(), + 'id' => $this->getId(), + ); + } + + if (null !== ($version = $this->getVersion())) { + $response['jsonrpc'] = $version; + } + + require_once 'Zend/Json.php'; + return Zend_Json::encode($response); + } + + /** + * Retrieve args + * + * @return mixed + */ + public function getArgs() + { + return $this->_args; + } + + /** + * Set args + * + * @param mixed $args + * @return self + */ + public function setArgs($args) + { + $this->_args = $args; + return $this; + } + + /** + * Set service map object + * + * @param Zend_Json_Server_Smd $serviceMap + * @return Zend_Json_Server_Response + */ + public function setServiceMap($serviceMap) + { + $this->_serviceMap = $serviceMap; + return $this; + } + + /** + * Retrieve service map + * + * @return Zend_Json_Server_Smd|null + */ + public function getServiceMap() + { + return $this->_serviceMap; + } + + /** + * Cast to string (JSON) + * + * @return string + */ + public function __toString() + { + return $this->toJson(); + } +} + diff --git a/libs/Zend/Json/Server/Response/Http.php b/libs/Zend/Json/Server/Response/Http.php new file mode 100644 index 0000000..a86ed8b --- /dev/null +++ b/libs/Zend/Json/Server/Response/Http.php @@ -0,0 +1,80 @@ +sendHeaders(); + if (!$this->isError() && null === $this->getId()) { + return ''; + } + + return parent::toJson(); + } + + /** + * 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 + * service map. + * + * @return void + */ + public function sendHeaders() + { + if (headers_sent()) { + return; + } + + if (!$this->isError() && (null === $this->getId())) { + header('HTTP/1.1 204 No Content'); + return; + } + + if (null === ($smd = $this->getServiceMap())) { + return; + } + + $contentType = $smd->getContentType(); + if (!empty($contentType)) { + header('Content-Type: ' . $contentType); + } + } +} diff --git a/libs/Zend/Json/Server/Smd.php b/libs/Zend/Json/Server/Smd.php new file mode 100644 index 0000000..6d701f6 --- /dev/null +++ b/libs/Zend/Json/Server/Smd.php @@ -0,0 +1,479 @@ + $value) { + $method = 'set' . ucfirst($key); + if (in_array($method, $methods)) { + $this->$method($value); + } + } + return $this; + } + + /** + * Set transport + * + * @param string $transport + * @return Zend_Json_Server_Smd + */ + public function setTransport($transport) + { + if (!in_array($transport, $this->_transportTypes)) { + require_once 'Zend/Json/Server/Exception.php'; + throw new Zend_Json_Server_Exception(sprintf('Invalid transport "%s" specified', $transport)); + } + $this->_transport = $transport; + return $this; + } + + /** + * Get transport + * + * @return string + */ + public function getTransport() + { + return $this->_transport; + } + + /** + * Set envelope + * + * @param string $envelopeType + * @return Zend_Json_Server_Smd + */ + public function setEnvelope($envelopeType) + { + if (!in_array($envelopeType, $this->_envelopeTypes)) { + require_once 'Zend/Json/Server/Exception.php'; + throw new Zend_Json_Server_Exception(sprintf('Invalid envelope type "%s"', $envelopeType)); + } + $this->_envelope = $envelopeType; + return $this; + } + + /** + * Retrieve envelope + * + * @return string + */ + public function getEnvelope() + { + return $this->_envelope; + } + + // Content-Type of response; default to application/json + /** + * Set content type + * + * @param string $type + * @return Zend_Json_Server_Smd + */ + public function setContentType($type) + { + if (!preg_match($this->_contentTypeRegex, $type)) { + require_once 'Zend/Json/Server/Exception.php'; + throw new Zend_Json_Server_Exception(sprintf('Invalid content type "%s" specified', $type)); + } + $this->_contentType = $type; + return $this; + } + + /** + * Retrieve content type + * + * @return string + */ + public function getContentType() + { + return $this->_contentType; + } + + /** + * Set service target + * + * @param string $target + * @return Zend_Json_Server_Smd + */ + public function setTarget($target) + { + $this->_target = (string) $target; + return $this; + } + + /** + * Retrieve service target + * + * @return string + */ + public function getTarget() + { + return $this->_target; + } + + /** + * Set service ID + * + * @param string $Id + * @return Zend_Json_Server_Smd + */ + public function setId($id) + { + $this->_id = (string) $id; + return $this->_id; + } + + /** + * Get service id + * + * @return string + */ + public function getId() + { + return $this->_id; + } + + /** + * Set service description + * + * @param string $description + * @return Zend_Json_Server_Smd + */ + public function setDescription($description) + { + $this->_description = (string) $description; + return $this->_description; + } + + /** + * Get service description + * + * @return string + */ + public function getDescription() + { + return $this->_description; + } + + /** + * Indicate whether or not to generate Dojo-compatible SMD + * + * @param bool $flag + * @return Zend_Json_Server_Smd + */ + public function setDojoCompatible($flag) + { + $this->_dojoCompatible = (bool) $flag; + return $this; + } + + /** + * Is this a Dojo compatible SMD? + * + * @return bool + */ + public function isDojoCompatible() + { + return $this->_dojoCompatible; + } + + /** + * Add Service + * + * @param Zend_Json_Server_Smd_Service|array $service + * @return void + */ + public function addService($service) + { + require_once 'Zend/Json/Server/Smd/Service.php'; + + if ($service instanceof Zend_Json_Server_Smd_Service) { + $name = $service->getName(); + } elseif (is_array($service)) { + $service = new Zend_Json_Server_Smd_Service($service); + $name = $service->getName(); + } else { + require_once 'Zend/Json/Server/Exception.php'; + throw new Zend_Json_Server_Exception('Invalid service passed to addService()'); + } + + if (array_key_exists($name, $this->_services)) { + require_once 'Zend/Json/Server/Exception.php'; + throw new Zend_Json_Server_Exception('Attempt to register a service already registered detected'); + } + $this->_services[$name] = $service; + return $this; + } + + /** + * Add many services + * + * @param array $services + * @return Zend_Json_Server_Smd + */ + public function addServices(array $services) + { + foreach ($services as $service) { + $this->addService($service); + } + return $this; + } + + /** + * Overwrite existing services with new ones + * + * @param array $services + * @return Zend_Json_Server_Smd + */ + public function setServices(array $services) + { + $this->_services = array(); + return $this->addServices($services); + } + + /** + * Get service object + * + * @param string $name + * @return false|Zend_Json_Server_Smd_Service + */ + public function getService($name) + { + if (array_key_exists($name, $this->_services)) { + return $this->_services[$name]; + } + return false; + } + + /** + * Return services + * + * @return array + */ + public function getServices() + { + return $this->_services; + } + + /** + * Remove service + * + * @param string $name + * @return boolean + */ + public function removeService($name) + { + if (array_key_exists($name, $this->_services)) { + unset($this->_services[$name]); + return true; + } + return false; + } + + /** + * Cast to array + * + * @return array + */ + public function toArray() + { + if ($this->isDojoCompatible()) { + return $this->toDojoArray(); + } + + $transport = $this->getTransport(); + $envelope = $this->getEnvelope(); + $contentType = $this->getContentType(); + $SMDVersion = self::SMD_VERSION; + $service = compact('transport', 'envelope', 'contentType', 'SMDVersion'); + + if (null !== ($target = $this->getTarget())) { + $service['target'] = $target; + } + if (null !== ($id = $this->getId())) { + $service['id'] = $id; + } + + $services = $this->getServices(); + if (!empty($services)) { + $service['services'] = array(); + foreach ($services as $name => $svc) { + $svc->setEnvelope($envelope); + $service['services'][$name] = $svc->toArray(); + } + $service['methods'] = $service['services']; + } + + return $service; + } + + /** + * Export to DOJO-compatible SMD array + * + * @return array + */ + public function toDojoArray() + { + $SMDVersion = '.1'; + $serviceType = 'JSON-RPC'; + $service = compact('SMDVersion', 'serviceType'); + + $target = $this->getTarget(); + + $services = $this->getServices(); + if (!empty($services)) { + $service['methods'] = array(); + foreach ($services as $name => $svc) { + $method = array( + 'name' => $name, + 'serviceURL' => $target, + ); + $params = array(); + foreach ($svc->getParams() as $param) { + $paramName = array_key_exists('name', $param) ? $param['name'] : $param['type']; + $params[] = array( + 'name' => $paramName, + 'type' => $param['type'], + ); + } + if (!empty($params)) { + $method['parameters'] = $params; + } + $service['methods'][] = $method; + } + } + + return $service; + } + + /** + * Cast to JSON + * + * @return string + */ + public function toJson() + { + require_once 'Zend/Json.php'; + return Zend_Json::encode($this->toArray()); + } + + /** + * Cast to string (JSON) + * + * @return string + */ + public function __toString() + { + return $this->toJson(); + } +} + diff --git a/libs/Zend/Json/Server/Smd/Service.php b/libs/Zend/Json/Server/Smd/Service.php new file mode 100644 index 0000000..aa2fffb --- /dev/null +++ b/libs/Zend/Json/Server/Smd/Service.php @@ -0,0 +1,473 @@ + 'is_string', + 'optional' => 'is_bool', + 'default' => null, + 'description' => 'is_string', + ); + + /** + * Service params + * @var array + */ + protected $_params = array(); + + /** + * Mapping of parameter types to JSON-RPC types + * @var array + */ + protected $_paramMap = array( + 'any' => 'any', + 'arr' => 'array', + 'array' => 'array', + 'assoc' => 'object', + 'bool' => 'boolean', + 'boolean' => 'boolean', + 'dbl' => 'float', + 'double' => 'float', + 'false' => 'boolean', + 'float' => 'float', + 'hash' => 'object', + 'integer' => 'integer', + 'int' => 'integer', + 'mixed' => 'any', + 'nil' => 'null', + 'null' => 'null', + 'object' => 'object', + 'string' => 'string', + 'str' => 'string', + 'struct' => 'object', + 'true' => 'boolean', + 'void' => 'null', + ); + + /** + * Allowed transport types + * @var array + */ + protected $_transportTypes = array( + 'POST', + ); + + /** + * Constructor + * + * @param string|array $spec + * @return void + * @throws Zend_Json_Server_Exception if no name provided + */ + public function __construct($spec) + { + if (is_string($spec)) { + $this->setName($spec); + } elseif (is_array($spec)) { + $this->setOptions($spec); + } + + if (null == $this->getName()) { + require_once 'Zend/Json/Server/Exception.php'; + throw new Zend_Json_Server_Exception('SMD service description requires a name; none provided'); + } + } + + /** + * Set object state + * + * @param array $options + * @return Zend_Json_Server_Smd_Service + */ + public function setOptions(array $options) + { + $methods = get_class_methods($this); + foreach ($options as $key => $value) { + if ('options' == strtolower($key)) { + continue; + } + $method = 'set' . ucfirst($key); + if (in_array($method, $methods)) { + $this->$method($value); + } + } + return $this; + } + + /** + * Set service name + * + * @param string $name + * @return Zend_Json_Server_Smd_Service + * @throws Zend_Json_Server_Exception + */ + public function setName($name) + { + $name = (string) $name; + if (!preg_match($this->_nameRegex, $name)) { + require_once 'Zend/Json/Server/Exception.php'; + throw new Zend_Json_Server_Exception(sprintf('Invalid name "%s" provided for service; must follow PHP method naming conventions', $name)); + } + $this->_name = $name; + return $this; + } + + /** + * Retrieve name + * + * @return string + */ + public function getName() + { + return $this->_name; + } + + /** + * Set Transport + * + * Currently limited to POST + * + * @param string $transport + * @return Zend_Json_Server_Smd_Service + */ + public function setTransport($transport) + { + if (!in_array($transport, $this->_transportTypes)) { + require_once 'Zend/Json/Server/Exception.php'; + throw new Zend_Json_Server_Exception(sprintf('Invalid transport "%s"; please select one of (%s)', $transport, implode(', ', $this->_transportTypes))); + } + + $this->_transport = $transport; + return $this; + } + + /** + * Get transport + * + * @return string + */ + public function getTransport() + { + return $this->_transport; + } + + /** + * Set service target + * + * @param string $target + * @return Zend_Json_Server_Smd_Service + */ + public function setTarget($target) + { + $this->_target = (string) $target; + return $this; + } + + /** + * Get service target + * + * @return string + */ + public function getTarget() + { + return $this->_target; + } + + /** + * Set envelope type + * + * @param string $envelopeType + * @return Zend_Json_Server_Smd_Service + */ + public function setEnvelope($envelopeType) + { + if (!in_array($envelopeType, $this->_envelopeTypes)) { + require_once 'Zend/Json/Server/Exception.php'; + throw new Zend_Json_Server_Exception(sprintf('Invalid envelope type "%s"; please specify one of (%s)', $envelopeType, implode(', ', $this->_envelopeTypes))); + } + + $this->_envelope = $envelopeType; + return $this; + } + + /** + * Get envelope type + * + * @return string + */ + public function getEnvelope() + { + return $this->_envelope; + } + + /** + * Add a parameter to the service + * + * @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) + { + if (is_string($type)) { + $type = $this->_validateParamType($type); + } elseif (is_array($type)) { + foreach ($type as $key => $paramType) { + $type[$key] = $this->_validateParamType($paramType); + } + } else { + require_once 'Zend/Json/Server/Exception.php'; + throw new Zend_Json_Server_Exception('Invalid param type provided'); + } + + $paramOptions = array( + 'type' => $type, + ); + foreach ($options as $key => $value) { + if (in_array($key, array_keys($this->_paramOptionTypes))) { + if (null !== ($callback = $this->_paramOptionTypes[$key])) { + if (!$callback($value)) { + continue; + } + } + $paramOptions[$key] = $value; + } + } + + $this->_params[] = array( + 'param' => $paramOptions, + 'order' => $order, + ); + + return $this; + } + + /** + * Add params + * + * Each param should be an array, and should include the key 'type'. + * + * @param array $params + * @return Zend_Json_Server_Smd_Service + */ + public function addParams(array $params) + { + ksort($params); + foreach ($params as $options) { + if (!is_array($options)) { + continue; + } + if (!array_key_exists('type', $options)) { + continue; + } + $type = $options['type']; + $order = (array_key_exists('order', $options)) ? $options['order'] : null; + $this->addParam($type, $options, $order); + } + return $this; + } + + /** + * Overwrite all parameters + * + * @param array $params + * @return Zend_Json_Server_Smd_Service + */ + public function setParams(array $params) + { + $this->_params = array(); + return $this->addParams($params); + } + + /** + * Get all parameters + * + * Returns all params in specified order. + * + * @return array + */ + public function getParams() + { + $params = array(); + $index = 0; + foreach ($this->_params as $param) { + if (null === $param['order']) { + if (array_search($index, array_keys($params), true)) { + ++$index; + } + $params[$index] = $param['param']; + ++$index; + } else { + $params[$param['order']] = $param['param']; + } + } + ksort($params); + return $params; + } + + /** + * Set return type + * + * @param string|array $type + * @return Zend_Json_Server_Smd_Service + */ + public function setReturn($type) + { + if (is_string($type)) { + $type = $this->_validateParamType($type, true); + } elseif (is_array($type)) { + foreach ($type as $key => $returnType) { + $type[$key] = $this->_validateParamType($returnType, true); + } + } else { + require_once 'Zend/Json/Server/Exception.php'; + throw new Zend_Json_Server_Exception('Invalid param type provided ("' . gettype($type) .'")'); + } + $this->_return = $type; + return $this; + } + + /** + * Get return type + * + * @return string|array + */ + public function getReturn() + { + return $this->_return; + } + + /** + * Cast service description to array + * + * @return array + */ + public function toArray() + { + $name = $this->getName(); + $envelope = $this->getEnvelope(); + $target = $this->getTarget(); + $transport = $this->getTransport(); + $parameters = $this->getParams(); + $returns = $this->getReturn(); + + 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() + { + $service = array($this->getName() => $this->toArray()); + + require_once 'Zend/Json.php'; + return Zend_Json::encode($service); + } + + /** + * Cast to string + * + * @return string + */ + public function __toString() + { + return $this->toJson(); + } + + /** + * Validate parameter type + * + * @param string $type + * @return true + * @throws Zend_Json_Server_Exception + */ + protected function _validateParamType($type, $isReturn = false) + { + if (!is_string($type)) { + require_once 'Zend/Json/Server/Exception.php'; + throw new Zend_Json_Server_Exception('Invalid param type provided ("' . $type .'")'); + } + + if (!array_key_exists($type, $this->_paramMap)) { + $type = 'object'; + } + + $paramType = $this->_paramMap[$type]; + if (!$isReturn && ('null' == $paramType)) { + require_once 'Zend/Json/Server/Exception.php'; + throw new Zend_Json_Server_Exception('Invalid param type provided ("' . $type . '")'); + } + + return $paramType; + } +} diff --git a/libs/Zend/Layout.php b/libs/Zend/Layout.php new file mode 100644 index 0000000..4d44218 --- /dev/null +++ b/libs/Zend/Layout.php @@ -0,0 +1,787 @@ +setLayoutPath($options); + } elseif (is_array($options)) { + $this->setOptions($options); + } elseif ($options instanceof Zend_Config) { + $this->setConfig($options); + } else { + require_once 'Zend/Layout/Exception.php'; + throw new Zend_Layout_Exception('Invalid option provided to constructor'); + } + } + + $this->_initVarContainer(); + + if ($initMvc) { + $this->_setMvcEnabled(true); + $this->_initMvc(); + } else { + $this->_setMvcEnabled(false); + } + } + + /** + * Static method for initialization with MVC support + * + * @param string|array|Zend_Config $options + * @return Zend_Layout + */ + public static function startMvc($options = null) + { + if (null === self::$_mvcInstance) { + self::$_mvcInstance = new self($options, true); + } else { + self::$_mvcInstance->setOptions($options); + } + + return self::$_mvcInstance; + } + + /** + * Retrieve MVC instance of Zend_Layout object + * + * @return Zend_Layout|null + */ + public static function getMvcInstance() + { + return self::$_mvcInstance; + } + + /** + * Reset MVC instance + * + * Unregisters plugins and helpers, and destroys MVC layout instance. + * + * @return void + */ + public static function resetMvcInstance() + { + if (null !== self::$_mvcInstance) { + $layout = self::$_mvcInstance; + $pluginClass = $layout->getPluginClass(); + $front = Zend_Controller_Front::getInstance(); + if ($front->hasPlugin($pluginClass)) { + $front->unregisterPlugin($pluginClass); + } + + if (Zend_Controller_Action_HelperBroker::hasHelper('layout')) { + Zend_Controller_Action_HelperBroker::removeHelper('layout'); + } + + unset($layout); + self::$_mvcInstance = null; + } + } + + /** + * Set options en masse + * + * @param array $options + * @return void + */ + public function setOptions($options) + { + if ($options instanceof Zend_Config) { + $options = $options->toArray(); + } elseif (!is_array($options)) { + require_once 'Zend/Layout/Exception.php'; + throw new Zend_Layout_Exception('setOptions() expects either an array or a Zend_Config object'); + } + + foreach ($options as $key => $value) { + $method = 'set' . ucfirst($key); + if (method_exists($this, $method)) { + $this->$method($value); + } + } + } + + /** + * Initialize MVC integration + * + * @return void + */ + protected function _initMvc() + { + $this->_initPlugin(); + $this->_initHelper(); + } + + /** + * Initialize front controller plugin + * + * @return void + */ + protected function _initPlugin() + { + $pluginClass = $this->getPluginClass(); + require_once 'Zend/Controller/Front.php'; + $front = Zend_Controller_Front::getInstance(); + if (!$front->hasPlugin($pluginClass)) { + require_once 'Zend/Loader.php'; + Zend_Loader::loadClass($pluginClass); + $front->registerPlugin( + // register to run last | BUT before the ErrorHandler (if its available) + new $pluginClass($this), + 99 + ); + } + } + + /** + * Initialize action helper + * + * @return void + */ + protected function _initHelper() + { + $helperClass = $this->getHelperClass(); + require_once 'Zend/Controller/Action/HelperBroker.php'; + if (!Zend_Controller_Action_HelperBroker::hasHelper('layout')) { + require_once 'Zend/Loader.php'; + Zend_Loader::loadClass($helperClass); + Zend_Controller_Action_HelperBroker::getStack()->offsetSet(-90, new $helperClass($this)); + } + } + + /** + * Set options from a config object + * + * @param Zend_Config $config + * @return Zend_Layout + */ + public function setConfig(Zend_Config $config) + { + $this->setOptions($config->toArray()); + return $this; + } + + /** + * Initialize placeholder container for layout vars + * + * @return Zend_View_Helper_Placeholder_Container + */ + protected function _initVarContainer() + { + if (null === $this->_container) { + require_once 'Zend/View/Helper/Placeholder/Registry.php'; + $this->_container = Zend_View_Helper_Placeholder_Registry::getRegistry()->getContainer(__CLASS__); + } + + return $this->_container; + } + + /** + * Set layout script to use + * + * Note: enables layout. + * + * @param string $name + * @return Zend_Layout + */ + public function setLayout($name) + { + $this->_layout = (string) $name; + $this->enableLayout(); + return $this; + } + + /** + * Get current layout script + * + * @return string + */ + public function getLayout() + { + return $this->_layout; + } + + /** + * Disable layout + * + * @return Zend_Layout + */ + public function disableLayout() + { + $this->_enabled = false; + return $this; + } + + /** + * Enable layout + * + * @return Zend_Layout + */ + public function enableLayout() + { + $this->_enabled = true; + return $this; + } + + /** + * Is layout enabled? + * + * @return bool + */ + public function isEnabled() + { + 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 + * @return Zend_Layout + */ + public function setLayoutPath($path) + { + return $this->setViewScriptPath($path); + } + + /** + * Get current layout script path + * + * @return string + */ + public function getLayoutPath() + { + return $this->getViewScriptPath(); + } + + /** + * Set content key + * + * Key in namespace container denoting default content + * + * @param string $contentKey + * @return Zend_Layout + */ + public function setContentKey($contentKey) + { + $this->_contentKey = (string) $contentKey; + return $this; + } + + /** + * Retrieve content key + * + * @return string + */ + public function getContentKey() + { + return $this->_contentKey; + } + + /** + * Set MVC enabled flag + * + * @param bool $mvcEnabled + * @return Zend_Layout + */ + protected function _setMvcEnabled($mvcEnabled) + { + $this->_mvcEnabled = ($mvcEnabled) ? true : false; + return $this; + } + + /** + * Retrieve MVC enabled flag + * + * @return bool + */ + public function getMvcEnabled() + { + return $this->_mvcEnabled; + } + + /** + * Set MVC Successful Action Only flag + * + * @param bool $successfulActionOnly + * @return Zend_Layout + */ + public function setMvcSuccessfulActionOnly($successfulActionOnly) + { + $this->_mvcSuccessfulActionOnly = ($successfulActionOnly) ? true : false; + return $this; + } + + /** + * Get MVC Successful Action Only Flag + * + * @return bool + */ + public function getMvcSuccessfulActionOnly() + { + return $this->_mvcSuccessfulActionOnly; + } + + /** + * Set view object + * + * @param Zend_View_Interface $view + * @return Zend_Layout + */ + public function setView(Zend_View_Interface $view) + { + $this->_view = $view; + return $this; + } + + /** + * Retrieve helper class + * + * @return string + */ + public function getHelperClass() + { + return $this->_helperClass; + } + + /** + * Set helper class + * + * @param string $helperClass + * @return Zend_Layout + */ + public function setHelperClass($helperClass) + { + $this->_helperClass = (string) $helperClass; + return $this; + } + + /** + * Retrieve plugin class + * + * @return string + */ + public function getPluginClass() + { + return $this->_pluginClass; + } + + /** + * Set plugin class + * + * @param string $pluginClass + * @return Zend_Layout + */ + public function setPluginClass($pluginClass) + { + $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() + { + if (null === $this->_view) { + require_once 'Zend/Controller/Action/HelperBroker.php'; + $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer'); + if (null === $viewRenderer->view) { + $viewRenderer->initView(); + } + $this->setView($viewRenderer->view); + } + return $this->_view; + } + + /** + * Set layout view script suffix + * + * @param string $viewSuffix + * @return Zend_Layout + */ + public function setViewSuffix($viewSuffix) + { + $this->_viewSuffix = (string) $viewSuffix; + return $this; + } + + /** + * Retrieve layout view script suffix + * + * @return string + */ + public function getViewSuffix() + { + return $this->_viewSuffix; + } + + /** + * Retrieve inflector target + * + * @return string + */ + public function getInflectorTarget() + { + return $this->_inflectorTarget; + } + + /** + * Set inflector target + * + * @param string $inflectorTarget + * @return Zend_Layout + */ + public function setInflectorTarget($inflectorTarget) + { + $this->_inflectorTarget = (string) $inflectorTarget; + return $this; + } + + /** + * Set inflector to use when resolving layout names + * + * @param Zend_Filter_Inflector $inflector + * @return Zend_Layout + */ + public function setInflector(Zend_Filter_Inflector $inflector) + { + $this->_inflector = $inflector; + return $this; + } + + /** + * Retrieve inflector + * + * @return Zend_Filter_Inflector + */ + public function getInflector() + { + if (null === $this->_inflector) { + require_once 'Zend/Filter/Inflector.php'; + $inflector = new Zend_Filter_Inflector(); + $inflector->setTargetReference($this->_inflectorTarget) + ->addRules(array(':script' => array('Word_CamelCaseToDash', 'StringToLower'))) + ->setStaticRuleReference('suffix', $this->_viewSuffix); + $this->setInflector($inflector); + } + + return $this->_inflector; + } + + /** + * Enable inflector + * + * @return Zend_Layout + */ + public function enableInflector() + { + $this->_inflectorEnabled = true; + return $this; + } + + /** + * Disable inflector + * + * @return Zend_Layout + */ + public function disableInflector() + { + $this->_inflectorEnabled = false; + return $this; + } + + /** + * Return status of inflector enabled flag + * + * @return bool + */ + public function inflectorEnabled() + { + return $this->_inflectorEnabled; + } + + /** + * Set layout variable + * + * @param string $key + * @param mixed $value + * @return void + */ + public function __set($key, $value) + { + $this->_container[$key] = $value; + } + + /** + * Get layout variable + * + * @param string $key + * @return mixed + */ + public function __get($key) + { + if (isset($this->_container[$key])) { + return $this->_container[$key]; + } + + return null; + } + + /** + * Is a layout variable set? + * + * @param string $key + * @return bool + */ + public function __isset($key) + { + return (isset($this->_container[$key])); + } + + /** + * Unset a layout variable? + * + * @param string $key + * @return void + */ + 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) + { + if (is_array($spec)) { + $orig = $this->_container->getArrayCopy(); + $merged = array_merge($orig, $spec); + $this->_container->exchangeArray($merged); + return $this; + } + + if (is_string($spec)) { + $this->_container[$spec] = $value; + return $this; + } + + require_once 'Zend/Layout/Exception.php'; + throw new Zend_Layout_Exception('Invalid values passed to assign()'); + } + + /** + * Render layout + * + * 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 + * @return mixed + */ + public function render($name = null) + { + if (null === $name) { + $name = $this->getLayout(); + } + + if ($this->inflectorEnabled() && (null !== ($inflector = $this->getInflector()))) + { + $name = $this->_inflector->filter(array('script' => $name)); + } + + $view = $this->getView(); + + if (null !== ($path = $this->getViewScriptPath())) { + if (method_exists($view, 'addScriptPath')) { + $view->addScriptPath($path); + } else { + $view->setScriptPath($path); + } + } elseif (null !== ($path = $this->getViewBasePath())) { + $view->addBasePath($path, $this->_viewBasePrefix); + } + + return $view->render($name); + } +} diff --git a/libs/Zend/Layout/Controller/Action/Helper/Layout.php b/libs/Zend/Layout/Controller/Action/Helper/Layout.php new file mode 100644 index 0000000..6ba3edc --- /dev/null +++ b/libs/Zend/Layout/Controller/Action/Helper/Layout.php @@ -0,0 +1,186 @@ +setLayoutInstance($layout); + } else { + /** + * @see Zend_Layout + */ + require_once 'Zend/Layout.php'; + $layout = Zend_Layout::getMvcInstance(); + } + + if (null !== $layout) { + $pluginClass = $layout->getPluginClass(); + $front = $this->getFrontController(); + if ($front->hasPlugin($pluginClass)) { + $plugin = $front->getPlugin($pluginClass); + $plugin->setLayoutActionHelper($this); + } + } + } + + public function init() + { + $this->_isActionControllerSuccessful = false; + } + + /** + * Get front controller instance + * + * @return Zend_Controller_Front + */ + public function getFrontController() + { + if (null === $this->_frontController) { + /** + * @see Zend_Controller_Front + */ + require_once 'Zend/Controller/Front.php'; + $this->_frontController = Zend_Controller_Front::getInstance(); + } + + return $this->_frontController; + } + + /** + * Get layout object + * + * @return Zend_Layout + */ + public function getLayoutInstance() + { + if (null === $this->_layout) { + /** + * @see Zend_Layout + */ + require_once 'Zend/Layout.php'; + if (null === ($this->_layout = Zend_Layout::getMvcInstance())) { + $this->_layout = new Zend_Layout(); + } + } + + return $this->_layout; + } + + /** + * Set layout object + * + * @param Zend_Layout $layout + * @return Zend_Layout_Controller_Action_Helper_Layout + */ + public function setLayoutInstance(Zend_Layout $layout) + { + $this->_layout = $layout; + return $this; + } + + /** + * Mark Action Controller (according to this plugin) as Running successfully + * + * @return Zend_Layout_Controller_Action_Helper_Layout + */ + public function postDispatch() + { + $this->_isActionControllerSuccessful = true; + return $this; + } + + /** + * Did the previous action successfully complete? + * + * @return bool + */ + public function isActionControllerSuccessful() + { + return $this->_isActionControllerSuccessful; + } + + /** + * Strategy pattern; call object as method + * + * Returns layout object + * + * @return Zend_Layout + */ + public function direct() + { + return $this->getLayoutInstance(); + } + + /** + * Proxy method calls to layout object + * + * @param string $method + * @param array $args + * @return mixed + */ + public function __call($method, $args) + { + $layout = $this->getLayoutInstance(); + if (method_exists($layout, $method)) { + return call_user_func_array(array($layout, $method), $args); + } + + require_once 'Zend/Layout/Exception.php'; + throw new Zend_Layout_Exception(sprintf("Invalid method '%s' called on layout action helper", $method)); + } +} diff --git a/libs/Zend/Layout/Controller/Plugin/Layout.php b/libs/Zend/Layout/Controller/Plugin/Layout.php new file mode 100644 index 0000000..f08ed7e --- /dev/null +++ b/libs/Zend/Layout/Controller/Plugin/Layout.php @@ -0,0 +1,155 @@ +setLayout($layout); + } + } + + /** + * Retrieve layout object + * + * @return Zend_Layout + */ + public function getLayout() + { + return $this->_layout; + } + + /** + * Set layout object + * + * @param Zend_Layout $layout + * @return Zend_Layout_Controller_Plugin_Layout + */ + public function setLayout(Zend_Layout $layout) + { + $this->_layout = $layout; + return $this; + } + + /** + * Set layout action helper + * + * @param Zend_Layout_Controller_Action_Helper_Layout $layoutActionHelper + * @return Zend_Layout_Controller_Plugin_Layout + */ + public function setLayoutActionHelper(Zend_Layout_Controller_Action_Helper_Layout $layoutActionHelper) + { + $this->_layoutActionHelper = $layoutActionHelper; + return $this; + } + + /** + * Retrieve layout action helper + * + * @return Zend_Layout_Controller_Action_Helper_Layout + */ + public function getLayoutActionHelper() + { + return $this->_layoutActionHelper; + } + + /** + * postDispatch() plugin hook -- render layout + * + * @param Zend_Controller_Request_Abstract $request + * @return void + */ + public function postDispatch(Zend_Controller_Request_Abstract $request) + { + $layout = $this->getLayout(); + $helper = $this->getLayoutActionHelper(); + + // Return early if forward detected + if (!$request->isDispatched() + || ($layout->getMvcSuccessfulActionOnly() + && (!empty($helper) && !$helper->isActionControllerSuccessful()))) + { + return; + } + + // Return early if layout has been disabled + if (!$layout->isEnabled()) { + return; + } + + $response = $this->getResponse(); + $content = $response->getBody(true); + $contentKey = $layout->getContentKey(); + + if (isset($content['default'])) { + $content[$contentKey] = $content['default']; + } + if ('default' != $contentKey) { + unset($content['default']); + } + + $layout->assign($content); + + $fullContent = null; + $obStartLevel = ob_get_level(); + try { + $fullContent = $layout->render(); + $response->setBody($fullContent); + } catch (Exception $e) { + while (ob_get_level() > $obStartLevel) { + $fullContent .= ob_get_clean(); + } + $request->setParam('layoutFullContent', $fullContent); + $request->setParam('layoutContent', $layout->content); + $response->setBody(null); + throw $e; + } + + } +} diff --git a/libs/Zend/Layout/Exception.php b/libs/Zend/Layout/Exception.php new file mode 100644 index 0000000..a9e4ac6 --- /dev/null +++ b/libs/Zend/Layout/Exception.php @@ -0,0 +1,34 @@ + 0x7e || strstr('*()\/', $ch)) { + $ch = '\\' . dechex($ord); + } + $ret .= $ch; + } + 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 + * @return bool True if the DN was successfully parsed or false if the string is not a valid DN. + */ + public static function explodeDn($dn, array &$keys = null, array &$vals = null) + { + /* 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; + $slen = strlen($dn); + $state = 1; + $ko = $vo = 0; + 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 ($keys !== null) { + $keys[] = $key; + } + $state = 2; + $vo = $di + 1; + } else if ($ch === ',' || $ch === ';') { + return false; + } + break; + case 2: // collect value + if ($ch === '\\') { + $state = 3; + } else if ($ch === ',' || $ch === ';' || $ch === 0) { + if ($vals !== null) { + $vals[] = trim(substr($dn, $vo, $di - $vo)); + } + $state = 1; + $ko = $di + 1; + } else if ($ch === '=') { + return false; + } + break; + case 3: // escaped + $state = 2; + break; + } + } + + return $state === 1 && $ko > 0; + } + + /** + * @param array $options Options used in connecting, binding, etc. + * @return void + */ + public function __construct(array $options = array()) + { + $this->setOptions($options); + } + + /** + * Sets the options used in connecting, binding, etc. + * + * Valid option keys: + * host + * port + * useSsl + * username + * password + * bindRequiresDn + * baseDn + * accountCanonicalForm + * accountDomainName + * accountDomainNameShort + * accountFilterFormat + * allowEmptyPassword + * useStartTls + * optRefferals + * + * @param array $options Options used in connecting, binding, etc. + * @return Zend_Ldap Provides a fluent interface + * @throws Zend_Ldap_Exception + */ + public function setOptions(array $options) + { + $permittedOptions = array( + 'host' => null, + 'port' => null, + 'useSsl' => null, + 'username' => null, + 'password' => null, + 'bindRequiresDn' => null, + 'baseDn' => null, + 'accountCanonicalForm' => null, + 'accountDomainName' => null, + 'accountDomainNameShort' => null, + 'accountFilterFormat' => null, + 'allowEmptyPassword' => null, + 'useStartTls' => null, + 'optReferrals' => null, + ); + + $diff = array_diff_key($options, $permittedOptions); + if ($diff) { + list($key, $val) = each($diff); + require_once 'Zend/Ldap/Exception.php'; + throw new Zend_Ldap_Exception(null, "Unknown Zend_Ldap option: $key"); + } + + foreach ($permittedOptions as $key => $val) { + if (!array_key_exists($key, $options)) { + $options[$key] = null; + } else { + /* Enforce typing. This eliminates issues like Zend_Config_Ini + * returning '1' as a string (ZF-3163). + */ + switch ($key) { + case 'port': + case 'accountCanonicalForm': + $options[$key] = (int)$options[$key]; + break; + case 'useSsl': + case 'bindRequiresDn': + case 'allowEmptyPassword': + case 'useStartTls': + case 'optReferrals': + $val = $options[$key]; + $options[$key] = $val === true || + $val === '1' || + strcasecmp($val, 'true') == 0; + break; + } + } + } + + $this->_options = $options; + + return $this; + } + + /** + * @return array The current options. + */ + public function getOptions() + { + return $this->_options; + } + + /** + * @return resource The raw LDAP extension resource. + */ + public function getResource() + { + /** + * @todo by reference? + */ + return $this->_resource; + } + + /** + * @return string The hostname of the LDAP server being used to authenticate accounts + */ + protected function _getHost() + { + return $this->_options['host']; + } + + /** + * @return int The port of the LDAP server or 0 to indicate that no port value is set + */ + protected function _getPort() + { + if ($this->_options['port']) + return $this->_options['port']; + return 0; + } + + /** + * @return string The default acctname for binding + */ + protected function _getUsername() + { + return $this->_options['username']; + } + + /** + * @return string The default password for binding + */ + protected function _getPassword() + { + return $this->_options['password']; + } + + /** + * @return boolean The default SSL / TLS encrypted transport control + */ + protected function _getUseSsl() + { + return $this->_options['useSsl']; + } + + /** + * @return string The default base DN under which objects of interest are located + */ + protected function _getBaseDn() + { + return $this->_options['baseDn']; + } + + /** + * @return string Either ACCTNAME_FORM_BACKSLASH, ACCTNAME_FORM_PRINCIPAL or ACCTNAME_FORM_USERNAME indicating the form usernames should be canonicalized to. + */ + protected function _getAccountCanonicalForm() + { + /* Account names should always be qualified with a domain. In some scenarios + * using non-qualified account names can lead to security vulnerabilities. If + * no account canonical form is specified, we guess based in what domain + * names have been supplied. + */ + + $accountCanonicalForm = $this->_options['accountCanonicalForm']; + if (!$accountCanonicalForm) { + $accountDomainName = $this->_options['accountDomainName']; + $accountDomainNameShort = $this->_options['accountDomainNameShort']; + if ($accountDomainNameShort) { + $accountCanonicalForm = Zend_Ldap::ACCTNAME_FORM_BACKSLASH; + } else if ($accountDomainName) { + $accountCanonicalForm = Zend_Ldap::ACCTNAME_FORM_PRINCIPAL; + } else { + $accountCanonicalForm = Zend_Ldap::ACCTNAME_FORM_USERNAME; + } + } + + return $accountCanonicalForm; + } + + + /** + * @return string A format string for building an LDAP search filter to match an account + */ + protected function _getAccountFilterFormat() + { + return $this->_options['accountFilterFormat']; + } + + /** + * @return string The LDAP search filter for matching directory accounts + */ + protected function _getAccountFilter($acctname) + { + $this->_splitName($acctname, $dname, $aname); + $accountFilterFormat = $this->_getAccountFilterFormat(); + $aname = Zend_Ldap::filterEscape($aname); + if ($accountFilterFormat) + return sprintf($accountFilterFormat, $aname); + if (!$this->_options['bindRequiresDn']) { + // is there a better way to detect this? + return "(&(objectClass=user)(sAMAccountName=$aname))"; + } + return "(&(objectClass=posixAccount)(uid=$aname))"; + } + + /** + * @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) + */ + protected function _splitName($name, &$dname, &$aname) + { + $dname = NULL; + $aname = $name; + + $pos = strpos($name, '@'); + if ($pos) { + $dname = substr($name, $pos + 1); + $aname = substr($name, 0, $pos); + } else { + $pos = strpos($name, '\\'); + if ($pos) { + $dname = substr($name, 0, $pos); + $aname = substr($name, $pos + 1); + } + } + } + + /** + * @param string $acctname The name of the account + * @return string The DN of the specified account + * @throws Zend_Ldap_Exception + */ + protected function _getAccountDn($acctname) + { + if (Zend_Ldap::explodeDn($acctname)) + return $acctname; + $acctname = $this->getCanonicalAccountName($acctname, Zend_Ldap::ACCTNAME_FORM_USERNAME); + $acct = $this->_getAccount($acctname, array('dn')); + return $acct['dn']; + } + + /** + * @param string $dname The domain name to check + * @return bool + */ + protected function _isPossibleAuthority($dname) + { + if ($dname === null) + return true; + $accountDomainName = $this->_options['accountDomainName']; + $accountDomainNameShort = $this->_options['accountDomainNameShort']; + if ($accountDomainName === null && $accountDomainNameShort === null) + return true; + if (strcasecmp($dname, $accountDomainName) == 0) + return true; + if (strcasecmp($dname, $accountDomainNameShort) == 0) + return true; + return false; + } + + /** + * @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 + */ + public function getCanonicalAccountName($acctname, $form = 0) + { + $this->_splitName($acctname, $dname, $uname); + + if (!$this->_isPossibleAuthority($dname)) { + /** + * @see Zend_Ldap_Exception + */ + require_once 'Zend/Ldap/Exception.php'; + throw new Zend_Ldap_Exception(null, + "Binding domain is not an authority for user: $acctname", + Zend_Ldap_Exception::LDAP_X_DOMAIN_MISMATCH); + } + + if ($form === Zend_Ldap::ACCTNAME_FORM_DN) + return $this->_getAccountDn($acctname); + + if (!$uname) { + /** + * @see Zend_Ldap_Exception + */ + require_once 'Zend/Ldap/Exception.php'; + throw new Zend_Ldap_Exception(null, "Invalid account name syntax: $acctname"); + } + + $uname = strtolower($uname); + + if ($form === 0) + $form = $this->_getAccountCanonicalForm(); + + switch ($form) { + case Zend_Ldap::ACCTNAME_FORM_USERNAME: + return $uname; + case Zend_Ldap::ACCTNAME_FORM_BACKSLASH: + $accountDomainNameShort = $this->_options['accountDomainNameShort']; + if (!$accountDomainNameShort) { + /** + * @see Zend_Ldap_Exception + */ + require_once 'Zend/Ldap/Exception.php'; + throw new Zend_Ldap_Exception(null, 'Option required: accountDomainNameShort'); + } + return "$accountDomainNameShort\\$uname"; + case Zend_Ldap::ACCTNAME_FORM_PRINCIPAL: + $accountDomainName = $this->_options['accountDomainName']; + if (!$accountDomainName) { + /** + * @see Zend_Ldap_Exception + */ + require_once 'Zend/Ldap/Exception.php'; + throw new Zend_Ldap_Exception(null, 'Option required: accountDomainName'); + } + return "$uname@$accountDomainName"; + default: + /** + * @see Zend_Ldap_Exception + */ + require_once 'Zend/Ldap/Exception.php'; + throw new Zend_Ldap_Exception(null, "Unknown canonical name form: $form"); + } + } + + /** + * @param array $attrs An array of names of desired attributes + * @return array An array of the attributes representing the account + * @throws Zend_Ldap_Exception + */ + private function _getAccount($acctname, array $attrs = null) + { + $baseDn = $this->_getBaseDn(); + if (!$baseDn) { + /** + * @see Zend_Ldap_Exception + */ + require_once 'Zend/Ldap/Exception.php'; + throw new Zend_Ldap_Exception(null, 'Base DN not set'); + } + + $accountFilter = $this->_getAccountFilter($acctname); + if (!$accountFilter) { + /** + * @see Zend_Ldap_Exception + */ + require_once 'Zend/Ldap/Exception.php'; + throw new Zend_Ldap_Exception(null, 'Invalid account filter'); + } + + if (!is_resource($this->_resource)) + $this->bind(); + + $resource = $this->_resource; + $str = $accountFilter; + $code = 0; + + /** + * @todo break out search operation into simple function (private for now) + */ + + if (!extension_loaded('ldap')) { + /** + * @see Zend_Ldap_Exception + */ + require_once 'Zend/Ldap/Exception.php'; + throw new Zend_Ldap_Exception(null, 'LDAP extension not loaded'); + } + + $result = @ldap_search($resource, + $baseDn, + $accountFilter, + $attrs); + if (is_resource($result) === true) { + $count = @ldap_count_entries($resource, $result); + if ($count == 1) { + $entry = @ldap_first_entry($resource, $result); + if ($entry) { + $acct = array('dn' => @ldap_get_dn($resource, $entry)); + $name = @ldap_first_attribute($resource, $entry, $berptr); + while ($name) { + $data = @ldap_get_values_len($resource, $entry, $name); + $acct[$name] = $data; + $name = @ldap_next_attribute($resource, $entry, $berptr); + } + @ldap_free_result($result); + return $acct; + } + } else if ($count == 0) { + /** + * @see Zend_Ldap_Exception + */ + require_once 'Zend/Ldap/Exception.php'; + $code = Zend_Ldap_Exception::LDAP_NO_SUCH_OBJECT; + } else { + + /** + * @todo limit search to 1 record and remove some of this logic? + */ + + $resource = null; + $str = "$accountFilter: Unexpected result count: $count"; + /** + * @see Zend_Ldap_Exception + */ + require_once 'Zend/Ldap/Exception.php'; + $code = Zend_Ldap_Exception::LDAP_OPERATIONS_ERROR; + } + @ldap_free_result($result); + } + + /** + * @see Zend_Ldap_Exception + */ + require_once 'Zend/Ldap/Exception.php'; + throw new Zend_Ldap_Exception($resource, $str, $code); + } + + /** + * @return Zend_Ldap Provides a fluent interface + */ + public function disconnect() + { + if (is_resource($this->_resource)) { + if (!extension_loaded('ldap')) { + /** + * @see Zend_Ldap_Exception + */ + require_once 'Zend/Ldap/Exception.php'; + throw new Zend_Ldap_Exception(null, 'LDAP extension not loaded'); + } + @ldap_unbind($this->_resource); + } + $this->_resource = null; + return $this; + } + + /** + * @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 + * @return Zend_Ldap Provides a fluent interface + * @throws Zend_Ldap_Exception + */ + public function connect($host = null, $port = 0, $useSsl = false) + { + if ($host === null) + $host = $this->_getHost(); + if ($port === 0) + $port = $this->_getPort(); + if ($useSsl === false) + $useSsl = $this->_getUseSsl(); + + if (!$host) { + /** + * @see Zend_Ldap_Exception + */ + require_once 'Zend/Ldap/Exception.php'; + throw new Zend_Ldap_Exception(null, 'A host parameter is required'); + } + + /* To connect using SSL it seems the client tries to verify the server + * certificate by default. One way to disable this behavior is to set + * 'TLS_REQCERT never' in OpenLDAP's ldap.conf and restarting Apache. Or, + * if you really care about the server's cert you can put a cert on the + * web server. + */ + $url = $useSsl ? "ldaps://$host" : "ldap://$host"; + if ($port) { + $url .= ":$port"; + } + + /* Because ldap_connect doesn't really try to connect, any connect error + * will actually occur during the ldap_bind call. Therefore, we save the + * connect string here for reporting it in error handling in bind(). + */ + $this->_connectString = $url; + + $this->disconnect(); + + if (!extension_loaded('ldap')) { + /** + * @see Zend_Ldap_Exception + */ + require_once 'Zend/Ldap/Exception.php'; + throw new Zend_Ldap_Exception(null, 'LDAP extension not loaded'); + } + + /* Only OpenLDAP 2.2 + supports URLs so if SSL is not requested, just + * use the old form. + */ + $resource = $useSsl ? @ldap_connect($url) : @ldap_connect($host, $port); + + if (is_resource($resource) === true) { + + $this->_resource = $resource; + + $optReferrals = $this->_options['optReferrals'] ? 1 : 0; + + if (@ldap_set_option($resource, LDAP_OPT_PROTOCOL_VERSION, 3) && + @ldap_set_option($resource, LDAP_OPT_REFERRALS, $optReferrals)) { + if ($useSsl || + $this->_options['useStartTls'] !== true || + @ldap_start_tls($resource)) { + return $this; + } + } + + /** + * @see Zend_Ldap_Exception + */ + require_once 'Zend/Ldap/Exception.php'; + + $zle = new Zend_Ldap_Exception($resource, "$host:$port"); + $this->disconnect(); + throw $zle; + } + /** + * @see Zend_Ldap_Exception + */ + require_once 'Zend/Ldap/Exception.php'; + throw new Zend_Ldap_Exception("Failed to connect to LDAP server: $host:$port"); + } + + /** + * @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 + */ + public function bind($username = null, $password = null) + { + $moreCreds = true; + + if ($username === null) { + $username = $this->_getUsername(); + $password = $this->_getPassword(); + $moreCreds = false; + } + + if ($username === NULL) { + /* Perform anonymous bind + */ + $password = NULL; + } else { + /* Check to make sure the username is in DN form. + */ + if (!Zend_Ldap::explodeDn($username)) { + if ($this->_options['bindRequiresDn']) { + /* moreCreds stops an infinite loop if _getUsername does not + * return a DN and the bind requires it + */ + if ($moreCreds) { + try { + $username = $this->_getAccountDn($username); + } catch (Zend_Ldap_Exception $zle) { + /** + * @todo Temporary measure to deal with exception thrown for ldap extension not loaded + */ + if (strpos($zle->getMessage(), 'LDAP extension not loaded') !== false) { + throw $zle; + } + // end temporary measure + switch ($zle->getCode()) { + case Zend_Ldap_Exception::LDAP_NO_SUCH_OBJECT: + case Zend_Ldap_Exception::LDAP_X_DOMAIN_MISMATCH: + throw $zle; + } + throw new Zend_Ldap_Exception(null, + 'Failed to retrieve DN for account: ' . $zle->getMessage(), + Zend_Ldap_Exception::LDAP_OPERATIONS_ERROR); + } + } else { + /** + * @see Zend_Ldap_Exception + */ + require_once 'Zend/Ldap/Exception.php'; + throw new Zend_Ldap_Exception(null, 'Binding requires username in DN form'); + } + } else { + $username = $this->getCanonicalAccountName($username, + Zend_Ldap::ACCTNAME_FORM_PRINCIPAL); + } + } + } + + if (!is_resource($this->_resource)) + $this->connect(); + + if ($username !== null && + $password === '' && + $this->_options['allowEmptyPassword'] !== true) { + /** + * @see Zend_Ldap_Exception + */ + require_once 'Zend/Ldap/Exception.php'; + + $zle = new Zend_Ldap_Exception(null, + 'Empty password not allowed - see allowEmptyPassword option.'); + } else { + if (@ldap_bind($this->_resource, $username, $password)) + return $this; + + $message = $username === null ? $this->_connectString : $username; + + /** + * @see Zend_Ldap_Exception + */ + require_once 'Zend/Ldap/Exception.php'; + + switch (Zend_Ldap_Exception::getLdapCode($this)) { + case Zend_Ldap_Exception::LDAP_SERVER_DOWN: + /* If the error is related to establishing a connection rather than binding, + * the connect string is more informative than the username. + */ + $message = $this->_connectString; + } + + $zle = new Zend_Ldap_Exception($this->_resource, $message); + } + $this->disconnect(); + throw $zle; + } +} diff --git a/libs/Zend/Ldap/Exception.php b/libs/Zend/Ldap/Exception.php new file mode 100644 index 0000000..cb2e86d --- /dev/null +++ b/libs/Zend/Ldap/Exception.php @@ -0,0 +1,205 @@ +getResource(); + } + + $message = ''; + if ($code === 0) + $code = Zend_Ldap_Exception::getLdapCode($resource); + if ($code) + $message .= '0x' . dechex($code); + if (is_resource($resource)) { + + /* The various error retrieval functions can return + * different things so we just try to collect what we + * can and eliminate dupes. + */ + + $estr1 = @ldap_error($resource); + if ($code !== 0 && $estr1 === 'Success') + $estr1 = @ldap_err2str($code); + if ($estr1 !== $str) + $this->_append($message, $estr1); + + @ldap_get_option($resource, LDAP_OPT_ERROR_STRING, $estr2); + if ($estr2 !== $str && $estr2 !== $estr1) + $this->_append($message, $estr2); + } + + $this->_append($message, $str); + + parent::__construct($message, $code); + } + + private function _append(&$message, $estr) + { + if ($estr) { + if ($message) + $message .= ': '; + $message .= $estr; + } + } + + /** + * @param mixed $ldap A Zend_Ldap object or raw LDAP context resource + * @return int The current error code for the resource + */ + public static function getLdapCode($ldap) + { + $resource = null; + if (is_resource($ldap)) { + $resource = $ldap; + } else if (is_object($ldap)) { + $resource = $ldap->getResource(); + } + if (is_resource($resource)) { + $ret = @ldap_get_option($resource, LDAP_OPT_ERROR_NUMBER, $err); + if ($ret === true) { + if ($err <= -1 && $err >= -17) { + /* For some reason draft-ietf-ldapext-ldap-c-api-xx.txt error + * codes in OpenLDAP are negative values from -1 to -17. + */ + $err = Zend_Ldap_Exception::LDAP_SERVER_DOWN + (-$err - 1); + } + return $err; + } + } + return 0; + } + + /** + * @param string $message An informtive exception message + * + */ + public function setMessage($message) + { + $this->_message = $message; + } + + /** + * @return int The current error code for this exception + */ + public function getErrorCode() + { + return $this->getCode(); + } +} diff --git a/libs/Zend/Loader.php b/libs/Zend/Loader.php new file mode 100644 index 0000000..3d962a5 --- /dev/null +++ b/libs/Zend/Loader.php @@ -0,0 +1,263 @@ + $dir) { + if ($dir == '.') { + $dirs[$key] = $dirPath; + } else { + $dir = rtrim($dir, '\\/'); + $dirs[$key] = $dir . DIRECTORY_SEPARATOR . $dirPath; + } + } + $file = basename($file); + self::loadFile($file, $dirs, true); + } else { + self::_securityCheck($file); + include_once $file; + } + + if (!class_exists($class, false) && !interface_exists($class, false)) { + require_once 'Zend/Exception.php'; + throw new Zend_Exception("File \"$file\" does not exist or class \"$class\" was not found in the file"); + } + } + + /** + * Loads a PHP file. This is a wrapper for PHP's include() function. + * + * $filename must be the complete filename, including any + * extension such as ".php". Note that a security check is performed that + * does not permit extended characters in the filename. This method is + * intended for loading Zend Framework files. + * + * If $dirs is a string or an array, it will search the directories + * in the order supplied, and attempt to load the first matching file. + * + * If the file was not found in the $dirs, or if no $dirs were specified, + * it will attempt to load it from PHP's include_path. + * + * If $once is TRUE, it will use include_once() instead of include(). + * + * @param string $filename + * @param string|array $dirs - OPTIONAL either a path or array of paths + * to search. + * @param boolean $once + * @return boolean + * @throws Zend_Exception + */ + public static function loadFile($filename, $dirs = null, $once = false) + { + self::_securityCheck($filename); + + /** + * Search in provided directories, as well as include_path + */ + $incPath = false; + if (!empty($dirs) && (is_array($dirs) || is_string($dirs))) { + if (is_array($dirs)) { + $dirs = implode(PATH_SEPARATOR, $dirs); + } + $incPath = get_include_path(); + set_include_path($dirs . PATH_SEPARATOR . $incPath); + } + + /** + * Try finding for the plain filename in the include_path. + */ + if ($once) { + include_once $filename; + } else { + include $filename; + } + + /** + * If searching in directories, reset include_path + */ + if ($incPath) { + set_include_path($incPath); + } + + return true; + } + + /** + * Returns TRUE if the $filename is readable, or FALSE otherwise. + * This function uses the PHP include_path, where PHP's is_readable() + * does not. + * + * Note from ZF-2900: + * If you use custom error handler, please check whether return value + * from error_reporting() is zero or not. + * At mark of fopen() can not suppress warning if the handler is used. + * + * @param string $filename + * @return boolean + */ + public static function isReadable($filename) + { + if (!$fh = @fopen($filename, 'r', true)) { + return false; + } + @fclose($fh); + return true; + } + + /** + * spl_autoload() suitable implementation for supporting class autoloading. + * + * Attach to spl_autoload() using the following: + * + * spl_autoload_register(array('Zend_Loader', 'autoload')); + * + * + * @param string $class + * @return string|false Class name on success; false on failure + */ + public static function autoload($class) + { + try { + self::loadClass($class); + return $class; + } catch (Exception $e) { + return false; + } + } + + /** + * Register {@link autoload()} with spl_autoload() + * + * @param string $class (optional) + * @param boolean $enabled (optional) + * @return void + * @throws Zend_Exception if spl_autoload() is not found + * or if the specified class does not have an autoload() method. + */ + public static function registerAutoload($class = 'Zend_Loader', $enabled = true) + { + if (!function_exists('spl_autoload_register')) { + require_once 'Zend/Exception.php'; + throw new Zend_Exception('spl_autoload does not exist in this PHP installation'); + } + + self::loadClass($class); + $methods = get_class_methods($class); + if (!in_array('autoload', (array) $methods)) { + require_once 'Zend/Exception.php'; + throw new Zend_Exception("The class \"$class\" does not have an autoload() method"); + } + + if ($enabled === true) { + spl_autoload_register(array($class, 'autoload')); + } else { + spl_autoload_unregister(array($class, 'autoload')); + } + } + + /** + * Ensure that filename does not contain exploits + * + * @param string $filename + * @return void + * @throws Zend_Exception + */ + protected static function _securityCheck($filename) + { + /** + * Security check + */ + if (preg_match('/[^a-z0-9\\/\\\\_.-]/i', $filename)) { + require_once 'Zend/Exception.php'; + throw new Zend_Exception('Security check: Illegal character in filename'); + } + } + + /** + * Attempt to include() the file. + * + * include() is not prefixed with the @ operator because if + * the file is loaded and contains a parse error, execution + * will halt silently and this is difficult to debug. + * + * Always set display_errors = Off on production servers! + * + * @param string $filespec + * @param boolean $once + * @return boolean + * @deprecated Since 1.5.0; use loadFile() instead + */ + protected static function _includeFile($filespec, $once = false) + { + if ($once) { + return include_once $filespec; + } else { + return include $filespec ; + } + } +} diff --git a/libs/Zend/Loader/Exception.php b/libs/Zend/Loader/Exception.php new file mode 100644 index 0000000..2c0e1e4 --- /dev/null +++ b/libs/Zend/Loader/Exception.php @@ -0,0 +1,35 @@ +_useStaticRegistry = $staticRegistryName; + self::$_staticPrefixToPaths[$staticRegistryName] = array(); + self::$_staticLoadedPlugins[$staticRegistryName] = array(); + } + + foreach ($prefixToPaths as $prefix => $path) { + $this->addPrefixPath($prefix, $path); + } + } + + /** + * Format prefix for internal use + * + * @param string $prefix + * @return string + */ + protected function _formatPrefix($prefix) + { + return rtrim($prefix, '_') . '_'; + } + + /** + * Add prefixed paths to the registry of paths + * + * @param string $prefix + * @param string $path + * @return Zend_Loader_PluginLoader + */ + public function addPrefixPath($prefix, $path) + { + if (!is_string($prefix) || !is_string($path)) { + require_once 'Zend/Loader/PluginLoader/Exception.php'; + throw new Zend_Loader_PluginLoader_Exception('Zend_Loader_PluginLoader::addPrefixPath() method only takes strings for prefix and path.'); + } + + $prefix = $this->_formatPrefix($prefix); + $path = rtrim($path, '/\\') . '/'; + + if ($this->_useStaticRegistry) { + self::$_staticPrefixToPaths[$this->_useStaticRegistry][$prefix][] = $path; + } else { + $this->_prefixToPaths[$prefix][] = $path; + } + return $this; + } + + /** + * Get path stack + * + * @param string $prefix + * @return false|array False if prefix does not exist, array otherwise + */ + public function getPaths($prefix = null) + { + if ((null !== $prefix) && is_string($prefix)) { + $prefix = $this->_formatPrefix($prefix); + if ($this->_useStaticRegistry) { + if (isset(self::$_staticPrefixToPaths[$this->_useStaticRegistry][$prefix])) { + return self::$_staticPrefixToPaths[$this->_useStaticRegistry][$prefix]; + } + + return false; + } + + if (isset($this->_prefixToPaths[$prefix])) { + return $this->_prefixToPaths[$prefix]; + } + + return false; + } + + if ($this->_useStaticRegistry) { + return self::$_staticPrefixToPaths[$this->_useStaticRegistry]; + } + + return $this->_prefixToPaths; + } + + /** + * Clear path stack + * + * @param string $prefix + * @return bool False only if $prefix does not exist + */ + public function clearPaths($prefix = null) + { + if ((null !== $prefix) && is_string($prefix)) { + $prefix = $this->_formatPrefix($prefix); + if ($this->_useStaticRegistry) { + if (isset(self::$_staticPrefixToPaths[$this->_useStaticRegistry][$prefix])) { + unset(self::$_staticPrefixToPaths[$this->_useStaticRegistry][$prefix]); + return true; + } + + return false; + } + + if (isset($this->_prefixToPaths[$prefix])) { + unset($this->_prefixToPaths[$prefix]); + return true; + } + + return false; + } + + if ($this->_useStaticRegistry) { + self::$_staticPrefixToPaths[$this->_useStaticRegistry] = array(); + } else { + $this->_prefixToPaths = array(); + } + + return true; + } + + /** + * Remove a prefix (or prefixed-path) from the registry + * + * @param string $prefix + * @param string $path OPTIONAL + * @return Zend_Loader_PluginLoader + */ + public function removePrefixPath($prefix, $path = null) + { + $prefix = $this->_formatPrefix($prefix); + if ($this->_useStaticRegistry) { + $registry =& self::$_staticPrefixToPaths[$this->_useStaticRegistry]; + } else { + $registry =& $this->_prefixToPaths; + } + + if (!isset($registry[$prefix])) { + require_once 'Zend/Loader/PluginLoader/Exception.php'; + throw new Zend_Loader_PluginLoader_Exception('Prefix ' . $prefix . ' was not found in the PluginLoader.'); + } + + if ($path != null) { + $pos = array_search($path, $registry[$prefix]); + if ($pos === null) { + require_once 'Zend/Loader/PluginLoader/Exception.php'; + throw new Zend_Loader_PluginLoader_Exception('Prefix ' . $prefix . ' / Path ' . $path . ' was not found in the PluginLoader.'); + } + unset($registry[$prefix][$pos]); + } else { + unset($registry[$prefix]); + } + + return $this; + } + + /** + * Normalize plugin name + * + * @param string $name + * @return string + */ + protected function _formatName($name) + { + return ucfirst((string) $name); + } + + /** + * Whether or not a Plugin by a specific name is loaded + * + * @param string $name + * @return Zend_Loader_PluginLoader + */ + public function isLoaded($name) + { + $name = $this->_formatName($name); + if ($this->_useStaticRegistry) { + return isset(self::$_staticLoadedPlugins[$this->_useStaticRegistry][$name]); + } + + return isset($this->_loadedPlugins[$name]); + } + + /** + * Return full class name for a named plugin + * + * @param string $name + * @return string|false False if class not found, class name otherwise + */ + public function getClassName($name) + { + $name = $this->_formatName($name); + if ($this->_useStaticRegistry + && isset(self::$_staticLoadedPlugins[$this->_useStaticRegistry][$name]) + ) { + return self::$_staticLoadedPlugins[$this->_useStaticRegistry][$name]; + } elseif (isset($this->_loadedPlugins[$name])) { + return $this->_loadedPlugins[$name]; + } + + return false; + } + + /** + * Get path to plugin class + * + * @param mixed $name + * @return string|false False if not found + */ + public function getClassPath($name) + { + $name = $this->_formatName($name); + if ($this->_useStaticRegistry + && !empty(self::$_staticLoadedPluginPaths[$this->_useStaticRegistry][$name]) + ) { + return self::$_staticLoadedPluginPaths[$this->_useStaticRegistry][$name]; + } elseif (!empty($this->_loadedPluginPaths[$name])) { + return $this->_loadedPluginPaths[$name]; + } + + if ($this->isLoaded($name)) { + $class = $this->getClassName($name); + $r = new ReflectionClass($class); + $path = $r->getFileName(); + if ($this->_useStaticRegistry) { + self::$_staticLoadedPluginPaths[$this->_useStaticRegistry][$name] = $path; + } else { + $this->_loadedPluginPaths[$name] = $path; + } + return $path; + } + + return false; + } + + /** + * Load a plugin via the name provided + * + * @param string $name + * @return string Class name of loaded class + * @throws Zend_Loader_Exception if class not found + */ + public function load($name) + { + $name = $this->_formatName($name); + if ($this->isLoaded($name)) { + return $this->getClassName($name); + } + + if ($this->_useStaticRegistry) { + $registry = self::$_staticPrefixToPaths[$this->_useStaticRegistry]; + } else { + $registry = $this->_prefixToPaths; + } + + $registry = array_reverse($registry, true); + $found = false; + $classFile = str_replace('_', DIRECTORY_SEPARATOR, $name) . '.php'; + $incFile = self::getIncludeFileCache(); + foreach ($registry as $prefix => $paths) { + $className = $prefix . $name; + + if (class_exists($className, false)) { + $found = true; + break; + } + + $paths = array_reverse($paths, true); + + foreach ($paths as $path) { + $loadFile = $path . $classFile; + if (Zend_Loader::isReadable($loadFile)) { + include_once $loadFile; + if (class_exists($className, false)) { + if (null !== $incFile) { + self::_appendIncFile($loadFile); + } + $found = true; + break 2; + } + } + } + } + + if (!$found) { + $message = "Plugin by name '$name' was not found in the registry; used paths:"; + foreach ($registry as $prefix => $paths) { + $message .= "\n$prefix: " . implode(PATH_SEPARATOR, $paths); + } + require_once 'Zend/Loader/PluginLoader/Exception.php'; + throw new Zend_Loader_PluginLoader_Exception($message); + } + + if ($this->_useStaticRegistry) { + self::$_staticLoadedPlugins[$this->_useStaticRegistry][$name] = $className; + self::$_staticLoadedPluginPaths[$this->_useStaticRegistry][$name] = (isset($loadFile) ? $loadFile : ''); + } else { + $this->_loadedPlugins[$name] = $className; + $this->_loadedPluginPaths[$name] = (isset($loadFile) ? $loadFile : ''); + } + return $className; + } + + /** + * Set path to class file cache + * + * 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 + * @return void + * @throws Zend_Loader_PluginLoader_Exception if file is not writeable or path does not exist + */ + public static function setIncludeFileCache($file) + { + if (null === $file) { + self::$_includeFileCache = null; + return; + } + + if (!file_exists($file) && !file_exists(dirname($file))) { + require_once 'Zend/Loader/PluginLoader/Exception.php'; + throw new Zend_Loader_PluginLoader_Exception('Specified file does not exist and/or directory does not exist (' . $file . ')'); + } + if (file_exists($file) && !is_writable($file)) { + require_once 'Zend/Loader/PluginLoader/Exception.php'; + throw new Zend_Loader_PluginLoader_Exception('Specified file is not writeable (' . $file . ')'); + } + if (!file_exists($file) && file_exists(dirname($file)) && !is_writable(dirname($file))) { + require_once 'Zend/Loader/PluginLoader/Exception.php'; + throw new Zend_Loader_PluginLoader_Exception('Specified file is not writeable (' . $file . ')'); + } + + self::$_includeFileCache = $file; + } + + /** + * Retrieve class file cache path + * + * @return string|null + */ + public static function getIncludeFileCache() + { + return self::$_includeFileCache; + } + + /** + * Append an include_once statement to the class file cache + * + * @param string $incFile + * @return void + */ + protected static function _appendIncFile($incFile) + { + if (!file_exists(self::$_includeFileCache)) { + $file = ' true, 'aa_DJ' => true, 'aa_ER' => true, 'aa_ET' => true, 'aa' => true, + 'af_NA' => true, 'af_ZA' => true, 'af' => true, 'ak_GH' => true, 'ak' => true, + 'am_ET' => true, 'am' => true, 'ar_AE' => true, 'ar_BH' => true, 'ar_DZ' => true, + 'ar_EG' => true, 'ar_IQ' => true, 'ar_JO' => true, 'ar_KW' => true, 'ar_LB' => true, + 'ar_LY' => true, 'ar_MA' => true, 'ar_OM' => true, 'ar_QA' => true, 'ar_SA' => true, + 'ar_SD' => true, 'ar_SY' => true, 'ar_TN' => true, 'ar_YE' => true, 'ar' => true, + 'as_IN' => true, 'as' => true, 'az_AZ' => true, 'az' => true, 'be_BY' => true, + 'be' => true, 'bg_BG' => true, 'bg' => true, 'bn_BD' => true, 'bn_IN' => true, + 'bn' => true, 'bo_CN' => true, 'bo_IN' => true, 'bo' => true, 'bs_BA' => true, + 'bs' => true, 'byn_ER'=> true, 'byn' => true, 'ca_ES' => true, 'ca' => true, + 'cch_NG'=> true, 'cch' => true, 'cop_EG'=> true, 'cop_US'=> true, 'cop' => true, + 'cs_CZ' => true, 'cs' => true, 'cy_GB' => true, 'cy' => true, 'da_DK' => true, + 'da' => true, 'de_AT' => true, 'de_BE' => true, 'de_CH' => true, 'de_DE' => true, + 'de_LI' => true, 'de_LU' => true, 'de' => true, 'dv_MV' => true, 'dv' => true, + 'dz_BT' => true, 'dz' => true, 'ee_GH' => true, 'ee_TG' => true, 'ee' => true, + 'el_CY' => true, 'el_GR' => true, 'el' => true, 'en_AS' => true, 'en_AU' => true, + 'en_BE' => true, 'en_BW' => true, 'en_BZ' => true, 'en_CA' => true, 'en_GB' => true, + 'en_GU' => true, 'en_HK' => true, 'en_IE' => true, 'en_IN' => true, 'en_JM' => true, + 'en_MH' => true, 'en_MP' => true, 'en_MT' => true, 'en_NZ' => true, 'en_PH' => true, + 'en_PK' => true, 'en_SG' => true, 'en_TT' => true, 'en_UM' => true, 'en_US' => true, + 'en_VI' => true, 'en_ZA' => true, 'en_ZW' => true, 'en' => true, 'eo' => true, + 'es_AR' => true, 'es_BO' => true, 'es_CL' => true, 'es_CO' => true, 'es_CR' => true, + 'es_DO' => true, 'es_EC' => true, 'es_ES' => true, 'es_GT' => true, 'es_HN' => true, + 'es_MX' => true, 'es_NI' => true, 'es_PA' => true, 'es_PE' => true, 'es_PR' => true, + 'es_PY' => true, 'es_SV' => true, 'es_US' => true, 'es_UY' => true, 'es_VE' => true, + 'es' => true, 'et_EE' => true, 'et' => true, 'eu_ES' => true, 'eu' => true, + 'fa_AF' => true, 'fa_IR' => true, 'fa' => true, 'fi_FI' => true, 'fi' => true, + 'fil' => true, 'fo_FO' => true, 'fo' => true, 'fr_BE' => true, 'fr_CA' => true, + 'fr_CH' => true, 'fr_FR' => true, 'fr_LU' => true, 'fr_MC' => true, 'fr' => true, + 'fur_IT'=> true, 'fur' => true, 'ga_IE' => true, 'ga' => true, 'gaa_GH'=> true, + 'gaa' => true, 'gez_ER'=> true, 'gez_ET'=> true, 'gez' => true, 'gl_ES' => true, + 'gl' => true, 'gu_IN' => true, 'gu' => true, 'gv_GB' => true, 'gv' => true, + 'ha_GH' => true, 'ha_NE' => true, 'ha_NG' => true, 'ha' => true, 'haw_US'=> true, + 'haw' => true, 'he_IL' => true, 'he' => true, 'hi_IN' => true, 'hi' => true, + 'hr_HR' => true, 'hr' => true, 'hu_HU' => true, 'hu' => true, 'hy_AM' => true, + 'hy' => true, 'ia' => true, 'id_ID' => true, 'id' => true, 'ig_NG' => true, + 'ig' => true, 'ii_CN' => true, 'ii' => true, 'is_IS' => true, 'is' => true, + 'it_CH' => true, 'it_IT' => true, 'it' => true, 'iu' => true, 'ja_JP' => true, + 'ja' => true, 'ka_GE' => true, 'ka' => true, 'kaj_NG'=> true, 'kaj' => true, + 'kam_KE'=> true, 'kam' => true, 'kcg_NG'=> true, 'kcg' => true, 'kfo_NG'=> true, + 'kfo' => true, 'kk_KZ' => true, 'kk' => true, 'kl_GL' => true, 'kl' => true, + 'km_KH' => true, 'km' => true, 'kn_IN' => true, 'kn' => true, 'ko_KR' => true, + 'ko' => true, 'kok_IN'=> true, 'kok' => true, 'kpe_GN'=> true, 'kpe_LR'=> true, + 'kpe' => true, 'ku_IQ' => true, 'ku_IR' => true, 'ku_SY' => true, 'ku_TR' => true, + 'ku' => true, 'kw_GB' => true, 'kw' => true, 'ky_KG' => true, 'ky' => true, + 'ln_CD' => true, 'ln_CG' => true, 'ln' => true, 'lo_LA' => true, 'lo' => true, + 'lt_LT' => true, 'lt' => true, 'lv_LV' => true, 'lv' => true, 'mk_MK' => true, + 'mk' => true, 'ml_IN' => true, 'ml' => true, 'mn_MN' => true, 'mn' => true, + 'mr_IN' => true, 'mr' => true, 'ms_BN' => true, 'ms_MY' => true, 'ms' => true, + 'mt_MT' => true, 'mt' => true, 'my_MM' => true, 'my' => true, 'nb_NO' => true, + 'nb' => true, 'ne_NP' => true, 'ne' => true, 'nl_BE' => true, 'nl_NL' => true, + 'nl' => true, 'nn_NO' => true, 'nn' => true, 'nr_ZA' => true, 'nr' => true, + 'nso_ZA'=> true, 'nso' => true, 'ny_MW' => true, 'ny' => true, 'om_ET' => true, + 'om_KE' => true, 'om' => true, 'or_IN' => true, 'or' => true, 'pa_IN' => true, + 'pa_PK' => true, 'pa' => true, 'pl_PL' => true, 'pl' => true, 'ps_AF' => true, + 'ps' => true, 'pt_BR' => true, 'pt_PT' => true, 'pt' => true, 'ro_RO' => true, + 'ro' => true, 'ru_RU' => true, 'ru_UA' => true, 'ru' => true, 'rw_RW' => true, + 'rw' => true, 'sa_IN' => true, 'sa' => true, 'se_FI' => true, 'se_NO' => true, + 'se' => true, 'sh_BA' => true, 'sh_CS' => true, 'sh_YU' => true, 'sh' => true, + 'sid_ET'=> true, 'sid' => true, 'sk_SK' => true, 'sk' => true, 'sl_SI' => true, + 'sl' => true, 'so_DJ' => true, 'so_ET' => true, 'so_KE' => true, 'so_SO' => true, + 'so' => true, 'sq_AL' => true, 'sq' => true, 'sr_BA' => true, 'sr_CS' => true, + 'sr_ME' => true, 'sr_RS' => true, 'sr_YU' => true, 'sr' => true, 'ss_ZA' => true, + 'ss' => true, 'ssy' => true, 'st_ZA' => true, 'st' => true, 'sv_FI' => true, + 'sv_SE' => true, 'sv' => true, 'sw_KE' => true, 'sw_TZ' => true, 'sw' => true, + 'syr_SY'=> true, 'syr' => true, 'ta_IN' => true, 'ta' => true, 'te_IN' => true, + 'te' => true, 'tg_TJ' => true, 'tg' => true, 'th_TH' => true, 'th' => true, + 'ti_ER' => true, 'ti_ET' => true, 'ti' => true, 'tig_ER'=> true, 'tig' => true, + 'tn_ZA' => true, 'tn' => true, 'to_TO' => true, 'to' => true, 'tr_TR' => true, + 'tr' => true, 'ts_ZA' => true, 'ts' => true, 'tt_RU' => true, 'tt' => true, + 'ug' => true, 'uk_UA' => true, 'uk' => true, 'und_ZZ'=> true, 'und' => true, + 'ur_IN' => true, 'ur_PK' => true, 'ur' => true, 'uz_AF' => true, 'uz_UZ' => true, + 'uz' => true, 've_ZA' => true, 've' => true, 'vi_VN' => true, 'vi' => true, + 'wal_ET'=> true, 'wal' => true, 'wo_SN' => true, 'wo' => true, 'xh_ZA' => true, + 'xh' => true, 'yo_NG' => true, 'yo' => true, 'zh_CN' => true, 'zh_HK' => true, + 'zh_MO' => true, 'zh_SG' => true, 'zh_TW' => true, 'zh' => true, 'zu_ZA' => true, + 'zu' => true + ); + + /** + * Autosearch constants + */ + const BROWSER = 'browser'; + const ENVIRONMENT = 'environment'; + const ZFDEFAULT = 'default'; + + /** + * Defines if old behaviour should be supported + * Old behaviour throws notices and will be deleted in future releases + * + * @var boolean + */ + public static $compatibilityMode = true; + + /** + * Internal variable + * + * @var boolean + */ + private static $_breakChain = false; + + /** + * Actual set locale + * + * @var string Locale + */ + protected $_locale; + + /** + * Automatic detected locale + * + * @var string Locales + */ + protected static $_auto; + + /** + * Browser detected locale + * + * @var string Locales + */ + protected static $_browser; + + /** + * Environment detected locale + * + * @var string Locales + */ + protected static $_environment; + + /** + * Default locale + * + * @var string Locales + */ + protected static $_default = array('en' => true); + + /** + * Generates a locale object + * If no locale is given a automatic search is done + * Then the most probable locale will be automatically set + * Search order is + * 1. Given Locale + * 2. HTTP Client + * 3. Server Environment + * 4. Framework Standard + * + * @param string|Zend_Locale $locale (Optional) Locale for parsing input + * @throws Zend_Locale_Exception When autodetection has been failed + */ + public function __construct($locale = null) + { + $locale = self::_prepareLocale($locale); + $this->setLocale((string) $locale); + } + + /** + * Serialization Interface + * + * @return string + */ + public function serialize() + { + return serialize($this); + } + + /** + * Returns a string representation of the object + * + * @return string + */ + public function toString() + { + return (string) $this->_locale; + } + + /** + * Returns a string representation of the object + * Alias for toString + * + * @return string + */ + public function __toString() + { + return $this->toString(); + } + + /** + * Return the default locale + * + * @return array Returns an array of all locale string + */ + public static function getDefault() + { + if ((self::$compatibilityMode === true) or (func_num_args() > 0)) { + if (!self::$_breakChain) { + self::$_breakChain = true; + trigger_error('You are running Zend_Locale in compatibility mode... please migrate your scripts', E_USER_NOTICE); + $params = func_get_args(); + $param = null; + if (isset($params[0])) { + $param = $params[0]; + } + return self::getOrder($param); + } + + self::$_breakChain = false; + } + + return self::$_default; + } + + /** + * Sets a new default locale + * If provided you can set a quality between 0 and 1 (or 2 and 100) + * which represents the percent of quality the browser + * requested within HTTP + * + * @param string|Zend_Locale $locale Locale to set + * @param float $quality The quality to set from 0 to 1 + * @throws Zend_Locale_Exception When a autolocale was given + * @throws Zend_Locale_Exception When a unknown locale was given + * @return void + */ + public static function setDefault($locale, $quality = 1) + { + if (($locale === 'auto') or ($locale === 'root') or ($locale === 'default') or + ($locale === 'environment') or ($locale === 'browser')) { + require_once 'Zend/Locale/Exception.php'; + throw new Zend_Locale_Exception('Only full qualified locales can be used as default!'); + } + + if (($quality < 0.1) or ($quality > 100)) { + require_once 'Zend/Locale/Exception.php'; + throw new Zend_Locale_Exception("Quality must be between 0.1 and 100"); + } + + if ($quality > 1) { + $quality /= 100; + } + + if (isset(self::$_localeData[(string) $locale]) === true) { + self::$_default = array((string) $locale => $quality); + } else { + $locale = explode('_', (string) $locale); + if (isset(self::$_localeData[$locale[0]]) === true) { + self::$_default = array($locale[0] => $quality); + } else { + require_once 'Zend/Locale/Exception.php'; + throw new Zend_Locale_Exception("Unknown locale '" . (string) $locale . "' can not be set as default!"); + } + } + } + + /** + * Expects the Systems standard locale + * + * For Windows: + * f.e.: LC_COLLATE=C;LC_CTYPE=German_Austria.1252;LC_MONETARY=C + * would be recognised as de_AT + * + * @return array + */ + public static function getEnvironment() + { + if (self::$_environment !== null) { + return self::$_environment; + } + + require_once 'Zend/Locale/Data/Translation.php'; + + $language = setlocale(LC_ALL, 0); + $languages = explode(';', $language); + $languagearray = array(); + + foreach ($languages as $locale) { + if (strpos($locale, '=') !== false) { + $language = substr($locale, strpos($locale, '=')); + $language = substr($language, 1); + } + + if ($language !== 'C') { + if (strpos($language, '.') !== false) { + $language = substr($language, 0, (strpos($language, '.') - 1)); + } else if (strpos($language, '@') !== false) { + $language = substr($language, 0, (strpos($language, '@') - 1)); + } + + $splitted = explode('_', $language); + $language = (string) $language; + if (isset(self::$_localeData[$language]) === true) { + $languagearray[$language] = 1; + if (strlen($language) > 4) { + $languagearray[substr($language, 0, 2)] = 1; + } + + continue; + } + + if (empty(Zend_Locale_Data_Translation::$localeTranslation[$splitted[0]]) === false) { + if (empty(Zend_Locale_Data_Translation::$localeTranslation[$splitted[1]]) === false) { + $languagearray[Zend_Locale_Data_Translation::$localeTranslation[$splitted[0]] . '_' . + Zend_Locale_Data_Translation::$localeTranslation[$splitted[1]]] = 1; + } + + $languagearray[Zend_Locale_Data_Translation::$localeTranslation[$splitted[0]]] = 1; + } + } + } + + self::$_environment = $languagearray; + return $languagearray; + } + + /** + * Return an array of all accepted languages of the client + * Expects RFC compilant Header !! + * + * The notation can be : + * de,en-UK-US;q=0.5,fr-FR;q=0.2 + * + * @return array - list of accepted languages including quality + */ + public static function getBrowser() + { + if (self::$_browser !== null) { + return self::$_browser; + } + + $httplanguages = getenv('HTTP_ACCEPT_LANGUAGE'); + $languages = array(); + if (empty($httplanguages) === true) { + return $languages; + } + + $accepted = preg_split('/,\s*/', $httplanguages); + + foreach ($accepted as $accept) { + $match = null; + $result = preg_match('/^([a-z]{1,8}(?:[-_][a-z]{1,8})*)(?:;\s*q=(0(?:\.[0-9]{1,3})?|1(?:\.0{1,3})?))?$/i', + $accept, $match); + + if ($result < 1) { + continue; + } + + if (isset($match[2]) === true) { + $quality = (float) $match[2]; + } else { + $quality = 1.0; + } + + $countrys = explode('-', $match[1]); + $region = array_shift($countrys); + + $country2 = explode('_', $region); + $region = array_shift($country2); + + foreach ($countrys as $country) { + $languages[$region . '_' . strtoupper($country)] = $quality; + } + + foreach ($country2 as $country) { + $languages[$region . '_' . strtoupper($country)] = $quality; + } + + if ((isset($languages[$region]) === false) || ($languages[$region] < $quality)) { + $languages[$region] = $quality; + } + } + + self::$_browser = $languages; + return $languages; + } + + /** + * Sets a new locale + * + * @param string|Zend_Locale $locale (Optional) New locale to set + * @return void + */ + public function setLocale($locale = null) + { + $locale = self::_prepareLocale($locale); + + if (isset(self::$_localeData[(string) $locale]) === false) { + $region = substr((string) $locale, 0, 3); + if (isset($region[2]) === true) { + if (($region[2] === '_') or ($region[2] === '-')) { + $region = substr($region, 0, 2); + } + } + + if (isset(self::$_localeData[(string) $region]) === true) { + $this->_locale = $region; + } else { + $this->_locale = 'root'; + } + } else { + $this->_locale = $locale; + } + } + + /** + * Returns the language part of the locale + * + * @return language + */ + public function getLanguage() + { + $locale = explode('_', $this->_locale); + return $locale[0]; + } + + /** + * Returns the region part of the locale if available + * + * @return string|false - Regionstring + */ + public function getRegion() + { + $locale = explode('_', $this->_locale); + if (isset($locale[1]) === true) { + return $locale[1]; + } + + return false; + } + + /** + * Return the accepted charset of the client + * + * @return string + */ + public static function getHttpCharset() + { + $httpcharsets = getenv('HTTP_ACCEPT_CHARSET'); + + $charsets = array(); + if ($httpcharsets === false) { + return $charsets; + } + + $accepted = preg_split('/,\s*/', $httpcharsets); + foreach ($accepted as $accept) { + if (empty($accept) === true) { + continue; + } + + if (strpos($accept, ';') !== false) { + $quality = (float) substr($accept, (strpos($accept, '=') + 1)); + $pos = substr($accept, 0, strpos($accept, ';')); + $charsets[$pos] = $quality; + } else { + $quality = 1.0; + $charsets[$accept] = $quality; + } + } + + return $charsets; + } + + /** + * Returns true if both locales are equal + * + * @param Zend_Locale $object Locale to check for equality + * @return boolean + */ + public function equals(Zend_Locale $object) + { + if ($object->toString() === $this->toString()) { + return true; + } + + return false; + } + + /** + * Returns localized informations as array, supported are several + * types of informations. + * For detailed information about the types look into the documentation + * + * @param string $path (Optional) Type of information to return + * @param string|Zend_Locale $locale (Optional) Locale|Language for which this informations should be returned + * @param string $value (Optional) Value for detail list + * @return array Array with the wished information in the given language + */ + public static function getTranslationList($path = null, $locale = null, $value = null) + { + require_once 'Zend/Locale/Data.php'; + $locale = self::_prepareLocale($locale); + $result = Zend_Locale_Data::getList($locale, $path, $value); + if (empty($result) === true) { + return false; + } + + return $result; + } + + /** + * Returns an array with the name of all languages translated to the given language + * + * @param string|Zend_Locale $locale (Optional) Locale for language translation + * @return array + */ + public static function getLanguageTranslationList($locale = null) + { + return self::getTranslationList('language', $locale); + } + + /** + * Returns an array with the name of all scripts translated to the given language + * + * @param string|Zend_Locale $locale (Optional) Locale for script translation + * @return array + */ + public static function getScriptTranslationList($locale = null) + { + return self::getTranslationList('script', $locale); + } + + /** + * Returns an array with the name of all countries translated to the given language + * + * @param string|Zend_Locale $locale (Optional) Locale for country translation + * @return array + */ + public static function getCountryTranslationList($locale = null) + { + return self::getTranslationList('territory', $locale, 2); + } + + /** + * Returns an array with the name of all territories translated to the given language + * All territories contains other countries. + * + * @param string|Zend_Locale $locale (Optional) Locale for territory translation + * @return array + */ + public static function getTerritoryTranslationList($locale = null) + { + return self::getTranslationList('territory', $locale, 1); + } + + /** + * Returns a localized information string, supported are several types of informations. + * For detailed information about the types look into the documentation + * + * @param string $value Name to get detailed information about + * @param string $path (Optional) Type of information to return + * @param string|Zend_Locale $locale (Optional) Locale|Language for which this informations should be returned + * @return string|false The wished information in the given language + */ + public static function getTranslation($value = null, $path = null, $locale = null) + { + require_once 'Zend/Locale/Data.php'; + $locale = self::_prepareLocale($locale); + $result = Zend_Locale_Data::getContent($locale, $path, $value); + if (empty($result) === true) { + return false; + } + + return $result; + } + + /** + * Returns the localized language name + * + * @param string $value Name to get detailed information about + * @param string $locale (Optional) Locale for language translation + * @return array + */ + public static function getLanguageTranslation($value, $locale = null) + { + return self::getTranslation($value, 'language', $locale); + } + + /** + * Returns the localized script name + * + * @param string $value Name to get detailed information about + * @param string $locale (Optional) locale for script translation + * @return array + */ + public static function getScriptTranslation($value, $locale = null) + { + return self::getTranslation($value, 'script', $locale); + } + + /** + * Returns the localized country name + * + * @param string $value Name to get detailed information about + * @param string|Zend_Locale $locale (Optional) Locale for country translation + * @return array + */ + public static function getCountryTranslation($value, $locale = null) + { + return self::getTranslation($value, 'country', $locale); + } + + /** + * Returns the localized territory name + * All territories contains other countries. + * + * @param string $value Name to get detailed information about + * @param string|Zend_Locale $locale (Optional) Locale for territory translation + * @return array + */ + public static function getTerritoryTranslation($value, $locale = null) + { + return self::getTranslation($value, 'territory', $locale); + } + + /** + * Returns an array with translated yes strings + * + * @param string|Zend_Locale $locale (Optional) Locale for language translation (defaults to $this locale) + * @return array + */ + public static function getQuestion($locale = null) + { + require_once 'Zend/Locale/Data.php'; + $locale = self::_prepareLocale($locale); + $quest = Zend_Locale_Data::getList($locale, 'question'); + $yes = explode(':', $quest['yes']); + $no = explode(':', $quest['no']); + $quest['yes'] = $yes[0]; + $quest['yesarray'] = $yes; + $quest['no'] = $no[0]; + $quest['noarray'] = $no; + $quest['yesexpr'] = self::_prepareQuestionString($yes); + $quest['noexpr'] = self::_prepareQuestionString($no); + + return $quest; + } + + /** + * Internal function for preparing the returned question regex string + * + * @param string $input Regex to parse + * @return string + */ + private static function _prepareQuestionString($input) + { + $regex = ''; + if (is_array($input) === true) { + $regex = '^'; + $start = true; + foreach ($input as $row) { + if ($start === false) { + $regex .= '|'; + } + + $start = false; + $regex .= '('; + $one = null; + if (strlen($row) > 2) { + $one = true; + } + + foreach (str_split($row, 1) as $char) { + $regex .= '[' . $char; + $regex .= strtoupper($char) . ']'; + if ($one === true) { + $one = false; + $regex .= '('; + } + } + + if ($one === false) { + $regex .= ')'; + } + + $regex .= '?)'; + } + } + + return $regex; + } + + /** + * Checks if a locale identifier is a real locale or not + * Examples: + * "en_XX" refers to "en", which returns true + * "XX_yy" refers to "root", which returns false + * + * @param string|Zend_Locale $locale Locale to check for + * @param boolean $strict (Optional) If true, no rerouting will be done when checking + * @param boolean $compatible (DEPRECIATED) Only for internal usage, brakes compatibility mode + * @return boolean If the locale is known dependend on the settings + */ + public static function isLocale($locale, $strict = false, $compatible = true) + { + try { + $locale = self::_prepareLocale($locale, $strict); + } catch (Zend_Locale_Exception $e) { + return false; + } + + if (($compatible === true) and (self::$compatibilityMode === true)) { + trigger_error('You are running Zend_Locale in compatibility mode... please migrate your scripts', E_USER_NOTICE); + if (isset(self::$_localeData[$locale]) === true) { + return $locale; + } else if (!$strict) { + $locale = explode('_', $locale); + if (isset(self::$_localeData[$locale[0]]) === true) { + return $locale[0]; + } + } + } else { + if (isset(self::$_localeData[$locale]) === true) { + return true; + } else if (!$strict) { + $locale = explode('_', $locale); + if (isset(self::$_localeData[$locale[0]]) === true) { + return true; + } + } + } + + return false; + } + + /** + * Returns a list of all known locales where the locale is the key + * Only real locales are returned, the internal locales 'root', 'auto', 'browser' + * and 'environment' are suppressed + * + * @return array List of all Locales + */ + public static function getLocaleList() + { + $list = self::$_localeData; + unset($list['root']); + unset($list['auto']); + unset($list['browser']); + unset($list['environment']); + return $list; + } + + /** + * Returns the set cache + * + * @return Zend_Cache_Core The set cache + */ + public static function getCache() + { + require_once 'Zend/Locale/Data.php'; + $cache = Zend_Locale_Data::getCache(); + + return $cache; + } + + /** + * Sets a cache + * + * @param Zend_Cache_Core $cache Cache to set + * @return void + */ + public static function setCache(Zend_Cache_Core $cache) + { + require_once 'Zend/Locale/Data.php'; + Zend_Locale_Data::setCache($cache); + } + + /** + * Returns true when a cache is set + * + * @return boolean + */ + public static function hasCache() + { + require_once 'Zend/Locale/Data.php'; + return Zend_Locale_Data::hasCache(); + } + + /** + * Removes any set cache + * + * @return void + */ + public static function removeCache() + { + require_once 'Zend/Locale/Data.php'; + Zend_Locale_Data::removeCache(); + } + + /** + * Clears all set cache data + * + * @return void + */ + public static function clearCache() + { + require_once 'Zend/Locale/Data.php'; + Zend_Locale_Data::clearCache(); + } + + /** + * Internal function, returns a single locale on detection + * + * @param string|Zend_Locale $locale (Optional) Locale to work on + * @param boolean $strict (Optional) Strict preparation + * @throws Zend_Locale_Exception When no locale is set which is only possible when the class was wrong extended + * @return string + */ + private static function _prepareLocale($locale, $strict = false) + { + if (is_array($locale)) { + return ''; + } + + if (empty(self::$_auto) === true) { + self::$_browser = self::getBrowser(); + self::$_environment = self::getEnvironment(); + self::$_breakChain = true; + self::$_auto = self::getBrowser() + self::getEnvironment() + self::getDefault(); + } + + if (!$strict) { + if ($locale === 'browser') { + $locale = self::$_browser; + } + + if ($locale === 'environment') { + $locale = self::$_environment; + } + + if ($locale === 'default') { + $locale = self::$_default; + } + + if (($locale === 'auto') or (empty($locale))) { + $locale = self::$_auto; + } + + if (is_array($locale) === true) { + $locale = key($locale); + } + } + + // This can only happen when someone extends Zend_Locale and erases the default + if ((empty($locale))) { + require_once 'Zend/Locale/Exception.php'; + throw new Zend_Locale_Exception('Autodetection of Locale has been failed!'); + } + + if (strpos($locale, '-') !== false) { + $locale = strtr($locale, '-', '_'); + } + + return (string) $locale; + } + + /** + * Search the locale automatically and return all used locales + * ordered by quality + * + * Standard Searchorder is Browser, Environment, Default + * + * @param string $searchorder (Optional) Searchorder + * @return array Returns an array of all detected locales + */ + public static function getOrder($order = null) + { + switch ($order) { + case self::ENVIRONMENT: + self::$_breakChain = true; + $languages = self::getEnvironment() + self::getBrowser() + self::getDefault(); + break; + + case self::ZFDEFAULT: + self::$_breakChain = true; + $languages = self::getDefault() + self::getEnvironment() + self::getBrowser(); + break; + + default: + self::$_breakChain = true; + $languages = self::getBrowser() + self::getEnvironment() + self::getDefault(); + break; + } + + return $languages; + } +} diff --git a/libs/Zend/Locale/Data.php b/libs/Zend/Locale/Data.php new file mode 100644 index 0000000..2bcc14c --- /dev/null +++ b/libs/Zend/Locale/Data.php @@ -0,0 +1,1208 @@ + + * test + * content + * content2 + * + * + * + * Case 1: _readFile('ar','/ldml/delimiter') -> returns [] = test + * Case 1: _readFile('ar','/ldml/second[@type=myone]') -> returns [] = content + * Case 2: _readFile('ar','/ldml/second','type') -> returns [myone] = content; [mysecond] = content2 + * Case 3: _readFile('ar','/ldml/delimiter',,'right') -> returns [right] = test + * Case 4: _readFile('ar','/ldml/third','type','myone') -> returns [myone] = mythird + * + * @param string $locale + * @param string $path + * @param string $attribute + * @param string $value + * @access private + * @return array + */ + private static function _readFile($locale, $path, $attribute, $value, $temp) + { + // without attribute - read all values + // with attribute - read only this value + if (!empty(self::$_ldml[(string) $locale])) { + + $result = self::$_ldml[(string) $locale]->xpath($path); + if (!empty($result)) { + foreach ($result as &$found) { + + if (empty($value)) { + + if (empty($attribute)) { + // Case 1 + $temp[] = (string) $found; + } else if (empty($temp[(string) $found[$attribute]])){ + // Case 2 + $temp[(string) $found[$attribute]] = (string) $found; + } + + } else if (empty ($temp[$value])) { + + if (empty($attribute)) { + // Case 3 + $temp[$value] = (string) $found; + } else { + // Case 4 + $temp[$value] = (string) $found[$attribute]; + } + + } + } + } + } + return $temp; + } + + /** + * Find possible routing to other path or locale + * + * @param string $locale + * @param string $path + * @param string $attribute + * @param string $value + * @param array $temp + * @throws Zend_Locale_Exception + * @access private + */ + private static function _findRoute($locale, $path, $attribute, $value, &$temp) + { + // load locale file if not already in cache + // needed for alias tag when referring to other locale + if (empty(self::$_ldml[(string) $locale])) { + $filename = dirname(__FILE__) . '/Data/' . $locale . '.xml'; + if (!file_exists($filename)) { + require_once 'Zend/Locale/Exception.php'; + throw new Zend_Locale_Exception("Missing locale file '$filename' for '$locale' locale."); + } + + self::$_ldml[(string) $locale] = simplexml_load_file($filename); + } + + // search for 'alias' tag in the search path for redirection + $search = ''; + $tok = strtok($path, '/'); + + // parse the complete path + if (!empty(self::$_ldml[(string) $locale])) { + while ($tok !== false) { + $search .= '/' . $tok; + if (strpos($search, '[@') !== false) { + while (strrpos($search, '[@') > strrpos($search, ']')) { + $tok = strtok('/'); + if (empty($tok)) { + $search .= '/'; + } + $search = $search . '/' . $tok; + } + } + $result = self::$_ldml[(string) $locale]->xpath($search . '/alias'); + + // alias found + if (!empty($result)) { + + $source = $result[0]['source']; + $newpath = $result[0]['path']; + + // new path - path //ldml is to ignore + if ($newpath != '//ldml') { + // other path - parse to make real path + + while (substr($newpath,0,3) == '../') { + $newpath = substr($newpath, 3); + $search = substr($search, 0, strrpos($search, '/')); + } + + // truncate ../ to realpath otherwise problems with alias + $path = $search . '/' . $newpath; + while (($tok = strtok('/'))!== false) { + $path = $path . '/' . $tok; + } + } + + // reroute to other locale + if ($source != 'locale') { + $locale = $source; + } + + $temp = self::_getFile($locale, $path, $attribute, $value, $temp); + return false; + } + + $tok = strtok('/'); + } + } + return true; + } + + + /** + * Read the right LDML file + * + * @param string $locale + * @param string $path + * @param string $attribute + * @param string $value + * @access private + */ + private static function _getFile($locale, $path, $attribute = false, $value = false, $temp = array()) + { + $result = self::_findRoute($locale, $path, $attribute, $value, $temp); + if ($result) { + $temp = self::_readFile($locale, $path, $attribute, $value, $temp); + } + + // parse required locales reversive + // example: when given zh_Hans_CN + // 1. -> zh_Hans_CN + // 2. -> zh_Hans + // 3. -> zh + // 4. -> root + if (($locale != 'root') && ($result)) { + $locale = substr($locale, 0, -strlen(strrchr($locale, '_'))); + if (!empty($locale)) { + $temp = self::_getFile($locale, $path, $attribute, $value, $temp); + } else { + $temp = self::_getFile('root', $path, $attribute, $value, $temp); + } + } + return $temp; + } + + + /** + * Find the details for supplemental calendar datas + * + * @param string $locale Locale for Detaildata + * @param array $list List to search + * @return string Key for Detaildata + */ + private static function _calendarDetail($locale, $list) + { + $ret = "001"; + foreach ($list as $key => $value) { + if (strpos($locale, '_') !== false) { + $locale = substr($locale, strpos($locale, '_') + 1); + } + if (strpos($key, $locale) !== false) { + $ret = $key; + break; + } + } + return $ret; + } + + /** + * Internal function for checking the locale + * + * @param string|Zend_Locale $locale Locale to check + * @return string + */ + private static function _checkLocale($locale) + { + if (empty($locale)) { + $locale = new Zend_Locale(); + } + + if (!(Zend_Locale::isLocale((string) $locale, null, false))) { + require_once 'Zend/Locale/Exception.php'; + throw new Zend_Locale_Exception("Locale (" . (string) $locale . ") is a unknown locale"); + } + + return (string) $locale; + } + + /** + * Read the LDML file, get a array of multipath defined value + * + * @param string $locale + * @param string $path + * @param string $value + * @return array + * @access public + */ + public static function getList($locale, $path, $value = false) + { + $locale = self::_checkLocale($locale); + if (isset(self::$_cache)) { + $val = $value; + if (is_array($value)) { + $val = implode('_' , $value); + } + + $val = urlencode($val); + $id = strtr('Zend_LocaleL_' . $locale . '_' . $path . '_' . $val, array('-' => '_', '%' => '_', '+' => '_')); + if ($result = self::$_cache->load($id)) { + return unserialize($result); + } + } + + $temp = array(); + switch(strtolower($path)) { + case 'language': + $temp = self::_getFile($locale, '/ldml/localeDisplayNames/languages/language', 'type'); + break; + + case 'script': + $temp = self::_getFile($locale, '/ldml/localeDisplayNames/scripts/script', 'type'); + break; + + case 'territory': + $temp = self::_getFile($locale, '/ldml/localeDisplayNames/territories/territory', 'type'); + if ($value === 1) { + foreach($temp as $key => $value) { + if ((is_numeric($key) === false) and ($key != 'QO') and ($key != 'QU')) { + unset($temp[$key]); + } + } + } else if ($value === 2) { + foreach($temp as $key => $value) { + if (is_numeric($key) or ($key == 'QO') or ($key == 'QU')) { + unset($temp[$key]); + } + } + } + break; + + case 'variant': + $temp = self::_getFile($locale, '/ldml/localeDisplayNames/variants/variant', 'type'); + break; + + case 'key': + $temp = self::_getFile($locale, '/ldml/localeDisplayNames/keys/key', 'type'); + break; + + case 'type': + if (empty($type)) { + $temp = self::_getFile($locale, '/ldml/localeDisplayNames/types/type', 'type'); + } else { + if (($value == 'calendar') or + ($value == 'collation') or + ($value == 'currency')) { + $temp = self::_getFile($locale, '/ldml/localeDisplayNames/types/type[@key=\'' . $value . '\']', 'type'); + } else { + $temp = self::_getFile($locale, '/ldml/localeDisplayNames/types/type[@type=\'' . $value . '\']', 'type'); + } + } + break; + + case 'layout': + $temp = self::_getFile($locale, '/ldml/layout/orientation', 'lines', 'lines'); + $temp += self::_getFile($locale, '/ldml/layout/orientation', 'characters', 'characters'); + $temp += self::_getFile($locale, '/ldml/layout/inList', '', 'inList'); + $temp += self::_getFile($locale, '/ldml/layout/inText[@type=\'currency\']', '', 'currency'); + $temp += self::_getFile($locale, '/ldml/layout/inText[@type=\'dayWidth\']', '', 'dayWidth'); + $temp += self::_getFile($locale, '/ldml/layout/inText[@type=\'fields\']', '', 'fields'); + $temp += self::_getFile($locale, '/ldml/layout/inText[@type=\'keys\']', '', 'keys'); + $temp += self::_getFile($locale, '/ldml/layout/inText[@type=\'languages\']', '', 'languages'); + $temp += self::_getFile($locale, '/ldml/layout/inText[@type=\'long\']', '', 'long'); + $temp += self::_getFile($locale, '/ldml/layout/inText[@type=\'measurementSystemNames\']', '', 'measurementSystemNames'); + $temp += self::_getFile($locale, '/ldml/layout/inText[@type=\'monthWidth\']', '', 'monthWidth'); + $temp += self::_getFile($locale, '/ldml/layout/inText[@type=\'quarterWidth\']', '', 'quarterWidth'); + $temp += self::_getFile($locale, '/ldml/layout/inText[@type=\'scripts\']', '', 'scripts'); + $temp += self::_getFile($locale, '/ldml/layout/inText[@type=\'territories\']', '', 'territories'); + $temp += self::_getFile($locale, '/ldml/layout/inText[@type=\'types\']', '', 'types'); + $temp += self::_getFile($locale, '/ldml/layout/inText[@type=\'variants\']', '', 'variants'); + break; + + case 'characters': + $temp = self::_getFile($locale, '/ldml/characters/exemplarCharacters', '', 'characters'); + $temp += self::_getFile($locale, '/ldml/characters/exemplarCharacters[@type=\'auxiliary\']', '', 'auxiliary'); + $temp += self::_getFile($locale, '/ldml/characters/exemplarCharacters[@type=\'currencySymbol\']', '', 'currencySymbol'); + break; + + case 'delimiters': + $temp = self::_getFile($locale, '/ldml/delimiters/quotationStart', '', 'quoteStart'); + $temp += self::_getFile($locale, '/ldml/delimiters/quotationEnd', '', 'quoteEnd'); + $temp += self::_getFile($locale, '/ldml/delimiters/alternateQuotationStart', '', 'quoteStartAlt'); + $temp += self::_getFile($locale, '/ldml/delimiters/alternateQuotationEnd', '', 'quoteEndAlt'); + break; + + case 'measurement': + $temp = self::_getFile('supplementalData', '/supplementalData/measurementData/measurementSystem[@type=\'metric\']', 'territories', 'metric'); + $temp += self::_getFile('supplementalData', '/supplementalData/measurementData/measurementSystem[@type=\'US\']', 'territories', 'US'); + $temp += self::_getFile('supplementalData', '/supplementalData/measurementData/paperSize[@type=\'A4\']', 'territories', 'A4'); + $temp += self::_getFile('supplementalData', '/supplementalData/measurementData/paperSize[@type=\'US-Letter\']', 'territories', 'US-Letter'); + break; + + case 'months': + if (empty($value)) { + $value = "gregorian"; + } + $temp = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/months/default', 'choice', 'context'); + $temp += self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/months/monthContext[@type=\'format\']/default', 'choice', 'default'); + $temp['format']['abbreviated'] = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/months/monthContext[@type=\'format\']/monthWidth[@type=\'abbreviated\']/month', 'type'); + $temp['format']['narrow'] = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/months/monthContext[@type=\'format\']/monthWidth[@type=\'narrow\']/month', 'type'); + $temp['format']['wide'] = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/months/monthContext[@type=\'format\']/monthWidth[@type=\'wide\']/month', 'type'); + $temp['stand-alone']['abbreviated'] = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/months/monthContext[@type=\'stand-alone\']/monthWidth[@type=\'abbreviated\']/month', 'type'); + $temp['stand-alone']['narrow'] = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/months/monthContext[@type=\'stand-alone\']/monthWidth[@type=\'narrow\']/month', 'type'); + $temp['stand-alone']['wide'] = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/months/monthContext[@type=\'stand-alone\']/monthWidth[@type=\'wide\']/month', 'type'); + break; + + case 'month': + if (empty($value)) { + $value = array("gregorian", "format", "wide"); + } + $temp = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value[0] . '\']/months/monthContext[@type=\'' . $value[1] . '\']/monthWidth[@type=\'' . $value[2] . '\']/month', 'type'); + break; + + case 'days': + if (empty($value)) { + $value = "gregorian"; + } + $temp = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/days/default', 'choice', 'context'); + $temp += self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/days/dayContext[@type=\'format\']/default', 'choice', 'default'); + $temp['format']['abbreviated'] = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/days/dayContext[@type=\'format\']/dayWidth[@type=\'abbreviated\']/day', 'type'); + $temp['format']['narrow'] = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/days/dayContext[@type=\'format\']/dayWidth[@type=\'narrow\']/day', 'type'); + $temp['format']['wide'] = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/days/dayContext[@type=\'format\']/dayWidth[@type=\'wide\']/day', 'type'); + $temp['stand-alone']['abbreviated'] = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/days/dayContext[@type=\'stand-alone\']/dayWidth[@type=\'abbreviated\']/day', 'type'); + $temp['stand-alone']['narrow'] = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/days/dayContext[@type=\'stand-alone\']/dayWidth[@type=\'narrow\']/day', 'type'); + $temp['stand-alone']['wide'] = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/days/dayContext[@type=\'stand-alone\']/dayWidth[@type=\'wide\']/day', 'type'); + break; + + case 'day': + if (empty($value)) { + $value = array("gregorian", "format", "wide"); + } + $temp = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value[0] . '\']/days/dayContext[@type=\'' . $value[1] . '\']/dayWidth[@type=\'' . $value[2] . '\']/day', 'type'); + break; + + case 'week': + $minDays = self::_calendarDetail($locale, self::_getFile('supplementalData', '/supplementalData/weekData/minDays', 'territories')); + $firstDay = self::_calendarDetail($locale, self::_getFile('supplementalData', '/supplementalData/weekData/firstDay', 'territories')); + $weekStart = self::_calendarDetail($locale, self::_getFile('supplementalData', '/supplementalData/weekData/weekendStart', 'territories')); + $weekEnd = self::_calendarDetail($locale, self::_getFile('supplementalData', '/supplementalData/weekData/weekendEnd', 'territories')); + + $temp = self::_getFile('supplementalData', "/supplementalData/weekData/minDays[@territories='" . $minDays . "']", 'count', 'minDays'); + $temp += self::_getFile('supplementalData', "/supplementalData/weekData/firstDay[@territories='" . $firstDay . "']", 'day', 'firstDay'); + $temp += self::_getFile('supplementalData', "/supplementalData/weekData/weekendStart[@territories='" . $weekStart . "']", 'day', 'weekendStart'); + $temp += self::_getFile('supplementalData', "/supplementalData/weekData/weekendEnd[@territories='" . $weekEnd . "']", 'day', 'weekendEnd'); + break; + + case 'quarters': + if (empty($value)) { + $value = "gregorian"; + } + $temp['format']['abbreviated'] = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/quarters/quarterContext[@type=\'format\']/quarterWidth[@type=\'abbreviated\']/quarter', 'type'); + $temp['format']['narrow'] = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/quarters/quarterContext[@type=\'format\']/quarterWidth[@type=\'narrow\']/quarter', 'type'); + $temp['format']['wide'] = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/quarters/quarterContext[@type=\'format\']/quarterWidth[@type=\'wide\']/quarter', 'type'); + $temp['stand-alone']['abbreviated'] = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/quarters/quarterContext[@type=\'stand-alone\']/quarterWidth[@type=\'abbreviated\']/quarter', 'type'); + $temp['stand-alone']['narrow'] = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/quarters/quarterContext[@type=\'stand-alone\']/quarterWidth[@type=\'narrow\']/quarter', 'type'); + $temp['stand-alone']['wide'] = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/quarters/quarterContext[@type=\'stand-alone\']/quarterWidth[@type=\'wide\']/quarter', 'type'); + break; + + case 'quarter': + if (empty($value)) { + $value = array("gregorian", "format", "wide"); + } + $temp = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value[0] . '\']/quarters/quarterContext[@type=\'' . $value[1] . '\']/quarterWidth[@type=\'' . $value[2] . '\']/quarter', 'type'); + break; + + case 'eras': + if (empty($value)) { + $value = "gregorian"; + } + $temp['names'] = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/eras/eraNames/era', 'type'); + $temp['abbreviated'] = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/eras/eraAbbr/era', 'type'); + $temp['narrow'] = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/eras/eraNarrow/era', 'type'); + break; + + case 'era': + if (empty($value)) { + $value = array("gregorian", "Abbr"); + } + $temp = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value[0] . '\']/eras/era' . $value[1] . '/era', 'type'); + break; + + case 'date': + if (empty($value)) { + $value = "gregorian"; + } + $temp = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/dateFormats/dateFormatLength[@type=\'full\']/dateFormat/pattern', '', 'full'); + $temp += self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/dateFormats/dateFormatLength[@type=\'long\']/dateFormat/pattern', '', 'long'); + $temp += self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/dateFormats/dateFormatLength[@type=\'medium\']/dateFormat/pattern', '', 'medium'); + $temp += self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/dateFormats/dateFormatLength[@type=\'short\']/dateFormat/pattern', '', 'short'); + break; + + case 'time': + if (empty($value)) { + $value = "gregorian"; + } + $temp = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/timeFormats/timeFormatLength[@type=\'full\']/timeFormat/pattern', '', 'full'); + $temp += self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/timeFormats/timeFormatLength[@type=\'long\']/timeFormat/pattern', '', 'long'); + $temp += self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/timeFormats/timeFormatLength[@type=\'medium\']/timeFormat/pattern', '', 'medium'); + $temp += self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/timeFormats/timeFormatLength[@type=\'short\']/timeFormat/pattern', '', 'short'); + break; + + case 'datetime': + if (empty($value)) { + $value = "gregorian"; + } + $temp = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/dateTimeFormats/availableFormats/dateFormatItem', 'id'); + break; + + case 'field': + if (empty($value)) { + $value = "gregorian"; + } + $temp2 = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/fields/field', 'type'); + foreach ($temp2 as $key => $keyvalue) { + $temp += self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/fields/field[@type=\'' . $key . '\']/displayName', '', $key); + } + break; + + case 'relative': + if (empty($value)) { + $value = "gregorian"; + } + $temp = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/fields/field/relative', 'type'); + break; + + case 'symbols': + $temp = self::_getFile($locale, '/ldml/numbers/symbols/decimal', '', 'decimal'); + $temp += self::_getFile($locale, '/ldml/numbers/symbols/group', '', 'group'); + $temp += self::_getFile($locale, '/ldml/numbers/symbols/list', '', 'list'); + $temp += self::_getFile($locale, '/ldml/numbers/symbols/percentSign', '', 'percent'); + $temp += self::_getFile($locale, '/ldml/numbers/symbols/nativeZeroDigit', '', 'zero'); + $temp += self::_getFile($locale, '/ldml/numbers/symbols/patternDigit', '', 'pattern'); + $temp += self::_getFile($locale, '/ldml/numbers/symbols/plusSign', '', 'plus'); + $temp += self::_getFile($locale, '/ldml/numbers/symbols/minusSign', '', 'minus'); + $temp += self::_getFile($locale, '/ldml/numbers/symbols/exponential', '', 'exponent'); + $temp += self::_getFile($locale, '/ldml/numbers/symbols/perMille', '', 'mille'); + $temp += self::_getFile($locale, '/ldml/numbers/symbols/infinity', '', 'infinity'); + $temp += self::_getFile($locale, '/ldml/numbers/symbols/nan', '', 'nan'); + break; + + case 'nametocurrency': + $_temp = self::_getFile($locale, '/ldml/numbers/currencies/currency', 'type'); + foreach ($_temp as $key => $found) { + $temp += self::_getFile($locale, '/ldml/numbers/currencies/currency[@type=\'' . $key . '\']/displayName', '', $key); + } + break; + + case 'currencytoname': + $_temp = self::_getFile($locale, '/ldml/numbers/currencies/currency', 'type'); + foreach ($_temp as $key => $keyvalue) { + $val = self::_getFile($locale, '/ldml/numbers/currencies/currency[@type=\'' . $key . '\']/displayName', '', $key); + if (!isset($val[$key])) { + continue; + } + if (!isset($temp[$val[$key]])) { + $temp[$val[$key]] = $key; + } else { + $temp[$val[$key]] .= " " . $key; + } + } + break; + + case 'currencysymbol': + $_temp = self::_getFile($locale, '/ldml/numbers/currencies/currency', 'type'); + foreach ($_temp as $key => $found) { + $temp += self::_getFile($locale, '/ldml/numbers/currencies/currency[@type=\'' . $key . '\']/symbol', '', $key); + } + break; + + case 'question': + $temp = self::_getFile($locale, '/ldml/posix/messages/yesstr', '', 'yes'); + $temp += self::_getFile($locale, '/ldml/posix/messages/nostr', '', 'no'); + break; + + case 'currencyfraction': + $_temp = self::_getFile('supplementalData', '/supplementalData/currencyData/fractions/info', 'iso4217'); + foreach ($_temp as $key => $found) { + $temp += self::_getFile('supplementalData', '/supplementalData/currencyData/fractions/info[@iso4217=\'' . $key . '\']', 'digits', $key); + } + break; + + case 'currencyrounding': + $_temp = self::_getFile('supplementalData', '/supplementalData/currencyData/fractions/info', 'iso4217'); + foreach ($_temp as $key => $found) { + $temp += self::_getFile('supplementalData', '/supplementalData/currencyData/fractions/info[@iso4217=\'' . $key . '\']', 'rounding', $key); + } + break; + + case 'currencytoregion': + $_temp = self::_getFile('supplementalData', '/supplementalData/currencyData/region', 'iso3166'); + foreach ($_temp as $key => $keyvalue) { + $temp += self::_getFile('supplementalData', '/supplementalData/currencyData/region[@iso3166=\'' . $key . '\']/currency', 'iso4217', $key); + } + break; + + case 'regiontocurrency': + $_temp = self::_getFile('supplementalData', '/supplementalData/currencyData/region', 'iso3166'); + foreach ($_temp as $key => $keyvalue) { + $val = self::_getFile('supplementalData', '/supplementalData/currencyData/region[@iso3166=\'' . $key . '\']/currency', 'iso4217', $key); + if (!isset($val[$key])) { + continue; + } + if (!isset($temp[$val[$key]])) { + $temp[$val[$key]] = $key; + } else { + $temp[$val[$key]] .= " " . $key; + } + } + break; + + case 'regiontoterritory': + $_temp = self::_getFile('supplementalData', '/supplementalData/territoryContainment/group', 'type'); + foreach ($_temp as $key => $found) { + $temp += self::_getFile('supplementalData', '/supplementalData/territoryContainment/group[@type=\'' . $key . '\']', 'contains', $key); + } + break; + + case 'territorytoregion': + $_temp2 = self::_getFile('supplementalData', '/supplementalData/territoryContainment/group', 'type'); + $_temp = array(); + foreach ($_temp2 as $key => $found) { + $_temp += self::_getFile('supplementalData', '/supplementalData/territoryContainment/group[@type=\'' . $key . '\']', 'contains', $key); + } + foreach($_temp as $key => $found) { + $_temp3 = explode(" ", $found); + foreach($_temp3 as $found3) { + if (!isset($temp[$found3])) { + $temp[$found3] = (string) $key; + } else { + $temp[$found3] .= " " . $key; + } + } + } + break; + + case 'scripttolanguage': + $_temp = self::_getFile('supplementalData', '/supplementalData/languageData/language', 'type'); + foreach ($_temp as $key => $found) { + $temp += self::_getFile('supplementalData', '/supplementalData/languageData/language[@type=\'' . $key . '\']', 'scripts', $key); + if (empty($temp[$key])) { + unset($temp[$key]); + } + } + break; + + case 'languagetoscript': + $_temp2 = self::_getFile('supplementalData', '/supplementalData/languageData/language', 'type'); + $_temp = array(); + foreach ($_temp2 as $key => $found) { + $_temp += self::_getFile('supplementalData', '/supplementalData/languageData/language[@type=\'' . $key . '\']', 'scripts', $key); + } + foreach($_temp as $key => $found) { + $_temp3 = explode(" ", $found); + foreach($_temp3 as $found3) { + if (empty($found3)) { + continue; + } + if (!isset($temp[$found3])) { + $temp[$found3] = (string) $key; + } else { + $temp[$found3] .= " " . $key; + } + } + } + break; + + case 'territorytolanguage': + $_temp = self::_getFile('supplementalData', '/supplementalData/languageData/language', 'type'); + foreach ($_temp as $key => $found) { + $temp += self::_getFile('supplementalData', '/supplementalData/languageData/language[@type=\'' . $key . '\']', 'territories', $key); + if (empty($temp[$key])) { + unset($temp[$key]); + } + } + break; + + case 'languagetoterritory': + $_temp2 = self::_getFile('supplementalData', '/supplementalData/languageData/language', 'type'); + $_temp = array(); + foreach ($_temp2 as $key => $found) { + $_temp += self::_getFile('supplementalData', '/supplementalData/languageData/language[@type=\'' . $key . '\']', 'territories', $key); + } + foreach($_temp as $key => $found) { + $_temp3 = explode(" ", $found); + foreach($_temp3 as $found3) { + if (empty($found3)) { + continue; + } + if (!isset($temp[$found3])) { + $temp[$found3] = (string) $key; + } else { + $temp[$found3] .= " " . $key; + } + } + } + break; + + case 'timezonetowindows': + $_temp = self::_getFile('supplementalData', '/supplementalData/timezoneData/mapTimezones[@type=\'windows\']/mapZone', 'other'); + foreach ($_temp as $key => $found) { + $temp += self::_getFile('supplementalData', '/supplementalData/timezoneData/mapTimezones[@type=\'windows\']/mapZone[@other=\'' . $key . '\']', 'type', $key); + } + break; + + case 'windowstotimezone': + $_temp = self::_getFile('supplementalData', '/supplementalData/timezoneData/mapTimezones[@type=\'windows\']/mapZone', 'type'); + foreach ($_temp as $key => $found) { + $temp += self::_getFile('supplementalData', '/supplementalData/timezoneData/mapTimezones[@type=\'windows\']/mapZone[@type=\'' .$key . '\']', 'other', $key); + } + break; + + case 'territorytotimezone': + $_temp = self::_getFile('supplementalData', '/supplementalData/timezoneData/zoneFormatting/zoneItem', 'type'); + foreach ($_temp as $key => $found) { + $temp += self::_getFile('supplementalData', '/supplementalData/timezoneData/zoneFormatting/zoneItem[@type=\'' . $key . '\']', 'territory', $key); + } + break; + + case 'timezonetoterritory': + $_temp = self::_getFile('supplementalData', '/supplementalData/timezoneData/zoneFormatting/zoneItem', 'territory'); + foreach ($_temp as $key => $found) { + $temp += self::_getFile('supplementalData', '/supplementalData/timezoneData/zoneFormatting/zoneItem[@territory=\'' . $key . '\']', 'type', $key); + } + break; + + case 'citytotimezone': + $_temp = self::_getFile($locale, '/ldml/dates/timeZoneNames/zone', 'type'); + foreach($_temp as $key => $found) { + $temp += self::_getFile($locale, '/ldml/dates/timeZoneNames/zone[@type=\'' . $key . '\']/exemplarCity', '', $key); + } + break; + + case 'timezonetocity': + $_temp = self::_getFile($locale, '/ldml/dates/timeZoneNames/zone', 'type'); + $temp = array(); + foreach($_temp as $key => $found) { + $temp += self::_getFile($locale, '/ldml/dates/timeZoneNames/zone[@type=\'' . $key . '\']/exemplarCity', '', $key); + if (!empty($temp[$key])) { + $temp[$temp[$key]] = $key; + } + unset($temp[$key]); + } + break; + + default : + require_once 'Zend/Locale/Exception.php'; + throw new Zend_Locale_Exception("Unknown list ($path) for parsing locale data."); + break; + } + + if (isset(self::$_cache)) { + self::$_cache->save( serialize($temp), $id); + } + + return $temp; + } + + /** + * Read the LDML file, get a single path defined value + * + * @param string $locale + * @param string $path + * @param string $value + * @return string + * @access public + */ + public static function getContent($locale, $path, $value = false) + { + $locale = self::_checkLocale($locale); + + if (isset(self::$_cache)) { + $val = $value; + if (is_array($value)) { + $val = implode('_' , $value); + } + $val = urlencode($val); + $id = strtr('Zend_LocaleC_' . $locale . '_' . $path . '_' . $val, array('-' => '_', '%' => '_', '+' => '_')); + if ($result = self::$_cache->load($id)) { + return unserialize($result); + } + } + + switch(strtolower($path)) { + case 'language': + $temp = self::_getFile($locale, '/ldml/localeDisplayNames/languages/language[@type=\'' . $value . '\']', 'type'); + break; + + case 'script': + $temp = self::_getFile($locale, '/ldml/localeDisplayNames/scripts/script[@type=\'' . $value . '\']', 'type'); + break; + + case 'country': + case 'territory': + $temp = self::_getFile($locale, '/ldml/localeDisplayNames/territories/territory[@type=\'' . $value . '\']', 'type'); + break; + + case 'variant': + $temp = self::_getFile($locale, '/ldml/localeDisplayNames/variants/variant[@type=\'' . $value . '\']', 'type'); + break; + + case 'key': + $temp = self::_getFile($locale, '/ldml/localeDisplayNames/keys/key[@type=\'' . $value . '\']', 'type'); + break; + + case 'datechars': + $temp = self::_getFile($locale, '/ldml/dates/localizedPatternChars', '', 'chars'); + break; + + case 'defaultcalendar': + $temp = self::_getFile($locale, '/ldml/dates/calendars/default', 'choice', 'default'); + break; + + case 'monthcontext': + if (empty ($value)) { + $value = "gregorian"; + } + $temp = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/months/default', 'choice', 'context'); + break; + + case 'defaultmonth': + if (empty ($value)) { + $value = "gregorian"; + } + $temp = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/months/monthContext[@type=\'format\']/default', 'choice', 'default'); + break; + + case 'month': + if (!is_array($value)) { + $temp = $value; + $value = array("gregorian", "format", "wide", $temp); + } + $temp = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value[0] . '\']/months/monthContext[@type=\'' . $value[1] . '\']/monthWidth[@type=\'' . $value[2] . '\']/month[@type=\'' . $value[3] . '\']', 'type'); + break; + + case 'daycontext': + if (empty($value)) { + $value = "gregorian"; + } + $temp = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/days/default', 'choice', 'context'); + break; + + case 'defaultday': + if (empty($value)) { + $value = "gregorian"; + } + $temp = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/days/dayContext[@type=\'format\']/default', 'choice', 'default'); + break; + + case 'day': + if (!is_array($value)) { + $temp = $value; + $value = array("gregorian", "format", "wide", $temp); + } + $temp = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value[0] . '\']/days/dayContext[@type=\'' . $value[1] . '\']/dayWidth[@type=\'' . $value[2] . '\']/day[@type=\'' . $value[3] . '\']', 'type'); + break; + + case 'quarter': + if (!is_array($value)) { + $temp = $value; + $value = array("gregorian", "format", "wide", $temp); + } + $temp = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value[0] . '\']/quarters/quarterContext[@type=\'' . $value[1] . '\']/quarterWidth[@type=\'' . $value[2] . '\']/quarter[@type=\'' . $value[3] . '\']', 'type'); + break; + + case 'am': + if (empty($value)) { + $value = "gregorian"; + } + $temp = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/am', '', 'am'); + break; + + case 'pm': + if (empty($value)) { + $value = "gregorian"; + } + $temp = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/pm', '', 'pm'); + break; + + case 'era': + if (!is_array($value)) { + $temp = $value; + $value = array("gregorian", "Abbr", $temp); + } + $temp = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value[0] . '\']/eras/era' . $value[1] . '/era[@type=\'' . $value[2] . '\']', 'type'); + break; + + case 'defaultdate': + if (empty($value)) { + $value = "gregorian"; + } + $temp = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/dateFormats/default', 'choice', 'default'); + break; + + case 'date': + if (empty($value)) { + $value = array("gregorian", "medium"); + } + if (!is_array($value)) { + $temp = $value; + $value = array("gregorian", $temp); + } + $temp = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value[0] . '\']/dateFormats/dateFormatLength[@type=\'' . $value[1] . '\']/dateFormat/pattern', '', 'pattern'); + break; + + case 'defaulttime': + if (empty($value)) { + $value = "gregorian"; + } + $temp = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/timeFormats/default', 'choice', 'default'); + break; + + case 'time': + if (empty($value)) { + $value = array("gregorian", "medium"); + } + if (!is_array($value)) { + $temp = $value; + $value = array("gregorian", $temp); + } + $temp = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value[0] . '\']/timeFormats/timeFormatLength[@type=\'' . $value[1] . '\']/timeFormat/pattern', '', 'pattern'); + break; + + case 'datetime': + if (empty($value)) { + $value = "gregorian"; + } + $temp = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/dateTimeFormats/dateTimeFormatLength/dateTimeFormat/pattern', '', 'pattern'); + break; + + case 'field': + if (!is_array($value)) { + $temp = $value; + $value = array("gregorian", $temp); + } + $temp = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value[0] . '\']/fields/field[@type=\'' . $value[1] . '\']/displayName', '', $value[1]); + break; + + case 'relative': + if (!is_array($value)) { + $temp = $value; + $value = array("gregorian", $temp); + } + $temp = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value[0] . '\']/fields/field/relative[@type=\'' . $value[1] . '\']', '', $value[1]); + break; + + case 'decimalnumber': + $temp = self::_getFile($locale, '/ldml/numbers/decimalFormats/decimalFormatLength/decimalFormat/pattern', '', 'default'); + break; + + case 'scientificnumber': + $temp = self::_getFile($locale, '/ldml/numbers/scientificFormats/scientificFormatLength/scientificFormat/pattern', '', 'default'); + break; + + case 'percentnumber': + $temp = self::_getFile($locale, '/ldml/numbers/percentFormats/percentFormatLength/percentFormat/pattern', '', 'default'); + break; + + case 'currencynumber': + $temp = self::_getFile($locale, '/ldml/numbers/currencyFormats/currencyFormatLength/currencyFormat/pattern', '', 'default'); + break; + + case 'nametocurrency': + $temp = self::_getFile($locale, '/ldml/numbers/currencies/currency[@type=\'' . $value . '\']/displayName', '', $value); + break; + + case 'currencytoname': + $temp = self::_getFile($locale, '/ldml/numbers/currencies/currency[@type=\'' . $value . '\']/displayName', '', $value); + $_temp = self::_getFile($locale, '/ldml/numbers/currencies/currency', 'type'); + $temp = array(); + foreach ($_temp as $key => $keyvalue) { + $val = self::_getFile($locale, '/ldml/numbers/currencies/currency[@type=\'' . $key . '\']/displayName', '', $key); + if (!isset($val[$key]) or ($val[$key] != $value)) { + continue; + } + if (!isset($temp[$val[$key]])) { + $temp[$val[$key]] = $key; + } else { + $temp[$val[$key]] .= " " . $key; + } + } + break; + + case 'currencysymbol': + $temp = self::_getFile($locale, '/ldml/numbers/currencies/currency[@type=\'' . $value . '\']/symbol', '', $value); + break; + + case 'question': + $temp = self::_getFile($locale, '/ldml/posix/messages/' . $value . 'str', '', $value); + break; + + case 'currencyfraction': + if (empty($value)) { + $value = "DEFAULT"; + } + $temp = self::_getFile('supplementalData', '/supplementalData/currencyData/fractions/info[@iso4217=\'' . $value . '\']', 'digits', 'digits'); + break; + + case 'currencyrounding': + if (empty($value)) { + $value = "DEFAULT"; + } + $temp = self::_getFile('supplementalData', '/supplementalData/currencyData/fractions/info[@iso4217=\'' . $value . '\']', 'rounding', 'rounding'); + break; + + case 'currencytoregion': + $temp = self::_getFile('supplementalData', '/supplementalData/currencyData/region[@iso3166=\'' . $value . '\']/currency', 'iso4217', $value); + break; + + case 'regiontocurrency': + $_temp = self::_getFile('supplementalData', '/supplementalData/currencyData/region', 'iso3166'); + $temp = array(); + foreach ($_temp as $key => $keyvalue) { + $val = self::_getFile('supplementalData', '/supplementalData/currencyData/region[@iso3166=\'' . $key . '\']/currency', 'iso4217', $key); + if (!isset($val[$key]) or ($val[$key] != $value)) { + continue; + } + if (!isset($temp[$val[$key]])) { + $temp[$val[$key]] = $key; + } else { + $temp[$val[$key]] .= " " . $key; + } + } + break; + + case 'regiontoterritory': + $temp = self::_getFile('supplementalData', '/supplementalData/territoryContainment/group[@type=\'' . $value . '\']', 'contains', $value); + break; + + case 'territorytoregion': + $_temp2 = self::_getFile('supplementalData', '/supplementalData/territoryContainment/group', 'type'); + $_temp = array(); + foreach ($_temp2 as $key => $found) { + $_temp += self::_getFile('supplementalData', '/supplementalData/territoryContainment/group[@type=\'' . $key . '\']', 'contains', $key); + } + $temp = array(); + foreach($_temp as $key => $found) { + $_temp3 = explode(" ", $found); + foreach($_temp3 as $found3) { + if ($found3 !== $value) { + continue; + } + if (!isset($temp[$found3])) { + $temp[$found3] = (string) $key; + } else { + $temp[$found3] .= " " . $key; + } + } + } + break; + + case 'scripttolanguage': + $temp = self::_getFile('supplementalData', '/supplementalData/languageData/language[@type=\'' . $value . '\']', 'scripts', $value); + break; + + case 'languagetoscript': + $_temp2 = self::_getFile('supplementalData', '/supplementalData/languageData/language', 'type'); + $_temp = array(); + foreach ($_temp2 as $key => $found) { + $_temp += self::_getFile('supplementalData', '/supplementalData/languageData/language[@type=\'' . $key . '\']', 'scripts', $key); + } + $temp = array(); + foreach($_temp as $key => $found) { + $_temp3 = explode(" ", $found); + foreach($_temp3 as $found3) { + if ($found3 !== $value) { + continue; + } + if (!isset($temp[$found3])) { + $temp[$found3] = (string) $key; + } else { + $temp[$found3] .= " " . $key; + } + } + } + break; + + case 'territorytolanguage': + $temp = self::_getFile('supplementalData', '/supplementalData/languageData/language[@type=\'' . $value . '\']', 'territories', $value); + break; + + case 'languagetoterritory': + $_temp2 = self::_getFile('supplementalData', '/supplementalData/languageData/language', 'type'); + $_temp = array(); + foreach ($_temp2 as $key => $found) { + $_temp += self::_getFile('supplementalData', '/supplementalData/languageData/language[@type=\'' . $key . '\']', 'territories', $key); + } + $temp = array(); + foreach($_temp as $key => $found) { + $_temp3 = explode(" ", $found); + foreach($_temp3 as $found3) { + if ($found3 !== $value) { + continue; + } + if (!isset($temp[$found3])) { + $temp[$found3] = (string) $key; + } else { + $temp[$found3] .= " " . $key; + } + } + } + break; + + case 'timezonetowindows': + $temp = self::_getFile('supplementalData', '/supplementalData/timezoneData/mapTimezones[@type=\'windows\']/mapZone[@other=\''.$value.'\']', 'type', $value); + break; + + case 'windowstotimezone': + $temp = self::_getFile('supplementalData', '/supplementalData/timezoneData/mapTimezones[@type=\'windows\']/mapZone[@type=\''.$value.'\']', 'other', $value); + break; + + case 'territorytotimezone': + $temp = self::_getFile('supplementalData', '/supplementalData/timezoneData/zoneFormatting/zoneItem[@type=\'' . $value . '\']', 'territory', $value); + break; + + case 'timezonetoterritory': + $temp = self::_getFile('supplementalData', '/supplementalData/timezoneData/zoneFormatting/zoneItem[@territory=\'' . $value . '\']', 'type', $value); + break; + + case 'citytotimezone': + $temp = self::_getFile($locale, '/ldml/dates/timeZoneNames/zone[@type=\'' . $value . '\']/exemplarCity', '', $value); + break; + + case 'timezonetocity': + $_temp = self::_getFile($locale, '/ldml/dates/timeZoneNames/zone', 'type'); + $temp = array(); + foreach($_temp as $key => $found) { + $temp += self::_getFile($locale, '/ldml/dates/timeZoneNames/zone[@type=\'' . $key . '\']/exemplarCity', '', $key); + if (!empty($temp[$key])) { + if ($temp[$key] == $value) { + $temp[$temp[$key]] = $key; + } + } + unset($temp[$key]); + } + break; + + default : + require_once 'Zend/Locale/Exception.php'; + throw new Zend_Locale_Exception("Unknown detail ($path) for parsing locale data."); + break; + } + + if (is_array($temp)) { + $temp = current($temp); + } + if (isset(self::$_cache)) { + self::$_cache->save( serialize($temp), $id); + } + + return $temp; + } + + /** + * Returns the set cache + * + * @return Zend_Cache_Core The set cache + */ + public static function getCache() + { + return self::$_cache; + } + + /** + * Set a cache for Zend_Locale_Data + * + * @param Zend_Cache_Core $cache A cache frontend + */ + 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() + { + self::$_cache->clean(); + } +} diff --git a/libs/Zend/Locale/Data/Translation.php b/libs/Zend/Locale/Data/Translation.php new file mode 100644 index 0000000..fbc5f32 --- /dev/null +++ b/libs/Zend/Locale/Data/Translation.php @@ -0,0 +1,96 @@ + 'AU', + 'Austria' => 'AT', + 'Belgium' => 'BE', + 'Brazil' => 'BR', + 'Canada' => 'CA', + 'China' => 'CN', + 'Czech Republic' => 'CZ', + 'Denmark' => 'DK', + 'Finland' => 'FI', + 'France' => 'FR', + 'Germany' => 'DE', + 'Greece' => 'GR', + 'Hong Kong SAR' => 'HK', + 'Hungary' => 'HU', + 'Iceland' => 'IS', + 'Ireland' => 'IE', + 'Italy' => 'IT', + 'Japan' => 'JP', + 'Korea' => 'KP', + 'Mexiko' => 'MX', + 'The Netherlands' => 'NL', + 'New Zealand' => 'NZ', + 'Norway' => 'NO', + 'Poland' => 'PL', + 'Portugal' => 'PT', + 'Russia' => 'RU', + 'Singapore' => 'SG', + 'Slovakia' => 'SK', + 'Spain' => 'ES', + 'Sweden' => 'SE', + 'Taiwan' => 'TW', + 'Turkey' => 'TR', + 'United Kingdom' => 'GB', + 'United States' => 'US', + + 'Chinese' => 'zh', + 'Czech' => 'cs', + 'Danish' => 'da', + 'Dutch' => 'nl', + 'English' => 'en', + 'Finnish' => 'fi', + 'French' => 'fr', + 'German' => 'de', + 'Greek' => 'el', + 'Hungarian' => 'hu', + 'Icelandic' => 'is', + 'Italian' => 'it', + 'Japanese' => 'ja', + 'Korean' => 'ko', + 'Norwegian' => 'no', + 'Polish' => 'pl', + 'Portuguese' => 'pt', + 'Russian' => 'ru', + 'Slovak' => 'sk', + 'Spanish' => 'es', + 'Swedish' => 'sv', + 'Turkish' => 'tr' + ); +} diff --git a/libs/Zend/Locale/Data/aa.xml b/libs/Zend/Locale/Data/aa.xml new file mode 100644 index 0000000..81e931c --- /dev/null +++ b/libs/Zend/Locale/Data/aa.xml @@ -0,0 +1,260 @@ + + + + + + + + + + + Qafar + Arabic + German + English + Spanish + French + Hindi + Italian + Japanese + Portuguese + Russian + Chinese + + + + + + Brazil + China + Germany + Yabuuti + Eretria + Otobbia + France + United Kingdom + India + Italy + Japan + Russia + United States + + + + [a-z] + + + + + + + + Qun + Nah + Cig + Agd + Cax + Qas + Qad + Leq + Way + Dit + Xim + Kax + + + Qunxa Garablu + Kudo + Ciggilta Kudo + Agda Baxis + Caxah Alsa + Qasa Dirri + Qado Dirri + Liiqen + Waysu + Diteli + Ximoli + Kaxxa Garablu + + + + + Q + N + C + A + C + Q + Q + L + W + D + X + K + + + + + + + Aca + Etl + Tal + Arb + Kam + Gum + Sab + + + Acaada + Etleeni + Talaata + Arbaqa + Kamiisi + Gumqata + Sabti + + + + + A + E + T + A + K + G + S + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + saaku + carra + + + Yaasuusuk Duma + Yaasuusuk Wadir + + + + + + EEEE, MMMM dd, yyyy + + + + + dd MMMM yyyy + + + + + dd-MMM-yyyy + + + + + dd/MM/yy + + + + + + + h:mm:ss a v + + + + + h:mm:ss a z + + + + + h:mm:ss a + + + + + h:mm a + + + + + + + {1} {0} + + + + Q yy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + + + ¤#,##0.00 + + + + + + Brazilian Real + + + Chinese Yuan Renminbi + + + FD + + + Nfk + + + Br + + + Euro + + + British Pound Sterling + + + Indian Rupee + + + Japanese Yen + + + Russian Ruble + + + US Dollar + + + + diff --git a/libs/Zend/Locale/Data/aa_DJ.xml b/libs/Zend/Locale/Data/aa_DJ.xml new file mode 100644 index 0000000..7d357a8 --- /dev/null +++ b/libs/Zend/Locale/Data/aa_DJ.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + Naharsi Kudo + Agda Baxisso + Leqeeni + + + + + + + + + + $ + + + ETB + + + + diff --git a/libs/Zend/Locale/Data/aa_ER.xml b/libs/Zend/Locale/Data/aa_ER.xml new file mode 100644 index 0000000..af4965e --- /dev/null +++ b/libs/Zend/Locale/Data/aa_ER.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + $ + + + ETB + + + + diff --git a/libs/Zend/Locale/Data/aa_ET.xml b/libs/Zend/Locale/Data/aa_ET.xml new file mode 100644 index 0000000..70d50e0 --- /dev/null +++ b/libs/Zend/Locale/Data/aa_ET.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/af.xml b/libs/Zend/Locale/Data/af.xml new file mode 100644 index 0000000..9218e95 --- /dev/null +++ b/libs/Zend/Locale/Data/af.xml @@ -0,0 +1,827 @@ + + + + + + + + + + + Afrikaans + Ander Afro-Asiaties + Amharies + Arabies + Aramees + Ander Kunsmatig + Assamees + Aserbeidjaans + Ander Balties + Wit-Russies + Berbers + Bulgaars + Bihari + Bengaals + Bantoe + Bretons + Bosnies + Katalaans + Ander Kelties + Cherokees + Kopties + Tsjeggies + Kerkslawies + Wallies + Deens + Duits + Antieke Egipties + Grieks + Engels + Esperanto + Spaans + Latyns-Amerikaanse Spaans + Estnies + Baskies + Persies + Fins + Filippyns + Fidjiaans + Faroëes + Frans + Fries + Iers + Skots-Gaelies + Ander Germaans + Galicies + Guarani + Goties + Antieke Grieks + Gujarati + Manx + Hebreeus + Hindi + Hetities + Kroaties + Hongaars + Armeens + Interlingua + Indonesies + Interlingue + Ander Indo-Europees + Yslands + Italiaans + Japannees + Javaans + Georgies + Ander Khoi-San + Khmer + Kannada + Koreaans + kru + Koerdies + Kornies + Kirgisies + Latyn + Limburgs + Lingala + Laotanees + Litaus + Letties + Masai + Malgassies + Macedonies + Malabaars + Mongalees + Mahratti + Maleisies + Maltees + Veelvuldige tale + Birmaans + Noord-Ndebele + Nepalees + Nederlands + Vlaams + Noorweegse Nynorsk + Noors + Suid-Ndebele + Sepedi + Occitaans + Oria + Pandjabi + Fenisies + Pools + Pasjtoe + Portugees + Brasiliaanse Portugees + Roemeens + Russies + Sanskrit + Skots + Sindhi + Ander Semities + Gebaretaal + Serwo-Kroaties + Singalees + Slowaaks + Sloweens + Ander Slawies + Shona + Somalies + Albanees + Serwies + Swazi + Suid-Sotho + Soedanees + Sweeds + Swahili + Tamil + Telugees + Thais + Tigrinya + Turkmeens + Klingon + Tswana + Turks + Tsonga + Twi + Uighoers + Oekraïens + Onbepaald + Oerdoe + Oesbekies + Venda + Viëtnamees + Xhosa + Jiddisj + Sjinees + Vereenvoudigde Sjinees + Tradisionele Sjinees + Zoeloe + + + + + + + + + + + + + + + + + + + + + + + + + + + Wêreld + Afrika + Suid-Amerika + Oseanië + Wes-Afrika + Sentraal-Amerika + Oos-Afrika + Noord-Afrika + Midde-Afrika + Suider-Afrika + Amerikas + Noord-Amerika + Karibies + Oos-Asië + Suid-Asië + Suidoos-Asië + Suid-Europa + Australië en Nieu-Seeland + Melanesië + Polinesië + Asië + Sentraal-Asië + Wes-Asië + Europa + Oos-Europa + Noord-Europa + Wes-Europa + Statebond + Andorra + Verenigde Arabiese Emirate + Afganistan + Antigua en Barbuda + Albanië + Armenië + Nederlands-Antille + Angola + Antarktika + Argentinië + Amerikaans Samoa + Oostenryk + Australië + Aserbeidjan + Bosnië en Herzegowina + Bangladesj + België + Boerkina Fasso + Bulgarye + Bahrein + Benin + Broenei + Bolivië + Brasilië + Bahamas + Bhoetan + Botswana + Wit-Rusland + Kanada + Sentraal-Afrikaanse Republiek + Kongo + Switserland + Ivoorkus + Chili + Kameroen + Sjina + Costa Rica + Serwië en Montenegro + Kuba + Kaap Verde + Ciprus + Tjeggiese Republiek + Duitsland + Djiboeti + Denemarke + Dominikaanse Republiek + Algerië + Estland + Egipte + Wes-Sahara + Spanje + Ethiopië + Finland + Fidji + Falklandeilande + Mikronesië + Faroëreilande + Frankryk + Gaboen + Groot-Brittanje + Georgië + Frans-Guyana + Ghana + Groenland + Gambië + Guinee + Ekwatoriaal-Guinee + Griekeland + Guinee-Bissau + Hongkong + Kroasië + Haïti + Hongarye + Indonesië + Ierland + Israel + Indië + Irak + Iran + Ysland + Italië + Jamaika + Jordanië + Japan + Kenia + Kirgisië + Kambodja + Comore + Saint Kitts en Nevis + Noord-Korea + Suid-Korea + Koeweit + Kaaimanseilande + Kasakstan + Laos + Libanon + Liechtenstein + Sri Lanka + Liberië + Lesotho + Litaue + Luxemburg + Letland + Libië + Marokko + Monaco + Madagaskar + Marshall-eilande + Macedonië + Mali + Mongolië + Macao + Mouritanië + Malta + Mauritius + Maldive + Meksiko + Maleisië + Mosambiek + Namibië + Nieu-Kaledonië + Niger + Nigerië + Nicaragua + Nederland + Noorweë + Naoeroe + Nieu-Seeland + Oman + Panama + Peru + Papoea Nieu-Guinee + Filippyne + Pakistan + Pole + Puerto Rico + Portugal + Paraguay + Katar + Réunion + Roemenië + Rusland + Rwanda + Saoedi-Arabië + Solomon Eilande + Seychelle + Soedan + Swede + Singapoer + Slowenië + Slowakye + Sierra Leone + San Marino + Senegal + Somalië + Suriname + Sao Tome en Principe + Salvador + Sirië + Swaziland + Tsjaad + Thailand + Tadjikistan + Turkmenië + Tunisië + Tonga + Turkye + Trinidad en Tobago + Taiwan + Tanzanië + Oekraine + Uganda + Verenigde State van Amerika + Oesbekistan + Vatikaan + Saint Vincent en die Grenadine + Venezuela + Viëtnam + Samoa + Jemen + Suid-Afrika + Zambië + Zimbabwe + + + Tradisionele Duitse ortografie + Duitse ortografie van 1996 + Hersiene ortografie + + + Kalender + Vergelyking + Geldeenheid + + + Tradisionele Sjinees (Groot5) + Sjinese kalender + Vereenvoudigde Sjinees + Gregoriaanse kalender + Hebreeuse kalender + Islamitiese kalender + Japannese kalender + Telefoongidsvolgorde + Tradisioneel + + + VSA + Metriek + + + Taal: {0} + Skrif: {0} + Omgewing: {0} + + + + [a á â b-e é è ê ë f-i î ï j-o ô ö p-u û v-z ʼn] + [à å-ç ñ ø œ ß] + [a-z] + + + + + + + + + + + + + + Jan + Feb + Mar + Apr + Mei + Jun + Jul + Aug + Sep + Okt + Nov + Des + + + Januarie + Februarie + Maart + April + Mei + Junie + Julie + Augustus + September + Oktober + November + Desember + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + So + Ma + Di + Wo + Do + Vr + Sa + + + Sondag + Maandag + Dinsdag + Woensdag + Donderdag + Vrydag + Saterdag + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + K1 + K2 + K3 + K4 + + + 1ste kwartaal + 2de kwartaal + 3de kwartaal + 4de kwartaal + + + + vm. + nm. + + + voor Christus + na Christus + + + v.C. + n.C. + + + + + + EEEE dd MMMM yyyy + + + + + dd MMMM yyyy + + + + + dd MMM yyyy + + + + + yyyy/MM/dd + + + + + + + h:mm:ss a v + + + + + h:mm:ss a z + + + + + h:mm:ss a + + + + + h:mm a + + + + + + + {1} {0} + + + + d MMMM + dd MMMM + MM/dd + Q yy + yyyy/MM + MMMM yyyy + + + {0} - {1} + + M-M + + + E, MM-dd - E, MM-dd + E, MM-dd - E, MM-dd + + + MMM-MMM + + + E, MMM d - E, MMM d + E, MMM d - E, MMM d + + + MMM d - MMM d + MMM d-d + + + MM-dd - MM-dd + MM-dd - MM-dd + + + d-d + + + HH-HH + + + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH-HH v + + + y-y + + + yyyy-MM - yyyy-MM + yyyy-MM - yyyy-MM + + + E, yyyy-MM-dd - E, yyyy-MM-dd + E, yyyy-MM-dd - E, yyyy-MM-dd + E, yyyy-MM-dd - E, yyyy-MM-dd + + + yyyy MMM-MMM + yyyy MMM - yyyy MMM + + + E, yyyy MMM dd - E, yyyy MMM dd + E, yyyy MMM dd - E, yyyy MMM dd + E, yyyy MMM dd - E, yyyy MMM dd + + + yyyy MMM d - MMM d + yyyy MMM d-d + yyyy MMM d - yyyy MMM d + + + yyyy-MM-dd - yyyy-MM-dd + yyyy-MM-dd - yyyy-MM-dd + yyyy-MM-dd - yyyy-MM-dd + + + + + + Tydperk + + + Jaar + + + Maand + + + Week + + + Dag + + + Dag van die week + + + Uur + + + Minuut + + + Sekonde + + + Tydsone + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + Suidpool + + + Bagrein + + + Sjanghai + + + Mexikostad + + + Lissabon + + + Moskou + + + + + + , +   + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + ¤#,##0.00 + + + + + + Reaal + + + Switserse frank + + + Joean + + + Euro + + + Britse pond + + + Italiaanse lier + + + Japannese jen + + + Namibiese dollar + + + Roebel + + + Ou Turkse lier + + + Turkse lier + + + Amerikaanse dollar + + + Onbekende of ongeldige geldeenheid + + + Rand + R + + + + + + ja:j + nee:n + + + diff --git a/libs/Zend/Locale/Data/af_NA.xml b/libs/Zend/Locale/Data/af_NA.xml new file mode 100644 index 0000000..9570414 --- /dev/null +++ b/libs/Zend/Locale/Data/af_NA.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + EEEE d MMMM yyyy + + + + + d MMMM yyyy + + + + + d MMM yyyy + + + + + yyyy-MM-dd + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + MM-dd + yyyy-MM + + + + + + + + + + ¤ #,##0.00 + + + + + + diff --git a/libs/Zend/Locale/Data/af_ZA.xml b/libs/Zend/Locale/Data/af_ZA.xml new file mode 100644 index 0000000..e923648 --- /dev/null +++ b/libs/Zend/Locale/Data/af_ZA.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/ak.xml b/libs/Zend/Locale/Data/ak.xml new file mode 100644 index 0000000..8d1f20d --- /dev/null +++ b/libs/Zend/Locale/Data/ak.xml @@ -0,0 +1,195 @@ + + + + + + + + + + [a b d e ɛ f-i k-o ɔ p r-u w y] + [c j q v z] + + + + + + + + S-Ɔ + K-Ɔ + E-Ɔ + E-O + E-K + O-A + A-K + D-Ɔ + F-Ɛ + Ɔ-A + Ɔ-O + M-Ɔ + + + Sanda-Ɔpɛpɔn + Kwakwar-Ɔgyefuo + Ebɔw-Ɔbenem + Ebɔbira-Oforisuo + Esusow Aketseaba-Kɔtɔnimba + Obirade-Ayɛwohomumu + Ayɛwoho-Kitawonsa + Difuu-Ɔsandaa + Fankwa-Ɛbɔ + Ɔbɛsɛ-Ahinime + Ɔberɛfɛw-Obubuo + Mumu-Ɔpɛnimba + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + Kwe + Dwo + Ben + Wuk + Yaw + Fia + Mem + + + Kwesida + Dwowda + Benada + Wukuda + Yawda + Fida + Memeneda + + + + + K + D + B + W + Y + F + M + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + AN + EW + + + Ansa Kristo + Kristo Ekyiri + + + AK + KE + + + + + + EEEE, yyyy MMMM dd + + + + + yyyy MMMM d + + + + + yyyy MMM d + + + + + yy/MM/dd + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1} {0} + + + + Q yy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + + Sidi + GH¢ + + + + diff --git a/libs/Zend/Locale/Data/ak_GH.xml b/libs/Zend/Locale/Data/ak_GH.xml new file mode 100644 index 0000000..7f08f43 --- /dev/null +++ b/libs/Zend/Locale/Data/ak_GH.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/am.xml b/libs/Zend/Locale/Data/am.xml new file mode 100644 index 0000000..17935a5 --- /dev/null +++ b/libs/Zend/Locale/Data/am.xml @@ -0,0 +1,1416 @@ + + + + + + + + + + + አፋርኛ + አብሐዚኛ + አፍሪካንስኛ + አማርኛ + ዐርቢኛ + አሳሜዛዊ + አያማርኛ + አዜርባይጃንኛ + ባስኪርኛ + ቤላራሻኛ + ቡልጋሪኛ + ቢሃሪ + ቢስላምኛ + በንጋሊኛ + ትበትንኛ + ብሬቶንኛ + ቦስኒያንኛ + ብሊን + ካታላንኛ + ኮርሲካኛ + ቼክኛ + ወልሽ + ዴኒሽ + ጀርመን + ድዞንግኻኛ + ግሪክኛ + እንግሊዝኛ + ኤስፐራንቶ + ስፓኒሽ + ኤስቶኒአን + ባስክኛ + ፐርሲያኛ + ፊኒሽ + ፊሊፕንኛ + ፊጂኛ + ፋሮኛ + ፈረንሳይኛ + ፍሪስኛ + አይሪሽ + እስኮትስ ጌልክኛ + ግዕዝኛ + ጋለጋኛ + ጓራኒኛ + ጉጃርቲኛ + ሃውሳኛ + ዕብራስጥ + ሐንድኛ + ክሮሽያንኛ + ሀንጋሪኛ + አርመናዊ + ኢንቴርሊንጓ + እንዶኒሲኛ + እንተርሊንግወ + እኑፒያቅኛ + አይስላንድኛ + ጣሊያንኛ + እኑክቲቱትኛ + ጃፓንኛ + ጃቫንኛ + ጊዮርጊያን + ካዛክኛ + ካላሊሱትኛ + ክመርኛ + ካናዳኛ + ኮሪያኛ + ካሽሚርኛ + ኩርድሽኛ + ኪርጊዝኛ + ላቲንኛ + ሊንጋላኛ + ላውስኛ + ሊቱአኒያን + ላትቪያን + ማላጋስኛ + ማዮሪኛ + ማከዶኒኛ + ማላያላምኛ + ሞንጎላዊኛ + ሞልዳቫዊና + ማራዚኛ + ማላይኛ + ማልቲስኛ + ቡርማኛ + ናኡሩ + ኔፓሊኛ + ደች + የኖርዌ አዲሱ ኖርዌጅያንኛ + ኖርዌጂያን + ኦኪታንኛ + ኦሮምኛ + ኦሪያኛ + ፓንጃቢኛ + ፖሊሽ + ፑሽቶኛ + ፖርቱጋሊኛ + ፖርቱጋሊኛ (የብራዚል) + ፖርቱጋሊኛ (የፖርቱጋል) + ኵቿኛ + ሮማንስ + ሩንዲኛ + ሮማኒያን + ራሽኛ + ኪንያርዋንድኛ + ሳንስክሪትኛ + ሲንድሂኛ + ሳንጎኛ + ሰርቦ-ክሮኤሽያኛ + ስንሃልኛ + ሲዳምኛ + ስሎቫክኛ + ስሎቪኛ + ሳሞአኛ + ሾናኛ + ሱማልኛ + ልቤኒኛ + ሰርቢኛ + ስዋቲኛ + ሶዞኛ + ሱዳንኛ + ስዊድንኛ + ስዋሂሊኛ + ታሚልኛ + ተሉጉኛ + ታጂኪኛ + ታይኛ + ትግርኛ + ትግረ + ቱርክመንኛ + ታጋሎገኛ + ክሊንግኦንኛ + ጽዋናዊኛ + ቶንጋ + ቱርክኛ + ጾንጋኛ + ታታርኛ + ትዊኛ + ኡዊግሁርኛ + ዩክረኒኛ + ያልተወሰነ + ኡርዱኛ + ኡዝበክኛ + ቪትናምኛ + ቮላፑክኛ + ዎሎፍኛ + ዞሳኛ + ይዲሻዊኛ + ዮሩባዊኛ + ዡዋንግኛ + ቻይንኛ + ዙሉኛ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ዓለም + አፍሪካ + ደቡባዊ አሜሪካ + ኦሽኒያ + ምዕራባዊ አፍሪካ + መካከለኛ አሜሪካ [013] + ምስራቃዊ አፍሪካ + ሰሜናዊ አፍሪካ + መካከለኛ አፍሪካ + ደቡባዊ አፍሪካ + አሜሪካዎች + ሰሜናዊ አሜሪካ + ካሪቢያን + ደቡብ-ምሥራቃዊ እስያ [030] + ምሥራቃዊ እስያ + ደቡብ-ምሥራቃዊ እስያ [035] + ደቡባዊ አውሮፓ + አውስትራሊያ እና ኒው ዚላንድ + ሜላኔሲያ + ሚክሮኔዢያ [057] + ፖሊኔዢያ + እስያ + መካከለኛ አሜሪካ [143] + ምዕራባዊ እስያ + አውሮፓ + ምስራቃዊ አውሮፓ + ሰሜናዊ አውሮፓ + ምዕራባዊ አውሮፓ + አንዶራ + የተባበሩት አረብ ኤምሬትስ + አፍጋኒስታን + አንቲጓ እና ባሩዳ + አንጉኢላ + አልባኒያ + አርሜኒያ + ኔዘርላንድስ አንቲልስ + አንጐላ + አንታርክቲካ + አርጀንቲና + የአሜሪካ ሳሞአ + ኦስትሪያ + አውስትሬሊያ + አሩባ + የአላንድ ደሴቶች + አዘርባጃን + ቦስኒያ እና ሄርዞጎቪኒያ + ባርቤዶስ + ባንግላዲሽ + ቤልጄም + ቡርኪና ፋሶ + ቡልጌሪያ + ባህሬን + ብሩንዲ + ቤኒን + ቤርሙዳ + ብሩኒ + ቦሊቪያ + ብራዚል + ባሃማስ + ቡህታን + የቦውቬት ደሴት + ቦትስዋና + ቤላሩስ + ቤሊዘ + ካናዳ + ኮኮስ ኬሊንግ ደሴቶች + ኮንጎ + የመካከለኛው አፍሪካ ሪፐብሊክ + ኮንጐ + ስዊዘርላንድ + ኮት ዲቯር + ኩክ ደሴቶች + ቺሊ + ካሜሩን + ቻይና + ኮሎምቢያ + ኮስታ ሪካ + ሰርቢያ + ኩባ + ኬፕ ቬርዴ + የገና ደሴቶች + ሳይፕረስ + ቼክ ሪፑብሊክ + ጀርመን + ጂቡቲ + ዴንማርክ + ዶሚኒካ + ዶሚኒክ ሪፑብሊክ + አልጄሪያ + ኢኳዶር + ኤስቶኒያ + ግብጽ + ምዕራባዊ ሳህራ + ኤርትራ + ስፔን + ኢትዮጵያ + ፊንላንድ + ፊጂ + የፎልክላንድ ደሴቶች + ሚክሮኔዢያ + የፋሮይ ደሴቶች + ፈረንሳይ + ጋቦን + እንግሊዝ + ግሬናዳ + ጆርጂያ + የፈረንሳይ ጉዊአና + ጋና + ጊብራልታር + ግሪንላንድ + ጋምቢያ + ጊኒ + ጉዋደሉፕ + ኢኳቶሪያል ጊኒ + ግሪክ + ደቡብ ጆርጂያ እና የደቡድ ሳንድዊች ደሴቶች + ጉዋቲማላ + ጉዋም + ቢሳዎ + ጉያና + ሆንግ ኮንግ + የኧርድ እና የማክዶናልድ ደሴቶች + ሆንዱራስ + ክሮኤሽያ + ሀይቲ + ሀንጋሪ + ኢንዶኔዢያ + አየርላንድ + እስራኤል + ህንድ + የብሪታኒያ ህንድ ውቂያኖስ ግዛት + ኢራቅ + ኢራን + አይስላንድ + ጣሊያን + ጃማይካ + ጆርዳን + ጃፓን + ኬንያ + ካምቦዲያ + ኪሪባቲ + ኮሞሮስ + ቅዱስ ኪትስ እና ኔቪስ + ሰሜን ኮሪያ + ደቡብ ኮሪያ + ክዌት + ካይማን ደሴቶች + ላኦስ + ሊባኖስ + ሴንት ሉቺያ + ሊችተንስታይን + ሲሪላንካ + ላይቤሪያ + ሌሶቶ + ሊቱዌኒያ + ሉክሰምበርግ + ላትቪያ + ሊቢያ + ሞሮኮ + ሞናኮ + ሞልዶቫ + ማዳጋስካር + ማርሻል አይላንድ + ማከዶኒያ + ማሊ + ማያንማር + ሞንጎሊያ + ማካዎ + የሰሜናዊ ማሪያና ደሴቶች + ማርቲኒክ + ሞሪቴኒያ + ሞንትሴራት + ማልታ + ማሩሸስ + ማልዲቭስ + ማላዊ + ሜክሲኮ + ማሌዢያ + ሞዛምቢክ + ናሚቢያ + ኒው ካሌዶኒያ + ኒጀር + ኖርፎልክ ደሴት + ናይጄሪያ + ኒካራጓ + ኔዘርላንድ + ኖርዌ + ኔፓል + ናኡሩ + ኒኡይ + ኒው ዚላንድ + ኦማን + ፓናማ + ፔሩ + የፈረንሳይ ፖሊኔዢያ + ፓፑዋ ኒው ጊኒ + ፊሊፒንስ + ፓኪስታን + ፖላንድ + ቅዱስ ፒዬር እና ሚኩኤሎን + ፒትካኢርን + ፖርታ ሪኮ + የፍልስጤም ግዛት + ፖርቱጋል + ፓላው + ፓራጓይ + ኳታር + ወጣ ያለ ኦሽኒያ + ሪዩኒየን + ሮሜኒያ + ራሺያ + ሩዋንዳ + ሳውድአረቢያ + ሰሎሞን ደሴት + ሲሼልስ + ሱዳን + ስዊድን + ሲንጋፖር + ሴንት ሄለና + ስሎቬኒያ + የስቫልባርድ እና ዣን ማየን ደሴቶች + ስሎቫኪያ + ሴራሊዮን + ሳን ማሪኖ + ሴኔጋል + ሱማሌ + ሱሪናም + ሳኦ ቶሜ እና ፕሪንሲፔ + ኤል ሳልቫዶር + ሲሪያ + ሱዋዚላንድ + የቱርኮችና የካኢኮስ ደሴቶች + ቻድ + የፈረንሳይ ደቡባዊ ግዛቶች + ቶጐ + ታይላንድ + ታጃኪስታን + ቶክላው + ምስራቅ ቲሞር + ቱርክሜኒስታን + ቱኒዚያ + ቶንጋ + ቱርክ + ትሪኒዳድ እና ቶባጎ + ቱቫሉ + ታይዋን + ታንዛኒያ + ዩክሬን + ዩጋንዳ + የአሜሪካ ራቅ ያሉ አናሳ ደሴቶች + አሜሪካ + ኡራጓይ + ዩዝበኪስታን + ቫቲካን + ቅዱስ ቪንሴንት እና ግሬናዲንስ + ቬንዙዌላ + የእንግሊዝ ድንግል ደሴቶች + የአሜሪካ ቨርጂን ደሴቶች + ቬትናም + ቫኑአቱ + ዋሊስ እና ፉቱና ደሴቶች + ሳሞአ + የመን + ሜይኦቴ + ደቡብ አፍሪካ + ዛምቢያ + ዚምቧቤ + + + የቀን መቁጠሪያ + የጽሑፎች ንፅፅር + ገንዘብ + + + የቻይና ባህላዊ ቅደም ተከተል (Big5) + የቡድሐ የቀን መቁጠሪያ + የቻይና የቀን መቁጠሪያ + ቀጥታ የቃላት ንፅፅር + የቀለል ያለ ቻይንኛ (GB2312) ቅደም ተከተል + የግሪጐሪ የቀን መቁጠሪያ + የእብራይስጥ የቀን መቁጠሪያ + የእስላም የቀን መቁጠሪያ + የእስላም ሕዝባዊ የቀን መቁጠሪያ + የጃፓን የቀን መቁጠሪያ + የስልክ ማውጫ ቅደም ተከተል + የፒንዪን ቅደም ተከተል + የጭረት/የመቀቢያ ቅደም ተከተል + ባህላዊ ቅደም ተከተል + + + ሜትሪክ + + + + [፟ ሀ-ሆ ለ-ቆ ቈ ቊ-ቍ በ-ኆ ኈ ኊ-ኍ ነ-ኮ ኰ ኲ-ኵ ኸ-ኾ ወ-ዎ ዐ-ዖ ዘ-ዷ ጀ-ጎ ጐ ጒ-ጕ ጠ-ፚ] + [᎐-᎙ ሇ ⶀ ᎀ-ᎃ ⶁ-ⶄ ቇ ቐ-ቖ ቘ ቚ-ቝ ᎄ-ᎇ ⶅ-ⶇ ኇ ⶈ-ⶊ ኯ ዀ ዂ-ዅ ዏ ⶋ ⶌ ዸ-ዿ ⶍ ⶎ ጏ ጘ-ጟ ⶓ-ⶖ ⶏ-ⶑ ᎈ-ᎏ ⶒ ⶠ-ⶦ ⶨ-ⶮ ⶰ-ⶶ ⶸ-ⶾ ⷀ-ⷆ ⷈ-ⷎ ⷐ-ⷖ ⷘ-ⷞ] + + + « + » + + + + + + + + + ዓ/ዓ + ዓ/ም + + + + + + + + መስከ + ጥቅም + ኅዳር + ታኅሣ + ጥር + የካቲ + መጋቢ + ሚያዝ + ግንቦ + ሰኔ + ሐምሌ + ነሐሴ + ጳጉሜ + + + መስከረም + ጥቅምት + ኅዳር + ታኅሣሥ + ጥር + የካቲት + መጋቢት + ሚያዝያ + ግንቦት + ሰኔ + ሐምሌ + ነሐሴ + ጳጉሜን + + + + + + + + + ጃንዩ + ፌብሩ + ማርች + ኤፕረ + ሜይ + ጁን + ጁላይ + ኦገስ + ሴፕቴ + ኦክተ + ኖቬም + ዲሴም + + + ጃንዩወሪ + ፌብሩወሪ + ማርች + ኤፕረል + ሜይ + ጁን + ጁላይ + ኦገስት + ሴፕቴምበር + ኦክተውበር + ኖቬምበር + ዲሴምበር + + + + + + + + + + + + + + + + + + + + + + + እሑድ + ሰኞ + ማክሰ + ረቡዕ + ሐሙስ + ዓርብ + ቅዳሜ + + + እሑድ + ሰኞ + ማክሰኞ + ረቡዕ + ሐሙስ + ዓርብ + ቅዳሜ + + + + + + + + + + + + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + ጡዋት + ከሳዓት + + + ዓ/ዓ + ዓ/ም + + + + + + EEEE፣ dd MMMM ቀን yyyy G + + + + + dd MMMM yyyy + + + + + MMM d yyyy + + + + + dd/MM/yy + + + + + + + hh:mm:ss a v + + + + + hh:mm:ss a z + + + + + h:mm:ss a + + + + + h:mm a + + + + + + + {1} {0} + + + + MMMM d + dd MMMM + dd/MM + MM/yy + Q yy + MMMM yyyy + + + {0} - {1} + + M-M + + + E, MM-dd - E, MM-dd + E, MM-dd - E, MM-dd + + + MMM-MMM + + + E, MMM d - E, MMM d + E, MMM d - E, MMM d + + + MMM d - MMM d + MMM d-d + + + MM-dd - MM-dd + MM-dd - MM-dd + + + d-d + + + HH-HH + + + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH-HH v + + + y-y + + + yyyy-MM - yyyy-MM + yyyy-MM - yyyy-MM + + + E, yyyy-MM-dd - E, yyyy-MM-dd + E, yyyy-MM-dd - E, yyyy-MM-dd + E, yyyy-MM-dd - E, yyyy-MM-dd + + + yyyy MMM-MMM + yyyy MMM - yyyy MMM + + + E, yyyy MMM dd - E, yyyy MMM dd + E, yyyy MMM dd - E, yyyy MMM dd + E, yyyy MMM dd - E, yyyy MMM dd + + + yyyy MMM d - MMM d + yyyy MMM d-d + yyyy MMM d - yyyy MMM d + + + yyyy-MM-dd - yyyy-MM-dd + yyyy-MM-dd - yyyy-MM-dd + yyyy-MM-dd - yyyy-MM-dd + + + + + + ዘመን + + + ዓመት + + + ወር + + + ሳምንት + + + ቀን + + + ሰዓት + + + ደቂቃ + + + + + + + + ሙሀረም + ሳፈር + ረቢዑል አወል + ረቢዑል አኺር + ጀማደል አወል + ጀማደል አኺር + ረጀብ + ሻእባን + ረመዳን + ሸዋል + ዙልቂዳህ + ዙልሂጃህ + + + + + + + +HHmm;-HHmm + GMT{0} + {0} + + ሮተራ + + + ፓልመር + + + South_Pole + + + ስዮዋ + + + ማውሰን + + + ዴቪስ + + + ቮስቱክ + + + ቼሲ + + + ዱሞንትዱርቪል + + + ማክሙርዶ + + + Rio_Gallegos + + + ሜንዶዛ + + + San_Juan + + + La_Rioja + + + ካታማርካ + + + ጁጁይ + + + ኮርዶባ + + + ቡኤኖስ-ኤይሪስ + + + ፕርዝ + + + ዳርዊን + + + አዴላኢደ + + + ብሮከን ሂል + + + ሜልቦኡመ + + + ሆባርት + + + ሊንደማን + + + ሲድኒ + + + ቢሪስባን + + + ሎርድ ሆዌ + + + ኢሩኔፕ + + + ሪኦ ብራንኮ + + + ፖርቶ ቨልሆ + + + ቦአ ቪስታ + + + ማናኡስ + + + ኩባ + + + Campo_Grande + + + በለም + + + አራጉአኢና + + + ሳኦ ፓውሎ + + + America/Bahia + + + ፎርታለዛ + + + ማቺዎ + + + ሪሲፋይ + + + ኖሮሃ + + + ዳውሰን + + + ሁዋይትሆርስ + + + ኢኑቪክ + + + ቫንኩቨር + + + ዳውሰን ክሪክ + + + የሎውናይፍ + + + ኤድመንተን + + + ስዊፍት ከረንት + + + ካምብሪጅ ቤይ + + + ሬጂና + + + ዊኒፔግ + + + ሬኒ ሪቨር + + + ራንኪን ኢንሌት + + + ተንደር ቤይ + + + ኒፒጎን + + + ቶሮንቶ + + + ሞንትሪያል + + + ኢካሊኡት + + + ፓንግኒርቱንግ + + + ሀሊፋክስ + + + ጉዝ ቤይ + + + ግሌስ ቤይ + + + ሴንት ጆንስ + + + ኪንሻሳ + + + ሉቡምባሺ + + + ኢስተር + + + ሳንቲያጎ + + + ካሽጋር + + + ኡሩምኪ + + + ቾንግኪንግ + + + ሻንጋይ + + + ባርቢን + + + ጋላፓጎስ + + + ጓያኪል + + + ካናሪ + + + ኬውታ + + + ማርድሪድ + + + ትሩክ + + + ፖኔፕ + + + ኮስራይ + + + ሎንዶን + + + ቱለ + + + ጐድታኽብ + + + ስኮረስቢሱንድ + + + ዴንማርክ + + + ጃካርታ + + + ፖንቲአንካ + + + ማካሳር + + + ጃያፑራ + + + እንደርቡርይ + + + ኪሪቲማቲ + + + ታራዋ + + + አክታው + + + ኦራል + + + አክቶቤ + + + ኪዝያሎርዳ + + + አልማቲ + + + ክዋጃላይን + + + ማጁሮ + + + ባማኮ + + + ሆቭድ + + + ኡላንባታር + + + ቾይባልሳን + + + ቲጁአና + + + ሄርሞሲሎ + + + ማዛቲአን + + + ቺኽዋኽዋ + + + ሞንተሪ + + + ሜክሲኮ ሲቲ + + + ሜሪዳ + + + ካንኩን + + + ኳላልምፑር + + + ኩቺንግ + + + ቻትሃም + + + ኦክላንድ + + + ታሂቲ + + + ማሩኩሳስ + + + ጋምባየር + + + አዞረስ + + + ማዴኢራ + + + ሊስቦን + + + ካሊኒንጋርድ + + + ማስኮ + + + ሳማራ + + + የካተሪንበርግ + + + ኦምስክ + + + ኖቮሲቢርስክ + + + ክራስኖያሽክ + + + ኢርኩትስክ + + + ያኩትስክ + + + ቭላዲቮስቱክ + + + ሳክሃሊን + + + ማጋዳን + + + ካምቻትካ + + + አናዲር + + + ኡዝጎሩድ + + + ካይቭ + + + ሲምፈሮፖል + + + ዛፖሮዝሂይ + + + ሚድዌ + + + ጆንስቶን + + + ዌክ + + + አዳክ + + + ኖሜ + + + ሆኖሉሉ + + + አንኮራጅ + + + ያኩታት + + + ጁነአኡ + + + ሎስ አንጀለስ + + + ቦይስ + + + ፎኔክስ + + + ዴንቨር + + + መካከል + + + ቺካጐ + + + መኖሚኔ + + + ክኖክስ + + + ማሬንጎ + + + ኢንዲያናፖሊስ + + + ሉዊስቪለ + + + ቬቫይ + + + ሞንቲሴሎ + + + ዲትሮይት + + + ኒውዮርክ + + + ሳማርካንድ + + + ታሽኬንት + + + + + + . + , + + + + + #,##0.00 ¤ + + + + + + የብራዚል ሪል + + + የቻይና ዩአን ረንሚንቢ + Y + + + የኢትዮጵያ ብር + ብር + + + ዩሮ + + + የእንግሊዝ ፓውንድ ስተርሊንግ + + + የሕንድ ሩፒ + + + የጃፓን የን + + + የራሻ ሩብል + + + የአሜሪካን ዶላር + USD + + + + + + አዎን:y + አይ:n + + + diff --git a/libs/Zend/Locale/Data/am_ET.xml b/libs/Zend/Locale/Data/am_ET.xml new file mode 100644 index 0000000..acb8a9e --- /dev/null +++ b/libs/Zend/Locale/Data/am_ET.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/ar.xml b/libs/Zend/Locale/Data/ar.xml new file mode 100644 index 0000000..15b55f8 --- /dev/null +++ b/libs/Zend/Locale/Data/ar.xml @@ -0,0 +1,3107 @@ + + + + + + + + + + + {0} ({1}) + ، + + + الأفارية + الأبخازية + الأتشينيزية + الأكولية + الأدانجمية + الأديجه + الأفستية + الأفريقية + لغة أفرو آسيوية + الأفريهيلية + الآينوية + الأكانية + الأكادية + الأليوتية + اللغات الأمريكية الهندية + الألطائية الجنوبية + الأمهرية + الأراجونية + الانجليزية القديمة + الأنجيكا + اللغات الأباتشية + العربية + الآرامية + الأروكانية + الأراباهو + الصناعية - أخرى + الأراواكية + الأسامية + الأسترية + اللغات الأزباسكانية + اللغات الأسترالية + الأفاريكية + الأوادية + الأيمارا + الأذرية + الباشكيرية + الباندا + اللغات الباميليكية + البلوشية + اللغة البالية + الباسا + البلطيقية - أخرى + البيلوروسية + البيجا + البيمبا + البربرية + البلغارية + البيهارية + البهوجبرية + البيسلامية + البيكولية + البينية + السيكسيكية + البامبارا + البنغالية + البانتو + التبتية + البريتونية + البراجية + البوسنية + الباتاكية + البرياتية + البجينيزية + البلينية + الكاتالوينية + الكادو + الهندية الأمريكية الوسطى - أخرى + الكاريبية + القوقازية - أخرى + الأتسام + الشيشانية + السيبيونو + السلتية - أخرى + التشامورو + التشيبشا + التشاجاتاى + التشكيزية + الماري + الشينوك جارجون + الشوكتو + الشيباوايان + الشيروكى + الشايان + اللغات التشاميكية + الكورسيكية + قبطية + الكرييولى و اللغات المبسطة الأخرى للتفاهم بين الشعوب على أساس الأنجليزية + الكرييولى و اللغات المبسطة الأخرى للتفاهم بين الشعوب على أساس الفرنسية + الكرييولى و اللغات المبسطة الأخرى للتفاهم بين الشعوب على أساس البرتغالية + الكرى + تركى كريمين، لغة توركية كريمينية + الكرييولى و اللغات المبسطة الأخرى للتفاهم بين الشعوب - أخرى + التشيكية + الكاشبايان + سلافية كنسية + الكشيتيك - أخرى + التشفاش + الولزية + الدانماركية + الداكوتا + الدارجوا + الدياك + الألمانية + الألمانية النمساوية + الألمانية العليا السويسرية + الديلوير + السلافية + الدوجريب + الدنكا + الدوجرى + الدرافيدين - أخرى + الصربية السفلى + الديولا + الهولندية الوسطى + المالديفية + الدايلا + الزونخاية + الايوي + الافيك + المصرية القديمة + الاكاجك + اليونانية + الامايت + الانجليزية + الانجليزية الأسترالية + الإنجليزية الكندية + الانجليزية البريطانية + إنجليزية الولايات المتحدة + الانجليزية الوسطى + اسبرانتو + الأسبانية + أسبانية أمريكا اللاتينية + الأسبانية الأيبيرية + الأستونية + لغة الباسك + الايوندو + الفارسية + الفانج + الفانتى + الفلة + الفنلندية + الفلبينية + فينو أجرايان - أخرى + الفيجية + الفارويز + الفون + الفرنسية + الفرنسية الكندية + الفرنسية السويسرية + الفرنسية الوسطى + الفرنسية القديمة + الفريزينية الشمالية + الفريزينية الشرقية + الفريلايان + الفريزيان + الأيرلندية + الجا + الجايو + الجبيا + الغيلية الأسكتلندية + الجرمانية (أخرى) + الجيز + لغة أهل جبل طارق + الجاليكية + الألمانية العليا الوسطى + الجوارانى + الألمانية العليا القديمة + الجندى + الجورونتالو + القوطية + الجريبو + اليونانية القديمة + الألمانية السويسرية + الغوجاراتية + المنكية + الهوسا + الهيدا + لغة أهل الهاواى + العبرية + الهندية + الهيليجينون + الهيماتشالى + الحثية + الهمونجية + الهيرى موتو + الكرواتية + الصربية العليا + الهايتية + الهنغارية + الهبا + الأرمينية + الهيريرو + اللّغة الوسيطة + الايبان + الأندونيسية + الانترلينج + الايجبو + السيتشيون يى + الايجو + الاينبياك + الايلوكو + الهندية - أخرى + الهندية الأوروبية - أخرى + الانجوشية + الايدو + الايرانية + اللغات الايروكويانية + الأيسلاندية + الايطالية + الاينكتيتت + اليابانية + اللوجبان + الجيدو الفارسى + الجيدو العربى + الجاوية + الجورجية + الكارا-كالباك + القبيلية + الكاتشين + الجو + الكامبا + الكاريين + الكوى + الكاباردايان + الكورو + الكونغو + الكازية + الخويسان - أخرى + الخوتانيز + الكيكيو + الكيونياما + الكازاخستانية + الكالاليست + الخميرية + الكيمبندو + الكانادا + الكورية + الكونكانية + الكوسراين + الكبيل + الكانيورى + الكاراتشاى-بالكار + الكريلية + الكرو + الكاشميرية + الكردية + الكميك + الكتيناى + الكومى + الكورنية + القيرغستانية + اللاتينية + الاسباعبرية + اللاهندا + اللامبا + اللوكسمبرجية + الليزجهايانية + الجاندا + الليمبرجيشية + اللينجالا + اللاوية + منغولى + اللوزى + اللتوانية + اللبا-كاتانجا + اللبا-لؤلؤ + اللوسينو + اللوندا + اللو + اللشاى + اللاتفية + المادريز + الماجا + المايثيلي + الماكاسار + الماندينغ + الأوسترونيسيان + الماساي + الموكشا + الماندار + الميند + المالاجاشية + الأيرلندية الوسطى + المارشالية + الماورية + الميكماكيونية + المينانجكاباو + اللغات المتنوعة + المقدونية + المون خمير- أخرى + الماليالام + المنغولية + المانشو + المانيبرى + لغات مانوبو + المولدوفية + الموهوك + الموسي + الماراثى + لغة الملايو + المالطية + اللغات المتعددة + لغات المندا + الكريك + الميرانديز + الماروارى + البورمية + لغات المايا + اللغة الارزية + النورو + الناهيوتل + الهندية الأمريكية الشمالية - أخرى + اللغة النابولية + البوكمالية النرويجية + النديبيل الشمالى + الألمانية السفلى + النيبالية + النيوارى + الندونجا + النياس + النيجر - كوردوفانايان + النيوي + الهولندية + النينورسك النرويجي + النرويجية + النوجاى + النورس القديم + انكو + النديبيل الجنوبى + السوتو الشمالية + اللغات النوبية + النافاجو + النوارية التقليدية + النيانجا، التشيتشوا، التشوا + النيامويزى + النيانكول + النيورو + النزيما + الأوكيتانية + الأوجيبوا + الأورومو + الأورييا + الأوسيتيك + الأوساج + التركية العثمانية + اللغات الأوتومية + البنجابية + الغينية - أخرى + البانجاسينان + البهلوية + البامبانجا + البابيامينتو + البالوان + الفارسية القديمة + الفليبينية - أخرى + الفينيقية + البالية + البولندية + البوهنبيايان + اللغات البراقريطية + البروفانسية القديمة + البشتونية + البرتغالية + البرتغالية البرازيلية + البرتغالية الأيبيرية + الكويتشوا + الراجاسثانية + الرابانى + الراروتونجانى + الرهايتو-رومانس + الرندى + الرومانية + الرومانسية - أخرى + الرومانية [rom] + الجذر + الروسية + الأرومانيان + الكينيارواندا + السنسكريتية + السانداوى + الياكت + الهندية الأمريكية الجنوبية - أخرى + لغات ساليشان + الآرامية السومارية + الساساك + السانتالى + السردينية + الصقلية + الأسكتلندية + السيندى + السامي الشمالى + السيلكب + السامية - أخرى + السانجو + الأيرلندية القديمة + لغات الأشارة + الشانية + السريلانكية + السيدامو + لغات السيويون + الصينية التيبتية - أخرى + السلوفاكية + السلوفانية + السلافية - أخرى + الساموائية + السامي الجنوبى + اللغات السامية - أخرى + اللول سامى + الاينارى سامى + السكولت سامى + الشونا + السونينك + الصومالية + السوجدين + السونجهاى + الألبانية + الصربية + السرانان تونجو + السرر + السواتى + النيلية الصحراوية - أخرى + السوتو الجنوبية + السودانية + السوكوما + السوسو + السومارية + السويدية + السواحلية + سريانية تقليدية + السريانية + التاميلية + تاى - أخرى + التيلجو + التيمن + التيرينو + التيتم + الطاجيكية + التايلاندية + التيجرينيا + التيجر + التيف + التركمانية + التوكيلاو + التاغالوغية + الكلينجون + التلينغيتية + التاماشيك + التسوانية + تونجا - جزر تونجا + تونجا - نياسا + التوك بيسين + التركية + السونجا + التسيمشيان + التتارية + التامبوكا + اللغات التوبية + الألطائية - أخرى + التوفالو + التوى + التاهيتية + الأدمرت + الأغورية + اليجاريتيك + الأوكرانية + الأمبندو + غير محدده + الأردية + الاوزباكية + الفاى + الفيندا + الفيتنامية + الفوتيك + الولونية + لغات الواكاشان + الوالامو + الواراى + الواشو + اللغات الصربية + الولوف + الكالميك + الياو + اليابيز + اليديشية + اليوروبية + اللغات اليوبيكية + الزهيونج + الزابوتيك + الزيناجا + الصينية + الصينية المبسطة + الصينية التقليدية + الزاند + الزولو + الزونية + بدون محتوى لغوي + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + العالم + افريقيا + أمريكا الشمالية + أمريكا الجنوبية + أوقيانوسيا + غرب افريقيا + أمريكا الوسطى + شرق افريقيا + شمال افريقيا + وسط افريقيا + جنوب افريقيا + الأمريكتين + شمال أمريكا + الكاريبي + شرق آسيا + جنوب آسيا + جنوب شرق آسيا + جنوب أوروبا + أستراليا ونيوزيلندا + ميلانيزيا + الجزر الميكرونيزية + بولينيزيا + جنوب وسط آسيا + آسيا + وسط آسيا + غرب آسيا + أوروبا + شرق أوروبا + شمال أوروبا + غرب أوروبا + كومنولث الدول المستقلة + أمريكا اللاتينية و الكاريبي + أندورا + الامارات العربية المتحدة + أفغانستان + أنتيجوا وبربودا + أنجويلا + ألبانيا + أرمينيا + جزر الأنتيل الهولندية + أنجولا + القطب الجنوبي + الأرجنتين + ساموا الأمريكية + النمسا + أستراليا + آروبا + جزر أولان + أذربيجان + البوسنة والهرسك + بربادوس + بنجلاديش + بلجيكا + بوركينا فاسو + بلغاريا + البحرين + بوروندي + بنين + برمودا + بروناي + بوليفيا + البرازيل + الباهاما + بوتان + جزيرة بوفيه + بتسوانا + روسيا البيضاء + بليز + كندا + جزر كوكوس + جمهورية الكونغو الديمقراطية + جمهورية افريقيا الوسطى + الكونغو - برازافيل + سويسرا + ساحل العاج + جزر كوك + شيلي + الكاميرون + الصين + كولومبيا + كوستاريكا + صربيا والجبل الأسود + كوبا + الرأس الأخضر + جزيرة الكريسماس + قبرص + جمهورية التشيك + ألمانيا + جيبوتي + الدانمرك + دومينيكا + جمهورية الدومينيك + الجزائر + الاكوادور + استونيا + مصر + الصحراء الغربية + اريتريا + أسبانيا + اثيوبيا + فنلندا + فيجي + جزر فوكلاند + ميكرونيزيا + جزر فارو + فرنسا + الجابون + المملكة المتحدة + جرينادا + جورجيا + غويانا + غانا + جبل طارق + جرينلاند + غامبيا + غينيا + جوادلوب + غينيا الاستوائية + اليونان + جورجيا الجنوبية وجزر ساندويتش الجنوبية + جواتيمالا + جوام + غينيا بيساو + غيانا + هونج كونج + جزيرة هيرد وماكدونالد + هندوراس + كرواتيا + هايتي + المجر + اندونيسيا + أيرلاندا + اسرائيل + جزيرة مان + الهند + المحيط الهندي البريطاني + العراق + ايران + أيسلندا + ايطاليا + جيرسي + جامايكا + الأردن + اليابان + كينيا + قرغيزستان + كمبوديا + كيريباتي + جزر القمر + سانت كيتس ونيفيس + كوريا الشمالية + كوريا الجنوبية + الكويت + جزر الكايمن + كازاخستان + لاوس + لبنان + سانت لوسيا + ليختنشتاين + سريلانكا + ليبيريا + ليسوتو + ليتوانيا + لوكسمبورج + لاتفيا + ليبيا + المغرب + موناكو + مولدافيا + الجبل الأسود + سانت مارتين + مدغشقر + جزر المارشال + مقدونيا + مالي + ميانمار + منغوليا + ماكاو + جزر ماريانا الشمالية + مارتينيك + موريتانيا + مونتسرات + مالطا + موريشيوس + جزر الملديف + ملاوي + المكسيك + ماليزيا + موزمبيق + ناميبيا + كاليدونيا الجديدة + النيجر + جزيرة نورفوك + نيجيريا + نيكاراجوا + هولندا + النرويج + نيبال + نورو + نيوي + نيوزيلاندا + عمان + بنما + بيرو + بولينيزيا الفرنسية + بابوا غينيا الجديدة + الفيلبين + باكستان + بولندا + سانت بيير وميكولون + بتكايرن + بورتوريكو + فلسطين + البرتغال + بالاو + باراجواي + قطر + أوقيانوسيا النائية + الاتحاد الاوروبي + روينيون + رومانيا + صربيا + روسيا + رواندا + المملكة العربية السعودية + جزر سليمان + سيشل + السودان + السويد + سنغافورة + سانت هيلنا + سلوفينيا + سفالبارد وجان مايان + سلوفاكيا + سيراليون + سان مارينو + السنغال + الصومال + سورينام + ساو تومي وبرينسيبي + السلفادور + سوريا + سوازيلاند + جزر الترك وجايكوس + تشاد + المقاطعات الجنوبية الفرنسية + توجو + تايلند + طاجكستان + توكيلو + تيمور الشرقية + تركمانستان + تونس + تونجا + تركيا + ترينيداد وتوباغو + توفالو + تايوان + تانزانيا + أوكرانيا + أوغندا + جزر الولايات المتحدة البعيدة الصغيرة + الولايات المتحدة الأمريكية + أورجواي + أوزبكستان + الفاتيكان + سانت فنسنت وغرنادين + فنزويلا + جزر فرجين البريطانية + جزر فرجين الأمريكية + فيتنام + فانواتو + جزر والس وفوتونا + ساموا + اليمن + مايوت + جمهورية جنوب افريقيا + زامبيا + زيمبابوي + منطقة غير معرفة + + + الكتابة الألمانية التقليدية + الكتابة الألمانية لعام 1996 + ارمنية شرقية + ارمنية غربية + الأبجدية التركية اللاتينية الموحدة + أحادي النغمة + لهجة ناتيسون + متعدد النغمات + كمبيوتر + كتابة تم مراجعتها + بلنسية + + + التقويم + الترتيب + العملات + + + الترتيب الصيني التقليدي - Big5 + التقويم البوذي + التقويم الصيني + ترتيب مباشر + الترتيب الصيني المبسط - GB2312 + التقويم الميلادي + التقويم العبري + التقويم الهجري + تقويم اسلامي مدني + التقويم الياباني + ترتيب دليل الهاتف + تقليدي + + + النظام الأمريكي + النظام المتري + + + اللغة: {0} + نظام الكتابة: {0} + المنطقة: {0} + + + + + + + [ً-ْ ـ ء-غ ف-ي] + [\u200C \u200D] + [a-z] + + + + + + + + + GanjkHmsSEDFwWxhKzAeugXZvcL + + + + + التقويم البوذي + + + + + + M‏/d‏‏/yyyy + + + + + + + + + توت + بابه + هاتور + كيهك + طوبة + أمشير + برمهات + برمودة + بشنس + بؤونة + أبيب + مسرى + نسيئ + + + توت + بابه + هاتور + كيهك + طوبة + أمشير + برمهات + برمودة + بشنس + بؤونة + أبيب + مسرى + نسيئ + + + + + + + + + مسكريم + تكمت + هدار + تهساس + تر + يكتت + مجابيت + ميازيا + جنبت + سين + هامل + نهاس + باجمن + + + مسكريم + تكمت + هدار + تهساس + تر + يكتت + مجابيت + ميازيا + جنبت + سين + هامل + نهاس + باجمن + + + + + + + + + يناير + فبراير + مارس + أبريل + مايو + يونيو + يوليو + أغسطس + سبتمبر + أكتوبر + نوفمبر + ديسمبر + + + يناير + فبراير + مارس + أبريل + مايو + يونيو + يوليو + أغسطس + سبتمبر + أكتوبر + نوفمبر + ديسمبر + + + + + ي + ف + م + أ + و + ن + ل + غ + س + ك + ب + د + + + + + + + ح + ن + ث + ر + خ + ج + س + + + الأحد + الاثنين + الثلاثاء + الأربعاء + الخميس + الجمعة + السبت + + + + + أحد + اثنين + ثلاثاء + أربعاء + خميس + جمعة + سبت + + + ح + ن + ث + ر + خ + ج + س + + + + + + + الربع الأول + الربع الثاني + الربع الثالث + الربع الرابع + + + الربع الأول + الربع الثاني + الربع الثالث + الربع الرابع + + + + + ١ + ٢ + ٣ + ٤ + + + + ص + م + + + قبل الميلاد + ميلادي + + + ق.م + م + + + + + + EEEE، d MMMM، yyyy + + + + + d MMMM، yyyy + + + + + dd‏/MM‏/yyyy + + + + + d‏/M‏/yyyy + + + + + + + v h:mm:ss a + + + + + z h:mm:ss a + + + + + h:mm:ss a + + + + + h:mm a + + + + + + + {1} {0} + + + + H:mm + L + E، d-M + LLL + E d MMM + E d MMMM + d MMMM + d MMM + dd‏/MM + d/M + d + mm:ss + yyyy + M/yyyy + EEE، d/M/yyyy + MMM yyyy + EEE، d MMM yyyy + MMMM yyyy + yyyy Q + yyyy QQQ + Q yy + MM‏/yyyy + MMMM, yyyy + + + {0} – {1} + + M-M + + + E, d‏/M - E, d‏/M + E, d‏/M - E, d‏/M + + + MMM-MMM + + + E, d MMM - E, d MMM + E, d - E, d MMM + + + d MMM - d MMM + d-d MMM + + + d‏/M - d‏/M + d‏/M - d‏/M + + + d-d + + + h a - h a + h–h a + + + h:mm a - h:mm a + h:mm–h:mm a + h:mm–h:mm a + + + v h:mm a - h:mm a + v h:mm–h:mm a + v h:mm–h:mm a + + + v h a - h a + v h–h a + + + y-y + + + M‏/yyyy - M‏/yyyy + M‏/yyyy - M‏/yyyy + + + E, d‏/M‏/yyyy - E, d‏/M‏/yyyy + E, d‏/M‏/yyyy - E, d‏/M‏/yyyy + E, d‏/M‏/yyyy - E, d‏/M‏/yyyy + + + MMM-MMM, yyyy + MMM, yyyy - MMM, yyyy + + + E, d MMM - E, d MMM, yyyy + E, d - E, d MMM, yyyy + E, d MMM, yyyy - E, d MMM, yyyy + + + d MMM - d MMM, yyyy + d-d MMM, yyyy + d MMM, yyyy - d MMM, yyyy + + + d‏/M‏/yyyy - d‏/M‏/yyyy + d‏/M‏/yyyy - d‏/M‏/yyyy + d‏/M‏/yyyy - d‏/M‏/yyyy + + + + + + العصر + + + السنة + + + الشهر + + + الأسبوع + + + يوم + اليوم + غدا + بعد الغد + أمس + + + اليوم + + + ص/م + + + الساعات + + + الدقائق + + + الثواني + + + التوقيت + + + + + + + + تشري + مرحشوان + كيسلو + طيفت + شباط + آذار الأول + آذار الثاني + نيسان + أيار + سيفان + تموز + آب + أيلول + + + تشري + مرحشوان + كيسلو + طيفت + شباط + آذار الأول + آذار الثاني + نيسان + أيار + سيفان + تموز + آب + + + + + + + + + محرم + صفر + ربيع الأول + ربيع الآخر + جمادى الأولى + جمادى الآخرة + رجب + شعبان + رمضان + شوال + ذو القعدة + ذو الحجة + + + + ص + م + + + ه‍ + + + + + + + + + + + + + + + تيكا + هاكتشي + هاكهو + شتشو + تيهو + كيين + وادو + رييكي + يورو + جينكي + تمبيو + تمبيو-كامبو + تمبيو-شوهو + تمبيو-هوجي + تمفو-جينجو + جينجو-كيين + هوكي + تن-أو + إنرياكو + ديدو + كونين + تنتشو + شووا + كاجو + نينجو + سيكو + تنان + جوجان + جينكيي + نينا + كامبيو + شوتاي + انجي + انتشو + شوهيي + تنجيو + تنرياكو + تنتوكو + أووا + كوهو + آنا + تينروكو + تن-ان + جوجن + تنجن + إيكان + كانا + اي-ان + ايسو + شورياكو + تشوتوكو + تشوهو + كانكو + تشووا + كانين + جاين + مانجو + تشوجين + تشورياكو + تشوكيو + كانتوكو + ايشو + تينجي + كوهيي + جيرياكو + انكيو + شوهو + شورياكو + ايهو + أوتوكو + كانجي + كاهو + ايتشو + شوتوكو + كووا + تشوجي + كاشو + تنين + تن-اي + ايكيو + جن-اي + هوان + تنجي + ديجي + تنشو + تشوشو + هوين + ايجي + كوجي + تنيو + كيوان + نينبيي + كيوجو + هجين + هيجي + ايرياكو + أوهو + تشوكان + ايمان + نين-ان + كاو + شون + أنجين + جيشو + يووا + جيي + جنريوكو + بنجي + كنكيو + شوجي + كنين + جنكيو + كن-اي + شوجن + كنرياكو + كنبو + شوكيو + جو + جيننين + كروكو + أنتيي + كنكي + جويي + تمبكو + بنرياكو + كاتيي + رياكنين + ان-أو + نينجي + كنجين + هوجي + كنتشو + كوجن + شوكا + شوجن + بن-أو + كوتشو + بن-اي + كنجي + كوان + شوو + اينين + شوان + كنجن + كجن + توكجي + انكي + أوتشو + شووا + بنبو + جنو + جنكيو + شوتشو + كريكي + جنتكو + جنكو + كمو + إنجن + كوككو + شوهي + كنتكو + بنتشو + تنجو + كورياكو + كووا + جنتشو + مييتكو + كاكي + كو + مييتكو + أويي + شوتشو + ايكيو + ككيتسو + بن-أن + هوتكو + كيوتكو + كوشو + تشوركو + كنشو + بنشو + أونين + بنمي + تشوكيو + انتكو + ميو + بنكي + ايشو + تييي + كيوركو + تنمن + كوجي + ايركو + جنكي + تنشو + بنركو + كيتشو + جنوا + كان-اي + شوهو + كيان + شوو + ميرياكو + منجي + كنبن + انبو + تنوا + جوكيو + جنركو + هويي + شوتكو + كيوهو + جنبن + كنبو + انكيو + كان-ان + هورياكو + مييوا + ان-اي + تنمي + كنسي + كيووا + بنكا + بنسي + تنبو + كوكا + كاي + أنسي + من-ان + بنكيو + جنجي + كيو + ميجي + تيشو + شووا + هيسي + + + + + + + + فرفردن + أذربيهشت + خرداد + تار + مرداد + شهرفار + مهر + آيان + آذر + دي + بهمن + اسفندار + + + فرفردن + أذربيهشت + خرداد + تار + مرداد + شهرفار + مهر + آيان + آذر + دي + بهمن + اسفندار + + + + + + ه‍.ش + + + + + + +HH:mm;-HH:mm + {0} + + غير معروف + + + روثيرا + + + بالمير + + + القطب الجنوبي + + + سايووا + + + ماوسون + + + دافيز + + + فوستوك + + + كاساي + + + دي مونت دو روفيل + + + ماك موردو + + + ريو جالييوس + + + ميندوزا + + + سان خوان + + + أشوا + + + لاريوها + + + سان لويس + + + كاتاماركا + + + جوجو + + + تاكمان + + + كوردوبا + + + بوينوس أيرس + + + برثا + + + دارون + + + أدليادا + + + بروكن هيل + + + ميلبورن + + + هوبارت + + + ليندمان + + + سيدني + + + برسيبان + + + لورد هاو + + + ايرونبي + + + ريوبرانكو + + + بورتو فيلو + + + باو فيستا + + + ماناوس + + + كيابا + + + كومبو جراند + + + بلم + + + أروجوانيا + + + ساو باولو + + + باهيا + + + فورتاليزا + + + ماشيو + + + ريسيف + + + نوروناه + + + داوسان + + + وايت هورس + + + اينوفيك + + + فانكوفر + + + داوسن كريك + + + يلونيف + + + ايدمونتون + + + سوفت كارنت + + + كامبرديج باي + + + ريجينا + + + وينيبيج + + + راني ريفر + + + رانكن انلت + + + كورال هاربر + + + ثندر باي + + + نيبيجون + + + تورونتو + + + مونتريال + + + اكويلت + + + بانجينتينج + + + وينكتون + + + هاليفاكس + + + جوس باي + + + جلاس باي + + + سانت جونز + + + كينشاسا + + + لومبباشا + + + استر + + + سانتيجو + + + كاشجار + + + أرومكي + + + تشونجكينج + + + العالمية + + + هاربين + + + جلاباجوس + + + جواياكيل + + + كناري + + + سيتا + + + مدريد + + + ترك + + + باناب + + + كوسرا + + + لندن + + + جيرونسى + + + ثيل + + + جودثاب + + + سكورسبيسند + + + دانمرك شافن + + + جاكرتا + + + بونتيانك + + + ماكسار + + + جايابيورا + + + إيطاليا + + + جيرسى + + + اندربيرج + + + كيريتي ماتي + + + تاراوا + + + أكتاو + + + أورال + + + أكتوب + + + كيزيلوردا + + + ألماتي + + + الجبل الأسود + + + كواجالين + + + ماجورو + + + باماكو + + + هوفد + + + آلانباتار + + + تشوبالسان + + + تيخوانا + + + هيرموسيلو + + + مازاتلان + + + تشيواوا + + + مونتيري + + + مدينة المكسيك + + + ميريدا + + + كانكون + + + كوالالمبور + + + كيشينج + + + تشاثام + + + أوكلاند + + + تاهيتي + + + ماركيساس + + + جامبير + + + أزورس + + + ماديرا + + + ليسبون + + + صربيا + + + كالينجراد + + + موسكو + + + فولوجراد + + + سمراء + + + يكاترنبيرج + + + أومسك + + + نوفوسبيرسك + + + كراسنويارسك + + + ايركيتسك + + + ياكتسك + + + فلاديفوستك + + + سكالين + + + مجادن + + + كامتشاتكا + + + أندير + + + لونجيربن + + + أوزجرود + + + كييف + + + سيمفروبول + + + زابوروزي + + + ميدواي + + + جونستون + + + واك + + + أداك + + + نوم + + + هونولولو + + + أنكوريج + + + ياكوتات + + + جوني + + + لوس انجلوس + + + بويزي + + + فينكس + + + شيبروك + + + دنفر + + + نيو ساليم + + + سنتر + + + شيكاغو + + + مينوميني + + + فينسينس + + + بيترسبرج + + + كونكس + + + ويناماك + + + مارنجو + + + إنديانابوليس + + + لويس فيل + + + فيفاي + + + مونتيسيلو + + + ديترويت + + + نيويورك + + + سمرقند + + + طشقند + + + + + + ٫ + ٬ + ؛ + ٪ + ٠ + اس + ليس رقم + + + + + #,##0.###;#,##0.###- + + + + + + + ¤ #,##0.00;¤ #,##0.00- + + + {0} {1} + {0} {1} + {0} {1} + {0} {1} + {0} {1} + {0} {1} + + + + بيستا أندورى + + + درهم اماراتى + د.إ.‏ + + + أفغاني - 1927-2002 + + + أفغانى + + + ليك ألباني + + + درام أرمينى + + + جلدر هولندى [ANG] + + + كوانزا أنجولى + + + كوانزا أنجولى - 1977-1990 + + + كوانزا أنجولى جديدة - 1990-2000 + + + كوانزا أنجولى معدلة - 1995 - 1999 + + + استرال ارجنتينى + + + بيزو أرجنتينى - 1983-1985 + + + بيزو أر±جنتينى + + + شلن نمساوى + + + دولار أسترالى + + + جلدر أروبى + + + مانات أذريبجانى + + + دينار البوسنة و الهرسك + + + مارك البوسنة و الهرسك قابل للتحويل + + + دولار بربادوسى + + + تاكا بنجلاديشى + + + فرنك بلجيكى (تحويلات)‏ + + + فرنك بلجيكى + + + فرنك بلجيكى (مالي)‏ + + + ليف بلغارى + + + ليف بلغارى جديد + + + دينار بحرينى + د.ب.‏ + + + فرنك بروندى + + + دولار برمودى + + + دولار بروناى + + + بوليفاريو + + + بيزو بوليفى + + + مفدول بوليفى + + + نوفو كروزايرو برازيلى - 1967-1986 + + + كروزادو برازيلى + + + كروزايرو برازيلى - 1990-1993 + + + ريال برازيلي + .‏ر.ب + + + دولار باهامى + + + نولتوم بوتانى + + + كيات بورمى + + + بولا بتسوانى + + + روبل بيلاروسى جديد - 1994-1999 + + + روبل بيلاروسى + + + دولار بليزى + + + دولار كندى + + + فنك كونغولى + + + فرنك سويسرى + + + بيزو شيلى + + + يوان صيني + ى.ص + + + بيزو كولومبى + + + كولن كوستا ريكى + + + دينار صربى + + + كرونة تشيكوسلوفاكيا + + + بيزو كوبى + + + اسكودو الرأس الخضراء + + + جنيه قبرصى + + + كرونة تشيكية + + + أوستمارك المانى شرقى + + + مارك المانى + + + فرنك جيبوتى + + + كرونة دانماركى + + + بيزو الدومنيكان + + + دينار جزائرى + د.ج.‏ + + + كرونة استونية + + + جنيه مصرى + ج.م.‏ + + + ناكفا أريترى + + + بيزيتا اسباني + + + بير أثيوبى + + + يورو + + + ماركا فنلندى + + + دولار فيجى + + + جنيه جزر فوكلاند + + + فرنك فرنسى + + + جنيه سترليني + + + لارى جورجى + + + سيدى غانى + + + جنيه جبل طارق + + + دلاسي جامبي + + + فرنك غينيا + + + سيلى غينيا + + + اكويل جونينا غينيا الاستوائيّة + + + دراخما يونانى + + + كوتزال جواتيمالا + + + اسكود برتغالى غينيا + + + بيزو غينيا بيساو + + + دولار غيانا + + + دولار هونج كونج + + + ليمبيرا هنداروس + + + دينار كرواتى + + + كونا كرواتى + + + جوردى هايتى + + + فورينت مجرى + + + روبية اندونيسية + + + جنيه ايرلندى + + + جنيه اسرائيلى + + + شيكل اسرائيلى جديد + + + روبيه هندي + .‏ر.ه + + + دينار عراقى + د.ع.‏ + + + ريال ايرانى + + + كرونه أيسلندى + + + ليرة ايطالية + + + دولار جامايكى + + + دينار أردنى + د.أ.‏ + + + ين ياباني + + + شلن كينيي + + + سوم قيرغستانى + + + رييال كمبودى + + + فرنك جزر القمر + .‏ف.ج.ق + + + وون كوريا الشمالية + + + وون كوريا الجنوبية + + + دينار كويتى + د.ك.‏ + + + دولار جزر كيمن + + + تينغ كازاخستانى + + + كيب لاوسى + + + جنية لبنانى + ل.ل.‏ + + + روبية سريلانكية + + + دولار ليبيري + + + لوتى ليسوتو + + + مالوتى + + + الليتا الليتوانية + + + تالوناس ليتوانى + + + فرنك لوكسمبرج قابل للتحويل + + + فرنك لوكسمبرج + + + فرنك لوكسمبرج المالى + + + لاتس لاتفيا + + + روبل لاتفيا + + + دينار ليبى + د.ل.‏ + + + درهم مغربى + د.م.‏ + + + فرنك مغربي + + + لاو مولدوفى + + + ارياري مدغشقر + + + فرنك مدغشقر + + + دينار مقدونى + + + فرنك مالى + + + كيات ميانمار + + + توغروغ منغولى + + + باتاكا ماكاوى + + + أوقية موريتانية + .‏أ.م + + + ليرة مالطية + + + جنيه مالطى + + + روبي موريشي + + + روفيه جزر المالديف + + + كواشا مالاوى + + + بيزو مكسيكى + + + بيزو فضى مكسيكى - 1861-1992 + + + رينغيت ماليزى + + + اسكود موزمبيقى + + + دولار نامبيا + + + نايرا نيجيرى + + + كوردوبة نيكاراجوا + + + جلدر هولندى + + + كرونة نرويجية + + + روبية نيبالي + + + دولار نيوزيلندى + + + ريال عمانى + ر.ع.‏ + + + بالبوا بنمى + + + كينا بابوا غينيا الجديدة + + + بيزو فلبينى + + + روبية باكستاني + + + زلوتى بولندى + + + زلوتى بولندى - 1950-1995 + + + اسكود برتغالى + + + جواراني باراجواي + + + ريال قطرى + ر.ق.‏ + + + دولار روديسى + + + ليو رومانى قديم + + + روبل روسي + ر.ر.‏ + + + روبل روسى - 1991-1998 + + + فرنك رواندى + + + ريال سعودى + ر.س.‏ + + + دولار جزر سليمان + + + روبية سيشيلية + + + دينار سوداني + .‏د.س + + + جنيه سودانى + ج.س.‏ + + + كرونة سويدية + + + دولار سنغافورى + + + جنيه سانت هيلين + + + تولار سلوفيني + + + كرونة سلوفاكية + + + ليون سيراليونى + + + شلن صومالى + + + دولار سورينامى + + + جلدر سورينامى + + + دوبرا ساو تومي وبرينسيبي + + + روبل سوفيتى + + + كولون سلفادورى + + + جنيه سورى + ل.س.‏ + + + ليلانجيني سوازيلندى + + + باخت تايلاندى + + + روبل طاجيكستانى + + + سوموني طاجيكستانى + + + مانات تركمنستانى + + + دينارتونسى + د.ت.‏ + + + اسكود تيمورى + + + ليرة تركي + + + ليرة تركية جديدة + + + دولار ترينداد و توباجو + + + دولار تايوانى + + + شلن تنزانى + + + هريفنيا أوكرانى + + + شلن أوغندى - 1966-1987 + + + شلن أوغندى + + + دولار أمريكي + + + دولار أمريكي (اليوم التالي)‏ + + + دولار أمريكي (نفس اليوم)‏ + + + بيزو أوروجواى - 1975-1993 + + + سوم أوزبكستانى + + + بوليفار فنزويلي + + + دونج فيتنامى + + + فرنك افريقي + .‏ف.ا + + + فضة + + + ذهب + + + الوحدة الأوروبية المركبة + + + الوحدة المالية الأوروبية + + + الوحدة الحسابية الأوروبية + + + دولار شرق الكاريبى + + + وحدة النقد الأوروبية + + + فرنك فرنسى ذهبى + + + البلاتين + + + كود اختبار العملة + + + بدون عملة + *** + + + دينار يمنى + + + ريال يمنى + ر.ي.‏ + + + دينار يوغسلافى + + + دينار يوغسلافى قابل للتحويل + + + راند جنوب أفريقيا -مالى + + + راند جنوب أفريقيا + + + كواشا زامبى + + + زائير زائيرى جديد + + + زائير زائيرى + + + دولار زمبابوى + + + + + + {0} أيام + {0} يوماً + يوم + {0} يوم + يومان + لا أيام + + + {0} ساعات + {0} ساعةً + ساعة + {0} ساعة + ساعتان + لا ساعات + + + {0} دقائق + {0} دقيقةً + دقيقة + {0} دقيقة + دقيقتان + لا دقائق + + + {0} أشهر + {0} شهراً + شهر + {0} شهر + شهران + لا أشهر + + + {0} ثوان + {0} ثانيةً + ثانية + {0} ثانية + ثانيتان + لا ثوان + + + {0} أسابيع + {0} أسبوعاً + أسبوع + {0} أسبوع + أسبوعان + لا أسابيع + + + {0} سنوات + {0} سنةً + سنة + {0} سنة + سنتان + لا سنوات + + + + + نعم:ن + لا:ل + + + diff --git a/libs/Zend/Locale/Data/ar_AE.xml b/libs/Zend/Locale/Data/ar_AE.xml new file mode 100644 index 0000000..0716415 --- /dev/null +++ b/libs/Zend/Locale/Data/ar_AE.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/ar_BH.xml b/libs/Zend/Locale/Data/ar_BH.xml new file mode 100644 index 0000000..9ae25c0 --- /dev/null +++ b/libs/Zend/Locale/Data/ar_BH.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/ar_DZ.xml b/libs/Zend/Locale/Data/ar_DZ.xml new file mode 100644 index 0000000..8736940 --- /dev/null +++ b/libs/Zend/Locale/Data/ar_DZ.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + 0 + + + diff --git a/libs/Zend/Locale/Data/ar_EG.xml b/libs/Zend/Locale/Data/ar_EG.xml new file mode 100644 index 0000000..a1d744d --- /dev/null +++ b/libs/Zend/Locale/Data/ar_EG.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/ar_IQ.xml b/libs/Zend/Locale/Data/ar_IQ.xml new file mode 100644 index 0000000..f9aabc4 --- /dev/null +++ b/libs/Zend/Locale/Data/ar_IQ.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/ar_JO.xml b/libs/Zend/Locale/Data/ar_JO.xml new file mode 100644 index 0000000..a6175ae --- /dev/null +++ b/libs/Zend/Locale/Data/ar_JO.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + كانون الثاني + شباط + آذار + نيسان + أيار + حزيران + تموز + آب + أيلول + تشرين الأول + تشرين الثاني + كانون الأول + + + كانون الثاني + شباط + آذار + نيسان + أيار + حزيران + تموز + آب + أيلول + تشرين الأول + تشرين الثاني + كانون الأول + + + + + + + الأحد + الاثنين + الثلاثاء + الأربعاء + الخميس + الجمعة + السبت + + + + + + + diff --git a/libs/Zend/Locale/Data/ar_KW.xml b/libs/Zend/Locale/Data/ar_KW.xml new file mode 100644 index 0000000..003c762 --- /dev/null +++ b/libs/Zend/Locale/Data/ar_KW.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/ar_LB.xml b/libs/Zend/Locale/Data/ar_LB.xml new file mode 100644 index 0000000..188ffa7 --- /dev/null +++ b/libs/Zend/Locale/Data/ar_LB.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + كانون الثاني + شباط + آذار + نيسان + نوار + حزيران + تموز + آب + أيلول + تشرين الأول + تشرين الثاني + كانون الأول + + + كانون الثاني + شباط + آذار + نيسان + نوار + حزيران + تموز + آب + أيلول + تشرين الأول + تشرين الثاني + كانون الأول + + + + + + + الأحد + الاثنين + الثلاثاء + الأربعاء + الخميس + الجمعة + السبت + + + + + + + + + E + + + + diff --git a/libs/Zend/Locale/Data/ar_LY.xml b/libs/Zend/Locale/Data/ar_LY.xml new file mode 100644 index 0000000..6bcfc84 --- /dev/null +++ b/libs/Zend/Locale/Data/ar_LY.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/ar_MA.xml b/libs/Zend/Locale/Data/ar_MA.xml new file mode 100644 index 0000000..4f7a206 --- /dev/null +++ b/libs/Zend/Locale/Data/ar_MA.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + 0 + + + diff --git a/libs/Zend/Locale/Data/ar_OM.xml b/libs/Zend/Locale/Data/ar_OM.xml new file mode 100644 index 0000000..8d6ca4f --- /dev/null +++ b/libs/Zend/Locale/Data/ar_OM.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/ar_QA.xml b/libs/Zend/Locale/Data/ar_QA.xml new file mode 100644 index 0000000..08bcc2a --- /dev/null +++ b/libs/Zend/Locale/Data/ar_QA.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + الأحد + الاثنين + الثلاثاء + الأربعاء + الخميس + الجمعة + السبت + + + + + + + + + + + #0.###;#0.###- + + + + + + + ¤#0.00 + + + + + diff --git a/libs/Zend/Locale/Data/ar_SA.xml b/libs/Zend/Locale/Data/ar_SA.xml new file mode 100644 index 0000000..18583b5 --- /dev/null +++ b/libs/Zend/Locale/Data/ar_SA.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + الأحد + الاثنين + الثلاثاء + الأربعاء + الخميس + الجمعة + السبت + + + + + + + + + + + #0.###;#0.###- + + + + + + + ¤#0.00 + + + + + diff --git a/libs/Zend/Locale/Data/ar_SD.xml b/libs/Zend/Locale/Data/ar_SD.xml new file mode 100644 index 0000000..fcd4dd2 --- /dev/null +++ b/libs/Zend/Locale/Data/ar_SD.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/ar_SY.xml b/libs/Zend/Locale/Data/ar_SY.xml new file mode 100644 index 0000000..cb0459f --- /dev/null +++ b/libs/Zend/Locale/Data/ar_SY.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + كانون الثاني + شباط + آذار + نيسان + نوار + حزيران + تموز + آب + أيلول + تشرين الأول + تشرين الثاني + كانون الأول + + + كانون الثاني + شباط + آذار + نيسان + نوار + حزيران + تموز + آب + أيلول + تشرين الأول + تشرين الثاني + كانون الأول + + + + + + + الأحد + الاثنين + الثلاثاء + الأربعاء + الخميس + الجمعة + السبت + + + + + + + + + + + #0.###;#0.###- + + + + + + + ¤#0.00 + + + + + diff --git a/libs/Zend/Locale/Data/ar_TN.xml b/libs/Zend/Locale/Data/ar_TN.xml new file mode 100644 index 0000000..30253aa --- /dev/null +++ b/libs/Zend/Locale/Data/ar_TN.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + الأحد + الاثنين + الثلاثاء + الأربعاء + الخميس + الجمعة + السبت + + + + + + + + + 0 + E + + + + + #0.###;#0.###- + + + + + + + ¤#0.00 + + + + + diff --git a/libs/Zend/Locale/Data/ar_YE.xml b/libs/Zend/Locale/Data/ar_YE.xml new file mode 100644 index 0000000..287fc21 --- /dev/null +++ b/libs/Zend/Locale/Data/ar_YE.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + الأحد + الاثنين + الثلاثاء + الأربعاء + الخميس + الجمعة + السبت + + + + + + + + + + + #0.###;#0.###- + + + + + + + ¤#0.00 + + + + + diff --git a/libs/Zend/Locale/Data/as.xml b/libs/Zend/Locale/Data/as.xml new file mode 100644 index 0000000..1934b9c --- /dev/null +++ b/libs/Zend/Locale/Data/as.xml @@ -0,0 +1,280 @@ + + + + + + + + + + + অসমীয়া + উপস্থাপন ভাষা + কম্বোডিয়ান + + + + + + এন্টাৰ্টিকা + ব্ৰাজিল + বভেট দ্বীপ + চীন + জাৰ্মানি + ফ্ৰান্স + সংযুক্ত ৰাজ্য + দক্ষিণ জৰ্জিয়া আৰু দক্ষিণ চেণ্ডৱিচ্‌ দ্বীপ + হাৰ্ড দ্বীপ আৰু মেক্‌ডোনাল্ড দ্বীপ + ভাৰত + ব্ৰিটিশ্ব ইণ্ডিয়ান মহাসাগৰৰ অঞ্চল + ইটালি + জাপান + ৰুচ + দক্ষিণ ফ্ৰান্সৰ অঞ্চল + যুক্তৰাষ্ট্ৰ + অজ্ঞাত বা অবৈধ অঞ্চল + + + পঞ্জিকা + শৰীকৰণ + মুদ্ৰা + + + পৰম্পৰাগত চীনা শৃঙ্খলাবদ্ধ কৰাৰ ক্ৰম - Big5 + বৌদ্ধ পঞ্জিকা + চীনা পঞ্জিকা + পোনপটীয়াকৈ শৃঙ্খলাবদ্ধ কৰাৰ ক্ৰম + সৰল চীনা শৃঙ্খলাবদ্ধ কৰাৰ ক্ৰম - GB2312 + গ্ৰিগোৰীয় পঞ্জিকা + হীব্ৰু পঞ্জিকা + ভাৰতীয় ৰাষ্ট্ৰীয় পঞ্জিকা + ইচলামী পঞ্জিকা + ইচলামী-নাগৰিকৰ পঞ্জিকা + জাপানী পঞ্জিকা + টেলিফোন বহিৰ মতেশৃঙ্খলাবদ্ধ কৰাৰ ক্ৰম + পিন্‌য়িন শৃঙ্খলাবদ্ধ কৰাৰ ক্ৰম + চীনা গণৰাজ্যৰ পঞ্জিকা + স্ট্ৰোক শৃঙ্খলাবদ্ধ কৰাৰ ক্ৰম + পৰম্পৰাগতভাবে শৃঙ্খলাবদ্ধ কৰাৰ ক্ৰম + + + + [় অ-ঋ ৠ ঌ ৡ এ ঐ ও ঔ ং ঁ ঃ ক-ড {ড়} ঢ {ঢ়} ণ ত ৎ থ-ন প-য {য়} ৰ ল ৱ শ-হ ঽ-ৄ ৢ ৣ ে ৈ ো-্ ৗ] + [\u200C \u200D ৲] + + + + + + + + জানু + ফেব্ৰু + মাৰ্চ + এপ্ৰিল + মে + জুন + জুলাই + আগ + সেপ্ট + অক্টো + নভে + ডিসে + + + জানুয়াৰী + ফেব্ৰুয়াৰী + মাৰ্চ + এপ্ৰিল + মে + জুন + জুলাই + আগষ্ট + সেপ্টেম্বৰ + অক্টোবৰ + নভেম্বৰ + ডিসেম্বৰ + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + ৰবি + সোম + মঙ্গল + বুধ + বৃহষ্পতি + শুক্ৰ + শনি + + + দেওবাৰ + সোমবাৰ + মঙ্গলবাৰ + বুধবাৰ + বৃহষ্পতিবাৰ + শুক্ৰবাৰ + শনিবাৰ + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + পূৰ্বা + অপ + + + BCE + CE + + + + + + EEEE, d MMMM, yyyy + + + + + d MMMM, yyyy + + + + + dd-MM-yyyy + + + + + d-M-yyyy + + + + + + + h.mm.ss a v + + + + + h.mm.ss a z + + + + + h.mm.ss a + + + + + h.mm. a + + + + + + + {1} {0} + + + + d MMMM + dd-MM + Q yy + MM-yyyy + MMMM, yyyy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + এলাহাৱাদ + + + + ভাৰতীয় সময় + + + ভা. স. + + true + + + + + + + + #,##,##0.### + + + + + + + #,##,##0% + + + + + + + ¤ #,##,##0.00 + + + + + + টকা + + + + + diff --git a/libs/Zend/Locale/Data/as_IN.xml b/libs/Zend/Locale/Data/as_IN.xml new file mode 100644 index 0000000..baa70b1 --- /dev/null +++ b/libs/Zend/Locale/Data/as_IN.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/az.xml b/libs/Zend/Locale/Data/az.xml new file mode 100644 index 0000000..03c43cf --- /dev/null +++ b/libs/Zend/Locale/Data/az.xml @@ -0,0 +1,2752 @@ + + + + + + + + + + + afarca + abxazca + akin dili + akoli dili + adangme dili + aduge dili + avestanca + Afrikaanca + afro-aziat dili + afrihili dili + aynuca + akanca + akadianca + aleutca + algonguyan dili + cənub altay dili + amarikcə + aragonca + qədimi ingiliscə + angikə dili + apaçi dili + Ərəbcə + aramik dili + araukanca + arapaho dili + suni dil + aravakça + as + asturicə + atapaskanca + avstraliyca + avarikcə + avadicə + aymarca + azərbaycanca + başkir dili + banda dili + bamilek dili + baluc dili + balincə + basa dili + baltik dili + belarusca + beja dili + bemba dili + berber dili + bolqarca + biharicə + bxoçpuri dili + bislama dili + bikolca + bini dili + siksikə dili + bambara dili + Benqal dili + bantu dili + tibet dili + Bretonca + braj dili + bosniya dili + batak dili + buryat dili + bugin dili + bilincə + katalanca + kado dili + mərkəzi amerika indus dili + karib dili + qavqaz dili + atsamca + çeçen dili + kebuano dili + kelt dili + çamoro dili + çibçə dili + çağatay dili + çukiz dili + mari dili + çinuk ləhçəsi + çoktau dili + çipevyan dili + çiroki dili + çeyen dili + çamik dili + korsikan dili + kopt dili + inglis kreol dili + fransız kreol dili + portugal kreol dili + kri dili + krım türkçə + kreol dili + çex dili + kaşubyan dili + kilsə slav dili + kuşitik dili + çuvaş dili + uelscə + danimarka dili + dakota dili + darqva dili + dayak dili + almanca + almanca (AT) + isveç yüksək almancası + delaver dili + slavey + doqrib dili + dinka dili + doqri dili + dravid dili + aşağı sorbca + duala dili + ortacaq hollandca + diveh dili + dyula dili + dzonqa dili + eve dili + efik dili + qədimi misir dili + ekacuk dili + yunanca + elamit dili + ingiliscə + ingiliscə (AU) + ingiliscə (CA) + ingiliscə (GB) + ingiliscə (ABŞ) + ortacaq ingiliscə + esperanto dili + ispanca + latın amerika ispancası + iber-ispanca + estonca + bask dili + evondo dili + farsca + fang dili + fanti dili + fula dili + fincə + taqaloqca + fin-uğri dili + fiji dili + farer dili + fon dili + fransızca + fransızca (CA) + isveç fransızca + ortacaq fransızca + qədimi fransızca + şimal fris dili + friul dili + frisk dili + irlandca + qa dili + qayo dili + qabaya dili + skot gaelik dili + Alman dili + qez dili + qilbert gili + qalisian dili + ortacaq yüksək almanca + quaranicə + qədimi almanca + qondi dili + qorontalo dili + gotça + qrebo dili + qədimi yunanca + isveç almanca + gujarati dili + manks dili + qviçin dili + Hausa dili + hayda dili + Qavayca + ivritcə + hindi dili + hiliqaynon dili + himaçali dili + hittit dili + monq dili + hiri motu dili + xorvatca + yuxarı sorbca + haiti dili + macarca + hupa dili + Ermənicə + Herer dili + interlingua dili + iban dili + indoneziya dili + interlingue dili + iqbo dili + siçuan yi dili + ico dili + inupiaq dili + iloko dili + diqər hint dili + hint-yevropa dili + inquş dili + ido dili + iranca + irokuay dili + isləndcə + italyanca + inuktikut dili + yaponca + loğban dili + judo-farsca + jude-ərəbcə + yavaca dili + gürcü dili + qara-qalpaq dili + kabule dili + kaçinca + ju dili + kamba dili + karen dili + kavi dili + kabardca + tiyap dili + koro dili + konqo dili + xazi dili + xoyzan dili + xotan dili + kikuyu dili + kuanyama dili + qazax dili + kalalisut dili + kambodiya dili + kimbundu dili + kannada dili + koreya dili + konkan dili + kosreyan dili + kpelle dili + kanur dili + qaraçay-balkar dili + karelyan dili + kru dili + kurux dili + kəşmir dili + kürdcə + kumuk dili + kutenay dili + komi dili + korniş dili + qırğızca + latınca + ladin dili + laxnda dili + lamba dili + luksemburq dili + ləzqi dili + qanda dili + limburqiş dili + Linqala dili + laos dili + monqo dili + lozi dili + litva dili + luba-katanqa dili + luba-lulua dili + luyseno dili + lunda dili + luo dili + lushayca + latışca + maduriz dili + maqahi dili + maitili dili + makasar dili + məndinqo dili + avstronezicə + masay dili + mokşa dili + mandar dili + mende dili + malaqas dili + ortacaq irlandca + marşal dili + maori dili + mikmak dili + minanqkaban dili + çeşitli diller + makedoniya dili + mon-xmer dili + malayalamca + monqolca + mançu dili + manipüri dili + manobo dili + moldavca + moxak dili + mosi dili + marati dili + malayca + malta dili + digər dillər + munda dili + krik dili + mirand dili + maruari dili + burmis dili + maya dili + erzya dili + nauru dili + nahuatl dili + şimal amerika yerli dili + neapolital dili + norvec bokmal dili + şimal ndebele dili + aşağı almanca + nepalca + nevari dili + nqonka dili + nyas dili + niger-kordofyan dili + niyuan dili + hollandca + flem dili + norveç ninorsk dili + norveç dili + noqay dili + qədimi norsca + nqo dili + cənub ndebele dili + şimal soto dili + nubiy dili + navayo dili + nyanca dili + nyamvezi dili + nyankol dili + niyoro dili + nizima dili + oksitanca + ocibva dili + oromo dili + Oriyə dili + osetik dili + osage dili + osman dili + otomian dili + puncab dili + papua dili + panqasinan dili + paxlavi dili + pampanqa dili + papyamento dili + palayanca + qədimi farsca + filipin dili + foyenik dili + pali dili + Polish dili + ponpeyan dili + prakrit dili + qədimi provensialca + Puştu dili + portuqalca + İber portuqalca + kuechya dili + racastan dili + rapanu dili + rarotonqan dili + rundi dili + rumın + roman dili + rut dili + rusca + aromanca + kinyarvanda dili + Sanskrit dili + sandave dili + yakut dili + cənub amerika yerli dili + salişan dili + samaritan dili + sasak dili + santal dili + sardin dili + sisili dili + skots dili + sindhi dili + şimal sami dili + selkup dili + ivrit dili + sanqo dili + qədimi irlandca + işarət dili + serb-xorvatca + şan dili + sinhaliscə + sidamo dili + sioyan dili + sino-tibet dili + slovakca + slovencə + slav dili + samoa dili + cənub sami dili + səmi dili + lule sami dili + inari sami + skolt dili + şona dili + soninke dili + somali dili + soqdiyen dili + sonqay dili + Albanca + serb dili + sranan tonqo dili + serer dilii + svati dili + nilo-sahara dili + Sesoto dili + sundanca + sukuma dili + susu dili + sumeryan dili + isveçcə + suahilicə + siryak dili + tamilcə + tay dili + teluqu dili + timne dili + tereno dili + tetum dili + tacik dili + tayca + tiqrin dili + tiqre dili + tiv dili + türkməncə + tokelay dili + taqaloq dili + klinqon + tlinqit dili + tamaşek dili + svana dili + tonqa dili + niyasa tonga dili + tok pisin dili + türkcə + sonqa dili + simşyan dili + tatarca + tumbuka dili + tupi dili + altaik dili + tuvalu dili + Tvi dili + taxiti dili + tuvinyan dili + udmurt dili + uyğurca + uqaritik dili + ukraynaca + umbundu dili + bilinməyən vəya gəcərsiz dil + urduca + özbəkcə + vay dili + venda dili + vyetnamca + volapük dili + votik dili + valun dili + vakaşan dili + valamo dili + varay dili + vaşo dili + sorb dili + volof dili + kalmıqca + xosa dili + yao dili + yapiz dili + Yahudi dili + yoruba dili + yupik dili + juənq dili + zapotek dili + blisimbols dili + zenaqa dili + çincə + adi çincə + gələnəksəl çincə + zande dili + zulu dili + zuni dili + zaza dili + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Dünya + Afrika + Şimal Amerika + Cənub Amerika + Okeyaniya + Qərb afrika + Orta Amerika + Şərq Afrika + Şimal Afrika + Orta Afrika + 018 + Amerikalar + 021 + Kariyıplar + Şərq Asiya + Cənub Asiya + Cənub Şərq Asiya + Cənub Avropa + Avstraliya və Yeni Zelandiya + Melanesya + Mikronesiya reqionu + Polineziya + Cənub Orta Asiya + Aziya + Orta Aziya + Qərb Asiya + Avropa + Şərq Avropa + Şimal Avropa + Qərb Avropa + 172 + Latın Amerikası və Kariblər + Andorra + Birləşmiş Ərəb Emiratları + Əfqənistan + Antiqua və Barbuda + Anquila + Albaniya + Ermənistan + Hollandiya antilleri + Angola + Antarktika + Arqentina + Amerika Samoası + Avstriya + Avstraliya + Aruba + Aland Adaları + Azərbaycan + Bosniya və Herzokovina + Barbados + Banqladeş + Belçika + Burkina Faso + Bolqariya + Bahreyn + Burundi + Benin + Seynt Bartelemey + Bermuda + Bruney + Boliviya + Braziliya + Bahamalar + Butan + Bove Adası + Botsvana + Belarus + Beliz + Kanada + Kokos Adaları + Konqo - Kinşasa + Orta Afrika respublikası + Konqo - Brazavil + isveçriya + İvori Sahili + Kuk Adaları + Çile + Kamerun + Çin + Kolumbiya + Kosta Rika + Kuba + Kape Verde + Çristmas Adası + Kipr + Çex respublikası + Almaniya + Ciboti + Danemarka + Dominika + Dominik Respublikası + Cezayır + Ekvador + Estoniya + Misir + Qərb Sahara + Eritreya + İspaniya + Efiopiya + Finlandiya + Fici + Folkland Adaları + Mikronesiya + Faro Adaları + Fransa + Qabon + Birləşmiş Krallıq + Qrenada + Gürcüstan + Fransız Quyanası + Görnsey + Qana + Gibraltar + Qrinland + Qambiya + Qvineya + Qvadalup + Ekvator Qineya + Yunanıstan + Cənub Gürcüstan və Cənub Sandvilç Adaları + Qvatemala + Quam + Qvineya-Bisau + Quyana + Honk Konq + Hörd və Makdonald Adaları + Qonduras + Xorvatiya + Haiti + Macaristan + İndoneziya + İrlandiya + İzrail + Man Adası + Hindistan + Britaniya-Hindistan Okeanik territoriyası + İrak + İran + İslandiya + İtaliya + Cörsi + Yamayka + Ürdün + Yaponiya + Kenya + Kırqızstan + Kambodiya + Kiribati + Komoros + Seynt Kits və Nevis + Şimal Koreya + Cənub Koreya + Kuveyt + Kayman Adaları + Kazaxstan + Laos + Lebanon + Seynt Lusiya + Lixtenşteyn + Şri Lanka + Liberiya + Lesoto + Litva + Lüksemburq + Latviya + Libya + Morokko + Monako + Moldova + Monteneqro + Seynt Martin + Madaqaskar + Marşal Adaları + Masedoniya + Mali + Myanmar + Monqoliya + Makao + Şimal Mariana Adaları + Martiniqu + Mavritaniya + Montserat + Malta + Mavritis + Maldiv + Malavi + Meksika + Malaysiya + Mazambik + Namibiya + Yeni Kaledoniya + nijer + Norfolk Adası + Nijeriya + Nikaraqua + Hollandiya + Norvec + Nepal + Nauru + Niye + Yeni Zelandiya + Oman + Panama + Peru + Fransız Polineziya + Papua Yeni Qvineya + Filipin + Pakistan + Polşa + Seynt Piyer və Mikelon + Pitkarn + Puerto Riko + Fələstin Bölqüsü + Portuqal + Palav + Paraqvay + Qatar + Uzak Okeyaniya + Avropa Birləşliyi + Reyunion + Romaniya + Serbiya + Rusiya + Rvanda + Saudi Ərəbistan + Solomon Adaları + Seyçels + sudan + isveç + Sinqapur + Seynt Elena + Sloveniya + svalbard və yan mayen + Slovakiya + Siyera Leon + San Marino + Seneqal + Somaliya + surinamə + Sao Tom və Prinsip + El Salvador + siriya + svazilənd + Türk və Kaykos Adaları + Çad + Fransız Cənub teritoriyası + Toqo + tayland + tacikistan + Tokelau + Şərq Timor + Türkmənistan + Tunisiya + Tonqa + Türkiya + Trinidan və Tobaqo + Tuvalu + tayvan + tanzaniya + Ukraina + Uqanda + Birləşmiş Ştatların uzaq adaları + Amerika Birləşmiş Ştatları + Uruqvay + Özbəkistan + Vatikan + Seynt Vinsent və Qrenada + Venesuela + Britaniya Virgin Adaları + ABŞ Virqin Adaları + Vyetnam + Vanuatu + Valis və Futuna + Samoa + Yemen + Mayot + Cənub Afrika + Zambiya + Zimbabve + bilinmir + + + Budist təqvimi + Çin təqvimi + Qreqoriy təqvimi + Yahudi təqvimi + Hindi təqvimi + Müsəlman təqvimi + Ivrit təqvimi + Yapon təqvimi + Pinyin təqvimi + Çin respublikası təqvimi + + + ABŞ + metr + + + Dil: {0} + Yazı: {0} + Rayon: {0} + + + + [a-c ç d e ə f g ğ h i {i̇} İ ı j-o ö p-s ş t u ü v x-z] + [w] + + + + + + + + + + + + + + yan + fev + mar + apr + may + iyn + iyl + avq + sen + okt + noy + dek + + + Yanvar + Fevral + Mart + Aprel + May + İyun + İyul + Avqust + Sentyabr + Oktyabr + Noyabr + Dekabr + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + B. + B.E. + Ç.A. + Ç. + C.A. + C + Ş. + + + bazar + bazar ertəsi + çərşənbə axşamı + çərşənbə + cümə axşamı + cümə + şənbə + + + + + 7 + 1 + 2 + 3 + 4 + 5 + 6 + + + + + + + 1-ci kv. + 2-ci kv. + 3-cü kv. + 4-cü kv. + + + 1-ci kvartal + 2-ci kvartal + 3-cü kvartal + 4-cü kvartal + + + + AM + PM + + + eramızdan əvvəl + bizim eramızın + + + e.ə. + b.e. + + + + + + EEEE, yyyy MMMM dd + + + + + yyyy MMMM d + + + + + yyyy MMM d + + + + + yy/MM/dd + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1} {0} + + + + Q yy + + + + + era + + + il + + + ay + + + həftə + + + bu gün + bu gün + sabah + üç gün sonra + dünən + üç gün əvvəl + + + həftə günü + + + saat + + + dəqiqə + + + saniyə + + + zona + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + {1} ({0}) + + Bilinmir + + + rofera + + + çənub polus + + + syova + + + moson + + + Deyvis + + + vostok + + + Keysi + + + Dumont de Urvile + + + makmurdo + + + rio qayegos + + + mendoza + + + san xuan + + + uşuya + + + La Rioha + + + san luis + + + Katamarka + + + Cucuy + + + tukuman + + + Kordoba + + + Buenos Ayres + + + perf + + + Yukla + + + Darvin + + + Adelayd + + + Broken Hil + + + Kuriye + + + melburn + + + sidney + + + Brisbeyn + + + Lord Hove + + + İrunepe + + + Rio Branko + + + porto velo + + + Kuyaba + + + Kampo Qrande + + + Araguayna + + + sao paulo + + + Bahiya + + + Maseyo + + + resif + + + noronha + + + Douson + + + vaythors + + + İnuvik + + + vənkuver + + + Douson Krik + + + yelounayf + + + Edmondton + + + svift kurent + + + Kəmbric Bey + + + recina + + + vinipeq + + + resolut + + + reyni river + + + rankin inlet + + + Koral Harbor + + + funder bey + + + nipiqon + + + toronto + + + montreal + + + İqalut + + + panqnirtanq + + + monkton + + + Halifaks + + + Qus Bey + + + Qleys Bey + + + Blank-Sablon + + + St Johns + + + Kinşasa + + + Lubumbaşi + + + İster + + + Kaşqar + + + urumçi + + + Conqinq + + + Qalapaqos + + + Kanari + + + Seuta + + + ponape + + + Kosraye + + + tul + + + skoresbisund + + + Danmarkşavn + + + Cakarta + + + pontiyanak + + + Makasar + + + Cayapura + + + Enderböri + + + Kirimati + + + tarava + + + Aktau + + + qüzülorda + + + Almati + + + Kvajaleyn + + + Maxiro + + + ulanbatar + + + Coybalsan + + + tixuana + + + Hermosilo + + + mazaltan + + + Cihuvava + + + monterey + + + mexiko + + + Kankun + + + Kuçinq + + + Çatam + + + Markuyesas + + + Qambiyer + + + Madeyra + + + Kalininqrad + + + moskva + + + volqoqrad + + + samara + + + yekaterinburq + + + novosibirsk + + + İrkutsk + + + yakutsk + + + vladivostok + + + saxalin + + + Maqadan + + + Kamçatka + + + Anadır + + + ujgorod + + + Kiyev + + + simferopol + + + zaporojye + + + midvey + + + Conston + + + veyk + + + nom + + + Ankorac + + + yakutat + + + Cüneau + + + Los Anceles + + + Boyse + + + finiks + + + şiprok + + + nyu salem + + + Orta, Şimal Dakota + + + Cikaqo + + + menomini + + + vinsenes + + + pitersburq + + + tell şəhəri + + + Noks + + + vinamak + + + Marenqo + + + İndianapolis + + + Luisvil + + + vevey + + + montiçelo + + + Detroyt + + + nyu york + + + səmərkənd + + + false + + + + Orta Avropa + Orta Avropa/yay + + + Orta Avropa/standart + Orta Avropa/yaz + + false + + + + Şərq Avropa + Şərq Avropa/yay + + + Şərq Avropa/standart + Şərq Avropa/yaz + + true + + + false + + + + Kuybuşev + Kuybuşev/yay + + false + + + + Moskva + Moskva/standart + Moskva/yay + + true + + + + Samara + Samara/yay + + false + + + + Türkiya + Türkiya/yay + + true + + + + Volqoqrad + Volqoqrad/yay + + false + + + + + + , + . + ; + % + 0 + # + + + - + E + + + NaN + + + + + ¤ #,##0.00 + + + + + + Andora pesetası + Andora pesetası + + + Birləşmiş ərəb emiratlar dirhamı + BƏE dirhamı + + + Əfgəni (AFA) + Əfgən (AFA) + + + Əfgəni + Əfgən + + + Alban leki + Alban leki + lek + + + Erməni dramı + Erməni dramı + dram + + + Hollandiya antila gilderi + Hollandiya Antila gilderi + + + Anqola kvanzası + Anqola kvanzasi + + + Anqola kvanzasi (1977-1990) + Anqola kvanzasi (AOK) + + + Anqola yeni kvanzası (1990-2000) + Anqola yeni kvanzasi (AON) + + + Anqola kvanzası (1995-1999) + Anqola kvanzasi (AOR) + + + Argentina avstralı + Argentina avstralı + + + Argentina pesosu (1983-1985) + Argentina pesosu (ARP) + + + Argentina pesosu + Argentina pesosu + + + Avstriya şilingi + Avstriya şilingi + + + Avstraliya dolları + Avstraliya dolları + + + Aruba qilderi + Aruba qilderi + + + Manat + Azərbaycan manatı (AZM) + man. + + + Azərbaycan manatı + Azərbaycan manatı + AZN + + + Bosniya-Herzeqovina dinarı + Bosniya-Herzeqovina dinarı + + + Bosniya-Herzeqovina markası + Bosniya-Herzeqovina markası + + + Barbados dolları + Barbados dolları + + + Banqladeş takası + Banqladeş takası + + + Belçika frankı (deyşirik) + Belçika frankı (deyşirik) + + + Belçika frankı + Belçika frankı + + + Belçika frankı (finans) + Belçika frankı (finans) + + + Bolqariya levası + Bolqariya levası + + + Bolqariya yeni levası + Bolqariya yeni levası + + + Bahreyn dinarı + Bahreyn dinarı + + + Burundi frankası + Burundi frankası + + + Bermuda dolları + Bermuda dolları + + + Bruney dolları + Bruney dolları + + + Boliviano + Boliviano + + + Boliviya pesosu + Boliviya pesosu + + + Boliviya mvdolı + Boliviya mvdolı + + + Braziliya kruzeyro novası + Braziliya kruzeyro novası + + + Braziliya kruzadosu + Braziliya kruzadosu + + + Braziliya kruzeyrosu (1990-1993) + Braziliya kruzeyrosu (BRE) + + + Braziliya realı + Braziliya realı + R$ + + + Braziliya kruzado novası + Braziliya kruzado novası + + + Braziliya kruzeyrosu + Braziliya kruzeyrosu + + + Bahama dolları + Bahama dolları + + + Butan ngultrumu + Butan ngultrumu + + + Burmis kyatı + Burmis kyatı + + + Botsvana pulası + Botsvana pulası + + + Belarusiya yeni rublu + Belarusiya yeni rublu + + + Belarusiya rublu + Belarusiya rublu + + + Beliz dolları + Beliz dolları + + + Kanadiya dolları + Kanada dolları + + + Konqoliz frank konqolaysı + Konqoliz frank konqolaysı + + + WIR Yevrosu + WIR Yevrosu + + + İsveçriya frankası + İsveçriya frankası + + + WIR frankası + WIR frankası + + + Çili pesosu + Çili pesosu + + + Çin yuan renminbi + Çin yuanı + CNY + + + Kolombiya pesosu + Kolombiya pesosu + + + Kosta rika kolonu + Kosta Rika kolonu + + + Qədimi Serb dinarı + Qədimi serb dinarı + + + Çexoslavakiya korunası + Çexoslavakiya korunası + + + Kuba pesosu + Kuba pesosu + + + Kape Verde eskudosu + Kape Verde eskudosu + + + Kipr paundu + Kipr paundu + + + Çex respublikası korunası + Cex respublika korunası + + + şərq almaniya ostmarkı + Şərq Almaniya ostmarkı + + + alman markası + Alman markası + + + jibouti frankası + Jibouti frankası + + + Danemarka kronası + Danemarka kronası + + + dominika pesosu + Dominika pesosu + + + Alcəzir dinarı + Alcəzir dinarı + + + ekvador sukresi + Ekvador sukresi + + + Estoniya krunu + Estoniya krunu + + + misir paundu + Misir paundu + + + ekvele + Ekvele + + + Eirtreya nakfası + Eritreya nakfası + + + İspan pesetası (A) + İspan pesetası (A account) + + + İspan pesetası (dəyşirik) + İspan pesetası (dəyşirik) + + + İspan pesetası + İspan pesetası + + + Efiopiya birası + Efiopiya birası + + + Yevro + yevro + + + + Fin markası + Fin markası + + + Fici dolları + Fici dolları + + + Folkland Adası paundu + Folkland adası paundu + + + Fransız markası + Fransız markası + + + Britaniya paund sterlingi + Britaniya paund sterlingi + UK£ + + + Gürcüstan kupon lariti + Gürcüstan kupon lariti + + + Gürcüstan larisi + Gürcüstan larisi + lari + + + Qana sedisi (1979-2007) + Qana sedisi (GHC) + + + Qana sedisi + Qana sedisi + + + Gibraltar paundu + Gibraltar paundu + + + Qambiya dalasi + Qambiya dalasi + + + Qvineya frankası + qvineya frankası + + + Qvineya sulisi + Gineya sulisi + + + Ekvatoriya Gvineya ekvele quneanası + Ekvatoriya Gvineya ekvele quneanası + + + Yunan draçması + Yunan draxması + + + Qvatemala küetzalı + Qvatemala küetzalı + + + Portugal Qvineya eskudosu + Portugal Qvineya eskudosu + + + Qvineya-Bisau pesosu + Qvineya-Bisau pesosu + + + Quyana dolları + Quyana dolları + + + Honk Konq dolları + Honk Konq dolları + + + Honduras lempirası + Honduras lempirası + + + Xorvatiya dinarı + Xorvatiya dinarı + + + Xorvatiya kunu + Xorvatiya kunu + + + Haiti qourdu + Haiti qourdu + + + Macarıstan forinti + Macarıstan forinti + + + İndoneziya rupisi + İndoneziya rupisi + + + İrlandiya paundu + İrlandiya paundu + + + İzrail paundu + İzrail paundu + + + İzrail yeni şekeli + İzrail ail yeni şekeli + + + Hindistan rupisi + Hindistan rupisi + 0≤Rs.|1≤Re.|1<Rs. + + + İraq dinarı + İraq dinarı + + + İran rialı + İran rialı + + + Aysland kronası + Aysland kronası + + + İtaliya lirası + İtaliya lirası + + + Yamayka dolları + Yamayka dolları + + + İordaniya dinarı + İordaniya dinarı + + + Yapon yeni + Yapon yeni + JP¥ + + + Kenya şillingi + Kenya şillingi + + + Kırğızstan somu + Kırğızstan somu + + + Kambodiya riyeli + Kambodiya riyeli + + + Komoro frankı + Komoro frankı + + + Şimal koreya vonu + Şimal Koreya vonu + + + Cənub koreya vonu + Cənub Koreya vonu + + + Kuveyt dinarı + Kuveyt dinarı + + + Keyman Adaları dolları + Keyman Adaları dolları + + + Kazaxstan tenqesi + Kazaxstan tenqesi + + + Laotiya kipi + Laotiya kipi + + + Lebanon paundu + Lebanon paundu + + + Şri Lanka rupisi + Şri Lanka rupisi + + + Liberiya dolları + Liberiya dolları + + + Lesoto lotisi + Lesoto lotisi + + + Maloti + Maloti + + + Litva litası + Litva litası + + + Litva talonası + Litva talonası + + + Luksemburq frankası (dəyişik) + Luksemburq dəyişik frankası + + + Luksemburq frankası + Luksemburq frankası + + + Luksemburq frankası (finans) + Luksemburq finans frankası + + + Latviya latsı + Latviya latsı + + + Latviya rublu + Latviya rublu + + + Liviya dinarı + Liviya dinarı + + + Morokko dirhamı + Morokko dirhamı + + + Morokko frankası + Morokko frankası + + + Moldova leyusu + Moldova leyusu + + + Madaqaskar ariarisi + Madaqaskar ariarisi + + + Madaqaskar frankası + Madaqaskar frankası + + + Masedoniya denarı + Masedoniya denarı + + + Mali frankı + Mali frankı + + + Myanmar kiyatı + Myanmar kiyatı + + + Monqoliya tuqriki + Monqoliya tuqriki + + + Makao patakası + Makao patakası + + + Mavritaniya oyuquyası + Mavritaniya oyuquyası + + + Maltiz paundu + Maltiz paundu + + + Mavritis rupiyi + Mavritis rupiyi + + + Maldiv Adaları rufiyi + Maldiv adaları rufiyi + + + Malavi kvaçası + Malavi kvaçası + + + Meksika pesosu + Meksika pesosu + + + Meksika gümüş pesosu + Meksika gümüş pesosu + + + Malaysiya rinqiti + Malaysiya rinqiti + + + Mozambik eskudosu + Mozambik eskudosu + + + Qədim Mozambik metikalı + Qədim mozambik metikalı + + + Mozambik metikalı + Mozambik metikalı + + + Namibiya dolları + Namibiya dolları + + + Nigeriya nairi + Nigeriya nairi + + + Nikaraqua kordobu + Nikaraqua kordobu + + + Hollandiya gilderi + Hollandiya gilderi + + + Norveç kronu + Norveç kronu + + + Nepal rupiyi + Nepal rupiyi + + + Yeni Zelandiya dolları + Yeni Zelandiya dolları + + + Mman rialı + Oman rialı + + + Panamaniya balboa + Panamaniya balboa + + + Peru inti + Peru inti + + + Peru sol nuyevosu + Peru sol nuyevosu + + + Peru solu + Peru solu + + + Papua Yeni Qvineya kini + Papua Yeni Qvineya kini + + + Filipin pesosu + Filipin pesosu + + + Pakistan rupiyi + Pakistan rupiyi + + + Polsha zlotisi + Polsha zlotisi + + + Polsha zlotisi (1950-1995) + Polsha zlotisi (PLZ) + + + Portuqal eskudosu + Portuqal eskudosu + + + Paraqvay quarani + Paraqvay quarani + + + Qatar rialı + Qatar rialı + + + Rodezian dolları + Rodezian dolları + + + Qədim Roman leyu + Roman qədimi leyu + + + Roman leyu + Roman leyu + + + Serbiya dinarı + Serbiya dinarı + + + Rusiya rublu + Rusiya rublu + RUB + + + Rusiya rublu (1991-1998) + Rusiya rublu (RUR) + + + Rvanda frankı + Rvanda frankı + + + Saudi riyalı + Saudi riyalı + + + Solomon Adaları dolları + Solomon Adaları dolları + + + Seyçel rupiyi + Seyçel rupiyi + + + Sudan paundu + Sudan paundu + + + İsveç kronu + İsveç kronu + + + Sinqapur dolları + Sinqapur dolları + + + Sloveniya toları + Sloveniya toları + + + Slovak korunası + Slovak korunası + + + Somaliya şillingi + Somaliya şillingi + + + Surinam dolları + Surinam dolları + + + Sovet rublu + Sovet rublu + + + el salvador kolonu + El Salvador kolonu + + + Siriya paundu + Siriya paundu + + + Svazilənd lilangeni + Svazilənd lilangeni + + + tay bahtı + Tay bahtı + + + Tacikistan rublu + Tacikistan rublu + + + Tacikistan somoni + Tacikistan somoni + + + Türkmənistan manatı + Türkmənistan manatı + + + Tunis dinarı + Tunis dinarı + + + Tonqa panqası + Tonqa panqası + + + Timor eskudu + Timor eskudu + + + Türk köhnə lirası + Türk köhnə lirası + + + Türk lirası + Türk lira + + + Tayvan yeni dolları + Tayvan yeni dolları + + + Tanzaniya şilingi + Tanzaniya şilingi + + + Ukraina hrivnyası + Ukraina hrivnyası + + + Ukraina karbovenesası + Ukraina karbovenesası + + + Uqanda şelingi (1966-1987) + Uqanda şelingi (UGS) + + + Uqanda şelingi + Uqanda şelingi + + + ABŞ dolları + ABŞ dolları + US$ + + + ABŞ dolları (yeni gün) + ABŞ dolları (yeni gün) + + + ABŞ dolları (həmin gün) + ABŞ dolları (həmin gün) + + + Uruqvay pesosu Unidades Indexadas + Uruqvay pesosu unidades indexadas + + + Uruqvay pesosu (1975-1993) + Uruqvay pesosu (UYP) + + + Uruqvay pesosu (Uruguayo) + Uruqvay pesosu + + + özbəkistan sumu + Özbəkistan sumu + + + venesuela bolivarı + Venesuela bolivarı + + + venesuela bolivar fuerti + Venesuela Bolivar fuerti + + + vyetnam donqu + Vyetnam donqu + + + qərb samoa talası + Qərb Samoa talası + + + gümüş + gümüş + + + qızıl + qızıl + + + şərq karib dolları + Şərq karib dolları + + + Fransız gızıl frankı + Fransız gızıl frankı + + + Fransız UİC frankı + Fransız UİC frankı + + + CFA franka BCEAO + CFA franka BCEAO + + + Palladium + Palladium + + + CFP frankı + CFP frankı + + + platinum + platinum + + + bilinməyən vəya gəcərsiz + bilinməyən vəya gəcərsiz + XXX + + + yemen dinarı + Yemen dinarı + + + yemen rialı + Yemen rialı + + + Yuqoslaviya dinarı (hard) + Yuqoslaviya dinarı (hard) + + + Yuqoslaviya yeni dinarı (hard) + Yuqoslaviya yeni dinarı (hard) + + + Yuqoslaviya dinarı (dəyişik) + Yuqoslaviya dinarı (dəyişik) + + + Cənub afrika randı (finans) + Cənub Afrika randı (finans) + + + Cənub afrika randı + Cənub Afrika randı + + + Zambiya kvaçı + Zambiya kvaçı + + + Zair yeni zairi + Zair yeni zairi + + + Zair zairi + Zair zairi + + + Zimbabve dolları + Zimbabve dolları + + + + + + {0} gün + + + {0} saat + + + {0} dəqiqə + + + {0} ay + + + {0} saniyə + + + {0} həftə + + + {0} il + + + + + hə:h + yox:y + + + diff --git a/libs/Zend/Locale/Data/az_AZ.xml b/libs/Zend/Locale/Data/az_AZ.xml new file mode 100644 index 0000000..dbff2bb --- /dev/null +++ b/libs/Zend/Locale/Data/az_AZ.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/az_Cyrl.xml b/libs/Zend/Locale/Data/az_Cyrl.xml new file mode 100644 index 0000000..6d4b597 --- /dev/null +++ b/libs/Zend/Locale/Data/az_Cyrl.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + Свет + Афрыка + Паўночная Амэрыка + Паўднёвая Амэрыка + Акіянія + Заходняя Афрыка + Цэнтральная Амэрыка + Усходняя Афрыка + Паўночная Афрыка + Цэнтральная Афрыка + Паўднёвая Афрыка + Паўночная і Паўднёвая Амерыкі + ЗША і Канада + Карыбскія астравы + Усходняя Азія + Паўднёвая Азія + Паўднёва-Усходняя Азія + Паўднёвая Еўропа + Аўстралія і Новая Зэландыя + Палінезія + Паўднёва-Цэнтральная Азія + Азія + Цэнтральная Азія + Заходняя Азія + Еўропа + Усходняя Еўропа + Паўночная Еўропа + Заходняя Еўропа + Садружнасць Незалежных Дзяржаў + Андора + Аб'яднаныя Арабскія Эміраты + Афганістан + Антыгуа і Барбуда + Ангуілля + Албанія + Арменія + Нідэрландскія Антылы + Ангола + Антарктыка + Аргенціна + Амерыканскае Самоа + Аўстрыя + Аўстралія + Аруба + Аландскія астравы + Азербайджан + Боснія і Герцагавіна + Барбадас + Бангладэш + Бельгія + Буркіна-Фасо + Балгарыя + Бахрэйн + Бурундзі + Бенін + Бермудскія астравы + Бруней-Дарусалам + Балівія + Бразілія + Багамскія Астравы + Бутан + Бувэ востраў + Батсвана + Беларусь + Беліз + Канада + Какосавыя астравы + Конга, Дэмакратычная Рэспубліка + Цэнтральна-Афрыканская Рэспубліка + Конга + Швейцарыя + Кука астравы + Чылі + Камерун + Кітай + Калумбія + Коста-Рыка + Куба + Каба-Вердэ + Калядаў востраў + Кіпр + Чэхія + Германія + Джыбуці + Данія + Дамініка + Дамініканская Рэспубліка + Алжыр + Эквадор + Эстонія + Егіпет + Заходняя Сахара + Эрытрэя + Іспанія + Эфіопія + Фінляндыя + Фіджы + Фолклэндскія астравы + Мікранезія + Францыя + Габон + Велікабрытанія + Грэнада + Грузія + Французская Гвіяна + Гана + Гібралтар + Грэнландыя + Гамбія + Гвінея + Гвадэлупа + Экватарыяльная Гвінея + Грэцыя + Паўднёвая Джорджыя і Паўднёвыя Сандвічавы астравы + Гватэмала + Гвінея-Бісаў + Гаяна + Гон-Конг + Гэрда востраў і МакДоналда астравы + Гандурас + Харватыя + Гаіці + Венгрыя + Інданезія + Ірландыя + Ізраіль + Індыя + Брытанская тэрыторыя Індыйскага акіяну + Ірак + Іран, Ісламская Рэспубліка + Ісландыя + Італія + Ямайка + Іарданія + Японія + Кенія + Кыргызстан + Камбоджа + Кірыбаці + Каморскія Астравы + Сэнт-Кітс і Нэвіс + Паўночная Карэя + Паўднёвая Карэя + Кувейт + Кайманавы астравы + Казахстан + Лаоская Народна-Дэмакратычная Рэспубліка + Ліван + Сэнт-Люсія + Ліхтэнштэйн + Шры-Ланка + Ліберыя + Лесота + Літва + Люксембург + Латвія + Лівійская Арабская Джамахірыя + Марока + Манака + Малдова + Чарнагорыя + Мадагаскар + Маршалавы Астравы + Македонія, БЮР + Малі + М'янма + Манголія + Макао + Паўночныя Марыянскія астравы + Марцініка + Маўрытанія + Монсэрат + Мальта + Маўрыкій + Мальдыўскія Астравы + Малаві + Мексіка + Малайзія + Мазамбік + Намібія + Новая Каледонія + Нігер + Норфалкскія астравы + Нігерыя + Нікарагуа + Нідэрланды + Нарвегія + Непал + Науру + Ніуэ + Новая Зеландыя + Аман + Панама + Перу + Франузская Палінэзія + Папуа-Новая Гвінея + Філіпіны + Пакістан + Польшча + Палестынскія тэрыторыі + Партугалія + Палаў + Парагвай + Катар + Вонкавая Акіянія + Еўрапейскі Звяз + Рэюньён + Румынія + Сербія + Расія + Руанда + Саудаўская Аравія + Саламонавы Астравы + Сейшэльскія Астравы + Судан + Швецыя + Сінгапур + Святой Алены, Востраў + Славенія + Свальбард (Паўночна-Усходняя Зямля) і Ян-Маен + Славакія + Сьера-Леонэ + Сенегал + Самалі + Сурынам + Сан-Томэ і Прынсіпі + Сальвадор + Сірыйская Арабская Рэспубліка + Свазіленд + Тэркс і Кайкас астравы + Чад + Французскія Паўднёвыя тэрыторыі + Тога + Тайланд + Таджыкістан + Такелаў + Усходні Тымор + Туркменістан + Туніс + Тангійская + Турцыя + Трынідад і Табага + Тувалу + Тайвань + Танзанія, Аб'яднаная Рэспубліка + Украіна + Уганда + Злучаныя Штаты + Уругвай + Узбекістан + Ватыкан + Сэнт-Вінсэнт і Грэнадыны + Венесуэла + Віргінскія астравы + Віргінскія астравы, ЗША + В'етнам + Вануату + Уоліс і Футуна + Самоа (Заходняе) + Емен + Паўднёва-Афрыканская Рэспубліка + Замбія + Зімбабвэ + Невядомы рэгіён + + + каляндар + параўнаньне тэксту + валюта + + + будысцкі каляндар + кітайскі каляндар + грэгарыянскі каляндар + іудэйскі каляндар + мусульманскі каляндар + мусульманскі свецкі каляндар + японскі каляндар + + + ЗША + метрычная + + + Мова: {0} + Пісьмо: {0} + Рэгіён: {0} + + + + lowercase-words + + + [а-д {дж} {дз} е ё ж з й і к-у ў ф-ш ы-я] + [] + [a-z] + + + + + « + » + + + GanjkHmsSEDFwWxhKzAeugXZvcL + + + + + + EEEE, d MMMM yyyy G + + + + + d MMMM yyyy G + + + + + d MMM yyyy G + + + + + dd.MM.yyyy + + + + + + dd.MM + MM.yyyy + + + + + + + dd.MM + MM.yyyy + MM.yyyy + + + + + + + + 1-шы кв. + 2-гі кв. + 3-ці кв. + 4-ты кв. + + + 1-шы квартал + 2-гі квартал + 3-ці квартал + 4-ты квартал + + + + + + + + + сту + лют + сак + кра + май + чэр + ліп + жні + вер + кас + ліс + сне + + + т + + + студзень + люты + сакавік + красавік + май + чэрвень + ліпень + жнівень + верасень + кастрычнік + лістапад + снежань + + + + + тра + + + с + л + с + к + м + ч + л + ж + в + к + л + с + + + травень + + + + + + + нд + пн + аў + ср + чц + пт + сб + + + нядзеля + панядзелак + аўторак + серада + чацвер + пятніца + субота + + + + + н + п + а + с + ч + п + с + + + + + + + 1-шы кв. + 2-гі кв. + 3-ці кв. + 4-ты кв. + + + 1-шы квартал + 2-гі квартал + 3-ці квартал + 4-ты квартал + + + + + 1 + 2 + 3 + 4 + + + + да палудня + пасля палудня + + + да н.э. + н.э. + + + да н.е. + н.е. + + + да н.э. + н.э. + + + + + + EEEE, d MMMM yyyy + + + + + d MMMM yyyy + + + + + d.M.yyyy + + + + + d.M.yy + + + + + + + HH.mm.ss v + + + + + HH.mm.ss z + + + + + HH.mm.ss + + + + + HH.mm + + + + + + + {0} {1} + + + + HH:mm + HH:mm:ss + H:mm + L + E, d MMM + LLL + E, d MMM + MMMM d, EEEE + MMMM d + d MMM + d.M + d + mm:ss + mm:ss + yyyy + MM/yyyy + EEE, dd/MM/yyyy + MMM yyyy + EEE, d MMM yyyy + MMMM yyyy + Q 'кв'. yyyy + QQQ yyyy + Q yy + MM/yyyy + MMMM yyyy + + + {0} - {1} + + M-M + + + E, d.M - E, d.M + E, d.M - E, d.M + + + MMM-MMM + + + E, d MMM - E, d MMM + E, d - E, d MMM + + + d MMM - d MMM + d-d MMM + + + d.M - d.M + d.M - d.M + + + d-d + + + HH-HH + + + HH.mm-HH.mm + HH.mm-HH.mm + + + HH.mm-HH.mm v + HH.mm-HH.mm v + + + HH-HH v + + + y-y + + + M.yy - M.yy + M.yy - M.yy + + + E, d.M.yy - E, d.M.yy + E, d.M.yy - E, d.M.yy + E, d.M.yy - E, d.M.yy + + + MMM-MMM yyyy + MMM yyyy - MMM yyyy + + + E, d MMM - E, d MMM yyyy + E, d - E, d MMM yyyy + E, d MMM yyyy - E, d MMM yyyy + + + d MMM - d MMM yyyy + d-d MMM yyyy + d MMM yyyy - d MMM yyyy + + + d.M.yy - d.M.yy + d.M.yy - d.M.yy + d.M.yy - d.M.yy + + + + + + эра + + + год + + + месяц + + + тыдзень + + + дзень + сёння + заўтра + паслязаўтра + учора + пазаўчора + + + дзень тыдня + + + Dayperiod + + + гадзіна + + + хвіліна + + + секунда + + + Zone + + + + + + +HH:mm;-HH:mm + GMT{0} + Час: {0} + {1} ({0}) + + Невядомы + + + Рыё Бранка + + + Кампа Грандэ + + + Сан-Паўлу + + + Ганалулу + + + Анкорыдж + + + Лос-Анджэлас + + + Фэнікс + + + Дэнвэр + + + Чыкага + + + Індыянапаліс + + + Нью-Ёрк + + + false + + + false + + + false + + + false + + + + Паўночнаамэрыканскі цэнтральны час + Паўночнаамэрыканскі цэнтральны стандартны час + Паўночнаамэрыканскі цэнтральны летні час + + false + + + + Паўночнаамэрыканскі усходні час + Паўночнаамэрыканскі усходні стандартны час + Паўночнаамэрыканскі усходні летні час + + false + + + + Паўночнаамэрыканскі горны час + Паўночнаамэрыканскі горны стандартны час + Паўночнаамэрыканскі горны летні час + + false + + + + Ціхаакіянскі час + Ціхаакіянскі стандартны час + Ціхаакіянскі летні час + + false + + + false + + + false + + + + Атлянтычны час + Атлянтычны стандартны час + Атлянтычны летні час + + false + + + false + + + false + + + false + + + false + + + + Цэнтральнаэўрапейскі час + Цэнтральнаэўрапейскі летні час + + false + + + + Усходнеэўрапейскі час + Усходнеэўрапейскі летні час + + false + + + + Заходнеэўрапейскі час + Заходнеэўрапейскі летні час + + false + + + false + + + + Грынвічскі час + + true + + + false + + + false + + + false + + + false + + + false + + + false + + + + + + , +   + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + ¤#,##0.00 + + + + + + аўстралійскі даляр + $A + + + бразільскі рэал + + + Руб + + + беларускі рубель + + + кітайскі юань Renminbi + + + эрытрэйская накфа + + + еўра + + + англійскі фунт + £ + + + індыйская рупія + Rs. + + + японская іена + ¥ + + + нарвэская крона + + + рускі рубель + рас. руб. + + + долар ЗША + $ + + + невядомая або недапушчальная валюта + + + + + + {0} дні + {0} дзён + {0} дзень + {0} дня + + + {0} гадзіны + {0} гадзін + {0} гадзіна + {0} гадзіны + + + {0} хвіліны + {0} хвілін + {0} хвіліна + {0} хвіліны + + + {0} месяца + {0} месяцаў + {0} месяц + {0} месяца + + + {0} сэкунды + {0} сэкунд + {0} сэкунда + {0} сэкунды + + + {0} тыдні + {0} тыдняў + {0} тыдзень + {0} тыдня + + + {0} гады + {0} гадоў + {0} год + {0} году + + + + + так:т + не:н + + + diff --git a/libs/Zend/Locale/Data/be_BY.xml b/libs/Zend/Locale/Data/be_BY.xml new file mode 100644 index 0000000..13d5d47 --- /dev/null +++ b/libs/Zend/Locale/Data/be_BY.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/bg.xml b/libs/Zend/Locale/Data/bg.xml new file mode 100644 index 0000000..c6dafe0 --- /dev/null +++ b/libs/Zend/Locale/Data/bg.xml @@ -0,0 +1,3014 @@ + + + + + + + + + + + афар + абхазски + ачински + аколи + адангме + адиге + авестски + африканс + афро-азиатски + африхили + айну + акан + акадски + алеутски + алгонквин + южноалтайски + амхарски + арагонски + староанглийски (ca.450-1100) + езици на апахите + арабски + арамейски + мапуче + арапахо + изкуствен + аравак + асамски + астурски + атабаски езици + австралийски езици + аварски + авади + аймара + азърбайджански + башкирски + банда + бамикеле + балучи + балинейски + баса + прибалтийски (други) + беларуски + бея + бемба + берберски + български + бихари + божпури + бислама + биколски + бини + сиксика + бамбара + бенгалски + банту + тибетски + бретонски + брадж + босненски + батак + бурятски + бугински + биленски + каталонски + каддо + централноамерикански индиански + карибски + кавказски + чеченски + себуано + келтски + чаморо + чибча + чагатай + чуук + марийски + жаргон чинуук + чокто + Чиипувски + чероки + чейенски + чамски + корсикански + коптски + креолски, от английски (други) + креолски, от френски (други) + креолски, от португалски (други) + крии + кримскотатарски + креолски (други) + чешки + кашубски + църковно славянски + кушитски езици + чувашки + уелски + датски + дакотски + даргва + Даякски + немски + Делауер + славянски + догриб + Динка + догри + дравидски езици + Долносербски + дуала + холандски, средновековен (1050-1350) + дивехи + диула + дзонха + еуе + ефик + египетски + екажук + гръцки + еламитски + английски + австралийски английски + британски английски + американски английски + английски (1100-1500) + есперанто + испански + естонски + баски + евондо + персийски + Фанг + Фанти + Фула + фински + Филипински + угрофински + Фиджийски + Фарьорски + Фон + френски + френски (1400-1600) + френски (842-1400) + Фриулиански + фризийски + ирландски + га + гайо + гбая + шотландски галски + германски (други) + Гииз + Гилбертски + галисийски + немски (1050-1500) + гуарани + старовисоконемски + гонди + горонтало + готически + гребо + древногръцки + гуджарати + манкски + хауза + хайда + хавайски + иврит + хинди + хилигайнон + химачали + хитски + хмонг + хири моту + хърватски + Горносербски + хаитянски + унгарски + хупа + арменски + хереро + интерлингва + ибан + индонезийски + оксидентал + игбо + иджо + инупиак + илоко + индийски (други) + индо-европейски (други) + ингушетски + идо + ирански + Ироквиански езици + исландски + италиански + инуктитут + японски + лоджбан + еврейско-персийски + еврейско-арабски + явански + грузински + Каракалпашки + кабилски + Качински + камба + каренски + кави + кабардиан + конгоански + кхаси + езици коисан + котски + кикуйу + Кваняма + казахски + Гренландски ескимоски + кхмерски + кимбунду + каннада + корейски + конкани + кпеле + канури + карачай-балкарски + Кру + Курук + кашмирски + кюрдски + кумикски + кутенай + Коми + корнуолски келтски + киргизски + латински + люксембургски + лингала + лаоски + литовски + латвийски + масайски + малгашки + ирландски (900-1200) + маорски + други езици + македонски + малаялам + монголски + молдовски + маратхи + малайски + малтийски + бирмански + северноамерикански индиански (други) + неаполитански + непалски + холандски + фламандски + съвременен норвежки + норвежки + нубийски езици + чинянджа + окситански + ория + осетски + турски, отомански (1500-1928) + старотурски езици + пенджабски + папуаски (други) + староперсийски (600-400 пр.н.е.) + филипински (други) + финикийски + полски + провансалски + пущу + португалски + кечуа + раджастански + реторомански + рунди + румънски + романски (други) + цигански език + руски + киняруанда + санкскритски + якутски + южноамерикански индиански (други) + сардински + сицилиански + синдхи + семитски (други) + санго + староирландски (до 900) + жестомимичен език + сърбохърватски + синхалски + словашки + словенски + славянски (други) + самоански + сомалийски + албански + сръбски + суази + сесуто + сундански + шумерски + шведски + суахили + сирийски + тамилски + тайландски (други) + телугу + таджикски + таи + тигриня + туркменски + тагалог + клингон + турски + татарски + алтайски + туи + таитянски + уйгурски + украински + неопределен + урду + узбекски + виетнамски + волоф + ксоса + идиш + китайски + китайски (опростен) + китайски (традиционен) + зулуски + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Земята + Африка + Северноамерикански континент + Южна Америка + Океания + Западна Афирка + Централна Америка + Източна Африка + Северна Африка + Централна Африка + Южноафрикански регион + Америка + Северна Америка + Карибски о-ви + Източна Азия + Южна Азия + Югоизточна Азия + Южна Европа + Австралия и Нова Зеландия + Меланезия + Микронезия + Полинезия + Южна Азия [062] + Азия + Централна Азия + Западна Азия + Европа + Източна Европа + Северна Европа + Западна Европа + Общност на независимите държави + Латинска Америка и Карибски басейн + Нормандски о-ви + Андора + Обединени Арабски Емирства + Афганистан + Антигуа и Барбуда + Ангуила + Албания + Армения + Холандски Антили + Ангола + Антарктика + Аржентина + Американско Самоа + Австрия + Австралия + Аруба + Аландски о-ви + Азербайджан + Босна и Херцеговина + Барбадос + Бангладеш + Белгия + Буркина Фасо + България + Бахрейн + Бурунди + Бенин + Бермуда + Бруней Дарусалам + Боливия + Бразилия + Бахами + Бутан + Остров Буве + Ботсуана + Беларус + Белиз + Канада + Кокосови (Кийлинг) острови + Демократична Република Конго + Централноафриканска Република + Конго + Швейцария + Бряг на Слоновата кост + Острови Кук + Чили + Камерун + Китай + Колумбия + Коста Рика + Сърбия и Черна Гора + Куба + Кабо Верде + Остров Кристмас + Кипър + Чешка Република + Германия + Джибути + Дания + Доминика + Доминиканска Република + Алжир + Еквадор + Естония + Египет + Западна Сахара + Еритрея + Испания + Етиопия + Финландия + Фиджи + Фолклендски острови + Микронезия, Обединени Щати + Фарьорски острови + Франция + Габон + Обединено кралство + Гренада + Грузия + Френска Гвиана + о. Гърнзи + Гана + Гибралтар + Гренландия + Гамбия + Гвинея + Гваделупа + Екваториална Гвинея + Гърция + Южна Джорджия и Южни Сандвичеви Острови + Гватемала + Гуам + Гвинея-Бисау + Гвиана + Хонг-Конг + Остров Хърд и Острови Макдоналд + Хондурас + Хърватска + Хаити + Унгария + Индонезия + Ирландия + Израел + о.Ман + Индия + Британски територии в Индийския океан + Ирак + Иран, Ислямска република + Исландия + Италия + о. Джързи + Ямайка + Йордания + Япония + Кения + Киргизстан + Камбоджа + Кирибати + Комори + Сейнт Китс и Невис + Корея, Северна + Корея, Южна + Кувейт + Кайманови острови + Казахстан + Народна Демократична Република Лаос + Ливан + Сейнт Лусия + Лихтенщайн + Шри Ланка + Либерия + Лесото + Литва + Люксембург + Латвия + Либийска Арабска Джамахирия + Мароко + Монако + Молдова, Република + Черна Гора + Мадагаскар + Маршалови Острови + Македония, Република + Мали + Мианмар + Монголия + Макао + Северни Мариански Острови + Мартиника + Мавритания + Монсерат + Малта + Мавриций + Малдиви + Малави + Мексико + Малайзия + Мозамбик + Намибия + Нова Каледония + Нигер + Остров Норфолк + Нигерия + Никарагуа + Холандия + Норвегия + Непал + Науру + Ниуе + Нова Зеландия + Оман + Панама + Перу + Френска Полинезия + Папуа Нова Гвинея + Филипини + Пакистан + Полша + Сен Пиер и Мигелон + Питкайрн + Пуерто Рико + Палестински територии + Португалия + Палау + Парагвай + Катар + Океания [QO] + Европейски съюз + Реюниън + Румъния + Сърбия + Руска Федерация + Руанда + Саудитска Арабия + Соломонови Острови + Сейшели + Судан + Швеция + Сингапур + Света Елена + Словения + Свалбард и Ян Майен + Словакия + Сиера Леоне + Сан Марино + Сенегал + Сомалия + Суринам + Сао Томе и Принципе + Ел Салвадор + Сирийска Арабска Република + Суазиленд + Острови Туркс и Кайкос + Чад + Френски Южни Територии + Того + Тайланд + Таджикистан + Токелау + Източен Тимор + Туркменистан + Тунис + Тонга + Турция + Тринидад и Тобаго + Тувалу + Тайван + Танзания + Украйна + Уганда + САЩ - външни острови + САЩ + Уругвай + Узбекистан + Свещено море (Ватиканска държава) + Сейнт Винсънт и Гренадини + Венецуела + Британски Вирджински Острови + САЩ, Вирджински Острови + Виетнам + Вануату + Уолис и Футуна + Самоа + Йемен + Мейот + Южна Африка + Замбия + Зимбабве + Непознатa или несъществуваща област + + + Календар + Сортиране + Валута + + + Традиционен китайски (Big5) + Будистки календар + Китайски календар + Директно + Опростен китайски (GB2312) + Григориански календар + Еврейски календар + Ислямски календар + Ислямски цивилен календар + Японски календар + Азбучен ред + Сортиране Пинин + Сортиране по щрих + Традиционно + + + Американска + Метрична + + + + lowercase-words + + + [а-ъ ь ю я] + [i v x {а̀} ѐ ѝ {о̀} {у̀} {ъ̀} ѣ {ю̀} {я̀} ѫ] + + + « + » + + + + + GanjkHmsSEDFwWxhKzAeugXZvcL + + + + + + ян. + февр. + март + апр. + май + юни + юли + авг. + септ. + окт. + ноем. + дек. + + + януари + февруари + март + април + май + юни + юли + август + септември + октомври + ноември + декември + + + + + я + ф + м + а + м + ю + ю + а + с + о + н + д + + + + + + + нд + пн + вт + ср + чт + пт + сб + + + неделя + понеделник + вторник + сряда + четвъртък + петък + събота + + + + + н + п + в + с + ч + п + с + + + + + + + I трим. + II трим. + III трим. + IV трим. + + + 1-во тримесечие + 2-ро тримесечие + 3-то тримесечие + 4-то тримесечие + + + + пр. об. + сл. об. + + + пр.Хр. + сл.Хр. + + + пр. н. е. + от н. е. + + + сл.н.е. + + + + + + dd MMMM yyyy, EEEE + + + + + dd MMMM yyyy + + + + + dd.MM.yyyy + + + + + dd.MM.yy + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1} {0} + + + + E d + H + HH:mm + HH:mm:ss + E MMM d + MMMM d + dd MMMM + dd.MM + h:mm a + h:mm:ss a + mm:ss + yy-MM + Q yy + yyyy + MM.yyyy + MMMM yyyy + QQQQ yyyy 'г'. + + + {0} - {1} + + M-M + + + dd.MM E - dd.MM E + dd.MM E - dd.MM E + + + MMM-MMM + + + dd MMM E - dd MMM E + dd MMM E - dd MMM E + + + dd MMM - dd MMM + dd-dd MMM + + + dd.MM - dd.MM + dd.MM - dd.MM + + + d-d + + + HH-HH + + + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH-HH v + + + y-y + + + MM.yy - MM.yy + MM.yy - MM.yy + + + dd.MM.yy E - dd.MM.yy E + dd.MM.yy E - dd.MM.yy E + dd.MM.yy E - dd.MM.yy E + + + MMM-MMM yyyy + MMM yyyy - MMM yyyy + + + dd MMM yyyy, E - dd MMM yyyy, E + dd MMM yyyy, E - dd MMM yyyy, E + dd MMM yyyy, E - dd MMM yyyy, E + + + dd MMM - dd MMM yyyy + dd-dd MMM yyyy + dd MMM yyyy - dd MMM yyyy + + + dd.MM.yy - dd.MM.yy + dd.MM.yy - dd.MM.yy + dd.MM.yy - dd.MM.yy + + + + + + ера + + + година + + + месец + + + седмица + + + Ден + Днес + Утре + Вдругиден + Вчера + Онзи ден + + + Ден от седмицата + + + ден + + + час + + + минута + + + секунда + + + зона + + + + + + +HHmm;-HHmm + Гриинуич{0} + {0} + + Неизвестен + + + Андора + + + Дубай + + + Кабул + + + Антигуа + + + Ангила + + + Тирана + + + Ереван + + + Кюрасао + + + Луанда + + + Ротера + + + Палмър + + + Южен полюс + + + Суова + + + Моусън + + + База Дейвис + + + Восток + + + Кейси + + + Дюмон Дюрвил + + + Мак Мърдоу + + + Рио Галегос + + + Мендоса + + + Сан Хуан + + + Ушуая + + + Ла Риоха + + + Катамарка + + + Джуджую + + + Тукуман + + + Кордоба + + + Буенос Айрес + + + Паго Паго + + + Виена + + + Пърт + + + Даруин + + + Адълид + + + Броукън Хил + + + Мелбърн + + + Хоубарт + + + Линдеман + + + Сидни + + + Бризбейн + + + Лорд Хов + + + Аруба + + + Баку + + + Бриджтаун + + + Дака + + + Брюксел + + + Уагадугу + + + София + + + Бахрейн + + + Бужумбура + + + Порто Ново + + + Бермудски О-ви + + + Бруней + + + Ла Пас + + + Ейрунепе + + + Рио Бранко + + + Порту Вельо + + + Буа Виста + + + Мануас + + + Чуяба + + + Кампо Гранде + + + Белем + + + Арагуайна + + + Сао Пауло + + + Бахиа + + + Фортацела + + + Масейо + + + Ресифе + + + Норонха + + + Насау + + + Тхимпу + + + Габороне + + + Минск + + + Белмопан + + + Доусън + + + Уайтхорс + + + Инувик + + + Ванкувър + + + Доусън Крийк + + + Йелоунайф + + + Едмънтън + + + Суифт Кърент + + + Кеймбридж Бей + + + Регина + + + Уинипег + + + Рейни Ривър + + + Ранкин Инлет + + + Тъндър Бей + + + Нипигон + + + Торонто + + + Монреал + + + Иквалуит + + + Пангниртунг + + + Халифакс + + + Гус Бей + + + Глейс Бей + + + Сейнт Джоунс + + + Кокос + + + Киншаса + + + Лубумбаши + + + Банги + + + Бразавил + + + Цюрих + + + Абиджан + + + Раротонга + + + Великденски о-ви + + + Сантиаго + + + Дуала + + + Кашгар + + + Урумчи + + + Чунцин + + + Шанхай + + + Харбин + + + Богота + + + Сан Хосе + + + Хавана + + + Кабо Верде + + + Коледни о-ви + + + Никозия + + + Берлин + + + Джибути + + + Копенхаген + + + Доминика + + + Санто Доминго + + + Алжир + + + о-ви Галапагос + + + Гуаякил + + + Талин + + + Кайро + + + Ел Аюн + + + Асмера + + + Канарски о-ви + + + Сеута + + + Мадрид + + + Адис Абеба + + + Хелзинки + + + Фиджи + + + Стенли + + + о-ви Трук + + + о. Понапе + + + о. Косрае + + + Фарьорите + + + Париж + + + Либървил + + + Лондон + + + Сент Джорджес + + + Тбилиси + + + Кайен + + + Акра + + + Гибралтар + + + Туле + + + Готхоб + + + Сгорсбисон + + + Данмаркшавн + + + Банджул + + + Конакри + + + Бас Тер + + + Малабо + + + Атина + + + Южна Джорджия + + + Гватемала + + + Гуам + + + Бисау + + + Джорджтаун + + + Хонг Конг + + + Порт-о-Пренс + + + Будапеща + + + Джакарта + + + Понтианак + + + Макасарски проток + + + Джаяпура + + + Дъблин + + + Йерусалим + + + Чагос + + + Багдад + + + Техеран + + + Рейкявик + + + Рим + + + Кингстън + + + Аман + + + Токио + + + Найроби + + + Бишкек + + + Пном Пен + + + о. Ендърбъри + + + о. Рождество + + + о. Тарава + + + Коморски о-ви + + + Сейнт Китс + + + Пхенян + + + Сеул + + + Кувейт + + + Кайманите + + + Аятау + + + Арал + + + Аятобе + + + Язилорда + + + Алма Ата + + + Виентян + + + Бейрут + + + Св. Лучия + + + Вадуц + + + Коломбо + + + Монровия + + + Масеру + + + Вилнюс + + + Люксембург + + + Рига + + + Триполи + + + Казабланка + + + Монако + + + Кишинев + + + Антананариво + + + Квайджален + + + Мажуро + + + Бамако + + + Рангун + + + Кобдо + + + Уланбатор + + + Чойбалсан + + + Макау + + + Сайпан + + + Мартиник + + + Нуакшот + + + Монсерат + + + Ла Валета + + + Мавриций + + + Малдивски О-ви + + + Блантайр + + + Тихуана + + + Хермосило + + + Мацатлан + + + Чиуауа + + + Монтерей + + + Мексико + + + Мерида + + + Канкун + + + Куала Лумпур + + + Кучин + + + Мапуту + + + Виндхук + + + Нумеа + + + Ниамей + + + Норфолк + + + Лагос + + + Манагуа + + + Амстердам + + + Осло + + + Катманду + + + Науру + + + Ниуе + + + о-ви Чатам + + + Окланд + + + Мускат + + + Панама + + + Лима + + + Таити + + + Маркизки о-ви + + + Гамбиер + + + Порт Морсби + + + Манила + + + Карачи + + + Варшава + + + Микелон + + + Питкерн + + + Пуерто Рико + + + Газа + + + Азорски о-ви + + + Мадейра + + + Лисабон + + + Палау + + + Асунсион + + + Катар + + + Реюнион + + + Букурещ + + + Калининград + + + Москва + + + Самара + + + Екатерининбург + + + Омск + + + Новосибирск + + + Красноярск + + + Иркутск + + + Якутск + + + Владивосток + + + Сахалин + + + Магадан + + + п-в Камчатка + + + Анадир + + + Кигали + + + Рияд + + + Гуадалканал + + + Махе + + + Хартум + + + Стокхолм + + + Сингапур + + + Св. Елена + + + Лонгирбюен + + + Фрийтаун + + + Дакар + + + Могадишо + + + Парамарибо + + + Сао Томе + + + Сан Салвадор + + + Дамаск + + + Мбабане + + + Гранд Тюрк + + + Нджамена + + + Кергелен + + + Ломе + + + Бангкок + + + Душанбе + + + Факаофо + + + Дили + + + Ашхабад + + + Тунис + + + Тонгатапу + + + Истанбул + + + Порт ъф Спейн + + + Фунафути + + + Тайпей + + + Дар ес Салаам + + + Ужгород + + + Киев + + + Севастопол + + + Запорожие + + + Кампала + + + о. Мидуей + + + о. Джонсън + + + о. Уейк + + + Адак + + + Ноум + + + Хонолулу + + + Анкоридж + + + Якутат + + + Джуно + + + Лос Анжелис + + + Буаз + + + Финикс + + + Шипрок + + + Денвър + + + Сентър + + + Чикаго + + + Меномнии + + + Нокс + + + Маренго + + + Индианополис + + + Луизвил + + + Веве + + + Монтичело + + + Детройт + + + Ню Йорк + + + Монтевидео + + + Самарканд + + + Ташкент + + + Св. Винсент + + + Каракас + + + Тортола + + + Св. Томас + + + Сайгон + + + Ефате + + + Уолис + + + Апиа + + + Аден + + + Майоте + + + Йоханесбург + + + Лусака + + + Хараре + + + + Часова зона Аляска + Лятна часова зона Аляска + + + + + Американска централна часова зона + Американска централна лятна часова зона + + + + + Американска източна часова зона + Американска източна лятна часова зона + + + + + Американска планинска часова зона + Американска планинска лятна часова зона + + + + + Тихоокеанска часова зона + Тихоокеанска лятна часова зона + + + + + Атлантическа часова зона + Атлантическа лятна часова зона + + + + + Китайска часова зона + + + + + Централноевропейска часова зона + Централноевропейска лятна часова зона + + + + + Източноевропейска часова зона + Източноевропейска лятна часова зона + + + + + Часова зона Гринуич + + + + + Часова зона Израел + Лятна часова зона Израел + + + + + Японска часова зона + Японска часова зона + + + + + Часова зона Нюфаундленд + Лятна часова зона Нюфаундленд + + + + + + + , +   + ; + % + 0 + + + - + + + Н/Ч + + + + + #,##0.### + + + + + + + #0% + + + + + + + #,##0.00 ¤ + + + + + + Андорска песета + + + Обединени арабски емирства-дирхам + + + Афганистански афган (1927-2002) + + + Афганистански афган + Af + + + Албански лек + lek + + + Арменски драм + dram + + + Антилски гулден + NA f. + + + Анголска кванца + + + Анголска кванца (1977-1990) + + + Анголска нова кванца (1990-2000) + + + Анголска нова кванца (1995-1999) + + + Аржентинско песо (1983-1985) + + + Аржентинско песо + Arg$ + + + Австрийски шилинг + + + Австралийски долар + $A + + + Арубски гилдер - о. Аруба + + + Азербайджански манат + + + Босна и Херцеговина-динар + + + Босненска конвертируема марка + KM + + + Барбейдоски долар + BDS$ + + + Бангладешка така + Tk + + + Белгийски франк (конвертируем) + + + Белгийски франк + BF + + + Белгийски франк (финансов) + + + Български конвертируем лев (1962-1999) + лв + + + Български лев + лв. + + + Бахрейнски динар + BD + + + Бурундийски франк + Fbu + + + Бермудски долар + Ber$ + + + Брунейски долар + + + Боливийско боливиано + Bs + + + Боливийско песо + + + Бразилски реал + + + Бахамски долар + + + Бутански нгултрум + Nu + + + Ботсуанска пула + + + Беларуска нова рубла (1994-1999) + + + Беларуска рубла + Rbl + + + Белизийски долар + BZ$ + + + Канадски долар + Can$ + + + Конгоански франк + + + Швейцарски франк + SwF + + + Чилийско песо + Ch$ + + + Китайски ренминби юан + Y + + + Колумбийско песо + Col$ + + + Костарикански колон + C + + + Чехословашка конвертируема крона + + + Кубинско песо + + + Кабо Верде ескудо + CVEsc + + + Кипърска лира + £C + + + Чешка крона + + + Германска марка + + + Джибутски франк + DF + + + Датска крона + DKr + + + Доминиканско песо + RD$ + + + Алжирски динар + DA + + + Еквадорско сукре + + + Естонска крона + + + Египетска лира + + + Еритрейска накфа + + + Испанска песета + + + Етиопски бир + Br + + + Евро + + + Финландска марка + + + Фиджи - долар + F$ + + + Фолкландска лира + + + Френски франк + + + Британска лира + + + Грузински лари + lari + + + Ганайски седи + + + Гибралтарска лира + + + Гамбийски даласи + + + Гвинейски франк + GF + + + Гръцка драхма + + + Гватемалски кветзал + Q + + + Гвинея-Бисау песо + + + Гаянски долар + G$ + + + Хонгконгски долар + HK$ + + + Хондураска лемпира + L + + + Хърватски динар + + + Хърватска куна + + + Хаитски гурд + + + Унгарски форинт + Ft + + + Индонезийска рупия + Rp + + + Ирландска лира + IR£ + + + Израелска лира + + + Израелски нов шекел + + + Индийска рупия + INR + + + Иракски динар + ID + + + Ирански риал + RI + + + Исландска крона + + + Италианска лира + + + Ямайски долар + J$ + + + Йордански динар + JD + + + Японска йена + + + Кенийски шилинг + K Sh + + + Киргистански сом + som + + + Камбоджански риел + CR + + + Коморски франк + CF + + + Севернокорейски вон + + + КНДР вон + + + Кувейтски динар + KD + + + Кайманови острови - долар + + + Казахстанско тенге + T + + + Лаоски кип + + + Ливанска лира + LL + + + Шриланкска рупия + SL Re + + + Либерийски долар + + + Лесотско лоти + M + + + Литовски литаз + + + Люксембургски франк + + + Латвийски лат + + + Латвийска рубла + + + Либийски динар + LD + + + Марокански дирхам + + + Марокански франк + + + Молдовско леу + + + Малгашки франк - Мадагаскар + + + Македонски денар + MDen + + + Миянмарски (Бирма) кият + + + Монголски тугрик + Tug + + + Макао - патака + + + Мавританска огия + UM + + + Малтийска лира + Lm + + + Маврицийска рупия + + + Малдивска руфия + + + Малавийска квача + MK + + + Мексиканско ново песо + MEX$ + + + Мексиканско сребърно песо (1861-1992) + + + Малайзийски рингит + RM + + + Мозамбикско ескудо + + + Мозамбикски метикал + Mt + + + Намибийски долар + N$ + + + Нигерийска найра + + + Никарагуанска кордоба + + + Холандски гулден + + + Норвежка крона + NKr + + + Непалска рупия + Nrs + + + Новозеландски долар + $NZ + + + Омански риал + RO + + + Панамски балбоа + + + Перуански нов сол + + + Перуански сол + + + Папуа-новогвинейска кина + + + Филипинско песо + + + Пакистанска рупия + Pra + + + Полска злота + Zl + + + Полска злота (1950-1995) + + + Португалско ескудо + + + Парагвайско гуарани + + + Катарски риал + QR + + + Стара румънска лея + leu + + + Румънска лея + + + Сръбски динар + + + Руска рубла + Руб. + + + Руска рубла (1991-1998) + + + Руандски франк + + + Саудитскоарабски риал + SRl + + + Соломонови острови - долар + SI$ + + + Сейшелска рупия + SR + + + Судански динар + + + Суданска лира + + + Шведска крона + SKr + + + Сингапурски долар + S$ + + + Света Елена лира + + + Словенски толар + + + Словашка крона + Sk + + + Сиералеонско леоне + + + Сомалийски шилинг + Sh. + + + Суринамски гилдер + Sf + + + Сао Томе и Принсипи - добра + Db + + + Съветска рубла + + + Салвадорски колон + + + Сирийска лира + LS + + + Свазилендски лилангени + E + + + Тайландски бат + + + Таджикистанска рубла + + + Таджикистански сомони + + + Туркменистански манат + + + Тунизийски динар + + + Тонга - па анга + T$ + + + Тиморско ескудо + + + Турска лира + TL + + + Нова турска лира + + + Тринидат и Тобаго - долар + TT$ + + + Тайвански долар + NT$ + + + Танзанийски шилинг + T Sh + + + Украинска хривня + + + Украински карбованец + + + Угандийски шилинг (1966-1987) + + + Угандийски нов шилинг + U Sh + + + САЩ долар + + + Уругвайско песо (1975-1993) + + + Уругвайско песо + Ur$ + + + Узбекистански сум + + + Венесуелски боливар + Be + + + Виетнамски донг + + + Вануату - вату + VT + + + Самоа - тала + + + Буркина Фасо - CFA - франк + + + Злато + + + Източнокарибски долар - Антигуа + EC$ + + + Еку на ЕИО + + + Френски златен франк + + + Бенин - CFA франк + + + Френскополинезийски франк + CFPF + + + Непозната или невалидна валута + + + Йеменски динар + + + Йеменски риал + YRl + + + Югославски динар + + + Югославски конвертируем динар + + + Южноафрикански ранд (финансов) + + + Южноафрикански ранд + R + + + Замбийска квача + + + Заирско ново зайре + + + Заирско зайре + + + Зимбабвийски долар + Z$ + + + + + + да:д + не:н + + + diff --git a/libs/Zend/Locale/Data/bg_BG.xml b/libs/Zend/Locale/Data/bg_BG.xml new file mode 100644 index 0000000..5649d7f --- /dev/null +++ b/libs/Zend/Locale/Data/bg_BG.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/bn.xml b/libs/Zend/Locale/Data/bn.xml new file mode 100644 index 0000000..eca8d99 --- /dev/null +++ b/libs/Zend/Locale/Data/bn.xml @@ -0,0 +1,2919 @@ + + + + + + + + + + + , + + + আফার + আব্খাজিয় + আচিনিয় + আকোলী + অদাগ্মে + আদেগে + আবেস্তীয় + আফ্রিকান্স + অফ্রো-এশিয়াটিক + আফ্রিহিলি + আইনু + আকান + আক্কাদিয়ান + আলেউত + আলগোঙকুইআন + দক্ষিন আলতাই + আমহারিক + আর্গোনিজ + প্রাচীন ইংরেজী + আঙ্গীকা + অ্যাপাচি + আরবী + আরামাইক + অ্যারোকেনিয় + আরাপাহো + কৃত্রিম + আরাওয়াক + আসামি + আস্তুরিয় + আথাপাস্কান + অস্ট্রেলিয় + আভেরিক + আওয়াধি + আয়মারা + আজারবাইজানীয় + বাশকির + বান্দা + বামিলেকে + বেলুচীয় + বালিনীয় + বাসা + বাল্টিক + বেলারুশিয় + বেজা + বেম্বা + বেরবের + বুলগেরিয় + বিহারি + ভোজপুরি + বিসলামা + বিকোল + বিনি + সিকসিকা + বামবারা + বাংলা + বান্টু + তিব্বতি + ব্রেটোন + ব্রাজ + বসনীয় + বাতাক + বুরিয়াত + বুগিনি + ব্লিন + কাতালান + ক্যাডো + মধ্য যুক্তরাষ্ঠের আদিবাসীদের ভাষা + ক্যারিব + ককেশীয + আত্সাম + চেচেন + চেবুয়ানো + কেল্টিক + চামেরো + চিবচা + চাগাতাই + চুকি + মারি + চিনুক পরিভাষা + চক্টো + চিপেওয়ান + চেরোকি + শাইয়েন + চামিক ভাষা + কর্সিকান + কপটিক + ইংরেজি জাত ক্রেওল অথবা পিজিন + ফরাসি জাত ক্রেওল অথবা পিজিন + পোর্তুগিজ-ভিত্তিক ক্রেওল বা পিজন + ক্রি + ক্রাইমিও তুর্কি + ক্রেওল অথবা পিজিন + চেক + কাশুবিয়ান + চার্চ স্লাভিও + কুশিতিক ভাষা + চুবাস + ওয়েলশ + ডেনিশ + ডাকোটা + দার্গওয়া + দায়াক + জার্মান + অস্ট্রিয়ান জার্মানি + সুইস উচ্চ জার্মানি + ডেলাওয়ের + স্ল্যাভ + দোগ্রীব + ডিংকা + দোগরি + দ্রাবীড় ভাষা + নিম্নতর সোর্বিয়ান + দুয়ালা + মধ্য ডাচ + দিবেহি + ডিউলা + ভুটানি + ইওয়ে + এফিক + প্রাচীন মিশরীয় + ইকাজুক + গ্রিক + এলামাইট + ইংরেজি + অস্ট্রেলীয় ইংরেজি + কানাডীয় ইংরেজি + ব্রিটিশ ইংরেজি + যুক্তরাষ্ট্র ইংরেজি + মধ্য ইংরেজি + এস্পেরান্তো + স্পেনীয় + ল্যাটিন আমেরিকান স্প্যানিশ + আইবেরিয়ান স্প্যানিশ + এস্তোনীয় + বাস্ক + ইওন্ডো + ফার্সি + ফ্যাঙ্গ + ফান্তি + ফুলাহ্ + ফিনিশ + ফিলিপিনো + ফিনো-ইউগ্রিক + ফিজিও + ফেরাউনি + ফন + ফরাসি + কানাডীয় ফরাসি + সুইস ফরাসি + মধ্য ফরাসি + প্রাচীন ফরাসি + উত্তরাঞ্চলীয় ফ্রিসিয়ান + পূর্ব ফ্রিসিয় + ফ্রিউলিয়ান + পশ্চিম ফ্রিসিয় + আইরিশ + গা + গায়ো + বায়া + স্কটস-গ্যেলিক + জার্মানিক ভাষা + গীজ + গিলবার্টিজ + গ্যালিশিয় + মধ্য-উচ্চ জার্মানি + গুয়ারানি + প্রাচীন উচ্চ জার্মানি + গোন্ডি + গোরোন্তালো + গথিক + গ্রেবো + প্রাচীন গ্রীক + সুইস জার্মানি + গুজরাটি + ম্যাঙ্কস + গওইচ্’ইন + হাউসা + হাইডা + হাওয়াইয়ান + হিব্রু + হিন্দি + হিলিগ্যায়নোন + হিমাচালি + হিট্টিট + হ্‌মোঙ + হিরি মোতু + ক্রোয়েশীয় + উচ্চ সোর্বিয়ান + হাইতিয়ান + হাঙ্গেরীয় + হুপা + আর্মেনিয় + হেরেরো + ইন্টারলিঙ্গুয়া + ইবান + ইন্দোনেশীয় + ইন্টারলিঙ্গ্ + ইগ্‌বো + সিছুয়ান + ইজো + ইনুপিয়াক + ইলোকো + ভারতীয় ভাষা + ইন্দো-ইউরোপীয় ভাষা + ইঙ্গুশ + ইডো + ইরানী ভাষা + ইরোকুওইয়ান ভাষা + আইসল্যান্ডীয় + ইতালীয় + ইনুক্টিটুট + জাপানি + লোজবান + জুদেও ফার্সি + জুদেও আরবি + জাভানি + জর্জিয়ান + কারা-কাল্পাক + কাবাইলে + কাচিন + অজ্জু + কাম্বা + কারেন + কাউই + কাবার্ডিয়ান + টাইয়াপ + কোরো + কোঙ্গো + খাশি + খোয়েশান ভাষা + খোটানিজ + কিকু্ইয়ু + কোয়ানিয়ামা + কাজাখ + ক্যালাল্লিসুট + খমের + কিম্বুন্দু + কান্নাড়ী + কোরিয়ান + কোঙ্কানি + কোস্রাইন + ক্‌পেল্লে + কানুরি + কারচে-বাল্কার + কারেলিয়ান + ক্রু + কুরুখ + কাশ্মীরী + কুর্দি + কুমিক + কুটেনাই + কোমি + কর্ণিশ + কির্গিজ + লাটিন + লাডিনো + লান্ডা + লাম্বা + লুক্সেমবার্গীয় + লেজঘিয়ান + গ্যান্ডা + লিম্বুর্গিশ + লিঙ্গালা + লাও + মোঙ্গো + লোজি + লিথুয়েনীয + লুবা-কাটাঙ্গা + লুবা-লুলুয়া + লুইসেনো + লুন্ডা + লুয়ো + লুশাই + লাত্‌ভীয় + মাদুরেসে + মাঘি + মৈথিলি + ম্যাকাসার + ম্যান্ডিঙ্গো + অস্ট্রোনেশীয় + মাসাই + মোকশা + ম্যাণ্ডার + মেন্ডে + মালাগাসি + মধ্য আইরিশ + মার্শালিজ + মাওরি + মিকম্যাক + মিনাঙ্গ্‌কাবাউ + বিবিধ ভাষা + ম্যাসেডোনীয + মন-খমের ভাষা + মালেয়ালাম + মঙ্গোলিয় + মাঞ্চু + মণিপুরী + ম্যানোবো ভাষা + মলদাভিয় + মোহাওক + মসি + মারাঠি + মালে + মল্টিয় + বহুগুণিতক ভাষাসমূহ + মুণ্ডা ভাষা + ক্রিক + মিরান্ডিজ + মারোয়ারি + বর্মি + মায়ান ভাষা + এরজিয়া + নাউরু + নাহুৎল + উত্তৱ আমেরিকার ইন্ডিয়ান ভাষা + নেয়াপোলিটান + নরওয়ে বোকমাল + উত্তর এন্দেবিলি + নিম্ন জার্মানি + নেপালী + নেওয়ারি + এন্দোঙ্গা + নিয়াস + নাইজার-কোর্ডোফানিয়ান ভাষা + নিউয়ান + ডাচ + ফ্লেমিশ + নরওয়েজীয় (নিনর্স্ক) + নরওয়েজীয় + নৌগাই + প্রাচীন নর্স + এন’কো + দক্ষিণ এনডেবেলে + উত্তরাঞ্চলীয় সোথো + নুবিয়ান ভাষা + নাভাজো + প্রাচীন নেওয়ারী + নায়াঞ্জা + নায়ামওয়েজি + নায়াঙ্কোলে + নায়োরো + এন্.জিমা + অক্সিটান + ওজিবওয়া + অরোমো + উড়িয়া + ওসেটিক + ওস্যাগে + অটোমান তুর্কি + অটোমান ভাষা + পাঞ্জাবী + পাপুয়ান ভাষা + পাঙ্গাসিনান + পাহ্লাভি + পাম্পাঙ্গা + পাপিয়ামেন্টো + পালায়ুয়ান + প্রাচীন ফার্সি + ফিলিপাইন ভাষা + ফিনিশীয় + পালি + পোলিশ + পোহ্নপেইয়ান + প্রাকৃত ভাষা + প্রাচীন প্রোভেনক্যাল + পশ্তু + পর্তুগীজ + ব্রাজিলীয় পর্তুগীজ + আইবেরিয়ান পর্তুগিজ + কেচুয়া + রাজস্থানী + রাপানুই + রারোটোগ্যান + রেটো-রোমানীয় + রুন্দি + রোমানীয় + রোমান ভাষা + রোমানি + মূল + রুশ + আরোমানিয় + কিনয়ারোয়ান্ডা + সংষ্কৃত + স্যান্ডাওয়ে + ইয়াকুট + উত্তর আমেরিকান ইন্ডিয়ান ভাষা + শালিশান ভাষা + সামারিটান আরামিক + সাসাক + সাঁওতালি + সার্ডিনোয়ান + সিসিলিয়ান + স্কটস + সিন্ধি + উত্তরাঞ্চলীয় সামি + সেল্কুপ + সেমেটিক ভাষা + সাঙ্গো + প্রাচীন আইরিশ + চিহ্ন ভাষা + সার্বো-ক্রোয়েশিয় + শ্যান + সিংহলী + সিডামো + সিওয়ুয়ান ভাষা + সিনো-তিব্বোতীয় ভাষা + স্লোভাক + স্লোভেনীয় + স্ল্যাভিক ভাষা + সামোয়ান + দক্ষিণাঞ্চলীয় সামি + সামি ভাষা + লুলে সামি + ইনারি সামি + স্কোল্ট সামি + শোনা + সোনিঙ্কে + সোমালী + সোগডিয়ান + সোঙ্গহাই + আলবেনীয় + সার্বীয় + স্রানান টোঙ্গো + সেরে + সোয়াতি + নিলো-সাহারান ভাষা + দক্ষিন সোথো + সুদানী + সুকুমা + সুসু + সুমেরীয় + সুইডিশ + সোয়াহিলি + প্রাচীন সিরিও + সিরিয়াক + তামিল + তাই ভাষা + তেলেগু + টাইম্নে + তেরেনো + তেতুম + তাজিক + থাই + তিগরিনিয়া + টাইগ্রে + টিভ + তুর্কমেনী + টোকেলাউ + তাগালগ + ক্লিঙ্গন + ত্লিঙ্গিট + তামাশেক + ত্‍সওয়ানা + টঙ্গা + নায়াসা টোঙ্গা + টোক পিসিন + তুর্কী + ত্‍সঙ্গা + সিমশিয়ান + তাতার + তুম্বুকা + তুপি ভাষা + আলতায়ীক ভাষা + টুভালু + টোয়াই + তাহিতিয়ান + টুভিনিয়ান + উডমুর্ট + উইঘুর + উগারিটিক + ইউক্রেনীয় + উম্বুন্দু + অজানা বা ভুল ভাষা + উর্দু + উজবেকীয় + ভাই + ভেন্ডা + ভিয়েতনামী + ভোলাপুক + ভোটিক + ওয়ালুন + ওয়াকাশান ভাষা + ওয়ালামো + ওয়ারে + ওয়াশা + সোরবিয়ান ভাষা + উওলোফ + কাল্মাইক + জোসা + ইয়াও + ইয়াপেসে + য়িদ্দিশ + ইওরুবা + ইয়ুপিক ভাষা + ঝু্য়াঙ + জাপোটেক + চিত্র ভাষা + জেনাগা + চীনা + সহজ চীনা + প্রথাগত চীনা + জান্ডে + জুলু + জুনি + ভাষাতাত্তিক বিষয়সূচী বহির্ভুত + জাজা + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + পৃথিবী + আফ্রিকা + উত্তর আমেরিক + দক্ষিন আমেরিকা + ওসানিয়া + পশ্চিমাঞ্চলীয় আফ্রিকা + মধ্য আমেরিকা + পশ্চিম আফ্রিকা + উত্তর আফ্রিকা + মধ্য আফ্রিকা + দক্ষিণাঞ্চলীয় আফ্রিকা + আমেরিকা + উত্তরাঞ্চলীয় আমেরিকা + ক্যারাবিয়ান + পশ্চিম এশিয়া + দক্ষিণাঞ্চলীয় এশিয়া + দক্ষিন পূর্ব এশিয়া + দক্ষিণাঞ্চলীয় ইউরোপ + অস্ট্রেলিয়া এবং নিউজিল্যান্ড + ম্যালেনিশা + ম্যালেনিশা অঞ্চল + পলিনেশিয়া + দক্ষিন মধ্য এশিয়া + এশিয়া + মধ্য এশিয়া + পশ্চিমাঞ্চলীয় এশিয়া + ইউরোপ + পশ্চিম ইউরোপ + উত্তরাঞ্চলীয় ইউরোপ + পশ্চিমাঞ্চলীয় ইউরোপ + স্বাধীন রাষ্ট্রের কমনওয়েলথ + ল্যাটিন আমেরিকা এবং ক্যারাবিয়ান + এ্যান্ডোরা + সংযুক্ত আরব আমিরাত + আফগানিস্তান + এন্টিগুয়া ও বারবুডা + এ্যাঙ্গুইলা + আলব্যানিয়া + আর্মেনিয়া + নেদারল্যান্ডস এ্যান্টিলিস + এ্যাঙ্গোলা + এন্টার্কটিকা + আর্জেণ্টাইনা + আমেরিকান সামোয়া + অস্ট্রিয়া + অস্ট্রেলিয়া + আরুবা + আলান্ড দ্বীপপুঞ্জ + আজারবাইজান + বসনিয়া ও হার্জেগোভিনা + বারবাদোস + বাংলাদেশ + বেল্জিয়ম + বুরকিনা ফাসো + বুলগেরিয়া + বাহরাইন + বুরুন্ডি + বেনিন + সেন্ট + বারমুডা + ব্রুনেই + বোলিভিয়া + ব্রাজিল + বাহামা দ্বীপপুঞ্জ + ভুটান + বোভেট দ্বীপ + বতসোয়ানা + বেলোরুশিয়া + বেলজিয়াম + কানাডা + কোকোস দ্বীপপুঞ্জ + কঙ্গো - কিনসাসা + মধ্য আফ্রিকান প্রজাতন্ত্র + কঙ্গো + সুইজর্লণ্ড + আইভরি কোস্ট + কুক দ্বীপপুঞ্জ + চিলি + ক্যামেরুন + চীন + কোলোম্বিয়া + কোস্টারিকা + কিউবা + কেপভার্দে + ক্রিসমাস দ্বীপ + সাইপ্রাস + চেক প্রজাতন্ত্র + জার্মানি + জিবুতি + ডেন্মার্ক + ডোমেনিকা + ডোমেনিকান প্রজাতন্ত্র + এলজিরিয়া + ইকোয়াডর + এস্তোনিয়া + মিশর + পশ্চিমী সাহারা + ইরিত্রিয়া + স্পেন + ইফিওপিয়া + ফিন্ল্যাণ্ড + ফিজি + ফকল্যান্ড দ্বীপপুঞ্জ + মাইক্রোনেশিয়া + ফ্যারও দ্বীপপুঞ্জ + ফ্রান্স + গ্যাবন + গ্রেটবৃটেন + গ্রেনাডা + জর্জিয়া + ফরাসী গায়ানা + গ্রাঞ্জি + গানা + জিব্রাল্টার + গ্রীনল্যান্ড + গাম্বিয়া + গিনি + গুয়াদেলৌপ + নিরক্ষীয় গিনি + গ্রীস্ + দক্ষিণ জর্জিয়া ও দক্ষিণ স্যান্ডউইচ দ্বীপপুঞ + গোয়াটিমালা + গুয়াম + গিনি-বিসাউ + গিয়ানা + হংকং + হার্ড দ্বীপ এবং ম্যাকডোনাল্ড দ্বীপপুঞ্জ + হণ্ডুরাস + ক্রোয়েশিয়া + হাইতি + হাঙ্গেরি + ইন্দোনেশিয়া + আয়ার্লণ্ড + ইস্রায়েল + ম্যানদ্বীপ + ভারত + ব্রিটিশ ভারত মহাসাগরীয় অঞ্চল + ইরাক + ইরান + আইসলণ্ড + ইতালী + জার্সি + জ্যামেকা + জর্ডন + জাপান + কেনিয়া + কির্গিজিয়া + কাম্বোজ + কিরিবাতি + কমোরোস + সেন্ট কিটস ও নেভিস + উত্তর কোরিয়া + দক্ষিণ কোরিয়া + কুয়েত + কেম্যান দ্বীপপুঞ্জ + কাজাকস্থান + লাওস + লেবানন + সেন্ট লুসিয়া + লিচেনস্টেইন + শ্রীলঙ্কা + লাইবিরিয়া + লেসোথো + লিত্ভা + লাক্সেমবার্গ + লাত্ভিয়া + লিবিয়া + মোরক্কো + মোনাকো + মোল্দাভিয়া + মন্টিনিগ্রো + সেন্ট মার্টিন + মাদাগাস্কার + মার্শাল দ্বীপপুঞ্জ + ম্যাসাডোনিয়া + মালি + মায়ানমার + মঙ্গোলিয়া + ম্যাকাও + উত্তরাঞ্চলীয় মারিয়ানা দ্বীপপুঞ্জ + মার্টিনিক + মরিতানিয়া + মন্টসেরাট + মাল্টা + মরিশাস + মালদ্বীপ + মালাউই + মক্সিকো + মাল্যাশিয়া + মোজাম্বিক + নামিবিয়া + নিউ ক্যালেডোনিয়া + নাইজার + নিরফোক দ্বীপ + নাইজেরিয়া + নিকারাগোয়া + হলণ্ড + নরওয়ে + নেপাল + নাউরু + নিউয়ে + নিউ জিলণ্ড + ওমান + পানামা + পিরু + ফরাসী পলিনেশিয়া + পাপুয়া নিউ গিনি + ফিলিপাইন + পাকিস্তান + পোল্যাণ্ড + সেন্ট পিয়ের ও মিকুয়েলন + পিটকেয়ার্ন + পুয়ের্টোরিকো + ফিলিস্তিন অঞ্চল + পর্তুগাল + পালাউ + প্যারাগোয়ে + কাতার + আউটলাইনিং ওসানিয়া + ইউরোপীয় ইউনিয়ন + রিইউনিয়ন + রুমানিয়া + সারবিয়া + রাশিয়া + রুয়ান্ডা + সাউদি আরব + সলোমন দ্বীপপুঞ্জ + সিসিলি + সুদান + সুইডেন + সিঙ্গাপুর + সেন্ট হেলেন + স্লোভানিয়া + স্বালবার্ড ও জান মেয়েন + শ্লোভাকিয়া + সিয়েরালিওন + সান মারিনো + সেনেগাল + সোমালি + সুরিনাম + সাওটোমা ও প্রিন্সিপাল + সালভেডর + সিরিয়া + সোয়াজিল্যান্ড + তুর্কস ও কাইকোস দ্বীপপুঞ্জ + চাদ + ফরাসী দক্ষিণাঞ্চল + টোগো + থাই + তাজিকস্থান + টোকেলাউ + পূর্ব-তিমুর + তুর্কমেনিয়া + টিউনিস্ + টোঙ্গা + তুরস্ক + ত্রিনিনাদ ও টোব্যাগো + টুভালু + তাইওয়ান + তাঞ্জানিয়া + ইউক্রেইন + উগান্ডা + যুক্তরাষ্ট্রের ক্ষুদ্র ও পার্শ্ববর্তী দ্বীপপুঞ্জ + মার্কিন যুক্তরাষ্ট্র + উরুগোয়ে + উজ্বেকিস্থান + ভ্যাটিকান সিটি + সেন্ট ভিনসেন্ট ও দ্যা গ্রেনাডিনস + ভেনেজুয়েলা + ব্রিটিশ ভার্জিন দ্বীপপুঞ্জ + মার্কিন ভার্জিন দ্বীপপুঞ্জ + ভিয়েতনাম + ভানুয়াটু + ওয়ালিস ও ফুটুনা + সামোয়া + ইমেন + মায়োত্তে + দক্ষিণ আফ্রিকা + জাম্বিয়া + জিম্বাবুয়ে + অজানা অথবা ভুল স্থান + + + ক্যালেন্ডার + সজ্জাক্রম + মুদ্রা + + + প্রথাগত চীনা সজ্জাক্রম - বিগ৫ + বৌদ্ধ বর্ষপঞ্জী + চীনা বর্ষপঞ্জী + সঠিক সজ্জাক্রম + সাধারণ চীনা সজ্জাক্রম জিবি২৩১২ + গ্রিগোরিয়ান বর্ষপঞ্জী + হিব্রু বর্ষপঞ্জী + ভারতীয় জাতীয় বর্ষপঞ্জী + ইসলামিক বর্ষপঞ্জী + ইসলামিক সিভিল বর্ষপঞ্জী + জাপানী বর্ষপঞ্জী + ফোনবুক সজ্জাক্রম + পিনিন সজ্জাক্রম + গণপ্রজাতন্ত্রী চীনা বর্ষপঞ্জী + আবর্তিত সজ্জাক্রম + প্রথাগত সজ্জাক্রম + + + মার্কিন + মেট্রিক + + + ভাষা: {0} + লিপি: {0} + অঞ্চল: {0} + + + + [় ঁ-ঃ ৺ অ-ঋ ৠ ঌ ৡ এ ঐ ও-ড {ড়} ঢ {ঢ়} ণ ত ৎ থ-ন প-য {য়} র ল শ-হ ঽ-ৄ ৢ ৣ ে ৈ ো-্ ৗ] + [\u200C \u200D ৸ ৹ ৲ ৳ ০-৪৷ ৫-ৱ] + [৳] + + + + + + + + + + + + + + জানুয়ারী + ফেব্রুয়ারী + মার্চ + এপ্রিল + মে + জুন + জুলাই + আগস্ট + সেপ্টেম্বর + অক্টোবর + নভেম্বর + ডিসেম্বর + + + জানুয়ারী + ফেব্রুয়ারী + মার্চ + এপ্রিল + মে + জুন + জুলাই + আগস্ট + সেপ্টেম্বর + অক্টোবর + নভেম্বর + ডিসেম্বর + + + + + জা + ফে + মা + + মে + জুন + জু + + সে + + + ডি + + + + + + + রবি + সোম + মঙ্গল + বুধ + বৃহস্পতি + শুক্র + শনি + + + রবিবার + সোমবার + মঙ্গলবার + বুধবার + বৃহষ্পতিবার + শুক্রবার + শনিবার + + + + + + সো + + বু + বৃ + শু + + + + + + + + চতুর্থাংশ ১ + চতুর্থাংশ ২ + চতুর্থাংশ ৩ + চতুর্থাংশ ৪ + + + প্রথম চতুর্থাংশ + দ্বিতীয় চতুর্থাংশ + তৃতীয় চতুর্থাংশ + চতুর্থ চতুর্থাংশ + + + + + + + + + + + + পূর্বাহ্ণ + অপরাহ্ণ + + + খৃষ্টপূর্ব + খৃষ্টাব্দ + + + খৃষ্টপূর্ব + খৃষ্টাব্দ + + + + + + EEEE, d MMMM, yyyy + + + + + d MMMM, yyyy + + + + + d MMM, yyyy + + + + + d/M/yy + + + + + + + h:mm:ss a v + + + + + h:mm:ss a z + + + + + h:mm:ss a + + + + + h:mm a + + + + + + + {1} {0} + + + + HH:mm + L + E, d-M + LLL + E d MMM + E d MMMM + d MMMM + d MMM + dd-MM + d/M + d + mm:ss + yyyy + M/yyyy + EEE, d/M/yyy + MMM yyyy + EEE, d MMM, yyyy + MMMM yyyy + Q yyyy + QQQ yyyy + Q yy + MM-yyyy + MMMM yyyy + + + + M-M + + + E, d/M – E, d/M + E, d/M – E, d/M + + + LLL-LLL + + + E, d MMM – E, d MMM + E, d MMM – E, d MMM + + + LLLL-LLLL + + + d MMM – d MMM + d–d MMM + + + d/M - d/M + d/M - d/M + + + d-d + + + h a – h a + h–h a + + + h:mm a – h:mm a + h:mm–h:mm a + h:mm–h:mm a + + + h:mm a – h:mm a v + h:mm–h:mm a v + h:mm–h:mm a v + + + h a – h a v + h–h a v + + + y-y + + + M/yy – M/yy + M/yy – M/yy + + + E, d/M/yy – E, d/M/yy + E, d/M/yy – E, d/M/yy + E, d/M/yy – E, d/M/yy + + + MMM–MMM yyyy + MMM yyyy – MMM yyyy + + + E, d MMM – E, d MMM, yyyy + E, d MMM – E, d MMM, yyyy + E, d MMM, yyyy – E, d MMM, yyyy + + + MM – MM -yyyy + MM-yyyy – MM-yyyy + + + d MMM – d MMM, yyyy + d–d MMM, yyyy + d MMM, yyyy – d MMM, yyyy + + + d/M/yy – d/M/yy + d/M/yy – d/M/yy + d/M/yy – d/M/yy + + + + + + যুগ + + + বছর + + + মাস + + + সপ্তাহ + + + দিন + আজ + আগামীকাল + আগামী পরশু + আগামী তরশু + গতকাল + গত পরশু + গত তরশু + + + সপ্তাহের দিন + + + পূর্বাহ্ণ/অপরাহ্ণ + + + ঘন্টা + + + মিনিট + + + সেকেন্ড + + + এলাকা + + + + + + + + চৈত্র + বৈশাখ + জৈষ্ঠ্য + আষাঢ় + শ্রাবণ + ভাদ্র + আশ্বিন + কার্তিক + অগ্রহায়ণ + পৌষ + মাঘ + ফাল্গুন + + + + + + + + + + + + ১০ + ১১ + ১২ + + + চৈত্র + বৈশাখ + জৈষ্ঠ্য + আষাঢ় + শ্রাবণ + ভাদ্র + আশ্বিন + কার্তিক + অগ্রহায়ণ + পৌষ + মাঘ + ফাল্গুন + + + + + + + + + + + + + + ১০ + ১১ + ১২ + + + চৈত্র + বৈশাখ + জৈষ্ঠ্য + আষাঢ় + শ্রাবণ + ভাদ্র + আশ্বিন + কার্তিক + অগ্রহায়ণ + পৌষ + মাঘ + ফাল্গুন + + + + পূর্বাহ্ন + অপরাহ্ন + + + সাল + + + সাল + + + সাল + + + + + + + + মহরম + সফর + রবিউস আউয়াল + রবিউস সানি + জমাদিউল আউয়াল + জমাদিউল সানি + রজব + শাবান + রমজান + শাওয়াল + জিলকদ + জিলহজ + + + + + + + + + + + + ১০ + ১১ + ১২ + + + মহরম + সফর + রবিউস আউয়াল + রবিউস সানি + জমাদিউল আউয়াল + জমাদিউল সানি + রজব + শাবান + রমজান + শাওয়াল + জিলকদ + জিলহজ + + + + + রবিউস সানি + + + + + + + + + + + + ১০ + ১১ + ১২ + + + মহরম + সফর + রবিউস আউয়াল + রবিউস সানি + জমাদিউল আউয়াল + জমাদিউল সানি + রজব + শাবান + রমজান + শাওয়াল + জিলকদ + জিলহজ + + + + পূর্বাহ্ন + অপরাহ্ন + + + যুগ + + + যুগ + + + যুগ + + + + + + + + মহরম + সফর + রবিউস আউয়াল + রবিউস সানি + জমাদিউল আউয়াল + জমাদিউল সানি + রজব + শাবান + রমজান + শাওয়াল + জিলকদ + জিলহজ + + + + + + + + + + + + + + ১০ + ১১ + ১২ + + + + অপরাহ্ন + অপরাহ্ন + + + যুগ + + + + + + +HH:mm;-HH:mm + গ্রীনিচ মান সময় {0} + {0} সময় + {1} ({0}) + + অজানা + + + রথেরা + + + পামার + + + দক্ষিণ মেরু + + + সিওয়া + + + মসোন + + + ডেভিস + + + ভস্টোক + + + কেইসি + + + ডুমন্ট ডি’উরভিল + + + ম্যাকমুর্ডো + + + রিও গায়েগোস + + + মেন্ডোজা + + + সান হুয়ান + + + উশুয়াইয়া + + + লা রিওহা + + + সান লুইস + + + ক্যাটামার্কা + + + হুহুই + + + টুকুমান + + + কর্ডোবা + + + বুয়েনোস আয়েরেস + + + পার্থ + + + ইউক্লা + + + ডারউইন + + + এ্যাডেলেইড + + + ব্রোকেন হিল + + + কিউরি + + + মেলবার্ন + + + হোবার্ট + + + লিনডেম্যান + + + সিডনি + + + ব্রিসবেন + + + লর্ড হাও + + + আইরুনেপে + + + রিও ব্রাঙ্কো + + + পোর্তো ভেল্‌হো + + + বোয়া ভিস্তা + + + মানাউস + + + কুইয়াবা + + + কাম্পো গ্রান্ডে + + + বেলেম + + + আরাগুয়াইনা + + + সাও পাউলো + + + বাহিয়া + + + ফোর্টালেজা + + + মাসেয়ো + + + রেসিফে + + + নরোন্‌হা + + + ডসোন + + + হো্য়াইট হর্স + + + ইনুভ্যাক + + + ভ্যাঙ্কুভার + + + ডসোন ক্রিক + + + ইয়েলোনাইফ + + + এডমন্টোন + + + সুইফ্ট কারেন্ট + + + কেমব্রিজ বে + + + রেজিনা + + + উইনিপেগ + + + রেসোলুট + + + রেইনি রিভার + + + র‌্যাঙ্কিন ইনলেট + + + কোরাল হার্বার + + + থান্ডার বে + + + নিপিগোন + + + টোরন্টো + + + মন্ট্রিয়াল + + + ইকুয়ালুইট + + + প্যাঙ্গনির্টুং + + + মঙ্কটোন + + + হ্যালিফ্যাক্স + + + গুস বে + + + গ্লাস বে + + + ব্লাঙ্ক-সাব্লোন + + + সেন্ট জন্স + + + কিনশাসা + + + লুবুম্বাশি + + + ইস্টার + + + ক্যাশগার + + + উরুমকি + + + চোঙকিং + + + হার্বিন + + + গ্যালাপ্যাগোস + + + কানেরি + + + সেউটা + + + ট্রুক + + + পোনাপে + + + কোসরায় + + + থুলি + + + স্কোর্সবায়সুন্ড + + + ডানমার্কশ্যাভন + + + জাকার্তা + + + পন্টিয়ান্যাক + + + মাকাসসার + + + জয়াপুরা + + + এন্ডারবারি + + + কিরিতিমাতি + + + টারাওয়া + + + আকটাউ + + + ওরাল + + + আকটোবে + + + কিজিলর্ডা + + + আলমাটি + + + কোয়াজালেইন + + + মাজুরো + + + হোভ্ড + + + উলানবাতার + + + চোইবাল্‌স্যান + + + তিয়াওয়ানা + + + হারমোসিল্লো + + + মাজাটলান + + + চিহুয়াহুয়া + + + মন্টেরি + + + মেক্সিকো সিটি + + + মেরিডা + + + ক্যানকুন + + + কুচিং + + + চ্যাঠাম + + + মার্কেসাস + + + গাম্বিয়ের + + + আজোরেস + + + মাডেইরা + + + কালিনিঙগ্রাড + + + মস্কো + + + ভোল্গোগ্রাদ + + + সামারা + + + ইয়েকাটেরিনবার্গ + + + ওম্স্ক + + + নভোসিবির্স্ক + + + ক্রাসনোইয়ার্স্ক + + + ইর্কুট্স্ক + + + ইয়াকুট্স্ক + + + ভ্লাদিভস্তোক + + + সাখালিন + + + ম্যাগাডান + + + কামচাটকা + + + অ্যানাডির + + + উঝগোরোড + + + কিয়েভ + + + সিমফেরোপোল + + + জাপোরোঝা + + + মিডওয়ে + + + জনস্টন + + + ওয়েক + + + আডাক + + + নোম + + + হনোলুলু + + + এনকোরেজ + + + ইয়াকুটাট + + + জুনো + + + লস এ্যাঞ্জেলেস + + + বয়জি + + + ফিনিক্স + + + শিপ্রক + + + ডেনভার + + + নিউ সালেম, উত্তর ডাকোটা + + + মধ্য, উত্তর ডাকোটা + + + শিকাগো + + + মেনোমিনি + + + ভিনসেন্নেস, ইন্ডিয়ানা + + + পিটারর্সবার্গ, ইন্ডিয়ানা + + + টেলসিটি, ইন্ডিয়ানা + + + নক্স, ইন্ডিয়ানা + + + উইনাম্যাক, ইন্ডিয়ানা + + + মারেঙ্গো, ইন্ডিয়ানা + + + ইন্ডিয়ানাপোলিস + + + লুইসভিল + + + ভেভেয়, ইন্ডিয়ানা + + + মন্টিচেলো, কেন্টাকি + + + ডেট্রোইট + + + নিউইয়র্ক + + + সমরখন্দ + + + + বাংলাদেশ সময় + + + + + + + . + , + ; + % + + # + + + - + E + + + + + + + #,##,##0.### + + + + + + + #E0 + + + + + + + #,##,##0% + + + + + + + #,##,##0.00¤;(#,##,##0.00¤) + + + {0} {1} + {0} {1} + + + + এ্যান্ডোরান পেসেতা + + + সংযুক্ত আরব আমিরাত দিরহাম + + + আফগানি (১৯২৭-২০০২) + + + আফগানি + + + আলবেনিয়ান লেক + + + আরমেনিয়ান দ্রাম + + + নেদারল্যান্ড এ্যান্টিলিয়ান গুল্ডের + + + এ্যাঙ্গোলান কওয়ানজা + + + এ্যাঙ্গোলান কওয়ানজা (১৯৭৭-১৯৯০) + + + এ্যাঙ্গোলান নতুন কওয়ানজা (১৯৯৫-২০০০) + + + এ্যাঙ্গোলান কওয়ানজা (১৯৯৫-১৯৯৯) + + + আর্জেন্টিনা অস্ট্রাল + + + আর্জেন্টিনা পেসো (১৯৮৩-১৯৮৫) + + + আর্জেন্টিনা পেসো + + + অস্ট্রিয়ান শিলিং + + + অস্ট্রেলিয়ান ডলার + + + আরুবা গিল্ডার + + + আজারবাইজান মানাত (১৯৯৩-২০০৬) + + + আজারবাইজান মানাত + + + বসনিয়া এবং হার্জেগোভিনা দিনার + + + বসনিয়া এবং হার্জেগোভিনা মার্ক + + + বার্বেডোজ ডলার + + + বাংলাদেশ টাকা + + + + বেলজিয়ান ফ্রাঙ্ক (রূপান্তরযোগ্য) + + + বেলজিয়ান ফ্রাঙ্ক + + + বেলজিয়ান ফ্রাঙ্ক (আর্থিক) + + + বুলগেরীয় হার্ড লেভ + + + বুলগেরীয় নিউ লেভ + + + বাহরাইনি দিনার + + + বুরুন্ডি ফ্রাঙ্ক + + + বারমিউডান ডলার + + + ব্রুনেই ডলার + + + বলিভিয়ানো + + + বলিভিয়ান পেসো + + + বলিভিয়ান মভডোল + + + ব্রাজিলিয়ান ক্রুজেয়রোনোভো (১৯৬৭-১৯৮৬) + + + ব্রাজিলিয়ান ক্রুজেইডাউ + + + ব্রাজিলিয়ান ক্রুজেয়রো (১৯৯০-১৯৯৩) + + + ব্রাজিলিয়ান রিয়েল + + + ব্রাজিলিয়ান ক্রুজেইডো নোভো + + + ব্রাজিলিয়ান ক্রুজেয়রো + + + বাহামিয়ান ডলার + + + ভুটান এনগুল্ট্রুম + + + বর্মি কিয়াৎ + + + বত্সওয়ানা পুলা + + + বেলারুশিয়ান নিউ রুবেল (১৯৯৪-১৯৯৯) + + + বেলারুশিয়ান রুবেল + + + বেলিজ ডলার + + + কম্বোডিয়ান ডলার + + + কঙ্গো ফ্র্যাঙ্ক কঙ্গোলাইস + + + সুইজারল্যান্ড ইউরো + + + সুইস ফ্রাঙ্ক + + + সুইজারল্যান্ড ফ্রাঙ্ক + + + চিলিয়ান উনিদাদেস দি ফোমেন্তো + + + চিলি পেসো + + + চীনা য়ুয়ান রেন্মিন্‌বি + + + কলোম্বিয়ান পেসো + + + কোস্টা রিকা কোলোন + + + প্রাচীন সারবিয়ান দিনার + + + চেকোস্লোভাক হার্ড কোরুনা + + + কিউবান পেসো + + + কেপ ভার্দে এসকুডো + + + সাইপ্রাস পাউন্ড + + + চেকোস্লোভাক কোরুনা + + + পূর্ব জার্মান মার্ক + + + ডয়চ্ মার্ক + + + জিবুতি ফ্রাঙ্ক + + + ড্যানিশ ক্রৌন + + + ডোমিনিকান পেসো + + + আলজেরীয় দিনার + + + ইকুয়াডোর সুক্রে + + + ইকুয়াডোর উনিদাদেস দি ভেলর কনসতান্তে (ইউভিসি) + + + এস্তোনিয়া ক্রুনি + + + মিশরীয় পাউন্ড + + + ইকুয়েলে + + + স্প্যানিশ পেসেতা (একই হিসাব) + + + স্প্যানিশ পেসেতা (রূপান্তরযোগ্য হিসাব) + + + স্প্যানিশ পেসেতা + + + ইউরো + + + ফিজি ডলার + + + ফকল্যান্ড দ্বীপপুঞ্জ পাউন্ড + + + ফরাসি ফ্রাঙ্ক + + + ব্রিটিশ পাউন্ড স্টার্লিং + + + জর্জিয়ান কুপন লারিট + + + জর্জিয়ান লারি + + + ঘানা সেডি (১৯৭৯-২০০৭) + + + ঘানা সেডি + + + জিব্রাল্টার পাউন্ড + + + গাম্বিয়া ডালাসি + + + গিনি ফ্রাঙ্ক + + + গিনি সাইলি + + + গ্রীক দ্রাচমা + + + গুয়াতেমালা কুয়েৎজাল + গুয়াতেমালা কুয়েৎজাল + + + পর্তুগিজ গিনি এসকুডো + + + গিনি বিসাউ পেসো + + + গাইয়েনা ডলার + + + হংকং ডলার + + + হন্ডুরাস লেম্পিরা + + + ক্রোয়েশিয়ান দিনার + + + ক্রোয়েশিয়ান কুনা + ক্রোয়েশিয়ান কুনাস + + + হাইতি গৌর্দে + + + হাঙ্গেরিয়ান ফোরিন্ট + + + ইন্দোনেশিয়া রুপিয়াহ + + + ইরিশ পাউন্ড + + + ইস্রাইলি পাউন্ড + + + ইস্রাইলি নতুন শেকেল + + + ভারতীয় রুপি + টাকা + + + ইরাকি দিনার + + + ইরানিয়ান রিয়াল + + + আইসল্যান্ড ক্রৌন + + + ইতালীয় লিরা + + + জ্যামাইকান ডলার + + + জর্ডানিয়ান দিনার + + + জাপানিজ ইয়েন + + + কেনিয়ান শিলিং + + + কিরগিজস্তান সোম + + + কম্বোডিয়ান রিয়েল + + + কম্বোরো ফ্রাঙ্ক + + + নাইজেরিয়ান পাউন্ড + + + দক্ষিণ কোরিয়ান ওন + + + কুয়েতি দিনার + + + কেম্যান দ্বীপপুঞ্জের ডলার + + + কাজাক্সটান টেঙ্গে + + + লেউশান কিপ + + + লেবানিজ পাউন্ড + + + শ্রীলঙ্কান রুপি + + + লাইবেরিয়ান ডলার + + + লেসুটু লোটি + + + মালোটি + + + লিথুইনিয়ান লিটা + + + লিথুইনিয়ান টালোন্যাস + + + লুক্সেমবার্গ রুপান্তযোগ্য ফ্রাঙ্ক + + + লুক্সেমবার্গ ফ্রাঙ্ক + + + লুক্সেমবার্গ ফাইনেনশিয়াল ফ্রাঙ্ক + + + ল্যাট্‌স + + + ল্যাটভিয়ান রুবল + + + লিবিয়ান ডলার + + + মোরোক্কান দিরহাম + + + মোরোক্কান ফ্রাঙ্ক + + + মোল্ডোভান লেয়ু + + + মাদাগাস্কার আরিয়ারি + + + মাদাগাস্কার ফ্রাঙ্ক + + + ম্যাসেডোনিয়ান দিনার + + + মালি ফ্রাঙ্ক + + + মায়ানমার কিয়াত + + + মঙ্গোলিয়ান তুগরিক + + + ম্যাক্যাও পাটাকা + + + মৌরিতানিয়ান ওউগুইয়া + + + মাল্টা লিরা + + + মাল্টা পাউন্ড + + + মৌরিতানিয়ান রুপি + + + মালাউইয়ান কওয়াচ + + + ম্যাক্সিকান পেসো + + + ম্যাক্সিকান সিলভার পেসো (১৮৬১-১৯৯২) + + + মালয়েশিয়ান রিঙ্গিৎ + + + মোজাম্বিক এসকুডো + + + প্রাচীন মোজাম্বিক মেটিকেল + + + মোজাম্বিক মেটিকেল + + + নামিবিয়া ডলার + + + নাইজেরিয়ান নায়রা + + + নিকারাগুয়ান কর্ডোবা + + + নিকারাগুয়ান কর্ডোবা ওরো + + + নেদারল্যান্ড গুল্ডের + + + নরওয়ে ক্রৌন + + + নেপালি রুপি + + + নিউজিল্যান্ড ডলার + + + ওমানি রিয়াল + + + পানামা বেলবোয়া + + + পেরুভিয়ান ইন্তি + + + পেরুভিয়ান সোল নুয়েভো + + + পেরুভিয়ান সোল + + + পপুয়ানিউগিনি কিনা + + + ফিলিপাইন পেসো + + + পাকিস্তানি রুপি + + + পোলিশ জ্লোটি + + + পোলিশ জ্লোটি (১৯৫০-১৯৯৫) + + + পর্তুগিজ এসকুডো + + + প্যারগুয়ান + + + কাতার রিয়্যাল + + + রোডেশিয়ান ডলার + + + প্রাচীন রুমানিয়া লেয়ু + + + রুমানিয়া লেয়ু + + + সারবিয়ান দিনার + + + রাশিয়ান রুবেল + + + রাশিয়ান রুবল (১৯৯১-১৯৯৮) + + + রুয়ান্ডান ফ্রাঙ্ক + + + সৌদি রিয়্যাল + + + সলোমন দ্বীপপুঞ্জ ডলার + + + সেয়চেল্লোইস রুপি + + + প্রাচীন সুদানি দিনার + + + সুদানি পাউন্ড + সুদানি পাউন্ড + + + প্রাচীন সুদানি পাউন্ড + + + সুইডেশ ক্রোনা + + + সিঙ্গাপুর ডলার + + + সেন্ট হেলেনা পাউন্ড + + + স্লোভানিয়া টোলার + + + স্লোভাক কোরুনা + + + সিয়েরালিয়ন লিয়ন + + + সোমালি শিলিং + + + সুরিনাম ডলার + + + সুরিনাম গিল্ডার + + + সাও টোমে এবং প্রিন্সিপে ডোবরা + + + সোভিয়েত রুবল + + + এল স্যালভোডোর কোলোন + + + সিরিয়ান পাউন্ড + + + সোয়াজিল্যান্ড লিলাঙ্গেনি + + + থাই বাত + + + তাজিকিস্তান রুবল + + + তাজিকিস্তান সোমোনি + + + তুর্কমেনিস্টানি মানাত + + + তিউনেশিয়ান দিনার + + + টোঙ্গা পা’আঙ্গা + + + তিমুর এসকুডো + + + প্রাচীন তুর্কি লিরা + + + তুর্কি লিরা + + + ত্রিনিদাদ এবং টোবাগো ডলার + + + নূতন তাইওয়ান ক্যারাবিয়ান ডলার + + + তাঞ্জনিয়া শিলিং + + + ইউক্রেইন হৃভনিয়া + + + ইউক্রেইন কার্বোভ্যান্টস + + + উগান্ডান শিলিং (১৯৬৬-১৯৮৭) + + + উগান্ডান শিলিং + + + মার্কিন ডলার + + + মার্কিন ডলার (পরবর্তী দিন) + + + মার্কিন ডলার (একই দিন) + + + উরুগুয়ে পেসো (১৯৭৫-১৯৯৩) + + + উরুগুয়ে পেসো উরুগুয়েও + + + উজবেকিস্তানি সোম + + + ভেনিজুয়েলান বলিভার + + + ভেনিজুয়েলীয় বলিভার র্ফুতে + + + ভিয়েতনামি ডঙ্গ + + + পশ্চিমাঞ্চলীয় সামোয়ান টালা + + + সিএফএ ফ্র্যাঙ্ক বিইএসি + + + সিলভার + + + গোল্ড + + + ইউরোপীয় আর্থিক একক + + + পূর্ব ক্যারাবিয়ান ডলার + + + ইউরোপীয় মুদ্রা একক + + + ফরাসি গোল্ড ফ্রাঙ্ক + + + ফরাসি ইউআইসি - ফ্রাঙ্ক + + + সিএফএ ফ্র্যাঙ্ক বিসিইএও + + + প্যালেডিয়াম + + + সিএফপি ফ্র্যাঙ্ক + + + প্লাটিনাম + + + অজানা বা ভুল মুদ্রা + XXX + + + ইয়েমেনি দিনার + + + ইয়েমেনি রিয়াল + + + যুগোশ্লাভিয় হার্ড দিনার + + + যুগোশ্লাভিয় নোভি দিনার + + + যুগোশ্লাভিয় রুপান্তরযোগ্য দিনার + + + দক্ষিণ আফ্রিকান র‌্যান্ড + + + দক্ষিণ আফ্রিকান রেন্ড + + + জাম্বিয়ান কওয়াচা + + + জাইরিয়ান নিউ জাইরে + + + জাইরিয়ান জাইরে + + + জিম্বাবুয়ে ডলার + + + + + + {0} দিন + {0} দিন + + + {0} ঘন্টা + {0} ঘন্টা + + + {0} মিনিট + {0} মিনিট + + + {0} মাস + {0} মাস + + + {0} সেকেন্ড + {0} সেকেন্ড + + + {0} সপ্তাহ + {0} সপ্তাহ + + + {0} বছর + {0} বছর + + + + + হাঁ + না + + + diff --git a/libs/Zend/Locale/Data/bn_BD.xml b/libs/Zend/Locale/Data/bn_BD.xml new file mode 100644 index 0000000..a1f7ed0 --- /dev/null +++ b/libs/Zend/Locale/Data/bn_BD.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/bn_IN.xml b/libs/Zend/Locale/Data/bn_IN.xml new file mode 100644 index 0000000..ef7a7cc --- /dev/null +++ b/libs/Zend/Locale/Data/bn_IN.xml @@ -0,0 +1,194 @@ + + + + + + + + + + + + aa + ab + ace + ach + ada + ady + ae + af + afa + afh + ain + ak + akk + ale + alg + alt + am + an + ang + আঙ্গিকা + apa + ar + arc + arn + arp + art + arw + as + ast + ath + aus + av + awa + ay + az + ba + bad + bai + bal + ban + bas + bat + be + bej + bem + ber + bg + bh + bho + bi + bik + bin + bla + bm + bnt + bo + br + bra + bs + btk + bua + bug + byn + ca + cad + cai + car + cau + ce + ceb + cel + চামোরো + চিনুক জার্গন + চকটোও + চিপেওয়াইয়ান + চেয়েনি + চার্চ স্লাভিক + de + অস্ট্রিয়ান জারমান + en + অস্ট্রেলিয়ান ইংরাজী + ক্যানাডিয়ান ইংরেজি + ব্রিটিশ ইংরেজী + es + fr + ক্যানাডিয়ান ফরাসী + it + ja + অস্ট্রোনেসিয়ান + pt + ru + আরমেনিয়ান + আলটাইক + ব্লিসসিম্বলস + zh + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CY + + + diff --git a/libs/Zend/Locale/Data/bs.xml b/libs/Zend/Locale/Data/bs.xml new file mode 100644 index 0000000..2e2903d --- /dev/null +++ b/libs/Zend/Locale/Data/bs.xml @@ -0,0 +1,337 @@ + + + + + + + + + + + afrikaans + amharski + arapski + asameski + azerbejdžanski + bjeloruski + bugarski + bihari + bengalski + tibetanski + bretonac + bosanski + katalonski + češki + velški + danski + njemački + grčki + engleski + esperanto + španjolski + estonski + baskijski + perzijski + finski + filipinski + farski + francuski + frizijski + irski + škotski gelski + galicijski + guarani + gudžarati + hebrejski + hindu + hrvatski + mađarski + armenski + interlingua + indonezijski + međujezični + islandski + talijanski + japanski + javanski + gruzijski + kambodžanski + kannada + koreanski + kurdski + kirgiski + latinski + n/a + laothian + litvanski + latvijski + makedonski + malajalamski + mongolski + marati + malajski + malteški + nepalski + holandski + norveški (novonorveški) + norveški + oksitanski + indijski + pendžabi + poljski + pakistanski + portugalski + portugalski (Brazil) + portugalski (Portugal) + rumunski + ruski + sanskrit + sindi + srpsko-hrvatski + sinhaleski + slovački + slovenački + somalski + albanski + srpski + sesoto + sudanski + švedski + svahili + tamilski + telugu + tajlandski + tigrinya (eritrejski) + turkmenski + klingonski + turski + twi + uighur + ukrajinski + nepoznati ili nevažeći jezik + urdu + uzbekistanski + vijetnamski + bantu + jidiš + kineski + zulu + + + + + + + Bosna i Hercegovina + Crna Gora + Srbija + Tonga + Nepoznata ili nevažeća oblast + + + + [a-c ć č d đ {dž} e-l {lj} m n {nj} o p r s š t-v z ž] + [q w-y] + + + + + + + + + + + + + + Jan + Feb + Mar + Apr + Maj + Jun + Jul + Avg + Sep + Okt + Nov + Dec + + + Januar + Februar + Mart + April + Maj + Juni + Juli + Avgust + Septembar + Oktobar + Novembar + Decembar + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + Ned + Pon + Uto + Sri + Čet + Pet + Sub + + + Nedjelja + Ponedjeljak + Utorak + Srijeda + Četvrtak + Petak + Subota + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + K1 + K2 + K3 + K4 + + + Prvi kvartal + Drugi kvartal + Treći kvartal + Četvrti kvartal + + + + AM + PM + + + BC + AD + + + + + + EEEE, yyyy MMMM dd + + + + + yyyy MMMM d + + + + + yyyy MMM d + + + + + yy/MM/dd + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1} {0} + + + + Q yy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + Nepoznati ili nevažeći grad + + + + + + , + . + + + + Konvertibilna marka + KM + + + Nepoznata ili nevažeća valuta + XXX + + + + + + da:d + ne:n + + + diff --git a/libs/Zend/Locale/Data/bs_BA.xml b/libs/Zend/Locale/Data/bs_BA.xml new file mode 100644 index 0000000..a5eebfe --- /dev/null +++ b/libs/Zend/Locale/Data/bs_BA.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/byn.xml b/libs/Zend/Locale/Data/byn.xml new file mode 100644 index 0000000..127f7ba --- /dev/null +++ b/libs/Zend/Locale/Data/byn.xml @@ -0,0 +1,508 @@ + + + + + + + + + + + አፋርኛ + አብሐዚኛ + አፍሪቃንስኛ + አማርኛ + ዐርቢኛ + አሳሜዛዊ + አያማርኛ + አዜርባይጃንኛ + ባስኪርኛ + ቤላራሻኛ + ቡልጋሪኛ + ቢሃሪ + ቢስላምኛ + በንጋሊኛ + ትበትንኛ + ብሬቶንኛ + ብሊን + ካታላንኛ + ኮርሲካኛ + ቼክኛ + ወልሽ + ዴኒሽ + ጀርመን + ድዞንግኻኛ + ግሪክኛ + እንግሊዝኛ + ኤስፐራንቶ + ስፓኒሽ + ኤስቶኒአን + ባስክኛ + ፐርሲያኛ + ፊኒሽ + ፊጂኛ + ፋሮኛ + ፈረንሳይኛ + ፍሪስኛ + አይሪሽ + እስኮትስ ጌልክኛ + ግዕዝኛ + ጋለጋኛ + ጓራኒኛ + ጉጃርቲኛ + ሃውሳኛ + ዕብራስጥ + ሐንድኛ + ክሮሽያንኛ + ሀንጋሪኛ + አርመናዊ + ኢንቴርሊንጓ + እንዶኒሲኛ + እንተርሊንግወ + እኑፒያቅኛ + አይስላንድኛ + ጣሊያንኛ + እኑክቲቱትኛ + ጃፓንኛ + ጃቫንኛ + ጊዮርጊያን + ካዛክኛ + ካላሊሱትኛ + ክመርኛ + ካናዳኛ + ኮሪያኛ + ካሽሚርኛ + ኩርድሽኛ + ኪርጊዝኛ + ላቲንኛ + ሊንጋላኛ + ላውስኛ + ሊቱአኒያን + ላትቪያን + ማላጋስኛ + ማዮሪኛ + ማከዶኒኛ + ማላያላምኛ + ሞንጎላዊኛ + ሞልዳቫዊና + ማራዚኛ + ማላይኛ + ማልቲስኛ + ቡርማኛ + ናኡሩ + ኔፓሊኛ + ደች + ኖርዌጂያን + ኦኪታንኛ + ኦሮምኛ + ኦሪያኛ + ፓንጃቢኛ + ፖሊሽ + ፑሽቶኛ + ፖርቱጋሊኛ + ኵቿኛ + ሮማንስ + ሩንዲኛ + ሮማኒያን + ራሽኛ + ኪንያርዋንድኛ + ሳንስክሪትኛ + ሲንድሂኛ + ሳንጎኛ + ስንሃልኛ + ሲዳምኛ + ስሎቫክኛ + ስሎቪኛ + ሳሞአኛ + ሾናኛ + ሱማልኛ + ልቤኒኛ + ሰርቢኛ + ስዋቲኛ + ሶዞኛ + ሱዳንኛ + ስዊድንኛ + ስዋሂሊኛ + ታሚልኛ + ተሉጉኛ + ታጂኪኛ + ታይኛ + ትግርኛ + ትግረ + ቱርክመንኛ + ታጋሎገኛ + ጽዋናዊኛ + ቶንጋ + ቱርክኛ + ጾንጋኛ + ታታርኛ + ትዊኛ + ኡዊግሁርኛ + ዩክረኒኛ + ኡርዱኛ + ኡዝበክኛ + ቪትናምኛ + ቮላፑክኛ + ዎሎፍኛ + ዞሳኛ + ይዲሻዊኛ + ዮሩባዊኛ + ዡዋንግኛ + ቻይንኛ + ዙሉኛ + + + + + + አንዶራ + የተባበሩት አረብ ኤምሬትስ + አልባኒያ + አርሜኒያ + ኔዘርላንድስ አንቲልስ + አርጀንቲና + ኦስትሪያ + አውስትሬሊያ + አዘርባጃን + ቦስኒያ እና ሄርዞጎቪኒያ + ባርቤዶስ + ቤልጄም + ቡልጌሪያ + ባህሬን + ቤርሙዳ + ቦሊቪያ + ብራዚል + ቡህታን + ቤላሩስ + ቤሊዘ + ኮንጎ + የመካከለኛው አፍሪካ ሪፐብሊክ + ስዊዘርላንድ + ቺሊ + ካሜሩን + ቻይና + ኮሎምቢያ + ሰርቢያ + ኬፕ ቬርዴ + ሳይፕረስ + ቼክ ሪፑብሊክ + ጀርመን + ዴንማርክ + ዶሚኒካ + ዶሚኒክ ሪፑብሊክ + አልጄሪያ + ኢኳዶር + ኤስቶኒያ + ግብጽ + ምዕራባዊ ሳህራ + ኤርትራ + ስፔን + ኢትዮጵያ + ፊንላንድ + ፊጂ + ሚክሮኔዢያ + ፈረንሳይ + እንግሊዝ + ጆርጂያ + የፈረንሳይ ጉዊአና + ጋምቢያ + ጊኒ + ኢኳቶሪያል ጊኒ + ግሪክ + ቢሳዎ + ጉያና + ሆንግ ኮንግ + ክሮኤሽያ + ሀይቲ + ሀንጋሪ + ኢንዶኔዢያ + አየርላንድ + እስራኤል + ህንድ + ኢራቅ + አይስላንድ + ጣሊያን + ጃማይካ + ጆርዳን + ጃፓን + ካምቦዲያ + ኮሞሮስ + ደቡብ ኮሪያ + ሰሜን ኮሪያ + ክዌት + ሊባኖስ + ሊቱዌኒያ + ላትቪያ + ሊቢያ + ሞሮኮ + ሞልዶቫ + ማከዶኒያ + ሞንጎሊያ + ማካዎ + ሞሪቴኒያ + ማልታ + ማሩሸስ + ሜክሲኮ + ማሌዢያ + ናሚቢያ + ኒው ካሌዶኒያ + ናይጄሪያ + ኔዘርላንድ + ኖርዌ + ኔፓል + ኒው ዚላንድ + ፔሩ + የፈረንሳይ ፖሊኔዢያ + ፓፑዋ ኒው ጊኒ + ፖላንድ + ፖርታ ሪኮ + ሮሜኒያ + ራሺያ + ሳውድአረቢያ + ሱዳን + ስዊድን + ሲንጋፖር + ስሎቬኒያ + ስሎቫኪያ + ሴኔጋል + ሱማሌ + ሲሪያ + ቻድ + የፈረንሳይ ደቡባዊ ግዛቶች + ታይላንድ + ታጃኪስታን + ምስራቅ ቲሞር + ቱኒዚያ + ቱርክ + ትሪኒዳድ እና ቶባጎ + ታንዛኒያ + ዩጋንዳ + አሜሪካ + ዩዝበኪስታን + ቬንዙዌላ + የእንግሊዝ ድንግል ደሴቶች + የአሜሪካ ቨርጂን ደሴቶች + የመን + ደቡብ አፍሪካ + ዛምቢያ + + + + [፟ ሀ-ሆ ለ-ሟ ረ-ቆ ቈ ቊ-ቍ ቐ-ቖ ቘ ቚ-ቝ በ-ኆ ኈ ኊ-ኍ ነ-ኮ ኰ ኲ-ኵ ኸ-ኾ ዀ ዂ-ዅ ወ-ዎ ዐ-ዖ ዘ-ዮ ደ-ዷ ጀ-ጎ ጐ ጒ-ጕ ጘ-ጟ ⶓ-ⶖ ጠ-ጯ ጸ-ጿ ፈ-ፗ] + [᎐-᎙ ሇ ⶀ ᎀ-ᎃ ⶁ ሠ-ሧ ⶂ-ⶄ ቇ ᎄ-ᎇ ⶅ-ⶇ ኇ ⶈ-ⶊ ኯ ዏ ⶋ ዯ ⶌ ዸ-ዿ ⶍ ⶎ ጏ ⶏ-ⶑ ፇ ᎈ-ᎏ ⶒ ፘ-ፚ ⶠ-ⶦ ⶨ-ⶮ ⶰ-ⶶ ⶸ-ⶾ ⷀ-ⷆ ⷈ-ⷎ ⷐ-ⷖ ⷘ-ⷞ] + + + + + + + + ልደት + ካብኽ + ክብላ + ፋጅኺ + ክቢቅ + ም/ት + ኰር + ማርያ + ያኸኒ + መተሉ + ም/ም + ተሕሳ + + + ልደትሪ + ካብኽብቲ + ክብላ + ፋጅኺሪ + ክቢቅሪ + ምኪኤል ትጟኒሪ + ኰርኩ + ማርያም ትሪ + ያኸኒ መሳቅለሪ + መተሉ + ምኪኤል መሽወሪ + ተሕሳስሪ + + + + + + + + + + + + + + + + + + + + + + + ሰ/ቅ + ሰኑ + ሰሊጝ + ለጓ + ኣምድ + ኣርብ + ሰ/ሽ + + + ሰንበር ቅዳዅ + ሰኑ + ሰሊጝ + ለጓ ወሪ ለብዋ + ኣምድ + ኣርብ + ሰንበር ሽጓዅ + + + + + + + + + + + + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + ፋዱስ ጃብ + ፋዱስ ደምቢ + + + ይጅ + ኣድ + + + + + + EEEE፡ dd MMMM ግርጋ yyyy G + + + + + dd MMMM yyyy + + + + + dd-MMM-yyyy + + + + + dd/MM/yy + + + + + + + h:mm:ss a v + + + + + h:mm:ss a z + + + + + h:mm:ss a + + + + + h:mm a + + + + + + + {1} {0} + + + + dd MMMM + dd/MM + MM/yy + Q yy + MMMM yyyy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + + + ¤#,##0.00 + + + + + + የብራዚል ሪል + + + የቻይና ዩአን ረንሚንቢ + Y + + + የኢትዮጵያ ብር + $ + + + አውሮ + + + የእንግሊዝ ፓውንድ ስተርሊንግ + + + የሕንድ ሩፒ + + + የጃፓን የን + + + የራሻ ሩብል + + + የአሜሪካን ዶላር + + + + diff --git a/libs/Zend/Locale/Data/byn_ER.xml b/libs/Zend/Locale/Data/byn_ER.xml new file mode 100644 index 0000000..0f7f758 --- /dev/null +++ b/libs/Zend/Locale/Data/byn_ER.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/ca.xml b/libs/Zend/Locale/Data/ca.xml new file mode 100644 index 0000000..636a9cc --- /dev/null +++ b/libs/Zend/Locale/Data/ca.xml @@ -0,0 +1,1644 @@ + + + + + + + + + es_ES + + + {0} ({1}) + , + + + àfar + abkhaz + adigué + avèstic + afrikaans + llengua afroasiàtica + afrihili + àkan + aleuta + llengua algonquina + altaic meridional + amhàric + aragonès + anglès antic + llengua apatxe + àrab + arameu + araucà + arapaho + llengua artificial + arauac + assamès + asturià + llengua atapascana + llengua australiana + àvar + aimara + àzeri + baixkir + bamileké + balutxi + balinès + llengua bàltica + bielorús + beja + bemba + berber + búlgar + bihari + bislama + bambara + bengalí + bantu + tibetà + bretó + bosnià + batak + buriat + bugui + català + caddo + llengua ameríndia d'Amèrica Central + carib + llengua caucàsica + txetxè + llengua cèltica + chamorro + txagatai + mari + pidgin chinook + choctaw + chipewyan + cherokee + xeienne + cors + copte + crioll - basat en l'anglès + crioll - basat en el francès + crioll - basat en el portuguès + cree + tàtar de Crimea + llengua criolla o pidgin + txec + caixubi + eslau eclesiàstic + llengua cuixítica + txuvaix + gal·lès + danès + dakota + darguà + daiak + alemany + alemany austriac + alemany suís + delaware + dinka + llengua dravidiana + baix sòrab + neerlandès mitjà + divehi + bhutanès + ewe + egipci antic + grec + elamita + anglès + anglès australià + anglès canadenc + anglès britànic + anglès americà + anglès mitjà + esperanto + espanyol + castellà americà + castellà ibèric + estonià + basc + persa + fang + fanti + ful + finès + filipí + llengua finoúgrica + fijià + feroès + francès + francès suís + francès mitjà + francès antic + frisó septentrional + frisó occidental + friülà + frisó + irlandès + escocès + llengua germànica + gueez + gilbertès + gallec + alt alemany mitjà + guaraní + alt alemany antic + gòtic + grec antic + gujarati + manx + hausa + haida + hawaià + hebreu + hindi + hitita + croat + alt sòrab + haitià + hongarès + hupa + armeni + interlingua + indonesi + interlingue + igbo + inupiak + ilocà + llengua índica + llengua indoeuropea + ingúix + ido + llengua irànica + iroquès + islandès + italià + inuktitut + japonès + judeopersa + judeoàrab + javanès + georgià + karakalpak + cabilenc + karen + kabardí + llengua khoisana + khotanès + kikuiu + kazakh + greenlandès + cambodjà + Kimbundu + kannada + coreà + kpelle + karatxai + caixmiri + kurd + kúmik + komi + kirguís + llatí + ladí + panjabi occidental + luxemburguès + lesguià + ganda + limburguès + lingala + laosià + lituà + luo + letó + madurès + mandinga + llengua autronèsia + massai + mordovià moksha + mandar + mende + malgaix + gaèlic irlàndès mitjà + marshallès + maori + micmac + llengua miscel·lània + macedoni + llengua monkhmer + malaialam + mongol + manxú + llengua manobo + moldau + marathi + malai + maltès + varies llengües + llengua munda + creek + mirandès + birmà + llengua maia + mirandès erzya + nauruà + nàhuatl + llengua ameríndia septentrional + napolità + noruec bokmål + ndebele septentrional + baix alemany + nepalès + newari + llengua nigerokurdufaniana + neerlandès + flamenc + noruec nynorsk + noruec + nogai + noruec antic + ndebele meridional + sotho septentrional + llengua nubiana + navaho + newari clàssic + nyanja + occità + ojibwa + oromo (afan) + oriya + osset + turc otomà + panjabi + llengua papú + pahlavi + papiamento + palauà + persa antic + fenici + pali + polonès + ponapeà + pràcrit + provençal antic + paixto + portuguès + portuguès (brasil) + portuguès (portugal) + quètxua + rajasthani + retoromànic + kirundi + romanès + llengua romànica + romaní + rus + aromanès + kinyarwanda + sànscrit + sandawe + iacut + llengua ameríndia meridional + llengua salish + arameu samarità + sasak + sard + sicilià + sindhi + sami septentrional + llengua semítica + sango + irlandès antic + llengua de signes + serbo-croat + sinhalès + llengua sioux + llengua sinotibetana + eslovac + eslovè + llengua eslava + samoà + sami meridional + llengua sami + sami d'Inari + sami skolt + shona + soninke + somali + sogdià + songhai + albanès + serbi + siswati + sotho + sundanès + sumeri + suec + swahili + siríac + tàmil + llengua tai + telugu + tadjik + thai + tigrinya + tigré + tiv + turcman + tokelauès + tagàlog + klingonià + tlingit + tamazight + tswana + tonga + tok pisin + turc + tsonga + tàtar + llengua tupí + llengua altaïca + tuvaluà + twi + tahitià + tuvinià + uigur + ugarític + ucraïnès + umbundu + idioma desconegut o no vàlid + urdú + uzbek + vai + venda + vietnamita + volapuk + való + llengua wakashan + sòrab + wòlof + calmuc + xosa + yapeà + jiddish + ioruba + zhuang + zapoteca + zenaga + xinès + xinès simplificat + xinès tradicional + zulu + sense contingut lingüístic + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Món + Àfrica + Amèrica del Nord + Sudamèrica + Oceania + Àfrica Occidental + Amèrica Central + Àfrica Oriental + Àfrica septentrional + Àfrica Central + Àfrica meridional + Amèrica + Amèrica septentrional + Carib + Àsia Oriental + Sud d'Àsia + Àsia Sud-oriental + Europa meridional + Austràlia i Nova Zelanda + Melanèsia + Regió de la Micronèsia + Polinèsia + Àsia Sud-central + Àsia + Àsia Central + Àsia Occidental + Europa + Europa Oriental + Europa septentrional + Europa Occidental + Comunitat d'Estats Independents + Amèrica Llatina i Carib + Andorra + Unió dels Emirats Àrabs + Afganistan + Antigua i Barbuda + Anguilla + Albània + Armènia + Antilles Holandeses + Angola + Antàrtida + Argentina + Samoa americana + Àustria + Austràlia + Aruba + Illes Aland + Azerbaidjan + Bòsnia i Hercegovina + Barbados + Bangla Desh + Bèlgica + Burkina Faso + Bulgària + Bahrain + Burundi + Benin + Bermudes + Brunei + Bolívia + Brasil + Bahames + Bhutan + Illa Bouvet + Botswana + Bielorússia + Belize + Canadà + Illes Cocos + República Democràtica del Congo + República Centrafricana + Congo + Switzerland + Costa d’Ivori + Illes Cook + Xile + Camerun + Xina + Colòmbia + Costa Rica + Sèrbia i Montenegro + Cuba + Cap Verd + Illa Christmas + Xipre + República Txeca + Alemanya + Djibouti + Dinamarca + Dominica + República Dominicana + Algèria + Equador + Estònia + Egipte + Sàhara Occidental + Eritrea + Espanya + Etiòpia + Finlàndia + Fiji + Illes Malvines + Micronèsia + Illes Fèroe + França + Gabon + Regne Unit + Grenada + Geòrgia + Guaiana Francesa + Batllia de Guernsey + Ghana + Gibraltar + Groenlàndia + Gàmbia + Guinea + Guadeloupe + Guinea Equatorial + Grècia + Illes Geòrgia del Sud i Sandwich del Sud + Guatemala + Guam + Guinea Bissau + Guyana + Hong Kong + Illa Heard i Illes McDonald + Hondures + Croàcia + Haití + Hongria + Indonèsia + Irlanda + Israel + Illa de Man + Índia + Territori Britànic de l'Oceà Índic + Iraq + Iran + Islàndia + Itàlia + Batllia de Jersey + Jamaica + Jordània + Japó + Kenya + Kirgizistan + Cambodja + Kiribati + Comores + Saint Kitts i Nevis + Corea del Nord + Corea del Sud + Kuwait + Illes Caiman + Kazakhstan + Laos + Líban + Saint Lucia + Liechtenstein + Sri Lanka + Libèria + Lesotho + Lituània + Luxemburg + Letònia + Líbia + Marroc + Mònaco + Moldàvia + Montenegro + Saint Martin + Madagascar + Illes Marshall + Macedònia + Mali + Myanmar + Mongòlia + Macau + Illes Mariannes del Nord + Martinica + Mauritània + Montserrat + Malta + Maurici + Maldives + Malawi + Mèxic + Malàisia + Moçambic + Namíbia + Nova Caledònia + Níger + Illa Norfolk + Nigèria + Nicaragua + Països Baixos + Noruega + Nepal + Nauru + Niue + Nova Zelanda + Oman + Panamà + Perú + Polinèsia Francesa + Papua Nova Guinea + Filipines + Pakistan + Polònia + Saint Pierre i Miquelon + Illes Pitcairn + Puerto Rico + Territori Palestí + Portugal + Palau + Paraguai + Qatar + Unió Europea + Reunion + Romania + Sèrbia + Rússia + Rwanda + Aràbia Saudí + Illes Salomó + Seychelles + Sudan + Suècia + Singapur + Saint Helena + Eslovènia + Svalbard i Jan Mayen + Eslovàquia + Sierra Leone + San Marino + Senegal + Somàlia + Surinam + São Tomé i Príncipe + El Salvador + Síria + Swazilàndia + Illes Turks i Caicos + Txad + Territoris Meridionals Francesos + Togo + Tailàndia + Tadjikistan + Tokelau + Timor + Turkmenistan + Tunísia + Tonga + Turquia + Trinitat i Tobago + Tuvalu + Taiwan + Tanzània + Ucraïna + Uganda + Illes Perifèriques Menors dels EUA + Estats Units + Uruguai + Uzbekistan + Vaticà + Saint Vincent i les Grenadines + Veneçuela + Illes Verges Britàniques + Illes Verges dels USA + Vietnam + Vanuatu + Wallis i Futuna + Samoa + Iemen + Mayotte + Sud-àfrica + Zàmbia + Zimbabwe + Regió desconeguda o no vàlida + + + ortografia alemana tradicional + ortografia alemana de 1996 + alfabet fonètic internacional + ordenador + + + calendari + ordre alfabètic + moneda + + + calendari budista + calendari xinès + calendari gregorià + calendari hebreu + calendari hindú + calendari musulmà + calendari japonès + + + imperial + mètric + + + Idioma: {0} + Escriptura: {0} + Regió: {0} + + + + [a à b c ç d e é è f-i í ï j-l ŀ m-o ó ò p-u ú ü v-z] + [á ñ] + [a-z] + + + + + + + + + GuMtkHmsSEDFwWahKzUeygAZvcL + + + + + + gen. + febr. + març + abr. + maig + juny + jul. + ag. + set. + oct. + nov. + des. + + + gener + febrer + març + abril + maig + juny + juliol + agost + setembre + octubre + novembre + desembre + + + + + g + f + m + a + m + j + j + a + s + o + n + d + + + + + + + dg. + dl. + dt. + dc. + dj. + dv. + ds. + + + diumenge + dilluns + dimarts + dimecres + dijous + divendres + dissabte + + + + + dg + dl + dt + dc + dj + dv + ds + + + g + l + t + c + j + v + s + + + + + + + 1T + 2T + 3T + 4T + + + 1r trimestre + 2n trimestre + 3r trimestre + 4t trimestre + + + + + 1 + 2 + 3 + 4 + + + + AM + PM + + + aC + dC + + + + + + EEEE d 'de' MMMM 'de' yyyy + + + + + d 'de' MMMM 'de' yyyy + + + + + dd/MM/yyyy + + + + + dd/MM/yy + + + + + + + H:mm:ss v + + + + + H:mm:ss z + + + + + H:mm:ss + + + + + H:mm + + + + + + + {1} {0} + + + + H:mm + L + E d/M + LLL + E MMM d + E d MMMM + d MMMM + MMM d + d/M + d + hh:mm a + hh:mm:ss a + mm:ss + mm:ss + yyyy + M/yyyy + E d/M/yyyy + MMM yyyy + EEE d MMM yyyy + LLLL 'del' yyyy + Q yyyy + QQQ yyyy + Q yy + MM/yyyy + + + {0} - {1} + + M-M + + + E dd/MM - E dd/MM + E dd/MM - E dd/MM + + + MMM-MMM + + + E d 'de' MMM - E d 'de' MMM + E d - E d 'de' MMM + + + d 'de' MMM - d 'de' MMM + d-d 'de' MMM + + + dd/MM - dd/MM + dd/MM - dd/MM + + + d-d + + + H-H + + + H:mm-H:mm + H:mm-H:mm + + + H:mm-H:mm v + H:mm-H:mm v + + + H-H v + + + y-y + + + MM/yy - MM/yy + MM/yy - MM/yy + + + E dd/MM/yy - E dd/MM/yy + E dd/MM/yy - E dd/MM/yy + E dd/MM/yy - E dd/MM/yy + + + MMM-MMM 'de' yyyy + MMM 'de' yyyy - MMM 'de' yyyy + + + E d 'de' MMM - E d 'de' MMM 'de' yyyy + E d - E d 'de' MMM 'de' yyyy + E d 'de' MMM 'de' yyyy - E d 'de' MMM 'de' yyyy + + + d 'de' MMM - d 'de' MMM 'de' yyyy + d-d 'de' MMM 'de' yyyy + d 'de' MMM 'de' yyyy - d 'de' MMM 'de' yyyy + + + dd/MM/yy - dd/MM/yy + dd/MM/yy - dd/MM/yy + dd/MM/yy - dd/MM/yy + + + + + + era + + + any + + + mes + + + setmana + + + dia + avui + demà + demà passat + d'aquí a tres dies + ahir + abans d'ahir + fa tres dies + + + dia de la setmana + + + AM/PM + + + hora + + + minut + + + segon + + + zona + + + + + + +HH:mm;-HH:mm + GMT{0} + Hora de: {0} + {1} ({0}) + + Zona desconeguda + + + Tirana + + + Pol sud + + + Dumont D'Urville + + + Viena + + + Brussel·les + + + Belise + + + Zuric + + + Illa de Pasqua + + + Bogotà + + + Cap Verd + + + Pasqua + + + Praga + + + Berlín + + + Copenhaguen + + + Alger + + + Galápagos + + + El Caire + + + Illes Canàries + + + Hèlsinki + + + Fèroe + + + París + + + Londres + + + Granada + + + Guadalupe + + + Atenes + + + Geòrgia del Sud + + + Port Príncep + + + Djakarta + + + Dublín + + + Bagdad + + + Teheran + + + Roma + + + Tòquio + + + St. Kitts + + + Seül + + + Caiman + + + St. Lucia + + + Luxemburg + + + Mònaco + + + Ulan Bator + + + Martinica + + + Maurici + + + Les Maldives + + + Mèxic Districte Federal + + + Numea + + + Katmandú + + + Panamà + + + Tahití + + + Varsòvia + + + Açores + + + Lisboa + + + Asunción + + + Reunió + + + Bucarest + + + Estocolm + + + Singapur + + + Sao Tomé + + + Salvador + + + Damasc + + + Illes Turks i Caicos + + + Tunísia + + + Port Espanya + + + Kíev + + + Hora d'Alaska + + + Nova York + + + Sant Vicenç + + + Sant Tomàs + + + + Hora d'Espanya + Hora Central Europea + Hora Central Europea de l'estiu + + + Hora d'Espanya + + + + + + + , + . + ; + % + 0 + # + + + - + E + + + NaN + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + #,##0.00 ¤ + + + + + + Pesseta d'Andorra + Pesseta andorrana + Pessetes andorranes + + + Dirhem dels Emirats Àrabs Units + + + Peso argentí + + + Xíling austríac + Xíling austríac + Xílings austríacs + + + Dòlar australià + + + Franc belga + Franc belga + Francs belges + + + Lev búlgar + + + Dòlar de Brunei + + + peso bolivià + + + Real brasiler + + + Dòlar canadenc + + + Franc suís + Franc suís + Francs suíssos + + + Peso xilè + + + Iuan renmimbi xinès + + + Peso colombià + + + Lliura xipriota + Lliura xipriota + Lliures xipriotes + £C + + + Corona txeca + + + Marc alemany + Marc alemany + Marcs alemanys + + + Corona danesa + + + Dinar algerià + + + Corona estoniana + + + Lliura egípcia + + + ¤ #,##0;-¤ #,##0 + Pesseta espanyola + Pesseta espanyola + Pessetes espanyoles + + , + . + + + Euro + Euro + Euro + + + Marc finlandès + Marc finlandès + Marcs finlandèsos + + + Dòlar fijià + + + Franc francès + Franc francès + Francs francèsos + + + Lliura esterlina britànica + Lliura esterlina + Lliures esterlines + + + Dracma grega + Dracma grega + Dracmes gregues + + + Dòlar De Hong Kong + + + Kuna croata + + + Forint hongarès + + + Rupia indonèsia + + + Lliura irlandesa + Lliura irlandesa + Lliures irlandeses + IR£ + + + Xéquel + + + Rupia índia + + + Lira italiana + Lira italiana + Lires italianes + + + Ien japonès + + + Xíling kenyà + + + Won (Corea Del Sud) + + + Litas lituà + + + Franc luxemburguès + Franc luxemburguès + Francs luxemburguèsos + + + Lats + + + Dirhem marroquí + + + Lira maltesa + Lira maltesa + Lires malteses + + + Peso mexicà + + + Ringgit de Malàisia + + + Florí neerlandès + Florí neerlandès + Florís neerlandèsos + + + Corona noruega + + + Dòlar Neozelandès + + + Nou sol peruà + + + Pes filipí + + + Rupia paquistanesa + + + Nou zloty polonès + + + Escut portuguès + Escut portuguès + Escuts portuguèsos + + + Nou leu romanès + + + Dinar serbi + + + Ruble rus + + + Rial saudí + + + Corona sueca + + + Dòlar De Singapur + + + Tolar eslovè + Tolar eslovè + Tolars eslovens + + + Corona eslovaca + + + Baht tailandès + + + Lira turca (vella) + + + Nova lira turca + + + Dòlar Taiwanès + + + Hrívnia d’Ucraïna + + + Dòlar EUA + Dòlar EUA + Dòlars EUA + + + Bolívar veneçolà + + + Dong de Vietnam + + + Unitat de compte europea + Unitat de compte europea + Unitats de compte europea + + + sense moneda + sense moneda + sense moneda + + + Rand + + + + + + {0} dia + {0} dies + + + {0} hora + {0} hores + + + {0} minut + {0} minuts + + + {0} mes + {0} mesos + + + {0} segon + {0} segons + + + {0} setmana + {0} setmanes + + + {0} any + {0} anys + + + + + sí:s + no:n + + + + diff --git a/libs/Zend/Locale/Data/ca_ES.xml b/libs/Zend/Locale/Data/ca_ES.xml new file mode 100644 index 0000000..7d510a7 --- /dev/null +++ b/libs/Zend/Locale/Data/ca_ES.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/cch.xml b/libs/Zend/Locale/Data/cch.xml new file mode 100644 index 0000000..f5f7d96 --- /dev/null +++ b/libs/Zend/Locale/Data/cch.xml @@ -0,0 +1,194 @@ + + + + + + + + + + [a {a̱} b c {ch} d {dy} e-g {g̱} {gb} {gw} {gy} h {hy} i-k ḵ {kp} {kw} l {ly} m n ṉ {ny} o p {ph} {py} r {ry} s {sh} t-w {wh} y {y̱} z ʼ] + + + + + + + + Dyon + Baa + Atat + Anas + Atyo + Achi + Atar + Awur + Shad + Shak + Naba + Nata + + + Pen Dyon + Pen Ba'a + Pen Atat + Pen Anas + Pen Atyon + Pen Achirim + Pen Atariba + Pen Awurr + Pen Shadon + Pen Shakur + Pen Kur Naba + Pen Kur Natat + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + Yok + Tung + T. Tung + Tsan + Nas + Nat + Chir + + + Wai Yoka Bawai + Wai Tunga + Toki Gitung + Tsam Kasuwa + Wai Na Nas + Wai Na Tiyon + Wai Na Chirim + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + AM + PM + + + Gabanin Miladi + Miladi + + + GM + M + + + + + + EEEE, yyyy MMMM dd + + + + + yyyy MMMM d + + + + + yyyy MMM d + + + + + yy/MM/dd + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1} {0} + + + + Q yy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + + Aman + + + + + diff --git a/libs/Zend/Locale/Data/cch_NG.xml b/libs/Zend/Locale/Data/cch_NG.xml new file mode 100644 index 0000000..b887113 --- /dev/null +++ b/libs/Zend/Locale/Data/cch_NG.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/characters.xml b/libs/Zend/Locale/Data/characters.xml new file mode 100644 index 0000000..0d8a4a7 --- /dev/null +++ b/libs/Zend/Locale/Data/characters.xml @@ -0,0 +1,1888 @@ + + + + + + + + + + + + + (C) + + + << + + + - + + + (R) + + + μ + + + >> + + + 1/4 + + + 1/2 + + + 3/4 + + + AE + + + ss + + + ae + + + IJ + + + ij + + + 'n + + + OE + + + oe + + + s + + + + + + + + + + + + LJ + + + Lj + + + lj + + + NJ + + + Nj + + + nj + + + DZ + + + Dz + + + dz + + + Ş + + + ş + + + Ţ + + + ţ + + + + - + + + , + + + ' + + + ; + + + - + + + - + + + - + + + + - + + + ' + + + ' + + + " + + + " + + + . + + + .. + + + ... + + + !! + + + / + + + ?? + + + ?! + + + !? + + + CE + + + Cr + + + Fr. + + + L. + £ + + + NGN + + + Pts + + + Rs + + + KRW + + + שח + ILS + + + đ + VND + + + EUR + + + LAK + + + MNT + + + GRD + + + PHP + + + PYG + + + Ȼ + GHS + + + a/c + + + a/s + + + °C + + + c/o + + + c/u + + + °F + + + No + + + Rx + + + SM + + + TEL + + + TM + + + Ω + + + K + + + Å + + + FAX + + + 1/3 + + + 2/3 + + + 1/5 + + + 2/5 + + + 3/5 + + + 4/5 + + + 1/6 + + + 5/6 + + + 1/8 + + + 3/8 + + + 5/8 + + + 7/8 + + + 1/ + + + I + + + II + + + III + + + IV + + + V + + + VI + + + VII + + + VIII + + + IX + + + X + + + XI + + + XII + + + L + + + C + + + D + + + M + + + i + + + ii + + + iii + + + iv + + + v + + + vi + + + vii + + + viii + + + ix + + + x + + + xi + + + xii + + + l + + + c + + + d + + + m + + + Π + + + Σ + + + - + + + / + + + \ + + + | + + + + || + + + (1) + + + (2) + + + (3) + + + (4) + + + (5) + + + (6) + + + (7) + + + (8) + + + (9) + + + (10) + + + (11) + + + (12) + + + (13) + + + (14) + + + (15) + + + (16) + + + (17) + + + (18) + + + (19) + + + (20) + + + 1. + + + 2. + + + 3. + + + 4. + + + 5. + + + 6. + + + 7. + + + 8. + + + 9. + + + 10. + + + 11. + + + 12. + + + 13. + + + 14. + + + 15. + + + 16. + + + 17. + + + 18. + + + 19. + + + 20. + + + (a) + + + (b) + + + (c) + + + (d) + + + (e) + + + (f) + + + (g) + + + (h) + + + (i) + + + (j) + + + (k) + + + (l) + + + (m) + + + (n) + + + (o) + + + (p) + + + (q) + + + (r) + + + (s) + + + (t) + + + (u) + + + (v) + + + (w) + + + (x) + + + (y) + + + (z) + + + 1月 + + + 2月 + + + 3月 + + + 4月 + + + 5月 + + + 6月 + + + 7月 + + + 8月 + + + 9月 + + + 10月 + + + 11月 + + + 12月 + + + Hg + + + erg + + + eV + + + LTD + + + 0点 + + + 1点 + + + 2点 + + + 3点 + + + 4点 + + + 5点 + + + 6点 + + + 7点 + + + 8点 + + + 9点 + + + 10点 + + + 11点 + + + 12点 + + + 13点 + + + 14点 + + + 15点 + + + 16点 + + + 17点 + + + 18点 + + + 19点 + + + 20点 + + + 21点 + + + 22点 + + + 23点 + + + 24点 + + + hPa + + + da + + + AU + + + bar + + + oV + + + pc + + + dm + + + dm² + + + dm³ + + + IU + + + pA + + + nA + + + μA + + + mA + + + kA + + + KB + + + MB + + + GB + + + cal + + + kcal + + + pF + + + nF + + + μF + + + μg + + + mg + + + kg + + + Hz + + + kHz + + + MHz + + + GHz + + + THz + + + μℓ + μl + + + mℓ + ml + + + dℓ + dl + + + kℓ + kl + + + fm + + + nm + + + μm + + + mm + + + cm + + + km + + + mm² + + + cm² + + + + + + km² + + + mm³ + + + cm³ + + + + + + km³ + + + m∕s + m/s + + + m∕s² + m/s² + + + Pa + + + kPa + + + MPa + + + GPa + + + rad + + + rad∕s + rad/s + + + rad∕s² + rad/s² + + + ps + + + ns + + + μs + + + ms + + + pV + + + nV + + + μV + + + mV + + + kV + + + MV + + + pW + + + nW + + + μW + + + mW + + + kW + + + MW + + + + + + + + + a.m. + + + Bq + + + CC + + + cd + + + C∕kg + C/kg + + + Co. + + + dB + + + Gy + + + ha + + + HP + + + in + + + KK + + + KM + + + kt + + + lm + + + ln + + + log + + + lx + + + mb + + + mil + + + mol + + + pH + + + p.m. + + + PPM + + + PR + + + sr + + + Sv + + + Wb + + + V∕m + V/m + + + A∕m + A/m + + + 1日 + + + 2日 + + + 3日 + + + 4日 + + + 5日 + + + 6日 + + + 7日 + + + 8日 + + + 9日 + + + 10日 + + + 11日 + + + 12日 + + + 13日 + + + 14日 + + + 15日 + + + 16日 + + + 17日 + + + 18日 + + + 19日 + + + 20日 + + + 21日 + + + 22日 + + + 23日 + + + 24日 + + + 25日 + + + 26日 + + + 27日 + + + 28日 + + + 29日 + + + 30日 + + + 31日 + + + gal + + + ff + + + fi + + + fl + + + ffi + + + ffl + + + ſt + + + st + + + ! + + + " + + + # + + + $ + + + % + + + & + + + ' + + + ( + + + ) + + + * + + + + + + + , + + + - + + + . + + + / + + + 0 + + + 1 + + + 2 + + + 3 + + + 4 + + + 5 + + + 6 + + + 7 + + + 8 + + + 9 + + + : + + + ; + + + < + + + = + + + > + + + ? + + + @ + + + A + + + B + + + C + + + D + + + E + + + F + + + G + + + H + + + I + + + J + + + K + + + L + + + M + + + N + + + O + + + P + + + Q + + + R + + + S + + + T + + + U + + + V + + + W + + + X + + + Y + + + Z + + + [ + + + \ + + + ] + + + ^ + + + _ + + + ` + + + a + + + b + + + c + + + d + + + e + + + f + + + g + + + h + + + i + + + j + + + k + + + l + + + m + + + n + + + o + + + p + + + q + + + r + + + s + + + t + + + u + + + v + + + w + + + x + + + y + + + z + + + { + + + | + + + } + + + ~ + + + + (( + + + + )) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ¢ + + + £ + + + ¬ + + + ¯ + + + ¦ + + + ¥ + + + + + + + + + + + + + + + + + + + + + + + + + + + ¢ + + + G + + + C + + + + diff --git a/libs/Zend/Locale/Data/cop.xml b/libs/Zend/Locale/Data/cop.xml new file mode 100644 index 0000000..0755a27 --- /dev/null +++ b/libs/Zend/Locale/Data/cop.xml @@ -0,0 +1,203 @@ + + + + + + + + + + [α-ρ σ ϲ τ-ω ϣ ϥ ϧ ϩ ϫ ϭ ϯ] + + + + + + + + ωογτ + Παοπι + Αθορ + Χοιακ + Τωβι + Μεϣιρ + Παρεμϩατ + Φαρμοθι + Παϣαν + Παωνι + Επηπ + Μεϲωρη + Πικογϫι μαβοτ + + + + + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + AM + PM + + + BCE + CE + + + + + + EEEE, yyyy MMMM dd + + + + + yyyy MMMM d + + + + + yyyy MMM d + + + + + yy/MM/dd + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1} {0} + + + + Q yy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + diff --git a/libs/Zend/Locale/Data/cs.xml b/libs/Zend/Locale/Data/cs.xml new file mode 100644 index 0000000..9b97c3c --- /dev/null +++ b/libs/Zend/Locale/Data/cs.xml @@ -0,0 +1,2205 @@ + + + + + + + + + + + afarština + abcházština + avestánština + afrikánština + ainština + akanština + akkadština + amharština + aragonština + angika + arabština + arapažština + assaméština + avarština + aymárština + azerbajdžánština + baskirština + balúčština + běloruština + bulharština + biharština + bhojpurština + bislámština + bambarština + bengálština + tibetština + bretaňština + bosenština + katalánština + korsičtina + čeština + velština + dánština + němčina + německy (Rakousko) + bhútánština + řečtina + angličtina + anglicky (Kanada) + angličtina (USA) + esperanto + španělština + estonština + baskičtina + perština + finština + tagalogština + fidži + faerština + francouzština + francouzsky (Kanada) + fríština + irština + skotská galština + haličština + guaranština + starořečtina + gujaratština + manština + hausa + havajský + hebrejština + hindština + chorvatština + maďarština + arménština + interlingua + indonéština + interlingue + inupiakština + islandština + italština + inuktitutština + japonština + javánština + gruzínština + kazachština + grónština + kambodžština + kannadština + korejština + kašmírština + kurdština + kirgizština + latina + Lucemburština + lingalština + laoština + litevština + lotyština + magadhiština + maithiliština + malgaština + maorština + makedonština + malabarština + mongolština + moldavština + marathi + malajština + maltština + barmština + nauru + nepálština + nizozemština + norština (nynorsk) + norština + occitan + Oromo (Afan) + oriya + paňdžábština + polština + Pashto (Pushto) + portugalština + kečuánština + rétorománština + kirundi + rumunština + ruština + kinyarwandština + sanskrt + sindhi + sangho + srbochorvatština + sinhálština + slovenština + slovinština + slovanský jazyk + samoyština + shona + somálština + albánština + srbština + siswatština + sesotho + sundanština + sumerský + švédština + svahilština + tamilština + telugština + tádžičtina + thajština + tigrinijština + turkmenština + tagalog + klingonština + setswanština + tonga + tok pisin + turečtina + tsonga + tatarština + twi + tahitština + uighurština + ugaritština + ukrajinština + neznámý nebo neplatný jazyk + urdština + uzbečtina + vietnamština + volapuk + valonština + wolof + xhosa + jidiš + yoruba + zhuang + čínština + čínština (zjednodušená) + čínština (tradiční) + zulu + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Svět + Afrika + 003 + Jižní Amerika + Oceánie + Západní Afrika + Střední Amerika + Východní Afrika + Severní Afrika + Střední Afrika + Jižní Afrika + Amerika + Severní Amerika + Karibik + Východní Asie + Jižní Asie + Jihovýchodní Asie + Jižní Evropa + Austrálie a Nový Zéland + Melanésie + Mikronésie + Polynésie + Jižní a centrální Asie + Asie + Střední Asie + Západní Asie + Evropa + Východní Evropa + Severní Evropa + Západní Evropa + Československo + Latinská Amerika a Karibské moře + Normanské ostrovy + Andorra + Spojené arabské emiráty + Afghánistán + Antigua a Barbuda + Anguila + Albánie + Arménie + Nizozemské Antily + Angola + Antarktida + Argentina + Americká Samoa + Rakousko + Austrálie + Aruba + Alandy + Ázerbájdžán + Bosna a Hercegovina + Barbados + Bangladéš + Belgie + Burkina Faso + Bulharsko + Bahrajn + Burundi + Benin + Bermudy + Brunej Darussalam + Bolívie + Brazílie + Bahamy + Bhútán + Ostrov Bouvet + Botswana + Bělorusko + Belize + Kanada + Kokosové ostrovy + Demokratická republika Kongo + Středoafrická republika + Kongo + Švýcarsko + Pobřeží slonoviny + Cookovy ostrovy + Chile + Kamerun + Čína + Kolumbie + Kostarika + Srbsko a Černá Hora + Kuba + Kapverdy + Vánoční ostrovy + Kypr + Česká republika + Německo + Džibuti + Dánsko + Dominika + Dominikánská republika + Alžírsko + Ekvádor + Estonsko + Egypt + Západní Sahara + Eritrea + Španělsko + Etiopie + Finsko + Fidži + Falklandské ostrovy + Mikronézie + Faerské ostrovy + Francie + Gabon + Velká Británie + Grenada + Gruzie + Francouzská Guyana + Guernsey + Ghana + Gibraltar + Grónsko + Gambie + Guinea + Guadeloupe + Rovníková Guinea + Řecko + Jižní Georgie a Jižní Sandwichovy ostrovy + Guatemala + Guam + Guinea-Bissau + Guyana + Hongkong + Ostrovy Heard a McDonald + Honduras + Chorvatsko + Haiti + Maďarsko + Indonésie + Irsko + Izrael + Ostrov Man + Indie + Britské území v Indickém oceánu + Irák + Írán + Island + Itálie + Jersey + Jamajka + Jordánsko + Japonsko + Keňa + Kyrgyzstán + Kambodža + Kiribati + Komory + Svatý Kitts a Nevis + Severní Korea + Jižní Korea + Kuvajt + Kajmanské ostrovy + Kazachstán + Lidově demokratická republika Laos + Libanon + Svatá Lucie + Lichtenštejnsko + Srí Lanka + Libérie + Lesotho + Litva + Lucembursko + Lotyšsko + Libye + Maroko + Monako + Moldavsko, republika + Černá Hora + Svatý Martin + Madagaskar + Marshallovy ostrovy + Macedonia + Mali + Myanmar + Mongolsko + Macao + Severní Mariany + Martinik + Mauritánie + Montserrat + Malta + Mauricius + Maladivy + Malawi + Mexiko + Malajsie + Mosambik + Namibie + Nová Kaledonie + Niger + Norfolk + Nigérie + Nikaragua + Nizozemsko + Norsko + Nepál + Nauru + Niue + Nový Zéland + Omán + Panama + Peru + Francouzská Polynésie + Papua-Nová Guinea + Filipíny + Pákistán + Polsko + Svatý Pierre a Miquelon + Pitcairn + Portoriko + Palestinian Territory + Portugalsko + Palau + Paraguay + Katar + Vnější Oceánie + Evropská unie + Réunion + Rumunsko + Srbsko + Rusko + Rwanda + Saúdská Arábie + Šalamounovy ostrovy + Seychely + Súdán + Švédsko + Singapur + Svatá Helena + Slovinsko + Svalbard a Jan Mayen + Slovensko + Sierra Leone + San Marino + Senegal + Somálsko + Surinam + Svatý Tomáš + El Salvador + Sýrie + Svazijsko + Ostrovy Caicos a Turks + Čad + Francouzská jižní teritoria + Togo + Thajsko + Tádžikistán + Tokelau + Východní Timor + Turkmenistán + Tunisko + Tonga + Turecko + Trinidad a Tobago + Tuvalu + Tchaj-wan + Tanzanie + Ukrajina + Uganda + Menší odlehlé ostrovy USA + Spojené státy + Uruguay + Uzbekistán + Svatý stolec + Svatý Vincent a Grenadiny + Venezuela + Britské Panenské ostrovy + Americké Panenské ostrovy + Vietnam + Vanuatu + Wallis a Futuna + Samoa + Jemen + Mayotte + Jihoafrická republika + Zambie + Zimbabwe + Neznámá nebo neplatná oblast + + + Kalendář + Třídění + Měna + + + Buddhistický kalendář + Čínský kalendář + Gregoriánský kalendář + Hebrejský kalendář + Muslimský kalendář + Muslimský občanský kalendář + Japonský kalendář + + + USA + Metrický + + + Jazyk: {0} + Region: {0} + + + + titlecase-firstword + lowercase-words + + + [a á b c č d ď e é ě f-h {ch} i í j-n ň o ó p-r ř s š t ť u ú ů v-y ý z ž] + + + + + + + + + GuMtkHmsSEDFwWahKzUeygAZvcL + + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + ledna + února + března + dubna + května + června + července + srpna + září + října + listopadu + prosince + + + + + 1. + 2. + 3. + 4. + 5. + 6. + 7. + 8. + 9. + 10. + 11. + 12. + + + l + ú + b + d + k + č + č + s + z + ř + l + p + + + leden + únor + březen + duben + květen + červen + červenec + srpen + září + říjen + listopad + prosinec + + + + + + + ne + po + út + st + čt + + so + + + neděle + pondělí + úterý + středa + čtvrtek + pátek + sobota + + + + + N + P + Ú + S + Č + P + S + + + + + + + Q1 + Q2 + Q3 + Q4 + + + 1. čtvrtletí + 2. čtvrtletí + 3. čtvrtletí + 4. čtvrtletí + + + + + 1 + 2 + 3 + 4 + + + + dop. + odp. + + + př.Kr. + po Kr. + + + + + + EEEE, d. MMMM yyyy + + + + + d. MMMM yyyy + + + + + d.M.yyyy + + + + + d.M.yy + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + H:mm:ss + + + + + H:mm + + + + + + + {1} {0} + + + + H + HH:mm + HH:mm:ss + d. MMMM + d.M + mm:ss + Q yy + yyyy + M.yyyy + MMMM yyyy + + + {0} - {1} + + M.-M. + + + E, d.M. - E, d.M. + E, d.M. - E, d.M. + + + MMM-MMM + + + E, d. MMM - E, d. MMM + E, d. - E, d. MMM + + + LLLL-LLLL + + + d. MMM - d. MMM + d.-d. MMM + + + d.M. - d.M. + d.M. - d.M. + + + d.-d. + + + H-H + + + H:mm-H:mm + H:mm-H:mm + + + H:mm-H:mm v + H:mm-H:mm v + + + H-H v + + + y-y + + + M.yy - M.yy + M.yy - M.yy + + + E, d.M.yy - E, d.M.yy + E, d.M.yy - E, d.M.yy + E, d.M.yy - E, d.M.yy + + + MMM-MMM yyyy + MMM yyyy - MMM yyyy + + + E, d. MMM - E, d. MMM yyyy + E, d. - E, d. MMM yyyy + E, d. MMM yyyy - E, d. MMM yyyy + + + LLLL-LLLL yyyy + LLLL yyyy - LLLL yyyy + + + d. MMM - d. MMM yyyy + d.-d. MMM yyyy + d. MMM yyyy - d. MMM yyyy + + + d.M.yy - d.M.yy + d.M.yy - d.M.yy + d.M.yy - d.M.yy + + + + + + Epocha + + + Rok + + + Měsíc + + + Týden + + + Den + Dnes + Zítra + Pozítří + Včera + Předevčírem + + + Den v týdnu + + + Část dne + + + Hodina + + + Minuta + + + Sekunda + + + Pásmo + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + Není známo + + + Dubaj + + + Kábul + + + Tirana + + + Jerevan + + + Jižní pól + + + Dumont D'Urville + + + Kordoba + + + Vídeň + + + Dháka + + + Brusel + + + Sofie + + + Bahrajn + + + Bermudy + + + Brunej + + + Belém + + + St. Johns + + + Curych + + + Velikonoční ostrov + + + Kašghar + + + Šanghaj + + + Kostarika + + + Kapverdy + + + Vánoční ostrov + + + Lefkosía + + + Berlín + + + Džibuti + + + Kodaň + + + Alžír + + + Galapágy + + + Káhira + + + Kanárské ostrovy + + + Fidži + + + Paříž + + + Londýn + + + Atény + + + Jižní Georgia + + + Budapešť + + + Jeruzalém + + + Bagdád + + + Teherán + + + Reykjavík + + + Řím + + + Jamajka + + + Ammán + + + Tokio + + + Biškek + + + Phnompenh + + + St. Kitts + + + Pchjongjang + + + Soul + + + Kuvajt + + + Bejrút + + + St. Lucia + + + Lucembursko + + + Tripolis + + + Rangún + + + Ulánbátar + + + Martinik + + + Mauricius + + + Maledivy + + + Tichuana + + + Karáčí + + + Varšava + + + Portoriko + + + Azorské ostrovy + + + Lisabon + + + Katar + + + Bukurešť + + + Moskva + + + Jekatěrinburg + + + Krasnojarsk + + + Jakutsk + + + Sachalin + + + Kamčatka + + + Rijád + + + Chartúm + + + Singapur + + + Sv. Helena + + + Mogadišo + + + Svatý Tomáš + + + Salvador + + + Damašek + + + Dušanbe + + + Ašgabad + + + Užhorod + + + Kyjev + + + Záporoží + + + Aljašský čas + + + Taškent + + + St. Vincent + + + St. Thomas + + + + Aljašský standardní čas + Aljašský letní čas + + + + + Centrální standardní čas + Centrální letní čas + + + + + Východní standardní čas + Východní letní čas + + + + + Horský standardní čas + Horský letní čas + + + + + Pacifický standardní čas + Pacifický letní čas + + + + + Atlantický standardní čas + Atlantický letní čas + + + + + Čínský standardní čas + + + + + Středoevropský standardní čas + Středoevropský letní čas + + + + + Východoevropský standardní čas + Východoevropský letní čas + + + + + Greenwichský střední čas + + + + + Izraelský standardní čas + Izraelský letní čas + + + + + Japonský standardní čas + Japonský letní čas + + + + + Newfoundlandský standardní čas + Newfoundlandský letní čas + + + + + + + , +   + ; + % + 0 + # + + + - + E + + + NaN + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + #,##0.00 ¤ + + + + + + Peseta andorrská + + + Dirham SAE + + + Afghán (1927-2002) + + + Afghán + Af + + + Lek + lek + + + Dram arménský + dram + + + Zlatý Nizozemských Antil + NA f. + + + Kwanza + + + Kwanza (1977-1990) + + + Kwanza nová (1990-2000) + + + Kwanza reajustado (1995-1999) + + + Austral + + + Peso argentinské (1983-1985) + + + Peso argentinské + Arg$ + + + Šilink + + + Dolar australský + $A + + + Zlatý arubský + + + Manat ázerbajdžánský + + + Dinár Bosny a Hercegoviny + + + Marka konvertibilní + KM + + + Dolar barbadoský + BDS$ + + + Taka + Tk + + + Frank konvertibilní + + + Frank belgický + BF + + + Frank finanční + + + Lev + lev + + + Lev Bulharský + + + Dinár bahrajnský + BD + + + Frank burundský + Fbu + + + Dolar bermudský + Ber$ + + + Dolar brunejský + + + Boliviano + Bs + + + Peso + + + Mvdol + + + Cruzeiro (1967-1986) + + + Cruzado + + + Cruzeiro (1990-1993) + + + Real brazilský + + + Cruzado nové + + + Cruzeiro real + + + Dolar bahamský + + + Ngultrum + Nu + + + Kyat barmský + + + Pula + + + Rubl nový běloruský (1994-1999) + + + Rubl běloruský + Rbl + + + Dolar belizský + BZ$ + + + Dolar kanadský + Can$ + + + Frank konžský + + + Frank švýcarský + SwF + + + Unidades de fomento + + + Peso chilské + Ch$ + + + Juan renminbi + Y + + + Peso kolumbijské + Col$ + + + Colón kostarický + C + + + Koruna československá + + + Peso kubánské + + + Escudo kapverdské + CVEsc + + + Libra kyperská + + + Koruna česká + + + + Marka NDR + + + Marka německá + + + Frank džibutský + DF + + + Koruna dánská + DKr + + + Peso dominikánské + RD$ + + + Dinár alžírský + DA + + + Sucre ekvádorský + + + Ecuador Unidad de Valor Constante (UVC) + + + Kroon + + + Libra egyptská + + + Nakfa + + + Peseta španělská + + + Birr etiopský + Br + + + Euro + + + Markka + + + Dolar fidžijský + F$ + + + Libra falklandská + + + Frank francouzský + + + Libra šterlinků + + + Georgian Kupon Larit + + + Lari + lari + + + Cedi + + + Libra gibraltarská + + + Dalasi + + + Frank guinejský + GF + + + Guinea Syli + + + Equatorial Guinea Ekwele Guineana + + + Drachma + + + Quetzal + Q + + + Escudo guinejské + + + Peso Guinnea-Bissau + + + Dolar guyanský + G$ + + + Dolar hongkongský + HK$ + + + Lempira + L + + + Dinar chorvatský + + + Kuna chorvatská + + + Gourde + + + Forint + Ft + + + Rupie indonézská + Rp + + + Libra irská + IR£ + + + Libra izraelská + + + Šekel nový izraelský + + + Rupie indická + INR + + + Dinár irácký + ID + + + Rijál íránský + RI + + + Koruna islandská + + + Lira italská + + + Dolar jamajský + J$ + + + Dinár jordánský + JD + + + Jen + + + Šilink keňský + K Sh + + + Som + som + + + Riel + CR + + + Frank komorský + CF + + + Won severokorejský + + + Won jihokorejský + + + Dinár kuvajtský + KD + + + Dolar Kajmanských ostrovů + + + Tenge + T + + + Kip + + + Libra libanonská + LL + + + Rupie srílanská + SL Re + + + Dolar liberijský + + + Loti + M + + + Litus litevský + + + Talon + + + Frank lucemburský + + + Lat lotyšský + + + Rubl lotyšský + + + Dinár lybijský + LD + + + Dirham marocký + + + Frank marocký + + + Leu moldavský + + + Ariary madagaskarský + + + Frank madagaskarský + + + Denár + MDen + + + Frank malijský + + + Kyat + + + Tugrik + Tug + + + Pataca + + + Ouguiya + UM + + + Lira maltská + Lm + + + Libra maltská + + + Rupie mauricijská + + + Rufiyaa + + + Kwacha malawská + MK + + + Peso mexické + MEX$ + + + Peso stříbrné mexické (1861-1992) + + + Mexican Unidad de Inversion (UDI) + + + Ringgit malajskijský + RM + + + Escudo Mosambiku + + + Metical + Mt + + + Dolar namibijský + N$ + + + Naira + + + Cordoba + + + Cordoba oro + + + Zlatý holandský + + + Koruna norská + NKr + + + Rupie nepálská + Nrs + + + Dolar novozélandský + $NZ + + + Rijál ománský + RO + + + Balboa + + + Inti + + + Nuevo sol + + + Sol + + + Kina + + + Peso filipínské + + + Rupie pákistánská + Pra + + + Zlotý + Zl + + + Zlotý (1950-1995) + + + Escudo portugalské + + + Guarani + + + Rijál katarský + QR + + + Lei + leu + + + Leu rumunské + + + Dinár srbský + + + Rubl ruský + + + Rubl ruský (1991-1998) + + + Frank rwandský + + + Rijál saudský + SRl + + + Dolar Šalamounových ostrovů + SI$ + + + Rupie seychelská + SR + + + Dinár súdánský + + + Libra súdánská + + + Koruna švédská + SKr + + + Dolar singapurský + S$ + + + Libra Svaté Heleny + + + Tolar + + + Koruna slovenská + Sk + + + Leone + + + Šilink somálský + Sh. + + + Zlatý surinamský + Sf + + + Dobra + Db + + + Rubl + + + Colon salvadorský + + + Libra syrská + LS + + + Lilangeni + E + + + Baht + + + Tajikistan Ruble + + + Somoni + + + Manat + + + Dinár tuniský + + + Paʻanga + + + Escudo timorské + + + Lira turecká + TL + + + Lira nová turecká + + + Dolar Trinidad a Tobago + TT$ + + + Dolar tchajvanský nový + NT$ + + + Šilink tanzanský + T Sh + + + Hřivna + + + Karbovanec + + + Šilink ugandský (1966-1987) + + + Šilink ugandský + U Sh + + + Dolar americký + + + Dolar americký (příští den) + + + Dolar americký (týž den) + + + Peso uruguayské (1975-1993) + + + Peso uruguayské + Ur$ + + + Sum uzbecký + + + Bolivar + Be + + + Dong vietnamský + + + Vatu + VT + + + Tala + + + Frank BEAC/CFA + + + Zlato + + + Evropská smíšená jednotka + + + Evropská peněžní jednotka + + + Evropská jednotka účtu 9 (XBC) + + + Evropská jednotka účtu 17 (XBD) + + + Dolar východokaribský + EC$ + + + SDR + + + Evropská měnová jednotka + + + Frank zlatý + + + Frank UIC + + + Frank BCEAO/CFA + + + Frank CFP + CFPF + + + Neznámá nebo neplatná měna + XXX + + + Dinár jemenský + + + Rijál jemenský + YRl + + + Dinár jugoslávský nový [YUD] + + + Dinár jugoslávský nový [YUM] + + + Dinár jugoslávský konvertibilní + + + Rand finanční + + + Rand + R + + + Kwacha zambijská + + + Zaire nový + + + Zaire + + + Dolar zimbabwský + Z$ + + + + + + {0} dny + {0} den + + + {0} hodina + + + {0} minuta + + + {0} měsíc + + + {0} sekunda + + + {0} týden + + + {0} rok + + + + + ano:a + ne:n + + + diff --git a/libs/Zend/Locale/Data/cs_CZ.xml b/libs/Zend/Locale/Data/cs_CZ.xml new file mode 100644 index 0000000..cfce9fe --- /dev/null +++ b/libs/Zend/Locale/Data/cs_CZ.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/cy.xml b/libs/Zend/Locale/Data/cy.xml new file mode 100644 index 0000000..9966bdd --- /dev/null +++ b/libs/Zend/Locale/Data/cy.xml @@ -0,0 +1,790 @@ + + + + + + + + + + + Affricaneg + Amhareg + Arabeg + Asameg + Azerbaijani + Belarwsiyn + Bwlgareg + Bihari + Bengali; Bangla + Llydaweg + Bosnieg + Catalaneg + Tsiec + Cymraeg + Daneg + Almaeneg + Groeg + Saesneg + Esperanto + Sbaeneg + Estoneg + Basgeg + Persieg + Ffineg + Tagalog + Ffaroeg + Ffrangeg + Ffrisieg + Gwyddeleg + Gaeleg yr Alban + Galiseg + Guarani + Gwjarati + Hebraeg + Hindi + Croateg + Hwngareg + Armeneg + Interlingua + Indonesieg + Interlingue + Islandeg + Eidaleg + Siapaneeg + Jafanaeg + Georgeg + Cambodieg + Kannada + Corëeg + Cwrdeg + Kyrgyz + Lladin + Lingala + Laoeg + Lithwaneg + Latfieg + Macedoneg + Malayalam + Mongoleg + Marathi + Malai + Malteseg + Nepali + Iseldireg + Norwyeg (Nynorsk) + Norwyeg + Ocsitaneg + Oriya + Pwnjabi + Pwyleg + Pashto + Portiwgaleg + Rwmaneg + Rwsieg + Sansgrit + Sindhi + Serbo-Croateg + Sinhaleg + Slofaceg + Slofeneg + Somaleg + Albaneg + Serbeg + Sesotheg + Sundaneg + Swedeg + Swahili + Tamil + Telugu + Tai + Tigrinya + Tyrcmeneg + Klingon + Twrceg + Twi + Uighur + Wcreineg + anh + Urdu + Wsbeceg + Fietnameg + Xhosa + Iddew-Almaeneg + Tseineeg + Zwlw + + + + + + Y Byd + Affrica + De America + Oceania + Gorllewin Affrica + Canolbarth America + Dwyrain Affrica + Gogledd Affrica + Canol Affrica + De Affrica [018] + Americas + Gogledd America + Y Caribî + Dwyrain Asia + De ddwyrain Asia + De Ewrop + Awstralia a Seland Newydd + Melanesia + Micronesia [057] + Polynesia + De Canol Asia + Asia + Gorllewin Asia + Ewrop + Dwyrain Ewrop + Gogledd Ewrop + Gorllewin Ewrop + Ynysoedd y Sianel + Andorra + Emiraethau Arabaidd Unedig + Affganistan + Antigwa a Barbuda + Anguilla + Albania + Armenia + Ynysoedd Caribî yr Iseldiroedd + Angola + Antarctica + Yr Ariannin + Samoa Americanaidd + Awstria + Awstralia + Aruba + Ynysoedd Aland + Azerbaijan + Bosnia a Herzegovina + Barbados + Bangladesh + Gwlad Belg + Burkina Faso + Bwlgaria + Bahrain + Burundi + Benin + Bermwda + Brunei + Bolifia + Brasil + Y Bahamas + Bhwtan + Ynys Bouvet + Botswana + Belarws + Belize + Canada + Ynysoedd Cocos (Keeling) + Gweriniaeth Ddemocrataidd y Congo + Gweriniaeth Canol Affrica + Congo + Y Swistir + Côte d’Ivoire + Ynysoedd Cook + Chile + Y Camerŵn + Tseina + Colombia + Costa Rica + Ciwba + Cape Verde + Ynys y Nadolig + Cyprus + Gweriniaeth Tsiec + Yr Almaen + Djibouti + Denmarc + Dominica + Y Weriniaeth Ddominicaidd + Algeria + Ecwador + Estonia + Yr Aifft + Gorllewin Sahara + Eritrea + Sbaen + Ethiopia + Y Ffindir + Fiji + Ynysoedd y Falkland + Micronesia + Ynysoedd Ffaröe + Ffrainc + Gabon + Prydain Fawr + Grenada + Georgia + Giana Ffrengig + Ghana + Gibraltar + Yr Ynys Las + Gambia + Gini + Guadeloupe + Gini Gyhydeddol + Gwlad Groeg + Ynysoedd De Georgia a De Sandwich + Guatemala + Guam + Guinea-Bissau + Guyana + Hong Kong S.A.R., Tseina + Ynys Heard ac Ynysoedd McDonald + Hondwras + Croatia + Haiti + Hwngari + Indonesia + Iwerddon + Israel + Ynys Manaw + India + Tiriogaeth Cefnfor India Prydain + Irac + Iran + Gwlad yr Iâ + Yr Eidal + Jamaica + Yr Iorddonen + Siapan + Cenia + Cirgistan + Cambodia + Kiribati + Comoros + Saint Kitts a Nevis + Gogledd Corea + De Corea + Coweit + Ynysoedd Cayman + Kazakhstan + Laos + Libanus + Saint Lucia + Liechtenstein + Sri Lanka + Liberia + Lesotho + Lithwania + Lwcsembwrg + Latfia + Libia + Moroco + Monaco + Moldofa + Madagascar + Ynysoedd Marshall + Macedonia + Mali + Myanmar + Mongolia + Macao S.A.R., Tseina + Ynysoedd Gogledd Mariana + Martinique + Mawritania + Montserrat + Malta + Mawrisiws + Maldives + Malawi + Mecsico + Malaysia + Mozambique + Namibia + Caledonia Newydd + Niger + Ynys Norfolk + Nigeria + Nicaragwa + Yr Iseldiroedd + Norwy + Nepal + Nawrw + Niue + Seland Newydd + Oman + Panama + Perw + Polynesia Ffrainc + Papua Gini Newydd + Philipinau + Pacistan + Gwlad Pwyl + Saint Pierre a Miquelon + Pitcairn + Puerto Rico + Tiriogaeth Palesteina + Portiwgal + Palau + Paraguay + Qatar + Ynysoedd Pellenig y De + Réunion + Rwmania + Rwsia + Rwanda + Sawdi-Arabia + Ynysoedd Solomon + Seychelles + Y Swdan + Sweden + Singapore + Saint Helena + Slofenia + Svalbard a Jan Mayen + Slofacia + Sierra Leone + San Marino + Senegal + Somalia + Swrinam + Sao Tome a Principe + El Salfador + Syria + Swaziland + Ynysoedd Turks a Caicos + Chad + Tiriogaethau Ffrengig y De + Togo + Gwlad Thai + Tajicistan + Tokelau + Timor-Leste + Tyrcmenistan + Tiwnisia + Tonga + Twrci + Trinidad a Thobago + Twfalw + Taiwan + Tansanïa + Wcráin + Uganda + Mân Ynysoedd Pellenig yr Unol Daleithiau + Yr Unol Daleithiau + Uruguay + Wsbecistan + Y Fatican + Saint Vincent a’r Grenadines + Venezuela + Ynysoedd Prydeinig y Wyryf + Ynysoedd Americanaidd y Wyryf + Fietnam + Vanuatu + Wallis a Futuna + Samoa + Yemen + Mayotte + De Affrica + Sambia + Simbabwe + + + UD + Metrig + + + + [a á à â ä b c {ch} d {dd} e é è ê ë f {ff} g-i í ì î ï l {ll} m n {ng} o ó ò ô ö p {ph} r {rh} s t {th} u ú ù û ü w ẃ ẁ ŵ ẅ y ý ỳ ŷ ÿ] + [j k q v x z] + + + + + + + + + + + + + + Ion + Chwef + Mawrth + Ebrill + Mai + Meh + Gorff + Awst + Medi + Hyd + Tach + Rhag + + + Ionawr + Chwefror + Mawrth + Ebrill + Mai + Mehefin + Gorffenaf + Awst + Medi + Hydref + Tachwedd + Rhagfyr + + + + + Chwe + Maw + Ebr + Gor + + + I + C + M + E + M + M + G + A + M + H + T + R + + + Gorffennaf + + + + + + + Sul + Llun + Maw + Mer + Iau + Gwen + Sad + + + Dydd Sul + Dydd Llun + Dydd Mawrth + Dydd Mercher + Dydd Iau + Dydd Gwener + Dydd Sadwrn + + + + + Gwe + + + S + L + M + M + I + G + S + + + + + + + Ch1 + Ch2 + Ch3 + Ch4 + + + Chwarter 1af + 2il chwarter + 3ydd chwarter + 4ydd chwarter + + + + + 1 + 2 + 3 + 4 + + + + AM + PM + + + Cyn Crist + Oed Crist + + + CC + OC + + + C + O + + + + + + EEEE, dd MMMM yyyy + + + + + dd MMMM yyyy + + + + + d MMM yyyy + + + + + dd/MM/yyyy + + + + + + + h:mm:ss a v + + + + + h:mm:ss a z + + + + + h:mm:ss a + + + + + h:mm a + + + + + + + {1} {0} + + + + HH:mm + HH:mm:ss + dd MMMM + dd/MM + d/M + hh:mm a + hh:mm:ss a + yy-MM-dd + Q yy + QQQQ yy + MM/yyyy + MMMM yyyy + + + {0} – {1} + + M-M + + + E, d/M – E, d/M + E, d/M – E, d/M + + + MMM-MMM + + + E, d MMM – E, d MMM + E, d MMM – E, d MMM + + + LLLL-LLLL + + + d MMM – d MMM + MMM d–d + + + d/M – d/M + d/M – d/M + + + d-d + + + h a – h a + h–h a + + + h:mm a – h:mm a + h:mm–h:mm a + h:mm–h:mm a + + + h:mm a – h:mm a v + h:mm–h:mm a v + h:mm–h:mm a v + + + h a – h a v + h–h a v + + + y-y + + + M/yy – M/yy + M/yy – M/yy + + + E, d/M/yy - E, d/M/yy + E, d/M/yy - E, d/M/yy + E, d/M/yy - E, d/M/yy + + + MMM - MMM, yyyy + MMM yyyy - MMM yyyy + + + E, d MMM - E, d MMM, yyyy + E, d MMM - E, d MMM, yyyy + E, d MMM, yyyy - E, d MMM, yyyy + + + yyyy-MM – MM + yyyy-MM – yyyy-MM + + + d MMM - d MMM, yyyy + d-d MMM, yyyy + d MMM, yyyy - d MMM, yyyy + + + d/M/yy - d/M/yy + d/M/yy - d/M/yy + d/M/yy - d/M/yy + + + + + + Oes + + + Blwyddyn + + + Mis + + + Wythnos + + + Dydd + Drennydd + Ymhen tridiau + Echdoe + Dridiau yn ôl + + + Dydd o'r Wythnos + + + AM/PM + + + Awr + + + Munud + + + Eiliad + + + Cylchfa + + + + + + +HHmm;-HHmm + GMT{0} + {0} + + Pegwn y De + + + St. John’s + + + Llundain + + + Dinas Mecsico + + + Efrog Newydd + + + + + + + + ¤#,##0.00 + + + + + + Real Brasil + + + Yuan Renminbi Tseina + + + Ewro + EUR + + + Punt Sterling Prydain + + + Rwpî India + + + Yen Siapan + + + Rwbl Rwsia + + + Doler yr UDA + + + + + diff --git a/libs/Zend/Locale/Data/cy_GB.xml b/libs/Zend/Locale/Data/cy_GB.xml new file mode 100644 index 0000000..96037b0 --- /dev/null +++ b/libs/Zend/Locale/Data/cy_GB.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/da.xml b/libs/Zend/Locale/Data/da.xml new file mode 100644 index 0000000..9fb32db --- /dev/null +++ b/libs/Zend/Locale/Data/da.xml @@ -0,0 +1,2979 @@ + + + + + + + + + + + {0} ({1}) + , + + + afar + abkhasisk + achinesisk + acoli + adangme + adyghe + avestan + afrikaans + afro-asiatisk sprog + afrihili + ainu + akan + akkadisk + aleutisk + algonkisk sprog + sydaltaisk + amharisk + aragonesisk + oldengelsk + angika + apachesprog + arabisk + aramæisk + araukansk + arapaho + kunstsprog + arawak + assamesisk + asturisk + athapaskisk sprog + australsk sprog + avarisk + awadhi + aymara + aserbajdsjansk + bashkir + banda + bamilekisk sprog + baluchi + balinesisk + basa + baltisk sprog + hviderussisk + beja + bemba + berberisk + bulgarsk + bihari + bhojpuri + bislama + bikol + bini + siksika + bambara + bengalsk + bantu + tibetansk + bretonsk + braj + bosnisk + batak + buriatisk + buginesisk + blin + katalansk + caddo + mellemamerikansk indiansk sprog + caribisk + kaukasisk sprog + atsam + tjetjensk + cebuano + keltisk sprog + chamorro + chibcha + chagatai + chuukese + mari + chinook + choctaw + chipewyan + cherokee + cheyenne + chamiske sprog + korsikansk + koptisk + engelsk baseret kreolsk eller pidgin + fransk baseret kreolsk eller pidginsprog + portugisisk baseret kreolsk eller pidginsprog + cree + krim tyrkisk + kreolsk eller pidginsprog + tjekkisk + kasjubisk + kirkeslavisk + kusjitisk sprog + chuvash + walisisk + dansk + dakota + dargwa + dayak + tysk + østrigsk tysk + schweizerhøjtysk + delaware + athapaskisk + dogrib + dinka + dogri + dravidisk sprog + nedersorbisk + duala + middelhollandsk + divehi + dyula + dzongkha + ewe + efik + oldegyptisk + ekajuk + græsk + elamitisk + engelsk + australsk engelsk + canadisk engelsk + britisk engelsk + amerikansk engelsk + middelengelsk + esperanto + spansk + latinamerikansk spansk + castiliansk spansk + estisk + baskisk + ewondo + persisk + fang + fanti + fulah + finsk + filippinsk + finsk-ugrisk sprog + fijiansk + færøsk + fon + fransk + canadisk fransk + schweizisk fransk + middelfransk + oldfransk + nordfrisisk + østfrisisk + friulian + frisisk + irsk + ga + gayo + gbaya + skotsk gælisk + germansk sprog + geez + gilbertesisk + galicisk + middelhøjtysk + guarani + oldhøjtysk + gondi + gorontalo + gotisk + grebo + oldgræsk + schweizertysk + gujarati + manx + gwichin + hausa + haida + hawaiiansk + hebraisk + hindi + hiligaynon + himachali + hittitisk + hmong + Hiri Motu + kroatisk + øvresorbisk + haitisk + ungarsk + hupa + armensk + herero + interlingua + iban + indonesisk + interlingue + igbo + sichuan yi + ijo + inupiaq + iloko + indisk sprog + indo-europæisk sprog + ingush + ido + iransk sprog + irokesisk sprog + islandsk + italiensk + inuktitut + japansk + lojban + jødisk-persisk + jødisk-arabisk + javanesisk + georgisk + karakalpakisk + kabyle + kachin + jju + kamba + karen + kawi + kabardian + tyap + koro + kongo + khasi + khoisansprog + khotanesisk + kikuyu + kuanyama + kasakhisk + grønlandsk + khmer + kimbundu + kannaresisk + koreansk + konkani + kosraean + kpelle + kanuri + karatjai-balkar + karelsk + kru + kurukh + kashmiri + kurdisk + kymyk + kutenaj + komi + cornisk + kirgisisk + latin + ladino + lahnda + lamba + luxembourgsk + lezghian + ganda + limburgsk + lingala + laotisk + mongo + lozi + litauisk + luba-Katanga + luba-Lulua + luiseno + lunda + luo + lushai + lettisk + madurese + magahi + maithili + makasar + mandingo + austronesisk sprog + masai + moksha + mandar + mende + malagasy + middelirsk + marshallese + maori + micmac + minangkabau + diverse sprog + makedonsk + mon-khmer sprog + malayalam + mongolsk + manchu + manipuri + manobo sprog + moldovisk + mohawk + mossi + marathisk + malay + maltesisk + flere sprog + mundasprog + creek + mirandesisk + marwari + burmesisk + mayasprog + erzya + nauru + nahuatl + nordamerikansk indiansk sprog + neapolitansk + norsk bokmål + nordndebele + nedertysk + nepalesisk + newari + ndonga + nias + Niger-Congo sprog + niuean + hollandsk + flamsk + nynorsk + norsk + nogai + oldislandsk + n-ko + sydndebele + nordsotho + nubisk sprog + navajo + klassisk newarisk + nyanja + nyamwezi + nyankole + nyoro sprog + nzima + occitansk + ojibwa + oromo + oriya + ossetisk + osage + osmannisk-tyrkisk + otomi sprog + punjabi + papua-australsk sprog + pangasinan + pahlavi + pampanga + papiamento + palauansk + oldpersisk + filippinsk sprog + fønikisk + pali + polsk + ponape + prakritsprog + oldprovencalsk + pashto + portugisisk + brasiliansk portugisisk + iberisk portugisisk + quechua + rajasthani + rapanui + rarotongan + rætoromansk + rundi + rumænsk + romansk sprog + romani + rot + russisk + arumænsk + kinyarwanda + sanskrit + sandawe + yakut + sydamerikansk indiansk sprog + salikisk sprog + samaritansk + sasak + santali + sardinsk + siciliansk + skotsk + sindhi + nordsamisk + selkupisk + semitisk sprog + sango + oldirsk + tegnsprog + serbokroatisk + shan + singalesisk + sidamo + sioux sprog + sino-tibetansk sprog + slovakisk + slovensk + slavisk sprog + samoansk + sydsamisk + samisk sprog + lule sami + inari sami + skolt sami + shona + soninke + somalisk + sogdiansk + songhai + albansk + serbisk + sranan tongo + serer + swati + nilo-saharansk sprog + sydsotho + sundanesisk + sukuma + susu + sumerisk + svensk + swahili + klassisk syrisk + syrisk + tamilsk + thaisprog + telugu + temne + tereno + tetum + tajik + thailandsk + tigrinya + tigre + tivi + turkmensk + tokelau + tagalog + klingon + tlingit + tamashek + tswana + tongansk + nyasa tongansk + Tok Pisin + tyrkisk + tsonga + tsimshisk + tatarisk + tumbuka + tupisprog + altaisk sprog + tuvalu + twi + tahitiansk + tuvinian + udmurt + uigurisk + ugaristisk + ukrainsk + umbundu + ukendt eller ugyldigt sprog + urdu + usbekisk + vai + venda + vietnamesisk + volapyk + votisk + vallonsk + wakashansk sprog + walamo + waray + washo + vendisk sprog + wolof + kalmyk + xhosa + yao + yap + jiddisch + yoruba + yupisk sprog + zhuang + zapotec + blissymboler + zenaga + kinesisk + forenklet kinesisk + traditionelt kinesisk + zande + zulu + zuni + intet sprogligt indhold + zaza + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Verden + Afrika + Nordamerika + Sydamerika + Oceanien + Vestafrika + Mellemamerika + Østafrika + Nordafrika + Centralafrika + det sydlige Afrika + Amerika + det nordlige Amerika + Caribien + Østasien + Sydasien + Sydøstasien + Sydeuropa + Australien og New Zealand + Melanesien + Mikronesien + Polynesien + Sydcentralasien + Asien + Centralasien + Vestasien + Europa + Østeuropa + Nordeuropa + Vesteuropa + Sammenslutningen af uafhængige stater + Latinamerika og Caribien + Andorra + Forenede Arabiske Emirater + Afghanistan + Antigua og Barbuda + Anguilla + Albanien + Armenien + Hollandske Antiller + Angola + Antarktis + Argentina + Amerikansk Samoa + Østrig + Australien + Aruba + Åland + Aserbajdsjan + Bosnien-Hercegovina + Barbados + Bangladesh + Belgien + Burkina Faso + Bulgarien + Bahrain + Burundi + Benin + Saint Barthélemy + Bermuda + Brunei Darussalam + Bolivia + Brasilien + Bahamas + Bhutan + Bouvetø + Botswana + Hviderusland + Belize + Canada + Cocosøerne + Congo-Kinshasa + Centralafrikanske Republik + Congo + Schweiz + Elfenbenskysten + Cook-øerne + Chile + Cameroun + Kina + Colombia + Costa Rica + Serbien og Montenegro + Cuba + Kap Verde + Juleøen + Cypern + Tjekkiet + Tyskland + Djibouti + Danmark + Dominica + Den Dominikanske Republik + Algeriet + Ecuador + Estland + Egypten + Vestsahara + Eritrea + Spanien + Etiopien + Finland + Fiji-øerne + Falklandsøerne + Mikronesiens Forenede Stater + Færøerne + Frankrig + Gabon + Storbritannien + Grenada + Georgien + Fransk Guyana + Guernsey + Ghana + Gibraltar + Grønland + Gambia + Guinea + Guadeloupe + Ækvatorialguinea + Grækenland + South Georgia og De Sydlige Sandwichøer + Guatemala + Guam + Guinea-Bissau + Guyana + Hongkong + Heard- og McDonald-øerne + Honduras + Kroatien + Haiti + Ungarn + Indonesien + Irland + Israel + Isle of Man + Indien + Det Britiske Territorium i Det Indiske Ocean + Irak + Iran + Island + Italien + Jersey + Jamaica + Jordan + Japan + Kenya + Kirgisistan + Cambodja + Kiribati + Comorerne + Saint Kitts og Nevis + Nordkorea + Sydkorea + Kuwait + Caymanøerne + Kasakhstan + Laos + Libanon + Saint Lucia + Liechtenstein + Sri Lanka + Liberia + Lesotho + Litauen + Luxembourg + Letland + Libyen + Marokko + Monaco + Republikken Moldova + Montenegro + Saint Martin + Madagaskar + Marshalløerne + Republikken Makedonien + Mali + Myanmar + Mongoliet + Macao + Nordmarianerne + Martinique + Mauretanien + Montserrat + Malta + Mauritius + Maldiverne + Malawi + Mexico + Malaysia + Mozambique + Namibia + Ny Caledonien + Niger + Norfolk Island + Nigeria + Nicaragua + Holland + Norge + Nepal + Nauru + Niue + New Zealand + Oman + Panama + Peru + Fransk Polynesien + Papua Ny Guinea + Filippinerne + Pakistan + Polen + Saint Pierre og Miquelon + Pitcairn + Puerto Rico + De palæstinensiske områder + Portugal + Palau + Paraguay + Qatar + Ydre Oceanien + EU + Reunion + Rumænien + Serbien + Rusland + Rwanda + Saudi-Arabien + Salomonøerne + Seychellerne + Sudan + Sverige + Singapore + St. Helena + Slovenien + Svalbard og Jan Mayen + Slovakiet + Sierra Leone + San Marino + Senegal + Somalia + Surinam + São Tomé og Príncipe + El Salvador + Syrien + Swaziland + Turks- og Caicosøerne + Tchad + Franske Besiddelser i Det Sydlige Indiske Ocean + Togo + Thailand + Tadsjikistan + Tokelau + Timor-Leste + Turkmenistan + Tunesien + Tonga + Tyrkiet + Trinidad og Tobago + Tuvalu + Taiwan + Tanzania + Ukraine + Uganda + De Mindre Amerikanske Oversøiske Øer + USA + Uruguay + Usbekistan + Vatikanstaten + St. Vincent og Grenadinerne + Venezuela + De britiske jomfruøer + De amerikanske jomfruøer + Vietnam + Vanuatu + Wallis og Futunaøerne + Samoa + Yemen + Mayotte + Sydafrika + Zambia + Zimbabwe + ukendt eller ugyldigt område + + + traditionel tysk retskrivning + tysk retskrivning fra 1996 + østarmensk + boontling + det internationale fonetiske alfabet + det uraliske fonetiske alfabet + computer + revideret retskrivning + + + Kalender + Sortering + Valuta + + + sorteringsrækkefølge uforkortet kinesisk - Big5 + buddhistisk kalender + kinesisk kalender + direkte sorteringsrækkefølge + sorteringsrækkefølge forkortet kinesisk - GB2312 + gregoriansk kalender + jødisk kalender + indisk nationalkalender + islamisk kalender + verdslig islamisk kalender + japansk kalender + sorteringsrækkefølge i telefonbøger + pinyin-baseret sorteringsrækkefølge + kalender for Republikken Kina + stregbaseret sorteringsrækkefølge + traditionel sorteringsrækkefølge + + + De amerikanske målesystemer + Det metriske system + + + Sprog: {0} + Instruks: {0} + Område: {0} + + + + lowercase-words + + + [a-z æ ø å] + [á é è ê ë ß ü ä ö] + [a-z] + + + + + + + + + GuMtkHmsSEDFwWahKzUeygAZvcL + + + + + + EEEE d. MMMM yyyy G + + + + + d. MMMM yyyy G + + + + + d. MMM yyyy G + + + + + d/M/yyyy + + + + + + + + + jan + feb + mar + apr + maj + jun + jul + aug + sep + okt + nov + dec + + + januar + februar + marts + april + maj + juni + juli + august + september + oktober + november + december + + + + + J + F + M + A + M + J + J + A + S + O + N + D + + + + + + + søn + man + tir + ons + tor + fre + lør + + + søndag + mandag + tirsdag + onsdag + torsdag + fredag + lørdag + + + + + S + M + T + O + T + F + L + + + + + + + K1 + K2 + K3 + K4 + + + 1. kvartal + 2. kvartal + 3. kvartal + 4. kvartal + + + + + 1 + 2 + 3 + 4 + + + + f.m. + e.m. + + + f.Kr. + e.Kr. + + + f.Kr. + e.Kr. + + + + + + EEEE 'den' d. MMMM yyyy + + + + + d. MMM yyyy + + + + + dd/MM/yyyy + + + + + dd/MM/yy + + + + + + + HH.mm.ss v + + + + + HH:mm:ss z + + + + + HH.mm.ss + + + + + HH.mm + + + + + + + {1} {0} + + + + H + HH.mm + HH.mm.ss + HH.mm + M + E. d-M + MMM + E d MMM + E, d. MMMM + d. MMMM + d. MMM + dd/MM + d/M + d. + mm.ss + mm.ss + yyyy + M-yyyy + EEE. d-M-yyyy + MMM yyyy + EEE. d. MMM yyyy + MMMM yyyy + Q yyyy + QQQ yyyy + MM/yy + MMM yy + Q. 'kvartal' yy + yyyy + MM/yyyy + MMM yyyy + + + {0} - {1} + + M-M + + + E dd/MM - E dd/MM + E dd/MM - E dd/MM + + + MMM-MMM + + + E 'den' d. MMM - E 'den' d. MMM + E 'den' d. - E 'den' d. MMM + + + MMMM-MMMM + + + d. MMM - d. MMM + d.-d. MMM + + + dd/MM - dd/MM + dd/MM - dd/MM + + + d.-d. + + + HH-HH + HH-HH + + + HH.mm-HH.mm + HH.mm-HH.mm + HH.mm-HH.mm + + + HH.mm-HH.mm v + HH.mm-HH.mm v + HH.mm-HH.mm v + + + HH-HH v + HH-HH v + + + y-y + + + MM/yyyy - MM/yyyy + MM/yyyy - MM/yyyy + + + E dd/MM/yy - E dd/MM/yy + E dd/MM/yy - E dd/MM/yy + E dd/MM/yy - E dd/MM/yy + + + MMM-MMM yyyy + MMM yyyy - MMM yyyy + + + E 'den' d. MMM - E 'den' d. MMM yyyy + E 'den' d. - E 'den' d. MMM yyyy + E 'den' d. MMM yyyy - E 'den' d. MMM yyyy + + + MM-MM yyyy + MM yyyy - MM yyyy + + + d. MMM - d. MMM yyyy + d.-d. MMM yyyy + d. MMM yyyy - d. MMM yyyy + + + dd/MM/yy - dd/MM/yy + dd/MM/yy - dd/MM/yy + dd/MM/yy - dd/MM/yy + + + + + + æra + + + år + + + måned + + + uge + + + dag + i dag + i morgen + i overmorgen + om tre dage + i går + i forgårs + for tre dage siden + + + ugedag + + + dagtid + + + time + + + minut + + + sekund + + + zone + + + + + + +HH.mm;-HH.mm + GMT{0} + {0} tid + {1} ({0}) + + Ukendt + + + Sydpolen + + + Dumont D'Urville + + + Wien + + + Bruxelles + + + St. Johns + + + Zürich + + + Påskeøen + + + Kap Verde + + + Juleøen + + + København + + + Algier + + + De Kanariske Øer + + + Færøerne + + + Nuuk + + + Athen + + + Hongkong + + + Teheran + + + Rom + + + St. Kitts + + + St. Lucia + + + Macao + + + Maldiverne + + + Warszawa + + + Azorerne + + + Lissabon + + + Réunion + + + Bukarest + + + Moskva + + + Salvador + + + Alaska Time + + + St. Vincent + + + St. Thomas + + + + Acre-tid + Acre-sommertid + + + + + Afghansk tid + + + + + centralafrikansk tid + + + + + østafrikansk tid + + + + + sydafrikansk normaltid + + + + + vestafrikansk tid + vestafrikansk sommertid + + + + + Aktyubinsk-tid + Aktyubinsk-sommertid + + + + + Alaska-tid + Alaska-normaltid + Alaska-sommertid + + + + + Alaska-Hawaii-tid + Alaska-Hawaii-normaltid + Alaska-Hawaii-sommertid + + + + + Almaty-tid + Almaty-sommertid + + + + + Amazonas-tid + Amazonas-sommertid + + + + + Central-tid + Central-normaltid + Central-sommertid + + + + + Eastern-tid + Eastern-normaltid + Eastern-sommertid + + + + + Mountain-tid + Mountain-normaltid + Mountain-sommertid + + + + + Pacific-tid + Pacific-normaltid + Pacific-sommertid + + + + + Anadyr-tid + Anadyr-sommertid + + + + + Aqtau-tid + Aqtau-sommertid + + + + + Aqtobe-tid + Aqtobe-sommertid + + + + + Arabisk tid + Arabisk normaltid + Arabisk sommertid + + + AT (arabisk) + AST (arabisk) + ADT (arabisk) + + + + + Argentinsk tid + Argentinsk sommertid + + + + + Vestargentinsk tid + + + + + Armensk tid + Armensk sommertid + + + + + Atlantic-tid + Atlantic-normaltid + Atlantic-sommertid + + + + + Centralaustralsk tid + Centralaustralsk normaltid + Centralaustralsk sommertid + + + + + Vestlig centralaustralsk normaltid + Vestlig centralaustralsk sommertid + + + + + Østaustralsk tid + Østaustralsk normaltid + Østaustralsk sommertid + + + + + Vestaustralsk tid + Vestaustralsk normaltid + Vestaustralsk sommertid + + + + + Bering-tid + Bering-normaltid + Bering-sommertid + + + + + Boliviansk tid + + + + + Brasiliansk tid + Brasiliansk sommertid + + + + + Chilensk tid + Chilensk sommertid + + + + + Kinesisk normaltid + Kinesisk sommertid + + + CST (Kina) + + + + + Colombiansk tid + Colombiansk sommertid + + + + + Cubansk tid + Cubansk normaltid + Cubansk sommertid + + + + + Davis-tid + + + + + Dumont-d'Urville-tid + + + + + Hollandsk Guiana-tid + + + + + Ecuadoriansk tid + + + + + mellemeuropæisk tid + mellemeuropæisk normaltid + mellemeuropæisk sommertid + + true + + + + østeuropæisk tid + østeuropæisk normaltid + østeuropæisk sommertid + + true + + + + vesteuropæisk tid + vesteuropæisk normaltid + vesteuropæisk sommertid + + true + + + + Fransk Guiana-tid + + + + + Verdenstid + + true + + + + Centralgrønlandsk tid + Centralgrønlandsk sommertid + + + + + Østgrønlandsk tid + Østgrønlandsk sommertid + + + + + Vestgrønlandsk tid + Vestgrønlandsk sommertid + + + + + Guyana-tid + + + + + Hongkong-tid + Hongkong-sommertid + + + + + Indisk normaltid + + + + + Indokinesisk tid + + + + + Centralindonesisk tid + + + + + Østindonesisk tid + + + + + Vestindonesisk tid + + + + + Israelsk normaltid + Israelsk sommertid + + + IST (Israel) + + + + + Japansk normaltid + Japansk sommertid + + + + + Koreansk normaltid + + + + + Mawson-tid + + + + + Moskva-normaltid + Moskva-sommertid + + + + + Newzealandsk tid + Newzealandsk normaltid + Newzealandsk sommertid + + + + + Newfoundland-tid + Newfoundland-normaltid + Newfoundland-sommertid + + + + + Fernando de Noronha-tid + Fernando de Noronha-sommertid + + + + + Paraguayansk tid + Paraguayansk sommertid + + + + + Peruviansk tid + Peruviansk sommertid + + + + + Pierre- og Miquelon-tid + Pierre- og Miquelon-normaltid + Pierre- og Miquelon-sommertid + + + + + Rothera-tid + + + + + Surinam-tid + + + + + Syowa-tid + + + + + Uruguayansk tid + Uruguayansk sommertid + + + + + Venezuelansk tid + + + + + Vostok-tid + + + + + Yukon-tid + Yukon-normaltid + Yukon-sommertid + + + + + + + , + . + , + % + 0 + # + + + - + E + + + NaN + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0 % + + + + + + + #,##0.00 ¤ + + + {0} {1} + {0} {1} + + + + Andorransk peseta + Andorranske pesetas + + + Dirham fra de Forenede Arabiske Emirater + + + Afghani (1927-2002) + + + Afghani + + + Albansk lek + Albanske lek + lek + + + Armensk dram + Armenske dram + dram + + + Gylden fra De Hollandske Antiller + NA f. + + + Angolansk kwanza + Angolanske kwanza + + + Angolansk kwanza (1977-1990) + Angolanske kwanza (AOK) + + + Ny angolansk kwanza (1990-2000) + + + Angolansk kwanza reajustado (1995-1999) + + + Argentinsk austral + Argentinske austral + + + Argentinsk peso (1983-1985) + Argentinske pesos (ARP) + + + Argentinsk peso + Argentinske pesos + Arg$ + + + Østrigsk schilling + Østrigske schilling + + + Australsk dollar + Australske dollar + $A + + + Arubansk gylden + Arubanske gylden + + + Aserbajdsjansk manat 1993-2006 + + + Aserbajdsjansk manat + Aserbajdsjansk manat + Aserbajdsjanske manat + + + Bosnien-Hercegovinsk dinar + Bosnien-Hercegovinske dinarer + + + Bosnien-Hercegovinsk konvertibel mark + Bosnien-Hercegovinske konvertible mark + KM + + + Barbadisk dollar + Barbadiske dollar + BDS$ + + + Bangladeshisk taka + Bangladeshiske taka + Tk + + + Belgisk franc (konvertibel) + Belgiske franc (konvertible) + + + Belgisk franc + Belgiske franc + BF + + + Belgisk franc (financial) + Belgiske franc (financial) + + + Bulgarsk hard lev + Bulgarske hard lev + lev + + + Ny bulgarsk lev + Ny bulgarske lev + + + Bahrainsk dinar + Bahrainske dinarer + BD + + + Burundisk franc + Burundiske franc + Fbu + + + Bermudansk dollar + Bermudanske dollar + Ber$ + + + Bruneisk dollar + Bruneiske dollar + + + Boliviansk boliviano + Bolivianske boliviano + + + Boliviansk peso + Bolivianske pesos + + + Boliviansk mvdol + + + Brasiliansk cruzeiro novo (1967-1986) + + + Brasiliansk cruzado + Brasilianske cruzado + + + Brasiliansk cruzeiro (1990-1993) + + + Brasiliansk real + Brasilianske real + + + Brasiliansk cruzado novo + + + Brasiliansk cruzeiro + Brasilianske cruzeiro + + + Bahamansk dollar + Bahamanske dollar + + + Bhutansk ngultrum + Nu + + + Burmesisk kyat + + + Botswansk pula + + + Ny hviderussisk rubel (1994-1999) + + + Hviderussisk rubel + Rbl + + + Belizisk dollar + BZ$ + + + Canadisk dollar + Canadiske dollar + Can$ + + + Congolesisk franc congolais + + + Schweizisk franc + Schweiziske franc + SwF + + + Chilensk unidades de fomento + + + Chilensk peso + Chilenske pesos + Ch$ + + + Kinesisk yuan renminbi + Y + + + Colombiansk peso + Colombianske pesos + Col$ + + + Costaricansk colon + Costaricanske colon + C + + + Gammel serbisk dinar + + + Tjekkoslovakisk hard koruna + Tjekkoslovakiske hard koruna + + + Cubansk peso + Cubanske pesos + + + Kapverdisk escudo + Kapverdiske escudos + CVEsc + + + Cypriotisk pund + Cypriotiske pund + £C + + + Tjekkisk koruna + Tjekkiske koruna + + + Østtysk mark + Østtyske mark + + + Tysk mark + Tyske mark + + + Djiboutisk franc + DF + + + Dansk krone + Danske kroner + kr + + + Dominikansk peso + Dominikanske pesos + RD$ + + + Algerisk dinar + Algeriske dinarer + DA + + + Ecuadoriansk sucre + + + Estisk kroon + Estiske kroon + + + Egyptisk pund + Egyptiske pund + + + Eritreisk nakfa + + + Spansk peseta + Spanske pesetas + + + Etiopisk birr + Etiopiske birr + Br + + + Euro + + + Finsk mark + Finske mar + + + Fijiansk dollar + Fijianske dollar + F$ + + + Pund fra Falklandsøerne + + + Fransk franc + Franske franc + + + Britisk pund + Britiske pund + £ + + + Georgisk kupon larit + Georgiske kupon larit + + + Georgisk lari + Georgiske lari + lari + + + Ghanesisk cedi 1979-2007 + + + Ghanesisk cedi + + + Gibraltarisk pund + Gibraltariske pund + + + Gambisk dalasi + Gambiske dalasi + + + Guineansk franc + Guineanske franc + GF + + + Guineansk syli + Guineanske syli + + + Ækvatorialguineask ekwele guineana + + + Græsk drakme + Græske drakmer + + + Guatemalansk quetzal + Q + + + Portugisisk guinea escudo + Portugisiske guinea escudo + + + Guineansk peso + Guinea-Bissau-pesos + + + Guyansk dollar + Guyanske dollar + G$ + + + Hongkong dollar + HK$ + + + Honduransk lempira + L + + + Kroatisk dinar + Kroatiske dinarer + + + Kroatisk kuna + Kroatiske kuna + + + Haitisk gourde + Haitiske gourde + + + Ungarsk forint + Ungarske forint + Ft + + + Indonesisk pupiah + Indonesiske rupiah + Rp + + + Irsk pund + Irske pund + IR£ + + + Israelsk pund + Israelske pund + + + Ny israelsk shekel + Nye israelske shekel + + + Indisk rupee + Indiske rupees + + INR + + + Irakisk dinar + Irakiske dinarer + ID + + + Iransk rial + Iranske rial + RI + + + Islansk krone + Islandske kroner + + + Italiensk lire + Italienske lire + + + Jamaicansk dollar + Jamaicanske dollar + J$ + + + Jordansk dinar + Jordanske dinarer + JD + + + Japansk yen + Japanske yen + + + Kenyansk shilling + Kenyanske shilling + K Sh + + + Kirgisisk som + Kirgisiske som + som + + + Cambodjansk riel + Cambodjanske riel + CR + + + Comorisk franc + Comoriske franc + CF + + + Nordkoreansk won + Nordkoreanske won + + + Sydkoreansk won + Sydkoreanske won + + + Kuwaitisk dinar + Kuwaitiske dinarer + KD + + + Dollar fra Caymanøerne + + + Kasakhisk tenge + Kasakhiske tenge + T + + + Laotisk kip + Laotiske kip + + + Libanesisk pund + Libanesiske pund + LL + + + Srilankansk rupee + Srilankanske rupees + SL Re + + + Liberisk dollar + Liberiske dollar + + + Lesothisk loti + Lesothiske loti + M + + + Litauisk lita + Litauiske lita + + + Litauisk talonas + Litauiske talonas + + + Luxembourgsk franc + Luxembourgske franc + + + Lettisk lat + Lettiske lat + + + Lettisk rubel + Lettiske rubler + + + Libysk dinar + Libyske dinarer + LD + + + Marokkansk dirham + Marokkanske dirham + + + Marokkansk franc + Marokkanske franc + + + Moldovisk leu + Moldoviske leu + + + Madagaskisk ariary + Madagaskiske ariary + + + Madagaskisk franc + Madagaskiske franc + + + Makedonsk denar + Makedonske denarer + MDen + + + Malisk franc + Maliske franc + + + Myanmarsk kyat + Myanmarske kyat + + + Mongolsk tugrik + Tug + + + Macaosk pataca + + + Mauritansk ouguiya + UM + + + Maltesisk lira + Maltesiske lira + Lm + + + Maltesisk pund + Maltesiske pund + + + Mauritisk rupee + Mauritiske rupees + + + Maldivisk rufiyaa + Maldiviske rufiyaa + + + Malawisk kwacha + Malawiske kwacha + MK + + + Mexicansk peso + Mexicanske pesos + MEX$ + + + Mexicansk silver peso (1861-1992) + + + Malaysisk ringgit + Malaysiske ringgit + RM + + + Mozambiquisk escudo + + + Gammel mozambiquisk metical + Mt + + + Mozambiquisk metical + + + Namibisk dollar + Namibiske dollar + N$ + + + Nigeriansk naira + Nigerianske naira + + + Nicaraguansk cordoba + Nicaraguanske cordoba + + + Nicaraguansk cordoba oro + Nicaraguanske cordoba oro + + + Hollandsk guilder + Hollandsk gylden + Hollandske gylden + + + Norsk krone + Norske kroner + NOK + + + Nepalesisk rupee + Nepalesiske rupees + Nrs + + + New Zealandsk dollar + New Zealandske dollar + $NZ + + + Omansk rial + Omanske rial + RO + + + Panamansk balboa + + + Peruviansk inti + Peruvianske inti + + + Peruviansk sol nuevo + + + Peruviansk sol + + + Papuansk kina + + + Filippinsk peso + Filippinske pesos + + + Pakistansk rupee + Pakistanske rupees + Pra + + + Polsk zloty + Polske zloty + Zl + + + Polsk zloty (1950-1995) + + + Portugisisk escudo + Portugisiske escudo + + + Paraguaysk guarani + Paraguayske guarani + + + Qatarsk rial + QR + + + Gammel rumænsk leu + leu + + + Rumænsk leu + + + Serbisk dinar + Serbiske dinarer + + + Russisk rubel + Russiske rubler + + + Russisk rubel (1991-1998) + + + Rwandisk franc + + + Saudisk riyal + Saudiske riyal + SRl + + + Salomonsk dollar + SI$ + + + Seychellisk rupee + SR + + + Sudansk dinar + + + Sudanesisk pund + + + Sudansk pund + + + Svensk krone + Svenske kroner + SEK + + + Singaporeansk dollar + Singaporeanske dollar + S$ + + + Pund fra Saint Helena + + + Slovensk tolar + Slovenske tolar + + + Slovakisk koruna + Sk + + + Sierraleonsk leone + + + Somalisk shilling + Somaliske shilling + S + + + Surinamsk dollar + + + Surinamsk guilder + Sf + + + Dobra fra Sao Tome og Principe + Db + + + Sovjetisk rubel + Sovjetiske rubler + + + Salvadoransk colon + Salvadoranske colon + + + Syrisk pund + Syriske pund + LS + + + Swazilandsk lilangeni + E + + + Thailandsk baht + Thailandske baht + + + Tadsjikisk rubel + + + Tadsjikisk somoni + Tadsjikiske somoni + + + Turkmensk manat + + + Tunesisk dinar + Tunesiske dinarer + + + Tongask paʻanga + Tongaske paʻanga + T$ + + + Escudo fra Timor + + + Tyrkisk lire + Tyrkiske lire + TL + + + Ny tyrkisk lire + Tyrkiske lira + + + Dollar fra Trinidad og Tobago + TT$ + + + Ny taiwansk dollar + Taiwanske dollar + NT$ + + + Tanzanisk shilling + Tanzaniske shilling + T Sh + + + Ukrainsk grynia + Ukrainske grynia + + + Ukrainsk karbovanetz + + + Ugandisk shilling (1966-1987) + + + Ugandisk shilling + Ugandiske shilling + U Sh + + + Amerikansk dollar + Amerikanske dollar + $ + + + Amerikansk dollar (næste dag) + + + Amerikansk dollar (samme dag) + + + Uruguaysk peso (1975-1993) + + + Uruguaysk peso uruguayo + Ur$ + + + Usbekisk sum + Usbekiske sum + + + Venezuelansk bolivar + Be + + + Venezuelansk bolivar fuerte + + + Vietnamesisk dong + Vietnamesiske dong + + + Vanuaisk vatu + VT + + + Samoansk tala + Samoanske tala + + + Beninsk CFA-franc + + + Guld + + + Østkaribisk dollar + Østkaribiske dollar + EC$ + + + Fransk guldfranc + + + Fransk UIC-franc + + + CFA-franc BCEAO + + + CFP-franc + CFPF + + + Ukendt eller ugyldig valuta + + + Yemenitisk dinar + Yemenitiske dinarer + + + Yemenitisk rial + Yemenitiske rial + YRl + + + Jugoslavisk hard dinar + + + Jugoslavisk noviy dinar + + + Jugoslavisk konvertibel dinar + + + Sydafrikansk rand (financial) + + + Sydafrikansk rand + Sydafrikanske rand + R + + + Zambisk kwacha + Zambiske kwacha + + + Ny zairisk zaire + + + Zairisk zaire + Zairiske zaire + + + Zimbabwisk dollar + Zimbabwiske dollar + Z$ + + + + + + {0} dag + {0} dage + + + {0} time + {0} timer + + + {0} minut + {0} minutter + + + {0} måned + {0} måneder + + + {0} sekund + {0} sekunder + + + {0} uge + {0} uger + + + {0} år + {0} år + + + + + ja:j + nej:n + + + diff --git a/libs/Zend/Locale/Data/da_DK.xml b/libs/Zend/Locale/Data/da_DK.xml new file mode 100644 index 0000000..b8cfc50 --- /dev/null +++ b/libs/Zend/Locale/Data/da_DK.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/de.xml b/libs/Zend/Locale/Data/de.xml new file mode 100644 index 0000000..c9898f4 --- /dev/null +++ b/libs/Zend/Locale/Data/de.xml @@ -0,0 +1,3025 @@ + + + + + + + + + + + {0} ({1}) + , + + + Afar + Abchasisch + Aceh-Sprache + Acholi-Sprache + Adangme + Adygai + Avestisch + Afrikaans + Afro-Asiatische Sprache + Afrihili + Ainu-Sprache + Akan + Akkadisch + Aleutisch + Algonkin-Sprachen + Süd-Altaisch + Amharisch + Aragonesisch + Altenglisch + Angika + Apachen-Sprache + Arabisch + Aramäisch + Araukanisch + Arapaho-Sprache + Kunstsprache + Arawak-Sprachen + Assamesisch + Asturianisch + Athapaskische Sprachen + Australische Sprachen + Awarisch + Awadhi + Aymara + Aserbaidschanisch + Baschkirisch + Banda-Sprache + Bamileke-Sprache + Belutschisch + Balinesisch + Basaa-Sprache + Baltische Sprache + Weißrussisch + Bedauye + Bemba-Sprache + Berbersprache + Bulgarisch + Biharisch + Bhodschpuri + Bislama + Bikol-Sprache + Bini-Sprache + Blackfoot-Sprache + Bambara-Sprache + Bengalisch + Bantusprache + Tibetisch + Bretonisch + Braj-Bhakha + Bosnisch + Batak + Burjatisch + Buginesisch + Blin + Katalanisch + Caddo + Zentralamerikanische Indianersprache + Karibische Sprachen + Kaukasische Sprache + Atsam + Tschetschenisch + Cebuano + Keltische Sprache + Chamorro-Sprache + Chibcha-Sprachen + Tschagataisch + Trukesisch + Tscheremissisch + Chinook + Choctaw + Chipewyan + Cherokee + Cheyenne + Cham-Sprachen + Korsisch + Koptisch + Kreolisch-Englische Sprache + Kreolisch-Französische Sprache + Kreolisch-Portugiesische Sprache + Cree + Krimtatarisch + Kreolische Sprachen + Tschechisch + Kaschubisch + Kirchenslawisch + Kuschitische Sprache + Tschuwaschisch + Kymrisch + Dänisch + Dakota-Sprache + Darginisch + Dajak + Deutsch + Österreichisches Deutsch + Schweizer Hochdeutsch + Delaware-Sprache + Slavey + Dogrib + Dinka-Sprache + Dogri + Drawidische Sprache + Niedersorbisch + Duala + Mittelniederländisch + Maledivisch + Dyula-Sprache + Bhutanisch + Ewe-Sprache + Efik + Ägyptisch + Ekajuk + Griechisch + Elamisch + Englisch + Australisches Englisch + Kanadisches Englisch + Britisches Englisch + Englisch (USA) + Mittelenglisch + Esperanto + Spanisch + Lateinamerikanisches Spanisch + Iberisches Spanisch + Estnisch + Baskisch + Ewondo + Persisch + Pangwe-Sprache + Fanti-Sprache + Ful + Finnisch + Filipino + Finnougrische Sprache + Fidschianisch + Färöisch + Fon-Sprache + Französisch + Kanadisches Französisch + Schweizer Französisch + Mittelfranzösisch + Altfranzösisch + Nordfriesisch + Ostfriesisch + Friulisch + Friesisch + Irisch + Ga-Sprache + Gayo + Gbaya-Sprache + Schottisches Gälisch + Germanische Sprache + Geez + Gilbertesisch + Galizisch + Mittelhochdeutsch + Guarani + Althochdeutsch + Gondi-Sprache + Mongondou + Gotisch + Grebo-Sprache + Altgriechisch + Schweizerdeutsch + Gujarati + Manx + Kutchin-Sprache + Hausa + Haida-Sprache + Hawaiianisch + Hebräisch + Hindi + Hiligaynon-Sprache + Himachali + Hethitisch + Miao-Sprachen + Hiri-Motu + Kroatisch + Obersorbisch + Kreolisch + Ungarisch + Hupa + Armenisch + Herero-Sprache + Interlingua + Iban + Indonesisch + Interlingue + Igbo-Sprache + Sichuan Yi + Ijo-Sprache + Inupiak + Ilokano-Sprache + Indoarische Sprache + Indogermanische Sprache + Ingush + Ido-Sprache + Iranische Sprache + Irokesische Sprachen + Isländisch + Italienisch + Inukitut + Japanisch + Lojban + Jüdisch-Persisch + Jüdisch-Arabisch + Javanisch + Georgisch + Karakalpakisch + Kabylisch + Kachin-Sprache + Jju + Kamba + Karenisch + Kawi + Kabardinisch + Tyap + Koro + Kongo + Khasi-Sprache + Khoisan-Sprache + Sakisch + Kikuyu-Sprache + Kwanyama + Kasachisch + Grönländisch + Kambodschanisch + Kimbundu-Sprache + Kannada + Koreanisch + Konkani + Kosraeanisch + Kpelle-Sprache + Kanuri-Sprache + Karatschaiisch-Balkarisch + Karelisch + Kru-Sprachen + Oraon-Sprache + Kaschmirisch + Kurdisch + Kumükisch + Kutenai-Sprache + Komi-Sprache + Kornisch + Kirgisisch + Latein + Judenspanisch + Lahnda + Lamba-Sprache + Luxemburgisch + Lesgisch + Ganda-Sprache + Limburgisch + Lingala + Laotisch + Mongo + Rotse-Sprache + Litauisch + Luba + Luba-Lulua + Luiseno-Sprache + Lunda-Sprache + Luo-Sprache + Lushai-Sprache + Lettisch + Maduresisch + Khotta + Maithili + Makassarisch + Manding-Sprache + Austronesische Sprachen + Massai-Sprache + Moksha + Mandaresisch + Mende-Sprache + Malagassi-Sprache + Mittelirisch + Marschallesisch + Maori + Micmac-Sprache + Minangkabau-Sprache + Verschiedene Sprachen + Mazedonisch + Mon-Khmer-Sprache + Malayalam + Mongolisch + Mandschurisch + Meithei-Sprache + Manobo-Sprache + Moldauisch + Mohawk-Sprache + Mossi-Sprache + Marathi + Malaiisch + Maltesisch + Mehrsprachig + Munda-Sprachen + Muskogee-Sprachen + Mirandesisch + Marwari + Birmanisch + Maya-Sprachen + Erzya + Nauruisch + Nahuatl + Nordamerikanische Indianersprache + Neapolitanisch + Norwegisch Bokmål + Nord-Ndebele-Sprache + Niederdeutsch + Nepalesisch + Newari + Ndonga + Nias-Sprache + Nigerkordofanische Sprache + Niue-Sprache + Niederländisch + Flämisch + Norwegisch Nynorsk + Norwegisch + Nogai + Altnordisch + N’Ko + Süd-Ndebele-Sprache + Nord-Sotho-Sprache + Nubische Sprachen + Navajo-Sprache + Alt-Newari + Chewa-Sprache + Nyamwezi-Sprache + Nyankole + Nyoro + Nzima + Okzitanisch + Ojibwa-Sprache + Oromo + Orija + Ossetisch + Osage-Sprache + Osmanisch + Otomangue-Sprachen + Pandschabisch + Papuasprache + Pangasinan-Sprache + Mittelpersisch + Pampanggan-Sprache + Papiamento + Palau + Altpersisch + Philippinen-Austronesische Sprache + Phönikisch + Pali + Polnisch + Ponapeanisch + Prakrit + Altprovenzalisch + Paschtu + Portugiesisch + Brasilianisches Portugiesisch + Iberisches Portugiesisch + Quechua + Rajasthani + Osterinsel-Sprache + Rarotonganisch + Rätoromanisch + Rundi-Sprache + Rumänisch + Romanische Sprache + Zigeunersprache + Root + Russisch + Aromunisch + Ruandisch + Sanskrit + Sandawe-Sprache + Jakutisch + Südamerikanische Indianersprache + Salish-Sprache + Samaritanisch + Sasak + Santali + Sardisch + Sizilianisch + Schottisch + Sindhi + Nord-Samisch + Selkupisch + Semitische Sprache + Sango + Altirisch + Gebärdensprache + Serbo-Kroatisch + Schan-Sprache + Singhalesisch + Sidamo + Sioux-Sprachen + Sinotibetische Sprache + Slowakisch + Slowenisch + Slawische Sprache + Samoanisch + Süd-Samisch + Lappisch + Lule-Lappisch + Inari-Lappisch + Skolt-Lappisch + Shona + Soninke-Sprache + Somali + Sogdisch + Songhai-Sprache + Albanisch + Serbisch + Srananisch + Serer-Sprache + Swazi + Nilosaharanische Sprache + Süd-Sotho-Sprache + Sundanesisch + Sukuma-Sprache + Susu + Sumerisch + Schwedisch + Suaheli + Altsyrisch + Syrisch + Tamilisch + Thaisprache + Telugu + Temne + Tereno-Sprache + Tetum-Sprache + Tadschikisch + Thailändisch + Tigrinja + Tigre + Tiv-Sprache + Turkmenisch + Tokelauanisch + Tagalog + Klingonisch + Tlingit-Sprache + Tamaseq + Tswana-Sprache + Tongaisch + Tsonga-Sprache + Neumelanesisch + Türkisch + Tsonga + Tsimshian-Sprache + Tatarisch + Tumbuka-Sprache + Tupi-Sprachen + Altaische Sprache + Elliceanisch + Twi + Tahitisch + Tuwinisch + Udmurtisch + Uigurisch + Ugaritisch + Ukrainisch + Mbundu-Sprache + Unbestimmte Sprache + Urdu + Usbekisch + Vai-Sprache + Venda-Sprache + Vietnamesisch + Volapük + Wotisch + Wallonisch + Wakashanisch + Walamo-Sprache + Waray + Washo-Sprache + Sorbisch + Wolof + Kalmückisch + Xhosa + Yao-Sprache + Yapesisch + Jiddisch + Yoruba + Yupik-Sprache + Zhuang + Zapotekisch + Bliss-Symbole + Zenaga + Chinesisch + Vereinfachtes Chinesisch + Traditionelles Chinesisch + Zande-Sprache + Zulu + Zuni-Sprache + Keine Sprachinhalte + Zaza + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Welt + Afrika + Nordamerika + Südamerika + Ozeanien + Westafrika + Mittelamerika + Ostafrika + Nordafrika + Zentralafrika + Südliches Afrika + Nord-, Mittel- und Südamerika + Nördliches Amerika + Karibik + Ostasien + Südasien + Südostasien + Südeuropa + Australien und Neuseeland + Melanesien + Mikronesisches Inselgebiet + Polynesien + Süd-Zentralasien + Asien + Zentralasien + Westasien + Europa + Osteuropa + Nordeuropa + Westeuropa + Gemeinschaft Unabhängiger Staaten + Lateinamerika und Karibik + Kanalinseln + Andorra + Vereinigte Arabische Emirate + Afghanistan + Antigua und Barbuda + Anguilla + Albanien + Armenien + Niederländische Antillen + Angola + Antarktis + Argentinien + Amerikanisch-Samoa + Österreich + Australien + Aruba + Alandinseln + Aserbaidschan + Bosnien und Herzegowina + Barbados + Bangladesch + Belgien + Burkina Faso + Bulgarien + Bahrain + Burundi + Benin + St. Barthélemy + Bermuda + Brunei Darussalam + Bolivien + Brasilien + Bahamas + Bhutan + Bouvetinsel + Botsuana + Weißrussland + Belize + Kanada + Kokosinseln + Demokratische Republik Kongo + Zentralafrikanische Republik + Kongo + Schweiz + Côte d’Ivoire + Cookinseln + Chile + Kamerun + China + Kolumbien + Costa Rica + Serbien und Montenegro + Kuba + Kap Verde + Weihnachtsinsel + Zypern + Tschechische Republik + Deutschland + Dschibuti + Dänemark + Dominica + Dominikanische Republik + Algerien + Ecuador + Estland + Ägypten + Westsahara + Eritrea + Spanien + Äthiopien + Finnland + Fidschi + Falklandinseln + Mikronesien + Färöer + Frankreich + Gabun + Vereinigtes Königreich + Grenada + Georgien + Französisch-Guayana + Guernsey + Ghana + Gibraltar + Grönland + Gambia + Guinea + Guadeloupe + Äquatorialguinea + Griechenland + Südgeorgien und die Südlichen Sandwichinseln + Guatemala + Guam + Guinea-Bissau + Guyana + Hongkong + Heard- und McDonald-Inseln + Honduras + Kroatien + Haiti + Ungarn + Indonesien + Irland + Israel + Isle of Man + Indien + Britisches Territorium im Indischen Ozean + Irak + Iran + Island + Italien + Jersey + Jamaika + Jordanien + Japan + Kenia + Kirgisistan + Kambodscha + Kiribati + Komoren + St. Kitts und Nevis + Demokratische Volksrepublik Korea + Republik Korea + Kuwait + Kaimaninseln + Kasachstan + Laos + Libanon + St. Lucia + Liechtenstein + Sri Lanka + Liberia + Lesotho + Litauen + Luxemburg + Lettland + Libyen + Marokko + Monaco + Republik Moldau + Montenegro + St. Martin + Madagaskar + Marshallinseln + Mazedonien + Mali + Myanmar + Mongolei + Macao + Nördliche Marianen + Martinique + Mauretanien + Montserrat + Malta + Mauritius + Malediven + Malawi + Mexiko + Malaysia + Mosambik + Namibia + Neukaledonien + Niger + Norfolkinsel + Nigeria + Nicaragua + Niederlande + Norwegen + Nepal + Nauru + Niue + Neuseeland + Oman + Panama + Peru + Französisch-Polynesien + Papua-Neuguinea + Philippinen + Pakistan + Polen + St. Pierre und Miquelon + Pitcairn + Puerto Rico + Palästinensische Gebiete + Portugal + Palau + Paraguay + Katar + Äußeres Ozeanien + Europäische Union + Réunion + Rumänien + Serbien + Russische Föderation + Ruanda + Saudi-Arabien + Salomonen + Seychellen + Sudan + Schweden + Singapur + St. Helena + Slowenien + Svalbard und Jan Mayen + Slowakei + Sierra Leone + San Marino + Senegal + Somalia + Suriname + São Tomé und Príncipe + El Salvador + Syrien + Swasiland + Turks- und Caicosinseln + Tschad + Französische Süd- und Antarktisgebiete + Togo + Thailand + Tadschikistan + Tokelau + Osttimor + Turkmenistan + Tunesien + Tonga + Türkei + Trinidad und Tobago + Tuvalu + Taiwan + Tansania + Ukraine + Uganda + Amerikanisch-Ozeanien + Vereinigte Staaten + Uruguay + Usbekistan + Vatikanstadt + St. Vincent und die Grenadinen + Venezuela + Britische Jungferninseln + Amerikanische Jungferninseln + Vietnam + Vanuatu + Wallis und Futuna + Samoa + Jemen + Mayotte + Südafrika + Sambia + Simbabwe + Unbekannte oder ungültige Region + + + Alte deutsche Rechtschreibung + Standardisierte Resianische Rechtschreibung + Neue deutsche Rechtschreibung + Spätes Mittelfranzösisch + Ostarmenisch + Westarmenisch + Einheitliches Türkisches Alphabet + Bela-Dialekt + Boontling + IPA Phonetisch + Phonetisch (UPA) + Lipovaz-Dialekt + Monotonisch + Natisone-Dialekt + Njiva-Dialekt + Osojane-Dialekt + Polytonisch + Posix + Revidierte Rechtschreibung + Resianisch + Saho + Schottisches Standardenglisch + Scouse-Dialekt + Solbica-Dialekt + Taraskievica-Orthographie + + + Kalender + Sortierung + Währung + + + Traditionelles Chinesisch - Big5 + Buddhistischer Kalender + Chinesischer Kalender + Direkte Sortierregeln + Vereinfachtes Chinesisch - GB2312 + Gregorianischer Kalender + Hebräischer Kalender + Indischer Nationalkalender + Islamischer Kalender + Bürgerlicher islamischer Kalender + Japanischer Kalender + Telefonbuch-Sortierregeln + Pinyin-Sortierregeln + Kalender der Republik China + Strichfolge + Traditionelle Sortierregeln + + + angloamerikanisch + metrisch + + + Sprache: {0} + Schrift: {0} + Region: {0} + + + + + + [a ä b-o ö p-s ß t u ü v-z] + [á à ă â å ä ā æ ç é è ĕ ê ë ē í ì ĭ î ï ī ñ ó ò ŏ ô ö ø ō œ ß ú ù ŭ û ü ū ÿ] + [a-z] + + + + + + + + + GjMtkHmsSEDFwWahKzJeugAZvcL + + + vorm. + nachm. + + + + EEEE d. MMMM yyyy G + + + + + d. MMMM yyyy G + + + + + d. MMM yyyy G + + + + + d.M.yyyy + + + + + + vorm. + nachm. + + + vorm. + nachm. + + + + + + Jan + Feb + Mrz + Apr + Mai + Jun + Jul + Aug + Sep + Okt + Nov + Dez + + + Januar + Februar + März + April + Mai + Juni + Juli + August + September + Oktober + November + Dezember + + + + + Mär + Jul + Aug + Sep + Okt + Nov + Dez + + + J + F + M + A + M + J + J + A + S + O + N + D + + + + + + + So. + Mo. + Di. + Mi. + Do. + Fr. + Sa. + + + Sonntag + Montag + Dienstag + Mittwoch + Donnerstag + Freitag + Samstag + + + + + S + M + D + M + D + F + S + + + + + + + Q1 + Q2 + Q3 + Q4 + + + 1. Quartal + 2. Quartal + 3. Quartal + 4. Quartal + + + + + 1 + 2 + 3 + 4 + + + + vorm. + nachm. + + + v. Chr. + n. Chr. + + + v. Chr. + n. Chr. + + + + + + EEEE, d. MMMM yyyy + + + + + d. MMMM yyyy + + + + + dd.MM.yyyy + + + + + dd.MM.yy + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1} {0} + + + + E d. + H + HH:mm + HH:mm:ss + H:mm + L + E, d.M. + LLL + E d. MMM + E d. MMMM + d. MMMM + dd. MMMM + d. MMM + d.MM. + dd.MM. + d.M. + d + HH:mm + HH:mm:ss + mm:ss + mm:ss + yyyy + yyyy-M + EEE, yyyy-M-d + MMM yyyy + EEE, d. MMM yyyy + MMMM yyyy + Q yyyy + QQQ yyyy + MM.yy + MMM yy + dd.MM.yy + Q yy + QQQQ yy + yyyy + MMMM yyyy + + + {0} - {1} + + M.-M. + + + E, dd.MM. - E, dd.MM. + E, dd.MM. - E, dd.MM. + + + MMM-MMM + + + E, d. MMM - E, d. MMM + E, d. - E, d. MMM + + + LLLL-LLLL + + + d. MMM - d. MMM + d.-d. MMM + + + dd.MM. - dd.MM. + dd.MM. - dd.MM. + + + d.-d. + + + HH-HH + HH-HH + + + HH:mm-HH:mm + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH-HH v + HH-HH v + + + y-y + + + MM.yy - MM.yy + MM.yy - MM.yy + + + E, dd.MM.yy - E, dd.MM.yy + E, dd.MM.yy - E, dd.MM.yy + E, dd.MM.yy - E, dd.MM.yy + + + MMM-MMM yyyy + MMM yyyy - MMM yyyy + + + E, d. MMM - E, d. MMM yyyy + E, d. - E, d. MMM yyyy + E, d. MMM yyyy - E, d. MMM yyyy + + + MM – MM.yyyy + MM.yyyy – MM.yyyy + + + d. MMM - d. MMM yyyy + d.-d. MMM yyyy + d. MMM yyyy - d. MMM yyyy + + + dd.MM.yy - dd.MM.yy + dd.MM.yy - dd.MM.yy + dd.MM.yy - dd.MM.yy + + + + + + Epoche + + + Jahr + + + Monat + + + Woche + + + Tag + Heute + Morgen + Übermorgen + In drei Tagen + Gestern + Vorgestern + Vor drei Tagen + + + Wochentag + + + Tageshälfte + + + Stunde + + + Minute + + + Sekunde + + + Zone + + + + + vorm. + nachm. + + + vorm. + nachm. + + + + +HH:mm;-HH:mm + GMT{0} + {0} + {1} ({0}) + + Unbekannt + + + Tirana + + + Erivan + + + Curaçao + + + Südpol + + + Wostok + + + Dumont D'Urville + + + Wien + + + Brüssel + + + Wagadugu + + + Bermudas + + + Zürich + + + Osterinsel + + + Havanna + + + Kap Verde + + + Weihnachts-Inseln + + + Nikosia + + + Dschibuti + + + Kopenhagen + + + Algier + + + Kairo + + + El Aaiún + + + Kanaren + + + Addis Abeba + + + Fidschi + + + Färöer + + + Tiflis + + + Akkra + + + + + Athen + + + Süd-Georgien + + + Hongkong + + + Bagdad + + + Teheran + + + Rom + + + Jamaika + + + Tokio + + + Bischkek + + + Komoren + + + St. Kitts + + + Pjöngjang + + + Kaimaninseln + + + Aktobe + + + St. Lucia + + + Wilna + + + Luxemburg + + + Tripolis + + + Kischinau + + + + + Macao + + + Malediven + + + Mexiko-Stadt + + + Niger + + + Muskat + + + Warschau + + + Azoren + + + Lissabon + + + Asunción + + + Katar + + + Réunion + + + Bukarest + + + Moskau + + + Jekaterinburg + + + Nowosibirsk + + + Krasnojarsk + + + Jakutsk + + + Wladiwostok + + + Sachalin + + + Kamtschatka + + + Riad + + + Khartum + + + Singapur + + + St. Helena + + + Mogadischu + + + São Tomé + + + Salvador + + + Damaskus + + + Duschanbe + + + Port-of-Spain + + + Taipeh + + + Daressalam + + + Uschgorod + + + Kiew + + + Saporischja + + + + + Taschkent + + + St. Vincent + + + St. Thomas + + + + Acre-Zeit + Acre-Sommerzeit + + + + + Afghanistan-Zeit + + + + + Zentralafrikanische Zeit + + + + + Ostafrikanische Zeit + + + + + Südafrikanische Zeit + Südafrikanische Standardzeit + + + + + Westafrikanische Zeit + Westafrikanische Sommerzeit + + + + + Aktyubinsk-Zeit + Aktyubinsk-Sommerzeit + + + + + Alaska-Zeit + Alaska-Standardzeit + + true + + + + Alaska-Hawaii-Zeit + Alaska-Hawaii-Standardzeit + + + + + Almaty-Zeit + Almaty-Sommerzeit + + + + + Amazonas-Sommerzeit + + + + + Mitteleuropäische Zeit + Mitteleuropäische Sommerzeit + + + MEZ + MESZ + + true + + + + Osteuropäische Zeit + Osteuropäische Sommerzeit + + + OEZ + OESZ + + + + + Westeuropäische Zeit + Westeuropäische Sommerzeit + + + WEZ + WESZ + + + + + Moskauer Zeit + Moskauer Sommerzeit + + + + + + + , + . + ; + % + 0 + # + + + - + E + + + NaN + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0 % + + + + + + + #,##0.00 ¤ + + + {0} {1} + {0} {1} + + + + Andorranische Pesete + Andorranische Peseten + + + UAE Dirham + UAE Dirham + + + Afghani (1927-2002) + Afghani (1927-2002) + + + Afghani + Afghani + Af + + + Lek + Albanische Lek + + + Dram + Armenische Dram + + + Niederl. Antillen Gulden + Niederländische-Antillen-Gulden + + + Kwanza + Angolanische Kwanza + + + Angolanischer Kwanza (1977-1990) + Angolanische Kwanza (AOK) + + + Neuer Kwanza + Angolanische Neue Kwanza (AON) + + + Kwanza Reajustado + Angolanische Kwanza Reajustado (AOR) + + + Argentinischer Austral + Argentinische Austral + + + Argentinischer Peso (1983-1985) + Argentinische Peso (ARP) + + + Argentinischer Peso + Argentinische Peso + Arg$ + + + Österreichischer Schilling + Österreichische Schilling + öS + + + Australischer Dollar + Australische Dollar + $A + + + Aruba Florin + Aruba Florin + + + Aserbeidschan Manat + Aserbaidschan-Manat (AZM) + + + Aserbaidschan-Manat + Aserbaidschan-Manat + + + Bosnien und Herzegowina Dinar + Bosnien und Herzegowina Dinar + + + Konvertierbare Mark + Bosnien und Herzegowina Konvertierbare Mark + KM + + + Barbados-Dollar + Barbados-Dollar + BDS$ + + + Taka + Taka + Tk + + + Belgischer Franc (konvertibel) + Belgische Franc (konvertibel) + + + Belgischer Franc + Belgische Franc + BF + + + Belgischer Finanz-Franc + Belgische Finanz-Franc + + + Lew (1962-1999) + Bulgarische Lew + lev + + + Lew + Bulgarische Lew (BGN) + + + Bahrain-Dinar + Bahrain-Dinar + BD + + + Burundi-Franc + Burundi-Franc + Fbu + + + Bermuda-Dollar + Bermuda-Dollar + Ber$ + + + Brunei-Dollar + Brunei-Dollar + + + Boliviano + Boliviano + Bs + + + Bolivianischer Peso + Bolivianische Peso + + + Mvdol + Bolivianische Mvdol + + + Brasilianischer Cruzeiro Novo (1967-1986) + Brasilianische Cruzeiro Novo (BRB) + + + Brasilianischer Cruzado + Brasilianische Cruzado + + + Brasilianischer Cruzeiro (1990-1993) + Brasilianische Cruzeiro (BRE) + + + Real + Brasilianische Real + + + Brasilianischer Cruzado Novo + Brasilianische Cruzado Novo + + + Brasilianischer Cruzeiro + Brasilianische Cruzeiro + + + Bahama-Dollar + Bahama-Dollar + + + Ngultrum + Bhutanische Ngultrum + Nu + + + Birmanischer Kyat + Birmanische Kyat + + + Pula + Botswanische Pula + + + Belarus Rubel (alt) + Belarus-Rubel (BYB) + + + Belarus Rubel (neu) + Belarus-Rubel + Rbl + + + Belize-Dollar + Belize-Dollar + BZ$ + + + Kanadischer Dollar + Kanadische Dollar + Can$ + + + Franc congolais + Franc congolais + + + WIR-Euro + + + Schweizer Franken + Schweizer Franken + SFr. + + + WIR Franken + WIR Franken + + + Unidades de Fomento + Chilenische Unidades de Fomento + + + Chilenischer Peso + Chilenische Pesos + Ch$ + + + Renminbi Yuan + Renminbi Yuan + Y + + + Kolumbianischer Peso + Kolumbianische Pesos + Col$ + + + Unidad de Valor Real + Unidad de Valor Real + + + Costa Rica Colon + Costa Rica Colon + C + + + Alter Serbischer Dinar + Alte Serbische Dinar + + + Tschechoslowakische Krone + Tschechoslowakische Kronen + + + Kubanischer Peso + Kubanische Pesos + + + Kap Verde Escudo + Kap Verde Escudo + CVEsc + + + Zypern Pfund + Zypern Pfund + £C + + + Tschechische Krone + Tschechische Kronen + + + Mark der DDR + Mark der DDR + + + Deutsche Mark + Deutsche Mark + DM + + + Dschibuti-Franc + Dschibuti-Franc + DF + + + Dänische Krone + Dänische Kronen + + + Dominikanischer Peso + Dominikanische Pesos + + + Algerischer Dinar + Algerische Dinar + DA + + + Ecuadorianischer Sucre + Ecuadorianische Sucre + + + Verrechnungseinheit für EC + Verrechnungseinheiten für EC + + + Estnische Krone + Estnische Kronen + + + Ägyptisches Pfund + Ägyptische Pfund + + + Ekwele + Ekwele + + + Nakfa + Eritreische Nakfa + + + Spanische Peseta (A-Konten) + Spanische Peseten (A-Konten) + + + Spanische Peseta (konvertibel) + Spanische Peseten (konvertibel) + + + Spanische Pesete + Spanische Peseten + + + + Birr + Äthiopische Birr + Br + + + Euro + Euro + + + Finnische Mark + Finnische Mark + + + Fidschi Dollar + Fidschi Dollar + F$ + + + Falkland Pfund + Falkland Pfund + + + Französischer Franc + Französische Franc + FF + + + Pfund Sterling + Pfund Sterling + £ + + + Georgischer Kupon Larit + Georgische Kupon Larit + + + Georgischer Lari + Georgische Lari + lari + + + Cedi + Cedi + + + Ghanaische Cedi + + + Gibraltar Pfund + Gibraltar Pfund + + + Dalasi + Gambische Dalasi + + + Guinea Franc + Guinea Franc + GF + + + Guineischer Syli + Guineische Syli + + + Äquatorialguinea Ekwele Guineana + Äquatorialguinea-Ekwele + + + Griechische Drachme + Griechische Drachmen + + + Quetzal + Quetzal + + + Portugiesisch Guinea Escudo + Portugiesisch Guinea Escudo + + + Guinea Bissau Peso + Guinea-Bissau Pesos + + + Guyana Dollar + Guyana Dollar + G$ + + + Hongkong-Dollar + Hongkong-Dollar + + + Lempira + Lempira + L + + + Kroatischer Dinar + Kroatische Dinar + + + Kuna + Kuna + + + Gourde + Gourde + + + Forint + Forint + Ft + + + Rupiah + Rupiah + Rp + + + Irisches Pfund + Irische Pfund + IR£ + + + Israelisches Pfund + Israelische Pfund + + + Schekel + Neue Schekel + + + Indische Rupie + Indische Rupien + 0≤Rs.|1≤Re.|1<Rs. + + + Irak Dinar + Irak Dinar + ID + + + Rial + Rial + RI + + + Isländische Krone + Isländische Kronen + + + Italienische Lire + Italienische Lire + + + + Jamaika Dollar + Jamaika Dollar + J$ + + + Jordanischer Dinar + Jordanische Dinar + JD + + + Yen + Yen + ¥ + + + Kenia Schilling + Kenia Schilling + K Sh + + + Som + Som + som + + + Riel + Riel + CR + + + Komoren Franc + Komoren-Franc + CF + + + Nordkoreanischer Won + Nordkoreanische Won + + + Südkoreanischer Won + Südkoreanische Won + + + Kuwait Dinar + Kuwait Dinar + KD + + + Kaiman-Dollar + Kaiman-Dollar + + + Tenge + Tenge + T + + + Kip + Kip + + + Libanesisches Pfund + Libanesische Pfund + LL + + + Sri Lanka Rupie + Sri Lanka Rupie + SL Re + + + Liberianischer Dollar + Liberianische Dollar + + + Loti + Loti + M + + + Maloti + Maloti + + + Litauischer Litas + Litauische Litas + + + Litauischer Talonas + Litauische Talonas + + + Luxemburgischer Franc (konvertibel) + Luxemburgische Franc (konvertibel) + + + Luxemburgischer Franc + Luxemburgische Franc + + + Luxemburgischer Finanz-Franc + Luxemburgische Finanz-Franc + + + Lettischer Lats + Lettische Lats + + + Lettischer Rubel + Lettische Rubel + + + Libyscher Dinar + Libysche Dinar + LD + + + Marokkanischer Dirham + Marokkanische Dirham + + + Marokkanischer Franc + Marokkanische Franc + + + Moldau Leu + Moldau Leu + + + Madagaskar Ariary + Madagaskar Ariary + + + Madagaskar Franc + Madagaskar-Franc + + + Denar + Denar + MDen + + + Malischer Franc + Malische Franc + + + Kyat + Kyat + + + Tugrik + Tugrik + Tug + + + Pataca + Pataca + + + Ouguiya + Ouguiya + UM + + + Maltesische Lira + Maltesische Lira + Lm + + + Maltesisches Pfund + Maltesische Pfund + + + Mauritius Rupie + Mauritius Rupie + + + Rufiyaa + Rufiyaa + + + Malawi Kwacha + Malawi-Kwacha + MK + + + Mexikanischer Peso + Mexikanische Pesos + MEX$ + + + Mexikanischer Silber-Peso (1861-1992) + Mexikanische Silber-Pesos (MXP) + + + Mexican Unidad de Inversion (UDI) + Mexikanische Unidad de Inversion (UDI) + + + Malaysischer Ringgit + Malaysische Ringgit + RM + + + Mosambikanischer Escudo + Mozambikanische Escudo + + + Alter Metical + Alte Metical + Mt + + + Metical + Metical + MTn + + + Namibia Dollar + Namibia-Dollar + N$ + + + Naira + Naira + + + Cordoba + Cordoba + + + Gold-Cordoba + Gold-Cordoba + + + Holländischer Gulden + Holländische Gulden + + + Norwegische Krone + Norwegische Kronen + NKr + + + Nepalesische Rupie + Nepalesische Rupien + Nrs + + + Neuseeland-Dollar + Neuseeland-Dollar + $NZ + + + Rial Omani + Rial Omani + RO + + + Balboa + Balboa + + + Peruanischer Inti + Peruanische Inti + + + Neuer Sol + Neue Sol + + + Sol + Sol + + + Kina + Kina + + + Philippinischer Peso + Philippinische Peso + Php + + + Pakistanische Rupie + Pakistanische Rupien + Pra + + + Zloty + Zloty + Zl + + + Zloty (1950-1995) + Zloty (PLZ) + + + Portugiesischer Escudo + Portugiesische Escudo + + + Guarani + Guarani + + + Katar Riyal + Katar Riyal + QR + + + Rhodesischer Dollar + Rhodesische Dollar + + + Leu + Leu + + + Rumänischer Leu + Rumänische Leu + + + Serbischer Dinar + Serbische Dinar + + + Russischer Rubel (neu) + Russische Rubel (neu) + + + Russischer Rubel (alt) + Russische Rubel (alt) + + + Ruanda Franc + Ruanda-Franc + + + Saudi Riyal + Saudi Riyal + SRl + + + Salomonen Dollar + Salomonen-Dollar + SI$ + + + Seychellen Rupie + Seychellen-Rupien + SR + + + Sudanesischer Dinar + Sudanesische Dinar + + + Sudanesisches Pfund + Sudanesische Pfund + + + Sudanesisches Pfund (alt) + Sudanesische Pfund (alt) + + + Schwedische Krone + Schwedische Kronen + + + Singapur-Dollar + Singapur-Dollar + S$ + + + St. Helena Pfund + St. Helena-Pfund + + + Tolar + Tolar + + + Slowakische Krone + Slowakische Kronen + Sk + + + Leone + Leone + + + Somalia Schilling + Somalia-Schilling + + + Surinamischer Dollar + Surinamische Dollar + + + Suriname Gulden + Suriname-Gulden + Sf + + + Dobra + Dobra + Db + + + Sowjetischer Rubel + Sowjetische Rubel + + + El Salvador Colon + El Salvador-Colon + + + Syrisches Pfund + Syrische Pfund + LS + + + Lilangeni + Lilangeni + E + + + Baht + Baht + + + Tadschikistan Rubel + Tadschikistan-Rubel + + + Tadschikistan Somoni + Tadschikistan-Somoni + + + Turkmenistan-Manat + Turkmenistan-Manat + + + Tunesischer Dinar + Tunesische Dinar + + + Paʻanga + Paʻanga + T$ + + + Timor Escudo + Timor-Escudo + + + Türkische Lira + Türkische Lira + Türkische Lire + TL + + + Neue Türkische Lira + Neue Türkische Lira + Neue Türkische Lire + + + Trinidad und Tobago Dollar + Trinidad und Tobago-Dollar + TT$ + + + Neuer Taiwan Dollar + Neuer Taiwan Dollar + NT$ + + + Tansania Schilling + Tansania-Schilling + T Sh + + + Hryvnia + Hryvnia + + + Ukrainischer Karbovanetz + Ukrainische Karbovanetz + + + Uganda Schilling (1966-1987) + Uganda-Schilling (UGS) + + + Uganda Schilling + Uganda-Schilling + U Sh + + + US-Dollar + US-Dollar + $ + + + US Dollar (Nächster Tag) + US-Dollar (Nächster Tag) + + + US Dollar (Gleicher Tag) + US-Dollar (Gleicher Tag) + + + Uruguayischer Neuer Peso (1975-1993) + Uruguayische Pesos (UYP) + + + Uruguayischer Peso + Uruguayische Pesos + Ur$ + + + Usbekistan Sum + Usbekistan-Sum + + + Bolivar + Bolivar + Be + + + Bolívar Fuerte + + + Dong + Dong + + + Vatu + Vatu + + + Tala + Tala + + + CFA Franc (Äquatorial) + CFA-Franc (BEAC) + + + Silber + Silber + + + Gold + Gold + + + Europäische Rechnungseinheit + Europäische Rechnungseinheiten + + + Europäische Währungseinheit (XBB) + Europäische Währungseinheiten (XBB) + + + Europäische Rechnungseinheit (XBC) + Europäische Rechnungseinheiten (XBC) + + + Europäische Rechnungseinheit (XBD) + Europäische Rechnungseinheiten (XBD) + + + Ostkaribischer Dollar + Ostkaribische Dollar + EC$ + + + Sonderziehungsrechte + Sonderziehungsrechte + + + Europäische Währungseinheit (XEU) + Europäische Währungseinheiten (XEU) + + + Französischer Gold-Franc + Französische Gold-Franc + + + Französischer UIC-Franc + Französische UIC-Franc + + + CFA Franc (West) + CFA-Franc (BCEAO) + + + Palladium + Palladium + + + CFP Franc + CFP-Franc + + + Platin + Platin + + + RINET Funds + RINET Funds + + + Testwährung + Testwährung + + + Unbekannte Währung + Unbekannte Währung + Unbekannte Währung + + + Jemen Dinar + Jemen-Dinar + + + Jemen Rial + Jemen-Rial + YRl + + + Jugoslawischer Dinar (1966-1990) + Jugoslawische Dinar + + + Neuer Dinar + Jugoslawische Neue Dinar + + + Jugoslawischer Dinar (konvertibel) + Jugoslawische Dinar (konvertibel) + + + Rand + Rand + R + + + Kwacha + Kwacha + + + Neuer Zaire + Neue Zaire + + + Zaire + Zaire + + + Simbabwe Dollar + Simbabwe-Dollar + Z$ + + + + + + {0} Tag + {0} Tage + + + {0} Stunde + {0} Stunden + + + {0} Minute + {0} Minuten + + + {0} Monat + {0} Monate + + + {0} Sekunde + {0} Sekunden + + + {0} Woche + {0} Wochen + + + {0} Jahr + {0} Jahre + + + + + ja:j + nein:n + + + diff --git a/libs/Zend/Locale/Data/de_AT.xml b/libs/Zend/Locale/Data/de_AT.xml new file mode 100644 index 0000000..380419d --- /dev/null +++ b/libs/Zend/Locale/Data/de_AT.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + Jän + Mär + + + Jänner + + + + + + + EEEE, dd. MMMM yyyy + + + + + dd. MMMM yyyy + + + + + + + E, dd. MMM - E, dd. MMM + E, dd. - E, dd. MMM + + + dd. MMM - dd. MMM + dd.-dd. MMM + + + E, dd. MMM - E, dd. MMM yyyy + E, dd. - E, dd. MMM yyyy + E, dd. MMM yyyy - E, dd. MMM yyyy + + + dd. MMM - dd. MMM yyyy + dd.-dd. MMM yyyy + dd. MMM yyyy - dd. MMM yyyy + + + + + + + + + + + ¤ #,##0.00 + + + + + + diff --git a/libs/Zend/Locale/Data/de_BE.xml b/libs/Zend/Locale/Data/de_BE.xml new file mode 100644 index 0000000..1361894 --- /dev/null +++ b/libs/Zend/Locale/Data/de_BE.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + Mär + + + + + + + Son + Mon + Die + Mit + Don + Fre + Sam + + + + + + + EEEE d MMMM yyyy + + + + + d MMMM yyyy + + + + + d/MM/yy + + + + + + + HH 'h' mm 'min' ss 's' v + + + + + + d MMMM + MM/yy + + + + M-M + + + E d/MM - E d/MM + E d/MM - E d/MM + + + E d MMM - E d MMM + E d - E d MMM + + + d MMM - d MMM + d-d MMM + + + d/MM - d/MM + d/MM - d/MM + + + d-d + + + MM/yy - MM/yy + MM/yy - MM/yy + + + E d/MM/yy - E d/MM/yy + E d/MM/yy - E d/MM/yy + E d/MM/yy - E d/MM/yy + + + E d MMM - E d MMM yyyy + E d - E d MMM yyyy + E d MMM yyyy - E d MMM yyyy + + + d MMM - d MMM yyyy + d-d MMM yyyy + d MMM yyyy - d MMM yyyy + + + d/MM/yy - d/MM/yy + d/MM/yy - d/MM/yy + d/MM/yy - d/MM/yy + + + + + + + + + + Franken + + + + diff --git a/libs/Zend/Locale/Data/de_CH.xml b/libs/Zend/Locale/Data/de_CH.xml new file mode 100644 index 0000000..2fca655 --- /dev/null +++ b/libs/Zend/Locale/Data/de_CH.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + Bangladesh + Brunei + Botswana + Kapverden + Djibouti + Grossbritannien + Marshall-Inseln + Rwanda + Salomon-Inseln + Sao Tomé und Principe + Zimbabwe + + + + « + » + + + + + + + + + MM-dd + + + + + + + + . + ' + + + + + ¤ #,##0.00;¤-#,##0.00 + + + + + diff --git a/libs/Zend/Locale/Data/de_DE.xml b/libs/Zend/Locale/Data/de_DE.xml new file mode 100644 index 0000000..f61b5af --- /dev/null +++ b/libs/Zend/Locale/Data/de_DE.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/de_LI.xml b/libs/Zend/Locale/Data/de_LI.xml new file mode 100644 index 0000000..6eeb96f --- /dev/null +++ b/libs/Zend/Locale/Data/de_LI.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + . + ' + + + + + ¤ #,##0.00 + + + + + + diff --git a/libs/Zend/Locale/Data/de_LU.xml b/libs/Zend/Locale/Data/de_LU.xml new file mode 100644 index 0000000..2973729 --- /dev/null +++ b/libs/Zend/Locale/Data/de_LU.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + F + . + , + + + + diff --git a/libs/Zend/Locale/Data/dv.xml b/libs/Zend/Locale/Data/dv.xml new file mode 100644 index 0000000..6172912 --- /dev/null +++ b/libs/Zend/Locale/Data/dv.xml @@ -0,0 +1,231 @@ + + + + + + + + + + + ދިވެހިބަސް + + + ދިވެހި ރާއްޖެ + + + + + + + [ހ-ޗ ަ-ް] + [\u200C \u200D ޙ ޚ ޜ ޢ ޣ ޥ ޛ ޘ ޠ ޡ ޤ ޝ-ޟ ޱ] + + + + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + AM + PM + + + BCE + CE + + + + + + EEEE d MMMM yyyy + + + + + d MMMM yyyy + + + + + dd-MM-yyyy + + + + + d-M-yy + + + + + + + hh:mm:ss a v + + + + + hh:mm:ss a z + + + + + hh:mm:ss a + + + + + hh:mm a + + + + + + + {1} {0} + + + + d MMMM + dd-MM + Q yy + MM-yyyy + MMMM yyyy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + ، + ٠ + + + + + #,##,##0.### + + + + + + + #,##,##0% + + + + + + + ¤ #,##,##0.00 + + + + + + ރ. + + + + + diff --git a/libs/Zend/Locale/Data/dv_MV.xml b/libs/Zend/Locale/Data/dv_MV.xml new file mode 100644 index 0000000..0cec0d3 --- /dev/null +++ b/libs/Zend/Locale/Data/dv_MV.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/dz.xml b/libs/Zend/Locale/Data/dz.xml new file mode 100644 index 0000000..3b202fd --- /dev/null +++ b/libs/Zend/Locale/Data/dz.xml @@ -0,0 +1,419 @@ + + + + + + + + + + + ཨེ་ར་སྦིག + བཟོ་བཟོཝ (གཞན) + ཨ་ས་མི་སི + བི་ཧ་ལི + བེངྒ་ལི + བོད་ཁ + ཅེཀ + ཌེ་ནིཤ + ཇཱར་མཱན + དི་བེ་ཧི + རྫོང་ཁ + ཨི་ཇིཔ་ཤཱན (སྔ་དུས་ཀྱི) + གིརིཀ + ཨིང་ལིཤ + སིཔེ་ནིཤ + པར་ཤི་ཡན + ཕེ་རེནཆེ + ཨའི་རིཤ + གིརིཀ, སྔ་དུས་ཀྱི (༡༤༥༣) + ཧི་བུརུ + ཧིན་དི + ཧི་མ་ཅ་ལི + ཨིན་ཌིཀ (གཞན) + ཨི་ཊ་ལི་རན + ཁེ་མར + ཀ་ན་ཌ + ཀོ་རིཡན + ཀེཤ་མི་རི + ལའོ + མ་ལ་ཡ་ལམ + སོག་པོའི་ཁ + མཱན་ཅུ + མ་ནི་པུ་རི + མ་ར་ཐི + བར་མིསི + ནེ་པ་ལི + ནི་ཝ་རི + ཌཆ + ནོར་ཝི་ཇི་ཡན + ཨོ་རི་ཡ + པཱན་ཇ་བི + པ་ལི + ར་ཤི་ཡན + སཾསྐྲྀཏ + སིན་ཧ་ལིསི + ཏ་མིལ + ཏེ་ལུ་གུ + ཐཱའེ + ཨུར་དུ + རགྱ་མི་ཁ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ཡུ་ནའི་ཊེཊ་ཨ་ར བ་ཨེ་མི་རེཊསི + ཨཕ་ག་ནིསི་ཏཱན + ཨེན་ཊཱག་ཊི་ཀ + ཨར་ཇེན་ཊི་ན + ཨས་ཊི་ཡ + ཨས་ཊེཡེ་ལི་ཡ + བངྒ་ལ་དེཤ + བེལ་ཇིཡམ + བཧ་རེན + བཱརཱ་ཛིལ + འབྲུག + ཀེ་ན་ཌ + སུའིཊ་ཛར་ལེན + རྒྱ་མི + ཀིའུ་སྦ + ཅེཀ་རི་པབ་ལིཀ + ཇཱར་མ་ནི + ཌེན་མཱཀ + ཨི་ཇིཔཊ + སིཔཱེན + ཕིན་ལེནཌ + ཕརཱནསི + ཡུ་ནའི་ཊེཊ་ཀིང་ཌམ + གིརིསི + ཧོང་ཀོང + ཨའིརི་ལེནཌ + ཨིཛ་རཱེལ + རྒྱ་གར + ཨི་རཀ + ཨི་རཱན + ཨའིསི་ལེནཌ + ཨྀཊ་ལི + ཇ་མའི་ཀ + ཇ་པཱན + ཀེ་ནི་ཡ + ཀམ་བོ་ཌི་ཡ + བྱང་ཀོ་རི་ཡ + ལྷོ་ཀོ་རི་ཡ + ཀུ་ཝེཊ + ལ་འོསུ + ལེ་བཱ་ནཱོན + ཤྲཱྀ་ལངཀ + མེ་མར + སོག་པོ + མོན་ས་རཊི + མོ་རི་ཤིཡསི + མཱལ་ཌིབས + མེཀསི་ཀོ + མ་ལེ་ཤི་ཡ + ནེ་དར་ལེནཌསི + ནོ་ཝེ + བལ་ཡུལ + ནིའུ་ཛི་ལེནཌ + པ་ན་མཱ + པ་ཀིསི་ཏཱན + པེ་ལིསི་ཊི་ནིཡ ན་ཊེ་རི་ངོ་རི + པོར་ཅུ་གལ + ཀ་ཏར + སའུ་དི་ཨེ་ར་སྦི་ཡ + སུའི་ཌན + སིལོ་བེ་ནི་ཡ + ཐཱའི་ལེནཌ + ཏ་ཇག་ཀིསི་ཏཱན + ཏའི་ཝཱན + ཡུ་ནའིཊེཊ་སི་ཊེསི + ཨུཛ་བེ་ཀིསི་ཏཱན + བེཊ་ནཱམ + སའུཐ་ཨཕ་རི་ཀ + ཛམ་བི་ཡ + ཛིམ་བབ་ཝེ + + + གནས་སདུད་རིམ་ སགྲིག + + + ལུགས་སྲོལ + + + + [ཀ ྐ ཁ ྑ ག ྒ ང ྔ ཅ-ཇ ྗ ཉ ྙ ཏ ྟ ཐ ད ྡ ན ྣ པ ྤ ཕ བ ྦ མ ྨ ཙ ྩ ཚ ཛ ྫ ཝ ྭ ཞ-ཡ ྱ ར ྲ ལ ླ ཤ ྵ ས ཧ ྷ ཨ ི ུ ེ ོ] + [ཊ-ཌ ཎ ཥ] + + + + " + " + ' + ' + + + + + + + + ཟླ་ ༡ + ཟླ་ ༢ + ཟླ་ ༣ + ཟླ་ ༤ + ཟླ་ ༥ + ཟླ་ ༦ + ཟླ་ ༧ + ཟླ་ ༨ + ཟླ་ ༩ + ཟླ་ ༡༠ + ཟླ་ ༡༡ + ཟླ་ ༡༢ + + + སྤྱི་ཟླཝ་དངཔ་ + སྤྱི་ཟླཝ་གཉིས་པ་ + སྤྱི་ཟླཝ་གསུམ་པ་ + སྤྱི་ཟླཝ་བཞི་པ་ + སྤྱི་ཟླཝ་ལྔ་པ་ + སྤྱི་ཟླཝ་དྲུག་པ་ + སྤྱི་ཟླཝ་བདུན་པ་ + སྤྱི་ཟླཝ་བརྒྱད་པ་ + སྤྱི་ཟླཝ་དགུ་པ་ + སྤྱི་ཟླཝ་བཅུ་པ་ + སྤྱི་ཟླཝ་བཅུ་གཅིག་པ་ + སྤྱི་ཟླཝ་བཅུ་གཉིས་པ་ + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + ཟླ་ + མིར་ + ལྷག་ + ཕུར་ + སངས་ + སྤེན་ + ཉི་ + + + གཟའ་ཟླ་བ་ + གཟའ་མིག་དམར་ + གཟའ་ལྷག་པ་ + གཟའ་ཕུར་བུ་ + གཟའ་པ་སངས་ + གཟའ་སྤེན་པ་ + གཟའ་ཉི་མ་ + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + བཞི་དཔྱ་༡ + བཞི་དཔྱ་༢ + བཞི་དཔྱ་༣ + བཞི་དཔྱ་༤ + + + བཞི་དཔྱ་དང་པ་ + བཞི་དཔྱ་གཉིས་པ་ + བཞི་དཔྱ་གསུམ་པ་ + བཞི་དཔྱ་བཞི་པ་ + + + + སྔ་ཆ་ + ཕྱི་ཆ་ + + + BCE + CE + + + + + + སྤྱི་ལོ་yyyy ཟླ་ MMMM ཚེས་ dd + + + + + སྤྱི་ལོ་yyyy ཟླ་ MMMM ཚེས་ dd + + + + + སྤྱི་ལོ་yyyy ཟླ་ MMM ཚེས་ dd + + + + + སྤྱི་ལོ་ yyyy ཟླ་ MM ཚེས་ dd + + + + + + + + ཆུ་ཚོད་ h སྐར་མ་ mm སྐར་ཆཱ་ ss a vvvv + + + + + ཆུ་ཚོད་ h སྐར་མ་ mm སྐར་ཆཱ་ ss a zzz + + + + + ཆུ་ཚོད་h:mm:ss a + + + + + ཆུ་ཚོད་ h སྐར་མ་ mm a + + + + + + + + {1} {0} + + + + + {1} {0} + + + + Q yy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + ཐིམ་ཕུག + + + + Bhutan Time + Bhutan Standard Time + + + BT + BST + + + + + + + དང་ + བརྒ་ཆཱ + + གྲངས་མེད + ཨང་མད + + + + + #,##,##0.### + + + + + + + #E+00 + + + + + + + #,##,##0 % + + + + + + + ¤#,##,##0.00 + + + + + + དངུལ་ཀྲམ་ + Nu + + + + + diff --git a/libs/Zend/Locale/Data/dz_BT.xml b/libs/Zend/Locale/Data/dz_BT.xml new file mode 100644 index 0000000..86bef9d --- /dev/null +++ b/libs/Zend/Locale/Data/dz_BT.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/ee.xml b/libs/Zend/Locale/Data/ee.xml new file mode 100644 index 0000000..7e734c4 --- /dev/null +++ b/libs/Zend/Locale/Data/ee.xml @@ -0,0 +1,199 @@ + + + + + + + + + + [a b d {dz} ɖ e ɛ f ƒ g {gb} ɣ h i k {kp} l-n {ny} ŋ o ɔ p r-t {ts} u v ʋ w-z] + [c j q] + + + + + + + + Dzv + Dzd + Ted + Afɔ + Dam + Mas + Sia + Dea + Any + Kel + Ade + Dzm + + + Dzove + Dzodze + Tedoxe + Afɔfiɛ + Dama + Masa + Siamlɔm + Deasiamime + Anyɔnyɔ + Kele + Adeɛmekpɔxe + Dzome + + + + + D + D + T + A + D + M + S + D + A + K + A + D + + + + + + + Kɔs Kwe + Dzo + Bra + Kuɖ + Yaw + Fiɖ + Mem + + + Kɔsiɖa + Dzoɖa + Braɖa + Kuɖa + Yawoɖa + Fiɖa + Memleɖa + + + + + K + D + B + K + Y + F + M + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + AN + EW + + + Hafi Yesu Va Do ŋgɔ na Yesu + Yesu Ŋɔli + + + HY + + + + + + + EEEE, yyyy MMMM dd + + + + + yyyy MMMM d + + + + + yyyy MMM d + + + + + yy/MM/dd + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1} {0} + + + + Q yy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + + Siɖi + ¢ + + + Sefa + CFA + + + + diff --git a/libs/Zend/Locale/Data/ee_GH.xml b/libs/Zend/Locale/Data/ee_GH.xml new file mode 100644 index 0000000..47418e6 --- /dev/null +++ b/libs/Zend/Locale/Data/ee_GH.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/ee_TG.xml b/libs/Zend/Locale/Data/ee_TG.xml new file mode 100644 index 0000000..4449ef5 --- /dev/null +++ b/libs/Zend/Locale/Data/ee_TG.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/el.xml b/libs/Zend/Locale/Data/el.xml new file mode 100644 index 0000000..0b2f8dd --- /dev/null +++ b/libs/Zend/Locale/Data/el.xml @@ -0,0 +1,2642 @@ + + + + + + + + + + + Αφρικάανς + Αφροασιατική Γλώσσα + Αμαρικά + Παλαιά Αγγλικά + Γλώσσα Απάτσι + Αραβικά + Αραμαϊκά + Αράπαχο + Τεχνητή Γλώσσα + Ασαμέζικα + Αυστραλιανή Γλώσσα + Αϊμάρα + Αζερμπαϊτζανικά + Βαλτική Γλώσσα + Λευκορωσικά + Βουλγαρικά + Μπιχάρι + Μπενγκάλι + Θιβετιανά + Βρετονικά + Βοσνιακά + Καταλανικά + Ινδιανική Γλώσσα Κεντρικής Αμερικής + Καυκάσια Γλώσσα + Κελτική Γλώσσα + Κορσικανικά + Κοπτικά + Τουρκικά Κριμαίας + Τσεχικά + Ουαλικά + Δανικά + Γερμανικά + Γερμανικά Αυστρίας + Γερμανικά Ελβετίας + Μέσα Ολλανδικά + Αρχαία Αιγυπτιακά + Ελληνικά + Αγγλικά + Αγγλικά Αυστραλίας + Αγγλικά Καναδά + Αγγλικά Ηνωμένου Βασιλείου + Αγγλικά Ηνωμένων Πολιτειών + Μέσα Αγγλικά + Εσπεράντο + Ισπανικά + Ισπανικά Λατινικής Αμερικής + Ισπανικά Ιβηρικής + Εσθονικά + Βασκικά + Περσικά + Φινλανδικά + Φιλιππινέζικα + Φαρόε + Γαλλικά + Γαλλικά Καναδά + Γαλλικά Ελβετίας + Μέσα Γαλλικά + Παλαιά Γαλλικά + Φριζιανά + Ιρλανδικά + Σκωτικά Κελτικά + Γαλικιανά + Μέσα Άνω Γερμανικά + Γκουαράνι + Παλαιά Άνω Γερμανικά + Γοτθικά + Αρχαία Ελληνικά + Γκουγιαράτι + Χαβανέζικα + Εβραϊκά + Χίντι + Κροατικά + Ουγγρικά + Αρμενικά + Ιντερλίνγκουα + Ινδονησιακά + Ιντερλίνγκουε + Ινδοευρωπαϊκά (¨Αλλη) + ιρανικά + Ισλανδικά + Ιταλικά + Ιαπωνικά + Ιουδαϊκά-Περσικά + Ιουδαϊκά-Αραβικά + Ιαβανέζικα + Γεωργιανά + Καμποτζιανά + Κανάντα + Κορεατικά + Κασμίρι + Κουρδικά + Κυργιζικά + Λατινικά + Λουξεμβουργικά + Λινγκάλα + Λαοθιανά + Λιθουανικά + Λετονικά + Μέσα Ιρλανδικά + Διάφορες Γλώσσες + Σλαβομακεδονικά + Μαλαγιαλάμ + Μογγολικά + Μολδαβικά + Μαράθι + Μαλάι + Μαλτέζικα + Πολλαπλές Γλώσσες + Βιρμανικά + Ινδιανικά Βόρειας Αμερικής (Άλλα) + Νεπάλι + Ολλανδικά + Φλαμανδικά + Νορβηγικά Νινόρσκ + Νορβηγικά + Παλαιά Νορβηγικά + Οκσιτανικά + Ορίγια + Τουρκικά Οθωμανικά + Παντζαπικά + Αρχαία Περσικά + Φιλιππινέζικα (Άλλα) + Φοινικικά + Πολωνικά + Πάστο + Πορτογαλικά + Πορτογαλικά Βραζιλίας + Πορτογαλικά Ιβηρικής + Ρουμανικά + Ρωμανικά + Ρωσικά + Σανσκριτικά + Ινδιανική Γλώσσα Νοτίου Αμερικής + Σίντι + Σημιτικά (Άλλα) + Παλαιά Ιρλανδικά + Σερβοκροατικά + Σινχαλέζικα + Σινοθιβετιανή Γλώσσα + Σλοβακικά + Σλοβενικά + Σλαβικά (Άλλα) + Σομάλι + Αλβανικά + Σερβικά + Σουδανικά + Σουηδικά + Σουαχίλι + Συριακά + Ταμίλ + Τελούγκου + Ταϊλανδικά + Τιγκρίνυα + Τουρκμενικά + Κλίνγκον + Τουρκικά + Τούι + Ουιγουρικά + Ουκρανικά + Άγνωστη ή Ακατάλληλη Γλώσσα + Ουρντού + Ουζμπεκικά + Βιετναμέζικα + Γουόλοφ + Ζόσα + Ιουδαϊκά + Κινεζικά + Κινεζικά Απλοποιημένα + Κινεζικά Παραδοσιακά + Ζουλού + Χωρίς γλωσσολογικό περιεχόμενο + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Κόσμος + Αφρική + Βόρεια Αμερική + Νότια Αμερική + Ωκεανία + Δυτική Αφρική + Κεντρική Αμερική + Ανατολική Αφρική + Βόρεια Αφρική + Μέση Αφρική + Νότια Αφρική [018] + Αμερική + Βόρειος Αμερική + Καραϊβική + Ανατολική Ασία + Νότια Ασία + Νοτιοανατολική Ασία + Νότια Ευρώπη + Αυστραλία και Νέα Ζηλανδία + Μελανησία + Περιοχή Μικρονησίας + Πολυνησία + Νότια Κεντρική Ασία + Ασία + Κεντρική Ασία + Δυτική Ασία + Ευρώπη + Ανατολική Ευρώπη + Βόρεια Ευρώπη + Δυτική Ευρώπη + Κοινοπολιτεία Ανεξαρτήτων Πολιτειών + Λατινική Αμερική και Καραϊβική + Νήσοι Καναλιού + Ανδόρα + Ηνωμένα Αραβικά Εμιράτα + Αφγανιστάν + Αντίγκουα και Μπαρμπούντα + Ανγκουίλα + Αλβανία + Αρμενία + Ολλανδικές Αντίλλες + Ανγκόλα + Ανταρκτική + Αργεντινή + Αμερικανική Σαμόα + Αυστρία + Αυστραλία + Αρούμπα + Νήσοι Άλαντ + Αζερμπαϊτζάν + Βοσνία - Ερζεγοβίνη + Μπαρμπάντος + Μπανγκλαντές + Βέλγιο + Μπουρκίνα Φάσο + Βουλγαρία + Μπαχρέιν + Μπουρούντι + Μπένιν + Άγιος Βαρθολομαίος + Βερμούδες + Μπρουνέι Νταρουσαλάμ + Βολιβία + Βραζιλία + Μπαχάμες + Μπουτάν + Νήσος Μπουβέ + Μποτσουάνα + Λευκορωσία + Μπελίζ + Καναδάς + Νήσοι Κόκος + Κονγκό - Κινσάσα + Κεντροαφρικανική Δημοκρατία + Κονγκό + Ελβετία + Ακτή Ελεφαντοστού + Νήσοι Κουκ + Χιλή + Καμερούν + Κίνα + Κολομβία + Κόστα Ρίκα + Σερβία και Μαυροβούνιο + Κούβα + Πράσινο Ακρωτήριο + Νήσος Χριστουγέννων + Κύπρος + Τσεχία + Γερμανία + Τζιμπουτί + Δανία + Ντομίνικα + Δομινικανή Δημοκρατία + Αλγερία + Ισημερινός + Εσθονία + Αίγυπτος + Δυτική Σαχάρα + Ερυθραία + Ισπανία + Αιθιοπία + Φινλανδία + Φίτζι + Νήσοι Φώκλαντ + Μικρονησία + Νήσοι Φερόες + Γαλλία + Γκαμπόν + Ηνωμένο Βασίλειο + Γρενάδα + Γεωργία + Γαλλική Γουιάνα + Γκερνσέι + Γκάνα + Γιβραλτάρ + Γροιλανδία + Γκάμπια + Γουινέα + Γουαδελούπη + Ισημερινή Γουινέα + Ελλάδα + Νότια Γεωργία και Νότιες Νήσοι Σάντουιτς + Γουατεμάλα + Γκουάμ + Γουινέα-Μπισάου + Γουιάνα + Χονγκ Κονγκ + Νήσοι Χερντ και Μακντόναλντ + Ονδούρα + Κροατία + Αϊτή + Ουγγαρία + Ινδονησία + Ιρλανδία + Ισραήλ + Νήσος Μαν + Ινδία + Βρετανικά Έδάφη Ινδικού Ωκεανού + Ιράκ + Ιράν + Ισλανδία + Ιταλία + Υερσέη + Τζαμάικα + Ιορδανία + Ιαπωνία + Κένυα + Κιργιζία + Καμπότζη + Κιριμπάτι + Κομόρες + Σαιντ Κιτς και Νέβις + Βόρεια Κορέα + Νότια Κορέα + Κουβέιτ + Νήσοι Κέιμαν + Καζακστάν + Λάος + Λίβανος + Αγία Λουκία + Λιχτενστάιν + Σρι Λάνκα + Λιβερία + Λεσότο + Λιθουανία + Λουξεμβούργο + Λετονία + Λιβύη + Μαρόκο + Μονακό + Μολδαβία + Μαυροβούνιο + Άγιος Μαρτίνος + Μαδαγασκάρη + Νήσοι Μάρσαλ + ΠΓΔ Μακεδονίας + Μάλι + Μιανμάρ + Μογγολία + Μακάο + Νήσοι Βόρειες Μαριάνες + Μαρτινίκα + Μαυριτανία + Μονσεράτ + Μάλτα + Μαυρίκιος + Μαλδίβες + Μαλάουι + Μεξικό + Μαλαισία + Μοζαμβίκη + Ναμίμπια + Νέα Καληδονία + Νίγηρ + Νήσος Νόρφολκ + Νιγηρία + Νικαράγουα + Ολλανδία + Νορβηγία + Νεπάλ + Ναούρου + Νιούε + Νέα Ζηλανδία + Ομάν + Παναμάς + Περού + Γαλλική Πολυνησία + Παπούα - Νέα Γουινέα + Φιλιππίνες + Πακιστάν + Πολωνία + Σαιντ Πιέρ και Μικελόν + Πίτκερν + Πουέρτο Ρίκο + Παλαιστινιακά Εδάφη + Πορτογαλία + Παλάου + Παραγουάη + Κατάρ + Περιφερειακή Ωκεανία + Ευρωπαϊκή Ένωση + Ρεϋνιόν + Ρουμανία + Σερβία + Ρωσία + Ρουάντα + Σαουδική Αραβία + Νήσοι Σολομώντος + Σεϋχέλλες + Σουδάν + Σουηδία + Σιγκαπούρη + Αγία Ελένη + Σλοβενία + Σβαλμπάρντ και Γιαν Μαγιέν + Σλοβακία + Σιέρα Λεόνε + Άγιος Μαρίνος + Σενεγάλη + Σομαλία + Σουρινάμ + Σάο Τομέ και Πρίνσιπε + Ελ Σαλβαδόρ + Συρία + Ζουαζηλάνδη + Νήσοι Τερκς και Κάικος + Τσαντ + Γαλλικά Νότια Εδάφη + Τόγκο + Ταϊλάνδη + Τατζικιστάν + Τοκελάου + Ανατολικό Τιμόρ + Τουρκμενιστάν + Τυνησία + Τόνγκα + Τουρκία + Τρινιδάδ και Τομπάγκο + Τουβαλού + Ταϊβάν + Τανζανία + Ουκρανία + Ουγκάντα + Απομακρυσμένες Νησίδες των Ηνωμένων Πολιτειών + Ηνωμένες Πολιτείες + Ουρουγουάη + Ουζμπεκιστάν + Βατικανό + Άγιος Βικέντιος και Γρεναδίνες + Βενεζουέλα + Βρετανικές Παρθένοι Νήσοι + Αμερικανικές Παρθένοι Νήσοι + Βιετνάμ + Βανουάτου + Νήσοι Ουαλλίς και Φουτουνά + Σαμόα + Υεμένη + Μαγιότ + Νότια Αφρική + Ζάμπια + Ζιμπάμπουε + Άγνωστη ή Άκυρη Περιοχή + + + Παραδοσιακή Γερμανική Ορθογραφία + Γερμανική Ορθογραφία του 1996 + Μονοτονικό + Πολυτονικό + Αναθεωρημένη Ορθογραφία + + + Ημερολόγιο + Τακτοποίηση + Νόμισμα + + + Κινεζική Παραδοσιακή Σειρά - Big5 + Βουδιστικό Ημερολόγιο + Κινέζικο Ημερολόγιο + Άμεση σειρά ταξινόμησης + Κινεζική Απλουστευμένη Σειρά - GB2312 + Γρηγοριανό Ημερολόγιο + Εβραϊκό Ημερολόγιο + Ινδικό Εθνικό Ημερολόγιο + Ισλαμικό Ημερολόγιο + Ισλαμικό-Αστικό Ημερολόγιο + Ιαπωνικό Ημερολόγιο + Σειρά Τηλεφωνικού Καταλόγου + Σειρά Pinyin + Σειρά Stroke + Παραδοσιακή Σειρά + + + Αγγλοσαξωνικό + Μετρικό + + + Γλώσσα: {0} + Σύστημα Γραφής: {0} + Περιοχή: {0} + + + + lowercase-words + + + [α ά β-ε έ ζ η ή θ ι ί ϊ ΐ κ-ο ό π ρ σ ς τ υ ύ ϋ ΰ φ-ω ώ] + + + + + + + + + GanjkHmsSEDFwWxhKzAeugXZvcL + + + + + + Ιαν + Φεβ + Μαρ + Απρ + Μαϊ + Ιουν + Ιουλ + Αυγ + Σεπ + Οκτ + Νοε + Δεκ + + + Ιανουαρίου + Φεβρουαρίου + Μαρτίου + Απριλίου + Μαΐου + Ιουνίου + Ιουλίου + Αυγούστου + Σεπτεμβρίου + Οκτωβρίου + Νοεμβρίου + Δεκεμβρίου + + + + + Ι + Φ + Μ + Α + Μ + Ι + Ι + Α + Σ + Ο + Ν + Δ + + + Ιανουάριος + Φεβρουάριος + Μάρτιος + Απρίλιος + Μάιος + Ιούνιος + Ιούλιος + Αύγουστος + Σεπτέμβριος + Οκτώβριος + Νοέμβριος + Δεκέμβριος + + + + + + + Κυρ + Δευ + Τρι + Τετ + Πεμ + Παρ + Σαβ + + + Κυριακή + Δευτέρα + Τρίτη + Τετάρτη + Πέμπτη + Παρασκευή + Σάββατο + + + + + Κ + Δ + Τ + Τ + Π + Π + Σ + + + + + + + Τ1 + Τ2 + Τ3 + Τ4 + + + 1ο τρίμηνο + 2ο τρίμηνο + 3ο τρίμηνο + 4ο τρίμηνο + + + + + Τ1 + Τ2 + Τ3 + Τ4 + + + + π.μ. + μ.μ. + + + π.Χ. + μ.Χ. + + + π.Χ. + μ.Χ. + + + + + + EEEE, dd MMMM yyyy + + + + + dd MMMM yyyy + + + + + dd MMM yyyy + + + + + dd/MM/yyyy + + + + + + + h:mm:ss a v + + + + + h:mm:ss a z + + + + + h:mm:ss a + + + + + h:mm a + + + + + + + {1} {0} + + + + E d + H + HH:mm + HH:mm:ss + E, d-M + E d MMM + E d MMMM + d MMMM + dd MMMM + d MMM + dd/MM + d/M + mm:ss + EEE, d-M-yyyy + MMM yyyy + EEE, d MMM yyyy + LLLL yyyy + MM/yy + MMM yy + Q yy + QQQQ yy + yyyy + MM/yyyy + MMMM yyyy + + + {0} - {1} + + M-M + + + E, dd/MM - E, dd/MM + E, dd/MM - E, dd/MM + + + LLL-LLL + + + E, dd MMM - E, dd MMM + E, dd - E, dd MMM + + + dd MMM - dd MMM + dd-dd MMM + + + dd/MM - dd/MM + dd/MM - dd/MM + + + d-d + + + h a - h a + h-h a + + + h:mm a - h:mm a + h:mm-h:mm a + h:mm-h:mm a + + + h:mm a - h:mm a v + h:mm-h:mm a v + h:mm-h:mm a v + + + h a - h a v + h-h a v + + + y-y + + + MM/yyyy - MM/yyyy + MM/yyyy - MM/yyyy + + + E, dd/MM/yyyy - E, dd/MM/yyyy + E, dd/MM/yyyy - E, dd/MM/yyyy + E, dd/MM/yyyy - E, dd/MM/yyyy + + + LLL-LLL yyyy + LLL yyyy - LLL yyyy + + + E, dd MMM - E, dd MMM yyyy + E, dd - E, dd MMM yyyy + E, dd MMM yyyy - E, dd MMM yyyy + + + dd MMM - dd MMM yyyy + dd-dd MMM yyyy + dd MMM yyyy - dd MMM yyyy + + + dd/MM/yyyy - dd/MM/yyyy + dd/MM/yyyy - dd/MM/yyyy + dd/MM/yyyy - dd/MM/yyyy + + + + + + Περίοδος + + + Έτος + + + Μήνας + + + Εβδομάδα + + + Ημέρα + Σήμερα + Αύριο + Μεθαύριο + Σε τρεις ημέρες από τώρα + Εχθές + Προχθές + Πριν από τρεις ημέρες + + + Ημέρα Εβδομάδας + + + ΠΜ/ΜΜ + + + Ώρα + + + Λεπτό + + + Δευτερόλεπτο + + + Ζώνη + + + + + + +HHmm;-HHmm + GMT{0} + {0} + + Άγνωστη + + + Ανδόρα + + + Ντουμπάι + + + Καμπούλ + + + Αντίγκουα + + + Ανγκουίλλα + + + Τίρανα + + + Γερεβάν + + + Κουρακάο + + + Αγκόλα + + + Ροθέρα + + + Πάλμερ + + + Νότιος Πόλος + + + Σύοβα + + + Μόουσον + + + Ντέιβις + + + Βόστοκ + + + Κάσεϊ + + + Ντυμόντ Ντερβίλ + + + ΜακΜέρντο + + + Μπουένος Άιρες + + + Πάγκο Πάγκο + + + Βιέννη + + + Αδελαΐδα + + + Μελβούρνη + + + Σύδνεϊ + + + Αρούμπα + + + Μπακού + + + Μπαρμπέιντος + + + Ντάκα + + + Βρυξέλλες + + + Μπουρκίνα Φάσο + + + Σόφια + + + Μπαχρέιν + + + Μπουρούντι + + + Μπενίν + + + Βερμούδα + + + Μπρούνεϊ + + + Λα Παζ + + + Ρίο Μπράνκο + + + Πόρτο Βέλο + + + Μπόα Βίστα + + + Μανάος + + + Κουϊάμπα + + + Κάμπο Γκράντε + + + Μπέλεμ + + + Αραγκουάινα + + + Σάο Πάολο + + + Μπάχια + + + Φορταλέζα + + + Μασέιο + + + Ρεσίφε + + + Νορόνχα + + + Νασάου + + + Τρίμφου + + + Γκαμπορόνε + + + Μινσκ + + + Μπελίζ + + + Βανκούβερ + + + Τορόντο + + + Μόντρεαλ + + + Κόκος + + + Κινσάσα + + + Λουμπουμπάσι + + + Κεντροαφρικανική Δημοκρατία + + + Μπράζαβιλ + + + Ζυρίχη + + + Ακτή Ελεφαντοστού + + + Ραροτόνγκα + + + Ανατολική Νήσος + + + Σαντιάγκο + + + Καμερούν + + + Σανγκάη + + + Μπογκοτά + + + Κόστα Ρίκα + + + Αβάνα + + + Νήσοι Χριστουγέννων + + + Λευκωσία + + + Βερολίνο + + + Τζιμπουτί + + + Κοπεγχάγη + + + Δομινίκα + + + Σάντο Ντομίνγκο + + + Αλγέρι + + + Γκαλαπάγκος + + + Γκουαγιακύλ + + + Ταλίν + + + Αίγυπτος + + + Δυτική Σαχάρα + + + Ασμέρα + + + Κανάρια + + + Κέουτα + + + Μαδρίτη + + + Αιθιοπία + + + Ελσίνκι + + + Φίτζι + + + Στάνλεϋ + + + Τρουκ + + + Πονάπε + + + Κοσράη + + + Φερόες + + + Παρίσι + + + Γκαμπόν + + + Λονδίνο + + + Γρενάδα + + + Τμπιλίσι + + + Καγιένε + + + Άκκρα + + + Γιβραλτάρ + + + Τούλε + + + Γκόνθαμπ + + + Σκορεσμπίσουντ + + + Ντανμαρκσάβν + + + Γκάμπια + + + Γουινέα + + + Γουαδελούπη + + + Ισημερινή Γουινέα + + + Α‘θήνα + + + Νότια Γεωργία + + + Γουατεμάλα + + + Γκουάμ + + + Γουινέα Μπισσάου + + + Γουιάνα + + + Χονγκ Κονγκ + + + Πορτ-Ο-Πρενς + + + Βουδαπέστη + + + Τζακάρτα + + + Μακασάρ + + + Χαγιαπούρα + + + Δουβλίνο + + + Ιερουσαλήμ + + + Τσάγκος + + + Βαγδάτη + + + Τεχεράνη + + + Ρέυκιαβικ + + + Ρώμη + + + Τζαμάικα + + + Αμάν + + + Τόκυο + + + Κένυα + + + Μπισχέκ + + + Πιόμ Πενχ + + + Εντερμπέρυ + + + Κιριτιμάτι + + + Ταράουα + + + Κομόρο + + + Σαιν Κιττς + + + Πυόνγκ Γιάνγκ + + + Σεούλ + + + Κέυμαν + + + Ακτάου + + + Ακτόμπε + + + Αλμάτυ + + + Βιεντιάνε + + + Βηρυτός + + + Αγ. Λουκία + + + Βαντούζ + + + Κολόμπο + + + Λιβερία + + + Λεσόθο + + + Βίλνιους + + + Λουξεμβούργο + + + Ρίγα + + + Λιβύη + + + Καζαμπλάνκα + + + Μονακό + + + Τσισινάου + + + Ανταναναρίβο + + + Μαχούρο + + + Μπαμάκο + + + Ρανγκούν + + + Χοβντ + + + Ουλάν Μπατόρ + + + Χόιμπαλσαν + + + Μακάο + + + Σάιπαν + + + Μαρτινίκα + + + Μαυριτανία + + + Μονσεράτ + + + Μάλτα + + + Μαυρίκιος + + + Μαλδίβες + + + Μαλάουι + + + Τιχουάνα + + + Πόλη του Μεξικού + + + Κανκούν + + + Κουάλα Λουμπούρ + + + Μαπούτο + + + Γουιντχόεκ + + + Νουμέα + + + Νιαμέυ + + + Νόρφολκ + + + Λάγος + + + Μανάγκουα + + + Άμστερνταμ + + + Όσλο + + + Κατμαντού + + + Ναούρου + + + Νιούε + + + Όκλαντ + + + Μουσκάτ + + + Παναμάς + + + Λίμα + + + Αϊτή + + + Μαρκέσας + + + Γκάμπιερ + + + Πορτ Μόρεσμπυ + + + Μανίλα + + + Καράτσι + + + Βαρσοβία + + + Μικελόν + + + Πιτκέιρν + + + Πουέρτο Ρίκο + + + Γάζα + + + Αζόρες + + + Μαδέρα + + + Λισσαβώνα + + + Παλάου + + + Ασουνσιόν + + + Κατάρ + + + Ρεϋνιόν + + + Βουκουρέστι + + + Καλλίπολη + + + Μόσχα + + + Σαμάρα + + + Αικατερινούπολη + + + Ομσκ + + + Νοβοσιμπίρσκ + + + Ιρκούτσκ + + + Βλαδιβοστόκ + + + Κιγκάλι + + + Ριάντ + + + Γκουανταλκανάλ + + + Μάχε + + + Σουδάν + + + Στοκχόλμη + + + Σιγκαπούρη + + + Αγ. Ελένη + + + Σιέρα Λεόνε + + + Ντακάρ + + + Μογκαντίσου + + + Παραμαρίνμπο + + + Σάο Τόμε + + + Σαλβαδόρ + + + Δαμασκός + + + Ζουαζιλάνδη + + + Γραντ Τουρκ + + + Ντζαμένα + + + Κέργκουελεν + + + Λόμε + + + Μπανγκόκ + + + Ντουσχάνμπη + + + Φακαόφο + + + Ντίλι + + + Ασγκάμπατ + + + Τυνησία + + + Τονγκατάπου + + + Κωνσταντινούπολη + + + Πορτ-Οφ-Σπέιν + + + Φουναφούτι + + + Ταϊπέι + + + Νταρ Ες Σαλάμ + + + Κίεβο + + + Καμπάλα + + + Μίντγουεϊ + + + Τζόνστον + + + Γουέικ + + + Χονολουλού + + + Άνκορατζ + + + Λος Άντζελες + + + Φοίνιξ + + + Ντένβερ + + + Σικάγο + + + Ινδιανάπολη + + + Ντητρόιτ + + + Νέα Υόρκη + + + Μοντεβίδεο + + + Σαμαρκάνδη + + + Τασκένδη + + + Αγ. Βικέντιος + + + Καράκας + + + Τορτόλα + + + Σαιντ Τόμας + + + Σαϊγκόν + + + Εφάτε + + + Γουόλις + + + Άπια + + + Έιντεν + + + Μαγιότε + + + Γιοχάνεσμπουργκ + + + Ζάμπια + + + Ζιμπάμπουε + + + + + + , + . + + + + + #,##0.00 ¤;-#,##0.00 ¤ + + + + + + Πεσέτα Ανδόρας + + + Ντιράμ Ηνωμένων Αραβικών Εμιράτων + + + Λεκ Αλβανίας + lek + + + Ντραμ Αρμενίας + dram + + + Γκίλντα Ολλανδικών Αντιλλών + NA f. + + + Kwanza Ανγκόλας + + + Kwanza Ανγκόλας (1977-1990) + + + Νέα Kwanza Ανγκόλας (1990-2000) + + + Kwanza Reajustado Ανγκόλας (1995-1999) + + + Austral Αργεντινής + + + Πέσο Αργεντινής (1983-1985) + + + Πέσο Αργεντινής + Arg$ + + + Σελίνι Αυστρίας + + + Δολάριο Αυστραλίας + $A + + + Γκίλντα Αρούμπα + + + Μανάτ Αζερμπαϊτζάν + + + Δηνάριο Βοσνίας-Ερζεγοβίνης + + + Μάρκο Βοσνίας-Ερζεγοβίνης + KM + + + Δολάριο Μπαρμπάντος + BDS$ + + + Τάκα Μπαγκλαντές + Tk + + + Φράγκο Βελγίου (μετατρέψιμο) + + + Φράγκο Βελγίου + BF + + + Φράγκο Βελγίου (οικονομικό) + + + Μεταλλικό Λεβ Βουλγαρίας + lev + + + Νέο Λεβ Βουλγαρίας + + + Δηνάριο Μπαχρέιν + BD + + + Φράγκο Μπουρούντι + Fbu + + + Δολάριο Βερμούδων + Ber$ + + + Δολάριο Μπρουνέι + + + Μπολιβιάνο Βολιβίας + + + Πέσο Βολιβίας + + + Mvdol Βολιβίας + + + Νέο Cruzeiro Βραζιλίας (1967-1986) + + + Cruzado Βραζιλίας + + + Cruzeiro Βραζιλίας (1990-1993) + + + Ρεάλ Βραζιλίας + + + Νέο Cruzado Βραζιλίας + + + Cruzeiro Βραζιλίας + + + Δολάριο Μπαχάμες + + + Νγκούλτρουμ Μπουτάν + Nu + + + Kyat Βιρμανίας + + + Πούλα Μποτσουάνας + + + Νέο Ρούβλι Λευκορωσίας (1994-1999) + + + Ρούβλι Λευκορωσίας + Rbl + + + Δολάριο Μπελίζ + BZ$ + + + Δολάριο Καναδά + Can$ + + + Φράγκο Κονγκό + + + Φράγκο Ελβετίας + SwF + + + Unidades de Fomento Χιλής + + + Πέσο Χιλής + Ch$ + + + Γιουάν Ρενμίμπι Κίνας + Y + + + Πέσο Κολομβίας + Col$ + + + Κολόν Κόστα Ρίκα + C + + + Σκληρή Κορόνα Τσεχοσλοβακίας + + + Πέσο Κούβας + + + Εσκούδο Πράσινου Ακρωτηρίου + CVEsc + + + Λίρα Κύπρου + Κυπριακή Λίρα + + + Κορόνα Τσέχικης Δημοκρατίας + + + Ostmark Ανατολικής Γερμανίας + + + Μάρκο Γερμανίας + + + Φράγκο Τζιμπουτί + DF + + + Κορόνα Δανίας + DKr + + + Πέσο Δομίνικου + RD$ + + + Δηνάριο Αλγερίας + DA + + + Σούκρε Εκουαδόρ + + + Unidad de Valor Constante (UVC) Ισημερινού + + + Κορόνα Εσθονίας + + + Λίρα Αιγύπτου + + + Νάκφα Ερυθραίας + + + Πεσέτα Ισπανίας + + + Μπιρ Αιθιοπίας + Br + + + Ευρώ + + + Μάρκο Φινλανδίας + + + Δολάριο Φίτζι + F$ + + + Λίρα Νησιών Φώλκλαντ + + + Φράγκο Γαλλίας + + + Λίρα Στερλίνα Βρετανίας + GBP + + + Κούπον Λάρι Γεωργίας + + + Λάρι Γεωργίας + lari + + + Σέντι Γκάνας + + + Λίρα Γιβραλτάρ + + + Νταλάσι Γκάμπιας + + + Φράγκο Γουινέας + GF + + + Syli Γουινέας + + + Ekwele Guineana Ισημερινής Γουινέας + + + #,##0.00 ¤;-#,##0.00 ¤ + Δραχμή Ελλάδας + Δρχ + , + . + + + Κουετσάλ Γουατεμάλας + Q + + + Γκινέα Εσκούδο Πορτογαλίας + + + Πέσο Guinea-Bissau + + + Δολάριο Γουιάνας + G$ + + + Δολάριο Χονγκ Κονγκ + HK$ + + + Δηνάριο Κροατίας + + + Κούνα Κροατίας + + + Γκουρντ Αϊτής + + + Φιορίνι Ουγγαρίας + Ft + + + Ρούπια Ινδονησίας + Rp + + + Λίρα Ιρλανδίας + IR£ + + + Λίρα Ισραήλ + + + Νέο Σέκελ Ισραήλ + + + Ρούπια Ινδίας + INR + + + Δηνάριο Ιράκ + ID + + + Ριάλ Ιράν + RI + + + Κορόνα Ισλανδίας + + + Λιρέτα Ιταλίας + + + Δολάριο Τζαμάικας + J$ + + + Δηνάριο Ιορδανίας + JD + + + Γιεν Ιαπωνίας + + + Σελίνι Κένυας + K Sh + + + Ρίελ Καμπότζης + CR + + + Φράγκο Comoro + CF + + + Won Βόρειας Κορέας + + + Won Νότιας Κορέας + + + Δηνάριο Κουβέιτ + KD + + + Δολάριο Νήσων Κάιμαν + + + Τένγκε Καζακστάν + T + + + Κιπ Λάος + + + Λίρα Λιβάνου + LL + + + Ρούπια Σρι Λάνκα + SL Re + + + Δολάριο Λιβερίας + + + Λίτα Λιθουανίας + + + Talonas Λιθουανίας + + + Φράγκο Λουξεμβούργου + + + Lats Λετονίας + + + Ρούβλι Λετονίας + + + Δηνάριο Λιβύης + LD + + + Ντιράμ Μαρόκου + + + Φράγκο Μαρόκου + + + Λέι Μολδαβίας + + + Ariary Μαδαγασκάρης + + + Φράγκο Μαδαγασκάρης + + + Δηνάριο Π.Γ.Δ.Μ. + MDen + + + Φράγκο Μαλί + + + Κυάτ Μιανμάρ + + + Τουγκρίκ Μογγολίας + Tug + + + Πατάκα Μακάο + + + Ουγκουίγκα Μαυριτανίας + UM + + + Λιρέτα Μάλτας + Lm + + + Λίρα Μάλτας + + + Ρούπια Μαυρικίου + + + Ρουφίγια Νήσων Μαλδίβων + + + Κουάτσα Μαλάουι + MK + + + Πέσο Μεξικού + MEX$ + + + Ασημένιο Πέσο Μεξικού (1861-1992) + + + Unidad de Inversion (UDI) Μεξικού + + + Ρινγκίτ Μαλαισίας + RM + + + Εσκούδο Μοζαμβίκης + + + Μετικάλ Μοζαμβίκης + Mt + + + Δολάριο Ναμίμπια + N$ + + + Νάιρα Νιγηρίας + + + Κόρδοβα Νικαράγουας + + + Χρυσή Κόρδοβα Νικαράγουας + + + Γκίλντα Ολλανδίας + + + Κορόνα Νορβηγίας + NKr + + + Ρούπια Νεπάλ + Nrs + + + Δολάριο Νέας Ζηλανδίας + $NZ + + + Ριάλ Ομάν + RO + + + Μπαλμπόα Παναμά + + + Inti Περού + + + Νέο Σολ Περού + + + Σολ Περού + + + Kina Παπούα Νέα Γουινέα + + + Πέσο Φιλιππίνων + + + Ρούπια Πακιστάν + Pra + + + Ζλότυ Πολωνίας + Zl + + + Ζλότυ Πολωνίας (1950-1995) + + + Εσκούδο Πορτογαλίας + + + Γκουαρανί Παραγουάης + + + Rial Κατάρ + QR + + + Λέι Ρουμανίας + leu + + + Λεβ Ρουμανίας + + + Δηνάριο Σερβίας + + + Ρούβλι Ρωσίας + + + Ρούβλι Ρωσίας (1991-1998) + + + Φράγκο Ρουάντας + + + Ριάλ Σαουδικής Αραβίας + + + Δολάριο Νήσων Σολομώντος + SI$ + + + Ρούπια Σεϋχέλες + SR + + + Δηνάριο Σουδάν + + + Λίρα Σουδάν + + + Κορόνα Σουηδίας + SKr + + + Δολάριο Σιγκαπούρης + S$ + + + Λίρα Αγίας Ελένης + + + Τόλαρ Σλοβενίας + + + Κορόνα Σλοβενίας + Sk + + + Λεόνε της Σιέρα Λεόνε + + + Σελίνι Σομαλίας + Sh. + + + Γκίλντα Σουρινάμ + Sf + + + Σοβιετικό Ρούβλι + + + Κολόν Ελ Σαλβαδόρ + + + Λίρα Συρίας + LS + + + Λιλανγκένι Σουαζιλάνδη + E + + + Μπατ Ταϊλάνδης + + + Ρούβλι Τατζικιστάν + + + Σομόν Τατζικιστάν + + + Μανάτ Τουρκμενιστάν + + + Δηνάριο Τυνησίας + + + Εσκούδο Τιμόρ + + + Λίρα Τουρκίας + TL + + + Νέα Τουρκική Λίρα + + + Δολάριο Τρινιδάδ και Τομπάγκο + TT$ + + + Νέο Δολάριο Ταϊβάν + NT$ + + + Σελίνι Τανζανίας + T Sh + + + Χρίφνα Ουκρανίας + + + Karbovanetz Ουκρανίας + + + Σελίνι Ουγκάντας (1966-1987) + + + Σελίνι Ουγκάντας + U Sh + + + Δολάριο ΗΠΑ + + + Δολάριο ΗΠΑ (Επόμενη Ημέρα) + + + Δολάριο ΗΠΑ (Ίδια Ημέρα) + + + Πέσο Ουρουγουάης (1975-1993) + + + Πέσο Uruguayo Ουρουγουάης + Ur$ + + + Sum Ουζμπεκιστάν + + + Μπολιβάρ Βενεζουέλας + Be + + + Dong Βιετνάμ + + + Tala Δυτικής Σαμόα + + + Φράγκο BEAC CFA + + + Χρυσός + + + Ευρωπαϊκή Σύνθετη Μονάδα + + + Ευρωπαϊκή Νομισματική Μονάδα + + + Ευρωπαϊκή Μονάδα Λογαριασμού (XBC) + + + Ευρωπαϊκή Μονάδα Λογαριασμού (XBD) + + + Δολάριο Ανατολικής Καραϊβικής + EC$ + + + Ειδικά Δικαιώματα Ανάληψης + + + Ευρωπαϊκή Συναλλαγματική Μονάδα + + + Χρυσό Φράγκο Γαλλίας + + + UIC-Φράγκο Γαλλίας + + + Φράγκο BCEAO CFA + + + Φράγκο CFP + CFPF + + + Άγνωστο ή Ακατάλληλο Νόμισμα + Άγνωστο ή Ακατάλληλο Νόμισμα + XXX + + + Δηνάριο Υεμένης + + + Rial Υεμένης + YRl + + + Μεταλλικό Δηνάριο Γιουγκοσλαβίας + + + Νέο Δηνάριο Γιουγκοσλαβίας + + + Μετατρέψιμο Δηνάριο Γιουγκοσλαβίας + + + Ραντ Νότιας Αφρικής (οικονομικό) + + + Ραντ Νότιας Αφρικής + R + + + Kwacha Ζάμπιας + + + Νέο Zaire Ζαΐρ + + + Zaire Ζαΐρ + + + Δολάριο Ζιμπάμπουε + Z$ + + + + + + {0} ημέρα + {0} ημέρες + + + {0} ώρα + {0} ώρες + + + {0} λεπτό + {0} λεπτά + + + {0} μήνας + {0} μήνες + + + {0} δευτερόλεπτο + {0} δευτερόλεπτα + + + {0} εβδομάδα + {0} εβδομάδες + + + {0} έτος + {0} έτη + + + + + ναι:ν + οχι:όχι:ο:ό + + + diff --git a/libs/Zend/Locale/Data/el_CY.xml b/libs/Zend/Locale/Data/el_CY.xml new file mode 100644 index 0000000..83cd3a5 --- /dev/null +++ b/libs/Zend/Locale/Data/el_CY.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + ¤#,##0.00 + + + + + diff --git a/libs/Zend/Locale/Data/el_GR.xml b/libs/Zend/Locale/Data/el_GR.xml new file mode 100644 index 0000000..1e69429 --- /dev/null +++ b/libs/Zend/Locale/Data/el_GR.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/el_POLYTON.xml b/libs/Zend/Locale/Data/el_POLYTON.xml new file mode 100644 index 0000000..659c710 --- /dev/null +++ b/libs/Zend/Locale/Data/el_POLYTON.xml @@ -0,0 +1,546 @@ + + + + + + + + + + + + Ἀραβικά + Ἀραμαϊκά + Οὐαλικά + Αἰγυπτιακὰ (ἀρχαῖα) + Ἑλληνικά + Ἀγγλικά + Ἱσπανικά + Ἐσθονικά + Ἰρλανδικά + Σκωτικὰ κελτικά + Ἀρχαῖα Ἑλληνικά + Ἑβραϊκά + Οὑγγρικά + Ἀρμενικά + Ἰνδονησιακά + Ἰνδοευρωπαϊκὰ (ἄλλα) + Ἰρανικά + Ἰσλανδικά + Ἰταλικά + Ἰαπωνικά + Πολλαπλές γλῶσσες + Ἰνδιανικὰ βόρειας Ἀμερικῆς (ἄλλα) + Ὁλλανδικά + Τουρκικά, ὀθωμανικὰ (1500-1928) + Ἀρχαῖα περσικὰ (600-400 π.Χ.) + Φιλιππινέζικα (ἄλλα) + Σημιτικὰ (ἄλλα) + Σλαβικὰ (ἄλλα) + Ἀλβανικά + Οὐκρανικά + Ἰουδαϊκά + + + + + + + + + + Ἀνδόρα + Ἠνωμένα Ἀραβικὰ Ἐμιράτα + Ἀφγανιστάν + Ἀντίγκουα καὶ Μπαρμπούντα + Ἀνγκουίλα + Ἀλβανία + Ἀρμενία + Ὁλλανδικὲς Ἀντίλλες + Ἀνγκόλα + Ἀνταρκτική + Ἀργεντινή + Ἀμερικανικὴ Σαμόα + Αὐστρία + Αὐστραλία + Ἀρούμπα + Ἀζερμπαϊτζάν + Βοσνία - Ἐρζεγοβίνη + Βερμοῦδες + Νῆσος Μπουβέ + Νῆσοι Κόκος (Κήλινγκ) + Κονγκό, Λαϊκὴ Δημοκρατία τοῦ + Κεντροαφρικανικὴ Δημοκρατία + Ἑλβετία + Ἀκτὴ Ἐλεφαντοστού + Νῆσοι Κούκ + Πράσινο Ἀκρωτήριο + Νῆσος Χριστουγέννων + Δομινικανὴ Δημοκρατία + Ἀλγερία + Ἰσημερινός + Ἐσθονία + Αἴγυπτος + Δυτικὴ Σαχάρα + Ἐρυθραία + Ἱσπανία + Αἰθιοπία + Μικρονησία, Ὁμόσπονδες Πολιτεῖες τῆς + Νῆσοι Φερόες + Ἡνωμένο Βασίλειο + Γαλλικὴ Γουιάνα + Ἰσημερινὴ Γουινέα + Ἑλλάδα + Νότια Γεωργία καὶ Νότιες Νήσοι Σάντουιτς + Χὸνγκ Κόνγκ, Εἰδικὴ Διοικητικὴ Περιφέρεια τῆς Κίνας + Νῆσοι Χὲρντ καὶ Μακντόναλντ + Ὁνδούρα + Ἁϊτή + Οὑγγαρία + Ἰνδονησία + Ἰρλανδία + Ἰσραήλ + Ἰνδία + Βρετανικὰ Ἐδάφη Ἰνδικοῦ Ὠκεανοῦ + Ἰράκ + Ἰράν, Ἰσλαμικὴ Δημοκρατία τοῦ + Ἰσλανδία + Ἰταλία + Ἰορδανία + Ἰαπωνία + Σαὶντ Κὶτς καὶ Νέβις + Νῆσοι Κέιμαν + Λατινικὴ Ἀμερική + Ἁγία Λουκία + Σρὶ Λάνκα + Λουξεμβοῦργο + Μολδαβία, Δημοκρατία τῆς + Νῆσοι Μάρσαλ + Μαλί + Μακάο, Εἰδικὴ Διοικητικὴ Περιφέρεια τῆς Κίνας + Νῆσοι Βόρειες Μαριάνες + Νῆσος Νόρφολκ + Ὁλλανδία + Ὀμάν + Γαλλικὴ Πολυνησία + Σαὶντ Πιὲρ καὶ Μικελόν + Παλαιστινιακὰ Ἐδάφη + Σαουδικὴ Ἀραβία + Νῆσοι Σολομῶντος + Ἁγία Ἑλένη + Νῆσοι Σβάλμπαρ καὶ Γιὰν Μαγιέν + Ἅγιος Μαρίνος + Σάο Τομὲ καὶ Πρίνσιπε + Ἒλ Σαλβαδόρ + Συρία, Ἀραβικὴ Δημοκρατία τῆς + Νῆσοι Τὲρκς καὶ Κάικος + Τσάντ + Γαλλικὰ Νότια Ἐδάφη + Ἀνατολικὸ Τιμόρ + Τρινιδὰδ καὶ Τομπάγκο + Οὐκρανία + Οὐγκάντα + Ἀπομακρυσμένες Νησίδες τῶν Ἡνωμένων Πολιτειῶν + Ἡνωμένες Πολιτεῖες + Οὐρουγουάη + Οὐζμπεκιστάν + Ἁγία Ἕδρα (Βατικανό) + Ἅγιος Βικέντιος καὶ Γρεναδίνες + Βρετανικὲς Παρθένοι Νῆσοι + Ἀμερικανικὲς Παρθένοι Νῆσοι + Νῆσοι Οὐάλλις καὶ Φουτουνά + Ὑεμένη + Νότια Ἀφρική + + + Ἡμερολόγιο + + + Βουδιστικὸ ἡμερολόγιο + Κινεζικὸ ἡμερολόγιο + Σειρὰ Direct + Γρηγοριανὸ ἡμερολόγιο + Ἑβραϊκὸ ἡμερολόγιο + Ἰσλαμικὸ ἡμερολόγιο + Ἰσλαμικὸ ἀστικὸ ἡμερολόγιο + Ἰαπωνικὸ ἡμερολόγιο + Σειρὰ τηλεφωνικοῦ καταλόγου + Σειρὰ Πίνγιν + Σειρὰ Stroke + + + + [α ἀ ἄ ἂ ἆ ἁ ἅ ἃ ἇ ά ὰ ᾶ β-ε ἐ ἔ ἒ ἑ ἕ ἓ έ ὲ ζ η ἠ ἤ ἢ ἦ ἡ ἥ ἣ ἧ ή ὴ ῆ θ ι ἰ ἴ ἲ ἶ ἱ ἵ ἳ ἷ ί ὶ ῖ ϊ ΐ ῒ ῗ κ-ο ὄ ὂ ὃ ό ὸ π ρ σ ς τ υ ὐ ὔ ὒ ὖ ὑ ὕ ὓ ὗ ύ ὺ ῦ ϋ ΰ ῢ ῧ φ-ω ὤ ὢ ὦ ὥ ὣ ὧ ώ ὼ ῶ] + + + « + » + + + + + + + + + Ἰαν + Ἀπρ + Ἰουν + Ἰουλ + Αὐγ + Ὀκτ + + + Ἰανουαρίου + Ἀπριλίου + Ἰουνίου + Ἰουλίου + Αὐγούστου + Ὀκτωβρίου + + + + + Ἰαν + Ἀπρ + Ἰουν + Ἰουλ + Αὐγ + Ὀκτ + + + Ἰανουάριος + Ἀπρίλιος + Ἰούνιος + Ἰούλιος + Αὔγουστος + Ὀκτώβριος + + + + + + + + + + Πεσέτα Ἀνδόρας + + + Ντιρὰμ Ἡνωμένων Ἀραβικῶν Ἐμιράτων + + + Λὲκ Ἀλβανίας + + + Dram Ἀρμενίας + + + Γκίλντα Ὁλλανδικῶν Ἀντιλλῶν + + + Kwanza Ἀνγκόλας + + + Kwanza Ἀνγκόλας (1977-1990) + + + Νέα Kwanza Ἀνγκόλας (1990-2000) + + + Kwanza Reajustado Ἀνγκόλας (1995-1999) + + + Austral Ἀργεντινῆς + + + Πέσο Ἀργεντινῆς (1983-1985) + + + Πέσο Ἀργεντινῆς + + + Σελίνι Αὐστρίας + + + Δολάριο Αὐστραλίας + + + Γκίλντα Ἀρούμπα + + + Μανὰτ Ἀζερμπαϊτζάν + + + Δηνάριο Βοσνίας-Ἑρζεγοβίνης + + + Μάρκο Βοσνίας-Ἑρζεγοβίνης + + + Φράγκο Βελγίου (οἰκονομικό) + + + Μεταλλικὸ Λὲβ Βουλγαρίας + + + Νέο Λὲβ Βουλγαρίας + + + Δολάριο Καναδᾶ + + + Φράγκο Ἑλβετίας + + + Unidades de Fomento Χιλῆς + + + Πέσο Χιλῆς + + + Σκληρὴ Κορόνα Τσεχοσλοβακίας + + + Ἐσκούδο Πράσινου Ἀκρωτηρίου + + + Ostmark Ἀνατολικῆς Γερμανίας + + + Δηνάριο Ἀλγερίας + + + Sucre Ἰσημερινοῦ + + + Unidad de Valor Constante (UVC) Ἰσημερινοῦ + + + Κορόνα Ἐστονίας + + + Λίρα Αἰγύπτου + + + Nakfa Ἐρυθραίας + + + Πεσέτα Ἱσπανίας + + + Birr Αἰθιοπίας + + + Εὐρώ + + + Λίρα Νήσων Φώλκλαντ + + + £ + + + Dalasi Γκάμπιας + + + Ekwele Guineana Ἰσημερινῆς Γουινέας + + + Quetzal Γουατεμάλας + + + Γκινέα Ἐσκούδο Πορτογαλίας + + + Δολάριο Χὸνγκ Κόνγκ + + + Gourde Ἁϊτῆς + + + Φιορίνι Οὑγγαρίας + + + Ρούπια Ἰνδονησίας + + + Λίρα Ἰρλανδίας + + + Λίρα Ἰσραήλ + + + Νέο Sheqel Ἰσραήλ + + + Ρούπια Ἰνδίας + + + Δηνάριο Ἰράκ + + + Rial Ἰράκ + + + Κορόνα Ἰσλανδίας + + + Λιρέτα Ἰταλίας + + + Δηνάριο Ἰορδανίας + + + Γιὲν Ἰαπωνίας + + + Ρούπια Σρὶ Λάνκας + + + Pataca Μακάου + + + Πέσο Μεξικοῦ + + + Ἀσημένιο Πέσο Μεξικοῦ (1861-1992) + + + Unidad de Inversion (UDI) Μεξικοῦ + + + Ἐσκούδο Μοζαμβίκης + + + Δολάριο Ναμίμπιας + + + Χρυσὴ Κόρδοβα Νικαράγουας + + + Γκίλντα Ὁλλανδίας + + + Μπαλμπόα Παναμᾶ + + + Kina Παπούα Νέα Γουινέας + + + Ἐσκούδο Πορτογαλίας + + + Γκουαρανὶ Παραγουάης + + + Δολάριο Νήσων Σολομῶντος + + + Ρούπια Σεϋχελῶν + + + Λίρα Ἀγίας Ἑλένης + + + Σοβιετικὸ Ρούβλι + + + Colon Ἒλ Σαλβαδόρ + + + Lilangeni Ζουαζιλάνδης + + + Μπὰτ Ταϊλάνδης + + + Μανὰτ Τουρκμενιστάν + + + Ἐσκούδο Τιμόρ + + + Δολάριο Τρινιδὰδ καὶ Τομπάγκο + + + Hryvnia Οὐκρανίας + + + Karbovanetz Οὐκρανίας + + + Σελίνι Οὐγκάντας (1966-1987) + + + Σελίνι Οὐγκάντας + + + Δολάριο ΗΠΑ (Ἑπόμενη ἡμέρα) + + + Δολάριο ΗΠΑ (Ἴδια ἡμέρα) + + + Πέσο Οὐρουγουάης (1975-1993) + + + Πέσο Uruguayo Οὐρουγουάης + + + Sum Οὐζμπεκιστάν + + + Μπολιβὰλ Βενεζουέλας + + + Tala Δυτικῆς Σαμόας + + + Εὐρωπαϊκὴ Σύνθετη Μονάδα + + + Εὐρωπαϊκὴ Νομισματικὴ Μονάδα + + + Εὐρωπαϊκὴ Μονάδα Λογαριασμοῦ (XBC) + + + Εὐρωπαϊκὴ Μονάδα Λογαριασμοῦ (XBD) + + + Δολάριο Ἀνατολικῆς Καραϊβικῆς + + + Εἰδικὰ Δικαιώματα Ἀνάληψης + + + Εὐρωπαϊκὴ Συναλλαγματικὴ Μονάδα + + + Χρυσὸ Φράγκο Γαλλίας + + + Δηνάριο Ὑεμένης + + + Rial Ὑεμένης + + + Μεταλλικὸ Δηνάριο Γιουγκοσλαβίας + + + Ραντ Νότιας Ἀφρικῆς (οἰκονομικό) + + + Ρὰντ Νότιας Ἀφρικῆς + + + + + + Ναί + Ὄχι + + + diff --git a/libs/Zend/Locale/Data/en.xml b/libs/Zend/Locale/Data/en.xml new file mode 100644 index 0000000..df0f6e7 --- /dev/null +++ b/libs/Zend/Locale/Data/en.xml @@ -0,0 +1,4051 @@ + + + + + + + + + + + + {0} ({1}) + , + + + Afar + Abkhazian + Achinese + Acoli + Adangme + Adyghe + Avestan + Afrikaans + Afro-Asiatic Language + Afrihili + Ainu + Akan + Akkadian + Aleut + Algonquian Language + Southern Altai + Amharic + Aragonese + Old English + Angika + Apache Language + Arabic + Aramaic + Araucanian + Arapaho + Artificial Language + Arawak + Assamese + Asturian + Athapascan Language + Australian Language + Avaric + Awadhi + Aymara + Azerbaijani + Bashkir + Banda + Bamileke Language + Baluchi + Balinese + Basa + Baltic Language + Belarusian + Beja + Bemba + Berber + Bulgarian + Bihari + Bhojpuri + Bislama + Bikol + Bini + Siksika + Bambara + Bengali + Bantu + Tibetan + Breton + Braj + Bosnian + Batak + Buriat + Buginese + Blin + Catalan + Caddo + Central American Indian Language + Carib + Caucasian Language + Atsam + Chechen + Cebuano + Celtic Language + Chamorro + Chibcha + Chagatai + Chuukese + Mari + Chinook Jargon + Choctaw + Chipewyan + Cherokee + Cheyenne + Chamic Language + Corsican + Coptic + English-based Creole or Pidgin + French-based Creole or Pidgin + Portuguese-based Creole or Pidgin + Cree + Crimean Turkish + Creole or Pidgin + Czech + Kashubian + Church Slavic + Cushitic Language + Chuvash + Welsh + Danish + Dakota + Dargwa + Dayak + German + Austrian German + Swiss High German + Delaware + Slave + Dogrib + Dinka + Dogri + Dravidian Language + Lower Sorbian + Duala + Middle Dutch + Divehi + Dyula + Dzongkha + Ewe + Efik + Ancient Egyptian + Ekajuk + Greek + Elamite + English + Australian English + Canadian English + British English + U.S. English + Middle English + Esperanto + Spanish + Latin American Spanish + Iberian Spanish + Estonian + Basque + Ewondo + Persian + Fang + Fanti + Fulah + Finnish + Filipino + Finno-Ugrian Language + Fijian + Faroese + Fon + French + Canadian French + Swiss French + Middle French + Old French + Northern Frisian + Eastern Frisian + Friulian + Western Frisian + Irish + Ga + Gayo + Gbaya + Scottish Gaelic + Germanic Language + Geez + Gilbertese + Galician + Middle High German + Guarani + Old High German + Gondi + Gorontalo + Gothic + Grebo + Ancient Greek + Swiss German + Gujarati + Manx + Gwichʼin + Hausa + Haida + Hawaiian + Hebrew + Hindi + Hiligaynon + Himachali + Hittite + Hmong + Hiri Motu + Croatian + Upper Sorbian + Haitian + Hungarian + Hupa + Armenian + Herero + Interlingua + Iban + Indonesian + Interlingue + Igbo + Sichuan Yi + Ijo + Inupiaq + Iloko + Indic Language + Indo-European Language + Ingush + Ido + Iranian Language + Iroquoian Language + Icelandic + Italian + Inuktitut + Japanese + Lojban + Judeo-Persian + Judeo-Arabic + Javanese + Georgian + Kara-Kalpak + Kabyle + Kachin + Jju + Kamba + Karen + Kawi + Kabardian + Tyap + Koro + Kongo + Khasi + Khoisan Language + Khotanese + Kikuyu + Kuanyama + Kazakh + Kalaallisut + Khmer + Kimbundu + Kannada + Korean + Konkani + Kosraean + Kpelle + Kanuri + Karachay-Balkar + Karelian + Kru + Kurukh + Kashmiri + Kurdish + Kumyk + Kutenai + Komi + Cornish + Kirghiz + Latin + Ladino + Lahnda + Lamba + Luxembourgish + Lezghian + Ganda + Limburgish + Lingala + Lao + Mongo + Lozi + Lithuanian + Luba-Katanga + Luba-Lulua + Luiseno + Lunda + Luo + Lushai + Latvian + Madurese + Magahi + Maithili + Makasar + Mandingo + Austronesian + Masai + Moksha + Mandar + Mende + Malagasy + Middle Irish + Marshallese + Maori + Micmac + Minangkabau + Miscellaneous Language + Macedonian + Mon-Khmer Language + Malayalam + Mongolian + Manchu + Manipuri + Manobo Language + Moldavian + Mohawk + Mossi + Marathi + Malay + Maltese + Multiple Languages + Munda Language + Creek + Mirandese + Marwari + Burmese + Mayan Language + Erzya + Nauru + Nahuatl + North American Indian Language + Neapolitan + Norwegian Bokmål + North Ndebele + Low German + Nepali + Newari + Ndonga + Nias + Niger-Kordofanian Language + Niuean + Dutch + Flemish + Norwegian Nynorsk + Norwegian + Nogai + Old Norse + N’Ko + South Ndebele + Northern Sotho + Nubian Language + Navajo + Classical Newari + Nyanja + Nyamwezi + Nyankole + Nyoro + Nzima + Occitan + Ojibwa + Oromo + Oriya + Ossetic + Osage + Ottoman Turkish + Otomian Language + Punjabi + Papuan Language + Pangasinan + Pahlavi + Pampanga + Papiamento + Palauan + Old Persian + Philippine Language + Phoenician + Pali + Polish + Pohnpeian + Prakrit Language + Old Provençal + Pashto + Portuguese + Brazilian Portuguese + Iberian Portuguese + Quechua + Rajasthani + Rapanui + Rarotongan + Rhaeto-Romance + Rundi + Romanian + Romance Language + Romany + Root + Russian + Aromanian + Kinyarwanda + Sanskrit + Sandawe + Yakut + South American Indian Language + Salishan Language + Samaritan Aramaic + Sasak + Santali + Sardinian + Sicilian + Scots + Sindhi + Northern Sami + Selkup + Semitic Language + Sango + Old Irish + Sign Language + Serbo-Croatian + Shan + Sinhala + Sidamo + Siouan Language + Sino-Tibetan Language + Slovak + Slovenian + Slavic Language + Samoan + Southern Sami + Sami Language + Lule Sami + Inari Sami + Skolt Sami + Shona + Soninke + Somali + Sogdien + Songhai + Albanian + Serbian + Sranan Tongo + Serer + Swati + Nilo-Saharan Language + Southern Sotho + Sundanese + Sukuma + Susu + Sumerian + Swedish + Swahili + Classical Syriac + Syriac + Tamil + Tai Language + Telugu + Timne + Tereno + Tetum + Tajik + Thai + Tigrinya + Tigre + Tiv + Turkmen + Tokelau + Tagalog + Klingon + Tlingit + Tamashek + Tswana + Tonga + Nyasa Tonga + Tok Pisin + Turkish + Tsonga + Tsimshian + Tatar + Tumbuka + Tupi Language + Altaic Language + Tuvalu + Twi + Tahitian + Tuvinian + Udmurt + Uighur + Ugaritic + Ukrainian + Umbundu + Unknown or Invalid Language + Urdu + Uzbek + Vai + Venda + Vietnamese + Volapük + Votic + Walloon + Wakashan Language + Walamo + Waray + Washo + Sorbian Language + Wolof + Kalmyk + Xhosa + Yao + Yapese + Yiddish + Yoruba + Yupik Language + Zhuang + Zapotec + Blissymbols + Zenaga + Chinese + Simplified Chinese + Traditional Chinese + Zande + Zulu + Zuni + No linguistic content + Zaza + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + World + Africa + North America + South America + Oceania + Western Africa + Central America + Eastern Africa + Northern Africa + Middle Africa + Southern Africa + Americas + Northern America + Caribbean + Eastern Asia + Southern Asia + South-Eastern Asia + Southern Europe + Australia and New Zealand + Melanesia + Micronesian Region + Polynesia + South-Central Asia + Asia + Central Asia + Western Asia + Europe + Eastern Europe + Northern Europe + Western Europe + Commonwealth of Independent States + Czechoslovakia + Latin America and the Caribbean + Channel Islands + Andorra + United Arab Emirates + Afghanistan + Antigua and Barbuda + Anguilla + Albania + Armenia + Netherlands Antilles + Angola + Antarctica + Argentina + American Samoa + Austria + Australia + Aruba + Aland Islands + Azerbaijan + Bosnia and Herzegovina + Barbados + Bangladesh + Belgium + Burkina Faso + Bulgaria + Bahrain + Burundi + Benin + Saint Barthélemy + Bermuda + Brunei + Bolivia + British Antarctic Territory + Brazil + Bahamas + Bhutan + Bouvet Island + Botswana + Belarus + Belize + Canada + Cocos Islands + Congo - Kinshasa + Central African Republic + Congo - Brazzaville + Switzerland + Ivory Coast + Cook Islands + Chile + Cameroon + China + Colombia + Costa Rica + Serbia and Montenegro + Canton and Enderbury Islands + Cuba + Cape Verde + Christmas Island + Cyprus + Czech Republic + East Germany + Germany + Djibouti + Denmark + Dominica + Dominican Republic + Algeria + Ecuador + Estonia + Egypt + Western Sahara + Eritrea + Spain + Ethiopia + Finland + Fiji + Falkland Islands + Micronesia + Faroe Islands + French Southern and Antarctic Territories + France + Metropolitan France + Gabon + United Kingdom + Grenada + Georgia + French Guiana + Guernsey + Ghana + Gibraltar + Greenland + Gambia + Guinea + Guadeloupe + Equatorial Guinea + Greece + South Georgia and the South Sandwich Islands + Guatemala + Guam + Guinea-Bissau + Guyana + Hong Kong + Heard Island and McDonald Islands + Honduras + Croatia + Haiti + Hungary + Indonesia + Ireland + Israel + Isle of Man + India + British Indian Ocean Territory + Iraq + Iran + Iceland + Italy + Jersey + Jamaica + Jordan + Japan + Johnston Island + Kenya + Kyrgyzstan + Cambodia + Kiribati + Comoros + Saint Kitts and Nevis + North Korea + South Korea + Kuwait + Cayman Islands + Kazakhstan + Laos + Lebanon + Saint Lucia + Liechtenstein + Sri Lanka + Liberia + Lesotho + Lithuania + Luxembourg + Latvia + Libya + Morocco + Monaco + Moldova + Montenegro + Saint Martin + Madagascar + Marshall Islands + Midway Islands + Macedonia + Mali + Myanmar + Mongolia + Macau + Northern Mariana Islands + Martinique + Mauritania + Montserrat + Malta + Mauritius + Maldives + Malawi + Mexico + Malaysia + Mozambique + Namibia + New Caledonia + Niger + Norfolk Island + Nigeria + Nicaragua + Netherlands + Norway + Nepal + Dronning Maud Land + Nauru + Neutral Zone + Niue + New Zealand + Oman + Panama + Pacific Islands Trust Territory + Peru + French Polynesia + Papua New Guinea + Philippines + Pakistan + Poland + Saint Pierre and Miquelon + Pitcairn + Puerto Rico + Palestinian Territory + Portugal + U.S. Miscellaneous Pacific Islands + Palau + Paraguay + Panama Canal Zone + Qatar + Outlying Oceania + European Union + Reunion + Romania + Serbia + Russia + Rwanda + Saudi Arabia + Solomon Islands + Seychelles + Sudan + Sweden + Singapore + Saint Helena + Slovenia + Svalbard and Jan Mayen + Slovakia + Sierra Leone + San Marino + Senegal + Somalia + Suriname + Sao Tome and Principe + Union of Soviet Socialist Republics + El Salvador + Syria + Swaziland + Turks and Caicos Islands + Chad + French Southern Territories + Togo + Thailand + Tajikistan + Tokelau + East Timor + Turkmenistan + Tunisia + Tonga + Turkey + Trinidad and Tobago + Tuvalu + Taiwan + Tanzania + Ukraine + Uganda + United States Minor Outlying Islands + United States + Uruguay + Uzbekistan + Vatican + Saint Vincent and the Grenadines + North Vietnam + Venezuela + British Virgin Islands + U.S. Virgin Islands + Vietnam + Vanuatu + Wallis and Futuna + Wake Island + Samoa + People's Democratic Republic of Yemen + Yemen + Mayotte + South Africa + Zambia + Zimbabwe + Unknown or Invalid Region + + + Traditional German orthography + Standardized Resian orthography + German orthography of 1996 + Late Middle French to 1606 + Early Modern French + Eastern Armenian + Western Armenian + Unified Turkic Latin Alphabet + San Giorgio/Bila dialect + Boontling + IPA Phonetics + UPA Phonetics + Gaulish + Mandarin or Standard Chinese + Hakka + The Lipovaz dialect of Resian + Lojban + Monotonic + Natisone dialect + Gniva/Njiva dialect + Oseacco/Osojane dialect + Polytonic + Computer + Revised Orthography + Resian + Saho + Scottish Standard English + Scouse + Stolvizza/Solbica dialect + Taraskievica orthography + Valencian + Xiang or Hunanese + + + Traditional Chinese Sort Order - Big5 + Buddhist Calendar + Chinese Calendar + Direct Sort Order + Simplified Chinese Sort Order - GB2312 + Gregorian Calendar + Hebrew Calendar + Indian National Calendar + Islamic Calendar + Islamic-Civil Calendar + Japanese Calendar + Phonebook Sort Order + Pinyin Sort Order + Republic of China Calendar + Stroke Sort Order + Traditional Sort Order + + + US + Metric + + + Language: {0} + Script: {0} + Region: {0} + + + + [a-z] + [á à ă â å ä ā æ ç é è ĕ ê ë ē í ì ĭ î ï ī ñ ó ò ŏ ô ö ø ō œ ß ú ù ŭ û ü ū ÿ] + [a-c č d-l ł m-z] + + + + + + + + + + + + + + Jan + Feb + Mar + Apr + May + Jun + Jul + Aug + Sep + Oct + Nov + Dec + + + January + February + March + April + May + June + July + August + September + October + November + December + + + + + J + F + M + A + M + J + J + A + S + O + N + D + + + + + + + Sun + Mon + Tue + Wed + Thu + Fri + Sat + + + Sunday + Monday + Tuesday + Wednesday + Thursday + Friday + Saturday + + + + + S + M + T + W + T + F + S + + + + + + + Q1 + Q2 + Q3 + Q4 + + + 1st quarter + 2nd quarter + 3rd quarter + 4th quarter + + + + + 1 + 2 + 3 + 4 + + + + AM + PM + + + Before Christ + Anno Domini + + + BC + AD + + + B + A + + + + + + EEEE, MMMM d, yyyy + + + + + MMMM d, yyyy + + + + + MMM d, yyyy + + + + + M/d/yy + + + + + + + h:mm:ss a v + + + + + h:mm:ss a z + + + + + h:mm:ss a + + + + + h:mm a + + + + + + + {1} {0} + + + + HH:mm + HH:mm:ss + L + E, M/d + LLL + E, MMM d + E, MMMM d + MMMM d + MMM d + M/d + d + h:mm a + mm:ss + yyyy + M/yyyy + EEE, M/d/yyyy + MMM yyyy + EEE, MMM d, yyyy + MMMM yyyy + Q yyyy + QQQ yyyy + + + {0} – {1} + + M–M + + + E, M/d – E, M/d + E, M/d – E, M/d + + + MMM–MMM + + + E, MMM d – E, MMM d + E, MMM d – E, MMM d + + + LLLL-LLLL + + + MMM d – MMM d + MMM d–d + + + M/d – M/d + M/d – M/d + + + d–d + + + h a – h a + h–h a + + + h:mm a – h:mm a + h:mm–h:mm a + h:mm–h:mm a + + + h:mm a – h:mm a v + h:mm–h:mm a v + h:mm–h:mm a v + + + h a – h a v + h–h a v + + + y–y + + + M/yy – M/yy + M/yy – M/yy + + + E, M/d/yy – E, M/d/yy + E, M/d/yy – E, M/d/yy + E, M/d/yy – E, M/d/yy + + + MMM–MMM yyyy + MMM yyyy – MMM yyyy + + + E, MMM d – E, MMM d, yyyy + E, MMM d – E, MMM d, yyyy + E, MMM d, yyyy – E, MMM d, yyyy + + + MMM d – MMM d, yyyy + MMM d–d, yyyy + MMM d, yyyy – MMM d, yyyy + + + M/d/yy – M/d/yy + M/d/yy – M/d/yy + M/d/yy – M/d/yy + + + + + + Era + + + Year + + + Month + + + Week + + + Day + Today + Tomorrow + Yesterday + + + Day of the Week + + + AM/PM + + + Hour + + + Minute + + + Second + + + Zone + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} Time + {1} ({0}) + + Unknown + + + Dumont d’Urville + + + + British Summer Time + + + BST + + + + + Irish Summer Time + + + IST (Irish) + + + + + Acre Time + Acre Summer Time + + + + + Afghanistan Time + + + + + Central Africa Time + + + + + East Africa Time + + + + + South Africa Time + South Africa Standard Time + + + SAT + + + + + West Africa Time + West Africa Summer Time + + + + + Aktyubinsk Time + Aktyubinsk Summer Time + + + + + Alaska Time + Alaska Standard Time + Alaska Daylight Time + + + AKT + + true + + + + Alaska-Hawaii Time + Alaska-Hawaii Standard Time + Alaska-Hawaii Daylight Time + + + AHT + + + + + Almaty Time + Almaty Summer Time + + + + + Amazon Time + Amazon Summer Time + + + + + Central Time + Central Standard Time + Central Daylight Time + + + CT + + true + + + + Eastern Time + Eastern Standard Time + Eastern Daylight Time + + + ET + + true + + + + Mountain Time + Mountain Standard Time + Mountain Daylight Time + + + MT + + true + + + + Pacific Time + Pacific Standard Time + Pacific Daylight Time + + + PT + + true + + + + Anadyr Time + Anadyr Summer Time + + + + + Aqtau Time + Aqtau Summer Time + + + + + Aqtobe Time + Aqtobe Summer Time + + + + + Arabian Time + Arabian Standard Time + Arabian Daylight Time + + + AT (Arabian) + AST (Arabian) + ADT (Arabian) + + + + + Argentina Time + Argentina Summer Time + + + + + Western Argentina Time + + + + + Armenia Time + Armenia Summer Time + + + AMT (Armenia) + AMST (Armenia) + + + + + Ashkhabad Time + Ashkhabad Summer Time + + + + + Atlantic Time + Atlantic Standard Time + Atlantic Daylight Time + + + AT + + true + + + + Central Australia Time + Australian Central Standard Time + Australian Central Daylight Time + + + ACT + + + + + Australian Central Western Time + Australian Central Western Standard Time + Australian Central Western Daylight Time + + + ACWT + + + + + Eastern Australia Time + Australian Eastern Standard Time + Australian Eastern Daylight Time + + + AET + + + + + Western Australia Time + Australian Western Standard Time + Australian Western Daylight Time + + + AWT + + + + + Azerbaijan Time + Azerbaijan Summer Time + + + + + Azores Time + Azores Summer Time + + + + + Baku Time + Baku Summer Time + + + + + Bangladesh Time + + + + + Bering Time + Bering Standard Time + Bering Daylight Time + + + BT (Bering) + + + + + Bhutan Time + + + + + Bolivia Time + + + + + Borneo Time + Borneo Summer Time + + + + + Brasilia Time + Brasilia Summer Time + + + + + Brunei Darussalam Time + + + + + Cape Verde Time + Cape Verde Summer Time + + + + + Chamorro Time + Chamorro Standard Time + + + ChT + + + + + Changbai Time + + + + + Chatham Standard Time + Chatham Daylight Time + + + + + Chile Time + Chile Summer Time + + + + + China Time + China Standard Time + China Daylight Time + + + CT (China) + CST (China) + CDT (China) + + + + + Choibalsan Time + Choibalsan Summer Time + + + + + Christmas Island Time + + + + + Cocos Islands Time + + + + + Colombia Time + Colombia Summer Time + + + + + Cook Islands Time + Cook Islands Half Summer Time + + + + + Cuba Time + Cuba Standard Time + Cuba Daylight Time + + + CST (Cuba) + CDT (Cuba) + + + + + Dacca Time + + + + + Davis Time + + + + + Dumont-d'Urville Time + + + + + Dushanbe Time + Dushanbe Summer Time + + + + + Dutch Guiana Time + + + + + East Timor Time + + + + + Easter Island Time + Easter Island Summer Time + + + + + Ecuador Time + + + + + Central European Time + Central European Summer Time + + + + + Eastern European Time + Eastern European Summer Time + + + + + Western European Time + Western European Summer Time + + + + + Falkland Islands Time + Falkland Islands Summer Time + + + + + Fiji Time + Fiji Summer Time + + + + + French Guiana Time + + + + + French Southern and Antarctic Time + + + + + Frunze Time + Frunze Summer Time + + + + + Greenwich Mean Time + + true + + + + Galapagos Time + + + + + Gambier Time + + + + + Georgia Time + Georgia Summer Time + + + + + Gilbert Islands Time + + + + + Central Greenland Time + Central Greenland Summer Time + + + + + East Greenland Time + East Greenland Summer Time + + + + + West Greenland Time + West Greenland Summer Time + + + + + Guam Standard Time + + + GST (Guam) + + + + + Gulf Time + Gulf Standard Time + + + GT + + + + + Guyana Time + + + + + Hawaii-Aleutian Standard Time + + true + + + + Hong Kong Time + Hong Kong Summer Time + + + + + Hovd Time + Hovd Summer Time + + + + + India Standard Time + + + + + Indian Ocean Time + + + + + Indochina Time + + + + + Central Indonesia Time + + + + + Eastern Indonesia Time + + + + + Western Indonesia Time + + + + + Iran Standard Time + Iran Daylight Time + + + + + Irkutsk Time + Irkutsk Summer Time + + + + + Israel Time + Israel Standard Time + Israel Daylight Time + + + IST (Israel) + + + + + Japan Time + Japan Standard Time + Japan Daylight Time + + + JT + + + + + Petropavlovsk-Kamchatski Time + Petropavlovsk-Kamchatski Summer Time + + + + + Karachi Time + + + + + Kashgar Time + + + + + East Kazakhstan Time + East Kazakhstan Standard Time + + + + + West Kazakhstan Time + West Kazakhstan Standard Time + + + + + Kizilorda Time + Kizilorda Summer Time + + + + + Korean Time + Korean Standard Time + Korean Daylight Time + + + KT + + + + + Kosrae Time + + + + + Krasnoyarsk Time + Krasnoyarsk Summer Time + + + + + Kuybyshev Time + Kuybyshev Summer Time + + + + + Kwajalein Time + + + + + Kyrgystan Time + + + + + Lanka Time + + + + + Line Islands Time + + + + + Long-Shu Time + + + + + Lord Howe Time + Lord Howe Standard Time + Lord Howe Daylight Time + + + LHT + + + + + Macau Time + Macau Summer Time + + + + + Magadan Time + Magadan Summer Time + + + + + Malaya Time + + + + + Malaysia Time + + + + + Maldives Time + + + + + Marquesas Time + + + + + Marshall Islands Time + + + + + Mauritius Time + Mauritius Summer Time + + + + + Mawson Time + + + + + Ulan Bator Time + Ulan Bator Summer Time + + + + + Moscow Time + Moscow Standard Time + Moscow Summer Time + + + + + Myanmar Time + + + + + Nauru Time + + + + + Nepal Time + + + + + New Caledonia Time + New Caledonia Summer Time + + + + + New Zealand Time + New Zealand Standard Time + New Zealand Daylight Time + + + NZT + + + + + Newfoundland Time + Newfoundland Standard Time + Newfoundland Daylight Time + + + NT + + + + + Niue Time + + + + + Norfolk Islands Time + + + + + Fernando de Noronha Time + Fernando de Noronha Summer Time + + + + + North Mariana Islands Time + + + + + Novosibirsk Time + Novosibirsk Summer Time + + + + + Omsk Time + Omsk Summer Time + + + + + Pakistan Time + Pakistan Summer Time + + + + + Palau Time + + + + + Papua New Guinea Time + + + + + Paraguay Time + Paraguay Summer Time + + + + + Peru Time + Peru Summer Time + + + + + Philippine Time + Philippine Summer Time + + + + + Phoenix Islands Time + + + + + Pierre and Miquelon Time + Pierre and Miquelon Standard Time + Pierre and Miquelon Daylight Time + + + PMT + + + + + Pitcairn Time + + + + + Ponape Time + + + + + Qyzylorda Time + Qyzylorda Summer Time + + + + + Reunion Time + + + + + Rothera Time + + + + + Sakhalin Time + Sakhalin Summer Time + + + + + Samara Time + Samara Summer Time + + + + + Samarkand Time + Samarkand Summer Time + + + + + Samoa Standard Time + + + + + Seychelles Time + + + + + Shevchenko Time + Shevchenko Summer Time + + + + + Singapore Standard Time + + + + + Solomon Islands Time + + + + + South Georgia Time + + + GST (S. Georgia) + + + + + Suriname Time + + + + + Sverdlovsk Time + Sverdlovsk Summer Time + + + + + Syowa Time + + + + + Tahiti Time + + + + + Tajikistan Time + + + + + Tashkent Time + Tashkent Summer Time + + + + + Tbilisi Time + Tbilisi Summer Time + + + + + Tokelau Time + + + + + Tonga Time + Tonga Summer Time + + + + + Truk Time + + + + + Turkey Time + Turkey Summer Time + + + + + Turkmenistan Time + Turkmenistan Summer Time + + + + + Tuvalu Time + + + + + Ural'sk Time + Ural'sk Summer Time + + + + + Uruguay Time + Uruguay Summer Time + + + + + Urumqi Time + + + + + Uzbekistan Time + Uzbekistan Summer Time + + + + + Vanuatu Time + Vanuatu Summer Time + + + + + Venezuela Time + + + + + Vladivostok Time + Vladivostok Summer Time + + + + + Volgograd Time + Volgograd Summer Time + + + + + Vostok Time + + + + + Wake Island Time + + + + + Wallis and Futuna Time + + + + + Yakutsk Time + Yakutsk Summer Time + + + + + Yekaterinburg Time + Yekaterinburg Summer Time + + + + + Yerevan Time + Yerevan Summer Time + + + + + Yukon Time + Yukon Standard Time + Yukon Daylight Time + + + YT + + + + + + + . + , + ; + % + 0 + # + + + - + E + + + NaN + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + ¤#,##0.00;(¤#,##0.00) + + + {0} {1} + + + + Andorran Peseta + Andorran peseta + Andorran pesetas + + + United Arab Emirates Dirham + UAE dirham + UAE dirhams + + + Afghani (1927-2002) + Afghani (AFA) + Afghanis (AFA) + + + Afghani + Afghani + Afghanis + Af + + + Albanian Lek + Albanian lek + Albanian lekë + lek + + + Armenian Dram + Armenian dram + Armenian drams + dram + + + Netherlands Antillan Guilder + Netherlands Antillan guilder + Netherlands Antillan guilders + NAf. + + + Angolan Kwanza + Angolan kwanza + Angolan kwanzas + Kz + + + Angolan Kwanza (1977-1990) + Angolan kwanza (AOK) + Angolan kwanzas (AOK) + + + Angolan New Kwanza (1990-2000) + Angolan new kwanza (AON) + Angolan new kwanzas (AON) + + + Angolan Kwanza Reajustado (1995-1999) + Angolan kwanza reajustado (AOR) + Angolan kwanzas reajustado (AOR) + + + Argentine Austral + Argentine austral + Argentine australs + + + Argentine Peso (1983-1985) + Argentine peso (ARP) + Argentine pesos (ARP) + + + Argentine Peso + Argentine peso + Argentine pesos + AR$ + + + Austrian Schilling + Austrian schilling + Austrian schillings + + + Australian Dollar + Australian dollar + Australian dollars + A$ + + + Aruban Florin + Aruban florin + Aruban florin + Afl. + + + Azerbaijanian Manat (1993-2006) + Azerbaijanian manat (AZM) + Azerbaijanian manats (AZM) + + + Azerbaijanian Manat + Azerbaijanian manat + Azerbaijanian manats + man. + + + Bosnia-Herzegovina Dinar + Bosnia-Herzegovina dinar + Bosnia-Herzegovina dinars + + + Bosnia-Herzegovina Convertible Mark + Bosnia-Herzegovina convertible mark + Bosnia-Herzegovina convertible marks + KM + + + Barbados Dollar + Barbados dollar + Barbados dollars + Bds$ + + + Bangladeshi Taka + Bangladeshi taka + Bangladeshi takas + Tk + + + Belgian Franc (convertible) + Belgian franc (convertible) + Belgian francs (convertible) + + + Belgian Franc + Belgian franc + Belgian francs + BF + + + Belgian Franc (financial) + Belgian franc (financial) + Belgian francs (financial) + + + Bulgarian Hard Lev + Bulgarian hard lev + Bulgarian hard levs + lev + + + Bulgarian Lev + Bulgarian lev + Bulgarian Levs + + + Bahraini Dinar + Bahraini dinar + Bahraini dinars + BD + + + Burundi Franc + Burundi franc + Burundi francs + FBu + + + Bermudan Dollar + Bermudan dollar + Bermudan dollars + BD$ + + + Brunei Dollar + Brunei dollar + Brunei dollars + B$ + + + Boliviano + Boliviano + Bolivianos + Bs + + + Bolivian Peso + Bolivian peso + Bolivian pesos + + + Bolivian Mvdol + Bolivian mvdol + Bolivian mvdols + + + Brazilian Cruzeiro Novo (1967-1986) + Brazilian cruzeiro novo (BRB) + Brazilian cruzeiros novo (BRB) + + + Brazilian Cruzado + Brazilian cruzado + Brazilian cruzados + + + Brazilian Cruzeiro (1990-1993) + Brazilian cruzeiro (BRE) + Brazilian cruzeiros (BRE) + + + Brazilian Real + Brazilian real + Brazilian reals + + + Brazilian Cruzado Novo + Brazilian cruzado novo + Brazilian cruzado novos + + + Brazilian Cruzeiro + Brazilian cruzeiro + Brazilian cruzeiros + + + Bahamian Dollar + Bahamian dollar + Bahamian dollars + + + Bhutan Ngultrum + Bhutan ngultrum + Bhutan ngultrums + Nu + + + Burmese Kyat + Burmese kyat + Burmese kyats + + + Botswanan Pula + Botswanan pula + Botswanan pulas + P + + + Belarussian New Ruble (1994-1999) + Belarussian new ruble (BYB) + Belarussian new rubles (BYB) + + + Belarussian Ruble + Belarussian ruble + Belarussian rubles + Rbl + + + Belize Dollar + Belize dollar + Belize dollars + BZ$ + + + Canadian Dollar + Canadian dollar + Canadian dollars + CA$ + + + Congolese Franc Congolais + Congolese franc Congolais + Congolese francs Congolais + + + WIR Euro + WIR euro + WIR euros + + + Swiss Franc + Swiss franc + Swiss francs + Fr. + + + WIR Franc + WIR franc + WIR francs + + + Chilean Unidades de Fomento + Chilean unidades de fomento + Chilean unidades de fomentos + + + Chilean Peso + Chilean peso + Chilean pesos + CL$ + + + Chinese Yuan Renminbi + Chinese yuan + Chinese yuan + RMB + + + Colombian Peso + Colombian peso + Colombian pesos + CO$ + + + Unidad de Valor Real + unidad de valor real + unidad de valor reals + + + Costa Rican Colon + Costa Rican colon + Costa Rican colons + + + + Old Serbian Dinar + Old Serbian dinar + Old Serbian dinars + + + Czechoslovak Hard Koruna + Czechoslovak hard koruna + Czechoslovak hard korunas + + + Cuban Peso + Cuban peso + Cuban pesos + + + Cape Verde Escudo + Cape Verde escudo + Cape Verde escudos + Esc + + + Cyprus Pound + Cyprus pound + Cyprus pounds + £C + + + Czech Republic Koruna + Czech Republic koruna + Czech Republic korunas + + + + East German Ostmark + East German ostmark + East German ostmarks + + + Deutsche Mark + Deutsche mark + Deutsche marks + + + Djibouti Franc + Djibouti franc + Djibouti francs + Fdj + + + Danish Krone + Danish krone + Danish kroner + Dkr + + + Dominican Peso + Dominican peso + Dominican pesos + RD$ + + + Algerian Dinar + Algerian dinar + Algerian dinars + DA + + + Ecuador Sucre + Ecuador sucre + Ecuador sucres + + + Ecuador Unidad de Valor Constante (UVC) + Ecuador unidad de valor Constante (UVC) + Ecuador unidads de valor Constante (UVC) + + + Estonian Kroon + Estonian kroon + Estonian kroons + + + Egyptian Pound + Egyptian pound + Egyptian pounds + + + Ekwele + ekwele + ekweles + + + Eritrean Nakfa + Eritrean nakfa + Eritrean nakfas + + + Spanish Peseta (A account) + Spanish peseta (A account) + Spanish pesetas (A account) + + + Spanish Peseta (convertible account) + Spanish peseta (convertible account) + Spanish pesetas (convertible account) + + + Spanish Peseta + Spanish peseta + Spanish pesetas + + + + Ethiopian Birr + Ethiopian birr + Ethiopian birrs + Br + + + Euro + euro + euros + + + Finnish Markka + Finnish markka + Finnish markkas + + + Fiji Dollar + Fiji dollar + Fiji dollars + F$ + + + Falkland Islands Pound + Falkland Islands pound + Falkland Islands pounds + + + French Franc + French franc + French francs + + + British Pound Sterling + British pound sterling + British pound sterlings + £ + + + Georgian Kupon Larit + Georgian kupon larit + Georgian kupon larits + + + Georgian Lari + Georgian lari + Georgian laris + lari + + + Ghana Cedi (1979-2007) + Ghana cedi (GHC) + Ghana cedis (GHC) + + + Ghana Cedi + Ghana cedi + Ghana cedis + + + + Gibraltar Pound + Gibraltar pound + Gibraltar pounds + + + Gambia Dalasi + Gambia dalasi + Gambia dalasis + + + Guinea Franc + Guinea franc + Guinea francs + GF + + + Guinea Syli + Guinea syli + Guinea sylis + + + Equatorial Guinea Ekwele Guineana + Equatorial Guinea ekwele + Equatorial Guinea ekwele + + + Greek Drachma + Greek drachma + Greek drachmas + + + Guatemala Quetzal + Guatemala quetzal + Guatemala quetzals + Q + + + Portuguese Guinea Escudo + Portuguese Guinea escudo + Portuguese Guinea escudos + + + Guinea-Bissau Peso + Guinea-Bissau peso + Guinea-Bissau pesos + + + Guyana Dollar + Guyana dollar + Guyana dollars + G$ + + + Hong Kong Dollar + Hong Kong dollar + Hong Kong dollars + HK$ + + + Honduras Lempira + Honduras lempira + Honduras lempiras + L + + + Croatian Dinar + Croatian dinar + Croatian dinars + + + Croatian Kuna + Croatian kuna + Croatian kunas + + + Haitian Gourde + Haitian gourde + Haitian gourdes + + + Hungarian Forint + Hungarian forint + Hungarian forints + Ft + + + Indonesian Rupiah + Indonesian rupiah + Indonesian rupiahs + Rp + + + Irish Pound + Irish pound + Irish pounds + IR£ + + + Israeli Pound + Israeli pound + Israeli pounds + + + New Israeli Sheqel + Israeli new sheqel + New Israeli Sheqels + + + + Indian Rupee + Indian rupee + Indian rupees + + + + Iraqi Dinar + Iraqi dinar + Iraqi dinars + ID + + + Iranian Rial + Iranian rial + Iranian rials + RI + + + Icelandic Krona + Icelandic krona + Icelandic kronas + + + Italian Lira + Italian lira + Italian liras + + + + Jamaican Dollar + Jamaican dollar + Jamaican dollars + J$ + + + Jordanian Dinar + Jordanian dinar + Jordanian dinars + JD + + + Japanese Yen + Japanese yen + Japanese yen + ¥ + + + Kenyan Shilling + Kenyan shilling + Kenyan shillings + K Sh + + + Kyrgystan Som + Kyrgystan som + Kyrgystan soms + som + + + Cambodian Riel + Cambodian riel + Cambodian riels + CR + + + Comoro Franc + Comoro franc + Comoro francs + CF + + + North Korean Won + North Korean won + North Korean wons + + + South Korean Won + South Korean won + South Korean wons + + + + Kuwaiti Dinar + Kuwaiti dinar + Kuwaiti dinars + KD + + + Cayman Islands Dollar + Cayman Islands dollar + Cayman Islands dollars + + + Kazakhstan Tenge + Kazakhstan tenge + Kazakhstan tenges + T + + + Laotian Kip + Laotian kip + Laotian kips + + + Lebanese Pound + Lebanese pound + Lebanese pounds + LL + + + Sri Lanka Rupee + Sri Lanka rupee + Sri Lanka rupees + SL Re + + + Liberian Dollar + Liberian dollar + Liberian dollars + + + Lesotho Loti + Lesotho loti + Lesotho lotis + M + + + Maloti + maloti + malotis + + + Lithuanian Lita + Lithuanian lita + Lithuanian litas + + + Lithuanian Talonas + Lithuanian talonas + Lithuanian talonases + + + Luxembourg Convertible Franc + Luxembourg convertible franc + Luxembourg convertible francs + + + Luxembourg Franc + Luxembourg franc + Luxembourg francs + + + Luxembourg Financial Franc + Luxembourg financial franc + Luxembourg financial francs + + + Latvian Lats + Latvian lats + Latvian latses + + + Latvian Ruble + Latvian ruble + Latvian rubles + + + Libyan Dinar + Libyan dinar + Libyan dinars + LD + + + Moroccan Dirham + Moroccan dirham + Moroccan dirhams + + + Moroccan Franc + Moroccan franc + Moroccan francs + + + Moldovan Leu + Moldovan leu + Moldovan leus + + + Madagascar Ariary + Madagascar Ariary + Madagascar Ariaries + + + Madagascar Franc + Madagascar franc + Madagascar francs + + + Macedonian Denar + Macedonian denar + Macedonian denars + MDen + + + Mali Franc + Mali franc + Mali francs + + + Myanmar Kyat + Myanmar kyat + Myanmar kyats + + + Mongolian Tugrik + Mongolian tugrik + Mongolian tugriks + + + + Macao Pataca + Macao pataca + Macao patacas + + + Mauritania Ouguiya + Mauritania ouguiya + Mauritania ouguiyas + UM + + + Maltese Lira + Maltese lira + Maltese liras + Lm + + + Maltese Pound + Maltese pound + Maltese pounds + + + Mauritius Rupee + Mauritius rupee + Mauritius rupees + + + Maldive Islands Rufiyaa + Maldive Islands rufiyaa + Maldive Islands rufiyaas + + + Malawi Kwacha + Malawi Kwacha + Malawi Kwachas + MK + + + Mexican Peso + Mexican peso + Mexican pesos + MEX$ + + + Mexican Silver Peso (1861-1992) + Mexican silver peso (MXP) + Mexican silver pesos (MXP) + + + Mexican Unidad de Inversion (UDI) + Mexican unidad de inversion (UDI) + Mexican unidads de inversion (UDI) + + + Malaysian Ringgit + Malaysian ringgit + Malaysian ringgits + RM + + + Mozambique Escudo + Mozambique escudo + Mozambique escudos + + + Old Mozambique Metical + Old Mozambique metical + Old Mozambique meticals + Mt + + + Mozambique Metical + Mozambique metical + Mozambique meticals + MTn + + + Namibia Dollar + Namibia dollar + Namibia dollars + N$ + + + Nigerian Naira + Nigerian naira + Nigerian nairas + + + + Nicaraguan Cordoba + Nicaraguan cordoba + Nicaraguan cordobas + C$ + + + Nicaraguan Cordoba Oro + Nicaraguan cordoba oro + Nicaraguan cordoba oros + + + Netherlands Guilder + Netherlands guilder + Netherlands guilders + + + Norwegian Krone + Norwegian krone + Norwegian krones + NKr + + + Nepalese Rupee + Nepalese rupee + Nepalese rupees + Nrs + + + New Zealand Dollar + New Zealand dollar + New Zealand dollars + NZ$ + + + Oman Rial + Oman rial + Oman rials + RO + + + Panamanian Balboa + Panamanian balboa + Panamanian balboas + + + Peruvian Inti + Peruvian inti + Peruvian intis + + + Peruvian Sol Nuevo + Peruvian sol nuevo + Peruvian sol nuevos + + + Peruvian Sol + Peruvian sol + Peruvian sols + + + Papua New Guinea Kina + Papua New Guinea kina + Papua New Guinea kinas + + + Philippine Peso + Philippine peso + Philippine pesos + + + + Pakistan Rupee + Pakistan rupee + Pakistan rupees + Pra + + + Polish Zloty + Polish zloty + Polish zloties + + + + Polish Zloty (1950-1995) + Polish zloty (PLZ) + Polish zlotys (PLZ) + + + Portuguese Escudo + Portuguese escudo + Portuguese escudos + + + Paraguay Guarani + Paraguay guarani + Paraguay guaranis + + + + Qatari Rial + Qatari rial + Qatari rials + QR + + + Rhodesian Dollar + Rhodesian dollar + Rhodesian dollars + + + Old Romanian Leu + Old Romanian leu + Old Romanian Lei + + + Romanian Leu + Romanian leu + Romanian lei + + + Serbian Dinar + Serbian dinar + Serbian dinars + + + Russian Ruble + Russian ruble + Russian rubles + + + Russian Ruble (1991-1998) + Russian ruble (RUR) + Russian rubles (RUR) + + + Rwandan Franc + Rwandan franc + Rwandan francs + + + Saudi Riyal + Saudi riyal + Saudi riyals + SRl + + + Solomon Islands Dollar + Solomon Islands dollar + Solomon Islands dollars + SI$ + + + Seychelles Rupee + Seychelles rupee + Seychelles rupees + SR + + + Old Sudanese Dinar + Old Sudanese dinar + Old Sudanese dinars + + + Sudanese Pound + Sudanese pound + Sudanese pounds + + + Old Sudanese Pound + Old Sudanese pound + Old Sudanese pounds + + + Swedish Krona + Swedish krona + Swedish kronas + SKr + + + Singapore Dollar + Singapore dollar + Singapore dollars + S$ + + + Saint Helena Pound + Saint Helena pound + Saint Helena pounds + + + Slovenia Tolar + Slovenia tolar + Slovenia tolars + + + Slovak Koruna + Slovak koruna + Slovak korunas + Sk + + + Sierra Leone Leone + Sierra Leone leone + Sierra Leone leones + + + Somali Shilling + Somali shilling + Somali shillings + Sh. + + + Surinam Dollar + Surinam dollar + Surinam dollars + + + Suriname Guilder + Suriname guilder + Suriname guilders + Sf + + + Sao Tome and Principe Dobra + Sao Tome and Principe dobra + Sao Tome and Principe dobras + Db + + + Soviet Rouble + Soviet rouble + Soviet roubles + + + El Salvador Colon + El Salvador colon + El Salvador colons + + + Syrian Pound + Syrian pound + Syrian pounds + LS + + + Swaziland Lilangeni + Swaziland lilangeni + Swaziland lilangenis + E + + + Thai Baht + Thai baht + Thai bahts + ฿ + + + Tajikistan Ruble + Tajikistan ruble + Tajikistan rubles + + + Tajikistan Somoni + Tajikistan somoni + Tajikistan somonis + + + Turkmenistan Manat + Turkmenistan manat + Turkmenistan manats + + + Tunisian Dinar + Tunisian dinar + Tunisian dinars + + + Tonga Paʻanga + Tonga paʻanga + Tonga paʻangas + T$ + + + Timor Escudo + Timor escudo + Timor escudos + + + Old Turkish Lira + old Turkish lira + Old Turkish Lira + TL + + + Turkish Lira + Turkish lira + Turkish Lira + + + Trinidad and Tobago Dollar + Trinidad and Tobago dollar + Trinidad and Tobago dollars + TT$ + + + Taiwan New Dollar + Taiwan dollar + Taiwan dollars + NT$ + + + Tanzanian Shilling + Tanzanian shilling + Tanzanian shillings + T Sh + + + Ukrainian Hryvnia + Ukrainian hryvnia + Ukrainian hryvnias + + + + Ukrainian Karbovanetz + Ukrainian karbovanetz + Ukrainian karbovanetzs + + + Ugandan Shilling (1966-1987) + Ugandan shilling (UGS) + Ugandan shillings (UGS) + + + Ugandan Shilling + Ugandan shilling + Ugandan shillings + U Sh + + + US Dollar + US dollar + US dollars + $ + + + US Dollar (Next day) + US dollar (next day) + US dollars (next day) + + + US Dollar (Same day) + US dollar (same day) + US dollars (same day) + + + Uruguay Peso en Unidades Indexadas + Uruguay peso en unidades indexadas + Uruguay pesos en unidades indexadas + + + Uruguay Peso (1975-1993) + Uruguay peso (UYP) + Uruguay pesos (UYP) + + + Uruguay Peso Uruguayo + Uruguay peso + Uruguay peso + Ur$ + + + Uzbekistan Sum + Uzbekistan sum + Uzbekistan sums + + + Venezuelan Bolivar + Venezuelan bolivar + Venezuelan bolivars + Be + + + Venezuelan Bolivar Fuerte + Venezuelan bolivar fuerte + Venezuelan bolivar fuertes + BsF + + + Vietnamese Dong + Vietnamese dong + Vietnamese dongs + + + + Vanuatu Vatu + Vanuatu vatu + Vanuatu vatus + VT + + + Western Samoa Tala + Western Samoa tala + Western Samoa talas + + + CFA Franc BEAC + CFA franc BEAC + CFA francs BEAC + + + Silver + Silver + + + Gold + Gold + + + European Composite Unit + European composite unit + European composite units + + + European Monetary Unit + European monetary unit + European monetary units + + + European Unit of Account (XBC) + European unit of account (XBC) + European units of account (XBC) + + + European Unit of Account (XBD) + European unit of account (XBD) + European units of account (XBD) + + + East Caribbean Dollar + East Caribbean dollar + East Caribbean dollars + EC$ + + + Special Drawing Rights + special drawing rights + special drawing rights + + + European Currency Unit + European currency unit + European currency units + + + French Gold Franc + French gold franc + French gold francs + + + French UIC-Franc + French UIC-franc + French UIC-francs + + + CFA Franc BCEAO + CFA franc BCEAO + CFA francs BCEAO + + + Palladium + Palladium + + + CFP Franc + CFP franc + CFP francs + CFPF + + + Platinum + Platinum + + + RINET Funds + RINET Funds + + + Testing Currency Code + Testing Currency Code + + + Unknown or Invalid Currency + unknown/invalid currency + + + Yemeni Dinar + Yemeni dinar + Yemeni dinars + + + Yemeni Rial + Yemeni rial + Yemeni rials + YRl + + + Yugoslavian Hard Dinar + Yugoslavian hard dinar + Yugoslavian hard dinars + + + Yugoslavian Noviy Dinar + Yugoslavian noviy dinar + Yugoslavian Noviy dinars + + + Yugoslavian Convertible Dinar + Yugoslavian convertible dinar + Yugoslavian convertible dinars + + + South African Rand (financial) + South African rand (financial) + South African rands (financial) + + + South African Rand + South African rand + South African rands + R + + + Zambian Kwacha + Zambian kwacha + Zambian kwachas + + + Zairean New Zaire + Zairean new zaire + Zairean new zaires + + + Zairean Zaire + Zairean zaire + Zairean zaires + + + Zimbabwe Dollar + Zimbabwe dollar + Zimbabwe dollars + Z$ + + + + + + {0} day + {0} days + + + {0} hour + {0} hours + + + {0} minute + {0} minutes + + + {0} month + {0} months + + + {0} second + {0} seconds + + + {0} week + {0} weeks + + + {0} year + {0} years + + + + + yes:y + no:n + + + diff --git a/libs/Zend/Locale/Data/en_AS.xml b/libs/Zend/Locale/Data/en_AS.xml new file mode 100644 index 0000000..499876f --- /dev/null +++ b/libs/Zend/Locale/Data/en_AS.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/en_AU.xml b/libs/Zend/Locale/Data/en_AU.xml new file mode 100644 index 0000000..1cdb03c --- /dev/null +++ b/libs/Zend/Locale/Data/en_AU.xml @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + EEEE, d MMMM yyyy + + + + + d MMMM yyyy + + + + + dd/MM/yyyy + + + + + d/MM/yy + + + + + + d MMMM + dd/MM + MM/yyyy + MMMM yyyy + + + {0} - {1} + + M-M + + + E, d/MM - E, d/MM + E, d/MM - E, d/MM + + + MMM-MMM + + + E, d MMM - E, d MMM + E, d - E, d MMM + + + d MMM - d MMM + d-d MMM + + + d/MM - d/MM + d/MM - d/MM + + + d-d + + + h a - h a + h-h a + + + h:mm a - h:mm a + h:mm-h:mm a + h:mm-h:mm a + + + h:mm a - h:mm a v + h:mm-h:mm a v + h:mm-h:mm a v + + + h a - h a v + h-h a v + + + y-y + + + MM/yy - MM/yy + MM/yy - MM/yy + + + E, d/MM/yy - E, d/MM/yy + E, d/MM/yy - E, d/MM/yy + E, d/MM/yy - E, d/MM/yy + + + MMM-MMM yyyy + MMM yyyy - MMM yyyy + + + E, d MMM - E, d MMM yyyy + E, d - E, d MMM yyyy + E, d MMM yyyy - E, d MMM yyyy + + + d MMM - d MMM yyyy + d-d MMM yyyy + d MMM yyyy - d MMM yyyy + + + d/MM/yy - d/MM/yy + d/MM/yy - d/MM/yy + d/MM/yy - d/MM/yy + + + + + + + + false + + + true + + + true + + + true + + + true + + + true + + + + + + + + ¤#,##0.00 + + + + + + $ + + + US$ + + + + + diff --git a/libs/Zend/Locale/Data/en_BE.xml b/libs/Zend/Locale/Data/en_BE.xml new file mode 100644 index 0000000..d07de42 --- /dev/null +++ b/libs/Zend/Locale/Data/en_BE.xml @@ -0,0 +1,158 @@ + + + + + + + + + + + + + + + + EEEE d MMMM yyyy + + + + + d MMM yyyy + + + + + dd MMM yyyy + + + + + dd/MM/yy + + + + + + + HH 'h' mm 'min' ss 's' v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + dd/MM + + + {0} - {1} + + M-M + + + E dd/MM - E dd/MM + E dd/MM - E dd/MM + + + MMM-MMM + + + E d MMM - E d MMM + E d - E d MMM + + + d MMM - d MMM + d-d MMM + + + dd/MM - dd/MM + dd/MM - dd/MM + + + d-d + + + HH-HH + + + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH-HH v + + + y-y + + + MM/yy - MM/yy + MM/yy - MM/yy + + + E dd/MM/yy - E dd/MM/yy + E dd/MM/yy - E dd/MM/yy + E dd/MM/yy - E dd/MM/yy + + + MMM-MMM yyyy + MMM yyyy - MMM yyyy + + + E d MMM - E d MMM yyyy + E d - E d MMM yyyy + E d MMM yyyy - E d MMM yyyy + + + d MMM - d MMM yyyy + d-d MMM yyyy + d MMM yyyy - d MMM yyyy + + + dd/MM/yy - dd/MM/yy + dd/MM/yy - dd/MM/yy + dd/MM/yy - dd/MM/yy + + + + + + + + + , + . + + + + + #,##0.00 ¤ + + + + + + #,##0.00 ¤;-#,##0.00 ¤ + , + . + + + + diff --git a/libs/Zend/Locale/Data/en_BW.xml b/libs/Zend/Locale/Data/en_BW.xml new file mode 100644 index 0000000..c6d7e57 --- /dev/null +++ b/libs/Zend/Locale/Data/en_BW.xml @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + EEEE dd MMMM yyyy + + + + + dd MMMM yyyy + + + + + dd/MM/yy + + + + + + dd/MM + MMMM yyyy + + + {0} - {1} + + M-M + + + E dd/MM - E dd/MM + E dd/MM - E dd/MM + + + MMM-MMM + + + E dd MMM - E dd MMM + E dd - E dd MMM + + + dd MMM - dd MMM + dd-dd MMM + + + dd/MM - dd/MM + dd/MM - dd/MM + + + d-d + + + h a - h a + h-h a + + + h:mm a - h:mm a + h:mm-h:mm a + h:mm-h:mm a + + + h:mm a - h:mm a v + h:mm-h:mm a v + h:mm-h:mm a v + + + h a - h a v + h-h a v + + + y-y + + + MM/yy - MM/yy + MM/yy - MM/yy + + + E dd/MM/yy - E dd/MM/yy + E dd/MM/yy - E dd/MM/yy + E dd/MM/yy - E dd/MM/yy + + + MMM-MMM yyyy + MMM yyyy - MMM yyyy + + + E dd MMM - E dd MMM yyyy + E dd - E dd MMM yyyy + E dd MMM yyyy - E dd MMM yyyy + + + dd MMM - dd MMM yyyy + dd-dd MMM yyyy + dd MMM yyyy - dd MMM yyyy + + + dd/MM/yy - dd/MM/yy + dd/MM/yy - dd/MM/yy + dd/MM/yy - dd/MM/yy + + + + + + + + + + + ¤#,##0.00 + + + + + + XXX + + + + diff --git a/libs/Zend/Locale/Data/en_BZ.xml b/libs/Zend/Locale/Data/en_BZ.xml new file mode 100644 index 0000000..161fe03 --- /dev/null +++ b/libs/Zend/Locale/Data/en_BZ.xml @@ -0,0 +1,160 @@ + + + + + + + + + + + + + + + + dd MMMM yyyy + + + + + dd MMMM yyyy + + + + + dd-MMM-yyyy + + + + + dd/MM/yy + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + dd/MM + MMMM yyyy + + + {0} - {1} + + M-M + + + E, M/d - E, M/d + E, M/d - E, M/d + + + MMM-MMM + + + E, MMM d - E, MMM d + E, MMM d - E, MMM d + + + MMM d - MMM d + MMM d-d + + + M/d - M/d + M/d - M/d + + + d-d + + + h a - h a + h-h a + + + h:mm a - h:mm a + h:mm-h:mm a + h:mm-h:mm a + + + h:mm a - h:mm a v + h:mm-h:mm a v + h:mm-h:mm a v + + + h a - h a v + h-h a v + + + y-y + + + M/yy - M/yy + M/yy - M/yy + + + E, M/d/yy - E, M/d/yy + E, M/d/yy - E, M/d/yy + E, M/d/yy - E, M/d/yy + + + MMM-MMM yyyy + MMM yyyy - MMM yyyy + + + E, MMM d - E, MMM d, yyyy + E, MMM d - E, MMM d, yyyy + E, MMM d, yyyy - E, MMM d, yyyy + + + MMM d - MMM d, yyyy + MMM d-d, yyyy + MMM d, yyyy - MMM d, yyyy + + + M/d/yy - M/d/yy + M/d/yy - M/d/yy + M/d/yy - M/d/yy + + + + + + + + + + + ¤#,##0.00 + + + + + + $ + + + US$ + + + + diff --git a/libs/Zend/Locale/Data/en_CA.xml b/libs/Zend/Locale/Data/en_CA.xml new file mode 100644 index 0000000..e3be7cd --- /dev/null +++ b/libs/Zend/Locale/Data/en_CA.xml @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + yyyy-MM-dd + + + + + yy-MM-dd + + + + + + MM-dd + MMM-yy + + + {0} - {1} + + M-M + + + E, MM-dd - E, MM-dd + E, MM-dd - E, MM-dd + + + MMM-MMM + + + E, MMM d - E, MMM d + E, MMM d - E, MMM d + + + MMM d - MMM d + MMM d-d + + + MM-dd - MM-dd + MM-dd - MM-dd + + + d-d + + + h a - h a + h-h a + + + h:mm a - h:mm a + h:mm-h:mm a + h:mm-h:mm a + + + h:mm a - h:mm a v + h:mm-h:mm a v + h:mm-h:mm a v + + + h a - h a v + h-h a v + + + y-y + + + yy-MM - yy-MM + yy-MM - yy-MM + + + E, yy-MM-dd - E, yy-MM-dd + E, yy-MM-dd - E, yy-MM-dd + E, yy-MM-dd - E, yy-MM-dd + + + MMM-MMM yyyy + MMM yyyy - MMM yyyy + + + E, MMM d - E, MMM d, yyyy + E, MMM d - E, MMM d, yyyy + E, MMM d, yyyy - E, MMM d, yyyy + + + MMM d - MMM d, yyyy + MMM d-d, yyyy + MMM d, yyyy - MMM d, yyyy + + + yy-MM-dd - yy-MM-dd + yy-MM-dd - yy-MM-dd + yy-MM-dd - yy-MM-dd + + + + + + + + true + + + + + + + $ + + + US$ + + + + diff --git a/libs/Zend/Locale/Data/en_GB.xml b/libs/Zend/Locale/Data/en_GB.xml new file mode 100644 index 0000000..482b6c9 --- /dev/null +++ b/libs/Zend/Locale/Data/en_GB.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + [a-z] + + + + + + + + + + + + + + EEEE, d MMMM yyyy + + + + + d MMMM yyyy + + + + + d MMM yyyy + + + + + dd/MM/yyyy + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + E, d/M + E d MMM + d MMMM + dd/MM + d/M + EEE, d/M/yyyy + MMM yy + MM/yyyy + MMMM yyyy + + + {0} - {1} + + M-M + + + E, dd/MM - E, dd/MM + E, dd/MM - E, dd/MM + + + MMM-MMM + + + E, d MMM - E, d MMM + E, d - E, d MMM + + + d MMM - d MMM + d-d MMM + + + dd/MM - dd/MM + dd/MM - dd/MM + + + d-d + + + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + + + y-y + + + MM/yyyy - MM/yyyy + MM/yyyy - MM/yyyy + + + E, dd/MM/yyyy - E, dd/MM/yyyy + E, dd/MM/yyyy - E, dd/MM/yyyy + E, dd/MM/yyyy - E, dd/MM/yyyy + + + MMM-MMM yyyy + MMM yyyy - MMM yyyy + + + E, d MMM - E, d MMM yyyy + E, d - E, d MMM yyyy + E, d MMM yyyy - E, d MMM yyyy + + + d MMM - d MMM yyyy + d-d MMM yyyy + d MMM yyyy - d MMM yyyy + + + dd/MM/yyyy - dd/MM/yyyy + dd/MM/yyyy - dd/MM/yyyy + dd/MM/yyyy - dd/MM/yyyy + + + + + + + + true + + + true + + + true + + + + + + + + ¤#,##0.00 + + + + + + diff --git a/libs/Zend/Locale/Data/en_GU.xml b/libs/Zend/Locale/Data/en_GU.xml new file mode 100644 index 0000000..a2a083d --- /dev/null +++ b/libs/Zend/Locale/Data/en_GU.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/en_HK.xml b/libs/Zend/Locale/Data/en_HK.xml new file mode 100644 index 0000000..5108870 --- /dev/null +++ b/libs/Zend/Locale/Data/en_HK.xml @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + EEEE, d MMMM yyyy + + + + + d MMMM yyyy + + + + + d MMM yyyy + + + + + dd/MM/yyyy + + + + + + d MMMM + dd/MM + MM/yyyy + MMMM yyyy + + + {0} - {1} + + M-M + + + E, dd/MM - E, dd/MM + E, dd/MM - E, dd/MM + + + MMM-MMM + + + E, d MMM - E, d MMM + E, d - E, d MMM + + + d MMM - d MMM + d-d MMM + + + dd/MM - dd/MM + dd/MM - dd/MM + + + d-d + + + h a - h a + h-h a + + + h:mm a - h:mm a + h:mm-h:mm a + h:mm-h:mm a + + + h:mm a - h:mm a v + h:mm-h:mm a v + h:mm-h:mm a v + + + h a - h a v + h-h a v + + + y-y + + + MM/yyyy - MM/yyyy + MM/yyyy - MM/yyyy + + + E, dd/MM/yyyy - E, dd/MM/yyyy + E, dd/MM/yyyy - E, dd/MM/yyyy + E, dd/MM/yyyy - E, dd/MM/yyyy + + + MMM-MMM yyyy + MMM yyyy - MMM yyyy + + + E, d MMM - E, d MMM yyyy + E, d - E, d MMM yyyy + E, d MMM yyyy - E, d MMM yyyy + + + d MMM - d MMM yyyy + d-d MMM yyyy + d MMM yyyy - d MMM yyyy + + + dd/MM/yyyy - dd/MM/yyyy + dd/MM/yyyy - dd/MM/yyyy + dd/MM/yyyy - dd/MM/yyyy + + + + + + + + + + $ + + + USD + US$ + + + + diff --git a/libs/Zend/Locale/Data/en_IE.xml b/libs/Zend/Locale/Data/en_IE.xml new file mode 100644 index 0000000..5dc8c80 --- /dev/null +++ b/libs/Zend/Locale/Data/en_IE.xml @@ -0,0 +1,157 @@ + + + + + + + + + + + + + a.m. + p.m. + + + + EEEE d MMMM yyyy + + + + + d MMMM yyyy + + + + + d MMM yyyy + + + + + dd/MM/yyyy + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + E, d/M + d MMMM + dd/MM + d/M + EEE, d/M/yyyy + MM/yyyy + MMMM yyyy + + + {0} - {1} + + M-M + + + E dd/MM - E dd/MM + E dd/MM - E dd/MM + + + MMM-MMM + + + E d MMM - E d MMM + E d - E d MMM + + + d MMM - d MMM + d-d MMM + + + dd/MM - dd/MM + dd/MM - dd/MM + + + d-d + + + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + + + y-y + + + MM/yyyy - MM/yyyy + MM/yyyy - MM/yyyy + + + E dd/MM/yyyy - E dd/MM/yyyy + E dd/MM/yyyy - E dd/MM/yyyy + E dd/MM/yyyy - E dd/MM/yyyy + + + MMM-MMM yyyy + MMM yyyy - MMM yyyy + + + E d MMM - E d MMM yyyy + E d - E d MMM yyyy + E d MMM yyyy - E d MMM yyyy + + + d MMM - d MMM yyyy + d-d MMM yyyy + d MMM yyyy - d MMM yyyy + + + dd/MM/yyyy - dd/MM/yyyy + dd/MM/yyyy - dd/MM/yyyy + dd/MM/yyyy - dd/MM/yyyy + + + + + + + + + + + ¤#,##0.00 + + + + + + GBP + + + £ + + + + diff --git a/libs/Zend/Locale/Data/en_IN.xml b/libs/Zend/Locale/Data/en_IN.xml new file mode 100644 index 0000000..9c62d31 --- /dev/null +++ b/libs/Zend/Locale/Data/en_IN.xml @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + EEEE d MMMM yyyy + + + + + d MMMM yyyy + + + + + dd-MMM-yyyy + + + + + dd/MM/yy + + + + + + d MMMM + dd/MM + MMMM yyyy + + + {0} - {1} + + M-M + + + E dd/MM - E dd/MM + E dd/MM - E dd/MM + + + MMM-MMM + + + E d MMM - E d MMM + E d - E d MMM + + + d MMM - d MMM + d-d MMM + + + dd/MM - dd/MM + dd/MM - dd/MM + + + d-d + + + h a - h a + h-h a + + + h:mm a - h:mm a + h:mm-h:mm a + h:mm-h:mm a + + + h:mm a - h:mm a v + h:mm-h:mm a v + h:mm-h:mm a v + + + h a - h a v + h-h a v + + + y-y + + + MM/yy - MM/yy + MM/yy - MM/yy + + + E dd/MM/yy - E dd/MM/yy + E dd/MM/yy - E dd/MM/yy + E dd/MM/yy - E dd/MM/yy + + + MMM-MMM yyyy + MMM yyyy - MMM yyyy + + + E d MMM - E d MMM yyyy + E d - E d MMM yyyy + E d MMM yyyy - E d MMM yyyy + + + d MMM - d MMM yyyy + d-d MMM yyyy + d MMM yyyy - d MMM yyyy + + + dd/MM/yy - dd/MM/yy + dd/MM/yy - dd/MM/yy + dd/MM/yy - dd/MM/yy + + + + + + + + + + + #,##,##0.### + + + + + + + #,##,##0% + + + + + + + ¤ #,##,##0.00 + + + + + + diff --git a/libs/Zend/Locale/Data/en_JM.xml b/libs/Zend/Locale/Data/en_JM.xml new file mode 100644 index 0000000..79c2e10 --- /dev/null +++ b/libs/Zend/Locale/Data/en_JM.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + ¤#,##0.00 + + + + + diff --git a/libs/Zend/Locale/Data/en_MH.xml b/libs/Zend/Locale/Data/en_MH.xml new file mode 100644 index 0000000..8fc2372 --- /dev/null +++ b/libs/Zend/Locale/Data/en_MH.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/en_MP.xml b/libs/Zend/Locale/Data/en_MP.xml new file mode 100644 index 0000000..8536cfa --- /dev/null +++ b/libs/Zend/Locale/Data/en_MP.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/en_MT.xml b/libs/Zend/Locale/Data/en_MT.xml new file mode 100644 index 0000000..31d62c5 --- /dev/null +++ b/libs/Zend/Locale/Data/en_MT.xml @@ -0,0 +1,154 @@ + + + + + + + + + + + + + + + + EEEE, d MMMM yyyy + + + + + dd MMMM yyyy + + + + + dd MMM yyyy + + + + + dd/MM/yyyy + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + dd/MM + MM/yyyy + MMMM yyyy + + + {0} - {1} + + M-M + + + E, dd/MM - E, dd/MM + E, dd/MM - E, dd/MM + + + MMM-MMM + + + E, dd MMM - E, dd MMM + E, dd - E, dd MMM + + + dd MMM - dd MMM + dd-dd MMM + + + dd/MM - dd/MM + dd/MM - dd/MM + + + d-d + + + HH-HH + + + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH-HH v + + + y-y + + + MM/yyyy - MM/yyyy + MM/yyyy - MM/yyyy + + + E, dd/MM/yyyy - E, dd/MM/yyyy + E, dd/MM/yyyy - E, dd/MM/yyyy + E, dd/MM/yyyy - E, dd/MM/yyyy + + + MMM-MMM yyyy + MMM yyyy - MMM yyyy + + + E, d MMM - E, d MMM yyyy + E, d - E, d MMM yyyy + E, d MMM yyyy - E, d MMM yyyy + + + dd MMM - dd MMM yyyy + dd-dd MMM yyyy + dd MMM yyyy - dd MMM yyyy + + + dd/MM/yyyy - dd/MM/yyyy + dd/MM/yyyy - dd/MM/yyyy + dd/MM/yyyy - dd/MM/yyyy + + + + + + + + + + + ¤#,##0.00 + + + + + + GBP + + + + diff --git a/libs/Zend/Locale/Data/en_NA.xml b/libs/Zend/Locale/Data/en_NA.xml new file mode 100644 index 0000000..7883864 --- /dev/null +++ b/libs/Zend/Locale/Data/en_NA.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + ¤#,##0.00 + + + + + diff --git a/libs/Zend/Locale/Data/en_NZ.xml b/libs/Zend/Locale/Data/en_NZ.xml new file mode 100644 index 0000000..84a7b74 --- /dev/null +++ b/libs/Zend/Locale/Data/en_NZ.xml @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + EEEE, d MMMM yyyy + + + + + d MMMM yyyy + + + + + d/MM/yyyy + + + + + d/MM/yy + + + + + + d MMMM + d/M + MM/yyyy + MMMM yyyy + + + {0} - {1} + + M-M + + + E, d/MM - E, d/MM + E, d/MM - E, d/MM + + + MMM-MMM + + + E, d MMM - E, d MMM + E, d - E, d MMM + + + d MMM - d MMM + d-d MMM + + + d/MM - d/MM + d/MM - d/MM + + + d-d + + + h a - h a + h-h a + + + h:mm a - h:mm a + h:mm-h:mm a + h:mm-h:mm a + + + h:mm a - h:mm a v + h:mm-h:mm a v + h:mm-h:mm a v + + + h a - h a v + h-h a v + + + y-y + + + MM/yy - MM/yy + MM/yy - MM/yy + + + E, d/MM/yy - E, d/MM/yy + E, d/MM/yy - E, d/MM/yy + E, d/MM/yy - E, d/MM/yy + + + MMM-MMM yyyy + MMM yyyy - MMM yyyy + + + E, d MMM - E, d MMM yyyy + E, d - E, d MMM yyyy + E, d MMM yyyy - E, d MMM yyyy + + + d MMM - d MMM yyyy + d-d MMM yyyy + d MMM yyyy - d MMM yyyy + + + d/MM/yy - d/MM/yy + d/MM/yy - d/MM/yy + d/MM/yy - d/MM/yy + + + + + + + + true + + + true + + + true + + + true + + + true + + + + + + + + + + ¤#,##0.00 + + + + + + $ + + + US$ + + + + diff --git a/libs/Zend/Locale/Data/en_PH.xml b/libs/Zend/Locale/Data/en_PH.xml new file mode 100644 index 0000000..8ed6e60 --- /dev/null +++ b/libs/Zend/Locale/Data/en_PH.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + Peso + + + + diff --git a/libs/Zend/Locale/Data/en_PK.xml b/libs/Zend/Locale/Data/en_PK.xml new file mode 100644 index 0000000..8283234 --- /dev/null +++ b/libs/Zend/Locale/Data/en_PK.xml @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + EEEE d MMMM yyyy + + + + + d MMMM yyyy + + + + + dd-MMM-yyyy + + + + + dd/MM/yy + + + + + + d MMMM + dd/MM + MMMM yyyy + + + {0} - {1} + + M-M + + + E, M/d - E, M/d + E, M/d - E, M/d + + + MMM-MMM + + + E, MMM d - E, MMM d + E, MMM d - E, MMM d + + + MMM d - MMM d + MMM d-d + + + M/d - M/d + M/d - M/d + + + d-d + + + h a - h a + h-h a + + + h:mm a - h:mm a + h:mm-h:mm a + h:mm-h:mm a + + + h:mm a - h:mm a v + h:mm-h:mm a v + h:mm-h:mm a v + + + h a - h a v + h-h a v + + + y-y + + + M/yy - M/yy + M/yy - M/yy + + + E, M/d/yy - E, M/d/yy + E, M/d/yy - E, M/d/yy + E, M/d/yy - E, M/d/yy + + + MMM-MMM yyyy + MMM yyyy - MMM yyyy + + + E, MMM d - E, MMM d, yyyy + E, MMM d - E, MMM d, yyyy + E, MMM d, yyyy - E, MMM d, yyyy + + + MMM d - MMM d, yyyy + MMM d-d, yyyy + MMM d, yyyy - MMM d, yyyy + + + M/d/yy - M/d/yy + M/d/yy - M/d/yy + M/d/yy - M/d/yy + + + + + + + + + + + #,##,##0.### + + + + + + + #,##,##0% + + + + + + + ¤ #,##,##0.00 + + + + + + diff --git a/libs/Zend/Locale/Data/en_SG.xml b/libs/Zend/Locale/Data/en_SG.xml new file mode 100644 index 0000000..92766ce --- /dev/null +++ b/libs/Zend/Locale/Data/en_SG.xml @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + EEEE, dd MMMM yyyy + + + + + dd MMM yyyy + + + + + dd-MMM-yyyy + + + + + dd/MM/yy + + + + + + + a hh:mm:ss v + + + + + a hh:mm:ss z + + + + + a hh:mm:ss + + + + + a hh:mm + + + + + + dd/MM + MMMM yyyy + + + {0} - {1} + + M-M + + + E, M/d - E, M/d + E, M/d - E, M/d + + + MMM-MMM + + + E, MMM d - E, MMM d + E, MMM d - E, MMM d + + + MMM d - MMM d + MMM d-d + + + M/d - M/d + M/d - M/d + + + d-d + + + h a - h a + h-h a + + + h:mm a - h:mm a + h:mm-h:mm a + h:mm-h:mm a + + + h:mm a - h:mm a v + h:mm-h:mm a v + h:mm-h:mm a v + + + h a - h a v + h-h a v + + + y-y + + + M/yy - M/yy + M/yy - M/yy + + + E, M/d/yy - E, M/d/yy + E, M/d/yy - E, M/d/yy + E, M/d/yy - E, M/d/yy + + + MMM-MMM yyyy + MMM yyyy - MMM yyyy + + + E, MMM d - E, MMM d, yyyy + E, MMM d - E, MMM d, yyyy + E, MMM d, yyyy - E, MMM d, yyyy + + + MMM d - MMM d, yyyy + MMM d-d, yyyy + MMM d, yyyy - MMM d, yyyy + + + M/d/yy - M/d/yy + M/d/yy - M/d/yy + M/d/yy - M/d/yy + + + + + + + + + + + ¤#,##0.00 + + + + + + $ + + + USD + US$ + + + + diff --git a/libs/Zend/Locale/Data/en_Shaw.xml b/libs/Zend/Locale/Data/en_Shaw.xml new file mode 100644 index 0000000..a7177b7 --- /dev/null +++ b/libs/Zend/Locale/Data/en_Shaw.xml @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Mundo + África + América del Norte + Suramérica + Oceanía + África occidental + Centroamérica + África oriental + África septentrional + África central + África meridional + Américas + Norteamérica + Caribe + Asia oriental + Asia meridional + Sudeste asiático + Europa meridional + Australia y Nueva Zelanda + Melanesia + Micronesia [057] + Polinesia + Asia centromeridional + Asia + Asia central + Asia occidental + Europa + Europa oriental + Europa septentrional + Europa occidental + Comunidad de Estados Independientes + Latinoamérica y el Caribe + Andorra + Emiratos Árabes Unidos + Afganistán + Antigua y Barbuda + Anguila + Albania + Armenia + Antillas Neerlandesas + Angola + Antártida + Argentina + Samoa Americana + Austria + Australia + Aruba + Islas Åland + Azerbaiyán + Bosnia-Herzegovina + Barbados + Bangladesh + Bélgica + Burkina Faso + Bulgaria + Bahréin + Burundi + Benín + San Bartolomé + Bermudas + Brunéi + Bolivia + Brasil + Bahamas + Bután + Isla Bouvet + Botsuana + Bielorrusia + Belice + Canadá + Islas Cocos + República Democrática del Congo + República Centroafricana + Congo + Suiza + Costa de Marfil + Islas Cook + Chile + Camerún + China + Colombia + Costa Rica + Serbia y Montenegro + Cuba + Cabo Verde + Isla Christmas + Chipre + República Checa + Alemania + Yibuti + Dinamarca + Dominica + República Dominicana + Argelia + Ecuador + Estonia + Egipto + Sáhara Occidental + Eritrea + España + Etiopía + Finlandia + Fiyi + Islas Malvinas + Micronesia + Islas Feroe + Francia + Gabón + Reino Unido + Granada + Georgia + Guayana Francesa + Guernsey + Ghana + Gibraltar + Groenlandia + Gambia + Guinea + Guadalupe + Guinea Ecuatorial + Grecia + Islas Georgia del Sur y Sandwich del Sur + Guatemala + Guam + Guinea-Bissau + Guyana + Hong Kong + Islas Heard y McDonald + Honduras + Croacia + Haití + Hungría + Indonesia + Irlanda + Israel + Isla de Man + India + Territorio Británico del Océano Índico + Iraq + Irán + Islandia + Italia + Jersey + Jamaica + Jordania + Japón + Kenia + Kirguistán + Camboya + Kiribati + Comoras + San Cristóbal y Nieves + Corea del Norte + Corea del Sur + Kuwait + Islas Caimán + Kazajistán + Laos + Líbano + Santa Lucía + Liechtenstein + Sri Lanka + Liberia + Lesoto + Lituania + Luxemburgo + Letonia + Libia + Marruecos + Mónaco + Moldavia + Montenegro + San Martín + Madagascar + Islas Marshall + Macedonia + Mali + Myanmar + Mongolia + Macao + Islas Marianas del Norte + Martinica + Mauritania + Montserrat + Malta + Mauricio + Maldivas + Malaui + México + Malasia + Mozambique + Namibia + Nueva Caledonia + Níger + Isla Norfolk + Nigeria + Nicaragua + Países Bajos + Noruega + Nepal + Nauru + Isla Niue + Nueva Zelanda + Omán + Panamá + Perú + Polinesia Francesa + Papúa Nueva Guinea + Filipinas + Pakistán + Polonia + San Pedro y Miquelón + Pitcairn + Puerto Rico + Palestina + Portugal + Palau + Paraguay + Qatar + Territorios alejados de Oceanía + Unión Europea + Reunión + Rumanía + Serbia + Rusia + Ruanda + Arabia Saudí + Islas Salomón + Seychelles + Sudán + Suecia + Singapur + Santa Elena + Eslovenia + Svalbard y Jan Mayen + Eslovaquia + Sierra Leona + San Marino + Senegal + Somalia + Surinam + Santo Tomé y Príncipe + El Salvador + Siria + Suazilandia + Islas Turcas y Caicos + Chad + Territorios Australes Franceses + Togo + Tailandia + Tayikistán + Tokelau + Timor Oriental + Turkmenistán + Túnez + Tonga + Turquía + Trinidad y Tobago + Tuvalu + Taiwán + Tanzania + Ucrania + Uganda + Islas menores alejadas de los Estados Unidos + Estados Unidos + Uruguay + Uzbekistán + Ciudad del Vaticano + San Vicente y las Granadinas + Venezuela + Islas Vírgenes Británicas + Islas Vírgenes de los Estados Unidos + Vietnam + Vanuatu + Wallis y Futuna + Samoa + Yemen + Mayotte + Sudáfrica + Zambia + Zimbabue + Región desconocida o no válida + + + Ortografía alemana tradicional + Ortografía alemana de 1996 + Armenio oriental + alfabeto fonético internacional IPA + Monotónico + Politónico + Ordenador + Ortografía revisada + + + calendario + intercalación + moneda + + + orden del chino tradicional - Big5 + calendario budista + calendario chino + orden directo + orden del chino simplificado - GB2312 + calendario gregoriano + calendario hebreo + calendario nacional hindú + calendario islámico + calendario civil islámico + calendario japonés + orden de listín telefónico + orden pinyin + calendario de la República Popular de China + orden de los trazos + orden tradicional + + + estadounidense + métrico + + + Idioma: {0} + Dialecto: {0} + Región: {0} + + + + titlecase-firstword + lowercase-words + lowercase-words + lowercase-words + lowercase-words + lowercase-words + lowercase-words + lowercase-words + lowercase-words + lowercase-words + + + [a á b-e é f-i í j-n ñ o ó p-u ú ü v-z] + [à ă â å ä ã ā æ-è ĕ ê ë ē ì ĭ î ï ī º ò ŏ ô ö ø ō œ ß ù ŭ û ū ÿ] + [a-z] + + + + + + + + + GuMtkHmsSEDFwWahKzUeygAZvcL + + + + + + ene + feb + mar + abr + may + jun + jul + ago + sep + oct + nov + dic + + + enero + febrero + marzo + abril + mayo + junio + julio + agosto + septiembre + octubre + noviembre + diciembre + + + + + E + F + M + A + M + J + J + A + S + O + N + D + + + + + + + dom + lun + mar + mié + jue + vie + sáb + + + domingo + lunes + martes + miércoles + jueves + viernes + sábado + + + + + D + L + M + M + J + V + S + + + + + + + T1 + T2 + T3 + T4 + + + 1er trimestre + 2º trimestre + 3er trimestre + 4º trimestre + + + + + 1 + 2 + 3 + 4 + + + + a.m. + p.m. + + + antes de Cristo + anno Dómini + + + a.C. + d.C. + + + + + + EEEE d 'de' MMMM 'de' yyyy + + + + + d 'de' MMMM 'de' yyyy + + + + + dd/MM/yyyy + + + + + dd/MM/yy + + + + + + + hh:mm:ss a v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1} {0} + + + + HH:mm + HH:mm:ss + H:mm + L + E, d-M + LLL + E d MMM + E d MMMM + d 'de' MMMM + d MMM + dd-MMM + d/MM + d/M + d + hh:mm a + hh:mm:ss a + mm:ss + mm:ss + yyyy + M/yyyy + EEE d/M/yyyy + MMM yyyy + EEE, d MMM yyyy + MMMM 'de' yyyy + Q yyyy + QQQ yyyy + MM/yy + MMM-yy + Q yy + QQQQ 'de' yy + MM/yyyy + + + {0} – {1} + + M–M + + + E d/M – E d/M + E d/M – E d/M + + + MMM–MMM + + + E d MMM – E d MMM + E d MMM – E d MMM + + + LLLL-LLLL + + + d MMM – d MMM + d–d MMM + + + d/M - d/M + d/M - d/M + + + d–d + + + H–H + H–H + + + H:mm - H:mm + H:mm - H:mm + H:mm - H:mm + + + H:mm - H:mm v + H:mm - H:mm v + H:mm - H:mm v + + + H–H v + H–H v + + + y–y + + + M/yy – M/yy + M/yy – M/yy + + + E d/M/yy - E d/M/yy + E d/M/yy – E d/M/yy + E d/M/yy - E d/M/yy + + + MMM–MMM yyyy + MMM yyyy – MMM yyyy + + + E d MMM – E d MMM yyyy + E d MMM – E d MMM yyyy + E d MMM yyyy – E d MMM yyyy + + + MM–MM yyyy + MM-yyyy – MM-yyyy + + + d MMM – d MMM yyyy + d–d MMM yyyy + d MMM yyyy – d MMM yyyy + + + d/M/yy - d/M/yy + M/d/yy – M/d/yy + d/M/yy - d/M/yy + + + + + + era + + + año + + + mes + + + semana + + + día + hoy + mañana + pasado mañana + ayer + antes de ayer + + + día de la semana + + + periodo del día + + + hora + + + minuto + + + segundo + + + zona + + + + + + +HH:mm;-HH:mm + GMT{0} + Hora de {0} + + Desconocida + + + Anguila + + + Tirana + + + Ereván + + + Polo Sur + + + Dumont d'Urville + + + Río Gallegos + + + Tucumán + + + Córdoba + + + + + Viena + + + + + + + Adelaida + + + + + Sídney + + + + + Bakú + + + Bruselas + + + Sofía + + + Bahráin + + + Portonovo + + + Bermudas + + + Brunéi + + + Eirunepé + + + Río Branco + + + Cuiabá + + + + + Belém + + + Araguaína + + + São Paulo + + + Bahía + + + Maceió + + + Belice + + + + + + + + + + + + + + + St. John’s + + + Zúrich + + + Isla de Pascua + + + Ürümqi + + + Bogotá + + + La Habana + + + Cabo Verde + + + Praga + + + Berlín + + + Yibuti + + + Copenhague + + + Argelia + + + Galápagos + + + Tallin + + + El Cairo + + + Islas Canarias + + + Addis Abeba + + + Fiyi + + + Chuuk + + + Islas Feroe + + + París + + + Londres + + + Granada + + + Tiflis + + + Cayena + + + Guadalupe + + + Atenas + + + Georgia del Sur + + + Puerto Príncipe + + + Yakarta + + + Makasar + + + Dublín + + + Jerusalén + + + Bagdad + + + Teherán + + + Reikiavik + + + Roma + + + Tokio + + + Comoras + + + St. Kitts + + + Seúl + + + Caimán + + + Aktau + + + Aktobe + + + Vientián + + + Santa Lucía + + + Vilna + + + Luxemburgo + + + Trípoli + + + Mónaco + + + Rangún + + + Ulán Bator + + + Macao + + + Martinica + + + Mauricio + + + Maldivas + + + + + + + Mazatlán + + + + + Ciudad de México + + + Mérida + + + Cancún + + + Katmandú + + + Panamá + + + Tahití + + + Varsovia + + + Miquelón + + + Islas Pitcairn + + + Lisboa + + + Palaos + + + Asunción + + + Reunión + + + Bucarest + + + Kaliningrado + + + Moscú + + + Volgogrado + + + Yekaterinburgo + + + Sajalín + + + Riad + + + Jartún + + + Estocolmo + + + Singapur + + + Santa Helena + + + Santo Tomé + + + Salvador + + + Damasco + + + Duchanbé + + + Asjabad + + + Túnez + + + Estambul + + + Puerto España + + + Honolulú + + + Los Ángeles + + + + + Centro + + + Indianápolis + + + Nueva York + + + Samarcanda + + + San Vicente + + + Johannesburgo + + + + Hora de Acre + Hora de verano de Acre + + + + + Hora de Afganistán + + + + + Hora de África central + + + + + Hora de África oriental + + + + + Hora estándar de África meridional + + + + + Hora de África occidental + Hora de verano de África occidental + + + + + Hora de Aktyubinsk + Hora de verano de Aktyubinsk + + + + + Hora de Alaska + Hora estándar de Alaska + Hora de verano de Alaska + + true + + + + Hora de Alaska-Hawái + Hora estándar de Alaska-Hawái + Hora de verano de Alaska-Hawái + + true + + + + Hora del Amazonas + Hora de verano del Amazonas + + + + + Hora central + Hora estándar central + Hora de verano central + + true + + + + Hora oriental + Hora estándar oriental + Hora de verano oriental + + true + + + + Hora de las Montañas + Hora estándar de Montaña + Hora de verano de Montaña + + true + + + + Hora del Pacífico + Hora estándar del Pacífico + Hora de verano del Pacífico + + true + + + + Hora de Aktau + Hora de verano de Aktau + + + AQTT (Aktau) + AQTST (Aktau) + + + + + Hora de Aktobe + Hora de verano de Aktobe + + + AQTT (Aktobe) + AQTST (Aktobe) + + + + + Hora de Arabia + Hora estándar de Arabia + Hora de verano de Arabia + + + AT (Arabia) + AST (Arabia) + ADT (Arabia) + + + + + Hora de Argentina + Hora de verano de Argentina + + + + + Hora de Argentina occidental + + + + + Hora de Armenia + Hora de verano de Armenia + + + + + Hora de Asjabad + Hora de verano de Asjabad + + + + + Hora del Atlántico + Hora estándar del Atlántico + Hora de verano del Atlántico + + + + + Hora de Australia central + Hora estándar de Australia central + Hora de verano de Australia central + + + + + Hora de Australia centroriental + Hora estándar de Australia centroriental + Hora de verano de Australia centroriental + + + + + Hora de Australia oriental + Hora estándar de Australia oriental + Hora de verano de Australia oriental + + + + + Hora de Australia occidental + Hora estándar de Australia occidental + Hora de verano de Australia occidental + + + + + Hora de Azerbaiyán + Hora de verano de Azerbaiyán + + + + + Hora de las Azores + Hora de verano de las Azores + + + + + Hora de Bakú + Hora de verano de Bakú + + + + + Hora de Bangladesh + + + + + Hora de Bering + Hora estándar de Bering + Hora de verano de Bering + + + + + Hora de Bután + + + + + Hora de Bolivia + + + + + Hora de Borneo + Hora de verano de Borneo + + + + + Hora de Brasilia + Hora de verano de Brasilia + + + + + Hora estándar de Chamorro + + + + + Hora de Changbai + + + + + Hora de Chile + Hora de verano de Chile + + + + + Hora de China + Hora estándar de China + Hora de verano de China + + + CST (China) + + + + + Hora de Choibalsan + Hora de verano de Choibalsan + + + + + Hora de Colombia + Hora de verano de Colombia + + + + + Hora de Cuba + Hora estándar de Cuba + Hora de verano de Cuba + + + + + Hora de Dacca + + + + + Hora de Dusambé + Hora de verano de Dusambé + + + + + Hora de la Guayana Holandesa + + + + + Hora de Timor Oriental + + + + + Hora de Ecuador + + + + + Hora estándar de Europa Central + Hora de verano de Europa Central + + + + + Hora estándar de Europa del Este + Hora de verano de Europa del Este + + + + + Hora de Europa Occidental + Hora de verano de Europa Occidental + + + + + Hora de la Guayana Francesa + + + + + Hora de Frunze + Hora de verano de Frunze + + + + + Hora media de Greenwich + + + + + Hora de Galápagos + + + + + Hora de Georgia + Hora de verano de Georgia + + + + + Hora de Groenlandia central + Hora de verano de Groenlandia central + + + + + Hora de Groenlandia oriental + Hora de verano de Groenlandia oriental + + + + + Hora de Groenlandia occidental + Hora de verano de Groenlandia occidental + + + + + Hora estándar de Guam + + + + + Hora estándar del Golfo + + + + + Hora de la Guyana + + + + + Hora de Hawái-Aleutianas + Hora estándar de Hawái-Aleutianas + Hora de verano de Hawái-Aleutianas + + true + + + + Hora de Hong Kong + Hora de verano de Hong Kong + + + + + Hora estándar de la India + + + + + Hora de Indochina + + + + + Hora de Indonesia central + + + + + Hora de Indonesia oriental + + + + + Hora de Indonesia occidental + + + + + Hora de Israel + Hora estándar de Israel + Hora de verano de Israel + + + IST (Israel) + + + + + Hora de Japón + Hora estándar de Japón + Hora de verano de Japón + + + + + Hora de Karachi + + + + + Hora de Kashgar + + + + + Hora estándar de Kazajistán oriental + + + + + Hora estándar de Kazajistán occidental + + + + + Hora de Kizil Orda + Hora de verano de Kizil Orda + + + + + Hora de Corea + Hora estándar de Corea + Hora de verano de Corea + + + + + Hora de Kuibishev + Hora de verano de Kuibishev + + + + + Hora de Kwajalein + + + + + Hora de Kirguistán + + + + + Hora de Sri Lanka + + + + + Hora de Long-Shu + + + + + Hora de Lord Howe + Hora estándar de Lord Howe + Hora de verano de Lord Howe + + + + + Hora de Macao + Hora de verano de Macao + + + + + Hora de Malaya + + + + + Hora de Malasia + + + + + Hora de las Islas Marshall + + + + + Hora de Ulán Bator + Hora de verano de Ulán Bator + + + + + Hora de Moscú + Hora estándar de Moscú + Hora de verano de Moscú + + + + + Hora de Myanmar + + + + + Hora de Nepal + + + + + Hora de Nueva Zelanda + Hora estándar de Nueva Zelanda + Hora de verano de Nueva Zelanda + + + + + Hora de Terranova + Hora estándar de Newfoundland + Hora de verano de Newfoundland + + + + + Hora de Fernando de Noronha + Hora de verano de Fernando de Noronha + + + + + Hora de las Islas Marianas del Norte + + + + + Hora de Pakistán + Hora de verano de Pakistán + + + + + Hora de Paraguay + Hora de verano de Paraguay + + + + + Hora de Perú + Hora de verano de Perú + + + + + Hora de Filipinas + Hora de verano de Filipinas + + + + + Hora de San Pedro y Miquelón + Hora estándar de San Pedro y Miquelón + Hora de verano de San Pedro y Miquelón + + + + + Hora de Qyzylorda + Hora de verano de Qyzylorda + + + + + Hora de Samara + Hora de verano de Samara + + + + + Hora de Samarcanda + Hora de verano de Samarcanda + + + SAMT (Samarcanda) + SAMST (Samarcanda) + + + + + Hora estándar de Samoa + + + + + Hora de Shevchenko + Hora de verano de Shevchenko + + + + + Hora de Surinam + + + + + Hora de Sverdlovsk + Hora de verano de Sverdlovsk + + + + + Hora de Tayikistán + + + + + Hora de Tashkent + Hora de verano de Tashkent + + + + + Hora de Tbilisi + Hora de verano de Tbilisi + + + + + Hora de Turquía + Hora de verano de Turquía + + + + + Hora de Turkmenistán + Hora de verano de Turkmenistán + + + + + Hora de Oral + Hora de verano de Oral + + + + + Hora de Uruguay + Hora de verano de Uruguay + + + + + Hora de Ürümqi + + + + + Hora de Uzbekistán + Hora de verano de Uzbekistán + + + + + Hora de Venezuela + + + + + Hora de Volgogrado + Hora de verano de Volgogrado + + + + + Hora de Yekaterinburgo + Hora de verano de Yekaterinburgo + + + + + Hora de Ereván + Hora de verano de Ereván + + + + + Hora del Yukón + Hora estándar del Yukón + Hora de verano del Yukón + + + + + + + , + . + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + ¤ #,##0.00 + + + + + + peseta andorrana + peseta andorrana + pesetas andorranas + + + dírham de los Emiratos Árabes Unidos + + + afgani (1927-2002) + + + afgani + Af + + + lek albanés + lek + + + dram armenio + dram + + + florín de las Antillas Neerlandesas + NA f. + + + kwanza angoleño + + + kwanza angoleño (1977-1990) + + + nuevo kwanza angoleño (1990-2000) + + + kwanza reajustado angoleño (1995-1999) + + + austral argentino + austral argentino + australes argentinos + + + peso argentino (1983-1985) + peso argentino (ARP) + pesos argentinos (ARP) + + + peso argentino + peso argentino + pesos argentinos + Arg$ + + + chelín austriaco + chelín austriaco + chelines austriacos + + + dólar australiano + dólar australiano + dólares australianos + $A + + + florín de Aruba + + + manat azerí (1993-2006) + + + manat azerí + + + dinar bosnio + dinar bosnio + dinares bosnios + + + marco convertible de Bosnia-Herzegovina + marco convertible de Bosnia-Herzegovina + marcos convertibles de Bosnia-Herzegovina + KM + + + dólar de Barbados + BDS$ + + + taka de Bangladesh + Tk + + + franco belga (convertible) + franco belga (convertible) + francos belgas (convertibles) + + + franco belga + franco belga + francos belgas + BF + + + franco belga (financiero) + franco belga (financiero) + francos belgas (financieros) + + + lev fuerte búlgaro + lev fuerte búlgaro + leva fuertes búlgaros + lev + + + nuevo lev búlgaro + nuevo lev búlgaro + nuevos leva búlgaros + + + dinar bahreiní + BD + + + franco de Burundi + Fbu + + + dólar de Bermudas + Ber$ + + + dólar de Brunéi + + + boliviano + boliviano + bolivianos + Bs + + + peso boliviano + peso boliviano + pesos bolivianos + + + MVDOL boliviano + MVDOL boliviano + MVDOL bolivianos + + + nuevo cruceiro brasileño (1967-1986) + nuevo cruzado brasileño (BRB) + nuevos cruzados brasileños (BRB) + + + cruzado brasileño + cruzado brasileño + cruzados brasileños + + + cruceiro brasileño (1990-1993) + cruceiro brasileño (BRE) + cruceiros brasileños (BRE) + + + real brasileño + real brasileño + reales brasileños + + + nuevo cruzado brasileño + nuevo cruzado brasileño + nuevos cruzados brasileños + + + cruceiro brasileño + cruceiro brasileño + cruceiros brasileños + + + dólar de las Bahamas + + + ngultrum butanés + Nu + + + kyat birmano + + + pula botsuano + + + nuevo rublo bielorruso (1994-1999) + + + rublo bielorruso + Rbl + + + dólar de Belice + BZ$ + + + dólar canadiense + dólar canadiense + dólares canadienses + Can$ + + + franco congoleño + + + euro WIR + euro WIR + euros WIR + + + franco suizo + franco suizo + francos suizos + SwF + + + franco WIR + franco WIR + francos WIR + + + unidad de fomento chilena + unidad de fomento chilena + unidades de fomento chilenas + + + peso chileno + peso chileno + pesos chilenos + Ch$ + + + yuan renminbi chino + Y + + + peso colombiano + peso colombiano + pesos colombianos + Col$ + + + unidad de valor real colombiana + unidad de valor real + unidades de valor reales + + + colón costarricense + colón costarricense + colones costarricenses + C + + + antiguo dinar serbio + antiguo dinar serbio + antiguos dinares serbios + + + corona fuerte checoslovaca + corona fuerte checoslovaca + coronas fuertes checoslovacas + + + peso cubano + peso cubano + pesos cubanos + + + escudo de Cabo Verde + CVEsc + + + libra chipriota + £C + + + corona checa + corona checa + coronas checas + + + ostmark de Alemania del Este + ostmark de Alemania del Este + ostmarks de Alemania del Este + + + marco alemán + marco alemán + marcos alemanes + + + franco de Yibuti + DF + + + corona danesa + corona danesa + coronas danesas + DKr + + + peso dominicano + peso dominicano + pesos dominicanos + RD$ + + + dinar argelino + DA + + + sucre ecuatoriano + sucre ecuatoriano + sucres ecuatorianos + + + unidad de valor constante (UVC) ecuatoriana + unidad de valor constante (UVC) ecuatoriana + unidades de valor constante (UVC) ecuatorianas + + + corona estonia + corona estonia + coronas estonias + + + libra egipcia + + + ekuele + ekuele + ekueles + + + nakfa eritreo + + + peseta española (cuenta A) + peseta española (cuenta A) + pesetas españolas (cuenta A) + + + peseta española (cuenta convertible) + peseta española (cuenta convertible) + pesetas españolas (cuenta convertible) + + + peseta española + peseta española + pesetas españolas + + + + birr etíope + Br + + + euro + euro + euros + + + marco finlandés + marco finlandés + marcos finlandeses + + + dólar de las Islas Fiyi + F$ + + + libra de las Islas Malvinas + + + franco francés + franco francés + francos franceses + + + libra esterlina británica + libra esterlina británica + libras esterlinas británicas + + + kupon larit georgiano + + + lari georgiano + lari + + + cedi ghanés + + + libra de Gibraltar + libra de Gibraltar + libras de Gibraltar + + + dalasi gambiano + + + franco guineano + GF + + + syli guineano + + + ekuele de Guinea Ecuatorial + ekuele de Guinea Ecuatorial + ekueles de Guinea Ecuatorial + + + dracma griego + dracma griego + dracmas griegos + + + quetzal guatemalteco + quetzal guatemalteco + quetzales guatemaltecos + Q + + + escudo de Guinea Portuguesa + + + peso de Guinea-Bissáu + + + dólar guyanés + G$ + + + dólar de Hong Kong + HK$ + + + lempira hondureño + lempira hondureño + lempiras hondureños + L + + + dinar croata + dinar croata + dinares croatas + + + kuna croata + kuna croata + kunas croatas + + + gourde haitiano + + + florín húngaro + florín húngaro + florines húngaros + Ft + + + rupia indonesia + Rp + + + libra irlandesa + libra irlandesa + libras irlandesas + IR£ + + + libra israelí + + + nuevo sheqel israelí + + + rupia india + + + dinar iraquí + ID + + + rial iraní + RI + + + corona islandesa + corona islandesa + coronas islandesas + + + lira italiana + lira italiana + liras italianas + + + dólar de Jamaica + J$ + + + dinar jordano + JD + + + yen japonés + yen japonés + yenes japoneses + + + chelín keniata + K Sh + + + som kirguís + som + + + riel camboyano + CR + + + franco comorense + CF + + + won norcoreano + + + won surcoreano + + + dinar kuwaití + KD + + + dólar de las Islas Caimán + + + tenge kazako + T + + + kip laosiano + + + libra libanesa + LL + + + rupia de Sri Lanka + SL Re + + + dólar liberiano + + + loti lesothense + M + + + maloti + + + litas lituano + litas lituano + litas lituanos + + + talonas lituano + talonas lituano + talonas lituanos + + + franco convertible luxemburgués + franco convertible luxemburgués + francos convertibles luxemburgueses + + + franco luxemburgués + franco luxemburgués + francos luxemburgueses + + + franco financiero luxemburgués + franco financiero luxemburgués + francos financieros luxemburgueses + + + lats letón + lats letón + lats letones + + + rublo letón + rublo letón + rublos letones + + + dinar libio + LD + + + dirham marroquí + dírham marroquí + dírhams marroquíes + + + franco marroquí + franco marroquí + francos marroquíes + + + leu moldavo + + + ariary malgache + + + franco malgache + + + dinar macedonio + MDen + + + franco malí + + + kyat de Myanmar + + + tugrik mongol + Tug + + + pataca de Macao + + + ouguiya mauritano + UM + + + lira maltesa + Lm + + + libra maltesa + + + rupia mauriciana + + + rufiyaa de Maldivas + + + kwacha de Malawi + MK + + + peso mexicano + peso mexicano + pesos mexicanos + MEX$ + + + peso de plata mexicano (1861-1992) + peso de plata mexicano (MXP) + pesos de plata mexicanos (MXP) + + + unidad de inversión (UDI) mexicana + unidad de inversión (UDI) mexicana + unidades de inversión (UDI) mexicanas + + + ringgit malasio + RM + + + escudo mozambiqueño + + + antiguo metical mozambiqueño + Mt + + + metical mozambiqueño + + + dólar de Namibia + N$ + + + naira nigeriano + + + córdoba nicaragüense + córdoba nicaragüense + córdobas nicaragüenses + + + córdoba oro nicaragüense + córdoba oro nicaragüense + córdobas oro nicaragüenses + C$ + + + florín neerlandés + florín neerlandés + florines neerlandeses + + + corona noruega + corona noruega + coronas noruegas + NKr + + + rupia nepalesa + Nrs + + + dólar neozelandés + $NZ + + + rial omaní + RO + + + balboa panameño + balboa panameño + balboas panameños + + + inti peruano + inti peruano + intis peruanos + + + nuevo sol peruano + nuevo sol peruano + nuevos soles peruanos + + + sol peruano + sol peruano + soles peruanos + + + kina de Papúa Nueva Guinea + + + peso filipino + peso filipino + pesos filipinos + + + rupia pakistaní + Pra + + + zloty polaco + zloty polaco + zlotys polacos + Zl + + + zloty polaco (1950-1995) + zloty polaco (PLZ) + zlotys polacos (PLZ) + + + escudo portugués + escudo portugués + escudos portugueses + + + guaraní paraguayo + guaraní paraguayo + guaraníes paraguayos + + + + riyal de Qatar + QR + + + dólar rodesiano + + + antiguo leu rumano + antiguo leu rumano + antiguos lei rumanos + leu + + + leu rumano + leu rumano + lei rumanos + + + dinar serbio + dinar serbio + dinares serbios + + + rublo ruso + rublo ruso + rublos rusos + + + rublo ruso (1991-1998) + rublo ruso (RUR) + rublos rusos (RUR) + + + franco ruandés + + + riyal saudí + SRl + + + dólar de las Islas Salomón + SI$ + + + rupia de Seychelles + SR + + + dinar sudanés + + + libra sudanesa + + + corona sueca + corona sueca + coronas suecas + SKr + + + dólar singapurense + S$ + + + libra de Santa Elena + + + tólar esloveno + tólar esloveno + tólares eslovenos + + + corona eslovaca + corona eslovaca + coronas eslovacas + Sk + + + leone de Sierra Leona + + + chelín somalí + S + + + dólar surinamés + + + florín surinamés + Sf + + + dobra de Santo Tomé y Príncipe + Db + + + rublo soviético + rublo soviético + rublos soviéticos + + + colón salvadoreño + colón salvadoreño + colones salvadoreños + + + libra siria + LS + + + lilangeni suazi + E + + + baht tailandés + + + rublo tayiko + + + somoni tayiko + + + manat turcomano + + + dinar tunecino + + + paʻanga tongano + T$ + + + escudo timorense + + + lira turca antigua + lira turca antigua + liras turcas antiguas + TL + + + nueva lira turca + lira turca + liras turcas + + + dólar de Trinidad y Tobago + TT$ + + + nuevo dólar taiwanés + NT$ + + + chelín tanzano + T Sh + + + grivna ucraniana + grivna ucraniana + grivnas ucranianas + + + karbovanet ucraniano + karbovanet ucraniano + karbovanets ucranianos + + + chelín ugandés (1966-1987) + + + chelín ugandés + U Sh + + + dólar estadounidense + dólar estadounidense + dólares estadounidenses + + + dólar estadounidense (día siguiente) + dólar estadounidense (día siguiente) + dólares estadounidenses (día siguiente) + + + dólar estadounidense (mismo día) + dólar estadounidense (mismo día) + dólares estadounidenses (mismo día) + + + peso uruguayo en unidades indexadas + peso uruguayo en unidades indexadas + pesos uruguayos en unidades indexadas + + + peso uruguayo (1975-1993) + peso uruguayo (UYP) + pesos uruguayos (UYP) + + + peso uruguayo + peso uruguayo + pesos uruguayos + Ur$ + + + sum uzbeko + + + bolívar venezolano + bolívar venezolano + bolívares venezolanos + Be + + + bolívar fuerte venezolano + bolívar fuerte venezolano + bolívares fuertes venezolanos + BsF + + + dong vietnamita + + + vatu vanuatuense + VT + + + tala samoano + + + franco CFA BEAC + + + plata + plata + + + oro + oro + + + unidad compuesta europea + unidad compuesta europea + unidades compuestas europeas + + + unidad monetaria europea + unidad monetaria europea + unidades monetarias europeas + + + unidad de cuenta europea (XBC) + unidad de cuenta europea (XBC) + unidades de cuenta europeas (XBC) + + + unidad de cuenta europea (XBD) + unidad de cuenta europea (XBD) + unidades de cuenta europeas (XBD) + + + dólar del Caribe Oriental + EC$ + + + derechos especiales de giro + + + unidad de moneda europea + unidad de moneda europea + unidades de moneda europeas + + + franco oro francés + franco oro francés + francos oro franceses + + + franco UIC francés + franco UIC francés + francos UIC franceses + + + franco CFA BCEAO + + + paladio + paladio + + + franco CFP + CFPF + + + platino + platino + + + fondos RINET + + + código reservado para pruebas + + + Sin divisa + moneda desconocida/no válida + monedas desconocidas/no válidas + + + dinar yemení + + + rial yemení + YRl + + + dinar fuerte yugoslavo + + + super dinar yugoslavo + + + dinar convertible yugoslavo + + + rand sudafricano (financiero) + + + rand sudafricano + R + + + kwacha zambiano + + + nuevo zaire zaireño + + + zaire zaireño + + + dólar de Zimbabue + Z$ + + + + + + {0} día + {0} días + + + {0} hora + {0} horas + + + {0} minuto + {0} minutos + + + {0} mes + {0} meses + + + {0} segundo + {0} segundos + + + {0} semana + {0} semanas + + + {0} año + {0} años + + + + + sí:si:s + no:n + + + diff --git a/libs/Zend/Locale/Data/es_AR.xml b/libs/Zend/Locale/Data/es_AR.xml new file mode 100644 index 0000000..100cba2 --- /dev/null +++ b/libs/Zend/Locale/Data/es_AR.xml @@ -0,0 +1,134 @@ + + + + + + + + + + + + Hong Kong + Macao + + + Ortografía revisada + + + estadounidense + métrico + + + + + + a.m. + p.m. + + + + HH'h'''mm:ss v + + + + + H:mm:ss z + + + + + + E d-M + M-yyyy + + + {0} a el {1} + + M-M + + + E dd/MM - E dd/MM + E dd/MM - E dd/MM + + + MMM-MMM + + + E d 'de' MMM 'al' E d 'de' MMM + E d 'al' E d 'de' MMM + + + d 'de' MMM 'al' d 'de' MMM + d-d 'de' MMM + + + dd/MM - dd/MM + dd/MM - dd/MM + + + d-d + + + HH-HH + + + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH-HH v + + + y-y + + + MM/yy - MM/yy + MM/yy - MM/yy + + + E dd/MM/yy - E dd/MM/yy + E dd/MM/yy - E dd/MM/yy + E dd/MM/yy - E dd/MM/yy + + + MMM-MMM 'de' yyyy + MMM 'de' yyyy 'a' MMM 'de' yyyy + + + E d 'de' MMM 'al' E d 'de' MMM 'de' yyyy + E d 'al' E d 'de' MMM 'de' yyyy + E d 'de' MMM 'de' yyyy 'al' E d 'de' MMM 'de' yyyy + + + d 'de' MMM 'al' d 'de' MMM 'de' yyyy + d-d 'de' MMM 'de' yyyy + d 'de' MMM 'de' yyyy 'al' d 'de' MMM 'de' yyyy + + + dd/MM/yy - dd/MM/yy + dd/MM/yy - dd/MM/yy + dd/MM/yy - dd/MM/yy + + + + + + + + + + Peso Argentino + $ + + + nueva lira turca + + + + + diff --git a/libs/Zend/Locale/Data/es_BO.xml b/libs/Zend/Locale/Data/es_BO.xml new file mode 100644 index 0000000..7706677 --- /dev/null +++ b/libs/Zend/Locale/Data/es_BO.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/es_CL.xml b/libs/Zend/Locale/Data/es_CL.xml new file mode 100644 index 0000000..1497c68 --- /dev/null +++ b/libs/Zend/Locale/Data/es_CL.xml @@ -0,0 +1,166 @@ + + + + + + + + + + + + mapudungun + iraníes + + + + + + Sudamérica + Antillas Holandesas + Azerbayán + Sahara Occidental + Territorio Palestino + Rumania + Arabia Saudita + Tanzanía + + + divisa + + + orden de directorio telefónico + + + + + + + + + dd-MM-yyyy + + + + + dd-MM-yy + + + + + + + HH:mm:ss v + + + + + H:mm:ss z + + + + + H:mm:ss + + + + + H:mm + + + + + + {0} a el {1} + + M-M + + + E dd-MM - E dd-MM + E dd-MM - E dd-MM + + + MMM-MMM + + + E d 'de' MMM 'al' E d 'de' MMM + E d 'al' E d 'de' MMM + + + d 'de' MMM 'al' d 'de' MMM + d-d 'de' MMM + + + dd-MM - dd-MM + dd-MM - dd-MM + + + d-d + + + H-H + + + H:mm-H:mm + H:mm-H:mm + + + H:mm-H:mm v + H:mm-H:mm v + + + H-H v + + + y-y + + + MM-yy - MM-yy + MM-yy - MM-yy + + + E dd-MM-yy - E dd-MM-yy + E dd-MM-yy - E dd-MM-yy + E dd-MM-yy - E dd-MM-yy + + + MMM-MMM 'de' yyyy + MMM 'de' yyyy 'a' MMM 'de' yyyy + + + E d 'de' MMM 'al' E d 'de' MMM 'de' yyyy + E d 'al' E d 'de' MMM 'de' yyyy + E d 'de' MMM 'de' yyyy 'al' E d 'de' MMM 'de' yyyy + + + d 'de' MMM 'al' d 'de' MMM 'de' yyyy + d-d 'de' MMM 'de' yyyy + d 'de' MMM 'de' yyyy 'al' d 'de' MMM 'de' yyyy + + + dd-MM-yy - dd-MM-yy + dd-MM-yy - dd-MM-yy + dd-MM-yy - dd-MM-yy + + + + + + + + + + + ¤#,##0.00;¤-#,##0.00 + + + + + + Peso Chileno + $ + + + + + diff --git a/libs/Zend/Locale/Data/es_CO.xml b/libs/Zend/Locale/Data/es_CO.xml new file mode 100644 index 0000000..4bd65c3 --- /dev/null +++ b/libs/Zend/Locale/Data/es_CO.xml @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + d/MM/yyyy + + + + + d/MM/yy + + + + + + + HH:mm:ss v + + + + + H:mm:ss z + + + + + H:mm:ss + + + + + H:mm + + + + + + {0} a el {1} + + M-M + + + E d/MM - E d/MM + E d/MM - E d/MM + + + MMM-MMM + + + E d 'de' MMM 'al' E d 'de' MMM + E d 'al' E d 'de' MMM + + + d 'de' MMM 'al' d 'de' MMM + d-d 'de' MMM + + + d/MM - d/MM + d/MM - d/MM + + + d-d + + + H-H + + + H:mm-H:mm + H:mm-H:mm + + + H:mm-H:mm v + H:mm-H:mm v + + + H-H v + + + y-y + + + MM/yy - MM/yy + MM/yy - MM/yy + + + E d/MM/yy - E d/MM/yy + E d/MM/yy - E d/MM/yy + E d/MM/yy - E d/MM/yy + + + MMM-MMM 'de' yyyy + MMM 'de' yyyy 'a' MMM 'de' yyyy + + + E d 'de' MMM 'al' E d 'de' MMM 'de' yyyy + E d 'al' E d 'de' MMM 'de' yyyy + E d 'de' MMM 'de' yyyy 'al' E d 'de' MMM 'de' yyyy + + + d 'de' MMM 'al' d 'de' MMM 'de' yyyy + d-d 'de' MMM 'de' yyyy + d 'de' MMM 'de' yyyy 'al' d 'de' MMM 'de' yyyy + + + d/MM/yy - d/MM/yy + d/MM/yy - d/MM/yy + d/MM/yy - d/MM/yy + + + + + + + + + + Peso de Colombia + $ + + + + diff --git a/libs/Zend/Locale/Data/es_CR.xml b/libs/Zend/Locale/Data/es_CR.xml new file mode 100644 index 0000000..4171f10 --- /dev/null +++ b/libs/Zend/Locale/Data/es_CR.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/es_DO.xml b/libs/Zend/Locale/Data/es_DO.xml new file mode 100644 index 0000000..08bda60 --- /dev/null +++ b/libs/Zend/Locale/Data/es_DO.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + . + , + + + diff --git a/libs/Zend/Locale/Data/es_EC.xml b/libs/Zend/Locale/Data/es_EC.xml new file mode 100644 index 0000000..5828924 --- /dev/null +++ b/libs/Zend/Locale/Data/es_EC.xml @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + HH:mm:ss v + + + + + H:mm:ss z + + + + + H:mm:ss + + + + + H:mm + + + + + + {0} a el {1} + + M-M + + + E dd/MM - E dd/MM + E dd/MM - E dd/MM + + + MMM-MMM + + + E d 'de' MMM 'al' E d 'de' MMM + E d 'al' E d 'de' MMM + + + d 'de' MMM 'al' d 'de' MMM + d-d 'de' MMM + + + dd/MM - dd/MM + dd/MM - dd/MM + + + d-d + + + H-H + + + H:mm-H:mm + H:mm-H:mm + + + H:mm-H:mm v + H:mm-H:mm v + + + H-H v + + + y-y + + + MM/yy - MM/yy + MM/yy - MM/yy + + + E dd/MM/yy - E dd/MM/yy + E dd/MM/yy - E dd/MM/yy + E dd/MM/yy - E dd/MM/yy + + + MMM-MMM 'de' yyyy + MMM 'de' yyyy 'a' MMM 'de' yyyy + + + E d 'de' MMM 'al' E d 'de' MMM 'de' yyyy + E d 'al' E d 'de' MMM 'de' yyyy + E d 'de' MMM 'de' yyyy 'al' E d 'de' MMM 'de' yyyy + + + d 'de' MMM 'al' d 'de' MMM 'de' yyyy + d-d 'de' MMM 'de' yyyy + d 'de' MMM 'de' yyyy 'al' d 'de' MMM 'de' yyyy + + + dd/MM/yy - dd/MM/yy + dd/MM/yy - dd/MM/yy + dd/MM/yy - dd/MM/yy + + + + + + + + + + + ¤#,##0.00;¤-#,##0.00 + + + + + + $ + + + + diff --git a/libs/Zend/Locale/Data/es_ES.xml b/libs/Zend/Locale/Data/es_ES.xml new file mode 100644 index 0000000..b9e981f --- /dev/null +++ b/libs/Zend/Locale/Data/es_ES.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/es_GT.xml b/libs/Zend/Locale/Data/es_GT.xml new file mode 100644 index 0000000..ba2ee51 --- /dev/null +++ b/libs/Zend/Locale/Data/es_GT.xml @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + d/MM/yyyy + + + + + d/MM/yy + + + + + + {0} a el {1} + + M-M + + + E d/MM - E d/MM + E d/MM - E d/MM + + + MMM-MMM + + + E d 'de' MMM 'al' E d 'de' MMM + E d 'al' E d 'de' MMM + + + d 'de' MMM 'al' d 'de' MMM + d-d 'de' MMM + + + d/MM - d/MM + d/MM - d/MM + + + d-d + + + HH-HH + + + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH-HH v + + + y-y + + + MM/yy - MM/yy + MM/yy - MM/yy + + + E d/MM/yy - E d/MM/yy + E d/MM/yy - E d/MM/yy + E d/MM/yy - E d/MM/yy + + + MMM-MMM 'de' yyyy + MMM 'de' yyyy 'a' MMM 'de' yyyy + + + E d 'de' MMM 'al' E d 'de' MMM 'de' yyyy + E d 'al' E d 'de' MMM 'de' yyyy + E d 'de' MMM 'de' yyyy 'al' E d 'de' MMM 'de' yyyy + + + d 'de' MMM 'al' d 'de' MMM 'de' yyyy + d-d 'de' MMM 'de' yyyy + d 'de' MMM 'de' yyyy 'al' d 'de' MMM 'de' yyyy + + + d/MM/yy - d/MM/yy + d/MM/yy - d/MM/yy + d/MM/yy - d/MM/yy + + + + + + + + + . + , + + + diff --git a/libs/Zend/Locale/Data/es_HN.xml b/libs/Zend/Locale/Data/es_HN.xml new file mode 100644 index 0000000..6deb19c --- /dev/null +++ b/libs/Zend/Locale/Data/es_HN.xml @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + EEEE dd 'de' MMMM 'de' yyyy + + + + + dd 'de' MMMM 'de' yyyy + + + + + + {0} a el {1} + + M-M + + + E dd/MM - E dd/MM + E dd/MM - E dd/MM + + + MMM-MMM + + + E dd 'de' MMM 'al' E dd 'de' MMM + E dd 'al' E dd 'de' MMM + + + dd 'de' MMM 'al' dd 'de' MMM + dd-dd 'de' MMM + + + dd/MM - dd/MM + dd/MM - dd/MM + + + d-d + + + HH-HH + + + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH-HH v + + + y-y + + + MM/yy - MM/yy + MM/yy - MM/yy + + + E dd/MM/yy - E dd/MM/yy + E dd/MM/yy - E dd/MM/yy + E dd/MM/yy - E dd/MM/yy + + + MMM-MMM 'de' yyyy + MMM 'de' yyyy 'a' MMM 'de' yyyy + + + E dd 'de' MMM 'al' E dd 'de' MMM 'de' yyyy + E dd 'al' E dd 'de' MMM 'de' yyyy + E dd 'de' MMM 'de' yyyy 'al' E dd 'de' MMM 'de' yyyy + + + dd 'de' MMM 'al' dd 'de' MMM 'de' yyyy + dd-dd 'de' MMM 'de' yyyy + dd 'de' MMM 'de' yyyy 'al' dd 'de' MMM 'de' yyyy + + + dd/MM/yy - dd/MM/yy + dd/MM/yy - dd/MM/yy + dd/MM/yy - dd/MM/yy + + + + + + + + + . + , + + + diff --git a/libs/Zend/Locale/Data/es_MX.xml b/libs/Zend/Locale/Data/es_MX.xml new file mode 100644 index 0000000..12f04d5 --- /dev/null +++ b/libs/Zend/Locale/Data/es_MX.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + . + , + + + + $ + + + + diff --git a/libs/Zend/Locale/Data/es_NI.xml b/libs/Zend/Locale/Data/es_NI.xml new file mode 100644 index 0000000..13a75ce --- /dev/null +++ b/libs/Zend/Locale/Data/es_NI.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + . + , + + + diff --git a/libs/Zend/Locale/Data/es_PA.xml b/libs/Zend/Locale/Data/es_PA.xml new file mode 100644 index 0000000..aef8abe --- /dev/null +++ b/libs/Zend/Locale/Data/es_PA.xml @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + MM/dd/yyyy + + + + + MM/dd/yy + + + + + + MM/dd + + + {0} a el {1} + + M-M + + + E MM/dd - E MM/dd + E MM/dd - E MM/dd + + + MMM-MMM + + + E d 'de' MMM 'al' E d 'de' MMM + E d 'al' E d 'de' MMM + + + d 'de' MMM 'al' d 'de' MMM + d-d 'de' MMM + + + MM/dd - MM/dd + MM/dd - MM/dd + + + d-d + + + HH-HH + + + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH-HH v + + + y-y + + + MM/yy - MM/yy + MM/yy - MM/yy + + + E MM/dd/yy - E MM/dd/yy + E MM/dd/yy - E MM/dd/yy + E MM/dd/yy - E MM/dd/yy + + + MMM-MMM 'de' yyyy + MMM 'de' yyyy 'a' MMM 'de' yyyy + + + E d 'de' MMM 'al' E d 'de' MMM 'de' yyyy + E d 'al' E d 'de' MMM 'de' yyyy + E d 'de' MMM 'de' yyyy 'al' E d 'de' MMM 'de' yyyy + + + d 'de' MMM 'al' d 'de' MMM 'de' yyyy + d-d 'de' MMM 'de' yyyy + d 'de' MMM 'de' yyyy 'al' d 'de' MMM 'de' yyyy + + + MM/dd/yy - MM/dd/yy + MM/dd/yy - MM/dd/yy + MM/dd/yy - MM/dd/yy + + + + + + + + + . + , + + + diff --git a/libs/Zend/Locale/Data/es_PE.xml b/libs/Zend/Locale/Data/es_PE.xml new file mode 100644 index 0000000..ff1e3b3 --- /dev/null +++ b/libs/Zend/Locale/Data/es_PE.xml @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + d/MM/yy + + + + + + + HH'H'mm''ss" v + + + + + + {0} a el {1} + + M-M + + + E d/MM - E d/MM + E d/MM - E d/MM + + + MMM-MMM + + + E d 'de' MMM 'al' E d 'de' MMM + E d 'al' E d 'de' MMM + + + d 'de' MMM 'al' d 'de' MMM + d-d 'de' MMM + + + d/MM - d/MM + d/MM - d/MM + + + d-d + + + HH-HH + + + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH-HH v + + + y-y + + + MM/yy - MM/yy + MM/yy - MM/yy + + + E d/MM/yy - E d/MM/yy + E d/MM/yy - E d/MM/yy + E d/MM/yy - E d/MM/yy + + + MMM-MMM 'de' yyyy + MMM 'de' yyyy 'a' MMM 'de' yyyy + + + E d 'de' MMM 'al' E d 'de' MMM 'de' yyyy + E d 'al' E d 'de' MMM 'de' yyyy + E d 'de' MMM 'de' yyyy 'al' E d 'de' MMM 'de' yyyy + + + d 'de' MMM 'al' d 'de' MMM 'de' yyyy + d-d 'de' MMM 'de' yyyy + d 'de' MMM 'de' yyyy 'al' d 'de' MMM 'de' yyyy + + + d/MM/yy - d/MM/yy + d/MM/yy - d/MM/yy + d/MM/yy - d/MM/yy + + + + + + + + + . + , + + + diff --git a/libs/Zend/Locale/Data/es_PR.xml b/libs/Zend/Locale/Data/es_PR.xml new file mode 100644 index 0000000..ac24315 --- /dev/null +++ b/libs/Zend/Locale/Data/es_PR.xml @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + MM/dd/yyyy + + + + + MM/dd/yy + + + + + + MM/dd + + + {0} a el {1} + + M-M + + + E MM/dd - E MM/dd + E MM/dd - E MM/dd + + + MMM-MMM + + + E d 'de' MMM 'al' E d 'de' MMM + E d 'al' E d 'de' MMM + + + d 'de' MMM 'al' d 'de' MMM + d-d 'de' MMM + + + MM/dd - MM/dd + MM/dd - MM/dd + + + d-d + + + HH-HH + + + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH-HH v + + + y-y + + + MM/yy - MM/yy + MM/yy - MM/yy + + + E MM/dd/yy - E MM/dd/yy + E MM/dd/yy - E MM/dd/yy + E MM/dd/yy - E MM/dd/yy + + + MMM-MMM 'de' yyyy + MMM 'de' yyyy 'a' MMM 'de' yyyy + + + E d 'de' MMM 'al' E d 'de' MMM 'de' yyyy + E d 'al' E d 'de' MMM 'de' yyyy + E d 'de' MMM 'de' yyyy 'al' E d 'de' MMM 'de' yyyy + + + d 'de' MMM 'al' d 'de' MMM 'de' yyyy + d-d 'de' MMM 'de' yyyy + d 'de' MMM 'de' yyyy 'al' d 'de' MMM 'de' yyyy + + + MM/dd/yy - MM/dd/yy + MM/dd/yy - MM/dd/yy + MM/dd/yy - MM/dd/yy + + + + + + + + + . + , + + + + $ + + + + diff --git a/libs/Zend/Locale/Data/es_PY.xml b/libs/Zend/Locale/Data/es_PY.xml new file mode 100644 index 0000000..ef4c282 --- /dev/null +++ b/libs/Zend/Locale/Data/es_PY.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + ¤ #,##0.00;¤ -#,##0.00 + + + + + + diff --git a/libs/Zend/Locale/Data/es_SV.xml b/libs/Zend/Locale/Data/es_SV.xml new file mode 100644 index 0000000..74a3a68 --- /dev/null +++ b/libs/Zend/Locale/Data/es_SV.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + . + , + + + diff --git a/libs/Zend/Locale/Data/es_US.xml b/libs/Zend/Locale/Data/es_US.xml new file mode 100644 index 0000000..d5d5c50 --- /dev/null +++ b/libs/Zend/Locale/Data/es_US.xml @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + MMM d, yyyy + + + + + M/d/yy + + + + + + + h:mm:ss a v + + + + + h:mm:ss a z + + + + + h:mm:ss a + + + + + h:mm a + + + + + + MM/d + M/d + + + {0} a el {1} + + M-M + + + E M/d - E M/d + E M/d - E M/d + + + MMM-MMM + + + E d 'de' MMM 'al' E d 'de' MMM + E d 'al' E d 'de' MMM + + + d 'de' MMM 'al' d 'de' MMM + d-d 'de' MMM + + + M/d - M/d + M/d - M/d + + + d-d + + + h a - h a + h-h a + + + h:mm a - h:mm a + h:mm-h:mm a + h:mm-h:mm a + + + h:mm a - h:mm a v + h:mm-h:mm a v + h:mm-h:mm a v + + + h a - h a v + h-h a v + + + y-y + + + M/yy - M/yy + M/yy - M/yy + + + E M/d/yy - E M/d/yy + E M/d/yy - E M/d/yy + E M/d/yy - E M/d/yy + + + MMM-MMM 'de' yyyy + MMM 'de' yyyy 'a' MMM 'de' yyyy + + + E d 'de' MMM 'al' E d 'de' MMM 'de' yyyy + E d 'al' E d 'de' MMM 'de' yyyy + E d 'de' MMM 'de' yyyy 'al' E d 'de' MMM 'de' yyyy + + + d 'de' MMM 'al' d 'de' MMM 'de' yyyy + d-d 'de' MMM 'de' yyyy + d 'de' MMM 'de' yyyy 'al' d 'de' MMM 'de' yyyy + + + M/d/yy - M/d/yy + M/d/yy - M/d/yy + M/d/yy - M/d/yy + + + + + + + + + . + , + + + diff --git a/libs/Zend/Locale/Data/es_UY.xml b/libs/Zend/Locale/Data/es_UY.xml new file mode 100644 index 0000000..8ea68d6 --- /dev/null +++ b/libs/Zend/Locale/Data/es_UY.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + ¤ #,##0.00;(¤ #,##0.00) + + + + + + $U + + + + + diff --git a/libs/Zend/Locale/Data/es_VE.xml b/libs/Zend/Locale/Data/es_VE.xml new file mode 100644 index 0000000..567dbf9 --- /dev/null +++ b/libs/Zend/Locale/Data/es_VE.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + ¤#,##0.00;¤-#,##0.00 + + + + + + diff --git a/libs/Zend/Locale/Data/et.xml b/libs/Zend/Locale/Data/et.xml new file mode 100644 index 0000000..73a41fa --- /dev/null +++ b/libs/Zend/Locale/Data/et.xml @@ -0,0 +1,1947 @@ + + + + + + + + + + + afari + abhaasi + atšehi + akoli + adangme + adõgee + avesta + afrikaani + muu afroaasia + afrihili + ainu + akani + akadi + aleuudi + algonkini keeled + altai + amhari + aragoni + vanainglise + angika + apatši keeled + araabia + aramea + araukaani + arapaho + muu tehiskeel + aravaki + assami + astuuria + atapaski keeled + Austraalia keeled + avaari + avadhi + aimara + aserbaidžaani + baškiiri + banda + bamileke keeled + belutši + bali + basa + muu balti + valgevene + bedža + bemba + berberi + bulgaaria + bihaari + bhodžpuri + bislama + bikoli + edo + siksika + bambara + bengali + bantu + tiibeti + bretooni + bradži + bosnia + bataki + burjaadi + bugi + bilini + katalaani + kado + muu Kesk-Ameerika indiaani + kariibi + muu Kaukaasia + tšetšeeni + sebu + muu keldi + tšamorro + tšibtša + tšagatai + tšuugi + mari + tšinuki žargoon + tšokto + tšipevai + tšerokii + šaieeni + tšami keeled + korsika + kopti + muud inglispõhjalised kreool- ja pidžinkeeled + muud prantsuspõhjalised kreool- ja pidžinkeeled + muud portugalipõhjalised kreool- ja pidžinkeeled + krii + krimmitatari + muud kreool- ja pidžinkeeled + tšehhi + kašuubi + kirikuslaavi + muu kuši keel + tšuvaši + kõmri + taani + siuu + dargi + dajaki + saksa + delavari + sleivi + dogribi + dinka + dogri + muu draviidi keel + alamsorbi + duala + keskhollandi + maldiivi + djula + bhutani + eve + ibibio + muinasegiptuse + ekadžuki + kreeka + eelami + inglise + inglise keel (US) + keskinglise + esperanto + hispaania + eesti + baski + evondo + pärsia + fangi + fanti + fulbe + soome + filipino + muu soomeugri + fidži + fääri + foni + prantsuse + keskprantsuse + vanaprantsuse + põhjafriisi + idafriisi + friuuli + läänefriisi + iiri + gaa + gajo + gbaja + gaeli + muu germaani + etioopia + kiribati + galeegi + keskülemsaksa + guaranii + vanaülemsaksa + gondi + gorontalo + gooti + grebo + vanakreeka + alemanni + gudžarati + mänksi + gvitšini + hausa + haida + havai + heebrea + hindi + hiligainoni + himtšali + heti + hmongi + motu + horvaadi + ülemsorbi + haiti + ungari + hupa + armeenia + herero + interlingua + ibani + indoneesia + interlingue + ibo + Sichuani jii + idžo + injupiaki + iloko + muu India + muu indoeuroopa + inguši + ido + muu Iraani + irokeesi keeled + islandi + itaalia + inuktituti + jaapani + lojbani + juudipärsia + juudiaraabia + jaava + gruusia + karakalpaki + kabiili + katšini + kamba + kareni + kaavi + kabardi-tšerkessi + kongo + khasi + muu khoisani + saki + kikuju + ambo + kasahhi + grööni + khmeeri + mbundu + kannada + korea + konkani + kosrae + kpelle + kanuri + karatšai-balkaari + karjala + kruu + oraoni + kašmiiri + kurdi + kumõki + kutenai + komi + korni + kirgiisi + ladina + ladiino + lahnda + lamba + letseburgi + lesgi + ganda + limburgi + lingala + lao + mongo + lozi + leedu + luba + lulua + luisenjo + lunda + luo + lušei + läti + madura + magali + maithili + makassari + malinke + austroneesia keeled + masai + mokša + mandari + mende + malagassi + keskiiri + maršalli + maoori + mikmaki + minangkabau + üksikkeeled + makedoonia + muu moni-khmeeri + malajalami + mongoli + mandžu + manipuri + manobo keeled + moldova + mohoogi + more + marathi + malai + malta + mitu keelt + munda keel + maskogi + miranda + marvari + birma + maia keeled + ersa + nauru + nahua + muu Põhja-Ameerika indiaani + napoli + norra bokmål + põhjandebele + alamsaksa + nepali + nevari + ndonga + niasi + muu Nigeri-Kordofani + niue + hollandi + norra nynorsk + norra + nogai + vanapõhjala + nkoo + lõunandebele + pedi + Nuubia keeled + navaho + vananevari + njandža + njamvesi + nkole + njoro + nzima + oksitaani + odžibvei + oromo + oria + osseedi + oseidži + osmanitürgi + otomi keeled + pandžabi + muu Paapua + pangasinani + pahlavi + pampanga + papiamento + belau + vanapärsia + muu Filipiini + foiniikia + paali + poola + poonpei + praakriti keeled + vanaprovansi + puštu + portugali + portugali (Braziilia) + ketšua + radžastani + rapanui + rarotonga + retoromaani + rundi + rumeenia + muu romaani + mustlaskeel + vene + aromuuni + ruanda + sanskriti + sandave + jakuudi + muu Lõuna-Ameerika indiaani + sališi keeled + Samaaria aramea + sasaki + santali + sardiinia + sitsiilia + šoti + sindhi + põhjasaami + sölkupi + muu semi + sango + vanaiiri + viipekeeled + serbia-horvaadi + šani + singali + sidamo + siuu keeled + muu Hiina-Tiibeti + slovaki + sloveeni + muu slaavi + samoa + lõunasaami + muu saami + Lule saami + Inari saami + koltasaami + šona + soninke + somaali + sogdi + songai + albaania + serbia + sranani + sereri + svaasi + muu Niiluse-Sahara + lõunasotho + sunda + sukuma + susu + sumeri + rootsi + suahiili + süüria + tamili + muu tai keel + telugu + temne + tereno + tetumi + tadžiki + tai + tigrinja + tigree + tivi + türkmeeni + tokelau + tagalogi + klingoni + tlingiti + tamašeki + tsvana + tonga + tšitonga + uusmelaneesia + türgi + tsonga + tšimši keeled + tatari + tumbuka + tupii keeled + muu Altai + tuvalu + tvii + tahiti + tõva + udmurdi + uiguuri + ugariti + ukraina + umbundu + määramata + urdu + usbeki + vai + venda + vietnami + volapüki + vadja + vallooni + vakaši keeled + volamo + varai + vašo + sorbi keeled + volofi + kalmõki + koosa + jao + japi + jidiši + joruba + jupiki keeled + tšuangi + sapoteegi + zenaga + hiina + hiina keel - lihtsustatud + hiina keel - traditsiooniline + zande + suulu + sunji + mittekeeleline + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + maailm + Aafrika + Põhja-Ameerika + Lõuna-Ameerika + Okeaania + Lääne-Aafrika + Kesk-Ameerika + Ida-Aafrika + Põhja-Aafrika + Kesk-Aafrika + Lõuna-Aafrika + Ameerika maailmajagu + Ameerika põhjaosa + Kariibi meri + Ida-Aasia + Lõuna-Aasia + Kagu-Aasia + Lõuna-Euroopa + Austraalia ja Uus-Meremaa + Melaneesia + Mikroneesia + Polüneesia + Kesk-Aasia lõunaosa + Aasia + Kesk-Aasia + Lääne-Aasia + Euroopa + Ida-Euroopa + Põhja-Euroopa + Lääne-Euroopa + Sõltumatute Riikide Ühendus + Ladina-Ameerika ja Kariibi meri + Andorra + Araabia Ühendemiraadid + Afganistan + Antigua ja Barbuda + Anguilla + Albaania + Armeenia + Hollandi Antillid + Angola + Antarktis + Argentina + Ameerika Samoa + Austria + Austraalia + Aruba + Ahvenamaa + Aserbaidžaan + Bosnia ja Hertsegoviina + Barbados + Bangladesh + Belgia + Burkina Faso + Bulgaaria + Bahrein + Burundi + Benin + Bermuda + Brunei + Boliivia + Brasiilia + Bahama + Bhutan + Bouvet’ saar + Botswana + Valgevene + Belize + Kanada + Kookossaared + Kongo DV + Kesk-Aafrika Vabariik + Kongo Vabariik + Šveits + Côte d'Ivoire + Cooki saared + Tšiili + Kamerun + Hiina + Colombia + Costa Rica + Serbia ja Montenegro + Kuuba + Roheneemesaared + Jõulusaar + Küpros + Tšehhi + Saksamaa + Djibouti + Taani + Dominica + Dominikaani Vabariik + Alžeeria + Ecuador + Eesti + Egiptus + Lääne-Sahara + Eritrea + Hispaania + Etioopia + Soome + Fidži + Falklandi saared + Mikroneesia Liiduriigid + Fääri saared + Prantsusmaa + Gabon + Suurbritannia + Grenada + Gruusia + Prantsuse Guajaana + Guernsey + Ghana + Gibraltar + Gröönimaa + Gambia + Guinea + Guadeloupe + Ekvatoriaal-Guinea + Kreeka + Lõuna-Georgia ja Lõuna-Sandwichi saared + Guatemala + Guam + Guinea-Bissau + Guyana + Hongkong + Heard ja McDonald + Honduras + Horvaatia + Haiti + Ungari + Indoneesia + Iirimaa + Iisrael + Mani saar + India + Briti India ookeani ala + Iraak + Iraan + Island + Itaalia + Jersey + Jamaica + Jordaania + Jaapan + Kenya + Kõrgõzstan + Kambodža + Kiribati + Komoorid + Saint Kitts ja Nevis + Põhja-Korea + Lõuna-Korea + Kuveit + Kaimanisaared + Kasahstan + Laos + Liibanon + Saint Lucia + Liechtenstein + Sri Lanka + Libeeria + Lesotho + Leedu + Luksemburg + Läti + Liibüa + Maroko + Monaco + Moldova + Montenegro + Madagaskar + Marshalli Saared + Makedoonia + Mali + Myanmar + Mongoolia + Aomen + Põhja-Mariaanid + Martinique + Mauritaania + Montserrat + Malta + Mauritius + Maldiivid + Malawi + Mehhiko + Malaisia + Mosambiik + Namiibia + Uus-Kaledoonia + Niger + Norfolk + Nigeeria + Nicaragua + Holland + Norra + Nepal + Nauru + Niue + Uus-Meremaa + Omaan + Panama + Peruu + Prantsuse Polüneesia + Paapua Uus-Guinea + Filipiinid + Pakistan + Poola + Saint-Pierre ja Miquelon + Pitcairn + Puerto Rico + Palestiina ala + Portugal + Belau + Paraguay + Katar + Okeaania hajasaared + Euroopa Liit + Réunion + Rumeenia + Serbia + Venemaa + Rwanda + Saudi Araabia + Saalomoni Saared + Seišellid + Sudaan + Rootsi + Singapur + Saint Helena + Sloveenia + Svalbard ja Jan Mayen + Slovakkia + Sierra Leone + San Marino + Senegal + Somaalia + Suriname + São Tomé ja Príncipe + El Salvador + Süüria + Svaasimaa + Turks ja Caicos + Tšaad + Prantsuse Lõunaalad + Togo + Tai + Tadžikistan + Tokelau + Ida-Timor + Türkmenistan + Tuneesia + Tonga + Türgi + Trinidad ja Tobago + Tuvalu + Taiwan + Tansaania + Ukraina + Uganda + Ühendriikide hajasaared + Ameerika Ühendriigid + Uruguay + Usbekistan + Vatikan + Saint Vincent ja Grenadiinid + Venezuela + Briti Neitsisaared + USA Neitsisaared + Vietnam + Vanuatu + Wallis ja Futuna + Samoa + Jeemen + Mayotte + Lõuna-Aafrika Vabariik + Sambia + Zimbabwe + määramata + + + saksa traditsiooniline kirjaviis + saksa reformitud kirjaviis + Natisone murre + polütooniline + uus kirjaviis + Resia murre + saho murre + + + kalender + sortimine + vääring + + + hiina traditsiooniline - big5 + budistlik kalender + Hiina kalender + lisareegliteta + hiina lihtsustatud - GB2312 + Gregoriuse kalender + juudi kalender + islamikalender + islami ilmalik kalender + Jaapani kalender + telefoniraamat + elementide kirjutamise järjekorras + traditsiooniline + + + inglise mõõdustik + meetermõõdustik + + + + lowercase-words + + + [a-s š z ž t-w õ ä ö ü x y] + [á à â å ā æ ç é è ê ë ē í ì î ï ī ñ ó ò ŏ ô ø ō œ ß ú ù û ū] + + + + + + + + + GanjkHmsSEDFwWxhKzAeugXZvcL + + + + + + jaan + veebr + märts + apr + mai + juuni + juuli + aug + sept + okt + nov + dets + + + jaanuar + veebruar + märts + aprill + mai + juuni + juuli + august + september + oktoober + november + detsember + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + P + E + T + K + N + R + L + + + pühapäev + esmaspäev + teisipäev + kolmapäev + neljapäev + reede + laupäev + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + K1 + K2 + K3 + K4 + + + 1. kvartal + 2. kvartal + 3. kvartal + 4. kvartal + + + + AM + PM + + + enne meie aega + meie aja järgi + + + e.m.a. + m.a.j. + + + + + + EEEE, d, MMMM yyyy + + + + + d MMMM yyyy + + + + + dd.MM.yyyy + + + + + dd.MM.yy + + + + + + + H:mm:ss v + + + + + H:mm:ss z + + + + + H:mm:ss + + + + + H:mm + + + + + + + {1} {0} + + + + d MMMM + dd.MM + mm:ss + Q yy + MM.yyyy + MMMM yyyy + + + {0} - {1} + + M-M + + + E, dd.MM - E, dd.MM + E, dd.MM - E, dd.MM + + + MMM-MMM + + + E, d MMM - E, d MMM + E, d - E, d MMM + + + d MMM - d MMM + d-d MMM + + + dd.MM - dd.MM + dd.MM - dd.MM + + + d-d + + + H-H + + + H:mm-H:mm + H:mm-H:mm + + + H:mm-H:mm v + H:mm-H:mm v + + + H-H v + + + y-y + + + MM.yy - MM.yy + MM.yy - MM.yy + + + E, dd.MM.yy - E, dd.MM.yy + E, dd.MM.yy - E, dd.MM.yy + E, dd.MM.yy - E, dd.MM.yy + + + MMM-MMM yyyy + MMM yyyy - MMM yyyy + + + E, d, MMM - E, d, MMM yyyy + E, d - E, d, MMM yyyy + E, d, MMM yyyy - E, d, MMM yyyy + + + d MMM - d MMM yyyy + d-d MMM yyyy + d MMM yyyy - d MMM yyyy + + + dd.MM.yy - dd.MM.yy + dd.MM.yy - dd.MM.yy + dd.MM.yy - dd.MM.yy + + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + määramata + + + Lõunapoolus + + + Dumont D'Urville + + + Viin + + + Brüssel + + + Bermuuda + + + Kookossaared + + + Zürich + + + Lihavõttesaar + + + Havanna + + + Roheneeme + + + Jõulud + + + Berliin + + + Kopenhaagen + + + Alžiir + + + Kairo + + + Kanaari saared + + + Madriid + + + Helsingi + + + Fidži + + + Fääri + + + Pariis + + + Ateena + + + Lõuna Gruusia + + + Rooma + + + St. Kitts + + + St. Lucia + + + Luksemburg + + + Riia + + + Maldiivid + + + Varssavi + + + Lissabon + + + Katar + + + Kokkutulek + + + Bukarest + + + Singapur + + + Salvador + + + Hispaania Sadam + + + Kiiev + + + Alaska aeg + + + St. Vincent + + + St. Thomas + + + + + + , +   + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + #,##0.00 ¤ + + + + + + Andorra peseeta + + + Araabia Ühendemiraatide dirhem + + + Afganistani afgaani, 1927-2002 + + + Afganistani afgaani + + + Albaania lekk + + + Armeenia dramm + + + Hollandi Antillide kulden + + + Angola kvanza + + + Angola kvanza, 1977-1990 + + + Angola kvanza, 1990-2000 + + + Angola reformitud kvanza, 1995-1999 + + + Argentina austral + + + Argentina peeso, 1983-1985 + + + Argentina peeso + + + Austria šilling + + + Austraalia dollar + + + Aruba guilder + + + Aserbaidžaani manat, 1993-2006 + + + Aserbaidžaani manat + + + Bosnia-Hertsegoviina dinaar + + + Bosnia-Hertsegoviina mark + + + Barbadose dollar + + + Bangladeshi taka + + + Belgia konverteeritav frank + + + Belgia frank + + + Belgia arveldusfrank + + + Bulgaaria püsiv leev + + + Bulgaaria leev + + + Bahreini dinaar + + + Burundi frank + + + Bermuda dollar + + + Brunei dollar + + + boliviaano + + + Boliivia peeso + + + Brasiilia krusado + + + Brasiilia reaal + + + Birma kjatt + + + Botswana pula + + + Valgevene uus rubla, 1994-1999 + + + Valgevene rubla + + + Kanada dollar + + + Šveitsi frank + + + Tšiili peeso + + + Hiina jüaan + + + Kolumbia peeso + + + Serbia vana dinaar + + + Küprose nael + + + Tšehhi kroon + + + Saksa mark + + + Taani kroon + + + Alžeeria dinaar + + + Ecuadori sukre + + + kroon + kr + . + + + Egiptuse nael + + + Hispaania peseeta + + + Etioopia birr + + + euro + + + + Soome mark + + + Fidži dollar + + + Falklandi saarte nael + + + Prantsuse frank + + + Suurbritannia naelsterling + £ + + + Gruusia lari + + + Ghana sedi + + + Gibraltari nael + + + Gambia dalasi + + + Guinea syli + + + Kreeka drahm + + + Guatemala ketsal + + + Guinea-Bissau peeso + + + Guyana dollar + + + Hongkongi dollar + + + Hondurase lempiira + + + Horvaatia kuna + + + Haiti gurd + + + Ungari forint + + + Indoneesia ruupia + + + Iiri nael + + + Iisraeli nael + + + Iisraeli uus seekel + + + India ruupia + + + Iraagi dinaar + + + Iraani riaal + + + Islandi kroon + + + Itaalia liir + + + Jamaica dollar + + + Jaapani jeen + ¥ + + + Keenia šilling + + + Kõrgõzstani somm + + + Kambodža riaal + + + Põhja-Korea vonn + + + Lõuna-Korea vonn + + + Kuveidi dinaar + + + Kasahstani tenge + + + Laose kiip + + + Liibanoni nael + + + Leedu litt + + + Luksemburgi frank + + + Läti latt + + + Maroko dirhem + + + Moldova leu + + + Myanmari kjatt + + + Mongoolia tugrik + + + Macao pataka + + + Mauretaania ugia + + + Malta liir + + + Mauritiuse ruupia + + + Maldiivide ruupia + + + Malawi kvatša + + + Mehhiko peeso + + + Mehhiko peeso, 1861-1990 + + + Malaisia ringgit + + + Mosambiigi metikal + + + Nigeeria naira + + + Nicaragua kordoba + + + Nicaragua kuldkordoba + + + Hollandi kulden + + + Norra kroon + + + Nepali ruupia + + + Uus-Meremaa dollar + + + Omaani riaal + + + Panama balboa + + + Peruu inti + + + Peruu uus soll + + + Peruu soll + + + Paapua Uus-Guinea kina + + + Filipiinide peeso + + + Pakistani ruupia + + + Poola zlott + + + Poola zlott, 1950-1995 + + + Portugali eskuudo + + + Paraguai guaranii + + + Quatari riaal + + + Rumeenia lei, -2005 + + + Rumeenia lei + + + Serbia dinaar + + + Venemaa rubla + + + Venemaa rubla, 1991-1998 + + + Ruanda frank + + + Saudi-Araabia riaal + + + Saalomoni saarte dollar + + + Seišelli saarte ruupia + + + Sudaani nael + + + Rootsi kroon + + + Singapuri dollar + + + Saint Helena nael + + + Sloveenia tolar + + + Slovakkia kroon + + + Sierra Leone leoone + + + Somaalia šilling + + + Surinami kulden + + + São Tomé ja Príncipe dobra + + + NSVL rubla + + + Salvadori koloon + + + Süüria nael + + + Tai baat + + + Tadžikistani somoni + + + Türkmenistani manat + + + Tuneesia dinaar + + + Tonga pa'anga + + + Timori eskuudo + + + Türgi liir + + + Türgi uus liir + + + Taiwani dollar + + + Tansaania šilling + + + Ukraina grivna + + + Ukraina karbovanets + + + Uganda šilling + + + USA dollar + $ + + + USA järgmise päeva dollar + + + USA sama päeva dollar + + + Uruguai peeso + + + Usbekistani somm + + + Venezuela boliivar + + + Vietnami dong + + + Vanuatu vatu + + + Lääne-Samoa tala + + + CFA frank BEAC + + + hõbe + + + kuld + + + EURCO + + + Ida-Kariibi dollar + + + eküü + + + Prantsuse kuldfrank + + + pallaadium + + + plaatina + + + vääringute testkood + + + määramata + XXX + + + Jeemeni dinaar + + + Jugoslaavia uus dinaar + + + Jugoslaavia konverteeritav dinaar + + + LAVi rand + + + Sambia kvatša + + + Sairi zaire + + + Zimbabwe dollar + + + + + + jah:j + ei:e + + + diff --git a/libs/Zend/Locale/Data/et_EE.xml b/libs/Zend/Locale/Data/et_EE.xml new file mode 100644 index 0000000..e72e4a8 --- /dev/null +++ b/libs/Zend/Locale/Data/et_EE.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/eu.xml b/libs/Zend/Locale/Data/eu.xml new file mode 100644 index 0000000..9185ba8 --- /dev/null +++ b/libs/Zend/Locale/Data/eu.xml @@ -0,0 +1,584 @@ + + + + + + + + + + + afrikaans + amharikera + arabiera + assamera + azerbaijanera + bielorrusiera + bulgariera + biharrera + bengalera + bretoiera + bosniera + katalana + txekiera + {0>welsh<}100{>galesera <0} + daniera + alemanera + greziera + ingelera + ingelesa (australia) + ingelesa (erresuma batua) + ingelesa (aeb) + esperantoa + espainiera + estoniera + euskara + pertsiera + finlandiera + tagalo + faroera + frantsesera + frisiarra + gaelikoa + eskoziar gaelikoa + galegoa + guaraniera + gujaratera + hebreera + hindia + kroaziera + hungariera + armeniera + interlingua + indonesiera + interlingue + islandiera + italiera + japoniera + javera + georgiera + khemerera + kannada + koreera + kurduera + kirgizera + latina + lingala + laosera + lituaniera + letoniera + mazedoniera + malayalamera + mongoliera + marathera + malaysiera + maltera + nepalera + nederlandera + norvegiera (nynorsk) + norvegiera + okzitaniera + oriya + punjabera + poloniera + paxtuera + portugalera + portugesa (brasil) + portugesa (portugal) + errumaniera + errusiera + sanskritoa + sindhia + serbokroaziera + sinhala + eslovakiera + esloveniera + somaliera + albaniera + serbiera + sesothoera + sundanera + suediera + swahili + tamilera + telugua + thailandiera + tigrinya + turkmeniera + tagalog + klingonera + turkiera + twia + uigurrera + ukrainera + urdu + uzbekera + vietnamera + xhosa + yiddishera + txinera + txinera (soildua) + txinera (tradizionala) + zuluera + + + Arabiar Emirrerri Batuak + Afganistan + Antigua eta Barbuda + Albania + Armenia + Nederlandar Antillak + Angola + Antartika + Argentina + Samoa Estatubatuarra + Austria + Australia + Aland Uharteak + Azerbaijan + Bosnia-Herzegovina + Bangladesh + Belgika + Burkina Faso + Bulgaria + Burundi + Benin + Bolibia + Brasil + Bahamak + Bh2utan + Bouvet Uhartea + Botswana + Bielorrusia + Kanada + Cocos uharteak + Kongoko Errepublika Demokratikoa + Afrika Erdiko Errepublika + Kongo + Suitza + Boli Kosta + Cook uharteak + Txile + Kamerun + Txina + Kolonbia + Serbia eta Montenegro + Kuba + Cabo Verde + Christmas uhartea + Zipre + Txekiar errepublika + Alemania + Djibuti + Danimarka + Dominika + Dominikar Errepublika + Aljeria + Ekuador + Estonia + Egipto + Mendebaldeko Sahara + Eritrea + Espainia + Etiopia + Finlandia + Malvinak + Mikronesia + Faroe Uharteak + Frantzia + Gabon + Erresuma Batua + Georgia + Guyana Frantsesa + Guernsey + Ghana + Groenlandia + Gambia + Ginea + Ekuatore Ginea + Grezia + Hegoaldeko Georgia eta Hegoaldeko Sandwich uharteak + Ginea-Bissau + Heard eta McDonald Uharteak + Honduras + Kroazia + Haiti + Hungaria + Indonesia + Irlanda + Israel + Man uhartea + India + Indiako Ozeanoko Britainiar Lurraldea + Irak + Iran + Islandia + Italia + Jersey + Jamaika + Jordania + Japonia + Kenia + Kirgizistan + Kanbodia + Kiribati + Komoreak + Saint Kitts eta Nevis + Ipar Korea + Hego Korea + Kaiman Uharteak + Kazakhstan + Laos + Libano + Santa Luzia + Liechtenstein + Sri Lanka + Liberia + Lesotho + Lituania + Luxenburgo + Letonia + Libia + Maroko + Monako + Moldavia + Montenegro + Madagaskar + Marshall uharteak + Mazedonia + Mali + Birmania + Mongolia + Macau + Iparraldeko Mariana uharteak + Mauritania + Maurizio + Maldivak + Malawi + Mexiko + Malasia + Mozambike + Namibia + Kaledonia Berria + Niger + Norfolk uhartea + Nigeria + Nikaragua + Herbehereak + Norvegia + Nepal + Zeelanda Berria + Oman + Peru + Polinesia Frantsesa + Papua Ginea Berria + Filipinak + Pakistan + Polonia + Saint-Pierre eta Mikelune + Palestina + Portugal + Paraguai + Katar + Errumania + Serbia + Errusia + Ruanda + Saudi Arabia + Salomon uharteak + Seychelleak + Sudan + Suedia + Singapur + Saint Helena + Eslovenia + Svalbard eta Jan Mayen uharteak + Eslovakia + Sierra Leona + San Marino + Senegal + Somalia + Surinam + Sao Tomé eta Principe + Siria + Swazilandia + Turk eta Caico uharteak + Txad + Frantziaren Lurralde Australak + Togo + Tailandia + Tadjikistan + Tokelau + Ekialdeko Timor + Turkmenistan + Tunisia + Tonga + Turkia + Trinidad eta Tobago + Tuvalu + Taiwan + Tanzania + Ukraina + Uganda + Estatu Batuetatik urruti dauden uharte txikiak + Ameriketako Estatu Batuak + Uruguai + Uzbekistan + Vatikano + Saint Vincent eta Grenadinak + Venezuela + Virginia uharteak (Erresuma Batua) + Virginia uharteak (Ameriketako Estatu Batuak) + Vietnam + Vanuatu + Wallis eta Futuna + Samoa + Yemen + Hegoafrika + Zambia + Zimbabwe + + + + [a-c ç d-n ñ o-z] + + + + + + + + + + + + + + urt + ots + mar + api + mai + eka + uzt + abu + ira + urr + aza + abe + + + urtarrila + otsaila + martxoa + apirila + maiatza + ekaina + uztaila + abuztua + iraila + urria + azaroa + abendua + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + ig + al + as + az + og + or + lr + + + igandea + astelehena + asteartea + asteazkena + osteguna + ostirala + larunbata + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + Hh1 + Hh2 + Hh3 + Hh4 + + + 1. hiruhilekoa + 2. hiruhilekoa + 3. hiruhilekoa + 4. hiruhilekoa + + + + AM + PM + + + BCE + CE + + + + + + EEEE, yyyy'eko' MMMM'ren' dd'a' + + + + + yyyy'eko' MMM'ren' dd'a' + + + + + yyyy-MMM-dd + + + + + yy-MM-dd + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1} {0} + + + + Q yy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + Bahrein + + + Bermudak + + + Cabo Verde + + + Djibuti + + + Dominika + + + Madril + + + Guadalupe + + + Jamaika + + + Luxenburgo + + + Monako + + + Martinika + + + Maurizio + + + Maldivak + + + Singapur + + + + + + , + . + + + + + #,##0.00 ¤ + + + + + + ¤ #,##0;-¤ #,##0 + + , + . + + + + diff --git a/libs/Zend/Locale/Data/eu_ES.xml b/libs/Zend/Locale/Data/eu_ES.xml new file mode 100644 index 0000000..a6d995d --- /dev/null +++ b/libs/Zend/Locale/Data/eu_ES.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/fa.xml b/libs/Zend/Locale/Data/fa.xml new file mode 100644 index 0000000..ed0830c --- /dev/null +++ b/libs/Zend/Locale/Data/fa.xml @@ -0,0 +1,3361 @@ + + + + + + + + + + + {0} ({1}) + ، + + + آفاری + آبخازی + آچئی + آچولیایی + آدانگمه‌ای + آدیجیایی + اوستایی + آفریکانس + زبان افریقا و آسیایی + آفریهیلی + آینو + آکان + آکدی + آلئوتی + زبان آلگونکینی + alt + امهری + an + انگلیسی باستان + آنگیکا + زبان آپاچیایی + عربی + آرامی + آروکانیایی + آراپاهویی + زبان ساختگی + آراواکی + آسامی + ast + زبان آتاپاسکایی + زبان استرالیایی + آواری + awa + آیمارایی + ترکی آذربایجانی + باشغیری + باندایی + bai + بلوچی + بالیایی + باسایی + زبان بالتیکی + بلوروسی + بجایی + بمبایی + بربری + بلغاری + بیهاری + بوجپوری + بیسلاما + بیکولی + بینی + bla + بامبارایی + بنگالی + بانتویی + تبتی + برتانیایی + براج + بوسنیایی + باتاکی + بوریاتی + بوگیایی + بلین + کاتالونیایی + کادویی + زبان سرخپوستی امریکای مرکزی + کاریبی + زبان قفقازی + cch + چچنی + سبویی + زبان سلتی + چامورویی + چیبچا + چاگاتایی + چوکزی + ماریایی + chn + چوکتویی + چیپه‌ویه‌ای + چروکیایی + شایانی + cmc + کورسی + قبطی + کریول یا پیجین مبتنی بر انگلیسی + کریول یا پیجین مبتنی بر فرانسوی + کریول یا پیجین مبتنی بر پرتغالی + کریایی + ترکی کریمه + کریول یا پیجین + چکی + کاشوبی + اسلاوی کلیسایی + زبان کوشی + چوواشی + ویلزی + دانمارکی + داکوتایی + دارگوا + دایاک + آلمانی + آلمانی اتریش + آلمانی علیای سوئیس + دلاواری + den + دوگریب + دینکایی + دوگری + زبان دراویدی + صُربی سفلی + دوآلایی + هلندی میانه + dv + دایولایی + جونخایی + اوه‌ای + افیکی + مصری کهن + اکاجوک + یونانی + عیلامی + انگلیسی + انگلیسی استرالیا + انگلیسی کانادا + نگلیسی بریتانیا + انگلیسی امریکا + انگلیسی میانه + اسپرانتو + اسپانیایی + اسپانیایی امریکای لاتین + اسپانیایی اسپانیا + استونیایی + باسکی + اواندو + فارسی + فانکی + فانتیایی + فولایی + فنلاندی + فیلیپینی + زبان فین و اوگرایی + فیجیایی + فارویی + فونی + فرانسوی + فرانسوی کانادا + فرانسوی سوئیس + فرانسوی میانه + فرانسوی باستان + فریزی شمالی + فریزی شرقی + فریولیایی + فریزی غربی + ایرلندی + گایی + گایو + گبایایی + گیلی اسکاتلندی + زبان ژرمنی + گی‌ئزی + گیلبرتی + گالیسیایی + آلمانی علیای میانه + گوارانی + آلمانی علیای باستان + گوندی + گورونتالو + گاتیک + گریبویی + یونانی کهن + آلمانی سوئیسی + گجراتی + مانی + گویچ این + هوسیایی + هایدایی + هاوائیایی + عبری + هندی + هیلی‌گاینونی + هیماچالی + هیتی + همونگ + هیری موتو + کرواتی + صُربی علیا + هائیتیایی + مجاری + هوپا + ارمنی + هریرویی + میان‌زبان + آیبن + اندونزیایی + بین زبانی + ایگبویی + یی سیچوان + ایجویی + اینوپیک + ایلوکویی + زبان هندیک + زبان هند و اروپایی + اینگوشی + ایدو + زبان ایرانی + زبان ایروکوایی + ایسلندی + ایتالیایی + اینوکتیتوت + ژاپنی + لوجبان + فارسی یهودی + عربی یهودی + جاوه‌ای + گرجی + قره‌قالپاقی + قبایلی + کاچینی + جو + کامبایی + کارنی + کاوی + کاباردینی + kcg + کورو + کنگویی + خازیایی + زبان خواسی + ختنی + کیکویویی + کوانیاما + قزاقی + گرینلندی + خمری + کیمبوندویی + کاناده‌ای + کره‌ای + کنکانی + kos + کپله‌ای + کانوریایی + قره‌چایی‐بالکاری + krl + کرویی + کوروخی + کشمیری + کردی + کومیکی + کوتنی + کومیایی + کرنوالی + قرقیزی + لاتینی + لادینو + لاهندا + لامبا + لوگزامبورگی + لزگی + گاندایی + لیمبورگی + لینگالا + لائوسی + مونگویی + لوزیایی + لیتوانیایی + لوبایی‐کاتانگا + لوبایی‐لولوا + لویسنو + لوندایی + لوئویی + لوشه‌ای + لتونیایی + مادورایی + ماگاهیایی + مایدیلی + ماکاسار + ماندینگویی + آسترونیزیایی + ماسایی + مکشایی + ماندار + منده‌ای + مالاگاسیایی + ایرلندی میانه + مارشالی + مائوریایی + میکماکی + مینانگ‌کابویی + زبان متفرقه + مقدونی + زبان مون‌خمری + مالایالامی + مغولی + مانچویی + مانیپوری + زبان مانوبو + مولداویایی + موهاکی + ماسیایی + مراتی + مالزیایی + مالتی + چندین زبان + زبان موندایی + کریکی + mwl + مارواری + برمه‌ای + زبان مایایی + ارزیایی + نائورویی + ناواتلی + زبان سرخپوستی امریکای شمالی + ناپلی + بوکسمال نروژی + انده‌بله‌ای شمالی + آلمانی سفلی + نپالی + نواریایی + ندونگایی + نیاس + nic + نیویی + هلندی + هلندی بلژیک + نرس جدید نروژی + نروژی + نغایی + نرس باستان + nqo + انده‌بله‌ای جنوبی + سوتویی شمالی + زبان نوبیایی + ناواهویی + نواریایی کلاسیک + نیانجایی + nym + نیانکوله‌ای + نیورویی + نزیمایی + اوکیتایی + اوجیبوایی + اورومویی + اوریه‌ای + آسی + اوسیجی + ترکی عثمانی + زبان اتومیایی + پنجابی + زبان پاپوایی + پانگاسینانی + پهلوی + پامپانگایی + پاپیامنتو + پالائویی + فارسی باستان + زبان فیلیپینی + فنیقی + پالی + لهستانی + pon + زبان پراکریتی + pro + پشتو + پرتغالی + پرتغالی برزیل + پرتغالی پرتغال + کچوایی + راجستانی + راپانویی + راروتونگایی + رتو‐رومیایی + روندیایی + رومانیایی + زبان رومیایی + رومانویی + ریشه + روسی + rup + کینیارواندایی + سنسکریت + سانداوه‌ای + یاقوتی + زبان سرخپوستی امریکای جنوبی + زبان سالیشی + sam + ساساک + سانتالی + ساردینیایی + سیسیلی + اسکاتلندی + سندی + سامی شمالی + سلکوپی + زبان سامی + سانگویی + ایرلندی باستان + زبان نشانه‌ای + صرب و کرواتی + شانی + سینهالی + سیدامویی + زبان سویی + زبان چین و تبتی + اسلواکی + اسلووینیایی + زبان اسلاوی + ساموآیی + سامی جنوبی + smi + سامی لول + سامی ایناری + سامی اسکالت + شونایی + سونینکه‌ای + سومالیایی + سغدی + سونغایی + آلبانیایی + صربی + سریری + ss + زبان نیلی و صحرایی + سوتویی جنوبی + سوندایی + سوکومایی + سوسویی + سومری + سوئدی + سواحلی + سریانی کلاسیک + سریانی + تامیلی + زبان تایی + تلوگویی + تیمنه‌ای + ترنو + تتومی + تاجیکی + تایلندی + تیگرینیایی + تیگره‌ای + تیوی + ترکمنی + توکلوی + تاگالوگی + کلینگون + تلین‌گیتی + تاماشقی + تسوانایی + تونگایی + تونگایی نیاسا + tpi + ترکی استانبولی + تسونگایی + تسیم‌شیانی + تاتاری + تومبوکایی + زبان توپیایی + زبان آلتاییک + تووالویی + توی‌یایی + تاهیتیایی + تووایی + اودمورتی + اویغوری + اوگاریتی + اوکراینی + امبندویی + زبان نامشخص یا نامعتبر + اردو + ازبکی + ویایی + وندایی + ویتنامی + ولاپوک + وتیک + والونی + زبان واکاشی + والامو + وارایی + واشویی + زبان صُربی + ولوفی + قلموقی + خوسایی + یائویی + یاپی + یدی + یوروبایی + زبان یوپیکی + چوانگی + زاپوتکی + zbl + زناگا + چینی + چینی ساده‌شده + چینی سنتی + زانده‌ای + زولویی + زونیایی + zxx + زازایی + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + جهان + افریقا + امریکای شمالی + امریکای جنوبی + اقیانوسیه + غرب افریقا + امریکای مرکزی + شرق افریقا + شمال افریقا + مرکز افریقا + جنوب افریقا + امریکا + شمال امریکا + کارائیب + شرق آسیا + جنوب آسیا + جنوب شرقی آسیا + جنوب اروپا + استرالیا و زلاند نو + ملانزی + ناحیهٔ میکرونزی + پلی‌نزی + جنوب آسیا و آسیای میانه + آسیا + آسیای مرکزی + غرب آسیا + اروپا + شرق اروپا + شمال اروپا + غرب اروپا + کشورهای مستقل مشترک‌المنافع + امریکای لاتین و کارائیب + آندورا + امارات متحدهٔ عربی + افغانستان + آنتیگوا و باربودا + آنگیل + آلبانی + ارمنستان + آنتیل هلند + آنگولا + جنوبگان + آرژانتین + ساموای امریکا + اتریش + استرالیا + آروبا + جزایر آلاند + جمهوری آذربایجان + بوسنی و هرزگوین + باربادوس + بنگلادش + بلژیک + بورکینافاسو + بلغارستان + بحرین + بوروندی + بنین + سنت بارتلیمی + برمودا + برونئی + بولیوی + برزیل + باهاما + بوتان + جزیرهٔ بووت + بوتسوانا + بیلوروسی + بلیز + کانادا + جزایر کوکوس + کنگو کینشاسا + جمهوری افریقای مرکزی + کنگو برازویل + سوئیس + ساحل عاج + جزایر کوک + شیلی + کامرون + چین + کلمبیا + کاستاریکا + صربستان و مونته‌نگرو + کوبا + کیپ ورد + جزیرهٔ کریسمس + قبرس + جمهوری چک + آلمان + جیبوتی + دانمارک + دومینیک + جمهوری دومینیکن + الجزایر + اکوادر + استونی + مصر + صحرای غربی + اریتره + اسپانیا + اتیوپی + فنلاند + فیجی + جزایر فالکلند + میکرونزی + جزایر فارو + فرانسه + گابون + بریتانیا + گرانادا + گرجستان + گویان فرانسه + گورنسی + غنا + گیبرالتار + گروئنلند + گامبیا + گینه + گوادلوپ + گینهٔ استوایی + یونان + جورجیای جنوبی و جزایر ساندویچ جنوبی + گواتمالا + گوام + گینهٔ بیسائو + گویان + هنگ‌کنگ + جزیرهٔ هرد و جزایر مک‌دونالد + هندوراس + کرواسی + هاییتی + مجارستان + اندونزی + ایرلند + اسرائیل + IM + هند + مستعمره‌های انگلستان در اقیانوس هند + عراق + ایران + ایسلند + ایتالیا + جرسی + جامائیکا + اردن + ژاپن + کنیا + قرقیزستان + کامبوج + کیریباتی + کومورو + سنت کیتس و نویس + کرهٔ شمالی + کرهٔ جنوبی + کویت + جزایر کِیمن + قزاقستان + لائوس + لبنان + سنت لوسیا + لیختن‌اشتاین + سری‌لانکا + لیبریا + لسوتو + لیتوانی + لوکزامبورگ + لتونی + لیبی + مراکش + موناکو + مولدووا + مونته‌نگرو + سنت مارتین + ماداگاسکار + جزایر مارشال + مقدونیه + مالی + میانمار + مغولستان + ماکائو + جزایر ماریانای شمالی + مارتینیک + موریتانی + مونت‌سرات + مالت + موریتیوس + مالدیو + مالاوی + مکزیک + مالزی + موزامبیک + نامیبیا + کالدونیای جدید + نیجر + جزیرهٔ نورفولک + نیجریه + نیکاراگوئه + هلند + نروژ + نپال + نائورو + نیوئه + زلاند نو + عمان + پاناما + پرو + پلی‌نزی فرانسه + پاپوا گینهٔ نو + فیلیپین + پاکستان + لهستان + سنت پیر و میکلون + پیتکایرن + پورتو ریکو + فلسطین + پرتغال + پالائو + پاراگوئه + قطر + اقیانوسیهٔ دوردست + اتحادیهٔ اروپا + ریونیون + رومانی + صربستان + روسیه + رواندا + عربستان سعودی + جزایر سلیمان + سیشل + سودان + سوئد + سنگاپور + سنت هلن + اسلوونی + اسوالبارد و جان ماین + اسلواکی + سیرالئون + سان مارینو + سنگال + سومالی + سورینام + سائو تومه و پرینسیپه + السالوادور + سوریه + سوازیلند + جزایر ترک و کایکوس + چاد + مستعمره‌های جنوبی فرانسه + توگو + تایلند + تاجیکستان + توکلائو + تیمور شرقی + ترکمنستان + تونس + تونگا + ترکیه + ترینیداد و توباگو + تووالو + تایوان + تانزانیا + اوکراین + اوگاندا + جزایر کوچک دورافتادهٔ ایالات متحده + ایالات متحدهٔ امریکا + اوروگوئه + ازبکستان + واتیکان + سنت وینسنت و گرنادین + ونزوئلا + جزایر ویرجین بریتانیا + جزایر ویرجین ایالات متحده + ویتنام + وانواتو + والیس و فیوتونا + ساموا + یمن + مایوت + افریقای جنوبی + زامبیا + زیمبابوه + ناحیهٔ نامشخص یا نامعتبر + + + رسم‌الخط سنتی آلمانی + رسم‌الخط آلمانی ۱۹۹۶ میلادی + ارمنی شرقی + کامپیوتری + رسم‌الخط تجدیدنظرشده + انگلیسی معیار اسکاتلند + + + تقویم + ترتیب‌بندی + واحد پول + + + ترتیب چینی سنتی Big5 + تقویم بودایی + تقویم چینی + ترتیب مستقیم + ترتیب چینی ساده‌شده GB2312 + تقویم میلادی + تقویم عبری + تقویم ملی هند + تقویم هجری قمری + تقویم هجری قمری مدنی + تقویم ژاپنی + تقویم هجری شمسی + ترتیب دفتر تلفن + تقویم جمهوری چین + ترتیب سنتی + + + امریکایی + متریک + + + زبان: {0} + خط: {0} + ناحیه: {0} + + + + + + + [َ ِ ُ ً ٍ ٌ ّ ْ ٔ آ ا ء أ ؤ ئ ب پ ت-ج چ ح-ز ژ س-غ ف ق ک گ ل-ن و ه ة ی] + [\u200C \u200D ٖ ٰ] + [a-z ﷼] + + + « + » + + + + + {0} تا {1} + + + + + + ژانویهٔ + فوریهٔ + مارس + آوریل + مهٔ + ژوئن + ژوئیهٔ + اوت + سپتامبر + اکتبر + نوامبر + دسامبر + + + ژانویهٔ + فوریهٔ + مارس + آوریل + مهٔ + ژوئن + ژوئیهٔ + اوت + سپتامبر + اکتبر + نوامبر + دسامبر + + + + + + + + ژ + ف + م + آ + م + ژ + ژ + ا + س + ا + ن + د + + + ژانویه + فوریه + مارس + آوریل + مه + ژوئن + ژوئیه + اوت + سپتامبر + اکتبر + نوامبر + دسامبر + + + + + + + یکشنبه + دوشنبه + سه‌شنبه + چهارشنبه + پنجشنبه + جمعه + شنبه + + + یکشنبه + دوشنبه + سه‌شنبه + چهارشنبه + پنجشنبه + جمعه + شنبه + + + + + ی + د + س + چ + پ + ج + ش + + + + + + + Q1 + Q2 + Q3 + Q4 + + + سه‌ماههٔ اول + سه‌ماههٔ دوم + سه‌ماههٔ سوم + سه‌ماههٔ چهارم + + + + + ۱ + ۲ + ۳ + ۴ + + + + قبل از ظهر + بعد از ظهر + + + قبل از میلاد + میلادی + + + ق.م. + م. + + + + + + + EEEE d MMMM yyyy GGGG + + + + + d MMMM yyyy + + + + + yyyy/M/d + + + + + yy/M/d + + + + + + + H:mm:ss (vvvv) + + + + + H:mm:ss (zzzz) + + + + + H:mm:ss + + + + + H:mm + + + + + + + {1}، ساعت {0} + + + + d MMMM yyyy GGGG + HH:mm (Z) + H:mm + L + E M/d + LLL + E d LLL + E d LLLL + d LLLL + d LLL + M/d + d + mm:ss + mm:ss + yyyy + yyyy/M + E yyyy/M/d + MMM yyyy + E d MMM yyyy + MMMM yyyy + yyyy Q + yyyy QQQ + Q yy + yyyy/M + MMMM yyyy + EEEE d MMMM yyyy + + + {1} {0} + + + {0} تا {1} + + M تا M + + + E M/d تا E M/d + E M/d تا E M/d + + + LLL تا LLL + + + E d LLL تا E d LLL + E d LLL تا E d LLL + + + LLLL تا LLLL + + + d LLL تا d LLL + d تا d LLL + + + M/d تا M/d + d تا M/d + + + d تا d + + + H تا H + H تا H + + + H:mm تا H:mm + H:mm تا H:mm + H:mm تا H:mm + + + H:mm تا H:mm (v) + H:mm تا H:mm (v) + H:mm تا H:mm (v) + + + H تا H (v) + H تا H (v) + + + yyyy تا yyyy + + + yyyy/M تا yyyy/M + yyyy/M تا yyyy/M + + + E yyyy/M/d تا E yyyy/M/d + E yyyy/M/d تا E yyyy/M/d + E yyyy/M/d تا E yyyy/M/d + + + LLL تا MMM yyyy + MMM yyyy تا MMM yyyy + + + E d LLL تا E d MMM yyyy + E d LLL تا E d MMM yyyy + E d MMM yyyy تا E d MMM yyyy + + + LLLL تا MMMM yyyy + MMMM yyyy تا MMMM yyyy + + + d LLL تا d MMM yyyy + d تا d MMM yyyy + d MMM yyyy تا d MMM yyyy + + + yyyy/M/d تا yyyy/M/d + yyyy/M/d تا yyyy/M/d + yyyy/M/d تا yyyy/M/d + + + + + + دوره + + + سال + + + ماه + + + هفته + + + روز + امروز + فردا + پس‌فردا + دیروز + پریروز + + + روز هفته + + + قبل/بعد از ظهر + + + ساعت + + + دقیقه + + + ثانیه + + + منطقهٔ زمانی + + + + + + + + تشری + حشوان + کسلو + طوت + شباط + آذار + واذار + نیسان + ایار + سیوان + تموز + آب + ایلول + + + ت + ح + ک + ط + ش + و + ن + ا + س + ت + آ + ا + + + تشری + حشوان + کسلو + طوت + شباط + آذار + واذار + نیسان + ایار + سیوان + تموز + آب + ایلول + + + + + آ + + + ت + ح + ک + ط + ش + آ + و + ن + ا + س + ت + آ + ا + + + تشری + حشوان + کسلو + طوت + شباط + آذار + واذار + نیسان + ایار + سیوان + تموز + آب + ایلول + + + + + + + + + محرم + صفر + ربیع الاول + ربیع الثانی + جمادی الاول + جمادی الثانی + رجب + شعبان + رمضان + شوال + ذیقعدهٔ + ذیحجهٔ + + + + + + + + م + ص + ر + ر + ج + ج + ر + ش + ر + ش + ذ + ذ + + + محرم + صفر + ربیع الاول + ربیع الثانی + جمادی الاول + جمادی الثانی + رجب + شعبان + رمضان + شوال + ذیقعده + ذیحجه + + + + قبل از ظهر + + + هجری قمری + + + ه‍. ق. + + + + + + + yyyy/M/d G + + + + + yy/M/d G + + + + + + بعد از ظهر + + + + + + فروردین + اردیبهشت + خرداد + تیر + مرداد + شهریور + مهر + آبان + آذر + دی + بهمن + اسفند + + + + + ف + ا + خ + ت + م + ش + م + آ + آ + د + ب + ا + + + فروردین + اردیبهشت + خرداد + تیر + مرداد + شهریور + مهر + آبان + آذر + دی + بهمن + اسفند + + + + قبل از ظهر + بعد از ظهر + + + هجری شمسی + + + ه‍. ش. + + + + + + EEEE d MMMM yyyy + + + + + d MMMM yyyy + + + + + yyyy/M/d + + + + + yy/M/d + + + + + + + +HH:mm;−HH:mm + GMT{0} + وقت {0} + {1} ({0}) + + نامشخص + + + آندورا + + + کابل + + + آنگویلا + + + روترا + + + پالمر + + + قطب جنوب + + + سی ووا + + + ماوسون + + + دیویس + + + ووستوک + + + کیسی + + + دومونت د اورویل + + + مک موردو + + + ریو گالگوس + + + مندوسا + + + سن خوان + + + اوشوایا + + + لاریوجا + + + سن لوئیس + + + کاتامارکا + + + خوخوئی + + + توکومن + + + کوردووا + + + بوئنوس‌آیرس + + + پرت + + + اوکلا + + + داروین + + + آدلاید + + + بروکن هیل + + + کوری + + + ملبورن + + + هوبارت + + + لیندمن + + + سیدنی + + + بریسبین + + + لردهاو + + + آروبا + + + باربادس + + + بحرین + + + برمودا + + + ایرونپه + + + ریو برانکو + + + پورتوولیو + + + بوئاویشتا + + + ماناوس + + + کویاوا + + + کمپو گرانده + + + بلم + + + آراگواینا + + + سائوپائولو + + + باهیا + + + فورتالزا + + + ماسیو + + + ریسایف + + + نورونیا + + + بلیز + + + داوسن + + + وایت‌هورس + + + اینوویک + + + ونکوور + + + داوسن کریک + + + یلونایف + + + ادمونتون + + + سوئیفت کورنت + + + خلیج کمبریج + + + رجاینا + + + وینیپگ + + + رسولوت + + + رینی‌ریور + + + خلیجک رنکین + + + کورال هاربر + + + ثاندر بی + + + نیپیگان + + + تورنتو + + + مونرئال + + + ایکلوئت + + + پانگنیرتونگ + + + مانکتون + + + هلیفکس + + + خلیج گوس + + + گلیس بی + + + بلنک-سابلن + + + سنت جان + + + کینشاسا + + + لوبومباشی + + + ایستر + + + سانتیاگو + + + کاشغر + + + ارومچی + + + چونگ کینگ + + + شانگهای + + + هاربین + + + کستا ریکا + + + کیپ ورد + + + دجیبوتی + + + دمونیکا + + + گالاپاگوس + + + گوایاکیل + + + قناری + + + سئوتا + + + مادرید + + + فیجی + + + تراک + + + پناپه + + + کوساره + + + گرینادا + + + جبل الطارق + + + تول + + + گودهوب + + + اسکورسبیساند + + + دانمارک شاون + + + گوادلوپ + + + گواتمالا + + + گوام + + + گویانا + + + هونگ کنگ + + + جاکارتا + + + پونتیاناک + + + ماکاسار + + + جیاپورا + + + تهران + + + جامایکا + + + اندربری + + + کریتیماتی + + + تاراوا + + + کویت + + + آکتا + + + اورال + + + آکتوبه + + + کویزیلوردا + + + آلماتی + + + لاکسمبورگ + + + موناکو + + + کواجالین + + + ماجورو + + + هود + + + اولان باتار + + + چیو بال سان + + + مکاو + + + مارتینیکو + + + منتسرات + + + مالتا + + + ماوریتیوس + + + مالدیو + + + تی جوانا + + + ارموسیو + + + ماساتلان + + + چیئوائوا + + + مونترئی + + + مکزیکوسیتی + + + مریدا + + + کانکون + + + کوچینگ + + + ناورو + + + نیوه + + + چاتام + + + پاناما + + + تاهیتی + + + مارکوس + + + گامبیر + + + پیتکیرن + + + پورتو ریکو + + + آزورس + + + مادریا + + + لیسبون + + + پالاو + + + قطر + + + ریونیون + + + کالینینگراد + + + مسکو + + + ولگاگراد + + + سامارا + + + یکاترینبرگ + + + اومسک + + + نووسیبیریسک + + + کراسنویارسک + + + ایرکوتسک + + + یاکوتسک + + + ولادی‌وستوک + + + ساخالین + + + مگادن + + + کامچاتکا + + + آنادیر + + + سنگاپور + + + ال سالوادر + + + اوژگورود + + + کیف + + + سیمفروپل + + + زاپوروژی + + + میدوی + + + جانستون + + + ویک + + + ایدک + + + نوم + + + هونولولو + + + انکریج + + + یاکوتات + + + جونو + + + لوس‌آنجلس + + + بویسی + + + فینکس + + + شیپراک + + + دنور + + + سالم جدید، داکوتای شمالی + + + سنتر، داکوتای شمالی + + + شیکاگو + + + منامینی + + + وینسنس ایندیانا + + + پترزبرگ + + + تل‌سیتی، ایندیانا + + + ناکس + + + ویناماک ایندیانا + + + مارنگو + + + ایندیاناپولیس + + + لوئیزویل + + + ویوی + + + مانتیسلو + + + دترویت + + + نیویورک + + + سمرقند + + + تاشکند + + + مایوته + + + + وقت افغانستان + وقت افغانستان + وقت تابستانی افغانستان + + false + + + + وقت مرکز افریقا + + + + + وقت شرق افریقا + + + + + وقت جنوب افریقا + وقت عادی جنوب افریقا + + + + + وقت غرب افریقا + وقت تابستانی غرب افریقا + + + + + وقت آلاسکا + وقت عادی آلاسکا + وقت تابستانی آلاسکا + + false + + + + وقت آلاسکا‐هاوائی + وقت عادی آلاسکا‐هاوائی + وقت تابستانی آلاسکا‐هاوائی + + + + + وقت آمازون + وقت تابستانی آمازون + + + + + وقت مرکز امریکا + وقت عادی مرکز امریکا + وقت تابستانی مرکز امریکا + + false + + + + وقت شرق امریکا + وقت عادی شرق امریکا + وقت تابستانی شرق امریکا + + false + + + + وقت کوهستانی امریکا + وقت عادی کوهستانی امریکا + وقت تابستانی کوهستانی امریکا + + false + + + + وقت غرب امریکا + وقت عادی غرب امریکا + وقت تابستانی غرب امریکا + + false + + + + وقت عربستان + وقت عادی عربستان + وقت تابستانی عربستان + + + + + وقت آرژانتین + وقت تابستانی آرژانتین + + + + + وقت غرب آرژانتین + + + + + وقت ارمنستان + وقت تابستانی ارمنستان + + + + + وقت عشق‌آباد + وقت تابستانی عشق‌آباد + + + + + وقت آتلانتیک + وقت عادی آتلانتیک + وقت تابستانی آتلانتیک + + false + + + + وقت مرکز استرالیا + وقت عادی مرکز استرالیا + وقت تابستانی مرکز استرالیا + + + + + وقت شرق استرالیا + وقت عادی شرق استرالیا + وقت تابستانی شرق استرالیا + + + + + وقت غرب استرالیا + وقت عادی غرب استرالیا + وقت تابستانی غرب استرالیا + + + + + وقت جمهوری آذربایجان + وقت تابستانی جمهوری آذربایجان + + + + + وقت باکو + وقت تابستانی باکو + + + + + وقت بنگلادش + + + + + وقت برینگ + وقت عادی برینگ + وقت تابستانی برینگ + + + + + وقت بوتان + + + + + وقت بولیوی + + + + + وقت برازیلیا + وقت تابستانی برازیلیا + + + + + وقت کیپ ورد + وقت تابستانی کیپ ورد + + + + + وقت شیلی + وقت تابستانی شیلی + + + + + وقت چین + وقت عادی چین + وقت تابستانی چین + + + + + وقت جزیرهٔ کریسمس + + + + + وقت جزایر کوکوس + + + + + وقت کلمبیا + وقت تابستانی کلمبیا + + + + + وقت جزایر کوک + + + + + وقت کوبا + وقت عادی کوبا + وقت تابستانی کوبا + + + + + وقت دیویس + + + + + وقت دوشنبه + وقت تابستانی دوشنبه + + + + + وقت گویان هلند + + + + + وقت تیمور شرقی + + + + + وقت جزیرهٔ ایستر + وقت تابستانی جزیرهٔ ایستر + + + + + وقت اکوادور + + + + + وقت مرکز اروپا + وقت تابستانی مرکز اروپا + + + + + وقت شرق اروپا + وقت تابستانی شرق اروپا + + + + + وقت غرب اروپا + وقت تابستانی غرب اروپا + + + + + وقت جزایر فالکلند + وقت تابستانی جزایر فالکلند + + + + + وقت فیجی + وقت تابستانی فیجی + + + + + وقت گویان فرانسه + + + + + وقت گرینویچ + + + + + وقت گالاپاگوس + + + + + وقت گرجستان + وقت تابستانی گرجستان + + + + + وقت مرکز گروئنلند + وقت تابستانی مرکز گروئنلند + + + + + وقت شرق گروئنلند + وقت تابستانی شرق گروئنلند + + + + + وقت غرب گروئنلند + وقت تابستانی غرب گروئنلند + + + + + وقت عادی گوام + + + + + وقت گویان + + + + false + + + + وقت هنگ‌کنگ + وقت تابستانی هنگ‌کنگ + + + + + وقت عادی هند + + + + + وقت اقیانوس هند + + + + + وقت هندوچین + + + + + وقت مرکز اندونزی + + + + + وقت شرق اندونزی + + + + + وقت غرب اندونزی + + + + + وقت ایران + وقت عادی ایران + وقت تابستانی ایران + + + + + وقت ایرکوتسک + وقت تابستانی ایرکوتسک + + + + + وقت اسرائیل + وقت عادی اسرائیل + وقت تابستانی اسرائیل + + + + + وقت ژاپن + وقت عادی ژاپن + وقت تابستانی ژاپن + + + + + وقت کراچی + + + + + وقت کاشغر + + + + + وقت شرق قزاقستان + وقت عادی شرق قزاقستان + + + + + وقت غرب قزاقستان + وقت عادی غرب قزاقستان + + + + + وقت کره + وقت عادی کره + وقت تابستانی کره + + + + false + + + + وقت قرقیزستان + + + + + وقت لانکا + + + + + وقت ماکائو + وقت تابستانی ماکائو + + + + + وقت مالزی + + + + + وقت مالدیو + + + + + وقت جزایر مارشال + + + + + وقت مسکو + وقت عادی مسکو + وقت تابستانی مسکو + + false + + + + وقت میانمار + + + + + وقت نائورو + + + + + وقت نپال + + + + + وقت زلاند نو + وقت عادی زلاند نو + وقت تابستانی زلاند نو + + + + + وقت جزایر ماریانای شمالی + + + + + وقت پاکستان + وقت تابستانی پاکستان + + + + + وقت پالائو + + + + + وقت پاپوا گینهٔ نو + + + + + وقت پاراگوئه + وقت تابستانی پاراگوئه + + + + + وقت پرو + وقت تابستانی پرو + + + + + وقت فیلیپین + وقت تابستانی فیلیپین + + + + false + + + + وقت سمرقند + وقت تابستانی سمرقند + + + + + وقت عادی ساموا + + + + + وقت سیشل + + + + + وقت عادی سنگاپور + + + + + وقت جزایر سلیمان + + + + + وقت جورجیای جنوبی + + + + + وقت سورینام + + + + + وقت تاهیتی + + + + + وقت تاجیکستان + + + + + وقت تاشکند + وقت تابستانی تاشکند + + + + + وقت تفلیس + وقت تابستانی تفلیس + + + + + وقت تونگا + وقت تابستانی تونگا + + + + + وقت ترکیه + وقت تابستانی ترکیه + + false + + + + وقت ترکمنستان + وقت تابستانی ترکمنستان + + + + + وقت تووالو + + + + + وقت اروگوئه + وقت تابستانی اروگوئه + + + + + وقت ارومچی + + + + + وقت ازبکستان + وقت تابستانی ازبکستان + + + + + وقت واناتو + وقت تابستانی واناتو + + + + + وقت ونزوئلا + + + + false + + + + وقت جزیرهٔ ویک + + + + + وقت یاکوتسک + وقت تابستانی یاکوتسک + + + + + وقت ایروان + وقت تابستانی ایروان + + + + + + + ٫ + ٬ + ؛ + ٪ + ۰ + # + + + + ×۱۰^ + + + NaN + + + + + #,##0.###;'‪'-#,##0.###'‬' + + + + + + + #E0 + + + + + + + '‪'%#,##0'‬' + + + + + + + #,##0.00 ¤;'‪'-#,##0.00'‬' ¤ + + + {0} {1} + + + + درهم امارات متحدهٔ عربی + + + افغانی قدیم + + + افغانی + + + لک آلبانی + + + درم ارمنستان + + + پزوی آرژانتین (۱۹۸۳ تا ۱۹۸۵)‏ + + + پزوی آرژانتین + + + شیلینگ اتریش + + + دلار استرالیا + + + منات قدیم جمهوری آذربایجان + + + منات جمهوری آذربایجان + + + دینار بوسنی و هرزگوین + + + دلار باربادوس + + + فرانک بلژیک + + + دینار بحرین + + + فرانک بوروندی + + + دلار برمودا + + + دلار برونئی + + + پزوی بولیوی + + + رئال برزیل + + + دلار باهاما + + + روبل بیلوروسی + + + دلار بلیز + + + دلار کانادا + + + فرانک سوئیس + + + پزوی شیلی + + + یوآن چین + + + پزوی کلمبیا + + + دینار قدیم صربستان + + + پزوی کوبا + + + مارک آلمان + + + فرانک جیبوتی + + + کرون دانمارک + + + پزوی دومینیکا + + + دینار الجزایر + + + یورو + + + دلار فیجی + + + فرانک فرانسه + + + پوند بریتانیا + + + فرانک گینه + + + دراخمای یونان + + + پزوی گینهٔ بیسائو + + + دلار گویان + + + دلار هنگ‌کنگ + + + دینار کرواسی + + + فورینت مجارستان + + + روپیهٔ اندونزی + + + پوند ایرلند + + + روپیهٔ هند + + + دینار عراق + + + ریال ایران + + + + لیرهٔ ایتالیا + + + دلار جامائیکا + + + دینار اردن + + + ین ژاپن + + + شیلینگ کنیا + + + فرانک کومورو + + + دینار کویت + + + دلار جزایر کِیمن + + + روپیهٔ سری‌لانکا + + + دلار لیبریا + + + فرانک لوکزامبورگ + + + روبل لتونی + + + دینار لیبی + + + درهم مراکش + + + فرانک مراکش + + + فرانک ماداگاسکار + + + فرانک مالی + + + لیرهٔ مالت + + + پوند مالت + + + پزوی مکزیک + + + دلار نامیبیا + + + گیلدر هلند + + + کرون نروژ + + + روپیهٔ نپال + + + دلار زلاند نو + + + ریال عمان + + + پزوی فیلیپین + + + روپیهٔ پاکستان + + + زواتی لهستان + + + ریال قطر + + + دلار رودزیا + + + دینار صربستان + + + روبل روسیه + + + روبل قدیم روسیه + + + فرانک رواندا + + + ریال سعودی + + + دلار جزایر سلیمان + + + دینار قدیم سودان + + + کرون سوئد + + + دلار سنگاپور + + + دلار سورینام + + + گیلدر سورینام + + + روبل شوروی + + + لیرهٔ سوریه + + + بات تایلند + + + روبل تاجیکستان + + + سامانی تاجیکستان + + + منات ترکمنستان + + + دینار تونس + + + لیرهٔ قدیم ترکیه + + + لیرهٔ ترکیه + + + دلار ترینیداد و توباگو + + + دلار جدید تایوان + + + شیلینگ تانزانیا + + + شیلینگ قدیم اوگاندا + + + شیلینگ اوگاندا + + + دلار امریکا + + + سوم ازبکستان + + + نقره + + + طلا + + + دلار شرق کارائیب + + + فرانک طلای فرانسه + + + پالادیم + + + پلاتین + + + ارز نامشخص یا نامعتبر + + + دینار یمن + + + ریال یمن + + + راند افریقای جنوبی + + + دلار زیمبابوه + + + + + + {0} روز + + + {0} ساعت + + + {0} دقیقه + + + {0} ماه + + + {0} ثانیه + + + {0} هفته + + + {0} سال + + + + + بله:ب:آری:آ:y:yes + نه:ن:خیر:خ:n:no + + + diff --git a/libs/Zend/Locale/Data/fa_AF.xml b/libs/Zend/Locale/Data/fa_AF.xml new file mode 100644 index 0000000..750323e --- /dev/null +++ b/libs/Zend/Locale/Data/fa_AF.xml @@ -0,0 +1,304 @@ + + + + + + + + + + + + هسپانوی + دری + فنلندی + آیرلندی + کروشیایی + اندونیزیایی + آیسلندی + ایتالوی + جاپانی + کوریایی + قرغزی + مغلی + نیپالی + هالندی + نارویژی + پولندی + پرتگالی + سویدنی + تاجکی + + + + + + اندورا + امارات متحدهٔ عربی + انتیگوا و باربودا + البانیا + انگولا + ارجنتاین + آسترالیا + بوسنیا و هرزه‌گوینا + بنگله‌دیش + بلجیم + بلغاریا + برونی + بولیویا + برازیل + بهاماس + روسیهٔ سفید + جمهوری دموکراتیک کانگو + افریقای مرکزی + کانگو + سویس + چلی + کولمبیا + کاستریکا + کیوبا + دنمارک + اکوادور + استونیا + اریتریا + هسپانیه + ایتوپیا + فنلند + میکرونزیا + گرینادا + گینیا + گینیا استوایی + گواتیمالا + گینیا بیسائو + گیانا + هاندوراس + کروشیا + هایتی + اندونیزیا + آیرلند + آیسلند + جاپان + کینیا + قرغزستان + کمپوچیا + کومور + سنت کیتس و نیویس + کوریای شمالی + کوریای جنوبی + سریلانکا + لیسوتو + لتوانیا + لاتویا + لیبیا + مادغاسکر + منگولیا + موریتانیا + مالتا + مکسیکو + مالیزیا + موزمبیق + نیجریا + نیکاراگوا + هالند + ناروی + نیپال + زیلاند جدید + پانامه + پیرو + پاپوا نیو گینیا + پولند + پرتگال + پاراگوای + رومانیا + روآندا + جزایر سلومون + سویدن + سینگاپور + سلونیا + سلواکیا + سیرالیون + سینیگال + سومالیه + سائو تومه و پرینسیپ + السلوادور + تاجکستان + اکراین + ایالات متحدهٔ امریکا + یوروگوای + سنت وینسنت و گرینادین + ونزویلا + ساموآ + زیمبابوی + + + + [ٖ ٰ \u200C \u200D ټ ځ څ ډ ړ ږ ښ ګ ڼ ي] + + + + + + + + جنو + مـی + جون + جول + دسم + + + جنوری + فبروری + مارچ + اپریل + می + جون + جولای + اگست + سپتمبر + اکتوبر + نومبر + دسمبر + + + + + ج + ف + م + ا + م + ج + ج + ا + س + ا + ن + د + + + + + + + + + حمل + ثور + جوزا + سرطان + اسد + سنبلهٔ + میزان + عقرب + قوس + جدی + دلو + حوت + + + + + ح + ث + ج + س + ا + س + ع + ق + ج + د + ح + + + حمل + ثور + جوزا + سرطان + اسد + سنبله + میزان + عقرب + قوس + جدی + دلو + حوت + + + + + + هجری شمسی + + + ه‍. ش. + + + + + + + + ٫ + ٬ + ٪ + ۰ + + + + + + '‪'#,##0%'‬' + + + + + + ؋ + + + دالر آسترالیا + + + دالر برونی + + + روبل روسیهٔ سفید + + + دالر کانادا + + + فرانک سویس + + + کرون دنمارک + + + ین جاپان + + + پزوی مکسیکو + + + گیلدر هالند + + + کرون ناروی + + + کرون سویدن + + + دالر سینگاپور + + + سامانی تاجکستان + + + دالر امریکا + + + + diff --git a/libs/Zend/Locale/Data/fa_IR.xml b/libs/Zend/Locale/Data/fa_IR.xml new file mode 100644 index 0000000..793eeb6 --- /dev/null +++ b/libs/Zend/Locale/Data/fa_IR.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/fi.xml b/libs/Zend/Locale/Data/fi.xml new file mode 100644 index 0000000..d710ae7 --- /dev/null +++ b/libs/Zend/Locale/Data/fi.xml @@ -0,0 +1,3424 @@ + + + + + + + + + + + {0} ({1}) + , + + + afar + abhaasi + aceh + atšoli + adangme + adyge + avesta + afrikaans + afro-aasialainen kieli + afrihili + ainu + akan + akkadi + aleutti + algonkin-kieli + altai + amhara + aragonia + muinaisenglanti + angika + apaššikieli + arabia + aramea + araukaani + arapaho + keinotekoinen kieli + arawak + assami + asturia + athabasca-kieli + australialainen kieli + avaari + awadhi + aimara + azeri + baškiiri + banda + bamileke-kieli + belutši + bali + basa + balttilainen kieli + valkovenäjä + bedža + bemba + berberikieli + bulgaria + bihari + bhodžpuri + bislama + bikol + bini + mustajalka + bambara + bengali + bantukieli + tiibet + bretoni + bradž + bosnia + batak + burjaatti + bugi + bilin + katalaani + caddo + keskiamerikkalainen intiaanikieli + karibi + kaukasialainen kieli + atsam + tšetšeeni + cebuano + kelttiläinen kieli + tšamorro + tšibtša + tšagatai + chuuk + mari + chinook-jargon + choctaw + chipewyan + cherokee + cheyenne + tšam-kieli + korsika + kopti + englantiin perustuva kreoli- tai pidgin-kieli + ranskaan perustuva kreoli- tai pidgin-kieli + portugaliin perustuva kreoli- tai pidgin-kieli + cree + krimintataari + kreoli- tai pidgin-kieli + tšekki + kašubi + kirkkoslaavi + kuušilainen kieli + tšuvassi + kymri + tanska + dakota + dargi + dajakki + saksa + itävallansaksa + sveitsinyläsaksa + delaware + slevi + dogrib + dinka + dogri + dravidakieli + alasorbi + duala + keskihollanti + divehi + djula + dzongkha + ewe + efik + muinaisegypti + ekajuk + kreikka + elami + englanti + australianenglanti + kanadanenglanti + britannianenglanti + amerikanenglanti + keskienglanti + esperanto + espanja + amerikanespanja + espanjanespanja + viro + baski + ewondo + farsi + fang + fanti + fulani + suomi + filipino + suomalais-ugrilainen kieli + fidži + fääri + fon + ranska + kanadanranska + sveitsinranska + keskiranska + muinaisranska + pohjoisfriisi + itäfriisi + friuli + länsifriisi + iiri + ga + gajo + gbaja + gaeli + germaaninen kieli + ge’ez + kiribati + galicia + keskiyläsaksa + guarani + muinaisyläsaksa + gondi + gorontalo + gootti + grebo + muinaiskreikka + sveitsinsaksa + gudžarati + manx + gwitšin + hausa + haida + havaiji + heprea + hindi + hiligaino + himatšali + heetti + hmong + hiri-motu + kroatia + yläsorbi + haiti + unkari + hupa + armenia + herero + interlingua + iban + indonesia + interlingue + igbo + sichuanin-yi + idžo + inupiatun + iloko + indoarjalainen kieli + indoeurooppalainen kieli + inguuši + ido + iranilainen kieli + irokeesikieli + islanti + italia + inuktitut + japani + lojban + juutalaispersia + juutalaisarabia + jaava + georgia + karakalpakki + kabyyli + kachin + jju + kamba + karen + kavi + kabardi + tyap + norsunluurannikonkoro + kongo + khasi + khoisan-kieli + khotani + kikuju + kuanjama + kazakki + kalaallisut + khmer + kimbundu + kannada + korea + konkani + kosrae + kpelle + kanuri + karatšai-balkaari + karjala + kru-kieli + kurukh + kašmiri + kurdi + kumykki + kutenai + komi + korni + kirgiisi + latina + ladino + lahnda + lamba + luxemburg + lezgi + ganda + limburg + lingala + lao + mongo + lozi + liettua + katanganluba + luluanluba + luiseño + lunda + luo + lusai + latvia + madura + magahi + maithili + makassar + mandingo + austronesialainen kieli + maasai + mokša + mandar + mende + malagassi + keski-iiri + marshall + maori + micmac + minangkabau + luokittelematon kieli + makedonia + mon-khmer-kieli + malajalam + mongoli + mantšu + manipuri + manobo-kieli + moldavia + mohawk + mossi + marathi + malaiji + malta + monia kieliä + mundakieli + creek + mirandeesi + marwari + burma + maya-kieli + ersä + nauru + nahuatl + pohjoisamerikkalainen intiaanikieli + napoli + norjan bokmål + pohjois-ndebele + alasaksa + nepali + newari + ndonga + nias + nigeriläis-kongolainen kieli + niue + hollanti + flaami + norjan nynorsk + norja + nogai + muinaisnorja + n’ko + etelä-ndebele + pohjoissotho + nubialainen kieli + navajo + klassinen newari + njandža + nyamwezi + nyankole + nyoro + nzima + oksitaani + odžibwa + oromo + orija + osseetti + osage + osmani + otomi-kieli + pandžabi + papualaiskieli + pangasinan + pahlavi + pampanga + papiamentu + palau + muinaispersia + filippiiniläinen kieli + foinikia + paali + puola + pohnpei + prakrit-kieli + muinaisprovensaali + paštu + portugali + brasilianportugali + portugalinportugali + ketšua + radžastani + rapanui + rarotonga + retoromaani + rundi + romania + romaaninen kieli + romani + juuri + venäjä + aromania + ruanda + sanskrit + sandawe + jakuutti + eteläamerikkalainen intiaanikieli + sališilainen kieli + samarianaramea + sasak + santali + sardi + sisilia + skotti + sindhi + pohjoissaame + selkuppi + seemiläinen kieli + sango + muinaisiiri + viittomakieli + serbokroaatti + shan + sinhali + sidamo + sioux-kieli + sinotiibetiläinen kieli + slovakki + sloveeni + slaavilainen kieli + samoa + eteläsaame + saamelaiskieli + luulajansaame + inarinsaame + koltansaame + šona + soninke + somali + sogdi + songhai + albania + serbia + sranan + serer + swazi + niililäis-saharalainen kieli + eteläsotho + sunda + sukuma + susu + sumeri + ruotsi + swahili + muinaissyyria + syyria + tamil + thaikieli + telugu + temne + tereno + tetum + tadžikki + thai + tigrinja + tigre + tiv + turkmeeni + tokelau + tagalog + klingon + tlingit + tamašek + tswana + tongantonga + malawintonga + tok-pisin + turkki + tsonga + tsimši + tataari + tumbuka + tupi-kieli + altailainen kieli + tuvalu + twi + tahiti + tuva + udmurtti + uiguuri + ugarit + ukraina + umbundu + määrittämätön + urdu + uzbekki + vai + venda + vietnam + volapük + vatja + valloni + wakash-kieli + walamo + waray + washo + sorbin kieli + wolof + kalmukki + xhosa + jao + japi + jiddiš + joruba + jupikkikieli + zhuang + sapoteekki + blisskieli + zenaga + kiina + yksinkertaistettu kiina + perinteinen kiina + zande + zulu + zuni + ei kielellistä sisältöä + zaza + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + maailma + Afrikka + Pohjois-Amerikka + Etelä-Amerikka + Oseania + Länsi-Afrikka + Väli-Amerikka + Itä-Afrikka + Pohjois-Afrikka + Keski-Afrikka + eteläinen Afrikka + Amerikka + pohjoinen Amerikka + Karibia + Itä-Aasia + Etelä-Aasia + Kaakkois-Aasia + Etelä-Eurooppa + Australia ja Uusi-Seelanti + Melanesia + Mikronesia + Polynesia + Etelä- ja Keski-Aasia + Aasia + Keski-Aasia + Länsi-Aasia + Eurooppa + Itä-Eurooppa + Pohjois-Eurooppa + Länsi-Eurooppa + Itsenäisten valtioiden yhteisö + Latinalainen Amerikka ja Karibia + Kanaalisaaret + Andorra + Arabiemiirikunnat + Afganistan + Antigua ja Barbuda + Anguilla + Albania + Armenia + Alankomaiden Antillit + Angola + Antarktis + Argentiina + Amerikan Samoa + Itävalta + Australia + Aruba + Ahvenanmaa + Azerbaidžan + Bosnia ja Hertsegovina + Barbados + Bangladesh + Belgia + Burkina Faso + Bulgaria + Bahrain + Burundi + Benin + Saint-Barthélemy + Bermuda + Brunei + Bolivia + Brasilia + Bahama + Bhutan + Bouvet’nsaari + Botswana + Valko-Venäjä + Belize + Kanada + Kookossaaret + Kongo-Kinshasa + Keski-Afrikan tasavalta + Kongo-Brazzaville + Sveitsi + Norsunluurannikko + Cookinsaaret + Chile + Kamerun + Kiina + Kolumbia + Costa Rica + Serbia ja Montenegro + Kuuba + Kap Verde + Joulusaari + Kypros + Tšekki + Saksa + Djibouti + Tanska + Dominica + Dominikaaninen tasavalta + Algeria + Ecuador + Viro + Egypti + Länsi-Sahara + Eritrea + Espanja + Etiopia + Suomi + Fidži + Falklandinsaaret + Mikronesian liittovaltio + Färsaaret + Ranska + Gabon + Britannia + Grenada + Georgia + Ranskan Guayana + Guernsey + Ghana + Gibraltar + Grönlanti + Gambia + Guinea + Guadeloupe + Päiväntasaajan Guinea + Kreikka + Etelä-Georgia ja Eteläiset Sandwichsaaret + Guatemala + Guam + Guinea-Bissau + Guyana + Hongkong + Heard- ja McDonaldinsaaret + Honduras + Kroatia + Haiti + Unkari + Indonesia + Irlanti + Israel + Mansaari + Intia + Brittiläinen Intian valtameren alue + Irak + Iran + Islanti + Italia + Jersey + Jamaika + Jordania + Japani + Kenia + Kirgisia + Kambodža + Kiribati + Komorit + Saint Kitts ja Nevis + Pohjois-Korea + Etelä-Korea + Kuwait + Caymansaaret + Kazakstan + Laos + Libanon + Saint Lucia + Liechtenstein + Sri Lanka + Liberia + Lesotho + Liettua + Luxemburg + Latvia + Libya + Marokko + Monaco + Moldova + Montenegro + Saint-Martin + Madagaskar + Marshallinsaaret + Makedonia + Mali + Myanmar + Mongolia + Macao + Pohjois-Mariaanit + Martinique + Mauritania + Montserrat + Malta + Mauritius + Malediivit + Malawi + Meksiko + Malesia + Mosambik + Namibia + Uusi-Kaledonia + Niger + Norfolkinsaari + Nigeria + Nicaragua + Alankomaat + Norja + Nepal + Nauru + Niue + Uusi-Seelanti + Oman + Panama + Peru + Ranskan Polynesia + Papua-Uusi-Guinea + Filippiinit + Pakistan + Puola + Saint-Pierre ja Miquelon + Pitcairn + Puerto Rico + Palestiina + Portugali + Palau + Paraguay + Qatar + ulkomeri + Euroopan unioni + Réunion + Romania + Serbia + Venäjä + Ruanda + Saudi-Arabia + Salomonsaaret + Seychellit + Sudan + Ruotsi + Singapore + Saint Helena + Slovenia + Huippuvuoret ja Jan Mayen + Slovakia + Sierra Leone + San Marino + Senegal + Somalia + Surinam + São Tomé ja Príncipe + El Salvador + Syyria + Swazimaa + Turks- ja Caicossaaret + Tšad + Ranskan ulkopuoliset eteläiset alueet + Togo + Thaimaa + Tadžikistan + Tokelau + Itä-Timor + Turkmenistan + Tunisia + Tonga + Turkki + Trinidad ja Tobago + Tuvalu + Taiwan + Tansania + Ukraina + Uganda + Yhdysvaltain pienet erillissaaret + Yhdysvallat + Uruguay + Uzbekistan + Vatikaani + Saint Vincent ja Grenadiinit + Venezuela + Brittiläiset Neitsytsaaret + Yhdysvaltain Neitsytsaaret + Vietnam + Vanuatu + Wallis ja Futuna + Samoa + Jemen + Mayotte + Etelä-Afrikka + Sambia + Zimbabwe + tuntematon tai virheellinen alue + + + saksan perinteinen oikeinkirjoitus + sloveenin resian murteen yhdenmukaistettu oikeinkirjoitus + saksan uusi oikeinkirjoitus + myöhäiskeskiranska + varhaisnykyranska + itäarmenialainen + länsiarmenialainen + yhtenäistetty turkkilainen latinalainen aakkosto + sloveenin resian San Giorgion/Bilan alamurre + englannin boontling-murre + kansainvälinen foneettinen aakkosto IPA + uralilainen foneettinen aakkosto UPA + sloveenin resian Lipovazin/Lipovecin alamurre + monotoninen kreikka + sloveenin natisonen murre + sloveenin resian Gnivan/Njivan alamurre + sloveenin resian Oseaccon/Osojanen alamurre + polytoninen kreikka + tietokonemäärittely POSIX + uudistettu oikeinkirjoitus + sloveenin resian murre + afarin saho-murre + skotlanninenglanti + englannin scouse-murre + sloveenin resian Stolvizzan/Solbican alamurre + valkovenäjän taraškevitsa-oikeinkirjoitus + katalaanin valencian murre + + + kalenteri + lajittelu + valuutta + + + perinteinen kiinalainen järjestys Big5 + buddhalainen kalenteri + kiinalainen kalenteri + suora järjestys + yksinkertaistettu kiinalainen järjestys GB2312 + gregoriaaninen kalenteri + juutalainen kalenteri + intialainen kalenteri + islamilainen kalenteri + islamilainen siviilikalenteri + japanilainen kalenteri + puhelinluettelojärjestys + pinyin-järjestys + kiinan tasavallan kalenteri 1912–1949 + piirtojärjestys + perinteinen järjestys + + + amerikkalainen + metrinen + + + kieli: {0} + kirjoitusjärjestelmä: {0} + alue: {0} + + + + [a-s š t-z ž å ä ö] + [á à â ã č ç đ é è ë ǧ ǥ ȟ í ï ǩ ń ñ ŋ ô õ œ ř ŧ ú ü ʒ ǯ æ ø] + [a-z] + + + + + + + + + GanjkHmsSEDFwWxhKzAeugXZvcL + {0}–{1} + + + + + + tammi + helmi + maalis + huhti + touko + kesä + heinä + elo + syys + loka + marras + joulu + + + tammikuuta + helmikuuta + maaliskuuta + huhtikuuta + toukokuuta + kesäkuuta + heinäkuuta + elokuuta + syyskuuta + lokakuuta + marraskuuta + joulukuuta + + + + + T + H + M + H + T + K + H + E + S + L + M + J + + + + + + + su + ma + ti + ke + to + pe + la + + + sunnuntaina + maanantaina + tiistaina + keskiviikkona + torstaina + perjantaina + lauantaina + + + + + S + M + T + K + T + P + L + + + + + + + 1. nelj. + 2. nelj. + 3. nelj. + 4. nelj. + + + 1. neljännes + 2. neljännes + 3. neljännes + 4. neljännes + + + + + 1 + 2 + 3 + 4 + + + + ap. + ip. + + + ennen Kristuksen syntymää + jälkeen Kristuksen syntymän + + + eKr. + jKr. + + + + + + EEEE d. MMMM yyyy + + + + + d. MMMM yyyy + + + + + d.M.yyyy + + + + + d.M.yyyy + + + + + + + H.mm.ss v + + + + + H.mm.ss z + + + + + H.mm.ss + + + + + H.mm + + + + + + + {1} {0} + + + + HH.mm + HH.mm.ss + H.mm + L + E d.M. + LLL + E d. MMM + E d. MMMM + d. MMMM + d. MMM + d.M. + d + mm.ss + mm.ss + yyyy + L.yyyy + EEE d.M.yyyy + LLL yyyy + EEE d. MMM yyyy + LLLL yyyy + Q/yyyy + QQQ yyyy + M/yy + MMM yy + Q/yy + M/yyyy + EEE d.M.yyyy + LLLL yyyy + QQQQ yyyy + + + {0}–{1} + + L.–L. + + + E d.M. – E d.M. + E d. – E d.M + + + LLL–LLLL + + + E d. MMMM – E d. MMMM + E d. – E d. MMMM + + + LLL–LLLL + + + d. MMMM – d. MMMM + d.–d. MMMM + + + d.M.–d.M. + d.–““d.M. + + + d.–d. + + + H–H + H–H + + + H.mm–H.mm + H.mm–H.mm + H.mm–H.mm + + + H.mm–H.mm v + H.mm–H.mm v + H.mm–H.mm v + + + H–H v + H–H v + + + y–y + + + LLL–LLLL yyyy + LLLL yyyy – LLLL yyyy + + + E d.M.yyyy – E d.M.yyyy + E d.M.yyyy – E d.M.yyyy + E d.M.yyyy – E d.M.yyyy + + + LLL–LLLL yyyy + LLLL yyyy – LLLL yyyy + + + E d. MMMM – E d. MMMM yyyy + E d. – E d. MMMM yyyy + E d. MMMM yyyy – E d. MMMM yyyy + + + LLL–LLLL yyyy + LLLL yyyy – LLLL yyyy + + + d. MMMM – d. MMMM yyyy + d.–d. MMMM yyyy + d. MMMM yyyy – d. MMMM yyyy + + + d.M.–d.M.yyyy + d.–d.M.yyyy + d.M.yyyy–d.M.yyyy + + + + + + aikakausi + + + vuosi + + + kuukausi + + + viikko + + + päivä + tänään + huomenna + ylihuomenna + eilen + toissapäivänä + + + viikonpäivä + + + ap/ip + + + tunti + + + minuutti + + + sekunti + + + aikavyöhyke + + + + + + + + tišrí + hešván + kislév + tevét + ševát + adár + adár II + nisán + ijjár + siván + tammúz + ab + elúl + + + tišríkuu + hešvánkuu + kislévkuu + tevétkuu + ševátkuu + adárkuu + adárkuu II + nisánkuu + ijjárkuu + sivánkuu + tammúzkuu + abkuu + elúlkuu + + + + + + + + + muharram + safar + rabi’ al-awwal + rabi’ al-akhir + džumada-l-ula + džumada-l-akhira + radžab + ša’ban + ramadan + šawwal + dhu-l-qa’da + dhu-l-hiddža + + + + + + + + + + + + +H.mm;-H.mm + UTC{0} + {0} + {1} ({0}) + + tuntematon + + + Tirana + + + Jerevan + + + Etelänapa + + + Wien + + + Maarianhamina + + + Bryssel + + + São Paulo + + + St. Johns + + + Zürich + + + Pääsiäissaari + + + Havanna + + + Kap Verde + + + Joulu + + + Nikosia + + + Berliini + + + Kööpenhamina + + + Alger + + + Tallinna + + + Kairo + + + Kanariansaaret + + + Fidzi + + + Färsaaret + + + Pariisi + + + Lontoo + + + Qaanaaq + + + Nuuk + + + Ittoqqortoormiit + + + Ateena + + + Etelä-Georgia + + + Hongkong + + + Mansaari + + + Teheran + + + Rooma + + + Jamaika + + + Tokio + + + Komorit + + + Saint Kitts + + + Aqtöbe + + + Saint Lucia + + + Vilna + + + Luxemburg + + + Riika + + + Macao + + + Malediivit + + + Ciudad de México + + + Cancún + + + Niuesaari + + + Varsova + + + Azorit + + + Lissabon + + + Bukarest + + + Belgrad + + + Moskova + + + Jekaterinburg + + + Krasnojarsk + + + Jakutsk + + + Sahalin + + + Kamtšatka + + + Tukholma + + + San Salvador + + + Damaskos + + + Dušanbe + + + Užgorod + + + Kiova + + + Zaporižžja + + + keskinen Pohjois-Dakota + + + Taškent + + + Vatikaani + + + Saint Vincent + + + Saint Thomas + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + + Alaskan normaaliaika + Alaskan kesäaika + + false + + + false + + + false + + + false + + + + Yhdysvaltain keskinen normaaliaika + Yhdysvaltain keskinen kesäaika + + false + + + + Yhdysvaltain itäinen normaaliaika + Yhdysvaltain itäinen kesäaika + + false + + + + Kalliovuorten normaaliaika + Kalliovuorten kesäaika + + false + + + + Yhdysvaltain Tyynenmeren normaaliaika + Yhdysvaltain Tyynenmeren kesäaika + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + + Kanadan Atlantin normaaliaika + Kanadan Atlantin kesäaika + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + + Kiinan normaaliaika + Kiinan kesäaika + + + CST (Kiina) + CDT (Kiina) + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + + Keski-Euroopan normaaliaika + Keski-Euroopan kesäaika + + false + + + + Itä-Euroopan normaaliaika + Itä-Euroopan kesäaika + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + + Greenwichin normaaliaika + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + + Israelin normaaliaika + Israelin kesäaika + + + IST (Israel) + + false + + + + Japanin normaaliaika + Japanin kesäaika + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + + Newfoundlandin normaaliaika + Newfoundlandin kesäaika + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + + + + , +   + ; + % + 0 + # + + + - + E + + + epäluku + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0 % + + + + + + + #,##0.00 ¤ + + + {0} {1} + {0} {1} + + + + Andorran peseta + Andorran pesetaa + + + Arabiemiirikuntien dirhami + Arabiemiirikuntien dirhamia + + + Afganistanin afgaani (1927–2002) + Afganistanin afgaania (1927-2002) + + + Afganistanin afgaani + Afganistanin afgaania + + + Albanian lek + Albanian lekiä + + + Armenian dram + Armenian dramia + + + Alankomaiden Antillien guldeni + Alankomaiden Antillien guldenia + + + Angolan kwanza + Angolan kwanzaa + + + Angolan kwanza (1977–1990) + Angolan kwanzaa (1977–1990) + + + Angolan uusi kwanza (1990–2000) + Angolan uutta kwanzaa (1990–2000) + + + Angolan kwanza reajustado (1995–1999) + Angolan kwanza reajustadoa (1995–1999) + + + Argentiinan austral + Argentiinan australia + + + Argentiinan peso (1983–1985) + Argentiinan pesoa (1983–1985) + + + Argentiinan peso + Argentiinan pesoa + + + Itävallan šillinki + Itävallan šillinkiä + + + Australian dollari + Australian dollaria + + + Aruban guldeni + Aruban guldenia + + + Azerbaidžanin manat (1993–2006) + Azerbaidžanin manatia (1993–2006) + + + Azerbaidžanin manat + Azerbaidžanin manatia + + + Bosnia-Hertsegovinan dinaari + Bosnia-Hertsegovinan dinaaria + + + Bosnia-Hertsegovinan vaihdettava markka + Bosnia-Hertsegovinan vaihdettavaa markkaa + + + Barbadosin dollari + Barbadosin dollaria + + + Bangladeshin taka + Bangladeshin takaa + + + Belgian vaihdettava frangi + Belgian vaihdettavaa frangia + + + Belgian frangi + Belgian frangia + + + Belgian rahoitusfrangi + Belgian rahoitusfrangia + + + Bulgarian kova lev + Bulgarian kovaa levaa + + + Bulgarian uusi lev + Bulgarian uutta levaa + + + Bahrainin dinaari + Bahrainin dinaaria + + + Burundin frangi + Burundin frangia + + + Bermudan dollari + Bermudan dollaria + + + Brunein dollari + Brunein dollaria + + + Bolivian boliviano + Bolivian bolivianoa + + + Bolivian peso + Bolivian pesoa + + + Bolivian mvdol + Bolivian mvdol'ia + + + Brasilian uusi cruzeiro (1967–1986) + Brasilian uutta cruzeiroa (1967–1986) + + + Brasilian cruzado + Brasilian cruzadoa + + + Brasilian cruzeiro (1990–1993) + Brasilian cruzeiroa (1990–1993) + + + Brasilian real + Brasilian realia + BRL + + + Brasilian uusi cruzado + Brasilian uutta cruzadoa + + + Brasilian cruzeiro + Brasilian cruzeiroa + + + Bahaman dollari + Bahaman dollaria + + + Bhutanin ngultrum + Bhutanin ngultrumia + + + Burman kyat + Burman kyatia + + + Botswanan pula + Botswanan pulaa + + + Valko-Venäjän uusi rupla (1994–1999) + Valko-Venäjän uutta ruplaa (1994–1999) + + + Valko-Venäjän rupla + Valko-Venäjän ruplaa + + + Belizen dollari + Belizen dollaria + + + Kanadan dollari + Kanadan dollaria + + + Kongon frangi + Kongon frangia + + + Sveitsin WIR-euro + Sveitsin WIR-euroa + + + Sveitsin frangi + Sveitsin frangia + + + Sveitsin WIR-frangi + Sveitsin WIR-frangia + + + Chilen unidades de fomento + Chilen unidades de fomentoa + + + Chilen peso + Chilen pesoa + + + Kiinan yuan + Kiinan yuania + + + Kolumbian peso + Kolumbian pesoa + + + Kolumbian unidad de valor real + Kolumbian unidad de valor realia + + + Costa Rican colon + Costa Rican colonia + + + Serbian vanha dinaari + Serbian vanhaa dinaaria + + + Tšekkoslovakian kova koruna + Tšekkoslovakian kovaa korunaa + + + Kuuban peso + Kuuban pesoa + + + Kap Verden escudo + Kap Verden escudoa + + + Kyproksen punta + Kyproksen puntaa + + + Tšekin koruna + Tšekin korunaa + + + Itä-Saksan markka + Itä-Saksan markkaa + + + Saksan markka + Saksan markkaa + + + Djiboutin frangi + Djiboutin frangia + + + Tanskan kruunu + Tanskan kruunua + Tkr + + + Dominikaanisen tasavallan peso + Dominikaanisen tasavallan pesoa + + + Algerian dinaari + Algerian dinaaria + + + Ecuadorin sucre + Ecuadorin sucrea + + + Ecuadorin UVC + Ecuadorin UVC'ta + + + Viron kruunu + Viron kruunua + + + Egyptin punta + Egyptin puntaa + + + Päiväntasaajan Guinean ekwele (1986–1989) + Päiväntasaajan Guinean ekweleä (1986–1989) + + + Eritrean nakfa + Eritrean nakfaa + + + Espanjan peseta (A-tili) + Espanjan pesetaa (A-tili) + + + Espanjan peseta (vaihdettava tili) + Espanjan pesetaa (vaihdettava tili) + + + Espanjan peseta + Espanjan pesetaa + + + Etiopian birr + Etiopian birriä + + + euro + euroa + + + Suomen markka + Suomen markkaa + mk + + + Fidžin dollari + Fidžin dollaria + + + Falklandinsaarten punta + Falklandinsaarten puntaa + + + Ranskan frangi + Ranskan frangia + + + Englannin punta + Englannin puntaa + £ + + + Georgian kuponkilari + Georgian kuponkilaria + + + Georgian lari + Georgian laria + + + Ghanan cedi (1979–2007) + Ghanan cediä (1979–2007) + + + Ghanan cedi + Ghanan cediä + + + Gibraltarin punta + Gibraltarin puntaa + + + Gambian dalasi + Gambian dalasia + + + Guinean frangi + Guinean frangia + + + Guinean syli + Guinean syliä + + + Päiväntasaajan Guinean ekwele (–1986) + Päiväntasaajan Guinean ekweleä (–1986) + + + Kreikan drakma + Kreikan drakmaa + + + Guatemalan quetzal + Guatemalan quetzalia + + + Portugalin Guinean escudo + Portugalin Guinean escudoa + + + Guinea-Bissaun peso + Guinea-Bissaun pesoa + + + Guyanan dollari + Guyanan dollaria + + + Hongkongin dollari + Hongkongin dollaria + + + Hondurasin lempira + Hondurasin lempiraa + + + Kroatian dinaari + Kroatian dinaaria + + + Kroatian kuna + Kroatian kunaa + + + Haitin gourde + Haitin gourdea + + + Unkarin forintti + Unkarin forinttia + + + Indonesian rupia + Indonesian rupiaa + + + Irlannin punta + Irlannin puntaa + + + Israelin punta + Israelin puntaa + + + Israelin uusi sekeli + Israelin uutta sekeliä + + + Intian rupia + Intian rupiaa + INR + + + Irakin dinaari + Irakin dinaaria + + + Iranin rial + Iranin rialia + + + Islannin kruunu + Islannin kruunua + + + Italian liira + Italian liiraa + ITL + + + Jamaikan dollari + Jamaikan dollaria + + + Jordanian dinaari + Jordanian dinaaria + + + Japanin jeni + Japanin jeniä + ¥ + + + Kenian šillinki + Kenian šillinkiä + + + Kirgisian som + Kirgisian somia + + + Kambodžan riel + Kambodžan rieliä + + + Komorien frangi + Komorien frangia + + + Pohjois-Korean won + Pohjois-Korean wonia + + + Etelä-Korean won + Etelä-Korean wonia + + + Kuwaitin dinaari + Kuwaitin dinaaria + + + Caymansaarten dollari + Caymansaarten dollaria + + + Kazakstanin tenge + Kazakstanin tengeä + + + Laosin kip + Laosin kipiä + + + Libanonin punta + Libanonin puntaa + + + Sri Lankan rupia + Sri Lankan rupiaa + + + Liberian dollari + Liberian dollaria + + + Lesothon loti + Lesothon lotia + + + Lesothon maloti + Lesothon malotia + + + Liettuan liti + Liettuan litiä + + + Liettuan talonas + Liettuan talonasia + + + Luxemburgin vaihdettava frangi + Luxemburgin vaihdettavaa frangia + + + Luxemburgin frangi + Luxemburgin frangia + + + Luxemburgin rahoitusfrangi + Luxemburgin rahoitusfrangia + + + Latvian lati + Latvian latia + + + Latvian rupla + Latvian ruplaa + + + Libyan dinaari + Libyan dinaaria + + + Marokon dirhami + Marokon dirhamia + + + Marokon frangi + Marokon frangia + + + Moldovan leu + Moldovan leuta + + + Madagaskarin ariary + Madagaskarin ariarya + + + Madagaskarin frangi + Madagaskarin frangia + + + Makedonian dinaari + Makedonian dinaaria + + + Malin frangi + Malin frangia + + + Myanmarin kyat + Myanmarin kyatia + + + Mongolian tugrik + Mongolian tugrikia + + + Macaon pataca + Macaon patacaa + + + Mauritanian ouguiya + Mauritanian ouguiyaa + + + Maltan liira + Maltan liiraa + + + Maltan punta + Maltan puntaa + + + Mauritiuksen rupia + Mauritiuksen rupiaa + + + Malediivien rufiyaa + Malediivien rufiyaata + + + Malawin kwacha + Malawin kwachaa + + + Meksikon peso + Meksikon pesoa + + + Meksikon hopeapeso (1861–1992) + Meksikon hopeapesoa (1861–1992) + + + Meksikon UDI + Meksikon UDI'ta + + + Malesian ringgit + Malesian ringgitiä + + + Mosambikin escudo + Mosambikin escudoa + + + Mosambikin metical (1980–2006) + Mosambikin meticalia (1980–2006) + + + Mosambikin metical + Mosambikin meticalia + + + Namibian dollari + Namibian dollaria + + + Nigerian naira + Nigerian nairaa + + + Nicaraguan cordoba + Nicaraguan cordobaa + + + Nicaraguan kultacordoba + Nicaraguan kultacordobaa + + + Alankomaiden guldeni + Alankomaiden guldenia + + + Norjan kruunu + Norjan kruunua + Nkr + + + Nepalin rupia + Nepalin rupiaa + + + Uuden-Seelannin dollari + Uuden-Seelannin dollaria + + + Omanin rial + Omanin rialia + + + Panaman balboa + Panaman balboaa + + + Perun inti + Perun intiä + + + Perun uusi sol + Perun uutta solia + + + Perun sol + Perun solia + + + Papua-Uuden-Guinean kina + Papua-Uuden-Guinean kinaa + + + Filippiinien peso + Filippiinien pesoa + + + Pakistanin rupia + Pakistanin rupiaa + + + Puolan zloty + Puolan zlotya + + + Puolan zloty (1950–1995) + Puolan zlotya (1950–1995) + + + Portugalin escudo + Portugalin escudoa + + + Paraguayn guarani + Paraguayn guarania + + + Qatarin rial + Qatarin rialia + + + Rhodesian dollari + Rhodesian dollaria + + + Romanian vanha leu + Romanian vanhaa leuta + + + Romanian uusi leu + Romanian uutta leuta + + + Serbian dinaari + Serbian dinaaria + + + Venäjän rupla + Venäjän ruplaa + + + Venäjän rupla (1991–1998) + Venäjän ruplaa (1991–1998) + + + Ruandan frangi + Ruandan frangia + + + Saudi-Arabian rial + Saudi-Arabian rialia + + + Salomonsaarten dollari + Salomonsaarten dollaria + + + Seychellien rupia + Seychellien rupiaa + + + Sudanin dinaari + Sudanin dinaaria + + + Sudanin punta + Sudanin puntaa + + + Sudanin punta (1957–1999) + Sudanin puntaa (1957–1999) + + + Ruotsin kruunu + Ruotsin kruunua + Rkr + + + Singaporen dollari + Singaporen dollaria + + + Saint Helenan punta + Saint Helenan puntaa + + + Slovenian tolar + Slovenian tolaria + + + Slovakian koruna + Slovakian korunaa + + + Sierra Leonen leone + Sierra Leonen leonea + + + Somalian šillinki + Somalian šillinkiä + + + Surinamin dollari + Surinamin dollaria + + + Surinamin guldeni + Surinamin guldenia + + + São Tomén ja Príncipen dobra + São Tomén ja Príncipen dobraa + + + Neuvostoliiton rupla + Neuvostoliiton ruplaa + + + El Salvadorin colon + El Salvadorin colonia + + + Syyrian punta + Syyrian puntaa + + + Swazimaan lilangeni + Swazimaan lilangenia + + + Thaimaan baht + Thaimaan bahtia + + + Tadžikistanin rupla + Tadžikistanin ruplaa + + + Tadžikistanin somoni + Tadžikistanin somonia + + + Turkmenistanin manat + Turkmenistanin manatia + + + Tunisian dinaari + Tunisian dinaaria + + + Tongan pa’anga + Tongan pa’angaa + + + Timorin escudo + Timorin escudoa + + + Turkin vanha liira + Turkin vanhaa liiraa + + + Turkin liira + Turkin liiraa + + + Trinidadin ja Tobagon dollari + Trinidadin ja Tobagon dollaria + + + Taiwanin uusi dollari + Taiwanin uutta dollaria + + + Tansanian šillinki + Tansanian šillinkiä + + + Ukrainan hryvnia + Ukrainan hryvniaa + + + Ukrainan karbovanetz + Ukrainan karbovanetziä + + + Ugandan šillinki (1966–1987) + Ugandan šillinkiä (1966–1987) + + + Ugandan šillinki + Ugandan šillinkiä + + + Yhdysvaltain dollari + Yhdysvaltain dollaria + $ + + + Yhdysvaltain dollari (seuraava päivä) + Yhdysvaltain dollaria (seuraava päivä) + + + Yhdysvaltain dollari (sama päivä) + Yhdysvaltain dollaria (sama päivä) + + + Uruguayn peso en unidades indexadas + Uruguayn pesoa en unidades indexadas + + + Uruguayn peso (1975–1993) + Uruguayn pesoa (1975–1993) + + + Uruguayn peso + Uruguayn pesoa + + + Uzbekistanin som + Uzbekistanin somia + + + Venezuelan bolivar + Venezuelan bolivaria + + + Venezuelan bolivar fuerte + Venezuelan bolivar fuerte + Venezuelan bolivar fuertea + + + Vietnamin dong + Vietnamin dongia + + + Vanuatun vatu + Vanuatun vatua + + + Samoan tala + Samoan talaa + + + CFA-frangi BEAC + CFA-frangia BEAC + + + hopea + hopeayksikkö + hopeayksikköä + + + kulta + kultayksikkö + kultayksikköä + + + EURCO + EURCO'a + + + Euroopan rahayksikkö (EMU) + Euroopan rahayksikköä (EMU) + + + EUA (XBC) + EUA'ta (XBC) + + + EUA (XBD) + EUA'ta (XBD) + + + Itä-Karibian dollari + Itä-Karibian dollaria + + + erityisnosto-oikeus (SDR) + erityisnosto-oikeutta (SDR) + + + Euroopan valuuttayksikkö (ECU) + Euroopan valuuttayksikköä (ECU) + + + Ranskan kultafrangi + Ranskan kultafrangia + + + Ranskan UIC-frangi + Ranskan UIC-frangia + + + CFA-frangi BCEAO + CFA-frangia BCEAO + + + palladium + palladiumyksikkö + palladiumyksikköä + + + CFP-frangi + CFP-frangia + + + platina + platinayksikkö + platinayksikköä + + + RINET-rahastot + RINET-rahastoyksikkö + RINET-rahastoyksikköä + + + testaustarkoitukseen varattu valuuttakoodi + testaustarkoitukseen varattua valuuttakoodi + + + tuntematon tai virheellinen rahayksikkö + tuntematon tai virheellinen rahayksikkö + tuntematonta tai virheellistä rahayksikköä + + + Jemenin dinaari + Jemenin dinaaria + + + Jemenin rial + Jemenin rialia + + + Jugoslavian kova dinaari + Jugoslavian kovaa dinaaria + + + Jugoslavian uusi dinaari + Jugoslavian uutta dinaaria + + + Jugoslavian vaihdettava dinaari + Jugoslavian vaihdettavaa dinaaria + + + Etelä-Afrikan rahoitusrandi + Etelä-Afrikan rahoitusrandia + + + Etelä-Afrikan randi + Etelä-Afrikan randia + + + Sambian kwacha + Sambian kwachaa + + + Zairen uusi zaire + Zairen uutta zairea + + + Zairen zaire + Zairen zairea + + + Zimbabwen dollari + Zimbabwen dollaria + + + + + + {0} päivä + {0} päivää + + + {0} tunti + {0} tuntia + + + {0} minuutti + {0} minuuttia + + + {0} kuukausi + {0} kuukautta + + + {0} sekunti + {0} sekuntia + + + {0} viikko + {0} viikkoa + + + {0} vuosi + {0} vuotta + + + + + kyllä:kylla:k + ei:e + + + diff --git a/libs/Zend/Locale/Data/fi_FI.xml b/libs/Zend/Locale/Data/fi_FI.xml new file mode 100644 index 0000000..c67e9c6 --- /dev/null +++ b/libs/Zend/Locale/Data/fi_FI.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/fil.xml b/libs/Zend/Locale/Data/fil.xml new file mode 100644 index 0000000..3467d2c --- /dev/null +++ b/libs/Zend/Locale/Data/fil.xml @@ -0,0 +1,1005 @@ + + + + + + + + + + + Afrikaans + Amharic + Arabic + Assamese + Azerbaijani + Belarusian + Bulgarian + Bihari + Bengali; Bangla + Breton + Bosnian + Catalan + Czech + Welsh + Danish + Aleman + Griyego + Ingles + Ingles (UK) + Ingles (US) + Esperanto + Espanyol + Estonian + Basque + Persian + Finnish + Filipino + Faroeso + Pranses + Prisian + Irish + Scots Gaelic + Galician + Guarani + Gujarati + Hebreo + Hindu + Croatian + Hungarian + Armenian + Interlingua + Indonesian + Interlingue + Icelandic + Italyano + Japanese + Javanese + Georgian + Khmer + Kannada + Korean + Kurdish + Kirghiz + Latin + Lingala + Lao + Lithuanian + Latvian + Macedonian + Malayalam + Mongolian + Marathi + Malay + Maltese + Nepali + Olandes + Norwegian Nynorsk + Norwegian + Occitan + Oriya + Punjabi + Polish + Pashto + Portuges + Portuges (Brasil) + Rhaeto-Romance + Romanian + Ruso + Sanskrit + Sindhi + Serbo-Croatian + Sinhalese + Eslobak + Eslobenyan + Somali + Albanian + Serbiran + Sesoto + Taga Sundan + Suwiso + Swahili + Tamil + Telugu + Thai + Tigrinya + Turkmen + Tagalog + Klingon + Turko + Twi + Uighur + Ukranian + und + Urdu + Uzbeko + Vietnamese + Wolof + Xhosa + Yiddish + zh + Intsik (Pinadali) + Intsik (Tradisyunal) + Zulu + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Mundo + Africa + North America + South America + Oceania + Kanlurang Africa + Gitnang Amerika + Silangang Africa + Hilagang Africa + Gitnang Africa + Katimugang Africa + Americas + Hilagang Amerika + Carribbean + Silangang Asya + Katimugang Asya + Timog-Silangang Asya + Katimugang Europa + Australia at New Zealand + Melanesia + Rehiyong Micronesia + Polynesia + Timog-Gitnang Asya + Asya + Gitnang Asya + Kanlurang Asya + Europa + Silangang Europa + Hilagang Europa + Kanlurang Europa + Latin America at ang Caribbean + Andorra + United Arab Emirates + Afghanistan + Antigua at Barbuda + Anguilla + Albania + Armenia + Netherlands Antilles + Angola + Antartica + Argentina + American Samoa + Austria + Australia + Aruba + Aland Islands + Azerbaijan + Bosnia and Herzegovina + Barbados + Bangladesh + Belgium + Burkina Faso + Bulgaria + Bahrain + Burundi + Benin + Bermuda + Brunei + Bolivia + Brazil + Bahamas + Bhutan + Bouvet Island + Botswana + Belarus + Belize + Canada + Cocos Islands + Congo - Kinshasa + Central African Republic + Congo + Switzerland + Côte d'Ivoire + Cook Islands + Chile + Cameroon + Tsina + Colombia + Costa Rica + Serbia at Montenegro + Cuba + Cape Verde + Christmas Island + Cyprus + Czech Republic + Alemaya + Djibouti + Denmark + Dominica + Dominican Republic + Algeria + Ecuador + Estonia + Ehipto + Western Sahara + Eritrea + Espanya + Ethiopia + Finland + Fiji + Falkland Islands + Micronesia + Faroe Islands + Pranses + Gabon + United Kingdom + Georgia + French Guiana + Guernsey + Ghana + Greenland + Gambia + Guinea + Equatorial Guinea + Griyego + South Georgia and the South Sandwich Islands + Guinea-Bissau + Hong KOng + Heard Island and McDonald Islands + Honduras + Croatia + Haiti + Hungary + Indonesia + Ireland + Israel + Isle of Man + India + British Indian Ocean Territory + Iraq + Iran + Iceland + Italya + Jersey + Jordan + Japan + Kenya + Kyrgyzstan + Cambodia + Kiribati + Comoros + Saint Kitts and Nevis + Hilagang Korea + Timog Korea + Cayman Islands + Kazakhstan + Laos + Lebanon + Saint Lucia + Liechtenstein + Sri Lanka + Liberia + Lesotho + Lithuania + Latvia + Libya + Morocco + Moldova + Montenegro + Madagascar + Marshall Islands + Macedonia + Mali + Myanmar + Mongolia + Macao + Northern Mariana Islands + Mauritania + Malawi + Mehiko + Malaysia + Mozambique + Namibia + New Caledonia + Niger + Norfolk Island + Nigeria + Nicaragua + Netherlands + Norway + Nepal + New Zealand + Oman + Peru + French Polynesia + Papua New Guinea + Pilipinas + Pakistan + Poland + Saint Pierre at Miquelon + Palestine + Portugal + Paraguay + Malayong bahagi ng Oceania + European Union + Romania + Serbia + Russia + Rwanda + Saudi Arabya + Solomon Islands + Seychelles + Sudan + Sweden + Saint Helena + Slovenia + Svalbard and Jan Mayen + Slovakia + Sierra Leone + San Marino + Senegal + Somalia + Suriname + Sao Tome and Principe + El Salvador + Syria + Swaziland + Turks and Caicos Islands + Chad + French Southern Territories + Togo + Thailand + Tajikistan + Tokelau + East Timor + Turkmenistan + Tunisia + Tonga + Turkey + Trinidad and Tobago + Tuvalu + Taiwan + Tanzania + Ukraine + Uganda + United States minor outlying islands + United States + Uruguay + Uzbekistan + Vatican City + Saint Vincent and the Grenadines + Venezuela + British Virgin Islands + U.S. Virgin Islands + Vietnam + Vanuatu + Wallis and Futuna + Samoa + Yemen + Timog Afrika + Zambia + Zimbabwe + Hindi kilala o Hindi wastong Rehiyon + + + US + Metric + + + {0} + {0} + {0} + + + + [a-n ñ {ng} o-z] + [á à â é è ê í ì î ó ò ô ú ù û] + [a-z] + + + + + + + + + + + + + + Ene + Peb + Mar + Abr + May + Hun + Hul + Ago + Set + Okt + Nob + Dis + + + Enero + Pebrero + Marso + Abril + Mayo + Hunyo + Hulyo + Agosto + Setyembre + Oktubre + Nobyembre + Disyembre + + + + + E + P + M + A + M + H + H + A + S + O + N + D + + + Enero + Pebrero + Marso + Abril + Mayo + Hunyo + Hulyo + Agosto + Setyembre + Oktubre + Nobyembre + Disyembre + + + + + + + Lin + Lun + Mar + Mye + Huw + Bye + Sab + + + Linggo + Lunes + Martes + Miyerkules + Huwebes + Biyernes + Sabado + + + + + Miy + Biy + + + L + L + M + M + H + B + S + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + + 1 + 2 + 3 + 4 + + + + AM + PM + + + BCE + CE + + + + + + EEEE, MMMM dd yyyy + + + + + MMMM d, yyyy + + + + + MMM d, yyyy + + + + + M/d/yy + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1} {0} + + + + E, M-d + LLL + E MMM d + E MMMM d + MMMM d + MMM d + M-d + mm:ss + yyyy + yyyy-M + EEE, yyyy-M-d + yyyy MMM + EEE, yyyy MMM d + yyyy MMMM + yyyy QQQ + yy-MM + MMM yy + + + + + Era + + + Taon + + + Buwan + + + Linggo + + + Araw + Today + Tomorrow + Yesterday + + + Araw ng Linggo + + + Dayperiod + + + Oras + + + Minuto + + + Segundo + + + Zone + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + {1} ({0}) + + Unknown + + + Porto - Novo + + + Pasko. + + + Tbilisi. + + + Conarky + + + St. Kitts + + + St. Lucia + + + Maseru. + + + Dushanbe. + + + Port nang Espanya + + + St. Vincent + + + St. Thomas + + + Harare. + + + + + + . + , + ; + % + 0 + # + + + - + E + + + NaN + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + ¤ #,##0.00 + + + {0} {1} + {0} {1} + + + + United Arab Emirates Dirham + + + Argentine Peso + + + Australian Dollar + + + Bulgarian Lev + + + Bolivian Boliviano + + + Brazilian Real + + + Canadian Dollar + + + Swiss Francs + + + Chilean Peso + + + Yuan Renminbi + + + Colombian Peso + + + Czech Koruna + + + Deutsche Marks + + + Denmark Kroner + + + Estonian Kroon + + + Egyptian Pound + + + Euros + + + French Franc + + + British Pounds Sterling + + + Hong Kong Dollars + + + Croatian Kuna + + + Hungarian Forint + + + Indonesian Rupiah + + + Israeli Shekel + + + Indian Rupee + 0≤Rs.|1≤Re.|1<Rs. + + + Japanese Yen + + + South Korean Won + + + Lithuanian Litas + + + Moroccan Dirham + + + Mexico Peso + + + Malaysian Ringgit + + + Norwegian Kroner + + + New Zealand Dollars + + + Peruvian Nuevo Sol + + + Philippine Peso + PhP + + + Pakistan Rupee + + + Polish NewZloty + + + Romanian Leu + + + Serbian Dinar + + + Russian Ruble + + + Saudi Riyal + + + Sweden Kronor + + + Singapore Dollars + + + Slovenian Tolar + + + Slovak Koruna + + + Thai Baht + + + Turkish Lira + + + New Taiwan Dollar + + + US Dollar + + + Venezuela Bolivar + + + XXX + + + South African Rand + + + + + + {0} a + {0} a + + + {0} o + {0} o + + + {0} l + {0} l + + + {0} t + {0} t + + + + + yes:y + no:n + + + + diff --git a/libs/Zend/Locale/Data/fil_PH.xml b/libs/Zend/Locale/Data/fil_PH.xml new file mode 100644 index 0000000..e180fd0 --- /dev/null +++ b/libs/Zend/Locale/Data/fil_PH.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/libs/Zend/Locale/Data/fo.xml b/libs/Zend/Locale/Data/fo.xml new file mode 100644 index 0000000..b7e90ed --- /dev/null +++ b/libs/Zend/Locale/Data/fo.xml @@ -0,0 +1,636 @@ + + + + + + + + + + + afríska + amhariskt + arabiskt + assamesiskt + azerbaijaniskt + belarussiskt + bulgarskum + bihariskt + bengaliskt + bretonskt + bosniskt + katalanskt + kekkiskt + valisiskt + danskt + týskt + grikskt + enskt + esperanto + spanskt + estlendskt + baskiskt + persiskt + finskt + tagalog + føroyskt + franskt + frisiskt + írskt + skotskt gæliskt + galliskt + guarani + gujariti + hebraiskt + hindi + kroatiskum + ungarskt + armenskum + interlingua + indonesiskum + interlingue + íslendskt + italskt + japanskt + javanesiskt + georgiskt + kambodjanskt + kannada + koreanskt + kurdiskt + kyrgyz + latín + lingala + laothian + litavskt + latviskt + makedonskt + malayalam + mongoliskt + marathiskt + malay + maltesiskt + norskt bokmål + nepalskt + hollendskt + nýnorskt + norskt + occitan + oriya + punjabi + polskt + pashto + portugisiskt + romanskt + russiskt + sanskrit + sindhi + serbokroatiskt + sinhalesiskt + slovakiskum + slovenskum + somaliskt + albanskt + serbiskum + sesotho + sundanesiskt + svenskt + swahili + tamilskt + telugu + thailendskt + tigrinya + turkmenskt + klingonskt + turkiskt + twi + uighur + ukrainskt + urdu + uzbekiskt + vietnamesiskt + xhosa + jiddiskt + sulu + + + Africa + Norðuramerika + Suðuramerika + Kyrrahavsoyggjarnar + Vesturafrika + Sentralamerika + Eysturafrika + Norðurafrika + Miðafrika + Suður Afrika + Amerika + Karibia + Eysturasia + Suðurasia + Suðureysturasia + Suðurevropa + Avstralia og Nýsæland + Melanesia + Polynesia + Suðursentralasia + Asia + Sentralasia + Vesturasia + Evropa + Eysturevropa + Norðurevropa + Vesturevropa + Andorra + Sameindu Emirríkini + Afganistan + Antigua og Barbuda + Anguilla + Albania + Armenia + Angola + Antarktis + Argentina + Eysturríki + Avstralia + Aruba + Áland + Aserbajdsjan + Bosnia-Hersegovina + Barbados + Bangladesj + Belgia + Burkina Faso + Bulgaria + Bahrain + Burundi + Benin + Bermuda + Brunei + Bolivia + Brasilia + Bahamas + Butan + Botsvana + Hvítarussland + Belis + Kanada + Kongo-Kinshasa + Miðafrikalýðveldið + Kongo + Sveis + Fílabeinsstrondin + Kili + Kamerun + Kina + Kolombia + Kosta Rika + Kuba + Grønhøvdaoyggjarnar + Kýpros + Kekkia + Týskland + Djibouti + Danmørk + Dominika + Domingo lýðveldið + Algeria + Ekvador + Estland + Egyptaland + Eritrea + Spania + Etiopia + Finnland + Fiji + Mikronesia + Føroyar + Frakland + Gabon + Stóra Bretland + Grenada + Georgia + Guernsey + Ghana + Gibraltar + Grønland + Gambia + Guinea + Guadeloupe + Ekvator Guinea + Grikkaland + Guatemala + Guam + Guinea Bissau + Gujana + Hongkong + Honduras + Kroatia + Haiti + Ungarn + Indonesia + Írland + Ísrael + India + Irak + Iran + Ísland + Italia + Jersey + Jameika + Jordan + Japan + Kenja + Kirgisia + Kambodja + Kiribati + Komorooyggjarnar + Saint Kitts og Nevis + Norður-Korea + Suður-Korea + Kuvait + Kasakstan + Laos + Libanon + Saint Lusia + Liktenstein + Sri Lanka + Liberia + Lesoto + Litava + Luksemborg + Lettland + Libya + Marokko + Monako + Moldova + Montenegro + Madagaskar + Marshalloyggjarnar + Makedónia + Mali + Burma + Mongolia + Makao + Móritania + Montserrat + Malta + Móritius + Maldivuoyggjarnar + Malavi + Meksiko + Maleisia + Mosambik + Namibia + Niger + Nigeria + Nikaragua + Niðurlond + Noreg + Nepal + Nauru + Niue + Ný Sæland + Oman + Panama + Perú + Papua Nýguinea + Filipsoyggjar + Pakistan + Pólland + Portugal + Palau + Paraguei + Katar + EU + Réunion + Rumenia + Serbia + Russland + Ruanda + Saudi-Arábia + Sálomonoyggjarnar + Seyskelloyggjarnar + Sudan + Svøríki + Singapor + Slovenia + Slovakia + Sierra Leone + San Marino + Senegal + Somalia + Surinam + Sao Tome og Prinsipi + El Salvador + Syria + Svasiland + Kjad + Togo + Teiland + Tadsjikistan + Tokelau + Tunesia + Tonga + Turkaland + Trinidad og Tobago + Tuvalu + Teivan + Tansania + Ukreina + Uganda + Sambandsríki Amerika + Uruguei + Usbekistan + Vatikan + Saint Vinsent og Grenadinoyggjar + Venesuela + Vietnam + Vanuatu + Sámoa + Jemen + Suðurafrika + Sambia + Simbabvi + + + + [a á b d ð e-i í j-o ó p r-u ú v x y ý æ ø] + [c q w z] + + + + + + + + + + + + + + jan + feb + mar + apr + mai + jun + jul + aug + sep + okt + nov + des + + + januar + februar + mars + apríl + mai + juni + juli + august + september + oktober + november + desember + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + sun + mán + týs + mik + hós + frí + ley + + + sunnudagur + mánadagur + týsdagur + mikudagur + hósdagur + fríggjadagur + leygardagur + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + K1 + K2 + K3 + K4 + + + 1. kvartal + 2. kvartal + 3. kvartal + 4. kvartal + + + + AM + PM + + + BCE + CE + + + + + + EEEE dd MMMM yyyy + + + + + d. MMM yyyy + + + + + dd-MM-yyyy + + + + + dd-MM-yy + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1} {0} + + + + HH:mm + HH:mm:ss + d. MMM + dd-MM + Q yy + MM-yyyy + MMM yyyy + + + {0} - {1} + + M-M + + + E dd-MM - E dd-MM + E dd-MM - E dd-MM + + + MMM-MMM + + + E d. MMM - E d. MMM + E d. - E d. MMM + + + d. MMM - d. MMM + d.-d. MMM + + + dd-MM - dd-MM + dd-MM - dd-MM + + + d-d + + + HH-HH + + + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH-HH v + + + y-y + + + MM-yy - MM-yy + MM-yy - MM-yy + + + E dd-MM-yy - E dd-MM-yy + E dd-MM-yy - E dd-MM-yy + E dd-MM-yy - E dd-MM-yy + + + MMM-MMM yyyy + MMM yyyy - MMM yyyy + + + E dd MMM - E dd MMM yyyy + E dd - E dd MMM yyyy + E dd MMM yyyy - E dd MMM yyyy + + + d. MMM - d. MMM yyyy + d.-d. MMM yyyy + d. MMM yyyy - d. MMM yyyy + + + dd-MM-yy - dd-MM-yy + dd-MM-yy - dd-MM-yy + dd-MM-yy - dd-MM-yy + + + + + + + +HH:mm;−HH:mm + GMT{0} + {0} + + + + + , + . + + ×10^ + + + + + ¤#,##0.00;¤-#,##0.00 + + + + + + kr + + + + diff --git a/libs/Zend/Locale/Data/fo_FO.xml b/libs/Zend/Locale/Data/fo_FO.xml new file mode 100644 index 0000000..b341507 --- /dev/null +++ b/libs/Zend/Locale/Data/fo_FO.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/fr.xml b/libs/Zend/Locale/Data/fr.xml new file mode 100644 index 0000000..5616d30 --- /dev/null +++ b/libs/Zend/Locale/Data/fr.xml @@ -0,0 +1,5572 @@ + + + + + + + + + + + {0} ({1}) + , + + + afar + abkhaze + aceh + acoli + adangme + adyghéen + avestique + afrikaans + langue afro-asiatique + afrihili + aïnou + akan + akkadien + aléoute + langue algonquine + altaï du Sud + amharique + aragonais + ancien anglais + angika + langue apache + arabe + araméen + araukan + arapaho + langue artificielle + arawak + assamais + asturien + langue athapascane + langue australienne + avar + awadhi + aymara + azéri + bachkir + banda + langue bamilékée + baloutchi + balinais + bassa + langue balte + biélorusse + bedja + bemba + berbère + bulgare + bihari + bhojpuri + bichelamar ; bislama + bikol + bini + siksika + bambara + bengali + bantou + tibétain + breton + braj + bosniaque + batak + bouriate + bugi + blin + catalan + caddo + langue amérindienne centrale + caribe + langue caucasienne + atsam + tchétchène + cebuano + langue celtique + chamorro + chibcha + tchaghataï + chuuk + mari + jargon chinook + choctaw + chipewyan + cherokee + cheyenne + langue chame + corse + copte + créole ou pidgin anglais + créole ou pidgin français + créole ou pidgin portugais + cree + turc de Crimée + créole ou pidgin + tchèque + kachoube + slavon d’église + langue couchitique + tchouvache + gallois + danois + dakota + dargwa + dayak + allemand + allemand autrichien + allemand suisse + delaware + slavey + dogrib + dinka + dogri + langue dravidienne + bas-sorabe + douala + moyen néerlandais + maldivien + dioula + dzongkha + éwé + efik + égyptien ancien + ekajuk + grec + élamite + anglais + anglais australien + anglais canadien + anglais britannique + anglais américain + moyen anglais + espéranto + espagnol + espagnol latino-américain + espagnol ibérique + estonien + basque + éwondo + persan + fang + fanti + peul + finnois + filipino + langue finno-ougrienne + fidjien + féroïen + fon + français + français canadien + français suisse + moyen français + ancien français + frison du Nord + frison oriental + frioulan + frison + irlandais + ga + gayo + gbaya + gaélique écossais + langue germanique + guèze + gilbertais + galicien + moyen haut-allemand + guarani + ancien haut allemand + gondi + gorontalo + gotique + grebo + grec ancien + alémanique + goudjarâtî + manx + gwichʼin + haoussa + haida + hawaïen + hébreu + hindi + hiligaynon + himachali + hittite + hmong + hiri motu + croate + haut-sorabe + haïtien + hongrois + hupa + arménien + héréro + interlingua + iban + indonésien + interlingue + igbo + yi de Sichuan + ijo + inupiaq + ilokano + langue indo-aryenne + langue indo-européenne + ingouche + ido + langue iranienne + langue iroquoienne + islandais + italien + inuktitut + japonais + lojban + judéo-persan + judéo-arabe + javanais + géorgien + karakalpak + kabyle + kachin + jju + kamba + karen + kawi + kabardin + tyap + koro + kongo + khasi + langue khoïsan + khotanais + kikuyu + kuanyama + kazakh + groenlandais + khmer + kiMboundou + kannada + coréen + konkani + kusaien + kpellé + kanouri + karatchaï balkar + carélien + krou + kurukh + kâshmîrî + kurde + koumyk + kutenai + komi + cornique + kirghize + latin + ladino + lahnda + lamba + luxembourgeois + lezghien + ganda + limbourgeois + lingala + lao + mongo + lozi + lituanien + luba-katanga + luba-lulua + luiseno + lunda + luo + lushai + letton + madurais + magahi + maithili + makassar + mandingue + malayo-polynésien + masai + moksa + mandar + mendé + malgache + moyen irlandais + marshall + maori + micmac + minangkabau + langue diverse + macédonien + langue mon-khmère + malayalam + mongol + mandchou + manipuri + langue manobo + moldave + mohawk + moré + marathe + malais + maltais + multilingue + langue mounda + creek + mirandais + marwarî + birman + langue maya + erzya + nauruan + nahuatl + langue amérindienne du Nord + napolitain + norvégien bokmål + ndébélé du Nord + bas-allemand + népalais + newari + ndonga + nias + langue nigéro-congolaise + niué + néerlandais + néerlandais belge + norvégien nynorsk + norvégien + nogaï + vieux norrois + n’ko + ndébélé du Sud + sotho du Nord + langue nubienne + navaho + newarî classique + nyanja + nyamwezi + nyankolé + nyoro + nzema + occitan + ojibwa + oromo + oriya + ossète + osage + turc ottoman + langue otomangue + pendjabi + langue papoue + pangasinan + pahlavi + pampangan + papiamento + palau + persan ancien + langue philippine + phénicien + pali + polonais + pohnpei + langues prâkrit + provençal ancien + pachto + portugais + portugais brésilien + portugais ibérique + langue quechua + rajasthani + rapanui + rarotongien + rhéto-roman + roundi + roumain + langue romane + tzigane + racine + russe + valaque + rwanda + sanskrit + sandawe + iakoute + langue amérindienne du Sud + langue salishenne + araméen samaritain + sasak + santal + sarde + sicilien + écossais + sindhî + sami du Nord + selkoupe + langue sémitique + sangho + ancien irlandais + langue des signes + serbo-croate + shan + singhalais + sidamo + langue sioux + langue sino-tibétaine + slovaque + slovène + langue slave + samoan + sami du Sud + langue samie + sami de Lule + sami d’Inari + sami skolt + shona + soninké + somali + sogdien + songhai + albanais + serbe + sranan tongo + sérère + swati + langue nilo-saharienne + sesotho + soundanais + sukuma + soussou + sumérien + suédois + swahili + syriaque classique + syriaque + tamoul + langue taï + télougou + temne + tereno + tetum + tadjik + thaï + tigrigna + tigré + tiv + turkmène + tokelau + tagalog + klingon + tlingit + tamacheq + tswana + tongan + tonga nyasa + tok pisin + turc + tsonga + tsimshian + tatar + tumbuka + langue tupi + langue altaïque + tuvalu + twi + tahitien + touva + oudmourte + ouïgour + ougaritique + ukrainien + umbundu + indéterminé + ourdou + ouzbek + vaï + venda + vietnamien + volapuk + vote + wallon + langues wakashennes + walamo + waray + washo + langue sorabe + wolof + kalmouk + xhosa + yao + yapois + yiddish + yoruba + langues yupik + zhuang + zapotèque + symboles Bliss + zenaga + chinois + chinois simplifié + chinois traditionnel + zandé + zoulou + zuni + sans contenu linguistique + zazaki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Monde + Afrique + Amérique du Nord + Amérique du Sud + Océanie + Afrique occidentale + Amérique centrale + Afrique orientale + Afrique septentrionale + Afrique centrale + Afrique australe + Amériques + Amérique septentrionale + Caraïbes + Asie orientale + Asie du Sud + Asie du Sud-Est + Europe méridionale + Australie et Nouvelle-Zélande + Mélanésie + région micronésienne + Polynésie + Asie centrale et du Sud + Asie + Asie centrale + Asie occidentale + Europe + Europe orientale + Europe septentrionale + Europe occidentale + Communauté des États indépendants + Amérique latine et Caraïbes + Îles Anglo-normandes + Andorre + Émirats arabes unis + Afghanistan + Antigua-et-Barbuda + Anguilla + Albanie + Arménie + Antilles néerlandaises + Angola + Antarctique + Argentine + Samoa américaines + Autriche + Australie + Aruba + Îles Åland + Azerbaïdjan + Bosnie-Herzégovine + Barbade + Bangladesh + Belgique + Burkina Faso + Bulgarie + Bahreïn + Burundi + Bénin + Saint-Barthélémy + Bermudes + Brunéi Darussalam + Bolivie + Brésil + Bahamas + Bhoutan + Île Bouvet + Botswana + Bélarus + Belize + Canada + Îles des Cocos (Keeling) + République démocratique du Congo + République centrafricaine + Congo + Suisse + Côte d’Ivoire + Îles Cook + Chili + Cameroun + Chine + Colombie + Costa Rica + Serbie-et-Monténégro + Cuba + Cap-Vert + Île Christmas + Chypre + République tchèque + Allemagne + Djibouti + Danemark + Dominique + République dominicaine + Algérie + Équateur + Estonie + Égypte + Sahara occidental + Érythrée + Espagne + Éthiopie + Finlande + Fidji + Îles Malouines + États fédérés de Micronésie + Îles Féroé + France + Gabon + Royaume-Uni + Grenade + Géorgie + Guyane française + Guernesey + Ghana + Gibraltar + Groenland + Gambie + Guinée + Guadeloupe + Guinée équatoriale + Grèce + Géorgie du Sud et les îles Sandwich du Sud + Guatemala + Guam + Guinée-Bissau + Guyana + Hong Kong + Îles Heard et MacDonald + Honduras + Croatie + Haïti + Hongrie + Indonésie + Irlande + Israël + Île de Man + Inde + Territoire britannique de l'océan Indien + Irak + Iran + Islande + Italie + Jersey + Jamaïque + Jordanie + Japon + Kenya + Kirghizistan + Cambodge + Kiribati + Comores + Saint-Kitts-et-Nevis + Corée du Nord + Corée du Sud + Koweït + Îles Caïmans + Kazakhstan + Laos + Liban + Sainte-Lucie + Liechtenstein + Sri Lanka + Libéria + Lesotho + Lituanie + Luxembourg + Lettonie + Libye + Maroc + Monaco + Moldavie + Monténégro + Saint-Martin + Madagascar + Îles Marshall + Macédoine + Mali + Myanmar + Mongolie + Macao + Îles Mariannes du Nord + Martinique + Mauritanie + Montserrat + Malte + Maurice + Maldives + Malawi + Mexique + Malaisie + Mozambique + Namibie + Nouvelle-Calédonie + Niger + Île Norfolk + Nigéria + Nicaragua + Pays-Bas + Norvège + Népal + Nauru + Niue + Nouvelle-Zélande + Oman + Panama + Pérou + Polynésie française + Papouasie-Nouvelle-Guinée + Philippines + Pakistan + Pologne + Saint-Pierre-et-Miquelon + Pitcairn + Porto Rico + Territoire palestinien + Portugal + Palaos + Paraguay + Qatar + régions éloignées de l’Océanie + Union européenne + Réunion + Roumanie + Serbie + Russie + Rwanda + Arabie saoudite + Îles Salomon + Seychelles + Soudan + Suède + Singapour + Sainte-Hélène + Slovénie + Svalbard et Île Jan Mayen + Slovaquie + Sierra Leone + Saint-Marin + Sénégal + Somalie + Suriname + Sao Tomé-et-Principe + El Salvador + Syrie + Swaziland + Îles Turks et Caïques + Tchad + Terres australes françaises + Togo + Thaïlande + Tadjikistan + Tokelau + Timor oriental + Turkménistan + Tunisie + Tonga + Turquie + Trinité-et-Tobago + Tuvalu + Taïwan + Tanzanie + Ukraine + Ouganda + Îles Mineures Éloignées des États-Unis + États-Unis + Uruguay + Ouzbékistan + État de la Cité du Vatican + Saint-Vincent-et-les Grenadines + Venezuela + Îles Vierges britanniques + Îles Vierges des États-Unis + Viêt Nam + Vanuatu + Wallis-et-Futuna + Samoa + Yémen + Mayotte + Afrique du Sud + Zambie + Zimbabwe + région indéterminée + + + orthographe allemande traditionnelle + orthographe normalisée de Resia + orthographe allemande de 1996 + françoys de 1606 + françois académique de 1694 + arménien oriental + arménien occidental + alphabet latin altaïque unifié + dialecte de San Giorgio / Bila + dialecte boontling + alphabet phonétique international + alphabet phonétique ouralique + dialecte lipovaz de Resia + monotonique + dialecte de Natisone + dialecte de Gniva / Njiva + dialecte d’Oseacco / Osojane + polytonique + informatique + orthographe révisée + dialecte de Resia + dialecte saho + anglais standard écossais + dialecte scouse + dialecte de Stolvizza / Solbica + orthographe taraskievica + valencien + + + Calendrier + Ordonnancement + Devise + + + Ordre chinois traditionnel - Big5 + Calendrier bouddhiste + Calendrier chinois + Ordre direct + Ordre chinois simplifié - GB2312 + Calendrier grégorien + Calendrier hébraïque + Calendrier indien + Calendrier musulman + Calendrier civil musulman + Calendrier japonais + Ordre de l’annuaire + Ordre pinyin + Calendrier républicain chinois + Ordre des traits + Ordre traditionnel + + + américain + métrique + + + langue : {0} + écriture : {0} + région : {0} + + + + [a à â æ b c ç d e é è ê ë f-i î ï j-o ô œ p-u ù û ü v-y ÿ z] + [á å ä ã ā ē í ì ī ñ ó ò ö ø ú ǔ] + [a-z ұ Ұ] + + + « + » + + + + + GaMjkHmsSEDFwWxhKzAeugXZvcL + + + matin + soir + + + ère bouddhiste + + + ère b. + + + ÈB + + + + + + EEEE d MMMM yyyy G + + + + + d MMMM yyyy G + + + + + d MMM, yyyy G + + + + + d/M/yyyy + + + + + + m:ss + + + + + + + + 1yuè + 2yuè + 3yuè + 4yuè + 5yuè + 6yuè + 7yuè + 8yuè + 9yuè + 10yuè + 11yuè + 12yuè + + + zhēngyuè + èryuè + sānyuè + sìyuè + wǔyuè + liùyuè + qīyuè + bāyuè + jiǔyuè + shíyuè + shíyīyuè + shí’èryuè + + + + matin + soir + + + + EEEE d MMMMl y'x'G + + + + + d MMMMl y'x'G + + + + + d MMMl y'x'G + + + + + d/Ml/y'x'G + + + + + + Ml + EEE d/Ml + MMMl + E d MMMl + EEE d MMMMl + d MMMMl + d MMMl + dd MMMl + d/MMl + dd/MMl + d/Ml + m:ss + y'x'G + Ml/y'x'G + EEE d/Ml/y'x'G + MMMl y'x'G + EEE d MMMl y'x'G + MMMM y'x'G + 'T'Q y'x'G + QQQ y'x'G + MMl/y'x'G + MMMl yy + EEE d MMMl yy + d MMMl yy + MMMMl y'x'G + + + + + + + + tout + bâb. + hât. + kya. + toub. + amsh. + barma. + barmo. + bash. + ba’o. + abî. + mis. + al-n. + + + tout + bâbâ + hâtour + kyakh + toubah + amshîr + barmahât + barmoudah + bashans + ba’ounah + abîb + misra + al-nasi + + + + + T + B + H + K + T + A + B + B + B + B + A + M + N + + + + matin + soir + + + avant Dioclétien + après Dioclétien + + + av. D. + ap. D. + + + av. D. + ap. D. + + + + + + + + mäs. + teq. + hed. + tah. + ter + yäk. + mäg. + miy. + gue. + sän. + ham. + näh. + pag. + + + mäskäräm + teqemt + hedar + tahesas + ter + yäkatit + mägabit + miyazya + guenbot + säné + hamlé + nähasé + pagumén + + + + + M + T + H + T + T + Y + M + M + G + S + H + N + P + + + + matin + + + avant l’Incarnation + après l’Incarnation + + + av. Inc. + ap. Inc. + + + av. Inc. + ap. Inc. + + + + + + + + janv. + févr. + mars + avr. + mai + juin + juil. + août + sept. + oct. + nov. + déc. + + + janvier + février + mars + avril + mai + juin + juillet + août + septembre + octobre + novembre + décembre + + + + + J + F + M + A + M + J + J + A + S + O + N + D + + + + + + + dim. + lun. + mar. + mer. + jeu. + ven. + sam. + + + dimanche + lundi + mardi + mercredi + jeudi + vendredi + samedi + + + + + D + L + M + M + J + V + S + + + + + + + T1 + T2 + T3 + T4 + + + T3 + + + 1er trimestre + 2e trimestre + 3e trimestre + 4e trimestre + + + + + 1 + 2 + 3 + 4 + + + + AM + PM + + + avant Jésus-Christ + après Jésus-Christ + + + av. J.-C. + ap. J.-C. + + + + + + EEEE d MMMM yyyy + + + + + d MMMM yyyy + + + + + d MMM yyyy + + + + + dd/MM/yy + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1} {0} + + + + HH:mm + HH:mm:ss + H:mm + L + EEE d/M + LLL + E d MMM + EEE d MMMM + d MMMM + d MMM + dd MMM + d/MM + dd/MM + d/M + d + HH:mm + HH:mm:ss + mm:ss + mm:ss + yyyy + M/yyyy + EEE d/M/yyyy + MMM yyyy + EEE d MMM yyyy + MMMM yyyy + 'T'Q yyyy + QQQ yyyy + MM/yy + MMM yy + EEE d MMM yy + d MMM yy + 'T'Q yy + QQQQ yy + MMMM yyyy + + + {0} – {1} + + M–M + + + E dd/MM - E dd/MM + E dd/MM - E dd/MM + + + MMM–MMM + + + 'du' E d MMM 'au' E d MMM + 'du' E d 'au' E d MMM + + + LLLL–LLLL + + + 'du' d MMM 'au' d MMM + d–d MMM + + + dd/MM - dd/MM + dd/MM - dd/MM + + + d-d + + + HH – HH + HH – HH + + + HH:mm – HH:mm + HH:mm-HH:mm + HH:mm – HH:mm + + + HH:mm – HH:mm v + HH:mm – HH:mm v + HH:mm – HH:mm v + + + HH – HH v + HH – HH v + + + y-y + + + MM/yy – MM/yy + M/yyyy – M/yyyy + + + E dd/MM/yy – E dd/MM/yy + E dd/MM/yy – E dd/MM/yy + E d/M/yyyy – E d/M/yyyy + + + MMM–MMM yyyy + MMM yyyy – MMM yyyy + + + E d MMM – E d MMM yyyy + E d – E d MMM yyyy + E d MMM yyyy – E d MMM yyyy + + + MMMM–MMMM yyyy + MMMM yyyy – MMMM yyyy + + + d MMM – d MMM yyyy + d–d MMM yyyy + d MMM yyyy – d MMM yyyy + + + d/M/yy – d/M/yy + d/M/yy – d/M/yy + d/M/yyyy – d/M/yyyy + + + + + + ère + + + année + + + mois + + + semaine + + + jour + aujourd’hui + demain + après-demain + après-après-demain + hier + avant-hier + avant-avant-hier + + + jour de la semaine + + + cadran + + + heure + + + minute + + + seconde + + + fuseau horaire + + + + + + + + tis. + hes. + kis. + téb. + sché. + ad.I + adar + nis. + iyar + siv. + tam. + ab + ell. + + + Tisseri + Hesvan + kislev + Tébeth + Schébat + Adar + Adar II + Nissan + iyar + sivan + Tamouz + Ab + Elloul + + + + + T + H + K + T + S + A + A + N + I + S + T + A + E + + + + matin + soir + + + Anno Mundi + + + A.M. + + + + + + + + chai. + vai. + jyai. + āsha. + shrā. + bhā. + āshw. + kār. + mār. + pau. + māgh + phāl. + + + chaitra + vaishākh + jyaishtha + āshādha + shrāvana + bhādrapad + āshwin + kārtik + mārgashīrsha + paush + māgh + phālgun + + + + + C + V + J + Ā + S + B + Ā + K + M + P + M + P + + + + matin + soir + + + + + + Mouharram + Rabiʻ-oul-Aououal + Rabiʻ-out-Tani + Djoumada-l-Oula + Djoumada-t-Tania + Radjab + Chaʻban + Chaououal + Dou-l-Qaʻda + Dou-l-Hidjja + + + + + + + +HH:mm;-HH:mm + UTC{0} + {0} + {1} ({0}) + + zone inconnue + + + Andorre + + + Dubaï + + + Kaboul + + + Saint John’s + + + The Valley + + + Tirana + + + Erevan + + + Curaçao + + + Pôle Sud + + + Showa + + + + + Mac Murdo + + + + + Ushuaïa + + + + + Tucumán + + + Córdoba + + + Vienne + + + Adélaïde + + + Oranjestad + + + Bakou + + + Barbade (La) + + + Dhâkâ + + + Bruxelles + + + Bahreïn + + + Bermudes + + + Bandar Seri Begawan + + + Eirunepé + + + Manaos + + + Cuiabá + + + Belém + + + Araguaína + + + São Paulo + + + Maceió + + + + + Thimphou + + + Belmopan + + + Régina + + + Montréal + + + Saint-Jean de Terre-Neuve + + + West Island + + + Île de Pâques + + + Kachgar + + + + + San José + + + La Havane + + + Cap Vert + + + Flying Fish Cove + + + Nicosie + + + Copenhague + + + Dominique + + + Saint Domingue + + + Alger + + + Galápagos + + + Tallin + + + Le Caire + + + Laâyoune + + + Asmara + + + Îles Canaries + + + Addis-Abeba + + + Fidji + + + Port Stanley + + + + + + + + + Féroé + + + Londres + + + Grenade + + + Tbilissi + + + Saint-Pierre-Port + + + Thulé + + + Godthåb + + + Basse-Terre + + + Athènes + + + Géorgie du Sud + + + Hagåtña + + + Guyane + + + Hong-Kong + + + Macassar + + + Jérusalem + + + Douglas + + + Kolkata + + + Diego Garcia + + + Bagdad + + + Téhéran + + + Reykjavík + + + Saint-Hélier + + + Jamaïque + + + Bichkek + + + + + Comores (Archipel) + + + Saint-Kitts + + + Séoul + + + Koweït + + + Caïmans + + + Aktaou + + + Ouralsk + + + Aktioubinsk + + + Kzyl Orda + + + Alma Ata + + + Beyrouth + + + Sainte-Lucie + + + Oulan-Bator + + + Tchoïbalsan + + + Macao + + + Fort-de-France + + + Brades + + + Malte + + + Maurice (Île) + + + Malé + + + Mazatlán + + + Mexico + + + Mérida + + + Cancún + + + Nouméa + + + Kingston + + + Katmandou + + + Yaren + + + Alofi + + + Panamá (Panamá) + + + Marquises + + + + + Manille + + + Karâchi + + + Varsovie + + + Saint-Pierre + + + Pitcairn (Île) + + + Porto Rico + + + Açores + + + Madère + + + Lisbonne + + + Melekeok + + + Asunción + + + Doha + + + Réunion (Île de la) + + + Bucarest + + + Moscou + + + Ekaterinbourg + + + Novossibirsk + + + Krasnoïarsk + + + Irkoutsk + + + Iakoutsk + + + Sakhaline + + + Kamtchatka + + + Riyad + + + Honiara + + + Mahé + + + Singapour + + + Sainte-Hélène + + + Saint-Marin + + + Mogadiscio + + + São Tomé + + + Salvador + + + Damas + + + Cockburn Town + + + Port-aux-Français + + + Lomé + + + Douchanbé + + + Achgabat + + + Nukuʻalofa + + + Port-d’Espagne + + + Oujgorod + + + Zaporojie + + + Alaska + + + New Salem, Dakota du Nord + + + Central North Dakota + + + + + + + + + + + Détroit + + + + + Tachkent + + + Cité du Vatican + + + Saint-Vincent + + + Road Town + + + Saint-Thomas + + + Hô-Chi-Minh-Ville + + + Efaté + + + Matāʻutu + + + Mamoudzou + + + + heure de l’Acre + heure de l’Acre + heure avancée de l’Acre + + + HACR + HNACR + HAACR + + false + + + + heure d’Afghanistan + heure d’Afghanistan + heure avancée d’Afghanistan + + + HAF + HNAF + HAAF + + false + + + + heure d’Afrique centrale + heure normale d’Afrique centrale + heure avancée d’Afrique centrale + + + HAFC + HNAFC + HAAFC + + false + + + + heure d’Afrique de l’Est + heure normale d’Afrique de l’Est + heure avancée d’Afrique de l’Est + + + HAFE + HNAFE + HAAFE + + false + + + + heure d’Afrique de l’Ouest sahélien + heure normale d’Afrique de l’Ouest sahélien + heure avancée d’Afrique de l’Ouest sahélien + + + HAFOS + HNAFOS + HAAFOS + + false + + + + heure d’Afrique méridionale + heure normale d’Afrique méridionale + heure avancée d’Afrique méridionale + + + HAFM + HNAFM + HAAFM + + false + + + + heure d’Afrique de l’Ouest + heure normale d’Afrique de l’Ouest + heure avancée d’Afrique de l’Ouest + + + HAFO + HNAFO + HAAFO + + false + + + + heure d’Aqtöbe + heure normale d’Aqtöbe + heure avancée d’Aqtöbe + + + HAQB + HNAQB + HAAQB + + false + + + + heure de l’Alaska + heure normale de l’Alaska + heure avancée de l’Alaska + + + HAK + HNAK + HAAK + + false + + + + heure d’Alaska - Hawaii + heure normale d’Alaska - Hawaii + heure avancée d’Alaska - Hawaii + + + HAH + HNAH + HAAH + + false + + + + heure d’Alma Ata + heure normale d’Alma Ata + heure avancée d’Alma Ata + + + HALM + HNALM + HAALM + + false + + + + heure de l’Amazonie + heure de l’Amazonie + heure avancée de l’Amazonie + + + HAMA + HNAMA + HAAMA + + false + + + + heure du Centre + heure normale du Centre + heure avancée du Centre + + + HC + HNC + HAC + + false + + + + heure de l’Est + heure normale de l’Est + heure avancée de l’Est + + + HE + HNE + HAE + + false + + + + Heure des Rocheuses + heure normale des Rocheuses + heure avancée des Rocheuses + + + HR + HNR + HAR + + false + + + + heure du Pacifique + heure normale du Pacifique + heure avancée du Pacifique + + + HP + HNP + HAP + + false + + + + heure d’Anadyr + heure d’Anadyr + heure avancée d’Anadyr + + + HANA + HNANA + HAANA + + false + + + + heure d’Aktaou + heure d’Aktaou + heure avancée d’Aktaou + + + HAQT + HNAQT + HAAQT + + false + + + + heure d’Aqtöbe + heure d’Aqtöbe + heure avancé d’Aqtöbe + + + HAQB + HNAQB + HAAQB + + false + + + + heure de l’Arabie + heure normale de l’Arabie + heure avancée de l’Arabie + + + HA + HNA + HAA + + false + + + + heure de l’Est argentin + heure d’Argentine + heure avancée de l’Est argentin + + + HE (AR) + HNE (AR) + HAE (AR) + + false + + + + heure de l’Ouest argentin + heure de l’Ouest argentin + heure avancée de l’Ouest argentin + + + HO (AR) + HNO (AR) + HAO (AR) + + false + + + + heure d’Arménie + heure d’Arménie + heure avancée d’Arménie + + + HAM + HNAM + HAAM + + false + + + + heure d’Achgabat + heure d’Achgabat + heure avancée d’Achgabat + + + HACH + HNACH + HAACH + + false + + + + heure de l’Atlantique + heure normale de l’Atlantique + heure avancée de l’Atlantique + + + HA + HNA + HAA + + false + + + + heure du Centre australien + heure normale du Centre australien + heure avancée du Centre australien + + + HC (AU) + HNC (AU) + HAC (AU) + + false + + + + heure Centre Ouest australien + heure normale Centre Ouest australien + heure avancée du Centre Ouest australien + + + HCO (AU) + HNCO (AU) + HACO (AU) + + false + + + + heure de l’Est australien + heure normale de l’Est australien + heure avancée de l’Est australien + + + HE (AU) + HNE (AU) + HAE (AU) + + false + + + + heure de l’Ouest australien + heure normale de l’Ouest australien + heure avancée de l’Ouest australien + + + HO (AU) + HNO (AU) + HAO (AU) + + false + + + + heure d’Azerbaïdjan + heure d’Azerbaïdjan + heure avancée d’Azerbaïdjan + + + HAZ + HNAZ + HAAZ + + false + + + + heure des Açores + heure des Açores + heure avancée des Açores + + + HAC (PT) + HNAC (PT) + HAAC (PT) + + false + + + + heure de Bakou + heure de Bakou + heure avancée de Bakou + + + HBAK + HNBAK + HABAK + + false + + + + heure du Bangladesh + heure du Bangladesh + heure avancée du Bangladesh + + + HBD + HNBD + HABD + + false + + + + heure de Bering + heure normale de Bering + heure avancée de Bering + + + HBER + HNBER + HABER + + false + + + + heure du Bhoutan + heure du Bhoutan + heure avancée du Bhoutan + + + HBT + HNBT + HABT + + false + + + + heure de Bolivie + heure de Bolivie + heure avancée de Bolivie + + + HBO + HNBO + HABO + + false + + + + heure de Bornéo + heure de Bornéo + heure avancée de Bornéo + + + HBOR + HNBOR + HABOR + + false + + + + heure de Brasilia + heure de Brasilia + heure avancée de Brasilia + + + HBR + HNBR + HABR + + false + + + + heure du Royaume-Uni + heure normale du Royaume-Uni + heure avancée du Royaume-Uni + + + HGB + HNGB + HAGB + + false + + + + heure du Brunéi + heure du Brunéi + heure avancée du Brunéi + + + HBN + HNBN + HABN + + false + + + + heure du Cap-Vert + eure du Cap-Vert + heure avancée du Cap-Vert + + + HCV + HNCV + HACV + + false + + + + heure des Chamorro + heure normale des Chamorro + heure avancée des Chamorro + + + HCh + HNCh + HACh + + false + + + + heure du Changbai + heure du Changbai + heure avancée du Changbai + + + HCHA (CN) + HNCHA (CN) + HACHA (CN) + + false + + + + heure des îles Chatham + heure des îles Chatham + heure avancée des îles Chatham + + + HCHA (NZ) + HNCHA (NZ) + HACHA (NZ) + + false + + + + heure du Chili + heure du Chili + heure avancée du Chili + + + HCL + HNCL + HACL + + false + + + + heure de Chine + heure normale de Chine + heure avancée de Chine + + + HC (CN) + HNC (Chine) + HAC (Chine) + + false + + + false + + + + heure de l’île Christmas + heure de l’île Christmas + heure avancée de l’île Christmas + + + HCX + HNCX + HACX + + false + + + + heure des îles Cocos - Keeling + heure des îles Cocos + heure avancée des îles Cocos - Keeling + + + HCC + HNCC + HACC + + false + + + + heure de Colombie + heure de Colombie + heure avancée de Colombie + + + HCO + HNCO + HACO + + false + + + + heure des îles Cook + heure des îles Cook + heure avancée des îles Cook + + + HCK + HNCK + HACK + + false + + + + heure de Cuba + heure normale de Cuba + heure avancée de Cuba + + + HCU + HNCU + HACU + + false + + + + heure de Dhâkâ + heure de Dhâkâ + heure avancée de Dhâkâ + + + HDAC + HNDAC + HADAC + + false + + + + heure de Davis + heure de Davis + heure avancée de Davis + + + HDAV + HNDAV + HADAV + + false + + + + heure de République dominicaine + heure normale de République dominicaine + heure avancée de République dominicaine + + + HDO + HNDO + HADO + + false + + + + heure de Dumont-d’Urville + heure de Dumont-d’Urville + heure avancée de Dumont-d’Urville + + + HDDU + HNDDU + HADDU + + false + + + + heure de Duchanbé + heure de Duchanbé + heure avancée de Duchanbé + + + HDUC + HNDUC + HADUC + + false + + + + heure de Guyane néerlandaise + heure de Guyane néerlandaise + heure avancée de Guyane néerlandaise + + + HGNE + HAGNE + HAGNE + + false + + + + heure du Timor oriental + heure du Timor oriental + heure avancée du Timor oriental + + + HTL + HNTL + HATL + + false + + + + heure de l’île de Pâques + heure de l’île de Pâques + heure avancée de l’île de Pâques + + + HPAQ + HNPAQ + HAPAQ + + false + + + + heure d’Équateur + heure d’Équateur + heure avancée d’Équateur + + + HEQ + HNEQ + HAEQ + + false + + + + Heure de l’Europe centrale + Heure normale de l’Europe centrale + heure avancée d’Europe centrale + + + HEC + HNEC + HAEC + + true + + + + heure d’Europe de l’Est + Heure normale de l’Europe de l’Est + heure avancée d’Europe de l’Est + + + HEE + HEE + HAEE + + true + + + + heure d’Europe de l’Ouest + heure d’Europe de l’Ouest + heure avancée d’Europe de l’Ouest + + + HEO + HNEO + HAEO + + false + + + + heure des îles Malouines + heure des îles Malouines + heure avancée des îles Malouines + + + HFK + HNFK + HAFK + + false + + + + heure des Îles Fidji + heure des îles Fidji + heure avancée des îles Fidji + + + HFJ + HNFJ + HAFJ + + false + + + + heure de Guyane française + heure de Guyane française + heure avancée de Guyane française + + + HGF + HNGF + HAGF + + false + + + + heure des Terres australes françaises + heure des Terres australes françaises + heure avancée des Terres australes françaises + + + HTF + HNTF + HATF + + false + + + + heure de Frounzé + heure de Frounzé + heure avancée de Frounzé + + + HFRU + FNFRU + HAFRU + + false + + + + heure moyenne de Greenwich + + false + + + + heure des îles Galápagos + heure des îles Galápagos + heure avancée des îles Galápagos + + + HGAL + HNGAL + HAGAL + + false + + + + heure des îles Gambier + heure des îles Gambier + heure avancée des îles Gambier + + + HGAM + HNGAM + HAGAM + + false + + + + heure de Géorgie + heure de Géorgie + heure avancée de Géorgie + + + HGE + HNGE + HAGE + + false + + + + heure des îles Gilbert + heure des îles Gilbert + heure avancée des îles Gilbert + + + HGIL + HNGIL + HAGIL + + false + + + + heure de Goose Bay + heure normale de Goose Bay + heure avancée de Goose Bay + + + HGOB + HNGOB + HAGOB + + false + + + + heure du Centre du Groenland + heure du Centre du Groenland + heure avancée du Centre du Groenland + + + HC (GL) + HNC (GL) + HAC (GL) + + false + + + + heure de l’Est du Groenland + heure de l’Est du Groenland + heure avancée de l’Est du Groenland + + + HE (GL) + HNE (GL) + HAE (GL) + + false + + + + heure de l’Ouest du Groenland + heure de l’Ouest du Groenland + heure avancée de l’Ouest du Groenland + + + HO (GL) + HNO (GL) + HAO (GL) + + false + + + + heure de Guam + heure de Guam + heure avancée de Guam + + + HGU + HNGU + HAGU + + false + + + + heure du Golfe + heure normale du Golfe + heure avancée du Golfe + + + HG + HNG + HAG + + false + + + + heure du Guyana + heure du Guyana + heure avancée du Guyana + + + HGY + HNGY + HAGY + + false + + + + heure d’Hawaii - Aléoutiennes + heure normale d’Hawaii - Aléoutiennes + heure avancée d’Hawaii - Aléoutiennes + + + HH + HNH + HAH + + false + + + + heure de Hong Kong + heure de Hong Kong + heure avancée de Hong Kong + + + HHK + HNHK + HAHK + + false + + + + heure de Hovd + heure de Hovd + heure avancée de Hovd + + + HHOV + HNHOV + HAHOV + + false + + + + heure de l’Inde + heure normale de l’Inde + heure avancée de l’Inde + + + HI (IN) + HNI (IN) + HAI (IN) + + false + + + + heure du Territoire britannique de l’océan Indien + heure du Territoire britannique de l’océan Indien + heure avancée du Territoire britannique de l’océan Indien + + + HIO + HNIO + HAIO + + false + + + + heure d’Indochine + heure d’Indochine + heure avancée d’Indochine + + + HIDC + HNIDC + HAIDC + + false + + + + heure du Centre indonésien + heure normale du Centre indonésien + heure avancée du Centre indonésien + + + HC (ID) + HNC (ID) + HAC (ID) + + false + + + + heure de l’Est indonésien + heure normale de l’Est indonésien + heure avancée de l’Est indonésien + + + HE (ID) + HNE (ID) + HAE (ID) + + false + + + + heure de l’Ouest indonésien + heure normale de l’Ouest indonésien + heure avancée de l’Ouest indonésien + + + HO (ID) + HNO (ID) + HAO (ID) + + false + + + + heure d’Iran + heure normale d’Iran + heure avancée d’Iran + + + HIR + HNIR + HAIR + + false + + + + heure d’Irlande + heure normale d’Irlande + heure avancée d’Irlande + + + HIE + HNIE + HAIE + + false + + + + heure d’Irkoutsk + heure d’Irkoutsk + heure avancée d’Irkoutsk + + + HIRK + HNIRK + HAIRK + + false + + + + heure d’Israël + heure normale d’Israël + heure avancée d’Israël + + + HI (IL) + HNI + HAI + + false + + + + heure du Japon + heure normale du Japon + heure avancée du Japon + + + HJ + HNJ + HAJ + + false + + + + heure de Petropavlovsk-Kamchatski + heure de Petropavlovsk-Kamchatski + heure avancée de Petropavlovsk-Kamchatski + + + HPET + HNPET + HAPET + + false + + + + heure de Karâchi + heure de Karâchi + heure avancée de Karâchi + + + HKAR + HNKAR + HAKAR + + false + + + + heure de Kachgar + heure de Kachgar + heure avancée de Kachgar + + + HKAC + HNKAC + HAKAC + + false + + + + heure de l’Est kazakh + heure normale de l’Est kazakh + heure avancée de l’Est kazakh + + + HE (KZ) + HNE (KZ) + HAE (KZ) + + false + + + + heure de l’Ouest kazakh + heure normale de l’Ouest kazakh + heure avancée de l’Ouest kazakh + + + HO (KZ) + HNO (KZ) + HAO (KZ) + + false + + + + heure de Kyzylorda + heure de Kyzylorda + heure avancée de Kyzylorda + + + HKYZ + HNKYZ + HAKYZ + + false + + + + heure de Corée + heure normale de Corée + heure avancée de Corée + + + HKR + HNKR + HAKR + + false + + + + heure de Kosrae + heure de Kosrae + heure avancée de Kosrae + + + HKOS + HNKOS + HAKOS + + false + + + + heure de Krasnoïarsk + heure de Krasnoïarsk + heure avancée de Krasnoïarsk + + + HKRA + HNKRA + HAKRA + + false + + + + heure de Kouïbychev + heure de Kouïbychev + heure avancée de Kouïbychev + + + HKUY + HNKUY + HAKUY + + false + + + + heure de Kwajalein + heure de Kwajalein + heure avancée de Kwajalein + + + HKWA + HNKWA + HAKWA + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + + heure de Moscou + heure normale de Moscou + heure avancée de Moscou + + + HNMO + HAMO + + false + + + false + + + false + + + false + + + false + + + false + + + + heure de Terre-Neuve + heure normale de Terre-Neuve + heure avancée de Terre-Neuve + + + HT + HNT + HAT + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + + heure de Samara + heure avancée de Samara + + + HNSA + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + + heure de Géorgie du Sud + + + HNG + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + + heure de Turquie + + + HNTR + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + + heure de Volgograd + heure avancée de Volgograd + + + HNVO + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + + heure du Yukon + heure normale du Yukon + heure avancée du Yukon + + + HY + HNY + HAY + + false + + + + + + , +   + ; + % + 0 + # + + + - + E + + + NaN + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0 % + + + + + + + #,##0.00 ¤ + + + {0} {1} + {0} {1} + + + + peseta andorrane + peseta andorrane + pesetas andorranes + ₧A + + + dirham des Émirats arabes unis + dirham des Émirats arabes unis + dirhams des Émirats arabes unis + + + afghani (1927–2002) + afghani (1927–2002) + afghanis (1927–2002) + + + afghani + afghani + afghanis + Af + + + lek albanais (1947–1961) + leks albanais (1947–1961) + + + lek albanais + lek albanais + leks albanais + lek + + + dram arménien + dram arménien + drams arméniens + dram + + + florin antillais + florin antillais + florins antillais + f.NA + + + kwanza angolais + kwanza angolais + kwanzas angolais + + + kwanza angolais (1977-1990) + kwanza angolais (1977–1990) + kwanzas angolais (1977–1990) + + + nouveau kwanza angolais (1990-2000) + nouveau kwanza angolais (1990–2000) + nouveaux kwanzas angolais (1990–2000) + + + kwanza angolais réajusté (1995-1999) + kwanza angolais réajusté (1995–1999) + kwanzas angolais réajustés (1995–1999) + + + austral argentin + austral argentin + australs argentins + + + peso argentin (1983-1985) + peso argentin (1983–1985) + pesos argentins (1983–1985) + + + peso argentin + peso argentin + pesos argentins + Arg$ + + + schilling autrichien + schilling autrichien + schillings autrichiens + öS + + + dollar australien + dollar australien + dollars australiens + $A + + + florin arubais + florin arubais + florins arubais + f.AW + + + manat azéri (1993-2006) + manat azéri (1993–2006) + manats azéris (1993–2006) + + + manat azéri + manat azéri + manats azéris + + + dinar bosniaque + dinar bosniaque + dinars bosniaques + + + mark convertible bosniaque + mark convertible bosniaque + marks convertibles bosniaques + KM + + + dollar barbadien + dollar barbadien + dollars barbadiens + $Bds + + + taka bangladeshi + taka bangladeshi + takas bangladeshis + Tk + + + franc belge (convertible) + franc belge (convertible) + francs belges (convertibles) + + + franc belge + franc belge + francs belges + FB + + + franc belge (financier) + franc belge (financier) + francs belges (financiers) + + + lev bulgare (1962–1999) + lev bulgare (1962–1999) + levs bulgares (1962–1999) + lev + + + nouveau lev bulgare + nouveau lev bulgare + nouveaux levs bulgares + NB + + + dinar bahreïni + dinar bahreïni + dinars bahreïnis + DB + + + franc burundais + franc burundais + francs burundais + FBu + + + dollar bermudien + dollar bermudien + dollars bermudiens + $Bm + + + dollar brunéien + dollar brunéien + dollars brunéiens + $Bn + + + boliviano + boliviano + bolivianos + Bs + + + peso bolivien + peso bolivien + pesos boliviens + $Bo + + + mvdol bolivien + mvdol bolivien + mvdols boliviens + + + nouveau cruzeiro brésilien (1967–1986) + nouveau cruzeiro brésilien (1967–1986) + nouveaux cruzeiros brésiliens (1967–1986) + Cr$ + + + cruzado brésilien (1986–1989) + cruzado brésilien (1986–1989) + cruzados brésiliens (1986–1989) + Cz + + + cruzeiro brésilien (1990–1993) + cruzeiro brésilien (1990–1993) + cruzeiros brésiliens (1990–1993) + Cz$ + + + réal brésilien + réal brésilien + réals brésiliens + + + nouveau cruzado + nouveau cruzado brésilien (1989–1990) + nouveaux cruzados brésiliens (1989–1990) + NCz$ + + + cruzeiro + cruzeiro réal brésilien (1993–1994) + cruzeiros réals brésiliens (1993–1994) + CR$ + + + dollar bahaméen + dollar bahaméen + dollars bahaméens + DBo + + + ngultrum bouthanais + ngultrum bouthanais + ngultrums bouthanais + Nu + + + kyat birman + kyat birman + kyats birmans + + + pula botswanais + pula botswanais + pulas botswanais + PBw + + + nouveau rouble biélorusse (1994-1999) + nouveau rouble biélorusse (1994–1999) + nouveaux roubles biélorusses (1994–1999) + + + rouble biélorusse + rouble biélorusse + roubles biélorusses + Rbl + + + dollar bélizéen + dollar bélizéen + dollars bélizéens + $Bz + + + dollar canadien + dollar canadien + dollars canadiens + $Ca + + + franc congolais + franc congolais + francs congolais + FrCD + + + euro WIR + euro WIR + euros WIR + + + franc suisse + franc suisse + francs suisses + sFr. + + + franc WIR + franc WIR + francs WIR + + + unité d’investissement chilienne + unité d’investissement chilienne + unités d’investissement chiliennes + + + peso chilien + peso chilien + pesos chiliens + $Ch + + + yuan renminbi chinois + yuan renminbi chinois + yuans renminbi chinois + Ұ + + + peso colombien + peso colombien + peso colombien + PsCo + + + Unité de valeur réelle colombienne + unité de valeur réelle colombienne + unités de valeur réelle colombiennes + + + colón costaricain + colón costaricain + colóns costaricains + C + + + dinar serbo-monténégrin + dinar serbo-monténégrin + dinars serbo-monténégrins + DS + + + couronne forte tchécoslovaque + couronne forte tchécoslovaque + couronnes fortes tchécoslovaques + KrCs + + + peso cubain + peso cubain + pesos cubains + PsCu + + + escudo capverdien + escudo capverdien + escudos capverdiens + EscCV + + + livre chypriote + livre chypriote + livres chypriotes + £C + + + couronne tchèque + couronne tchèque + couronnes tchèques + CrCz + + + mark est-allemand + mark est-allemand + marks est-allemands + + + mark allemand + mark allemand + marks allemands + DM + + + franc djiboutien + franc djiboutien + francs djiboutiens + DF + + + couronne danoise + couronne danoise + couronnes danoises + CrD + + + peso dominicain + peso dominicain + pesos dominicains + $RD + + + dinar algérien + dinar algérien + dinars algériens + DA + + + sucre équatorien + sucre équatorien + sucres équatoriens + SEq + + + unité de valeur constante équatoriale (UVC) + unité de valeur constante équatorienne (UVC) + unités de valeur constante équatoriennes (UVC) + UvcÉq + + + couronne estonienne + couronne estonienne + couronnes estoniennes + CrE + + + livre égyptienne + livre égyptienne + livres égyptiennes + £Eg + + + ekwélé + ekue + ekwélés + + + nafka érythréen + nafka érythréen + nafkas érythréens + + + peseta espagnole (compte A) + peseta espagnole (compte A) + pesetas espagnoles (compte A) + + + peseta espagnole (compte convertible) + peseta espagnole (compte convertible) + pesetas espagnoles (compte convertible) + + + peseta espagnole + peseta espagnole + pesetas espagnoles + + + + birr éthiopien + birr éthiopien + birrs éthiopiens + Br + + + euro + euro + euros + + + mark finlandais + mark finlandais + marks finlandais + + + dollar fidjien + dollar fidjien + dollars fidjien + $F + + + livre des Falkland + livre des Falkland + livres des Falkland + £Fk + + + franc français + franc français + francs français + F + + + livre sterling + livre sterling + livres sterling + £UK + + + Georgian Kupon Larit + coupon de lari géorgien + coupons de lari géorgiens + KlGe + + + lari géorgien + lari géorgien + laris géorgiens + lari + + + cédi + cédi ghanéen (1967–2007) + cédis ghanéens (1967–2007) + Cd + + + cédi ghanéen + cédi ghanéen + cédis ghanéens + + + livre de Gibraltar + livre de Gibraltar + livres de Gibraltar + £Gi + + + dalasi gambien + dalasi gambien + dalasis gambiens + Ds + + + franc guinéen + franc guinéen + francs guinéens + GF + + + syli guinéen + syli guinéen + sylis guinéens + + + ekwélé équatoguinéen + ekwélé équatoguinéen + ekwélés équatoguinéens + + + drachme grecque + drachme grecque + drachmes grecques + Dr + + + quetzal guatémaltèque + quetzal guatémaltèque + quetzals guatémaltèques + Q + + + escudo de Guinée portugaise + escudo de Guinée portugaise + escudos de Guinée portugaise + EscGW + + + peso bissau-guinéen + peso bissau-guinéen + pesos bissau-guinéens + PsGW + + + dollar du Guyana + dollar guyanien + dollars guyaniens + G$ + + + dollar de Hong Kong + dollar de Hong Kong + dollars de Hong Kong + $HK + + + lempira hondurien + lempira hondurien + lempiras honduriens + LH + + + dinar croate + dinar croate + dinars croates + + + kuna croate + kuna croate + kunas croates + Ku + + + gourde haïtienne + gourde haïtienne + gourdes haïtiennes + Gd + + + forint hongrois + forint hongrois + forints hongrois + Ft + + + roupie indonésienne + roupie indonésienne + roupies indonésiennes + Rp + + + livre irlandaise + livre irlandaise + livres irlandaises + £IE + + + livre israélienne + livre israélienne + livres israéliennes + £IL + + + nouveau shekel israélien + nouveau shekel israélien + nouveaux shekels israélien + + + + roupie indienne + roupie indienne + roupies indiennes + INR + + + dinar irakien + dinar irakien + dinars irakiens + DI + + + rial iranien + rial iranien + rials iraniens + RI + + + couronne islandaise + couronne islandaise + couronnes islandaises + KrIs + + + lire italienne + lire italienne + lires italiennes + ₤IT + + + dollar jamaïcain + dollar jamaïcain + dollars jamaïcains + $JM + + + dinar jordanien + dinar jordanien + dinars jordaniens + DJ + + + yen japonais + yen japonais + yens japonais + ¥JP + + + shilling kényan + shilling kényan + shillings kényans + ShK + + + som kirghize + som kirghize + soms kirghizes + som + + + riel cambodgien + riel cambodgien + riels cambodgiens + RpC + + + franc comorien + franc comorien + francs comoriens + FC + + + won nord-coréen + won nord-coréen + wons nord-coréens + ₩kp + + + won sud-coréen + won sud-coréen + wons sud-coréens + ₩kr + + + dinar koweïtien + dinar koweïtien + dinar koweïtiens + DK + + + dollar des îles Caïmanes + dollar des îles Caïmanes + dollars des îles Caïmanes + $KY + + + tenge kazakh + tenge kazakh + tenges kazakhs + T + + + kip loatien + kip loatien + kips loatiens + KL + + + livre libanaise + livre libanaise + livres libanaises + £LB + + + roupie srilankaise + roupie srilankaise + roupies srilankaises + ReSL + + + dollar libérien + dollar libérien + dollars libériens + $LR + + + loti lesothan + loti lesothan + maloti lesothans + M + + + maloti + LSM + lotis lesothans + 0≤M|1≤L|1<M + + + litas lituanien + litas lituanien + litas lituaniens + LL + + + talonas lituanien + talonas lituanien + talonas lituaniens + + + franc convertible luxembourgeois + franc convertible luxembourgeois + francs convertibles luxembourgeois + + + franc luxembourgeois + franc luxembourgeois + francs luxembourgeois + FL + + + franc financier luxembourgeois + franc financier luxembourgeois + francs financiers luxembourgeois + + + lats letton + lats letton + lats lettons + l$ + + + rouble letton + rouble letton + roubles lettons + RbL + + + dinar lybien + dinar lybien + dinars lybien + LD + + + dirham marocain + dirham marocain + dirhams marocains + Dm + + + franc marocain + franc marocain + francs marocains + FMa + + + leu moldave + leu moldave + leus moldaves + LM + + + ariary malgache + ariary malgache + ariarys malgaches + Ar + + + franc malgache + franc malgache + francs malgaches + FMg + + + denar macédonien + denar macédonien + denars macédoniens + MDen + + + franc malien + franc malien + francs maliens + Fml + + + kyat myanmarais + kyat myanmarais + kyats myanmarais + KMm + + + tugrik mongol + tugrik mongol + tugriks mongols + Tug + + + pataca macanaise + pataca macanaise + patacas macanaises + PMo + + + ouguiya mauritanien + ouguiya mauritanien + ouguiyas mauritaniens + UM + + + lire maltaise + lire maltaise + lires maltaises + Lm + + + livre maltaise + livre maltaise + livres maltaises + £Mt + + + roupie mauricienne + roupie mauricienne + roupies mauriciennes + RpMu + + + rufiyaa maldivienne + rufiyaa maldivienne + rufiyaas maldiviennes + rf + + + kwacha malawite + kwacha malawite + kwachas malawites + KMw + + + peso mexicain + peso mexicain + pesos mexicains + $Mex + + + peso d’argent mexicain (1861–1992) + peso d’argent mexicain (1861–1992) + pesos d’argent mexicains (1861–1992) + + + unité de conversion mexicaine (UDI) + unité de conversion mexicaine (UDI) + unités de conversion mexicaines (UDI) + + + ringgit malais + ringgit malais + ringgits malais + RMy + + + escudo mozambicain + escudo mozambicain + escudos mozambicains + EscMz + + + métical + metical mozambicain (1980–2006) + meticais mozambicains (1980–2006) + Mt + + + metical mozambicain + metical mozambicain + meticais mozambicains + MTn + + + dollar namibien + dollar namibien + dollars namibiens + N$ + + + naira nigérian + naira nigérian + nairas nigérians + + + cordoba + córdoba nicaraguayen (1912–1988) + córdobas nicaraguayens (1912–1988) + + + córdoba oro nicaraguayen + córdoba oro nicaraguayen + córdobas oro nicaraguayens + + + florin néerlandais + florin néerlandais + florins néerlandais + f. + + + couronne norvégienne + couronne norvégienne + couronnes norvégiennes + KrNo + + + roupie népalaise + roupie népalaise + roupies népalaises + RsNe + + + dollar néo-zélandais + dollar néo-zélandais + dollars néo-zélandais + $NZ + + + rial omani + rial omani + rials omanis + RO + + + balboa panaméen + balboa panaméen + balboas panaméens + B/. + + + inti péruvien + inti péruvien + intis péruviens + I/. + + + nouveau sol péruvien + nouveau sol péruvien + nouveaux sols péruviens + S./ + + + sol péruvien + sol péruvien (1863–1985) + sols péruviens (1863–1985) + + + kina papouan-néo-guinéen + kina papouan-néo-guinéen + kinas papouan-néo-guinéens + + + peso philippin + peso philippin + pesos philippins + Php + + + roupie pakistanaise + roupie pakistanaise + roupies pakistanaises + RaP + + + zloty polonais + zloty polonais + zlotys polonais + Zl + + + zloty (1950-1995) + zloty polonais (1950–1995) + zlotys polonais (1950–1995) + + + escudo portugais + escudo portugais + escudos portugais + Esc + + + guaraní paraguayen + guaraní paraguayen + guaranís paraguayens + + + rial qatari + rial qatari + rials qataris + RQ + + + dollar rhodésien + dollar rhodésien + dollars rhodésiens + $RH + + + ancien leu roumain + leu roumain (1952–2005) + lei roumains (1952–2005) + + + leu roumain + leu roumain + lei roumains + + + dinar serbe + dinar serbe + dinars serbes + + + rouble russe + rouble russe + roubles russes + Rub + + + rouble russe (1991–1998) + rouble russe (1991–1998) + roubles russes (1991–1998) + RuR + + + franc rwandais + franc rwandais + francs rwandais + FRw + + + rial saoudien + rial saoudien + rials saoudiens + Rls + + + dollar des îles Salomon + dollar des îles Salomon + dollars des îles Salomon + $SI + + + roupie des Seychelles + roupie des Seychelles + roupies des Seychelles + RpS + + + dinar soudanais + dinar soudanais (1992–2007) + dinars soudanais (1992–2007) + + + livre soudanaise + livre soudanaise + livres soudanaises + + + livre soudanaise (1956–2007) + livre soudanaise (1956–2007) + livres soudanaises (1956–2007) + + + couronne suédoise + couronne suédoise + couronnes suédoises + KrSw + + + dollar de Singapour + dollar de Singapour + dollars de Singapour + $SG + + + livre de Sainte-Hélène + livre de Sainte-Hélène + livres de Sainte-Hélène + £SH + + + tolar slovène + tolar slovène + tolars slovènes + TSi + + + couronne slovaque + couronne slovaque + couronnes slovaques + KrSk + + + leone sierra-léonais + leone sierra-léonais + leones sierra-léonais + Ln + + + shilling somalien + shilling somalien + shillings somaliens + ShSo + + + dollar surinamais + dollar surinamais + dollars surinamais + $Sr + + + florin surinamais + florin surinamais + florins surinamais + f.Sr + + + dobra santoméen + dobra santoméen + dobras santoméens + Db + + + rouble soviétique + rouble soviétique + roubles soviétiques + RbS + + + colón salvadorien + colón salvadorien + colóns salvadoriens + + + livre syrienne + livre syrienne + livres syriennes + £SY + + + lilangeni swazi + lilangeni swazi + emalangeni swazis + Li + + + baht thaïlandais + baht thaïlandais + baths thaïlandais + B. + + + rouble tadjik + rouble tadjik + roubles tadjiks + + + somoni tadjik + somoni tadjik + somonis tadjiks + + + manat turkmène + manat turkmène + manats turkmènes + + + dinar tunisien + dinar tunisien + dinars tunisiens + DT + + + pa’anga tongan + pa’anga tongan + pa’angas tongans + $To + + + escudo timorais + escudo timorais + escudos timorais + + + livre turque + livre turque (1844–2005) + livres turques + TL + + + nouvelle livre turque + nouvelle livre turque + nouvelles livres turques + YTL + + + dollar trinidadien + dollar trinidadien + dollars trinidadiens + $TT + + + nouveau dollar taïwanais + nouveau dollar taïwanais + nouveaux dollars taïwanais + N$T + + + shilling tanzanien + shilling tanzanien + shillings tanzaniens + ShT + + + hryvnia ukrainienne + hryvnia ukrainienne + hryvnias ukrainiennes + hrn + + + karbovanetz + karbovanets ukrainien (1992–1996) + karbovanets ukrainiens (1992–1996) + + + shilling ougandais (1966-1987) + shilling ougandais (1966–1987) + shillings ougandais (1966–1987) + + + shilling ougandais + shilling ougandais + shillings ougandais + U Sh + + + dollar des États-Unis + dollar des États-Unis + dollars des États-Unis + $US + + + dollar des Etats-Unis (jour suivant) + dollar des États-Unis (jour suivant) + dollars des États-Unis (jour suivant) + + + dollar des Etats-Unis (jour même) + dollar des États-Unis (jour même) + dollars des États-Unis (jour même) + + + peso uruguayen (unités indexées) + peso uruguayen (unités indexées) + pesos uruguayen (unités indexées) + + + peso uruguayen (1975–1993) + peso uruguayen (1975–1993) + pesos uruguayens (1975–1993) + + + peso uruguayen + peso uruguayen + pesos uruguayens + Ur$ + + + sum ouzbek + sum ouzbek + sums ouzbeks + sum + + + bolivar + bolívar vénézuélien (1879–2008) + bolívars vénézuéliens (1879–2008) + Be + + + bolivar fuerte vénézuélien + bolivar fuerte vénézuélien + bolivar fuertes vénézuélien + + + dông vietnamien + dông vietnamien + dôngs vietnamiens + + + + vatu vanuatuan + vatu vanuatuan + vatus vanuatuans + + + tala samoan + tala samoan + talas samoans + + + franc CFA (BEAC) + franc CFA (BEAC) + francs CFA (BEAC) + + + argent + once troy d’argent + onces troy d’argent + + + or + once troy d’or + onces troy d’or + + + unité européenne composée + unité composée européenne (EURCO) + unités composées européennes (EURCO) + + + unité monétaire européenne + unité monétaire européenne (UME-6) + unités monétaires européennes (UME-6) + + + unité de compte européenne (XBC) + unité de compte 9 européenne (UEC-9) + unités de compte 9 européennes (UEC-9) + + + unité de compte européenne (XBD) + unité de compte 17 européenne (UEC-17) + unités de compte 17 européennes (UEC-17) + + + dollar des Caraïbes orientales + dollar des Caraïbes orientales + dollars des Caraïbes orientales + $EC + + + droit de tirage spécial + droit de tirage spécial + droits de tirage spéciaux + + + unité de compte européenne (ECU) + unité de compte européenne (ECU) + unités de compte européennes (ECU) + + + franc or + franc or + francs or + + + franc UIC + franc UIC + francs UIC + + + franc CFA (BCEAO) + franc CFA (BCEAO) + francs CFA (BCEAO) + + + palladium + once troy de palladium + onces troy de palladium + + + franc CFP + franc CFP + francs CFP + FCFP + + + platine + once troy de platine + onces troy de platine + + + type de fonds RINET + type de fonds RINET + types de fonds RINET + + + (devise de test) + (devise de test) + (devise de test) + + + devise inconnue ou non valide + devise inconnue ou non valide + devise inconnue ou non valide + + + dinar du Yémen + dinar nord-yéménite + dinars nord-yéménites + + + rial yéménite + rial yéménite + rials yéménites + RY + + + nouveau dinar yougoslave + dinar fort yougoslave (1966–1989) + dinars forts yougoslaves (1966–1989) + + + dinar yougoslave Noviy + nouveau dinar yougoslave (1994–2003) + nouveaux dinars yougoslaves (1994–2003) + + + dinar yougoslave convertible + dinar convertible yougoslave (1990–1992) + dinars convertibles yougoslaves (1990–1992) + + + rand sud-africain (financier) + rand sud-africain (financier) + rands sud-africains (financiers) + + + rand sud-africain + rand sud-africain + rands sud-africains + R. + + + kwacha zambien + kwacha zambien + kwachas zambiens + KwZ + + + nouveau zaïre zaïrien + nouveau zaïre zaïrien + nouveaux zaïres zaïriens + NZ + + + zaïre zaïrois + zaïre zaïrois + zaïres zaïrois + Z + + + dollar zimbabwéen + dollar zimbabwéen + dollars zimbabwéens + Z$ + + + + + + {0} jour + {0} jours + + + {0} heure + {0} heures + + + {0} minute + {0} minutes + + + {0} mois + {0} mois + + + {0} seconde + {0} secondes + + + {0} semaine + {0} semaines + + + {0} an + {0} années + + + + + oui:o + non:n + + + diff --git a/libs/Zend/Locale/Data/fr_BE.xml b/libs/Zend/Locale/Data/fr_BE.xml new file mode 100644 index 0000000..6a81015 --- /dev/null +++ b/libs/Zend/Locale/Data/fr_BE.xml @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + d/MM/yy + + + + + + + H 'h' mm 'min' ss 's' v + + + + + + du {0} au {1} + + M-M + + + E d/MM - E d/MM + E d/MM - E d/MM + + + MMM-MMM + + + E d MMM 'au' E d MMM + E d 'au' E d MMM + + + d MMM 'au' d MMM + d-d MMM + + + d/MM - d/MM + d/MM - d/MM + + + HH-HH + + + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH-HH v + + + MM/yy - MM/yy + MM/yy - MM/yy + + + E d/MM/yy - E d/MM/yy + E d/MM/yy - E d/MM/yy + E d/MM/yy - E d/MM/yy + + + MMM-MMM yyyy + MMM yyyy 'a`' MMM yyyy + + + E d MMM 'au' E d MMM yyyy + E d 'au' E d MMM yyyy + E d MMM yyyy 'au' E d MMM yyyy + + + d MMM 'au' d MMM yyyy + d-d MMM yyyy + d MMM yyyy 'au' d MMM yyyy + + + d/MM/yy - d/MM/yy + d/MM/yy - d/MM/yy + d/MM/yy - d/MM/yy + + + + + + + + + . + + + + diff --git a/libs/Zend/Locale/Data/fr_CA.xml b/libs/Zend/Locale/Data/fr_CA.xml new file mode 100644 index 0000000..f1d42fe --- /dev/null +++ b/libs/Zend/Locale/Data/fr_CA.xml @@ -0,0 +1,155 @@ + + + + + + + + + + + + + + + + yyyy-MM-dd + + + + + yy-MM-dd + + + + + + + HH 'h' mm 'min' ss 's' v + + + + + + EEE M-d + MM-d + MM-dd + M-d + yyyy-MM + EEE yyyy-MM-dd + yy-MM + + + + E MM-dd – E MM-dd + E MM-dd – E MM-dd + + + LLLL-LLLL + + + MM-dd – MM-dd + MM-dd – MM-dd + + + d–d + + + HH–HH + + + HH:mm–HH:mm + HH:mm–HH:mm + + + HH:mm–HH:mm v + HH:mm–HH:mm v + + + HH–HH v + + + y–y + + + yy-MM – yy-MM + yy-MM – yy-MM + + + 'du' E yy-MM-dd 'au' E yy-MM-dd + 'du' E yy-MM-dd 'au' E yy-MM-dd + 'du' E yy-MM-dd 'au' E yy-MM-dd + + + 'de' MMM yyyy 'à' MMM yyyy + + + 'du' E d MMM 'au' E d MMM yyyy + 'du' E d 'au' E d MMM yyyy + 'du' E d MMM yyyy 'au' E d MMM yyyy + + + MMMM – MMMM yyyy + + + 'du' d MMM 'au' d MMM yyyy + 'du' d MMM yyyy 'au' d MMM yyyy + + + yy-MM-dd – yy-MM-dd + yy-MM-dd – yy-MM-dd + yy-MM-dd – yy-MM-dd + + + + + + + + true + + + true + + + true + + + true + + + true + + + true + + + false + + + false + + + true + + + + + + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + $ + + + $ US + + + + + diff --git a/libs/Zend/Locale/Data/fr_CH.xml b/libs/Zend/Locale/Data/fr_CH.xml new file mode 100644 index 0000000..dfb9e27 --- /dev/null +++ b/libs/Zend/Locale/Data/fr_CH.xml @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + EEEE, d MMMM yyyy + + + + + dd.MM.yy + + + + + + + HH.mm:ss 'h' v + + + + + + dd.MM + MM.yy + + + du {0} au {1} + + M-M + + + E, dd.MM - E, dd.MM + E, dd.MM - E, dd.MM + + + MMM-MMM + + + E, d MMM 'au' E, d MMM + E, d 'au' E, d MMM + + + d MMM 'au' d MMM + d-d MMM + + + dd.MM - dd.MM + dd.MM - dd.MM + + + HH-HH + + + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH-HH v + + + MM.yy - MM.yy + MM.yy - MM.yy + + + E, dd.MM.yy - E, dd.MM.yy + E, dd.MM.yy - E, dd.MM.yy + E, dd.MM.yy - E, dd.MM.yy + + + MMM-MMM yyyy + MMM yyyy 'a`' MMM yyyy + + + E, d MMM 'au' E, d MMM yyyy + E, d 'au' E, d MMM yyyy + E, d MMM yyyy 'au' E, d MMM yyyy + + + d MMM 'au' d MMM yyyy + d-d MMM yyyy + d MMM yyyy 'au' d MMM yyyy + + + dd.MM.yy - dd.MM.yy + dd.MM.yy - dd.MM.yy + dd.MM.yy - dd.MM.yy + + + + + + + + + . + ' + + + + + ¤ #,##0.00;¤-#,##0.00 + + + + + + diff --git a/libs/Zend/Locale/Data/fr_FR.xml b/libs/Zend/Locale/Data/fr_FR.xml new file mode 100644 index 0000000..27f9b1a --- /dev/null +++ b/libs/Zend/Locale/Data/fr_FR.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/fr_LU.xml b/libs/Zend/Locale/Data/fr_LU.xml new file mode 100644 index 0000000..17e81c1 --- /dev/null +++ b/libs/Zend/Locale/Data/fr_LU.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + . + + + + FRF + + + F + + + + diff --git a/libs/Zend/Locale/Data/fr_MC.xml b/libs/Zend/Locale/Data/fr_MC.xml new file mode 100644 index 0000000..4c0124c --- /dev/null +++ b/libs/Zend/Locale/Data/fr_MC.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/fr_SN.xml b/libs/Zend/Locale/Data/fr_SN.xml new file mode 100644 index 0000000..2fc2fc3 --- /dev/null +++ b/libs/Zend/Locale/Data/fr_SN.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/fur.xml b/libs/Zend/Locale/Data/fur.xml new file mode 100644 index 0000000..2e0e5d8 --- /dev/null +++ b/libs/Zend/Locale/Data/fur.xml @@ -0,0 +1,1087 @@ + + + + + + + + + + + afar + avestan + afrikaans + amaric + aragonês + vieri inglês + lenghe Apache + arap + aramaic + assamês + asturian + lenghis australianis + avar + aymarà + azerbaijani + bielorùs + bulgar + bengalês + tibetan + breton + bosniac + catalan + cecen + lenghe celtiche + chamorro + cors + coptic + cree + cec + sclâf de glesie + galês + danês + todesc + sclâf + vieri egjizian + grêc + inglês + esperanto + spagnûl + eston + basc + persian + fulah + finlandês + fizian + faroês + francês + vieri francês + furlan + frisian + gaelic irlandês + gaelic scozês + lenghe gjermaniche + galizian + gotic + vieri grêc + manx + ebraic + hindi + cravuat + haitian + ongjarês + armen + indonesian + inupiaq + ido + islandês + talian + inuktitut + gjaponês + gjeorgjian + kazac + kalaallisut + khmer + kannada + corean + curd + cornualiês + latin + ladin + lussemburghês + limburghês + lingala + lituan + leton + austronesian + maori + lenghis variis + macedon + malayalam + mongul + moldâf + marathi + malês + maltês + lenghis multiplis + mirandês + lenghis Maya + napoletan + norvegjês bokmål + bas todesc + nepalês + olandês + norvegjês nynorsk + norvegjês + vieri norvegjês + navajo + ocitan + osetic + turc otoman + punjabi + papiamento + vieri persian + polac + vieri provenzâl + pashto + portughês + portughês brasilian + quechua + rumanç + romen + lenghe romanze + rus + sanscrit + sardegnûl + sicilian + scozês + sindhi + sami setentrionâl + vieri irlandês + sinalês + slovac + sloven + lenghe sclave + samoan + somal + albanês + serp + sumeric + svedês + swahili + tamil + telegu + tetum + tagic + thai + tagalog + turc + tartar + tahitian + ucrain + indeterminade + urdu + uzbec + vietnamite + valon + yiddish + cinês + cinês semplificât + cinês tradizionâl + zulu + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Mont + Afriche + Americhe dal Nord + Americhe meridionâl + Oceanie + Afriche ocidentâl + Americhe centrâl + Afriche orientâl + Afriche setentrionâl + Afriche di mieç + Afriche meridionâl + Americhis + Americhe setentrionâl + caraibic + Asie orientâl + Asie meridionâl + Asie sud orientâl + Europe meridionâl + Australie e Gnove Zelande + Melanesie + Regjon de Micronesie + Polinesie + Asie + Asie centrâl + Asie ocidentâl + Europe + Europe orientâl + Europe setentrionâl + Europe ocidentâl + Commonwealth dai stâts indipendents + Americhe latine e caraibiche + Andorra + Emirâts araps unîts + Afghanistan + Antigua e Barbuda + Anguilla + Albanie + Armenie + Antilis olandesis + Angola + Antartic + Argjentine + Samoa merecanis + Austrie + Australie + Aruba + Isulis Aland + Azerbaigian + Bosnie e Ercegovine + Barbados + Bangladesh + Belgjiche + Burkina Faso + Bulgarie + Bahrain + Burundi + Benin + Sant Barthélemy + Bermuda + Brunei + Bolivie + Brasîl + Bahamas + Bhutan + Isule Bouvet + Botswana + Bielorussie + Belize + Canade + Isulis Cocos + Republiche Democratiche dal Congo + Republiche centri africane + Congo + Svuizare + Cueste di Avoli + Isulis Cook + Cile + Camerun + Cine + Colombie + Costa Rica + Serbia e Montenegro + Cuba + Cjâf vert + Isule Christmas + Cipri + Republiche ceche + Gjermanie + Gibuti + Danimarcje + Dominiche + Republiche dominicane + Alzerie + Ecuador + Estonie + Egjit + Sahara ocidentâl + Eritree + Spagne + Etiopie + Finlandie + Fizi + Isulis Falkland + Micronesie + Isulis Faroe + France + Gabon + Ream unît + Grenada + Gjeorgjie + Guiana francês + Ghana + Gjibraltar + Groenlande + Gambia + Guinee + Guadalupe + Guinee ecuatoriâl + Grecie + Georgia dal Sud e Isulis Sandwich dal Sud + Guatemala + Guam + Guinea-Bissau + Guyana + Regjon aministrative speciâl de Cine di Hong Kong + Isule Heard e Isulis McDonald + Honduras + Cravuazie + Haiti + Ongjarie + Indonesie + Irlande + Israêl + Isule di Man + India + Teritori britanic dal Ocean Indian + Iraq + Iran + Islande + Italie + Gjamaiche + Jordanie + Gjapon + Kenya + Kirghizstan + Camboze + Kiribati + Comoris + San Kitts e Nevis + Coree dal nord + Coree dal sud + Kuwait + Isulis Cayman + Kazachistan + Laos + Liban + Sante Lusie + Liechtenstein + Sri Lanka + Liberie + Lesotho + Lituanie + Lussemburc + Letonie + Libie + Maroc + Monaco + Moldavie + Sant Martin + Madagascar + Isulis Marshall + Macedonie + Mali + Birmanie + Mongolie + Regjon aministrative speciâl de Cine di Macao + Isulis Mariana dal Nord + Martiniche + Mauritanie + Montserrat + Malta + Maurizi + Maldivis + Malawi + Messic + Malaysia + Mozambic + Namibie + Gnove Caledonie + Niger + Isole Norfolk + Nigerie + Nicaragua + Paîs bas + Norvegje + Nepal + Nauru + Niue + Gnove Zelande + Oman + Panamà + Perù + Polinesie francês + Papue Gnove Guinee + Filipinis + Pakistan + Polonie + San Pierre e Miquelon + Pitcairn + Porto Rico + Teritori palestinês + Portugal + Palau + Paraguay + Qatar + Oceanie periferiche + Union europeane + Reunion + Romanie + Serbie + Russie + Ruande + Arabie Saudide + Isulis Salomon + Seychelles + Svezie + Singapore + Sante Eline + Slovenie + Svalbard e Jan Mayen + Slovachie + Sierra Leone + San Marin + Senegal + Somalie + Suriname + Sao Tomè e Principe + El Salvador + Sirie + Swaziland + Isulis Turks e Caicos + Çad + Teritoris meridionâi francês + Togo + Tailandie + Tazikistan + Tokelau + Timor orientâl + Turkmenistan + Tunisie + Tonga + Turchie + Trinidad e Tobago + Tuvalu + Taiwan + Tanzanie + Ucraine + Uganda + Isulis periferichis minôrs dai Stâts Unîts + Stâts Unîts + Uruguay + Uzbechistan + Vatican + San Vincent e lis Grenadinis + Venezuela + Isulis vergjinis britanichis + Isulis vergjinis americanis + Vietnam + Vanuatu + Wallis e Futuna + Samoa + Yemen + Mayotte + Sud Afriche + Zambia + Zimbabwe + Regjon no cognossude o no valide + + + Ortografie todescje tradizionâl + Ortografie resiane standard + Ortografie todescje dal 1996 + Dialet des valadis dal Nadison + Politoniche + Ortografie revisade + Resian + + + calendari + ordenament + monede + + + ordin cinês tradizionâl - Big5 + calendari budist + calendari cinês + ordin diret + ordin cinês semplificât - GB2312 + calendari gregorian + calendari ebreu + calendari nazionâl indian + calendari islamic + calendari islamic civîl + calendari gjaponês + ordin elenc telefonic + ordin pinyin + calendari de Republiche di Cine + ordin segns + ordin tradizionâl + + + anglosasson + metric + + + Lenghe: {0} + Scriture: {0} + Regjon: {0} + + + + [a à â b c ç d e è ê f-i ì î j-o ò ô p-u ù û v-z] + [å č é ë ğ ï ñ ó š ü] + [a-z] + + + + + + + + + + + + + + Zen + Fev + Mar + Avr + Mai + Jug + Lui + Avo + Set + Otu + Nov + Dic + + + Zenâr + Fevrâr + Març + Avrîl + Mai + Jugn + Lui + Avost + Setembar + Otubar + Novembar + Dicembar + + + + + Z + F + M + A + M + J + L + A + S + O + N + D + + + + + + + dom + lun + mar + mie + joi + vin + sab + + + domenie + lunis + martars + miercus + joibe + vinars + sabide + + + + + D + L + M + M + J + V + S + + + + + + + T1 + T2 + T3 + T4 + + + Prin trimestri + Secont trimestri + Tierç trimestri + Cuart trimestri + + + + + 1 + 2 + 3 + 4 + + + + a. + p. + + + pdC + ddC + + + pdC + ddC + + + + + + EEEE d 'di' MMMM 'dal' yyyy + + + + + d MMMM yyyy + + + + + d MMM yyyy + + + + + d/MM/yy + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1} {0} + + + + H:mm + L + E d/M + LLL + E d MMM + E d MMMM + d MMMM + d MMM + d/MM + d/M + d + mm:ss + yyyy + M/yyyy + EEE, d/M/yyyy + MMM yyyy + EEE d MMM yyyy + MMMM yyyy + Q yyyy + QQQ yyyy + MM/yy + Q yy + MMMM yyyy + + + + E dd/MM/yyyy - E dd/MM/yyyy + + + MM - MM/yyyy + MM/yyyy - MM/yyyy + + + E dd/MM/yyyy - E dd/MM/yyyy + E dd/MM/yyyy - E dd/MM/yyyy + E dd/MM/yyyy - E dd/MM/yyyy + + + MM - MM/yyyy + MM/yyyy - MM/yyyy + + + dd/MM/yyyy - d/MM + d - d/MM/yyyy + dd/MM/yyyy - dd/MM/yyyy + + + + + + ere + + + an + + + mês + + + setemane + + + + vuê + doman + passantdoman + tra trê dîs + îr + îr l'altri + trê dîs fa + + + dì de setemane + + + toc dal dì + + + ore + + + minût + + + secont + + + zone + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + No cognossude + + + San Pauli dal Brasîl + + + Canariis + + + Azoris + + + Lisbone + + + Mosche + + + Gnove York + + + + Ore de Europe centrâl + Ore estive de Europe centrâl + + + + + Ore de Europe orientâl + Ore estive de Europe orientâl + + + + + Ore de Europe ocidentâl + Ore estive de Europe ocidentâl + + + + + Ore di Mosche + + + + + + + . + , + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + ¤ #,##0.00 + + + + + + Dram armen + + + Peso argjentin + + + Selin austriac + + + Dolar australian + + + Franc de Belgjiche + + + Franc burundês + + + Dolar dal Brunei + + + Real brasilian + + + Rubli bielorùs + + + Dolar canadês + + + Franc svuizar + + + Yuan Renminbi cinês + + + Vieri dinar serp + + + Peso cuban + + + Corone de Republiche Ceche + + + Marc todesc + + + Corone danês + + + Dinar algerin + + + Euro + + + Franc francês + + + Sterline britaniche + + + Dinar cravuat + + + Kuna cravuate + + + Rupie indiane + + + Rial iranian + + + Lire taliane + + + Yen gjaponês + + + Won de Coree dal Sud + + + Lats leton + + + Peso messican + + + Dolar namibian + + + Córdoba oro nicaraguan + + + Corone norvegjêse + + + Dollar neozelandês + + + Rupie pachistane + + + Zloty polac + + + Dinar serp + + + Rubli rus + + + Corone svedese + + + Talar sloven + + + Corone slovache + + + Viere Lire turche + + + Lire turche + + + Dolar american + $ + + + Monede no valide o no cognossude + + + Rand sudafrican + + + + + + {0} zornade + {0} zornadis + + + {0} ore + {0} oris + + + {0} minût + {0} minûts + + + {0} mês + {0} mês + + + {0} secont + {0} seconts + + + {0} setemane + {0} setemanis + + + {0} an + {0} agns + + + + + sì:si:s + no:n + + + + diff --git a/libs/Zend/Locale/Data/fur_IT.xml b/libs/Zend/Locale/Data/fur_IT.xml new file mode 100644 index 0000000..16be571 --- /dev/null +++ b/libs/Zend/Locale/Data/fur_IT.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/ga.xml b/libs/Zend/Locale/Data/ga.xml new file mode 100644 index 0000000..7f75c58 --- /dev/null +++ b/libs/Zend/Locale/Data/ga.xml @@ -0,0 +1,1602 @@ + + + + + + + + + en_IE + + + aa + Abcáisis + Aivéistis + Afracáinis + Amarais + Araibis + Asaimis + Asarbaiseáinis + Baiscíris + Bealarúisis + Bulgáiris + Bihairis + Beangáilis + Tibéadais + Briotáinis + Boisnis + Catalóinis + Sisinis + Corsaicis + Craíais + Seicis + Slavais na hEaglaise + Suvaisis + Breatnais + Danmhairgis + Gearmáinis + Gréigis + Béarla + Esperanto + Spáinnis + Eastóinis + Bascais + Peirsis + Fionlainnis + fil + Fidsis + Faróis + Fraincis + Freaslainnis Iartharach + Gaeilge + Gaeilge na hAlban + Gailísis + Guaráinis + Gúisearáitis + Mannainis + Haváíais + Eabhrais + Hiondúis + Cróitis + Ungáiris + Airméinis + Interlingua + Indinéisis + Interlingue + Inupiaq + Ido + Íoslainnis + Iodáilis + Ionúitis + Seapáinis + Iávais + Seoirsis + Casachais + Cambóidis + Cannadais + Cóiréis + Caismíris + Coirdis + Cornais + Cirgeasais + Laidin + Leitseabuirgis + ln + Laosais + Liotuáinis + Laitvis + Malagásais + Maorais + Macadóinis + Mailéalaimis + Mongóilis + Moldáivis + Maraitis + Malaeis + Maltais + Burmais + Nárúis + Ioruais Bokmål + Neipealais + Ollainnis + Ioruais Nynorsk + Ioruais + Navachóis + Ocatáinis + Oraisis + Óiséitis + Puinseáibis + Polainnis + Paistis + Portaingéilis + Portaingéilis Bhrasaíleach + Portaingéilis Ibéireach + Ceatsuais + Rómáinis + Rúisis + Sanscrait + Sairdínis + Sindis + Sáimis Thuaidh + Seirbea-Chróitis + Siolóinis + Slóvaicis + Slóivéinis + Samóis + Somáilis + Albáinis + Seirbis + Sótais Dheisceartach + Sundais + Sualainnis + Svahaílis + Tamailis + Teileagúis + Téalainnis + Tigrinis + Tuircméinis + Tagálaigis + Klingon + Tuircis + Tatarais + Tvís + Taihítis + ug + Úcráinis + Teanga Anaithnid nó Neamhbhailí + Urdais + Úisbéicis + Vítneamais + Vallúnais + Cósais + Giúdais + Sínis + Sínis Shimplithe + Sínis Thraidisiúnta + Súlúis + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + An Domhan + An Afraic + An Aigéine + Meiriceá Láir + An Afraic Láir + Na Meiriceánna + An Astráil agus an Nua-Shéalainn + An Mheilinéis + An Réigiún Micrinéiseach + An Pholainéis + An Áise + An Áise Láir + An Eoraip + Comhlathas na Stát Neamhspleácha + Meiriceá Laidineach agus an Mhuir Chairib + Andóra + Aontas na nÉimíríochtaí Arabacha + An Afganastáin + Aintíge agus Barbúda + Anguilla + An Albáin + An Airméin + Antillí na hÍsiltíre + Angóla + An Antartaice + An Airgintín + Samó Meiriceánach + An Ostair + An Astráil + Arúba + Oileáin Alaind + An Asarbaiseáin + An Bhoisnia agus Heirseagóvéin + Barbadós + An Bhanglaidéis + An Bheilg + Buircíne Fasó + An Bhulgáir + Bairéin + An Bhurúin + Beinin + Beirmiúda + Brúiné + An Bholaiv + An Bhrasaíl + Na Bahámaí + An Bhútáin + Oileán Bouvet + An Bhotsuáin + An Bhealarúis + An Bheilís + Ceanada + Oileáin na gCócónna + Poblacht Dhaonlathach an Chongó + Poblacht na hAfraice Láir + An Congó + An Eilvéis + An Cósta Eabhair + Oileáin Cook + An tSile + Camarún + An tSín + An Cholóim + Cósta Ríce + An tSeirbia agus Montainéagró + Cúba + An Rinn Ghlas + Oileán na Nollag + An Chipir + Poblacht na Seice + An Ghearmáin + Djibouti + An Danmhairg + Doiminice + An Phoblacht Dhoiminiceach + An Ailgéir + Eacuadór + An Eastóin + An Éigipt + An Sahára Thiar + An Eiritré + An Spáinn + An Aetóip + An Fhionlainn + Fidsí + Oileáin Fháclainne + An Mhicrinéis + Oileáin Fharó + An Fhrainc + An Ghabúin + An Ríocht Aontaithe + Grenada + An tSeoirsia + An Ghuáin Fhrancach + Geansaí + Gána + Giobráltar + An Ghraonlainn + An Ghaimbia + An Ghuine + Guadalúip + An Ghuine Mheánchriosach + An Ghréig + An tSeoirsia Theas agus Oileáin Sandwich Theas + Guatamala + Guam + An Ghuine-Bhissau + An Ghuáin + Hong Cong + Oileán Heard agus Oileáin McDonald + Hondúras + An Chróit + Háití + An Ungáir + An Indinéis + Éire + Iosrael + Oileán Mhanann + An India + Críocha Briotanacha an Aigéin Indiagh + An Iaráic + An Iaráin + An Íoslainn + An Iodáil + Geirsí + Iamáice + An Iordáin + An tSeapáin + An Chéinia + An Chirgeastáin + An Chambóid + Ciribeas + Oileáin Chomóra + Saint Kitts agus Nevis + An Chóiré Thuaidh + An Chóiré Theas + Cuáit + Oileáin na gCadhman + An Chasacstáin + Laos + An Liobáin + San Lúisia + Lichtinstéin + Srí Lanca + An Libéir + Leosóta + An Liotuáin + Lucsamburg + An Laitvia + An Libia + Maracó + Monacó + An Mholdóiv + Montainéagró + Madagascar + Oileáin Marshall + An Mhacadóin + Mailí + Maenmar + An Mhongóil + Macáó + Oileáin Mariana Thuaidh + Martainíc + An Mharatáin + Montsarat + Málta + Oileán Mhuirís + Na Maildiví + An Mhaláiv + Meicsiceo + An Mhalaeisia + Mósaimbíc + An Namaib + An Nua-Chaladóin + An Nígir + Oileán Norfolk + An Nigéir + Nicearagua + An Ísiltír + An Iorua + Neipeal + Nárú + Nívé + An Nua-Shéalainn + Óman + Panama + Peiriú + An Pholainéis Fhrancach + Nua-Ghuine Phapua + Na hOileáin Fhilipíneacha + An Phacastáin + An Pholainn + Saint Pierre agus Miquelon + Pitcairn + Portó Ríce + Na Críocha Pailistíneacha + An Phortaingéil + Palau + Paragua + Catar + An Aigéine Imeallach + An tAontas Eorpach + Réunion + An Rómáin + An tSeirbia + Cónaidhm na Rúise + Ruanda + An Araib Shádach + Oileáin Sholaimh + Na Séiséil + An tSúdáin + An tSualainn + Singeapór + San Héilin + An tSlóvéin + Svalbard agus Jan Mayen + An tSlóvaic + Siarra Leon + San Mairíne + An tSeineagáil + An tSomáil + Suranam + Sao Tome agus Principe + An tSalvadóir + An tSiria + An tSuasalainn + Oileáin Turks agus Caicos + Sead + Críocha Deisceartacha na Fraince + Tóga + An Téalainn + An Táidsíceastáin + Tócalá + Tíomór Thoir + An Tuircméanastáin + An Túinéis + Tonga + An Tuirc + Oileáin na Tríonóide agus Tobága + Túválú + An Téaváin + An Tansáin + An Úcráin + Úganda + Mion-Oileáin Imeallacha S.A.M. + Stáit Aontaithe Mheiriceá + Urugua + Úisbéiceastáin + An Vatacáin + Saint Vincent agus na Grenadines + Veiniséala + Oileáin Bhriotanacha na Maighdean + Oileáin na Maighdean S.A.M. + Vít Neam + Vanuatú + Oileáin Vailís agus Futúna + Samó + Éimin + Mayotte + An Afraic Theas + An tSaimbia + An tSiombáib + Réigiún Anaithnid nó Neamhbhailí + + + Féilire + Comhordú + Airgeadra + + + Ord sórtála Síneach traidisiúnta - Big5 + Féilire Búdaíoch + Féilire Síneach + Ord sórtála díreach + Ord sórtála Síneach simplithe - GB 2312 + Féilire Greagórach + Féilire Eabhrach + Féilire Ioslamach + Féilire Ioslamach Sibhialta + Féilire Seapánach + Ord sórtála an eolaire teileafóin + Ord sórtála pinyin + Ord sórtála stríce + Ord sórtála traidisiúnta + + + Meiriceánach + Méadrach + + + + [a á b-e é f-i í j-o ó p-u ú v-z] + [ḃ ċ ḋ ḟ ġ ṁ ṗ ṡ ṫ] + + + RbMLkUnsSElFtTauKcBeyrACvdz + + + + + + EEEE d MMMM yyyy G + + + + + + + + + Ean + Feabh + Márta + Aib + Beal + Meith + Iúil + Lún + MFómh + DFómh + Samh + Noll + + + Eanáir + Feabhra + Márta + Aibreán + Bealtaine + Meitheamh + Iúil + Lúnasa + Meán Fómhair + Deireadh Fómhair + Samhain + Nollaig + + + + + E + F + M + A + B + M + I + L + M + D + S + N + + + + + + + Domh + Luan + Máirt + Céad + Déar + Aoine + Sath + + + Dé Domhnaigh + Dé Luain + Dé Máirt + Dé Céadaoin + Déardaoin + Dé hAoine + Dé Sathairn + + + + + D + L + M + C + D + A + S + + + + + + + R1 + R2 + R3 + R4 + + + 1ú ráithe + 2ú ráithe + 3ú ráithe + 4ú ráithe + + + + a.m. + p.m. + + + Roimh Chríost + Anno Domini + + + RC + AD + + + + + + EEEE d MMMM yyyy + + + + + d MMMM yyyy + + + + + d MMM yyyy + + + + + dd/MM/yyyy + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1} {0} + + + + HH:mm + HH:mm:ss + d MMMM + dd/MM + d/M + mm:ss + MM/yy + MMM yy + Q yy + MM/yyyy + MMMM yyyy + + + + + + + + Bliain + + + + + + Seachtain + + + + Inniu + Amárach + Arú amárach + Inné + Arú inné + + + Lá na seachtaine + + + a.m./p.m. + + + Uair + + + Nóiméad + + + Soicind + + + Crios + + + + + + +HH:mm;-HH:mm + MAG{0} + {0} + + Anaithnid + + + + Am Samhraidh na Breataine + + + ASB + + Londain + + + + Am Samhraidh na hÉireann + + + ASÉ + + Baile Átha Cliath + + + + Meán-Am Greenwich + + + MAG + + + + + + + . + , + + + + + ¤#,##0.00 + + + + + + Peseta Andóra + + + Dirham Aontas na nÉimíríochtaí Arabacha + + + Afgainí (1927-2002) + + + Afgainí + Af + + + Lek Albánach + lek + + + Dram Airméanach + dram + + + Guilder na nAntillí Ísiltíreach + AÍ f. + + + Kwanza Angólach + + + Kwanza Angólach (1977-1990) + + + Kwanza Nua Angólach (1990-2000) + + + Kwanza Reajustado Angólach (1995-1999) + + + Austral Airgintíneach + + + Peso na Airgintíne (1983-1985) + + + Peso na Airgintíne + Arg$ + + + Scilling Ostarach + + + Dollar Astrálach + A$ + + + Guilder Aruba + + + Manat Asarbaiseánach + + + Dínear Bhoisnia-Heirseagaivéin + + + Marc Inathraithe Bhoisnia-Heirseagaivéin + KM + + + Dollar Bharbadóis + BDS$ + + + Taka Bhanglaidéiseach + Tk + + + Franc Beilgeach (inathraithe) + + + Franc Beilgeach + BF + + + Franc Beilgeach (airgeadúil) + + + Lev Bulgárach Crua + lev + + + Lev Nua Bulgárach + + + Dínear na Bairéine + BD + + + Franc na Burúine + Fbu + + + Dollar Bheirmiúda + Ber$ + + + Dollar Bhrúiné + + + Boliviano + Bs + + + Peso na Bolaive + + + Mvdol Bolavach + + + Cruzeiro Novo Brasaíleach (1967-1986) + + + Cruzado Brasaíleach + + + Cruzeiro Brasaíleach (1990-1993) + + + Real Brasaíleach + + + Cruzado Novo Brasaíleach + + + Cruzeiro Brasaíleach + + + Dollar na mBahámaí + + + Ngultrum Bútánach + Nu + + + Kyat Burmach + + + Pula Botsuánach + + + Rúbal Nua Béalarúiseach (1994-1999) + + + Rúbal Béalarúiseach + Rbl + + + Dollar na Beilíse + BZ$ + + + Dollar Ceanada + Can$ + + + Franc Congolais an Chongó + + + Franc na hEilvéise + + + Unidades de Fomento na Sile + + + Peso na Sile + Ch$ + + + Yuan Renminbi Síneach + Y + + + Peso na Colóime + Col$ + + + Colon Chósta Ríce + C + + + Koruna Crua na Seicslóvaice + + + Peso Cúba + + + Escudo na Rinne Verde + CVEsc + + + Punt na Cipire + £C + + + Koruna Phoblacht na Seice + + + Ostmark na hOirGhearmáine + + + Deutsche Mark + + + Franc Djibouti + DF + + + Krone Danmhargach + DKr + + + Peso Doimineacach + RD$ + + + Dínear na hAilgéire + DA + + + Sucre Eacuadóir + + + Unidad de Valor Constante (UVC) Eacuadóir + + + Kroon na hEastóine + + + Punt na hÉigipte + + + Peseta Spáinneach + + + Birr na hAetóipe + Br + + + Euro + + + Markka Fionnlannach + + + Dollar Fhidsí + F$ + + + Punt Oileáin Fháclainne + + + Franc Francach + + + Punt Steirling + + + Kupon Larit na Grúise + + + Lari na Grúise + lari + + + Cedi Ghána + + + Punt Ghiobráltair + + + Dalasi Gaimbia + + + Franc Guine + GF + + + Syli Guine + + + Ekwele Guineana na Guine Meánchriosaí + + + Drachma Gréagach + + + Quetzal Guatamala + Q + + + Escudo na Guine Portaingéalaí + + + Peso Guine-Bhissau + + + Dollar na Guáine + G$ + + + Dollar Hong Cong + HK$ + + + Lempira Hondúrais + L + + + Dínear na Cróite + + + Kuna Crótach + + + Gourde Háití + + + Forint Ungárach + Ft + + + Rupiah Indinéiseach + Rp + + + Punt Éireannach + £ + + + Punt Iosraelach + + + Sheqel Nua Iosraelach + + + Rúipí India + + + Dínear Irácach + ID + + + Rial Iaránach + RI + + + Krona Íoslannach + + + Lira Iodálach + + + Dollar Iamácach + J$ + + + Dínear Iordánach + JD + + + Yen Seapánach + + + Scilling Céiniach + K Sh + + + Som na Cirgeastáine + som + + + Riel na Cambóide + CR + + + Franc Chomóra + CF + + + Won na Cóiré Thuaidh + + + Won na Cóiré Theas + + + Dínear Cuátach + KD + + + Dollar Oileáin Cayman + + + Tenge Casacstánach + T + + + Kip Laosach + + + Punt na Liobáine + LL + + + Rúipí Srí Lanca + SL Re + + + Dollar na Libéire + + + Loti Leosóta + M + + + Lita Liotuánach + + + Talonas Liotuánach + + + Franc Lucsamburg + + + Lats Laitviach + + + Rúbal Laitviach + + + Dínear Libia + LD + + + Dirham Mharacó + + + Franc Mharacó + + + Leu Moldóvach + + + Ariary Madagascar + + + Franc Madagascar + + + Denar na Macadóine + MDen + + + Franc Mhailí + + + Kyat Mhaenmar + + + Tugrik Mongólach + Tug + + + Pataca Macao + + + Ouguiya na Maratáine + UM + + + Lira Maltach + Lm + + + Punt Maltach + + + Rúipí Oileán Mhuirís + + + Maldive Islands Rufiyaa + + + Kwacha na Maláive + MK + + + Peso Meicsiceo + MEX$ + + + Peso Airgid Meicsiceo (1861-1992) + + + Unidad de Inversion (UDI) Meicsiceo + + + Ringgit Malaeisia + RM + + + Escudo Mósaimbíce + + + Metical Mósaimbíce + Mt + + + Dollar na Namaibe + N$ + + + Naira Nígéarach + + + Cordoba Nicearagua + + + Cordoba Oro Nicearagua + + + Guilder Ísiltíreach + + + Krone Ioruach + NKr + + + Rúipí Neipeáil + Nrs + + + Dollar na Nua-Shéalainne + $NZ + + + Rial Omain + RO + + + Balboa Panamach + + + Inti Pheiriú + + + Sol Nuevo Pheiriú + + + Sol Pheiriú + + + Kina Nua-Ghuine Phapua + + + Peso Filipíneach + + + Rúipí na Pacastáine + Pra + + + Zloty Polannach + Zl + + + Zloty Polannach (1950-1995) + + + Escudo Portaingélach + + + Guarani Pharagua + + + Rial Catarach + QR + + + Leu Rómánach + leu + + + Rúbal Rúiseach + + + Rúbal Rúiseach (1991-1998) + + + Franc Ruanda + + + Riyal Sádach + SRl + + + Dollar Oileáin Solomon + SI$ + + + Rúipí na Séiséil + SR + + + Dínear na Súdáine + + + Punt na Súdáine + + + Krona Sualannach + SKr + + + Dollar Singeapóir + S$ + + + Punt San Héilin + + + Tolar Slóvénach + + + Koruna na Slóvaice + Sk + + + Leone Shiarra Leon + + + Scilling na Sómáile + Sh. + + + Guilder Shuranaim + Sf + + + Dobra Sao Tome agus Principe + Db + + + Rúbal Sóvéadach + + + Colon na Salvadóire + + + Punt Siria + LS + + + Lilangeni na Suasalainne + E + + + Baht na Téalainne + + + Rúbal na Táidsíceastáine + + + Somoni na Táidsíceastáine + + + Manat na An Tuircméanastáine + + + Dínear na Túinéise + + + Paʻanga Tonga + T$ + + + Escudo Tíomóir + + + Lira Turcach + TL + + + Dollar Oileáin na Tríonóide agus Tobága + TT$ + + + Dollar Nua na Téaváine + NT$ + + + Scilling na Tansáine + T Sh + + + Hryvnia Úcránach + + + Karbovanetz Úcránach + + + Scilling Uganda (1966-1987) + + + Scilling Uganda + U Sh + + + Dollar S.A.M. + + + Dollar S.A.M. (an chéad lá eile) + + + Dollar S.A.M. (an la céanna) + + + Peso Uragua (1975-1993) + + + Peso Uruguayo Uragua + Ur$ + + + Sum na hÚisbéiceastáine + + + Bolivar Veiniséala + Be + + + Dong Vítneamach + + + Vatu Vanuatú + VT + + + Tala Samó Thiar + + + CFA Franc BEAC + + + Ór + + + Aonad Ilchodach Eorpach + + + Aonad Airgeadaíochta Eorpach + + + Aonad Cuntais Eorpach (XBC) + + + Aonad Cuntais Eorpach (XBD) + + + Dollar Oirthear na Cairibe + EC$ + + + Cearta Speisialta Tarraingthe + + + Aonad Airgeadra Eorpach + + + Franc Ór Francach + + + UIC-Franc Francach + + + CFA Franc BCEAO + + + CFP Franc + CFPF + + + Airgeadra Anaithnid nó Neamhbhailí + + + Dínear Éimin + + + Rial Éimin + YRl + + + Dínear Crua Iúgslavach + + + Noviy Dinar Iúgslavach + + + Dínear Inathraithe Iúgslavach + + + Rand na hAfraice Theas (airgeadúil) + + + Rand na hAfraice Theas + R + + + Kwacha Saimbiach + + + Zaire Nua Sáíreach + + + Zaire Sáíreach + + + Dollar Siombábach + Z$ + + + + + + tá:t + níl:n + + + diff --git a/libs/Zend/Locale/Data/ga_IE.xml b/libs/Zend/Locale/Data/ga_IE.xml new file mode 100644 index 0000000..31c28c9 --- /dev/null +++ b/libs/Zend/Locale/Data/ga_IE.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/gaa.xml b/libs/Zend/Locale/Data/gaa.xml new file mode 100644 index 0000000..7bee0b7 --- /dev/null +++ b/libs/Zend/Locale/Data/gaa.xml @@ -0,0 +1,200 @@ + + + + + + + + + + [a-z] + + + ' + ' + " + " + + + + + + + + Aha + Ofl + Och + Abe + Agb + Otu + Maa + Man + Gbo + Ant + Ale + Afu + + + Aharabata + Oflo + Ochokrikri + Abeibee + Agbeinaa + Otukwadan + Maawe + Manyawale + Gbo + Anton + Alemle + Afuabee + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + Ho + Dzu + Dzf + Sho + Soo + Soh + Ho + + + Hogbaa + Dzu + Dzufo + Sho + Soo + Sohaa + Ho + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + LB + SN + + + Dani Jesu + KJ + + + DJ + KJ + + + + + + EEEE, yyyy MMMM dd + + + + + yyyy MMMM d + + + + + yyyy MMM d + + + + + yy/MM/dd + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1} {0} + + + + Q yy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + + Sidi + ¢ + + + + diff --git a/libs/Zend/Locale/Data/gaa_GH.xml b/libs/Zend/Locale/Data/gaa_GH.xml new file mode 100644 index 0000000..2bd87b4 --- /dev/null +++ b/libs/Zend/Locale/Data/gaa_GH.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/gez.xml b/libs/Zend/Locale/Data/gez.xml new file mode 100644 index 0000000..849e9c1 --- /dev/null +++ b/libs/Zend/Locale/Data/gez.xml @@ -0,0 +1,514 @@ + + + + + + + + + + + አፋርኛ + አብሐዚኛ + አፍሪቃንስኛ + አምሐረኛ + ዐርቢኛ + አሳሜዛዊ + አያማርኛ + አዜርባይጃንኛ + ባስኪርኛ + ቤላራሻኛ + ቡልጋሪኛ + ቢሃሪ + ቢስላምኛ + በንጋሊኛ + ትበትንኛ + ብሬቶንኛ + ብሊን + ካታላንኛ + ኮርሲካኛ + ቼክኛ + ወልሽ + ዴኒሽ + ጀርመን + ድዞንግኻኛ + ግሪክኛ + እንግሊዝኛ + ኤስፐራንቶ + ስፓኒሽ + ኤስቶኒአን + ባስክኛ + ፐርሲያኛ + ፊኒሽ + ፊጂኛ + ፋሮኛ + ፈረንሳይኛ + ፍሪስኛ + አይሪሽ + እስኮትስ፡ጌልክኛ + ግዕዝኛ + ጋለጋኛ + ጓራኒኛ + ጉጃርቲኛ + ሃውሳኛ + ዕብራስጥ + ሐንድኛ + ክሮሽያንኛ + ሀንጋሪኛ + አርመናዊ + ኢንቴርሊንጓ + እንዶኒሲኛ + እንተርሊንግወ + እኑፒያቅኛ + አይስላንድኛ + ጣሊያንኛ + እኑክቲቱትኛ + ጃፓንኛ + ጃቫንኛ + ጊዮርጊያን + ካዛክኛ + ካላሊሱትኛ + ክመርኛ + ካናዳኛ + ኮሪያኛ + ካሽሚርኛ + ኩርድሽኛ + ኪርጊዝኛ + ላቲንኛ + ሊንጋላኛ + ላውስኛ + ሊቱአኒያን + ላትቪያን + ማላጋስኛ + ማዮሪኛ + ማከዶኒኛ + ማላያላምኛ + ሞንጎላዊኛ + ሞልዳቫዊና + ማራዚኛ + ማላይኛ + ማልቲስኛ + ቡርማኛ + ናኡሩ + ኔፓሊኛ + ደች + ኖርዌጂያን + ኦኪታንኛ + ኦሮምኛ + ኦሪያኛ + ፓንጃቢኛ + ፖሊሽ + ፑሽቶኛ + ፖርቱጋሊኛ + ኵቿኛ + ሮማንስ + ሩንዲኛ + ሮማኒያን + ራሽኛ + ኪንያርዋንድኛ + ሳንስክሪትኛ + ሲንድሂኛ + ሳንጎኛ + ስንሃልኛ + ሲዳምኛ + ስሎቫክኛ + ስሎቪኛ + ሳሞአኛ + ሾናኛ + ሱማልኛ + ልቤኒኛ + ሰርቢኛ + ስዋቲኛ + ሶዞኛ + ሱዳንኛ + ስዊድንኛ + ስዋሂሊኛ + ታሚልኛ + ተሉጉኛ + ታጂኪኛ + ታይኛ + ትግርኛ + ትግረ + ቱርክመንኛ + ታጋሎገኛ + ጽዋናዊኛ + ቶንጋ + ቱርክኛ + ጾንጋኛ + ታታርኛ + ትዊኛ + ኡዊግሁርኛ + ዩክረኒኛ + ኡርዱኛ + ኡዝበክኛ + ቪትናምኛ + ቮላፑክኛ + ዎሎፍኛ + ዞሳኛ + ይዲሻዊኛ + ዮሩባዊኛ + ዡዋንግኛ + ቻይንኛ + ዙሉኛ + + + + + + አንዶራ + የተባበሩት፡አረብ፡ኤምሬትስ + አልባኒያ + አርሜኒያ + ኔዘርላንድስ፡አንቲልስ + አርጀንቲና + ኦስትሪያ + አውስትሬሊያ + አዘርባጃን + ቦስኒያ፡እና፡ሄርዞጎቪኒያ + ባርቤዶስ + ቤልጄም + ቡልጌሪያ + ባህሬን + ቤርሙዳ + ቦሊቪያ + ብራዚል + ቡህታን + ቤላሩስ + ቤሊዘ + የመካከለኛው፡አፍሪካ፡ሪፐብሊክ + ስዊዘርላንድ + ቺሊ + ካሜሩን + ቻይና + ኮሎምቢያ + ሰርቢያ + ኬፕ፡ቬርዴ + ሳይፕረስ + ቼክ፡ሪፑብሊክ + ጀርመን + ዴንማርክ + ዶሚኒካ + ዶሚኒክ፡ሪፑብሊክ + አልጄሪያ + ኢኳዶር + ኤስቶኒያ + ግብጽ + ምዕራባዊ፡ሳህራ + ኤርትራ + ስፔን + ኢትዮጵያ + ፊንላንድ + ፊጂ + ሚክሮኔዢያ + ፈረንሳይ + እንግሊዝ + ጆርጂያ + የፈረንሳይ፡ጉዊአና + ጋምቢያ + ጊኒ + ኢኳቶሪያል፡ጊኒ + ግሪክ + ቢሳዎ + ጉያና + ሆንግ፡ኮንግ + ክሮኤሽያ + ሀይቲ + ሀንጋሪ + ኢንዶኔዢያ + አየርላንድ + እስራኤል + ህንድ + ኢራቅ + አይስላንድ + ጣሊያን + ጃማይካ + ጆርዳን + ጃፓን + ካምቦዲያ + ኮሞሮስ + ደቡብ፡ኮሪያ + ሰሜን፡ኮሪያ + ክዌት + ሊባኖስ + ሊቱዌኒያ + ላትቪያ + ሊቢያ + ሞሮኮ + ሞልዶቫ + ማከዶኒያ + ሞንጎሊያ + ማካዎ + ሞሪቴኒያ + ማልታ + ማሩሸስ + ሜክሲኮ + ማሌዢያ + ናሚቢያ + ኒው፡ካሌዶኒያ + ናይጄሪያ + ኔዘርላንድ + ኖርዌ + ኔፓል + ኒው፡ዚላንድ + ፔሩ + የፈረንሳይ፡ፖሊኔዢያ + ፓፑዋ፡ኒው፡ጊኒ + ፖላንድ + ፖርታ፡ሪኮ + ሮሜኒያ + ራሺያ + ሳውድአረቢያ + ሱዳን + ስዊድን + ሲንጋፖር + ስሎቬኒያ + ስሎቫኪያ + ሴኔጋል + ሱማሌ + ሲሪያ + ቻድ + የፈረንሳይ፡ደቡባዊ፡ግዛቶች + ታይላንድ + ታጃኪስታን + ምስራቅ፡ቲሞር + ቱኒዚያ + ቱርክ + ትሪኒዳድ፡እና፡ቶባጎ + ታንዛኒያ + ዩጋንዳ + አሜሪካ + ዩዝበኪስታን + ቬንዙዌላ + የእንግሊዝ፡ድንግል፡ደሴቶች + የአሜሪካ፡ቨርጂን፡ደሴቶች + የመን + ደቡብ፡አፍሪካ + ዛምቢያ + + + + [፟ ᎐-᎙ ሀ-ሆ ለ-ሎ ሐ-ሖ መ-ሞ ሠ-ሦ ረ-ሮ ሰ-ሶ ቀ-ቆ ቈ ቊ-ቍ በ-ቦ ተ-ቶ ኀ-ኆ ኈ ኊ-ኍ ነ-ኖ አ-ኦ ከ-ኮ ኰ ኲ-ኵ ወ-ዎ ዐ-ዖ ዘ-ዞ የ-ዮ ደ-ዶ ገ-ጎ ጐ ጒ-ጕ ጠ-ጦ ጰ-ጶ ጸ-ጾ ፀ-ፆ ፈ-ፎ ፐ-ፖ] + [ሇ ሏ ⶀ ሗ ሟ ᎀ-ᎃ ⶁ ሧ ሯ ⶂ ሷ ⶃ ሸ-ሿ ⶄ ቇ ቐ-ቖ ቘ ቚ-ቝ ቧ ᎄ-ᎇ ⶅ ቮ ቯ ቷ ⶆ ቿ ⶇ ኇ ኗ ⶈ ኟ ⶉ ኧ ⶊ ኯ ኸ-ኾ ዀ ዂ-ዅ ዏ ዟ ⶋ ዠ-ዧ ዷ ⶌ ዸ-ዿ ⶍ ጀ-ጇ ⶎ ጏ ጘ-ጟ ⶓ-ⶖ ጧ ⶏ ጨ-ጯ ⶐ ጷ ⶑ ጿ ፇ ፏ ᎈ-ᎋ ፗ ᎌ-ᎏ ⶒ ፘ-ፚ ⶠ-ⶦ ⶨ-ⶮ ⶰ-ⶶ ⶸ-ⶾ ⷀ-ⷆ ⷈ-ⷎ ⷐ-ⷖ ⷘ-ⷞ] + + + + + + + + ጠሐረ + ከተተ + መገበ + አኀዘ + ግንባ + ሠንየ + ሐመለ + ነሐሰ + ከረመ + ጠቀመ + ኀደረ + ኀሠሠ + + + ጠሐረ + ከተተ + መገበ + አኀዘ + ግንባት + ሠንየ + ሐመለ + ነሐሰ + ከረመ + ጠቀመ + ኀደረ + ኀሠሠ + + + + + + + + + + + + + + + + + + + + + + + እኁድ + ሰኑይ + ሠሉስ + ራብዕ + ሐሙስ + ዓርበ + ቀዳሚ + + + እኁድ + ሰኑይ + ሠሉስ + ራብዕ + ሐሙስ + ዓርበ + ቀዳሚት + + + + + + + + + + + + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + ጽባሕ + ምሴት + + + ዓ/ዓ + ዓ/ም + + + + + + EEEE፥ dd MMMM መዓልት yyyy G + + + + + dd MMMM yyyy + + + + + dd-MMM-yyyy + + + + + dd/MM/yy + + + + + + + h:mm:ss a v + + + + + h:mm:ss a z + + + + + h:mm:ss a + + + + + h:mm a + + + + + + + {1} {0} + + + + dd MMMM + dd/MM + MM/yy + Q yy + MMMM yyyy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + + + + + + ¤#,##0.00 + + + + + + የብራዚል ሪል + + + የቻይና ዩአን ረንሚንቢ + Y + + + $ + + + የኢትዮጵያ ብር + ETB$ + + + አውሮ + + + የእንግሊዝ ፓውንድ ስተርሊንግ + + + የሕንድ ሩፒ + + + የጃፓን የን + + + የራሻ ሩብል + + + የአሜሪካን ዶላር + USD + + + + diff --git a/libs/Zend/Locale/Data/gez_ER.xml b/libs/Zend/Locale/Data/gez_ER.xml new file mode 100644 index 0000000..6c4a315 --- /dev/null +++ b/libs/Zend/Locale/Data/gez_ER.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/gez_ET.xml b/libs/Zend/Locale/Data/gez_ET.xml new file mode 100644 index 0000000..4e78b0f --- /dev/null +++ b/libs/Zend/Locale/Data/gez_ET.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + ERN + + + $ + + + + diff --git a/libs/Zend/Locale/Data/gl.xml b/libs/Zend/Locale/Data/gl.xml new file mode 100644 index 0000000..41fc1a6 --- /dev/null +++ b/libs/Zend/Locale/Data/gl.xml @@ -0,0 +1,1367 @@ + + + + + + + + + + + {0} ({1}) + , + + + Afrikaans + Lingua afro-asiática + Lingua algonquina + Amárico + Aragonés + Lingua apache + Árabe + Arameo + Lingua artificial + Assamés + Asturiano + Lingua australiana + Azerbaiano + Lingua báltica + Bielorruso + Búlgaro + Bihariano + Bengalí + Bretón + Bosnio + Catalán + Lingua india centroamericana + Lingua caucásica + Lingua céltica + Checo + Eslavo eclesiástico + Galés + Dinamarqués + Alemán + Alemán de Austria + Alemán suízo + Exipcio antigo + Grego + Inglés + Inglés australiano + Inglés canadiano + Inglés británico + Inglés americano + Esperanto + Español + Español latinoamericano + Castelán + Estoniano + Éuscaro + Persa + Finés + Filipino + Lingua finno-úgrica + Faroés + Francés + Francés canadiano + Francés suízo + Frisón + Irlandés + Gaélico escocés + Lingua xermánica + galego + Guaraní + Grego antigo + Guxaratiano + Hebreo + Hindi + Croata + Húngaro + Armenio + Interlingua + Indonesio + Lingua índica + Lingua indoeuropea + Islandés + Italiano + Xaponés + Xavanés + Xeorxiano + Cambodiano + Kannada + Coreano + Kurdo + Kyrgiz + Latín + Lingala + Laotiano + Lituano + Letón + Lingua miscelánea + Macedonio + Malaialam + Mongol + Marathi + Malaio + Maltés + Varias linguas + Lingua india norteamericana + Noruegués Bokmal + Nepalí + Holandés + Flamenco + Noruegués nynorsk + Noruegués + Lingua nubia + Occitano + Orissa + Punjabi + Lingua filipina + Polaco + Pashto + Portugués + Portugués brasileiro + Portugués ibérico + Romanés + Lingua románica + Ruso + Sánscrito + Lingua india sudamericana + Sindhi + Lingua semita + Lingua de signos + Serbocroata + Sinhalés + Eslovaco + Esloveno + Lingua eslávica + Somalí + Albanés + Serbio + Lingua do Nilo-Sáhara + Sesotho + Sondanés + Sueco + Suaxili + Tamil + Telugu + Tailandés + Tigriña + Tagalo + Clingon + Turco + Lingua altaica + Twi + Uighur + Ucraíno + Lingua descoñecida ou non válida + Urdú + Uzbeco + Vietnamita + Xhosa + Yiddish + Chinés + Chinés simplificado + Chinés tradicional + Zulú + Sen contido lingüístico + + + + + + + + + + + + + + Mundo + África + Norteamérica + Sudamérica + Oceanía + África Occidental + América Central + África Oriental + África Septentrional + África Central + África Meridional + América + América do Norte + Caribe + Asia Oriental + Sul de Asia + Sureste Asiático + Europa Meridional + Australia e Nova Celandia + Melanesia + Rexión da Micronesia + Polinesia + Asia do Sul-Centro + Asia + Asia Central + Asia Occidental + Europa + Europa do Leste + Europa Septentrional + Europa Occidental + Comunidade de Estados Independentes + América Latina e o Caribe + Andorra + Emiratos Árabes Unidos + Afganistán + Antiga e Barbuda + Anguila + Albania + Armenia + Antillas Holandesas + Angola + Antártida + Arxentina + Samoa Americana + Austria + Australia + Aruba + Illas Aland + Acerbaixán + Bosnia e Hercegovina + Barbados + Bangladesh + Bélxica + Burkina Faso + Bulgaria + Bahrein + Burundi + Benin + San Bartolomé + Bermudas + Brunei + Bolivia + Brasil + Bahamas + Bután + Illa Bouvet + Botsuana + Bielorrusia + Belice + Canadá + Illas Cocos + República Democrática do Congo + República Africana Central + Congo + Suíza + Costa de Marfil + Illas Cook + Chile + Camerún + China + Colombia + Costa Rica + Serbia e Montenegro + Cuba + Cabo Verde + Illa Christmas + Chipre + República Checa + Alemaña + Xibuti + Dinamarca + Dominica + República Dominicana + Arxelia + Ecuador + Estonia + Exipto + Sahara Occidental + Eritrea + España + Etiopía + Finlandia + Fixi + Illas Malvinas + Micronesia + Illas Feroe + Francia + Gabón + Reino Unido + Granada + Xeorxia + Güiana Francesa + Guernsey + Gana + Xibraltar + Grenlandia + Gambia + Guinea + Guadalupe + Guinea Ecuatorial + Grecia + Xeorxia do Sur e Illas Sandwich + Guatemala + Guam + Guinea-Bissau + Güiana + Hong Kong + Illa Heard e Illas McDonald + Honduras + Croacia + Haití + Hungría + Indonesia + Irlanda + Israel + Illa de Man + India + Territorio Británico do Océano Índico + Iraq + Irán + Islandia + Italia + Jersey + Xamaica + Xordania + Xapón + Quenia + Quirguicistán + Cambodia + Kiribati + Comores + San Cristovo e Nevis + Corea do Norte + Corea do Sur + Kuwait + Illas Caimán + Kazakhstan + Laos + Líbano + Santa Lucía + Liechtenstein + Sri Lanka + Liberia + Lesotho + Lituania + Luxemburgo + Letonia + Libia + Marrocos + Mónaco + Moldova + Montenegro + San Martiño + Madagascar + Illas Marshall + Macedonia + Mali + Myanmar + Mongolia + Macau + Illas Marianas do norte + Martinica + Mauritania + Montserrat + Malta + Mauricio + Maldivas + Malaui + México + Malaisia + Mozambique + Namibia + Nova Caledonia + Níxer + Illa Norfolk + Nixeria + Nicaragua + Países Baixos + Noruega + Nepal + Nauru + Niue + Nova Celandia + Omán + Panamá + Perú + Polinesia Francesa + Papúa Nova Guinea + Filipinas + Paquistán + Polonia + San Pedro e Miguelón + Pitcairn + Porto Rico + Palestina + Portugal + Palau + Paraguai + Qatar + Oceanía Distante + Unión Europea + Reunión + Romanía + Serbia + Rusia + Ruanda + Arabia Saudita + Illas Salomón + Seixeles + Sudán + Suecia + Singapur + Santa Helena + Eslovenia + Svalbard e Jan Mayen + Eslovaquia + Serra Leoa + San Marino + Senegal + Somalia + Surinam + Santo Tomé e Príncipe + El Salvador + Siria + Suacilandia + Illas Turks e Caicos + Xad + Territorios Franceses do Sul + Togo + Tailandia + Taxiquistán + Tokelau + Timor Leste + Turkmenistán + Tunisia + Tonga + Turquía + Trindade e Tobago + Tuvalu + Taiwán + Tanzania + Ucraína + Uganda + Illas Menores Distantes dos EUA. + Estados Unidos de América + Uruguai + Uzbekistán + Cidade do Vaticano + San Vicente e Granadinas + Venezuela + Illas Virxes Británicas + Illas Virxes Estadounidenses + Vietnam + Vanuatu + Wallis e Futuna + Samoa + Iemen + Mayotte + Sudáfrica + Zambia + Cimbabue + rexión descoñecida ou non válida + + + calendario + orde alfabética + moeda + + + orde chinesa tradicional - Big5 + calendario budista + calendario chinés + orde alfabética directa + orde chinesa simplificada - GB2312 + calendario gregoriano + calendario hebreo + calendario islámico + calendario islámico civil + calendario xaponés + orde da guía telefónica + orde pinyin + orde polo número de trazos + orde tradicional + + + americano + métrico decimal + + + Idioma: {0} + Alfabeto: {0} + Rexión: {0} + + + + [a á b-e é f-i í j-n ñ o ó p-u ú ü v-z] + [ª à â ä ã ç è ê-ì î ï º ò ô ö õ ù û] + [a-z] + + + + + + + + + + + + + + Xan + Feb + Mar + Abr + Mai + Xuñ + Xul + Ago + Set + Out + Nov + Dec + + + Xaneiro + Febreiro + Marzo + Abril + Maio + Xuño + Xullo + Agosto + Setembro + Outubro + Novembro + Decembro + + + + + X + F + M + A + M + X + X + A + S + O + N + D + + + + + + + Dom + Lun + Mar + Mér + Xov + Ven + Sáb + + + Domingo + Luns + Martes + Mércores + Xoves + Venres + Sábado + + + + + D + L + M + M + X + V + S + + + + + + + T1 + T2 + T3 + T4 + + + 1o trimestre + 2o trimestre + 3o trimestre + 4o trimestre + + + + + 1 + 2 + 3 + 4 + + + + AM + PM + + + antes de Cristo + despois de Cristo + + + a.C. + d.C. + + + + + + EEEE dd MMMM yyyy + + + + + dd MMMM yyyy + + + + + d MMM, yyyy + + + + + dd/MM/yy + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1} {0} + + + + HH:mm + L + E, d-M + LLL + E d MMM + E d MMMM + d MMMM + dd MMMM + d MMM + dd/MM + d-M + d + mm:ss + yyyy + M-yyyy + EEE, d-M-yyyy + MMM yyyy + EEE, d MMM yyyy + MMMM yyyy + Q yyyy + QQQ yyyy + MM/yy + Q yy + MMMM yyyy + + + + + Era + + + Ano + + + Mes + + + Semana + + + Día + hoxe + mañá + pasadomañá + onte + antonte + trasantonte + + + Día da semana + + + Hora + + + Minuto + + + Segundo + + + Fuso horario + + + + + + +HH:mm;-HH:mm + GMT{0} + Hora de {0} + {1} ({0}) + + Descoñecido + + + Anguila + + + Polo Sul + + + Dumont-d'Urville + + + Río Gallegos + + + Tucumán + + + Córdoba + + + Bos Aires + + + Bermudas + + + Belém + + + São Paulo + + + Maceió + + + Belice + + + St Johns + + + Illa de Pascua + + + Cabo Verde + + + Xubuti + + + Illas Galápagos + + + Illas Canarias + + + Fidxi + + + París + + + Granada + + + Xibraltar + + + Guadalupe + + + Güiana + + + Iacarta + + + Xamaica + + + Luxemburgo + + + Mónaco + + + Ulan Bator + + + Martinica + + + Mauricio + + + Maldivas + + + Mazatlán + + + Monterrei + + + Cidade de México + + + Mérida + + + Cancún + + + Panamá + + + Porto Rico + + + Reunión + + + Kaliningrado + + + Moscova + + + Volgogrado + + + Ecaterinburgo + + + Singapur + + + O Salvador + + + Honolulú + + + New Salem + + + Central + + + Vincennes + + + Petersburg + + + Tell City + + + Knox + + + Winamac + + + Marengo + + + Vevay + + + Monticello + + + Samarcanda + + + + horario europeo central + horario de verán europeo central + + + + + horario europeo oriental + horario de verán europeo oriental + + + + + horario europeo occidental + horario de verán europeo occidental + + + + + horario medio de Greenwich + + + + + + + , + . + ; + % + 0 + # + + + - + E + + + NaN + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + #,##0.00 ¤ + + + {0} {1} + {0} {1} + + + + peseta andorrana + peseta andorrana + pesetas andorranas + + + Peso arxentino (1983-1985) + peso arxentino (ARP) + pesos arxentinos (ARP) + + + Peso arxentino + peso arxentino + pesos arxentinos + + + Franco belga (convertible) + franco belga (convertible) + francos belgas (convertibles) + + + Franco belga + franco belga + francos belgas + + + Franco belga (financeiro) + franco belga (financeiro) + francos belgas (financeiros) + + + Boliviano + boliviano + bolivianos + + + Peso boliviano + peso boliviano + pesos bolivianos + + + MVDOL boliviano + + + Cruzeiro novo brasileiro (1967-1986) + cruzeiro novo brasileiro + cruzeiros novos brasileiros + + + Cruzado brasileiro + cruzado brasileiro + cruzados brasileiros + + + Cruzeiro brasileiro (1990-1993) + cruzeiro brasileiro (BRE) + cruzeiros brasileiros (BRE) + + + Real brasileiro + real brasileiro + reais brasileiros + + + Cruzado novo brasileiro + cruzado novo brasileiro + cruzados novos brasileiros + + + Cruzeiro brasileiro + cruzeiro brasileiro + cruzeiros brasileiros + + + Dólar canadiano + + + Franco suizo + + + Unidades de fomento chilenas + unidade de fomento chilena + unidades de fomento chilenas + + + Peso chileno + peso chileno + pesos chilenos + + + Iuan renminbi chinés + iuán chinés + iuáns chineses + + + Peso colombiano + peso colombiano + pesos colombianos + + + Colón costarricense + colón costarricense + colóns costarricenses + + + Peso cubano + peso cubano + pesos cubanos + + + Marco alemán + marco alemán + marcos alemáns + + + Coroa dinamarquesa + + + Peso dominicano + peso dominicano + pesos dominicanos + + + Sucre ecuatoriano + sucre ecuatoriano + sucres ecuatorianos + + + Unidade de valor constante ecuatoriana + + + Peseta española (conta A) + + + Peseta española (conta convertible) + + + #,##0 ¤;-#,##0 ¤ + Peseta española + peseta + pesetas + + , + . + + + Euro + euro + euros + + + Franco francés + franco francés + francos franceses + + + Libra esterlina + libra esterlina + libras esterlinas + + + Libra de Xibraltar + libra xibraltareña + libras xibraltareñas + + + Franco guineano + + + Syli guineano + + + Ekwele guineana + + + Dracma grego + + + Quetzal guatemalteco + + + Lempira hondureño + + + Florín húngaro + + + Libra irlandesa + libra irlandesa + libras irlandesas + + + Rupia india + + + Coroa islandesa + + + Lira italiana + + + Ien xaponés + + + Franco convertible luxemburgués + + + Franco luxemburgués + + + Franco financeiro luxemburgués + + + Dirham marroquí + + + Franco marroquí + + + Peso mexicano + peso mexicano + pesos mexicanos + + + Peso de prata mexicano (1861-1992) + + + Unidade de inversión mexicana + + + Córdoba nicaragüense + + + Córdoba de ouro nicaragüense + + + Florín holandés + + + Coroa norueguesa + + + Balboa panameño + + + Inti peruano + + + Sol novo peruano + + + Sol peruano + + + Peso filipino + + + Escudo portugués + escudo portugués + escudos portugueses + + + Guaraní paraguaio + guaraní do paraguai + guaranís do paraguai + + + Rublo ruso + rublo ruso + rublos rusos + + + Rublo ruso (1991-1998) + + + Coroa sueca + + + Rublo soviético + rublo soviético + rublos soviéticos + + + Colón salvadoreño + colón salvadoreño + colóns salvadoreños + + + Dólar estadounidense + dólar estadounidense + dólares estadounidenses + + + Peso en unidades indexadas uruguaio + + + Peso uruguaio (1975-1993) + + + Peso uruguaio + peso uruguaio + pesos uruguaios + + + Bolívar venezolano + bolívar venezolano + bolívares venezolanos + + + Bolívar forte venezolano + bolívar forte venezolano + bolívares fortes venezolanos + + + Prata + + + Ouro + + + Paladio + + + Platino + + + Unidade monetaria descoñecida ou non válida + unidade monetaria descoñecida ou non válida + unidades monetarias descoñecidas ou non válidas + + + Rand sudafricano + + + + + + {0} día + {0} días + + + {0} hora + {0} horas + + + {0} minuto + {0} minutos + + + {0} mes + {0} meses + + + {0} segundo + {0} segundos + + + {0} semana + {0} semanas + + + {0} ano + {0} anos + + + + + si:s + non:n + + + + diff --git a/libs/Zend/Locale/Data/gl_ES.xml b/libs/Zend/Locale/Data/gl_ES.xml new file mode 100644 index 0000000..b148aeb --- /dev/null +++ b/libs/Zend/Locale/Data/gl_ES.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/gu.xml b/libs/Zend/Locale/Data/gu.xml new file mode 100644 index 0000000..8887f46 --- /dev/null +++ b/libs/Zend/Locale/Data/gu.xml @@ -0,0 +1,364 @@ + + + + + + + + + + + આફ્રિકી + ઍમ્હૅરિક (ઈથિયોપિયા) + અરબી + આસામી + ઍઝરબૈજાની + બેલરૂશિયન + બલ્ગેરિયન + બિહારી + ભોજપુરી + બંગાળી + બ્રેટોન + બૉઝ્નિયન + કેટલૅન + ચેક + વેલ્શ + ડૅનિશ + જર્મન + ગ્રીક + અંગ્રેજી + ઍસ્પૅરેન્તો + સ્પેનિસ + એસ્ટોનિયન + બાસ્ક + ફારસી (પર્શિયન) + ફિન્નિશ + ફિલિપિનો + ફારોઈઝ + ફ્રેંચ + ફ્રિઝન + આયરિશ + ગેલિક (સ્કૉટલૅન્ડ) + ગૅલિશિયન + ગ્વારની + ગુજરાતી + હીબ્રૂ + હિન્દી + ક્રોએશિયન + હંગેરિયન + આર્મેનિયન + ઇન્ટરલિંગા + ઇન્ડોનેશિયન + આઇસલૅન્ડિક + ઇટાલિયન + જાપાની + જાવાનીઝ + જ્યોર્જિયન + કમ્બોડિયન + કન્નડ + કોરીયન + કુર્ડિશ + કિર્ગિઝ + લૅટિન + લિંગાલા + લૅઓથિયન + લિથ્વેનિયન + લાતવી + મૅસિડોનિયન + મળયાલમ + મોંગોલિયન + મરાઠી + મલય + માલ્ટી + નેપાળી + ડચ્ચ + નોર્વેજિયન (નુનોર્સ્ક) + નોર્વેજિયન + ઑક્સીટૅન + ઊડિયા + પંજાબી + પોલિશ + પાશ્તુન + પોર્ચગીઝ + પોર્ચગીઝ (બ્રાઝિલ) + પોર્ચગીઝ (પોર્ચગલ) + રોમૅનિયન + રૂસી + સંસ્કૃત + સિંધી + સર્બો-ક્રોએશ્યન + સિંહાલી + સ્લોવૅક + સ્લોવેનિયન + સોમાલી + આલ્બેનિયન + સર્બિયન + સેસોથો + સુન્ડનીઝ + સ્વીડીશ + સ્વાહિલી + તમિલ + તેલુગુ + થાઇ + ટગ્રિન્યા + તુર્કમિન + તુર્કી + ટ્વી + વિગ઼ુર + યુક્રેનિયન + ઉઝબેક + વિયેતનામી + કોસા + યિડિશ + ઝુલુ + + + + + + + + ચીન + જમિની + મિસર + જ્યોર્જીયા + ભારત + નેપાળ + કરાંચી + તુર્ક્મનિસ્તાન + તુર્કસ્તાન + સંયુકત રાજ્ય અમેરિકા + + + કેલેન્ડર + ક્રમ + ચલણ + + + + [૦-૯ ૐ અ-ઋ ૠ ઍ એ-ઑ ઓ-ન પ-ર લ ળ વ-હ ઼ ઁ-ઃ ઽ ્ ા-ૅ ે-ૉ ો ૌ] + [\u200C \u200D] + + + ' + ' + " + " + + + + + + + + જાન્યુ + ફેબ્રુ + માર્ચ + એપ્રિલ + મે + જૂન + જુલાઈ + ઑગસ્ટ + સપ્ટે + ઑક્ટો + નવે + ડિસે + + + જાન્યુઆરી + ફેબ્રુઆરી + માર્ચ + એપ્રિલ + મે + જૂન + જુલાઈ + ઑગસ્ટ + સપ્ટેમ્બર + ઑક્ટ્બર + નવેમ્બર + ડિસેમ્બર + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + રવિ + સોમ + મંગળ + બુધ + ગુરુ + શુક્ર + શનિ + + + રવિવાર + સોમવાર + મંગળવાર + બુધવાર + ગુરુવાર + શુક્રવાર + શનિવાર + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + Q1 + Q2 + Q3 + Q4 + + + પેહલા હંત 1 + ડૂસઋા હંત 2 + તીસઋા હંત 3 + ચૌતા હંત 4 + + + + પૂર્વ મધ્યાહ્ન + ઉત્તર મધ્યાહ્ન + + + ઈસાપૂઋ્વ. + સન. + + + BCE + CE + + + + + + EEEE d MMMM yyyy + + + + + d MMMM yyyy + + + + + dd-MM-yyyy + + + + + d-MM-yy + + + + + + + hh:mm:ss a v + + + + + hh:mm:ss a z + + + + + hh:mm:ss a + + + + + hh:mm a + + + + + + + {1} {0} + + + + d MMMM + dd-MM + Q yy + MM-yyyy + MMMM yyyy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + + + + + + #,##,##0.### + + + + + + + #,##,##0% + + + + + + + ¤ #,##,##0.00 + + + + + + રુ + + + + + + હા + ના + + + + diff --git a/libs/Zend/Locale/Data/gu_IN.xml b/libs/Zend/Locale/Data/gu_IN.xml new file mode 100644 index 0000000..f95a66d --- /dev/null +++ b/libs/Zend/Locale/Data/gu_IN.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/gv.xml b/libs/Zend/Locale/Data/gv.xml new file mode 100644 index 0000000..253bb49 --- /dev/null +++ b/libs/Zend/Locale/Data/gv.xml @@ -0,0 +1,205 @@ + + + + + + + + + + + Gaelg + + + Rywvaneth Unys + + + + [a-c ç d-z] + + + + + + + + J-guer + T-arree + Mayrnt + Avrril + Boaldyn + M-souree + J-souree + Luanistyn + M-fouyir + J-fouyir + M.Houney + M.Nollick + + + Jerrey-geuree + Toshiaght-arree + Mayrnt + Averil + Boaldyn + Mean-souree + Jerrey-souree + Luanistyn + Mean-fouyir + Jerrey-fouyir + Mee Houney + Mee ny Nollick + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + Jed + Jel + Jem + Jerc + Jerd + Jeh + Jes + + + Jedoonee + Jelhein + Jemayrt + Jercean + Jerdein + Jeheiney + Jesarn + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + a.m. + p.m. + + + RC + AD + + + + + + EEEE dd MMMM yyyy + + + + + dd MMMM yyyy + + + + + MMM dd, yyyy + + + + + dd/MM/yy + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1} {0} + + + + HH:mm + dd MMMM + dd/MM + mm:ss + MM/yy + Q yy + MMMM yyyy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + + + ¤#,##0.00 + + + + + diff --git a/libs/Zend/Locale/Data/gv_GB.xml b/libs/Zend/Locale/Data/gv_GB.xml new file mode 100644 index 0000000..838c96d --- /dev/null +++ b/libs/Zend/Locale/Data/gv_GB.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/ha.xml b/libs/Zend/Locale/Data/ha.xml new file mode 100644 index 0000000..e810807 --- /dev/null +++ b/libs/Zend/Locale/Data/ha.xml @@ -0,0 +1,376 @@ + + + + + + + + + + + Afirkanci + Amharic + Harshen Larabci + Asamisanci + Azerbaijanci + Belarushiyanci + Bulgeriyan + Bihari + Dan Bengal + Buretananci + Bosniyanci + Kataloniyanci + Yaren Jamhuriyar Cek + Kabilar Welsh + Danish + Jamusanchi + Girkanci + Turanci + D'an/'Yar Kabilar Andalus + Mutanen Espanya + Istoniyanci + Dan/'Yar Kabilar Bas + Persian + Yaren mutanen Finland + Dan Filifin + Faroese + Faranshi + K'abilan Firsi + Dan Ailan + K'abilan Scots Gaelic + Bagalike + Guwaraniyanci + Gujarati + Haoussa + Yahudanci + Bahinde + Kuroshiyan + Hongeriyanci + Armeniyanci + Yare Tsakanin Kasashe + Indonesiyan + Intagulanci + Yaren mutanen Iceland + Italiyanci + Jafananci + Javanisanci + Jojiyanci + Kambodiyanci + Dan/'Yar Kabilar Kannada + Yaren mutanen Koriya + Kurdanci + Kirgizanci + Dan Kabilar Latin + Lingala + Laothian + Lituweniyanci + Latbiyanci + Dan Masedoniya + Kabilar Maleyalam + Mongolian + K'abilan Marathi + Dan Kabilar Male + Harshen Maltis + D'an/'Yar Kabilar Nepal + Yaren mutanen Holland + Yaren Kasar Norway + Yaren mutanen Norway + Ositanci + Oriyanci + Dan/'Yar Garin Punjab + Yaren mutanen Poland + Pashtanci + Yaren mutanen Portugal + Fotigis (Burazil) + Yaren Kasar Portugal + Romaniyanci + Rashanci + sanskrit + Sindiyanci + Kuroweshiyancin-Sabiya + Sinhalanci + Basulake + Basulabe + Somaali + D'an/'Yar Kabilar Albaniya + Sabiyan + Sesotanci + Sundanese + Yaren mutanen Sweden + Harshen Suwahili + D'an/'Yar Kabilar Tamil + D'an/'Yar Kabilar Telug + Tayanci + Tigriyanci + Tukmenistanci + Klingon + Baturke + Tiwiniyanci + Ugiranci + Dan Ukirain + Urdu + Uzbek + K'abilan Biyetnam + Bazosa + Bazule + + + Nijeriya + + + + [a b ɓ c d ɗ e-k ƙ l-o r s {sh} t {ts} u w y z ʼ {ʼy}] + [á à â é è ê í ì î ó ò ô p q {r̃} ú ù û v x ƴ] + [a-z] + + + + + + + + Jan + Fab + Mar + Afr + May + Yun + Yul + Aug + Sat + Okt + Nuw + Dis + + + Janairu + Fabrairu + Maris + Afrilu + Mayu + Yuni + Yuli + Augusta + Satumba + Oktoba + Nuwamba + Disamba + + + + + J + F + M + A + M + Y + Y + A + S + O + N + D + + + + + + + Lah + Lit + Tal + Lar + Alh + Jum + Asa + + + Lahadi + Litini + Talata + Laraba + Alhamis + Jumma'a + Asabar + + + + + L + L + T + L + A + J + A + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + + 1 + 2 + 3 + 4 + + + + AM + PM + + + Gabanin Miladi + Miladi + + + GM + M + + + + + + EEEE, d MMMM, yyyy + + + + + d MMMM, yyyy + + + + + d MMM, yyyy + + + + + d/M/yy + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1} {0} + + + + H:mm + L + E, d-M + LLL + E d MMM + E d MMMM + d MMMM + d MMM + M-d + d + mm:ss + yyyy + EEE, d/M/yyyy + EEE, d MMM yyyy + Q yy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + . + , + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + ¤ #,##0.00 + + + + + + Sidi + + + Neira + + + + Sefa + CFA + + + + + + i + a'a:a + + + + diff --git a/libs/Zend/Locale/Data/ha_Arab.xml b/libs/Zend/Locale/Data/ha_Arab.xml new file mode 100644 index 0000000..7f65283 --- /dev/null +++ b/libs/Zend/Locale/Data/ha_Arab.xml @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + העולם + אפריקה + צפון אמריקה + דרום אמריקה + אוקיאניה + מערב אפריקה + מרכז אמריקה + מזרח אפריקה + צפון אפריקה + מרכז אפריקה + דרום יבשת אפריקה + אמריקה + אמריקה הצפונית + קריביים + מזרח אסיה + דרום אסיה + דרום-מזרח אסיה + דרום אירופה + אוסטרליה וניו-זילנד + מלנסיה + האיזור המיקרונזי + פולינזיה + דרום-מרכז אסיה + אסיה + מרכז אסיה + מערב אסיה + אירופה + מזרח אירופה + צפון אירופה + מערב אירופה + חבר המדינות העצמאיות + אמריקה הלטינית והקריביים + איי התעלה + אנדורה + איחוד האמירויות הערביות + אפגניסטן + אנטיגואה וברבודה + אנגילה + אלבניה + ארמניה + אנטילים הולנדיים + אנגולה + אנטארקטיקה + ארגנטינה + סמואה האמריקנית + אוסטריה + אוסטרליה + ארובה + איי אלנד + אזרביג'ן + בוסניה והרצגובינה + ברבדוס + בנגלדש + בלגיה + בורקינה פאסו + בולגריה + בחריין + בורונדי + בנין + סנט ברתולומיאו + ברמודה + ברוניי + בוליביה + ברזיל + איי באהאמה + בהוטן + איי בובה + בוטסוואנה + בלארוס + בליז + קנדה + איי קוקוס + הרפובליקה הדמוקרטית של קונגו + הרפובליקה של מרכז אפריקה + קונגו + שווייץ + חוף השנהב + איי קוק + צ׳ילה + קמרון + סין + קולומביה + קוסטה ריקה + סרביה ומונטנגרו + קובה + כף ורדה + איי כריסטמס + קפריסין + צ׳כיה + גרמניה + ג׳יבוטי + דנמרק + דומיניקה + הרפובליקה הדומיניקנית + אלג׳יריה + אקוודור + אסטוניה + מצרים + סהרה המערבית + אריתראה + ספרד + אתיופיה + פינלנד + פיג׳י + איי פוקלנד + מיקרונזיה + איי פארו + צרפת + גאבון + בריטניה + גרנדה + גאורגיה + גיאנה הצרפתית + גרנסי + גאנה + גיברלטר + גרינלנד + גמביה + גיניאה + גוואדלופ + גיניאה המשוונית + יוון + ג׳ורג׳יה הדרומית ואיי סנדוויץ׳ הדרומיים + גווטמלה + גואם + גיניאה-ביסאו + גיאנה + הונג קונג + איי הרד ואיי מקדונלנד + הונדורס + קרואטיה + האיטי + הונגריה + אינדונזיה + אירלנד + ישראל + האי מאן + הודו + טריטוריה בריטית באוקיאנוס ההודי + עירק + איראן + איסלנד + איטליה + ג'רסי + ג׳מייקה + ירדן + יפן + קניה + קירגיזסטן + קמבודיה + קיריבאטי + קומורוס + סנט קיטס ונוויס + צפון קוריאה + דרום קוריאה + כווית + איי קיימן + קזחסטן + לאוס + לבנון + סנט לוסיה + ליכטנשטיין + סרי לנקה + ליבריה + לסוטו + ליטא + לוקסמבורג + לטביה + לוב + מרוקו + מונקו + מולדובה + מונטנגרו + סנט מרטין + מדגסקר + איי מרשל + מקדוניה + מאלי + מייאנמאר + מונגוליה + מקאו + איי מריאנה הצפוניים + מרטיניק + מאוריטניה + מונסראט + מלטה + מאוריציוס + מלדיבים + מלאווי + מקסיקו + מלזיה + מוזמביק + נמיביה + קלדוניה החדשה + ניז׳ר + איי נורפוק + ניגריה + ניקרגואה + הולנד + נורווגיה + נפאל + נאורו + ניווה + ניו זילנד + עומאן + פנמה + פרו + פולינזיה הצרפתית + פפואה גיניאה החדשה + פיליפינים + פקיסטן + פולין + סנט פייר ומיקלון + פיטקרן + פורטו ריקו + הרשות הפלשתינית + פורטוגל + פאלאו + פרגוואי + קטר + QO + האיחוד האירופי + ראוניון + רומניה + סרביה + רוסיה + רואנדה + ערב הסעודית + איי שלמה + איי סיישל + סודן + שוודיה + סינגפור + סנט הלנה + סלובניה + סוולבארד וז׳אן מאיין + סלובקיה + סיירה לאונה + סן מרינו + סנגל + סומליה + סורינם + סאו טומה ופרינסיפה + אל סלבדור + סוריה + סווזילנד + איי טורקס וקאיקוס + צ׳אד + טריטוריות דרומיות של צרפת + טוגו + תאילנד + טג׳יקיסטן + טוקלאו + מזרח טימור + טורקמניסטן + תוניסיה + טונגה + טורקיה + טרינידד וטובגו + טובלו + טייוואן + טנזניה + אוקראינה + אוגנדה + איים קטנים שלחוף ארצות הברית + ארצות הברית + אורוגוואי + אוזבקיסטן + ותיקן + סנט וינסנט והגרנדינים + ונצואלה + איי הבתולה הבריטיים + איי הבתולה האמריקניים + וייטנאם + ונואטו + איי ווליס ופוטונה + סמואה + תימן + מאיוט + דרום אפריקה + זמביה + זימבאבווה + איזור לא ידוע או לא תקף + + + כתיב גרמני מסורתי + מזרח ארמנית + מערב ארמנית + מונוטונית + מחשב + + + לוח שנה + מיון + מטבע + + + מיון סינית מסורתית + לוח שנה בודהיסטי + לוח שנה סיני + מיון ישיר + מיון סינית מודרנית + לוח שנה גרגוריאני + לוח שנה עברי + לוח שנה מוסלמי + לוח שנה מוסלמי-אזרחי + לוח שנה יפני + מיון ספר טלפונים + מיון פיניין + מיון מסורתי + + + ארה"ב + מטרי + + + {0} + {0} + {0} + + + + + + + [א-י כ ך ל מ ם נ ן ס ע פ ף צ ץ ק-ת] + [ֽ ׄ ְ-ֹ ֻ ׂ ׁ ּ ֿ ־ ׳ ״ a-z] + [a-z] + + + + + " + " + + + GanjkHmsSEDFwWxhKzAeugXZvcL + + + + + + ינו + פבר + מרץ + אפר + מאי + יונ + יול + אוג + ספט + אוק + נוב + דצמ + + + ינואר + פברואר + מרץ + אפריל + מאי + יוני + יולי + אוגוסט + ספטמבר + אוקטובר + נובמבר + דצמבר + + + + + מרס + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + מרס + + + + + + + א + ב + ג + ד + ה + ו + ש + + + יום ראשון + יום שני + יום שלישי + יום רביעי + יום חמישי + יום שישי + שבת + + + + + א + ב + ג + ד + ה + ו + ש + + + + + + + רבעון 1 + רבעון 2 + רבעון 3 + רבעון 4 + + + רבעון 1 + רבעון 2 + רבעון 3 + רבעון 4 + + + + + 1 + 2 + 3 + 4 + + + + לפנה"צ + אחה"צ + + + לפני הספירה + לספירה + + + לפנה״ס + לסה״נ + + + + + + EEEE d MMMM yyyy + + + + + d MMMM yyyy + + + + + dd/MM/yyyy + + + + + dd/MM/yy + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1} {0} + + + + E d + H + HH:mm + HH:mm:ss + H:mm + L + E, M-d + LLL + E d MMM + E MMMM d + d MMMM + MMM d + dd/MM + d/M + d + mm:ss + mm:ss + yyyy + yyyy-M + EEE, yyyy-M-d + yyyy MMM + EEE, yyyy MMM d + yyyy MMMM + yyyy Q + yyyy QQQ + MM/yy + MMM yy + Q yy + yyyy + MM/yyyy + MMMM yyyy + + + {0} – {1} + + M-M + + + EEEE dd/MM - EEEE dd/MM + EEEE dd/MM - EEEE dd/MM + + + MMM-MMM + + + EEEE d MMM - EEEE d MMM + EEEE d MMM - EEEE d MMM + + + LLLL-LLLL + + + d MMM - d MMM + d-d MMM + + + dd/MM - dd/MM + dd/MM - dd/MM + + + d-d + + + HH-HH + HH–HH + + + HH:mm-HH:mm + HH:mm–HH:mm + HH:mm–HH:mm + + + HH:mm-HH:mm v + HH:mm–HH:mm v + HH:mm–HH:mm v + + + HH-HH v + HH–HH v + + + y-y + + + MM/yy - MM/yy + MM/yy - MM/yy + + + EEEE dd/MM/yy - EEEE dd/MM/yy + EEEE dd/MM/yy - EEEE dd/MM/yy + EEEE dd/MM/yy - EEEE dd/MM/yy + + + MMM-MMM yyyy + MMM yyyy - MMM yyyy + + + EEEE d MMM - EEEE d MMM yyyy + EEEE d MMM - EEEE d MMM yyyy + EEEE d MMM yyyy - EEEE d MMM yyyy + + + yyyy-MM – MM + yyyy-MM – yyyy-MM + + + d MMM - d MMM yyyy + d-d MMM yyyy + d MMM yyyy - d MMM yyyy + + + dd/MM/yy - dd/MM/yy + dd/MM/yy - dd/MM/yy + dd/MM/yy - dd/MM/yy + + + + + + תקופה + + + שנה + + + חודש + + + שבוע + + + יום + היום + מחר + מחרתיים + בעוד שלושה ימים + אתמול + שלשום + לפני שלושה ימים + + + יום בשבוע + + + Dayperiod + + + שעה + + + דקה + + + שנייה + + + אזור + + + + + + + + תשרי + חשון + כסלו + טבת + שבט + אדר ראשון + אדר שני + ניסן + אייר + סיון + תמוז + אב + אלול + + + + לפנה"צ + אחה"צ + + + לבה"ע + + + + + + d MMM yyyy + + + + + + + + + מוחרם + ספר + רביע אל-אוואל + רביע אל-תני + ג׳ומדה אל-אוואל + ג׳ומדה אל-תני + רג׳אב + שעבאן + ראמדן + שוואל + זו אל-QI'DAH + זו אל-חיג׳ה + + + + + + שנת היג׳רה + + + + + + + טאיקה + נינג'ו + שוטוקו + + + + + + +HH:mm;-HH:mm + GMT{0} + שעון {0} + {1} ({0}) + + לא ידוע + + + אנדורה + + + דובאי + + + קאבול + + + אנטיגואה + + + אנגווילה + + + טירנה + + + ירבאן + + + קורסאו + + + לואנדה + + + רות'רה + + + אמריקה/פאלמר + + + הקוטב הדרומי + + + שויה + + + מאוסון + + + דייויס + + + ווסטוק + + + קאסיי + + + דומון ד'אורווי + + + מקמרדו + + + אמריקה/מנדוזה + + + אמריקה/ארגנטינה/סאן-חואן + + + אמריקה/קורדובה + + + בואנוס איירס + + + פאגו פאגו + + + וינה + + + אוסטרליה/פרת' + + + אוסטרליה/דרווין + + + אדלייד + + + אוסטרליה/ברוקן-היל + + + אוסטרליה/מלבורן + + + אוסטרליה/הוברט + + + אוסטרליה/סידני + + + אוסטרליה/בריסבן + + + ארובה + + + באקו + + + ברבדוס + + + דאקה + + + בריסל + + + ואגאדוגו + + + סופיה + + + בהרין + + + בוג'ומבורה + + + פורטו-נובו + + + ברמודה + + + ברוניי + + + לה פאז + + + ריאו ברנצ'ו + + + פורטו וולהו + + + בואה ויסטה + + + מנאוס + + + קויאבה + + + קמפו גרנדה + + + בלם + + + אראגואינה + + + אמריקה/סאן-פאולו + + + אמריקה/בהיאה + + + פורטאלזה + + + מאסיו + + + רסיפה + + + נורונהה + + + נסאו + + + טימפו + + + גאבורונה + + + מינסק + + + בליז + + + אמריקה/ונקובר + + + אמריקה/דוסון-קריק + + + אמריקה/אדמנטון + + + אמריקה/וויניפוג + + + אמריקה/טורנטו + + + אמריקה/מונטריאול + + + אמריקה/הליפקס + + + קוקוס + + + קינשסה + + + לובומבאשי + + + בנגואי + + + בראזאווייל + + + ציריך + + + אבידג'ן + + + רארוטונגה + + + איי הפסחא + + + אמריקה/סנטיאגו + + + דואלה + + + אסיה/שנחאי + + + בוגוטה + + + קוסטה ריקה + + + הוואנה + + + קייפ ורדה + + + איי חג המולד + + + ניקוסיה + + + ברלין + + + ג'יבאוטי + + + קופנהגן + + + דומיניקה + + + סנטו דומינגו + + + אלג'יר + + + פסיפי/גלאפגוס + + + גוויקיל + + + טאלין + + + קהיר + + + אל עיון + + + אסמרה + + + אטלנטי/קנרי + + + סאוטה + + + אירופה/מדריד + + + אדיס אבבה + + + הלסינקי + + + פיג'י + + + סטנלי + + + טרוק + + + פונפה + + + קוסרה + + + פארו + + + פריס + + + ליברווייל + + + אירופה/לונדון + + + גרנדה + + + טביליסי + + + קאיין + + + אקרה + + + גיברלטר + + + טולה + + + גודת'אב + + + סקורסביסונד + + + דנמרקסהוון + + + באנג'ול + + + קונאקרי + + + גוואדלופ + + + מאלאבו + + + אתונה + + + איי ג'ורג'יה הדרומית + + + גוואטמלה + + + גואם + + + ביסאו + + + גוינה + + + הונג קונג + + + פורט או פרינס + + + בודפשט + + + אסיה/ג'קרטה + + + מאקאסאר + + + ג'איאפורה + + + דבלין + + + ירושלים + + + איי צ'גוס + + + בגדד + + + טהרן + + + רייקיאוויק + + + רומא + + + ג'מייקה + + + רבת עמון + + + טוקיו + + + ניירובי + + + בישקק + + + פנום פן + + + אנדרבורי + + + קיריטימאטי + + + טאראווה + + + קומורו + + + סנט קיטס + + + צפון קוריאה + + + דרום קוריאה + + + כווית + + + קיימן + + + אקטאו + + + אסיה/אורל + + + אקטובה + + + אלמאטי + + + וינטיאן + + + ביירות + + + סנט לוצ'יה + + + ואדוז + + + קולומבו + + + מונרוביה + + + מאסרו + + + וילניאוס + + + לוקסמבורג + + + ריגה + + + טריפולי + + + קזבלנקה + + + מונקו + + + קישינב + + + אנטננרבינו + + + מאג'ורו + + + באמאקו + + + ראנגון + + + חובד + + + אולאאנבטאר + + + צ'ואיבלסאן + + + מקאו + + + סאיפאן + + + מרטיניק + + + נוקשוט + + + מונטסראט + + + מאלטה + + + מאוריטיוס + + + מולדוביה + + + בלנטיר + + + אמריקה/מזטלן + + + אמריקה/מונטריי + + + אמריקה/מקסיקו סיטי + + + אמריקה/קנקון + + + קואלה לומפור + + + מאפוטו + + + ווינדהוק + + + נומאה + + + ניאמיי + + + איי נורפוק + + + לאגוס + + + מנאגואה + + + אמסטרדם + + + אוסלו + + + קטמנדו + + + נאורו + + + ניווה + + + פסיפי/אוקלנד + + + מוסקט + + + פנמה + + + לימה + + + פסיפי/טהיטי + + + איי מרקיז + + + איי גמביר + + + פורט מורנסבי + + + מנילה + + + קאראצ'י + + + ורשה + + + מיקלון + + + פיטקרן + + + פוארטו ריקו + + + עזה + + + האיים האזורים + + + אירופה/ליסבון + + + פלאו + + + אסונסיון + + + קתר + + + ריונין + + + בוקרשט + + + אירופה/מוסקבה + + + אירופה/סמרה + + + איה/אומסק + + + אסיה/נובוסיבירסק + + + קיגאלי + + + ריאד + + + גואדלקנל + + + מאהה + + + חרטום + + + שטוקהולם + + + סינגפור + + + סנט הלנה + + + פריטאון + + + דאקאר + + + מוגדישו + + + פרמאריבו + + + סאו טומה + + + סלבדור + + + דמשק + + + מבאבאנה + + + גרנד טורק + + + נג'מנה + + + קרגואלן + + + לומה + + + בנקוק + + + דושנבה + + + פאקאופו + + + דילי + + + אשחבאד + + + תוניסיה + + + טונגטאפו + + + איסטנבול + + + נמל ספרד + + + פונאפוטי + + + טייפה + + + דאר א-סאלם + + + אירופה/קייב + + + קמפלה + + + מידוויי + + + ג'ונסטון + + + וואק + + + פסיפי/הונולולו + + + זמן אלסקה + + + אמריקה/לוס-אנג'לס + + + אמריקה/פיניקס + + + אמריקה/שיפרוק + + + אמריקה/דנוור + + + אמריקה/צפון דקוטה/מרכז + + + אמריקה/שיקגו + + + אינדיאנפוליס + + + אמריקה/לואיסוויל + + + אמריקה/דטרויט + + + אמריקה/ניו-יורק + + + מונטווידאו + + + אסיה/סמרקנד + + + אסיה/טשקנט + + + סנט וינסנט + + + קאראקאס + + + טורטולה + + + סנט תומאס + + + סייגון + + + אפטה + + + ואליס + + + אפיה + + + עדן + + + מאיוט + + + יוהנסבורג + + + לוסאקה + + + הררה + + + + IST (הודו) + + + + + שעון ישראל + + + IST + + + + + + + . + , + ; + % + 0 + # + + + - + E + + + NaN + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + #,##0.00 ¤ + + + {0} {1} + {0} {1} + + + + פזו אנדורי + + + דירהם של איחוד הנסיכויות הערביות + + + אפגני + + + לק אלבני + + + דראם ארמני + + + גילדר [ANG] + + + קואנזה אנגולי + + + קואנזה חדש אנגולי + + + קואנזה רג'וסטדו + + + פזו ארגנטינאי (1983-1985) + + + פזו ארגנטינאי + + + שילינג אוסטרי + + + דולר אוסטרלי + + + פלורין + + + מאנאט + + + מאנאט אזרביג׳ני + + + דינר של בוסניה־הרצגובינה + + + מארק בר המרה + + + דולר ברבדיאני + + + טאקה + + + פרנק בלגי (בר המרה) + + + פרנק בלגי + + + לב + + + לב בולגרי + + + דינר בחרייני + + + פרנק בורונדי + + + דולר ברמודה + + + דולר ברוניי + + + בוליביאנו + + + פזו בוליבי + + + קרוזיארו + + + קרוזדו + + + ריאל ברזילאי + + + דולר בהאמי + + + נגולטרום + + + פולה + + + דולר בליזאי + + + דולר קנדי + + + פרנק קונגיני + + + פרנק שוויצרי + + + פזו צ'ילאני + + + יואן + + + פזו קולומביאני + + + קולון + + + דינר סרבי ישן + + + קורונה צ'כית [1953-1992] + + + פזו קובני + + + לירה קפריסאית + + + קורונה צ'כית + + + מרק מזרח גרמני + + + מרק גרמני + + + פרנק [DJF] + + + כתר דני + + + פזו + + + דינר אלג'ירי + + + סוקר + + + קרון אסטוני + + + לירה מיצרית + + + אקוולה + + + נאקפה + + + פזטה [ESA] + + + פזטה [ESB] + + + פסטה ספרדי + + + ביר + + + אירו + + + מרק פיני + + + דולר פיג'י + + + פאונד + + + פרנק צרפתי + + + לירה שטרלינג + + + לרי + + + פאונד גיברלטר + + + דלסי + + + פרנק גינאי + + + דרכמה + + + קצאל + + + פזו גינאי + + + דולר גיאני + + + דולר הונג קונגי + + + למפירה + + + קונה קרואטי + + + גארד + + + פורינט הונגרי + + + רופיה אינדונזית + + + לירה אירית + + + לירה ישראלית + ל״י + + + ש"ח + שקלים חדשים + + + + רופי הודית + + + דינר עירקי + + + ריאל איראני + + + קרונה איסלנדית + + + לירה איטלקית + + + דולר ג'מאיקני + + + דינר ירדני + + + ין יפני + + + שילינג קנייאתי + + + סום קירגיזי + + + ריל + + + פרנק קומורואי + + + וון צפון קוראני + + + וון דרום קוראני + + + דינר כוויתי + + + דולר קיימאני + + + טנגה + + + קיפ + + + לירה לבנונית + + + רופי סרי לנקי + + + דולר ליברי + + + לוטי + + + ליטא ליטאי + + + פרנק לוקסמבורגי + + + לט + + + דינר לובי + + + דירהם מרוקאי + + + פרנק מאלי + + + ליאו מולדובני + + + פרנק מדגסקארי + + + קיאט + + + טוגרוג + + + פטקה + + + לירה מלטית + + + רופי מאוריציני + + + רופיה + + + קאווצ'ה + + + פזו מקסיקני + + + פזו מקסיקני (1861 - 1992) + + + רינגיט מלזי + + + מטיקל + + + דולר נמיבי + + + נאירה + + + קורדובה + + + גילדר + + + כתר נורבגי + + + רופי נפאלי + + + דולר ניו זילנדי + + + בלבואה + + + סול פרואני חדש + + + קינה + + + פזו פיליפיני + + + רופי פקיסטני + + + זלוטי פולני + + + זלוטי (1950 - 1995) + + + אסקודו + + + גווארני + + + ריאל קטארי + + + לאו + + + לאו רומני חדש + + + דינר סרבי + + + רובל + + + רובל רוסי (1991 - 1998) + + + פרנק רואנדי + + + ריאל סעודי + + + דולר איי שלמה + + + רופי סיישלי + + + דינר סודני + + + לירה סודנית + + + כתר שוודי + + + דולר סינגפורי + + + פאונד סנט הלני + + + טולאר סלובני + + + קורונה סלובקי + + + ליאון + + + שילינג סומאלי + + + דולר סורינאמי + + + גילדר סורינאמי + + + דוברה + + + רובל סובייטי + + + לירה סורית + + + לילנגני + + + בהט תאילנדי + + + סומוני טג'קיסטני + + + מנאט טורקמאני + + + דינר טוניסאי + + + פאנגה + + + אסקודו טימוראי + + + לירה טורקית + + + לירה טורקית חדשה + + + דולר טרינידדי + + + דולר טאייוני חדש + + + שילינג טנזני + + + גריבנה אוקראיני + + + שילינג אוגנדי (1966 - 1987) + + + שילינג אוגנדי + + + דולר אמריקאי + + + דולר אמריקאי (היום הבא) + + + דולר אמריקאי (היום הזה) + + + פזו אורוגוואי + + + סום אוזבקי + + + בוליבר ונצואלי + + + דונג וייטנאמי + + + ואטו + + + טלה + + + פרנק + + + כסף + + + זהב + + + דולר מזרח קריבי + + + זכויות משיכה מיוחדות + + + פרנק זהב + + + פלדיום + + + פלטינה + + + סימון למטרות בדיקה + + + סימון "ללא מטבע" + + + דינר תימני + + + ריאל תימני + + + דינר יגוסלבי חדש + + + דינר יגוסלבי + + + ראנד דרום אפריקאי (כספי) + + + ראנד דרום אפריקאי + + + קוואצ'ה + + + זאיר חדש + + + דולר זימבבואי + + + + + + {0} ימים + + + {0} שעות + + + {0} דקות + + + {0} חודשים + + + {0} שניות + + + {0} שבועות + + + {0} שנים + + + + + כן:כ + לא:ל + + + diff --git a/libs/Zend/Locale/Data/he_IL.xml b/libs/Zend/Locale/Data/he_IL.xml new file mode 100644 index 0000000..cf2e5ba --- /dev/null +++ b/libs/Zend/Locale/Data/he_IL.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/hi.xml b/libs/Zend/Locale/Data/hi.xml new file mode 100644 index 0000000..134ee44 --- /dev/null +++ b/libs/Zend/Locale/Data/hi.xml @@ -0,0 +1,3005 @@ + + + + + + + + + + + {0} ({1}) + , + + + अफ़ार + अब्खाज़ियन् + अकोली + अवेस्तन + अफ्रीकी + अफ्रो-एशियाई भाषाएँ + अफ्रीलीयाई + ऐनू + अकन + अकाडिनी + अम्हारिक् + अर्गोनी + पुरानी अंग्रेज़ी + अंगीका + अपाची भाषा + अरबी + अरामी + अराफाओ + कृत्रिम भाषा + असामी + आस्ट्रेलियाई भाषा + अवेरिक + अवधी + आयमारा + अज़रबैंजानी + बशख़िर + बलूची + बल्कानी भाषा + बैलोरूशियन् + बल्गेरियन् + बिहारी + भोजपुरी + बिस्लामा + बँगाली + तिब्बती + ब्रेटन + ब्रज + बोस्नियाई + कातालान + मध्य अमेरिकी भारतीय भाषा + काकेशी भाषा + चेचन + केल्ट भाषा + कोर्सीकन + चेक + वेल्श + डैनीश + ज़र्मन + जर्मन (ऑस्ट्रिया) + द्रविण भाषा + मध्य पुर्तगाली + भुटानी + प्राचीन मिस्री + ग्रीक + अंग्रेजी + अंग्रेज़ी (ऑस्ट्रेलिया) + अंग्रेज़ी(कनाडाई) + अंग्रेजी(ब्रिटिश) + अंग्रेज़ी अमेरीकी + एस्पेरान्तो + स्पेनिश + लेटिन अमेरिकी स्पेनिश + ईवेरियाई स्पेनिश + ऐस्तोनियन् + बास्क् + पर्शियन् + फिनिश + फिलिपिनो + फ़ीजी + फिरोज़ी + फ्रेंच + फ़्रेंच(कनाडाई) + पुरानी फ्रांसीसी + पश्चिमी फ़्रिसियाई + आयरिश + गायो + स्काट्स् गायेलिक् + गैलिशियन् + गुआरानी + गाँडी + गॉथिक + प्राचीन यूनानी + गुज़राती + होउसा + हीब्रू + हिन्दी + हिमाचली + क्रोएशन् + हंगेरी + हूपा + अरमेनियन् + ईन्टरलिंगुआ + इन्डोनेशियाई + ईन्टरलिंगुइ + इनुपियाक् + ईरानी भाषा + आईस्लैंडिक् + इतालवी + इनूकीटूत् + जापानी + जावानीस + जॉर्जीयन् + kcg + कज़ाख + ग्रीनलैंडिक + कैम्बोडियन् + कन्नड़ + कोरीयन् + कोंकणी + कश्मीरी + कुरदीश + किरघिज़ + लैटीन + लिंगाला + लाओथीयन् + मोंगो + लिथुनियन् + लाटवियन् (लेट्टीश) + मंधार + मालागासी + मेओरी + विविध भाषा + मैसेडोनियन् + मलयालम + मंगोलीयाई + मणिपूरी + मोलडावियन् + मराठी + मलय + मालटिस् + विविध भाषाएँ + मुन्डा भाषा + मिरांडी + मारवाड़ी + बर्लिस + माया भाषा + नायरू + नेपाली + नेवाड़ी + डच् + नार्वेजियन + नार्वेजीयन् + पारम्परिक नेवारी + ओसीटान + ओरोमो (अफ़ान) + उड़िया + पंजाबी + पुरानी फारसी + पाली + पॉलिश + प्राकृत + पॉशतो (पुशतो) + पुर्तगाली + पुर्तगाली (ब्राज़ील) + ईवेरियाई पुर्तगाली + क्वेशुआ + राजस्थानी + रहेय्टो-रोमान्स + रुन्दी + रोमानियाई + शिखर + रूसी + किन्यारवाण्डा + संस्कृत + संताली + सिन्धी + सांगो + सांकेतिक भाषा + सेर्बो-क्रोएशन् + शिंघालीस् + चीनी-तिब्ब्ती भाषा + स्लोवाक् + स्लोवेनियन् + स्लोवियाई भाषा + सामोन + सामी भाषा + सोणा + सोमाली + अल्बेनियन् + सर्बियन् + स्वाती + नील सहारी भाषा + सेसोथो + सुंडानी + सुसु + स्विडिश + स्वाहिली + तमिल + तेलेगु + ताजिक् + थाई + तिग्रीन्या + तुक्रमेन + तागालोग + क्लिंगन + सेत्स्वाना + टोंगा + तुर्की + सोंगा + टाटर + ट्वी + उईघुर + यूक्रेनी + अज्ञात या अवैध भाषा + उर्दू + उज़्बेक + वियेतनामी + वोलापुक + वोलोफ + षोसा + येहुदी + योरूबा + ज़ुआंग + चीनी + चीनी (सरलीकृत) + चीनी (पारम्परिक) + ज़ुलू + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + दुनिया + अफ्रीका + उत्तर अमेरिका + दक्षिण अमेरिका + ओशिआनिया + पश्चिमी अफ्रीका + मध्य अमरीका + पूर्वी अफ्रीका + उत्तरी अफ्रीका + मध्य अफ्रीका + दक्षिणी अफ्रीका + अमेरीकास + उत्तरी अमेरिका + कैरिबियन + पूर्वी एशिया + दक्षिणी एशिया + दक्षिण-पूर्व एशिया + दक्षिणी यूरोप + ऑस्ट्रेलिया एवं न्यूजीलैंड + पोलीनेशिया + दक्षिण-मध्य एशिया + एशिया + मध्य एशिया + पश्चिमी ऐशिया + यूरोप + पूर्वी यूरोप + उत्तरी यूरोप + पश्चिमी यूरोप् + अन्डोरा + संयुक्त अरब अमीरात + अफगानिस्तान + एंटिगुआ और बरबुडा + एंगुइला + अल्बानिया + आर्मेनिया + नीदरलैंड्स एंटिलीज़ + अंगोला + अंटार्कटिका + अर्जेन्टीना + अमेरिकी समोआ + ऑस्ट्रिया + ऑस्ट्रेलिया + अरूबा + आलैंड द्वीप + अजरबैजान + बोस्निया और हर्ज़िगोविना + बारबाडोस + बाँग्लादेश + बेल्जियम + बुर्किना फ़ासो + बुल्गारिया + बहरीन + बुरुंडी + बेनिन + बरमूडा + ब्रुनेई + बोलीविया + ब्राजील + बहामा + भूटान + बौवेत द्वीप + बोत्स्वाना + बेलारूस + बेलिज + कनाडा + कोकोस द्वीप + कोंगो जनतांत्रिक गणतंत्र + सेंट्रल अफ्रीकन रिपब्लिक + कांगो + स्विस + आईवरी कोस्ट + कुक द्वीप + चिली + कैमरून + चीन + कोलम्बिया + कोस्टारीका + सर्बिया व मॉण्टेनेग्रो + क्यूबा + कैप वर्डे + क्रिसमस द्वीप + साइप्रस + चेक गणराज्य + जर्मनी + जिबूती + डेनमार्क + डोमिनिक + डोमिनिकन गणराज्य + अल्जीरिया + इक्वाडोर + एस्टोनिया + मिस्र + पश्चिमी सहारा + इरिट्रिया + स्पेन + इथियोपिया + फिनलैंड + फिजी + फ़ॉकलैंड द्वीप + माइक्रोनेशिया + फरोए द्वीप + फ्रांस + गैबॉन + ब्रितन + ग्रेनेडा + जॉर्जिया + फ़्रांसीसी गिआना + ग्वेर्नसे + घाना + जिब्राल्टर + ग्रीनलैण्ड + गाम्बिया + गिनी + ग्वाडेलोप + इक्वेटोरियल गिनी + ग्रीस + दक्षिण जोर्जिया और दक्षिण सैंडवीच द्वीप + गोतेदाला + गुआम + गीनी-बिसाउ + गुयाना + हाँग काँग + हर्ड द्वीप और मैकडोनॉल्ड द्वीप + हाण्डूरस + क्रोशिया + हाइती + हंगरी + इंडोनेशिया + आयरलैंड + इसराइल + भारत + ब्रिटिश हिंद महासागरीय क्षेत्र + इराक + ईरान + आइसलैंड + इटली + जर्सी + जमाइका + जोर्डन + जापान + केन्या + किर्गिज + कम्बोडिया + किरिबाती + कोमोरोस + सेंट किट्स और नेविस + उत्तर कोरिया + दक्षिण कोरिया + कुवैत + केमैन द्वीप + कजाखस्तान + लाओस + लेबनान + सेंट लूसिया + लिकटेंस्टीन + श्रीलंका + लाइबेरिया + लेसोथो + लिथुआनिया + लक्समबर्ग + लात्विया + लीबिया + मोरक्को + मोनाको + मोल्डाविया + मोंटेनेग्रो + संत मार्टीन + मदागास्कर + मार्शल द्वीप + मैसेडोनिया + माली + म्यानमार + मंगोलिया + मकाओ + उत्तरी मारियाना द्वीप + मार्टीनिक + मॉरिटानिया + मॉन्ट्सेराट + माल्टा + मौरिस + मालदीव + मलावी + मेक्सिको + मलेशिया + मोजाम्बिक + नामीबिया + न्यू कैलेडोनिया + नाइजर + नॉरफ़ॉक आइलैंड + नाइजीरिया + निकारागुआ + नीदरलैण्ड + नॉर्वे + नेपाल + नॉरू + नीयू + न्यूज़ीलैंड + ओमान + पनामा + पेरू + फ़्रांसीसी पॉलिनेशिया + पापुआ न्यू गिनी + फिलीपिंस + पाकिस्तान + पोलैंड + सेण्‍ट पीयर और मि‍क्‍वेलोन + पिटकेर्न + पर्टो रीको + फ़िलिस्तीन + पुर्तगाल + पलाऊ + पारागुए + कतर + यूरोपीय संघ + रियूनियन + रोमानिया + सर्बिया + रूस + रूआण्डा + सऊदी अरब + सोलोमन द्वीप + सेशेल्स + सूडान + स्वीडन + सिंगापुर + सेण्‍ट हेलेना + स्लोवेनिया + स्वाल्बार्ड और जॅन मेयन + स्लोवाकिया + सियरालेओन + सैन मेरीनो + सेनेगल + सोमालिया + सुरिनाम + साउ-तोम-प्रिंसिप + अल साल्वाडोर + सीरिया + सुआजीलैंड + तुर्क् और् कैकोज़ द्वीप + चाड + फ़्रांसीसी दक्षिणी क्षेत्र + टोगो + थाइलैंड + ताजिकिस्तान + टोकेलौ + पूर्वी तिमोर + तुर्कमेनिस्तान + तुनिशिया + टोंगा + तुर्की + ट्रिनिडाड और टोबैगो + तुवालु + ताइवान + तंजानिया + यूक्रेन + युगांडा + युनाइटेड स्टेट्स छोटे आउटलाइंग द्वीप + संयुक्त राज्य अमरिका + युरूगुए + उजबेकिस्तान + वैटिकन + सेंट विंसेंट और द ग्रेनाडाइन्स + वेनेजुएला + ब्रिटिश वर्जीन ऌईलैंडस् + ईउ, एस वर्जीन आईलैंडस् + वियतनाम + वानुअतु + वालिस और फ़्यूचूना + समोआ + यमन + मैयट + दक्षिण अफ्रीका + जाम्बिया + जिम्बाब्वे + अज्ञात या अवैध प्रदेश + + + पारम्पारिक जर्मन वर्तनी + जर्मेनी की 1996 वर्तनी + पूर्वी अर्मेनियाई + एकस्वरीय + जीवा बोली + बहुस्वरीय + कम्प्यूटर + संशोधित वर्तनी + + + पंचाग + मिलान + मुद्रा + + + पारम्पारिक चीनी वर्गीकरण + बौद्ध पंचांग + चीनी पंचांग + प्रत्यक्ष वर्गीकरण + सरलीकृत चीनी वर्गीकरण + ग्रेगरी पंचांग + हिब्रू पंचांग + भारतीय पंचांग + इस्लामी पंचांग + इस्लामी नागरिक पंचांग + जापानी पंचांग + दूरभाष निर्देशिका वर्गीकरण + पिनयीन वर्गीकरण + चीनी गणतंत्र पंचांग + स्ट्रोक वर्गीकरण + पारम्पारिक वर्गीकरण + + + यूएस + मेट्रिक + + + + [ॐ ०-९ अ-ऍ ए-ऑ ओ-न प-र ल ळ व-ह ़ ँ-ः ऽ ् ा-ॅ े-ॉ ो ौ] + [\u200C \u200D] + + + ' + ' + " + " + + + + + + + + मस्केरेम + टेकेम्ट + हेदर + तहसास + टर + येकाटिट + मेगाबिट + मियाज़िया + गनबोट + सेन + हम्ले + नेहासे + पागूमन + + + + + + + + + जनवरी + फरवरी + मार्च + अप्रैल + मई + जून + जुलाई + अगस्त + सितम्बर + अक्तूबर + नवम्बर + दिसम्बर + + + जनवरी + फरवरी + मार्च + अप्रैल + मई + जून + जुलाई + अगस्त + सितम्बर + अक्तूबर + नवम्बर + दिसम्बर + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + रवि + सोम + मंगल + बुध + गुरु + शुक्र + शनि + + + रविवार + सोमवार + मंगलवार + बुधवार + गुरुवार + शुक्रवार + शनिवार + + + + + + 2 + मं + 4 + गु + 6 + 7 + + + + + + + Q2 + + + प्रथम चौथाई + द्वितीय चौथाई + तृतीय चौथाई + चतुर्थ चौथाई + + + + + 1 + 2 + + + प्रथम चौथाई + + + + पूर्वाह्न + अपराह्न + + + ईसापूर्व + सन + + + + + + EEEE d MMMM yyyy + + + + + d MMMM yyyy + + + + + dd-MM-yyyy + + + + + d-M-yy + + + + + + + h:mm:ss a v + + + + + h:mm:ss a z + + + + + h:mm:ss a + + + + + h:mm a + + + + + + + {1} {0} + + + + EEEE,dd MMMM GGGGy + HH:mm + HH:mm:ss + H:mm + E, M-d + E MMM d + E MMMM d + d MMMM + MMM d + MMM dd + dd-MM + M-d + d + hh:mm a + hh:mm:ss a + mm:ss + yyyy + yyyy-M + yyyy MMM + EEE, yyyy MMM d + yyyy Q + EEE, MMM d, yy + MMM d, yy + dd-MM-yy + Q yy + MM-yyyy + MMMM yyyy + + + + + काल + + + साल + + + महीना + + + सप्ताह + + + दिन + Today + Tomorrow + Yesterday + + + दिन सप्ताह का + + + घंटा + + + मिनट + + + सेकेंड + + + क्षेत्र + + + + + + + + चैत्र + वैशाख + ज्येष्ठ + असध + कार्तिक + पौष + माघ + फाल्गुन + + + चैत्र + वैशाख + ज्येष्ठ + असध + श्रवण + भद्र + अश्विन + कार्तिक + अग्रायण + पौष + माघ + फाल्गुन + + + + + असाढ़ + श्रावण + भाद्र + आश्विन + अग्रहण + + + चैत्र + वैशाख + ज्येष्ठ + कार्तिक + पौष + माघ + फाल्गुन + + + + + + + + + मुहर्रम + सफर + राबी प्रथम + राबी द्वितीय + जुम्डा प्रथम + जुम्डा द्वितीय + रजब + शावन + रमजान + शव्व्ल + + + मुहर्रम + सफर + राबी प्रथम + राबी द्वितीय + जुम्डा प्रथम + जुम्डा द्वितीय + रजब + शावन + रमजान + शव्व्ल + + + + + मुहर्रम + सफर + राबी प्रथम + राबी द्वितीय + जुम्डा प्रथम + जुम्डा द्वितीय + रजब + शावन + रमजान + शव्व्ल + + + + + + + + ताएका + हाकूची + हाकूहो + शूचो + ताहिओ + केउन + वाडू + रैकी + योरो + टेम्प्यो + टेम्प्यो-काम्पो + टेम्प्यो-शोहो + टेम्प्यो-होजी + टेम्प्यो-जिंगो + टेम्प्यो-किउन + होकी + टेनो + इंर्याकू + डाईडू + क़ोनिन + टेंचो + शोवा + काज्यो + निंजू + शाईकू + टेनन + जोगन् + गेंकेई + निन्ना + केम्प्यो + शूताई + ईंगी + ईंचो + शोहेई + टेंग्यो + टेंर्याकू + टेंटूकू + ओवा + कोहो + अन्ना + टेंरोकू + टेन-एन + जोगन् + टेंगेन + ईकान + कन्ना + ई-एन + एइसो + चोटूकु + चोहो + कंको + च्योवा + कन्निन + ज़ियान + मंजू + चोगन + चोर्याकू + चोक्यु + कांटूको + ईशो + टेंगी + कोहैइ + जिर्याकू + ईंक्यू + सोहो + शोर्याकू + ईहो + ओटूको + कांजि + कोहो + ईचो + शोटूको + कोवा + चोजी + काशो + टेन्निन + टेन-ई + ईक्यू + जेन-ई + होआन + तेंजी + दाईजी + टे‡ंशो + चोशो + होएन + ईजी + टेन्यो + क्यूआन + निंपैई + क्योजो + होगेन + हैजी + ईर्याकू + ओहो + चोकान + ईमान + निन-आन + काओ + शोअन + अंजन + जिशो + योवा + जूऐई + जेंर्याकू + बूंजी + केंक्यू + शोजी + केन्निन + जेंक्यू + केन-ई + शोगेन + केंर्याकू + केंपो + शोक्य¯ू + जू + जेन्निन + कोरोकू + अंटैइ + कांकी + जोएई + टेम्पूकू + बुंर्याकू + काटेई + र्याकूनिन + ईन-ओ + निंजी + होजी + केंचो + कोगेन + शोका + शोगेन + बुन-ओ + कोचो + बुन-ई + केंजी + कोअन + शो + ईनिन + शोअन + केंजेन + काजेन + टोकूजी + ईंकेई + ओचो + शोवा + बुंपो + जेनो + जेंक्यो + शोचू + कारेकी + जेंटोकू + गेंको + केम्मू + ईंजेन + कोकोकू + शोहेई + केंटोकू + बूंचो + टेंजो + कोर्याकू + कोवा + जेंचू + मेटोकू + काकेई + कू + ओई + शोचो + ईक्यो + काकीत्सू + बुन-अन + होटोकू + क्योटोकू + कोशो + चोरोकू + कांशो + बुंशो + ओनिन + बुन्मेई + चोक्यो + ईंटोकू + मेईओ + बुंकी + ईशो + ताईएई + क्योरोकू + टेन्मन + कोजी + ईरोकू + जेंकी + टेंशो + बुंरोकू + केईचो + जेनवा + कान-एई + शोहो + केईआन + शो + मेईर्याकू + मानजी + कनबुन + ईंपो + टेंवा + जोक्यो + जेंरोकू + शोटूको + क्योहो + जेंबुन + कांपो + इंक्यो + कान-एन + होर्याकू + मेईवा + अन-एई + टेनमेई + कांसेई + क्योवा + बुंका + बुंसेई + टेंपो + कोका + काईए + अंसेई + मान-ईन + बुंक्यौ + जेंजी + केईओ + मेजी + ताईशो + शोवा + हेईसेई + + + ताएका + हाकूची + हाकूहो + शूचो + ताहिओ + केउन + वाडू + रैकी + योरो + जिंकी + टेम्प्यो + टेम्प्यो-काम्पो + टेम्प्यो-शोहो + टेम्प्यो-होजी + टेम्प्यो-जिंगो + टेम्प्यो-किउन + होकी + टेनो + इंर्याकू + डाईडू + क़ोनिन + टेंचो + शोवा + काज्यो + निंजू + शाईकू + टेनन + जोगन् + गेंकेई + निन्ना + केम्प्यो + शूताई + ईंगी + ईंचो + शोहेई + टेंग्यो + टेंर्याकू + टेंटूकू + ओवा + कोहो + अन्ना + टेंरोकू + टेन-एन + जोगन् + टेंगेन + ईकान + कन्ना + ई-एन + एइसो + शोर्याकू + चोटूकु + चोहो + कंको + च्योवा + कन्निन + ज़ियान + मंजू + चोगन + चोर्याकू + चोक्यु + कांटूको + ईशो + टेंगी + कोहैइ + जिर्याकू + ईंक्यू + सोहो + शोर्याकू + ईहो + ओटूको + कांजि + कोहो + ईचो + शोटूको + कोवा + चोजी + काशो + टेन्निन + टेन-ई + ईक्यू + जेन-ई + होआन + तेंजी + दाईजी + टेंशो + चोशो + होएन + ईजी + कोजी + टेन्यो + क्यूआन + निंपैई + क्योजो + होगेन + हैजी + ईर्याकू + ओहो + चोकान + ईमान + निन-आन + काओ + शोअन + अंजन + जिशो + योवा + जूऐई + जेंर्याकू + बूंजी + केंक्यू + शोजी + केन्निन + जेंक्यू + केन-ई + शोगेन + केंर्याकू + केंपो + शोक्यू + जू + जेन्निन + कोरोकू + अंटैइ + कांकी + जोएई + टेम्पूकू + बुंर्याकू + काटेई + र्याकूनिन + ईन-ओ + निंजी + कांजेन + होजी + केंचो + कोगेन + शोका + शोगेन + बुन-ओ + कोचो + बुन-ई + केंजी + कोअन + शो + ईनिन + शोअन + केंजेन + काजेन + टोकूजी + ईंकेई + ओचो + शोवा + बुंपो + जेनो + जेंक्यो + शोचू + कारेकी + जेंटोकू + गेंको + केम्मू + ईंजेन + कोकोकू + शोहेई + केंटोकू + बूंचो + टेंजो + कोर्याकू + कोवा + जेंचू + मेटोकू + काकेई + कू + मेटोकू + ओई + शोचो + ईक्यो + काकीत्सू + बुन-अन + होटोकू + क्योटोकू + कोशो + चोरोकू + कांशो + बुंशो + ओनिन + बुन्मेई + चोक्यो + ईंटोकू + मेईओ + बुंकी + ईशो + ताईएई + क्योरोकू + टेन्मन + कोजी + ईरोकू + जेंकी + टेंशो + बुंरोकू + केईचो + जेनवा + कान-एई + शोहो + केईआन + शो + मेईर्याकू + मानजी + कनबुन + ईंपो + टेंवा + जोक्यो + जेंरोकू + होएई + शोटूको + क्योहो + जेंबुन + कांपो + इंक्यो + कान-एन + होर्याकू + मेईवा + अन-एई + टेनमेई + कांसेई + क्योवा + बुंका + बुंसेई + टेंपो + कोका + काईए + अंसेई + मान-ईन + बुंक्यौ + जेंजी + केईओ + मेजी + ताईशो + शोवा + हेईसेई + + + + + + + + + + + + + + फर्वादिन + ओर्दिवेहेस्ट + खोरर्दाद + टिर + मोरदाद + शाहरीवर् + मेहर + अवन + अज़र + डे + बहमन + ईस्फन्द् + + + फर्वादिन + ओर्दिवेहेस्ट + खोरर्दाद + टिर + मोरदाद + शाहरीवर् + मेहर + अवन + अज़र + डे + बहमन + ईस्फन्द् + + + + + फर्वादिन + ओर्दिवेहेस्ट + खोरर्दाद + टिर + मोरदाद + शाहरीवर् + मेहर + अवन + अज़र + डे + बहमन + ईस्फन्द् + + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + अज्ञात + + + अंडोरा + + + दुबई + + + काबूल + + + एंटिगुआ + + + एंग्विला + + + टिरेन + + + येरेवन + + + क्यूराकाओ + + + लूएंडा + + + रोथेरा + + + पॉमर + + + दक्षिणी ध्रुव + + + स्योवा + + + मॉसन + + + डेविस + + + वोस्तोक + + + क़ेसी + + + डुमोंट ड'अर्विल + + + मैकमुर्डो + + + रियो गालेगोस + + + मेंडोजा + + + सान जुआन + + + उशूयिया + + + ला रिओजा + + + सान लुईस + + + कटामार्का + + + जुजोए + + + टोकूमन + + + कोर्डोवा + + + ब्यूनस आयरस + + + पागो पागो + + + वियना + + + पर्थ + + + यूक्ला + + + डार्विन् + + + एडिलेड + + + ब्रोकन हिल्स + + + क्यूरी + + + मेलबोर्न + + + होबर्ट् + + + लिंडेमान + + + सिडनी + + + बिर्स्बेन + + + लोर्ड होवे + + + अरूबा + + + बाकू + + + बारबाडोस + + + ढाका + + + ब्रसल्स + + + ओआगदूगू + + + सोफ़िया + + + बहरीन + + + बुजुम्बुरा + + + पोर्टो-नोवो + + + बरमूडा + + + ब्रूनेइ + + + ला पाज़ + + + ईरोंपे + + + रियो ब्रान्को + + + पोर्टो वेल्हो + + + बोआ विस्ता + + + मनौस + + + कूईआबा + + + केम्पो ग्रान्दे + + + बेलेम + + + अरग्वैना + + + साओ पॉलो + + + बहिया + + + फ़ोर्टालेज़ा + + + मेसीओ + + + रेचीफ़े + + + नोरोन्हा + + + नस्साउ + + + थिम्फू + + + गैबोरोन + + + मिंस्क + + + बेलिज़े + + + डोसन + + + व्हाईटहोर्स + + + इनूविक + + + वांकूवर + + + डोसन क्रिक + + + येलोनाईफ + + + एडमंटन + + + स्विफ्ट करंट + + + केम्ब्रिज खाडी + + + रेजिना + + + विनीपेग + + + रिसोल्यूट + + + रेनी नदी + + + रेंकिन इंलेट + + + कोरल बन्दरगाह + + + थंडर खाडी + + + निपिगन + + + टोरंटो + + + मोंट्रियल + + + इक्याल्यूईत + + + पंग्निर्टंग् + + + मोंक्ट्न + + + हेलिफेक्स + + + गूस खाडी + + + ग्लेस खाडी + + + ब्लांक-सेबलोन + + + सेंट जोंस + + + कोकोस + + + किन्शासा + + + लुबुमबाशी + + + बैंगुइ + + + ब्राज़ाविल + + + ज़्यूरिक + + + अबिद्जान + + + रारोटोंगा + + + ईस्टर द्वीप (चिली) + + + सेंटिएगो + + + दोआला + + + काश्गर + + + उरम्ची + + + चोंग्पिंग + + + हर्बिन + + + बोगोटा + + + कोस्टा रिका + + + हवाना + + + केप वर्डे + + + क्रिसमस + + + निकोसिया + + + बर्लिन + + + डिजिबौटी + + + कोपनहेगन + + + डॉमिनिका + + + संटो डोमिंगो + + + अल्जीरिया + + + गेलापगोस + + + ग्वायाक्विल + + + टैलिन + + + कायरो + + + एल आइउन + + + असमेरा + + + केनरी द्वीप + + + क्यूटा + + + मैड्रिड + + + ऐडिस अबाबा + + + हेल्सिंकी + + + फ़िजी + + + स्टैन्ली + + + ट्रुक + + + पोनापे + + + कोसराए + + + फ़ैरो + + + पेरिस + + + लिबरविल + + + लंदन + + + ग्रेनाडा + + + बिलिसी + + + कयेन + + + ऐक्रा + + + जिब्राल्टर + + + थ्यूले + + + गॉडथैब + + + स्कोर्सबाइसंड + + + डेनमार्क्षवन + + + बनजुल + + + कोनाक्री + + + गौडलोप + + + मालाबो + + + एथेंस + + + साउथ जॉर्जिया + + + ग्वाटेमाला + + + ग्वाम + + + बिस्साउ + + + गुयाना + + + हाँगकाँग + + + पोर्ट-आउ-प्रिंस + + + बुडापेस्ट + + + जकार्ता + + + पोंतिआंक + + + मकस्सर + + + जयापुरा + + + डबलिन + + + येरुसलम + + + चागोस + + + बगदाद + + + तेहरान + + + रेक्याविक + + + रोम + + + जमैका + + + अम्मान + + + टोक्यो + + + नैरोबी + + + बिश्केक + + + नोम पेन्ह + + + एंडरबेरी + + + किरीतिमाति + + + टरावा + + + कोमोरो + + + सेंट किट्ट्स + + + प्योंगयांग + + + सोल + + + कुवैत + + + केमन + + + अक्ताव + + + ओरल + + + अक़्टोवे + + + केज़ेलोर्डा + + + अल्माटी + + + वियंतियेन + + + बेरुत + + + सेंट लुसीया + + + वादुज़ + + + कोलंबो + + + मोन्रोविया + + + मसेरू + + + विल्निअस + + + लक्ज़मबर्ग + + + रिगा + + + त्रिपोली + + + कैसाब्लैंका + + + मोनाको + + + चिसीनौ + + + ऐंटनानरीवो + + + क्वजलेन + + + मजूरो + + + बमाको + + + रंगून + + + होव्ड + + + उलानबाटर + + + चोइबालसन + + + मकाऊ + + + सइपान + + + मारटीनीक + + + नौवाक्चॉट + + + मोन्त्सेरत + + + माल्टा + + + मॉरिशस + + + मालदीव + + + ब्लैंटायर + + + टिज्यूआना + + + हर्मोसिलो + + + म्जाटलान + + + चिहुआहुआ + + + मोंटेरे + + + मेक्सिको सिटी + + + मेरिडा + + + कनकन + + + क्वाला लम्पुर + + + कूचिंग + + + माइपुटो + + + विन्डोएक + + + नूमिया + + + न्यामे + + + नोर्फ़ोक + + + लागोस + + + मनागुआ + + + ऐम्स्टरडम + + + ओस्लो + + + काठमांडू + + + नौरू + + + नियु + + + चाथम + + + औकलैंड + + + मस्कट + + + पनामा + + + लीमा + + + टहीटि + + + मार्केसस + + + गैम्बियर + + + पोर्ट मोरेस्बाइ + + + मनीला + + + कराची + + + वॉरसा + + + मिक्वेलोन + + + पिट्कैर्न + + + प्योर्तो रिको + + + गाज़ा + + + अज़ोरस + + + मडेएरा + + + लिस्बन + + + पलाऊ + + + ऐसन्क्षन + + + क़तर + + + रियूनियन + + + बुक्कारेस्ट + + + कालिलींग्राड + + + मॉस्को + + + वोल्गोग्रेड + + + समारा + + + येकांतिरिंबर्ग + + + ओम्स्क + + + नॉवोसिविर्स्क् + + + क्राशनोयार्श्क + + + ईर्कुत्स्क + + + याकूत्स्क + + + ब्लाडिवोस्टोक + + + सखालिन + + + मगादन + + + कमचटका + + + अनाडेर + + + किगालि + + + रियाध + + + ग्वाडलकनाल + + + माहे + + + खार्तूम + + + स्टॉकहोम + + + सिंगापुर + + + सेंट हेलेना + + + फ़्रीटाउन + + + डकार + + + मोगाडिशू + + + परामरीबो + + + साओ टोम + + + सैल्वेडोर + + + दमास्कस + + + म्बाबेन + + + ग्रैँड तुर्क + + + जमेना + + + कर्ग्वेलेन + + + लोम + + + बैंगकॉक + + + दुशांबे + + + फ़काओफ़ो + + + डिली + + + अश्गाबात + + + ट्यूनिस + + + टोंगाटापू + + + इस्तानबुल + + + पोर्ट ऑफ़ स्पेन + + + फ़ुनाफ़ूटी + + + ताइपेइ + + + दार एस सलाम + + + उझ्गोरोड् + + + कीव + + + सिम्फेरोपोल + + + झापोरोझे + + + कम्पाला + + + मिडवे + + + जॉनस्टन + + + वेक + + + अडक + + + नोम + + + हानूलुलु + + + अलास्का + + + यकूतत + + + जुनेऔ + + + लोस एंजिलेस + + + बोईस + + + फोनिक्स + + + शिपरेक + + + डेनवर + + + न्यू सालेम + + + मध्य + + + शिकागो + + + मेनोमिनी + + + विंसिनेस + + + पिटर्स्वर्ग + + + टेल सिटी + + + नोक्स + + + विनामेक + + + मारेंगो + + + इन्डियानापोलिस + + + लोईसविले + + + विवे + + + मोंटीसेलो + + + डेट्रोईट + + + न्यूयार्क + + + मोन्टेवीडियो + + + समरकंड + + + ताशकंद + + + सेंट विंसेंट + + + काराकस + + + टॉरटोला + + + सेंट टॉमस + + + साइगॉन + + + एफ़ेट + + + वालिस + + + एपिया + + + ऐडेन + + + मायोत्ते + + + जोहानसबर्ग + + + लुसाका + + + हरारे + + + + भारतीय समय + + true + + + + + + . + , + ; + % + + # + + + - + E + + + NaN + + + + + #,##,##0.### + + + + + + + #E0 + + + + + + + #,##,##0% + + + + + + + ¤ #,##,##0.00 + + + {0} {1} + {0} {1} + + + + संयुक्त अरब अमीरात दिर्हाम + + + अफगानी (1927-2002) + + + अफगानी + + + अरमेनियाई दरम + दरम + + + अर्जेण्टीनी पीसो + + + ऑस्ट्रेलियाई डॉलर + + + बुल्गारियाई लेव् + + + बोलिवियाई बोलिवियानो + + + रीयाल + रीयाल + + + कनेडियन डॉलर + + + स्विस फ़्रैंक + + + चिली पीसो + + + युवान + युवान + + + कोलम्बियाई पीसो + + + सर्बिय का ढीनार + स. ढीनार + + + साईप्रस पाऊंड + + + चेक कोरुना + + + डच मार्क + + + डेनमार्क क्रोन + + + अल्जीरीयाई दिनार + + + एस्टोनियाई क्रून् + + + मिस्री पाउण्ड + + + युरो + + + फ़िजी का डालर + फ़िजी का डालर + + + फ़्रांसीसी फ़्रैंक + + + ब्रितन का पौन्ड स्टर्लिग + + + हाँगकाँग डॉलर + हॉंगकॉंग डॉलर + + + क्रोएशियन दिनार + + + क्रोएशियाई कुना + + + हंगरी फोरेंट् + + + इण्डोनेशियाई रुपिया + + + इस्राइली शेकेल + + + भारतीय रूपया + रु. + + + इराकी दिनार + + + इतली का लीरा + + + जापानी येन + + + उत्तर कोरियाई वोन + + + दक्षिण कोरियाई वोन + + + कुवैती दिनार + + + लेबनानी पाउंड + + + श्रीलंकाई रुपया + + + लाईबेरीयाई डालर + + + लिथुआनियाई लितास + + + मोराक्को दिरहम + + + मोरक्को फ्रैंक + + + मेक्सिको पेसो + + + मलेशियाई रिंगित + + + नामीबियाई डालर + + + नॉर्वे क्रोन + + + नेपाली रुपया + + + न्यूज़ीलैंड डॉलर + + + ओमानी रियाल + + + पेरुवाई न्यूवो सोल + + + फ़िलिपीनी पीसो + + + पाकिस्तानी रुपया + + + पोलिश नया ज़्लॉटी + + + रोडेशियाई डालर + + + रोमानियाई ल्यू + + + सर्बियन दिनार + + + रूसी रूबल + रूबल + + + रवांडाई फ्रैंक + + + सउदी रियाल + + + पुरानी सूडानी दिनार + + + सूडानी पाउंड + + + पुराना सूडानी पाउंड + + + स्वीडन क्रोना + + + सिंगापुर डॉलर + + + स्लोवेनियाई तोलार + + + स्लोवाक कोरुना + + + सोमाली शिलिंग + + + सूरीनामी डालर + + + सूरीनामी गिल्डर + + + सोवियत रूबल + + + सीरियाई पाउंड + + + थाई बाहत + + + तजाखी रूबल + + + तजाखी सोमोनी + + + पुरानी तुर्की लीरा + + + नई तुर्की लीरा + + + नया ताईवानी डॉलर + + + अमरीकी डालर + + + अमेरीकी डालर (कल) + + + अमेरीकी डालर (आज) + + + वेनेज़ुएलाई बोलिवार + + + वियतनामी डोंग + + + अज्ञात या अवैध मुद्रा + १२,३४५.६८ रुपये + + + दक्षिण अफ़्रीकी रॅण्ड + + + + + + {0} दिन + {0} दिन + + + {0} घंटा + {0} घंटे + + + {0} मिन. + {0} मिन. + + + {0} महीना + {0} महीने + + + {0} सेकं. + {0} सेकं. + + + {0} सप्ताह + {0} सप्ताह + + + {0} साल + {0} साल + + + + + हाँ + नहीं + + + diff --git a/libs/Zend/Locale/Data/hi_IN.xml b/libs/Zend/Locale/Data/hi_IN.xml new file mode 100644 index 0000000..49a1cde --- /dev/null +++ b/libs/Zend/Locale/Data/hi_IN.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/hr.xml b/libs/Zend/Locale/Data/hr.xml new file mode 100644 index 0000000..5621c02 --- /dev/null +++ b/libs/Zend/Locale/Data/hr.xml @@ -0,0 +1,1704 @@ + + + + + + + + + + + afrikaans + ostali afričko-azijski + amharik + engleski, stari (ca.450-1100) + apaški + arapski + umjetni (ostali) + asamski (Britanska Indija) + avarski + azerbajdžanski + baltički (ostali) + bjeloruski + berberski + bugarski + bihari + bengalski + bantu + tibetanski + bretonski + bosanski + katalonski + keltski (ostali) + čeroki + korzički + češki + crkvenoslavenski + velški + danski + njemački + gornjonjemački (Švicarska) + lužičkosrpski + nizozemski, srednji (ca. 1050-1350) + egipatski (antički) + grčki + engleski + engleski (australski) + engleski (britanski) + engleski (američki) + engleski, srednji (1100-1500) + esperanto + španjolski + španjolski (Latinska Amerika) + estonijski + baskijski + perzijski + finski + filipino + ugro-finski jezici + fidžijski + faroanski + francuski + francuski, srednji (ca.1400-1600) + francuski, stari (842-ca.1400) + sjevernofrizijski + istočnofrizijski + frizijski + irski + škotski-galski + germanski (ostali) + galicijski + njemački, srednji visoki (ca.1050-1500) + guarani + njemački, stari visoki (ca.750-1050) + grčki, antički (do 1453) + njemački (Švicarska) + gujarati + havajski + hebrejski + hindu + hrvatski + kreolski + mađarski + armenski + interlingua + indonezijski + interlingua (jezik zamišljen za internacionalnu komunikaciju među znanstvenicima) + indijski (drugi) + indoevropski (drugi) + iranski + islandski + talijanski + japanski + javanski + gruzijski + kongo + kazaški + kmerski + kannada + korejski + kurdski + kornski + kirgiški + latinski + luksemburški + lingala + laoski + litvanski + latvijski + irski, srednji (900-1200) + ostali jezici + makedonski + mkh + malayalam + mongolski + moldavski + marathi + malajski + malteški + burmanski + književni norveški + donjonjemački + nepalski + nizozemski + flamanski + novonorveški + norveški + okcitanski + orijski + turski - otomanski + punjabi + staroperzijski + poljski + staroprovansalski + paštu + portugalski + portugalski (iberijski) + retoromanski + rumunjski + romanski (ostali) + ruski + sanskrtski + sardski + sindhi + staroirski + srpsko-hrvatski + singaleški + slovački + slovenski + slavenski (drugi) + samoanski + somalski + albanski + srpski + sesotski + sundanski + švedski + svahili + tamilski + tajski + telugu + tajlandski + tigrinya + tigriški + turkmenski + tagalog + klingonski + turski + twi + tahićanski + turkmenski (uighur) + ukrajinski + nepoznati ili nevažeći jezik + urdu + uzbečki + vijetnamski + wolof + xhosa + jidiš + kineski + kineski (pojednostavljeni) + kineski (tradicionalni) + zulu + bez jezičnog sadržaja + + + + + + + + + + + + + + + + + + + + + Svijet + Afrika + Sjevernoamerički kontinent + Južna Amerika + Oceanija + Zapadna Afrika + Centralna Amerika + Istočna Afrika + Sjeverna Afrika + Središnja Afrika + Južna Afrika + Amerike + Sjeverna Amerika + Karibi + Istočna Azija + Južna Azija + Jugoistočna Azija + Južna Europa + Australija i Novi Zeland + Melanezija + Micronezija + Polinezija + Južno-centralna Azija + Azija + Srednja Azija + Zapadna Azija + Europa + Istočna Europa + Sjeverna Europa + Zapadna Europa + Latinska Amerika i Karibi + Kanalski otoci + Andora + Ujedinjeni Arapski Emirati + Afganistan + Antigua i Barbuda + Anguila + Albanija + Armenija + Nizozemski Antili + Angola + Antarktik + Argentina + Američka Samoa + Austrija + Australija + Aruba + Alandski otoci + Azerbajdžan + Bosna i Hercegovina + Barbados + Bangladeš + Belgija + Burkina Faso + Bugarska + Bahrein + Burundi + Benin + Bermuda + Brunei + Bolivija + Brazil + Bahami + Butan + Otok Bouvet + Bocvana + Bjelorusija + Belize + Kanada + Kokosovi Otoci + Demokratska Republika Kongo + Srednjoafrička Republika + Kongo + Švicarska + Obala Bjelokosti + Kukovi Otoci + Čile + Kamerun + Kina + Kolumbija + Kostarika + Srbija i Crna Gora + Kuba + Zeleni Rt + Božićni Otoci + Cipar + Češka Republika + Njemačka + Džibuti + Danska + Dominika + Dominikanska Republika + Alžir + Ekvador + Estonija + Egipat + Zapadna Sahara + Eritreja + Španjolska + Etiopija + Finska + Fidži + Falklandski Otoci + Mikronezija + Farski Otoci + Francuska + Gabon + Velika Britanija + Grenada + Gruzija + Francuska Gvajana + Guernsey + Gana + Gibraltar + Greenland + Gambija + Gvineja + Guadeloupe + Ekvatorska Gvineja + Grčka + Južna Gruzija i Južni Sendvič Otoci + Gvatemala + Guam + Gvineja Bisau + Gvajana + Hong Kong + Otok Heard i Otoci McDonald + Honduras + Hrvatska + Haiti + Mađarska + Indonezija + Irska + Izrael + Otok Man + Indija + Britanski Teritorij Indijskog Oceana + Irak + Iran + Island + Italija + Jersey + Jamajka + Jordan + Japan + Kenija + Kirgistan + Kambodža + Kiribati + Komori + Sveti Kristofor i Nevis + Koreja, Sjeverna + Južna Koreja + Kuvajt + Kajmanski Otoci + Kazakstan + Laoska Narodna Demokratska Republika + Libanon + Sveta Lucija + Lihtenštajn + Šri Lanka + Liberija + Lesoto + Litva + Luksemburg + Latvija + Libijska Arapska Džamahirija + Maroko + Monako + Moldavija + Crna Gora + Madagaskar + Maršalovi Otoci + Bivša Jugoslavenska Republika Makedonija + Mali + Mijanma + Mongolija + Makao + Sjeverni Marianski Otoci + Martinik + Mauritanija + Montserat + Malta + Mauricijus + Maldivi + Malavi + Meksiko + Malezija + Mozambik + Namibija + Nova Kaledonija + Niger + Norfolški Otoci + Nigerija + Nikaragva + Nizozemska + Norveška + Nepal + Nauru + Niue + Novi Zeland + Oman + Panama + Peru + Francuska Polinezija + Papua Nova Gvineja + Filipini + Pakistan + Poljska + Sveti Petar i Miguel + Pitcairn + Portoriko + Palestinska Teritoija + Portugal + Palau + Paragvaj + Katar + Ostala oceanija + Europska Unija + Reunion + Rumunjska + Srbija + Rusija + Ruanda + Saudijska Arabija + Salamunovi Otoci + Sejšeli + Sudan + Švedska + Singapur + Sveta Helena + Slovenija + Svalbard i Jan Mayen + Slovačka + Sijera Leone + San Marino + Senegal + Somalija + Surinam + Sveti Toma i Prinsipe + El Salvador + Sirija + Svazi + Turkski i Kaikos Otoci + Čad + Francuski Južni Teritoriji + Togo + Tajland + Tadžikistan + Tokelau + Istočni Timor + Turkmenistan + Tunis + Tonga + Turska + Trinidad i Tobago + Tuvalu + Tajvan + Tanzanija + Ukrajina + Uganda + Ujedinjene Države Manjih Pacifičkih Otoka + Sjedinjene Države + Urugvaj + Uzbekistan + Grad Vatikan + Sveti Vincent i Grenadini + Venezuela + Britanski Djevičanski Otoci + Američki Djevičanski Otoci + Vijetnam + Vanuatu + Wallis i Futuna + Samoa + Jemen + Majote + Južnoafrička Republika + Zambija + Zimbabve + nepoznata ili nevažeća oblast + + + Kalendar + Poredavanje + Valuta + + + Budistički kalendar + Kineski kalendar + Direktno poredavanje + Gregorijanski kalendar + Hebrejski kalendar + Islamski kalendar + Islamski civilni kalendar + Japanski kalendar + Poredavanja po abecedi + Pinyin poredavanje + Stroke order poredavanje + Tradicionano poredavanje + + + metrički + + + + lowercase-words + lowercase-words + titlecase-words + + + [a-c č ć d đ {dž} e-l {lj} m n {nj} o p r s š t-v z ž] + [q w-y] + + + + + + + + + GanjkHmsSEDFwWxhKzAeugXZvcL + + + + + + sij + vel + ožu + tra + svi + lip + srp + kol + ruj + lis + stu + pro + + + siječnja + veljače + ožujka + travnja + svibnja + lipnja + srpnja + kolovoza + rujna + listopada + studenoga + prosinca + + + + + s + v + o + t + s + l + s + k + r + l + s + p + + + siječanj + veljača + ožujak + travanj + svibanj + lipanj + srpanj + kolovoz + rujan + listopad + studeni + prosinac + + + + + + + ned + pon + uto + sri + čet + pet + sub + + + nedjelja + ponedjeljak + utorak + srijeda + četvrtak + petak + subota + + + + + n + p + u + s + č + p + s + + + + + + + 1kv + 2kv + 3kv + 4kv + + + 1. kvartal + 2. kvartal + 3. kvartal + 4. kvartal + + + + AM + PM + + + Prije Krista + Poslije Krista + + + pr.n.e. + AD + + + + + + EEEE, d. MMMM yyyy. + + + + + d. MMMM yyyy. + + + + + d. MMM. yyyy. + + + + + dd.MM.yyyy. + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1} {0} + + + + HH:mm + HH:mm:ss + MMMM dd + MM.dd + hh:mm a + hh:mm:ss a + EEE yy.MMM d + Q yy + QQQQ yy + yyyy.MM + yyyy. MMMM + + + {0} - {1} + + MM. - MM. + + + E, dd.MM. - E, dd.MM. + E, dd.MM. - E, dd.MM. + + + LLL-LLL + + + E, dd. MMM - E, dd. MMM + E, dd. - E, dd. MMM + + + dd. MMM - dd. MMM + dd. - dd. MMM + + + dd.MM. - dd.MM. + dd.MM. - dd.MM. + + + dd. - dd. + + + HH - HH'h' + HH - HH'h' + + + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH - HH 'h' v + HH - HH 'h' v + + + y. - y. + + + MM.yyyy. - MM.yyyy. + MM.yyyy. - MM.yyyy. + + + E, dd.MM.yyyy. - E, dd.MM.yyyy. + E, dd.MM.yyyy. - E, dd.MM.yyyy. + E, dd.MM.yyyy. - E, dd.MM.yyyy. + + + LLL-LLL yyyy. + LLL yyyy. - LLL yyyy. + + + E, dd. MMM - E, dd. MMM yyyy. + E, dd. - E, dd. MMM yyyy. + E, dd. MMM yyyy. - E, dd. MMM yyyy. + + + dd. MMM - dd. MMM yyyy. + dd. - dd. MMM yyyy. + dd. MMM yyyy. - dd. MMM yyyy. + + + dd.MM.yyyy. - dd.MM.yyyy. + dd.MM.yyyy. - dd.MM.yyyy. + dd.MM.yyyy. - dd.MM.yyyy. + + + + + + Era + + + Godina + + + Mjesec + + + Tjedan + + + Dan + Danas + Jučer + Prekosutra + Jučer + Prekjučer + + + Dan u tjednu + + + Dio dana + + + Sat + + + Minuta + + + Sekunda + + + Zona + + + + + + +HHmm;-HHmm + GMT{0} + {0} + + Nepoznat ili nevažeći grad + + + Andora + + + Južni pol + + + Dumont D'Urville + + + Beć + + + Sofija + + + Bahrein + + + Kinšasa + + + Lubumbaši + + + Uskrsni Otok + + + Šangaj + + + Kostarika + + + Zelenortska Republika + + + Božić + + + Nikozija + + + Džibuti + + + Dominika + + + Alžir + + + Kanarska Otočja + + + Fidži + + + Pariz + + + Atena + + + Južna Georgia + + + Gvatemala + + + Gvajana + + + Budimpešta + + + Rim + + + Jamajka + + + Tokio + + + St. Kitts + + + Kuvajt + + + Sveta Lucija + + + Luksemburg + + + Monako + + + Mauricijus + + + Maldivi + + + Varšava + + + Portoriko + + + Lisabon + + + Katar + + + Réunion + + + Bukurešt + + + Moskva + + + Krasnojarsk + + + Kamčatka + + + Anadir + + + Singapur + + + Sveta Helena + + + Salvador + + + Uzgorod + + + Kijev + + + Zaporožje + + + Alaska vremenska zona + + + Taškent + + + Sveti Vincent + + + Sveti Thomas + + + + + + , + . + + + + + #,##0.00 ¤;-#,##0.00 ¤ + + + + + + andorska pezeta + + + UAE dirham + + + Albanski lek + lek + + + Armenian Dram + dram + + + Angolska kvanza + + + Angolska kvanza (1977-1990) + + + angolska nova kvanza (1990-2000) + + + Argentinski pezo (1983-1985) + + + Argentinski pezo + Arg$ + + + Austrijski šiling + + + Australski dolar + $A + + + arupski gulden + + + Azerbejdžanski manat + + + bosansko-hercegovački dinar + + + Konvertibilna marka + KM + + + Barbadoski dolar + BDS$ + + + Taka + Tk + + + Belgijski franak + BF + + + bugarski novi lev + + + bahreinski dinar + + + Bermudski dolar + Ber$ + + + Brunejski dolar + + + bolivijano + + + bolivijski pezo + + + bolivijski mvdol + + + Brazilski Real + + + bahamski dolar + + + pula + + + bjeloruska nova rublja (1994-1999) + + + bjeloruska rublja + + + belizeanski dolar + + + Kanadski dolar + Can$ + + + Švicarski franak + SwF + + + Chilean Unidades de Fomento + + + Čileanski pezo + Ch$ + + + Kineski Yuan Renminbi + + + Kolumbijski pezo + Col$ + + + Kostarikanski kolon + C + + + stari srpski dinar + + + Czechoslovak Hard Koruna + + + Kubanski pezo + + + Zelenortski eskudo + CVEsc + + + Ciparska funta + £C + + + Češka kruna + + + East German Ostmark + + + Njemačka marka + + + Djibouti Franc + DF + + + Danska kruna + DKr + + + Dominikanski pezo + RD$ + + + Alžirski dinar + DA + + + Ecuador Sucre + + + Ecuador Unidad de Valor Constante (UVC) + + + Estonian Kroon + + + Egipatska funta + + + Eritrean Nakfa + + + Španjolska pezeta + + + Etiopski bir + Br + + + Euro + + + Finska marka + + + Fidžijski dolar + F$ + + + Falklandska funta + + + Francuski franak + + + Britanska funta + + + Georgian Kupon Larit + + + Gruzijski lari + lari + + + Gibraltarska funta + + + Gambia Dalasi + + + Gvinejski franak + GF + + + Guinea Syli + + + Equatorial Guinea Ekwele Guineana + + + Grčka drahma + + + Kvecal + Q + + + Portuguese Guinea Escudo + + + Gvinejskobisauski pezo + + + Guyana Dollar + G$ + + + Honkonški dolar + HK$ + + + Hoduraška lempira + L + + + Hrvatski dinar + + + Kuna + Kn + + + Haitian Gourde + + + Mađarska forinta + Ft + + + Indonezijska rupija + Rp + + + Irska funta + IR£ + + + Israelska funta + + + Novi izraelski šekel + + + Indijska rupija + INR + + + Irački dinar + ID + + + Iranski rijal + RI + + + Islandska kruna + + + Talijanska lira + + + Jamaičanski dolar + J$ + + + Jordanski dinar + JD + + + Japanski jen + + + Kenijski šiling + K Sh + + + Kyrgystan Som + som + + + Cambodian Riel + CR + + + Comoro Franc + CF + + + južnokorejski won + + + Kuvajtski dinar + KD + + + Kajmanski dolar + + + Kazakhstan Tenge + T + + + Laotian Kip + + + Sri Lanka Rupee + SL Re + + + Liberijski dolar + + + Lesotho Loti + M + + + Lithuanian Lita + + + Lithuanian Talonas + + + Luksemburški franak + + + Latvian Lats + + + Latvian Ruble + + + Libijski dinar + LD + + + Morokanski dirham + + + Morokanski franak + + + Moldovski lej + + + Makedonski denar + MDen + + + Mali Franc + + + Myanmar Kyat + + + Mongolski tugrik + Tug + + + Macao Pataca + + + Mauritanska ouguja + UM + + + Malteška lira + Lm + + + Malteška funta + + + Mauricijska rupija + + + Malawi Kwacha + MK + + + Meksički pezo + MEX$ + + + Meksički srebrni pezo (1861-1992) + + + Malaysian Ringgit + RM + + + Mozambique Escudo + + + Mozambique Metical + Mt + + + Namibijski dolar + N$ + + + Nigerijska naira + + + Nizozemski gulden + + + Norveška kruna + NKr + + + Nepalska rupija + Nrs + + + Novozelandski dolar + $NZ + + + Omanski rijal + RO + + + Panamska balboa + + + Peruanski inti + + + Peruanski novi sol + + + Peruanski sol + + + Filipinski pezo + + + Pakistanska rupija + Pra + + + Poljska zlota + Zl + + + Poljska zlota (1950-1995) + + + Portugalski eskudo + + + Paragvajski gvarani + + + Rumunjski lej + leu + + + novi rumunjski lev + + + srpski dinar + + + Ruska rublja + + + Ruska rublja (1991-1998) + + + saudijski rial + + + Solomonskootočni dolar + SI$ + + + Sejšelska rupija + SR + + + Sudanski dinar + + + Sudanska funta + + + Švedska kruna + SKr + + + Singapurski dolar + S$ + + + Slovenski tolar + + + Slovačka kruna + Sk + + + Somalijski šiling + Sh. + + + Surinamski gulden + Sf + + + Sirijska funta + LS + + + Lilangeni + E + + + tajlandski bat + + + Tadžikistanski somoni + + + Turkmenistanski manat + + + Tuniski dinar + + + Timorski eskudo + + + Turska lira + TL + + + Nova Turska Lira + + + Trinidadtobaški dolar + TT$ + + + Novotajvanski dolar + NT$ + + + Tanzanijski šiling + T Sh + + + Ukrajinska hrivnja + + + Ugandski šiling (1966-1987) + + + Ugandski šiling + U Sh + + + Američki dolar + + + Američki dolar (sljedeći dan) + + + Američki dolar (isti dan) + + + Urugvajski pezo (1975-1993) + + + Venezuelski bolivar + Be + + + Viejetnamski dong + + + Zlato + + + Europska složena jedinica + + + Europska monetarna jedinica + + + europska monetarna jedinica + + + nepoznata ili nevažeća valuta + XXX + + + jemenski dinar + + + Jemenski rial + YRl + + + Jugoslavenski čvrsti dinar + + + Jugoslavenski novi dinar + + + Jugoslavenski konvertibilni dinar + + + Južnoafrički rand (financijski) + + + Južnoafrički rand + R + + + Zambijska kvača + + + Zairski novi zair + + + Zairski zair + + + Zimbabveanski dolar + Z$ + + + + + + da:d + ne:n + + + diff --git a/libs/Zend/Locale/Data/hr_HR.xml b/libs/Zend/Locale/Data/hr_HR.xml new file mode 100644 index 0000000..8efeb91 --- /dev/null +++ b/libs/Zend/Locale/Data/hr_HR.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/hu.xml b/libs/Zend/Locale/Data/hu.xml new file mode 100644 index 0000000..4e0cfce --- /dev/null +++ b/libs/Zend/Locale/Data/hu.xml @@ -0,0 +1,4057 @@ + + + + + + + + + + + {0} ({1}) + , + + + afar + abház + achinéz + akoli + adangme + adyghe + avesztán + afrikaans + afroázsiai nyelv + afrihili + ainu + akan + akkád + aleut + algonkin nyelv + dél-altaji + amhara + aragonéz + óangol + angika + apacs nyelvek + arab + arámi + araucani + arapaho + mesterséges nyelv + aravak + asszámi + asztúr + atapaszkan nyelvek + ausztrál nyelvek + avar + awádi + ajmara + azerbajdzsáni + baskír + banda + bamileke nyelvek + balucsi + balinéz + basza + balti nyelv + belorusz + bedzsa + bemba + berber + bolgár + bihari + bodzspuri + bislama + bikol + bini + siksika + bambara + bengáli + bantu + tibeti + breton + braj + bosnyák + batak + burját + buginéz + blin + katalán + caddo + egyéb közép-amerikai indián + karib + egyéb kaukázusi + atszam + csecsen + cebui + egyéb kelta + csamoro + csibcsa + csagatáj + csukéz + mari + csinuk zsargon + csoktó + csipevé + cseroki + csejen + csam nyelv + korzikai + kopt + egyéb angol alapú kreol és pidgin + egyéb francia alapú kreol és pidgin + portugál alapú kreol vagy pidgin + krí + krími tatár + kreol és pidzsin + cseh + kasub + egyházi szláv + kusita nyelv + csuvas + walesi + dán + dakota + dargva + dajak + német + osztrák német + svájci felnémet + delavár + szlevi + dogrib + dinka + dogri + egyéb dravida + alsó szorb + duala + közép holland + divehi + diula + butáni + eve + efik + óegyiptomi + ekadzsuk + görög + elamit + angol + ausztrál angol + kanadai angol + brit angol + amerikai angol + közép angol + eszperantó + spanyol + latin-amerikai spanyol + ibériai spanyol + észt + baszk + evondo + perzsa + fang + fanti + fulani + finn + filippínó + finnugor nyelv + fidzsi + feröeri + fon + francia + kanadai francia + svájci francia + közép francia + ófrancia + északi fríz + keleti fríz + friuli + fríz + ír + ga + gajo + gbaja + skót gael + germán nyelv + geez + ikiribati + galíciai + közép felső német + guarani + ófelső német + gondi + gorontalo + gót + grebo + ógörög + svájci német + gudzsarati + Man-szigeti + gvicsin + hausza + haida + hawaii + héber + hindi + hiligajnon + himaháli + hittite + hmong + hiri motu + horvát + felső szorb + haiti + magyar + hupa + örmény + herero + interlingva + iban + indonéz + interlingue + igbo + szecsuán ji + idzso + inupiak + iloko + egyéb indiai + indoeurópai nyelv + ingus + ido + iráni + irokéz nyelvek + izlandi + olasz + inuktitut + japán + lojban + zsidó-perzsa + zsidó-arab + jávai + grúz + kara-kalpak + kabije + kacsin + jju + kamba + karen + kawi + kabardi + tyap + koro + kongo + kaszi + egyéb koiszan + kotanéz + kikuju + kuanyama + kazah + grönlandi + kambodzsai + kimbundu + kannada + koreai + konkani + kosrei + kpelle + kanuri + karacsáj-balkár + karelai + kru + kuruh + kásmíri + kurd + kumük + kutenai + komi + korni + kirgiz + latin + ladino + lahnda + lamba + luxemburgi + lezg + ganda + limburgi + lingala + laoszi + mongo + lozi + litván + luba-katanga + luba-lulua + luiseno + lunda + luo + lushai + lett + madurai + magahi + maithili + makaszar + mandingo + ausztronéz + masai + moksán + mandar + mende + málgas + közép ír + marshalli + maori + mikmak + minangkabau + egyéb nyelvek + macedón + egyéb mon-khmer + malajálam + mongol + mandzsu + manipuri + manobo nyelv + moldvai + mohawk + moszi + marathi + maláj + máltai + többszörös nyelvek + munda nyelvek + krík + mirandéz + marvari + burmai + maja nyelvek + erzjány + naurui + nahuati + észak-amerikai indián nyelv + nápolyi + norvég bokmál + északi ndebele + alsónémet + nepáli + nevari + ndonga + nias + niger-kordofan nyelv + niui + holland + flamand + norvég nynorsk + norvég + nogaj + óskandináv + n'ko + déli ndebele + északi szoto + núbiai nyelv + navaho + klasszikus newari + nyanja + nyamvézi + nyankole + nyoro + nzima + okszitán + ojibva + oromói + orija + oszét + osage + ottomán török + otomi nyelv + pandzsábi + pápuai nyelv + pangaszinan + pahlavi + pampangan + papiamento + palaui + óperzsa + Fülöp-szigeteki nyelv + főniciai + pali + lengyel + pohnpei + prakrit nyelvek + óprovánszi + pastu + portugál + brazíliai portugál + ibériai portugál + kecsua + radzsasztáni + rapanui + rarotongai + réto-román + kirundi + román + román nyelv + roma + ősi + orosz + aromán + kiruanda + szanszkrit + szandave + jakut + dél-amerikai indián nyelv + szelis nyelv + szamaritánus arámi + sasak + szantáli + szardíniai + szicíliai + skót + szindhi + északi számi + szölkup + egyéb szemita + sango + óír + jelnyelv + szerbhorvát + san + szingaléz + szidamó + sziú nyelvek + sinotibeti nyelv + szlovák + szlovén + szláv nyelv + szamoai + déli számi + számi nyelv + lule számi + inar sami + skolt számi + sona + szoninke + szomáliai + sogdien + szongai + albán + szerb + sranai tongo + szerer + sziszuati + nílusi-szaharai nyelv + szeszotó + szundanéz + szukuma + szuszu + sumér + svéd + szuahéli + klasszikus szír + szíriai + tamil + thai nyelv + telugu + temne + tereno + tetum + tadzsik + thai + tigrinja + tigré + tiv + türkmén + tokelaui + tagalog + klingon + tlingit + tamasek + szecsuáni + tonga + nyasa tonga + tok pisin + török + conga + csimsiáni + tatár + tumbuka + tupi nyelv + altáji nyelv + tuvalu + twi + tahiti + tuvai + udmurt + ujgur + ugariti + ukrán + umbundu + ismeretlen vagy érvénytelen nyelv + urdu + üzbég + vai + venda + vietnámi + volapük + votják + vallon + vakas nyelv + valamo + varaó + vaso + szorb nyelvek + volof + kalmük + hosza + jaó + japi + jiddis + joruba + jupik nyelv + zsuang + zapoték + Bliss jelképrendszer + zenaga + kínai + egyszerűsített kínai + hagyományos kínai + zande + zulu + zuni + nincs nyelvészeti tartalom + zaza + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Világ + Afrika + Észak-Amerika + Dél-Amerika + Óceánia + Nyugat-Afrika + Közép-Amerika + Kelet-Afrika + Észak-Afrika + Közép-Afrika + Afrika déli része + Amerika + Amerika északi része + Karib-térség + Kelet-Ázsia + Dél-Ázsia + Délkelet-Ázsia + Dél-Európa + Ausztrália és Új-Zéland + Melanézia + Mikronéziai régió + Polinézia + Délközép-Ázsia + Ázsia + Közép-Ázsia + Nyugat-Ázsia + Európa + Kelet-Európa + Észak-Európa + Nyugat-Európa + Független Államok Közössége + Latin-Amerika és a Karib-térség + Csatorna-szigetek + Andorra + Egyesült Arab Emirátus + Afganisztán + Antigua és Barbuda + Anguilla + Albánia + Örményország + Holland Antillák + Angola + Antarktisz + Argentína + Amerikai Szamoa + Ausztria + Ausztrália + Aruba + Aland-szigetek + Azerbajdzsán + Bosznia-Hercegovina + Barbados + Banglades + Belgium + Burkina Faso + Bulgária + Bahrein + Burundi + Benin + Saint Barthélemy + Bermuda + Brunei + Bolívia + Brazília + Bahamák + Bhután + Bouvet-sziget + Botswana + Fehéroroszország + Belize + Kanada + Kókusz (Keeling)-szigetek + Kongó, Demokratikus köztársaság + Közép-afrikai Köztársaság + Kongó + Svájc + Elefántcsontpart + Cook-szigetek + Chile + Kamerun + Kína + Kolumbia + Costa Rica + Szerbia és Montenegró + Kuba + Zöld-foki Köztársaság + Karácsony-szigetek + Ciprus + Csehország + Németország + Dzsibuti + Dánia + Dominika + Dominikai Köztársaság + Algéria + Ecuador + Észtország + Egyiptom + Nyugat-Szahara + Eritrea + Spanyolország + Etiópia + Finnország + Fidzsi + Falkland-szigetek + Mikronézia + Feröer-szigetek + Franciaország + Gabon + Egyesült Királyság + Grenada + Grúzia + Francia Guyana + Guernsey + Ghána + Gibraltár + Grönland + Gambia + Guinea + Guadeloupe + Egyenlítői-Guinea + Görögország + Dél Grúzia és a Déli Szendvics-szigetek + Guatemala + Guam + Guinea-Bissau + Guyana + Hongkong + Heard és McDonald Szigetek + Honduras + Horvátország + Haiti + Magyarország + Indonézia + Írország + Izrael + Man-sziget + India + Brit Indiai Oceán + Irak + Irán + Izland + Olaszország + Jersey + Jamaica + Jordánia + Japán + Kenya + Kirgizisztán + Kambodzsa + Kiribati + Comore-szigetek + Saint Kitts és Nevis + Észak-Korea + Dél-Korea + Kuvait + Kajmán-szigetek + Kazahsztán + Laosz + Libanon + Santa Lucia + Liechtenstein + Srí Lanka + Libéria + Lesotho + Litvánia + Luxemburg + Lettország + Líbia + Marokkó + Monaco + Moldova + Montenegró + Saint Martin + Madagaszkár + Marshall-szigetek + Macedónia + Mali + Mianmar + Mongólia + Makaó + Északi Mariana-szigetek + Martinique + Mauritánia + Montserrat + Málta + Mauritius + Maldív-szigetek + Malawi + Mexikó + Malajzia + Mozambik + Namíbia + Új-Kaledónia + Niger + Norfolk-sziget + Nigéria + Nicaragua + Hollandia + Norvégia + Nepál + Nauru + Niue + Új-Zéland + Omán + Panama + Peru + Francia Polinézia + Pápua Új-Guinea + Fülöp-szigetek + Pakisztán + Lengyelország + Saint Pierre és Miquelon + Pitcairn-sziget + Puerto Rico + Palesztin Terület + Portugália + Palau + Paraguay + Katar + Külső-Óceánia + Európai Unió + Reunion (francia) + Románia + Szerbia + Oroszország + Ruanda + Szaúd-Arábia + Salamon-szigetek + Seychelle-szigetek + Szudán + Svédország + Szingapúr + Szent Helena + Szlovénia + Svalbard és Jan Mayen + Szlovákia + Sierra Leone + San Marino + Szenegál + Szomália + Suriname + São Tomé és Príncipe + Salvador + Szíria + Szváziföld + Turks- és Caicos-szigetek + Csád + Francia Déli Területek + Togo + Thaiföld + Tadzsikisztán + Tokelau + Kelet-Timor + Türkmenisztán + Tunézia + Tonga + Törökország + Trinidad és Tobago + Tuvalu + Tajvan + Tanzánia + Ukrajna + Uganda + Amerikai Csendes-óceáni Szigetek + Egyesült Államok + Uruguay + Üzbegisztán + Vatikán + Saint Vincent és Grenadines + Venezuela + Brit Virgin-szigetek + Amerikai Virgin-szigetek + Vietnam + Vanuatu + Wallis és Futuna + Szamoa + Jemen + Mayotte + Dél-Afrika + Zambia + Zimbabwe + Ismeretlen vagy érvénytelen körzet + + + Hagyományos német helyesírás + Szabványosított reziján helyesírás + 1996-os német helyesírás + Késői közép francia 1606-ig + Keleti örmény + Nyugati örmény + Egyesített türkic latin ábécé + San Giorgo/Bila tájszólás + Boontling + IPA fonetika + UPA fonetika + Reziján lipovaz tájszólás + Monoton + Natisone dialektus + Gniva/Njiva tájszólás + Oseacco/Osojane tájszólás + Politonikus + Számítógép + Átdolgozott helyesírás + Reziján + Saho + Skót szabványos angol + Scouse + Stolvizza/Solbica tájszólás + Taraskijevica helyesírás + Valencia + + + Naptár + Rendezés + Pénznem + + + Hagyományos kínai sorrend - Big5 + buddhista naptár + kínai naptár + Közvetlen sorrend + Egyszerűsített kínai sorrend - GB2312 + Gergely-naptár + héber naptár + Indiai nemzeti naptár + iszlám naptár + iszlám civil naptár + japán naptár + Telefonkönyv sorrend + Pinyin sorrend + Kínai köztársasági naptár + Vonássorrend + Hagyományos + + + amerikai + metrikus + + + Nyelv: {0} + Írásrendszer: {0} + Régió: {0} + + + + titlecase-firstword + lowercase-words + titlecase-firstword + lowercase-words + lowercase-words + lowercase-words + lowercase-words + lowercase-words + + + [a á b c {cs} {ccs} d {dz} {ddz} {dzs} {ddzs} e é f g {gy} {ggy} h i í j-l {ly} {lly} m n {ny} {nny} o ó ö ő p r s {sz} {ssz} t {ty} {tty} u ú ü ű v z {zs} {zzs}] + [q w-y] + [a-z] + + + + + + + + + GanjkHmsSEDFwWxhKzAeugXZvcL + + + + + BK + + + + + + + + jan. + febr. + márc. + ápr. + máj. + jún. + júl. + aug. + szept. + okt. + nov. + dec. + + + január + február + március + április + május + június + július + augusztus + szeptember + október + november + december + + + + + J + F + M + Á + M + J + J + A + S + O + N + D + + + + + + + V + H + K + Sze + Cs + P + Szo + + + vasárnap + hétfő + kedd + szerda + csütörtök + péntek + szombat + + + + + V + H + K + S + C + P + S + + + + + + + N1 + N2 + N3 + N4 + + + I. negyedév + II. negyedév + III. negyedév + IV. negyedév + + + + + 1 + 2 + 3 + 4 + + + + de. + du. + + + időszámításunk előtt + időszámításunk szerint + + + i. e. + i. sz. + + + + + + yyyy. MMMM d. + + + + + yyyy. MMMM d. + + + + + yyyy.MM.dd. + + + + + yyyy.MM.dd. + + + + + + + H:mm:ss v + + + + + H:mm:ss z + + + + + H:mm:ss + + + + + H:mm + + + + + + + {1} {0} + + + + HH:mm + L + M. d., E + LLL + MMMM d. + MMM d + MM.dd. + M. d. + d + mm:ss + Q yy + yyyy.MM + yyyy. MMMM + + + {0} - {1} + + M.-M. + + + MM.dd., E - MM.dd., E + MM.dd., E - MM.dd., E + + + MMM-MMM + + + MMM d., E - MMM d., E + MMM d., E - d., E + + + MMM d. - MMM d. + MMM d.-d. + + + MM.dd. - MM.dd. + MM.dd. - MM.dd. + + + d.-d. + + + HH-HH + + + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH-HH v + + + y-y + + + yyyy.MM. - yyyy.MM. + yyyy.MM. - yyyy.MM. + + + yyyy.MM.dd., E - yyyy.MM.dd., E + yyyy.MM.dd., E - yyyy.MM.dd., E + yyyy.MM.dd., E - yyyy.MM.dd., E + + + yyyy. MMM-MMM + yyyy. MMM - yyyy. MMM + + + yyyy. MMM d., E - MMM d., E + yyyy. MMM d., E - d., E + yyyy. MMM d., E - yyyy. MMM d., E + + + yyyy. MMM d. - MMM d. + yyyy. MMM d.-d. + yyyy. MMM d. - yyyy. MMM d. + + + yyyy.MM.dd. - yyyy.MM.dd. + yyyy.MM.dd. - yyyy.MM.dd. + yyyy.MM.dd. - yyyy.MM.dd. + + + + + + éra + + + év + + + hónap + + + hét + + + nap + ma + holnap + holnapután + három nap múlva + tegnap + tegnapelőtt + három nappal ezelőtt + + + hét napja + + + napszak + + + óra + + + perc + + + másodperc + + + zóna + + + + + + + + Tisri + Hesván + Kiszlév + Tévész + Svát + Ádár risón + Ádár séni + Niszán + Ijár + Sziván + Áv + + + + + + + + + + + + + + Moharrem + Rébi el avvel + Rébi el accher + Dsemádi el avvel + Dsemádi el accher + Redseb + Sabán + Ramadán + Sevvál + Dsül kade + Dsül hedse + + + + + + MF + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + {1} ({0}) + + ismeretlen + + + Jereván + + + Déli-sark + + + Vosztok + + + Río Gallegos + + + Tucumán + + + Córdoba + + + Bécs + + + Barbadosz + + + Brüsszel + + + Szófia + + + Bahrein + + + Eirunepé + + + Río Branco + + + Pôrto Velho + + + Cuiabá + + + Belém + + + Araguaína + + + São Paulo + + + Maceió + + + Minszk + + + Beliz + + + Montréal + + + Zürich + + + Húsvét-szigetek + + + Kasgár + + + Ürümqi + + + Csungking + + + Sanghaj + + + Havanna + + + Zöld-Foki Szigetek + + + Dzsibuti + + + Koppenhága + + + Dominika + + + Galapagos-szigetek + + + Kairó + + + Kanári-szigetek + + + Fidzsi + + + Truk-szigetek + + + Ponape-szigetek + + + Kosrae-szigetek + + + Párizs + + + Gibraltár + + + Godthåb + + + Scoresby Sound + + + Danmarks Havn + + + Athén + + + Dél-Georgia + + + Dzsakarta + + + Makasar + + + Bagdad + + + Teherán + + + Róma + + + Jamaika + + + Tokio + + + Kiritimati-sziget + + + + + St. Kitts + + + Észak-Korea + + + Dél-Korea + + + Kuvait + + + Aktau + + + Aktöbe + + + Kizilorda + + + Alma-Ata + + + Laosz + + + Bejrút + + + St. Lucia + + + Vilniusz + + + Luxemburg + + + Montenegró + + + Kwajalein-zátony + + + Majuro-zátony + + + Ulánbátor + + + Csojbalszan + + + Makaó + + + Málta + + + Maldív-szigetek + + + Mazatlán + + + Mexikóváros + + + Mérida + + + Cancún + + + Chatham-szigetek + + + Marquesas-szigetek + + + Gambier-szigetek + + + Varsó + + + Pitcairn-szigetek + + + Azori-szigetek + + + + + Lisszabon + + + Katar + + + Bukarest + + + Szerbia + + + Kalinyingrád + + + Moszkva + + + Volgográd + + + Szamara + + + Jekatyerinburg + + + Omszk + + + Novoszibirszk + + + Krasznojarszk + + + Irkutszk + + + Jakutszk + + + Vlagyivosztok + + + Szahalin + + + Magadán + + + Kamcsatka + + + Anadir + + + Szingapúr + + + Salvador + + + Damaszkusz + + + Tunisz + + + Isztanbul + + + Tajvan + + + Ungvár + + + Kijev + + + Szimferopol + + + Zaporozsje + + + Midway-szigetek + + + Wake-sziget + + + + + Középső, Észak-Dakota + + + Szamarkand + + + Taskent + + + St. Vincent + + + St. Thomas + + + + Acre idő + Acre nyári idő + + false + + + + Afganisztáni idő + + false + + + + Mozambiki idő + Közép-afrikai idő + + false + + + + Kenyai idő + Kelet-afrikai idő + + false + + + + Nyugat-szaharai idő + + false + + + + Dél-afrikai idő + Dél-afrikai szabvány idő + + false + + + + Nigériai idő + Nyugat-afrikai idő + Nyugat-afrikai nyári idő + + false + + + + Aktyubinszki idő + Aktyubinszki nyári idő + + false + + + + Alaszkai idő + Alaszkai zónaidő + Alaszkai nyári idő + + false + + + + Alaszkai-hawaii idő + Alaszkai-hawaii zónaidő + Alaszkai-hawaii nyári idő + + false + + + false + + + + Amazóniai idő + Amazóniai nyári idő + + false + + + + Középső államokbeli idő + Középső államokbeli zónaidő + Középső államokbeli nyári idő + + false + + + + Keleti államokbeli idő + Keleti államokbeli zónaidő + Keleti államokbeli nyári idő + + false + + + + Hegyvidéki idő + Hegyvidéki zónaidő + Hegyvidéki nyári idő + + false + + + + Csendes-óceáni idő + Csendes-óceáni zónaidő + Csendes-óceáni nyári idő + + false + + + + Anadíri idő + Anadíri nyári idő + + false + + + + Aqtaui idő + Aqtaui nyári idő + + false + + + + Aqtobei idő + Aqtobei nyári idő + + false + + + + Arab idő + Arab zónaidő + Arab nyári idő + + + AT (Arab) + AST (arab) + ADT (Arab) + + false + + + + Argentína idő + argentínai nyári idő + + false + + + + Nyugat-Argentína idő + + false + + + + Örmény idő + Örmény nyári idő + + + AMT (Örményország) + AMST (Örményország) + + false + + + + Ashabadi idő + Ashabadi nyári idő + + false + + + + Atlanti-óceáni idő + Atlanti-óceáni zónaidő + Atlanti-óceáni nyári idő + + false + + + + Közép-ausztráliai idő + Ausztrál középső zónaidő + Ausztrál középső nyári idő + + false + + + + Ausztrál középső nyugati idő + Ausztrál középső nyugati zónaidő + Ausztrál középső nyugati nyári idő + + false + + + + Kelet-ausztrál idő + Ausztrál keleti zónaidő + Ausztrál keleti nyári idő + + false + + + + Nyugat-ausztrál idő + Ausztrál nyugati zónaidő + Ausztrál nyugati nyári idő + + false + + + false + + + + Azori idő + Azori nyári idő + + false + + + + Bakui idő + Bakui nyári idő + + false + + + + Bangladesi idő + + false + + + + Bering idő + Beringi zónaidő + Beringi nyári idő + + + BST (Beringi) + BDT (Beringi) + + false + + + + Butáni idő + + false + + + + Bolíviai idő + + false + + + + Borneói idő + Borneói nyári idő + + false + + + + Brazíliai idő + Brazíliai nyári idő + + false + + + + Brunei Darussalam-i idő + + false + + + + Cape verdei idő + Cape verdei nyári idő + + false + + + + Chamorroi zónaidő + + false + + + + Changbai idő + + false + + + + Chathami zónaidő + Chathami nyári idő + + false + + + + chilei idő + chilei nyári idő + + false + + + + Kínai zónaidő + Kínai nyári idő + + + CST (Kína) + CDT (Kína) + + false + + + + Csojbalszani idő + Csojbalszani nyári idő + + false + + + + Karácsony-szigeti idő + + false + + + + Kókusz-szigeteki idő + + false + + + + Kolumbiai idő + Kolumbiai nyári idő + + false + + + + Cook-szigeteki idő + Cook-szigeteki fél nyári idő + + false + + + + Kubai idő + Kubai zónaidő + Kubai nyári idő + + + CST (Kuba) + CDT (Kuba) + + false + + + + Daccai idő + + false + + + + Davisi idő + + false + + + + Dumont-d'Urville-i idő + + false + + + + Dusanbei idő + Dusanbei nyári idő + + false + + + + Holland-guianai idő + + false + + + + Kelet-timori idő + + false + + + + Húsvét-szigeteki idő + Húsvét-szigeteki nyári idő + + false + + + + Ecuadori idő + + false + + + + közép-európai idő + közép-európai nyári idő + + true + + + + kelet-európai idő + kelet-európai nyári idő + + true + + + + Nyugat-európai idő + Nyugat-európai nyári idő + + true + + + + Falkland-szigeteki idő + Falkland-szigeteki nyári idő + + false + + + + Fidzsi idő + Fidzsi nyári idő + + false + + + + Francia-guianai idő + + false + + + + Francia déli és antarktikus idő + + false + + + + Frunzei idő + Frunzei nyári idő + + false + + + + Greenwichi középidő + + true + + + + Galapagosi idő + + false + + + + Gambieri idő + + false + + + + Grúz idő + Grúz nyári idő + + false + + + + Gilbert-szigeteki idő + + false + + + + Közép-grönlandi idő + Közép-grönlandi nyári idő + + false + + + + Kelet-grönlandi idő + Kelet-grönlandi nyári idő + + false + + + + Nyugat-grönlandi idő + Nyugat-grönlandi nyári idő + + false + + + + Guami zónaidő + + + GST (Guam) + + false + + + + Öbölbeli zónaidő + + false + + + + Guyanai idő + + false + + + + Hawaii-aleuti zónaidő + + false + + + + Hongkongi idő + Hongkongi nyári idő + + false + + + + Hovdi idő + Hovdi nyári idő + + false + + + + Indiai zónaidő + + false + + + + Indiai-óceáni idő + + false + + + false + + + + Közép-indonéziai idő + + false + + + + Kelet-indonéziai idő + + false + + + + Nyugat-indonéziai idő + + false + + + + Iráni zónaidő + Iráni nyári idő + + false + + + + Irkutszki idő + Irkutszki nyári idő + + false + + + + Izraeli zónaidő + Izraeli nyári idő + + + IST (Izrael) + + false + + + + Japán zónaidő + Japán nyári idő + + false + + + + Petropavlovszk-kamcsatkai idő + Petropavlovszk-kamcsatkai nyári idő + + false + + + + Karacsi idő + + false + + + + Kasgár idő + + false + + + + Kelet-kazahsztáni zónaidő + + false + + + + Nyugat-kazahsztáni zónaidő + + false + + + + Kizilordai idő + Kizilordai nyári idő + + false + + + + Koreai idő + Koreai zónaidő + Koreai nyári idő + + false + + + + Kosraei idő + + false + + + + Krasznojarszki idő + Krasznojarszki nyári idő + + false + + + + Kujbisevi idő + Kujbisevi nyári idő + + false + + + + Kwajaleini idő + + false + + + + Kirgiz idő + + false + + + + Lankai idő + + false + + + + Libériai idő + + + Libériai idő + + false + + + + Line-szigeteki idő + + false + + + + Long-Shu idő + + false + + + + Lord howei idő + Lord howei zónaidő + Lord howei nyári idő + + false + + + + Macaui idő + Macaui nyári idő + + false + + + + Magadáni idő + Magadáni nyári idő + + false + + + + Malayai idő + + false + + + + Malajziai idő + + false + + + + Maldív-szigeteki idő + + false + + + + Marquesasi idő + + false + + + + Marshall-szigeteki idő + + false + + + + Mauritiusi idő + + false + + + + Mawsoni idő + + false + + + + Ulánbátori idő + Ulánbátori nyári idő + + false + + + + Moszkvai idő + Moszkvai zónaidő + Moszkvai nyári idő + + false + + + + Myanmari idő + + false + + + + Naurui idő + + false + + + + Nepáli idő + + false + + + + Új-kaledóniai idő + Új-kaledóniai nyári idő + + false + + + + Új-zélandi idő + Új-zélandi zónaidő + Új-zélandi nyári idő + + false + + + + Új-fundlandi idő + Új-fundlandi zónaidő + Új-fundlandi nyári idő + + false + + + + Niuei idő + + false + + + + Norfolk-szigeteki idő + + false + + + + Fernando de Noronha-i idő + Fernando de Noronha-i nyári idő + + false + + + + Észak-mariana-szigeteki idő + + false + + + + Novoszibirzski idő + Novoszibirszki nyári idő + + false + + + + Omszki idő + Omszki nyári idő + + false + + + + Pakisztáni idő + Pakisztáni nyári idő + + false + + + + Palaui idő + + false + + + + Pápua új-guineai idő + + false + + + + Paraguayi idő + Paraguayi nyári idő + + false + + + + Perui idő + Perui nyári idő + + false + + + + Fülöp-szigeteki idő + Fülöp-szigeteki nyári idő + + false + + + + Phoenix-szigeteki idő + + false + + + + Pierre és Miquelon-i idő + Pierre és Miquelon-i zónaidő + Pierre és Miquelon-i nyári idő + + false + + + + Pitcairni idő + + false + + + + Ponapei idő + + false + + + + Qyzylordai idő + Qyzylordai nyári idő + + false + + + + Réunioni idő + + false + + + + Rotherai idő + + false + + + + Sakhalin idő + Sakhalin nyári idő + + false + + + + Szamarai idő + Szamarai nyári idő + + false + + + + Szamarkandi idő + Szamarkandi nyári idő + + + SAMT (Szamarkand) + SAMST (Szamarkand) + + false + + + + Szamoai zónaidő + + false + + + + Seychelle-szigeteki idő + + false + + + + Sevcsenkói idő + Sevcsenkói nyári idő + + false + + + + Szingapúri zónaidő + + false + + + + Salamon-szigeteki idő + + false + + + + Dél-grúziai idő + + + GST (Dél-grúziai) + + false + + + + Szurinámi idő + + false + + + + Szverdlovszki idő + Szverdlovszki nyári idő + + false + + + + Syowai idő + + false + + + + Tahiti idő + + false + + + + Tadzsikisztáni idő + + false + + + + Taskenti idő + Taskenti nyári idő + + false + + + + Tbiliszi idő + Tbiliszi nyári idő + + false + + + + Tokelaui idő + + false + + + + Tongai idő + Tongai nyári idő + + false + + + + Truki idő + + false + + + + Török idő + Törökországi idő + Törökországi nyári idő + + false + + + + Türkmenisztáni idő + Türkmenisztáni nyári idő + + false + + + + Tuvalui idő + + false + + + + Uráli idő + Uráli nyári idő + + false + + + + Uruguayi idő + Uruguayi nyári idő + + false + + + + Urumqi idő + + false + + + + Üzbegisztáni idő + Üzbegisztáni nyári idő + + false + + + + Vanuatui idő + Vanuatui nyári idő + + false + + + + Venezuelai idő + + false + + + + Vlagyivosztoki idő + Vlagyivosztoki nyári idő + + false + + + + 13:25 Oroszország (Volgográd) + Volgográdi idő + Volgográdi nyári idő + + false + + + + Vosztoki idő + + false + + + + Wake-szigeti idő + + false + + + + Wallis és futunai idő + + false + + + + Jakutszki idő + Jakutszki nyári idő + + false + + + + Jekatyerinburgi idő + Jekatyerinburgi nyári idő + + false + + + + Jereváni idő + Jereváni nyári idő + + false + + + + yukoni idő + yukoni zónaidő + Yukoni nyári idő + + false + + + + + + , +   + ; + % + 0 + # + + + - + E + + + NaN + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0.00 ¤ + + + {0} {1} + + + + Andorrai peseta + Andorrai peseta + + + EAE dirham + UAE dirham + + + Afghani (1927-2002) + Afghani (AFA) + + + Afghani + Afghani + Af + + + Albán lek + Albán lek + lek + + + Dram + Örmény dram + dram + + + Holland-antilla forint + Holland Antillai guilder + NA f. + + + Angolai kwanza + Angolai kwanza + + + Angolai kwanza (1977-1990) + Angolai kwanza (AOK) + + + Angolai új kwanza (1990-2000) + Angolai új kwanza (AON) + + + Angolai kwanza reajustado (1995-1999) + Angolai kwanza reajustado (AOR) + + + Argentín austral + Argentin austral + + + Argentín peso (1983-1985) + Argentin peso (ARP) + + + Peso + Argentin peso + Arg$ + + + Osztrák schilling + Osztrák schilling + + + Ausztrál dollár + Ausztrál dollár + $A + + + Arubai forint + Arubai forint + + + Azerbajdzsáni manat (1993-2006) + Azerbajdzsáni manat (AZM) + + + Azerbajdzsáni manat + Azerbajdzsáni manat + + + Bosznia-hercegovinai dínár + Bosznia-hercegovinai dínár + + + Bozsnia-hercegovinai konvertibilis márka + Bosznia-hercegovinai konvertibilis márka + KM + + + Barbadosi dollár + Barbadosi dollár + BDS$ + + + Bangladesi taka + Bangladesi taka + Tk + + + Belga frank (konvertibilis) + Belga frank (konvertibilis) + + + Belga frank + Belga frank + BF + + + Belga frank (pénzügyi) + Belga frank (pénzügyi) + + + Bolgár kemény leva + Bolgár kemény leva + lev + + + Bolgár új leva + Bolgár új leva + + + Bahreini dinár + Bahreini dinár + BD + + + Burundi frank + Burundi frank + Fbu + + + Bermudai dollár + Bermudai dollár + Ber$ + + + Brunei dollár + Brunei dollár + + + Boliviano + Boliviano + Bs + + + Bolíviai peso + Bolíviai peso + + + Bolíviai mvdol + Bolíviai mvdol + + + Brazi cruzeiro novo (1967-1986) + Brazi cruzeiro novo (1967-1986) + + + Brazi cruzado + Brazi cruzado + + + Brazil cruzeiro (1990-1993) + Brazil cruzeiro (1990-1993) + + + Brazil real + Brazil real + BRL + + + Brazil cruzado novo + Brazil cruzado novo + + + Brazil cruzeiro + + + Bahamai dollár + + + Bhutáni ngultrum + Nu + + + Burmai kyat + + + Botswanai pula + + + Fehérorosz új rubel (1994-1999) + + + Fehérorosz rubel + Rbl + + + Belizei dollár + BZ$ + + + Kanadai dollár + Can$ + + + Kongói frank + + + WIR euro + + + Svájci frank + SwF + + + WIR frank + + + Chilei unidades de fomento + + + Chilei peso + Ch$ + + + Kínai jüan renminbi + Y + + + Kolumbiai peso + Col$ + + + Unidad de Valor Real + + + Costa Ricai colon + C + + + szerb dinár + + + Csehszlovák kemény korona + + + Kubai peso + + + Cape Verdei escudo + CVEsc + + + Ciprusi font + £C + + + Cseh korona + + + Kelet-Német márka + + + Német márka + + + Dzsibuti frank + DF + + + Dán korona + DKr + + + Dominikai peso + RD$ + + + Algériai dínár + DA + + + Ecuadori sucre + + + Ecuadori Unidad de Valor Constante (UVC) + + + Észt korona + + + Egyiptomi font + + + ekwele + + + Eritreai nakfa + + + spanyol peseta (A-kontó) + + + spanyol peseta (konvertibilis kontó) + + + Spanyol peseta + + + + Etiópiai birr + Br + + + Euro + EUR + + + Finn markka + + + Fidzsi dollár + F$ + + + Falkland-szigeteki font + + + Francia frank + + + Brit font sterling + GBP + + + Grúz kupon larit + + + Grúz lari + lari + + + Ghánai cedi (1979-2007) + + + Ghánai cedi + Ghánai cedi + GH¢ + + + Gibraltári font + + + Gambiai dalasi + + + Guineai frank + GF + + + Guineai syli + + + Egyenlítői-guineai ekwele guineana + Egyenlítői-guineai ekwele + + + Görög drachma + + + Guatemalai quetzal + Q + + + Portugál guinea escudo + + + Guinea-Bissaui peso + + + Guyanai dollár + G$ + + + Hongkongi dollár + HK$ + + + Hodurasi lempira + L + + + Horvát dínár + + + Horvát kuna + + + Haiti gourde + + + Magyar forint + Ft + + + Indonéz rúpia + Rp + + + Ír font + IR£ + + + Izraeli font + + + Izraeli új sékel + + + indiai rúpia + Indiai rúpia + INR + + + Iraki dínár + ID + + + Iráni rial + RI + + + Izlandi korona + + + Olasz líra + LIT + + + Jamaikai dollár + J$ + + + Jordániai dínár + JD + + + Japán jen + JPY + + + Kenyai shilling + K Sh + + + Kirgizisztáni szom + som + + + Kambodzsai riel + CR + + + Comorei frank + CF + + + Észak-koreai won + + + Dél-koreai won + + + Kuvaiti dínár + KD + + + Kajmán-szigeteki dollár + + + Kazahsztáni tenge + T + + + Laoszi kip + + + Libanoni font + LL + + + Sri Lankai rúpia + SL Re + + + Libériai dollár + + + Lesothoi loti + M + + + Maloti + + + Litvániai litas + + + Litvániai talonas + + + luxemburgi konvertibilis frank + + + Luxemburgi frank + + + luxemburgi pénzügyi frank + + + Lett lats + + + Lett rubel + + + Líbiai dínár + LD + + + Marokkói dirham + + + Marokkói frank + + + Moldován lei + + + Madagaszkári ariary + + + Madagaszkári frank + + + Macedon dínár + MDen + + + Mali frank + + + Mianmari kyat + + + Mongóliai tugrik + Tug + + + makaói pataca + + + Mauritániai ouguiya + UM + + + Máltai líra + Lm + + + Máltai font + + + Mauritiusi rúpia + + + Maldív-szigeteki rufiyaa + + + Malawi kwacha + MK + + + Mexikói peso + MEX$ + + + Mexikói ezüst peso (1861-1992) + + + Mexikói Unidad de Inversion (UDI) + + + Malajziai ringgit + RM + + + Mozambik escudo + + + Mozambik metical + Mt + + + Mozambiki metikális + MTn + + + Namíbiai dollár + N$ + + + Nigériai naira + + + Nikaraguai cordoba + + + Nikaraguai cordoba oro + + + Holland forint + + + Norvég korona + NKr + + + Nepáli rúpia + Nrs + + + Új-zélandi dollár + $NZ + + + Ománi rial + RO + + + Panamai balboa + + + Perui inti + + + Perui sol nuevo + + + Perui sol + + + Pápua új-guineai kina + + + Fülöp-szigeteki peso + Php + + + Pakisztáni rúpia + Pra + + + Lengyel zloty + Zl + + + Lengyel zloty (1950-1995) + + + Portugál escudo + + + Paraguayi guarani + + + Katari rial + QR + + + rhodéziai dollár + Rhodéziai dollár + + + Régi román lej + Régi román lej + leu + + + új román lej + Román lej + + + Szerb Dínár + + + Orosz rubel + + + Orosz rubel (1991-1998) + Orosz rubel (RUR) + + + Ruandai frank + + + Szaúdi riyal + SRl + + + Salamon-szigeteki dollár + SI$ + + + Seychelle-szigeteki rúpia + SR + + + Szudáni dínár + Régi szudáni dínár + + + Szudáni font + Szudáni font + + + Régi szudáni font + Régi szudáni font + + + Svéd korona + SKr + + + Szingapúri dollár + S$ + + + Saint Helena font + + + Szlovén tolar + + + Szlovák korona + Sk + + + Sierra Leonei leone + + + Szomáli shilling + Sh. + + + Surinamei dollár + Surinamei dollár + + + Suriname-i gulden + Sf + + + Sao tome-i és principe-i dobra + Db + + + Szovjet rubel + + + Salvadori colón + + + Szíriai font + LS + + + Szváziföldi lilangeni + E + + + Thai baht + + + Tádzsikisztáni rubel + + + Tádzsikisztáni somoni + + + Türkmenisztáni manat + + + Tunéziai dínár + + + tongai paanga + Tongai paanga + T$ + + + Timori escudo + + + Régi török líra + Régi török líra + TL + + + új török líra + Török líra + + + Trinidad és tobagoi dollár + TT$ + + + Tajvani új dollár + Tajvani dollár + NT$ + + + Tanzániai shilling + T Sh + + + Ukrán hrivnya + + + Ukrán karbovanec + + + Ugandai shilling (1966-1987) + Ugandai shilling (UGS) + + + Ugandai shilling + U Sh + + + USA dollár + USD + + + USA dollár (következő napi) + + + USA dollár (aznapi) + + + Uruguayi peso en unidades indexadas + Uruguayi peso en unidades indexadas + + + Uruguay-i peso (1975-1993) + Uruguayi peso (UYP) + + + Uruguay-i peso uruguayo + Uruguayi peso + Ur$ + + + Üzbegisztáni szum + + + Venezuelai bolívar + Be + + + Venezuelai bolivar fuerte + Venezuelai bolivar fuerte + BsF + + + Vietnámi dong + + + Vanuatui vatu + VT + + + Nyugat-szamoai tala + + + CFA frank BEAC + + + Ezüst + + + Arany + + + European Composite Unit + Európai kompozit egység + + + European Monetary Unit + Európai monetáris egység + + + European Unit of Account (XBC) + Európai kontó egység (XBC) + + + European Unit of Account (XBD) + Európai kontó egység (XBD) + + + Kelet-karibi dollár + EC$ + + + Special Drawing Rights + + + európai pénznemegység + Európai pénznemegység + + + Francia arany frank + + + Francia UIC-frank + + + CFA frank BCEAO + + + palládium + Palládium + + + CFP frank + CFPF + + + platina + Platina + + + RINET tőke + + + Tesztelési pénznemkód + + + Ismeretlen vagy érvénytelen pénznem + Ismeretlen/érvénytelen pénznem + + + Jemeni dínár + + + Jemeni rial + YRl + + + Jugoszláv kemény dínár + + + Jugoszláv új dínár + + + Jugoszláv konvertibilis dínár + + + Dél-afrikai rand (pénzügyi) + + + Dél-afrikai rand + R + + + Zambiai kwacha + + + Zairei új zaire + + + Zairei zaire + + + Zimbabwei dollár + Z$ + + + + + + {0} nap + + + {0} óra + + + {0} perc + + + {0} hónap + + + {0} másodperc + + + {0} hét + + + {0} év + + + + + igen:i + nem:n + + + diff --git a/libs/Zend/Locale/Data/hu_HU.xml b/libs/Zend/Locale/Data/hu_HU.xml new file mode 100644 index 0000000..39aeb5a --- /dev/null +++ b/libs/Zend/Locale/Data/hu_HU.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/hy.xml b/libs/Zend/Locale/Data/hy.xml new file mode 100644 index 0000000..aca8a66 --- /dev/null +++ b/libs/Zend/Locale/Data/hy.xml @@ -0,0 +1,598 @@ + + + + + + + + + + + Աֆրիկանս + Հաբեշերեն + Արաբերեն + Ասամերեն + Ադրբեջաներեն + Բելարուսերեն + Բուլղարերեն + Բիհարերեն + Բենգալերեն + Բրետոներեն + Բոսներեն + Կատալոներեն + Չեխերեն + Վալերեն + Դանիերեն + Գերմաներեն + Հունարեն + Անգլերեն + Էսպերանտո + Իսպաներեն + Էստոներեն + Բասկերեն + Պարսկերեն + Ֆիններեն + Տագալերեն + Ֆարվերեն + Ֆրանսերեն + Ֆրիսերեն + Իռլանդերեն + Գաելյան Շոտլանդերեն + Գալիսերեն + Գուարաներեն + Գուջարատերեն + Եբրայերեն + Հնդկերեն + Խորվաթերեն + Հունգարերեն + Հայերէն + Ինտերլինգուա + Ինդոնեզերեն + Ինտերլինգ + Իսլանդերեն + Իտալերեն + Ճապոներեն + Ճավայերեն + Վրացերեն + Կամբոջերեն + Կաննադա + Կորեերեն + Քրդերեն + Ղրղզերեն + Լատիներեն + Լինգալա + Լաոսերեն + Լիտվերեն + Լատվերեն + Մակեդոներեն + Կերալերեն + Մոնղոլերեն + Մարաթի + Մալայերեն + Մալթերեն + Նեպալերեն + Հոլանդերեն + Նորվեգերեն (Նյունորսկ) + Նորվեգերեն + Ակվիտաներեն + Օրիսերեն + Փենջաբերեն + Լեհերեն + Փաշտուներեն + Պորտուգալերեն + Ռումիներեն + Ռուսերեն + Սանսկրիտերեն + Սինդհի + Սերբա-Խորվաթերեն + Սինհալերեն + Սլովակերեն + Սլովեներեն + Սոմալերեն + Ալբաներեն + Սերբերեն + Սեսոտո + Սունդաներեն + Շվեդերեն + Սուահիլի + Թամիլերեն + Տելուգու + Թայերեն + Էրիտրերեն + Թուրքմեներեն + Կլինգոն + Թուրքերեն + Տուի + Ույղուրերեն + Ուկրաիներեն + Ուրդու + Ուզբեկերեն + Վիետնամերեն + Խոշերեն + Իդիշ + Չինարեն + Զուլուսերեն + + + Աշխարհ + Աֆրիկա + Հարավային Ամերիկա + Արևմտյան Աֆրիկա + Արևելյան Աֆրիկա + Հյուսիսային Աֆրիկա + Հարավային Աֆրիկա [018] + Անդորա + Միացյալ Արաբական Էմիրաթներ + Աֆղանստան + Անտիգուա-Բարբուդա + Ալբանիա + Հայաստանի Հանրապետութիւն + Անգոլա + Արգենտինա + Ավստրիա + Ավստրալիա + Ադրբեջան + Բոսնիա-Հերցեգովինա + Բարբադոս + Բանգլադեշ + Բելգիա + Բուրկինա Ֆասո + Բուլղարիա + Բահրեյն + Բուրունդի + Բենին + Բրունեյ + Բոլիվիա + Բրազիլիա + Բահամներ + Բուտան + Բոտսվանա + Բելոռուս + Բելիզ + Կանադա + Կենտրոնական Աֆրիկյան Հանրապետություն + Կոնգո + Շվեյցարիա + Փղոսկրի Ափ + Չիլի + Կամերուն + Չինաստան + Կոլումբիա + Կոստա-Ռիկա + Սերբիա և Մոնտենեգրո + Կուբա + Կաբո-Վերդե + Կիպրոս + Չեխիայի Հանրապետություն + Գերմանիա + Ջիբուտի + Դանիա + Դոմինիկա + Դոմինիկյան Հանրապետություն + Ալժիր + Էկվադոր + Էստոնիա + Եգիպտոս + Արեվմտյան Սահարա + Էրիտրեա + Իսպանիա + Եթովպիա + Ֆինլանդիա + Ֆիջի + Միկրոնեզիա + Ֆրանսիա + Գաբոն + Մեծ Բրիտանիա + Գրենադա + Վրաստան + Գանա + Գամբիա + Գվինեա + Հասարակածային Գվինեա + Հունաստան + Գվատեմալա + Գվինեա-Բիսաու + Գայանա + Հոնդուրաս + Հորվաթիա + Հաիթի + Հունգարիա + Ինդոնեզիա + Իռլանդիա + Իսրայել + Հնդկաստան + Իրաք + Իրան + Իսլանդիա + Իտալիա + Ջամայկա + Հորդանան + Ճապոնիա + Քենիա + Կիրգիզստան + Կամբոջա + Կիրիբատի + Կոմորոս + Սենտ Կիտս-Նեվիս + Հյուսիսային Կորեա + Հարավային Կորեա + Քուվեյթ + Ղազախստան + Լաոս + Լիբանան + Սանտա Լուչիա + Լիխտենշտեյն + Շրի Լանկա + Լիբերիա + Լեսոտո + Լիտվա + Լյուքսեմբուրգ + Լատվիա + Լիբիա + Մարոկո + Մոնակո + Մոլդովա + Մադագասկար + Մարշալյան կղզիներ + Մակեդոնիա + Մալի + Մյանմա + Մոնղոլիա + Մավրիտանիա + Մալթա + Մավրիտոս + Մալդիվներ + Մալավի + Մեքսիկա + Մալայզիա + Մոզամբիկ + Նամիբիա + Նիգեր + Նիգերիա + Նիկարագուա + Նիդերլանդեր + Նորվեգիա + Նեպալ + Նաուրու + Նոր Զելանդիա + Օման + Պանամա + Պերու + Պապուա Նոր Գվինեա + Ֆիլիպիններ + Պակիստան + Լեհաստան + Պորտուգալիա + Պալաու + Պարագվայ + Կատար + Ռումինիա + Ռուսաստան + Ռուանդա + Սաուդիան Արաբիա + Սոլոմոնյան կղզիներ + Սեյշելներ + Սուդան + Շվեդիա + Սինգապուր + Սլովենիա + Սլովակիա + Սյերա-Լեոնե + Սան Մարինո + Սենեգալ + Սոմալի + Սուրինամ + Սան-Թոմե-Փրինսիպի + Սալվադոր + Սիրիա + Սվազիլենդ + Չադ + Տոգո + Թաիլանդ + Տաճիկստան + Թուրքմենստան + Թունիս + Տոնգա + Թուրքիա + Տրինիդադ-Տոբագո + Տուվալու + Թայվան + Տանզանիա + Ուկրաինա + Ուգանդա + Ամէրիկայի Միացյալ Նահանգնէր + Ուրուգվայ + Ուզբեկստան + Վատիկան + Սենտ Վիսենտ-Գրենադիններ + Վենեսուելա + Վիետնամ + Վանուատու + Սամոա + Եմեն + Հարավային Աֆրիկա + Զամբիա + Զիմբաբվե + + + + [֊ ՝ ՜ ՞ ՚ ՛ ՟ ա-ե և զ-ֆ] + + + + + + + + Յնր + Փտր + Մրտ + Ապր + Մյս + Յնս + Յլս + Օգս + Սեպ + Հոկ + Նոյ + Դեկ + + + Յունուար + Փետրուար + Մարտ + Ապրիլ + Մայիս + Յունիս + Յուլիս + Օգոստոս + Սեպտեմբեր + Հոկտեմբեր + Նոյեմբեր + Դեկտեմբեր + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + Կիր + Երկ + Երք + Չոր + Հնգ + Ուր + Շաբ + + + Կիրակի + Երկուշաբթի + Երեքշաբթի + Չորեքշաբթի + Հինգշաբթի + Ուրբաթ + Շաբաթ + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + Առ․ + Եր․ + + + Ք․Ա․ + Ք․Ե․ + + + + + + EEEE, MMMM d, yyyy + + + + + MMMM dd, yyyy + + + + + MMM d, yyyy + + + + + MM/dd/yy + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1} {0} + + + + MMMM dd + MM/dd + Q yy + + + {0} - {1} + + M-M + + + E, MM/dd - E, MM/dd + E, MM/dd - E, MM/dd + + + MMM-MMM + + + E, MMM dd - E, MMM dd + E, MMM dd - E, MMM dd + + + MMM dd - MMM dd + MMM dd-dd + + + MM/dd - MM/dd + MM/dd - MM/dd + + + d-d + + + HH-HH + + + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH-HH v + + + y-y + + + MM/yy - MM/yy + MM/yy - MM/yy + + + E, MM/dd/yy - E, MM/dd/yy + E, MM/dd/yy - E, MM/dd/yy + E, MM/dd/yy - E, MM/dd/yy + + + MMM-MMM yyyy + MMM yyyy - MMM yyyy + + + E, MMM d - E, MMM d, yyyy + E, MMM d - E, MMM d, yyyy + E, MMM d, yyyy - E, MMM d, yyyy + + + MMM dd - MMM dd, yyyy + MMM dd-dd, yyyy + MMM dd, yyyy - MMM dd, yyyy + + + MM/dd/yy - MM/dd/yy + MM/dd/yy - MM/dd/yy + MM/dd/yy - MM/dd/yy + + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + , + . + + + + + #0.### + + + + + + + #0% + + + + + + + #0.00 ¤ + + + + + + դր. + + + + diff --git a/libs/Zend/Locale/Data/hy_AM.xml b/libs/Zend/Locale/Data/hy_AM.xml new file mode 100644 index 0000000..0b3b831 --- /dev/null +++ b/libs/Zend/Locale/Data/hy_AM.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/hy_AM_REVISED.xml b/libs/Zend/Locale/Data/hy_AM_REVISED.xml new file mode 100644 index 0000000..849ff8b --- /dev/null +++ b/libs/Zend/Locale/Data/hy_AM_REVISED.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + Հնվ + Փտվ + Հնս + Հլս + + + Հունվար + Փետրվար + Հունիս + Հուլիս + + + + Կե․ + + + Մ․Թ․Ա․ + Մ․Թ․ + + + + + + diff --git a/libs/Zend/Locale/Data/ia.xml b/libs/Zend/Locale/Data/ia.xml new file mode 100644 index 0000000..fdeb5ad --- /dev/null +++ b/libs/Zend/Locale/Data/ia.xml @@ -0,0 +1,558 @@ + + + + + + + + + + + afrikaans + amharico + arabe + Assamese + azerbaidzhani + bielorusso + bulgaro + bihari + bengali + breton + bosniaco + catalano + checo + gallese + danese + germano + greco + anglese + anglese (RU) + anglese (SUA) + esperanto + espaniol + estoniano + basco + persiano + finnese + tagalog + faroese + francese + frisiano + irlandese + scoto gaelic + gallego + guarani + gujarati + hebreo + hindi + croato + hungaro + armeniano + interlingua + indonesiano + Interlingue + islandese + italiano + japonese + javanese + georgiano + Cambodiano + kannada + coreano + kurdo + kirghizo + latino + lingala + laotiano + lithuano + letton + macedone + malayalam + mongolico + marathi + malay + maltese + nepalese + nederlandese + norvegiano (nynorsk) + norvegiano + occitano + oriya + punjabi + polonese + pashto + portugese + romaniano + russo + sanscrito + sindhi + serbocroate + sinhalese + slovaco + sloveno + somali + albanese + serbo + sesotho + sundanese + svedese + swahili + tamil + telugu + thai + tigrinya + turkmeno + Klingon + turco + twi + Uyghur + ukrainiano + urdu + uzbeco + vietnamese + xhosa + yiddish + zulu + + + Emiratos Arabe Unite + Afghanistan + Antigua e Barbuda + Albania + Armenia + Antillas nederlandese + Angola + Antarctica + Argentina + Samoa american + Austria + Australia + Azerbaidzhan + Bosnia e Herzegovina + Bangladesh + Belgica + Burkina Faso + Bulgaria + Burundi + Benin + Bolivia + Brasil + Bahamas + Bhutan + Insula de Bouvet + Botswana + Bielorussia + Canada + Republica African Central + Congo + Suissa + Insulas Cook + Chile + Camerun + China + Colombia + Cuba + Insula de Natal + Cypro + Republica Tchec + Germania + Danmark + Republica Dominican + Algeria + Ecuador + Estonia + Egypto + Sahara occidental + Eritrea + Espania + Ethiopia + Finlandia + Micronesia + Insulas Feroe + Francia + Gabon + Regno Unite + Georgia + Guyana francese + Ghana + Groenlandia + Gambia + Guinea + Guinea equatorial + Grecia + Guinea-Bissau + Honduras + Croatia + Haiti + Hungaria + Indonesia + Irlanda + Israel + India + Territorio oceanic britanno-indian + Irak + Iran + Islanda + Italia + Jordania + Japon + Kenya + Kirghizistan + Cambodgia + Kiribati + Comoros + Sancte Christophoro e Nevis + Corea del Nord + Corea del Sud + Insulas de Caiman + Kazakhstan + Libano + Sancte Lucia + Liechtenstein + Sri Lanka + Liberia + Lesotho + Lituania + Lettonia + Libya + Marocco + Moldavia + Madagascar + Insulas Marshall + Macedonia + Mali + Birmania/Myanmar + Mongolia + Insulas Marianna del Nord + Mauritania + Malawi + Mexico + Malaysia + Mozambique + Namibia + Nove Caledonia + Niger + Insula Norfolk + Nigeria + Nicaragua + Nederlandia + Norvegia + Nepal + Nove Zelanda + Oman + Peru + Polynesia francese + Papua Nove Guinea + Philippinas + Pakistan + Polonia + Portugal + Paraguay + Romania + Ruanda + Arabia Saudita + Insulas Solomon + Seychelles + Sudan + Svedia + Slovenia + Slovachia + Sierra Leone + San Marino + Senegal + Somalia + Suriname + Syria + Swazilandia + Insulas Turcos e Caicos + Tchad + Territorios meridional francese + Togo + Thailandia + Tadzhikistan + Tokelau + Timor del Est + Turkmenistan + Tunisia + tonga + Turchia + Trinidad e Tobago + Tuvalu + Taiwan + Tanzania + Ukraina + Uganda + Statos Unite + Uruguay + Uzbekistan + Sancte Vincente e le Grenadinas + Venezuela + Vanuatu + Samoa + Yemen + Africa del Sud + Zambia + Zimbabwe + + + + [a-c {ch} d-p {ph} q-z] + + + + + + + + + + + + + + jan + feb + mar + apr + mai + jun + jul + aug + sep + oct + nov + dec + + + januario + februario + martio + april + maio + junio + julio + augusto + septembre + octobre + novembre + decembre + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + dom + lun + mar + mer + jov + ven + sab + + + dominica + lunedi + martedi + mercuridi + jovedi + venerdi + sabbato + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + T1 + T2 + T3 + T4 + + + 1-me trimestre + 2-nde trimestre + 3-tie trimestre + 4-te trimestre + + + + a.m. + p.m. + + + ante Christo + post Christo + + + a.Chr. + p.Chr. + + + + + + EEEE, yyyy MMMM dd + + + + + yyyy MMMM d + + + + + yyyy MMM d + + + + + yy/MM/dd + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1} {0} + + + + Q yy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + Capo Verde + + + Djibuti + + + Granada + + + Hongkong + + + Luxemburg + + + Martinica + + + Mauritio + + + Maldivas + + + Insula Pitcairn + + + Porto Rico + + + Mayotta + + + + + + , + . + + + + Dollares australian + + + Dollares canadian + + + Francos suisse + + + Marcos german + + + Coronas danese + + + Euros + + + francos francese + + + Libras sterling britannic + + + Yen japonese + + + Coronas norvegian + + + Coronas svedese + + + Dollares statounitese + + + + diff --git a/libs/Zend/Locale/Data/id.xml b/libs/Zend/Locale/Data/id.xml new file mode 100644 index 0000000..d190ddc --- /dev/null +++ b/libs/Zend/Locale/Data/id.xml @@ -0,0 +1,1317 @@ + + + + + + + + + + + Afar + Abkhaz + Aceh + Acoli + Adangme + Adyghe + Avestan + Afrikaans + Afro-Asiatik (Lainnya) + Afrihili + Ainu + Akan + Akkadien + Aleut + Bahasa Algonquia + Altai Selatan + Amharik + Aragon + Inggris Kuno (kl.450-1100) + Angika + Bahasa-bahasa Apache + Arab + Aram + Araucan + Arapaho + Buatan (Lainnya) + Arawak + Assam + Astur + Bahasa-bahasa Athapaska + Bahasa-bahasa Australia + Avarik + Awadhi + Aymara + Azerbaijan + Bashkir + Banda + Bahasa-bahasa Bamileke + Baluchi + Balin + Basa + Baltik (Lainnya) + Belarusia + Beja + Bemba + Berber + Bulgaria + Bihari + Bhojpuri + Bislama + Bikol + Bini + Siksika + Bambara + Bengal + Bantu + Tibet + Breton + Braj + Bosnia + Batak + Buriat + Bugis + Blin + Catalan + Caddo + India Amerika Tengah (Lainnnya) + Karib + Kaukasia (Lainnya) + Atsam + Chechen + Cebuano + Celtic (Lainnya) + Chamorro + Chibcha + Chagatai + Chuuke + Mari + Jargon Chinook + Choctaw + Chipewyan + Cherokee + Cheyenne + Bahasa Chamic + Korsika + Koptik + Kreol dan Pidgins Lain Berbasis Inggris + Kreol dan Pidgins Lain berbasis Prancis + Kreol dan Pidgins Lain berbasis Portugis + Cree + Turki Krimea + Kreol dan Pidgins Lain + Ceko + Kashubian + Church Slavic + Cushitic Lain + Chuvash + Welsh + Denmark + Dakota + Dargwa + Dayak + Jerman + Jerman Austria + Jerman Tinggi Swiss + Delaware + Slave + Dogrib + Dinka + Dogri + Dravidia Lain + Sorbia Rendahan + Duala + Belanda Menengah + Divehi + Dyula + Dzongkha + Ewe + Efik + Mesir Kuno + Ekajuk + Yunani + Elamite + Inggris + Inggris Australia + Inggris Kanada + Inggris (British) + Inggris A.S. + Inggris, Abad Pertengahan (1100-1500) + Esperanto + Spanyol + Spanyol Amerika Latin + Spanyol (Iberia) + Estonian + Basque + Ewondo + Persia + Fang + Fanti + Fulah + Finlandia + Filipina + Finno - Ugria Lain + Fiji + Faro + Fon + Perancis + Prancis Kanada + Prancis Swiss + Perancis, Abad Pertengahan (kl.1400-1600) + Perancis Kuno (842-kl.1400) + Frisia Utara + Frisia Timur + Friuli + Frisi + Irlandia + Ga + Gayo + Gbaya + Gaelik Skotlandia + Jermanik (Lainnya) + Geez + Gilbert + Gallegan + Jerman, Abad Pertengahan (kl.1050-1500) + Guarani + Jerman Kuno (kl.750-1050) + Gondi + Gorontalo + Gothik + Grebo + Yunani Kuno (sd 1453) + Jerman Swiss + Gujarati + Manx + Gwich'in + Hausa + Haida + Hawaii + Ibrani + Hindi + Hiligaynon + Himachali + Hittite + Hmong + Hiri Motu + Kroasia + Sorbia Atas + Haiti + Hungaria + Hupa + Armenia + Herero + Interlingua + Iban + Bahasa Indonesia + Interlingue + Igbo + Sichuan Yi + Ijo + Inupiaq + Iloko + Indic Lain + Indo-Eropa Lain + Ingush + Ido + Iran Lain + Bahasa Iroquoia + Icelandic + Italian + Inuktitut + Japanese + Lojban + Judeo-Persia + Judeo-Arab + Jawa + Georgian + Kara-Kalpak + Kabyle + Kachin + Jju + Kamba + Karen + Kawi + Kabardian + Tyap + Koro + Kongo + Khasi + Khoisa Lain + Khotan + Kikuyu + Kuanyama + Kazakh + Kalaallisut + Khmer + Kimbundu + Kannada + Korea + Konkani + Kosrae + Kpelle + Kanuri + Karachay-Balkar + Karelian + Kru + Kurukh + Kashmir + Kurdi + Kumyk + Kutenai + Komi + Cornish + Kirghiz + Latin + Ladino + Lahnda + Lamba + Luxembourg + Lezghia + Ganda + Limburg + Lingala + Lao + Mongo + Lozi + Lithuania + Luba-Katanga + Luba-Lulua + Luiseno + Lunda + Luo + Lushai + Latvian + Madura + Magahi + Maithili + Makassar + Mandingo + Austronesia + Masai + Moksha + Mandar + Mende + Malagasi + Irlandia Abad Pertengahan (900-1200) + Marshall + Maori + Micmac + Minangkabau + Bahasa Lain-lain + Macedonian + Mon-Khmer (Lainnya) + Malayalam + Mongolian + Manchu + Manipuri + Bahasa Manobo + Moldavian + Mohawk + Mossi + Marathi + Malay + Maltese + Beberapa Bahasa + Bahasa Munda + Creek + Mirand + Marwari + Burma + Bahasa Mayan + Erzya + Nauru + Nahuati + Indian Amerika Utara Lain + Neapolitan + Norwegian Bokmål + Ndebele Utara + Jerman Rendah + Nepal + Newari + Ndonga + Nias + Niger - Kordofania Lain + Niuea + Belanda + Flemish + Norwegian Nynorsk + Norwegian + Nogai + Norse Lama + N'Ko + Ndebele Selatan + Sotho Utara + Bahasa Nubia + Navajo + Newari Klasik + Nyanja; Chichewa; Chewa + Nyamwezi + Nyankole + Nyoro + Nzima + Bahasa Occit + Ojibwa + Oromo + Oriya + Ossetic + Osage + Turki Ottoman + Bahasa Otomia + Punjabi + Papuan (Lainnya) + Pangasina + Pahlavi + Pampanga + Papiamento + Palaua + Persia Kuno (kl.600-400 SM.) + Filipina (Lainnya) + Phoenicia + Pali + Polish + Pohnpeia + Bahasa Prakrit + Provençal Lama + Pashto (Pushto) + Portugis + Portugis Brasil + Portugis (Iberia) + Quechua + Rajasthani + Rapanui + Rarotongan + Rhaeto-Romance + Rundi + Romanian + Romance Lain + Romany + Root + Russian + Aromanian + Kinyarwanda + Sanskrit + Sandawe + Yakut + Indian Amerika Selatan Lain + Bahasa Salisha + Aramaic Samaritan + Sasak + Santali + Sardinian + Sisilia + Skotlandia + Sindhi + Northern Sami + Selkup + Semitic Lain + Sango + Irlandia Lama + Bahasa Isyarat + Serbo-Croatian + Shan + Sinhalese + Sidamo + Bahasa Siouan + Sino-Tibet Lain + Slovak + Slovenian + Slavic Lain + Samoan + Sami Selatan + Bahasa Sami Lain + Lule Sami + Inari Sami + Skolt Sami + Shona + Soninke + Somali + Sogdien + Songhai + Albanian + Serbian + Sranan Tongo + Serer + Swati + Nilo-Sahara Lain + Sotho Selatan + Sundan + Sukuma + Susu + Sumeria + Swedia + Swahili + Syria + Tamil + Tai Lain + Telugu + Timne + Tereno + Tetum + Tajik + Thai + Tigrinya + Tigre + Tiv + Turkmen + Tokelau + Tagalog + Klingon + Tingit + Tamashek + Tswana + Tonga + Nyasa Tonga + Tok Pisin + Turkish + Tsonga + Tsimshian + Tatar + Tumbuka + Bahasa Tupi + Altaic Lain + Tuvalu + Twi + Tahitian + Tuvinia + Udmurt + Uighur + Ugaritik + Ukrainian + Umbundu + Bahasa Tidak Dikenal atau Tidak Valid + Urdu + Uzbek + Vai + Venda + Vietnamese + Volapük + Votik + Walloon + Bahasa Wakasha + Walamo + Waray + Washo + Bahasa Serbia + Wolof + Kalmyk + Xhosa + Yao + Yap + Yiddish + Yoruba + Bahasa Yupik + Zhuang + Zapotek + Zenaga + Cina + Cina Sederhana + Cina Tradisional + Zande + Zulu + Zuni + Tidak ada konten linguistik + Zaza + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Andora + Uni Emirat Arab + Afghanistan + Antigua dan Barbuda + Anguilla + Albania + Armenia + Antilles Belanda + Angola + Antarktika + Argentina + Samoa Amerika + Austria + Australia + Aruba + �Land Islands + Azerbaijan + Bosnia dan Herzegovina + Barbados + Bangladesh + Belgia + Burkina Faso + Bulgaria + Bahrain + Burundi + Benin + Bermuda + Brunei + Bolivia + Brazil + Bahamas + Bhutan + Kepulauan Bouvet + Botswana + Belarusia + Belize + Kanada + Kepulauan Cocos + Republik Demokratik Kongo + Republik Afrika Tengah + Kongo + Swiss + Pantai Gading + Kepulauan Cook + Chili + Kamerun + Cina + Kolombia + Kosta Rika + Serbia dan Montenegro + Kuba + Tanjung Verde + Pulau Christmas + Siprus + Republik Ceko + Jerman + Jibouti + Denmark + Dominika + Republik Dominika + Algeria + Ekuador + Estonia + Mesir + Sahara Barat + Eritrea + Spanyol + Ethiopia + Finlandia + Fiji + Kepulauan Falkland + Mikronesia + Kepulauan Faroe + Perancis + Gabon + Inggris Raya + Grenada + Georgia + Guyana Perancis + Guernsey + Ghana + Gibraltar + Greenland + Gambia + Guinea + Guadeloupe + Guinea Khatulistiwa + Yunani + Georgia Selatan dan Kepulauan Sandwich Selatan + Guatemala + Guam + Guinea-Bissau + Guyana + Hong Kong S.A.R., Cina + Pulau Heard dan Kepulauan McDonald + Honduras + Kroasia + Haiti + Hungaria + Indonesia + Irlandia + Israel + Isle of Man + India + British Indian Ocean Territory + Iraq + Iran + Islandia + Itali + Jersey + Jamaika + Yordania + Jepang + Kenya + Kyrgyzstan + Kamboja + Kiribati + Komoros + Saint Kitts dan Nevis + Korea Utara + Korea Selatan + Kuwait + Kepulauan Kayman + Kazakhstan + Laos + Lebanon + Santa Lusia + Liechtenstein + Sri Lanka + Liberia + Lesotho + Lithuania + Luxembourg + Latvia + Libya + Maroko + Monaco + Moldova + Montenegro + Madagaskar + Kepulauan Marshall + Macedonia + Mali + Myanmar + Mongolia + Makao S.A.R. Cina + Kepualuan Mariana Utara + Martinique + Mauritania + Montserrat + Malta + Mauritius + Maldives + Malawi + Mexico + Malaysia + Mozambique + Namibia + Kaledonia Baru + Niger + Kepulauan Norfolk + Nigeria + Nicaragua + Netherlands + Norwegia + Nepal + Nauru + Niue + Selandia Baru + Oman + Panama + Peru + Polynesia Perancis + Papua Nugini + Filipina + Pakistan + Polandia + Saint Pierre dan Miquelon + Pitcairn + Puerto Riko + Otoritas Palestina + Portugis + Palau + Paraguay + Qatar + Réunion + Romania + Serbia + Rusia + Rwanda + Arab Saudi + Kepulauan Solomon + Seychelles + Sudan + Sweden + Singapura + Saint Helena + Slovenia + Svalbard dan Jan Mayen + Slovakia + Sierra Leone + San Marino + Senegal + Somalia + Suriname + Sao Tome dan Principe + El Salvador + Syria + Swaziland + Kepulauan Turks dan Caicos + Chad + Wilayah Prancis Selatan + Togo + Thailand + Tajikistan + Tokelau + Timor Timur + Turkmenistan + Tunisia + Tonga + Turkey + Trinidad dan Tobago + Tuvalu + Taiwan + Tanzania + Ukraina + Uganda + Kepulauan minor sekitar Amerika Serikat + Amerika Serikat + Uruguay + Uzbekistan + Vatikan + Saint Vincent dan Grenadines + Venezuela + Kepulauan British Virgin + Kepulauan U.S. Virgin + Vietnam + Vanuatu + Wallis dan Futuna + Samoa + Yaman + Mayotte + Afrika Selatan + Zambia + Zimbabwe + + + + [a-n {ng} {ny} o p r-w y] + + + + + + + + + + + + + + Jan + Feb + Mar + Apr + Mei + Jun + Jul + Agu + Sep + Okt + Nov + Des + + + Januari + Februari + Maret + April + Mei + Juni + Juli + Agustus + September + Oktober + November + Desember + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + Min + Sen + Sel + Rab + Kam + Jum + Sab + + + Minggu + Senin + Selasa + Rabu + Kamis + Jumat + Sabtu + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + K1 + K2 + K3 + K4 + + + kuartal pertama + kuartal kedua + kuartal ketiga + kuartal keempat + + + + AM + PM + + + BCE + CE + + + + + + EEEE dd MMMM yyyy + + + + + dd MMMM yyyy + + + + + dd MMM yyyy + + + + + dd/MM/yy + + + + + + + H:mm:ss v + + + + + H:mm:ss z + + + + + H:mm:ss + + + + + H:mm + + + + + + + {1} {0} + + + + dd MMMM + dd/MM + mm:ss + MM/yy + Q yy + MMMM yyyy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + Andora + + + Anguila + + + Kutub Selatan + + + Dumont D'Urville + + + Easter Island + + + Kosta Rika + + + Dominika + + + Canary Islands + + + Guadalupe + + + Hongkong + + + Jamaika + + + St. Kitts + + + St. Lucia + + + Monako + + + Makau + + + Singapura + + + Salvador + + + Alaska Time + + + St. Vincent + + + St. Thomas + + + + + + , + . + + + + + ¤#,##0.00 + + + + + + Dirham Uni Emirat Arab + + + Peso Argentina + + + Dolar Australia + + + Lev Bulgaria + + + Dollar Brunei + + + Boliviano Bolivia + + + Real Brazil + + + Dolar Kanada + + + Franc Swiss + + + Peso Chili + + + Yuan Renminbi + + + Peso Kolombia + + + Koruna Czech + + + Mark Jerman + + + Kroner Denmark + + + Kroon Estonia + + + Pound Mesir + + + Euro + + + Dollar Fiji + + + Frank Prancis + + + Pondsterling Inggris + + + Dolar Hong Kong + + + Kuna Kroasia + + + Forint Hungaria + + + Rupiah Indonesia + Rp + + + Shekel Israel + + + Rupee India + + + Yen Jepang + + + Shilling Kenya + + + Won Korea Selatan + + + Litas Lithuania + + + Dirham Maroko + + + Lira Malta + + + Peso Meksiko + + + Ringgit Malaysia + + + Kroner Norwegia + + + Dolar New Zealand + + + Nuevo Sol Peruvian + + + Peso Filipina + + + Rupee Pakistan + + + NewZloty Polandia + + + Leu Rumania Baru + + + Dinar Serbia + + + Rubel Rusia + + + Real Saudi + + + Kronor Swedia + + + Dolar Singapura + + + Tolar Slovenia + + + Koruna Slovakia + + + Baht Thailand + + + Lira Turki + + + Lira Turki Baru + + + Dolar Taiwan Baru + + + Hryvnia Ukrania + + + Dolar Amerika + + + Bolivar Venezuela + + + Dong Vietnam + + + Rand Afrika Selatan + + + + + + ya:y + tidak:t + + + diff --git a/libs/Zend/Locale/Data/id_ID.xml b/libs/Zend/Locale/Data/id_ID.xml new file mode 100644 index 0000000..9c60d09 --- /dev/null +++ b/libs/Zend/Locale/Data/id_ID.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/ig.xml b/libs/Zend/Locale/Data/ig.xml new file mode 100644 index 0000000..a60a650 --- /dev/null +++ b/libs/Zend/Locale/Data/ig.xml @@ -0,0 +1,197 @@ + + + + + + + + + + [a b {ch} d-g {gb} {gh} {gw} h i ị j k {kp} {kw} l-n ṅ {nw} {ny} o ọ p r s {sh} t u ụ v w y z] + + + + + + + + Jen + Feb + Maa + Epr + Mee + Juu + Jul + Ọgọ + Sep + Ọkt + Nov + Dis + + + Jenụwarị + Febrụwarị + Maachị + Eprel + Mee + Juun + Julaị + Ọgọọst + Septemba + Ọktoba + Novemba + Disemba + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + Ụka + Mọn + Tiu + Wen + Tọọ + Fraị + Sat + + + Mbọsị Ụka + Mọnde + Tiuzdee + Wenezdee + Tọọzdee + Fraịdee + Satọdee + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + A.M. + P.M. + + + Tupu Kristi + Afọ Kristi + + + T.K. + A.K. + + + + + + EEEE, yyyy MMMM dd + + + + + yyyy MMMM d + + + + + yyyy MMM d + + + + + yy/MM/dd + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1} {0} + + + + H:mm + L + d + Q yy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + + Naịra + + + + + diff --git a/libs/Zend/Locale/Data/ig_NG.xml b/libs/Zend/Locale/Data/ig_NG.xml new file mode 100644 index 0000000..b86d9c0 --- /dev/null +++ b/libs/Zend/Locale/Data/ig_NG.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/ii.xml b/libs/Zend/Locale/Data/ii.xml new file mode 100644 index 0000000..2e4d9fa --- /dev/null +++ b/libs/Zend/Locale/Data/ii.xml @@ -0,0 +1,255 @@ + + + + + + + + + + + ꄓꇩꉙ + ꑱꇩꉙ + ꑭꀠꑸꉙ + ꃔꇩꉙ + ꆈꌠꉙ + ꑴꄊꆺꉙ + ꏝꀪꉙ + ꁍꄨꑸꉙ + ꀠꑟꁍꄨꑸꉙ + ꊉꇩꉙ + ꅉꀋꌠꅇꂷ + ꍏꇩꉙ + ꈝꐯꍏꇩꉙ + ꀎꋏꍏꇩꉙ + + + + + + + + + + + + + ꀠꑭ + ꍏꇩ + ꄓꇩ + ꃔꇩ + ꑱꇩ + ꑴꄗ + ꑴꄊꆺ + ꏝꀪ + ꊉꇆꌦ + ꂰꇩ + ꃅꄷꅉꀋꐚꌠ + + + ꄉꉻꃅꑍ + ꑳꌦꇂꑍꉖ + + + ꂰꇩ + ꂰꌬꌠ + + + ꅇꉙ: {0} + ꇇꁱ: {0} + ꃅꄷ: {0} + + + + [ꀀ-ꒌ] + + + + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + ꋍꆪ + ꑍꆪ + ꌕꆪ + ꇖꆪ + ꉬꆪ + ꃘꆪ + ꏃꆪ + ꉆꆪ + ꈬꆪ + ꊰꆪ + ꊰꊪꆪ + ꊰꑋꆪ + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + ꆏꑍ + ꆏꋍ + ꆏꑍ + ꆏꌕ + ꆏꇖ + ꆏꉬ + ꆏꃘ + + + ꑭꆏꑍ + ꆏꊂꋍ + ꆏꊂꑍ + ꆏꊂꌕ + ꆏꊂꇖ + ꆏꊂꉬ + ꆏꊂꃘ + + + + + + + + + + + + + + + + + + ꃅꑌ + ꃅꎸ + ꃅꍵ + ꃅꋆ + + + ꃅꑌ + ꃅꎸ + ꃅꍵ + ꃅꋆ + + + + + 1 + 2 + 3 + 4 + + + + ꎸꄑ + ꁯꋒ + + + ꃅꋊꂿ + ꃅꋊꊂ + + + + + + yyyy MMMM d + + + + + + ꃅꋊ + + + + + + + + + ꑭꆏ + + + + ꀃꑍ + ꃆꏂꑍ + ꌕꀿꑍ + ꀋꅔꉈ + ꎴꂿꋍꑍ + + + ꆏꑍ + + + ꎸꄑ/ꁯꋒ + + + ꄮꈉ + + + + + + + + + ꃅꄷꄮꈉ + + + + + + + ꅉꀋꐚꌠ + + + + + + . + , + + + + ꅉꀋꐚꌠꌋꆀꎆꃀꀋꈁꀐꌠ + XXX + + + + + + + ꀋꉬ + + + diff --git a/libs/Zend/Locale/Data/ii_CN.xml b/libs/Zend/Locale/Data/ii_CN.xml new file mode 100644 index 0000000..dcd62ad --- /dev/null +++ b/libs/Zend/Locale/Data/ii_CN.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/in.xml b/libs/Zend/Locale/Data/in.xml new file mode 100644 index 0000000..07c1d87 --- /dev/null +++ b/libs/Zend/Locale/Data/in.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/is.xml b/libs/Zend/Locale/Data/is.xml new file mode 100644 index 0000000..a53e11c --- /dev/null +++ b/libs/Zend/Locale/Data/is.xml @@ -0,0 +1,2169 @@ + + + + + + + + + + + {0} ({1}) + , + + + afár + abkasíska + akkíska + akólí + adangme + adýge + avestíska + afríkanska + afróasísk mál (önnur) + afríhílí + aínu + akan + akkadíska + aleúska + algonkvínsk mál + suðuraltaíska + amharíska + aragonska + fornenska (um 450-1100) + angíka + apatsjamál + arabíska + arameíska + arákaníska + arapahó + alþjóðamál (önnur) + aravakska + assamska + astúríska + atapaskísk mál + áströlsk mál + avaríska + avadí + aímara + aserska + baskír + banda + bamílekemál + balúkí + balíska + basa + baltnesk mál (önnur) + hvítrússneska + beja + bemba + berbamál + búlgarska + bíharí + bojpúrí + bíslama + bíkol + bíní + siksika + bambara + bengalska + bantúmál + tíbeska + bretónska + braí + bosníska + batak + búríat + búgíska + blín + katalónska + kaddó + Indíánamál Mið-Ameríku (önnur) + karíbamál + kákasusmál (önnur) + atsam + tsjetsjenska + kebúanó + keltnesk (önnur) + kamorró + síbsja + sjagataí + sjúkíska + marí + sínúk + sjoktá + sípevíska + sjerókí + sjeyen + kamísk mál + korsíska + koptíska + kreól- og pidginmál á enskum grunni + kreól- og pidginmál á frönskum grunni + kreól- og pidginmál á portúgölskum grunni + krí + krímtyrkneska + kreól- og pidginmál (önnur) + tékkneska + kasúbíska + kirkjuslavneska + kúsitísk mál (önnur) + sjúvas + velska + danska + dakóta + dargva + dajak + þýska + austurrísk þýska + svissnesk háþýska + delaver + slav + dogríb + dinka + dogrí + dravidísk mál (önnur) + lágsorbneska + dúala + miðhollenska (um 1050-1350) + dívehí + djúla + dsongka + eve + efík + fornegypska + ekajúk + nýgríska (1453-) + elamít + enska + áströlsk enska + kanadísk enska + bresk enska + bandarísk enska + miðenska (1100-1500) + esperantó + spænska + latnesk-amerísk spænska + spænsk spænska + eistneska + baskneska + evondó + persneska + fang + fantí + fúla + finnska + filipínska + finnskúgrísk mál (önnur) + fídjeyska + færeyska + fón + franska + kanadísk franska + svissnesk franska + miðfranska (um 1400-1600) + fornfranska (842 - um 1400) + norðurfrísneska + austurfrísneska + fríúlska + frísneska + írska + ga + gajó + gbaja + skosk gelíska + germönsk mál (önnur) + gís + gilberska + gallegska + miðháþýska (um 1050-1500 + gvaraní + fornháþýska (um 750-1050) + gondí + gorontaló + gotneska + gerbó + forngríska (til 1453) + svissnesk þýska + gújaratí + manx + gvísín + hása + haída + havaíska + hebreska + hindí + híligaínon + hímasjalí + hettitíska + hmong + hírímótú + króatíska + hásorbneska + haítíska + ungverska + húpa + armenska + hereró + interlingva + íban + indónesíska + interlingve + ígbó + sísúanjí + íjó + ínúpíak + ílokó + indversk mál (önnur) + indóevrópsk mál (önnur) + ingús + ídó + íranska + írókesk mál + íslenska + ítalska + inúktitút + japanska + lojban + gyðingapersneska + gyðingaarabíska + javanska + georgíska + karakalpak + kabíle + kasín + jju + kamba + karen + kaví + kabardíska + tyap + koro + kongó + kasí + koímál (önnur) + kotaska + kíkújú + kúanjama + kasakska + grænlenska + kmer + kimbúndú + kannada + kóreska + konkaní + kosraska + kpelle + kanúrí + karasaíbalkar + karélska + krú + kúrúk + kasmírska + kúrdneska + kúmík + kútenaí + komíska + korníska + kirgiska + latína + ladínska + landa + lamba + lúxemborgíska + lesgíska + ganda + limbúrgíska + lingala + laó + mongó + losí + litháíska + lúbakatanga + lúbalúlúa + lúisenó + lúnda + lúó + lúsaí + lettneska + madúrska + magahí + maítílí + makasar + mandingó + ástrónesíska + masaí + moksa + mandar + mende + malagasíska + miðírska (900-1200) + marshallska + maórí + mikmak + mínangkabá + ýmis mál + makedónska + monkmermál (önnur) + malajalam + mongólska + mansjú + manípúrí + manóbómál + moldóvska + móhíska + mossí + maratí + malaíska + maltneska + margvísleg mál + múndamál + krík + mirandesíska + marvarí + burmneska + majamál + ersja + nárúska + nahúatl + Indíánamál Norður-Ameríku (önnur) + napólíska + norskt bókmál + norðurndebele + Lágþýska; Lágsaxneska + nepalska + nevarí + ndonga + nías + nígerkordófanmál (önnur) + níveska + hollenska + flæmska + nýnorska + norska + nógaí + norræna + nkå + suðurndebele + norðursótó + núbísk mál + navahó + klassisk nevarí + Njanja; Sísjeva; Sjeva + njamvesí + njankóle + njóró + nsíma + Okkitíska (eftir 1500); Próvensalska + ojibva + órómó + óría + ossetíska + ósage + tyrkneska, ottóman (1500-1928) + ótommál + púnjabí + papúsk mál (önnur) + pangasínmál + palaví + pampanga + papíamentó + paláska + fornpersneska + filippseysk mál (önnur) + fönikíska + palí + pólska + ponpeiska + prakrítmál + fornpróvensalska (til 1500) + pastú + portúgalska + brasílísk portúgalska + íberísk portúgalska + kvesjúa + rajastaní + rapanúí + rarótongska + retórómanska + rúndí + rúmenska + rómönsk mál (önnur) + romaní + rót + rússneska + arúmenska + kínjarvanda + sanskrít + sandave + jakút + Indíánamál Suður-Ameríku (önnur) + salísmál + samversk arameíska + sasak + santalí + sardínska + sikileyska + skoska + sindí + norðursamíska + selkúp + semísk mál (önnur) + sangó + fornírska (til 900) + táknmál + serbókróatíska + sjan + singalesíska + sídamó + síúmál + sínótíbesk mál + slóvakíska + slóvenska + slavnesk mál (önnur) + samóska + suðursamíska + samísk mál (önnur) + lúlesamíska + enaresamíska + skoltesamíska + shóna + sóninke + sómalska + sogdíen + songhaí + albanska + serbneska + sranan tongo + serer + svatí + nílósaharamál (önnur) + suðursótó + súndanska + súkúma + súsú + súmerska + sænska + svahílí + klassisk sýrlenska + sýrlenska + tamílska + taímál (önnur) + telúgú + tímne + terenó + tetúm + tadsjikska + taílenska + tígrinja + tígre + tív + túrkmenska + tókeláska + tagalog + klingónska + tlingit + tamasjek + tsúana + Tongverska (Tongaeyjar) + Tongverska (Nyasa) + tokpisin + tyrkneska + tsonga + tsimsíska + tatarska + túmbúka + túpímál + altaísk mál (önnur) + túvalúska + tví + tahítíska + túvínska + údmúrt + úígúr + úgarítíska + úkraínska + úmbúndú + óljóst + úrdú + úsbekska + vaí + venda + víetnamska + volapyk + votíska + vallónska + vakasmál + valamó + varaí + vasjó + sorbnesk mál + volof + kalmúkska + sósa + jaó + japíska + jiddíska + jórúba + júpísk mál + súang + sapótek + blisstákn + senaga + kínverska + kínverska (einfölduð) + kínverska (hefðbundin) + sande + súlú + súní + ekkert tungutengt efni + zázá + + + + + + + + + + + + + + + + + + + + + + + + + heimur + Afríka + Norður-Ameríka + Suður-Ameríka + Eyjaálfa + Vestur-Afríka + Mið-Ameríka + Austur-Afríka + Norður-Afríka + Mið-Afríka + Suðurhluti Afríku + Ameríka + Ameríka norðan Mexikó + Karíbahaf + Austur-Asía + suðurhluti Asíu + Suðaustur-Asía + Suður-Evrópa + Ástralía og Nýja-Sjáland + Melanesía + Míkrónesía + Pólýnesía + Syðri-Mið-Asía + Asía + Mið-Asía + vestur-Asía + Evrópa + Austur-Evrópa + Norður-Evrópa + vestur-Evrópa + Samveldi sjálfstæðra ríkja + Latín-Ameríka og Karíbahaf + Ermasundseyjar + Andorra + Sameinuðu arabísku furstadæmin + Afganistan + Antígva og Barbúda + Angvilla + Albanía + Armenía + Hollensku Antillur + Angóla + Suðurskautslandið + Argentína + Bandaríska Samóa + Austurríki + Ástralía + Arúba + Álandseyjar + Aserbaídsjan + Bosnía og Hersegóvína + Barbados + Bangladess + Belgía + Búrkína Fasó + Búlgaría + Barein + Búrúndí + Benín + Saint Barthélemy + Bermúdaeyjar + Brúnei + Bólivía + Brasilía + Bahamaeyjar + Bútan + Bouveteyja + Botsvana + Hvíta-Rússland + Belís + Kanada + Kókoseyjar + Austur-Kongó + Mið-Afríkulýðveldið + Vestur-Kongó + Sviss + Fílabeinsströndin + Cookseyjar + Chíle + Kamerún + Kína + Kólumbía + Kostaríka + Serbía og Svartfjallaland + Kúba + Grænhöfðaeyjar + Jólaey + Kýpur + Tékkland + Þýskaland + Djíbútí + Danmörk + Dóminíka + Dóminíska lýðveldið + Alsír + Ekvador + Eistland + Egyptaland + Vestur-Sahara + Erítrea + Spánn + Eþíópía + Finnland + Fídjieyjar + Falklandseyjar + Mikrónesía + Færeyjar + Frakkland + Gabon + Bretland + Grenada + Georgía + Franska Gvæjana + Guernsey + Gana + Gíbraltar + Grænland + Gambía + Gínea + Gvadelúpeyjar + Miðbaugs-Gínea + Grikkland + Suður-Georgía og Suður-Sandvíkureyjar + Gvatemala + Gvam + Gínea-Bissá + Gvæjana + Hong Kong + Heard og McDonaldseyjar + Hondúras + Króatía + Haítí + Ungverjaland + Indónesía + Írland + Ísrael + Mön + Indland + Bresku Indlandshafseyjar + Írak + Íran + Ísland + Ítalía + Jersey + Jamaíka + Jórdanía + Japan + Kenía + Kirgisistan + Kambódía + Kíribatí + Kómoreyjar + Sankti Kristófer og Nevis + Norður-Kórea + Suður-Kórea + Kúveit + Caymaneyjar + Kasakstan + Laos + Líbanon + Sankti Lúsía + Liechtenstein + Srí Lanka + Líbería + Lesótó + Litháen + Lúxemborg + Lettland + Líbía + Marokkó + Mónakó + Moldóva + Svartfjallaland + Saint Martin + Madagaskar + Marshalleyjar + Makedónía + Malí + Mjanmar + Mongólía + Makáo + Norður-Maríanaeyjar + Martiník + Máritanía + Montserrat + Malta + Máritíus + Maldíveyjar + Malaví + Mexíkó + Malasía + Mósambík + Namibía + Nýja-Kaledónía + Níger + Norfolkeyja + Nígería + Níkaragva + Niðurlönd + Noregur + Nepal + Nárú + Niue + Nýja-Sjáland + Óman + Panama + Perú + Franska Pólýnesía + Papúa Nýja-Gínea + Filippseyjar + Pakistan + Pólland + Sankti Pierre og Miquelon + Pitcairn + Púertó Ríkó + Palestína + Portúgal + Palá + Paragvæ + Katar + Ytri Eyjaálfa + Evrópusambandið + Réunion + Rúmenía + Serbía + Rússland + Rúanda + Sádi-Arabía + Salómonseyjar + Seychelleseyjar + Súdan + Svíþjóð + Singapúr + Sankti Helena + Slóvenía + Svalbarði og Jan Mayen + Slóvakía + Síerra Leóne + San Marínó + Senegal + Sómalía + Súrínam + Saó Tóme og Prinsípe + El Salvador + Sýrland + Svasíland + Turks- og Caicoseyjar + Tsjad + Frönsku suðlægu landsvæðin + Tógó + Taíland + Tadsjikistan + Tókelá + Austur-Tímor + Túrkmenistan + Túnis + Tonga + Tyrkland + Trínidad og Tóbagó + Túvalú + Taívan + Tansanía + Úkraína + Úganda + Smáeyjar Bandaríkjanna + Bandaríkin + Úrúgvæ + Úsbekistan + Páfagarður + Sankti Vinsent og Grenadíneyjar + Venesúela + Jómfrúaeyjar (bresku) + Jómfrúaeyjar (bandarísku) + Víetnam + Vanúatú + Wallis- og Fútúnaeyjar + Samóa + Jemen + Mayotte + Suður-Afríka + Sambía + Simbabve + Óþekkt eða ógilt svæði + + + Dagatal + Röðun + Gjaldmiðill + + + hefðbundin kínversk röðun - Big5 + Búddískt dagatal + Kínverskt dagatal + Bein röðun + einfölduð kínversk röðun - GB2312 + Gregorískt dagatal + Hebreskt dagatal + indverskt dagatal + Íslamskt dagatal + Íslamskt borgaradagatal + Japanskt dagatal + Símaskráarröðun + Pinyin-röðun + kínverskt dagatal + Strikaröðun + Hefðbundin + + + bandarískt + metrakerfi + + + tungumál: {0} + leturgerð: {0} + svæði: {0} + + + + lowercase-words + + + [a á b d ð e é f-i í j-o ó p r-u ú v y ý þ æ ö] + [c q w z] + [a-z] + + + + + + + + + + + + + + jan + feb + mar + apr + maí + jún + júl + ágú + sep + okt + nóv + des + + + janúar + febrúar + mars + apríl + maí + júní + júlí + ágúst + september + október + nóvember + desember + + + + + j + f + m + a + m + j + j + á + s + o + n + d + + + + + + + sun + mán + þri + mið + fim + fös + lau + + + sunnudagur + mánudagur + þriðjudagur + miðvikudagur + fimmtudagur + föstudagur + laugardagur + + + + + s + m + þ + m + f + f + l + + + + + + + F1 + F2 + F3 + F4 + + + 1st fjórðungur + 2nd fjórðungur + 3rd fjórðungur + 4th fjórðungur + + + + + 1F + 2F + 3F + 4F + + + 1 + 2 + 3 + 4 + + + 1. fjórðungur + 2. fjórðungur + 3. fjórðungur + 4. fjórðungur + + + + f.h. + e.h. + + + fyrir Krist + eftir Krist + + + f.k. + e.k. + + + + + + EEEE, d. MMMM yyyy + + + + + d. MMMM yyyy + + + + + d.M.yyyy + + + + + d.M.yyyy + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1} {0} + + + + HH:mm + HH:mm:ss + H:mm + L. + E d.M. + LLL + E d. MMM + E d. MMMM + d. MMMM + d. MMM + d.M + d + mm:ss + yyyy + M. yyyy + EEE d.M.yyyy + MMM yyyy + EEE d. MMM yyyy + MMMM yyyy + Q. yyyy + QQQ yyyy + Q yy + M.yyyy + MMMM yyyy + + + {0} - {1} + + M-M + + + E, d.M - E, d.M + E, d.M - E, d.M + + + MMM-MMM + + + E, d. MMM - E, d. MMM + E, d. - E, d. MMM + + + d. MMM - d. MMM + d.-d. MMM + + + d.M - d.M + d.M - d.M + + + d-d + + + HH-HH + + + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH-HH v + + + y-y + + + M.yyyy - M.yyyy + M.yyyy - M.yyyy + + + E, d.M.yyyy - E, d.M.yyyy + E, d.M.yyyy - E, d.M.yyyy + E, d.M.yyyy - E, d.M.yyyy + + + MMM-MMM yyyy + MMM yyyy - MMM yyyy + + + E, d. MMM - E, d. MMM yyyy + E, d. - E, d. MMM yyyy + E, d. MMM yyyy - E, d. MMM yyyy + + + d. MMM - d. MMM yyyy + d.-d. MMM yyyy + d. MMM yyyy - d. MMM yyyy + + + d.M.yyyy - d.M.yyyy + d.M.yyyy - d.M.yyyy + d.M.yyyy - d.M.yyyy + + + + + + tímabil + + + ár + + + mánuður + + + vika + + + dagur + í dag + á morgun + eftir tvo daga + eftir þrjá daga + í gær + fyrir tveimur dögum + fyrir þremur dögum + + + vikudagur + + + f.h./e.h. + + + klukkustund + + + mínúta + + + sekúnda + + + svæði + + + + + + +HH:mm;−HH:mm + GMT{0} + {0} + + óþekkt + + + Kabúl + + + Angúilla + + + Suðurpóllinn + + + Dumont D'Urville + + + Vínarborg + + + Arúba + + + Barbadoseyjar + + + Brussel + + + Sofía + + + Barein + + + Bermúdaeyjar + + + Brúnei + + + Rio Branco + + + Belís + + + Regína + + + Zürich + + + Páskaeyja + + + Kostaríka + + + Grænhöfðaeyjar + + + Berlín + + + Djíbútí + + + Kaupmannahöfn + + + Dóminíka + + + Alsír + + + Kaíró + + + Kanaríeyjar + + + Madríd + + + Fidjieyjar + + + Færeyjar + + + París + + + Gíbraltar + + + Nuuk + + + Gvadelúp + + + Aþena + + + Suður-Georgía + + + Gvatemala + + + Gúam + + + Bissá + + + Gvæjana + + + Búdapest + + + Djakarta + + + Bagdad + + + Teheran + + + Reykjavík + + + Róm + + + Jamaíka + + + Tókýó + + + St. Kitts + + + Pjongjang + + + Seúl + + + Kúveit + + + Beirút + + + St. Lucia + + + Monróvía + + + Vilníus + + + Lúxemborg + + + Mónakó + + + Úlan Bator + + + Makaó + + + Martínik + + + Máritíus + + + Maldíveyjar + + + Mexíkóborg + + + Kankún + + + Osló + + + Nárú + + + Níúe + + + Marquesas-eyjar + + + Varsjá + + + Púertó Ríkó + + + Azoreyjar + + + Lissabon + + + Palaú + + + Kvatar + + + Búkarest + + + Moskva + + + Stokkhólmur + + + Singapúr + + + St. Helena + + + Salvador + + + Damaskus + + + Túnis + + + Istanbúl + + + Honolulu + + + Anchorage + + + Denver + + + Indianapolis + + + St. Vincent + + + St. Thomas + + + Jóhannesarborg + + + + Mið-Evróputími + sumartími Mið-Evrópu + + + MET + STME + + + + + Austur-Evróputími + sumartími Austur-Evrópu + + + AET + STAE + + + + + + + , + . + ; + % + 0 + + + + ×10^ + + + EiTa + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + #,##0.00 ¤ + + + + + + Andorrskur peseti + + + Arabískt dírham + + + Lek + lek + + + Dramm + dram + + + Hollenskt Antillugyllini + NA f. + + + Argentine Austral + + + Argentískur pesi (1983-1985) + + + Argentískur pesi + Arg$ + + + Austurrískur skildingur + + + Ástralskur dalur + $A + + + Barbadoskur dalur + BDS$ + + + Belgískur franki + BF + + + Lef + lev + + + Lef, nýtt + + + Bermúdeyskur dalur + Ber$ + + + Brúneiskur dalur + + + bólivískt bólívíanó + + + Bólivískur pesi + + + Bolivian Mvdol + + + Brasilískt ríal + + + Bahameyskur dalur + + + Búrmverskt kjat + + + Belískur dalur + BZ$ + + + Kanadískur dalur + Can$ + + + Svissneskur franki + SwF + + + Chilean Unidades de Fomento + + + Chileskur pesi + Ch$ + + + Júan + Y + + + Kólumbískur pesi + Col$ + + + Tékknesk króna, eldri + + + Kúbverskur pesi + + + Grænhöfðeyskur skúti + CVEsc + + + Kýpverskt pund + £C + + + Tékknesk króna + + + Austurþýskt mark + + + Þýskt mark + + + Djibouti Franc + DF + + + Dönsk króna + DKr + + + Dóminískur pesi + RD$ + + + Ecuador Sucre + + + Eistnesk króna + + + Egypskt pund + + + Spænskur peseti + + + Euro + + + Finnskt mark + + + Fídjeyskur dalur + F$ + + + Falklenskt pund + + + Franskur franki + + + Sterlingspund + + + Gíbraltarspund + + + Gíneufranki + GF + + + Drakma + + + Guatemala Quetzal + Q + + + Portúgalskur, gíneskur skúti + + + Gvæjanskur dalur + G$ + + + Hong Kong-dalur + HK$ + + + Hoduras Lempira + L + + + Kúna + + + Fórinta + Ft + + + Indónesísk rúpía + Rp + + + Írskt pund + IR£ + + + Ísraelskt pund + + + Sikill + + + Indversk rúpía + INR + + + Írakskur denari + ID + + + Íranskt ríal + RI + + + Íslensk króna + kr. + + + Ítölsk líra + + + Jamaískur dalur + J$ + + + Jen + + + kenískur skildingur + + + Kómoreyskur franki + CF + + + Norðurkóreskt vonn + + + Suðurkóreskt vonn + + + Kúveiskur denari + KD + + + Caymaneyskur dalur + + + Kazakhstan Tenge + T + + + Líbanskt pund + LL + + + Srílönsk rúpía + SL Re + + + Líberískur dalur + + + Lesotho Loti + M + + + Lít + + + Lithuanian Talonas + + + Lúxemborgarfranki + + + Lat + + + Lettnesk rúbla + + + Líbískur denari + LD + + + Marokkóskt dírham + + + Marokkóskur franki + + + Madagascar Ariary + + + Madagaskur franki + + + Makedónskur denari + MDen + + + Malískur franki + + + Mjanmarskt kjat + + + Túríkur + Tug + + + Macao Pataca + + + Mauritania Ouguiya + UM + + + Meltnesk líra + Lm + + + Maltneskt pund + + + Mexíkóskur pesi + MEX$ + + + Mexíkóskur silfurpesi (1861-1992) + + + Mexíkóskur pesi, UDI + + + Malaysian Ringgit + RM + + + Mósambískur skúti + + + Namibískur dalur + N$ + + + Nigerian Naira + + + Hollenskt gyllini + + + Norsk króna + NKr + + + Nýsjálenskur dalur + $NZ + + + Ómanskt ríal + RO + + + Balbói + + + perúskar sol nuevo + + + filippeyskir pesóar + + + Pakistönsk rúpía + Pra + + + pólskt zlotý + + + Slot + + + Portúgalskur skúti + + + Rúmenskt lei + leu + + + rúmensk leu + + + serbneskur dínar + + + rússnesk rúbla + + + Rússnesk rúbla (1991-1998) + + + Rwandan Franc + + + Sádiarabískt ríal + SRl + + + Salómonseyskur dalur + SI$ + + + Seychelles rúpía + SR + + + Súdanskur denari + + + Súdanskt pund + + + Sænsk króna + SKr + + + Singapúrskur dalur + S$ + + + Helenskt pund + + + Slóvenskur dalur + + + Slóvakísk króna + Sk + + + Suriname Guilder + Sf + + + Sao Tome and Principe Dobra + Db + + + Soviet Rouble + + + El Salvador Colon + + + Sýrlenskt pund + LS + + + Bat + + + Tadsjiksk rúbla + + + Tajikistan Somoni + + + Túrkmenskt manat + + + Tímorskur skúti + + + Tyrknesk líra + TL + + + Ný tyrknesk líra + + + Trínidad og Tóbagó-dalur + TT$ + + + Taívanskur dalur + NT$ + + + Tanzanian Shilling + T Sh + + + Hrinja + + + Ukrainian Karbovanetz + + + Bandaríkjadalur + + + Bandaríkjadalur (næsta dag) + + + Bandaríkjadalur (sama dag) + + + Venezuelan Bolivar + Be + + + víetnamskt dong + + + Vanuatu Vatu + VT + + + Miðafrískur franki, BEAC + + + Austur-Karíbahafsdalur + EC$ + + + Sérstök dráttarréttindi + + + Franskur gullfranki + + + Franskur franki, UIC + + + Miðafrískur franki, BCEAO + + + Pólinesískur franki + CFPF + + + Óþekktur eða ógildur gjaldeyrir + óþekktur eða ógildur gjaldeyrir + óþekktur eða ógildur gjaldeyrir + + + Jemenskur denari + + + Jemenskt ríal + YRl + + + Júgóslavneskur denari + + + Rand (viðskipta) + + + suðurafríkskt rand + + + Zambian Kwacha + + + Simbabveskur dalur + Z$ + + + + + + {0} dagur + {0} dagar + + + {0} klukkustund + {0} klukkustundir + + + {0} mínúta + {0} mínútur + + + {0} mánuður + {0} mánuðir + + + {0} sekúnda + {0} sekúndur + + + {0} vika + {0} vikur + + + {0} ár + {0} ár + + + + + já:j + nei:n + + + diff --git a/libs/Zend/Locale/Data/is_IS.xml b/libs/Zend/Locale/Data/is_IS.xml new file mode 100644 index 0000000..badf800 --- /dev/null +++ b/libs/Zend/Locale/Data/is_IS.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/it.xml b/libs/Zend/Locale/Data/it.xml new file mode 100644 index 0000000..2cc8507 --- /dev/null +++ b/libs/Zend/Locale/Data/it.xml @@ -0,0 +1,3070 @@ + + + + + + + + + + + {0} ({1}) + , + + + afar + abkhazian + accinese + acioli + adangme + adyghe + avestan + afrikaans + lingua afroasiatica + afrihili + ainu + akan + accado + aleuto + lingue algonchine + altai meridionale + amarico + aragonese + inglese antico + angika + lingue apache + arabo + aramaico + araucano + arapaho + lingua artificiale + aruaco + assamese + asturiano + lingue athabaska + lingue australiane + avaro + awadhi + aymara + azerbaigiano + baschiro + banda + lingue bamileke + beluci + balinese + basa + lingua baltica + bielorusso + begia + wemba + berbero + bulgaro + bihari + bhojpuri + bislama + bicol + bini + siksika + bambara + bengalese + bantu + tibetano + bretone + braj + bosniaco + batak + buriat + bugi + blin + catalano + caddo + lingua indiana dell'America Centrale + caribico + lingua caucasica + atsam + ceceno + cebuano + celtica altra lingua + chamorro + chibcha + ciagataico + chuukese + mari + gergo chinook + choctaw + chipewyan + cherokee + cheyenne + lingue chamic + corso + copto + creolo o pidgin basati sull'inglese + creolo o pidgin basati sul francese + creolo o pidgin basati sul portoghese + cree + turco crimeo + creolo o pidgin + ceco + kashubian + slavo della Chiesa + lingua cuscitica + chuvash + gallese + danese + dakota + dargwa + dayak + tedesco + tedesco austriaco + alto tedesco svizzero + delaware + slave + dogrib + dinca + dogri + lingua dravidica + basso sorabo + duala + olandese medio + divehi + diula + dzongkha + ewe + efik + egiziano antico + ekajuka + greco + elamitico + inglese + inglese australiano + inglese canadese + inglese britannico + inglese americano + inglese medio + esperanto + spagnolo + spagnolo latinoamericano + spagnolo della Spagna + estone + basco + ewondo + persiano + fang + fanti + fulah + finlandese + filippino + lingua ungrofinnica + figiano + faroese + francese + francese canadese + francese svizzero + francese medio + francese antico + frisone settentrionale + friulano + frisone + irlandese + ga + gayo + gbaya + gaelico scozzese + lingua germanica + geez + gilbertese + galiziano + tedesco medio alto + guarana + tedesco antico alto + gondi + gorontalo + gotico + gerbo + greco antico + tedesco svizzero + gujarati + manx + gwichʼin + haussa + haida + hawaiano + ebraico + hindi + hiligayna + himachali + hittite + hmong + hiri motu + croato + alto sorabo + haitiano + ungherese + hupa + armeno + herero + interlingua + iban + indonesiano + interlingue + igbo + sichuan yi + inupiak + ilocano + lingua indiana + lingua indoeuropea + ingush + ido + iraniana + lingue irochesi + islandese + italiano + inuktitut + giapponese + lojban + giudeo persiano + giudeo arabo + giavanese + georgiano + kara-kalpak + kabyle + kachin + kai + kamba + karen + kawi + kabardia + tyap + kfo + kongo + khasi + lingua khoisan + khotanese + kikuyu + kuanyama + kazako + kalaallisut + khmer + kimbundu + kannada + coreano + konkani + kosraean + kpelle + kanuri + karachay-Balkar + careliano + kru + kurukh + kashmiri + curdo + kumyk + kutenai + komi + cornico + kirghiso + latino + ladino + lahnda + lamba + lussemburghese + lezghian + ganda + limburgese + lingala + lao + lolo bantu + lozi + lituano + luba-katanga + luba-lulua + luiseno + lunda + luo + lushai + lettone + madurese + magahi + maithili + makasar + mandingo + austronesiano + masai + moksha + mandar + mende + malgascio + irlandese medio + marshallese + maori + micmac + menangkabau + lingue diverse + macedone + lingua mon-khmer + malayalam + mongolo + manchu + manipuri + manobo + moldavo + mohawk + mossi + marathi + malese + maltese + multilingua + lingua munda + creek + mirandese + marwari + birmano + lingue maya + erzya + nauru + nahuatl + lingua indiana del Nord America + napoletano + norvegese bokmal + ndebele del nord + basso tedesco + nepalese + newari + ndonga + nias + lingua niger-cordofan + niue + olandese + fiammingo belga + norvegese nynorsk + norvegese + nogai + norse antico + n'ko + ndebele del sud + sotho del nord + nubiano + navajo + newari classico + nyanja + nyamwezi + nyankole + nyoro + nzima + occitano + ojibwa + oromo + oriya + ossetico + osage + turco ottomano + lingue otomi + punjabi + lingua papuana + pangasinan + pahlavi + pampanga + papiamento + palau + persiano antico + lingua filippina + fenicio + pali + polacco + ponape + pracrito + provenzale antico + pashto + portoghese + portoghese brasiliano + portoghese del Portogallo + quechua + rajasthani + rapanui + rarotonga + lingua rhaeto-romance + rundi + rumeno + lingua romanza + romani + root + russo + arumeno + kinyarwanda + sanscrito + sandawe + yakut + lingua indiana del Sud America + lingue salish + aramaico samaritano + sasak + santali + sardo + siciliano + scozzese + sindhi + sami del nord + selkup + lingua semitica + sango + irlandese antico + lingue sign + serbo-croato + shan + singalese + sidamo + lingue sioux + lingua sino-tibetana + slovacco + sloveno + lingua slava + samoano + sami del sud + lingua sami + sami lule + sami inari + sami skolt + shona + soninke + somalo + sogdiano + songhai + albanese + serbo + sranan tongo + serer + swati + lingua nilo-sahariana + sotho del sud + sundanese + sukuma + susu + sumero + svedese + swahili + siriaco + tamil + lingua tailandese + telugu + temne + tereno + tetum + tagicco + thai + tigrinya + tigre + tiv + turcomanno + tokelau + tagalog + klingon + tlingit + tamashek + tswana + tonga + nyasa del Tonga + tok pisin + turco + tsonga + tsimshian + tatarico + tumbuka + lingue tupi + lingua altaica + tuvalu + ci + taitiano + tuvinian + udmurt + uigurico + ugaritico + ucraino + mbundu + lingua imprecisata + urdu + usbeco + vai + venda + vietnamita + volapük + voto + vallone + lingue wakash + walamo + waray + washo + sorabo + volof + kalmyk + xosa + yao (bantu) + yapese + yiddish + yoruba + lingue yupik + zhuang + zapotec + zenaga + cinese + cinese semplificato + cinese tradizionale + zande + zulu + zuni + Nessun contenuto linguistico + zaza + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Mondo + Africa + Nord America + America del Sud + Oceania + Africa occidentale + America centrale + Africa orientale + Africa del Nord + Africa centrale + Africa del Sud + Americhe + America del Nord + Caraibi + Asia orientale + Asia del Sud + Asia sudorientale + Europa del Sud + Australia e Nuova Zelanda + Melanesia + Regione Micronesiana + Polinesia + Asia centro-meridionale + Asia + Asia centrale + Asia occidentale + Europa + Europa orientale + Europa del Nord + Europa occidentale + Comunità di Stati Indipendenti + America Latina e Caraibi + Andorra + Emirati Arabi Uniti + Afghanistan + Antigua e Barbuda + Anguilla + Albania + Armenia + Antille Olandesi + Angola + Antartide + Argentina + Samoa Americane + Austria + Australia + Aruba + Isole Aland + Azerbaigian + Bosnia Erzegovina + Barbados + Bangladesh + Belgio + Burkina Faso + Bulgaria + Bahrein + Burundi + Benin + Bermuda + Brunei + Bolivia + Brasile + Bahamas + Bhutan + Isola Bouvet + Botswana + Bielorussia + Belize + Canada + Isole Cocos + Repubblica Democratica del Congo + Repubblica Centrafricana + Congo + Svizzera + Costa d’Avorio + Isole Cook + Cile + Camerun + Cina + Colombia + Costa Rica + Serbia e Montenegro + Cuba + Capo Verde + Isola di Christmas + Cipro + Repubblica Ceca + Germania + Gibuti + Danimarca + Dominica + Repubblica Dominicana + Algeria + Ecuador + Estonia + Egitto + Sahara Occidentale + Eritrea + Spagna + Etiopia + Finlandia + Figi + Isole Falkland + Micronesia + Isole Faroe + Francia + Gabon + Regno Unito + Grenada + Georgia + Guiana Francese + Guernsey + Ghana + Gibilterra + Groenlandia + Gambia + Guinea + Guadalupa + Guinea Equatoriale + Grecia + Georgia del Sud e Isole Sandwich del Sud + Guatemala + Guam + Guinea-Bissau + Guyana + Hong-Kong + Isole Heard ed Isole McDonald + Honduras + Croazia + Haiti + Ungheria + Indonesia + Irlanda + Israele + Isola di Man + India + Territorio Britannico dell’Oceano Indiano + Iraq + Iran + Islanda + Italia + Jersey + Giamaica + Giordania + Giappone + Kenya + Kirghizistan + Cambogia + Kiribati + Comore + Saint Kitts e Nevis + Corea del Nord + Corea del Sud + Kuwait + Isole Cayman + Kazakistan + Laos + Libano + Saint Lucia + Liechtenstein + Sri Lanka + Liberia + Lesotho + Lituania + Lussemburgo + Lettonia + Libia + Marocco + Monaco + Moldavia + Montenegro + Madagascar + Isole Marshall + Repubblica di Macedonia + Mali + Myanmar + Mongolia + Macao + Isole Marianne Settentrionali + Martinica + Mauritania + Montserrat + Malta + Mauritius + Maldive + Malawi + Messico + Malesia + Mozambico + Namibia + Nuova Caledonia + Niger + Isola Norfolk + Nigeria + Nicaragua + Paesi Bassi + Norvegia + Nepal + Nauru + Niue + Nuova Zelanda + Oman + Panama + Perù + Polinesia Francese + Papua Nuova Guinea + Filippine + Pakistan + Polonia + Saint Pierre e Miquelon + Pitcairn + Portorico + Palestina + Portogallo + Palau + Paraguay + Qatar + Oceania lontana + Unione Europea + Réunion + Romania + Serbia + Federazione Russa + Ruanda + Arabia Saudita + Isole Solomon + Seychelles + Sudan + Svezia + Singapore + Sant’Elena + Slovenia + Svalbard e Jan Mayen + Slovacchia + Sierra Leone + San Marino + Senegal + Somalia + Suriname + Sao Tomé e Príncipe + El Salvador + Siria + Swaziland + Isole Turks e Caicos + Ciad + Territori australi francesi + Togo + Tailandia + Tagikistan + Tokelau + Timor Est + Turkmenistan + Tunisia + Tonga + Turchia + Trinidad e Tobago + Tuvalu + Taiwan + Tanzania + Ucraina + Uganda + Isole Minori lontane dagli Stati Uniti + Stati Uniti + Uruguay + Uzbekistan + Vaticano + Saint Vincent e Grenadines + Venezuela + Isole Vergini Britanniche + Isole Vergini Americane + Vietnam + Vanuatu + Wallis e Futuna + Samoa + Yemen + Mayotte + Sudafrica + Zambia + Zimbabwe + regione non valida o sconosciuta + + + ortografia tradizionale tedesca + ortografia tedesca del 1996 + armeno orientale + armeno occidentale + boontling + fonetica IPA + fonetica UPA + monotonico + dialetto del Natisone + politonico + computer + ortografia revisionata + resiano + saho + + + calendario + collazione + valuta + + + cinese tradizionale + calendario buddista + calendario cinese + ordine diretto + cinese semplificato + calendario gregoriano + calendario ebraico + calendario nazionale indiano + calendario islamico + calendario civile islamico + calendario giapponese + ordine elenco telefonico + ordine pinyin + ordine segni + ordine tradizionale + + + USA + metrico + + + + lowercase-words + lowercase-words + lowercase-words + + + [a à b-e é è f-i ì j-o ó ò p-u ù v-z] + [í ï ú] + [a-z] + + + + + + + + + + + + + + gen + feb + mar + apr + mag + giu + lug + ago + set + ott + nov + dic + + + gennaio + febbraio + marzo + aprile + maggio + giugno + Luglio + agosto + settembre + ottobre + novembre + dicembre + + + + + G + F + M + A + M + G + L + A + S + O + N + D + + + Gennaio + Febbraio + Marzo + Aprile + Maggio + Giugno + Luglio + + + + + + + dom + lun + mar + mer + gio + ven + sab + + + domenica + lunedì + martedì + mercoledì + giovedì + venerdì + sabato + + + + + D + L + M + M + G + V + S + + + Domenica + Lunedì + Martedì + Mercoledì + Giovedì + Venerdì + Sabato + + + + + + + T1 + T2 + T3 + T4 + + + 1o trimestre + 2o trimestre + 3o trimestre + 4o trimestre + + + + + 1 + 2 + 3 + 4 + + + + m. + p. + + + a.C. + d.C + + + aC + dC + + + + + + EEEE d MMMM yyyy + + + + + dd MMMM yyyy + + + + + dd/MMM/yyyy + + + + + dd/MM/yy + + + + + + + HH.mm.ss v + + + + + HH.mm.ss z + + + + + HH.mm.ss + + + + + HH.mm + + + + + + + {1} {0} + + + + HH.mm + HH.mm.ss + HH:mm + L + EEE d/M + LLL + EEE d MMM + EEE d MMMM + d MMMM + dd MMMM + d MMM + dd/MM + d/M + d + hh.mm a + hh.mm.ss a + mm:ss + yyyy + M/yyyy + EEE, d-M-yyyy + MMM yyyy + EEE d MMM yyyy + MMMM yyyy + Q-yyyy + QQQ yyyy + MM/yy + Q yy + QQQQ yy + MMMM yyyy + + + {0} - {1} + + M-M + + + E dd/MM - E dd/MM + E dd/MM - E dd/MM + + + MMM-MMM + + + E dd MMM - E dd MMM + E dd - E dd MMM + + + LLLL-LLLL + + + dd MMM - dd MMM + dd-dd MMM + + + dd/MM - dd/MM + dd/MM - dd/MM + + + d-d + + + HH-HH + HH-HH + + + HH:mm-HH:mm + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH-HH v + HH-HH v + + + y-y + + + MM/yy - MM/yy + MM/yy - MM/yy + + + E dd/MM/yy - E dd/MM/yy + E dd/MM/yy - E dd/MM/yy + E dd/MM/yy - E dd/MM/yy + + + MMM-MMM yyyy + MMM yyyy - MMM yyyy + + + E d MMM - E d MMM yyyy + E d - E d MMM yyyy + E d MMM yyyy - E d MMM yyyy + + + yyyy-MM – MM + yyyy-MM – yyyy-MM + + + dd MMM - dd MMM yyyy + dd-dd MMM yyyy + dd MMM yyyy - dd MMM yyyy + + + dd/MM/yy - dd/MM/yy + dd/MM/yy - dd/MM/yy + dd/MM/yy - dd/MM/yy + + + + + + era + + + anno + + + mese + + + settimana + + + giorno + oggi + domani + dopodomani + tra tre giorni + ieri + l'altro ieri + tre giorni fa + + + giorno della settimana + + + periodo del giorno + + + ora + + + minuto + + + secondo + + + zona + + + + + + +HH.mm;-HH.mm + GMT{0} + {0} + + Sconosciuto + + + Tirana + + + Polo Sud + + + Dumont D'Urville + + + Cordova + + + Bruxelles + + + Bahrein + + + San Paolo + + + St. Johns + + + Zurigo + + + Pasqua + + + Capo Verde + + + Natale + + + Berlino + + + Gibuti + + + Copenaghen + + + Algeri + + + Canarie + + + Addis Abeba + + + Figi + + + Isole Faeroe + + + Parigi + + + Londra + + + Gibilterra + + + Guadalupa + + + Atene + + + Georgia meridionale + + + Guiana + + + Giacarta + + + Dublino + + + Gerusalemme + + + Teheran + + + Roma + + + Giamaica + + + Comore + + + St. Kitts + + + Seul + + + Santa Lucia + + + Lussemburgo + + + Macao + + + Martinica + + + Maldive + + + Città del Messico + + + Varsavia + + + Pitcairn, isole + + + Portorico + + + Azzorre + + + Lisbona + + + Riunione, isola di + + + Bucarest + + + Mosca + + + Stoccolma + + + Sant'Elena + + + Mogadiscio + + + Sao Tomè + + + Salvador + + + Damasco + + + Tunisi + + + Fuso orario Alaska + + + Center, Dakota del nord + + + Samarcanda + + + St. Vincent + + + St. Thomas + + + + Acre Time + Acre Summer Time + + + + + Central Africa Time + + + + + East Africa Time + + + + + South Africa Standard Time + + + + + West Africa Time + West Africa Summer Time + + + + + Aktyubinsk Time + Aktyubinsk Summer Time + + + + + Alaska Time + Ora Standard Alaska + Ora Legale Alaska + + + + + Alaska-Hawaii Standard Time + Alaska-Hawaii Daylight Time + + + + + Amazon Time + Amazon Summer Time + + + + + Central Time + Central Standard Time + Central Daylight Time + + + + + Eastern Time + Eastern Standard Time + Eastern Daylight Time + + + + + Mountain Time + Mountain Standard Time + Mountain Daylight Time + + + + + Pacific Time + Pacific Standard Time + Pacific Daylight Time + + + + + Aqtau Time + Aqtau Summer Time + + + + + Aqtobe Time + Aqtobe Summer Time + + + + + Arabian Time + Arabian Standard Time + Arabian Daylight Time + + + ST arabo + ADT arabo + + + + + Argentina Time + Argentina Summer Time + + + + + Western Argentina Time + + + + + Armenia Time + Armenia Summer Time + + + AMT Armenia + AMST Armenia + + + + + Ashkhabad Time + Ashkhabad Summer Time + + + + + Atlantic Time + Atlantic Standard Time + Atlantic Daylight Time + + + + + Central Australia Time + Australian Central Standard Time + Australian Central Daylight Time + + + + + Eastern Australia Time + Australian Eastern Standard Time + Australian Eastern Daylight Tim + + + + + Western Australia Time + Australian Western Standard Time + Australian Western Daylight Time + + + + + Azores Time + Azores Summer Time + + + + + Baku Time + Baku Summer Time + + + + + Bangladesh Time + + + + + Bering Time + Bering Standard Time + Bering Daylight Time + + + BST Bering + BDT Bering + + + + + Bhutan Time + + + + + Borneo Time + Borneo Summer Time + + + + + Brasilia Time + Brasilia Summer Time + + + + + Chamorro Standard Time + + + + + Changbai Time + + + + + Chile Time + Chile Summer Time + + + + + Ora Standard Cina + Ora Legale Cina + + + CST (Cina) + CDT (Cina) + + + + + Choibalsan Time + Choibalsan Summer Time + + + + + Dacca Time + + + + + Dushanbe Time + Dushanbe Summer Time + + + + + Dutch Guiana Time + + + + + East Timor Time + + + + + Ecuador Time + + + + + Ora Standard Europa Centrale + Ora Legale Europa Centrale + + + + + Ora Standard Europa Orientale + Ora Legale Europa Orientale + + + + + Western European Time + Western European Summer Time + + + + + Frunze Time + Frunze Summer Time + + + + + Greenwich Mean Time + + true + + + + Galapagos Time + + + + + Georgia Time + Georgia Summer Time + + + + + Central Greenland Time + Central Greenland Summer Time + + + + + East Greenland Time + East Greenland Summer Time + + + + + West Greenland Time + West Greenland Summer Time + + + + + Guam Standard Time + + + GST Guam + + + + + Gulf Standard Time + + + + + Hawaii Time + Ora Standard Hawaii + Ora Legale Hawaii + + + + + Hawaii-Aleutian Time + Hawaii-Aleutian Standard Time + Hawaii-Aleutian Daylight Time + + + + + India Standard Time + + + + + Central Indonesia Time + + + + + Eastern Indonesia Time + + + + + Western Indonesia Time + + + + + Ora Standard Israele + Ora Legale Israele + + + + + Ora Standard Giappone + Ora Legale Giappone + + + + + Karachi Time + + + + + Kashgar Time + + + + + East Kazakhstan Standard Time + + + + + West Kazakhstan Standard Time + + + + + Kizilorda Time + Kizilorda Summer Time + + + + + Korean Time + Korean Standard Time + Korean Daylight Time + + + + + Kuybyshev Time + Kuybyshev Summer Time + + + + + Kwajalein Time + + + + + Kyrgystan Time + + + + + Lanka Time + + + + + Long-Shu Time + + + + + Lord Howe Time + Lord Howe Standard Time + Lord Howe Daylight Time + + + + + Macau Time + Macau Summer Time + + + + + Malaya Time + + + + + Malaysia Time + + + + + Marshall Islands Time + + + + + Ulan Bator Time + Ulan Bator Summer Time + + + + + New Zealand Time + New Zealand Standard Time + New Zealand Daylight Time + + + + + Newfoundland Time + Newfoundland Standard Time + Newfoundland Daylight Time + + + + + North Mariana Islands Time + + + + + Pakistan Time + Pakistan Summer Time + + + + + Pierre and Miquelon Time + Pierre and Miquelon Standard Time + Pierre and Miquelon Daylight Time + + + + + Qyzylorda Time + Qyzylorda Summer Time + + + + + Samara Time + Samara Summer Time + + + + + Samarkand Time + Samarkand Summer Time + + + SAMT Samarkand + SAMST Samarkand + + + + + Samoa Standard Time + + + + + Shevchenko Time + Shevchenko Summer Time + + + + + Suriname Time + + + + + Sverdlovsk Time + Sverdlovsk Summer Time + + + + + Tajikistan Time + + + + + Tashkent Time + Tashkent Summer Time + + + + + Tbilisi Time + Tbilisi Summer Time + + + + + Turkey Time + Turkey Summer Time + + + + + Turkmenistan Time + Turkmenistan Summer Time + + + + + Ural'sk Time + Ural'sk Summer Time + + + + + Urumqi Time + + + + + Uzbekistan Time + Uzbekistan Summer Time + + + + + Yekaterinburg Time + Yekaterinburg Summer Time + + + + + Yerevan Time + Yerevan Summer Time + + + + + Yukon Time + Yukon Standard Time + Yukon Daylight Time + + + + + + + , + . + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + ¤ #,##0.00 + + + + + + Peseta Andorrana + + + Dirham degli Emirati Arabi Uniti + + + Afgani (1927-2002) + + + Afgani + Af + + + Lek Albanese + lek + + + Dram Armeno + dram + + + Fiorino delle Antille Olandesi + + + Kwanza Angolano + + + Kwanza Angolano (1977-1990) + + + Nuovo Kwanza Angolano (1990-2000) + + + Kwanza Reajustado Angolano (1995-1999) + + + Austral Argentino + + + Peso Argentino (vecchio Cod.) + + + Peso Argentino + + + Scellino Austriaco + + + Dollaro Australiano + + + Fiorino di Aruba + + + Manat Azero + + + manat azero + + + Dinar Bosnia-Herzegovina + + + Marco Conv. Bosnia-Erzegovina + KM + + + Dollaro di Barbados + BDS$ + + + Taka Bangladese + Tk + + + Franco Belga (convertibile) + + + Franco Belga + + + Franco Belga (finanziario) + + + Lev Bulgaro + + + Nuovo Lev Bulgaro + lev + + + Dinaro del Bahraini + BD + + + Franco del Burundi + Fbu + + + Dollaro delle Bermuda + Ber$ + + + Dollaro del Brunei + + + Boliviano + + + Peso Boliviano + + + Mvdol Boliviano + + + Cruzeiro Novo Brasiliano (1967-1986) + + + Cruzado Brasiliano + + + Cruzeiro Brasiliano (1990-1993) + + + Real Brasiliano + + + Cruzado Novo Brasiliano + + + Cruzeiro Brasiliano + + + Dollaro delle Bahamas + + + Ngultrum Butanese + Nu + + + Kyat Birmano + + + Pula del Botswana + + + Nuovo Rublo Bielorussia (1994-1999) + + + Rublo Bielorussia + Rbl + + + Dollaro Belize + BZ$ + + + Dollaro Canadese + + + Franco Congolese + + + Franco Svizzero + SFr. + + + Unidades de Fomento Chilene + + + Peso Cileno + + + Renmimbi Cinese + + + Peso Colombiano + Col$ + + + Colón Costaricano + C + + + antico dinaro serbo + + + Corona forte cecoslovacca + + + Peso Cubano + + + Escudo del Capo Verde + CVEsc + + + Sterlina Cipriota + + + Corona Ceca + + + Ostmark della Germania Orientale + + + Marco Tedesco + + + Franco Gibutiano + DF + + + Corona Danese + + + Peso Dominicano + RD$ + + + Dinaro Algerino + DA + + + Sucre dell’Ecuador + + + Unidad de Valor Constante (UVC) dell’Ecuador + + + Corona dell’Estonia + + + Sterlina Egiziana + + + Nakfa Eritreo + + + peseta spagnola account + + + peseta spagnola account convertibile + + + Peseta Spagnola + + + Birr Etiopico + Br + + + Euro + + + Markka Finlandese + + + Dollaro delle Figi + F$ + + + Sterlina delle Falkland + + + Franco Francese + + + Sterlina Inglese + + + Kupon Larit Georgiano + + + Lari Georgiano + lari + + + Cedi del Ghana + + + Sterlina di Gibilterra + + + Dalasi del Gambia + + + Franco della Guinea + GF + + + Syli della Guinea + + + Ekwele della Guinea Equatoriale + + + Dracma Greca + + + Quetzal Guatemalteco + Q + + + Escudo della Guinea portoghese + + + Peso della Guinea-Bissau + + + Dollaro della Guyana + G$ + + + Dollaro di Hong Kong + + + Lempira Hoduregno + L + + + Dinaro Croato + + + Kuna Croata + + + Gourde Haitiano + + + Fiorino Ungherese + + + Rupia Indonesiana + Rp + + + Lira Irlandese + IR£ + + + Sterlina Israeliana + + + Nuovo sheqel israeliano + + + Rupia Indiana + + + Dinaro Iracheno + ID + + + Rial Iraniano + RI + + + Corona Islandese + + + ¤ #,##0;-¤ #,##0 + Lira Italiana + + , + . + + + Dollaro Giamaicano + J$ + + + Dinaro Giordano + + + Yen Giapponese + + + Scellino Keniota + K Sh + + + Som Kirghiso + som + + + Riel Cambogiano + CR + + + Franco Comoriano + CF + + + Won Nordcoreano + + + Won Sudcoreano + + + Dinaro Kuwaitiano + KD + + + Dollaro delle Isole Cayman + + + Tenge Kazaco + T + + + Kip Laotiano + + + Sterlina Libanese + LL + + + Rupia di Sri Lanka + SL Re + + + Dollaro Liberiano + + + Loti del Lesotho + M + + + maloti + + + Lita Lituana + + + Talonas Lituani + + + franco convertibile del Lussemburgo + + + Franco del Lussemburgo + + + franco finanziario del Lussemburgo + + + Lat Lettone + + + Rublo Lettone + + + Dinaro Libico + LD + + + Dirham Marocchino + + + Franco Marocchino + + + Leu Moldavo + + + Ariary Malgascio + + + Franco Malgascio + + + Dinaro Macedone + MDen + + + Franco di Mali + + + Kyat di Myanmar + + + Tugrik Mongolo + Tug + + + Pataca di Macao + + + Ouguiya della Mauritania + UM + + + Lira Maltese + Lm + + + Sterlina Maltese + + + Rupia Mauriziana + + + Rufiyaa delle Maldive + + + Kwacha Malawiano + MK + + + Peso Messicano + MEX$ + + + Peso messicano d’argento (1861-1992) + + + Unidad de Inversion (UDI) Messicana + + + Ringgit della Malesia + RM + + + Escudo del Mozambico + + + Metical del Mozambico + Mt + + + metical del Mozambico + + + Dollaro Namibiano + N$ + + + Naira Nigeriana + + + Cordoba Nicaraguense + + + Córdoba oro nicaraguense + + + Fiorino Olandese + + + Corona Norvegese + + + Rupia Nepalese + Nrs + + + Dollaro Neozelandese + $NZ + + + Rial Omanita + RO + + + Balboa di Panama + + + Inti Peruviano + + + Sol Nuevo Peruviano + + + Sol Peruviano + + + Kina della Papua Nuova Guinea + + + Peso delle Filippine + + + Rupia del Pakistan + Pra + + + Zloty Polacco + Zl + + + Zloty Polacco (1950-1995) + + + Escudo Portoghese + + + Guarani del Paraguay + + + Rial del Qatar + QR + + + dollaro della Rhodesia + + + Leu della Romania + + + leu rumeno + + + Dinaro serbo + + + Rublo Russo + + + Rublo della CSI + + + Franco Ruandese + + + Ryal Saudita + + + Dollaro delle Isole Solomon + SI$ + + + Rupia delle Seychelles + SR + + + Dinaro Sudanese + + + Sterlina Sudanese + + + Corona Svedese + + + Dollaro di Singapore + + + Sterlina di Sant’Elena + + + Tallero Sloveno + + + Corona Slovacca + Sk + + + Leone della Sierra Leone + + + Scellino Somalo + Sh. + + + Fiorino del Suriname + Sf + + + Dobra di Sao Tomé e Principe + Db + + + Rublo Sovietico + + + Colón Salvadoregno + + + Sterlina Siriana + LS + + + Lilangeni dello Swaziland + E + + + Baht Tailandese + + + Rublo del Tajikistan + + + Somoni del Tajikistan + + + Manat Turkmeno + + + Dinaro Tunisino + + + Paʻanga di Tonga + T$ + + + Escudo di Timor + + + Lira Turca + lira turca + lire turche + + + nuova Lira turca + nuova Lira turca + nuove Lire turche + + + Dollaro di Trinidad e Tobago + TT$ + + + Nuovo dollaro taiwanese + NT$ + + + Scellino della Tanzania + T Sh + + + Hrivna Ucraina + + + Karbovanetz Ucraino + + + Scellino Ugandese (1966-1987) + + + Scellino Ugandese + U Sh + + + Dollaro Statunitense + + + Dollaro Statunitense (Next day) + + + Dollaro Statunitense (Same day) + + + Peso Uruguaiano (1975-1993) + + + Peso Uruguayo uruguaiano + Ur$ + + + Sum dell’Uzbekistan + + + Bolivar Venezuelano + Be + + + Dong Vietnamita + + + Vatu di Vanuatu + VT + + + Tala della Samoa Occidentale + + + Franco CFA BEAC + + + Oro + + + Unità composita europea + + + Unità monetaria europea + + + Unità di acconto europea (XBC) + + + Unità di acconto europea (XBD) + + + Dollaro dei Caraibi Orientali + EC$ + + + Diritti Speciali di Incasso + + + Unità Monetaria Europea + + + Franco Oro Francese + + + Franco UIC Francese + + + Franco CFA BCEAO + + + Franco CFP + CFPF + + + platino + + + fondi RINET + + + codice di verifica della valuta + + + Nessuna valuta + valuta sconosciuta/non valida + + + Dinaro dello Yemen + + + Rial dello Yemen + YRl + + + Dinaro Forte Yugoslavo + + + Dinaro Noviy Yugoslavo + + + Dinaro Convertibile Yugoslavo + + + Rand Sudafricano (finanziario) + + + Rand Sudafricano + + + Kwacha dello Zambia + + + Nuovo Zaire dello Zaire + + + Zaire dello Zaire + + + Dollaro dello Zimbabwe + Z$ + + + + + + {0} giorno + {0} giorni + + + {0} ora + {0} ore + + + {0} minuto + {0} minuti + + + {0} mese + {0} mesi + + + {0} secondo + {0} secondi + + + {0} settimana + {0} settimane + + + {0} anno + {0} anni + + + + + sì:si:s + no:n + + + diff --git a/libs/Zend/Locale/Data/it_CH.xml b/libs/Zend/Locale/Data/it_CH.xml new file mode 100644 index 0000000..c78e512 --- /dev/null +++ b/libs/Zend/Locale/Data/it_CH.xml @@ -0,0 +1,117 @@ + + + + + + + + + + + « + » + + + + + + + + + + EEEE, d MMMM yyyy + + + + + d MMMM yyyy + + + + + d-MMM-yyyy + + + + + dd.MM.yy + + + + + + + HH.mm:ss 'h' v + + + + + + HH:mm + HH:mm:ss + dd.MM + hh:mm a + hh:mm:ss a + MM.yy + + + + E, dd.MM - E, dd.MM + E, dd.MM - E, dd.MM + + + E, d MMM - E, d MMM + E, d - E, d MMM + + + d MMM - d MMM + d-d MMM + + + dd.MM - dd.MM + dd.MM - dd.MM + + + MM.yy - MM.yy + MM.yy - MM.yy + + + E, dd.MM.yy - E, dd.MM.yy + E, dd.MM.yy - E, dd.MM.yy + E, dd.MM.yy - E, dd.MM.yy + + + E, d MMM - E, d MMM yyyy + E, d - E, d MMM yyyy + E, d MMM yyyy - E, d MMM yyyy + + + d MMM - d MMM yyyy + d-d MMM yyyy + d MMM yyyy - d MMM yyyy + + + dd.MM.yy - dd.MM.yy + dd.MM.yy - dd.MM.yy + dd.MM.yy - dd.MM.yy + + + + + + + + + . + ' + + + + + ¤ #,##0.00;¤-#,##0.00 + + + + + + diff --git a/libs/Zend/Locale/Data/it_IT.xml b/libs/Zend/Locale/Data/it_IT.xml new file mode 100644 index 0000000..dfac9f4 --- /dev/null +++ b/libs/Zend/Locale/Data/it_IT.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/iu.xml b/libs/Zend/Locale/Data/iu.xml new file mode 100644 index 0000000..8b2a93a --- /dev/null +++ b/libs/Zend/Locale/Data/iu.xml @@ -0,0 +1,187 @@ + + + + + + + + + + + ᐃᓄᒃᑎᑐᑦ ᑎᑎᕋᐅᓯᖅ + + + + [ᐃ-ᐆ ᐊ ᐋ ᐱ-ᐴ ᐸ ᐹ ᑉ ᑎ-ᑑ ᑕ ᑖ ᑦ ᑭ-ᑰ ᑲ ᑳ ᒃ ᒋ-ᒎ ᒐ ᒑ ᒡ ᒥ-ᒨ ᒪ ᒫ ᒻ ᓂ-ᓅ ᓇ ᓈ ᓐ ᓕ-ᓘ ᓚ ᓛ ᓪ ᓯ-ᓲ ᓴ ᓵ ᔅ ᔨ-ᔫ ᔭ ᔮ ᔾ ᕆ-ᕉ ᕋ ᕌ ᕐ ᕕ-ᕚ ᕝ ᕿ-ᖃ ᖅ ᖏ ᖑ-ᖕ ᙱ-ᙶ ᖖ ᖠ-ᖦ] + + + + + + + + ᔭᓐᓄᐊᓕ + ᕕᕝᕗᐊᓕ + ᒫᑦᓯ + ᐊᐃᑉᐳᓗ + ᒪᐃ + ᔫᓂ + ᔪᓚᐃ + ᐊᐅᒡᒍᓯ + ᓰᑦᑏᕝᕙ + ᐆᑦᑑᕝᕙ + ᓅᕙᐃᕝᕙ + ᑏᓰᕝᕙ + + + ᔭᓐᓄᐊᓕ + ᕕᕝᕗᐊᓕ + ᒫᑦᓯ + ᐊᐃᑉᐳᓗ + ᒪᐃ + ᔫᓂ + ᔪᓚᐃ + ᐊᐅᒡᒍᓯ + ᓰᑦᑏᕝᕙ + ᐆᑦᑑᕝᕙ + ᓅᕙᐃᕝᕙ + ᑏᓰᕝᕙ + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + ᓈᑦᓰᖑᔭ + ᓇᒡᒐᔾᔭᐅ + ᓇᒡᒐᔾᔭᐅᓕᖅᑭ + ᐱᖓᑦᓯᖅ + ᓯᑕᒻᒥᖅ + ᑕᓪᓕᕐᒥᖅ + ᓈᑦᓰᖑᔭᓕᖅᕿ + + + ᓈᑦᓰᖑᔭ + ᓇᒡᒐᔾᔭᐅ + ᓇᒡᒐᔾᔭᐅᓕᖅᑭ + ᐱᖓᑦᓯᖅ + ᓯᑕᒻᒥᖅ + ᑕᓪᓕᕐᒥᖅ + ᓈᑦᓰᖑᔭᓕᖅᕿ + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + AM + PM + + + BCE + CE + + + + + + EEEE, yyyy MMMM dd + + + + + yyyy MMMM d + + + + + yyyy MMM d + + + + + yy/MM/dd + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1} {0} + + + + Q yy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + diff --git a/libs/Zend/Locale/Data/iw.xml b/libs/Zend/Locale/Data/iw.xml new file mode 100644 index 0000000..6031563 --- /dev/null +++ b/libs/Zend/Locale/Data/iw.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/libs/Zend/Locale/Data/ja.xml b/libs/Zend/Locale/Data/ja.xml new file mode 100644 index 0000000..fb79a8d --- /dev/null +++ b/libs/Zend/Locale/Data/ja.xml @@ -0,0 +1,3891 @@ + + + + + + + + + + + {0}({1}) + + + + アファル語 + アブハズ語 + アチェー語 + アチョリ語 + アダングメ語 + アディゲ語 + アヴェスタ語 + アフリカーンス語 + セム・ハム諸語 + アフリヒリ語 + アイヌ語 + アカン語 + アッカド語 + アレウト語 + アルゴンキアン語族 + 南アルタイ語 + アムハラ語 + アラゴン語 + 古代英語 + アンギカ語 + アパッチ語族 + アラビア語 + アラム語 + アラウカン語 + アラパホー語 + 人工諸語 + アラワク語 + アッサム語 + アストゥリアス語 + アサパスカン語族 + オーストラリア語族 + アヴァル語 + アワディー語 + アイマラ語 + アゼルバイジャン語 + バシキール語 + バンダ語 + バミレケ語族 + バルーチー語 + バリ語 + バサ語 + バルト諸語 + ベラルーシ語 + ベジャ語 + ベンバ語 + ベルベル諸語 + ブルガリア語 + ビハール語 + ボージプリー語 + ビスラマ語 + ビコル語 + ビニ語 + シクシカ語 + バンバラ語 + ベンガル語 + バントゥ諸語 + チベット語 + ブルトン語 + ブラジ語 + ボスニア語 + バタク語 + ブリヤート語 + ブギ語 + ビリン語 + カタロニア語 + カドー語 + 中米インディアン諸語 + カリブ語 + コーカサス諸語 + チャワイ語 + チェチェン語 + セブアノ語 + ケルト諸語 + チャモロ語 + チブチャ語 + チャガタイ語 + チューク語 + マリ語 + ビーチ・ラ・マー 等 + チョクトー語 + チペワイアン語 + チェロキー語 + シャイアン語 + チャム語族 + コルシカ語 + コプト語 + 英語が基盤の混成語・混合語 + フランス語が基盤の混成語・混合語 + ポルトガル語が基盤の混成語・混合語 + クリー語 + クリミア・タタール語 + その他の混成語・混合語 + チェコ語 + カシューブ語 + 教会スラブ語 + クシュ諸語 + チュヴァシュ語 + ウェールズ語 + デンマーク語 + ダコタ語 + ダルガン語 + ダヤク語 + ドイツ語 + ドイツ語(オーストリア) + 正統ドイツ語(スイス) + デラウェア語 + スレイビー語 + ドグリブ語 + ディンカ語 + ドグリ語 + ドラヴィダ諸語 + 低ソルビア語 + ドゥアラ語 + 中世オランダ語 + ディベヒ語 + デゥウラ語 + ゾンカ語 + エウェ語 + エフィック語 + 古代エジプト語 + エカジュク語 + ギリシャ語 + エラム語 + 英語 + カナダ英語 + イギリス英語 + アメリカ英語 + 中世英語 + エスペラント語 + スペイン語 + スペイン語(ラテンアメリカ) + スペイン語(イベリア半島) + エストニア語 + バスク語 + エウォンド語 + ペルシア語 + ファング語 + ファンティー語 + フラニ語 + フィンランド語 + フィリピノ語 + フィン・ウゴル諸語 + フィジー語 + フェロー語 + フォン語 + フランス語 + フランス語(カナダ) + フランス語(スイス) + 中期フランス語 + 古フランス語 + 東フリジア語 + フリウリ語 + フリジア語 + アイルランド語 + ガ語 + ガヨ語 + バヤ語 + スコットランド・ゲール語 + ゲルマン諸語 + ゲエズ語 + キリバス語 + ガリシア語 + 中高ドイツ語 + グアラニー語 + 古高ドイツ語 + ゴーンディー語 + ゴロンタロ語 + ゴート語 + グレボ語 + 古代ギリシャ語 + スイスドイツ語(スイス) + グジャラート語 + マン島語 + グウィッチン語 + ハウサ語 + ハイダ語 + ハワイ語 + ヘブライ語 + ヒンディー語 + ヒリガイノン語 + ヒマチャル語 + ヒッタイト語 + フモン語 + ヒリモトゥ語 + クロアチア語 + 上ソルビア語 + ハイチ語 + ハンガリー語 + アタパスカ語 + アルメニア語 + ヘレロ語 + インターリングア語 + イバン語 + インドネシア語 + インターリング語 + イボ語 + 四川イ語 + イジョー語 + イヌピアック語 + イロカノ語 + インド諸語 + 印欧諸語 + イングシ語 + イド語 + イラン語 + イロコイ語族 + アイスランド語 + イタリア語 + イヌクウティトット語 + 日本語 + ロジバン語 + ユダヤ・ペルシア語 + ユダヤ・アラビア語 + ジャワ語 + グルジア語 + カラ・カルパク語 + カビル語 + カチン語 + カジェ語 + カンバ語 + カレン語 + カウィ語 + カバルド語 + カタブ語 + コロ語 + コンゴ語 + カシ語 + コイサン諸語 + コータン語 + キクユ語 + クアニャマ語 + カザフ語 + グリーンランド語 + クメール語 + キンブンドゥ語 + カンナダ語 + 韓国語 + コンカニ語 + コシャエ語 + クペレ語 + カヌリ語 + カラチャイ語 + カレリア語 + クルー語 + クルク語 + カシミール語 + クルド語 + クムク語 + クテナイ語 + コミ語 + コーンウォール語 + キルギス語 + ラテン語 + ラジノ語 + ラフンダー語 + ランバ語 + ルクセンブルク語 + レズギ語 + ガンダ語 + リンブルフ語 + リンガラ語 + ラオ語 + モンゴ語 + ロズィ語 + リトアニア語 + ルバ・カタンガ語 + ルバ・ルルア語 + ルイセーニョ語 + ルンダ語 + ルオ語 + ルシャイ語 + ラトビア語 + マドゥラ語 + マガヒー語 + マイティリー語 + マカッサル語 + マンディンゴ語 + オーストロネシア諸語 + マサイ語 + モクシャ語 + マンダル語 + メンデ語 + マダガスカル語 + 中期アイルランド語 + マーシャル語 + マオリ語 + ミクマク語 + ミナンカバウ語 + その他の言語 + マケドニア語 + モン・クメール諸語 + マラヤーラム語 + モンゴル語 + 満州語 + マニプル語 + マノボ語族 + モルダビア語 + モーホーク語 + モシ語 + マラーティー語 + マレー語 + マルタ語 + 複数言語 + ムンダ語族 + クリーク語 + ミランダ語 + マールワーリー語 + ビルマ語 + マヤ語族 + エルジャ語 + ナウル語 + ナワトル語 + 北米インディアン諸語 + ナポリ語 + ノルウェー語 (ブークモール) + 北ンデベレ語 + 低地ドイツ語、低地サクソン語 + ネパール語 + ネワール語 + ンドンガ語 + ニアス語 + ニジェール・コルドファン諸語 + ニウーエイ語 + オランダ語 + フレミッシュ語 + ノルウェー語 (ニーノシュク) + ノルウェー語 + ノガイ語 + 古ノルド語 + ンコ語 + 南ンデベレ語 + 北部ソト語 + ヌビア語族 + ナバホ語 + 古典ネワール語 + ニャンジャ語、チチェワ語、チェワ語 + ニャムウェジ語 + ニャンコレ語 + ニョロ語 + ンゼマ語 + オック語 + オブジワ語 + オロモ語 + オリヤー語 + オセト語 + オセージ語 + オスマントルコ語 + オトミ語族 + パンジャブ語 + パプア諸語 + パンガシナン語 + パフラヴィ語 + パンパンガ語 + パピアメント語 + パラオ語 + 古代ペルシア語 + フィリピン諸語 + フェニキア語 + パーリ語 + ポーランド語 + ポンペイ語 + プラークリット語族 + 古期プロバンス語 + パシュトゥー語 + ポルトガル語 + ポルトガル語 (ブラジル) + ポルトガル語(イベリア半島) + ケチュア語 + ラージャスターン語 + ラパヌイ語 + ラロトガ語 + レト・ロマン語 + ルンディ語 + ルーマニア語 + ロマンス諸語 + ロマーニー語 + ルート + ロシア語 + アルーマニア語 + ルワンダ語 + サンスクリット語 + サンダウェ語 + ヤクート語 + 南米インディアン諸語 + セイリッシュ語族 + サマリア・アラム語 + ササク語 + サンターリー語 + サルデーニャ語 + シチリア語 + スコットランド語 + シンド語 + 北サーミ語 + セリクプ語 + セム諸語 + サンゴ語 + 古期アイルランド語 + 手まね言語 + セルボ=クロアチア語 + シャン語 + シンハラ語 + シダモ語 + スー語族 + シナ・チベット諸語 + スロバキア語 + スロベニア語 + スラブ諸語 + サモア語 + 南サーミ語 + サーミ諸語 + ルレ・サーミ語 + イナリ・サーミ語 + スコルト・サーミ語 + ショナ語 + ソニンケ語 + ソマリ語 + ソグド語 + ソンガイ語 + アルバニア語 + セルビア語 + スリナム語 + セレル語 + シスワティ語 + ナイル・サハラ諸語 + 南部ソト語 + スンダ語 + スクマ語 + スス語 + シュメール語 + スウェーデン語 + スワヒリ語 + シリア語 + タミール語 + タイ諸語 + テルグ語 + テムネ語 + テレーノ語 + テトゥン語 + タジク語 + タイ語 + ティグリニア語 + ティグレ語 + ティブ語 + トルクメン語 + トケラウ語 + タガログ語 + クリンゴン語 + トリンギット語 + タマシェク語 + ツワナ語 + トンガ語 + トンガ語 (ニアサ) + トク・ピシン語 + トルコ語 + ツォンガ語 + チムシュ語 + タタール語 + トゥンブカ語 + トゥピ語族 + アルタイ諸語 + ツバル語 + トウィ語 + タヒチ語 + トゥヴァ語 + ウドムルト語 + ウイグル語 + ウガリト語 + ウクライナ語 + ウンブンドゥ語 + 非確定 + ウルドゥー語 + ウズベク語 + ヴァイ語 + ベンダ語 + ベトナム語 + ボラピュク語 + ボート語 + ワロン語 + ワカシ語族 + ワッラモ語 + ワライ語 + ワショ語 + ソルビア語族 + ウォロフ語 + カルムイク語 + コサ語 + ヤオ語 + ヤップ語 + イディッシュ語 + ヨルバ語 + ユピック語族 + チワン語 + ザポテック語 + ゼナガ語 + 中国語 + 簡体中国語 + 繁体中国語 + ザンデ語 + ズールー語 + ズニ語 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 世界 + アフリカ + 北米 + 南アメリカ + オセアニア + 西アフリカ + 中央アメリカ + 東アフリカ + 北アフリカ + 中部アフリカ + 南部アフリカ + アメリカ大陸 + 北アメリカ + カリブ海 + 東アジア + 南アジア + 東南アジア + 南ヨーロッパ + オーストラリア・ニュージーランド + メラネシア + ミクロネシア地域 + ポリネシア + 南中央アジア + アジア + 中央アジア + 西アジア + ヨーロッパ + 東ヨーロッパ + 北ヨーロッパ + 西ヨーロッパ + 独立国家共同体 + ラテンアメリカ・カリブ地域 + チャネル諸島 + アンドラ + アラブ首長国連邦 + アフガニスタン + アンティグア・バーブーダ + アンギラ + アルバニア + アルメニア + オランダ領アンティル諸島 + アンゴラ + 南極大陸 + アルゼンチン + 米領サモア + オーストリア + オーストラリア + アルバ島 + オーランド諸島 + アゼルバイジャン + ボスニア・ヘルツェゴビナ + バルバドス + バングラデシュ + ベルギー + ブルキナファソ + ブルガリア + バーレーン + ブルンジ + ベニン + サン・バルテルミー + バミューダ + ブルネイ + ボリビア + ブラジル + バハマ + ブータン + ブーベ島 + ボツワナ + ベラルーシ + ベリーズ + カナダ + ココス (キーリング) 諸島 + コンゴ民主共和国 (キンシャサ) + 中央アフリカ共和国 + コンゴ共和国 (ブラザビル) + スイス + コートジボワール + クック諸島 + チリ + カメルーン + 中国 + コロンビア + コスタリカ + セルビア・モンテネグロ + キューバ + カーボベルデ + クリスマス島 + キプロス + チェコ共和国 + ドイツ + ジブチ + デンマーク + ドミニカ国 + ドミニカ共和国 + アルジェリア + エクアドル + エストニア + エジプト + 西サハラ + エリトリア + スペイン + エチオピア + フィンランド + フィジー + フォークランド諸島 + ミクロネシア + フェロー諸島 + フランス + ガボン + イギリス + グレナダ + グルジア + 仏領ギアナ + ガーンジー + ガーナ + ジブラルタル + グリーンランド + ガンビア + ギニア + グアドループ + 赤道ギニア + ギリシャ + 南ジョージア島・南サンドイッチ諸島 + グアテマラ + グアム + ギニアビサウ + ガイアナ + 香港 + ハード島・マクドナルド諸島 + ホンジュラス + クロアチア + ハイチ + ハンガリー + インドネシア + アイルランド + イスラエル + マン島 + インド + 英領インド洋植民地 + イラク + イラン + アイスランド + イタリア + ジャージー + ジャマイカ + ヨルダン + 日本 + ケニア + キルギスタン + カンボジア + キリバス + コモロ + セントクリストファー・ネイビス + 朝鮮民主主義人民共和国 + 大韓民国 + クウェート + ケイマン諸島 + カザフスタン + ラオス + レバノン + セントルシア + リヒテンシュタイン + スリランカ + リベリア + レソト + リトアニア + ルクセンブルグ + ラトビア + リビア + モロッコ + モナコ + モルドバ + モンテネグロ + セント・マーチン + マダガスカル + マーシャル諸島共和国 + マケドニア + マリ + ミャンマー + モンゴル + マカオ + 北マリアナ諸島 + マルティニーク島 + モーリタニア + モントセラト島 + マルタ + モーリシャス + モルジブ + マラウィ + メキシコ + マレーシア + モザンビーク + ナミビア + ニューカレドニア + ニジェール + ノーフォーク島 + ナイジェリア + ニカラグア + オランダ + ノルウェー + ネパール + ナウル + ニウエ島 + ニュージーランド + オマーン + パナマ + ペルー + 仏領ポリネシア + パプアニューギニア + フィリピン + パキスタン + ポーランド + サンピエール島・ミクロン島 + ピトケアン島 + プエルトリコ + パレスチナ領土 + ポルトガル + パラオ + パラグアイ + カタール + その他のオセアニア + 欧州連合 + レユニオン島 + ルーマニア + セルビア + ロシア + ルワンダ + サウジアラビア + ソロモン諸島 + セーシェル + スーダン + スウェーデン + シンガポール + セントヘレナ + スロベニア + スバールバル諸島・ヤンマイエン島 + スロバキア + シエラレオネ + サンマリノ + セネガル + ソマリア + スリナム + サントメ・プリンシペ + エルサルバドル + シリア + スワジランド + タークス諸島・カイコス諸島 + チャド + フランス領極南諸島 + トーゴ + タイ + タジキスタン + トケラウ諸島 + 東ティモール + トルクメニスタン + チュニジア + トンガ + トルコ + トリニダード・トバゴ + ツバル + 台湾 + タンザニア + ウクライナ + ウガンダ + 米領太平洋諸島 + アメリカ合衆国 + ウルグアイ + ウズベキスタン + バチカン市国 + セントビンセント・グレナディーン諸島 + ベネズエラ + イギリス領ヴァージン諸島 + アメリカ領ヴァージン諸島 + ベトナム + バヌアツ + ウォリス・フツナ + サモア + イエメン + マヨット島 + 南アフリカ + ザンビア + ジンバブエ + 不明な地域 + + + 伝統的ドイツ語正書法(1901) + ドイツ語正書法(1996) + 後期中世フランス語(〜1606) + 初期現代フランス語 + 東アルメニア文語 + 西アルメニア文語 + ブーントリング + 国際音声記号 + ウラル音声記号 + モノトニック + ナティゾーネ方言 + ポリトニック + コンピュータ + 改訂版 + レシア方言 + サホ語 + リバプール方言 + バレンシア方言 + + + 暦法 + 照合 + 通貨 + + + 繁体字中国語 (Big5) + タイ仏教暦 + 中国暦 + 直接著錄 + 簡体字中国語 (GB2312) + 西暦 (グレゴリオ暦) + ユダヤ暦 + イスラム暦 + 太陽イスラム暦 + 和暦 + 電話帳方式 + ピンイン順 + 画数順 + 旧式 + + + ヤード・ポンド法 + メートル法 + + + 言語: {0} + 文字: {0} + 地域: {0} + + + + [ゞ ゝヽ ヾ ぁァ あア ぃィ いイ ぅゥ うウ ヴ ぇェ えエ ぉォ おオ ヵ かカ がガ きキ ぎギ くク ぐグ ヶ けケ げゲ こコ ごゴ さサ ざザ しシ じジ すス ずズ せセ ぜゼ そソ ぞゾ たタ だダ ちチ ぢヂ っッ つツ づヅ てテ でデ とト どド なナ にニ ぬヌ ねネ のノ はハ ばバ ぱパ ひヒ びビ ぴピ ふフ ぶブ ぷプ へヘ べベ ぺペ ほホ ぼボ ぽポ まマ みミ むム めメ もモ ゃャ やヤ ゅュ ゆユ ょョ よヨ らラ りリ るル れレ ろロ ゎヮ わワ ゐヰ ゑヱ をヲ んン 一 丁 七 万-下 不 与 且 世 丘 丙 両 並 中 丸 丹 主 久 乏 乗 乙 九 乱 乳 乾 亀 了 予 争 事 二 互 五 井 亜 亡 交 亨 享-亭 人 仁 今 介 仏 仕 他 付 仙 代-以 仮 仰 仲 件 任 企 伏-休 会 伝 伯 伴 伸 伺 似 但 位-佐 体 何 余 作 佳 併 使 例 侍 供 依 価 侮 侯 侵 便 係 促 俊 俗 保 信 修 俳 俵 俸 倉 個 倍 倒 候 借 倣 値 倫 倹 偉 偏 停 健 側-偶 偽 傍 傑 傘 備 催 債 傷 傾 働 像 僕 僚 僧 儀 億 儒 償 優 元-兆 先 光 克 免 児 党 入 全 八-六 共 兵 具 典 兼 内 円 冊 再 冒 冗 写 冠 冬 冷 准 凍 凝 凡 処 凶 凸-出 刀 刃 分-刈 刊 刑 列 初 判 別 利 到 制-券 刺 刻 則 削 前 剖 剛 剣 剤 副 剰 割 創 劇 力 功 加 劣 助 努 励 労 効 劾 勅 勇 勉 動 勘 務 勝 募 勢 勤 勧 勲 勺 匁 包 化 北 匠 匹-医 匿 十 千 升 午 半 卑-協 南 単 博 占 印 危 即-卵 卸 厄 厘 厚 原 厳 去 参 又 及-収 叔 取 受 叙 口-句 叫 召 可 台 史 右 号 司 各 合 吉 同-向 君 吟 否 含 吸 吹 呈-告 周 味 呼 命 和 咲 哀 品 員 哲 唆 唇 唐 唯 唱 商 問 啓 善 喚 喜 喝 喪 喫 営 嗣 嘆 嘉 嘱 器 噴 嚇 囚 四 回 因 団 困 囲 図 固 国 圏 園 土 圧 在 地 坂 均 坊 坑 坪 垂 型 垣 埋 城 域 執 培 基 堀 堂 堅 堕 堤 堪 報 場 塀 塁 塊 塑 塔 塗 塚 塩 塾 境 墓 増 墜 墨 墳 墾 壁 壇 壊 壌 士 壮 声-売 変 夏 夕 外 多 夜 夢 大 天-夫 央 失 奇 奉 奏 契 奔 奥 奨 奪 奮 女 奴 好 如-妄 妊 妙 妥 妨 妹 妻 姉 始 姓 委 姫 姻 姿 威 娘 娠 娯 婆 婚 婦 婿 媒 嫁 嫌 嫡 嬢 子 孔 字 存 孝 季 孤 学 孫 宅 宇-安 完 宗-定 宜 宝 実 客-室 宮 宰 害-家 容 宿 寂 寄 密 富 寒 寛 寝 察 寡 寧 審 寮 寸 寺 対 寿 封 専 射 将 尉-尋 導 小 少 尚 就 尺 尼-局 居 屈 届 屋 展 属 層 履 屯 山 岐 岩 岬 岳 岸 峠 峡 峰 島 崇 崎 崩 川 州 巡 巣 工-巨 差 己 巻 市 布 帆 希 帝 帥 師 席 帯 帰 帳 常 帽 幅 幕 幣 干-年 幸 幹 幻-幾 庁 広 床 序 底 店 府 度 座 庫 庭 庶-庸 廃 廉 廊 延 廷 建 弁 弊 式 弐 弓-引 弘 弟 弦 弧 弱 張 強 弾 当 形 彩 彫 彰 影 役 彼 往 征 径 待 律 後 徐 徒 従 得 御 復 循 微 徳 徴 徹 心 必 忌 忍 志-忙 応 忠 快 念 怒 怖 思 怠 急 性 怪 恋 恐 恒 恥 恨 恩 恭 息 恵 悔 悟 悠 患 悦 悩 悪 悲 悼 情 惑 惜 惨 惰 想 愁 愉 意 愚 愛 感 慈 態 慌 慎 慕 慢 慣 慨 慮 慰 慶 憂 憎 憤 憩 憲 憶 憾 懇 懐 懲 懸 成-戒 戦 戯 戸 戻 房 所 扇 扉 手 才 打 払 扱 扶 批 承 技 抄 把 抑 投 抗 折 抜 択 披 抱 抵 抹 押 抽 担 拍 拐 拒 拓 拘 拙 招 拝 拠 拡 括 拷 拾 持 指 挑 挙 挟 振 挿 捕 捜 捨 据 掃 授 掌 排 掘 掛 採 探 接 控 推 措 掲 描 提 揚 換 握 揮 援 揺 損 搬 搭 携 搾 摂 摘 摩 撃 撤 撮 撲 擁 操 擦 擬 支 改 攻 放 政 故 敏 救 敗 教 敢 散 敬 数 整 敵 敷 文 斉 斎 斗 料 斜 斤 斥 断 新 方 施 旅 旋 族 旗 既 日 旧-早 旬 昆 昇 昌 明 易 昔 星 映 春 昨 昭 是 昼 時 晩 普 景 晴 晶 暁 暇 暑 暖 暗 暦 暫 暮 暴 曇 曜 曲 更 書 曹 替 最 月 有 服 朕 朗 望 朝 期 木 未-札 朱 朴 机 朽 杉 材 村 束 条 来 杯 東 松 板 析 林 枚 果 枝 枠 枢 枯 架 柄 某 染 柔 柱 柳 査 栄 栓 校 株 核 根 格 栽 桃 案 桑 桜 桟 梅 械 棄 棋 棒 棚 棟 森 棺 植 検 業 極 楼 楽 概 構 様 槽 標 模 権 横 樹 橋 機 欄 欠 次 欧 欲 欺 款 歌 歓 止 正 武 歩 歯 歳 歴 死 殉-残 殖 殴 段 殺 殻 殿 母 毎 毒 比 毛 氏 民 気 水 氷 永 汁 求 汗 汚 江 池 決 汽 沈 沖 没 沢 河 沸 油 治 沼 沿 況 泉 泊 泌 法 泡-泣 泥 注 泰 泳 洋 洗 洞 津 洪 活 派 流 浄 浅 浜 浦 浪 浮 浴 海 浸 消 涙 涯 液 涼 淑 淡 深 混 添 清 渇-渉 渋 渓 減 渡 渦 温 測 港 湖 湯 湾-満 源 準 溝 溶 滅 滋 滑 滝 滞 滴 漁 漂 漆 漏 演 漠 漢 漫 漬 漸 潔 潜 潟 潤 潮 澄 激 濁 濃 濫 濯 瀬 火 灯 灰 災 炉 炊 炎 炭 点 為 烈 無 焦 然 焼 煙 照 煩 煮 熟 熱 燃 燥 爆 爵 父 片 版 牛 牧 物 牲 特 犠 犬 犯 状 狂 狩 独 狭 猛 猟 猫 献 猶 猿 獄 獣 獲 玄 率 玉 王 珍 珠 班 現 球 理 琴 環 璽 瓶 甘 甚 生 産 用 田-申 男 町 画 界 畑 畔 留 畜 畝 略 番 異 畳 疎 疑 疫 疲 疾 病 症 痘 痛 痢 痴 療 癒 癖 発 登 白 百 的 皆 皇 皮 皿 盆 益 盗 盛 盟 監 盤 目 盲 直 相 盾 省 看 県 真 眠 眺 眼 着 睡 督 瞬 矛 矢 知 短 矯 石 砂 研 砕 砲 破 硝 硫 硬 碁 碑 確 磁 磨 礁 礎 示 礼 社 祈 祉 祖 祚 祝 神 祥 票 祭 禁 禄 禅 禍-福 秀 私 秋 科 秒 秘 租 秩 称 移 程 税 稚 種 稲 稼 稿 穀 穂 積 穏 穫 穴 究 空 突 窃 窒 窓 窮 窯 立 竜 章 童 端 競 竹 笑 笛 符 第 筆 等 筋 筒 答 策 箇 算 管 箱 節 範 築 篤 簡 簿 籍 米 粉 粋 粒 粗 粘 粛 粧 精 糖 糧 糸 系 糾 紀 約 紅 紋 納 純 紙-紛 素-索 紫 累 細 紳 紹 紺 終 組 経 結 絞 絡 給 統 絵 絶 絹 継 続 維 綱 網 綿 緊 総 緑 緒 線 締 編 緩 緯 練 縁 縄 縛 縦 縫 縮 績 繁 繊 織 繕 繭 繰 缶 罪 置 罰 署 罷 羅 羊 美 群 義 羽 翁 翌 習 翻 翼 老 考 者 耐 耕 耗 耳 聖 聞 聴 職 肉 肌 肖 肝 肢 肥 肩 肪 肯 育 肺 胃 胆 背 胎 胞 胴 胸 能 脂 脅 脈 脚 脱 脳 脹 腐 腕 腰 腸 腹 膚 膜 膨 臓 臣 臨 自 臭 至 致 興 舌 舎 舗 舞 舟 航 般 舶 船 艇 艦 良 色 芋 芝 花 芳 芸 芽 苗 若 苦 英 茂 茎 茶 草 荒 荘 荷 菊 菌 菓 菜 華 落 葉 著 葬 蒸 蓄 蔵 薄 薦 薪-薬 藩 藻 虐 虚 虜 虞 虫 蚊 蚕 蛇 蛍 蛮 融 血 衆 行 術 街 衛 衝 衡 衣 表 衰 衷 袋 被 裁 裂 装 裏 裕 補 裸 製 複 褐 褒 襟 襲 西 要 覆 覇 見 規 視 覚 覧 親 観 角 解 触 言 訂 計 討 訓 託 記 訟 訪 設 許 訳 訴 診 証 詐 詔 評 詞 詠 試 詩 詰-詳 誇 誉 誌 認 誓 誕 誘 語 誠 誤 説 読 課 調 談 請 論 諭 諮 諸 諾 謀 謁 謄 謙 講 謝 謡 謹 識 譜 警 議 譲 護 谷 豆 豊 豚 象 豪 貝 貞 負-貢 貧-販 貫 責 貯 貴 買 貸 費 貿 賀 賃 賄 資 賊 賓 賛 賜 賞 賠 賢 賦 質 購 贈 赤 赦 走 赴 起 超 越 趣 足 距 跡 路 跳 践 踊 踏 躍 身 車 軌 軍 軒 軟 転 軸 軽 較 載 輝 輩 輪 輸 轄 辛 辞 辱 農 辺 込 迅 迎 近 返 迫 迭 述 迷 追 退 送 逃 逆 透 逐 逓 途 通 逝 速 造 連 逮 週 進 逸 遂 遅 遇 遊 運 遍 過 道-違 遠 遣 適 遭 遮 遵 遷 選 遺 避 還 邦 邪 邸 郊 郎 郡 部 郭 郵 郷 都 酌 配 酒 酔 酢 酪 酬 酵 酷 酸 醜 醸 釈 里-量 金 針 釣 鈍 鈴 鉄 鉛 鉢 鉱 銀 銃 銅 銑 銘 銭 鋭 鋳 鋼 錘 錠 錬 錯 録 鍛 鎖 鎮 鏡 鐘 鑑 長 門 閉 開 閑 間 関 閣 閥 閲 闘 防 阻 附 降 限 陛 院-陥 陪 陰 陳 陵 陶 陸 険 陽 隅 隆 隊 階 随 隔 際 障 隠 隣 隷 隻 雄-雇 雉 雌 雑 離 難 雨 雪 雰 雲 零 雷 電 需 震 霊 霜 霧 露 青 静 非 面 革 靴 韓 音 韻 響 頂 項 順 預-頒 領 頭 頻 頼 題 額 顔 顕 願 類 顧 風 飛 食 飢 飯 飲 飼-飾 養 餓 館 首 香 馬 駄-駆 駐 騎 騒 験 騰 驚 骨 髄 高 髪 鬼 魂 魅 魔 魚 鮮 鯨 鳥 鳴 鶏 麗 麦 麻 黄 黒 黙 鼓 鼻 齢] + [兌 拼 楔 錄 鳯] + [a-z] + + + + + + + + + GanjkHmsSEDFwWxhKzAeugXZvcL + + + + + + 1月 + 2月 + 3月 + 4月 + 5月 + 6月 + 7月 + 8月 + 9月 + 10月 + 11月 + 12月 + + + 1月 + 2月 + 3月 + 4月 + 5月 + 6月 + 7月 + 8月 + 9月 + 10月 + 11月 + 12月 + + + + + 1月 + 2月 + 3月 + 4月 + 5月 + 6月 + 7月 + 8月 + 9月 + 10月 + 11月 + 12月 + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + + + + + + + + + + 日曜日 + 月曜日 + 火曜日 + 水曜日 + 木曜日 + 金曜日 + 土曜日 + + + + + + + + + + + + + + + + + + Q1 + Q2 + Q3 + Q4 + + + 第1四半期 + 第2四半期 + 第3四半期 + 第4四半期 + + + + + 1 + 2 + 3 + 4 + + + + 午前 + 午後 + + + 紀元前 + 西暦 + + + 紀元前 + 西暦 + + + + + + yyyy年M月d日EEEE + + + + + yyyy年M月d日 + + + + + yyyy/MM/dd + + + + + yy/MM/dd + + + + + + + H時mm分ss秒v + + + + + HH:mm:ssz + + + + + H:mm:ss + + + + + H:mm + + + + + + + {1} {0} + + + + d日(EEE) + GGGGy年M月d日 + H時 + H:mm + L + M/d(E) + LLL + M月d日(E) + M月d日(E) + M月d日 + M月d日 + MM/dd + M/d + d日 + mm:ss + mm:ss + y + y/M + y/M/d(EEE) + y年M月 + y年M月d日(EEE) + y年M月 + y/Q + yyyyQQQ + y年M月 + yy/Q + y年 + yyyy/MM + + + {0}~{1} + + M月~M月 + + + MM/dd(E)~MM/dd(E) + MM/dd(E)~MM/dd(E) + + + M月~M月 + + + M月d日(E)~M月d日(E) + M月d日(E)~d日(E) + + + LLLL~LLLL + + + M月d日~M月d日 + M月d日~d日 + + + MM/dd~MM/dd + MM/dd~MM/dd + + + d日~d日 + + + H時~H時 + H時~H時 + + + H時mm分~H時mm分 + H時mm分~H時mm分 + H時mm分~H時mm分 + + + H時mm分~H時mm分v + H時mm分~H時mm分v + H時mm分~H時mm分v + + + H時~H時v + H時~H時v + + + y年~y年 + + + yy/MM~yy/MM + yy/MM~yy/MM + + + yy/MM/dd(E)~yy/MM/dd(E) + yy/MM/dd(E)~yy/MM/dd(E) + yy/MM/dd(E)~yy/MM/dd(E) + + + y年M月~M月 + y年M月~y年M月 + + + y年M月d日(E)~M月d日(E) + y年M月d日(E)~d日(E) + y年M月d日(E)~y年M月d日(E) + + + y年M月~M月 + y年M月~y年M月 + + + y年M月d日~M月d日 + y年M月d日~d日 + y年M月d日~y年M月d日 + + + yy/MM/dd~yy/MM/dd + yy/MM/dd~yy/MM/dd + yy/MM/dd~yy/MM/dd + + + + + + 時代 + + + + + + + + + + + + + 今日 + 明日 + 明後日 + 昨日 + 一昨日 + + + 曜日 + + + 午前/午後 + + + + + + + + + + + + タイムゾーン + + + + + + + 大化 + 白雉 + 白鳯 + 朱鳥 + 大宝 + 慶雲 + 和銅 + 霊亀 + 養老 + 神亀 + 天平 + 天平感宝 + 天平勝宝 + 天平宝字 + 天平神護 + 神護景雲 + 宝亀 + 天応 + 延暦 + 大同 + 弘仁 + 天長 + 承和 + 嘉祥 + 仁寿 + 斉衡 + 天安 + 貞観 + 元慶 + 仁和 + 寛平 + 昌泰 + 延喜 + 延長 + 承平 + 天慶 + 天暦 + 天徳 + 応和 + 康保 + 安和 + 天禄 + 天延 + 貞元 + 天元 + 永観 + 寛和 + 永延 + 永祚 + 正暦 + 長徳 + 長保 + 寛弘 + 長和 + 寛仁 + 治安 + 万寿 + 長元 + 長暦 + 長久 + 寛徳 + 永承 + 天喜 + 康平 + 治暦 + 延久 + 承保 + 承暦 + 永保 + 応徳 + 寛治 + 嘉保 + 永長 + 承徳 + 康和 + 長治 + 嘉承 + 天仁 + 天永 + 永久 + 元永 + 保安 + 天治 + 大治 + 天承 + 長承 + 保延 + 永治 + 康治 + 天養 + 久安 + 仁平 + 久寿 + 保元 + 平治 + 永暦 + 応保 + 長寛 + 永万 + 仁安 + 嘉応 + 承安 + 安元 + 治承 + 養和 + 寿永 + 元暦 + 文治 + 建久 + 正治 + 建仁 + 元久 + 建永 + 承元 + 建暦 + 建保 + 承久 + 貞応 + 元仁 + 嘉禄 + 安貞 + 寛喜 + 貞永 + 天福 + 文暦 + 嘉禎 + 暦仁 + 延応 + 仁治 + 寛元 + 宝治 + 建長 + 康元 + 正嘉 + 正元 + 文応 + 弘長 + 文永 + 建治 + 弘安 + 正応 + 永仁 + 正安 + 乾元 + 嘉元 + 徳治 + 延慶 + 応長 + 正和 + 文保 + 元応 + 元亨 + 正中 + 嘉暦 + 元徳 + 元弘 + 建武 + 延元 + 興国 + 正平 + 建徳 + 文中 + 天授 + 康暦 + 弘和 + 元中 + 至徳 + 嘉慶 + 康応 + 明徳 + 応永 + 正長 + 永享 + 嘉吉 + 文安 + 宝徳 + 享徳 + 康正 + 長禄 + 寛正 + 文正 + 応仁 + 文明 + 長享 + 延徳 + 明応 + 文亀 + 永正 + 大永 + 享禄 + 天文 + 弘治 + 永禄 + 元亀 + 天正 + 文禄 + 慶長 + 元和 + 寛永 + 正保 + 慶安 + 承応 + 明暦 + 万治 + 寛文 + 延宝 + 天和 + 貞享 + 元禄 + 宝永 + 正徳 + 享保 + 元文 + 寛保 + 延享 + 寛延 + 宝暦 + 明和 + 安永 + 天明 + 寛政 + 享和 + 文化 + 文政 + 天保 + 弘化 + 嘉永 + 安政 + 万延 + 文久 + 元治 + 慶応 + 明治 + 大正 + 昭和 + 平成 + + + + + + Gy年M月d日EEEE + + + + + Gy年M月d日 + + + + + Gyy/MM/dd + + + + + Gyy/MM/dd + + + + + + + HH:mm:ssz + + + + + + d日(EEE) + M月d日(EEE) + Gy年 + Gyy/MM + Gy年M月 + Gyy/Q + Gy年 + + + + + + + 民国前 + 民国 + + + + + + Gy年M月d日EEEE + + + + + Gy年M月d日EEEE + + + + + Gyy/MM/dd(EE) + + + + + Gyy/MM/dd(E) + + + + + + + +HH:mm;-HH:mm + GMT{0} + {0}時間 + + 不明 + + + アンドラ公国 + + + ドバイ + + + カブール + + + アンチグア + + + アンギラ + + + チラナ + + + エレバン + + + キュラソー + + + ルアンダ + + + ロデラ + + + パーマー + + + 南極点 + + + 昭和基地 + + + モーソン + + + デービス + + + ボストーク + + + ケーシー + + + デュモン デュルビル + + + マクムード + + + リオガイェゴス + + + メンドーサ + + + サンファン + + + ウスアイア + + + ラリオハ + + + サンルイス + + + カタマルカ + + + フフイ + + + トゥクマン + + + コルドバ + + + ブエノスアイレス + + + パゴパゴ + + + ウィーン + + + パース + + + ユークラ + + + ダーウィン + + + アデレード + + + ブロークンヒル + + + カリー + + + メルボルン + + + ホバート + + + リンデマン + + + シドニー + + + ブリスベン + + + ロードハウ + + + アルバ + + + バクー + + + バルバドス + + + ダッカ + + + ブリュッセル + + + ワガドゥグー + + + ソフィア + + + バーレーン国 + + + ブジュンブラ + + + ポルトノボ + + + バミューダ + + + ブルネイ + + + ラパス + + + エイルネペ + + + リオブランコ + + + ポルトベーリョ + + + ボアビスタ + + + マナウス + + + クイアバ + + + カンポグランデ + + + ベレン + + + アラグァイナ + + + サンパウロ + + + バイーア + + + フォルタレザ + + + マセイオ + + + レシフェ + + + ノロニャ + + + ナッサウ + + + ティンプー + + + ガボローネ + + + ミンスク + + + ベリーズ + + + ドーソン + + + ホワイトホース + + + イヌヴィク + + + バンクーバー + + + ドーソンクリーク + + + イエローナイフ + + + エドモントン + + + スウィフトカレント + + + ケンブリッジベイ + + + レジャイナ + + + ウィニペグ + + + レソリュート + + + レイニーリバー + + + ランキン湾 + + + コーラルハーバー + + + サンダーベイ + + + ニピゴン + + + トロント + + + モントリオール + + + イカルイット + + + パンナータング + + + モンクトン + + + ハリファクス + + + グースベイ + + + グレースベイ + + + ブラン・サブロン + + + セントジョンズ + + + ココス + + + キンシャサ + + + ルブンバシ + + + バンギ + + + ブラザビル + + + チューリッヒ + + + アビジャン + + + ラロトンガ + + + イースター島 + + + アメリカ/サンチアゴ + + + ドゥアラ + + + カシガル + + + ウルムチ + + + 重慶 + + + 上海 + + + ハルビン + + + ボゴタ + + + コスタリカ共和国 + + + ハバナ + + + カボベルデ共和国 + + + クリスマス + + + ニコシア + + + ベルリン + + + ジブチ共和国 + + + コペンハーゲン + + + ドミニカ国 + + + サントドミンゴ + + + アルジェ + + + ガラパゴス + + + アメリカ/グアヤキル + + + タリン + + + カイロ + + + アイウン + + + アスマラ + + + カナリア諸島 + + + セウタ + + + ヨーロッパ/マドリード + + + アジスアベバ + + + ヘルシンキ + + + フィジー共和国 + + + スタンリー + + + トラック + + + ポナペ + + + コシャエ + + + フェロー + + + パリ + + + リーブルビル + + + ヨーロッパ/ロンドン + + + グレナダ + + + トビリシ + + + カイエンヌ + + + アクラ + + + ジブラルタル + + + チューレ + + + アメリカ/ゴッドホープ + + + スコレスビスン + + + デンマークシャウン + + + バンジュル + + + コナクリ + + + グアダループ + + + マラボ + + + アテネ + + + 南ジョージア島 + + + グァテマラ共和国 + + + グアム + + + ビサウ + + + ガイアナ + + + 香港 + + + ポルトープランス + + + ブダペスト + + + ジャカルタ + + + ポンティアナク + + + マカッサル + + + ジャヤプラ + + + ダブリン + + + エルサレム + + + チャゴス + + + バグダッド + + + テヘラン + + + レイキャビーク + + + ローマ + + + ジャマイカ + + + アンマン + + + 東京 + + + ナイロビ + + + ビシュケク + + + プノンペン + + + エンダベリー + + + キリティマティ + + + タラワ + + + コモロ + + + セントキッツネイビス + + + 平壌 + + + ソウル + + + クウェート国 + + + ケイマン + + + アクタウ + + + オラル + + + アクトベ + + + キジルオルダ + + + アルマトイ + + + ビエンチャン + + + ベイルート + + + セントルシア + + + ファドゥーツ + + + コロンボ + + + モンロビア + + + マセル + + + ヴィルニアス + + + ルクセンブルグ大公国 + + + リガ + + + トリポリ + + + カサブランカ + + + モナコ公国 + + + キシナウ + + + アンタナナリボ + + + クワジェリン + + + マジュロ + + + アフリカ/バマコ + + + ラングーン + + + ホブド + + + ウランバートル + + + チョイバルサン + + + マカオ + + + サイパン + + + マルチニーク + + + ヌアクショット + + + モントセラト島 + + + マルタ共和国 + + + モーリシャス共和国 + + + モルディブ共和国 + + + ブランタイア + + + ティフアナ + + + エルモシヨ + + + マサトラン + + + チワワ + + + モンテレイ + + + メキシコシティー + + + メリダ + + + カンクン + + + アジア/クアラルンプール + + + クチン + + + マプト + + + ビントフック + + + ヌメア + + + ニアメー + + + ノーフォーク + + + ラゴス + + + マナグア + + + アムステルダム + + + オスロ + + + カトマンズ + + + ナウル共和国 + + + ニウエ + + + チャタム + + + 太平洋/オークランド + + + マスカット + + + パナマ共和国 + + + リマ + + + 太平洋/タヒチ + + + マルケサス + + + ガンビア + + + ポートモレスビー + + + マニラ + + + カラチ + + + ワルシャワ + + + ミクロン + + + ピトケアン島 + + + プエルトリコ + + + ガザ + + + アゾレス諸島 + + + マデイラ + + + ヨーロッパ/リスボン + + + パラオ共和国 + + + アスンシオン + + + カタール + + + レユニオン + + + ブカレスト + + + カリーニングラード + + + モスクワ + + + ボルゴグラード + + + サマラ + + + エカテリンブルグ + + + オムスク + + + ノボシビルスク + + + クラスノヤルスク + + + イルクーツク + + + ヤクーツク + + + ウラジオストク + + + サハリン + + + マガダン + + + カムチャッカ + + + アナジル + + + キガリ + + + リヤド + + + ガダルカナル + + + マエ + + + ハルツーム + + + ストックホルム + + + シンガポール + + + セントヘレナ + + + 北極/ロングイヤービーエン + + + フリータウン + + + ダカール + + + モガディシュ + + + パラマリボ + + + サントメ + + + サルバドル + + + ダマスカス + + + ムババネ + + + グランドターク + + + ンジャメナ + + + ケルゲレーヌ + + + ロメ + + + バンコク + + + ドゥシャンベ + + + ファカオフォ + + + ディリ + + + アシガバード + + + チュニジア + + + トンガタプ + + + イスタンブール + + + ポートオブスペイン + + + フナフティ + + + 台北 + + + ダルエスサラーム + + + ウジゴロド + + + キエフ + + + シンフェローポリ + + + ザポロージェ + + + カンパラ + + + ミッドウェー + + + ジョンストン + + + ウェーク + + + アダック + + + ノーメ + + + ホノルル + + + アンカレッジ + + + ヤクタット + + + ジュノー + + + ロサンゼルス + + + ボイシ + + + フェニックス + + + シップロック + + + デンバー + + + ノースダコタ州ニューセーラム + + + ノースダコタ州センター + + + シカゴ + + + メノミニー + + + インディアナ州ビンセンス + + + インディアナ州ピーターズバーグ + + + インディアナ州テルシティ + + + インディアナ州ノックス + + + インディアナ州ウィナマック + + + インディアナ州マレンゴ + + + インディアナポリス + + + ルイスビル + + + インディアナ州ビベー + + + ケンタッキー州モンティチェロ + + + デトロイト + + + ニューヨーク + + + モンテビデオ + + + サマルカンド + + + アジア/タシケント + + + セントヴィンセント + + + カラカス + + + トルトーラ + + + セントトマス + + + サイゴン + + + エファテ + + + ワリー + + + アピーア + + + アデン + + + マイヨット島 + + + ヨハネスブルグ + + + ルサカ + + + ハラーレ + + + + 中央アフリカ時間 + 中央アフリカ時間 + + + + + 東アフリカ時間 + 東アフリカ時間 + + + + + 南アフリカ時間 + 南アフリカ標準時 + + + + + 西アフリカ時間 + 西アフリカ時間 + 西アフリカ夏時間 + + + + + アラスカ時間 + アラスカ標準時 + アラスカ夏時間 + + + + + アマゾン時間 + アマゾン夏時間 + + + + + アメリカ中部時間 + アメリカ中部標準時 + アメリカ中部夏時間 + + + + + アメリカ東部時間 + アメリカ東部標準時 + アメリカ東部夏時間 + + + + + アメリカ山地時間 + アメリカ山地標準時 + アメリカ山地夏時間 + + + + + アメリカ太平洋時間 + アメリカ太平洋標準™‚ + アメリカ太平洋夏時間 + + + + + アルゼンチン時間 + アルゼンチン夏時間 + + + + + 大西洋時間 + 大西洋標準時 + 大西洋夏時間 + + + + + ブラジリア時間 + ブラジリア夏時間 + + + + + 中国標準時 + 中国夏時間 + + + + + 中欧標準時 + 中欧夏時間 + + + + + 東欧標準時 + 東欧夏時間 + + + + + グリニッジ標準時 + + + + + イスラエル標準時 + イスラエル夏時間 + + + + + 日本標準時 + 日本夏時間 + + true + + + + ニューファンドランド島標準時 + ニューファンドランド島夏時間 + + + + + + + . + , + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + ¤#,##0.00 + + + + + + アンドラ ペセタ + + + UAE ディルハム + + + アフガニー (1927-2002) + + + アフガニー + Af + + + アルバニア レク + lek + + + アルメニア ドラム + dram + + + オランダ領アンティル ギルダー + NA f. + + + クワンザ + + + クワンザ (1977-1990) + + + アンゴラ 新クワンザ (1990-2000) + + + アンゴラ 旧クワンザ (1995-1999) + + + アルゼンチン アゥストラール + + + アルゼンチン ペソ (1983-1985) + + + アルゼンチン ペソ + Arg$ + + + オーストリア シリング + + + オーストラリア ドル + $A + + + アルバ ギルダー + + + アゼルバイジャン マナト (1993-2006) + + + アゼルバイジャン マナト + + + ボスニア ディナール + + + ボスニア マルク (BAM) + KM + + + バルバドス ドル + BDS$ + + + バングラデシュ タカ + Tk + + + ベルギー フラン (BEC) + + + ベルギー フラン + BF + + + ベルギー フラン (BEL) + + + ブルガリア レフ + lev + + + ブルガリア 新レフ + + + バーレーン ディナール + BD + + + ブルンジ フラン + Fbu + + + バミューダ ドル + Ber$ + + + ブルネイ ドル + + + ボリビアーノ + Bs + + + ボリビア ペソ + + + ボリビア Mvdol + + + ブラジル 新クルゼイロ (1967-1986) + + + ブラジル クルゼイロ + + + ブラジル クルゼイロ (1990-1993) + + + ブラジル レアル + + + ブラジル 新クルゼイロ + + + ブラジル クルゼイロ レアル + + + バハマ ドル + + + ブータン ニュルタム + Nu + + + ビルマ チャット + + + ボツワナ プラ + + + ベラルーシ ルーブル (1994-1999) + + + ベラルーシ ルーブル + Rbl + + + ベリーズ ドル + BZ$ + + + カナダ ドル + Can$ + + + コンゴ フラン + + + WIR ユーロ + + + スイス フラン + SwF + + + WIR フラン + + + チリ ウニダ デ フォメント + + + チリ ペソ + Ch$ + + + 中国人民元 + + + + コロンビア ペソ + Col$ + + + レアル (UVR) + + + コスタリカ コロン + C + + + セルビアン ディナール + + + チェコスロバキア コルナ + + + キューバ ペソ + + + カーボベルデ エスクード + CVEsc + + + キプロス ポンド + £C + + + チェコ コルナ + + + 東ドイツ マルク + + + ドイツ マルク + + + ジブチ フラン + DF + + + デンマーク クローネ + DKr + + + ドミニカ ペソ + RD$ + + + アルジェリア ディナール + DA + + + エクアドル スクレ + CS + + + エクアドル UVC + + + エストニア クルーン + + + エジプト ポンド + + + エクウェレ + + + エリトリア ナクファ + + + スペインペセタ + + + スペイン 兌換ペセタ + + + スペイン ペセタ + + + + エチオピア ブル + Br + + + ユーロ + + + フィンランド マルカ + + + フィジー諸島 ドル + F$ + + + フォークランド(マルビナス)諸島 ポンド + + + フランス フラン + + + 英国ポンド + £ + + + グルジア クーポン ラリ + + + グルジア ラリ + lari + + + ガーナ セディ (1979-2007) + + + ガーナ セディ + + + ジブラルタル ポンド + + + ガンビア ダラシ + + + ギニア フラン + GF + + + ギニア シリー + + + 赤道ギニア ギニー + + + ギリシャ ドラクマ + + + グアテマラ ケツァル + Q + + + ポルトガル領ギニア エスクード + + + ギニアビサウ ペソ + + + ガイアナ ドル + G$ + + + 香港ドル + HK$ + + + ホンジュラス レンピラ + L + + + クロアチア ディナール + + + クロアチア クーナ + + + ハイチ グールド + + + ハンガリー フォリント + Ft + + + インドネシア ルピア + Rp + + + アイリッシュ ポンド + IR£ + + + イスラエル ポンド + + + イスラエル新シェケル + + + インド ルピー + INR + + + イラク ディナール + ID + + + イラン リアル + RI + + + アイスランド クローナ + + + イタリア リラ + + + + ジャマイカ ドル + J$ + + + ヨルダン ディナール + JD + + + 日本円 + + + + ケニア シリング + K Sh + + + キルギスタン ソム + som + + + カンボジア リエル + CR + + + コモロ フラン + CF + + + 北朝鮮 ウォン + + + 韓国 ウォン + + + + クウェート ディナール + KD + + + ケイマン諸島 ドル + + + カザフスタン テンゲ + T + + + ラオス キープ + + + レバノン ポンド + LL + + + スリランカ ルピー + SL Re + + + リベリア ドル + + + レソト ロティ + M + + + マロティ + + + リトアニア リタス + + + リトアニア タロナ + + + ルクセンブルク 兌換フラン + + + ルクセンブルグ フラン + + + ルクセンブルク 金融フラン + + + ラトビア ラッツ + + + ラトビア ルーブル + + + リビア ディナール + LD + + + モロッコ ディルハム + + + モロッコ フラン + + + モルドバ レイ + + + マダガスカル アリアリ + + + マダガスカル フラン + + + マケドニア デナル + MDen + + + マリ フラン + + + ミャンマー チャット + + + モンゴル トグログ + Tug + + + マカオ パタカ + + + モーリタニア ウギア + UM + + + マルタ リラ + Lm + + + マルタ ポンド + + + モーリシャス ルピー + + + モルディブ諸島 ルフィア + + + マラウィ クワチャ + MK + + + メキシコ ペソ + MEX$ + + + メキシコ ペソ (1861-1992) + + + メキシコ UDI + + + マレーシア リンギット + RM + + + モザンピーク エスクード + + + モザンピーク メティカル + Mt + + + モザンビーク メティカル + MTn + + + ナミビア ドル + N$ + + + ナイジェリア ナイラ + + + ニカラグア コルドバ + + + ニカラグア コルドバ オロ + + + オランダ ギルダー + + + ノルウェー クローネ + NKr + + + ネパール ルピー + Nrs + + + ニュージーランド ドル + $NZ + + + オマーン リアル + RO + + + パナマ バルボア + + + ペルー インティ + + + ペルー 新ソル + + + ペルー ソル + + + パプアニューギニア キナ + + + フィリピン ペソ + Php + + + パキスタン ルピー + Pra + + + ポーランド ズウォティ + Zl + + + ポーランド ズウォティ (1950-1995) + + + ポルトガル エスクード + + + パラグアイ グアラニ + + + カタール リアル + QR + + + ローデシア ドル + + + ルーマニア 旧レイ + 0#Old lei|1#Old leu|1 + + + ルーマニア レイ + 0#lei|1#leu|1 + + + ディナール (セルビア) + + + ロシア ルーブル + + + ロシア ルーブル (1991-1998) + + + ルワンダ フラン + + + サウジ リヤル + SRl + + + ソロモン諸島 ドル + SI$ + + + セイシェル ルピー + SR + + + スーダン ディナール + + + スーダン ポンド + + + 旧スーダン ポンド + + + スウェーデン クローナ + SKr + + + シンガポール ドル + S$ + + + セントヘレナ島 ポンド + + + スロベニア トラール + + + スロバキア コルナ + Sk + + + シエラレオネ レオン + + + ソマリア シリング + Sh. + + + スリナム ドル + + + スリナム ギルダー + Sf + + + サントメ・プリンシペ ドブラ + Db + + + ソ連 ルーブル + + + エルサルバドル コロン + + + シリア ポンド + LS + + + スワジランド リランゲニ + E + + + タイ バーツ + + + タジキスタン ルーブル + + + タジキスタン ソモニ + + + トルクメニスタン マナト + + + チュニジア ディナール + + + トンガ パ・アンガ + T$ + + + ティモール エスクード + + + トルコ リラ + TL + + + 新トルコリラ + + + トリニダードトバゴ ドル + TT$ + + + 新台湾ドル + NT$ + + + タンザニア シリング + T Sh + + + ウクライナ グリブナ + + + ウクライナ カルボバネツ + + + ウガンダ シリング (1966-1987) + + + ウガンダ シリング + U Sh + + + 米ドル + $ + + + 米ドル (翌日) + + + 米ドル (当日) + + + ウルグアイ ペソ (1975-1993) + + + ウルグアイ ペソ + + + ウズベキスタン スム + + + ベネズエラ ボリバル + Be + + + ベネズエラ ボリバルフエルテ + + + ベトナム ドン + đ + + + バヌアツ バツ + VT + + + 西サモア タラ + + + CFA フラン BEAC + + + + + + + + + ヨーロッパ混合単位 (EURCO) + + + ヨーロッパ通貨単位 (EMU-6) + + + ヨーロッパ勘定単位 (EUA-9) + + + ヨーロッパ勘定単位 (EUA-17) + + + 東カリブ ドル + EC$ + + + 特別引き出し権 + + + ヨーロッパ通貨単位 + + + フランス金フラン + + + フランス UIC フラン + + + CFA フラン BCEAO + + + パラジウム + + + CFP フラン + CFPF + + + プラチナ + + + RINET基金 + + + テスト用通貨コード + + + 不明または無効な通貨 + + + イエメン ディナール + + + イエメン リアル + YRl + + + ユーゴスラビア ディナール + + + ユーゴスラビア スーパー ディナール + + + ユーゴスラビア 新ディナール (YUN) + + + 南アフリカ ランド (ZAL) + + + 南アフリカ ランド + R + + + ザンビア クワチャ + + + ザイール 新ザイール + + + ザイール ザイール + + + ジンバブエ ドル + Z$ + + + + + + {0}日 + + + {0}時間 + + + {0}分 + + + {0}ヶ月 + + + {0}秒 + + + {0}週間 + + + {0}年 + + + + + はい:ハイ + いいえ:イイエ + + + diff --git a/libs/Zend/Locale/Data/ja_JP.xml b/libs/Zend/Locale/Data/ja_JP.xml new file mode 100644 index 0000000..8ea4387 --- /dev/null +++ b/libs/Zend/Locale/Data/ja_JP.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/ka.xml b/libs/Zend/Locale/Data/ka.xml new file mode 100644 index 0000000..f7d46b1 --- /dev/null +++ b/libs/Zend/Locale/Data/ka.xml @@ -0,0 +1,2168 @@ + + + + + + + + + + + {0} ({1}) + , + + + აფხაზური + ადიღეური + ავესტა + აფრიკული + აინუ + ალეუტური + ძველი ინგლისური + არაბული + არამეული + ხელოვნური სხვა + ასამური + ავსტრიული + აზერბაიჯანული + ბელორუსული + ბულგარული + ბიჰარი + ტიბეტური + ბრეტონული + ბოსნიური + ბურიატული + კატალანური + კავკასიური სხვა + ჩეჩნური + კელტური სხვა + ჩეხური + საეკლესიო სლავური + უელსური + დანიური + გერმანული + ავსტრიული გერმანული + შვეიცარიული მაღალი გერმანული + ეგვიპტური + ბერძნული + ინგლისური + ავსტრალიური ინგლისური + კანადური ინგლისური + ბრიტანული ინგლისური + ამერიკული ინგლისური + ესპერანტო + ესპანური + ლათინურ ამერიკული ესპანური + იბერიული ესპანური + ესტონური + ბასკური + სპარსული + ფინური + ფილიპინური + ფრანგული + კანადური ფრანგული + შვეიცარიული ფრანგული + ძველი ფრანგული + ირლანდიური + შოტლანდიურ-გალური + გალური + გუარანი + ძველი გერმანული + ძველი ბერძნული + შვეიცარიული გერმანული + გუჯარათი + ებრაული + ჰინდი + ხორვატიული + უნგრული + სომხური + ინტერლინგუალური + ინდონეზიური + ინტერლინგი + ინდო-ევროპული სხვა + ისლანდიური + იტალიური + იაპონური + იავანური + ქართული + კონგო + ყაზახური + კამბოჯიური + კორეული + ქურთული + ყირგიზული + ლათინური + ლუქსემბურგული + ლინგალა + ლაოსური + ლიტვური + ლატვიური + მაკედონიური + მონღოლური + მოლდოვური + მალაიზიური + მაიას ენები + ნეაპოლიტანური + ნეპალური + ჰოლანდიური + ფლომანდიური + ნორვეგიული ნინორსკი + ნორვეგიული + ნავახო + ოციტანური + ორიული + ოსური + ძველი სპარსული + პოლონური + პრაკრიტის ენები + პუშტუ + პორტუგალიური + ბრაზილიური პორტუგალიური + იბერიულ-პორტუგალიური + რუმინული + რუსული + სანსკრიტი + სარდინიული + სიცილიური + სინდური + ძველი ირლანდიური + სერბულ-ხორვატული + სინჰალური + სლოვაკური + სლოვენური + სლავური სხვა + სომალიური + ალბანური + სერბული + სამხრეთ სოთოს ენა + შუმერული + შვედური + სუაჰილი + ტაჯიკური + ტაილანდური + თურქმენული + კლინგონი + ტსვანა + თურქული + თუი + უდმურტიული + უიგურული + უკრაინული + უცნობი ან არასწორი ენა + ურდუ + უზბეკური + ვიეტნამური + ქსოზა + იდიში + ჩინური + გამარტივებული ჩინური + ტრადიციული ჩინური + ზულუ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + მსოფლიო + აფრიკა + ჩრდილოეთ ამერიკა + სამხრეთი ამერიკა + ოკეანეთი + დასავლეთი აფრიკა + ცენტრალური ამერიკა + აღმოსავლეთი აფრიკა + ჩრდილოეთი აფრიკა + შუა აფრიკა + სამხრეთი აფრიკა + ამერიკები + ჩრდილოეთი ამერიკა + კარიბი + აღმოსავლეთი აზია + სამხრეთი აზია + სამხრეთ-აღმოსავლეთი აზია + სამხრეთი ევროპა + ავსტრალია და ახალი ზელანდია + მელანეზია + მირონეზია + პოლინეზია + სამხრეთ-ცენტრალური აზია + აზია + ცენტრალური აზია + დასავლეთი აზია + ევროპა + აღმოსავლეთი ევროპა + ჩრდილოეთი ევროპა + დასავლეთი ევროპა + დამოუკიდებელ სახელმწიფოთა თანამეგობრობა + ლათინური ამერიკა და კარიბი + ანდორა + არაბეთის გაერთიანებული ემირატები + ავღანეთი + ანტიგუა და ბარბუდა + ანგვილა + ალბანეთი + სომხეთი + ნიდერლანდების ანტილები + ანგოლა + ანტარქტიკა + არგენტინა + ამერიკული სამოა + ავსტრია + ავსტრალია + არუბა + ალანდის კუნძულები + აზერბაიჯანი + ბოსნია და ჰერცეგოვინა + ბარბადოსი + ბანგლადეში + ბელგია + ბურკინა-ფასო + ბულგარეთი + ბაჰრეინი + ბურუნდი + ბენინი + ბერმუდა + ბრუნეი + ბოლივია + ბრაზილია + ბაჰამის კუნძულები + ბუტანი + ბუვეს კუნძული + ბოტსვანა + ბელორუსია + ბელიზი + კანადა + კონგო - კინშასა + ცენტრალური აფრიკის რესპუბლიკა + კონგო + შვეიცარია + სპილოს ძვლის სანაპირო + კუკის კუნძულები + ჩილე + კამერუნი + ჩინეთი + კოლუმბია + კოსტა-რიკა + სერბია და მონტენეგრო + კუბა + კაბო-ვერდე + შობის კუნძული + კვიპროსი + ჩეხეთის რესპუბლიკა + გერმანია + ჯიბუტი + დანია + დომინიკა + დომინიკანის რესპუბლიკა + ალჟირი + ეკვადორი + ესტონეთი + ეგვიპტე + დასავლეთი საჰარა + ერიტრეა + ესპანეთი + ეთიოპია + ფინეთი + ფიჯი + ფალკლენდის კუნძულები + მიკრონეზია + ფაროს კუნძულები + საფრანგეთი + გაბონი + დიდი ბრიტანეთი + გრენადა + საქართველო + განა + გიბრალტარი + გრენლანდია + გამბია + გვინეა + გვადელუპე + ეკვატორული გვინეა + საბერძნეთი + სამხრეთი ჯორჯია და სამხრეთ სენდვიჩის კუნძულები + გვატემალა + გუამი + გვინეა-ბისაუ + გაიანა + ჰონგ კონგი + ჰერდის კუნძული და მაკდონალდის კუნძულები + ჰონდურასი + ჰორვატია + ჰაიტი + უნგრეთი + ინდონეზია + ირლანდია + ისრაელი + მანის კუნძული + ინდოეთი + ბრიტანული ტერიტორია ინდოეთის ოკეანეში + ერაყი + ირანი + ისლანდია + იტალია + ჯერსი + იამაიკა + იორდანია + იაპონია + კენია + ყირგიზეთი + კამბოჯა + კირიბატი + კომორის კუნძულები + სენტ-კიტსი და ნევისი + ჩრდილოეთი კორეა + სამხრეთი კორეა + კუვეიტი + კაიმანის კუნძულები + ყაზახეთი + ლაოსი + ლიბანი + სენტ-ლუსია + ლიხტენშტაინი + შრი-ლანკა + ლიბერია + ლესოთო + ლიტვა + ლუქსემბურგი + ლატვია + ლიბია + მაროკო + მონაკო + მოლდოვა + მონტენეგრო + მადაგასკარი + მარშალის კუნძულები + მაკედონია + მალი + მიანმარი + მონღოლეთი + მაკაო + მარტინიკი + მავრიტანია + მონსერატი + მალტა + მავრიკია + მალდივის კუნძულები + მალავი + მექსიკა + მალაიზია + მოზამბიკი + ნამიბია + ახალი კალედონია + ნიგერი + ნორფოლკის კუნძული + ნიგერია + ნიკარაგუა + ნიდერლანდები + ნორვეგია + ნეპალი + ნაურუ + ახალი ზელანდია + ომანი + პანამა + პერუ + ფრანგული პოლინეზია + პაპუა-ახალი გვინეა + ფილიპინები + პაკისტანი + პოლონეთი + სენტ-პიერი და მიქელონი + პუერტო რიკო + პალესტინის ტერიტორია + პორტუგალია + პალაუ + პარაგვაი + კატარი + დაშორებული ოკეანია + ევროკავშირი + რეიუნიონი + რუმინეთი + სერბია + რუსეთი + რუანდა + საუდის არაბეთი + სოლომონის კუნძულები + სეიშელის კუნძულები + სუდანი + შვეცია + სინგაპური + წმინდა ელენეს კუნძული + სლოვენია + სლოვაკეთი + სიერა-ლეონე + სან-მარინო + სენეგალი + სომალი + სურინამი + საო-ტომე და პრინსიპი + სალვადორი + სირია + სვაზილენდი + ჩადი + ფრანგული სამხრეთის ტერიტორიები + ტოგო + ტაილანდი + ტაჯიკეთი + აღმოსავლეთი ტიმორი + თურქმენეთი + ტუნისი + ტონგა + თურქეთი + ტრინიდადი და ტობაგო + ტუვალუ + ტაივანი + ტანზანია + უკრაინა + უგანდა + შეერთებული შტატების მცირე დაშორებული კუნძულები + ამერიკის შეერთებული შტატები + ურუგვაი + უზბეკეთი + ვატიკანი + სენტ-ვინსენტი და გრენადინები + ვენესუელა + ვიეტნამი + ვანუატუ + ვალისი და ფუტუნა + სამოა + იემენი + სამხრეთ აფრიკა + ზამბია + ზიმბაბვე + უცნობი ან არასწორი რეგიონი + + + კალენდარი + მიმდევრობა + ვალუტა + + + ტრადიციული ჩინური + ბუდისტური კალენდარი + ჩინური კალენდარი + პირდაპირი მიმდევრობა + გამარტივებული ჩინური + გრიგორიანული კალენდარი + ებრაული კალენდარი + ინდური ეროვნული კალენდარი + ისლამური კალენდარი + ისლამური სამოქალაქო კალენდარი + იაპონური კალენდარი + ჩინეთის რესპუბლიკის კალენდარი + ტრადიციული + + + US + Metric + + + + [ა ⴀ ბ ⴁ გ ⴂ დ ⴃ ე ⴄ ვ ⴅ ზ ⴆ ჱ ⴡ თ ⴇ ი ⴈ კ ⴉ ლ ⴊ მ ⴋ ნ ⴌ ჲ ⴢ ო ⴍ პ ⴎ ჟ ⴏ რ ⴐ ს ⴑ ტ ⴒ ჳ ⴣ უ ⴓ ფ ⴔ ქ ⴕ ღ ⴖ ყ ⴗ შ ⴘ ჩ ⴙ ც ⴚ ძ ⴛ წ ⴜ ჭ ⴝ ხ ⴞ ჴ ⴤ ჯ ⴟ ჰ ⴠ ჵ ⴥ ჶ-ჺ] + + + + + + + + + + + + + + იან + თებ + მარ + აპრ + მაი + ივნ + ივლ + აგვ + სექ + ოქტ + ნოე + დეკ + + + იანვარი + თებერვალი + მარტი + აპრილი + მაისი + ივნისი + ივლისი + აგვისტო + სექტემბერი + ოქტომბერი + ნოემბერი + დეკემბერი + + + + + + + + + + + + + + + + + + + + + + + კვი + ორშ + სამ + ოთხ + ხუთ + პარ + შაბ + + + კვირა + ორშაბათი + სამშაბათი + ოთხშაბათი + ხუთშაბათი + პარასკევი + შაბათი + + + + + + + + + + + + + + + + + + I კვ. + II კვ. + III კვ. + IV კვ. + + + 1-ლი კვარტალი + მე-2 კვარტალი + მე-3 კვარტალი + მე-4 კვარტალი + + + + + I კვარტალი + II კვარტალი + III კვარტალი + IV კვარტალი + + + + დილის + საღამოს + + + ჩვენს წელთაღრიცხვამდე + ჩვენი წელთაღრიცხვით + + + ჩვენს წელთაღრიცხვამდე + ჩვენი წელთაღრიცხვით + + + ჩვენს წელთაღრიცხვამდე + ჩვენი წელთაღრიცხვით + + + + + + EEEE, yyyy MMMM dd + + + + + yyyy MMMM d + + + + + yyyy MMM d + + + + + yy/MM/dd + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1} {0} + + + + HH:mm + HH:mm:ss + dd MMM + dd/MM + hh:mm a + hh:mm:ss a + MM/yy + EEE, d MMM, yy + d MMM, yy + dd/MM/yy + Q yy + QQQQ yy + + + + + ხანა + + + წელი + + + თვე + + + კვირა + + + დღე + დღეს + ხვალ + ზეგ + სამი დღის შემდეგ + გუშინ + გუშინწინ + სამი დღის წინ + + + კვირის დღე + + + დღის პერიოდი + + + საათი + + + წუთი + + + წამი + + + ზონა + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + {1} ({0}) + + უცნობი + + + ბარბუდა + + + ანგილა + + + ნიდერლანდის + + + ანგოლა + + + როთერა + + + პალმერი + + + სამხრეთი პოლუსი + + + სიოუა + + + მოუსონი + + + დევისი + + + ვოსტოკი + + + კეისი + + + დიუმონ დ'ურვილი + + + მაკმურდო + + + რიო გალეგოსი + + + მენდოზა + + + სან ხუანი + + + უშუაია + + + ლა რიოხა + + + სან ლუისი + + + კატამარკა + + + ჯუჯუი + + + ტუკუმანი + + + კორდობა + + + ბუენოს აირესი + + + პერთი + + + ეუკლა + + + დარვინი + + + ადელაიდა + + + ბროუკენ ჰილი + + + ქური + + + მელბურნი + + + ჰობარტი + + + ლინდმანი + + + სიდნეი + + + ბრისბეინი + + + ლორდ ჰოუი + + + არუბა + + + ბარბადოსი + + + ბურკინა ფასო + + + ბურუნდი + + + ბენინი + + + ბოლივია + + + ეირუნეპე + + + რიო ბრანკო + + + პორტო ველჰო + + + ბოა ვისტა + + + მანაუსი + + + კუიაბა + + + კამპო გრანდე + + + ბელემი + + + არაგუაინა + + + საო პაულო + + + ბაია + + + ფორტალეზა + + + მასეიო + + + რეციფე + + + ნორონია + + + ბაჰამის კუნძულები + + + ბოტსვანა + + + ბელიზი + + + დოუსონი + + + უაითჰორსი + + + ინუვიკი + + + ვანკუვერი + + + დოუსონ ქრიკი + + + იელოუნაიფი + + + ედმონტონი + + + სვიფტ კარენტი + + + კემბრიჯ ბეი + + + რეჯინა + + + უინიპეგი + + + რეზოლუტე + + + რეინი რივერი + + + რენკინ ინლეტი + + + ქორალ ჰარბორი + + + თანდერ ბეი + + + ნიპიგონი + + + ტორონტო + + + მონრეალი + + + იქალუიტი + + + პანგნირტუნგი + + + მონქტონი + + + ჰალიფაქსი + + + გუზ ბეი + + + გლეის ბეი + + + ბლან-საბლონი + + + სენტ ჯონსი + + + კინშასა + + + ლუბუმბაში + + + ცენტრალური აფრიკის რესპუბლიკა + + + კონგო - ბრაზავილი + + + სპილოს ძვლის სანაპირო + + + ისთერი + + + კამერუნი + + + კაშგარი + + + ურუმქი + + + ჩონგქინგი + + + ჰარბინი + + + კოლუმბია + + + კოსტა რიკა + + + კუბა + + + ჯიბუტი + + + დომინიკა + + + ალჟირი + + + გალაპაგოსი + + + ეგვიპტე + + + დასავლეთი საჰარა + + + ერითრეა + + + კანარი + + + სეუტა + + + ეთიოპია + + + ტრუკი + + + პონაპე + + + კოსრაე + + + გაბონი + + + გრენადა + + + გუიანა + + + განა + + + თულე + + + სკორსბისუნდი + + + დენმარკშავნი + + + გამბია + + + გინეა + + + გუადელუპე + + + ეკვატორული გვინეა + + + გუატემალა + + + გინეა-ბისაუ + + + გუიანა + + + ჯაკარტა + + + პონტიანაკი + + + მაკასარი + + + ჯაიაპურა + + + იამაიკა + + + კენია + + + ენდერბური + + + კირიტიმატი + + + ტარაუა + + + კაიმანის + + + აქტაუ + + + ორალი + + + აქტობე + + + ყიზილორდა + + + ალმატი + + + ლიბერია + + + ლესოთო + + + ლიბია + + + მაროკო + + + კვაჯალეინი + + + მახურო + + + მალი + + + ჰოვდი + + + ულანბატარი + + + ჩოიბალსანი + + + მარტინიკი + + + მავრიტანია + + + მონსერატი + + + მალავი + + + ტიხუანა + + + ჰერმოსიო + + + მაზატლანი + + + ჩიჰუაჰუა + + + მონტერეი + + + მექსიკო სითი + + + მერიდა + + + კანკუნი + + + კუჩინგი + + + მოზამბიკი + + + ნამიბია + + + ნიგერი + + + ნიგერია + + + ნიკარაგუა + + + ჩათამი + + + პერუ + + + მარკეზასი + + + გამბიერი + + + სენტ პიერი და მიკელონი + + + აზორეს + + + მადეირა + + + პარაგვაი + + + კალინინგრადი + + + მოსკოვი + + + ვოლგოგრადი + + + სამარა + + + ეკატერინბურგი + + + ომსკი + + + ნოვოსიბირსკი + + + კრასნოიარსკი + + + ირკუტსკი + + + იაკუტსკი + + + ვლადივოსტოკი + + + სახალინი + + + მაგადანი + + + კამჩატკა + + + ანადირი + + + რუანდა + + + სუდანი + + + სიერა ლეონე + + + სენეგალი + + + სომალია + + + საო ტომე და პრინსიპე + + + ელ სალვადორი + + + სვაზილენდი + + + ტერკის და კაიკოს + + + ჩადი + + + ტოგო + + + ტუნისი + + + ტანზანია + + + უჟგოროდი + + + კიევი + + + სიმფეროპოლი + + + ზაპოროჟიე + + + უგანდა + + + მიდუეი + + + ჯონსტონი + + + უეიკი + + + ადაკი + + + ნომი + + + ჰონოლულუ + + + ენქორაჯი + + + იაკუტატი + + + ჯუნო + + + ლოს ანჯელესი + + + ბუასი + + + ფენიქსი + + + შიპროკი + + + დენვერი + + + ნიუ სალემი, ჩრდილოეთი დაკოტა + + + ცენტრი, ჩრდილოეთი დაკოტა + + + ჩიკაგო + + + მენომინი + + + ვინსენი, ინდიანა + + + პიტერსბურგი + + + თელ სითი, ინდიანა + + + ნოქსი, ინდიანა + + + უინემაკი, ინდიანა + + + მარენგო + + + ინდიანაპოლისი + + + ლუისვილი + + + ვივეი, ინდიანა + + + მონტიჩელო + + + დეტროიტი + + + ნიუ იორკი + + + ურუგვაი + + + სამარყანდი + + + ვენესუელა + + + სამხრეთი აფრიკა + + + ზამბია + + + ზიმბაბვე + + + + + + , + . + ; + % + 0 + + + - + E + + + NaN + + + + + #,##0.### + + + + + + + #,##0% + + + + + + + ¤ #,##0.00 + + + {0} {1} + + + + ანდორული პესეტა + + + გაერთიანებული არაბული საემიროების დირჰემი + + + ავღანი (1927-2002) + + + ავღანი + + + ალბანური ლეკი + + + სომხური დრამი + + + ნიდრელანდების ანტილიის გულდენი + + + ანგოლური კვანზა + + + ანგოლური კვანზა (1977-1990) + + + ანგოლური ახალი კვანზა (1990-2000) + + + ანგოლური მიტოლებული კვანზა (1995-1999) + + + არგენტინული აუსტრალი + + + არგენტინული პესო (1983-1985) + + + არგენტინული პესო + + + ავსტრიული შილინგი + + + ავსტრალიური დოლარი + + + არუბანული გულდენი + + + აზერბაიჯანული მანათი (1993-2006) + + + აზერბაიჯანული მანათი + + + ბოსნია-ჰერცოგოვინას დინარი + + + ბოსნია-ჰერცოგოვინას კონვერტირებადი მარკა + + + ბარბადოსული დოლარი + + + ბანგლადეშური ტაკა + + + ბელგიური ფრანკი (კოვერტირებადი) + + + ბელგიური ფრანკი + + + ბელგიური ფრანკი (ფინანსური) + + + ბულგარული მყარი ლევი + + + ბულგარული ახალი ლევი + + + ბაჰრეინული დინარი + + + ბურუნდიული ფრანკი + + + ბერმუდული დინარი + + + ბრუნეული დოლარი + + + ბოლივიანო + + + ბოლივიური პესო + + + ბრაზილიური კრუზეირო ნოვო (1967-1986) + + + ბრაზილიური კრუზადო + + + ბრაზილიური კრუზეირო (1990-1993) + + + ბრაზილიური რეალი + + + ბრაზილიური კრუზადო ნოვო + + + ბრაზილიური კრუზეირო + + + ბაჰამური დოლარი + + + ბოტსვანიური პულა + + + ახალი ბელარუსიული რუბლი (1994-1999) + + + ბელარუსიული რუბლი + + + კანადური დოლარი + + + შვეიცარიული ფრანკი + + + ჩინური უანი + + + კოსტა რიკული კოლონი + + + ძველი სერბიული დინარი + + + ჩეხოსლოვაკიის მყარი კრონა + + + კუბური პესო + + + კაბო ვერდეს ესკუდო + + + კვიპროსის გირვანქა + + + ჩეხური კრონა + + + აღმოსავლეთ გერმანული მარკა + + + გერმანული მარკა + + + ჯიბუტის ფრანკი + + + დანიური კრონა + + + დომინიკური პესო + + + ალჟირიული დინარი + + + ესტონური კრუნა + + + ეგვიპტური გირვანქა + + + ესპანური პესეტა + + + ევრო + + + ფინური მარკა + + + ფიჯი დოლარი + + + ფრანგული ფრანკი + + + ინგლისური გირვანქა სტერლინგი + + + ქართული კუპონი ლარით + + + ქართული ლარი + GEL + + + ბერძნული დრაჰმა + + + პორტუგალიური გინეა ესკუდო + + + ჰონგ კონგის დოლარი + + + ჰონდურასის ლემპირა + + + ხორვატიული დინარი + + + ხორვატიული კუნა + + + უნგრული ფორინტი + + + ინდონეზიური რუპია + + + ირლანდიური გირვანქა + + + ინდური რუპია + + + ისლანდიური კრონა + + + იტალიური ლირა + + + იამაიკური დოლარი + + + იორდანიული დოლარი + + + იაპონური იენი + + + კენიური შილინგი + + + ყირღიზული სომი + + + ჩრდილოეთ კორეული ვონი + + + სამხრეთ კორეული ვონი + + + კუვეიტური დინარი + + + კაიმანის კუნძულების დოლარი + + + ყაზახური ტენგე + + + შრი ლანკის რუპია + + + ლიბერიული დოლარი + + + მალოტი + + + ლიტვური ლიტა + + + ლიტვური ტალონი + + + ლუქსემბურგის კონვერტირებადი ფრანკი + + + ლუქსემბურგის ფრანკი + + + ლუქსემბურგის ფინანსური ფრანკი + + + ლატვიური ლატი + + + ლატვიური რუბლი + + + ლიბიური დინარი + + + მაროკოს დირჰამი + + + მაროკოს ფრანკი + + + მოლდოვური ლეუ + + + მადაგასკარის არიარი + + + მადაგასკარის ფრანკი + + + მაკედონიური დენარი + + + მალის ფრანკი + + + მიანმარის კიატი + + + მონღოლური ტუგრიკი + + + მალტის ლირა + + + მალტის გირვანქა + + + მავრიტანული რუპია + + + მალდივური რუფია + + + მალავის კვანჩა + + + მექსიკური პესო + + + მექსიკური ვერცხლის პესო (1861-1992) + + + მალაიზიური რინგიტი + + + მოზამბიკური ესკუდო + + + ძველი მოზამბიკური მეტიკალი + + + მოზამბიკური მეტიკალი + + + ნამიბიური დოლარი + + + ნიგერიული ნაირა + + + ნიკარაგუას კორდობა + + + ნიკარაგუას ოქროს კორდობა + + + ჰოლანდიური გულდენი + + + ნორვეგიული კრონა + + + ნეპალური რუპია + + + ახალი ზელანდიის დოლარი + + + ომანის რეალი + + + პერუს ინტი + + + პერუს ახალი სოლი + + + პერუს სოლი + + + ფილიპინური პესო + + + პაკისტანური რუპია + + + პოლონური ზლოტი + + + პოლონური ზლოტი (1950-1995) + + + პორტუგალიური ესკუდო + + + კატარის რიალი + + + როდეზიული დოლარი + + + ძველი რუმინული ლეუ + + + რუმინული ლეუ + + + რუსული რუბლი + + + რუსული რუბლი (1991-1998) + + + რუანდული ფრანკი + + + სეიშელის რუპია + + + სუდანის დინარი + + + სუდანის გირვანქა + + + შვედური კრონა + + + სინგაპურის დოლარი + + + სიერა ლეონეს ლეონე + + + სურინამის დოლარი + + + სურინამის გულდენი + + + საბჭოთა რუბლი + + + სირიული გირვანქა + + + ტაჯიკური რუბლი + + + ტაჯიკური სომონი + + + თურქმენული მანათი + + + ტუნისიური დინარი + + + თურქული ლირა + + + ახალი თურქული ლირა + + + ტრინიდად და ტობაგოს დოლარი + + + ტაივანური ახალი დოლარი + + + ტანზანიური შილინგი + + + უკრაინული გრივნა + + + უკრაინული კარბოვანეცი + + + უგანდური შილინგი (1966-1987) + + + უგანდური შილინგი + + + აშშ დოლარი + + + აშშ დოლარი (შემდეგი დღე) + + + აშშ დოლარი (იგივე დღე) + + + ურუგვაის პესო (1975-1993) + + + ურუგვაის პესო ურუგვაიო + + + უზბეკური სუმი + + + ვენესუელის ბოლივარი + + + ვიეტნამური დონგი + + + ვანატუს ვატუ + + + დასავლეთ სამოას ტალა + + + ვერცხლი + + + ევროპული კომპპოზიტური ერთეული + + + ევროპული ფულადი ერთეული + + + აღმოსავლეთ კარიბიული დოლარი + + + ევროპული სავალუტო ერთეული + + + ფრანგული ოქროს ფრანკი + + + უცნობი ან არასწორი ვალუტა + XXX + + + იემენის დინარი + + + იემენის რეალი + + + იუგოსლავიური მყარი დინარი + + + იუგოსლავიური ახალი დინარი + + + იუგოსლავიური კონვერტირებადი დინარი + + + ზამბიური კვანჩა + + + ზაირის ახალი ზაირი + + + ზაირის ზაირი + + + ზიმბაბვეს დოლარი + + + + + + {0} დღე + + + {0} საათი + + + {0} წუთი + + + {0} თვე + + + {0} წამი + + + {0} კვირა + + + {0} წელი + + + + + დიახ + არა + + + + diff --git a/libs/Zend/Locale/Data/ka_GE.xml b/libs/Zend/Locale/Data/ka_GE.xml new file mode 100644 index 0000000..e94b7d3 --- /dev/null +++ b/libs/Zend/Locale/Data/ka_GE.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/kaj.xml b/libs/Zend/Locale/Data/kaj.xml new file mode 100644 index 0000000..2432e8d --- /dev/null +++ b/libs/Zend/Locale/Data/kaj.xml @@ -0,0 +1,194 @@ + + + + + + + + + + [a-z] + + + + + + + + A̱yr + A̱hw + A̱ta + A̱na + A̱pf + A̱ki + A̱ty + A̱ni + A̱ku + Swa + Sby + Sbh + + + Hywan A̱yrnig + Hywan A̱hwa + Hywan A̱tat + Hywan A̱naai + Hywan A̱pfwon + Hywan A̱kitat + Hywan A̱tyirin + Hywan A̱ninai + Hywan A̱kumviriyin + Hywan Swak + Hywan Swak B'a̱yrnig + Hywan Swak B'a̱hwa + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + Lad + Lin + Tal + Lar + Lam + Jum + Asa + + + Ladi + Lintani + Talata + Larba + Lamit + Juma + Asabar + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + A.M. + P.M. + + + Gabanin Miladi + Miladi + + + G.M. + M. + + + + + + EEEE, yyyy MMMM dd + + + + + yyyy MMMM d + + + + + yyyy MMM d + + + + + yy/MM/dd + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1} {0} + + + + Q yy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + + A̱naira + + + + + diff --git a/libs/Zend/Locale/Data/kaj_NG.xml b/libs/Zend/Locale/Data/kaj_NG.xml new file mode 100644 index 0000000..3430462 --- /dev/null +++ b/libs/Zend/Locale/Data/kaj_NG.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/kam.xml b/libs/Zend/Locale/Data/kam.xml new file mode 100644 index 0000000..ab6336f --- /dev/null +++ b/libs/Zend/Locale/Data/kam.xml @@ -0,0 +1,194 @@ + + + + + + + + + + [a-e g-o r-w y z] + + + + + + + + Mwei wa mbee + Mwei wa keli + Mwei wa katatu + Mwei wa kanne + Mwei wa katano + Mwei wa thanthatu + Mwei wa muonza + Mwei wa nyanya + Mwei wa kenda + Mwei wa ikumi + Mwei wa ikumi na imwe + Mwei wa ikumi na ili + + + Mwei wa mbee + Mwei wa keli + Mwei wa katatu + Mwei wa kanne + Mwei wa katano + Mwei wa thanthatu + Mwei wa muonza + Mwei wa nyanya + Mwei wa kenda + Mwei wa ikumi + Mwei wa ikumi na imwe + Mwei wa ikumi na ili + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + Jpl + Jtt + Jnn + Jtn + Alh + Ijm + Jms + + + Jumapili + Jumatatu + Jumanne + Jumatano + Alamisi + Ijumaa + Jumamosi + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + AM + PM + + + mbee wa yesu + IY + + + MY + IY + + + + + + EEEE, yyyy MMMM dd + + + + + yyyy MMMM d + + + + + yyyy MMM d + + + + + yy/MM/dd + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1} {0} + + + + Q yy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + + Silingi ya Kenya + KSh + + + + diff --git a/libs/Zend/Locale/Data/kam_KE.xml b/libs/Zend/Locale/Data/kam_KE.xml new file mode 100644 index 0000000..8475f6e --- /dev/null +++ b/libs/Zend/Locale/Data/kam_KE.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/kcg.xml b/libs/Zend/Locale/Data/kcg.xml new file mode 100644 index 0000000..1c5e720 --- /dev/null +++ b/libs/Zend/Locale/Data/kcg.xml @@ -0,0 +1,194 @@ + + + + + + + + + + [a {a̱} b {ch} {chy} d-g {gb} {gh} {ghw} {ghy} i {i̱} j {jhy} k {kh} {kp} l-n {ng} {ny} o p r s {sh} {shy} t {ts} u-w y z] + + + + + + + + Juw + Swi + Tsa + Nya + Tsw + Ata + Ana + Ari + Aku + Swa + Man + Mas + + + Zwat Juwung + Zwat Swiyang + Zwat Tsat + Zwat Nyai + Zwat Tswon + Zwat Ataah + Zwat Anatat + Zwat Arinai + Zwat Akubunyung + Zwat Swag + Zwat Mangjuwang + Zwat Swag-Ma-Suyang + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + Lad + Tan + Tal + Lar + Lam + Jum + Asa + + + Ladi + Tanii + Talata + Larba + Lamit + Juma + Asabat + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + AM + PM + + + Gabanin Miladi + Miladi + + + GM + M + + + + + + EEEE, yyyy MMMM dd + + + + + yyyy MMMM d + + + + + yyyy MMM d + + + + + yy/MM/dd + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1} {0} + + + + Q yy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + + Nera + + + + + diff --git a/libs/Zend/Locale/Data/kcg_NG.xml b/libs/Zend/Locale/Data/kcg_NG.xml new file mode 100644 index 0000000..543ff75 --- /dev/null +++ b/libs/Zend/Locale/Data/kcg_NG.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/kfo.xml b/libs/Zend/Locale/Data/kfo.xml new file mode 100644 index 0000000..e0645ca --- /dev/null +++ b/libs/Zend/Locale/Data/kfo.xml @@ -0,0 +1,194 @@ + + + + + + + + + + [a ā b-e ē f g {gb} h-k {kh} l-p {pk} r-u w y z] + + + + + + + + Wey + Fan + Tat + Nan + Tuy + Tso + Taf + War + Kun + Ban + Kom + Sau + + + Fai Weyene + Fai Fani + Fai Tataka + Fai Nangra + Fai Tuyo + Fai Tsoyi + Fai Tafaka + Fai Warachi + Fai Kunobok + Fai Bansok + Fai Kom + Fai Sauk + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + Lah + Kub + Gba + Tan + Yei + Koy + Sat + + + Lahadi + Je-Kubacha + Je-Gbai + Tansati + Je-Yei + Je-Koye + Sati + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + AM + PM + + + Kafi Mar Wenom + Bayan Chi Wenom + + + KMW + BCW + + + + + + EEEE, yyyy MMMM dd + + + + + yyyy MMMM d + + + + + yyyy MMM d + + + + + yy/MM/dd + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1} {0} + + + + Q yy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + + Neira + + + + + diff --git a/libs/Zend/Locale/Data/kfo_CI.xml b/libs/Zend/Locale/Data/kfo_CI.xml new file mode 100644 index 0000000..e9d8d3a --- /dev/null +++ b/libs/Zend/Locale/Data/kfo_CI.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/kk.xml b/libs/Zend/Locale/Data/kk.xml new file mode 100644 index 0000000..ea4af44 --- /dev/null +++ b/libs/Zend/Locale/Data/kk.xml @@ -0,0 +1,397 @@ + + + + + + + + + + + бур + амхар + арабша + ассам + беларус + болгар + бихари + бенгал + брит + босния + каталан + чех + валлий + дат + неміс + грек + ағылшын + эсперанто + испан + эстон + баск + парсы + фин + пилипино + фарер + француз + фрис + ирландша + Солтүстік Шотландия + галицияша + гуарани + гуджарати + иврит + хинди + хорват + мадьяр + армян + интерлингва + индонезия + интерлингве + исланд + италиян + жапон + ява + грузин + Қазақ + камбоджия + каннада + кәріс + күрд + қырғыз + латын + лингала + лаос + литва + латыш + македон + малайялам + монғол + маратхи + малай + мальта + непал + голланд + норвег + окситан + ория + панджаб + поляк + пашто + португал + румын + орыс + санскрит + синдхи + сербхорват + сингал + словак + словен + сомали + албан + серб + сесото + судан + швед + суахили + тамил + телугу + тай + тигринья + түркмен + клингон + түрікше + тви + ұйғыр + украин + урду + өзбек + вьетнам + хоса + идиш + зулус + + + Қазақстан + Тонга + + + + [а ә б-е ё ж-й і к қ л-н ң о-у ұ ү ф-я] + [һ] + + + + + + + + қаң. + ақп. + нау. + сәу. + мам. + мау. + шіл. + там. + қыр. + қаз. + қар. + желт. + + + қаңтар + ақпан + наурыз + сәуір + мамыр + маусым + шілде + тамыз + қыркүйек + қазан + қараша + желтоқсан + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + жс. + дс. + сс. + ср. + бс. + жм. + сһ. + + + жексені + дуйсенбі + сейсенбі + сәренбі + бейсенбі + жұма + сенбі + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + AM + PM + + + BCE + CE + + + + + + EEEE, d MMMM yyyy 'ж'. + + + + + d MMMM yyyy 'ж'. + + + + + dd.MM.yyyy + + + + + dd.MM.yy + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1} {0} + + + + dd.MM + Q yy + MM.yyyy + MMMM yyyy 'ж'. + + + {0} - {1} + + M-M + + + E, dd.MM - E, dd.MM + E, dd.MM - E, dd.MM + + + MMM-MMM + + + E, d MMM - E, d MMM + E, d - E, d MMM + + + d MMM - d MMM + d-d MMM + + + dd.MM - dd.MM + dd.MM - dd.MM + + + d-d + + + HH-HH + + + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH-HH v + + + y-y + + + MM.yy - MM.yy + MM.yy - MM.yy + + + E, dd.MM.yy - E, dd.MM.yy + E, dd.MM.yy - E, dd.MM.yy + E, dd.MM.yy - E, dd.MM.yy + + + MMM-MMM yyyy 'ж'. + MMM yyyy 'ж'. - MMM yyyy 'ж'. + + + E, d MMM - E, d MMM yyyy 'ж'. + E, d - E, d MMM yyyy 'ж'. + E, d MMM yyyy 'ж'. - E, d MMM yyyy 'ж'. + + + d MMM - d MMM yyyy 'ж'. + d-d MMM yyyy 'ж'. + d MMM yyyy 'ж'. - d MMM yyyy 'ж'. + + + dd.MM.yy - dd.MM.yy + dd.MM.yy - dd.MM.yy + dd.MM.yy - dd.MM.yy + + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + , +   + + + + + #,##0.00 ¤;-#,##0.00 ¤ + + + + + + тңг. + + + Unknown or Invalid Currency + XXX + + + + + + иә:и + жоқ:ж + + + diff --git a/libs/Zend/Locale/Data/kk_Cyrl.xml b/libs/Zend/Locale/Data/kk_Cyrl.xml new file mode 100644 index 0000000..d21066d --- /dev/null +++ b/libs/Zend/Locale/Data/kk_Cyrl.xml @@ -0,0 +1,10 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ಆಫ್ರಿಕಾ + ಮಧ್ಯ ಅಮೇರಿಕಾ + ಪೂರ್ವ ಆಫ್ರಿಕಾ + ಅಮೆರಿಕಾಸ್ + ಕೆರೇಬಿಯನ್ + ಪೂರ್ವ ಎಶಿಯಾ + ಆಸ್ಟ್ರೇಲಿಯಾ ಹಾಗು ನ್ಯೂಝಿಲ್ಯಾಂಡ್ + ಏಶಿಯಾ + ಮಧ್ಯ ಏಶಿಯಾ + ಯೂರೋಪ್ + ಪೂರ್ವ ಯೂರೋಪ್ + ಅಂಟಾರ್ಟಿಕಾ + ಆಸ್ಟ್ರಿಯಾ + ಆಸ್ಟ್ರೆಲಿಯ + ಬೆಲ್ಜಿಯಮ್ + ಬಲ್ಗೇರಿಯನ್ + ಬ್ರಝಿಲ್ + ಬೋವೆಟ್ ಐಲ್ಯಾಂಡ್ + ಚೀನ + ಸೈಪ್ರಸ್ + ಚೆಕ್ ರಿಪಬ್ಲಿಕ್ + ಜರ್ಮನಿ + ಡೆನ್ಮಾರ್ಕ್ + ಎಸ್ತೊನಿಯ + ಫಿನ್‍‍ಲ್ಯಾಂಡ್ + ಫ್ರಾನ್ಸ್‍ + ಗ್ರೀಸ್ + ಭಾರತ + ಬ್ರಿಟೀಶ್ ಇಂಡಿಯನ್ ಓಶಿಯನ್ ಟೆರಿಟರಿ + ಮಾಲ್ಡಿವ ದ್ವೀಪಗಳು + ನೆಪಾಳ + ಯುರೋಪಿಯನ್ ಯೂನಿಯನ್ + ಸಿಂಗಪುರ + ಫ್ರೆಂಚ್ ದಕ್ಷಿಣ ಪ್ರದೇಶಗಳು + ಟೊಂಗ + ತುರ್ಕಿ + + + + [಼ ಂ ಃ ೦-೯ ಅ-ಋ ೠ ಌ ೡ ಎ-ಐ ಒ-ನ ಪ-ಲ ವ-ಹ ಳ ೞ ಽ-ೄ ೆ-ೈ ೊ-್ ೕ ೖ] + + + ' + ' + " + " + + + + + + + + ಜನವರೀ + ಫೆಬ್ರವರೀ + ಮಾರ್ಚ್ + ಎಪ್ರಿಲ್ + ಮೆ + ಜೂನ್ + ಜುಲೈ + ಆಗಸ್ಟ್ + ಸಪ್ಟೆಂಬರ್ + ಅಕ್ಟೋಬರ್ + ನವೆಂಬರ್ + ಡಿಸೆಂಬರ್ + + + ಜನವರೀ + ಫೆಬ್ರವರೀ + ಮಾರ್ಚ್ + ಎಪ್ರಿಲ್ + ಮೆ + ಜೂನ್ + ಜುಲೈ + ಆಗಸ್ಟ್ + ಸಪ್ಟೆಂಬರ್ + ಅಕ್ಟೋಬರ್ + ನವೆಂಬರ್ + ಡಿಸೆಂಬರ್ + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + ರ. + ಸೋ. + ಮಂ. + ಬು. + ಗು. + ಶು. + ಶನಿ. + + + ರವಿವಾರ + ಸೋಮವಾರ + ಮಂಗಳವಾರ + ಬುಧವಾರ + ಗುರುವಾರ + ಶುಕ್ರವಾರ + ಶನಿವಾರ + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + Q1 + Q2 + Q3 + Q4 + + + ಒಂದು 1 + ಎರಡು 2 + ಮೂರು 3 + ನಾಲೃಕ 4 + + + + ಪೂರ್ವಾಹ್ನ + ಅಪರಾಹ್ನ + + + ಈಸಪೂವ೯. + ಸನ್. + + + BCE + CE + + + + + + EEEE d MMMM yyyy + + + + + d MMMM yyyy + + + + + dd-MM-yyyy + + + + + d-M-yy + + + + + + + hh:mm:ss a v + + + + + hh:mm:ss a z + + + + + hh:mm:ss a + + + + + hh:mm a + + + + + + + {1} {0} + + + + d MMMM + dd-MM + Q yy + MM-yyyy + MMMM yyyy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + + + #,##,##0.### + + + + + + + #,##,##0% + + + + + + + ¤ #,##,##0.00 + + + + + + रु + + + + + + ಹೌದು + ಇಲ್ಲ:ಅಲ್ಲ + + + + diff --git a/libs/Zend/Locale/Data/kn_IN.xml b/libs/Zend/Locale/Data/kn_IN.xml new file mode 100644 index 0000000..94d3930 --- /dev/null +++ b/libs/Zend/Locale/Data/kn_IN.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/ko.xml b/libs/Zend/Locale/Data/ko.xml new file mode 100644 index 0000000..ddabf80 --- /dev/null +++ b/libs/Zend/Locale/Data/ko.xml @@ -0,0 +1,4218 @@ + + + + + + + + + + + {0}({1}) + , + + + 아파르어 + 압카즈어 + 아체어 + 아콜리어 + 아당메어 + 아닥헤어 + 아베스타어 + 남아공 공용어 + 아시아-아프리카어 (기타) + 아프리히리어 + 아이누어 + 아칸어 + 아카드어 + 알류트어 + 알공킨어족 + 남부 알타이어 + 암하라어 + 아라곤어 + 고대 영어 + 앙가어 + 아파치어 + 아랍어 + 아람어 + 아라우칸어 + 아라파호어 + 기계어 (기타) + 아라와크어 + 아샘어 + 아스투리아어 + 아타파스카어군 + 오스트레일리아어족 + 아바릭어 + 아와히어 + 아이마라어 + 아제르바이잔어 + 바슈키르어 + 반다어 + 바밀레케어족 + 발루치어 + 발리어 + 바사어 + 발트어 (기타) + 벨로루시어 + 베자어 + 벰바어 + 베르베르어 + 불가리아어 + 비하르어 + 호즈푸리어 + 비슬라마어 + 비콜어 + 비니어 + 식시카어 + 밤바라어 + 벵골어 + 반투어 + 티베트어 + 브르타뉴어 + 브라지어 + 보스니아어 + 바타크어 + 부리아타 + 부기어 + 브린어 + 카탈로니아어 + 카도어 + 중앙 아메리카 인디안어 (기타) + 카리브어 + 카프카스어 (기타) + 아삼어 + 체첸어 + 세부아노어 + 켈트어 (기타) + 차모로어 + 치브차어 + 차가타이어 + 추크어 + 마리어 + 치누크어와 영어 프랑스어의 혼성어 + 촉토어 + 치페우얀 + 체로키어 + 샤이엔어 + 참어군 + 코르시카어 + 콥트어 + 크리올어 및 피진어 (영어를 기반으로 한 기타) + 크리올어 및 피진어 (프랑스어를 기반으로 한 기타) + 크리올어 및 피진어 (포르투갈어를 기반으로 한 기타) + 크리어 + 크리민 터키어; 크리민 타타르어 + 크리올어 및 피진어 (기타) + 체코어 + 카슈비아어 + 교회 슬라브어 + 쿠시어족 + 추바시어 + 웨일스어 + 덴마크어 + 다코타어 + 다르그와어 + 다야크어 + 독일어 + 고지 독일어 (스위스) + 델라웨어어 + 슬라브어 + 도그리브어 + 딩카어 + 도그리어 + 드라비다어 (기타) + 저지 소르비아어 + 드와라어 + 중세 네덜란드어 + 디베히어 + 드율라어 + 종카어 + 에웨어 + 이픽어 + 이집트어 (고대) + 이카죽어 + 그리스어 + 엘람어 + 영어 + 영어(호주) + 영어 (영국식) + 영어 (미국식) + 영어, 중세 (1100-1500) + 에스페란토어 + 스페인어 + 중남미 스페인어 + 에스토니아어 + 바스크어 + 이원도어 + 페르시아어 + 팡그어 + 판티어 + 풀라어 + 핀란드어 + 필리핀어 + 피노우그리아어 (기타) + 피지어 + 페로어 + 폰어 + 프랑스어 + 중세 프랑스어 + 고대 프랑스어 + 북부 프리슬란드어 + 동부 프리슬란드어 + 프리우리안어 + 프리지아어 + 아일랜드어 + 가어 + 가요어 + 그바야어 + 스코틀랜드 게일어 + 독일어 (기타) + 게이즈어 + 키리바시어 + 갈리시아어 + 중세 고지 독일어 + 과라니어 + 고대 고지 독일어 + 곤디어 + 고론탈로어 + 고트어 + 게르보어 + 그리스어, 고대 (1453년 까지) + 독일어 (스위스) + 구자라트어 + 맹크스어 + 그위친어 + 하우사어 + 하이다어 + 하와이어 + 히브리어 + 힌디어 + 헤리가뇬어 + 히마차리어 + 하타이트어 + 히몸어 + 히리 모투어 + 크로아티아어 + 고지 소르비아어 + 아이티어 + 헝가리어 + 후파어 + 아르메니아어 + 헤레로어 + 인테르링구아(국제보조어협회) + 이반어 + 인도네시아어 + 인테르링구에 + 이그보어 + 쓰촨 이어 + 이조어 + 이누피아크어 + 이로코어 + 인도어 (기타) + 인도유럽어 (기타) + 인귀시어 + 이도어 + 이란어 [ira] + 이러쿼이어 + 아이슬란드어 + 이탈리아어 + 이눅티투트어 + 일본어 + 로반어 + 유대-페르시아어 + 유대-아라비아어 + 자바어 + 그루지야어 + 카라칼파크어 + 커바일어 + 카친어 + 캄바어 + 카렌어 + 카위어 + 카바르디어 + 코로어 + 콩고어 + 카시어 + 코이산어 (기타) + 호탄어 + 키쿠유어 + 쿠안야마어 + 카자흐어 + 그린란드어 + 캄보디아어 + 킴분두어 + 카나다어 + 한국어 + 코카니어 + 코스라이엔어 + 크펠레어 + 칸누리어 + 카라챠이-발카르어 + 카렐리야어 + 크루어 + 쿠르크어 + 카슈미르어 + 쿠르드어 + 쿠믹어 + 쿠테네어 + 코미어 + 콘월어 + 키르기스어 + 라틴어 + 라디노어 + 라한다어 + 람바어 + 룩셈부르크어 + 레즈기안어 + 간다어 + 림버거어 + 링갈라어 + 라오어 + 몽구어 + 로지어 + 리투아니아어 + 루바-카탄가어 + 루바-룰루아어 + 루이세노어 + 룬다어 + 루오어 + 루샤이어 + 라트비아어 + 마두라어 + 마가히 + 마이틸리 + 마카사어 + 만딩고어 + 남도어 + 마사이어 + 모크샤어 + 만다르어 + 멘데어 + 마다가스카르어 + 아일랜드어, 중세 (900-1200) + 마셜제도어 + 마오리어 + 미크맥어 + 미낭카바우 + 기타 언어 + 마케도니아어 + 몬크메르어 (기타) + 말라얄람어 + 몽고어 + 만주어 + 마니푸리어 + 마노보어 + 몰도바어 + 모호크어 + 모시어 + 마라티어 + 말레이어 + 몰타어 + 다중 언어 + 문다어 + 크리크어 + 미란데어 + 마르와리어 + 버마어 + 마야어 + 엘즈야어 + 나우루어 + 나우아틀어 + 북아메리카 인디언어(기타) + 나폴리어 + 보크말 노르웨이어 + 은데벨레어, 북부 + 저지 독일어 + 네팔어 + 네와르어 + 느동가어 + 니아스어 + 니제르 - 코르도파니아어 (기타) + 니웨언어 + 네덜란드어 + 플라망어 + 노르웨이어(뉴노시크) + 노르웨이어 + 노가이어 + 노르웨이, 고대 + 응코어 + 은데벨레어, 남부 + 소토어, 북부 + 누비안어 + 나바호어 + 네와르어 (고전) + 니안자어; 치츄어; 츄어 + 니암웨지어 + 니안콜어 + 뉴로어 + 느지마어 + 오크어 + 오지브웨이어 + 오로모어 (아판) + 오리야어 + 오세트어 + 오세이지어 + 터키어, 오스만 (1500-1928) + 오토미안어 + 펀잡어 + 파푸아어 (기타) + 판가시난어 + 팔레비어 + 팜팡가어 + 파피아먼토어 + 파라우안어 + 고대 페르시아어 + 필리핀어 (기타) + 페니키아어 + 팔리어 + 폴란드어 + 폼페이어 + 프라크리트어 + 고대 프로방스어 + 파시토어 (푸시토) + 포르투갈어 + 포르투갈어 (브라질) + 케추아어 + 라자스탄어 + 라파뉴이 + 라로통가어 + 레토로만어 + 룬디어 + 루마니아어 + 로망스어 (기타) + 집시어 + 어근 + 러시아어 + 아로마니아어 + 르완다어 + 산스크리트어 + 산다웨어 + 야큐트어 + 남아메리카 인디언어 (기타) + 샐리시어어 + 사마리아 아랍어 + 사사크어 + 산탈리어 + 사르디니아어 + 시칠리아어 + 스코틀랜드어 + 신디어 + 북부 사미어 + 셀쿠프어 + 셈어 (기타) + 산고어 + 아일랜드, 고대 (900년 까지) + 수화 + 세르비아-크로아티아어 + 샨어 + 스리랑카어 + 시다모어 + 수족어 + 중국 티베트 어족 + 슬로바키아어 + 슬로베니아어 + 슬라브어 (기타) + 사모아어 + 남부 사미어 + 사미어 (기타) + 룰레 사미어 + 이나리 사미어 + 스콜트 사미어 + 쇼나어 + 소닌케어 + 소말리아어 + 소그디엔어 + 송가이족어 + 알바니아어 + 세르비아어 + 스라난 통가어 + 세레르어 + 시스와티어 + 니로-사하람어 (기타) + 소토어 (남부) + 순다어 + 수쿠마족어 + 수수어 + 수메르어 + 스웨덴어 + 스와힐리어 + 시리아어 (고전) + 시리아어 + 타밀어 + 태국어 (기타) + 텔루구어 + 팀니어 + 테레노어 + 테툼어 + 타지키스탄어 + 태국어 + 티그리냐어 + 티그레어 + 티비어 + 투르크멘어 + 토켈라우제도어 + 타갈로그어 + 클링온어 + 틀링깃족어 + 타마섹어 + 세츠와나어 + 통가어 + 통가어 (니아살랜드) + 토크 피신어 + 터키어 + 총가어 + 트심시안어 + 타타르어 + 툼부카어 + 투피어 + 알타이어족 (기타) + 투발루어 + 트위어 + 타히티어 + 투비니안어 + 우드말트어 + 위구르어 + 유가리틱어 + 우크라이나어 + 윤번두어 + 결정되지않음 + 우르두어 + 우즈베크어 + 바이어 + 벤다어 + 베트남어 + 볼라퓌크어 + 보틱어 + 왈론어 + 와카샨어 + 와라모어 + 와라이어 + 와쇼어 + 소르브어 + 올로프어 + 칼미크어 + 코사어 + 야오족어 + 얍페세어 + 이디시어 + 요루바어 + 야픽어 + 주앙어 + 사포테크어 + 블리스 심볼 + 제나가어 + 중국어 + 중국어(간체) + 중국어 (번체) + 아잔데족어 + 줄루어 + 주니어 + 자자어 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 세계 + 아프리카 + 북아메리카 + 남아메리카[남미] + 오세아니아, 대양주 + 서아프리카 + 중앙 아메리카 + 동부 아프리카 + 북부 아프리카 + 중부 아프리카 + 남부 아프리카 + 아메리카 대륙 + 북부 아메리카 + 카리브 해 제도 + 동아시아 + 남아시아 + 동남 아시아 + 남유럽 + 오스트레일리아와 뉴질랜드 + 멜라네시아 + 미크로네시아 지역 + 폴리네시아 + 중남 아시아 + 아시아 + 중앙 아시아 + 서아시아 + 유럽 + 동유럽 + 북유럽 + 서유럽 + 독립 국가 연합 + 라틴 아메리카 및 카리브 해 제도 + 안도라 + 아랍에미리트 연합 + 아프가니스탄 + 앤티가 바부다 + 안길라 + 알바니아 + 아르메니아 + 네덜란드령 안틸레스 + 앙골라 + 남극 대륙 + 아르헨티나 + 아메리칸 사모아 + 오스트리아 + 오스트레일리아 + 아루바 + 올란드 제도 + 아제르바이잔 + 보스니아 헤르체고비나 + 바베이도스 + 방글라데시 + 벨기에 + 부르키나파소 + 불가리아 + 바레인 + 부룬디 + 베냉 + 생 바르텔르미 + 버뮤다 + 브루나이 + 볼리비아 + 브라질 + 바하마 + 부탄 + 부베 + 보츠와나 + 벨라루스 + 벨리즈 + 캐나다 + 코코스제도 + 콩고 민주공화국 + 중앙 아프리카 공화국 + 콩고 + 스위스 + 코트디부아르 + 쿡제도 + 칠레 + 카메룬 + 중국 + 콜롬비아 + 코스타리카 + 세르비아 및 몬테네그로 + 쿠바 + 까뽀베르데 + 크리스마스섬 + 사이프러스 + 체코 + 독일 + 지부티 + 덴마크 + 도미니카 + 도미니카 공화국 + 알제리 + 에콰도르 + 에스토니아 + 이집트 + 서사하라 + 에리트리아 + 스페인 + 이디오피아 + 핀란드 + 피지 + 포클랜드 군도 + 마이크로네시아 + 페로제도 + 프랑스 + 가봉 + 영국 + 그레나다 + 그루지야 + 프랑스령 기아나 + 건지 + 가나 + 지브롤터 + 그린란드 + 감비아 + 기니 + 과달로프 + 적도 기니 + 그리스 + 사우스조지아-사우스샌드위치제도 + 과테말라 + + 기네비쏘 + 가이아나 + 홍콩 + 허드섬-맥도널드제도 + 온두라스 + 크로아티아 + 아이티 + 헝가리 + 인도네시아 + 아일랜드 + 이스라엘 + 맨 섬 + 인도 + 영국령인도양식민지 + 이라크 + 이란 + 아이슬란드 + 이탈리아 + 저지 + 자메이카 + 요르단 + 일본 + 케냐 + 키르기스스탄 + 캄보디아 + 키리바시 + 코모로스 + 세인트크리스토퍼 네비스 + 조선 민주주의 인민 공화국 + 대한민국 + 쿠웨이트 + 케이맨제도 + 카자흐스탄 + 라오스 + 레바논 + 세인트루시아 + 리히텐슈타인 + 스리랑카 + 라이베리아 + 레소토 + 리투아니아 + 룩셈부르크 + 라트비아 + 리비아 + 모로코 + 모나코 + 몰도바 + 몬테네그로 + 생 마르탱 + 마다가스카르 + 마샬 군도 + 마케도니아 + 말리 + 미얀마 + 몽골 + 마카오 + 북마리아나제도 + 말티니크 + 모리타니 + 몬트세라트 + 몰타 + 모리셔스 + 몰디브 + 말라위 + 멕시코 + 말레이시아 + 모잠비크 + 나미비아 + 뉴 칼레도니아 + 니제르 + 노퍽섬 + 나이지리아 + 니카라과 + 네덜란드 + 노르웨이 + 네팔 + 나우루 + 니우에 + 뉴질랜드 + 오만 + 파나마 + 페루 + 프랑스령 폴리네시아 + 파푸아뉴기니 + 필리핀 + 파키스탄 + 폴란드 + 세인트피에르-미케롱 + 핏케언섬 + 푸에르토리코 + 팔레스타인 지구 + 포르투갈 + 팔라우 + 파라과이 + 카타르 + 오세아니아 외곽 + 유럽 연합 + 리유니온 + 루마니아 + 세르비아 + 러시아 + 르완다 + 사우디아라비아 + 솔로몬 제도 + 쉐이쉘 + 수단 + 스웨덴 + 싱가포르 + 세인트헬레나 + 슬로베니아 + 스발바르제도-얀마웬섬 + 슬로바키아 + 시에라리온 + 산마리노 + 세네갈 + 소말리아 + 수리남 + 상투메 프린시페 + 엘살바도르 + 시리아 + 스와질랜드 + 터크스케이커스제도 + 차드 + 프랑스 남부 지방 + 토고 + 태국 + 타지키스탄 + 토켈라우 + 동티모르 + 투르크메니스탄 + 튀니지 + 통가 + 터키 + 트리니다드 토바고 + 투발루 + 대만 + 탄자니아 + 우크라이나 + 우간다 + 미국령 해외 제도 + 미국 + 우루과이 + 우즈베키스탄 + 바티칸 + 세인트빈센트그레나딘 + 베네수엘라 + 영국령 버진 아일랜드 + 미국령 버진 아일랜드 + 베트남 + 바누아투 + 왈리스-푸투나 제도 + 사모아 + 예멘 + 마요티 + 남아프리카 + 잠비아 + 짐바브웨 + 알수없거나 유효하지 않은 지역 + + + 개정 + + + 달력 + 정렬 + 통화 + + + 중국어 번체 정렬 순서 - Big5 + 불교력 + 중국력 + 순서 + 중국어 간체 정렬 순서 - GB2312 + 태양력 + 히브리력 + 이슬람력 + 이슬람 상용력 + 일본력 + 전화번호부순 + 병음순 + 자획순 + 전통 역법 + + + US + 미터법 + + + 언어: {0} + 스크립트: {0} + 지역: {0} + + + + [가 각 간 갇-갊 감-갗 같-객 갠 갤 갬 갭 갯-갱 갸 갹 갼 걀 걋 걍 걔 걘 걜 거 걱 건 걷 걸 걺 검 겁 것-겆 겉-게 겐 겔 겜 겝 겟-겡 겨-겪 견 겯 결 겸 겹 겻-경 곁 계 곈 곌 곕 곗 고 곡 곤 곧 골 곪 곬 곯-곱 곳 공 곶 과 곽 관 괄 괆 괌 괍 괏 광 괘 괜 괠 괩 괬 괭 괴 괵 괸 괼 굄 굅 굇 굉 교 굔 굘 굡 굣 구 국 군 굳-굶 굻-굽 굿 궁 궂 궈 궉 권 궐 궜 궝 궤 궷 귀 귁 귄 귈 귐 귑 귓 규 균 귤 그 극 근 귿-긁 금 급 긋 긍 긔 기 긱 긴 긷 길 긺 김 깁 깃 깅 깆 깊 까-깎 깐 깔 깖 깜 깝 깟-깡 깥 깨 깩 깬 깰 깸 깹 깻-깽 꺄 꺅 꺌 꺼-꺾 껀 껄 껌 껍 껏-껑 께 껙 껜 껨 껫 껭 껴 껸 껼 꼇 꼈 꼍 꼐 꼬 꼭 꼰 꼲 꼴 꼼 꼽 꼿 꽁-꽃 꽈 꽉 꽐 꽜 꽝 꽤 꽥 꽹 꾀 꾄 꾈 꾐 꾑 꾕 꾜 꾸 꾹 꾼 꿀 꿇-꿉 꿋 꿍 꿎 꿔 꿜 꿨 꿩 꿰 꿱 꿴 꿸 뀀 뀁 뀄 뀌 뀐 뀔 뀜 뀝 뀨 끄 끅 끈 끊 끌 끎 끓-끕 끗 끙 끝 끼 끽 낀 낄 낌 낍 낏 낑 나-낚 난 낟-낢 남 납 낫-낯 낱 낳-낵 낸 낼 냄 냅 냇-냉 냐 냑 냔 냘 냠 냥 너 넉 넋 넌 널 넒 넓 넘 넙 넛-넝 넣-넥 넨 넬 넴 넵 넷-넹 녀 녁 년 녈 념 녑 녔 녕 녘 녜 녠 노 녹 논 놀 놂 놈 놉 놋 농 높-놔 놘 놜 놨 뇌 뇐 뇔 뇜 뇝 뇟 뇨 뇩 뇬 뇰 뇹 뇻 뇽 누 눅 눈 눋 눌 눔 눕 눗 눙 눠 눴 눼 뉘 뉜 뉠 뉨 뉩 뉴 뉵 뉼 늄 늅 늉 느 늑 는 늘-늚 늠 늡 늣 능 늦 늪 늬 늰 늴 니 닉 닌 닐 닒 님 닙 닛 닝 닢 다-닦 단 닫-닯 닳-답 닷-닻 닿-댁 댄 댈 댐 댑 댓-댕 댜 더-덖 던 덛 덜 덞 덟 덤 덥 덧 덩 덫 덮 데 덱 덴 델 뎀 뎁 뎃-뎅 뎌 뎐 뎔 뎠 뎡 뎨 뎬 도 독 돈 돋 돌 돎 돐 돔 돕 돗 동 돛 돝 돠 돤 돨 돼 됐 되 된 될 됨 됩 됫 됴 두 둑 둔 둘 둠 둡 둣 둥 둬 뒀 뒈 뒝 뒤 뒨 뒬 뒵 뒷 뒹 듀 듄 듈 듐 듕 드 득 든 듣 들 듦 듬 듭 듯 등 듸 디 딕 딘 딛 딜 딤 딥 딧-딪 따 딱 딴 딸 땀 땁 땃-땅 땋-땍 땐 땔 땜 땝 땟-땡 떠 떡 떤 떨 떪 떫 떰 떱 떳-떵 떻-떽 뗀 뗄 뗌 뗍 뗏-뗑 뗘 뗬 또 똑 똔 똘 똥 똬 똴 뙈 뙤 뙨 뚜 뚝 뚠 뚤 뚫 뚬 뚱 뛔 뛰 뛴 뛸 뜀 뜁 뜅 뜨 뜩 뜬 뜯 뜰 뜸 뜹 뜻 띄 띈 띌 띔 띕 띠 띤 띨 띰 띱 띳 띵 라 락 란 랄 람 랍 랏-랒 랖-랙 랜 랠 램 랩 랫-랭 랴 략 랸 럇 량 러 럭 런 럴 럼 럽 럿-렁 렇-렉 렌 렐 렘 렙 렛 렝 려 력 련 렬 렴 렵 렷-령 례 롄 롑 롓 로 록 론 롤 롬 롭 롯 롱 롸 롼 뢍 뢨 뢰 뢴 뢸 룀 룁 룃 룅 료 룐 룔 룝 룟 룡 루 룩 룬 룰 룸 룹 룻 룽 뤄 뤘 뤠 뤼 뤽 륀 륄 륌 륏 륑 류 륙 륜 률 륨 륩 륫 륭 르 륵 른 를 름 릅 릇 릉 릊 릍 릎 리 릭 린 릴 림 립 릿 링 마 막 만 많-맒 맘 맙 맛 망 맞 맡 맣-맥 맨 맬 맴 맵 맷-맺 먀 먁 먈 먕 머 먹 먼 멀 멂 멈 멉 멋 멍 멎 멓-멕 멘 멜 멤 멥 멧-멩 며 멱 면 멸 몃-명 몇 몌 모 목 몫 몬 몰 몲 몸 몹 못 몽 뫄 뫈 뫘 뫙 뫼 묀 묄 묍 묏 묑 묘 묜 묠 묩 묫 무-묶 문 묻-묾 뭄 뭅 뭇 뭉 뭍 뭏 뭐 뭔 뭘 뭡 뭣 뭬 뮈 뮌 뮐 뮤 뮨 뮬 뮴 뮷 므 믄 믈 믐 믓 미 믹 민 믿 밀 밂 밈 밉 밋-밍 및 밑 바-반 받-밟 밤 밥 밧 방 밭 배 백 밴 밸 뱀 뱁 뱃-뱅 뱉 뱌 뱍 뱐 뱝 버 벅 번 벋 벌 벎 범 법 벗 벙 벚 베 벡 벤 벧 벨 벰 벱 벳-벵 벼 벽 변 별 볍 볏-병 볕 볘 볜 보-볶 본 볼 봄 봅 봇 봉 봐 봔 봤 봬 뵀 뵈 뵉 뵌 뵐 뵘 뵙 뵤 뵨 부 북 분 붇-붊 붐 붑 붓 붕 붙 붚 붜 붤 붰 붸 뷔 뷕 뷘 뷜 뷩 뷰 뷴 뷸 븀 븃 븅 브 븍 븐 블 븜 븝 븟 비 빅 빈 빌 빎 빔 빕 빗 빙-빛 빠 빡 빤 빨 빪 빰 빱 빳-빵 빻-빽 뺀 뺄 뺌 뺍 뺏-뺑 뺘 뺙 뺨 뻐 뻑 뻔 뻗 뻘 뻠 뻣-뻥 뻬 뼁 뼈 뼉 뼘 뼙 뼛-뼝 뽀 뽁 뽄 뽈 뽐 뽑 뽕 뾔 뾰 뿅 뿌 뿍 뿐 뿔 뿜 뿟 뿡 쀼 쁑 쁘 쁜 쁠 쁨 쁩 삐 삑 삔 삘 삠 삡 삣 삥 사 삭 삯 산 삳-삶 삼 삽 삿-상 샅 새 색 샌 샐 샘 샙 샛-생 샤 샥 샨 샬 샴 샵 샷 샹 섀 섄 섈 섐 섕 서-선 섣 설 섦 섧 섬 섭 섯-성 섶 세 섹 센 셀 셈 셉 셋-셍 셔 셕 션 셜 셤 셥 셧-셩 셰 셴 셸 솅 소-솎 손 솔 솖 솜 솝 솟 송 솥 솨 솩 솬 솰 솽 쇄 쇈 쇌 쇔 쇗 쇘 쇠 쇤 쇨 쇰 쇱 쇳 쇼 쇽 숀 숄 숌 숍 숏 숑 수 숙 순 숟 술 숨 숩 숫 숭 숯 숱 숲 숴 쉈 쉐 쉑 쉔 쉘 쉠 쉥 쉬 쉭 쉰 쉴 쉼 쉽 쉿 슁 슈 슉 슐 슘 슛 슝 스 슥 슨 슬 슭 슴 습 슷 승 시 식 신 싣 실 싫-십 싯 싱 싶 싸 싹 싻 싼 쌀 쌈 쌉 쌌 쌍 쌓-쌕 쌘 쌜 쌤 쌥 쌨 쌩 썅 써 썩 썬 썰 썲 썸 썹 썼 썽 쎄 쎈 쎌 쏀 쏘 쏙 쏜 쏟 쏠 쏢 쏨 쏩 쏭 쏴 쏵 쏸 쐈 쐐 쐤 쐬 쐰 쐴 쐼 쐽 쑈 쑤 쑥 쑨 쑬 쑴 쑵 쑹 쒀 쒔 쒜 쒸 쒼 쓩 쓰 쓱 쓴 쓸 쓺 쓿-씁 씌 씐 씔 씜 씨 씩 씬 씰 씸 씹 씻 씽 아 악 안-않 알-앎 앓-압 앗-앙 앝 앞 애 액 앤 앨 앰 앱 앳-앵 야 약 얀 얄 얇 얌 얍 얏 양 얕 얗 얘 얜 얠 얩 어 억 언 얹 얻-얾 엄-엊 엌 엎 에 엑 엔 엘 엠 엡 엣 엥 여-엮 연 열 엶 엷 염-영 옅-예 옌 옐 옘 옙 옛 옜 오 옥 온 올-옮 옰 옳-옵 옷 옹 옻 와 왁 완 왈 왐 왑 왓-왕 왜 왝 왠 왬 왯 왱 외 왹 왼 욀 욈 욉 욋 욍 요 욕 욘 욜 욤 욥 욧 용 우 욱 운 울-욺 움 웁 웃 웅 워 웍 원 월 웜 웝 웠 웡 웨 웩 웬 웰 웸 웹 웽 위 윅 윈 윌 윔 윕 윗 윙 유 육 윤 율 윰 윱 윳 융 윷 으 윽 은 을 읊 음 읍 읏 응-의 읜 읠 읨 읫 이 익 인 일-읾 잃-입 잇-잊 잎 자 작 잔 잖-잘 잚 잠 잡 잣-잦 재 잭 잰 잴 잼 잽 잿-쟁 쟈 쟉 쟌 쟎 쟐 쟘 쟝 쟤 쟨 쟬 저 적 전 절 젊 점 접 젓 정 젖 제 젝 젠 젤 젬 젭 젯 젱 져 젼 졀 졈 졉 졌 졍 졔 조 족 존 졸 졺 좀 좁 좃 종-좇 좋-좍 좔 좝 좟 좡 좨 좼 좽 죄 죈 죌 죔 죕 죗 죙 죠 죡 죤 죵 주 죽 준 줄-줆 줌 줍 줏 중 줘 줬 줴 쥐 쥑 쥔 쥘 쥠 쥡 쥣 쥬 쥰 쥴 쥼 즈 즉 즌 즐 즘 즙 즛 증 지 직 진 짇 질 짊 짐 집 짓 징 짖 짙 짚 짜 짝 짠 짢 짤 짧 짬 짭 짯-짱 째 짹 짼 쨀 쨈 쨉 쨋-쨍 쨔 쨘 쨩 쩌 쩍 쩐 쩔 쩜 쩝 쩟-쩡 쩨 쩽 쪄 쪘 쪼 쪽 쫀 쫄 쫌 쫍 쫏 쫑 쫓 쫘 쫙 쫠 쫬 쫴 쬈 쬐 쬔 쬘 쬠 쬡 쭁 쭈 쭉 쭌 쭐 쭘 쭙 쭝 쭤 쭸 쭹 쮜 쮸 쯔 쯤 쯧 쯩 찌 찍 찐 찔 찜 찝 찡 찢 찧-착 찬 찮 찰 참 찹 찻-찾 채 책 챈 챌 챔 챕 챗-챙 챠 챤 챦 챨 챰 챵 처 척 천 철 첨 첩 첫-청 체 첵 첸 첼 쳄 쳅 쳇 쳉 쳐 쳔 쳤 쳬 쳰 촁 초 촉 촌 촐 촘 촙 촛 총 촤 촨 촬 촹 최 쵠 쵤 쵬 쵭 쵯 쵱 쵸 춈 추 축 춘 출 춤 춥 춧 충 춰 췄 췌 췐 취 췬 췰 췸 췹 췻 췽 츄 츈 츌 츔 츙 츠 측 츤 츨 츰 츱 츳 층 치 칙 친 칟-칡 침 칩 칫 칭 카 칵 칸 칼 캄 캅 캇 캉 캐 캑 캔 캘 캠 캡 캣-캥 캬 캭 컁 커 컥 컨 컫 컬 컴 컵 컷-컹 케 켁 켄 켈 켐 켑 켓 켕 켜 켠 켤 켬 켭 켯-켱 켸 코 콕 콘 콜 콤 콥 콧 콩 콰 콱 콴 콸 쾀 쾅 쾌 쾡 쾨 쾰 쿄 쿠 쿡 쿤 쿨 쿰 쿱 쿳 쿵 쿼 퀀 퀄 퀑 퀘 퀭 퀴 퀵 퀸 퀼 큄 큅 큇 큉 큐 큔 큘 큠 크 큭 큰 클 큼 큽 킁 키 킥 킨 킬 킴 킵 킷 킹 타 탁 탄 탈 탉 탐 탑 탓-탕 태 택 탠 탤 탬 탭 탯-탱 탸 턍 터 턱 턴 털 턺 텀 텁 텃-텅 테 텍 텐 텔 템 텝 텟 텡 텨 텬 텼 톄 톈 토 톡 톤 톨 톰 톱 톳 통 톺 톼 퇀 퇘 퇴 퇸 툇 툉 툐 투 툭 툰 툴 툼 툽 툿 퉁 퉈 퉜 퉤 튀 튁 튄 튈 튐 튑 튕 튜 튠 튤 튬 튱 트 특 튼 튿 틀 틂 틈 틉 틋 틔 틘 틜 틤 틥 티 틱 틴 틸 팀 팁 팃 팅 파-팎 판 팔 팖 팜 팝 팟-팡 팥 패 팩 팬 팰 팸 팹 팻-팽 퍄 퍅 퍼 퍽 펀 펄 펌 펍 펏-펑 페 펙 펜 펠 펨 펩 펫 펭 펴 편 펼 폄 폅 폈 평 폐 폘 폡 폣 포 폭 폰 폴 폼 폽 폿 퐁 퐈 퐝 푀 푄 표 푠 푤 푭 푯 푸 푹 푼 푿 풀 풂 품 풉 풋 풍 풔 풩 퓌 퓐 퓔 퓜 퓟 퓨 퓬 퓰 퓸 퓻 퓽 프 픈 플 픔 픕 픗 피 픽 핀 필 핌 핍 핏 핑 하 학 한 할 핥 함 합 핫 항 해 핵 핸 핼 햄 햅 햇-행 햐 향 허 헉 헌 헐 헒 험 헙 헛 헝 헤 헥 헨 헬 헴 헵 헷 헹 혀 혁 현 혈 혐 협 혓-형 혜 혠 혤 혭 호 혹 혼 홀 홅 홈 홉 홋 홍 홑 화 확 환 활 홧 황 홰 홱 홴 횃 횅 회 획 횐 횔 횝 횟 횡 효 횬 횰 횹 횻 후 훅 훈 훌 훑 훔 훗 훙 훠 훤 훨 훰 훵 훼 훽 휀 휄 휑 휘 휙 휜 휠 휨 휩 휫 휭 휴 휵 휸 휼 흄 흇 흉 흐 흑 흔 흖-흙 흠 흡 흣 흥 흩 희 흰 흴 흼 흽 힁 히 힉 힌 힐 힘 힙 힛 힝] + [丘 串 乃 久 乖 九 乞 乫 乾 亂 亘 交 京 仇 今 介 件 价 企 伋 伎 伽 佳 佶 侃 來 侊 供 係 俓 俱 個 倞 倦 倨 假 偈 健 傀 傑 傾 僅 僑 價 儆 儉 儺 光 克 兢 內 公 共 其 具 兼 冀 冠 凱 刊 刮 券 刻 剋 剛 劇 劍 劒 功 加 劤 劫 勁 勍 勘 勤 勸 勻 勾 匡 匣 區 南 卦 却 卵 卷 卿 厥 去 及 口 句 叩 叫 可 各 吉 君 告 呱 呵 咎 咬 哥 哭 啓 喀 喇 喝 喫 喬 嗜 嘉 嘔 器 囊 困 固 圈 國 圭 圻 均 坎 坑 坤 坰 坵 垢 基 埼 堀 堅 堈 堪 堺 塊 塏 境 墾 壙 壞 夔 奇 奈 奎 契 奸 妓 妗 姑 姜 姦 娘 娜 嫁 嬌 孔 季 孤 宏 官 客 宮 家 寄 寇 寡 寬 尻 局 居 屆 屈 岐 岡 岬 崎 崑 崗 嵌 嵐 嶇 嶠 工 巧 巨 己 巾 干 幹 幾 庚 庫 康 廊 廐 廓 廣 建 弓 强 彊 徑 忌 急 怪 怯 恐 恝 恪 恭 悸 愆 感 愧 愷 愾 慊 慣 慤 慨 慶 慷 憩 憬 憾 懃 懇 懦 懶 懼 戈 戒 戟 戡 扱 技 抉 拉 拏 拐 拒 拘 括 拮 拱 拳 拷 拿 捏 据 捲 捺 掘 掛 控 揀 揆 揭 擊 擎 擒 據 擧 攪 攷 改 攻 故 敎 救 敢 敬 敲 斛 斤 旗 旣 昆 昑 景 晷 暇 暖 暠 暻 曠 曲 更 曷 朗 朞 期 机 杆 杞 杰 枏 果 枯 架 枸 柑 柩 柬 柯 校 根 格 桀 桂 桔 桿 梏 梗 械 梱 棄 棋 棍 棘 棨 棺 楗 楠 極 槁 構 槐 槨 槪 槻 槿 樂 橄 橋 橘 機 檄 檎 檢 櫃 欄 權 欺 款 歌 歐 ­¸ 殼 毆 毬 氣 求 江 汨 汲 決 汽 沂 沽 洛 洸 浪 涇 淃 淇 減 渠 渴 湳 溝 溪 滑 滾 漑 潔 潰 澗 激 濫 灌 灸 炅 炚 炬 烙 烱 煖 爛 牽 犬 狂 狗 狡 狼 獗 玖 玘 珂 珏 珖 珙 珞 珪 球 琦 琨 琪 琯 琴 瑾 璂 璟 璣 璥 瓊 瓘 瓜 甄 甘 甲 男 畇 界 畸 畺 畿 疆 疥 疳 痂 痙 痼 癎 癩 癸 皆 皎 皐 盖 監 看 眷 睾 瞰 瞼 瞿 矜 矩 矯 硅 硬 碁 碣 磎 磬 磯 磵 祁 祇 祈 祛 祺 禁 禽 科 稈 稼 稽 稿 穀 究 穹 空 窘 窟 窮 窺 竅 竟 竭 競 竿 筋 筐 筠 箇 箕 箝 管 簡 粳 糠 系 糾 紀 納 紘 級 紺 絅 結 絞 給 絳 絹 絿 經 綱 綺 緊 繫 繭 繼 缺 罐 罫 羅 羈 羌 羔 群 羹 翹 考 耆 耉 耕 耭 耿 肌 肝 股 肩 肯 肱 胛 胱 脚 脛 腔 腱 膈 膏 膠 臘 臼 舅 舊 舡 艮 艱 芎 芥 芩 芹 苛 苟 苦 苽 茄 莖 菅 菊 菌 菓 菫 菰 落 葛 葵 蓋 蕎 蕨 薑 藁 藍 藿 蘭 蘿 虔 蚣 蛟 蝎 螺 蠟 蠱 街 衢 衲 衾 衿 袈 袞 袴 裙 裸 褐 襁 襟 襤 見 規 覡 覲 覺 觀 角 計 記 訣 訶 詭 誇 誡 誥 課 諫 諾 謙 講 謳 謹 譏 警 譴 谷 谿 豈 貢 貫 貴 賈 購 赳 起 跏 距 跨 踞 蹇 蹶 躬 軀 車 軌 軍 軻 較 輕 轎 轟 辜 近 迦 迲 适 逑 逕 逵 過 遣 遽 邏 那 邯 邱 郊 郎 郡 郭 酪 醵 金 鈐 鈞 鉀 鉅 鉗 鉤 銶 鋸 鋼 錡 錤 錦 錮 鍋 鍵 鎌 鎧 鏡 鑑 鑒 鑛 開 間 閘 閣 閨 闕 關 降 階 隔 隙 雇 難 鞏 鞠 鞨 鞫 頃 頸 顆 顧 飢 餃 館 饉 饋 饑 駒 駕 駱 騎 騏 騫 驅 驕 驚 驥 骨 高 鬼 魁 鮫 鯤 鯨 鱇 鳩 鵑 鵠 鷄 鷗 鸞 麒 麴 黔 鼓 龕 龜] + [a-z] + + + + + + + + + GanjkHmsSEDFwWxhKzAeugXZvcL + + + 오전 + 오후 + + + 불기 + + + + + + + + + + + 오전 + + + 오전 + 오후 + + + + + + 1월 + 2월 + 3월 + 4월 + 5월 + 6월 + 7월 + 8월 + 9월 + 10월 + 11월 + 12월 + + + 1월 + 2월 + 3월 + 4월 + 5월 + 6월 + 7월 + 8월 + 9월 + 10월 + 11월 + 12월 + + + + + 1월 + 2월 + 3월 + 4월 + 5월 + 6월 + 7월 + 8월 + 9월 + 10월 + 11월 + 12월 + + + 1월 + 2월 + 3월 + 4월 + 5월 + 6월 + 7월 + 8월 + 9월 + 10월 + 11월 + 12월 + + + 1월 + 2월 + 3월 + 4월 + 5월 + 6월 + 7월 + 8월 + 9월 + 10월 + 11월 + 12월 + + + + + + + + + + + + + + + + 일요일 + 월요일 + 화요일 + 수요일 + 목요일 + 금요일 + 토요일 + + + + + + + + + + + + + + + + + + 1분기 + 2분기 + 3분기 + 4분기 + + + 제 1/4분기 + 제 2/4분기 + 제 3/4분기 + 제 4/4분기 + + + + + 1 + 2 + 3 + 4 + + + + 오전 + 오후 + + + 서력기원전 + 서력기원 + + + 기원전 + 서기 + + + + + + yyyy년 M월 d일 EEEE + + + + + yyyy년 M월 d일 + + + + + yyyy. M. d. + + + + + yy. M. d. + + + + + + + a hh시 mm분 ss초 v + + + + + a hh시 mm분 ss초 z + + + + + a h:mm:ss + + + + + a h:mm + + + + + + + {1} {0} + + + + d일 (E) + HH:mm + HH:mm:ss + H:mm + H시 m분 s초 + L + M. d. (E) + LLL + MMM d일 (E) + MMMM d일 (E) + MMMM d일 + MMM d일 + MM. dd + M. d. + d + mm:ss + mm:ss + yyyy + yyyy. M. + yyyy. M. d. EEE + yyyy년 MMM + yyyy년 MMM d일 EEE + yyyy년 MMMM + yyyy년 Q분기 + yyyy년 QQQ + YY. M. + yy년 MMM + yy년 Q분기 + yyyy. MM + + + {0} – {1} + + M월 ~ M월 + + + M. d E ~ M. d E + M. d E ~ M. d E + + + MMM ~ MMM + + + M월 d일 E ~ M월 d일 E + M월 d일 E ~ d일 E + + + LLLL-LLLL + + + M월 d일 ~ M월 d일 + M월 d일 ~ d일 + + + M. d ~ M. d + M. d ~ M. d + + + d일 ~ d일 + + + a h ~ a h + a h~h + + + a h:mm ~ a h:mm + a h:mm~h:mm + a h:mm~h:mm + + + a h:mm ~ a h:mm v + a h:mm~h:mm v + a h:mm~h:mm v + + + a h ~ a h v + a h~h v + + + y년 ~ y년 + + + yyyy. M ~ yyyy. M + yyyy. M ~ yyyy. M + + + yy. M. d. E ~ yy. M. d. E + yy. M. d. E ~ yy. M. d. E + yy. M. d. E ~ yy. M. d. E + + + yyyy년 M월~M월 + yyyy년 M월 ~ yyyy년 M월 + + + yyyy년 M월 d일 E ~ M월 d일 E + yyyy년 M월 d일 E ~ d일 E + yyyy년 M월 d일 E ~ yyyy년 M월 d일 E + + + yyyy년 MM월 ~ MM월 + yyyy년 MM월 ~ yyyy년 MM월 + + + yyyy년 M월 d일 ~ M월 d일 + yyyy년 M월 d일~d일 + yyyy년 M월 d일 ~ yyyy년 M월 d일 + + + yy. M. d. ~ yy. M. d. + yy. M. d. ~ yy. M. d. + yy. M. d. ~ yy. M. d. + + + + + + 연호 + + + + + + + + + + + + + 오늘 + 내일 + 모레 + 3일후 + 어제 + 그저께 + 그끄제 + + + 요일 + + + 오전/오후 + + + + + + + + + + + + 시간대 + + + + + 오전 + 오후 + + + 오전 + 오후 + + + 오전 + 오후 + + + 오전 + 오후 + + + 중화민국전 + 중화민국 + + + + + + G y년 M월 d일 + + + + + G y년 M월 d일 + + + + + G y. M. d + + + + + G y. M. d + + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} 시간 + {1} ({0}) + + 알 수 없는 장소 + + + 안도라 + + + 두바이 + + + 카불 + + + 안티과 + + + 앙귈라 + + + 티라나 + + + 예레반 + + + 쿠라사오 + + + 루안다 + + + 로데라 + + + 파머 + + + 남극 + + + 쇼와 + + + 모슨 + + + 데이비스 + + + 보스토크 + + + 케이시 + + + 뒤몽 뒤르빌 + + + 맥머도 + + + 리오 가예고스 + + + 멘도사 + + + 산후안 + + + 우수아이아 + + + 라 리오하 + + + 산루이스 + + + 카타마르카 + + + 후후이 + + + 뚜꾸만 + + + 코르도바 + + + 부에노스 아이레스 + + + 파고파고 + + + 비엔나 + + + 퍼스 + + + 유클라 + + + 다윈 + + + 애들레이드 + + + 브로컨힐 + + + 퀴리 + + + 멜버른 + + + 호바트 + + + 린데만 + + + 시드니 + + + 브리스베인 + + + 로드 하우 + + + 아루바 + + + 바쿠 + + + 바베이도스 + + + 다카 + + + 브뤼셀 + + + 와가두구 + + + 소피아 + + + 바레인 + + + 부줌부라 + + + 포르토노보 + + + 버뮤다 + + + 브루나이 + + + 라파스 + + + 아이루네페 + + + 리오 브랑코 + + + 포르토 벨로 + + + 보아 비스타 + + + 마나우스 + + + 쿠이아바 + + + 캄포 그란데 + + + 벨렘 + + + 아라과이나 + + + 상파울로 + + + 바히아 + + + 포르탈레자 + + + 마세이오 + + + 레시페 + + + 노롱야 + + + 나소 + + + 팀부 + + + 가보로네 + + + 민스크 + + + 벨리즈 + + + 도슨 + + + 화이트호스 + + + 이누빅 + + + 벤쿠버 + + + 도슨크릭 + + + 옐로나이프 + + + 에드먼턴 + + + 스위프트커런트 + + + 케임브리지 베이 + + + 리자이나 + + + 위니펙 + + + 리졸루트 + + + 레이니강 + + + 랭킹 인렛 + + + 코랄하버 + + + 선더베이 + + + 니피곤 + + + 토론토 + + + 몬트리올 + + + 이칼루이트 + + + 팡니르퉁 + + + 몽턴 + + + 핼리팩스 + + + 구즈베이 + + + 글라스베이 + + + 블랑 사블롱 + + + St. Johns + + + 코코스 + + + 킨샤사 + + + 루붐바시 + + + 방기 + + + 브라자빌 + + + 취리히 + + + 아비장 + + + 라로통가 + + + 이스터 섬 + + + 산티아고 + + + 두알라 + + + 카슈가르 + + + 우루무치 + + + 충칭 + + + 상하이 + + + 하얼빈 + + + 보고타 + + + 코스타리카 + + + 하바나 + + + 카보 베르데 + + + 크리스마스 + + + 니코시아 + + + 베를린 + + + 지부티 + + + 코펜하겐 + + + 도미니카 + + + 산토도밍고 + + + 알제 + + + 갈라파고스 + + + 과야킬 + + + 탈린 + + + 카이로 + + + 엘아이운 + + + 아스메라 + + + 카나리아 제도 + + + 세우타 + + + 마드리드 + + + 아디스아바바 + + + 헬싱키 + + + 피지 + + + 스탠리 + + + 트루크 + + + 포나페 + + + 코스레 + + + 페로 + + + 파리 + + + 리브르빌 + + + 런던 + + + 그라나다 + + + 트빌리시 + + + 샤이엔 + + + 아크라 + + + 지브랄타 + + + 툴레 + + + 고드호프 + + + 스코레스바이선드 + + + 덴마크샤븐 + + + 반줄 + + + 코나크리 + + + 과델로프 + + + 말라보 + + + 아테네 + + + 남부 조지아 + + + 과테말라 + + + + + + 비사우 + + + 가이아나 + + + 홍콩 + + + 포르토프랭스 + + + 부다페스트 + + + 자카르타 + + + 폰티아나크 + + + 마카사르 + + + 자야푸라 + + + 더블린 + + + 예루살렘 + + + 차고스 + + + 바그다드 + + + 테헤란 + + + 레이캬비크 + + + 로마 + + + 자메이카 + + + 암만 + + + 도쿄 + + + 나이로비 + + + 비슈케크 + + + 프놈펜 + + + 엔더베리 + + + 키리티마티 + + + 타라와 + + + 코모로 + + + 세인트 키츠 + + + 평양 + + + 서울 + + + 쿠웨이트 + + + 카이만 + + + 아크타우 + + + 오랄 + + + 악토브 + + + 키질로르다 + + + 알마티 + + + 비엔티안 + + + 베이루트 + + + 세인트 루시아 + + + 파두츠 + + + 콜롬보 + + + 몬로비아 + + + 마세루 + + + 빌니우스 + + + 룩셈부르크 + + + 리가 + + + 트리폴리 + + + 카사블랑카 + + + 모나코 + + + 키시나우 + + + 안타나나리보 + + + 콰잘렌 + + + 마주로 + + + 바마코 + + + 랑군 + + + 호브드 + + + 울란바토르 + + + 초이발산 + + + 마카오 + + + 사이판 + + + 마티니크 + + + 누악쇼트 + + + 몬세라 + + + 몰타 + + + 모리셔스 + + + 몰디브 + + + 블랜타이어 + + + 티후아나 + + + 에르모시요 + + + 마사틀란 + + + 치와와 + + + 몬테레이 + + + 멕시코 시티 + + + 메리다 + + + 칸쿤 + + + 쿠알라룸푸르 + + + 쿠칭 + + + 마푸토 + + + 빈트후크 + + + 누메아 + + + 니아메 + + + 노퍽 + + + 라고스 + + + 마나과 + + + 암스텔담 + + + 오슬로 + + + 카트만두 + + + 나우루 + + + 니우에 + + + 채텀 + + + 오클랜드 + + + 무스카트 + + + 파나마 + + + 리마 + + + 타히티 + + + 마퀘사스 + + + 감비어 + + + 포트모르즈비 + + + 마닐라 + + + 카라치 + + + 바르샤바 + + + 미퀠론 + + + 피트카이른 + + + 푸에르토리코 + + + 가자 + + + 아조레스 + + + 마데이라 + + + 리스본 + + + 팔라우 + + + 아순시온 + + + 카타르 + + + 불령 리유니온 + + + 부쿠레슈티 + + + 칼리닌그라드 + + + 모스크바 + + + 볼고그라트 + + + 사마라 + + + 예카테린부르크 + + + 옴스크 + + + 노보시비르스크 + + + 크라스노야르스크 + + + 이르쿠츠크 + + + 야쿠츠크 + + + 블라디보스토크 + + + 사할린 + + + 마가단 + + + 캄차카 + + + 아나디리 + + + 키갈리 + + + 리야드 + + + 과달카날 + + + 마헤 + + + 카르툼 + + + 스톡홀름 + + + 싱가포르 + + + 세인트 헬레나 + + + 프리타운 + + + 다카르 + + + 모가디슈 + + + 파라마리보 + + + 사오 투메 + + + 엘살바도르 + + + 다마스쿠스 + + + 음바바네 + + + 그랜드 터크 + + + 엔자메나 + + + 케르켈렌 + + + 로메 + + + 방콕 + + + 두샨베 + + + 파카오푸 + + + 딜리 + + + 아쉬가바트 + + + 튀니스 + + + 통가타푸 + + + 이스탄불 + + + 포트오브스페인 + + + 푸나푸티 + + + 타이베이 + + + 다르에스살람 + + + 우주고로트 + + + 키예프 + + + 심페로폴 + + + 자포로지예 + + + 캄팔라 + + + 미드웨이 + + + 존스톤 + + + 웨이크 + + + 에이닥 + + + + + + 호놀룰루 + + + 앵커리지 + + + 야쿠타트 + + + 주노 + + + 로스앤젤레스 + + + 보이시 + + + 피닉스 + + + 십록 + + + 덴버 + + + 노스 다코타주, 뉴살렘 + + + 중부, 노스다코타 + + + 시카고 + + + 메노미니 + + + 인디아나주, 뱅센 + + + 인디애나주, 피츠버그 + + + 인디아나주, 텔시티 + + + 인디애나주 녹스 + + + 인디아나주, 워너맥 + + + 인디애나주, 마렝고 + + + 인디애나폴리스 + + + 루이빌 + + + 자포로제 + + + 켄터키주, 몬티첼로 + + + 디트로이트 + + + 뉴욕 + + + 몬테비데오 + + + 사마르칸트 + + + 타슈켄트 + + + 세인트 빈센트 + + + 카라카스 + + + 토르톨라 + + + 세인트 토마스 + + + 사이공 + + + 에파테 + + + 월리스 + + + 아피아 + + + 아덴 + + + 메요트 + + + 요하네스버그 + + + 루사카 + + + 하라레 + + + + 아크레 표준시 + 아크레 하계 표준시 + + + ACT (아크레) + ACST (아크레) + + false + + + false + + + + 중앙아프리카 시간 + + false + + + + 동아프리카 시간 + + false + + + false + + + + 남아프리카 시간 + 남아프리카 표준시 + + false + + + + 서아프리카 시간 + 서아프리카 하계 표준시 + + false + + + false + + + + 알래스카 표준시 + 알래스카 하계 표준시 + + false + + + false + + + false + + + + 아마존 표준시 + 아마존 하계 표준시 + + false + + + + 중부 표준시 + 중부 표준시 + 미 중부 하계 표준시 + + false + + + + 동부 표준시 + 동부 표준시 + 미 동부 하계 표준시 + + false + + + + 산지 표준시 + 산악 표준시 + 미 산지 하계 표준시 + + false + + + + 태평양 표준시 + 태평양 표준시 + 미 태평양 하계 표준시 + + false + + + false + + + false + + + false + + + + 아라비아 시간 + 아라비아 표준시 + 아라비아 하계 표준시 + + + AT(아라비아) + AST(아라비아) + ADT(아라비아) + + false + + + false + + + false + + + false + + + false + + + + 대서양 표준시 + 대서양 표준시 + 미 대서양 하계 표준시 + + false + + + + 중앙 오스트레일리아 시간 + 오스트레일리아 중부 표준시 + 오스트레일리아 중부 하계 표준시 + + false + + + + 오스트레일리아 중서부 시간 + 오스트레일리아 중서부 표준시 + 오스트레일리아 중서부 하계 표준시 + + false + + + + 동부 오스트레일리아 시간 + 오스트레일리아 동부 표준시 + 오스트레일리아 동부 하계 표준시 + + false + + + + 서부 오스트레일리아 시간 + 오스트레일리아 서부 표준시 + 오스트레일리아 서부 하계 표준시 + + false + + + false + + + + 아조레스 표준시 + 아조레스 하계 표준시 + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + + 브라질리아 표준시 + 브라질리아 하계 표준시 + + false + + + false + + + + 카보 베르데 표준시 + 카보 베르데 하계 표준시 + + false + + + + 차모로 시간 + 차모로 표준시 + + false + + + false + + + + 채텀 표준시 + 채텀 하계 표준시 + + false + + + false + + + + 중국 표준시 + 중국 하계 표준시 + + + CST (중국) + + false + + + false + + + + 크리스마스섬 표준시 + + false + + + + 코코스섬 표준시 + + false + + + false + + + + 쿡제도 표준시 + 쿡제도 하계 표준시 + + false + + + false + + + false + + + + 데이비스 표준시 + + false + + + false + + + + 뒤몽 뒤르빌 표준시 + + false + + + false + + + false + + + false + + + + 이스터섬 표준시 + 이스터섬 하계 표준시 + + false + + + false + + + + 중부유럽 표준시 + 중부유럽 하계 표준시 + + false + + + + 동부유럽 표준시 + 동부유럽 하계 표준시 + + false + + + + 서부 유럽 시간 + 서부 유럽 하계 표준시 + + false + + + + 포클랜드 표준시 + 포클랜드 하계 표준시 + + false + + + + 피지 표준시 + 피지 하계 표준시 + + false + + + false + + + + 프랑스령 남쪽식민지 표준시 + + false + + + false + + + + 그리니치 표준시 + + false + + + + 갈라파고스 표준시 + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + + 홍콩 시간 + 홍콩 하계 표준시 + + false + + + false + + + + 인도 표준시 + + false + + + + 영국령 인도양 식민지 표준시 + + false + + + + 인도차이나 시간 + + false + + + + 중앙인도네시아 시간 + + false + + + + 동인도네시아 시간 + + false + + + + 서인도네시아 시간 + + false + + + false + + + false + + + false + + + + 이스라엘 표준시 + 이스라엘 하계 표준시 + + + IST (이스라엘) + + false + + + + 일본 표준시 + 일본 하계 표준시 + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + + 한국 표준시 + 한국 하계 표준시 + + true + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + + 로드 하우 시간 + 로드 하우 표준시 + 로드 하우 하계 표준시 + + false + + + false + + + false + + + false + + + false + + + + 몰디브 표준시 + + false + + + false + + + false + + + + 모리셔스 표준시 + + false + + + + 모슨 표준시 + + false + + + false + + + + 모스크바 표준시 + 모스크바 하계 표준시 + + false + + + false + + + false + + + false + + + false + + + + 뉴질랜드 시간 + 뉴질랜드 표준시 + 뉴질랜드 하계 표준시 + + false + + + + 뉴펀들랜드 표준시 + 뉴펀들랜드 하계 표준시 + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + + 리유니온 표준시 + + false + + + + 로데라 표준시 + + false + + + false + + + false + + + false + + + false + + + + 세이셸 표준시 + + false + + + false + + + false + + + false + + + + 사우스 조지아 표준시 + + + GST (사우스 조지아) + + false + + + false + + + false + + + + 쇼와 표준시 + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + + 모스토크 표준시 + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + + + + . + , + ; + % + 0 + # + + + - + E + + + NaN + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + ¤#,##0.00 + + + {0} {1} + + + + 안도라 페세타 + + + 아랍에미리트 디르함 + + + 아프가니 (1927-2002) + + + 아프가니 + + + 알바니아 레크 + 레크 + + + 아르메니아 드람 + 드램 + + + 네덜란드령 안틸레스 길더 + + + 앙골라 콴자 + + + 앙골라 콴자 (1977-1990) + + + 앙골라 신콴자 (1990-2000) + + + 앙골라 콴자 Reajustado (1995-1999) + + + 아르헨티나 오스트랄 + + + 아르헨티나 페소 (1983-1985) + + + 아르헨티나 페소 + + + 호주 실링 + + + 호주 달러 + A$ + + + 아루바 길더 + + + 아제르바이젠 마나트 + + + 아제르바이잔 마나트 + + + 보스니아-헤르체고비나 디나르 + + + 보스니아-헤르체고비나 태환 마르크 + + + 바베이도스 달러 + BDS$ + + + 방글라데시 타카 + + + 벨기에 프랑 (태환) + + + 벨기에 프랑 + + + 벨기에 프랑 (금융) + + + 불가리아 동전 렛 + + + 불가리아 신권 렛 + + + 바레인 디나르 + + + 부룬디 프랑 + + + 버뮤다 달러 + BM$ + + + 부루나이 달러 + B$ + + + 볼리비아노 + + + 볼리비아노 페소 + + + 볼리비아노 크루제이루 노보 (1967-1986) + + + 브라질 크루자두 + + + 브라질 크루제이루 (1990-1993) + + + 브라질 레알 + + + 브라질 크루자두 노보 + + + 브라질 크루제이루 + + + 바하마 달러 + + + 부탄 눌투눔 + + + 버마 차트 + + + 보츠와나 폴라 + + + 벨라루스 신권 루블 (1994-1999) + + + 벨라루스 루블 + + + 벨리즈 달러 + BZ$ + + + 캐나다 달러 + Can$ + + + 콩고 프랑 콩골라스 + + + WIR 유로 + + + 스위스 프랑 + + + WIR 프랑 + + + 칠레 페소 + Ch$ + + + 중국 위안 인민폐 + ¥ + + + 콜롬비아 페소 + Col$ + + + 코스타리카 콜론 + + + 고 세르비아 디나르 + + + 체코슬로바키아 동전 코루나 + + + 쿠바 페소 + + + 카보베르데 에스쿠도 + + + 싸이프러스 파운드 + £C + + + 체코 공화국 코루나 + + + 동독 오스트마르크 + + + 독일 마르크 + + + 지부티 프랑 + + + 덴마크 크로네 + + + 도미니카 페소 + RD$ + + + 알제리 디나르 + + + 에쿠아도르 수크레 + + + 에스토니아 크룬 + + + 이집트 파운드 + + + 에리트리아 나크파 + + + 스페인 페세타(예금) + + + 스페인 페세타(변환 예금) + + + 스페인 페세타 + + + 이디오피아 비르 + + + 유로화 + + + 핀란드 마르카 + + + 피지 달러 + F$ + + + 포클랜드제도 파운드 + + + 프랑스 프랑 + + + + 영국령 파운드 스털링 + + + 그루지야 지폐 라리트 + + + 그루지야 라리 + + + 가나 시디 + + + 지브롤터 파운드 + + + 감비아 달라시 + + + 기니 프랑 + + + 기니 시리 + + + 그리스 드라크마 + + + 과테말라 케트살 + + + 포르투갈령 기니 에스쿠도 + + + 기네비쏘 페소 + + + 가이아나 달러 + G$ + + + 홍콩 달러 + HK$ + + + 온두라스 렘피라 + + + 크로아티아 디나르 + + + 크로아티아 쿠나 + + + 하이티 구르드 + + + 헝가리 포린트 + + + 인도네시아 루피아 + + + 아일랜드 파운드 + IR£ + + + 이스라엘 파운드 + + + 이스라엘 신권 세켈 + + + 인도 루피 + 0≤Rs.|1≤Re.|1<Rs. + + + 이라크 디나르 + + + 이란 리얄 + + + 아이슬란드 크로나 + + + 이탈리아 리라 + + + + 자메이카 달러 + + + 요르단 디나르 + + + 일본 엔 + + + + 케냐 실링 + + + 키르기스스탄 솜 + + + 캄보디아 리얄 + + + 코모르 프랑 + + + 조선 민주주의 인민 공화국 원 + + + + 대한민국 원 + + + + 쿠웨이트 디나르 + + + 케이맨 제도 달러 + + + 카자흐스탄 텐게 + + + 라오스 키프 + + + 레바논 파운드 + + + 스리랑카 루피 + + + 라이베리아 달러 + + + 레소토 로티 + + + 로티 + + + 리투아니아 리타 + + + 룩셈부르크 타로나 + + + 룩셈부르크 변환 프랑 + + + 룩셈부르크 프랑 + + + 룩셈부르크 재정 프랑 + + + 라트비아 라트 + + + 라트비아 루블 + + + 리비아 디나르 + + + 모로코 디렘 + + + 모로코 프랑 + + + 몰도바 레이 + + + 마다가스카르 아리아리 + + + 마다가스카르 프랑 + + + 마케도니아 디나르 + + + 말리 프랑 + + + 미얀마 키얏 + + + 몽골 투그릭 + + + 마카오 파타카 + + + 모리타니 우기야 + UM + + + 몰타 리라 + + + 몰타 파운드 + + + 모리셔스 루피 + + + 몰디브 제도 루피아 + + + 말라위 콰쳐 + + + 멕시코 페소 + + + 멕시코 실버 페소 (1861-1992) + + + 멕시코 UDI(Unidad de Inversion) + + + 말레이시아 링깃 + + + 모잠비크 에스쿠도 + + + 고 모잠비크 메티칼 + + + 모잠비크 메티칼 + + + 나미비아 달러 + + + 니제르 나이라 + + + 니카라과 코르도바 + + + 니카라과 코르도바 오로 + + + 네델란드 길더 + + + 노르웨이 크로네 + + + 네팔 루피 + + + 뉴질랜드 달러 + + + 오만 리얄 + + + 파나마 발보아 + + + 페루 인티 + + + 페루 솔 누에보 + + + 페루 솔 + + + 파푸아뉴기니 키나 + + + 필리핀 페소 + + + 파키스탄 루피 + + + 폴란드 즐로티 + + + 폴란드 즐로티 (1950-1995) + + + 포르투갈 에스쿠도 + + + 파라과이 과라니 + + + 카타르 리얄 + + + 로디지아 달러 + + + 루마니아 레이 + + + 루마니아 레우 + + + 세르비아 디나르 + + + 러시아 루블 + + + 러시아 루블 (1991-1998) + + + 르완다 프랑 + + + 사우디아라비아 리얄 + + + 솔로몬 제도 달러 + + + 세이쉴 루피 + + + 수단 디나르 + + + 수단 파운드 + + + 스웨덴 크로나 + + + 싱가폴 달러 + S$ + + + 세인트헬레나 파운드 + + + 슬로베니아 톨라르 + + + 슬로바키아 코루나 + + + 시에라리온 리온 + + + 소말리아 실링 + + + 수리남 달러 + + + 수리남 길더 + + + 상투메 프린시페 도브라 + + + 소련 루블 + + + 엘살바도르 콜론 + + + 시리아 파운드 + + + 스와질란드 릴랑게니 + + + 태국 바트 + + + 타지키스탄 루블 + + + 타지키스탄 소모니 + + + 투르크메니스탄 마나트 + + + 튀니지 디나르 + + + 통가 파앙가 + + + 티모르 에스쿠도 + + + 터키 리라 + + + 새로운 터키 리라 + + + 트리니다드 토바고 달러 + + + 대만 신권 달러 + NT$ + + + 탄자니아 실링 + + + 우크라이나 그리브나 + + + 우크라이나 카보바네츠 + + + 우간다 실링 (1966-1987) + + + 우간다 실링 + + + 미국 달러 + + + 미국 달러(다음날) + + + 미국 달러(당일) + + + 우루과이 페소 (1975-1993) + + + 우루과이 페소 우루과요 + + + 우즈베키스탄 숨 + + + 베네주엘라 볼리바르 + + + 베트남 동 + + + 바누아투 바투 + + + 서 사모아 탈라 + + + CFA 프랑 BEAC + + + 은화 + + + + + + 유르코 (유럽 회계 단위) + + + 유럽 통화 동맹 + + + 유럽 계산 단위 (XBC) + + + 유럽 계산 단위 (XBD) + + + 동카리브 달러 + + + 특별인출권 + + + 유럽 환율 단위 + + + 프랑스 Gold 프랑 + + + 프랑스 UIC-프랑 + + + CFA 프랑 BCEAO + + + 팔라듐 + + + CFP 프랑 + + + 백금 + + + RINET 기금 + + + 테스트 통화 코드 + + + 알수없거나 유효하지않은 통화단위 + + + 예멘 디나르 + + + 예멘 리알 + + + 유고슬라비아 동전 디나르 + + + 유고슬라비아 노비 디나르 + + + 유고슬라비아 전환 디나르 + + + 남아프리카 랜드 (금융) + + + 남아프리카 랜드 + + + 쟘비아 콰쳐 + + + 자이르 신권 자이르 + + + 자이르 자이르 + + + 짐비브웨 달러 + + + + + + {0} 일 + + + {0} 시 + + + {0} 분 + + + {0} 월 + + + {0} 초 + + + {0} 주 + + + {0} 년 + + + + + + 아니오 + + + diff --git a/libs/Zend/Locale/Data/ko_KR.xml b/libs/Zend/Locale/Data/ko_KR.xml new file mode 100644 index 0000000..a1553cf --- /dev/null +++ b/libs/Zend/Locale/Data/ko_KR.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/kok.xml b/libs/Zend/Locale/Data/kok.xml new file mode 100644 index 0000000..81eb4ee --- /dev/null +++ b/libs/Zend/Locale/Data/kok.xml @@ -0,0 +1,368 @@ + + + + + + + + + + + अफार + अबखेज़ियन + अफ्रिकान्स + अमहारिक् + अरेबिक् + असामी + ऐमरा + अज़रबैजानी + बष्किर + बैलोरुसियन् + बल्गेरियन + बीहारी + बिसलमा + बंगाली + तिबेतियन + ब्रेटन + कटलान + कोर्शियन + ज़ेक् + वेळ्ष् + डानिष + जर्मन + भूटानी + ग्रीक् + आंग्ल + इस्परान्टो + स्पानिष + इस्टोनियन् + बास्क + पर्षियन् + फिन्निष् + फिजी + फेरोस् + फ्रेन्च + फ्रिशियन् + ऐरिष + स्काटस् गेलिक् + गेलीशियन + गौरानी + गुजराती + हौसा + हेब्रु + हिन्दी + क्रोयेषियन् + हंगेरियन् + आर्मीनियन् + इन्टरलिंग्वा + इन्डोनेषियन + इन्टरलिंग् + इनूपेयाक् + आईस्लान्डिक + इटालियन + इन्युकट्ट + जापनीस् + जावनीस् + जार्जियन् + कज़ख् + ग्रीनलान्डिक + कंबोडियन + कन्नडा + कोरियन् + कोंकणी + कश्मीरी + कुर्दिष + किर्गिज़ + लाटिन + लिंगाला + लाओतियन् + लिथुआनियन् + लाट्वियन् (लेट्टिष्) + मलागसी + माओरी + मसीडोनियन् + मळियाळम + मंगोलियन् + मोल्डावियन् + मराठी + मलय + मालतीस् + बर्मीज़् + नौरो + नेपाळी + डच् + नोर्वेजियन + ओसिटान् + ओरोमो (अफान) + ओरिया + पंजाबी + पोलिष + पाष्टो (पुष्टो) + पोर्चुगीज़् + क्वेच्वा + रहटो-रोमान्स् + किरुन्दी + रोमानियन् + रष्यन् + किन्यार्वान्डा + संस्कृत + सिंधी + सांग्रो + सेर्बो-क्रोयेषियन् + सिन्हलीस् + स्लोवाक + स्लोवेनियन् + समोन + शोना + सोमाळी + आल्बेनियन् + सेर्बियन् + सिस्वाती + सेसोथो + सुंदनीस + स्वीदीष + स्वाहिली + तमिळ + तेलुगू + तजिक + थाई + तिग्रिन्या + तुर्कमन + तगालोग + सेत्स्वाना + तोंगा + तुर्किष + त्सोगा + तटार + त्वि + उधूर + युक्रेनियन् + उर्दू + उज़बेक + वियत्नामीज़ + ओलापुक + उलोफ़ + झ़ौसा + इद्दिष् + यूरुबा + झ्हुन्ग + चीनीस् + जुलू + + + भारत + + + + [़ ँ-ः ०-९ ॐ अ-ऍ ए-ऑ ओ-क {क़} ख {ख़} ग {ग़} घ-ज {ज़} झ-ड {ड़} ढ {ढ़} ण-न प फ {फ़} ब-य {य़} र ल ळ व-ह ऽ-ॅ े-ॉ ो-्] + [\u200C \u200D] + + + + + + + + जानेवारी + फेबृवारी + मार्च + एप्रिल + मे + जून + जुलै + ओगस्ट + सेप्टेंबर + ओक्टोबर + नोव्हेंबर + डिसेंबर + + + जानेवारी + फेब्रुवारी + मार्च + एप्रिल + मे + जून + जुलै + ओगस्ट + सेप्टेंबर + ओक्टोबर + नोव्हेंबर + डिसेंबर + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + रवि + सोम + मंगळ + बुध + गुरु + शुक्र + शनि + + + आदित्यवार + सोमवार + मंगळार + बुधवार + गुरुवार + शुक्रवार + शनिवार + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + म.पू. + म.नं. + + + क्रिस्तपूर्व + क्रिस्तशखा + + + + + + EEEE d MMMM yyyy + + + + + d MMMM yyyy + + + + + dd-MM-yyyy + + + + + d-M-yy + + + + + + + h:mm:ss a v + + + + + h:mm:ss a z + + + + + h:mm:ss a + + + + + h:mm a + + + + + + + {1} {0} + + + + d MMMM + dd-MM + Q yy + MM-yyyy + MMMM yyyy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + भारतीय समय + + true + + + + + + + + #,##,##0.### + + + + + + + #,##,##0% + + + + + + + ¤ #,##,##0.00 + + + + + + रु + + + + diff --git a/libs/Zend/Locale/Data/kok_IN.xml b/libs/Zend/Locale/Data/kok_IN.xml new file mode 100644 index 0000000..4e91237 --- /dev/null +++ b/libs/Zend/Locale/Data/kok_IN.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/kpe.xml b/libs/Zend/Locale/Data/kpe.xml new file mode 100644 index 0000000..f1da482 --- /dev/null +++ b/libs/Zend/Locale/Data/kpe.xml @@ -0,0 +1,182 @@ + + + + + + + + + + [a b ɓ d e ə ɛ f g ĝ {gb} {gw} ɣ h-k {kp} {kw} l-n {ny} ɲ ŋ {ŋw} o ɔ p t-w y z] + + + + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + AM + PM + + + BCE + CE + + + + + + EEEE, yyyy MMMM dd + + + + + yyyy MMMM d + + + + + yyyy MMM d + + + + + yy/MM/dd + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1} {0} + + + + Q yy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + diff --git a/libs/Zend/Locale/Data/kpe_GN.xml b/libs/Zend/Locale/Data/kpe_GN.xml new file mode 100644 index 0000000..da262e0 --- /dev/null +++ b/libs/Zend/Locale/Data/kpe_GN.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/kpe_LR.xml b/libs/Zend/Locale/Data/kpe_LR.xml new file mode 100644 index 0000000..7f3642c --- /dev/null +++ b/libs/Zend/Locale/Data/kpe_LR.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/ku.xml b/libs/Zend/Locale/Data/ku.xml new file mode 100644 index 0000000..813ab1d --- /dev/null +++ b/libs/Zend/Locale/Data/ku.xml @@ -0,0 +1,136 @@ + + + + + + + + + + + ئه‌فریكای + ئه‌مهه‌رینجی + عه‌ره‌بی + ئا سسامی (زوبان) + ئازه‌ربایجانی + بێلاڕووسی + بۆلگاری + بیهاری + به‌نگلادێشی + برێتونی + بۆسنی + كاتالۆنی + چه‌كی + وێلزی + دانماركی + ئاڵمانی + یۆنانی + ئینگلیزی + ئێسپیرانتۆ + ئیسپانی + ئیستۆنی + باسكی + فارسی + فینله‌ندی + تاگالۆگی + فه‌رئۆیی + فه‌رانسی + فریسی + ئیرله‌ندی + گه‌لیكی سكۆتله‌ندی + گالیسی + گووارانی + گوجاراتی + هیبرێ + هیندی + كرواتی + هه‌نگاری (مه‌جاری) + ئه رمه نی + ئینترلینگوی + ئێه‌ندونیزی + ئه نته ر لينگ (زوبان) + ئیسله‌ندی + ئیتالی + ژاپۆنی + جاڤانی + گۆرجستانی + کامبۆجی (زوبان) + كه‌نه‌دایی + كۆری + كوردی + كرگیزی + لاتینی + لينگالا + لاو‏ى + لیتوانی + لێتۆنی + ماكێدۆنی + مالایلام + مه‌نگۆلی + ماراتی + مالیزی + ماڵتایی + نێپالی + هۆڵه‌ندی + نۆروێژی + ئۆسیتانی + ئۆرییا + په‌نجابی + پۆڵۆنیایی (له‌هستانی) + په‌شتوو + پۆرتۆگالی + پورتوگاڵی (برازیل) + پورتوگاڵی (پورتوگاڵ) + ڕۆمانی + ڕووسی + سانسکريت + سيندی(زوبان) + سێربۆكرواتی + سینهه‌لی + سلۆڤاكی + سلۆڤێنی + سۆمالی + ئاڵبانی + سه‌ربی + سێسۆتۆ + سودانی + سویدی + سواهیلی + تامیلی + ته‌لۆگوی + تایله‌ندی + تیگرینیای + تروكمانی + كلینگۆن + توركی + توی + ئويخووری + ئۆكراینی + ئۆردو‌و + ئۆزبه‌كی + ڤیه‌تنامی + سسوسا + یوددی + زولو + + + + + + + [ئ-ب پ ت ج چ ح-د ر ز ڕ ژ س ش ع غ ف ڤ ق ک گ ل ڵ م-ه ھ و ۆ ی ێ] + [ً-ْ ء-ة ث ذ ص-ظ ك ى ي] + + + + + + + Q yy + + + + + + + diff --git a/libs/Zend/Locale/Data/ku_Arab.xml b/libs/Zend/Locale/Data/ku_Arab.xml new file mode 100644 index 0000000..1635c8f --- /dev/null +++ b/libs/Zend/Locale/Data/ku_Arab.xml @@ -0,0 +1,10 @@ + + + + + + + + + + + Cîhan + Tirkiye + + + salname + rêzkirin + + + mîladî + hîcrî + + + + [a-c ç d e ê f-i î j-s ş t u û v-z] + + + + + + + + çil + sib + adr + nîs + gul + hez + tîr + + + çile + sibat + adar + nîsan + gulan + hezîran + + + + + ç + s + a + n + g + h + + + + + + + + + + çş + + în + ş + + + yekşem + duşem + şê + çarşem + pêncşem + în + şemî + + + + + y + d + s + ç + p + î + ş + + + + + + + Ç1 + Ç2 + Ç3 + Ç4 + + + Ç1 + Ç2 + Ç3 + Ç4 + + + + BN + PN + + + BZ + PZ + + + + + + yy/MM/dd + + + + + + sal + + + meh + + + hefte + + + roj + + + demjimêr + + + xulek + + + çirke + + + + + + + + muẖerem + sefer + rebîʿulewel + rebîʿulaxer + cemazîyelewel + cemazîyelaxer + receb + şeʿban + remezan + şewal + zîlqeʿde + zîlẖece + + + + + + + + + erê:e + na:n + + + + diff --git a/libs/Zend/Locale/Data/ku_Latn_TR.xml b/libs/Zend/Locale/Data/ku_Latn_TR.xml new file mode 100644 index 0000000..ff1d3b7 --- /dev/null +++ b/libs/Zend/Locale/Data/ku_Latn_TR.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + + + + mokili mobimba + Afríka + Ameríka ya Sídi + Afríka ya límbe + Afríka ya Nola + Afríka ya Sídi + Azía + Erópa + Erópa ya Nola + Erópa ya límbe + Andora + Afganistáni + Antigua mpé Barbuda + Angóla + Argentina + Albania + Bosnia na Erzegovina + Bángaladɛ́si + Bɛ́ljika + Burkina Faso + Bulgaria + Burundi + Bresíli + Butáni + Botswana + Bielorusia + Kanadá + Kongó-Kinsásá + Santrafríka + Kongó-Brazzaville + Swisi + Kamerun + Sína + Republiki Sheki + Alémani + Djibuti + Aljeria + Ejipti + Sahara ya límbe + Espania + Etiopya + Finilanda + Falansia + Ingɛlɛ́tɛlɛ + Ghana + Gibraltar + Gambia + Gine + Gresi + Gine-Bisau + Kroasia + Ungri + Indoneziá + Irlandí + Ɛndɛ + Islandi + Italia + Zordaní + Yapan + Kenya + Kirghizistáni + KI + Kore ya Nola + Kore ya Sidi + Kazakstáni + Liban + Liberia + Litwani + Luksamburg + Letoni + Libíya + Masedoni + Mali + Mongolí + Makau + Madívi + Mozambíki + Namibia + Nijé + Nijeria + Holanda + Norvej + Nepáli + Pakistáni + Poloni + Pulutugal + Rumania + Rusí + Rwanda + Sudani + Swési + Santu Helena + Santu Marino + Somalia + Sǎo Tomé na Principe + Sirí + Togo + Tazikistáni + Turkmenistáni + Tunizia + Turkí + Trinidad mpé Tobago + Taiwan + Etazíni + Uzbekistáni + Vatikáni + Vietnami + Yeméni + Sidafríka + Zambia + Zimbabwe + Esíká eyébámí tɛ́ + + + manáka + elandiseli + mbɔ́ngɔ + + + manáka ya Gregor + + + na míli + na mɛ́tɛlɛ + + + + [a á â ǎ b-e é ê ě ɛ {ɛ́} {ɛ̂} {ɛ̌} f g {gb} h i í î ǐ k-m {mb} {mp} n {nd} {ng} {nk} {ns} {nt} {nz} o ó ô ǒ ɔ {ɔ́} {ɔ̂} {ɔ̌} p r-u ú û ǔ v w y z] + [j q x] + [c f F] + + + « + » + + + + + + + + + + s1 + s2 + s3 + s4 + s5 + s6 + s7 + s8 + s9 + s10 + s11 + s12 + + + sánzá ya yambo + sánzá ya míbalé + sánzá ya mísáto + sánzá ya mínei + sánzá ya mítáno + sánzá ya motóbá + sánzá ya nsambo + sánzá ya mwambe + sánzá ya libwa + sánzá ya zómi + sánzá ya zómi na mɔ̌kɔ́ + sánzá ya zómi na míbalé + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + eye + m1 + m2 + m3 + m4 + m5 + mps + + + eyenga + mokɔlɔ ya libosó + mokɔlɔ ya míbalé + mokɔlɔ ya mísáto + mokɔlɔ ya mínéi + mokɔlɔ ya mítáno + mpɔ́sɔ + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + SM1 + SM2 + SM3 + SM4 + + + sánzá mísáto ya yambo + sánzá mísáto ya míbalé + sánzá mísáto ya mísáto + sánzá mísáto ya mínei + + + + AM + PM + + + libosó ya Y.-K. + nsima ya Y.-K. + + + libosó ya Y.-K. + nsima ya Y.-K. + + + + + + EEEE, yyyy MMMM dd + + + + + yyyy MMMM d + + + + + yyyy MMM d + + + + + yy/MM/dd + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1} {0} + + + + Q yy + + + + + mokɔlɔ + lɛlɔ́ + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + Kinsásá + + + Santrafríka + + + + + + . + + + + falánga ya Bɛ́ljika + + + falánga ya Burundi + + + falánga kongolé + Fc + + + Falánga ya Swisi + Fr. + + + Falánga ya Falansia + + + Falánga CFA BCEAO + + + Falánga CFP + + + mbɔ́ngɔ eyébámí tɛ́ + XXX + + + + + diff --git a/libs/Zend/Locale/Data/ln_CD.xml b/libs/Zend/Locale/Data/ln_CD.xml new file mode 100644 index 0000000..b8f2d7b --- /dev/null +++ b/libs/Zend/Locale/Data/ln_CD.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/ln_CG.xml b/libs/Zend/Locale/Data/ln_CG.xml new file mode 100644 index 0000000..b466a8a --- /dev/null +++ b/libs/Zend/Locale/Data/ln_CG.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/lo.xml b/libs/Zend/Locale/Data/lo.xml new file mode 100644 index 0000000..429a96e --- /dev/null +++ b/libs/Zend/Locale/Data/lo.xml @@ -0,0 +1,620 @@ + + + + + + + + + + + ອາຟາ + ແອບຄາເຊຍ + ອັຟຣິກາ + ອຳຫາຣິກ + ອາຣັບ + ອັສສຳ + ໄອມາລາ + ອາແຊກບາຍຊານ + ບາສສີ + ເບລາລຸດຊີ + ບຸນກາຣີ + ບີຮາຣີ + ບິສລາມາ + ເບັງການ + ທິເບດ + ບເຣີຕົງ + ບອສນີ + ກາຕາລັງ + ຄໍຊິກ້າ + ເຊັກ + ແວວ + ເດັນມາກ + ເຍຍລະມັນ + ພູຖານີ + ກເຣັກ + ອັງກິດ + ເອສເປຣັງໂຕ + ແອສປາໂຍນ + ເອສໂຕນີ + ບັສເກີ + ເປີເຊຍ + ແຟງລັງ + ຕາກາລ໊ອກ + ຟິຈິ + ຟາໂຣ + ຝຣັ່ງ + ຟຣີຊຽນ + ໄອແລນ + ສະກັອດ ແກລິກ + ກາລິດ + ກົວຣານີ + ກູຊາຣາຕີ + ໂອຊາ + ຍິວ + ຮິນດູ + ໂກຣອາຊີ + ຮັງກາຣີ + ອາກເມນີ + ອິນເຕີລິງກາ + ອິນໂດເນເຊຍ + ອິນເຕີລິງ + ໄອນູປຽກ + ອິສລັງ + ອີຕາລີ + ໄອນຸກຕິຕັກ + ຍີ່ປຸ່ນ + ຊວາ + ຊອກຊີ + ຄາຊັກ + ກຼີນແລນດິດ + ກຳປູເຈຍ + ກັນນາດາ + ເກົາຫຼີ + ຄັດຊະມີລີ + ເຄີດິສ + ເກຍກິສ + ລາແຕັງ + ລິງກາລາ + ລາວ + ລີທົວນີ + ລັດເວຍ + ມາລາກາຊິ + ເມົາລີ + ມາເຊໂດນີ + ມາລາຢາລຳ + ມົງໂກນ + ໂມຄາເວຍ + ມາຣາທີ + ມາເລ + ມານຕາ + ພະມ່າ + ນໍລູ + ເນປານ + ໂຮນລັງ + ນອກແວ (ນີນອກ) + ນອກແວ + ອົກຊີຕານ + ໂອໂລໂມ(ອາຟານ) + ໂອຣີຢາ + ປັນຈາບ + ໂປໂລຍ + ປາສໂຕ + ປອກຕຸຍການ + ປອກຕຸຍການ (ບຣາຊີນ) + ປອກຕຸຍການ (ປອກຕຸຍການ) + ຄິວຊົວ + ເລໂຕ-ໂລແມນ + ຄິລັນສີ + ໂຣມານີ + ລັດເຊຍ + ຄິນຍາວັນດາ + ສັນສະກິດ + ສິນທິ + ສັນໂຄ + ແຊັກໂບ-ໂກຣແອັດ + ສິງຫານ + ສະໂລວັກກີ + ສະໂລວານີ + ຊາມົວ + ໂຊນາ + ໂຊມາລີ + ອານບານີ + ແຊກບີ + ຊິສວາຕິ + ເຊໂຊໂທ + ຊັນດານ + ຊູແອັດ + ຊວາຮີລີ + ທະມິນ + ເຕລູກູ + ທາຈິດ + ໄທ + ຕີກຣິນຢາ + ຕວຽກເມນ + ຕາກາລັອກ + ກລິງກອງ + ເຊຕະສະວານາ + ທອງກ້າ + ຕວກກີ + ຊອງກາ + ຕາດ + ຕວີ + ອຸຍເຄີ + ອູແກຣນ + ອູຣະດູ + ອຸດຊະເບັກກິດສະຖານ + ຫວຽດນາມ + ໂວລາພຸກ + ວູບ + ໂຊຊາ + ຢິດດິສ + ໂຢລູບາ + ຈວງ + ຈີນ + ຊູລູ + + + ອັນດໍລາ + ສະຫະລັດອາຫລັບເອມິເລດ + ອັຟການິດສະຖານ + ອັນກິລາ + ແອລເບເນຍ + ອາມິເນຍ + ເນເທີແລນແອນເທິນ + ອັນໂກລາ + ອາເຈນຕິນາ່ + ອົອດສະເຕຼຍ + ອົອດສະຕາລີ + ອາລູບາ + ອາເຊີໄບຈັນ + ບັອດສເນຍ ແລະ ເຮີດໂກວິເນຍ + ບາບາຄັອດ + ບັງກະລາເທດ + ເບວຢຽມ + ເບີກິນາຟາໂຊ + ບັງກາເລຍ + ບາເລນ + ບູລັນຕິ + ເບນິນ + ເບີມິວດາ + ບູຮໄນ + ໂບລິເວຍ + ບຼາຊິວ + ບາຮາມາສ + ພູຖານ + ບອັດສະວານາ + ເບນລາຮັສ + ເບລິຊ + ການາດາ + ສາທາລະນະລັດອັບຟຼິກກາກາງ + ຄອງໂກ + ສະວິດເຊີແລນ + ຝັ່ງທະເລໄອວໍລິ + ຊິສິ + ຄາເມລູນ + ຈີນ + ໂຄລຳເບຍ + ຄອສຕາລິກາ + ເຊີເບຍ + ຄິວບາ + ເຄບວອດ + ໄຊປັຼດ + ສາທາລະນະລັດເຊັກ + ເຢຍລະມັນ + ຄິໂບຕິ + ເດນມາກ + ໂດເມນິກາ + ສາທາລະນະລັດໂດມິນິກັນ + ແອລຈິເລຍ + ເອກວາດໍ + ເອສໂຕເນຍ + ອີຢິບ + ຊາຮາລາຕະເວັນຕົກ + ອິນຊີ + ສະເປນ + ເອທິໂອເປຍ + ຟິນແລນ + ຟິຈິ + ໄມໂຄນິເຊຍ + ຝລັ່ງ + ກາບອນ + ສະຫະລາດຊະອານາຈັກ + ຈໍເຈຍ + ເຟັນສກິວນາ + ການ່າ + ແກມເບຍ + ກິວນີ + ກົວເດີລູບ + ເອຄົວໂທເລຍລະກິນີ + ກິຼກ + ກົວເຕມາລາ + ກິວນີ-ບິສໂຊ + ກູຢານາ + ຮ່ອງກົງ + ອວນຄູຣັສ + ໂຄເອເຊຍ + ໄອທີ + ຮົງກາຣີ + ອິນໂດເນເຊຍ + ໄອແລນ + ອິສລະເອວ + ອິນເດຍ + ອີລັກ + ອີລ່ານ + ໄອສແລນ + ອິຕາລີ + ຈາໄມກາ + ຈໍແດນ + ຍີ່ປຸ່ນ + ເຄນຢ່າ + ເດີກິດສະຖານ + ກຳປູເຈຍ + ຄີລິບາດ + ໂຄໂມຣອດ + ເກົາຫລີເໜືອ + ເກົາຫລີໃຕ້ + ຄູເວດ + ຄາຊັດສະຖານ + ລາວ + ເລບານອນ + ໄລເທນສະໄຕ + ສີລັງກາ + ລິເບີເລຍ + ເລໂຊໂທ + ລິເທີເນຍ + ລຸກແຊມເບີກ + ລຼາດເວຍ + ລິເບຍ + ໂມລັອກໂຄ + ໂມນາໂກ + ໂມນໂຄວາ + ມາຄາກັສກາ + ແມຊິໂຄເນຍ + ມາລິ + ສະຫະພາບພະມ້າ + ມົງໂກລີ + ມາເກົ້າ + ມາຕິນິກ + ມໍລິກທາເນຍ + ມອນເຊີລາດ + ມັນຕາ + ມໍຣິຕຽດ + ແມັກຊິໂກ + ມາເລເຊຍ + ໂມແຊມບິກ + ນາມິເບຍ + ນິວຄາລິໂຄເນຍ + ໄນເຈີ + ໄນຈີເລຍ + ນິຄາລາກົວ + ເນເທີແລນ + ນໍເວ + ເນປານ + ນີຢູ + ນິວຊີແລນ + ໂອມານ + ປານາມາ + ເປລູ + ເຟັນຣໂພລິນີເຊຍ + ປາປົວນິວກີນີ + ຟິລິປິນ + ປາກິສຖານ + ໂປແລນ + ເປີໂຕລິໂກ + ໂປຕຸກກັນ + ປາລາກວຍ + ກາຕາ + ລູເມເນຍ + ລັດເຊຍ + ລາວັນດາ + ຊາອຸດິອາລະເບຍ + ເຊແຊວ + ຊູດານ + ສະວິເດັນ + ສິງກະໂປ + ສະໂລເວເນຍ + ສະໂລວາເກຍ + ເຊຍລາສິອອນ + ຊິນີກັນ + ໂຊມາເລຍ + ຊູລິນາມິ + ເອຊາວາດໍ + ຊິເລຍ + ສະວາຊິແລນ + ຊາດ + ອານາເຂດທາງໃຕ້ຂອງຝລັ່ງເສດ + ໂຕໂກ + ປະເທດໄທ + ທາຈິກິສະຖານ + ໂທກິໂລ + ຕິມໍຕາເວັນອອກ + ເຕຣີກເມນິສະຖານ + ຕູນິເຊຍ + ຕອງກາ + ຕຸນກີ + ທິນິແດດ + ໄຕ້ຫວັນ + ທານຊາເນຍ + ຢູເຄຼນ + ອູການດາ + ສະຫະລັດອາເມລິກາ + ລູກວຍອຸຣ + ອຸດເບກິສະຖານ + ວາຕິກັນ + ເວເນຊູເອລາ + ບຣິທິດເວີຈິນໄອແລນ + ຢູເອສເວີຈິນໄອແລນ + ຫວຽດນາມ + ວານົວຕູ + ເຢເມນ + ມາຢອດ + ອາຟະລິກາໃຕ້ + ແຊມເບຍ + ຊິມບັບເວ + + + + [່-ໍ ໆ ກ ຂ ຄ ງ ຈ ຊ ຍ ດ-ທ ນ-ຟ ມ-ຣ ລ ວ ສ ຫ ໜ ໝ ອ-ູ ົ-ຽ ເ-ໄ] + [\u200B ໐-໙] + + + ' + ' + " + " + + + GanjkHmsSEDFwWxhKzAeugXZvcL + + + + + ພ.ສ. + + + + + + EEEEທີ່ d MMMM G yyyy + + + + + d MMMM yyyy + + + + + d MMM yyyy + + + + + d/M/yyyy + + + + + + + H ໂມງ mນາທີ ss ວິນາທີ + + + + + H ໂມງ mນາທີ + + + + + H:mm:ss + + + + + H:mm + + + + + + + {1}, {0} + + + + + + + + + ມ.ກ. + ກ.ພ. + ມີ.ນ. + ມ.ສ.. + ພ.ພ. + ມິ.ຖ. + ກ.ລ. + ສ.ຫ. + ກ.ຍ. + ຕ.ລ. + ພ.ຈ. + ທ.ວ. + + + ມັງກອນ + ກຸມພາ + ມີນາ + ເມສາ + ພຶດສະພາ + ມິຖຸນາ + ກໍລະກົດ + ສິງຫາ + ກັນຍາ + ຕຸລາ + ພະຈິກ + ທັນວາ + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + ອາ. + ຈ. + ອ. + ພ. + ພຫ. + ສກ. + ສ. + + + ວັນອາທິດ + ວັນຈັນ + ວັນອັງຄານ + ວັນພຸດ + ວັນພະຫັດ + ວັນສຸກ + ວັນເສົາ + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + ກ່ອນທ່ຽງ + ຫລັງທ່ຽງ + + + ປີກ່ອນຄິດສະການທີ່ + ຄິດສະການທີ່ + + + ປີກ່ອນຄິດສະການທີ່ + ຄ.ສ. + + + + + + EEEEທີ d MMMM G yyyy + + + + + d MMMM yyyy + + + + + d MMM yyyy + + + + + d/M/yyyy + + + + + + + Hໂມງ mນາທີ ss ວິນາທີv + + + + + H ໂມງ mນາທີss z + + + + + H:mm:ss + + + + + H:mm + + + + + + + {1}, {0} + + + + d MMMM + d/M + mm:ss + Q yy + M/yyyy + MMMM yyyy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + + + ¤#,##0.00;¤-#,##0.00 + + + + + + ກີບ + + + + + diff --git a/libs/Zend/Locale/Data/lo_LA.xml b/libs/Zend/Locale/Data/lo_LA.xml new file mode 100644 index 0000000..78ee0eb --- /dev/null +++ b/libs/Zend/Locale/Data/lo_LA.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/lt.xml b/libs/Zend/Locale/Data/lt.xml new file mode 100644 index 0000000..6a570cb --- /dev/null +++ b/libs/Zend/Locale/Data/lt.xml @@ -0,0 +1,2454 @@ + + + + + + + + + + + abchazų + adygėjų + afrikanų + aleutų + amharų + senoji anglų + arabų + dirbtinė kalba + asamų + australų kalba + azerbaidžaniečių + baškirų + baltų kalba + baltarusių + berberų + bulgarų + biharų + bengalų + bantų + tibetiečių + bretonų + bosnių + buriatų + katalonų + Centrinės Amerikos indėnų kalba + kaukaziečių kalba + čečėnų + keltų kalba + korsikiečių + krymo turkų + čekų + bažnytinė slavų + čiuvašų + valų + danų + vokiečių + senovės egiptiečių + graikų + anglų + anglų kalba (australija) + anglų (britų) + anglų (amerikiečių) + esperanto + ispanų + estų + baskų + persų + suomių + tagalų + finougrų kalba + fareriečių + prancūzų + senoji prancūzų + šiaurinių fryzų + rytų fryzų + Fryzų + airių + škotų (gėlų) + germanų kalba + galisų + gvaranių + gotų + senovės graikų + gudžaratų + hebrajų + hindi + kroatų + vengrų + armėnų + interlingva + indoneziečių + interkalba + indoeuropiečių kalba + ingušų + Iraniečių + islandų + italų + japonų + javiečių + gruzinų + karakalpakų + kabardinų + kazachų + khmerų + kanadų + korėjiečių + kurdų + kirgizų + lotynų + liuksemburgiečių + lezginų + lingala + laosiečių + lietuvių + latvių + įvairios kalbos + makedonų + malajalių + mongolų + moldavų + maratų + malajiečių + maltiečių + kelios kalbos + Šiaurės Amerikos indėnų kalba + neapoliečių + nepalų + olandų + norvegų nynorsk + norvegų + provansalų + orijų + osetinų + pandžabų + papuasų kalba + senoji persų + lenkų + puštūnų + portugalų + portugalų (Brazilijos) + portugalų (Portugalijos) + rumunų + rusų + Sanskritas + jakutų + sardiniečių + siciliečių + škotų + sindų + šiaurinių samių + senoji airių + serbų-kroatų + sinhalų + slovakų + slovėnų + slavų kalba + somalių + albanų + serbų + sesuto + sundų + šumerų + švedų + svahili + tamilų + telugų + tajų + tigrajų + turkmėnų + tagalogų + "žvaigždžių kelionių" + turkų + totorių + tvi + tuvių + udmurtų + uigūrų + ukrainiečių + nenustatyta kalba + urdu + uzbekų + vietnamiečių + volapiuk + valonų + kalmukų + kosų + jidiš + kinų + kinų supaprastinta + kinų tradicinė + zulų + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Pasaulis + Afrika + Šiaurės Amerika + Pietų Amerika + Okeanija + Vakarų Afrika + Centrinė Amerika + Rytų Afrika + Šiaurės Afrika + Vidurio Afrika + Pietų Afrika [018] + Amerika + Šiaurinė Amerika + Karibai + Rytų Azija + Pietų Azija + Pietryčių Azija + Pietų Europa + Australija ir Naujoji Zelandija + Melanezija + Mikronezija [057] + Polinezija + Pietų-vidurio Azija + Azija + Centrinė Azija + Vakarų Azija + Europa + Rytų Europa + Šiaurės Europa + Vakarų Europa + Nepriklausomų Valstybių Sandrauga + Čekoslovakija + Lotynų Amerika ir Karibai + Andora + Jungtiniai Arabų Emyratai + Afganistanas + Antigva ir Barbuda + Angilija + Albanija + Armėnija + Olandijos Antilai + Angola + Antarktis + Argentina + Amerikos Samoa + Austrija + Australija + Aruba + Aland Islands + Azerbaidžanas + Bosnija ir Hercegovina + Barbadosas + Bangladešas + Belgija + Burkina Fasas + Bulgarija + Bahreinas + Burundis + Beninas + Bermuda + Brunėjus + Bolivija + Brazilija + Bahamos + Butanas + Bouvet sala + Botsvana + Baltarusija + Belizas + Kanada + Kokosų salos + Kongo Demokratinė Respublika + Centrinės Afrikos Respublika + Kongas + Šveicarija + Dramblio Kaulo Krantas + Kuko salos + Čilė + Kamerūnas + Kinija + Kolumbija + Kosta Rika + Serbija ir Juodkalnija + Kuba + Žaliasis Kyšulys + Kalėdų sala + Kipras + Čekija + Vokietija + Džibutis + Danija + Dominika + Dominikos Respublika + Alžyras + Ekvadoras + Estija + Egiptas + Vakarų Sachara + Eritrėja + Ispanija + Etiopija + Suomija + Fidžis + Falklando salos + Mikronezija + Farerų salos + Prancūzija + Gabonas + Didžioji Britanija + Grenada + Gruzija + Prancūzijos Gviana + Guernsey + Gana + Gibraltaras + Grenlandija + Gambija + Gvinėja + Gvadelupė + Pusiaujo Gvinėja + Graikija + Rytų Džordžija ir Rytų Sandwich salos + Gvatemala + Guamas + Bisau Gvinėja + Gajana + Honkongas + Heardo ir McDonaldo Salų Sritis + Hondūras + Kroatija + Haitis + Vengrija + Indonezija + Airija + Izraelis + Meno sala + Indija + Indijos vandenyno britų sritis + Irakas + Iranas + Islandija + Italija + Džersis + Jamaika + Jordanija + Japonija + Kenija + Kirgiztanas + Kambodža + Kiribatis + Komorai + Sent Kitsas ir Nevis + Šiaurės Korėja + Pietų Korėja + Kuveitas + Kaimanų salos + Kazachstanas + Laosas + Libanas + Šventoji Liucija + Lichtenšteinas + Šri Lanka + Liberija + Lesotas + Lietuva + Liuksemburgas + Latvija + Libija + Marokas + Monakas + Moldova + Juodkalnija + Madagaskaras + Maršalo Salos + Makedonija + Malis + Mianmaras + Mongolija + Macao + Marianos šiaurinės salos + Martinika + Mauritanija + Montserratas + Malta + Mauricijus + Maldivai + Malavis + Meksika + Malaizija + Mozambikas + Namibija + Naujoji Kaledonija + Nigeris + Norfolko sala + Nigerija + Nikaragva + Nyderlandai + Norvegija + Nepalas + Nauru + Niue + Naujoji Zelandija + Omanas + Panama + Peru + Prancūzų Polinezija + Papua Naujoji Gvinėja + Filipinai + Pakistanas + Lenkija + Sen Pjeras ir Mikelonas + Pitkernas + Puerto Rikas + Palestinos teritorija + Portugalija + Palau + Paragvajus + Kataras + Europos Sąjunga + Reunionas + Rumunija + Serbija + Rusijos Federacija + Ruanda + Saudo Arabija + Saliamono salos + Seišeliai + Sudanas + Švedija + Singapūras + Šventoji Elena + Slovėnija + Svalbardo ir Jan Majen salos + Slovakija + Siera Leonė + San Marinas + Senegalas + Somalis + Surinamas + San Tomė ir Principė + Salvadoras + Sirija + Svazilendas + Turkso ir Caicoso salos + Čadas + Prancūzijos Pietų sritys + Togas + Tailandas + Tadžikistanas + Tokelau + Rytų Timoras + Turkmėnistanas + Tunisas + Tonga + Turkija + Trinidadas ir Tobagas + Tuvalu + Taivanas + Tanzanija + Ukraina + Uganda + Jungtinių Valstijų mažosios aplinkinės salos + Jungtinės Valstijos + Urugvajus + Uzbekistanas + Vatikanas + Šventasis Vincentas ir Grenadinai + Venesuela + Didžiosios Britanijos Mergelių salos + Mergelių salos (JAV) + Vietnamas + Vanuatu + Wallisas ir Futuna + Samoa + Jemenas + Mayotte’as + Pietų Afrika + Zambija + Zimbabvė + Nežinoma ar neteisinga sritis + + + kalendorius + gretinimas + valiuta + + + Budistų kalendorius + Kiniečių kalendorius + Grigaliaus kalendorius + Hebrajų kalendorius + Islamo kalendorius + Japonų kalendorius + Kinijos respublikos kalendorius + + + JAV + Metrinė + + + + [a ą b c č d e ę ė f-i į y j-p r s š t u ų ū v z ž] + [{į̇} {i̇} {i̇́} {i̇̀} {i̇̃} {j̇} q w x] + + + + + + + + + GanjkHmsSEDFwWxhKzAeugXZvcL + + + + + + Sau + Vas + Kov + Bal + Geg + Bir + Lie + Rgp + Rgs + Spl + Lap + Grd + + + sausio + vasario + kovo + balandžio + gegužės + birželio + liepos + rugpjūčio + rugsėjo + spalio + lapkričio + gruodžio + + + + + S + V + K + B + G + B + L + R + R + S + L + G + + + Sausis + Vasaris + Kovas + Balandis + Gegužė + Birželis + Liepa + Rugpjūtis + Rugsėjis + Spalis + Lapkritis + Gruodis + + + + + + + Sk + Pr + An + Tr + Kt + Pn + Št + + + sekmadienis + pirmadienis + antradienis + trečiadienis + ketvirtadienis + penktadienis + šeštadienis + + + + + S + P + A + T + K + P + Š + + + + + + + K1 + K2 + K3 + K4 + + + pirmas ketvirtis + antras ketvirtis + trečias ketvirtis + ketvirtas ketvirtis + + + + priešpiet + popiet + + + pr. Kr. + po Kr. + + + + + + yyyy 'm'. MMMM d 'd'.,EEEE + + + + + yyyy 'm'. MMMM d 'd'. + + + + + yyyy.MM.dd + + + + + yyyy-MM-dd + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1} {0} + + + + HH:mm + HH:mm:ss + MMM-dd + MM.dd + hh:mm a + hh:mm:ss a + Q yy + yyyy.MM + + + {0} - {1} + + M-M + + + MM-ddE - MM-ddE + MM-ddE - MM-ddE + + + MMM-MMM + + + MMM d 'd'.E - MMM d 'd'.E + MMM d 'd'.E - d 'd'.E + + + MMM d 'd'. - MMM d 'd'. + MMM d 'd'.-d 'd'. + + + MM-dd - MM-dd + MM-dd - MM-dd + + + d-d + + + HH-HH + + + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH-HH v + + + y-y + + + yyyy-MM - yyyy-MM + yyyy-MM - yyyy-MM + + + yyyy-MM-ddE - yyyy-MM-ddE + yyyy-MM-ddE - yyyy-MM-ddE + yyyy-MM-ddE - yyyy-MM-ddE + + + yyyy 'm'. MMM-MMM + yyyy 'm'. MMM - yyyy 'm'. MMM + + + yyyy 'm'. MMM d 'd'.,E - MMM d 'd'.,E + yyyy 'm'. MMM d 'd'.,E - d 'd'.,E + yyyy 'm'. MMM d 'd'.,E - yyyy 'm'. MMM d 'd'.,E + + + yyyy 'm'. MMM d 'd'. - MMM d 'd'. + yyyy 'm'. MMM d 'd'.-d 'd'. + yyyy 'm'. MMM d 'd'. - yyyy 'm'. MMM d 'd'. + + + yyyy-MM-dd - yyyy-MM-dd + yyyy-MM-dd - yyyy-MM-dd + yyyy-MM-dd - yyyy-MM-dd + + + + + + era + + + metai + + + mėnuo + + + savaitė + + + diena + + + savaitės diena + + + dienos metas + + + valanda + + + minutė + + + Sekundė + + + juosta + + + + + + +HH:mm;−HH:mm + GMT{0} + {0} + + Andora + + + Dubajus + + + Kabulas + + + Tirana + + + Jerevanas + + + Pietų ašigalis + + + Dumont D'Urville + + + Buenos Airės + + + Viena + + + Barbadosas + + + Daka + + + Briuselis + + + Sofija + + + Bahreinas + + + Porto Novas + + + Bermudų salos + + + Brunėjus + + + La Pasas + + + Kujaba + + + Belemas + + + San Paulas + + + Gaboronas + + + Minskas + + + Belizas + + + Monktonas + + + Kinšasa + + + Brazavilis + + + Ciurichas + + + Abidžanas + + + Velykų sala + + + Santjagas + + + Kosta Rika + + + Kalėdų sala + + + Nikosija + + + Berlynas + + + Džibutis + + + Kopenhaga + + + Dominika + + + Santo Domingas + + + Galapagai + + + Talinas + + + Kairas + + + Asmara + + + Kanarų salos + + + Madridas + + + Addis Abeba + + + Helsinkis + + + Fidžis + + + Stenlis + + + Trukas + + + Ponapė + + + Farerai + + + Paryžius + + + Librevilis + + + Londonas + + + Tbilisis + + + Kajenas + + + Gibraltaras + + + Tūla + + + Godthabas + + + Danmarkshavn’as + + + Konakris + + + Gvadelupė + + + Atėnai + + + Gvatemala + + + Guamas + + + Gajana + + + Honkongas + + + Budapeštas + + + Džakarta + + + Dublinas + + + Bagdadas + + + Teheranas + + + Reikjavikas + + + Roma + + + Jamaika + + + Amanas + + + Nairobis + + + Biškekas + + + Enderburis + + + Tarava + + + Komoras + + + St. Kitsas + + + Seulas + + + Kuveitas + + + Kaimanas + + + Aktiubinskas + + + Alma Ata + + + Vientianas + + + Beirutas + + + St. Lucia + + + Vaducas + + + Kolombo + + + Monrovija + + + Liuksemburgas + + + Ryga + + + Tripolis + + + Kasablanka + + + Monakas + + + Antananarivas + + + Rangūnas + + + Ulan-Batoras + + + Makao + + + Saipanas + + + Martinika + + + Montseratas + + + Mauricijus + + + Maldyvai + + + Norfolkas + + + Managva + + + Amsterdamas + + + Oslas + + + Maskatas + + + Taitis + + + Varšuva + + + Pitcairno salos + + + Puerto Rikas + + + Gazos ruožas + + + Azorai + + + Lisabona + + + Asunsjonas + + + Kataras + + + Reunionas + + + Bukareštas + + + Rijadas + + + Gvadalkanalas + + + Chartumas + + + Stokholmas + + + Singapūras + + + Šv. Helena + + + Frytaunas + + + Dakaras + + + Mogadišas + + + San Tomė + + + Salvadoras + + + Damaskas + + + Grand Terkas + + + Ndžamena + + + Bankokas + + + Dušanbė + + + Dilis + + + Ašchabadas + + + Tunisas + + + Stambulas + + + Port of Speinas + + + Kijevas + + + Džonstonas + + + Klivateris + + + Ankoridžas + + + Los Andželas + + + Fyniksas + + + Denveris + + + Čikaga + + + Peterburgas + + + Niujorkas + + + Montevidëjas + + + Taškentas + + + Sant Vincentė + + + Karakasas + + + St. Thomas + + + Efatas + + + Apija + + + Adenas + + + Majotas + + + Johanesburgas + + + + Centrinės Afrikos laikas + + + + + Rytų Afrikos laikas + + + + + Pietų Afrikos laikas + Pietų Afrikos standartinis laikas + + + + + Vakarų Afrikos laikas + Vakarų Afrikos vasaros laikas + + + + + Aliaskos laikas + Aliaskos standartinis laikas + Aliaskos vasaros laikas + + + + + Aliaskos-Havajų laikas + Aliaskos-Havajų standartinis laikas + Aliaskos-Havajų vasaros laikas + + + + + Amazonės laikas + Amazonės vasaros laikas + + + + + Centro laikas + Centro standartinis laikas + Centro vasaros laikas + + + + + Rytų laikas + Rytų standartinis laikas + Rytų vasaros laikas + + + + + Ramiojo vandenyno laikas + Ramiojo vandenyno standartinis laikas + Ramiojo vandenyno vasaros laikas + + + + + Argentinos laikas + Argentinos vasaros laikas + + + + + Vakarų Argentinos laikas + + + + + Atlanto laikas + Atlanto standartinis laikas + Atlanto vasaros laikas + + + + + Beringo laikas + Beringo standartinis laikas + Beringo vasaros laikas + + + + + Bolivijos laikas + + + + + Brazilijos laikas + Brazilijos vasaros laikas + + + + + Čilės laikas + Čilės vasaros laikas + + + + + Kolumbijos laikas + Kolumbijos vasaros laikas + + + + + Kubos laikas + Kubos standartinis laikas + Kubos vasaros laikas + + + + + Olandų Gajanos laikas + + + + + Ekvadoro laikas + + + + + Vidurio Europos laikas + Vidurio Europos vasaros laikas + + + + + Rytų Europos laikas + Rytų Europos vasaros laikas + + + + + Prancūzų Gajanos laikas + + + + + Grenlandijos centro laikas + Grenlandijos centro vasaros laikas + + + + + Grenlandijos rytų laikas + Grenlandijos rytų vasaros laikas + + + + + Grenlandijos vakarų laikas + Grenlandijos vakarų vasaros laikas + + + + + Gajanos laikas + + + + + Kuibyševo laikas + Kuibyševo vasaros laikas + + + + + Maskvos laikas + Maskvos standartinis laikas + Maskvos vasaros laikas + + + + + Niufaundlendo laikas + Niufaundlendo standartinis laikas + Niufaundlendo vasaros laikas + + + + + Paragvajaus laikas + Paragvajaus vasaros laikas + + + + + Peru laikas + Peru vasaros laikas + + + + + Samaros laikas + Samaros vasaros laikas + + + + + Turkijos laikas + Turkijos vasaros laikas + + + + + Urugvajaus laikas + Urugvajaus vasaros laikas + + + + + Venesuelos laikas + + + + + Volgogrado laikas + Volgogrado vasaros laikas + + + + + + + , + . + + ×10^ + + + + + #,##0.00 ¤ + + + + + + Andoros peseta + Andoros pesetos + Andoros peseta + Andoros pesetos + + + JAE dirhamas + + + Afganis (1927-2002) + Afganiai (1927-2002) + Afganis (1927-2002) + Afganiai (1927-2002) + + + Afganis + Afganiai + Afganis + Afganiai + + + Albanijos lekas + Albanijos lekai + Albanijos lekas + Albanijos lekai + + + Armėnijos dramas + Armėnijos dramai + Armėnijos dramas + Armėnijos dramai + + + Nyderlandų Antilų guldenas + Nyderlandų Antilų guldenas + Nyderlandų Antilų guldenai + + + Angolos kvanza + Angolos kvanzos + Angolos kvanza + Angolos kvanzai + + + Angolos kvanza (1977-1990) + Angolos kvanzos (1977-1990) + Angolos kvanza (1977-1990) + Angolos kvanzai (1977-1990) + + + Angolos naujoji kvanza + Angolos naujosios kvanzos + Angolos naujoji kvanza + Angolos naujosios kvanzos + + + Argentinos pesas (1983-1985) + Argentinos pesai (1983-1985) + Argentinos pesas (1983-1985) + Argentinos pesai (1983-1985) + + + Argentinos pesas + Argentinos pesas + Argentinos pesai + + + Austrijos šilingas + Austrijos šilingai + Austrijos šilingas + Austrijos šilingai + + + Australijos doleris + Australijos doleris + Australijos doleriai + + + Arubos guldenas + Arubos guldenai + Arubos guldenas + Arubos guldenai + + + Azerbaidžano manatas (1993-2006) + Azerbaidžano manatai (1993-2006) + Azerbaidžano manatas (1993-2006) + Azerbaidžano manatai (1993-2006) + + + Azerbaidžano manatas + Azerbaidžano manatai + Azerbaidžano manatas + Azerbaidžano manatai + + + Bosnijos ir Hercegovinos dinaras + Bosnijos ir Hercegovinos dinarai + Bosnijos ir Hercegovinos dinaras + Bosnijos ir Hercegovinos dinarai + + + Bosnijos ir Hercegovinos konvertuojamoji markė + Bosnijos ir Hercegovinos konvertuojamosios markės + Bosnijos ir Hercegovinos konvertuojamoji markė + Bosnijos ir Hercegovinos konvertuojamosios markės + + + Barbadoso doleris + Barbadoso doleriai + Barbadoso doleris + Barbadoso doleriai + + + Bangladešo taka + Bangladešo takos + Bangladešo taka + Bangladešo takos + + + Belgijos frankas (konvertuojamas) + Belgijos frankai (konvertuojami) + Belgijos frankas (konvertuojamas) + Belgijos frankai (konvertuojami) + + + Belgijos frankas + Belgijos frankai + Belgijos frankas + Belgijos frankai + + + Belgijos frankas (finansinis) + Belgijos frankai (finansiniai) + Belgijos frankas (finansinis) + Belgijos frankai (finansiniai) + + + Bulgarijos levas (1962-1999) + Bulgarijos levai + Bulgarijos levas (1962-1999) + Bulgarijos levai + + + Bulgarijos levas + Bulgarijos naujasis levas + Bulgarijos naujasis levai + + + Bahreino dinaras + Bahreino dinarai + Bahreino dinaras + Bahreino dinarai + + + Burundžio frankas + Burundžio frankai + Burundžio frankas + Burundžio frankai + + + Bermudos doleris + Bermudos doleriai + Bermudos doleris + Bermudos doleriai + + + Brunėjaus doleris + Brunėjaus doleris + Brunėjaus doleriai + + + Bolivijos bolivijanas + Bolivijos bolivijanas + Bolivijos bolivijanai + + + Bolivijos pesas + Bolivijos pesai + Bolivijos pesas + Bolivijos pesai + + + Bolivijos mvdol + Bolivijos mvdol + Bolivijos mvdol + + + Brazilijos naujasis kruzeiras + Brazilijos naujieji kruzeirai + Brazilijos naujasis kruzeiras + Brazilijos naujieji kruzeirai + + + Brazilijos kruzadas + Brazilijos kruzadai + Brazilijos kruzadas + Brazilijos kruzadai + + + Brazilijos kruzeiras (1990-1993) + Brazilijos kruzeirai (1990-1993) + Brazilijos kruzeiras (1990-1993) + Brazilijos kruzeirai (1990-1993) + + + Brazilijos realas + Brazilijos realas + Brazilijos realai + + + Brazilijos naujasis kruzadas + Brazilijos naujieji kruzadai + Brazilijos naujasis kruzadas + Brazilijos naujieji kruzadai + + + Brazilijos kruzeiras + Brazilijos kruzeirai + Brazilijos kruzeiras + Brazilijos kruzeirai + + + Bahamų doleris + Bahamų doleriai + Bahamų doleris + Bahamų doleriai + + + Butano ngultrumas + Butano ngultrumai + Butano ngultrumas + Butano ngultrumai + + + Botsvanos pula + Botsvanos pulos + Botsvanos pula + Botsvanos pulos + + + Baltarusijos naujasis rublis + Baltarusijos naujasis rublis + Baltarusijos naujieji rubliai + + + Baltarusijos rublis + Baltarusijos rublis + Baltarusijos rubliai + + + Belizo doleris + Belizo doleris + Belizo doleriai + + + Kanados doleris + Kanados doleris + Kanados doleriai + + + Kongo frankas + Kongo frankas + Kongo frankai + + + Šveicarijos frankas + + + Čilės pesas + Čilės pesas + Čilės pesai + + + Ženminbi juanis + Kinijos ženminbi juanis + Kinijos ženminbi juaniai + + + Kolumbijos pesas + Kolumbijos pesas + Kolumbijos pesai + + + Kosta Rikos kolonas + Kosta Rikos kolonas + Kosta Rikos kolonai + + + Senasis Serbijos dinaras + + + Kubos pesas + + + Kipro svaras + + + Čekijos krona + + + Rytų Vokietijos ostmarkė + + + Vokietijos markė + + + Džibučio frankas + + + Danijos krona + + + Dominikos pesas + + + Alžyro dinaras + Alžyro dinaras + Alžyro dinarai + + + Ekvadoro sukrė + + + Ekvadoro constante (UVC) + + + Estijos krona + + + Egipto svaras + + + Eritrėjos nakfa + + + Ispanijos peseta + + + Etiopijos biras + + + Euras + + + Suomijos markė + + + Fidžio doleris + + + Falklando salų svaras + + + Prancūzijos frankas + + + Svaras sterlingų + Didžiosios Britanijos svaras sterlingų + Didžiosios Britanijos svarai sterlingų + + + Gruzijos laris + + + Ganos sedis (1979-2007) + + + Ganos sedis + + + Gibraltaro svaras + + + Gambijos dalasis + + + Gvinėjos frankas + + + Graikijos drachma + + + Gvatemalos ketcalis + + + Portugalų Gvinėjos eskudas + + + Gvinėjos-Bisau pesas + + + Gajanos doleris + + + Honkongo doleris + + + Honduro lempira + + + Kroatijos dinaras + + + Kroatijos kuna + + + Haičio gurdas + + + Vengrijos forintas + + + Indonezijos rupija + + + Airijos svaras + + + Izraelio svaras + + + Izraelio šekelis + + + Indijos rupija + + + Irako dinaras + + + Irano rialas + + + Islandijos krona + + + Italijos lira + + + Jamaikos doleris + + + Jordanijos dinaras + + + Jena + + + Kenijos šilingas + + + Kirgizijos somas + + + Komoro frankas + Komoro frankas + Komoro frankai + + + Šiaurės Korėjos vonas + + + Pietų Korėjos vonas + + + Kuveito dinaras + + + Kazachstano tengė + + + Laoso kipas + + + Libano svaras + + + Šri Lankos rupija + + + Liberijos doleris + + + Lesoto lotis + + + Litas + Lt + + + Lietuvos talonas + + + Liuksemburgo konvertuojamas frankas + + + Liuksemburgo frankas + + + Liuksemburgo finansinis frankas + + + Latvijos latas + + + Latvijos rublis + + + Libijos dinaras + + + Maroko dirhamas + + + Maroko frankas + + + Moldovos lėja + + + Madagaskaro ariaris + + + Madagaskaro frankas + + + Makedonijos denaras + + + Malio frankas + + + Mianmaro kijatas + + + Mongolijos tugrikas + + + Macao pataka + + + Mauritanijos ugija + + + Maltos lira + + + Maltos svaras + + + Mauricijaus rupija + + + Maldyvų salų rufija + + + Malavio kvača + + + Meksikos pesas + + + Meksikos sidabrinis pesas + + + Meksikos United de Inversion (UDI) + + + Malaizijos ringitas + + + Mozambiko eskudas + + + Senasis Mozambiko metikalis + + + Mozambiko metikalis + + + Namibijos doleris + + + Nigerijos naira + + + Nikaragvos kardoba + + + Nikaragvos kardoba oras + + + Nyderlandų guldenas + + + Norvegijos krona + + + Nepalo rupija + + + Naujosios Zelandijos doleris + + + Omano rialas + + + Panamos balboja + + + Peru naujasis solis + + + Peru solis + + + Papua Naujosios Gvinėjos kina + + + Filipinų pesas + + + Pakistano rupija + + + Lenkijos zlotas + + + Lenkijos zlotas (1950-1995) + + + Portugalijos eskudas + + + Paragvajaus guaranis + + + Kataro rialas + + + Rodezijos doleris + + + Senoji Rumunijos lėja + + + Naujoji Rumunijos lėja + + + Serbijos dinaras + + + Rusijos rublis + + + Rusijos rublis (1991-1998) + + + Ruandos frankas + + + Saudo Arabijos rialas + + + Saliamono salų doleris + + + Seišelių salų rupija + + + Senasis Sudano dinaras + + + Sudano svaras + + + Senasis Sudano svaras + + + Švedijos krona + + + Singapūro doleris + + + Šv. Elenos salų svaras + + + Slovėnijos tolaras + + + Slovakijos krona + + + Siera Leonės leonė + + + Somalio šilingas + + + Surimano doleris + + + Surimano guldenas + + + Sao Tomės ir Principės dobra + + + Sovietų Sąjungos rublis + + + Salvadoro kolonas + + + Sirijos svaras + + + Svazilendo lilangenis + + + Batas + + + Tadžikistano rublis + + + Tadžikistano somonis + + + Turkmėnistano manatas + + + Tuniso dinaras + + + Tongo paanga + + + Timoro eskudas + + + Turkijos lira + + + Naujoji Turkijos Lira + + + Trinidado ir Tobago doleris + + + Naujasis Taivano doleris + + + Tanzanijos šilingas + + + Ukrainos grivina + + + Ukrainos karbovanecas + + + Ugandos šilingas (1966-1987) + + + Ugandos šilingas + + + JAV doleris + + + JAV doleris (sekančios dienos) + + + JAV doleris (šios dienos) + + + Urugvajaus pesas (1975-1993) + + + Urugvajaus pesas + + + Uzbekistano sumas + + + Bolivaras + + + Stiprusis Venesuelos bolivaras + + + Vietnamo dongai + + + Vakarų Samoa tala + + + CFA BEAC frankas + CFA BEAC frankas + CFA BEAC frankai + + + Sidabras + + + Auksas + + + Europos suvestinės vienetas + + + Europos piniginis vienetas + + + Europos valiutos/apskaitos vienetas (XBC) + + + Europos valiutos/apskaitos vienetas (XBD) + + + Rytų Karibų doleris + + + SDR Tarptautinis valiutos fondas + + + Europos piniginis vienetas (1993-1999) + + + Auksinis - frankas + + + Uic -frankas + + + CFA BCEAO frankas + CFA BCEAO frankas + CFA BCEAO frankai + + + Paladis + + + CFP frankas + CFP frankas + CFP frankai + + + Platina + + + Jemeno dinaras + + + Jemeno rialas + + + Jugoslavijos naujasis dinaras + + + Jugoslavijos konvertuojamas dinaras + + + Pietų Afrikos Respublikos finansinis randas + + + PAR Randas + + + Zambijos kvača + + + Zairo naujasis zairas + + + Zairo zairas + + + Zimbabvės doleris + + + + + + taip:t + ne:n + + + diff --git a/libs/Zend/Locale/Data/lt_LT.xml b/libs/Zend/Locale/Data/lt_LT.xml new file mode 100644 index 0000000..7abf010 --- /dev/null +++ b/libs/Zend/Locale/Data/lt_LT.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/lv.xml b/libs/Zend/Locale/Data/lv.xml new file mode 100644 index 0000000..6ffbeed --- /dev/null +++ b/libs/Zend/Locale/Data/lv.xml @@ -0,0 +1,2414 @@ + + + + + + + + + + + afāru + abhāzu + ačinu + ačolu + adangmu + adigu + avesta + afrikāņu + afroaziātu valoda + afrihili + ainu + akanu + akadiešu + aleutu + algonkinu valoda + dienvidaltajiešu + amharu + aragoniešu + senangļu + angika + apaču valoda + arābu + aramiešu + araukāņu + arapahu + mākslīgā valoda + aravaku + asamiešu + astūriešu + atapasku valoda + austrāliešu valoda + avāru + avadhu + aimaru + azerbaidžāņu + baškīru + bandu + bamileku valoda + beludžu + baliešu + basu + baltu valodas + baltkrievu + bedžu + bembu + berberu + bulgāru + biharu + bhodžpūru + bišlamā + bikolu + binu + siksiku + bambaru + bengāļu + bantu + tibetiešu + bretoņu + bradžiešu + bosniešu + bataku + burjatu + bugu + bilinu + katalāņu + kadu + Centrālamerikas indiāņu valoda + karību + kaukāziešu valoda + čečenu + sebuāņu + ķeltu valoda + čamorru + čibču + džagatajs + čūku + mariešu + činuku žargons + čoktavu + čipevaianu + čiroku + šejenu + čamiešu valoda + korsikāņu + koptu + angliskās kreoliskās valodas un pidžinvalodas + franciskā kreoliskā vai pidžinvaloda + portugāliskās kreoliskās valodas un pidžinvalodas + krī + Krimas tatāru + kreoliskā vai pidžinvaloda + čehu + kašubu + baznīcslāvu + kušītu valodas + čuvašu + velsiešu + dāņu + dakotu + dargu + dajaku + vācu + Austrijas vācu + Šveices augšvācu + delavēru + sleivu + dogribu + dinku + dogru + dravīdu valoda + lejassorbu + dualu + vidusholandiešu + maldīviešu + diūlu + dzongke + evu + efiku + ēģiptiešu + ekadžuku + grieķu + elamiešu + angļu + Austrālijas angļu + Kanādas angļu + angļu (ASV) + vidusangļu + esperanto + spāņu + spāņu (Latīņamerika) + ibēriešu spāņu + igauņu + basku + evondu + persiešu + fangu + fantu + fulu + somu + tagalu + somugru valodas + fidžiešu + faroisu + fonu + franču + Kanādas franču + Šveices franču + vidusfranču + senfranču + ziemeļfrīzu + austrumfrīzu + friūlu + frīzu + īru + ga + gajo + gbaju + skotu-ķeltu + ģermāņu valoda + gēzu + kiribatiešu + galisiešu + vidusaugšvācu + gvaranu + senaugšvācu + gondu + gorontalu + gotu + grebo + sengrieķu + Šveices vācu + gudžaratu + meniešu + kučinu + hausu + haidu + havajiešu + ivrits + hindi + hiligainonu + himačali + hetu + hmongu + hirimotu + horvātu + augšsorbu + haitiešu + ungāru + hupu + armēņu + hereru + interlingva + ibanu + indonēziešu + interlingue + igbo + sičuaņas ji + idžbu + inupiaku + iloku + indoāriešu valodas + indoeiropiešu valodas + ingušu + ido + irāņu valodas + irokēzu valoda + islandiešu + itāliešu + inuītu + japāņu + ložbans + jūdpersiešu + jūdarābu + javiešu + gruzīnu + karakalpaku + kabilu + kačinu + kambu + karenu + kāvi + kabardiešu + koru + kongu + khasu + hojsanu + hotaniešu + kikuju + kvaņamu + kazahu + grenlandiešu + khmeru + kimbundu + kannada + korejiešu + konkanu + kosrājiešu + kpellu + kanuru + karačaju un balkāru + karēļu + krū + kuruhu + kašmiriešu + kurdu + kumiku + kutenaju + komiešu + korniešu + kirgīzu + latīņu + ladino + landu + lambu + luksemburgiešu + lezgīnu + gandu + limburgiešu + lingala + laosiešu + mongu + lozu + lietuviešu + lubakatanga + lubalulva + luisenu + lundu + luo + lušeju + latviešu + maduriešu + magahiešu + maithili + makasaru + mandingu + austronēziešu valoda + masaju + mokšu + mandaru + mendu + malagasu + vidusīru + māršaliešu + maoru + mikmaku + minangkabavu + dažādas valodas + maķedoniešu + monkhmeru valodas + malajalamiešu + mongoļu + mandžūru + manipūru + manobu valoda + moldāvu + mohauku + mosu + maratu + malajiešu + maltiešu + vairākas valodas + mundu valoda + krīku + mirandiešu + marvaru + birmiešu + maiju valoda + erzju + nauruiešu + navatlu + Ziemeļamerikas indiāņu valodas + neapoliešu + norvēģu bukmols + ziemeļndebelu + lejasvācu + nepāliešu + nevaru + ndongu + njasu + nigēriešu-kordofāņu valoda + niuāņu + holandiešu + flāmu + jaunnorvēģu + norvēģu + nogaju + sennorvēģu + dienvidndebelu + ziemeļsotu + nūbiešu valoda + navahu + klasiskā nevaru + čičeva + ņamvezu + ņankolu + ņoru + nzemu + provansiešu + odžibvu + oromu + orisiešu + osetīnu + važāžu + turku osmaņu + otomu valoda + pandžabu + papuasu valoda + pangasinanu + pehlevi + pampanganu + papjamento + palaviešu + senpersu + filipīniešu valodas + feniķiešu + pāli + poļu + ponapiešu + prākrita valoda + senprovansiešu + puštu + portugāļu + Brazīlijas portugāļu + ibēriešu portugāļu + kečvu + radžastāņu + rapanuju + rarotongiešu + retoromāņu + rundu + rumāņu + romāņu valoda + čigānu + sakne + krievu + aromūnu + kiņaruanda + sanskrita + sandavu + jakutu + Dienvidamerikas indiāņu + sališu valoda + samārijas aramiešu + sasaku + santalu + sardīniešu + sicīliešu + skotu + sindžu + ziemeļsāmu + selkupu + semītu valoda + sangu + senīru + zīmju valodas + serbu-horvātu + šanu + sinhalīzu + sidamu + siū valodas + sinotibetiešu valodas + slovāku + slovēņu + slāvu + samoāņu + dienvidsāmu + sāmu valoda + Luleo sāmu + Inari sāmu + skoltsāmu + šonu + soninku + somāļu + sogdiešu + songaju + albāņu + serbu + sranantongo + serēru + svatu + nīlas-sahāras valoda + sesoto + sundaniešu + sukumu + susu + šumeru + zviedru + svahilu + klasiskā sīriešu + sīriešu + tamilu + taju valodas + telugu + temnu + tereno + tetumu + tadžiku + taju + tigrinja + tigru + tivu + turkmēņu + tokelaviešu + tagalogu + klingoniešu + tlinkitu + tuaregu + cvanu + tongu + Njasas tongu valoda + tokpisins + turku + congu + cimšiāņu + tatāru + tumbuku + tupu valoda + altajiešu valodas + tuvaliešu + čvī + taitiešu + tuviešu + udmurtu + uighuru + ugaritiešu + ukraiņu + umbundu + nezināma vai nederīga valoda + urdu + uzbeku + vaju + vendu + vjetnamiešu + volapiks + votu + valoņu + vakašu valoda + valamu + varaju + vašo + sorbu + volofu + kalmiku + khosu + jao + japiešu + jidišs + jorubu + jupiku valoda + džuanu + sapoteku + zenagu + ķīniešu + ķīniešu vienkāršotā + ķīniešu tradicionālā + zandē + zulu + zunju + lingvistiska satura nav + + + + + + + + + + Pasaule + Āfrika + Ziemeļamerika + Dienvidamerika + Okeānija + Rietumāfrika + Centrālamerika + Austrumāfrika + Ziemeļāfrika + Vidusāfrika + Āfrikas dienvidi + Amerikas + Amerikas ziemeļi + Karību jūras reģions + Austrumāzija + Āzijas dienvidi + Centrālaustrumāzija + Eiropas dienvidi + Austrālija un Jaunzēlande + Melanēzija + Mikronēzijas reģions + Polinēzija + Centrāldienvidāzija + Āzija + Centrālāzija + Rietumāzija + Eiropa + Austrumeiropa + Eiropas ziemeļi + Rietumeiropa + Neatkarīgo Valstu Savienība + Latīņamerika un Karību jūras reģions + Andora + Apvienotie Arābu Emirāti + Afganistāna + Antigva un Barbuda + Angilja + Albānija + Armēnija + Antiļas + Angola + Antarktika + Argentīna + Amerikāņu Samoa + Austrija + Austrālija + Aruba + Olandes salas + Azerbaidžāna + Bosnija un Hercegovina + Barbadosa + Bangladeša + Beļģija + Burkinafaso + Bulgārija + Bahreina + Burundi + Benina + Bermudu salas + Bruneja + Bolīvija + Brazīlija + Bahamas + Butāna + Buvē sala + Botsvāna + Baltkrievija + Beliza + Kanāda + Kokosu (Kīlinga) salas + Kongo Demokrātiskā Republika + Centrālāfrikas Republika + Kongo + Šveice + Kotdivuāra + Kuka salas + Čīle + Kamerūna + Ķīna + Kolumbija + Kostarika + Serbija un Melnkalne + Kuba + Kaboverde + Ziemsvētku sala + Kipra + Čehija + Vācija + Džibutija + Dānija + Dominika + Dominikānas Republika + Alžīrija + Ekvadora + Igaunija + Ēģipte + Rietumsahāra + Eritreja + Spānija + Etiopija + Somija + Fidži + Folklenda salas + Mikronēzijas Federatīvās Valstis + Farēru salas + Francija + Gabona + Lielbritānija + Grenāda + Gruzija + Franču Gviāna + Gērnsija + Gana + Gibraltārs + Grenlande + Gambija + Gvineja + Gvadelupa + Ekvatoriālā Gvineja + Grieķija + Dienviddžordžija un Dienvidsendviču salas + Gvatemala + Guama + Gvineja-Bisava + Gajāna + Honkonga + Hērda un Makdonalda salas + Hondurasa + Horvātija + Haiti + Ungārija + Indonēzija + Īrija + Izraēla + Mena + Indija + Britu Indijas okeāna teritorija + Irāka + Irāna + Islande + Itālija + Džērsija + Jamaika + Jordānija + Japāna + Kenija + Kirgīzija + Kambodža + Kiribati + Komoru salas + Sentkitsa un Nevisa + Ziemeļkoreja + Dienvidkoreja + Kuveita + Kaimanu salas + Kazahstāna + Laosa + Libāna + Sentlūsija + Lihtenšteina + Šrilanka + Libērija + Lesoto + Lietuva + Luksemburga + Latvija + Lībija + Maroka + Monako + Moldova + Melnkalne + Madagaskara + Māršala salas + Maķedonija + Mali + Mjanma + Mongolija + Makao + Ziemeļu Marianas + Martinika + Mauritānija + Montserrata + Malta + Maurīcija + Maldīvija + Malāvija + Meksika + Malaizija + Mozambika + Namībija + Jaunkaledonija + Nigēra + Norfolka + Nigērija + Nikaragva + Nīderlande + Norvēģija + Nepāla + Nauru + Niue + Jaunzēlande + Omāna + Panama + Peru + Franču Polinēzija + Papua-Jaungvineja + Filipīnas + Pakistāna + Polija + Senpjēra un Mikelona + Pitkērna + Puertoriko + Palestīniešu pašpārvaldes teritorija + Portugāle + Palau + Paragvaja + Katara + ASV Mazās Aizjūras salas + Eiropas Savienība + Reinjona + Rumānija + Serbija + Krievija + Ruanda + Saūda Arābija + Zālamana salas + Seišeļu salas + Sudāna + Zviedrija + Singapūra + Sv. Helēnas sala + Slovēnija + Svalbāra un Jana Majena sala + Slovākija + Sjerraleone + Sanmarīno + Senegāla + Somālija + Surinama + Santome un Prinsipi + Salvadora + Sīrija + Svazilenda + Tērksas un Kaikosas salas + Čada + Franču dienvidu teritorijas + Togo + Taizeme + Tadžikistāna + Tokelau + Austrumtimora + Turkmenistāna + Tunisija + Tonga + Turcija + Trinidāda un Tobāgo + Tuvalu + Taivāna + Tanzānija + Ukraina + Uganda + ASV mazās aizjūras teritorijas + United States + Urugvaja + Uzbekistāna + Vatikāns + Sentvinsenta un Grenadīnas + Venecuēla + Britu Virdžīnu salas + Amerikāņu Virdžīnu salas + Vjetnama + Vanuatu + Volisa un Futuna + Samoa + Jemena + Majota + Dienvidāfrika + Zambija + Zimbabve + Nezināms vai nederīgs reģions + + + Kalendārs + šķirošana komplektos + Valūta + + + Tradicionālās ķīniešu valodas kārtošanas secība - Big5 + Budistu kalendārs + Ķīniešu kalendārs + Tiešā kārtošanas secība + Vienkāršotās ķīniešu valodas kārtošanas secība - GB2312 + Gregora kalendārs + Ebreju kalendārs + Indijas nacionālais kalendārs + Islāma kalendārs + Islāma pilsoņu kalendārs + Japāņu kalendārs + Tālruņu grāmatas kārtošanas secība + Pinyin kārtošanas secība + Ķīnas Republikas kalendārs + Stroke kārtošanas secība + Tradicionālā kārtošanas secība + + + britu + metriskā + + + + [a ā b c č d e ē f g ģ h i ī j k ķ l ļ m n ņ o p r s š t u ū v z ž] + [y q w x] + + + + + + + + + GanjkHmsSEDFwWxhKzAeugXZvcL + + + + + + Jan + Feb + Mar + Apr + Mai + Jūn + Jūl + Aug + Sep + Okt + Nov + Dec + + + janvāris + februāris + marts + aprīlis + maijs + jūnijs + jūlijs + augusts + septembris + oktobris + novembris + decembris + + + + + J + F + M + A + M + J + J + A + S + O + N + D + + + + + + + Sv + P + O + T + C + Pk + S + + + svētdiena + pirmdiena + otrdiena + trešdiena + ceturtdiena + piektdiena + sestdiena + + + + + Pr + ot + Tr + Ce + pk + Se + + + S + P + O + T + C + P + S + + + + + + + C1 + C2 + C3 + C4 + + + 1. ceturksnis + 2. ceturksnis + 3. ceturksnis + 4. ceturksnis + + + + + 1 + 2 + 3 + 4 + + + + AM + PM + + + pirms mūsu ēras + mūsu ērā + + + pmē + + + + p.m.ē. + m.ē. + + + + + + EEEE, yyyy. 'gada' d. MMMM + + + + + yyyy. 'gada' d. MMMM + + + + + yyyy.d.M + + + + + yy.d.M + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1} {0} + + + + E d + H + HH:mm + HH:mm:ss + HH:mm + L + E, dd.MM + LLL + E, d. MMM + E, d. MMMM + d. MMMM + d. MMM + d.M + d + mm:ss + mm:ss + yyyy + mm.yyyy + EEE, dd.mm.yyyy + yyyy. MMM + EEE, dd. MMM, yyyy + yyyy. MMMM + Q yyyy + yyyy QQQ + Q yy + yyyy. 'g'. + + + {0} - {1} + + M-M + + + E, d.M - E, d.M + E, d.M - E, d.M + + + MMM-MMM + + + E, d. MMM - E, d. MMM + E, d. - E, d. MMM + + + d. MMM - d. MMM + d.-d. MMM + + + d.M - d.M + d.M - d.M + + + d-d + + + HH-HH + + + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH-HH v + + + y-y + + + yy.M - yy.M + yy.M - yy.M + + + E, yy.d.M - E, yy.d.M + E, yy.d.M - E, yy.d.M + E, yy.d.M - E, yy.d.M + + + yyyy. 'gada' MMM-MMM + yyyy. 'gada' MMM - yyyy. 'gada' MMM + + + E, yyyy. 'gada' d. MMM - E, yyyy. 'gada' d. MMM + E, yyyy. 'gada' d. MMM - E, yyyy. 'gada' d. MMM + E, yyyy. 'gada' d. MMM - E, yyyy. 'gada' d. MMM + + + yyyy. 'gada' d. MMM - d. MMM + yyyy. 'gada' d.-d. MMM + yyyy. 'gada' d. MMM - yyyy. 'gada' d. MMM + + + yy.d.M - yy.d.M + yy.d.M - yy.d.M + yy.d.M - yy.d.M + + + + + + Ēra + + + Gads + + + Mēnesis + + + Nedēļa + + + šodien + rīt + parīt + aizparīt + vakar + aizvakar + + + Nedēļas diena + + + Stundas + + + Minūtes + + + Sekundes + + + Josla + + + + + + +HH:mm;−HH:mm + GMT{0} + {0} + + Nezināma + + + Andora + + + Dubaija + + + Kabula + + + Antigva + + + Angilja + + + Tirāna + + + Erevāna + + + Nīderlandes Antiļas + + + Rotera + + + Palmera + + + Dienvidpols + + + Sjova + + + Mavsona + + + Deivisa + + + Vostoka + + + Kesija + + + Dumont D'Urville + + + Makmerdo + + + Riogaljegosa + + + Mendosa + + + Sanhuana + + + Ušuaja + + + Larioha + + + Sanluisa + + + Katamarka + + + Žužuja + + + Tukumana + + + Kordoba + + + Buenosairesa + + + Pagopago + + + Vīne + + + Pērta + + + Jūkla + + + Dārvina + + + Adelaida + + + Brokenhila + + + Kerija + + + Melburna + + + Hobarta + + + Lindemana + + + Sidneja + + + Brisbena + + + Lordhova + + + Barbadosa + + + Daka + + + Brisele + + + Vagadugu + + + Sofija + + + Bahreina + + + Bužumbura + + + Portonovo + + + Bermudu salas + + + Bruneja + + + Lapasa + + + Eirenupe + + + Riobranko + + + Portuvelju + + + Boavista + + + Manausa + + + Kujaba + + + Kampugrandi + + + Belena + + + Aragvaina + + + Sanpaulu + + + Brazīlija (Salvadora) + + + Fortalesa + + + Maseio + + + Resifi + + + Naso + + + Timpu + + + Minska + + + Beliza + + + Dausona + + + Vaithorsa + + + Inuvika + + + Vankūvera + + + Dousonkrīka + + + Jelounaifa + + + Edmontona + + + Sviftkarenta + + + Kembridžbeja + + + Regīna + + + Vinipega + + + Rezolūta + + + Reinirivera + + + Rankininleta + + + Koralharbora + + + Tanderbeja + + + Nipigona + + + Monreāla + + + Ikaluita + + + Pangnirtanga + + + Monktona + + + Halifaksa + + + Gūsbeja + + + Gleisbeja + + + Blanksablona + + + Sentdžonsa + + + Kokosa + + + Kinšasa + + + Lubumbaši + + + Bangi + + + Brazavila + + + Cīrihe + + + Abidžana + + + Lieldienu sala + + + Santjago + + + Duala + + + Kašgara + + + Urumči + + + Čuncina + + + Harbina + + + Kostarika + + + Havanna + + + Kaboverde + + + Ziemsvētku + + + Nikosija + + + Berlīne + + + Džibutija + + + Kopenhāgena + + + Dominika + + + Santodomingo + + + Alžīra + + + Galapagu salas + + + Gvajakila + + + Tallina + + + Kaira + + + Ajūna + + + Kanāriju salas + + + Seūta + + + Madride + + + Adisabeba + + + Fidži + + + Stenlija + + + Trūka + + + Kosraja + + + Farēru salas + + + Parīze + + + Librevila + + + Londona + + + Grenāda + + + Kajenna + + + Akra + + + Gibraltārs + + + Tūle + + + Nūka + + + Skoresbisunda + + + Denmārkšavna + + + Bandžula + + + Konakri + + + Gvadelupa + + + Atēnas + + + Dienviddžordžija + + + Gvatemala + + + Guama + + + Bisava + + + Gajāna + + + Honkonga + + + Portoprensa + + + Budapešta + + + Džakarta + + + Pontianaka + + + Makasara + + + Džajapūra + + + Dublina + + + Čagosa + + + Bagdāde + + + Teherāna + + + Reikjavīka + + + Roma + + + Jamaika + + + Ammāna + + + Tokija + + + Biškeka + + + Pnompeņa + + + Enderburija + + + Tarava + + + Komoru + + + Sentkitsa + + + Phenjana + + + Seula + + + Kuveita + + + Kaimanu Salas + + + Aktau + + + Orāla + + + Aktobe + + + Kizilorda + + + Almati + + + Vjangčana + + + Beirūta + + + Sentlūsija + + + Vaduca + + + Kolombo + + + Monrovija + + + Viļņa + + + Luksemburga + + + Rīga + + + Tripole + + + Kasablanka + + + Monako + + + Kišiņeva + + + Antananarivu + + + Kvadžaleina + + + Madžuro + + + Jangona + + + Hovda + + + Ulanbatora + + + Čoibalsana + + + Makao + + + Saipana + + + Martinika + + + Nuakšota + + + Montserrata + + + Maurīcija + + + Maldīvija + + + Blantaira + + + Tihuāna + + + Ermosiljo + + + Masatlāna + + + Čihuahua + + + Montereja + + + Mehiko + + + Kankūna + + + Kualalumpura + + + Kučinga + + + Vindhuka + + + Numea + + + Niameja + + + Norfolka + + + Lagosa + + + Managva + + + Amsterdama + + + Četema + + + Oklenda + + + Muskata + + + Taiti + + + Markvesa + + + Gambjera + + + Portmorsbi + + + Karači + + + Varšava + + + Mikelona + + + Pitkērna + + + Puertoriko + + + Azoru salas + + + Lisabona + + + Asunsjona + + + Katara + + + Reinjona + + + Bukareste + + + Kaļiņingrada + + + Maskava + + + Volgograda + + + Jekaterinburga + + + Omska + + + Novosibirska + + + Krasnojarska + + + Irkutska + + + Jakutska + + + Vladivostoka + + + Sahalīna + + + Magadāna + + + Kamčatka + + + Anadira + + + Rijāda + + + Gvadelkanāla + + + Hartūma + + + Stokholma + + + Singapūra + + + Sv. Helēna + + + Frītauna + + + Dakāra + + + Mogadīšo + + + Santome + + + Salvadora + + + Damaska + + + Grendturka + + + Ndžamena + + + Kergvelena + + + Bangkoka + + + Dušanbe + + + Ašgabata + + + Tunisa + + + Istanbula + + + Portofspeina + + + Taipeja + + + Dāresalāma + + + Užgoroda + + + Kijeva + + + Simferopole + + + Zaporožje + + + Midveja + + + Džonstauna + + + Veika + + + Adaka + + + Noma + + + Aļaskas laiks + + + Jakutata + + + Džuno + + + Losandželosa + + + Fīniksa + + + Šiproka + + + Denvera + + + Ņūsalema + + + Centra Ziemeļdakotā + + + Čikāga + + + Menominī + + + Vinsensa + + + Pēterburga + + + Tellsitija + + + Noksa + + + Vinimaka + + + Indianapolisa + + + Luisvilla + + + Viveja + + + Montiselo + + + Detroita + + + Ņujorka + + + Samarkanda + + + Taškenta + + + Sentvinsenta + + + Karakasa + + + Senttomasa + + + Hošimina + + + Vallisa + + + Adena + + + Majota + + + Johannesburga + + + + + + , +   + + + + + #,##0.### + + + + + + + #,##0% + + + + + + + #,##0.00 ¤ + + + + + + Apvienoto Arābu Emirātu dirhēms + + + Argentīnas peso + + + Austrālijas dolārs + + + Bulgārijas leva + + + Brunejas dolārs + + + Bolīvijas boliviano + + + Brazīlijas reāls + + + Kanādas dolārs + + + Šveices franks + + + Čīles peso + + + Ķīnas juana + + + Kolumbijas peso + + + Čehijas krona + + + Vācijas marka + + + Dānijas krona + + + Igaunijas krona + + + Ēģiptes mārciņa + + + Eiro + + + + Fidži dolārs + + + Francijas franks + + + Lielbritānijas sterliņu mārciņa + + + Honkongas dolārs + + + Horvātijas kuna + + + Ungārijas forints + + + Indonēzijas rūpija + + + Izraēlas šekelis + + + Indijas rūpija + + + Japānas jena + + + Kenijas šiliņš + + + Dienvidkorejas vona + + + Kazahstānas tenge + Kazahstānas tenge + + + Lietuvas lits + + + Latvijas lats + Ls + + + Marokas dirhēms + + + Maltas lira + + + Meksikas peso + + + Malaizijas ringits + + + Norvēģijas krona + + + Jaunzēlandes dolārs + + + Peru jaunais sols + + + Filipīnu peso + + + Pakistānas rūpija + + + Polijas zlots + + + Rumānijas leja + + + Serbijas dinārs + + + Krievijas rublis + + + Saūda riāls + + + Zviedrijas krona + + + Singapūras dolārs + + + Slovēnijas tolars + + + Slovakijas krona + + + Taizemes bāts + + + Turcijas lira + + + Jaunā Turcijas lira + + + Jaunais Taivānas dolārs + + + Ukrainas grivna + + + ASV dolārs + + + Venecuēlas bolivārs + + + Vjetnamas dongi + + + Nezināma vai nederīga valūta + XXX + + + Dienvidāfrikas rands + + + + + + {0} diena + {0} dienas + {0} dienu + + + {0} stunda + {0} stundas + {0} stundu + + + {0} minūte + {0} minūtes + {0} minūšu + + + {0} mēnesis + {0} mēneši + {0} mēnešu + + + {0} sekunde + {0} sekundes + {0} sekunžu + + + {0} nedēļa + {0} nedēļas + {0} nedēļu + + + {0} gads + {0} gadi + {0} gadu + + + + + jā:ja:j + nē:ne:n + + + diff --git a/libs/Zend/Locale/Data/lv_LV.xml b/libs/Zend/Locale/Data/lv_LV.xml new file mode 100644 index 0000000..be1bd71 --- /dev/null +++ b/libs/Zend/Locale/Data/lv_LV.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/mk.xml b/libs/Zend/Locale/Data/mk.xml new file mode 100644 index 0000000..cfcf14e --- /dev/null +++ b/libs/Zend/Locale/Data/mk.xml @@ -0,0 +1,1272 @@ + + + + + + + + + + + африкански + амхариски + арапски + асамски + азербејџански + белоруски + бугарски + бихари + бенгалски + бретонски + босански + каталонски + чешки + велшки + дански + германски + грчки + англиски + есперанто + шпански + естонски + баскиски + персиски + фински + тагалог (филипински) + фарски + француски + фризиски + ирски + шкотско галски + галициски + гуарани + гуџарати + хебрејски + хинди + хрватски + унгарски + ерменски + интерлингва + индонезиски + исландски + италијански + јапонски + јавански + грузиски + камбоџански + каннада + корејски + курдски + киргистански + латински + литвански + латвиски + македонски + малајалам + монголски + марати + малезиски + малтешки + непалски + холандски + норвешки (Ниноршк) + норвешки + окситански + орија + пунџаби + полски + пашто + португалски + португалски (во Бразил) + португалски (во Португалија) + романски + руски + санскрит + синди + српско-хрватски + синхалиски + словачки + словенечки јазик + сомалиски + албански + српски + сесото + шведски + свахили + тамилски + телугу + тајландски + тигрејски + туркменистански + клингонски + турски + тви (диалект на аканскиот јазик) + ујгурски + украински + урду + узбечки + виетнамски + хауса + јидски + кинески + зулу + + + Андора + Обединети Арапски Емирати + Авганистан + Антигуа и Барбуда + Ангвила + Албанија + Ерменија + Холандски Антили + Ангола + Антарктик + Аргентина + Американска Самоа + Австрија + Австралија + Аруба + Азејберџан + Босна и Херцеговина + Барбадос + Бангладеш + Белгија + Буркина Фасо + Бугарија + Бахреин + Бурунди + Бенин + Бермуди + Брунеи + Боливија + Бразил + Бахами + Бутан + Боувитови острови + Боцвана + Белорусија + Белизе + Канада + Кокосови острови + Демократска Република Конго + Централан Афричка република + Конго + Швајцарија + Брегот на Слоновата Коска + Кукови Острови + Чиле + Камерун + Кина + Колумбија + Костарика + Србија и Црна Гора + Куба + Зеленортски Острови + Божиќни Острови + Кипар + Чешка Република + Германија + Џибути + Данска + Доминика + Доминиканска Република + Алжир + Еквадор + Естонија + Египет + Западна Сахара + Еритреја + Шпанија + Етиопија + Финска + Фиџи + Фокландски Острови + Микронезија + Фарски Острови + Франција + Габон + Велика Британија + Гренада + Џорџија + Француска Гуана + Гана + Гилбартар + Гренланд + Гамбија + Гвинеја + Гвадалупе + Екваторска Гвинеја + Грција + Јужна Џорџија и Јужни Сендвич Острови + Гватемала + Гвам + Гвинеа-Биса + Гвајана + Хон Конг С.А.Р Кина + Хардови острови и Мекдоналд Острови + Хондурас + Хрватска + Хаити + Унгарија + Индонезија + Ирска + Израел + Индија + Британско Индиско Океанска територија + Ирак + Иран + Исланд + Италија + Јамајка + Јордан + Јапонија + Кенија + Кургистан + Камбоџа + Кирибати + Коморос + Сент Кристофер и Невис + Северна Кореа + Јужна Кореа + Кувајт + Кајманови Острови + Казаџстан + Лаос + Либанон + Света Лучија + Лихтенштајн + Шри Ланка + Либериа + Лешото + Литванија + Луксембург + Латвија + Либија + Мароко + Монако + Молдова + Мадагаскар + Маршалови ОСтрови + Македонија + Мали + Муанмар + Монголија + Макао С.А.Р Кина + Северни Маријанини Острови + Мартиник + Мавританија + Монсерат + Малта + Мауритус + Малдиви + Малави + Мексико + Малезија + Мозамбе + Намибија + Нова Каледонија + Нигер + Нофролк Остров + Нигерија + Никараква + Холандија + Норвешка + Непал + Науру + Ние + Нов Зеланд + Оман + Панама + Перу + Француска Полинезија + Папуа Нова Гвинеја + Филипини + Пакистан + Полска + Сент Пјер и Микелан + Питкарн + Порторико + Палестинска Територија + Португалија + Палау + Парагвај + Кватар + Рејунион + Романија + Русија + Руанда + Саудиска Арабија + Соломоновите Острови + Сејшели + Судан + Шведска + Сингапур + Света Елена + Словенија + Свалбард и Жан Мијен Острови + Словачка + Сиера Леоне + Сан Марино + Сенегал + Сомалија + Суринам + Сао Томе и Принципе + Ел Салвадор + Сирија + Свазиленд + Турк и Каикос Острови + Чад + Француски Јужни територии + Того + Тајланд + Таџикистан + Токелау + Источен Тимор + Туркменистан + Тунис + Тонга + Турција + Тринидад и Тобаго + Тувалу + Тајван + Танзанија + Украина + Уганда + Обединети Држави + Уругвај + Узбекистан + Ватикан + Сент Винцент и Гренадините + Венецуела + Британски Девствени Острови + Девствени Острови на САД + Виетнам + Ванату + Волис и Футуна острови + Самоа + Јемен + Мајоте + Јужна Африка + Замбија + Зимбабве + + + Календар + Сортирање + Валута + + + Будистички календар + Кинески Календар + Директно + Грегориански Календар + Еврејски Календар + Исламски Календар + Исламско граѓански Календар + Јапонски Календар + Азбучен редослед + Сортирање Pinyin + Ритмички редослед + Традиционално + + + + [а-г ѓ д-з ѕ и ј к ќ л љ м н њ о-ч џ ш] + [ѐ ѝ] + + + GuMtkHmsSEDFwWahKzUeygAZvcL + + + + + + јан. + фев. + мар. + апр. + мај + јун. + јул. + авг. + септ. + окт. + ноем. + декем. + + + с + н + + + јануари + февруари + март + април + мај + јуни + јули + август + септември + октомври + ноември + декември + + + + + ј + ф + м + а + м + ј + ј + а + с + о + н + д + + + + + + + нед. + пон. + вт. + сре. + чет. + пет. + саб. + + + недела + понеделник + вторник + среда + четврток + петок + сабота + + + + + н + п + в + с + ч + п + с + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + AM + PM + + + пр.н.е. + ае. + + + + + + EEEE, dd MMMM yyyy + + + + + dd MMMM yyyy + + + + + dd.M.yyyy + + + + + dd.M.yy + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1} {0} + + + + dd MMMM + dd.M + Q yy + M.yyyy + MMMM yyyy + + + {0} - {1} + + M-M + + + E, dd.M - E, dd.M + E, dd.M - E, dd.M + + + MMM-MMM + + + E, dd MMM - E, dd MMM + E, dd - E, dd MMM + + + dd MMM - dd MMM + dd-dd MMM + + + dd.M - dd.M + dd.M - dd.M + + + d-d + + + HH-HH + + + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH-HH v + + + y-y + + + M.yy - M.yy + M.yy - M.yy + + + E, dd.M.yy - E, dd.M.yy + E, dd.M.yy - E, dd.M.yy + E, dd.M.yy - E, dd.M.yy + + + MMM-MMM yyyy + MMM yyyy - MMM yyyy + + + E, dd MMM - E, dd MMM yyyy + E, dd - E, dd MMM yyyy + E, dd MMM yyyy - E, dd MMM yyyy + + + dd MMM - dd MMM yyyy + dd-dd MMM yyyy + dd MMM yyyy - dd MMM yyyy + + + dd.M.yy - dd.M.yy + dd.M.yy - dd.M.yy + dd.M.yy - dd.M.yy + + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + , + . + + + + + #,##0.###;(#,##0.###) + + + + + + Андорска Пезета + + + Дирхам + + + Авгани (1927-2002) + + + Авгани + Af + + + Албански Лек + lek + + + Ермениски Драм + dram + + + Анголска Кванза + + + Анголска Кванза (1977-1990) + + + Анголска нова Кванза (1990-2000) + + + Аргентински Пезос (1983-1985) + + + Аргентински Пезос + Arg$ + + + Австралиски Шилинг + + + Австралиски Долар + $A + + + Босанско-Херцеговски Динар + + + Босанско-Херцеговски Динар конвертабилна марка + KM + + + Барбадоски Долар + BDS$ + + + Белгиски Франк (конвертибилен) + + + Белгиски Франк + BF + + + Белгиски Франк (финансиски) + + + Бугарски цврст лев + lev + + + Бугарски нов лев + + + Бахраински Динар + BD + + + Буриндиски Франк + Fbu + + + Бермудски Долар + Ber$ + + + Брунејски долар + + + Бахамски Долар + + + Боцвантска Пула + + + Белоруска нова рубља (1994-1999) + + + Белоруска Рубља + Rbl + + + Белизиски Долар + BZ$ + + + Канадски Долар + Can$ + + + Швајцарски Франк + SwF + + + Колумбиски Пезос + Col$ + + + Костарикански Колон + C + + + Чехословачка цврста корона + + + Кубански пезос + + + Кипарска фунта + £C + + + Чешка корона + + + Германска Марка + + + Доминикански Пезос + RD$ + + + Алгериски Динар + DA + + + Египетска Фунта + + + Шпанска Пезета + + + Етиописки Бир + Br + + + Евро + + + Финска марка + + + Фиџи долар + F$ + + + Факландска фунта + + + Француски франк + + + Британска Фунта + + + Грузиски лари + lari + + + Ганајски Седи + + + Гибралтарска фунта + + + Гамбиски Даласи + + + Гвинејски франк + GF + + + Грчка драхма + + + Гватемалски кветцал + Q + + + Гвинејски Бисау пезос + + + Гвијански Долар + G$ + + + Хонгкошки долар + HK$ + + + Хондурска лемпира + L + + + Хрватски динар + + + Хрватска Куна + + + Хаитски гурд + + + Унгарска форинта + Ft + + + Ирска фунта + IR£ + + + Изрелска фунта + + + Израелски нов шекел + + + Индиска рупија + INR + + + Ирачки динар + ID + + + Ирански риал + RI + + + Исландска крона + + + Италијанкса лира + + + Јамајкански долар + J$ + + + Јордански динар + JD + + + Јапонски јен + + + Кениски шилинг + K Sh + + + Киргистански сом + som + + + Камбоџиски рел + CR + + + Коморски долар + CF + + + Северно корејски вон + + + Јужно корејски вон + + + Кувајтски динар + KD + + + Казакстантска тенга + T + + + Лаоски кип + + + Либиска фунта + LL + + + Шриланканска рупија + SL Re + + + Либериски долар + + + Лесотско лоти + M + + + Литваниска лита + + + Литваниски литаз + + + Луксембуршки франк + + + Латвијски лат + + + Латвијска рубља + + + Либијски динар + LD + + + Марокански Дирхам + + + Марконски франк + + + Молдавски леу + + + Македонски денар + MDen + + + Малски франк + + + Монголиски тугрик + Tug + + + Макао патака + + + Малтиска лира + Lm + + + Малтиска финта + + + Мексикански пезос + MEX$ + + + Мексикански сребрен пезос (1861-1992) + + + Малазиски рингит + RM + + + Мозамбиско ескудо + + + Мозамбиски метикал + Mt + + + Намибиски долар + N$ + + + Нигериска наира + + + Никарагванска кордоба + + + Холандски гилдер + + + Норвешка круна + NKr + + + Непалска рупија + Nrs + + + Новозелански долар + $NZ + + + Омански Риал + RO + + + Панамска балбоа + + + Перуански нов сол + + + Перуански сол + + + Папуа новогвинејскиа кина + + + Филипински пезос + + + Пакистанска рупија + Pra + + + Полска злота + Zl + + + Полска злота (1950-1995) + + + Португалско ескудо + + + Парагвајска гуарана + + + Кватарски риал + QR + + + Романска леа + leu + + + Руска рубља + + + Руска рубља (1991-1998) + + + Руандски франк + + + Саудиски риал + SRl + + + Соломонски долар + SI$ + + + Сејшелска рупија + SR + + + Судански динар + + + Суданска фунта + + + Шведска круна + SKr + + + Сингапурски доалр + S$ + + + Словенски толар + + + Словачка круна + Sk + + + Сиералеонско леоне + + + Сомалијски шилинг + Sh. + + + Суринамски гилдер + Sf + + + Советска рубља + + + Елсавадорски колон + + + Сириска фунта + LS + + + Свазилендски лилаген + E + + + Таи бат + + + таџикистанска рубља + + + Таџикистантски сомони + + + Турментистантски матат + + + Тунезиски динар + + + Тиморски ескудо + + + Турска лира + TL + + + Тајвански нов долар + NT$ + + + Танзаниски шилинг + T Sh + + + Украинска хривнија + + + Угандиски шилинг (1966-1987) + + + Угандиски шилинг + U Sh + + + САД долар + + + САД долар (Next day) + + + САД долар (Same day) + + + Уругвајско песо (1975-1993) + + + УЗбекистански Сум + + + Венецуелски боливар + Be + + + Виетнамски донг + + + Ванатски вату + VT + + + Самоа тала + + + Источно карибиски долар + EC$ + + + Јеменски дианр + + + Јеменски риал + YRl + + + Југословенски динар + + + Југословенски конвертибилен динар + + + Јужно афрички ранд(финансиски) + + + Јужно афрички ранд + R + + + Замбиска кванча + + + Заирско новозаире + + + Зирско заире + + + Зимбабвиски долар + Z$ + + + + + + да:д + не:н + + + diff --git a/libs/Zend/Locale/Data/mk_MK.xml b/libs/Zend/Locale/Data/mk_MK.xml new file mode 100644 index 0000000..490b15c --- /dev/null +++ b/libs/Zend/Locale/Data/mk_MK.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/ml.xml b/libs/Zend/Locale/Data/ml.xml new file mode 100644 index 0000000..f5fbb91 --- /dev/null +++ b/libs/Zend/Locale/Data/ml.xml @@ -0,0 +1,4520 @@ + + + + + + + + + + + {0} ({1}) + , + + + അഫാര്‍ + അബ്ഖാസിയന്‍ + അചിനീസ് + അകോലി + അഡാങ്ഗമി + അഡൈഗേ + അവസ്റ്റാന്‍ + ആഫ്രിക്കാന്‍സ് + ആഫ്രോ-ഏഷ്യാറ്റിക് ഭാഷ + ആഫ്രിഹിലി + അയിനു + അഘാന്‍ + അക്കാഡിയന്‍ + അലൈട്ട് + അല്‍ഗോണ്‍ക്യന്‍ ഭാഷ + സതേണ്‍ അള്‍ട്ടായി + അംഹാറിക് + അരഗോണീസ് + പഴയ ഇംഗ്ലീഷ് + ആന്‍ഗിക + അപ്പാചേ ഭാഷ + അറബി + അരമായഭാഷ + ആരൌകാനിയന്‍ + അരപാഹോ + കൃത്രിമഭാഷ + അറാവക് + ആസ്സാമീസ് + ഓസ്‌ട്രിയന്‍ + അതപാസ്കന്‍ ഭാഷ + ഓസ്ട്രേലിയന്‍ ഭാഷ + അവാരിക് + അവധി + അയ്മാറ + അസര്‍ബൈജാനി + ബഷ്ഖിര്‍ + ബന്‍ഡ + ബാമിലകേ ഭാഷ + ബലൂചി + ബാലിനീസ് + ബസ + ബാള്‍ട്ടിക് ഭാഷ + ബൈലോറഷ്യന്‍ + ബജ + ബംബ + ബര്‍ബര്‍ + ബള്‍ഗേറിയന്‍ + ബീഹാറി + ഭോജ്‌പൂരി + ബിസ്‌ലാമ + ബികോല്‍ + ബിനി + സിക്സിക + ബംബാറ + ബംഗാളി + ബാന്ധു + തിബറ്റന്‍ + ബ്രിറ്റോണ്‍ + ബ്രജ് + ബോസ്നിയന്‍ + ബാറ്റക് + ബുറിയത്ത് + ബുഗിനീസ് + ബ്ലിന്‍ + കറ്റാലന്‍ + കാഡോ + മദ്ധ്യ അമേരിക്കന്‍ ഇന്‍ഡ്യന്‍ ഭാഷ + കാരിബ് + കാവോകേഷ്യന്‍ ഭാഷ + അറ്റ്സാം + ചെചന്‍ + സെബുവാനോ + സെല്‍റ്റിക് ഭാഷ + ചമോറോ + ചിബ്ച + ചഗതൈ + ചൂകീസ് + മാരി + ചിനൂഗ്-ജാര്‍ഗണ്‍ + ചോക്റ്റാവ് + ചിപേവ്യന്‍ + ചെരോകീ + ചിയേന്നേ + ചാമിക് ഭാഷ + കോര്‍സിക്കന്‍ + കോപ്റ്റിക് + ഇംഗ്ലീഷ് അധിഷ്ഠിത മിശ്ര ഭാഷ + ഫ്രഞ്ച് അധിഷ്ഠിത മിശ്രഭാഷ + പോര്‍ച്ചുഗീസ് അധിഷ്ടിത മിശ്ര ഭാഷ + ക്രീ + കൃമിയന്‍ ടര്‍ക്കിഷ് + മിശ്രഭാഷ + ചെക്ക് + കാഷുബിയാന്‍ + ചര്‍ച്ച് സ്ലാവിക് + കുഷിറ്റിക് ഭാഷ + ചുവാഷ് + വെല്‍ഷ് + ഡാനിഷ് + ഡകോട്ട + ഡര്‍ഗ്വാ + ദയാക് + ജര്‍മ്മന്‍ + ഓസ്ട്രിയന്‍ ജര്‍മന്‍ + സ്വിസ് ഉച്ച ജര്‍മന്‍ + ദലവാരെ + സ്ലേവ് + ഡോഗ്രിബ് + ദിന്‍ക + ഡോഗ്രി + ദ്രാവിഡഭാഷ + ലോവര്‍ സോര്‍ബിയന്‍ + ദ്വാല + മദ്ധ്യ ഡച്ച് + ദിവേഹി + ദ്വൈല + ഭൂട്ടാനി + എവ് + എഫിക് + പ്രാചീന ഈജിപ്ത്യന്‍ + എകാജുക് + ഗ്രീക്ക് + എലാമൈറ്റ് + ഇംഗ്ലീഷ് + ഓസ്ട്രേലിയന്‍ ഇംഗ്ലീഷ് + കനേഡിയന്‍ ഇംഗ്ലീഷ് + ബ്രിട്ടീഷ് ഇംഗ്ലീഷ് + അമേരിക്കന്‍ ഇംഗ്ലീഷ് + മദ്ധ്യ ഇംഗ്ലീഷ് + എസ്പരാന്തോ + സ്പാനിഷ് + ലാറ്റിന്‍ അമേരിക്കന്‍ സ്പാനിഷ് + ഇബേറിയന്‍ സ്പാനിഷ് + എസ്റ്റോണിയന്‍ + ബാസ്ക് + എവോന്‍ഡോ + പേര്‍ഷ്യന്‍ + ഫങ് + ഫിലിപ്പീനോ + ഫുല + ഫിന്നിഷ് + ഫിലിപ്പിനോ + ഫിന്നോ-ഉഗ്രിയന്‍ ഭാഷ + ഫിജിയന്‍ + ഫാറോസ് + ഫോന്‍ + ഫ്രഞ്ച് + കനേഡിയന്‍ ഫ്രഞ്ച് + സ്വിസ് ഫ്രഞ്ച് + മദ്ധ്യ ഫ്രഞ്ച് + പഴയ ഫ്രഞ്ച് + നോര്‍ത്തേന്‍ ഫ്രിഷ്യന്‍ + ഈസ്റ്റേണ്‍ ഫ്രിഷ്യന്‍ + ഫ്രിയുലിയാന്‍ + പശ്ചിമ ഫ്രിഷിയന്‍ + ഐറിഷ് + ഗാ + ഗയൊ + ഗബ്യ + സ്കോട്ടിഷ് ഗൈലിക് + ജര്‍മാനിക് ഭാഷ + ഗീസ് + ഗില്‍ബര്‍സേ + ഗലീഷ്യന്‍ + മദ്ധ്യ ഉച്ച ജര്‍മന്‍ + ഗ്വാറാനി + പ്രാചീന ഉച്ച ജര്‍മന്‍ + ഗോണ്ഡി + ഗൊറോന്‍റാലോ + ഗോഥിക്ക് + ഗ്രബൊ + പുരാതനയവനഭാഷ + സ്വിസ് ജര്‍മന്‍ + ഗുജറാത്തി + മാന്‍സ് + ഗ്വിച്ച് ഇന്‍ + ഹൌസ + ഹൈഡ + ഹവായിയന്‍ + ഹീബ്രു + ഹിന്ദി + ഹിലിഗയ്നോണ്‍ + ഹിമാചലി + ഹിറ്റൈറ്റേ + മോങ് + ഹിരി മോതു + ക്രൊയേഷ്യന്‍ + അപ്പര്‍ സോര്‍ബിയന്‍ + ഹെയ്തിയാന്‍ + ഹംഗേറിയന്‍ + ഹൂപ + അര്‍മേനിയന്‍ + ഹെറീറോ + ഇന്‍റര്‍ലിംഗ്വാ + ഇബാന്‍ + ഇന്‍ഡോനേഷ്യന്‍ + ഇന്‍റര്‍ലിംഗ്വി + ഇഗ്ബോ + ഷുവാന്‍യി + ഇജോ + ഇനുപിയാക് + ഇലോകോ + ഭാരതീയഭാഷ + ഇന്‍ഡോ-യൂറോപ്യന്‍ ഭാഷ + ഇംഗ്വിഷ് + ഇഡോ + ഇറാനിയന്‍ ഭാഷ + ഇറോക്വായിയന്‍ ഭാഷ + ഐസ്‌ലാന്‍ഡിക് + ഇറ്റാലിയന്‍ + ഇനുക്റ്റിറ്റട്ട് + ജപ്പാനീസ് + ലോജ്ബാന്‍ + ജൂഡിയോ-പേര്‍ഷ്യന്‍ + ജൂഡിയോ-അറബിക് + ജാവാനീസ് + ജോര്‍ജിയന്‍ + കര-കാല്‍പ്പക് + കബൈല്‍ + കാചിന്‍ + ജ്ജു + കംബ + കരേന്‍ + കാവി + കബര്‍ഡിയാന്‍ + ട്യാപ് + കോറോ + കോങ്ഗോ + ഘാസി + ഘോയിസന്‍ ഭാഷ + ഘോറ്റാനേസേ + കികൂയു + ക്വാന്യമ + കസാഖ് + കലാല്ലിസട്ട് + കംബോഡിയന്‍ + ക്ലിംഗന്‍ + കന്നഡ + കൊറിയന്‍ + കൊങ്കണി + കൊസറേയന്‍ + കപെല്ലേ + കനൂറി + കരചൈ-ബാല്‍കര്‍ + കരീലിയന്‍ + ക്രു + കുരുഖ് + കാശ്മീരി + കുര്‍ദ്ദിഷ് + കുമൈക് + കുതേനൈ + കോമി + കോര്‍ണിഷ് + കിര്‍ഗിസ് + ലാറ്റിന്‍ + ലാഡിനോ + ലഹ്‌ന്‍ഡ + ലംബ + ലക്സംബര്‍ഗിഷ് + ലഹ്ഗിയാന്‍ + ഗന്ധ + ലിംബര്‍ഗിഷ് + ലിംഗാല + ലാവോ + മോങ്കോ + ലോസി + ലിത്വേനിയന്‍ + ലുബ-കറ്റംഗ + ലൂബ-ലുലുവ + ലൂയിസെനോ + ലുന്‍ഡ + ലവോ + ലുഷായി + ലാത്വിയന്‍ + മദുരേസേ + മഗാഹി + മൈഥിലി + മകാസര്‍ + മണ്ഡിന്‍ഗോ + ഓസ്ട്രോനേഷ്യന്‍ + മസൈ + മോക്ഷ + മണ്ഡാര്‍ + മെന്‍ഡെ + മലഗാസി + മദ്ധ്യ ഐറിഷ് + മാര്‍ഷല്ലീസ് + മൌറി + മിക്മാക് + മിനാങ്കബൌ + ഇതരഭാഷ + മാസിഡോണിയന്‍ + മോണ്‍-ഖമര്‍ ഭാഷ + മലയാളം + മംഗോളിയന്‍ + മന്‍ചു + മണിപ്പൂരി + മനോബോ ഭാഷ + മൊള്‍ഡോവന്‍ + മോഹാക് + മൊസ്സി + മറാഠി + മലയ + മാള്‍ട്ടീസ് + പലഭാഷകള്‍ + മുണ്ഡ ഭാഷ + ക്രീക്ക് + മിരാന്‍റസേ + മര്‍വാരി + ബര്‍മീസ് + മായന്‍ ഭാഷ + ഏഴ്സ്യ + നൌറു + നാഹ്വാള്‍‍ട്ട് + വടക്കേ അമേരിക്കന്‍ ഇന്‍ഡ്യന്‍ ഭാഷ + നെപ്പോളിറ്റാന്‍ + നോര്‍വീജിയന്‍ ബുക്‌മല്‍ + നോര്‍ത്ത് ഡെബിള്‍ + ലോജര്‍മന്‍ + നേപ്പാളി + നേവാരി + ഡോങ്ക + നിയാസ് + നൈ‍ജര്‍-കോര്‍‍ഡോഫാനിയന്‍ + ന്യുവാന്‍ + ഡച്ച് + ഫ്ലമിഷ് + നോര്‍വീജിയന്‍ നൈനോര്‍ക്സ് + നോര്‍വീജിയന്‍ + നോഗൈ + പഴയ പേര്‍ഷ്യന്‍ + ഇന്‍കോ + ദക്ഷിണ നെഡിബിള്‍ + നോര്‍ത്തേന്‍ സോതോ + നുബിയന്‍ ഭാഷ + നവജോ + ക്ലാസിക്കല്‍ നേവാരി + ന്യന്‍ജ + ന്യാംവേസി + ന്യാന്‍കലേ + ന്യോറോ + സിമ + ഒസിറ്റാന്‍ + ഓജിബ്വാ + ഒറോമൂ + ഒറിയ + ഒസ്സെറ്റിക് + ഒസേജ് + ഓട്ടോമന്‍ തുര്‍ക്കിഷ് + ഓട്ടോമിയന്‍ ഭാഷ + പഞ്ചാബി + പാപുവാന്‍ ഭാഷ + പങ്കാസിനന്‍ + പാഹ്ലവി + പാംപന്‍ഗ + പാപിയാമെന്‍റൊ + പലാവുന്‍ + പ്രാചീന പേര്‍ഷ്യന്‍ + ഫിലിപീനി ഭാഷ + ഫീനിഷ്യന്‍ + പാലി + പോളിഷ് + പൊന്‍പിയന്‍ + പ്രാകൃതം + പ്രൊവന്‍ഷ്ല്‍ + പഷ്തു + പോര്‍ച്ചുഗീസ് + ബ്രസീലിയന്‍ പോര്‍ച്ചുഗീസ് + ഇബേറിയന്‍ പോര്‍ച്ചുഗീസ് + ക്വെച്ചുവ + രാജസ്ഥാനി + രാപനൂയി + രാരോടോങ്കന്‍ + രഹയ്ട്ടോ-റോമന്‍സ് + റുണ്ടി + റൊമാനിയന്‍ + റോമന്‍സ് ഭാഷ + റോമനി + മൂലഭാഷ + റഷ്യന്‍ + ആരോമാനിയന്‍ + കിന്യര്‍വണ്ട + സംസ്കൃതം + സാന്‍ഡവേ + യാകൂട് + ദക്ഷിണ അമേരിക്കന്‍ ഇന്‍ഡ്യന്‍ ഭാഷ + സാലിഷാന്‍ ഭാഷ + സമരിയാക്കാരുടെ അരമായ + സസാക് + സന്താലി + സര്‍ഡിനിയാന്‍ + സിസിലിയന്‍ + സ്കോട്സ് + സിന്ധി + നോര്‍ത്തേന്‍ സമി + സെല്‍കപ് + സെമറ്റിക് ഭാഷ + സാങ്കോ + പ്രാചീന ഐറിഷ് + ആംഗ്യഭാഷ + ഷാന്‍ + സിംഹള + സിഡാമോ + സിവോന്‍ ഭാഷ + ചീന-ടിബത്തന്‍ ഭാഷ + സ്ലോവാക്ക് + സ്ലോവേനിയന്‍ + സ്ലേവിക് ഭാഷ + സമോവന്‍ + സതേണ്‍ സമി + സമി ഭാഷ + ലൂലീ സമി + ഇനാരി സാമി + സ്കോള്‍ട്ട് സമി + ഷോണാ + സോണിന്‍കെ + സോമാലി + സോജിഡിയന്‍ + സോങ്ഗൈ + അല്‍ബേനിയന്‍ + സെര്‍ബിയന്‍ + ശ്രാനന്‍ ഡോങ്കോ + സെറര്‍ + സ്വാറ്റി + നിളോ-സഹാറന്‍ ഭാഷ + തെക്കന്‍ സോതോ + സുഡാനീസ് + സുകുമ + സുസു + സുമേരിയന്‍ + സ്വീഡിഷ് + സ്വാഹിലി + പുരാതന സുറിയാനിഭാഷ + സുറിയാനി + തമിഴ് + തായ് ഭാഷ + തെലുങ്ക് + ടിംനേ + ടെറേനോ + ടെറ്റും + താജിക് + തായ് + തിഗ്രിന്യ + ടൈഗ്രി + ടിവ് + തുര്‍ക്കമന്‍ + ടൊക്കേലൌ + തഗാലോഗ് + ക്ലിങ്ഗോണ്‍ + ലിംഗ്വിറ്റ് + ടമഷേക് + ത്സ്വാന + ടോംഗന്‍ + ന്യാസാ ഡോങ്ക + ടോക് പിസിന്‍ + തുര്‍ക്കി + ത്സോംഗ + സിംഷ്യന്‍ + ടാട്ടാര്‍ + തുംബുക + തുപി ഭാഷ + അറ്റ്ലാന്‍റിക്ക് ഭാഷ + തുവാലു + ത്വി + ടാഹിത്യന്‍ + തുവിനിയന്‍ + ഉഡ്മുര്‍ട്ട് + ഉയ്ഘുര്‍ + ഉഗറിട്ടിക് + ഉക്രേനിയന്‍ + ഉംബുന്ദു + അറിയാത്തതോ നിലവിലില്ലാത്തതോ ആയ ഭാഷ + ഉറുദു + ഉസ്ബെക് + വൈ + വെന്ദ + വിയറ്റ്നാമീസ് + വോളാപുക് + വോട്ടിക് + വല്ലൂണ്‍ + വകഷന്‍ ഭാഷകള്‍ + വലമൊ + വാരേയ് + വാഷൊ + സോര്‍ബിയന്‍ ഭാഷ + വൊളോഫ് + കല്‍മൈക് + ക്ഷോസാ + യാവോ + യെപ്പീസ് + യിദ്ദിഷ് + യൊറൂബാ + യുപിക് + സ്വാംഗ് + സാപ്പോടെക് + ബ്ലിസ്സിംബല്‍സ് + സെനഗ + ചൈനീസ് + ലളിതചീനഭാഷ + പരമ്പരാഗത ചൈനീസ്‌ + സാന്ദെ + സുളു + സുനി + ഭാഷയല്ലാത്തവ + സാസാ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ലോകം + ആഫ്രിക്ക + വടക്കേ അമേരിക്കന്‍ ഭൂഖണ്ഡം + ദക്ഷിണ അമേരിക്ക + ഓഷ്യാനിയ + പശ്ചിമആഫ്രിക്ക + മദ്ധ്യഅമേരിക്ക + കിഴക്കന്‍ ആഫ്രിക്ക + ഉത്തരആഫ്രിക്ക + മദ്ധ്യആഫ്രിക്ക + തെക്കേ ആഫ്രിക്ക + അമേരിക്കന്‍ ഭൂഖണ്ഡം + വടക്കേ അമേരിക്ക + കരീബിയന്‍ + കിഴക്കന്‍ ഏഷ്യ + തെക്കേ ഏഷ്യ + തെക്ക്-കിഴക്കന്‍ ഏഷ്യ + തെക്കേ യൂറോപ്പ് + ഓസ്ട്രേലിയയും ന്യൂസിലാന്‍ഡും + മെലനേഷ്യ + മൈക്രോനേഷ്യന്‍ ഭാഗം + പോളിനേഷ്യ + ദക്ഷിണ-മദ്ധ്യ ഏഷ്യ + ഏഷ്യ + മദ്ധ്യേഷ്യ + പശ്ചിമേഷ്യ + യൂറോപ്പ് + കിഴക്കന്‍ യൂറോപ്പ് + വടക്കേ യൂറോപ്പ് + പശ്ചിമ യൂറോപ്പ് + സ്വതന്ത്രരാഷ്ട്രങ്ങളുടെ കോമണ്‍‌വെല്‍ത്ത് + ലാറ്റിനമേരിക്കയും കരീബിയനും + അന്‍റോറ + സംയുക്ത അറബ് രാഷ്ട്രം + അഫ്ഗാനിസ്ഥാന്‍ + ആന്‍റിഗ്വ ആന്‍റ് ബര്‍ബുഡ + ആന്‍ഗ്വില്ല + അല്‍ബേനിയ + അര്‍മേനിയ + നെതര്‍ലന്‍ഡ്സ് ആന്‍റിലിസ് + അംഗോള + അന്‍റാര്‍ട്ടിക്ക + അര്‍ജന്‍റീന + അമേരിക്കന്‍ സാമോവ + ഓസ്ട്രിയ + ഓസ്ട്രേലിയ + അറുബ + അലന്‍ഡ് ദ്വീപുകള്‍ + അസര്‍ബൈജാന്‍ + ബോസ്നിയയും ഹെര്‍സഗോവിനയും + ബാര്‍ബഡോസ് + ബംഗ്ലാദേശ് + ബെല്‍ജിയം + ബുര്‍ക്കിനാ ഫാസോ + ബള്‍ഗേറിയ + ബഹ്റൈന്‍ + ബുറുണ്ടി + ബെനിന്‍ + ബര്‍മുഡ + ബ്രൂണയ് + ബൊളീവിയ + ബ്രസീല്‍ + ബഹാമാസ് + ഭൂട്ടാന്‍ + ബൌവെറ്റ് ഐലന്‍റ് + ബോട്സ്വാന + ബെലറൂസ് + ബെലീസ് + കാനഡ + കോക്കസ് + കോംഗോ - കിന്‍ഷാസ + സെന്‍ട്രല്‍ ആഫ്രിക്കന്‍ റിപ്പബ്ലിക് + കോംഗോ - ബ്രാസാവില്‍ + സ്വിറ്റ്സര്‍ലന്‍ഡ് + ഐവറി കോസ്റ്റ് + കൂക്ക് ദ്വീപുകള്‍ + ചിലി + കാമറൂണ്‍ + ചൈന + കൊളംബിയ + കോസ്റ്ററിക്ക + ക്യൂബ + കേപ്പ് വെര്‍ഡെ + ക്രിസ്മസ് ദ്വീപ് + സൈപ്രസ്സ് + ചെക്ക് റിപ്പബ്ലിക് + ജര്‍മനി + ജിബൂട്ടി + ഡെന്‍മാര്‍ക്ക് + ഡൊമിനിക്ക + ഡൊമിനിക്കന്‍ റിപ്പബ്ലിക് + അള്‍ജീരിയ + ഇക്വഡോര്‍ + എസ്റ്റോണിയ‍ + ഈജിപ്ത് + പശ്ചിമ സഹാറ + എറിത്രിയ + സ്പെയിന്‍ + എത്യോപ്യ + ഫിന്‍ലാന്‍ഡ് + ഫിജി + ഫാക്ക്‌ലാന്‍റ് ഐലന്‍റ് + മൈക്രോനേഷ്യ + ഫറോയി ദ്വീപുകള്‍ + ഫ്രാന്‍സ് + ഗാബോണ്‍ + ബ്രിട്ടന്‍ + ഗ്രനേഡ + ജോര്‍ജിയ + ഫ്രഞ്ച് ഗയാന + ഗേണ്‍സി + ഘാന + ജിബ്രാള്‍ട്ടര്‍ + ഗ്രീന്‍ലാന്‍റ് + ഗാംബിയ + ഗ്വിനിയ + ഗുവാഡെലോപ് + ഇക്വിറ്റോറിയല്‍ ഗ്വിനിയ + ഗ്രീസ് + ദക്ഷിണ ജോര്‍ജ്ജിയയും ദക്ഷിണ സാന്‍ഡ്‌വിച്ച് ദ്വീപുകളും + ഗ്വാട്ടിമാലാ + ഗ്വാം + ഗിനി-ബിസോ + ഗയാന + ഹോങ് കോങ് + ഹോണ്ടുറാസ് + ക്രൊയേഷ്യ + ഹെയ്തി + ഹംഗറി + ഇന്‍ഡോനേഷ്യ + അയര്‍ലാന്‍ഡ് + ഇസ്രായേല്‍ + ഐല്‍ ഓഫ് മാന്‍ + ഇന്ത്യ + ബ്രിട്ടീഷ് ഇന്ത്യന്‍ മഹാസമുദ്ര പ്രദേശം + ഇറാക്ക് + ഇറാന്‍ + ഐസ്‌ലാന്‍റ് + ഇറ്റലി + ജേഴ്സി + ജമൈക്ക + ജോര്‍ദ്ദാന്‍ + ജപ്പാന്‍ + കെനിയ + കിര്‍ഗിസ്ഥാന്‍ + കംബോഡിയ + കിരിബാത്തി + കോമറോസ് + സെയ്ന്‍റ് കിറ്റ്സും നെവിസും + ഉത്തരകൊറിയ + ദക്ഷിണകൊറിയ + കുവൈറ്റ് + കേയ്മാന്‍ ദ്വീപുകള്‍ + കസാഖിസ്ഥാന്‍ + ലാവോസ് + ലബനോണ്‍ + സെന്‍റ് ലൂസിയ + ലൈച്ടെസ്റ്റിന്‍ + ശ്രീലങ്ക + ലൈബീരിയ + ലെസോത്തോ + ലിത്വാനിയ + ലക്സംബര്‍ഗ് + ലാത്വിയ + ലിബിയ + മൊറോക്കൊ + മൊണോക്കൊ + മള്‍ഡോവ + മോണ്ടേനേഗ്രോ + സെന്‍റ് മാര്‍ട്ടിന്‍ + മഡഗാസ്കര്‍ + മാര്‍ഷല്‍‍‍ ദ്വീപുകള്‍ + മാസിഡോണിയ + മാലി + മ്യാന്‍മാര്‍ + മംഗോളിയ + മക്കാവോ + ഉത്തര മറിയാനാ ദ്വീപുകള്‍ + മാര്‍ട്ടീനിക് + മൌറിറ്റാനിയ + മോണ്ട്സെറാറ്റ് + മാള്‍ട്ട + മൌറീഷ്യസ് + മാലിദ്വീപ് + മലാവി + മെക്സിക്കോ + മലേഷ്യ + മൊസാംബിക്ക് + നമീബിയ + നൈഗര്‍ + നൈജീരിയ + നിക്കാരഗ്വ + നെതര്‍ലന്‍ഡ്സ് + നോര്‍വെ + നേപ്പാള്‍ + നൌറൂ + ന്യൂവേ + ന്യൂസിലാന്‍റ് + ഒമാന്‍ + പനാമ + പെറു + ഫ്രഞ്ച് പോളിനേഷ്യ + പപ്പുവ ന്യൂ ഗ്വിനി + ഫിലിപ്പൈന്‍സ് + പാക്കിസ്ഥാന്‍ + പോളണ്ട് + പിറ്റ്കെയ്ന്‍ + പ്യൂര്‍ട്ടോ റിക്കോ + പാലസ്തീന്‍ + പോര്‍ച്ചുഗല്‍ + പലാവു + പരാഗ്വേ + ഖത്തര്‍ + നോര്‍ഫോക് ദ്വീപ് + യൂറോപ്യന്‍ യൂണിയന്‍ + റീയൂണിയന്‍ + റൊമാനിയ + സെര്‍ബിയ + റഷ്യ + റുവാണ്ട + സൗദി അറേബ്യ + സോളമന്‍‍ ദ്വീപുകള്‍ + സെയ്ഷെല്‍സ് + സുഡാന്‍ + സ്വീഡന്‍ + സിംഗപ്പുര്‍ + സെന്‍റ് ഹെലീന + സ്ലോവേനിയ + സ്വാല്‍ബാഡും ജാന്‍ മായേനും + സ്ലോവാക്യ + സിയേറാ ലിയോണ്‍ + സാന്‍ മറിനോ + സെനഗല്‍ + സോമാലിയ + സുറിനാം + സാവോ റ്റമെ ആന്‍ഡ് പ്രിന്‍സിപ്പി + എല്‍ സാല്‍വദൂര്‍ + സിറിയ + സ്വാസിലാന്‍റ് + ചാഡ് + ദക്ഷിണ ഫ്രഞ്ച് ഭൂപ്രദേശം + ടോഗോ + തായ്‌ലാന്‍ഡ് + താജിക്കിസ്ഥാന്‍ + ടൊകെലാവു + കിഴക്കന്‍ തിമൂര്‍ + തുര്‍ക്ക്മെനിസ്ഥാന്‍ + ടുണീഷ്യ + ടോംഗ + തുര്‍ക്കി + ട്രിനിഡാഡും റ്റൊബാഗോയും + തുവാലു + തായ്‌വാന്‍ + ടാന്‍സാനിയ + ഉക്രൈന്‍ + ഉഗാണ്ട + അമേരിക്കന്‍ ഐക്യനാടുകള്‍ + ഉറൂഗ്വെ + ഉസ്ബെക്കിസ്ഥാന്‍ + വത്തിക്കാന്‍ + വെനിസ്വേല + ബ്രിട്ടീഷ് വിര്‍ജിന്‍ ദ്വീപുകള്‍ + യു എസ് വെര്‍ജിന്‍ ദ്വീപുകള്‍ + വിയറ്റ്നാം + വന്വാത്തു + വാലിസ് ആന്‍ഡ് ഫ്യുചൂന + സാമോവ + യമന്‍ + മയോട്ട് + ദക്ഷിണാഫ്രിക്ക + സാംബിയ + സിംബാബ്വേ + അറിയപ്പെടാത്തതോ നിലവിലില്ലാത്തതോ ആയ പ്രദേശം + + + 1996-ലെ ജര്‍മന്‍ ലിപി + 1606 വരെയുള്ള ആധുനികമദ്ധ്യകാല ഫ്രഞ്ച് + കിഴക്കന്‍ അര്‍മീനിയന്‍ + ബൂണ്ട്‌ലിങ്ങ് + ഐപി‌എ സ്വനവ്യവസ്ഥ + മോണോറ്റോണിക് + നേറ്റിസോണ്‍ പ്രാദേശികരൂപം + ഗ്നിവ/നിജിവ പ്രാദേശികരൂപം + കമ്പ്യൂട്ടറിന്റെ ഉപയോഗത്തിന് + പരിഷ്ക്കരിച്ച ലിപി + + + കലണ്ടര്‍ + അകാരാദിക്രമം + നാണയം + + + പരമ്പരാഗത ചൈനീസ് ക്രമീകരണം - ബിഗµ5 + ബുദ്ധമതകലണ്ടര്‍ + ചൈനീസ് കലണ്ടര്‍ + പ്രത്യക്ഷക്രമീകരണം + ലളിതമായ ചൈനീസ് ക്രമീകരണം - ജീബി2312 + ഇംഗ്ലീഷ് കലണ്ടര്‍ + യഹൂദകലണ്ടര്‍ + ശകവര്‍ഷ കലണ്ടര്‍ + ഇസ്ലാം കലണ്ടര്‍ + ഇസ്ലാം-സിവി¿ല്‍ കലണ്ടര്‍ + ജപ്പാനീസ് കലണ്ടര്‍ + ഫോണ്‍ബുക്കിലെ ക്രമീകരണം + പിന്‍‌യിന്‍ ക്രമീകരണം + ചൈനീസ് കലണ്ടര്‍ + സ്റ്റ്രോക്ക് ക്രമീകരണം + പരമ്പരാഗത ക്രമീകരണം + + + യു.എസ്. + മെട്രിക് + + + ഭാഷ: {0} + ലിപി: {0} + ദേശം: {0} + + + + [\u200C \u200D അ-ഋ ൠ ഌ ൡ എ-ഐ ഒ-ന പ-ര ല വ ള ഴ റ ശ-ഹ ഃ ം ാ-ൃ െ-ൈ ൊ-ൌ ൗ ്] + [a-z] + [a-z] + + + + + + + + + + + + + + ജനു + ഫെബ്രു + മാര്‍ + ഏപ്രി + മേയ് + ജൂണ്‍ + ജൂലൈ + ആഗ + സെപ്റ്റം + ഒക്ടോ + നവം + ഡിസം + + + ജനുവരി + ഫെബ്രുവരി + മാര്‍ച്ച് + ഏപ്രില്‍ + മേയ് + ജൂണ്‍ + ജൂലൈ + ഓഗസ്റ്റ് + സെപ്റ്റംബര്‍ + ഒക്ടോബര്‍ + നവംബര്‍ + ഡിസംബര്‍ + + + + + + ഫെ + + + മേ + ജൂ + ജൂ + + സെ + + + ഡി + + + + + + + ഞാ + തി + ചൊ + ബു + വ്യാ + വെ + + + + ചൊ + + + ഞായര്‍ + തിങ്കള്‍ + ചൊവ്വ + ബുധന്‍ + വ്യാഴം + വെള്ളി + ശനി + + + + + + + + + + + + + + തിങ്കളാഴ്ച + + + + + + + Q1 + Q2 + Q3 + Q4 + + + ഒന്നാം പാദം + രണ്ടാം പാദം + മൂന്നാം പാദം + നാലാം പാദം + + + + + 1 + 2 + 3 + 4 + + + + രാവിലെ + വൈകുന്നേരം + + + ക്രിസ്തുവിനു് മുമ്പ്‌ + ക്രിസ്തുവിനു് പിമ്പ് + + + ക്രി.മു. + ക്രി.പി. + + + ക്രി.മു. + ക്രി.പി. + + + + + + yyyy, MMMM d, EEEE + + + + + yyyy, MMMM d + + + + + yyyy, MMM d + + + + + dd-MM-yy + + + + + + + h:mm:ss a v + + + + + h:mm:ss a z + + + + + h:mm:ss a + + + + + h:mm a + + + + + + + {1} {0} + + + + h:mm a + L + M/d, E + LLL + MMM d, E + MMMM d, E + MMMM d + MMM d + dd-MM + d/M + d + mm:ss + yyyy + yyyy-M + yyyy-M-d, EEE + yyyy MMM + yyyy MMM d, EEE + yyyy MMMM + yyyy Q + yyyy QQQ + Q yy + MM-yyyy + MMMM yyyy + + + {0} - {1} + + M-M + + + d/M, E - d/M, E + d/M, E - d/M, E + + + MMM-MMM + + + MMM d, E - MMM d, E + MMM d, E - MMM d, E + + + LLLL-LLLL + + + MMM d - MMM d + MMM d-d + + + d/M - d/M + d/M - d/M + + + d-d + + + h a – h a + h–h a + + + h:mm a – h:mm a + h:mm–h:mm a + h:mm–h:mm a + + + h:mm a – h:mm a v + h:mm–h:mm a v + h:mm–h:mm a v + + + h a – h a v + h–h a v + + + y-y + + + M/yy – M/yy + M/yy – M/yy + + + d/M/yy, E - d/M/yy, E + d/M/yy, E - d/M/yy, E + d/M/yy, E - d/M/yy, E + + + yyyy MMM-MMM + yyyy MMM - yyyy MMM + + + yyyy MMM d, E - MMM d, E + yyyy, MMM d, E - d, E + yyyy MMM d, E - yyyy MMM d, E + + + yyyy-MM – MM + yyyy-MM – yyyy-MM + + + yyyy MMM d - MMM d + yyyy MMM d-d + yyyy MMM d - yyyy MMM d + + + d/M/yy – d/M/yy + d/M/yy – d/M/yy + d/M/yy – d/M/yy + + + + + + അബ്ദം + + + വര്‍ഷം + + + മാസം + + + ആഴ്ച + + + ദിവസം + ഇന്നു് + നാളെ + മറ്റന്നാള്‍ + ഇന്നേക്ക് മൂന്നാം‌പക്കം + ഇന്നലെ + മിനിഞ്ഞാന്ന് + മൂന്നുദിവസം മുമ്പ് + + + ആഴ്ചയിലെ ദിവസം + + + രാവിലെ/വൈകുന്നേരം + + + മണിക്കൂര്‍ + + + മിനിട്ട് + + + സെക്കന്‍റ് + + + മേഖല + + + + + + + + ജ്യേഷ്ഠം + + + + + + ചൈത്രം + വൈശാഖം + ജ്യേഷ്ടം + ആഷാഢം + ശ്രാവണം + ഭാദ്രപാദം + ആശ്വിനം + കാര്‍ത്തിക + അഗ്രഹായനം + പൌഷം + മാഘം + ഫല്‍ഗുനം + + + + + ചൈ + വൈ + ജ്യേ + + ശ്രാ + ഭാ + + കാ + + പൌ + മാ + + + + + + + + + ശക + + + + + + + + മുഹറം + സഫര്‍ + റബീഹുല്‍ അവ്വല്‍ + റബീഹുല്‍ ആഖിര്‍ + ജമാദുല്‍ അവ്വല്‍ + ജമാദുല്‍ ആഖിര്‍ + റജബ് + ശഹബാന്‍ + റമളാന്‍ + ശവ്വാല്‍ + ദുല്‍ ഖഹദ് + ദുല്‍ ഹിജ്ജ + + + + + മു + + റ-അ + റ-ആ + ജ-അ + ജ-ആ + + + + + ദു + ദു-ഹി + + + + + + ഹിജറ + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} സമയം + {1} ({0}) + + അറിയപ്പെടാത്ത നഗരം + + + റൊതീറ + + + പാമര്‍ + + + ദക്ഷിണ ധ്രൂവം + + + സ്യോവ + + + മാവ്സണ്‍ + + + ഡെയ്‌വിസ് + + + വോസ്റ്റോക് + + + കാസെ + + + ഡ്യൂമണ്ട് ഡി യുര്‍വില്‍ + + + മാക്മര്‍ഡോ + + + റിയോ ഗ്യാലഗോസ് + + + മെന്‍ഡോസ + + + സാന്‍ ജുവാന്‍ + + + ഉഷിയ + + + ലാ റിയോജ + + + സാന്‍ ലൂയിസ് + + + ‍ക്യാറ്റമാര്‍ക്ക + + + ജുജുയ് + + + റ്റുകുമാന്‍ + + + കൊര്‍ദോവ + + + ബ്യൂനസ് ഐറിസ് + + + പെര്‍ത്ത് + + + യൂക്ല + + + ഡാര്‍വിന്‍ + + + അഡലെയ്ഡ് + + + ബ്രോക്കണ്‍ ഹില്‍ + + + ക്യൂറി + + + മെല്‍ബണ്‍ + + + ഹൊബാര്‍ട്ട് + + + ലിന്‍ഡെമാന്‍ + + + സിഡ്നി + + + ബ്രിസ്‌ബേയ്ന്‍ + + + ലോഡ് ഹോവ് + + + യെറുനീപ്പെ + + + റിയോ ബ്രാങ്കോ + + + പോര്‍ട്ടോ വെല്ലോ + + + ബോവ വിസ്റ്റ + + + മനൌസ് + + + കുയ്ബ + + + ക്യാന്പോ ഗ്രാന്‍ഡെ + + + ബെലം + + + അറഗ്വൈന + + + സാവോ പോലോ + + + ബഹിയ + + + ഫോര്‍ട്ടലീസ + + + മാസിയോ + + + റെസീഫെ + + + നൊറോന + + + ഡോവ്സണ്‍ + + + വൈറ്റ്ഹോഴ്സ് + + + ഇനുവിക് + + + വാന്‍‌കൂവര്‍ + + + ഡോവ്സണ്‍ ക്രീക്ക് + + + യെല്ലോനൈഫ് + + + എഡ്മോണ്‍ടണ്‍ + + + സ്വിഫ്റ്റ് കറന്‍റ് + + + കെയ്ന്പ്രിഡ്ജ് ബേ + + + റിജീന + + + വിന്നിപെഗ് + + + റെസല്യൂട്ട് + + + റെയ്നി റിവര്‍ + + + റാങ്കിന്‍ ഇന്‍ലെറ്റ് + + + കോറല്‍ ഹാര്‍ബര്‍ + + + തണ്ടര്‍ ബേ + + + നിപ്പിഗോണ്‍ + + + ടൊറണ്ടോ + + + മോണ്ട്രിയാല്‍ + + + ഇഖാലിത് + + + പാന്‍ഗ്‌നിറ്റങ് + + + മോങ്റ്റണ്‍ + + + ഹാലിഫാക്സ് + + + ഗൂസ് ബേ + + + ഗ്ലെയ്സ് ബേ + + + ബ്ലാങ്ക് സാബ്ലോണ്‍ + + + സെയ്ന്‍റ് ജോണ്‍സ് + + + കിന്‍ഷാസ + + + ലൂബുംബാഷി + + + ഈസ്റ്റര്‍ + + + കാഷ്ഗര്‍ + + + ഉറുംഖി + + + ചോങ്ഖിങ് + + + ഹാര്‍ബിന്‍ + + + ഗാലപ്പാഗോസ് + + + ക്യാനറി + + + ക്യൂട്ട + + + ട്രക് + + + പൊനാപ് + + + കൊസ്രേ + + + തൂളി + + + സ്കോര്‍സ്ബൈസണ്ട് + + + ഡാന്‍മാര്‍ക്ക്ഷാവ്ന്‍ + + + ജക്കാര്‍ത്ത + + + പൊന്‍റിയാനക് + + + മകസ്സര്‍ + + + ജയപുര + + + എന്‍ഡബറി + + + കിരിതിമാത്തി + + + തരാവ + + + അഖ്തൌ + + + ഓറല്‍ + + + അഖ്തോബ് + + + ഖിസിലോര്‍ഡ + + + അല്‍മതി + + + ക്വാജലെയ്ന്‍ + + + മജൂറോ + + + ഹൌഡ് + + + ഉലാന്‍ബട്ടൂര്‍ + + + ചൊയ്ബല്‍സന്‍ + + + തിയുവാന + + + ഹെര്‍മോസില്ലോ + + + മാസറ്റ്ലാന്‍ + + + ചിവാവു + + + മോണ്ടര്‍‌റേ + + + മെക്സിക്കോ സിറ്റി + + + മെരിഡ + + + കന്‍കൂന്‍ + + + കുചിങ് + + + ചാത്തം + + + മാര്‍ക്യുസാസ് + + + ഗാന്പിയര്‍ + + + എയ്സോര്‍സ് + + + മഡെയ്റ + + + ക്യാലിനിന്‍ഗ്രാഡ് + + + മോസ്കോ + + + വോള്‍ഗോഗ്രാഡ് + + + സമാറ + + + യാകാറ്റെറിന്‍ബര്‍ഗ് + + + ഒംസ്ക് + + + നൊവോസിബിര്‍സ്ക് + + + ക്രാസ്നോയാസ്ക് + + + ഇര്‍കസ്ക് + + + യാകസ്ക് + + + വ്ളാഡിവോസ്റ്റോക് + + + സഖാലിന്‍ + + + മഗഡാന്‍ + + + കാംചട്ക + + + അനാഡിര്‍ + + + ഉസ്ഗൊറോഡ് + + + കീവ് + + + സിംഫെറോപോള്‍ + + + സാപ്പറോസൈ + + + മിഡ്‌വേ + + + ജോണ്‍സ്റ്റണ്‍ + + + വെയ്ക് + + + അഡാക് + + + നൌം + + + ഹോണലൂലു + + + ആങ്കറേജ് + + + യാകുറ്റാറ്റ് + + + ജുനിയു + + + ലോസ് എയ്ഞ്ചലസ് + + + ബൊയ്സി + + + ഫീനിക്സ് + + + ഷിപ്പ്റോക്ക് + + + ഡെന്‍‌വര്‍ + + + ന്യൂ സെയ്‌ലം, നോര്‍ത്ത് ഡക്കോട്ട + + + സെന്‍റര്‍, നോര്‍ത്ത് ഡക്കോട്ട + + + ചിക്കാഗോ + + + മെനോമിനീ + + + വിന്‍സെന്‍സ്, ഇന്‍ഡ്യാന + + + പീറ്റേഴ്സ്ബര്‍ഗ്, ഇന്‍ഡ്യാന + + + റ്റെല്‍ സിറ്റി, ഇന്‍ഡ്യാന + + + നോക്സ്, ഇന്‍ഡ്യാന + + + വിനാമാക്, ഇന്‍ഡ്യാന + + + മരെങ്കോ, ഇന്‍ഡ്യാനാ + + + ഇന്‍ഡ്യാനാപോലീസ് + + + ലൂയിവില്‍ + + + വിവെയ്, ഇന്‍ഡ്യാന + + + മോണ്ടിസെല്ലോ, കെന്‍റക്കി + + + ഡെട്രോയിറ്റ് + + + ന്യൂയോര്‍ക്ക് + + + സമര്‍ക്കന്ദ് + + + + എയ്ക്കര്‍ സമയം + എയ്ക്കര്‍ വേനല്‍ക്കാല സമയം + + + ACT (എയ്ക്കര്‍) + ACST (എയ്ക്കര്‍) + + + + + അഫ്ഗാനിസ്ഥാന്‍ സമയം + + + + + മദ്ധ്യ ആഫ്രിക്കന്‍ സമയം + + + + + കിഴക്കേ ആഫ്രിക്കന്‍ സമയം + + + + + ദക്ഷിണാഫ്രിക്കന്‍ സമയം + ദക്ഷിണാഫ്രിക്കന്‍ സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + + + + + പശ്ചിമാഫ്രിക്കന്‍ സമയം + പശ്ചിമാഫ്രിക്കന്‍ വേനല്‍ക്കാല സമയം + + + + + അക്ത്യുബിന്‍സ്ക് സമയം + അക്ത്യുബിന്‍സ്ക് വേനല്‍ക്കാല സമയം + + + + + അലാസ്ക്ക സമയം + അലാസ്ക സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + അലാസ്ക പകല്‍ സമയം + + + + + അലാസ്ക-ഹവായി സമയം + അലാസ്ക-ഹവായി സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + അലാസ്ക-ഹവായി പകല്‍ സമയം + + + + + അല്‍മതി സമയം + അല്‍മതി വേനല്‍ക്കാല സമയം + + + + + ആമസോണ്‍ സമയം + ആമസോണ്‍ വേനല്‍ക്കാല സമയം + + + + + സെന്‍ട്രല്‍ സമയം + സെന്‍ട്രല്‍ സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + സെന്‍ട്രല്‍ പകല്‍ സമയം + + + + + കിഴക്കന്‍ സമയം + കിഴക്കന്‍ സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + കിഴക്കന്‍ പകല്‍ സമയം + + + + + മൌണ്ടന്‍ സമയം + മൌണ്ടന്‍ സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + മൌണ്ടന്‍ പകല്‍ സമയം + + + + + പസഫിക് സമയം + പസഫിക് സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + പസഫിക് പകല്‍ സമയം + + + + + അനാഡിര്‍ സമയം + അനാഡിര്‍ വേനല്‍ക്കാല സമയം + + + + + അഖ്തൌ സമയം + അഖ്തൌ വേനല്‍ക്കാല സമയം + + + AQTT (അഖ്തൌ) + AQTST (അഖ്തൌ) + + + + + അഖ്തോബ് സമയം + അഖ്തോബ് വേനല്‍ക്കാല സമയം + + + AQTT (അഖ്തോബ്) + AQTST (അഖ്തോബ്) + + + + + അറേബ്യന്‍ സമയം + അറേബ്യന്‍ സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + അറേബ്യന്‍ പകല്‍ സമയം + + + AT (അറേബ്യന്‍) + AST (അറേബ്യന്‍) + ADT (അറേബ്യന്‍) + + + + + അര്‍ജന്‍റീന സമയം + അര്‍ജന്‍റീന വേനല്‍ക്കാല സമയം + + + + + പശ്ചിമ അര്‍ജന്‍റീന സമയം + + + + + അര്‍മേനിയ സമയം + അര്‍മേനിയ വേനല്‍ക്കാല സമയം + + + AMT (അര്‍മേനിയ) + AMST (അര്‍മേനിയ) + + + + + അഷ്ഖാബാദ് സമയം + അഷ്ഖാബാദ് വേനല്‍ക്കാല സമയം + + + + + അറ്റ്ലാന്‍റിക് സമയം + അറ്റ്ലാന്‍റിക് സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + അറ്റ്ലാന്‍റിക് പകല്‍ സമയം + + + + + സെന്‍ട്രല്‍ ഓസ്ട്രേലിയ സമയം + ഓസ്ട്രേലിയന്‍ സെന്‍ട്രല്‍ സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + ഓസ്ട്രേലിയന്‍ സെന്‍ട്രല്‍ പകല്‍ സമയം + + + + + ഓസ്ട്രേലിയന്‍ സെന്‍ട്രല്‍ വെസ്റ്റേണ്‍ സമയം + ഓസ്ട്രേലിയന്‍ സെന്‍ട്രല്‍ വെസ്റ്റേണ്‍ സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + ഓസ്ട്രേലിയന്‍ സെന്‍ട്രല്‍ വെസ്റ്റേണ്‍ പകല്‍ സമയം + + + + + ഈസ്റ്റേണ്‍ ഓസ്ട്രേലിയ സമയം + ഓസ്ട്രേലിയന്‍ ഈസ്റ്റേണ്‍ സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + ഓസ്ട്രേലിയന്‍ ഈസ്റ്റേണ്‍ പകല്‍ സമയം + + + + + വെസ്റ്റേണ്‍ ഓസ്ട്രേലിയ സമയം + ഓസ്ട്രേലിയന്‍ ‍വെസ്റ്റേണ്‍ സ്റ്റാന്‍ഡേര്‍ഡ് + ഓസ്ട്രേലിയന്‍ ‍വെസ്റ്റേണ്‍ പകല്‍ സമയം + + + + + അസര്‍ബയ്ജാന്‍ സമയം + അസര്‍ബയ്ജാന്‍ വേനല്‍ക്കാല സമയം + + + + + എയ്സോര്‍സ് സമയം + എയ്സോര്‍സ് വേനല്‍ക്കാല സമയം + + + + + ബാകു സമയം + ബാകു വേനല്‍ക്കാല സമയം + + + + + ബംഗ്ലാദേശ് സമയം + + + + + ബെറിങ് സമയം + ബെറിങ് സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + ബെറിങ് പകല്‍ സമയം + + + BT (ബെറിങ് ) + BST (ബെറിങ് ) + BDT (ബെറിങ് ) + + + + + ഭൂട്ടാന്‍ സമയം + + + + + ബൊളീവിയ സമയം + + + + + ബോര്‍ണിയോ സമയം + ബോര്‍ണിയോ വേനല്‍ക്കാല സമയം + + + + + ബ്രസീലിയ സമയം + ബ്രസീലിയ വേനല്‍ക്കാല സമയം + + + + + ബ്രൂണെ ഡാറുസ്സലാം സമയം + + + + + കെയ്പ് വെര്‍ഡെ സമയം + കെയ്പ് വെര്‍ഡെ വേനല്‍ക്കാല സമയം + + + + + കമോറോ സമയം + കമോറോ സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + + + + + ചാങ്ബയ് സമയം + + + + + ചാതം സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + ചാതം വേനല്‍ക്കാല സമയം + + + + + ചിലി സമയം + ചിലി വേനല്‍ക്കാല സമയം + + + + + ചൈന സമയം + ചൈനാ സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + ചൈന പകല്‍ സമയം + + + CT (ചൈന) + CST (ചൈന) + CDT (ചൈന) + + + + + ചോയ്ബല്‍സന്‍ സമയം + ചോയ്ബല്‍സന്‍ വേനല്‍ക്കാല സമയം + + + + + ക്രിസ്മസ് ദ്വീപ് സമയം + + + + + കൊക്കോസ് ദ്വീപുകള്‍ സമയം + + + + + കൊളംബിയ സമയം + കൊളംബിയ വേനല്‍ക്കാല സമയം + + + + + കുക്ക് ദ്വീപുകള്‍ സമയം + കുക്ക് ദ്വീപുകള്‍ അര്‍ദ്ധ വേനല്‍ക്കാല സമയം + + + + + ക്യൂബ സമയം + ക്യൂബ സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + ക്യൂബ പകല്‍ സമയം + + + CST (ക്യൂബ ) + CST (ക്യൂബ) + CDT (ക്യൂബ ) + + + + + ഡാക്ക സമയം + + + + + ഡെയ്‌വിസ് സമയം + + + + + ഡ്യൂമണ്ട് ഡി യൂര്‍വില്‍ സമയം + + + + + ദുഷാന്‍ബെ സമയം + ദുഷാന്‍ബെ വേനല്‍ക്കാല സമയം + + + + + ഡച്ച് ഗയാന സമയം + + + + + കിഴക്കന്‍ തിമൂര്‍ സമയം + + + + + ഈസ്റ്റര്‍ ദ്വീപ് സമയം + ഈസ്റ്റര്‍ ദ്വീപ് വേനല്‍ക്കാല സമയം + + + + + ഇക്വഡോര്‍ സമയം + + + + + സെന്‍ട്രല്‍ യൂറോപ്യന്‍ സമയം + സെന്‍ട്രല്‍ യൂറോപ്യന്‍ വേനല്‍ക്കാല സമയം + + + + + കിഴക്കന്‍ യൂറോപ്യന്‍ സമയം + കിഴക്കന്‍ യൂറോപ്യന്‍ വേനല്‍ക്കാല സമയം + + + + + ഫാക്‌ലാന്‍ഡ് ദ്വീപുകള്‍ സമയം + ഫാക്‌ലാന്‍ഡ് ദ്വീപുകള്‍ വേനല്‍ക്കാല സമയം + + + + + ഫിജി സമയം + ഫിജി വേനല്‍ക്കാല സമയം + + + + + ഫ്രെഞ്ച് ഗയാന സമയം + + + + + ഫ്രെഞ്ച് സതേണ്‍ ആന്‍ഡ് അന്‍റാര്‍ട്ടിക് സമയം + + + + + ഫ്രൂന്‍സ് സമയം + ഫ്രൂന്‍സ് വേനല്‍ക്കാല സമയം + + + + + ഗാലപ്പാഗോസ് സമയം + + + + + ഗാന്പിയര്‍ സമയം + + + + + ജോര്‍ജ്ജിയ സമയം + ജോര്‍ജ്ജിയ വേനല്‍ക്കാല സമയം + + + + + ഗില്‍ബര്‍ട്ട് ദ്വീപുകള്‍ സമയം + + + + + സെന്‍ട്രല്‍ ഗ്രീന്‍ലാന്‍ഡ് സമയം + സെന്‍ട്രല്‍ ഗ്രീന്‍ലാന്‍ഡ് വേനല്‍ക്കാല സമയം + + + + + കിഴക്കന്‍ ഗ്രീന്‍ലാന്‍ഡ് സമയം + കിഴക്കന്‍ ഗ്രീന്‍ലാന്‍ഡ് വേനല്‍ക്കാല സമയം + + + + + പശ്ചിമ ഗ്രീന്‍ലാന്‍ഡ് സമയം + പശ്ചിമ ഗ്രീന്‍ലാന്‍ഡ് വേനല്‍ക്കാല സമയം + + + + + ഗ്വാം സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + + + GST (ഗ്വാം) + + + + + ഗള്‍ഫ് സമയം + ഗള്‍ഫ് സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + + + + + ഗയാന സമയം + + + + + ഹവായി-അലൂഷ്യന്‍ സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + + + + + ഹോങ് കോങ് സമയം + ഹോങ് കോങ് വേനല്‍ക്കാല സമയം + + + + + ഹൌഡ് സമയം + ഹൌഡ് വേനല്‍ക്കാല സമയം + + + + + ഇന്‍‌ഡ്യ സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + + + + + ഇന്‍ഡ്യന്‍ മഹാസമുദ്ര സമയം + + + + + ഇന്‍ഡോചൈന സമയം + + + + + സെന്‍ട്രല്‍ ഇന്‍ഡോനേഷ്യ സമയം + + + + + കിഴക്കന്‍ ഇന്‍ഡോനേഷ്യ സമയം + + + + + പശ്ചിമ ഇന്‍ഡോനേഷ്യ സമയം + + + + + ഇറാന്‍ സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + ഇറാന്‍ പകല്‍ സമയം + + + + + ഇര്‍കസ്ക് സമയം + ഇര്‍കസ്ക് വേനല്‍ക്കാല സമയം + + + + + ഇസ്രായേല്‍ സമയം + ഇസ്രായേല്‍ സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + ഇസ്രായേല്‍ പകല്‍ സമയം + + + IST (ഇസ്രായേല്‍) + + + + + ജപ്പാന്‍ സമയം + ജപ്പാന്‍ സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + ജപ്പാന്‍ പകല്‍ സമയം + + + + + പെട്രോപാവ്‌ലോസ്ക് കംചാസ്കി സമയം + പെട്രോപാവ്‌ലോസ്ക് കംചാസ്കി വേനല്‍ക്കാല സമയം + + + + + കറാച്ചി സമയം + + + + + കാഷ്ഗര്‍ സമയം + + + + + കിഴക്കന്‍ കസാഖ്സ്ഥാന്‍ സമയം + കിഴക്കന്‍ കസാഖ്സ്ഥാന്‍ സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + + + + + പടിഞ്ഞാറന്‍ കസാഖ്സ്ഥാന്‍ സമയം + പടിഞ്ഞാറന്‍ കസാഖ്സ്ഥാന്‍ സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + + + + + കിസിലോര്‍ഡ സമയം + കിസിലോര്‍ഡ വേ‡നല്‍ക്കാല സമയം + + + + + കൊറിയന്‍ സമയം + കൊറിയന്‍ സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + കൊറിയന്‍ പകല്‍ സമയം + + + + + കൊസ്റേ സമയം + + + + + ക്രാസ്നോയാഴ്സ്ക് സമയം + ക്രാസ്നോയാഴ്സ്ക് വേനല്‍ക്കാല സമയം + + + + + കുയ്ബൈഷെവ് സമയം + കുയ്ബൈഷെവ് വേനല്‍ക്കാല സമയം + + + + + ക്വാജലെയ്ന്‍ സമയം + + + + + കിര്‍ഗിസ്ഥാന്‍ സമയം + + + + + ലങ്ക സമയം + + + + + ലൈന്‍ ദ്വീപുകള്‍ സമയം + + + + + ലോങ്-ഷു സമയം + + + + + ലോര്‍ഡ് ഹോവ് സമയം + ലോര്‍ഡ് ഹോവ് സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + ലോര്‍ഡ് ഹോവ് പകല്‍ സമയം + + + + + മകൌ സമയം + മകൌ വേനല്‍ക്കാല സമയം + + + + + മഗാഡന്‍ സമയം + മഗാഡന്‍ വേനല്‍ക്കാല സമയം + + + + + മലയ സമയം + + + + + മലേഷ്യ സമയം + + + + + മാലിദ്വീപ് സമയം + + + + + മാര്‍ക്യുസാസ് സമയം + + + + + മാര്‍ഷല്‍ ദ്വീപുകള്‍ സമയം + + + + + മൌറിഷ്യസ് സമയം + + + + + മാവ്സണ്‍ സമയം + + + + + യുലാന്‍ ബാറ്റര്‍ സമയം + യുലാന്‍ ബാറ്റര്‍ വേനല്‍ക്കാല സമയം + + + + + മോസ്കോ സമയം + മോസ്കോ സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + മോസ്കോ വേനല്‍ക്കാല സമയം + + + + + മ്യാന്‍മാര്‍ സമയം + + + + + നൌറു സമയം + + + + + നേപ്പാള്‍ സമയം + + + + + ന്യൂ കാലിഡോണിയ സമയം + ന്യൂ കാലിഡോണിയ വേനല്‍ക്കാല സമയം + + + + + ന്യൂസീലന്‍ഡ് സമയം + ന്യൂസീലന്‍ഡ് സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + ന്യൂസീലന്‍ഡ് പകല്‍ സമയം + + + + + ന്യൂഫൌണ്ട്‌ലാന്‍ഡ് സമയം + ന്യൂഫൌണ്ട്‌ലാന്‍ഡ് സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + ന്യൂഫൌണ്ട്‌ലാന്‍ഡ് പകല്‍‌ സമയം + + + + + നിയു സമയം + + + + + നോര്‍ഫോക് ദ്വീപുകള്‍ സമയം + + + + + ഫെര്‍ണാണ്ടോ ഡി നൊറോന സമയം + ഫെര്‍ണാണ്ടോ ഡി നൊറോന വേനല്‍ക്കാല സമയം + + + + + നോര്‍ത്ത് മറിയാനാ ദ്വീപുകള്‍ സമയം + + + + + നോവോസിബിര്‍സ്ക് സമയം + നോവോസിബിര്‍സ്ക് വേനല്‍ക്കാല സമയം + + + + + ഓംസ്ക് സമയം + ഓംസ്ക് വേനല്‍ക്കാല സമയം + + + + + പാകിസ്ഥാന്‍ സമയം + പാകിസ്ഥാന്‍ വേനല്‍ക്കാല സമയം + + + + + പലൌ സമയം + + + + + പാപ്യു ന്യൂ ഗിനിയ സമയം + + + + + പരാഗ്വേ സമയം + പരാഗ്വേ വേനല്‍ക്കാല സമയം + + + + + പെറു സമയം + പെറു വേനല്‍ക്കാല സമയം + + + + + ഫിലിപ്പീന്‍ സമയം + ഫിലിപ്പീന്‍ വേനല്‍ക്കാല സമയം + + + + + ഫീനിക്സ് ദ്വീപുകള്‍ സമയം + + + + + പിയറി ആന്‍ഡ് മിക്വിലോണ്‍ സമയം + പിയറി ആന്‍ഡ് മിക്വിലോണ്‍ സ്റ്റാന്‍ഡേര്‍ഡ്സമയം + പിയറി ആന്‍ഡ് മിക്വിലോണ്‍ പകല്‍ സമയം + + + + + പിറ്റ്കെയ്ന്‍ സമയം + + + + + പൊനാപ് സമയം + + + + + ഖിസിലോര്‍ഡ സമയം + ഖിസിലോര്‍ഡ വേനല്‍ക്കാല സമയം + + + + + റീയൂണിയന്‍ സമയം + + + + + റൊതീറ സമയം + + + + + സഖാലിന്‍ സമയം + സഖാലിന്‍ വേനല്‍ക്കാല സമയം + + + + + സമാറ സമയം + സമാറ വേനല്‍ക്കാല സമയം + + + + + സമര്‍കന്ദ് സമയം + സമര്‍കന്ദ് വേനല്‍ക്കാല സമയം + + + SAMT (സമര്‍കന്ദ് ) + SAMST (സമര്‍കന്ദ് ) + + + + + സമോവാ സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + + + + + സെയ്ഷെല്‍സ് സമയം + + + + + ഷെവ്ചെങ്കോ സമയം + ഷെവ്ചെങ്കോ വേനല്‍ക്കാല സമയം + + + + + സിങ്കപ്പൂര്‍ സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + + + + + സോളമന്‍ ദ്വീപുകള്‍ സമയം + + + + + ദക്ഷിണ ജോര്‍ജ്ജിയ സമയം + + + GST (ദക്ഷിണ ജോര്‍ജ്ജിയ) + + + + + സൂറിനാം സമയം + + + + + സ്‌വേഡ്‌ലോവ്സ്ക് സമയം + സ്‌വേഡ്‌ലോവ്സ്ക് വേനല്‍ക്കാല സമയം + + + + + സ്യോവ സമയം + + + + + തഹിതി സമയം + + + + + തജികിസ്ഥാന്‍ സമയം + + + + + താഷ്കന്ദ് സമയം + താഷ്കന്ദ് വേനല്‍ക്കാല സമയം + + + + + തിബിലീസി സമയം + തിബിലീസി വേനല്‍ക്കാല സമയം + + + + + റ്റോക്കിലൌ സമയം + + + + + റ്റോംഗാ സമയം + റ്റോംഗാ വേനല്‍ക്കാല സമയം + + + + + ട്രക്ക് സമയം + + + + + തുര്‍ക്കി സമയം + തുര്‍ക്കി വേനല്‍ക്കാല സമയം + + + + + തുര്‍ക്ക്മെനിസ്ഥാന്‍ സമയം + തുര്‍ക്ക്മെനിസ്ഥാന്‍ വേനല്‍ക്കാല സമയം + + + + + തുവാലു സമയം + + + + + യുറാല്‍സ്ക് സമയം + യുറാല്‍സ്ക് വേനല്‍ക്കാല സമയം + + + + + ഉറുഗ്വെ സമയം + ഉറുഗ്വെ വേനല്‍ക്കാല സമയം + + + + + ഉറുംഖി വേനല്‍‌ക്കാല സമയം + + + + + ഉസ്ബക്കിസ്ഥാന്‍ സമയം + ഉസ്ബക്കിസ്ഥാന്‍ വേനല്‍‌ക്കാല സമയം + + + + + വന്വാതു സമയം + വന്വാതു വേനല്‍ക്കാല സമയം + + + + + വെനസ്വേല സമയം + + + + + വ്‌ളാഡിവോസ്റ്റോക് സമയം + വ്‌ളാഡിവോസ്റ്റോക് വേനല്‍ക്കാല സമയം + + + + + വോള്‍ഗോഗ്രാഡ് സമയം + വോള്‍ഗോഗ്രാഡ് വേനല്‍ക്കാല സമയം + + + + + വോസ്റ്റോക് സമയം + + + + + വെയ്ക് ദ്വീപ് സമയം + + + + + വാലിസ് ആന്‍ഡ് ഫ്യൂചുന സമയം + + + + + യാകസ്ക് സമയം + യാകസ്ക് വേനല്‍ക്കാല സമയം + + + + + യെക്കാറ്ററിന്‍ബര്‍ഗ് സമയം + യെക്കാറ്ററിന്‍ബര്‍ഗ് വേനല്‍ക്കാല സമയം + + + + + യെരെവാന്‍ സമയം + യെരെവാന്‍ വേനല്‍ക്കാല സമയം + + + + + യൂക്കോണ്‍ സമയം + യൂക്കോണ്‍ സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + യൂക്കണ്‍ പകല്‍ സമയം + + + + + + + . + , + ; + % + 0 + + + - + E + + + സംഖ്യയല്ല + + + + + #,##,##0.### + + + + + + + #E0 + + + + + + + #,##,##0% + + + + + + + #,##,##0.00¤ + + + {0} {1} + + + + അന്‍ഡോറന്‍ പെസെയ്റ്റ + അന്‍ഡോറന്‍ പെസെയ്റ്റ + അന്‍ഡോറന്‍ പെസെയ്റ്റാസ് + + + യു.എ.ഇ. ദിര്‍ഹം + യു.എ.ഇ. ദിര്‍ഹം + യു.എ.ഇ. ദിര്‍ഹംസ് + + + അഫ്ഘാനി (1927-2002) + അഫ്ഘാനി (AFA) + അഫ്ഘാനിസ് (AFA) + + + അഫ്ഘാനി + അഫ്ഘാനി + അഫ്ഘാനിസ് + അഫ് + + + അല്‍ബേനിയന്‍ ലെക് + അല്‍ബേനിയന്‍ ലെക് + അല്‍ബേനിയന്‍ ലെക്സ് + ലെക് + + + അര്‍മേനിയന്‍ ഡ്രാം + അര്‍മേനിയന്‍ ഡ്രാം + അര്‍മേനിയന്‍ ഡ്രാംസ് + ഡ്രാം + + + നെതര്‍ലന്‍ഡ്സ് ആന്‍റിലന്‍ ഗില്‍ഡര്‍ + നെതര്‍ലന്‍ഡ്സ് ആന്‍ഡിലന്‍ ഗില്‍ഡര്‍ + നെതര്‍ലന്‍ഡ്സ് ആന്‍ഡിലന്‍ ഗില്‍ഡേഴ്സ് + NA f. + + + അംഗോളന്‍ ‍ക്വാന്‍സ + അംഗോളന്‍ ക്വാന്‍സ + അംഗോളന്‍ ക്വാന്‍സാസ് + + + അംഗോളന്‍ ‍ക്വാന്‍സ (1977-1990) + അംഗോളന്‍ ക്വാന്‍സാ (AOK) + അംഗോളന്‍ ക്വാന്‍സാസ് (AOK + + + അംഗോളന്‍ ‍ന്യൂ ക്വാന്‍സ (1990-2000) + അംഗോളന്‍ ന്യൂ ക്വാന്‍സാ (AON) + അംഗോളന്‍ ന്യൂ ക്വാന്‍സാസ് (AON) + + + അംഗോളന്‍ ‍ക്വാന്‍സ റിയാജസ്റ്റാഡോ (1995-1999) + അംഗോളന്‍ ക്വാന്‍സ റീഅഡ്ജസ്റ്റാഡോ (AOR) + അംഗോളന്‍ ക്വാന്‍സാസ് റീഅഡ്ജസ്റ്റാഡോ (AOR) + + + അര്‍ജന്‍റീന്‍ ഓസ്ട്രല്‍ + അര്‍ജന്‍റീന്‍ ഓസ്ട്രല്‍ + അര്‍ജന്‍റീന്‍ ഓസ്ട്രല്‍സ് + + + അര്‍ജന്‍റീന്‍ പെയ്സോ (1983-1985) + അര്‍ജന്‍റീന്‍ പെയ്സോ (ARP) + അര്‍ജന്‍റീന്‍ പെയ്സോസ് (ARP) + + + അര്‍ജന്‍റീന്‍ പെയ്സോ + അര്‍ജന്‍റീന്‍ പെയ്സോ + അര്‍ജന്‍റീന്‍ പെയ്സോസ് + അര്‍ജ്$ + + + ഓസ്ട്രേലിയന്‍ ഷില്ലിംഗ് + ഓസ്ട്രിയന്‍ ഷില്ലിംഗ് + ഓസ്ട്രിയന്‍ ഷില്ലിംഗ്സ് + + + ആസ്ട്രേലിയന്‍ ഡോളര്‍ + ഓസ്ട്രേലിയന്‍ ഡോളര്‍ + ഓസ്ട്രേലിയന്‍ ഡോളേഴ്സ് + $A + + + അറൂബന്‍ ഗില്‍ഡര്‍ + അറൂബന്‍ ഗില്‍ഡര്‍ + അറൂബന്‍ ഗില്‍ഡേഴ്സ് + + + അസര്‍ബയ്ജാനിയന്‍ മനത് (1993-2006) + അസര്‍ബയ്ജാന്‍ മനത്‌ (AZM) + അസര്‍ബയ്ജാന്‍ മനത്‌സ് (AZM) + + + അസര്‍ബയ്ജാനിയന്‍ മനത് + അസര്‍ബയ്ജാന്‍ മനത് + അസര്‍ബയ്ജാന്‍ മനത്‌സ് + + + ബോസ്നിയ-ഹെര്‍സഗോവിന ദിനാര്‍ + ബോസ്നിയ ഹെര്‍സഗോവിന ദിനാര്‍ + ബോസ്നിയ ഹെര്‍സഗോവിന ദിനാര്‍സ് + + + ബോസ്നിയ-ഹെര്‍സഗോവിന കണ്‍വേര്‍ട്ടിബിള്‍ മാര്‍ക്ക് + ബോസ്നിയ ഹെര്‍സഗോവിന കണ്‍വേര്‍ട്ടിബിള്‍ മാര്‍ക്ക് + ബോസ്നിയ ഹെര്‍സഗോവിന കണ്‍വേര്‍ട്ടിബിള്‍ മാര്‍ക്സ് + KM + + + ബാര്‍ബഡോസ് ഡോളര്‍ + ബാര്‍ബഡോസ് ഡോളര്‍ + ബാര്‍ബഡോസ് ഡോളേഴ്സ് + BDS$ + + + ബംഗ്ലാദേശി ടാക്ക + ബംഗ്ലാദേശ് താക്കാ + ബംഗ്ലാദേശ് താക്കാസ് + Tk + + + ബെല്‍ജിയന്‍ ഫ്രാങ്ക് (കൈമാറ്റം ചെയ്യാവുന്നത്) + ബെല്‍ജിയന്‍ ഫ്രാങ്ക് (കൈമാറ്റം ചെയ്യാവുന്നത്) + ബെല്‍ജിയന്‍ ഫ്രാങ്ക്സ് (കൈമാറ്റം ചെയ്യാവുന്നത്) + + + ബെല്‍ജിയന്‍ ഫ്രാങ്ക് + ബെല്‍ജിയന്‍ ഫ്രാങ്ക് + ബെല്‍ജിയന്‍ ഫ്രാങ്ക്സ് + BF + + + ബല്‍ജിയന്‍ ഫ്രാങ്ക് + ബെല്‍ജിയന്‍ ഫ്രാങ്ക് (ഫിനാന്‍ഷ്യല്‍) + ബെല്‍ജിയന്‍ ഫ്രാങ്ക്സ്(ഫിനാന്‍ഷ്യല്‍) + + + ബള്‍ഗേറിയന്‍ ഹാര്‍ഡ് ലെവ് + ബള്‍ഗേറിയന്‍ ഹാര്‍ഡ് ലെവ് + ബള്‍ഗേറിയന്‍ ഹാര്‍ഡ് ലെവ്സ് + ലെവ് + + + ബള്‍ഗേറിയന്‍ ന്യൂലവ് + ബള്‍ഗേറിയന്‍ ന്യൂ ലെവ് + ബള്‍ഗേറിയന്‍ ന്യൂ ലെവ്സ് + + + ബഹറിന്‍ ദിനാര്‍ + ബഹ്റൈന്‍ ദിനാര്‍ + ബഹ്റൈന്‍ ദിനാര്‍സ് + BD + + + ബുറുണ്ടി ഫ്രാങ്ക് + ബുറുണ്ടി ഫ്രാങ്ക് + ബുറുണ്ടി ഫ്രാങ്ക്സ് + Fbu + + + ബെര്‍മുഡന്‍ ഡോളര്‍ + ബെര്‍മുഡന്‍ ഡോളര്‍ + ബെര്‍മുഡന്‍ ഡോളേഴ്സ് + ബെര്‍$ + + + ബ്രൂണെ ഡോളര്‍ + ബ്രൂണെ ഡോളര്‍ + ബ്രൂണെ ഡോളറുകള്‍ + + + ബൊളീവിയാനോ + ബൊളീവിയാനോ + ബൊളീവിയാനോസ് + Bs + + + ബൊളീവിയന്‍ പെയ്സോ + ബൊളീവിയന്‍ പെയ്സോ + ബൊളീവിയന്‍ പെയ്സോസ് + + + ബൊളീവിയന്‍ എംവിഡോള്‍ + ബൊളീവിയന്‍ എംവിഡോ + ബൊളീവിയന്‍ എംവിഡോസ് + + + ബ്രസീലിയന്‍ ക്രുസെയ്റോ നോവോ (1967-1986) + ബ്രസീലിയന്‍ ക്രുസെയ്റോ നോവോ (BRB) + ബ്രസീലിയന്‍ ക്രുസെയ്റോസ് നോവോ (BRB) + + + ബ്രസീലിയന്‍ ക്രുസാഡോ + ബ്രസീലിയന്‍ ക്രുസാഡോ + ബ്രസീലിയന്‍ ക്രുസാഡോസ് + + + ബ്രസീലിയന്‍ ക്രുസെയ്റോ (1990-1993) + ബ്രസീലിയന്‍ ക്രുസെയ്റോ (BRE) + ബ്രസീലിയന്‍ ക്രുസെയ്റോസ് (BRE) + + + ബ്രസീലിയന്‍ റിയാല്‍ + ബ്രസീലിയന്‍ റിയാല്‍ + ബ്രസീലിയന്‍ റിയാല്‍സ് + + + ബ്രസീലിയന്‍ ക്രുസാഡോ നോവോ + ബ്രസീലിയന്‍ ക്രുസാഡോ നോവോ + ബ്രസീലിയന്‍ ക്രുസാഡോ നോവോസ് + + + ബ്രസീലിയന്‍ ക്രുസെയ്റോ + ബ്രസീലിയന്‍ ക്രുസെയ്റോ + ബ്രസീലിയന്‍ ക്രുസെയ്റോസ് + + + ബഹാമിയന്‍ ഡോളര്‍ + ബഹാമിയന്‍ ഡോളര്‍ + ബഹാമിയന്‍ ഡോളേഴ്സ് + + + ഭൂട്ടാന്‍ എന്‍ഗള്‍ട്രം + ഭൂട്ടാന്‍ എന്‍ഗള്‍ട്രം + ഭൂട്ടാന്‍ എന്‍ഗള്‍ട്രംസ് + Nu + + + ബര്‍മീസ് ചാറ്റ് + ബര്‍മീസ് ചാറ്റ് + ബര്‍മീസ് ചാറ്റ്സ് + + + ബോട്സ്വാനന്‍ പ്യൂല + ബോട്സ്വാനന്‍ പ്യൂല + ബോട്സ്വാനന്‍ പ്യൂലാസ് + + + ബെലാറഷ്യന്‍ ന്യൂ റൂബിള്‍ (1994-1999) + ബെലാറഷ്യന്‍ ന്യൂ റൂബിള്‍ (BYB) + ബെലാറഷ്യന്‍ ന്യൂ റൂബിള്‍സ് (BYB) + + + ബെലാറഷ്യന്‍ റൂബിള്‍ + ബെലാറഷ്യന്‍ റൂബിള്‍ + ബെലാറഷ്യന്‍ റൂബിള്‍സ് + Rbl + + + ബെലീസ് ഡോളര്‍ + ബെലീസ് ഡോളര്‍ + ബെലീസ് ഡോളേഴ്സ് + BZ$ + + + കനേഡിയന്‍ ഡോളര്‍ + കനേഡിയന്‍ ഡോളര്‍ + കനേഡിയന്‍ ഡോളേഴ്സ് + Can$ + + + കോങ്കളീസ് ഫ്രാങ്ക് കോങ്കൊളൈസ് + കോങ്കളീസ് ഫ്രാങ്ക് കോങ്കൊളൈസ് + കോങ്കളീസ് ഫ്രാങ്ക്സ് കോങ്കൊളൈസ് + + + WIR യൂറോ + WIR യൂറോ + WIR യൂറോസ് + + + സ്വിസ് ഫ്രാങ്ക് + സ്വിസ് ഫ്രാങ്ക് + സ്വിസ് ഫ്രാങ്ക്സ് + SwF + + + WIR ഫ്രാങ്ക് + WIR ഫ്രാങ്ക് + WIR ഫ്രാങ്ക്സ് + + + ചിലിയന്‍ യൂണിഡാഡ്സ് ഡി ഫോമെന്‍റോ + ചിലിയന്‍ യൂണിഡാഡ്സ് ഡി ഫോമെന്‍റോ + ചിലിയന്‍ യൂണിഡാഡ്സ് ഡി ഫോമെന്‍റോസ് + + + ചിലിയന്‍ പെസോ + ചിലിയന്‍ പെസോ + ചിലിയന്‍ പെസോസ് + Ch$ + + + ചൈനീസ് യുവാന്‍ + ചൈനീസ് യുവാന്‍ + ചൈനീസ് യുവാന്‍ + Y + + + കൊളംബിയന്‍ പെസോ + കൊളംബിയന്‍ പെസോ + കൊളംബിയന്‍ പെസോസ് + Col$ + + + യൂണിഡാഡ് ഡി വാലര്‍ റിയല്‍ + യൂണിഡാഡ് ഡി വാലര്‍ റിയല്‍ + യൂണിഡാഡ് ഡി വാലര്‍ റിയല്‍സ് + + + കോസ്റ്റാ റിക്കന്‍ കോളന്‍ + കോസ്റ്റാ റിക്കന്‍ കോളന്‍ + കോസ്റ്റാ റിക്കന്‍ കോളന്‍സ് + C + + + പ്രാചീന സെര്‍ബിയന്‍ ദിനാര്‍ + പ്രാചീന സെര്‍ബിയന്‍ ദിനാര്‍ + പ്രാചീന സെര്‍ബിയന്‍ ദിനാര്‍സ് + + + ചെക്കോസ്ലൊവാക്ക് ഹാര്‍ഡ് കൊരൂന + ചെക്കോസ്ലൊവാക്ക് ഹാര്‍ഡ് കൊരൂന + ചെക്കോസ്ലൊവാക്ക് ഹാര്‍ഡ് കൊരൂനാസ് + + + ക്യൂബന്‍ പെസോ + ക്യൂബന്‍ പെസോ + ക്യൂബന്‍ പെസോസ് + + + കെയ്പ് വെര്‍ഡെ എസ്ക്യുഡോ + കെയ്പ് വെര്‍ഡെ എസ്ക്യുഡോ + കെയ്പ് വെര്‍ഡെ എസ്ക്യുഡോസ് + CVEsc + + + സൈപ്രസ് പൌണ്ട് + സൈപ്രസ് പൌണ്ട് + സൈപ്രസ് പൌണ്ട്സ് + £C + + + ചെക്ക് റിപ്പബ്ലിക് കൊരൂന + ചെക്ക് റിപ്പബ്ലിക് കൊരൂന + ചെക്ക് റിപ്പബ്ലിക് കൊരൂനാസ് + + + കിഴക്കന്‍ ജര്‍മന്‍ ഓസ്റ്റ്മാര്‍ക്ക് + കിഴക്കന്‍ ജര്‍മന്‍ ഓസ്റ്റ്മാര്‍ക്ക് + കിഴക്കന്‍ ജര്‍മന്‍ ഓസ്റ്റ്മാര്‍ക്ക്സ് + + + ജര്‍മന്‍ മാര്‍ക്ക് + ജര്‍മന്‍ മാര്‍ക്ക് + ജര്‍മന്‍ മാര്‍ക്ക്സ് + + + ജീബോട്ടി ഫ്രാങ്ക് + ജീബോട്ടി ഫ്രാങ്ക് + ജീബോട്ടി ഫ്രാങ്ക്സ് + DF + + + ഡാനിഷ് ക്രോണ്‍ + ഡാനിഷ് ക്രോണ്‍സ് + DKr + + + ഡൊമിനിക്കന്‍ പെയ്സോ + ഡൊമിനിക്കന്‍ പെയ്സോ + ഡൊമിനിക്കന്‍ പെയ്സോസ് + RD$ + + + അള്‍ജീരിയന്‍ ദിനാര്‍ + അള്‍ജീരിയന്‍ ദിനാര്‍ + അള്‍ജീരിയന്‍ ദിനാര്‍സ് + DA + + + ഇക്വഡോര്‍ സൂക്രേ + ഇക്വഡോര്‍ സൂക്രേ + ഇക്വഡോര്‍ സൂക്രേസ് + + + ഇക്വഡോര്‍ യൂണിഡാഡ് വാലര്‍ കോണ്‍സ്റ്റന്‍റെ (UVC) + ഇക്വഡോര്‍ യൂണിഡാഡ് ഡി വാലര്‍ കോണ്‍സ്റ്റന്‍റെ (UVC) + ഇക്വഡോര്‍ യൂണിഡാഡ്സ് ഡി വാലര്‍ കോണ്‍സ്റ്റന്‍റെ (UVC) + + + എസ്റ്റൌനിയന്‍ ക്രൂണ്‍ + എസ്റ്റൌനിയന്‍ ക്രൂണ്‍ + എസ്റ്റൌനിയന്‍ ക്രൂണ്‍സ് + + + ഈജിപ്ഷ്യന്‍ പൌണ്ട് + ഈജിപ്ഷ്യന്‍ പൌണ്ട് + ഈജിപ്ഷ്യന്‍ പൌണ്ട്സ് + + + എക്വീലെ + എക്വീലെ + എക്വീലെസ് + + + എറിത്രിയന്‍ നക്ഫ + എറിത്രിയന്‍ നക്ഫ + എറിത്രിയന്‍ നക്ഫാസ് + + + സ്പാനിഷ് പസെയ്റ്റ (A അക്കൌണ്ട്) + സ്പാനിഷ് പസെയ്റ്റ (A അക്കൌണ്ട്) + സ്പാനിഷ് പസെയ്റ്റാസ് (A അക്കൌണ്ട്) + + + സ്പാനിഷ് പസെയ്റ്റ (കൈമാറ്റം ചെയ്യാവുന്ന അക്കൌണ്ട്) + സ്പാനിഷ് പസെയ്റ്റ (കൈമാറ്റം ചെയ്യാവുന്ന അക്കൌണ്ട്) + സ്പാനിഷ് പസെയ്റ്റാസ് (കൈമാറ±±±്റം ചെയ്യാവുന്ന അക്കൌണ്ട്) + + + സ്പാനിഷ് പസെയ്റ്റ + സ്പാനിഷ് പസെയ്റ്റ + സ്പാനിഷ് പസെയ്റ്റാസ് + + + + എത്യോപ്പിയന്‍ ബിര്‍ + എത്യോപ്പിയന്‍ ബിര്‍ + എത്യോപ്പിയന്‍ ബിര്‍സ് + Br + + + യൂറോ + യൂറോ + യൂറോസ് + + + ഫിന്നിഷ് മാര്‍ക്ക + ഫിന്നിഷ് മാര്‍ക്ക + ഫിന്നിഷ് മാര്‍ക്കാസ് + + + ഫിജി ഡോളര്‍ + ഫിജി ഡോളര്‍ + ഫിജി ഡോളേഴ്സ് + F$ + + + ഫോക്‌ലാന്‍ഡ് ദ്വീപുകളുടെ പൌണ്ട് + ഫോക്‌ലാന്‍ഡ് ദ്വീപുകളുടെ പൌണ്ട് + ഫോക്‌ലാന്‍ഡ് ദ്വീപുകളുടെ പൌണ്ട്സ് + + + ഫ്രാങ്ക് + ഫ്രെഞ്ച് ഫ്രാങ്ക് + ഫ്രെഞ്ച് ഫ്രാങ്ക്സ് + + + ബ്രിട്ടീഷ് പൌണ്ട് സ്റ്റെര്‍ലിംങ് + ബ്രിട്ടീഷ് പൌണ്ട് സ്റ്റെര്‍ലിംഗ് + ബ്രിട്ടീഷ് പൌണ്ട് സ്റ്റെര്‍ലിംഗ്സ് + £ + + + ജോര്‍‍ജ്ജിയന്‍ ക്യൂപോണ്‍ ലാരിറ്റ് + ജോര്‍‍ജ്ജിയന്‍ ക്യൂപോണ്‍ ലാരിറ്റ് + ജോര്‍‍ജ്ജിയന്‍ ക്യൂപോണ്‍ ലാരിറ്റ്സ് + + + ജോര്‍‍ജ്ജിയന്‍ ലാരി + ജോര്‍‍ജ്ജിയന്‍ ലാരി + ജോര്‍‍ജ്ജിയന്‍ ലാരിസ് + ലാരി + + + ഘാന കെഡി (1979-2007) + ഘാന കെഡി (GHC) + ഘാന കെഡിസ് (GHC) + + + ഘാന കെഡി + ഘാന കെഡി + ഘാന കെഡിസ് + GH¢ + + + ഗിബ്രാല്‍ട്ടര്‍ പൌണ്ട് + ഗിബ്രാല്‍ട്ടര്‍ പൌണ്ട് + ഗിബ്രാല്‍ട്ടര്‍ പൌണ്ട്സ് + + + ഗാന്പിയ ദലാസി + ഗാന്പിയ ദലാസി + ഗാന്പിയ ദലാസിസ് + + + ഗിനിയ ഫ്രാങ്ക് + ഗിനിയ ഫ്രാങ്ക് + ഗിനിയ ഫ്രാങ്ക്സ് + GF + + + ഗിനിയ സൈലി + ഗിനിയ സൈലി + ഗിനിയ സൈലിസ് + + + ഇക്വിറ്റോറിയല്‍ ഗിനിയ എക്വീലെ ഗിനിയാന + ഇക്വിറ്റോറിയല്‍ ഗിനി എക്വീലെ + ഇക്വിറ്റോറിയല്‍ ഗിനി എക്വീലെ + + + ഗ്രീക്ക് ഡ്രാക്ക്മ + ഗ്രീക്ക് ഡ്രാക്ക്മ + ഗ്രീക്ക് ഡ്രാക്ക്മാസ് + + + ഗ്വാട്ടിമാല ക്വെറ്റ്സല്‍ + ഗ്വാട്ടിമാല ക്വെറ്റ്സല്‍ + ഗ്വാട്ടിമാല ക്വെറ്റ്സല്‍സ് + Q + + + പോര്‍ച്ചുഗീസ് ഗിനി എസ്ക്യൂഡോ + പോര്‍ച്ചുഗീസ് ഗിനി എസ്ക്യൂഡോ + പോര്‍ച്ചുഗീസ് ഗിനി എസ്ക്യൂഡോസ് + + + ഗിനിയ-ബിസാവു പെയ്സോ + ഗിനി-ബിസാവു പെയ്സോ + ഗിനി-ബിസാവു പെയ്സോസ് + + + ഗയാന ഡോളര്‍ + ഗയാന ഡോളര്‍ + ഗയാന ഡോളേഴ്സ് + G$ + + + ഹോങ് കോങ് ഡോളര്‍ + ഹോങ് കോങ് ഡോളര്‍ + ഹോങ് കോങ് ഡോളേഴ്സ് + HK$ + + + ഹോന്‍ഡ്യുറാസ് ലെംപീര + ഹോന്‍ഡ്യുറാസ് ലെംപീര + ഹോന്‍ഡ്യുറാസ് ലെംപീരാസ് + L + + + ക്രൊയേഷ്യന്‍ ദിനാര്‍ + ക്രൊയേഷ്യന്‍ ദിനാര്‍ + ക്രൊയേഷ്യന്‍ ദിനാര്‍സ് + + + ക്രൊയേഷ്യന്‍ ക്യൂന + ക്രൊയേഷ്യന്‍ ക്യൂന + ക്രൊയേഷ്യന്‍ ക്യൂനാസ് + + + ഹെയ്ഷ്യന്‍ ഗൂര്‍ഡ് + ഹെയ്ഷ്യന്‍ ഗൂര്‍ഡ് + ഹെയ്ഷ്യന്‍ ഗൂര്‍ഡ്സ് + + + ഹംഗേറിയന്‍ ഫോറിന്‍റ് + ഹംഗേറിയന്‍ ഫോറിന്‍റ് + ഹംഗേറിയന്‍ ഫോറിന്‍റ്സ് + Ft + + + ഇന്തോനേഷ്യന്‍ രൂപ + ഇന്തോനേഷ്യന്‍ രൂപ + ഇന്തോനേഷ്യന്‍ രൂപ + Rp + + + ഐറിഷ് പൌണ്ട് + ഐറിഷ് പൌണ്ട് + ഐറിഷ് പൌണ്ട്സ് + IR£ + + + ഇസ്രയേലി പൌണ്ട് + ഇസ്രയേലി പൌണ്ട് + ഇസ്രയേലി പൌണ്ട്സ് + + + ഇസ്രായേലി ഷക്കേല്‍ + ഇസ്രായേലി ന്യൂ ഷെക്കല്‍ + ഇസ്രായേലി ന്യൂ ഷെക്കല്‍സ് + + + ഇന്ത്യന്‍ രൂപ + ഇന്ത്യന്‍ രൂപ + ഇന്ത്യന്‍ രൂപ + രൂ + + + ഇറാക്കി ദിനാര്‍ + ഇറാക്കി ദിനാര്‍ + ഇറാക്കി ദിനാര്‍സ് + ID + + + ഇറാനിയന്‍ റിയാല്‍ + ഇറാനിയന്‍ റിയാല്‍ + ഇറാനിയന്‍ റിയാല്‍സ് + RI + + + ഐസ്‌ലാന്‍ഡിക് ക്രോണ + ഐസ്‌ലാന്‍ഡിക് ക്രോണ + ഐസ്‌ലാന്‍ഡിക് ക്രോണാസ് + + + ഇറ്റാലിയന്‍ ലിറ + ഇറ്റാലിയന്‍ ലിറ + ഇറ്റാലിയന്‍ ലിറാസ് + + + + ജമൈക്കന്‍ ഡോളര്‍ + ജമൈക്കന്‍ ഡോളര്‍ + ജമൈക്കന്‍ ഡോളേഴ്സ് + J$ + + + ജോര്‍ദ്ദാന്‍ ദിനാര്‍ + ജോര്‍ദ്ദാന്‍ ദിനാര്‍ + ജോര്‍ദ്ദാന്‍ ദിനാര്‍സ് + JD + + + ജപ്പാനീസ് യെന്‍ + ജാപ്പനീസ് യെന്‍ + ജാപ്പനീസ് യെന്‍ + ´ + + + കെനിയന്‍ ഷില്ലിംഗ് + കെനിയന്‍ ഷില്ലിംഗ് + കെനിയന്‍ ഷില്ലിംഗ്സ് + K Sh + + + കിര്‍ഗിസ്ഥാന്‍ സോം + കിര്‍ഗിസ്ഥാന്‍ സോം + കിര്‍ഗിസ്ഥാന്‍ സോംസ് + സോം + + + കംബോഡിയന്‍ റീല്‍ + കംബോഡിയന്‍ റീല്‍ + കംബോഡിയന്‍ റീല്‍സ് + CR + + + കൊമോറോ ഫ്രാങ്ക് + കൊമോറോ ഫ്രാങ്ക് + കൊമോറോ ഫ്രാങ്´•്‍സ് + CF + + + നോര്‍ത്ത് കൊറിയന്‍ വോണ്‍ + ഉത്തര കൊറിയന്‍ വോണ്‍ + ഉത്തര കൊറിയന്‍ വോണ്‍സ് + + + ദക്ഷിണ കൊറിയന്‍ വോണ്‍ + ദക്ഷിണ കൊറിയന്‍ വോണ്‍ + ദക്ഷിണ കൊറിയന്‍ വോണ്‍സ് + + + കുവൈറ്റി ദിനാര്‍ + KWD + കുവൈറ്റി ദിനാര്‍സ്‌ + KD + + + കെയ്മന്‍ദ്വീപുകളുടെ ഡോളര്‍‌ + കെയ്മന്‍ദ്വീപുകളുടെ ഡോളര്‍‌ + കെയ്മന്‍ദ്വീപുകളുടെ ഡµ‹ളേഴ്സ് + + + കസാഖ്സ്ഥാന്‍ റ്റെംഗെ + കസാഖ്സ്ഥാന്‍ റ്റെംഗെ + കസാഖ്സ്ഥാന്‍ റ്റെംഗെസ്‌ + T + + + ലാവോഷിയന്‍ കിപ് + ലാവോഷ്യന്‍ കിപ്‌ + ലാവോഷ്യന്‍ കിപ്‌സ്‌ + + + ലെബനീസ് പൌണ്ട് + ലെബനീസ് പൌണ്ട് + ലെബനീസ് പൌണ്ട്സ് + LL + + + ശ്രീലങ്കന്‍ രൂപ + ശ്രീലങ്കന്‍ രൂപ + ശ്രീലങ്കന്‍ രൂപ + SL Re + + + ലൈബീരിയന്‍ ഡോളര്‍ + ലൈബീരിയന്‍ ഡോളര്‍ + ലൈബീരിയന്‍ ഡോളേഴ്സ് + + + ലെസോതോ ലോത്തി + ലെസോതോ ലോത്തി + ലെസോതോ ലോത്തിസ്‌ + M + + + മലോത്തി + മലോത്തി + മലോത്തിസ്‌ + + + ലിത്വാനിയന്‍ ലിത + ലിത്വാനിയന്‍ ലിത + ലിത്വാനിയന്‍ ലിതാസ്‌ + + + ലിത്വാനിയന്‍ തലോനാസ് + ലിത്വാനിയന്‍ തലോനാസ് + ലിത്വാനിയന്‍ തലോനാസെസ്‌ + + + ലക്സംബര്‍ഗ് കണ്‍വേര്‍ട്ടിബിള്‍ ഫ്രാങ്ക് + ലക്സംബര്‍ഗ് കൈമാറ്റം ചെയ്യാവുന്ന ഫ്രാങ്ക്‌ + ലക്സംബര്‍ഗ് കൈമാറ്റം ചെയ്യാവുന്ന ഫ്രാങ്ക്‌സ്‌ + + + ലക്സംബര്‍ഗ് ഫ്രാങ്ക് + ലക്സംബര്‍ഗ് ഫ്രാങ്ക് + ലക്സംബര്‍ഗ് ഫ്രാങ്ക്‌സ്‌ + + + ലക്സംബര്‍ഗ് ഫിനാന്‍ഷ്യല്‍ ഫ്രാങ്ക് + ലക്സംബര്‍ഗ് ഫിനാന്‍ഷ്യല്‍ ഫ്രാങ്ക് + ലക്സംബര്‍ഗ് ഫിനാന്‍ഷ്യല്‍ ഫ്രാങ്ക്‌സ്‌ + + + ലാറ്റ്വിയന്‍ ലാറ്റ്സ് + ലാറ്റ്വിയന്‍ ലാറ്റ്സ് + ലാറ്റ്വിയന്‍ ലാറ്റ്സെസ്‌ + + + ലാറ്റ്വിയന്‍ റൂബിള്‍ + ലാറ്റ്വിയന്‍ റൂബിള്‍ + LVR + + + ലിബിയന്‍ ദിനാര്‍ + LYD + LYD + LD + + + മൊറോക്കന്‍ ദിര്‍ഹം + MAD + MAD + + + മൊറോക്കന്‍ ഫ്രാങ്ക് + MAF + MAF + + + മൊല്‍ഡോവന്‍ ലിയൂ + MDL + MDL + + + മഡഗാസ്കര്‍ ഏരിയറി + MGA + MGA + + + മഡഗാസ്കര്‍ ഫ്രാങ്ക് + MGF + MGF + + + മാസിഡോണിയന്‍ ദിനാര്‍ + MKD + MKD + Mഡെന്‍ + + + മാലി ഫ്രാങ്ക് + MLF + MLF + + + മ്യാന്‍മാര്‍ ചാറ്റ് + മ്യാന്‍മാര്‍ ചാറ്റ് + MMK + + + മംഗോളിയന്‍ തുഗ്രിക് + MNT + MNT + റ്റഗ് + + + മകൌ പതാക്ക + മകൌ പതാക്ക + മകൌ പതാക്കാസ് + + + മൌറിറ്റേനിയ ഔഗിയ + MRO + MRO + UM + + + മല്‍ത്തീസ് ലിറ + MTL + MTL + Lm + + + മല്‍ത്തീസ് പൌണ്ട് + MTP + MTP + + + മൌറീഷ്യസ് രൂപ + MUR + MUR + + + മാലദ്വീപ് രൂപ + മാലദ്വീപ് രൂപ + മാലദ്വീപ് രൂപ + + + മലാവി ക്വാച + MWK + MWK + MK + + + മെക്സിക്കന്‍ പെസോ + MXN + MXN + MEX$ + + + മെക്സിക്കന്‍ സില്‍വര്‍ പെയ്സോ (1861-1992) + മെക്സിക്കന്‍ സില്‍വര്‍ പെയ്സോ (MXP) + മെക്സിക്കന്‍ സില്‍വര്‍ പെയ്സോസ് (MXP) + + + മെക്സിക്കന്‍ യൂണിഡാഡ് ഡി ഇന്‍വെര്‍ഷന്‍ (UDI) + മെക്സിക്കന്‍ യൂണിഡാഡ് ഡി ഇന്‍വെര്‍ഷന്‍ (UDI) + മെക്സിക്കന്‍ യൂണിഡാഡ്സ് ഡി ഇന്‍വെര്‍ഷന്‍ (UDI) + + + മലേഷ്യന്‍ റിംഗിറ്റ് + MYR + MYR + RM + + + മൊസാന്പിക്ക് എസ്ക്യുഡോ + MZE + MZE + + + ഓള്‍ഡ് മൊസാന്പിക്ക് മെറ്റിക്കല്‍ + MZM + MZM + Mt + + + മൊസാന്പിക്ക് മെറ്റിക്കല്‍ + MZN + MZN + MTn + + + നമീബിയന്‍ ഡോളര്‍ + NAD + NAD + N$ + + + നൈജീരിയന്‍ നൈറ + NGN + NGN + + + നികരാഗ്വന്‍ കൊര്‍ഡോബ + NIC + NIC + + + നികരാഗ്വന്‍ കൊര്‍ഡോബ ഒരോ + NIO + NIO + + + നെതര്‍ലന്‍ഡ്സ് ഗില്‍ഡര്‍ + നെതര്‍ലന്‍ഡ്സ് ഗില്‍ഡര്‍ + നെതര്‍ലന്‍ഡ്സ് ഗില്‍ഡേഴ്സ് + + + നോര്‍വീജിയന്‍ ക്രോണ്‍ + നോര്‍വീജിയന്‍ ക്രോണ്‍സ് + NKr + + + നേപ്പാളി രൂപ + NPR + NPR + Nrs + + + ന്യൂസിലാന്‍ഡ് ഡോളര്‍ + ന്യൂസിലന്‍ഡ് ഡോളര്‍ + ന്യൂസിലന്‍ഡ് ഡോളേഴ്സ് + $NZ + + + ഒമാന്‍ റിയാല്‍ + OMR + OMR + RO + + + പനാമെയ്നിയന്‍ ബാല്‍ബോവ + പനാമെയ്നിയന്‍ ബാല്‍ബോവ + പനാമെയ്നിയന്‍ ബാല്‍ബോവാസ് + + + പെറൂവിയന്‍ ഇന്‍റി + പെറൂവിയന്‍ ഇന്‍റി + പെറൂവിയന്‍ ഇന്‍റിസ് + + + പെറൂവിയന്‍ സോള്‍ ന്യൂവോ + പെറൂവിയന്‍ സോള്‍ ന്യൂവോ + പെറൂവിയന്‍ സോള്‍ ന്യൂവോസ് + + + പെറൂവിയന്‍ സോള്‍ + പെറൂവിയന്‍ സോള്‍ + പെറൂവിയന്‍ സോള്‍സ് + + + പാപുവ ന്യൂ ഗിനി കിന + പാപുവ ന്യൂ ഗിനി കിന + പാപുവ ന്യൂ ഗിനി കിനാസ് + + + ഫിലിപ്പൈന്‍ പെയ്സോ + ഫിലിപ്പൈന്‍ പെയ്സോ + ഫിലിപ്പൈന്‍ പെയ്സോസ് + Php + + + പാക്കിസ്ഥാനി രൂപ + പാക്കിസ്ഥാനി രൂപ + പാക്കിസ്ഥാനി രൂപ + Pra + + + പോളിഷ് സ്ലോട്ടി + പോളിഷ് സ്ലോട്ടീസ് + Zl + + + പോളിഷ് സ്ലോട്ടി (1950-1995) + PLZ + PLZ + + + പോര്‍ച്ചുഗീസ് എസ്ക്യുഡോ + PTE + PTE + + + പരാഗ്വേ ഗ്വരനീ + PYG + PYG + + + ഖത്തര്‍ റിയാല്‍ + QAR + QAR + + + റൊഡേഷ്യന്‍ ഡോളര്‍ + RHD + RHD + + + പ്രാചീന റൊമേനിയന്‍ ലിയു + ROL + ROL + + + റൊമേനിയന്‍ ലിയു + RON + RON + + + സെര്‍ബിയന്‍ ദിനാര്‍ + RSD + RSD + + + റഷ്യന്‍ റൂബിള്‍ + റഷ്യന്‍ റൂബിള്‍ + റഷ്യന്‍ റൂബിള്‍സ് + + + റഷ്യന്‍ റൂബിള്‍ (1991-1998) + RUR + RUR + + + റുവാണ്ടന്‍ ഫ്രാങ്ക് + RWF + RWF + + + സൌദി റിയാല്‍ + SAR + SAR + + + സോളമന്‍ ദ്വീപുകളുടെ ഡോളര്‍ + SBD + SBD + + + സെയ്ഷെല്‍സ് രൂപ + SCR + SCR + + + പ്രാചീന സുഡാനീസ് ദിനാര്‍ + SDD + SDD + + + സുഡാനീസ് പൌണ്ട് + SDG + SDG + + + പ്രാചീന സുഡാനീസ് പൌണ്ട് + SDP + SDP + + + SEK + SEK + SEK + + + സിംഗപ്പൂര്‍ ഡോളര്‍ + SGD + SGD + + + സെയ്ന്‍റ് ഹെലെന പൌണ്ട് + SHP + SHP + + + സ്ലൊവേനിയ റ്റോളര്‍ + SIT + SIT + + + സ്ലോവാക് കൊരൂന + SKK + SKK + + + സിയറാ ലിയോണ്‍ ലിയോണ്‍ + SLL + SLL + + + സൊമാലി ഷില്ലിംഗ് + SOS + SOS + + + സൂരിനാം ഡോളര്‍ + SRD + SRD + + + സൂരിനാം ഗില്‍ഡര്‍ + SRG + SRG + + + സാവോ റ്റോമി ആന്‍ഡ് പ്രിന്‍സിപ്പി ഡോബ്ര + STD + STD + + + സോവിയറ്റ് റൂബിള്‍ + SUR + SUR + + + എല്‍ സാല്‍വഡോര്‍ കോളന്‍ + SVC + SVC + + + സിറിയന്‍ പൌണ്ട് + SYP + സിറിയന്‍ പൌണ്ട് + + + സ്വാസിലാന്‍ഡ് ലിലാംഗനി + SZL + SZL + + + തായ് ബട്ട് + തായ് ബട്ട് + തായ് ബട്ട് + + + തജിക്സ്ഥാന്‍ റൂബിള്‍ + തജിക്സ്ഥാന്‍ റൂബിള്‍ + തജിക്സ്ഥാന്‍ റൂബിള്‍സ് + + + തജികിസ്ഥാന്‍ സൊമോനി + തജികിസ്ഥാന്‍ സൊമോനി + തജികിസ്ഥാന്‍ സൊമോനിസ് + + + തുര്‍ക്മെനിസ്ഥാന്‍ മനത് + തുര്‍ക്മെനിസ്ഥാന്‍ മനത് + തുര്‍ക്മെനിസ്ഥാന്‍ മനത്‌സ് + + + തുനീസിയന്‍ ദിനാര്‍ + TND + TND + + + റ്റോംഗ പാംഗ + റ്റോംഗ പാംഗ + റ്റോംഗ പാംഗാസ് + T$ + + + തിമോര്‍ എസ്ക്യൂഡോ + തിമോര്‍ എസ്ക്യൂഡോ + തിമോര്‍ എസ്ക്യൂഡോസ് + + + പ്രാചീന തുര്‍ക്കിഷ് ലിറ + TRL + പ്രാചീന തുര്‍ക്കിഷ് ലിറാസ് + TL + + + തുര്‍ക്കിഷ് ലിറ + തുര്‍ക്കിഷ് ലിറ + തുര്‍ക്കിഷ് ലിറാസ് + + + ട്രിനിഡാഡ് ആന്‍ഡ് റ്റൊബാഗോ ഡോളര്‍ + TTD + TTD + TT$ + + + തായ്‌വാന്‍ ഡോളര്‍ + തായ്‌വാന്‍ ഡോളേഴ്സ് + NT$ + + + റ്റാന്‍സാനിയന്‍ ഷില്ലിംഗ് + TZS + TZS + T Sh + + + യുക്രേനിയന്‍ ഹ്രിവ്നിയ + ഉക്രേനിയന്‍ ഹ്രിവ്നിയ + ഉക്രേനിയന്‍ ഹ്രിവ്നിയാസ് + + + യുക്രേനിയന്‍ കാര്‍ബോവാനെസ് + ഉക്രേനിയന്‍ കാര്‍ബോവാനെസ് + ഉക്രേനിയന്‍ കാര്‍ബോവാനെസ് + + + ഉഗാണ്ടന്‍ ഷില്ലിംഗ് (1966-1987) + UGS + UGS + + + ഉഗാണ്ടന്‍ ഷില്ലിംഗ് + UGX + UGX + U Sh + + + യു.എസ്. ഡോളര്‍ + യു.എസ് ഡോളര്‍ + യു.എസ് ഡോളേഴ്സ് + $ + + + യുഎസ് ഡോളര്‍ (അടുത്ത ദിവസം) + USN + USN + + + യുഎസ് ഡോളര്‍ (അതേ ദിവസം) + USS + യുഎസ് ഡോളേഴ്സ് (അതേ ദിവസം) + + + ഉറുഗ്വേ പെയ്സോ എന്‍ യൂണിഡാഡ്സ് + ഉറുഗ്വേ പെയ്സോ എന്‍ യൂണിഡാഡ്സ് ഇന്‍ഡെക്സാഡാസ് + ഉറുഗ്വേ പെയ്സോസ് എന്‍ യൂണിഡാഡ്സ് ഇന്‍ഡെക്സാഡാസ് + + + ഉറുഗ്വേ പെയ്സോ (1975-1993) + ഉറുഗ്വേ പെയ്സോ (UYP) + ഉറുഗ്വേ പെയ്സോസ് (UYP) + + + ഉറുഗ്വേ പെയ്സോ ഉറുഗായോ + ഉറുഗ്വേ പെയ്സോ + ഉറുഗ്വേ പെയ്സോ + Ur$ + + + ഉസ്ബക്കിസ്ഥാന്‍ സം + ഉസ്ബക്കിസ്ഥാന്‍ സം + ഉസ്ബക്കിസ്ഥാന്‍ സംസ് + + + വെനസ്വേലന്‍ ബോലിവര്‍ + വെനസ്വേലന്‍ ബോലിവര്‍ + വെനസ്വേലന്‍ ബോലിവര്‍സ് + Be + + + വെനസ്വേലന്‍ ബോലിവര്‍ ഫുവെര്‍റ്റെ + വെനസ്വേലന്‍ ബോലിവര്‍ ഫുവെര്‍റ്റെ + വെനസ്വേലന്‍ ബോലിവര്‍ ഫുവെര്‍റ്റെസ് + BsF + + + വിയറ്റ്നാമീസ് ഡോങ് + VND + VND + + + വനുവാതു വാതു + വനുവാതു വാതു + വനുവാതു വാതൂസ് + VT + + + പശ്ചിമ സമോവ താല + പശ്ചിമ സമോവ താല + പശ്ചിമ സമോവ താലാസ് + + + CFA ഫ്രാങ്ക് BEAC + CFA ഫ്രാങ്ക് BEAC + CFA ഫ്രാങ്ക്സ് BEAC + + + വെള്ളി + വെള്ളി + വെള്ളി + + + സ്വര്‍ണ്ണം + സ്വര്‍ണ്ണം + സ്വര്‍ണ്ണം + + + യൂറോപ്യന്‍ കോന്പസിറ്റ് യൂണിറ്റ് + യൂറോപ്യന്‍ കോന്പസിറ്റ് യൂണിറ്റ് + യൂറോപ്യന്‍ കോന്പസിറ്റ് യൂണിറ്റ്സ് + + + യൂറോപ്യന്‍ മോണിറ്ററി യൂണിറ്റ് + യൂറോപ്യന്‍ മോണിറ്ററി യൂണിറ്റ് + യൂറോപ്യന്‍ മോണിറ്ററി യൂണിറ്റ്സ് + + + യൂറോപ്യന്‍ യൂണിറ്റ് ഓഫ് അക്കൌണ്ട് (XBC) + യൂറോപ്യന്‍ യൂണിറ്റ് ഓഫ് അക്കൌണ്ട് (XBC) + യൂറോപ്യന്‍ യൂണിറ്റ്സ് ഓഫ് അക്കൌണ്ട് (XBC) + + + യൂറോപ്യന്‍ യൂണിറ്റ് ഓഫ് അക്കൌണ്ട് (XBD) + യൂറോപ്യന്‍ യൂണിറ്റ് ഓഫ് അക്കൌണ്ട് (XBD) + യൂറോപ്യന്‍ യൂണിറ്റ്സ് ഓഫ് അക്കൌണ്ട് (XBD) + + + കിഴക്കന്‍ കരീബിയന്‍ ഡോളര്‍ + കിഴക്കന്‍ കരീബിയന്‍ ഡോളര്‍ + കിഴക്കന്‍ കരീബിയന്‍ ഡോളേഴ്സ് + EC$ + + + സ്പെഷ്യല്‍ ഡ്രോയിംഗ് റൈറ്റ്സ് + സ്പെഷ്യല്‍ ഡ്രോയിംഗ് റൈറ്റ്സ് + സ്പെഷ്യല്‍ ഡ്രോയിംഗ് റൈറ്റ്സ് + + + യൂറോപ്യന്‍ നാണയ യൂണിറ്റ് + യൂറോപ്യന്‍ നാണയ യൂണിറ്റ് + യൂറോപ്യന്‍ നാണയ യൂണിറ്റ്സ് + + + ഫ്രെഞ്ച് ഗോള്‍ഡ് ഫ്രാങ്ക് + ഫ്രെഞ്ച് ഗോള്‍ഡ് ഫ്രാങ്ക് + ഫ്രെഞ്ച് ഗോള്‍ഡ് ഫ്രാങ്ക്സ് + + + ഫ്രെഞ്ച് UIC-ഫ്രാങ്ക് + ഫ്രെഞ്ച് UIC-ഫ്രാങ്ക് + ഫ്രെഞ്ച് UIC-ഫ്രാങ്ക്സ് + + + CFA ഫ്രാങ്ക് BCEAO + CFA ഫ്രാങ്ക് BCEAO + CFA ഫ്രാങ്ക്സ് BCEAO + + + പലാഡിയം + പലാഡിയം + പലാഡിയം + + + CFP ഫ്രാങ്ക് + CFP ഫ്രാങ്ക് + CFP ഫ്രാങ്ക്സ് + CFPF + + + പ്ലാറ്റിനം + പ്ലാറ്റിനം + പ്ലാറ്റിനം + + + RINET ഫണ്ട്സ് + RINET ഫണ്ട്സ് + RINET ഫണ്ട്സ് + + + റ്റെസ്റ്റിംഗ് കറന്‍സി കോഡ് + റ്റെസ്റ്റിംഗ് കറന്‍സി കോഡ് + റ്റെസ്റ്റിംഗ് കറന്‍സി കോഡ് + + + അറിയപ്പെടാത്തതോ നിലവിലില്ലാത്തതോ ആയ നാണയം + അറിയപ്പെടാത്തതോ നിലവിലില്ലാത്തതോ ആയ നാണയം + അറിയപ്പെടാത്തതോ നിലവിലില്ലാത്തതോ ആയ നാണയം + [നാണയം അറിവില്ല] + + + യമനി ദിനാര്‍ + യമനി ദിനാര്‍ + യമനി ദിനാര്‍സ് + + + യമനി റിയാല്‍ + യമനി റിയാല്‍ + യമനി റിയാല്‍സ് + YRl + + + യൂഗോസ്ലേവിയന്‍ ഹാരഁ€ഡ് ദിനാര്‍ + യൂഗോസ്ലേവിയന്‍ ഹാര്‍ഡ് ദിനാര്‍ + യൂഗോസ്ലേവിയന്‍ ഹാര്‍ഡ് ദിനാര്‍സ് + + + യൂഗോസ്ലേവിയന്‍ നോവി ദിനാര്‍ + യൂഗോസ്ലേവിയന്‍ നോവി ദിനാര്‍ + യൂഗോസ്ലേവിയന്‍ നോവി ദിനാര്‍സ് + + + യൂഗോസ്ലേവിയന്‍ കണ്‍വേര്‍ട്ടിബിള്‍ ദിനാര്‍ + യൂഗോസ്ലേവിയന്‍ കണ്‍വേര്‍ട്ടിബിള്‍ ദിനാര്‍ + യൂഗോസ്ലേവിയന്‍ കണ്‍വേര്‍ട്ടിബിള്‍ ദിനാര്‍സ് + + + ദക്ഷിണാഫ്രിക്കന്‍ റാന്‍ഡ് (ഫിനാന്‍ഷ്യല്‍) + ദക്ഷിണാഫ്രിക്കന്‍ റാന്‍ഡ് (ഫിനാന്‍ഷ്യല്‍) + ദക്ഷിണാഫ്രിക്കന്‍ റാന്‍ഡ്സ് (ഫിനാന്‍ഷ്യല്‍) + + + ദക്ഷിണാഫ്രിക്കന്‍ റാന്‍ഡ് + ദക്ഷിണാഫ്രിക്കന്‍ റാന്‍ഡ്സ് + R + + + സാംബിയന്‍ ക്വാച + സാംബിയന്‍ ക്വാച + സാംബിയന്‍ ക്വാചാസ് + + + സൈറിയന്‍ ന്യൂ സൈര്‍ + സൈറിയന്‍ ന്യൂ സൈര്‍ + സൈറിയന്‍ ന്യൂ സൈര്‍സ് + + + സൈറിയന്‍ സൈര്‍ + സൈറിയന്‍ സൈര്‍ + സൈറിയന്‍ സൈര്‍സ് + + + സിംബാബ്‌വെ ഡോളര്‍ + സിംബാബ്‌വെ ഡോളര്‍ + സിംബാബ്‌വെ ഡോളേഴ്സ് + Z$ + + + + + + {0} ദിവസം + {0} ദിവസം + + + {0} മണിക്കൂര്‍ + {0} മണിക്കൂര്‍ + + + {0} മിനിട്ട് + {0} മിനിട്ട് + + + {0} മാസം + {0} മാസം + + + {0} സെക്കന്റ് + {0} സെക്കന്റ് + + + {0} ആഴ്ച + {0} ആഴ്ച + + + {0} വര്‍ഷം + {0} വര്‍ഷം + + + + + അതെ + അല്ല + + + diff --git a/libs/Zend/Locale/Data/ml_IN.xml b/libs/Zend/Locale/Data/ml_IN.xml new file mode 100644 index 0000000..4644e38 --- /dev/null +++ b/libs/Zend/Locale/Data/ml_IN.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/mn.xml b/libs/Zend/Locale/Data/mn.xml new file mode 100644 index 0000000..d3c74a8 --- /dev/null +++ b/libs/Zend/Locale/Data/mn.xml @@ -0,0 +1,326 @@ + + + + + + + + + + + африк + амхарик + араб + ассам үндэстэн + азарбежан + беларусь + болгар + бихари хэл + бенгаль + бретон + босниа + каталан + чех + уэлс + дани + герман + грек + англи + эсперанто + испани + эстони + баск + перс + финлянд + тагало + фөриэс хэл + франц + голландын фрисиан хэл + ирланд + шотланд келт + галик + гуарани + энэтхэгийн гужарати + кипр + хинди + хорвати + унгар + армен + интерлингво + индонези + нэгдмэл хэл + исланд + итали + япон + ява + гүрж + камбуч + каннада + солонгос + курд + киргиз + латин + лингала + лаотиан + литви + латви + македони + малайлам + монгол + энэтхэгийн марати + малай + малти + балба + голланд + норвеги (нынорск) + норвеги + францын окситан + ория + пенжаби + польш + афган + португали + португали (бразил) + португали (португали) + румын + орос + санскирит + синдхи + хорватын серб + шри ланк + словак + словени + сомали + албани + серби + сесото + сунданес хэл + швед + африкийн свахили хэл + тамил + тэлүгү + тай + тикрина + туркмен + клингон хэл + турк + тви + уйгур + украин + пакистаны урду + узбек + вьетнам + хоса + иддиш + хятад + зулу + + + Бразили + Герман + Франц + Энэтхэг + Итали + Япон + Монгол улс + Орос + Тонга + Америкийн Нэгдсэн Улс + + + + [а-е ё ж-о ө п-у ү ф-я] + [ә җ ӊ һ] + + + + + + + + + + + + + + хул + үхэ + бар + туу + луу + мог + мор + хон + бич + тах + нох + гах + + + Хулгана + Үхэр + Бар + Туулай + Луу + Могой + Морь + Хонь + Бич + Тахиа + Нохой + Гахай + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + Ня + Да + Мя + Лх + Пү + Ба + Бя + + + ням + даваа + мягмар + лхагва + пүрэв + баасан + бямба + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + 1/4 + 2/4 + 3/4 + 4/4 + + + дөрөвний нэг + дөрөвний хоёр + дөрөвний гурав + дөрөвний дөрөв + + + + AM + PM + + + манай эриний өмнөх + манай эриний + + + м.э.ө + м.э. + + + + + + EEEE, yyyy MMMM dd + + + + + yyyy MMMM d + + + + + yyyy MMM d + + + + + yy/MM/dd + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1} {0} + + + + Q yy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + , +   + + + + + + + + diff --git a/libs/Zend/Locale/Data/mn_CN.xml b/libs/Zend/Locale/Data/mn_CN.xml new file mode 100644 index 0000000..4bd7f67 --- /dev/null +++ b/libs/Zend/Locale/Data/mn_CN.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/mn_Cyrl.xml b/libs/Zend/Locale/Data/mn_Cyrl.xml new file mode 100644 index 0000000..a170d71 --- /dev/null +++ b/libs/Zend/Locale/Data/mn_Cyrl.xml @@ -0,0 +1,10 @@ + + + + + + + + + + + + + + + + + + + Dinja + Affrika + Amerika ta’ Fuq + Amerika t’Isfel + Oċejanja + Affrika tal-Punent + Amerika Ċentrali + Affrika tal-Lvant + Affrika ta’ Fuq + Affrika Nofsani + Affrika t’Isfel + Amerika + Amerika Nòrdiku + Karibew + Asja tal-Lvant + Asja t’Isfel Ċentrali + Asja tax-Xlokk + Ewropa t’Isfel + Awstralja u New Zealand + Melanesja + Reġjun ta’ Mikroneżja + Polinesja + Asja + Asja Ċentrali + Asja tal-Punent + Ewropa + Ewropa tal-Lvant + Ewropa ta’ Fuq + Ewropa tal-Punent + Commonwealth tal-Istati Independenti + Amerika Latina u l-Karibew + Gżejjer tal-Kanal Ingliż + Andorra + Emirati Għarab Maqgħuda + Afganistan + Antigua and Barbuda + Angwilla + Albanija + Armenja + Antilles Olandiżi + Angola + Antartika + Arġentina + Samoa Amerikana + Awstrija + Awstralja + Aruba + Gżejjer Aland + Ażerbajġan + Bożnija Ħerżegovina + Barbados + Bangladexx + Belġju + Burkina Faso + Bulgarija + Baħrajn + Burundi + Benin + Bermuda + Brunej + Bolivja + Brażil + Baħamas + Butan + Bouvet Island + Botswana + Bjelorussja + Beliże + Kanada + Cocos (Keeling) Islands + Democratic Republic of the Congo + Repubblika Afrikana Ċentrali + Kongo + Svizzera + Kosta ta’ l-Avorju + Cook Islands + Ċili + Kamerun + Ċina + Kolumbja + Kosta Rika + Serbja u Montenegro + Kuba + Kape Verde + Christmas Island + Ċipru + Repubblika Ċeka + Ġermanja + Ġibuti + Danimarka + Dominika + Republikka Domenikana + Alġerija + Ekwador + Estonja + Eġittu + Sahara tal-Punent + Eritreja + Spanja + Etijopja + Finlandja + Fiġi + Falkland Islands + Mikronesja + Gżejjer Faroe + Franza + Gabon + Ingilterra + Grenada + Ġorġja + Gujana Franċiża + Gana + Gibraltar + Grinlandja + Gambja + Gineja + Gwadelupe + Ginea Ekwatorjali + Greċja + South Georgia and the South Sandwich Islands + Gwatemala + Gwam + Ginea-Bissaw + Gujana + Ħong Kong S.A.R., Ċina + Heard Island and McDonald Islands + Ħonduras + Kroazja + Ħaiti + Ungerija + Indoneżja + Irlanda + Iżrael + Isle of Man + Indja + British Indian Ocean Territory + Iraq + Iran + Islanda + Italja + Ġamajka + Ġordan + Ġappun + Kenja + Kirgistan + Kambodja + Kiribati + Komoros + Saint Kitts and Nevis + Koreja ta’ Fuq + Koreja t’Isfel + Kuwajt + Gżejjer Kajmani + Każakstan + Laos + Libanu + Santa Luċija + Liechtenstein + Sri Lanka + Liberja + Lesoto + Litwanja + Lussemburgu + Latvja + Libja + Marokk + Monako + Maldova + Madagaskar + Gżejjer ta’ Marshall + Maċedonja + Mali + Mjanmar + Mongolja + Macao S.A.R., China + Gżejjer Marjana ta’ Fuq + Martinik + Mawritanja + Montserrat + Malta + Mawrizju + Maldives + Malawi + Messiku + Malasja + Możambik + Namibja + New Caledonia + Niġer + Norfolk Island + Niġerja + Nikaragwa + Olanda + Norveġja + Nepal + Nauru + Niue + New Zealand + Oman + Panama + Peru + Polinesja Franċiża + Papwa-Ginea Ġdida + Filippini + Pakistan + Polonja + Saint Pierre and Miquelon + Pitcairn + Puerto Rico + Palestinian Territory + Portugall + Palau + Paragwaj + Qatar + Unjoni Ewropea + Réunion + Rumanija + Russja + Rwanda + Għarabja Sawdita + Solomon Islands + Seychelles + Sudan + Żvezja + Singapor + Saint Helena + Slovenja + Svalbard and Jan Mayen + Slovakkja + Sierra Leone + San Marino + Senegal + Somalja + Surinam + Sao Tome and Principe + El Salvador + Sirja + Sważiland + Turks and Caicos Islands + Ċad + Territorji Franċiżi ta’ Nofsinhar + Togo + Tajlandja + Taġikistan + Tokelaw + Timor tal-Lvant + Turkmenistan + Tuneż + Tonga + Turkija + Trinidad u Tobago + Tuvalu + Tajwan + Tanżanija + Ukraina + Uganda + United States Minor Outlying Islands + Stati Uniti + Urugwaj + Użbekistan + Vatikan + Saint Vincent and the Grenadines + Venezwela + British Virgin Islands + U.S. Virgin Islands + Vjetnam + Vanwatu + Wallis and Futuna + Samoa + Jemen + Majotte + Afrika t’Isfel + Żambja + Żimbabwe + Reġjun Mhux Magħruf jew Mhux Validu + + + Ortografija Irriveda + + + Kalendarju + Kollazjoni + Munita + + + Ordni Ċiniż Tradizzjonali (Big5) + Kalendarju Buddist + Kalendarju Ċiniż + Ordni Diretta + Ordni Ċiniż Sempliċi (GB2312) + Kalendarju Gregorjan + Kalendarju Ebrajk + Kalendarju Islamiku + Kalendarju Islamiku-Ċivili + Kalendarju Ġappuniż + Ordni Telefonika + Ordni tal-Pinjin + Ordni Maħżuża + Tradizzjonali + + + Metriku + + + Lingwa: {0} + Skritt: {0} + Reġjun: {0} + + + + [a à b ċ d e è f ġ g {għ} h ħ i ì j-o ò p-u ù v-x ż z] + [c y] + + + + + + + + Jan + Fra + Mar + Apr + Mej + Ġun + Lul + Awi + Set + Ott + Nov + Diċ + + + Jannar + Frar + Marzu + April + Mejju + Ġunju + Lulju + Awissu + Settembru + Ottubru + Novembru + Diċembru + + + + + J + F + M + A + M + Ġ + L + A + S + O + N + D + + + + + + + Ħad + Tne + Tli + Erb + Ħam + Ġim + Sib + + + Il-Ħadd + It-Tnejn + It-Tlieta + L-Erbgħa + Il-Ħamis + Il-Ġimgħa + Is-Sibt + + + + + Ħ + T + T + E + Ħ + Ġ + S + + + + + + + K1 + K2 + K3 + K4 + + + K1 + K2 + K3 + K4 + + + + QN + WN + + + Qabel Kristu + Wara Kristu + + + QK + WK + + + + + + EEEE, d 'ta'’ MMMM yyyy + + + + + d 'ta'’ MMMM yyyy + + + + + dd MMM yyyy + + + + + dd/MM/yyyy + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1} {0} + + + + d 'ta'’ MMMM + dd/MM + Q yy + MM/yyyy + MMM yyyy + + + {0} - {1} + + M-M + + + E, dd/MM - E, dd/MM + E, dd/MM - E, dd/MM + + + MMM-MMM + + + E, d 'ta'’ MMM - E, d 'ta'’ MMM + E, d 'ta'’ - E, d 'ta'’ MMM + + + d 'ta'’ MMM - d 'ta'’ MMM + d 'ta'’-d 'ta'’ MMM + + + dd/MM - dd/MM + dd/MM - dd/MM + + + d-d + + + HH-HH + + + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH-HH v + + + y-y + + + MM/yyyy - MM/yyyy + MM/yyyy - MM/yyyy + + + E, dd/MM/yyyy - E, dd/MM/yyyy + E, dd/MM/yyyy - E, dd/MM/yyyy + E, dd/MM/yyyy - E, dd/MM/yyyy + + + MMM-MMM yyyy + MMM yyyy - MMM yyyy + + + E, d 'ta'’ MMM - E, d 'ta'’ MMM yyyy + E, d 'ta'’ - E, d 'ta'’ MMM yyyy + E, d 'ta'’ MMM yyyy - E, d 'ta'’ MMM yyyy + + + d 'ta'’ MMM - d 'ta'’ MMM yyyy + d 'ta'’-d 'ta'’ MMM yyyy + d 'ta'’ MMM yyyy - d 'ta'’ MMM yyyy + + + dd/MM/yyyy - dd/MM/yyyy + dd/MM/yyyy - dd/MM/yyyy + dd/MM/yyyy - dd/MM/yyyy + + + + + + Epoka + + + Sena + + + Xahar + + + Ġimgħa + + + Jum + Illum + Għada + Lbieraħ + + + Jum tal-Ġimgħa + + + Siegħa + + + Minuta + + + Sekonda + + + Żona + + + + + + +HH:mm;-HH:mm + GMT{0} + Ħin ta’ {0} + + Mhux Magħruf + + + Londra + + + Valletta + + + + Ħin Ċentrali Ewropew + Ħin Ċentrali Ewropew tas-Sajf + + true + + + + + + . + , + + + + + ¤#,##0.00 + + + + + + Ewro + + + Lira Maltija + Lm + + + Munita Mhux Magħruf jew Mhux Validu + XXX + + + + + + iva:i + le:l + + + diff --git a/libs/Zend/Locale/Data/mt_MT.xml b/libs/Zend/Locale/Data/mt_MT.xml new file mode 100644 index 0000000..977259c --- /dev/null +++ b/libs/Zend/Locale/Data/mt_MT.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/my.xml b/libs/Zend/Locale/Data/my.xml new file mode 100644 index 0000000..39e0d94 --- /dev/null +++ b/libs/Zend/Locale/Data/my.xml @@ -0,0 +1,1597 @@ + + + + + + + + + + + + + + အင်္ဂလိပ်စာဟောင်း + အာရေဗီ + အယောင်ဆောင် ဘာသာစကား + ဘာလီ + ဘာဆာ + ဘော်လတစ် ဘာသာစကား + ဘီလာရု + ဘူဂေးရီးယား + ဘင်္ဂါလီ + တိဘက် + ဘော့စ်နီးယား + အလယ်ပိုင်း အမေရိကန် အိန္ဒြိယ ဘာသာစကား + ကောက်ကေးရှပ် ဘာသာစကား + ချေချင်း + ချာရိုကီ + ပေါ်တူဂီ အခြေခံ အနောက်အိန္ဒြိယ ကျွန်းစုသား သို့မဟုတ် ဗန်းစကား + ခရီး + အနောက်အိန္ဒြိယ ကျွန်းစုသား သို့မဟုတ် ဗန်းစကား + ချက် + ဝေလ + ဒိန်းမတ် + ဒါကိုတာ + ဂျာမန် + ဩစတြီးယ ဂျာမန် + ဆွစ် အမြင့် ဂျာမန် + ဒီလာဝဲ + အလယ်ပိုင်း ဒတ်ချ် + ဒွန်ကာ + ရှေးဟောင်း အီဂျစ် + ဂရိ + အင်္ဂလိပ် + ဩစတြေးလျှ အင်္ဂလိပ် + ကနေဒါ အင်္ဂလိပ် + ဗြိတိသျှ အင်္ဂလိပ် + အမေရိကန် အင်္ဂလိပ် + အလယ်ပိုင်း အင်္ဂလိပ် + စပိန် + လက်တင်အမေရိက စပိန် + အက်စ်တိုးနီးရန်း + ပါရှန် + ဖင်နစ်ရှ် + ဖိလစ်ပီနို + ဖီဂျီ + ပြင်သစ် + ကနေဒါ ပြင်သစ် + ဆွစ် ပြင်သစ် + အလယ်ပိုင်းပြင်သစ် + ပြင်သစ်ဟောင်း + မြောက်ပိုင်း ဖရီစီရန် + အရှေ့ပိုင်း ဖရီစီရန် + အနောက်ပိုင်း ဖရီစီရန် + အိုင်းရစ် + ဂျာမန် အခြေခံဘာသာစကား + အလယ်ပိုင်းအမြင့်ဂျာမန် + ရှေးဟောင်း ဂရိ + ဆွစ် ဂျာမန် + ဂူဂျာရသီ + ဟာဝေယံ + ဟီးဘရူး + ဟိန္ဒီ + ခရိုအေရှန် + ဟန်ဂေရီ + အင်ဒိုနီးရှား + စီချွမ် ရီ + အင်ဒို ဥရောပ ဘာသာစကား + အီရန် အခြေခံ ဘာသာစကား + အီတလီ + ဂျပန် + ဂျူဒီယို-ပါရှန် + ဂျူဒီယို-အာရေဗျ + ဂျာဗားနီးစ် + ဂျော်ဂျီယန် + ကချင် + ကရင် + ကွန်ဂို + ခါစီ + ခမာ + ကန်နာဒါ + ကိုးရီးယား + ကဒ် + လက်တင် + လာအို + အလယ်ပိုင်း အိုင်းရစ် + အမျိုးမျိုးသော ဘာသာစကား + မွန်-ခမာ ဘာသာစကား + မလေးရာလမ် + မွန်ဂိုလီးယန်း + မန်ချူး + မနိပူရီ + မနိုဘို ဘာသာစကား + မာရသီ + မလေး + အကြိမ်များစွာ ဘာသာစကားများ + ဗမာ + အနိမ့် ဂျာမန် + နီပေါလ် + ဒတ်ချ် + နော်ဝေး + ပန်ဂျာပီ + ပါပူရန် ဘာသာစကား + ပါရှန် အဟောင်း + ဖိလစ်ပိုင် ဘာသာစကား + ပါဠိ + ပိုလန် + ပေါ်တူဂီ + ဘရာဇီး ပေါ်တူဂီ + ရိုမေနီယား + မူလရင်းမြစ် + ရုရှ + သင်္သကရိုက် + တောင် အမေရိကန် အိန္ဒြိယ ဘာသာစကား + စကော့ + စင်ဒီ + အိုင်းရစ် ဟောင်း + အချက်ပြ ဘာသာစကား + ရှမ်း + ဆင်ဟာလ + တရုတ်-တိဘက် ဘာသာစကား + စလိုဗက် + စလိုဗေးနီးယမ်း + စလိုဗစ် ဘာသာစကား + တောင်ပိုင်း ဆာမိ + ဆာမိ ဘာသာစကား + ဆိုမာလီ + အယ်လ်ဘေးနီးယန်း + ဆားဗီးယန်း + ဆူဒန် + ဆွီဒင် + တမီးလ် + တိုင် ဘာသာစကား + ထိုင်း + တူပီ ဘာသာစကား + ယူကရိန်း + မသိ သို့မဟုတ် မရှိ သော ဘာသာစကား + ဗီယက်နမ် + တရုတ် + ရိုးရှင်းသော တရုတ် + ရှေးရိုးစဉ်လာ တရုတ် + ဇူလူ + ဘာသာစကား နှင့် ပတ်သက် သောအရာမရှိ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ကမ္ဘာ + အာဖရိက + မြောက် အမေရိက + တောင် အမေရိက + သမုဒ္ဒရာဒေသ + အနောက် အာဖရိက + အလယ်ပိုင်း အမေရိက + အရှေ့ပိုင်း အာဖရိက + မြောက်ပိုင်း အာဖရိက + အလယ်ပိုင်း အာဖရိက + တောင်ပိုင်း အာဖရိက + အမေရိကများ + မြောက်ပိုင်း အမေရိက + ကာရီဘီယံ + အရှေ့ပိုင်း အာရှ + တောင်ပိုင်း အာရှ + အ‌ရှေ့တောင်ပိုင်း အာရှ + တောင်ပိုင်း ဥရောပ + ဩစတြေးလျှ နှင့် နယူးဇီလန် + တောင်-အလယ် အာရှ + အာရှ + အလယ် အာရှ + အနောက် အာရှ + ဥရောပ + အရှေ့ပိုင်း ဥရောပ + မြောက်ပိုင်း ဥရောပ + အနောက်ပိုင်း ဥရောပ + လွတ်လပ်သော ပြည်ထောင်စုများ၏ ဓနသဟာယအဖွဲ့ + လက်တင် အမေရိက နှင့် ကာရီဘီယန် + ယူအေအီး + အာဖဂန်နစ္စတန် + အန်ကွီလာ + အာမေနီးယား + အင်ဂိုလာ + အန္တာတိက + အာဂျင်တီးနား + အမေရိကန် စမိုအ + ဩစတြီးယား + ဩစတြေးလျှား + အဇာဘိုင်ဂျန် + ဘော့စနီးယား နှင့် ဟာဇီဂိုဘီးနား + ဘင်္ဂလားဒေ့ရှ် + ဘယ်လ်ဂျီယမ် + ဘူဂေးရီးယား + ဘာရိန်း + ဘာမူဒါ + ဘရူနိုင်း + ဘိုလီးဘီးယား + ဘရာဇီး + ဘဟားမား + ဘူတန် + ဘော့စ်ဝါနာ + ဘီလာရုစ် + ဘေလီဇ် + ကနေဒါ + ကိုကိုး ကျွန်းစု + အလယ်ပိုင်း အာဖရိက ပြည်ထောင်စု + ဆွစ်ဇလန် + အိုင်ဗရီကိုစ့် + ကွတ် ကျွန်းစု + ချီလီ + ကင်မရွန်း + တရုတ် + ကိုလံဘီယာ + ကော့စ်တာရီကာ + ကျူးဘား + ခရစ်စမတ် ကျွန်း + ဆိုက်ပရက်စ် + ချက် ပြည်ထောင်စု + ဂျာမဏီ + ဒိန်းမတ် + ဒိုမီနီကာ + ဒိုမီနီကန် + အယ်လ်ဂျီးရီးယား + အီကွေဒေါ + အက်စတိုးနီးယား + အီဂျစ် + အနောက်ပိုင်း ဆာဟာရ + စပိန် + အီသီယိုးပီးယား + ဖင်လန် + ဖီဂျီ + ဖောက်ကလန် ကျွန်းစု + ဖာရိုး ကျွန်းစုများ + ပြင်သစ် + ယူနိုက်တက်ကင်းဒမ်း + ဂျော်ဂျီယာ + ပြင်သစ် ဂီယာနာ + ဂါနာ + ဂျီဘရော်လ်တာ + ဂရင်းလန်း + ဂန်ဘီရာ + ဂီရာနာ + အီကွေတာ ဂီရာနာ + ဂရိ + တောင် ဂျော်ဂျီယာ နှင့် တောင် ဆင်းဒဝစ်ဂျ် ကျွန်းစုများ + ဂွာတီမာလာ + ဂူအမ် + ဟောင်ကောင် + ဟွန်ဒူးရပ်စ် + ခရိုအေးရှား + ဟေတီ + ဟန်ဂေရီ + အင်ဒိုနီးရှား + အိုင်ယာလန် + အစ္စရေး + အိန္ဒိယ + ဗြိတိသျှ အိန္ဒြိယ သမုဒ္ဒရာ ပိုင်နက် + အီရတ် + အီရန် + အိုက်စလန် + အီတလီ + ဂျာစီ + ဂျမေနီကာ + ဂျော်ဒန် + ဂျပန် + ကင်ညာ + ခယ်ကစ်စတန် + ကမ္ဘောဒီးယား + မြောက်ကိုရီးယား + တောင်ကိုရီးယား + ကူဝိတ် + ကေမန် ကျွန်းစု + ကာဇက်စတန် + လာအို + လက်ဘနွန် + သီရိလင်္ကာ + လိုင်ဘေးရီးယား + လစ်သူယေးနီးယား + လူဇင်ဘတ် + လတ်ဗီးယား + မော်ရိုကို + မိုနကို + မွန်တီနိဂရိုး + စိန့်မာတင် + မဒဂတ်စကာ + မာရှယ် ကျွန်းစု + မာစီဒိုးနီးယား + မာလီ + မြန်မာ + မွန်ဂိုးလီးယား + မကာအို + မော်လဒိုက် + မာလာဝီ + မက္ကဆီကို + မလေးရှား + မိုဇန်ဘစ် + နမ်မီးဘီးယား + နယူး ကယ်လီဒိုနီးယား + နိုင်ဂျာ + နိုင်ဂျီးရီးယား + နီကာရာဂွာ + နယ်သာလန် + နော်ဝေ + နီပေါ + နယူးဇီလန် + အိုမန် + ပနားမား + ပီရူး + ပြင်သစ် ပေါ်လီနေးရှား + ပါပူရာနယူးဂီနီ + ဖိလစ်ပိုင် + ပါကစ္စတန် + ပိုလန် + ပေါ်တူရီကို + ပါလက်စတိုင်း ပိုင်နက် + ပေါ်တူဂီ + ပါရာဂွေး + ကာတာ + ဥရောပသမဂ္ဂ + ရိုမေးနီးယား + ဆားဘီးယား + ရုရှ + ရဝန်ဒါ + ဆော်ဒီအာရေးဗီးယား + ဆော်လမွန်ကျွန်းစု + ဆူဒန် + ဆွီဒင် + စင်္ကာပူ + စလိုဗေးနီးယား + စလိုဗေးကီးယား + ဆီနီဂေါ + ဆိုမာလီယာ + အယ်လ်ဆာဗေးဒိုး + ဆီးရီးယား + ချဒ် + ပြင်သစ် တောင်ပိုင်း ပိုင်နက်များ + ထိုင်း + တာဂျီကစ္စတန် + အရှေ့တီမော + တူနီးရှား + တွန်ဂါ + တူရကီ + ထိုင်ဝမ် + တန်ဇန်နီးယား + ယူကရိန်း + ယူဂန္ဒာ + ယူနိုက်တက်စတိတ် အပြင်ထွက် နေသည့် သေးငယ်သောကျွန်းများ + ယူနိုက်တက်စတိတ် + ဥရုဂွေး + ဥဘက်ကစ္စတန် + ဗာတီကန် + ဗင်နီဇွဲလား + ဗြိတိသျှ ဗာဂျင်း ကျွန်းစု + ယူအက်စ် ဗာဂျင်း ကျွန်းစု + ဗီယက်နမ် + ယီမင် + တောင်အာဖရိက + ဇမ်ဘီယာ + ဇင်ဘာဘွေ + မသိ သို့မဟုတ် မရှိ သော နေရာ + + + ရှေးရိုးစဉ်လာ ဂျာမန် ရေးထုံး + ၁၉၉၆ ဂျာမန် ရေးထုံး + အလယ်ပိုင်းနောက်ကျသောပြင်သစ်မှ ၁၆၀၆ + ၁၆၉၄ACAD + အရှေ့ပိုင်းအာမေးနီးယန်း + ပေါင်းစပ်ထားသော တူရကီ လက်တင်စကားလုံး + IPA အသံထွက် + UPA အသံထွက် + ကွန်ပျူတာ + ပြန်လည်စီစစ်ထားသော ရေးထုံး + စကော့ စံ အင်္ဂလိပ် + + + ပြက္ခဒိန် + စနစ်တကျစီသော + ငွေကြေး + + + ဗုဒ္ဓ ပြက္ခဒိန် + တရုတ် ပြက္ခဒိန် + တိုက်ရိုက်အစဉ် + နိုင်ငံတကာသုံး ပြက္ခဒိန် + ဟီဗရူး ပြက္ခဒိန် + အိန္ဒြိယ အမျိုးသား ပြက္ခဒိန် + အစ္စလာမ် ပြက္ခဒိန် + ဂျပန် ပြက္ခဒိန် + ဖုန်းစာအုပ် အစီအစဉ် + + + အမေရိကန်စနစ် + မက်ထရစ်စနစ် + + + ဘာသာစကား - {0} + စာ - {0} + နယ်ပယ်ဒေသ - {0} + + + + [က-အ ဣ-ဧ ဩ ဪ] + [ံ-း ျ-ှ ာ ါ ိ-ဲ ္ ်] + [a-z] + + + + + + + + + + + နံနက် + + + + + + ဇန် + ဖေ + မတ် + + မေ + ဇွန် + ဇူ + + စက် + အောက် + နို + ဒီ + + + ဇန်နဝါရီ + ဖေဖော်ဝါရီ + မတ် + ဧပြီ + မေ + ဇွန် + ဇူလိုင် + ဩဂုတ် + စက်တင်ဘာ + အောက်တိုဘာ + နိုဝင်ဘာ + ဒီဇင်ဘာ + + + + + + + + + + + + + + + + + + + + + + + နွေ + လာ + ဂါ + ဟူး + တေး + ကြာ + နေ + + + တနင်္ဂနွေ + တနင်္လာ + အင်္ဂါ + ဗုဒ္ဓဟူး + ကြာသပတေး + သောကြာ + စနေ + + + + + + + + + က + + + + + + + + + ပ-စိတ် + ဒု-စိတ် + တ-စိတ် + စ-စိတ် + + + ပထမ သုံးလပတ် + ဒုတိယ သုံးလပတ် + တတိယ သုံးလပတ် + စတုတ္ထ သုံးလပတ် + + + + + ပ-စိတ် + ဒု-စိတ် + တ-စိတ် + စ-စိတ် + + + + ဒု + + + + + ပထမ သုံးလပတ် + ဒုတိယ သုံးလပတ် + တတိယ သုံးလပတ် + စတုတ္ထ သုံးလပတ် + + + + နံနက် + ညနေ + + + ခရစ်တော် မပေါ်မီကာလ + ခရစ်တော် ပေါ်ထွန်းပြီးကာလ + + + ဘီစီ + အေဒီ + + + + + + EEEE, yyyy MMMM dd + + + + + yyyy MMMM d + + + + + yyyy MMM d + + + + + yy/MM/dd + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1} {0} + + + + H:mm + L + E, M-d + LLL + E MMM d + E MMMM d + MMMM d + MMM d + M-d + d + mm:ss + yyyy + yyyy-M + EEE, yyyy-M-d + yyyy MMM + EEE, yyyy MMM d + yyyy MMMM + yyyy Q + yyyy QQQ + Q yy + + + {0} – {1} + + M-M + + + EEEE၊ d/M – EEEE၊ d/M + EEEE၊ d/M – EEEE၊ d/M + + + MMM d၊ EEEE – MMM d၊ EEEE + MMM d၊ EEEE – MMM d၊ EEEE + + + d/M – d/M + d/M – d/M + + + d-d + + + HH-HH + HH-HH + + + HH:mm-HH:mm + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH-HH v + HH-HH v + + + y-y + + + EEEE၊ d/M/yy – EEEE၊ d/M/yy + EEEE၊ d/M/yy – EEEE၊ d/M/yy + EEEE၊ d-M-yyyy – EEEE၊ d-M-yyyy + + + yyyy၊ MMM d၊ EEEE – MMM d၊ EEEE + yyyy၊ MMM d၊ EEEE – MMM d၊ EEEE + yyyy၊ MMM d၊ EEEE – yyyy၊ MMM d၊ EEEE + + + yyyy၊ MMM d – MMM d + yyyy MMM d – yyyy MMM d + + + d/M/yy – d/M/yy + d/M/yy – d/M/yy + d/M/yy – d/M/yy + + + + + + ခေတ် + + + နှစ် + + + + + + ပတ် + + + ရက် + ယနေ့ + မနက်ဖြန် + သဘက်ခါ + မနေ့က + တနေ့က + + + နေ့ + + + နံနက်/ညနေ + + + နာရီ + + + မိနစ် + + + စက္ကန့် + + + ဇုန် + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} အချိန် + + မသိသော + + + ရီယို ဗြန်ကို + + + ကိမ်ပို ဂရန်ဒ + + + ဆာပိုလို + + + ဟိုနိုလူလူ + + + အန်ကာရေ့ဂျ် + + + လော့စ်အိန်ဂျယ်လိစ် + + + ဖီးနစ် + + + ဒင်ဗာ + + + ချီကာကို + + + အင်ဒီယားနားပိုလစ် + + + နယူးယောက် + + + + အာဖဂန်နစ္စတန် အချိန် + + + + + အလယ်ပိုင်း အာဖရိက အချိန် + + + + + အရှေ့ပိုင်း အာဖရိက အချိန် + + + + + တောင်အာဖရိက အချိန် + တောင်အာဖရိက စံတော်ချိန် + + + + + အနောက်ပိုင်း အာဖရိက အချိန် + အနောက်ပိုင်း အာဖရိက နွေရာသီ အချိန် + + + + false + + + + အလယ်ပိုင်း အမေရိက အချိန် + အလယ်ပိုင်း အမေရိက စံတော်ချိန် + အလယ်ပိုင်း အမေရိက နွေရာသီ အချိန် + + false + + + + အရှေ့ပိုင်း အမေရိက အချိန် + အရှေ့ပိုင်း အမေရိက စံတော်ချိန် + အရှေ့ပိုင်း အမေရိက အချိန် + + false + + + + အမေရိက တောင် အချိန် + အမေရိက တောင် စံတော်ချိန် + အမေရိက တောင် နေ့ပိုင်း အချိန် + + false + + + + ပစိဖိတ် အချိန် + ပစိဖိတ် စံတော်ချိန် + ပစိဖိတ် နေ့ပိုင်း အချိန် + + false + + + + အာရေဗျ အချိန် + အာရေဗျ စံတော်ချိန် + အာရေဗျ နေ့ပိုင်း အချိန် + + + + + အာဂျင်တီးနား အချိန် + အာဂျင်တီးနား နွေရာသီ အချိန် + + + + + အနောက် အာဂျင်တီးနား အချိန် + + + + + အာမေနီးယား အချိန် + အာမေနီးယား နွေရာသီ အချိန် + + + + + အတ္ထလန်တစ် အချိန် + အတ္ထလန်တစ် စံတော်ချိန် + အတ္ထလန်တစ် နေ့ပိုင်း အချိန် + + false + + + + အလယ်ဩစတြေးလျှား အချိန် + အလယ်ပိုင်း ဩစတြေးလျှား စံတော်ချိန် + အလယ်ပိုင်း ဩစတြေးလျှား နေ့ပိုင်း အချိန် + + + + + အလယ်အနောက်ပိုင်း ဩစတြေးလျှား အချိန် + အလယ်အနောက်ပိုင်း ဩစတြေးလျှား စံတော်ချိန် + အလယ်အနောက်ပိုင်း ဩစတြေးလျှား နေ့ပိုင်း အချိန် + + + + + အရှေ့ဩစတြေးလျှား အချိန် + အရှေ့ပိုင်း ဩစတြေးလျှား စံတော်ချိန် + အရှေ့ပိုင်း ဩစတြေးလျှား နေ့ပိုင်း အချိန် + + + + + အနောက် ဩစတြေးလျှား အချိန် + အနောက်ပိုင်း ဩစတြေးလျှား စံတော်ချိန် + အနောက်ပိုင်း ဩစတြေးလျှား နေ့ပိုင်း အချိန် + + + + + အဇာဘိုင်ဂျန် အချိန် + အဇာဘိုင်ဂျန် နွေရာသီ အချိန် + + + + + ဘင်္ဂလားဒေ့ရှ် အချိန် + + + + + ဘူတန် အချိန် + + + + + ဘိုလီးဘီးယား အချိန် + + + + + ဘရာဇီး အချိန် + ဘရာဇီး နွေရာသီ အချိန် + + + + + ဗြိတိသျှ အချိန် + ဗြိတိသျှ နွေရာသီ အချိန် + + + + + ဘရူနိုင်း စံတော်ချိန် + + + + + ချီလီ အချိန် + ချီလီ နွေရာသီ အချိန် + + + + + တရုတ် အချိန် + တရုတ် စံတော်ချိန် + တရုတ် နေ့ပိုင်း အချိန် + + + + + ကိုလံဘီယာ အချိန် + ကိုလံဘီယာ နွေရာသီ အချိန် + + + + + ကျူးဘား အချိန် + ကျူးဘား စံတော်ချိန် + ကျူးဘား နွေရာသီ အချိန် + + + + + ဒတ်ချ် ဂီယာနာ အချိန် + + + + + အရှေ့တီမော အချိန် + + + + + အီကွေဒေါ အချိန် + + + + + ပြင်သစ် အချိန် + ဥရောပ အလယ်ပိုင်း အချိန် + ဥရောပ အလယ်ပိုင်း နွေရာသီ အချိန် + + + + + ရိုမေးနီးယား အချိန် + အရှေ့ဥရောပ အချိန် + အရှေ့ဥရောပ နွေရာသီ အချိန် + + + + + အနောက်ပိုင်း ဥရောပ အချိန် + အနောက်ပိုင်း ဥရောပ နွေရာသီ အချိန် + + false + + + + ဖောင်ကလန်ကျွန်းစု အချိန် + ဖောင်ကလန်ကျွန်းစု နွေရာသီ အချိန် + + + + + ပြင်သစ် ဂီယာနာ အချိန် + + + + + ဂရင်းနစ် စံတော်ချိန် + + + + + ဂျော်ဂျီယာ အချိန် + ဂျော်ဂျီယာ နွေရာသီ အချိန် + + + + + အလယ်ဂရင်းလန်း အချိန် + အလယ်ဂရင်းလန်း နွေရာသီ အချိန် + + + + + အရှေ့ဂရင်းလန်း အချိန် + အရှေ့ဂရင်းလန်း နွေရာသီ အချိန် + + + + + အနောက် ဂရင်းလန်း အချိန် + အနောက် ဂရင်းလန်း နွေရာသီ အချိန် + + + + + ပင်လယ်ဂွေ့ အချိန် + ပင်လယ်ဂွေ့ စံတော်ချိန် + + + + + ဟောင်ကောင် အချိန် + ဟောင်ကောင် နွေရာသီ အချိန် + + + + + အိန္ဒြိယ စံတော်ချိန် + + + + + အိန္ဒြိယ သမုဒ္ဒရာ အချိန် + + + + + အင်ဒိုချိုင်းနား အချိန် + + + + + အလယ်ပိုင်း အင်ဒိုနီးရှား အချိန် + + + + + အရှေ့ပိုင်း အင်ဒိုနီးရှား အချိန် + + + + + အနောက်ပိုင်း အင်ဒိုနီးရှား အချိန် + + + + + အီရန် စံတော်ချိန် + အီရန် နေ့ပိုင်း အချိန် + + + + + အိုင်ယာလန် အချိန် + + + + + အစ္စရေး အချိန် + အစ္စရေး စံတော်ချိန် + အစ္စရေး နေ့ပိုင်း အချိန် + + + IST (အစ္စရေး) + + + + + ဂျပန် အချိန် + ဂျပန် စံတော်ချိန် + ဂျပန် နေ့ပိုင်း အချိန် + + + + + အရှေ့ကာဇက်စတန် အချိန် + အရှေ့ကာဇက်စတန် စံတော်ချိန် + + + + + ကိုးရီးယား အချိန် + ကိုးရီးယား စံတော်ချိန် + ကိုးရီးယား နေ့ပိုင်း အချိန် + + + + + သီရိလင်္ကာ အချိန် + + + + + မကာအို အချိန် + မကာအို နွေရာသီ အချိန် + + + + + မလေးရှား အချိန် + + + + + မော်စကို အချိန် + မော်စကို စံတော်ချိန် + မော်စကို နွေရာသီ အချိန် + + + + + မြန်မာ အချိန် + + true + + + + နီပေါ အချိန် + + + + + နယူးဇီလန် အချိန် + နယူးဇီလန် စံတော်ချိန် + နယူးဇီလန် နေ့ပိုင်း အချိန် + + + + + နယူးဖောင်လန် အချိန် + နယူးဖောင်လန် စံတော်ချိန် + နယူးဖောင်လန် နေ့ပိုင်း အချိန် + + + + + ပါကစ္စတန် အချိန် + ပါကစ္စတန် နွေရာသီ အချိန် + + + + + ပါပူရာနယူးဂီနီ အချိန် + + + + + ပါရာဂွေး အချိန် + ပါရာဂွေး နွေရာသီ အချိန် + + + + + ပီရူး အချိန် + ပီရူး နွေရာသီ အချိန် + + + + + ဖိလစ်ပိုင် အချိန် + ဖိလစ်ပိုင် နွေရာသီ အချိန် + + + + + စင်္ကာပူ စံတော်ချိန် + + + + + တောင်ဂျော်ဂျီယာ အချိန် + + + + + တူရကီ စံတော်ချိန် အချိန် + တူရကီ နွေရာသီ အချိန် + + + + + ဥရုဂွေး အချိန် + ဥရုဂွေး နွေရာသီ အချိန် + + + + + ဥဘက်ကစ္စတန် အချိန် + ဥဘက်ကစ္စတန် နွေရာသီ အချိန် + + + + + ဗင်နီဇွဲလား အချိန် + + + + + + + . + , + + + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + ¤ #,##0.00 + + + + + + နယ်သာလန် အန်တီလန် ဂင်းဒါး + + + အာဂျင်တီးနား ပီဆို (၁၉၈၃-၁၉၈၅) + + + အာဂျင်တီးနား ပီဆို + + + ဩစတြေးလျှား ဒေါ်လာ + + + အရူဘန် ဂင်းဒါး + + + ဘင်္ဂလားဒေ့ရှ် တာကာ + + + ဘယ်လ်ဂျီယမ် ဖရန့် + + + ဘူရွန်ဒီ ဖရန့် + + + ဘာမူဒါ ဒေါ်လာ + + + ဘရူနိုင်း ဒေါ်လာ + + + ဘိုလီးဘီးယား ပီဆို + + + ဘရာဇီး ရီးယဲ + + + ဘဟားမား ဒေါ်လာ + + + ဗမာ ကျပ် + + + ဘော့စ်ဝါနာ ပုလ + + + ဘီလာရုစ် ရူဘယ်အသစ် (၁၉၉၄-၁၉၉၉) + + + ဘီလာရုစ် ရူဘယ် + + + ဘေလီဇ် ဒေါ်လာ + + + ကနေဒါ ဒေါ်လာ + + + ဆွစ် ဖရန့် + + + ချီလီ ပီဆို + + + တရုတ် ယွမ် + + + ကိုလံဘီယာ ပီဆို + + + ကျူးဘား ပီဆို + + + ဆိုက်ပရက်စ် ပေါင် + + + ဂျာမဏီ မတ် + + + ဒိန်းမတ် ခရိုဏာ + + + ဒိုမီနီကန် ပီဆို + + + အီဂျစ် ပေါင် + + + စပိန် ပယ်စေးတာ + + + ယူရို + + + ဖီဂျီ ဒေါ်လာ + + + ဖောက်ကလန် ကျွန်းစု ပေါင် + + + ပြင်သစ် ဖရန့် + + + ဗြိတိသျှ ပေါင် + + + ဂျီဘရော်လ်တာ ပေါင် + + + ဂီရာနာ ဖရန့် + + + ဟောင်ကောင် ဒေါ်လာ + + + အင်ဒိုနီးရှား ရူပီးယား + + + အစ္စရေး ပေါင် + + + အိန္ဒြိယ ရူပီး + + + ဂျမေနီကာ ဒေါ်လာ + + + ဂျပန်ယန်း + + + ကမ္ဘောဒီးယား ရီးယဲ + + + မြောက်ကိုးရီးယား ဝမ် + + + တောင်ကိုးရီးယား ဝမ် + + + ကေမန် ကျွန်းစု ဒေါ်လာ + + + လက်ဘနွန် ပေါင် + + + သီရိလင်္ကာ ရူပီး + + + လိုင်ဘေးရီးယား ဒေါ်လာ + + + မြန်မာ ကျပ် + K + + + မက္ကဆီကို ပီဆို + + + မလေးရှား ရင်းဂစ် + + + နမ်မီးဘီးယား ဒေါ်လာ + + + နော်ဝေ ခရိုဏာ + + + နီပေါ ရူပီး + + + နယူးဇီလန် ဒေါ်လာ + + + ဖိလစ်ပိုင် ပီဆို + + + ပါကစ္စတန် ရူပီး + + + ပိုလန် ဇ‌လော့တီ + + + ရုရှ ရူဘယ် + + + ရုရှ ရူဘယ် (၁၉၉၁-၁၉၉၈) + + + ရဝန်ဒါ ဖရန့် + + + ဆော်လမွန်ကျွန်းစု ဒေါ်လာ + + + ဆူဒန် ပေါင် + + + ဆူဒန် ပေါင်အဟောင်း + + + ဆွီဒင် ခရိုဏာ + + + စင်္ကာပူ ဒေါ်လာ + + + ဆူရိနမ် ဒေါ်လာ + + + ဆိုဗီယက် ရူဗယ် + + + ထိုင်းဘတ် + + + ရှေးဟောင်းတူရကီ လိုင်ရာ + + + တူရကီ လိုင်ရာ + + + ထိုင်ဝမ် ဒေါ်လာအသစ် + + + အမေရိကန် ဒေါ်လာ + + + အမေရိကန် ဒေါ်လာ (နောက်နေ့) + + + အမေရိကန် ဒေါ်လာ (တနေ့တည်း) + + + ဗီယက်နမ် ဒေါင် + + + ငွေ + + + ရွှေ + + + ဥရောပငွေကြေးစံနစ် + + + အထူးထုတ်ယူခွင့် + + + CFA ဖရန့် BCEAO + + + ပလက်တီနမ် + + + စမ်းသပ် ငွေကြေး ကုဒ် + + + မသိ သို့မဟုတ် မရှိသော ငွေကြေး + + + ဇင်ဘာဘွေ ဒေါ်လာ + + + + + + {0} ရက် + + + {0} နာရီ + + + {0} မိနစ် + + + {0} လ + + + {0} စက္ကန့် + + + {0} ပတ် + + + {0} နှစ် + + + + + ဟုတ်တယ် + မဟုတ်ဘူး + + + + diff --git a/libs/Zend/Locale/Data/my_MM.xml b/libs/Zend/Locale/Data/my_MM.xml new file mode 100644 index 0000000..e7630f1 --- /dev/null +++ b/libs/Zend/Locale/Data/my_MM.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/nb.xml b/libs/Zend/Locale/Data/nb.xml new file mode 100644 index 0000000..c8190ff --- /dev/null +++ b/libs/Zend/Locale/Data/nb.xml @@ -0,0 +1,2652 @@ + + + + + + + + + + + {0} ({1}) + , + + + afar + abkhasisk + achinesisk + acoli + adangme + adyghe + avestisk + afrikaans + afroasiatisk språk + afrihili + ainu + akan + akkadisk + aleutisk + algonkinsk språk + søraltaisk + amharisk + aragonsk + gammelengelsk + angika + apachespråk + arabisk + arameisk + araukansk + arapaho + kunstig språk + arawak + assamisk + asturisk + athapaskansk språk + australsk språk + avarisk + awadhi + aymara + aserbajdsjansk + basjkirsk + banda + bamilekisk språk + baluchi + balinesisk + basa + baltisk språk + hviterussisk + beja + bemba + berbisk + bulgarsk + bihari + bhojpuri + bislama + bikol + bini + siksika + bambara + bengali + bantu + tibetansk + bretonsk + braj + bosnisk + batak + buriat + buginesisk + blin + katalansk + caddo + sentralamerikansk indiansk språk + karibisk + kaukasisk språk + atsam + tsjetsjensk + cebuansk + keltisk språk + chamorro + chibcha + chagatai + chuukesisk + mari + chinook + choctaw + chipewiansk + cherokee + cheyenne + kamisk språk + korsikansk + koptisk + engelskbasert kreol- eller pidginspråk + franskbasert kreol- eller pidginspråk + portugisiskbasert kreol- eller pidginspråk + cree + krimtatarisk + kreol- eller pidginspråk + tsjekkisk + kasjubisk + kirkeslavisk + kusjitisk språk + tsjuvansk + walisisk + dansk + dakota + dargwa + dayak + tysk + østerriksk tysk + sveitsisk høytysk + delaware + slavisk + dogrib + dinka + dogri + dravidisk språk + lavsorbisk + duala + mellomnederlandsk + divehi + dyula + dzongkha + ewe + efik + gammelegyptisk + ekajuk + gresk + elamittisk + engelsk + australsk engelsk + canadisk engelsk + britisk engelsk + amerikansk engelsk + mellomengelsk + esperanto + spansk + latinamerikansk spansk + iberisk spansk + estisk + baskisk + ewondo + persisk + fang + fanti + fulani + finsk + filippinsk + finsk-ugrisk språk + fijiansk + færøysk + fon + fransk + canadisk fransk + sveitsisk fransk + mellomfransk + gammelfransk + nordfrisisk + østfrisisk + friuliansk + vestfrisisk + irsk + ga + gayo + gbaya + skotsk gælisk + germansk språk + ges + kiribatisk + galisisk + mellomhøytysk + guarani + gammelhøytysk + gondi + gorontalo + gotisk + grebo + gammelgresk + sveitsertysk + gujarati + manx + gwichin + hausa + haida + hawaiisk + hebraisk + hindi + hiligaynon + himachali + hettittisk + hmong + hiri motu + kroatisk + høysorbisk + haitisk + ungarsk + hupa + armensk + herero + interlingua + iban + indonesisk + interlingue + ibo + sichuan-yi + ijo + inupiak + iloko + indisk språk + indoeuropeisk språk + ingusjisk + ido + iransk + irokansk språk + islandsk + italiensk + inuktitut + japansk + lojban + jødepersisk + jødearabisk + javanesisk + georgisk + karakalpakisk + kabylsk + kachin + jju + kamba + karensk + kawi + kabardisk + tyap + koro + kikongo + khasi + khoisanspråk + khotanesisk + kikuyu + kuanyama + kasakhisk + grønlandsk + khmer + kimbundu + kannada + koreansk + konkani + kosraeansk + kpelle + kanuri + karachay-balkar + karelsk + kru + kurukh + kasjmiri + kurdisk + kumyk + kutenai + komi + kornisk + kirgisisk + latin + ladinsk + lahnda + lamba + luxemburgsk + lezghian + ganda + limburgisk + lingala + laotisk + mongo + lozi + litauisk + luba-katanga + luba-lulua + luiseno + lunda + luo + lushai + latvisk + maduresisk + magahi + maithili + makasar + mandingo + austronesisk + masai + moksha + mandar + mende + madagassisk + mellomirsk + marshallesisk + maori + micmac + minangkabau + annet språk + makedonsk + mon-khmerspråk + malayalam + mongolsk + mandsju + manipuri + manobospråk + moldavisk + mohawk + mossi + marathi + malayisk + maltesisk + flere språk + mundaspråk + creek + mirandesisk + marwari + burmesisk + mayaspråk + erzya + nauru + nahuatl + nordamerikansk indiansk språk + napolitansk + norsk bokmål + nord-ndebele + lavtysk + nepalsk + newari + ndonga + nias + niger-kordofiansk språk + niueansk + nederlandsk + flamsk + norsk nynorsk + norsk + nogai + gammelnorsk + nkå + sør-ndebele + nord-sotho + nubisk språk + navajo + klassisk newari + nyanja + nyamwezi + nyankole + nyoro + nzima + oksitansk + ojibwa + oromo + oriya + ossetisk + osage + ottomansk tyrkisk + otomisk språk + panjabi + papuisk språk + pangasinan + pahlavi + pampanga + papiamento + palauisk + gammelpersisk + filippinsk språk + fønikisk + pali + polsk + ponapisk + prakritspråk + gammelprovençalsk + pashto + portugisisk + brasiliansk portugisisk + iberisk portugisisk + quechua + rajasthani + rapanui + rarotongansk + retoromansk + rundi + rumensk + romansk språk + romani + rot + russisk + aromansk + kinjarwanda + sanskrit + sandawe + jakutsk + søramerikansk indiansk språk + salishansk språk + samaritansk arameisk + sasak + santali + sardinsk + siciliansk + skotsk + sindhi + nordsamisk + selkupisk + semittisk språk + sango + gammelirsk + tegnspråk + serbokroatisk + shan + singalesisk + sidamo + siouxspråk + sino-tibetansk språk + slovakisk + slovensk + slavisk språk + samoansk + sørsamisk + samisk språk + lulesamisk + enaresamisk + skoltesamisk + shona + soninke + somali + sogdisk + songhai + albansk + serbisk + sranan tongo + serer + swati + nilo-saharaspråk + sør-sotho + sundanesisk + sukuma + susu + sumerisk + svensk + swahili + klassisk syrisk + syrisk + tamil + taispråk + telugu + temne + tereno + tetum + tadsjikisk + thai + tigrinja + tigré + tiv + turkmensk + tokelau + tagalog + klingon + tlingit + tamasjek + setswana + tongansk + nyasa-tongansk + tok pisin + tyrkisk + tsonga + tsimshian + tatarisk + tumbuka + tupispråk + altaisk språk + tuvalu + twi + tahitisk + tuvinisk + udmurt + uigurisk + ugaritisk + ukrainsk + umbundu + ukjent eller ugyldig språk + urdu + usbekisk + vai + venda + vietnamesisk + volapyk + votisk + vallonsk + wakasjansk språk + walamo + waray + washo + sorbisk språk + wolof + kalmyk + xhosa + yao + yapesisk + jiddisk + joruba + jupisk språk + zhuang + zapotec + blissymboler + zenaga + kinesisk + forenklet kinesisk + tradisjonell kinesisk + zande + zulu + zuni + uten språklig innhold + zaza + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + verden + Afrika + Nord-Amerika + Sør-Amerika + Oseania + Vest-Afrika + Sentral-Amerika + Øst-Afrika + Nord-Afrika + Sentral-Afrika + Sørlige Afrika + Amerika + Nordlige Amerika + Karibia + Øst-Asia + Sør-Asia + Sørøst-Asia + Sør-Europa + Australia og New Zealand + Melanesia + Mikronesia + Polynesia + Sørsentral-Asia + Asia + Sentral-Asia + Vest-Asia + Europa + Øst-Europa + Nord-Europa + Vest-Europa + Samveldet av uavhengige stater + Latin-Amerika og Karibia + Andorra + De forente arabiske emirater + Afghanistan + Antigua og Barbuda + Anguilla + Albania + Armenia + De nederlandske antiller + Angola + Antarktis + Argentina + Amerikansk Samoa + Østerrike + Australia + Aruba + Åland + Aserbajdsjan + Bosnia-Hercegovina + Barbados + Bangladesh + Belgia + Burkina Faso + Bulgaria + Bahrain + Burundi + Benin + Saint Barthélemy + Bermuda + Brunei Darussalam + Bolivia + Brasil + Bahamas + Bhutan + Bouvetøya + Botswana + Hviterussland + Belize + Canada + Kokosøyene + Kongo-Kinshasa + Den sentralafrikanske republikk + Kongo-Brazzaville + Sveits + Elfenbenskysten + Cookøyene + Chile + Kamerun + Kina + Colombia + Costa Rica + Serbia og Montenegro + Cuba + Kapp Verde + Christmasøya + Kypros + Tsjekkia + Tyskland + Djibouti + Danmark + Dominica + Den dominikanske republikk + Algerie + Ecuador + Estland + Egypt + Vest-Sahara + Eritrea + Spania + Etiopia + Finland + Fiji + Falklandsøyene + Mikronesiaføderasjonen + Færøyene + Frankrike + Gabon + Storbritannia + Grenada + Georgia + Fransk Guyana + Guernsey + Ghana + Gibraltar + Grønland + Gambia + Guinea + Guadeloupe + Ekvatorial-Guinea + Hellas + Sør-Georgia og de sørlige Sandwich-øyene + Guatemala + Guam + Guinea-Bissau + Guyana + Hongkong + Heardøya og McDonaldøyene + Honduras + Kroatia + Haiti + Ungarn + Indonesia + Irland + Israel + Man + India + Britiske territorier i Indiahavet + Irak + Iran + Island + Italia + Jersey + Jamaica + Jordan + Japan + Kenya + Kirgisistan + Kambodsja + Kiribati + Komorene + St. Kitts og Nevis + Nord-Korea + Sør-Korea + Kuwait + Caymanøyene + Kasakhstan + Laos + Libanon + St. Lucia + Liechtenstein + Sri Lanka + Liberia + Lesotho + Litauen + Luxembourg + Latvia + Libya + Marokko + Monaco + Moldova + Montenegro + Saint Martin + Madagaskar + Marshalløyene + Makedonia + Mali + Myanmar + Mongolia + Macao + Nord-Marianene + Martinique + Mauritania + Montserrat + Malta + Mauritius + Maldivene + Malawi + Mexico + Malaysia + Mosambik + Namibia + Ny-Caledonia + Niger + Norfolkøya + Nigeria + Nicaragua + Nederland + Norge + Nepal + Nauru + Niue + New Zealand + Oman + Panama + Peru + Fransk Polynesia + Papua Ny-Guinea + Filippinene + Pakistan + Polen + St. Pierre og Miquelon + Pitcairn + Puerto Rico + Palestinsk territorium + Portugal + Palau + Paraguay + Qatar + avsidesliggende Oceania + Den europeiske union + Reunion + Romania + Serbia + Russland + Rwanda + Saudi-Arabia + Salomonøyene + Seychellene + Sudan + Sverige + Singapore + St. Helena + Slovenia + Svalbard og Jan Mayen + Slovakia + Sierra Leone + San Marino + Senegal + Somalia + Surinam + São Tomé og Príncipe + El Salvador + Syria + Swaziland + Turks- og Caicosøyene + Tsjad + De franske sørterritorier + Togo + Thailand + Tadsjikistan + Tokelau + Øst-Timor + Turkmenistan + Tunisia + Tonga + Tyrkia + Trinidad og Tobago + Tuvalu + Taiwan + Tanzania + Ukraina + Uganda + USAs ytre småøyer + USA + Uruguay + Usbekistan + Vatikanstaten + St. Vincent og Grenadinene + Venezuela + De britiske jomfruøyene + De amerikanske jomfruøyene + Vietnam + Vanuatu + Wallis og Futuna + Samoa + Jemen + Mayotte + Sør-Afrika + Zambia + Zimbabwe + ukjent eller ugyldig område + + + tradisjonell tysk ortografi + tysk ortografi fra 1996 + øst-armensk + vest-armensk + boontling + det internasjonale fonetiske alfabet (IPA) + det uraliske fonetiske alfabet (UPA) + monotonisk rettskriving + polytonisk rettskriving + revidert rettskriving + resisk dialekt + saaho dialekt + skotsk standard engelsk + scouse dialekt + valensisk dialekt + + + kalender + kollasjon + valuta + + + tradisjonell kinesisk sortering + buddhistisk kalender + kinesisk kalender + direkte sortering + forenklet kinesisk sortering + gregoriansk kalender + hebraisk kalender + indisk nasjonalkalender + islamsk kalender + islamsk sivil kalender + japansk kalender + telefonkatalogsortering + pinyinsortering + kalender for Republikken Kina + streksortering + tradisjonell sortering + + + amerikansk + metrisk + + + Språk: {0} + Skrift: {0} + Område: {0} + + + + [a à b-e é f-o ó ò ô p-z æ ø å] + [á ǎ ã č ç đ è ê í ń ñ ŋ š ŧ ü ž ä ö] + [a-z] + + + + + + + + + {0}–{1} + + + + + + EEEE d. MMMM yyyy G + + + + + d. MMMM yyyy G + + + + + d. MMM yyyy G + + + + + d.M yyyy + + + + + + + HH.mm.ss v + + + + + + + + + jan. + feb. + mars + apr. + mai + juni + juli + aug. + sep. + okt. + nov. + des. + + + januar + februar + mars + april + mai + juni + juli + august + september + oktober + november + desember + + + + + J + F + M + A + M + J + J + A + S + O + N + D + + + + + + + søn. + man. + tir. + ons. + tor. + fre. + lør. + + + søndag + mandag + tirsdag + onsdag + torsdag + fredag + lørdag + + + + + S + M + T + O + T + F + L + + + + + + + K1 + K2 + K3 + K4 + + + 1. kvartal + 2. kvartal + 3. kvartal + 4. kvartal + + + + + 1 + 2 + 3 + 4 + + + + formiddag + ettermiddag + + + f.Kr. + e.Kr. + + + f.Kr. + e.Kr. + + + + + + EEEE d. MMMM yyyy + + + + + d. MMMM yyyy + + + + + d. MMM yyyy + + + + + dd.MM.yy + + + + + + + 'kl'. HH.mm.ss v + + + + + HH.mm.ss z + + + + + HH.mm.ss + + + + + HH.mm + + + + + + + {1} {0} + + + + HH.mm + HH.mm.ss + HH.mm + L + E d.M + LLL + E d. MMM + E d. MMMM + d. MMMM + d. MMM + dd.MM + d.M. + d. + mm.ss + mm.ss + yyyy + M yyyy + EEE d.M.yyyy + MMM yyyy + EEE d. MMM yyyy + MMMM yyyy + Q yyyy + QQQ yyyy + MM.yy + MMM yy + Q yy + QQQQ yy + MMMM yyyy + + + {0}–{1} + + M.–M. + + + E dd.MM.–E dd.MM. + E dd.MM.–E dd.MM. + + + MMM–MMM + + + E d. MMM–E d. MMM + E d.–E d. MMM + + + LLLL–LLLL + + + d. MMM–d. MMM + d.–d. MMM + + + dd.MM.–dd.MM. + dd.MM.–dd.MM. + + + d.–d. + + + HH–HH + HH–HH + + + HH.mm–HH.mm + HH.mm–HH.mm + HH.mm–HH.mm + + + HH.mm–HH.mm v + HH.mm–HH.mm v + HH.mm–HH.mm v + + + HH–HH v + HH–HH v + + + y–y + + + MM.yy–MM.yy + MM.yy–MM.yy + + + E dd.MM.yy–E dd.MM.yy + E dd.MM.yy–E dd.MM.yy + E dd.MM.yy–E dd.MM.yy + + + MMM–MMM yyyy + MMM yyyy–MMM yyyy + + + E d. MMM–E d. MMM yyyy + E d.–E d. MMM yyyy + E d. MMM yyyy–E d. MMM yyyy + + + MM–MM yyyy + MM yyyy–MM yyyy + + + d. MMM–d. MMM yyyy + d.–d. MMM yyyy + d. MMM yyyy–d. MMM yyyy + + + dd.MM.yy–dd.MM.yy + dd.MM.yy–dd.MM.yy + dd.MM.yy–dd.MM.yy + + + + + + tidsalder + + + år + + + måned + + + uke + + + dag + i dag + i morgen + i overmorgen + om tre dager + i går + i forgårs + for tre dager siden + + + ukedag + + + AM/PM + + + time + + + minutt + + + sekund + + + sone + + + + + + +HH.mm;-HH.mm + GMT{0} + {0} + {1} ({0}) + + Ukjent + + + Tirana + + + Jerevan + + + Curaçao + + + Sydpolen + + + Dumont D'Urville + + + Wien + + + Brussel + + + Porto Novo + + + Cuiabá + + + Belém + + + Araguaína + + + São Paulo + + + Maceió + + + Thimpu + + + Kokosøyene + + + Zürich + + + Påskeøya + + + Bogotá + + + Kapp Verde + + + Christmasøya + + + København + + + Alger + + + Galápagos + + + Kairo + + + El Aaiún + + + Asmara + + + Kanariøyene + + + Addis Abeba + + + Pohnpei + + + Færøyene + + + Godthåb + + + Athen + + + Sør-Georgia + + + Jajapura + + + Bagdad + + + Teheran + + + Roma + + + Bisjkek + + + Komorene + + + St. Kitts + + + Caymanøyene + + + St. Lucia + + + Luxemburg + + + Ulan Bator + + + Maldivene + + + Mexico by + + + Warszawa + + + Azorene + + + Lisboa + + + Asunción + + + Réunion + + + Bucuresti + + + Moskva + + + Jekaterinburg + + + Krasnojarsk + + + Jakutsk + + + St. Helena + + + São Tomé + + + Salvador + + + Damaskus + + + Dusjanbe + + + Asjkhabad + + + Dar-es-Salaam + + + Uzjhorod + + + Zaporozje + + + Alaska + + + Center, Nord-Dakota + + + Tasjkent + + + St. Vincent + + + St. Thomas + + + + Acre sommertid + + + + + sentralafrikansk tid + + + + + østafrikansk tid + + + + + sørafrikansk normaltid + + + + + vestafrikansk tid + vestafrikansk sommertid + + + + + Amazonas sommertid + + + + + arabisk tid + arabisk standardtid + arabisk sommertid + + + AT (arabisk) + AST (arabisk) + ADT (arabisk) + + + + + sentralaustralsk tid + sentralaustralsk standardtid + sentralaustralsk sommertid + + + + + vest-sentralaustralsk tid + vest-sentralaustralsk standardtid + vest-sentralaustralsk sommertid + + + + + østaustralsk tid + østaustralsk standardtid + østaustralsk sommertid + + + + + vestaustralsk tid + vestaustralsk standardtid + vestaustralsk sommertid + + + + + Brasilia sommertid + + + + + kinesisk standardtid + + + CST (Kina) + + + + + sentraleuropeisk normaltid + sentraleuropeisk sommertid + + + + + østeuropeisk normaltid + østeuropeisk sommertid + + + + + vesteuropeisk tid + vesteuropeisk sommertid + + + + + Greenwich middeltid + + + + + Hong Kong-tid + Hong Kong-sommertid + + + + + indisk standardtid + + + + + indokinesisk tid + + + + + sentralindonesisk tid + + + + + østindonesisk tid + + + + + vestindonesisk tid + + + + + israelsk standardtid + israelsk sommertid + + + IST (Israel) + + + + + japansk standardtid + + + + + koreansk standardtid + + + + + Moskva normaltid + Moskva sommertid + + + + + newzealandsk tid + newzealandsk standardtid + newzealandsk sommertid + + + + + + + , +   + ; + % + 0 + # + + + - + E + + + NaN + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0 % + + + + + + + ¤ #,##0.00 + + + {0} {1} + {0} {1} + + + + andorranske pesetas + + + UAE dirham + + + afghani (1927-2002) + + + afghani + + + albanske lek + + + armenske dram + + + nederlandske antillegylden + + + angolanske kwanza + + + angolanske kwanza (1977-1990) + + + angolanske nye kwanza (1990-2000) + + + angolanske kwanza reajustado (1995-1999) + + + argentinske australer + + + argentinske pesos (1983-1985) + + + argentinske pesos + + + østerrikske shilling + østerrikske schilling + + + australske dollar + + + arubiske gylden + + + aserbajdsjanske manat (1993-2006) + + + aserbajdsjanske manat + + + bosnisk-hercegovinske dinarer + + + bosnisk-hercegovinske mark (konvertible) + + + barbadiske dollar + + + bangladeshiske taka + + + belgiske franc (konvertible) + + + belgiske franc + + + belgiske franc (finansielle) + + + bulgarske lev (hard) + lev + + + bulgarske lev + + + bahrainske dinarer + + + burundiske franc + + + bermudiske dollar + + + bruneiske dollar + + + boliviano + + + bolivianske pesos + + + bolivianske mvdol + boliviansk mvdol + + + brasilianske cruzeiro novo (1967-1986) + + + brasilianske cruzado + + + brasilianske cruzeiro (1990-1993) + + + brasilianske realer + BRL + + + brasilianske cruzado novo + + + brasilianske cruzeiro + + + bahamske dollar + + + bhutanske ngultrum + + + burmesiske kyat + + + botswanske pula + + + hviterussiske nye rubler (1994-1999) + + + hviterussiske rubler + + + beliziske dollar + + + kanadiske dollar + + + kongolesiske franc (congolais) + + + WIR euro + + + sveitsiske franc + + + WIR franc + + + chilenske unidades de fomento + + + chilenske pesos + + + kinesiske yuan renminbi + + + colombianske pesos + + + unidad de valor real + + + costaricanske colon + + + gamle serbiske dinarer + + + tsjekkoslovakiske koruna (hard) + + + kubanske pesos + + + kappverdiske escudo + + + kypriotiske pund + + + tsjekkiske koruna + + + østtyske ostmark + + + tyske mark + + + djiboutiske franc + + + danske kroner + + + dominikanske pesos + + + algeriske dinarer + + + ecuadorianske sucre + + + ecuadorianske unidad de valor constante (UVC) + + + estiske kroon + + + egyptiske pund + + + ekwele + + + eritreiske nakfa + + + spanske peseta (A-konto) + + + spanske peseta (konvertibel konto) + + + spanske peseta + + + etiopiske birr + + + euro + EUR + + + finske mark + + + fijianske dollar + + + Falkland-pund + + + franske franc + + + britiske pund sterling + GBP + + + georgiske kupon larit + + + georgiske lari + + + ghanesiske cedi + + + gibraltarske pund + + + gambiske dalasi + + + guineanske franc + + + guineanske syli + + + ekvatorialguineanske ekwele guineana + + + greske drakmer + + + guatemalanske quetzal + + + portugisiske guinea escudo + + + Guinea-Bissau-pesos + + + guyanske dollar + + + Hongkong-dollar + + + Hoduras Lempira + + + kroatiske dinarer + + + kroatiske kuna + + + haitiske gourde + + + ungarske forinter + + + indonesiske rupier + + + irske pund + + + israelske pund + + + israelske nye shekler + + + indiske rupier + INR + + + irakske dinarer + + + iranske rialer + + + islandske kroner + + + italienske lire + ITL + + + jamaikanske dollar + + + jordanske dinarer + + + japanske yen + JPY + + + kenyanske shilling + + + kirgisiske som + + + kambodsjanske riel + + + komoriske franc + + + nordkoreanske won + + + sørkoreanske won + + + kuwaitiske dinarer + + + caymanske dollar + + + kasakhstanske tenge + + + laotiske kip + + + libanesiske pund + + + srilankiske rupier + + + liberiske dollar + + + lesothiske loti + + + maloti + + + litauiske lita + + + litauiske talonas + + + luxemburgske konvertible franc + + + luxemburgske franc + + + luxemburgske finansielle franc + + + latviske lats + + + latviske rubler + + + libyske dinarer + + + marokkanske dirham + + + marokkanske franc + + + moldovske leu + + + madagassiske ariary + + + madagassiske franc + + + makedonske denarer + + + maliske franc + + + myanmarske kyat + + + mongolske tugrik + + + makaoske pataca + + + mauritanske ouguiya + + + maltesiske lira + + + maltesiske pund + + + mauritiske rupier + + + maldiviske rufiyaa + + + malawiske kwacha + + + meksikanske pesos + + + meksikanske sølvpesos (1861-1992) + + + meksikanske unidad de inversion (UDI) + + + malaysiske ringgit + + + mosambikiske escudo + + + gamle mosambikiske metical + + + mosambikiske metical + + + namibiske dollar + + + nigerianske naira + + + nicaraguanske cordoba + + + nicaraguanske cordoba oro + + + nederlandske gylden + + + norske kroner + + + nepalske rupier + + + new zealandske dollar + + + omanske rialer + + + panamanske balboa + + + peruvianske inti + + + peruvianske nye sol + + + peruvianske sol + + + papuanske kina + + + filippinske pesos + + + pakistanske rupier + + + polske zloty + + + polske zloty (1950-1995) + + + portugisiske escudo + + + paraguayanske guarani + + + qatarske rialer + + + rhodesiske dollar + + + gamle rumenske leu + + + rumenske leu + + + serbiske dinarer + + + russiske rubler + + + russiske rubler (1991-1998) + + + rwandiske franc + + + saudiarabiske riyaler + + + salomonske dollar + + + seychelliske rupier + + + sudanesiske dinarer + + + sudanske pund + + + sudanesiske pund + + + svenske kroner + + + singaporske dollar + + + sankthelenske pund + + + slovenske tolar + + + slovakiske koruna + + + sierraleonske leone + sierraleonske leone + + + somaliske shilling + + + surinamske dollar + + + surinamske gylden + + + Sao Tome og Principe-dobra + + + sovjetiske rubler + + + salvadoranske colon + + + syriske pund + + + swazilandske lilangeni + + + thailandske baht + + + tadsjikiske rubler + + + tadsjikiske somoni + + + turkmenske manat + + + tunisiske dinarer + + + tonganske paʻanga + + + timoresiske escudo + + + tyrkiske lire + tyrkisk lire + tyrkiske lire + + + ny tyrkisk lire + ny tyrkisk lire + nye tyrkiske lire + + + trinidadiske dollar + + + taiwanske nye dollar + + + tanzanianske shilling + + + ukrainske hryvnia + + + ukrainske karbovanetz + + + ugandiske shilling (1966-1987) + + + ugandiske shilling + + + amerikanske dollar + USD + + + amerikanske dollar (neste dag) + + + amerikanske dollar (samme dag) + + + uruguayanske pesos (1975-1993) + + + uruguayanske peso uruguayo + + + usbekiske sum + + + venezuelanske bolivar + + + venezuelanske bolivar fuerte + + + vietnamesiske dong + + + vanuatiske vatu + + + vestsamoiske tala + + + CFA franc BEAC + + + sølv + + + gull + + + europeisk sammensatt enhet + + + europeisk monetær enhet + + + europeisk kontoenhet (XBC) + + + europeisk kontoenhet (XBD) + + + østkaribiske dollar + + + spesielle trekkrettigheter + + + europeisk valutaenhet + + + franske gullfranc + + + franske UIC-franc + + + CFA franc BCEAO + + + palladium + + + CFP franc + + + platina + + + RINET-fond + + + ukjent eller ugyldig valuta + ukjent eller ugyldig valuta + ukjent eller ugyldig valuta + + + jemenittiske dinarer + + + jemenittiske rialer + + + jugoslaviske dinarer (hard) + + + jugoslaviske noviy-dinarer + + + jugoslaviske konvertible dinarer + + + sørafrikanske rand (finansielle) + + + sørafrikanske rand + + + zambiske kwacha + + + zairiske nye zaire + + + zairiske zaire + + + zimbabwiske dollar + + + + + + {0} dag + {0} dager + + + {0} time + {0} timer + + + {0} minutt + {0} minutter + + + {0} måned + {0} måneder + + + {0} sekund + {0} sekunder + + + {0} uke + {0} uker + + + {0} år + {0} år + + + + + ja + nei + + + diff --git a/libs/Zend/Locale/Data/nb_NO.xml b/libs/Zend/Locale/Data/nb_NO.xml new file mode 100644 index 0000000..4d52751 --- /dev/null +++ b/libs/Zend/Locale/Data/nb_NO.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/ne.xml b/libs/Zend/Locale/Data/ne.xml new file mode 100644 index 0000000..e46042e --- /dev/null +++ b/libs/Zend/Locale/Data/ne.xml @@ -0,0 +1,1388 @@ + + + + + + + + + + + अफ्रिकाली + अम्हारिक + अरबी + आसामी + अजरबैजानी + बेलारुसियाली + बुल्गेरियाली + बिहारी + बंगाली + बोस्नियाली + क्याटालन + चेकोस्लोभाकियाली + वेल्श + ड्यानिश + जर्मन + ग्रीक + अँग्रेजी + एस्पेरान्तो + स्प्यानिश + इस्टोनियाली + बास्क + फारसी + फिनिश + फिलिपिनी + फारोइज + फ्रांसेली + फ्रिजीयन + आइरिश + स्कट्स गाएलिक + गलिसियाली + गुजराती + हिब्रु + हिन्दी + क्रोएसियाली + हंग्रीयाली + इन्टर्लिङ्गुआ + इन्डोनेसियाली + अन्तरभाषी + आइसल्यान्डिक + इटालियन + जापानी + जाभानिज + जोरजियन + कम्बोडीयाली + कन्नाडा + कोरियाली + कुर्दिश + ल्याटिन + लिंगाला + लाओ + लिथुआनियाली + लात्भियाली + म्याकेडोनियन + मलयालम + मंगोल + मराठी + मलाया + माल्टिज + नेपाली + डच + नर्वेजियाली + अक्सिटन + ओरिया + पंजाबी + पोलिश + पाश्तो + पोर्तुगाली + पर्तुगाली (ब्राजिल्याली) + आइबेरी, पर्तुगाली + रोमानियाली + रसियाली + संस्कृत + सिन्हाली + स्लोभाकियाली + स्लोभेनियाली + सोमाली + अल्बेनियन + सर्बियाली + सुडानी + स्विडिश + स्वाहिली + तामिल + तेलुगु + थाई + तिग्रीन्या + क्लिङ्गन + टर्की + युक्रेनी + उर्दु + उज़्बेक + भियतनामी + झोसा + यिद्दिस + चिनियाँ + सरलिकृत चिनियाँ + परम्परागत चिनियाँ + जुलू + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + विश्व + अफ्रिका + उत्तर अमेरिका + दक्षिण अमेरिका + ओसनिया + पश्चिमी अफ्रिका + केन्द्रीय अमेरिका + पूर्वी अफ्रिका + उत्तरी अफ्रिका + मध्य अफ्रिका + दक्षिणी अफ्रिका + अमेरिकास + उत्तरी अमेरिका + क्यारिबिएन + पूर्वी एशिया + दक्षिणी एशिया + दक्षिण पूर्वी एशिया + दक्षिणी युरोप + अष्ट्रेलिया र न्युजिल्याण्ड + मेलानेसिया + माइक्रोनेसियाली क्षेत्र + पोलिनेशिया + दक्षिण मध्य एशिया + एशिया + केन्द्रीय एशिया + पश्चिमी एशिया + युरोप + पूर्वी युरोप + उत्तरी युरोप + पश्चिमी युरोप + कमनवेल्थका स्वतन्त्र राज्यहरू + ल्याटिन अमेरिका तथा क्यारिबियन + अन्डोर्रा + संयुक्त अरब इमिराट्स + अफ्गानिष्तान + एन्टिगुआ र बारबुडा + आङ्गुइला + अल्बानिया + आर्मेनिया + नेदरल्याण्ड्स एण्टिलिस + अङ्गोला + अन्टारतिका + अर्जेण्टिना + अमेरिकी समोआ + अष्ट्रिया + अष्ट्रेलिया + आरूबा + अलान्ड टापु + अजरबैजान + बोस्निया र हर्जगोभिनिया + बार्बाडोस + बङ्गलादेश + बेल्जियम + बर्किना फासो + बल्गेरिया + बाह्रेन + बुरूण्डी + बेनिन + सेन्ट बार्थालेमी + बर्मुडा + ब्रुनाइ + बोलिभिया + ब्राजिल + बहामास + भुटान + बुभेट टापु + बोट्स्वाना + बेलारूस + बेलिज + क्यानाडा + कोकोस टापु + कोङ्गो-किन्शासा + केन्द्रीय अफ्रिकी गणतन्त्र + कोङ्गो - ब्राज्जाभिल्ले + स्विजरल्याण्ड + आइभोरी कोष्ट + कुक टापु + चिली + क्यामेरून + चीन + कोलोम्बिया + कोष्टारिका + क्युबा + केप भर्डे + क्रिष्टमस टापु + साइप्रस + चेख गणतन्त्र + जर्मनी + डिजिबुटी + डेन्मार्क + डोमिनिका + डोमिनिकन गणतन्त्र + अल्जेरिया + इक्वडेर + इस्टोनिया + इजिप्ट + पश्चिमी साहारा + एरित्रिया + स्पेन + इथोपिया + फिन्ल्याण्ड + फिजी + फकल्याण्ड टापु + माइक्रोनेसिया + फारोर टापु + फ्रान्स + गावोन + संयुक्त अधिराज्य + ग्रेनाडा + जोर्जिया + फ्रान्सेली गायना + गुएर्नसे + घाना + जिब्राल्टार + ग्रिनल्याण्ड + गाम्विया + गिनी + ग्वाडेलुप + भू-मध्यीय गिनी + ग्रिश + ग्वाटेमाला + गुवाम + गिनी-बिसाउ + गुयाना + हङकङ + हर्ड टापु र म्याकडोनाल्ड टापु + हन्डुरास + क्रोएशिया + हैटी + हङ्गेरी + इन्डोनेशिया + आइरल्याण्ड + इज्रायल + आइज्ले अफ् म्यान + भारत + बेलायती हिन्द महासागर क्षेत्र + इराक + इरान + आइस्ल्याण्ड + इटाली + जर्सी + जमाइका + जोर्डन + जापान + केन्या + किर्गिस्थान + कम्बोडिया + किरिबाटी + कोमोरोस + सेन्ट किट्स र नेभिस + उत्तर कोरिया + दक्षिण कोरिया + कुवेत + केयमान टापु + काजाकस्थान + लाओस + लेबनोन + सेन्ट लुसिया + लिएखटेन्स्टाइन + श्रीलङ्का + लाइबेरिया + लेसोथो + लिथुअनिया + लक्जेमबर्ग + लाट्भिया + लिबिया + मोरोक्को + मोनाको + माल्डोभा + मोन्टेनेग्रो + सेन्ट मार्टिन + मडागास्कर + मार्शल टापु + म्याकेडोनिया + माली + म्यान्मार + मङ्गोलिया + मकावो + उत्तरी मारिआना टापु + मार्टिनिक + माउरिटानिया + मोन्टसेर्राट + माल्टा + माउरिटस + माल्दिभ्स + मालावी + मेक्सिको + मलेसिया + मोजाम्बिक + नामिबिया + नयाँ कालेडोनिया + नाइजर + नोरफोल्क टापु + नाइजेरिया + निकारागुवा + नेदरल्याण्ड्स + नर्वे + नेपाल + नाउरू + नियुइ + न्युजिल्याण्ड + ओमन + पनामा + पेरू + फ्रान्सेली पोलिनेसिया + पपुआ न्यू गाइनिया + फिलिपिन्स + पाकिस्तान + पोल्याण्ड + सेन्ट पिर्रे र मिक्केलोन + पिटकाइर्न + प्युर्टोरिको + प्यालेस्टनी भू-भाग + पोर्तुगल + पलाउ + प्यारागुये + कटार + बाह्य ओसनिया + युरोपियन युनियन + रियुनियन + रोमानिया + सर्बिया + रूस + रवाण्डा + साउदी अरब + सोलोमोन टापु + सेचेलेस + सुडान + स्विडेन + सिङ्गापुर + सेन्ट हेलेना + स्लोभेनिया + सभाल्बार्ड र जान मायेन + स्लोभाकिया + सिएर्रा लिओन + सान् मारिनो + सेनेगाल + सोमालिया + सुरिनेम + साओ टोमे र प्रिन्सिप + एल् साल्भाडोर + सिरिया + स्वाजिल्याण्ड + तुर्क र काइकोस टापु + चाड + फ्रान्सेली दक्षिणी क्षेत्र + टोगो + थाइल्याण्ड + ताजिकिस्तान + तोगो + पूर्वी टिमोर + तुर्कमेनिस्तान + टुनिसिया + टोंगा + टर्की + त्रिनिडाड र तोबागो + तुभालु + ताइवान + तान्जानिया + युक्रेन + युगाण्डा + संयुक्त राज्य अल्प बाह्य टापु + संयुक्त राज्य + युरूगुए + उज्बेकिस्तान + भेटिकन + सेन्ट भिन्सेन्ट र ग्रेनाडिन्स + भेनेजुएला + बेलायती भर्जिन टापु + संयुक्त राज्य भर्जिन टापु + भिएतनाम + भानुआतु + वालिस र फुटुना + सामोआ + येमेन + मायोट्ट + दक्षिण अफ्रिका + जाम्बिया + जिम्बाबे + अपरिचित वा अवैध क्षेत्र + + + पूर्वी आर्मेनियाली + कम्प्युटर + + + पात्रो + कोलेशन + मुद्रा + + + परम्परागत चिनिँया क्रमबद्धता पद्दति - बिग फाइभ + बुद्धिष्ट पात्रो + चिनिँया पात्रो + प्रत्यक्ष क्रमबद्धता पद्दति + सरलिकृत चिनियाँ क्रमबद्धता पद्दति-गीबीटुथ्रीवानटु + ग्रेगोरियन पात्रो + हिब्रु पात्रो + भारतीय राष्ट्रिय पात्रो + इस्लामी पात्रो + इस्लामी नागरिक पात्रो + जापानी पात्रो + टेलिफोन पुस्तिका क्रमबद्धतापद्दति + पिनयिन क्रमबद्धता पद्दति + चिनिँया गणतन्त्र पात्रो + स्ट्रोक क्रमबद्धता पद्दति + परम्परागत क्रमबद्धता पद्दति + + + + [ँ-ः ०-९ अ-ऋ ए ऐ ओ-न प-र ल व-ह ा-ृ े ै ो ्] + [\u200C \u200D] + + + ' + ' + " + " + + + + + पूर्व मध्यान्ह + पूर्व अपरान्ह + + + + + + जन + फेब + मार्च + अप्रि + मे + जुन + जुला + अग + सेप्ट + अक्टो + नोभे + डिसे + + + जनवरी + फेब्रुअरी + मार्च + अप्रिल + मे + जुन + जुलाई + अगस्त + सेप्टेम्बर + अक्टोबर + नोभेम्बर + डिसेम्बर + + + + + + + + + + + + + + १० + ११ + १२ + + + + + + + आइत + सोम + मङ्गल + बुध + बिही + शुक्र + शनि + + + आइतबार + सोमबार + मङ्गलबार + बुधबार + बिहीबार + शुक्रबार + शनिबार + + + + + + + + + + + + + + + + + + Q1 + Q2 + Q3 + Q4 + + + पहिलो सत्र + दोस्रो सत्र + तेस्रो सत्र + चौथो सत्र + + + + + + + + + + + + पूर्व मध्यान्ह + उत्तर मध्यान्ह + + + ईसा पूर्व + सन् + + + ईसा पूर्व + सन् + + + + + + EEEE, yyyy MMMM dd + + + + + yyyy MMMM d + + + + + yyyy MMM d + + + + + yy/MM/dd + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1} {0} + + + + Q yy + + + + + काल + + + बर्ष + + + महिना + + + हप्ता + + + बार + आज + भोलि + हिजो + अस्ति + तीन दिन पछि + + + हप्ताको बार + + + पूर्व मध्यान्ह/उत्तर मध्यान्ह + + + घण्टा + + + मिनेट + + + दोस्रो + + + क्षेत्र + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + अज्ञात + + + रोथेरा + + + पाल्मेर + + + दक्षिण पोल + + + सिओआ + + + माजन + + + डेभिस + + + भास्टोक + + + केजे + + + दुमोन्ट डि उर्भेल्ले + + + माकमुर्डो + + + रियो ग्यालेगोस + + + मेन्डोजा + + + सान जुवान + + + उशुआइआ + + + ला रियोजा + + + सान लुइस + + + कातामार्का + + + जुजु + + + टुकुमान + + + कोरडोवा + + + ब्यनेश आयर्स + + + पर्थ + + + इयुक्ला + + + डार्विन + + + एडेलेड + + + ब्रोकन हिल + + + क्युरी + + + मेल्बर्न + + + होभार्ट + + + लिन्डेम्यान + + + सिड्नी + + + ब्रिस्बेन + + + लर्ड होवे + + + आइरनेपे + + + रियो ब्रान्को + + + पोर्टो भेल्हो + + + बोआ भिष्टा + + + मानाउस + + + क्युइआबा + + + क्याम्पो ग्रान्डे + + + बेलेम + + + आरागुवाना + + + साओ पाउलो + + + बाहिया + + + फोर्टालेजा + + + मासेइओ + + + रिसाइफ + + + नोरोन्हा + + + डेजन + + + ह्वाइटहर्स + + + इनुभिक + + + भ्यानकोभर + + + डेजन क्रिक + + + येल्लोनाइफ + + + एड्मोन्टन + + + स्विफ्ट करेण्ट + + + क्याम्ब्रिज बे + + + रेजिना + + + विन्निपेग + + + रिजोलुट + + + रेनिरिभर + + + रान्किन इन¥लेट + + + कोराल बन्दरगाहा + + + थण्डर बे + + + निपिगन + + + टोरोण्टो + + + मोन्ट्रिल + + + इक्वालुइट + + + पाङ्निरतुङ + + + मोन्कटन + + + हालेफाक्स + + + गुज बे + + + ग्लेस बे + + + ब्लान्क-साब्लोन + + + सेन्ट जोन्स + + + किन्शासा + + + लुबुम्बासी + + + इस्टर + + + काश्गर + + + उरूम्की + + + चोङकिङ + + + हार्विन + + + गलापागोस + + + क्यानारी + + + सेउटा + + + ट्रुक + + + पोनापे + + + कोस्राए + + + थुले + + + स्कोर्सबाइसन्ड + + + डान्मार्कशाभन + + + जाकार्ता + + + पोन्टिआनाक + + + माकास्सार + + + जयापुरा + + + एन्डरबरी + + + किरितिमाटी + + + तरवा + + + आक्टाउ + + + ओरल + + + आक्टोब + + + किजिलोर्डा + + + आल्माटी + + + क्वाजालेइन + + + माजुरो + + + होभ्ड + + + उलानबटार + + + चोइबाल्सान + + + तिजुआना + + + हेर्मोसिल्लो + + + माजाट्लान + + + चिहुआहुआ + + + मोन्टेर्रे + + + मेक्सिको सिटी + + + मेरिडा + + + कानकुन + + + कुचिङ + + + चाथाम + + + मार्केसास + + + ग्याम्बियर + + + आजोर्स + + + माडेइरा + + + कालिनिनग्राद + + + मस्को + + + भोल्गोग्राद + + + सामारा + + + एकटरिनबुर्ग + + + ओम्स्क + + + नोबोसिबिर्स्क + + + क्रास्नोयार्स्क + + + इर्कुत्स्क + + + याकुत्स्क + + + भ्लाडिभास्टोक + + + साखालिन + + + मागाडान + + + कामचट्का + + + आनाडियर + + + उझगोरद + + + किभ + + + सिम्फेरोपोल + + + जापोरोझ्ये + + + मिडवे + + + जोन्सटन + + + वेक + + + आडाक + + + नोमे + + + होनोलुलु + + + याकुतात + + + जुनिउ + + + लस् एन्जेलस + + + बोइज + + + फोनिक्स + + + शिपरक + + + डेन्भर + + + नयाँ सालेम, उत्तर डाकोटा + + + उत्तर डाकोटा, केन्द्र + + + चिकागो + + + मेनोमिनी + + + भिन्सेन्स + + + पिटर्सबर्ग, इन्डियाना + + + टेल सिटी, इन्डियाना + + + नोक्स, इण्डियाना + + + विनामाक, इन्डियाना + + + मारेन्गो, इन्डियाना + + + इण्डियानापोलिस + + + लुइसभिल्ले + + + भेभे, इन्डियाना + + + मोन्टिसेल्लो,केन्टकी + + + डिट्रोइट + + + न्युयोर्क + + + समारकण्ड + + + + १३:२५ मोजाम्बिक समय + १३:२५ केन्द्रीय अफ्रिकी समय + + + + + + + . + , + ; + + - + + + + अफ्गानी(१९२७-२००२) + + + अफ्गानी + + + अल्बानियन लेक + + + अष्ट्रेलियन डलर + + + ब्राजिलियन रियल + + + चिनिँया युआन रेनिबी + + + युरो + + + बेलायती पाउण्ड स्टर्लिङ + + + भारती रूपिँया + + + जापानी येन + + + नर्वेजियाली क्रोन + + + नेरू + + + फिलिपिनी पेसो + + + रूसी रूबल + + + संयुक्त राज्य डलर + + + अपरिचित वा अवैध मुद्रा + + + + + + {0} दिन + + + {0} घण्टा + + + {0} मिनेट + + + {0} महिना + + + {0} सेकेण्ड + + + {0} हप्ता + + + {0} बर्ष + {0} बर्ष + + + + diff --git a/libs/Zend/Locale/Data/ne_IN.xml b/libs/Zend/Locale/Data/ne_IN.xml new file mode 100644 index 0000000..61db749 --- /dev/null +++ b/libs/Zend/Locale/Data/ne_IN.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/ne_NP.xml b/libs/Zend/Locale/Data/ne_NP.xml new file mode 100644 index 0000000..c97fa0c --- /dev/null +++ b/libs/Zend/Locale/Data/ne_NP.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/nl.xml b/libs/Zend/Locale/Data/nl.xml new file mode 100644 index 0000000..3443c6c --- /dev/null +++ b/libs/Zend/Locale/Data/nl.xml @@ -0,0 +1,3877 @@ + + + + + + + + + + + {0} ({1}) + , + + + Afar + Abchazisch + Atjees + Akoli + Adangme + Adyghe + Avestisch + Afrikaans + Afro-Aziatische taal + Afrihili + Ainu + Akan + Akkadisch + Aleut + Algonkium-talen + Zuid-Altaïsch + Amhaars + Aragonees + Oudengels + Apache-talen + Arabisch + Aramees + Araukaans + Arapaho + Kunstmatige taal + Arawak + Assamees + Asturisch + Athapascaanse talen + Australische talen + Avarisch + Awadhi + Aymara + Azerbeidzjaans + Basjkiers + Banda + Bamileke-talen + Baloetsji + Balinees + Basa + Baltische taal + Wit-Russisch + Beja + Bemba + Berbers + Bulgaars + Bihari + Bhojpuri + Bislama + Bikol + Bini + Siksika + Bambara + Bengalees + Bantoe + Tibetaans + Bretons + Braj + Bosnisch + Batak + Buriat + Buginees + Blin + Catalaans + Caddo + Midden-Amerikaans Indiaanse taal + Caribisch + Kaukasische taal + Atsam + Chechen + Cebuano + Keltische taal + Chamorro + Chibcha + Chagatai + Chuukees + Mari + Chinook-jargon + Choctaw + Chipewyan + Cherokee + Cheyenne + Chamische talen + Corsicaans + Koptisch + Op Engels gebaseerd Creools of Pidgin + Op Frans gebaseerd Creools of Pidgin + Op Portugees gebaseerd Creools of Pidgin + Cree + Krim-Tataars + Creools of Pidgin + Tsjechisch + Kasjoebisch + Kerkslavisch + Koesjitische taal + Tsjoevasjisch + Welsh + Deens + Dakota + Dargwa + Dajak + Duits + Oostenrijks Duits + Zwitsers Hoogduits + Delaware + Slave + Dogrib + Dinka + Dogri + Dravidische taal + Nedersorbisch + Duala + Middelnederlands + Divehi + Dyula + Dzongkha + Ewe + Efik + Oudegyptisch + Ekajuk + Grieks + Elamitisch + Engels + Australisch Engels + Canadees Engels + Brits Engels + Amerikaans Engels + Middelengels + Esperanto + Spaans + Latijns-Amerikaans Spaans + Iberisch Spaans + Estlands + Baskisch + Ewondo + Perzisch + Fang + Fanti + Fulah + Fins + Filippijns + Fins-Oegrische taal + Fijisch + Faeröers + Fon + Frans + Canadees Frans + Zwitsers Frans + Middelfrans + Oudfrans + Friulisch + Fries + Iers + Ga + Gayo + Gbaya + Schots Gaelic + Germaanse taal + Geez + Gilbertees + Galicisch + Middelhoogduits + Guarani + Oudhoogduits + Gondi + Gorontalo + Gothisch + Grebo + Oudgrieks + Zwitsers Duits + Gujarati + Manx + Gwichʼin + Hausa + Haida + Hawaïaans + Hebreeuws + Hindi + Hiligaynon + Himachali + Hettitisch + Hmong + Hiri Motu + Kroatisch + Oppersorbisch + Haïtiaans + Hongaars + Hupa + Armeens + Herero + Interlingua + Iban + Indonesisch + Interlingue + Igbo + Sichuan Yi + Ijo + Inupiaq + Iloko + Indische taal + Indo-Europese taal + Ingoesj + Ido + Iraanse taal + Irokese talen + IJslands + Italiaans + Inuktitut + Japans + Lojban + Judeo-Perzisch + Judeo-Arabisch + Javaans + Georgisch + Karakalpaks + Kabyle + Kachin + Jju + Kamba + Karen + Kawi + Kabardisch + Tyap + Koro + Kongo + Khasi + Khoisan-taal + Khotanees + Kikuyu + Kuanyama + Kazachs + Kalaallisut + Khmer + Kimbundu + Kannada + Koreaans + Konkani + Kosraeaans + Kpelle + Kanuri + Karachay-Balkar + Kru + Kurukh + Kashmiri + Koerdisch + Kumyk + Kutenai + Komi + Cornish + Kirgizisch + Latijn + Ladino + Lahnda + Lamba + Luxemburgs + Lezgisch + Ganda + Limburgs + Lingala + Lao + Mongo + Lozi + Litouws + Luba-Katanga + Luba-Lulua + Luiseno + Lunda + Luo + Lushai + Letlands + Madurees + Magahi + Maithili + Makassaars + Mandingo + Austronesisch + Masai + Moksha + Mandar + Mende + Malagasisch + Middeliers + Marshallees + Maori + Mi'kmaq + Minangkabau + Diverse talen + Macedonisch + Mon-Khmer-taal + Malayalam + Mongools + Mantsjoe + Manipoeri + Manobo-talen + Moldavisch + Mohawk + Mossi + Marathi + Maleis + Maltees + Meerdere talen + Munda-talen + Creek + Mirandees + Marwari + Birmees + Mayan-talen + Erzya + Nauru + Nahuatl + Noord-Amerikaans Indiaans + Napolitaans + Noors - Bokmål + Noord-Ndbele + Laagduits + Nepalees + Newari + Ndonga + Nias + Niger-Kordofanische taal + Niueaans + Nederlands + Vlaams + Noors - Nynorsk + Noors + Nogai + Oudnoors + Zuid-Ndbele + Noord-Sotho + Nubische talen + Navajo + Klassiek Newari + Nyanja + Nyamwezi + Nyankole + Nyoro + Nzima + Occitaans + Ojibwa + Oromo + Oriya + Ossetisch + Osage + Ottomaans-Turks + Otomi-talen + Punjabi + Papoeataal + Pangasinan + Pahlavi + Pampanga + Papiamento + Palauaans + Oudperzisch + Filippijnse taal + Foenicisch + Pali + Pools + Pohnpeiaans + Prakrit-talen + Oudprovençaals + Pasjtoe + Portugees + Braziliaans Portugees + Iberisch Portugees + Quechua + Rajasthani + Rapanui + Rarotongan + Reto-Romaans + Rundi + Roemeens + Romaanse taal + Romani + Root + Russisch + Aromaniaans + Kinyarwanda + Sanskriet + Sandawe + Yakut + Zuid-Amerikaans Indiaanse taal + Salishan-talen + Samaritaans-Aramees + Sasak + Santali + Sardinisch + Siciliaans + Schots + Sindhi + Noord-Samisch + Selkup + Semitische taal + Sango + Oudiers + Gebarentalen + Servokroatisch + Shan + Singalees + Sidamo + Siouaanse talen + Sino-Tibetaanse taal + Slowaaks + Sloveens + Slavische taal + Samoaans + Zuid-Samisch + Sami-taal + Lule Sami + Inari Sami + Skolt Sami + Shona + Soninke + Somalisch + Sogdisch + Songhai + Albanees + Servisch + Sranantongo + Serer + Swati + Nilo-Saharaanse taal + Zuid-Sotho + Soendanees + Sukuma + Soesoe + Soemerisch + Zweeds + Swahili + Syriac + Tamil + Tai-taal + Teloegoe + Timne + Tereno + Tetum + Tadzjieks + Thais + Tigrinya + Tigre + Tiv + Turkmeens + Tokelau + Tagalog + Klingon + Tlingit + Tamashek + Tswana + Tonga + Nyasa Tonga + Tok Pisin + Turks + Tsonga + Tsimshian + Tataars + Toemboeka + Tupi-talen + Altaïsche taal + Tuvalu + Twi + Tahitisch + Tuvinisch + Udmurt + Oeigoers + Oegaritisch + Oekraïens + Umbundu + Onbepaald + Urdu + Oezbeeks + Vai + Venda + Vietnamees + Volapük + Votisch + Wallonisch + Wakashan-talen + Walamo + Waray + Washo + Sorbische talen + Wolof + Kalmyk + Xhosa + Yao + Yapees + Jiddisch + Yoruba + Yupik-talen + Zhuang + Zapotec + Zenaga + Chinees + Vereenvoudigd Chinees + Traditioneel Chinees + Zande + Zulu + Zuni + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Wereld + Afrika + Noord-Amerika + Zuid-Amerika + Oceanië + West-Afrika + Midden-Amerika + Oost-Afrika + Noord-Afrika + Centraal-Afrika + Zuidelijk Afrika + Amerika + Noordelijk Amerika + Caribisch gebied + Oost-Azië + Zuid-Azië + Zuidoost-Azië + Zuid-Europa + Australië en Nieuw-Zeeland + Melanesië + Micronesische regio + Polynesië + Zuidelijk Centraal-Azië + Azië + Centraal-Azië + West-Azië + Europa + Oost-Europa + Noord-Europa + West-Europa + Gemenebest van Onafhankelijke Staten + Latijns-Amerika en het Caribisch gebied + Kanaaleilanden + Andorra + Verenigde Arabische Emiraten + Afghanistan + Antigua en Barbuda + Anguilla + Albanië + Armenië + Nederlandse Antillen + Angola + Antarctica + Argentinië + Amerikaans Samoa + Oostenrijk + Australië + Aruba + Alandeilanden + Azerbeidzjan + Bosnië en Herzegovina + Barbados + Bangladesh + België + Burkina Faso + Bulgarije + Bahrein + Burundi + Benin + Saint Barthélemy + Bermuda + Brunei + Bolivia + Brazilië + Bahama’s + Bhutan + Bouveteiland + Botswana + Wit-Rusland + Belize + Canada + Cocoseilanden + Congo-Kinshasa + Centraal-Afrikaanse Republiek + Congo + Zwitserland + Ivoorkust + Cookeilanden + Chili + Kameroen + China + Colombia + Costa Rica + Servië en Montenegro + Cuba + Kaapverdië + Christmaseiland + Cyprus + Tsjechië + Duitsland + Djibouti + Denemarken + Dominica + Dominicaanse Republiek + Algerije + Ecuador + Estland + Egypte + Westelijke Sahara + Eritrea + Spanje + Ethiopië + Finland + Fiji + Falklandeilanden + Micronesië + Faeröer + Frankrijk + Gabon + Verenigd Koninkrijk + Grenada + Georgië + Frans-Guyana + Guernsey + Ghana + Gibraltar + Groenland + Gambia + Guinea + Guadeloupe + Equatoriaal-Guinea + Griekenland + Zuid-Georgië en Zuidelijke Sandwicheilanden + Guatemala + Guam + Guinee-Bissau + Guyana + Hongkong + Heard- en McDonaldeilanden + Honduras + Kroatië + Haïti + Hongarije + Indonesië + Ierland + Israël + Isle of Man + India + Britse Gebieden in de Indische Oceaan + Irak + Iran + IJsland + Italië + Jersey + Jamaica + Jordanië + Japan + Kenia + Kirgizië + Cambodja + Kiribati + Comoren + Saint Kitts en Nevis + Noord-Korea + Zuid-Korea + Koeweit + Caymaneilanden + Kazachstan + Laos + Libanon + Saint Lucia + Liechtenstein + Sri Lanka + Liberia + Lesotho + Litouwen + Luxemburg + Letland + Libië + Marokko + Monaco + Moldavië + Montenegro + Sint-Maarten + Madagaskar + Marshalleilanden + Macedonië + Mali + Myanmar + Mongolië + Macao + Noordelijke Marianeneilanden + Martinique + Mauritanië + Montserrat + Malta + Mauritius + Maldiven + Malawi + Mexico + Maleisië + Mozambique + Namibië + Nieuw-Caledonië + Niger + Norfolkeiland + Nigeria + Nicaragua + Nederland + Noorwegen + Nepal + Nauru + Niue + Nieuw-Zeeland + Oman + Panama + Peru + Frans-Polynesië + Papoea-Nieuw-Guinea + Filipijnen + Pakistan + Polen + Saint Pierre en Miquelon + Pitcairn + Puerto Rico + Palestijns Gebied + Portugal + Palau + Paraguay + Qatar + Oceanië (overige) + Europese Unie + Réunion + Roemenië + Servië + Rusland + Rwanda + Saoedi-Arabië + Salomonseilanden + Seychellen + Soedan + Zweden + Singapore + Sint-Helena + Slovenië + Svalbard en Jan Mayen + Slowakije + Sierra Leone + San Marino + Senegal + Somalië + Suriname + Sao Tomé en Principe + El Salvador + Syrië + Swaziland + Turks- en Caicoseilanden + Tsjaad + Franse Gebieden in de zuidelijke Indische Oceaan + Togo + Thailand + Tadzjikistan + Tokelau + Oost-Timor + Turkmenistan + Tunesië + Tonga + Turkije + Trinidad en Tobago + Tuvalu + Taiwan + Tanzania + Oekraïne + Oeganda + Amerikaanse kleinere afgelegen eilanden + Verenigde Staten + Uruguay + Oezbekistan + Vaticaanstad + Saint Vincent en de Grenadines + Venezuela + Britse Maagdeneilanden + Amerikaanse Maagdeneilanden + Vietnam + Vanuatu + Wallis en Futuna + Samoa + Jemen + Mayotte + Zuid-Afrika + Zambia + Zimbabwe + Onbekend of onjuist gebied + + + Traditionele Duitse spelling + Duitse spelling van 1996 + Oost-Armeens + West-Armeens + San Giorgio/Bila-dialect + Boontling + Internationaal Fonetisch Alfabet + Oeralisch Fonetisch Alfabet + Monotonaal + Natisone-dialect + Gniva/Njiva-dialect + Oseacco/Osojane-dialect + Polytonaal + Computer + Gewijzigde spelling + Resiaans + Saho + Liverpools (Scouse) + Stolvizza/Solbica-dialect + + + Kalender + Volgorde + Munteenheid + + + Traditioneel Chinees + Boeddhistische kalender + Chinese kalender + Directe sorteervolgorde + Vereenvoudigd Chinees + Gregoriaanse kalender + Hebreeuwse kalender + Indiase nationale kalender + Islamitische kalender + Islamitische kalender (cyclisch) + Japanse kalender + Telefoonboeksorteervolgorde + Pinyinvolgorde + Kalender van de Chinese Republiek + Streeksorteervolgorde + Traditionele sorteervolgorde + + + Amerikaans + Metriek + + + Taal: {0} + Schrift: {0} + Regio: {0} + + + + lowercase-words + lowercase-words + + + [a á ä b-e é ë f-i í ï {ij} j-o ó ö p-u ú ü v-z] + [å ã ç ñ ô] + [a-z] + + + + + + + + + + + + + + jan + feb + mrt + apr + mei + jun + jul + aug + sep + okt + nov + dec + + + januari + februari + maart + april + mei + juni + juli + augustus + september + oktober + november + december + + + + + J + F + M + A + M + J + J + A + S + O + N + D + + + + + + + zo + ma + di + wo + do + vr + za + + + zondag + maandag + dinsdag + woensdag + donderdag + vrijdag + zaterdag + + + + + Z + M + D + W + D + V + Z + + + + + + + K1 + K2 + K3 + K4 + + + 1e kwartaal + 2e kwartaal + 3e kwartaal + 4e kwartaal + + + + + 1 + 2 + 3 + 4 + + + + AM + PM + + + Voor Christus + Anno Domini + + + v. Chr. + n. Chr. + + + + + + EEEE d MMMM yyyy + + + + + d MMMM yyyy + + + + + d MMM yyyy + + + + + dd-MM-yy + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1} {0} + + + + HH:mm + L + E, d-M + LLL + E d MMM + E d MMMM + d MMMM + d-MMM + d-MM + dd-MM + d-M + d + mm:ss + mm:ss + yyyy + M-yyyy + EEE, d-M-yyyy + MMM yyyy + EEE, d MMM yyyy + MMMM yyyy + Q yyyy + QQQ yyyy + MM-yy + MMM yy + Q yy + QQQQ yy + MMMM yyyy + + + {0} - {1} + + M-M + + + E dd-MM - E dd-MM + E dd-MM - E dd-MM + + + MMM-MMM + + + E d MMM - E d MMM + E d - E d MMM + + + LLLL-LLLL + + + d MMM - d MMM + d-d MMM + + + dd-MM - dd-MM + dd-MM - dd-MM + + + d-d + + + HH-HH + HH-HH + + + HH:mm-HH:mm + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH-HH v + HH-HH v + + + y-y + + + MM-yy - MM-yy + MM-yy - MM-yy + + + E dd-MM-yy - E dd-MM-yy + E dd-MM-yy - E dd-MM-yy + E dd-MM-yy - E dd-MM-yy + + + MMM-MMM yyyy + MMM yyyy - MMM yyyy + + + E d MMM - E d MMM yyyy + E d - E d MMM yyyy + E d MMM yyyy - E d MMM yyyy + + + MM–MM– yyyy + MM-yyyy – MM-yyyy + + + d MMM - d MMM yyyy + d-d MMM yyyy + d MMM yyyy - d MMM yyyy + + + dd-MM-yy - dd-MM-yy + dd-MM-yy - dd-MM-yy + dd-MM-yy - dd-MM-yy + + + + + + Tijdperk + + + Jaar + + + Maand + + + Week + + + Dag + Vandaag + Morgen + Overmorgen + Over drie dagen + Gisteren + Eergisteren + Drie dagen geleden + + + Dag van de week + + + AM/PM + + + Uur + + + Minuut + + + Seconde + + + Zone + + + + + + + + Tisjrie + Chesjwan + Sjevat + Adar + Adar B + Ijar + Tammoez + Elloel + + + + + + + + + Moeharram + Rabiʻa al awal + Rabiʻa al thani + Joemadʻal awal + Joemadʻal thani + Sjaʻaban + Sjawal + Doe al kaʻaba + Doe al hizja + + + + + + Saʻna Hizjria + + + + + + +HH:mm;-HH:mm + GMT{0} + {0}-tijd + {1} ({0}) + + Onbekend + + + Tirana + + + Erevan + + + Curaçao + + + Zuidpool + + + Río Gallegos + + + Córdoba + + + Wenen + + + Bakoe + + + Brussel + + + Bahrein + + + Pôrto Velho + + + Cuiabá + + + Belém + + + São Paulo + + + Maceió + + + Montréal + + + St. Johns + + + Cocoseilanden + + + Zürich + + + Paaseiland + + + Sjanghai + + + Bogotá + + + Kaapverdië + + + Christmaseiland + + + Berlijn + + + Kopenhagen + + + Galápagos + + + Asmara + + + Canarische Eilanden + + + Addis Abeba + + + Pohnpei + + + Faeröer + + + Parijs + + + Londen + + + Athene + + + Zuid-Georgië + + + Hongkong + + + Boedapest + + + Jeruzalem + + + Teheran + + + Tokio + + + Bisjkek + + + Enderbury-eiland + + + St. Kitts + + + Koeweit + + + Aqtöbe + + + Alma-Ata + + + Beiroet + + + St. Lucia + + + Luxemburg + + + Ulaanbaator + + + Maldiven + + + Mazatlán + + + Mexico-stad + + + Mérida + + + Cancún + + + Nouméa + + + Kathmandu + + + Marquesaseilanden + + + Gambier-eilanden + + + Manilla + + + Warschau + + + Azoren + + + Lissabon + + + Asunción + + + Réunion + + + Boekarest + + + Moskou + + + Jekaterinenburg + + + Krasnojarsk + + + Irkoetsk + + + Jakoetsk + + + Sachalin + + + Kamtsjatka + + + Riyad + + + Mahé + + + Khartoem + + + Sint-Helena + + + Sao Tomé + + + Salvador + + + Turks Eilanden + + + Lomé + + + Dusjanbe + + + Asjchabad + + + Istanboel + + + Oezjhorod + + + Zaporizja + + + Wake-eiland + + + Tasjkent + + + St. Vincent + + + St. Thomas + + + + Acre-tijd + Acre-zomertijd + + true + + + + Afghaanse tijd + + true + + + + Centraal-Afrikaanse tijd + + + + + Oost-Afrikaanse tijd + + + + + Zuid-Afrikaanse tijd + Zuid-Afrikaanse standaardtijd + + + + + West-Afrikaanse tijd + West-Afrikaanse zomertijd + + + + + Aktyubinsk-tijd + Aktyubinsk-zomertijd + + true + + + + Alaska-tijd + Alaska - standaardtijd + Alaska - zomertijd + + true + + + + Alaska-Hawaii-tijd + Alaska-Hawaii-standaardtijd + Alaska-Hawaii-zomertijd + + true + + + + Alma-Ata-tijd + Alma-Ata-zomertijd + + true + + + + Amazone-tijd + Amazone-zomertijd + + true + + + + Central-tijd + Central-standaardtijd + Central-zomertijd + + true + + + + Eastern-tijd + Eastern-standaardtijd + Eastern-zomertijd + + true + + + + Mountain-tijd + Mountain-standaardtijd + Mountain-zomertijd + + true + + + + Pacific-tijd + Pacific-standaardtijd + Pacific-zomertijd + + true + + + + Anadyr-tijd + Anadyr-zomertijd + + true + + + + Aqtau-tijd + Aqtau-zomertijd + + true + + + + Aqtöbe-tijd + Aqtöbe-zomertijd + + + AQTT (Aqtöbe) + AQTST (Aqtöbe) + + true + + + + Arabische tijd + Arabische standaardtijd + Arabische zomertijd + + + AT (Arabisch) + AST (Arabisch) + ADT (Arabisch) + + + + + Argentijnse tijd + Argentijnse zomertijd + + true + + + + West-Argentijnse tijd + + true + + + + Armeense tijd + Armeense zomertijd + + + AMT (Armenië) + AMST (Armenië) + + + + + Ashkhabad-tijd + Ashkhabad-zomertijd + + true + + + + Atlantic-tijd + Atlantic - standaardtijd + Atlantic - zomertijd + + true + + + + Midden-Australische tijd + Midden-Australische standaardtijd + Midden-Australische zomertijd + + true + + + + Midden-Australische westelijke tijd + Midden-Australische westelijke standaardtijd + Midden-Australische westelijke zomertijd + + true + + + + Oost-Australische tijd + Oost-Australische standaardtijd + Oost-Australische zomertijd + + true + + + + West-Australische tijd + West-Australische standaardtijd + West-Australische zomertijd + + true + + + + Azerbeidzjaanse tijd + Azerbeidzjaanse zomertijd + + true + + + + Azoren-tijd + Azoren-zomertijd + + true + + + + Bakoe-tijd + Bakoe-zomertijd + + true + + + + Bengalese tijd + + true + + + + Bering-tijd + Bering-standaardtijd + Bering-zomertijd + + true + + + + Bhutaanse tijd + + true + + + + Boliviaanse tijd + + true + + + + Borneose tijd + Borneose zomertijd + + true + + + + Braziliaanse tijd + Braziliaanse zomertijd + + true + + + + Bruneise tijd + + true + + + + Kaapverdische tijd + Kaapverdische zomertijd + + true + + + + Chamorro-tijd + Chamorro-standaardtijd + + true + + + + Changbai-tijd + + true + + + + Chatham-standaardtijd + Chatham-zomertijd + + true + + + + Chileense tijd + Chileense zomertijd + + true + + + + Chinese tijd + Chinese standaardtijd + Chinese zomertijd + + + CT (China) + CST (China) + CDT (China) + + true + + + + Choibalsan-tijd + Choibalsan-zomertijd + + true + + + + Christmaseilandse tijd + + true + + + + Cocoseilandse tijd + + true + + + + Colombiaanse tijd + Colombiaanse zomertijd + + true + + + + Cookeilandse tijd + Cookeilandse halve zomertijd + + + + + Cubaanse tijd + Cubaanse standaardtijd + Cubaanse zomertijd + + + CST (Cuba) + CDT (Cuba) + + true + + + + Dhaka-tijd + + true + + + + Davis-tijd + + true + + + true + + + + Dumont-d'Urville-tijd + + true + + + + Dushanbe-tijd + Dushanbe-zomertijd + + true + + + + Nederlands-Guyaanse tijd + + + + + Oost-Timorese tijd + + true + + + + Paaseilandse tijd + Paaseilandse zomertijd + + true + + + + Ecuadoriaanse tijd + + true + + + + Midden-Europese standaardtijd + Midden-Europese zomertijd + + + + + Oost-Europese standaardtijd + Oost-Europese zomertijd + + + + + West-Europese tijd + West-Europese zomertijd + + true + + + + Falklandeilandse tijd + Falklandeilandse zomertijd + + true + + + + Fijische tijd + Fijische zomertijd + + true + + + + Frans-Guyaanse tijd + + true + + + + Franse zuidelijke en Antarctische tijd + + true + + + + Frunze-tijd + Frunze-zomertijd + + + + + Greenwich Mean Time + + true + + + + Galapagoseilandse tijd + + true + + + + Gambiereilandse tijd + + true + + + + Georgia-tijd + Georgia-zomertijd + + true + + + + Gilberteilandse tijd + + true + + + true + + + + Centraal-Groenlandse tijd + Centraal-Groenlandse zomertijd + + true + + + + Oost-Groenlandse tijd + Oost-Groenlandse zomertijd + + true + + + + West-Groenlandse tijd + West-Groenlandse zomertijd + + true + + + + Guamese standaardtijd + + + GST (Guam) + + + + + Golf-tijd + Golf-standaardtijd + + true + + + + Guyaanse tijd + + true + + + + Hawaii-Aleoetische standaardtijd + + true + + + + Hongkong-tijd + Hongkong-zomertijd + + true + + + + Hovd-tijd + Hovd-zomertijd + + true + + + + Indiaase standaardtijd + + true + + + + Indische Oceaan-tijd + + true + + + + Indochinese tijd + + true + + + + Centraal-Indonesische tijd + + true + + + + Oost-Indonesische tijd + + true + + + + West-Indonesische tijd + + true + + + + Iraanse standaardtijd + Iraanse zomertijd + + true + + + + Irkoetsk-tijd + Irkoetsk-zomertijd + + true + + + + Israëlische tijd + Israëlische standaardtijd + Israëlische zomertijd + + + IST (Israël) + + true + + + + Japanse tijd + Japanse standaardtijd + Japanse zomertijd + + true + + + + Petropavlovsk-Kamtsjatski-tijd + Petropavlovsk-Kamtsjatski-zomertijd + + true + + + + Karachi-tijd + + true + + + + Kashgar-tijd + + true + + + + Oost-Kazachse tijd + Oost-Kazachse standaardtijd + + true + + + + West-Kazachse tijd + West-Kazachse standaardtijd + + true + + + + Kizilorda-tijd + Kizilorda-zomertijd + + true + + + + Koreaanse tijd + Koreaanse standaardtijd + Koreaanse zomertijd + + true + + + + Kosraese tijd + + + + + Krasnojarsk-tijd + Krasnojarsk-zomertijd + + true + + + + Kuybyshev standaardtijd + Kuybyshev-tijd + Kuybyshev-zomertijd + + true + + + + Kwajaleinse tijd + + true + + + + Kirgizische tijd + + true + + + + Lanka-tijd + + true + + + + Line-eilandse tijd + + + + + Long-Shu-tijd + + true + + + + Lord Howe-tijd + Lord Howe-standaardtijd + Lord Howe-zomertijd + + true + + + + Macause tijd + Macause zomertijd + + true + + + + Magadan-tijd + Magadan-zomertijd + + true + + + + Malakka-tijd + + true + + + + Maleisische tijd + + true + + + + Maldivische tijd + + true + + + + Marquesaseilandse tijd + + true + + + + Marshalleilandse tijd + + true + + + + Mauritiaanse tijd + + true + + + + Mawson-tijd + + true + + + + Ulaanbaatar-tijd + Ulaanbaatar-zomertijd + + true + + + + Moskou-tijd + Moskou-standaardtijd + Moskou-zomertijd + + true + + + + Myanmarese tijd + + true + + + + Nauruaanse tijd + + true + + + + Nepalese tijd + + true + + + + Nieuw-Caledonische tijd + Nieuw-Caledonische zomertijd + + true + + + + Nieuw-Zeelandse tijd + Nieuw-Zeelandse standaardtijd + Nieuw-Zeelandse zomertijd + + true + + + + Newfoundland-tijd + Newfoundland-standaardtijd + Newfoundland-zomertijd + + true + + + + Niuese tijd + + true + + + + Norfolkeilandse tijd + + true + + + + Fernando de Noronha-tijd + Fernando de Noronha-zomertijd + + true + + + + Noordelijk Mariaanse tijd + + true + + + + Novosibirsk-tijd + Novosibirsk-zomertijd + + true + + + + Omsk-tijd + Omsk-zomertijd + + true + + + true + + + + Pakistaanse tijd + Pakistaanse zomertijd + + true + + + + Belause tijd + + true + + + + Papoea-Nieuw-Guinea-tijd + + true + + + + Paraguayaanse tijd + Paraguayaanse zomertijd + + true + + + + Peruaanse tijd + Peruaanse zomertijd + + true + + + + Filipijnse tijd + Filipijnse zomertijd + + true + + + + Phoenixeilandse tijd + + true + + + + Pierre en Miquelon-tijd + Pierre en Miquelon-standaardtijd + Pierre en Miquelon-zomertijd + + true + + + + Pitcairnse tijd + + true + + + + Pohnpeise tijd + + true + + + + Qyzylorda-tijd + Qyzylorda-zomertijd + + true + + + + Réunionse tijd + + true + + + + Rothera-tijd + + true + + + + Sachalin-tijd + Sachalin-zomertijd + + true + + + + Samara-tijd + Samara-zomertijd + + true + + + + Samarkand-tijd + Samarkand-zomertijd + + true + + + + Samoaanse standaardtijd + + true + + + + Seychelse tijd + + true + + + + Shevchenko-tijd + Shevchenko-zomertijd + + true + + + + Singaporese standaardtijd + + true + + + + Solomoneilandse tijd + + true + + + + Zuid-Georgische tijd + + + GST (Z. Georgië) + + true + + + + Surinaamse tijd + + true + + + + Sverdlovsk-tijd + Sverdlovsk-zomertijd + + true + + + + Syowa-tijd + + true + + + + Tahitiaanse tijd + + true + + + + Tadzjiekse tijd + + true + + + + Tasjkent-tijd + Tasjkent-zomertijd + + true + + + + Tbilisi-tijd + Tbilisi-zomertijd + + true + + + + Tokelause tijd + + true + + + + Tongaanse tijd + Tongaanse zomertijd + + true + + + + Chuukse tijd + + true + + + + Turkse tijd + Turkse zomertijd + + true + + + + Turkmeense tijd + Turkmeense zomertijd + + true + + + + Tuvaluaanse tijd + + true + + + + Oral-tijd + Oral-zomertijd + + true + + + + Uruguayaanse tijd + Uruguayaanse zomertijd + + true + + + + Ürümqi-tijd + + true + + + + Oezbeekse tijd + Oezbeekse zomertijd + + true + + + + Vanuatuaanse tijd + Vanuatuaanse zomertijd + + true + + + + Venezolaanse tijd + + true + + + + Vladivostok-tijd + Vladivostok-zomertijd + + true + + + + Wolgograd-tijd + Wolgograd-zomertijd + + true + + + + Vostok-tijd + + true + + + + Wake-eilandse tijd + + true + + + + Wallis en Futunase tijd + + true + + + + Jakoetsk-tijd + Jakoetsk-zomertijd + + true + + + + Jekaterinenburg-tijd + Jekaterinenburg-zomertijd + + true + + + + Jerevan-tijd + Jerevan-zomertijd + + true + + + + Yukon-tijd + Yukon-standaardtijd + Yukon-zomertijd + + true + + + + + + , + . + ; + % + 0 + # + + + - + E + + + NaN + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + ¤ #,##0.00;¤ #,##0.00- + + + {0} {1} + + + + Andorrese peseta + Andorrese peseta + Andorrese peseta + + + Verenigde Arabische Emiraten-dirham + Verenigde Arabische Emiraten-dirham + Verenigde Arabische Emiraten-dirham + + + Afghani (1927-2002) + Afghani (AFA) + Afghani (AFA) + + + Afghani + Afghani + Afghani + Af + + + Albanese lek + Albanese lek + Albanese lek + lek + + + Armeense dram + dram + + + Nederlands-Antilliaanse gulden + NA f. + + + Angolese kwanza + + + Angolese kwanza (1977-1990) + + + Angolese nieuwe kwanza (1990-2000) + + + Angolese kwanza reajustado (1995-1999) + + + Argentijnse austral + + + Argentijnse peso (1983-1985) + + + Argentijnse peso + Arg$ + + + Oostenrijkse schilling + + + Australische dollar + $A + + + Arubaanse gulden + + + Azerbeidzjaanse manat (1993-2006) + + + Azerbeidzjaanse manat + + + Bosnische dinar + + + Bosnische convertibele mark + KM + + + Barbadaanse dollar + BDS$ + + + Bengalese taka + Tk + + + Belgische frank (convertibel) + + + Belgische frank + BF + + + Belgische frank (financieel) + + + Bulgaarse harde lev + lev + + + Bulgaarse nieuwe lev + + + Bahreinse dinar + BD + + + Burundese franc + Fbu + + + Bermuda-dollar + Ber$ + + + Bruneise dollar + + + Boliviano + Bs + + + Boliviaanse peso + + + Boliviaanse mvdol + + + Braziliaanse cruzeiro novo (1967-1986) + + + Braziliaanse cruzado + + + Braziliaanse cruzeiro (1990-1993) + + + Braziliaanse real + + + Braziliaanse cruzado novo + + + Braziliaanse cruzeiro + + + Bahamaanse dollar + + + Bhutaanse ngultrum + Nu + + + Birmese kyat + + + Botswaanse pula + + + Wit-Russische nieuwe roebel (1994-1999) + + + Wit-Russische roebel + Rbl + + + Belizaanse dollar + BZ$ + + + Canadese dollar + Can$ + + + Congolese franc + + + WIR euro + + + Zwitserse franc + SwF + + + WIR franc + + + Chileense unidades de fomento + + + Chileense peso + Ch$ + + + Chinese yuan renminbi + Y + + + Colombiaanse peso + Col$ + + + Unidad de Valor Real + + + Costaricaanse colón + C + + + Oude Servische dinar + + + Tsjechoslowaakse harde koruna + + + Cubaanse peso + + + Kaapverdische escudo + CVEsc + + + Cyprisch pond + £C + + + Tsjechische koruna + + + Oost-Duitse ostmark + + + Duitse mark + + + Djiboutiaanse franc + DF + + + Deense kroon + DKr + + + Dominicaanse peso + RD$ + + + Algerijnse dinar + DA + + + Ecuadoraanse sucre + + + Ecuadoraanse unidad de valor constante (UVC) + + + Estlandse kroon + + + Egyptisch pond + + + Ekwele + + + Eritrese nakfa + + + Spaanse peseta (account A) + + + Spaanse peseta (convertibele account) + + + Spaanse peseta + + + + Ethiopische birr + Br + + + euro + + + Finse markka + + + Fiji dollar + F$ + + + Falklandeilands pond + + + Franse franc + + + Brits pond sterling + GBP + + + Georgische kupon larit + + + Georgische lari + lari + + + Ghanese cedi (1979-2007) + + + Ghanese cedi + GH¢ + + + Gibraltarees pond + + + Gambiaanse dalasi + + + Guinese franc + GF + + + Guinese syli + + + Equatoriaal-Guinese ekwele guineana + + + Griekse drachme + + + Guatemalteekse quetzal + Q + + + Portugees-Guinese escudo + + + Guinee-Bissause peso + + + Guyaanse dollar + G$ + + + Hongkongse dollar + HK$ + + + Hondurese lempira + L + + + Kroatische dinar + + + Kroatische kuna + + + Haïtiaanse gourde + + + Hongaarse forint + Ft + + + Indonesische rupiah + Rp + + + Iers pond + IR£ + + + Israëlisch pond + + + Israëlische nieuwe shekel + + + Indiase rupee + INR + + + Iraakse dinar + ID + + + Iraanse rial + RI + + + IJslandse kroon + + + Italiaanse lire + + + + Jamaicaanse dollar + J$ + + + Jordaanse dinar + JD + + + Japanse yen + JPY + + + Keniaanse shilling + K Sh + + + Kirgizische som + som + + + Cambodjaanse riel + CR + + + Comorese franc + CF + + + Noord-Koreaanse won + + + Zuid-Koreaanse won + + + Koeweitse dinar + KD + + + Caymaneilandse dollar + + + Kazachstaanse tenge + T + + + Laotiaanse kip + + + Libanees pond + LL + + + Srilankaanse rupee + SL Re + + + Liberiaanse dollar + + + Lesothaanse loti + M + + + Maloti + + + Litouwse litas + + + Litouwse talonas + + + Luxemburgse convertibele franc + + + Luxemburgse frank + + + Luxemburgse financiële franc + + + Letse lats + + + Letse roebel + + + Libische dinar + LD + + + Marokkaanse dirham + + + Marokkaanse franc + + + Moldavische leu + + + Malagassische ariary + + + Malagassische franc + + + Macedonische denar + MDen + + + Malinese franc + + + Myanmarese kyat + + + Mongoolse tugrik + Tug + + + Macause pataca + + + Mauritaanse ouguiya + UM + + + Maltese lire + Lm + + + Maltees pond + + + Mauritiaanse rupee + + + Maldivische rufiyaa + + + Malawische kwacha + MK + + + Mexicaanse peso + MEX$ + + + Mexicaanse zilveren peso (1861-1992) + + + Mexicaanse unidad de inversion (UDI) + + + Maleisische ringgit + RM + + + Mozambikaanse escudo + + + Oude Mozambikaanse metical + Mt + + + Mozambikaanse metical + MTN + + + Namibische dollar + N$ + + + Nigeriaanse naira + + + Nicaraguaanse córdoba + + + Nicaraguaanse córdoba oro + + + Nederlandse gulden + fl + + + Noorse kroon + NKr + + + Nepalese rupee + Nrs + + + Nieuw-Zeelandse dollar + $NZ + + + Omaanse rial + RO + + + Panamese balboa + + + Peruaanse inti + + + Peruaanse nieuwe sol + + + Peruaanse sol + + + Papuaanse kina + + + Filipijnse peso + Php + + + Pakistaanse rupee + Pra + + + Poolse zloty + Zl + + + Poolse zloty (1950-1995) + + + Portugese escudo + + + Paraguayaanse guarani + + + Qatarese rial + QR + + + Rhodesische dollar + + + Oude Roemeense leu + leu + + + Roemeense leu + lei + + + Servische dinar + + + Russische roebel + + + Russische roebel (1991-1998) + + + Rwandese franc + + + Saoedische rial + SRl + + + Salomonseilandse dollar + SI$ + + + Seychelse rupee + SR + + + Soedanese dinar + + + Soedanese pond + + + Soedanees pond + + + Zweedse kroon + SKr + + + Singaporese dollar + S$ + + + Sint-Heleense pond + + + Sloveense tolar + + + Slowaakse koruna + Sk + + + Sierraleoonse leone + + + Somalische shilling + Sh. + + + Surinaamse dollar + + + Surinaamse gulden + Sf + + + Santomese dobra + Db + + + Sovjet-roebel + + + Salvadoraanse colón + + + Syrisch pond + LS + + + Swazische lilangeni + E + + + Thaise baht + + + Tadzjikistaanse roebel + + + Tadzjikistaanse somoni + + + Turkmeense manat + + + Tunesische dinar + + + Tongaanse paʻanga + T$ + + + Timorese escudo + + + Turkse lire + oude Turkse lira + oude Turkse lira + TL + + + Nieuwe Turkse lire + Turkse lira + Turkse lira + + + Trinidad en Tobago-dollar + TT$ + + + Nieuwe Taiwanese dollar + NT$ + + + Tanzaniaanse shilling + T Sh + + + Oekraïense hryvnia + + + Oekraïense karbovanetz + + + Oegandese shilling (1966-1987) + + + Oegandese shilling + U Sh + + + Amerikaanse dollar + USD + + + Amerikaanse dollar (volgende dag) + + + Amerikaanse dollar (zelfde dag) + + + Uruguayaanse peso en geïndexeerde eenheden + + + Uruguayaanse peso (1975-1993) + + + Uruguayaanse peso uruguayo + Ur$ + + + Oezbekistaanse sum + + + Venezolaanse bolivar + Be + + + Venezolaanse sterke bolivar + BsF + + + Vietnamese dong + + + Vanuatuaanse vatu + VT + + + West-Samoaanse tala + + + CFA-franc BEAC + + + Zilver + + + Goud + + + Europese samengestelde eenheid + + + Europese monetaire eenheid + + + Europese rekeneenheid (XBC) + + + Europese rekeneenheid (XBD) + + + Oost-Caribische dollar + EC$ + + + Special Drawing Rights + + + European Currency Unit + + + Franse gouden franc + + + Franse UIC-franc + + + CFA-franc BCEAO + + + Palladium + + + CFP-franc + CFPF + + + Platina + + + RINET-fondsen + + + Valutacode voor testdoeleinden + + + Geen valuta + onbekende/ongeldige munteenheid + + + Jemenitische dinar + + + Jemenitische rial + YRl + + + Joegoslavische harde dinar + + + Joegoslavische noviy-dinar + + + Joegoslavische convertibele dinar + + + Zuid-Afrikaanse rand (financieel) + + + Zuid-Afrikaanse rand + R + + + Zambiaanse kwacha + + + Zaïrese nieuwe zaïre + + + Zaïrese zaïre + + + Zimbabwaanse dollar + Z$ + + + + + + {0} dag + {0} dagen + + + {0} uur + {0} uur + + + {0} minuut + {0} minuten + + + {0} maand + {0} maanden + + + {0} seconde + {0} seconden + + + {0} week + {0} weken + + + {0} jaar + {0} jaar + + + + + ja:j + nee:n + + + diff --git a/libs/Zend/Locale/Data/nl_BE.xml b/libs/Zend/Locale/Data/nl_BE.xml new file mode 100644 index 0000000..c4683a1 --- /dev/null +++ b/libs/Zend/Locale/Data/nl_BE.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + Lets + Occitaans (na 1500); Provençaals + Servo-Kroatisch + Nilo-Saharaans + + + Centraal-Amerika + Het Eiland Man + Malediven + Salomoneilanden + + + Traditioneel + + + + + + + + + d-MMM-yyyy + + + + + d/MM/yy + + + + + + + E d/MM - E d/MM + E d/MM - E d/MM + + + d/MM - d/MM + d/MM - d/MM + + + MM/yy - MM/yy + MM/yy - MM/yy + + + E d/MM/yy - E d/MM/yy + E d/MM/yy - E d/MM/yy + E d/MM/yy - E d/MM/yy + + + d/MM/yy - d/MM/yy + d/MM/yy - d/MM/yy + d/MM/yy - d/MM/yy + + + + + + + + + + + #,##0.00 ¤ + + + + + + diff --git a/libs/Zend/Locale/Data/nl_NL.xml b/libs/Zend/Locale/Data/nl_NL.xml new file mode 100644 index 0000000..6428e0b --- /dev/null +++ b/libs/Zend/Locale/Data/nl_NL.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/nn.xml b/libs/Zend/Locale/Data/nn.xml new file mode 100644 index 0000000..4f12164 --- /dev/null +++ b/libs/Zend/Locale/Data/nn.xml @@ -0,0 +1,1640 @@ + + + + + + + + + + + {0} ({1}) + , + + + afar + abkhasisk + achinesisk + acoli + adangme + adyghe + avestisk + afrikaans + afroasiatisk språk + afrihili + ainu + akan + akkadisk + aleutisk + algonkinsk språk + sør-altai + amharisk + aragonsk + gammalengelsk + angika + apache-språk + arabisk + arameisk + araukansk + arapaho + kunstig språk + arawak + assamisk + asturisk + athapaskansk språk + australsk språk + avarisk + awadhi + aymara + aserbajdsjansk + basjkirsk + banda + bamilekisk språk + baluchi + balinesisk + basa + baltisk språk + kviterussisk + beja + bemba + berbisk + bulgarsk + bihari + bhojpuri + bislama + bikol + bini + siksika + bambara + bengali + bantu + tibetansk + bretonsk + braj + bosnisk + batak + burjatisk + buginesisk + blin + katalansk + caddo + sentralamerikansk indiansk språk + karibisk + kaukasisk språk + atsam + tsjetsjensk + cebuansk + keltisk språk + chamorro + chibcha + chagatai + chuukesisk + mari + chinook + choctaw + chipewiansk + cherokee + cheyenne + kamisk språk + korsikansk + koptisk + engelskbasert kreol- eller pidginspråk + franskbasert kreol- eller pidginspråk + portugisiskbasert kreol- eller pidginspråk + cree + krimtatarisk + kreol- eller pidginspråk + tsjekkisk + kasjubisk + kyrkjeslavisk + kusjitisk språk + tsjuvansk + walisisk + dansk + dakota + dargwa + dayak + tysk + delaware + slavej + dogrib + dinka + dogri + dravidisk språk + lågsorbisk + duala + mellumnederlandsk + divehi + dyula + dzongkha + ewe + efik + gammalegyptisk + ekajuk + gresk + elamittisk + engelsk + engelsk (amerikansk) + mellomengelsk + esperanto + spansk + estisk + baskisk + ewondo + persisk + fang + fanti + fulani + finsk + filippinsk + finsk-ugrisk språk + fijiansk + færøysk + fon + fransk + mellomfransk + gammalfransk + nordfrisisk + austfrisisk + friuliansk + vestfrisisk + irsk + ga + gayo + gbaya + skotsk-gælisk + germansk språk + ges + kiribatisk + galicisk + mellomhøgtysk + guarani + gammalhøgtysk + gondi + gorontalo + gotisk + grebo + gammalgresk + sveitsertysk + gujarati + manx + gwichin + hausa + haida + hawaiisk + hebraisk + hindi + hiligaynon + himachali + hettittisk + hmong + hiri motu + kroatisk + høgsorbisk + haitisk + ungarsk + hupa + armensk + herero + interlingua + iban + indonesisk + interlingue + ibo + sichuan-yi + ijo + inupiak + iloko + indisk språk + indo-europeisk språk + ingusjisk + ido + iransk + irokansk språk + islandsk + italiensk + inuktitut + japansk + lojban + jødepersisk + jødearabisk + javanesisk + georgisk + karakalpakisk + kabylsk + kachin + jju + kamba + karensk + kawi + kabardisk + tyap + koro + kikongo + khasi + khoisanspråk + khotanesisk + kikuyu + kuanyama + kasakhisk + kalaallisut; grønlandsk + khmer + kimbundu + kannada + koreansk + konkani + kosraeansk + kpelle + kanuri + karachay-balkar + karelsk + kru + kurukh + kasjmiri + kurdisk + kumyk + kutenai + komi + kornisk + kirgisisk + latin + ladinsk + lahnda + lamba + luxemburgsk + lezghian + ganda + limburgisk + lingala + laotisk + mongo + lozi + litauisk + luba-katanga + luba-lulua + luiseno + lunda + luo + lushai + latvisk + maduresisk + magahi + maithili + makasar + mandingo + austronesisk + masai + moksha + mandar + mende + madagassisk + mellomirsk + marshallesisk + maori + micmac + minangkabau + anna språk + makedonsk + mon-khmerspråk + malayalam + mongolsk + mandsju + manipuri + manobospråk + moldavisk + mohawk + mossi + marathi + malayisk + maltesisk + fleire språk + mundaspråk + creek + mirandesisk + marwari + burmesisk + mayaspråk + erzya + nauru + nahuatl + nordamerikansk indiansk språk + napolitansk + bokmål + nord-ndebele + lågtysk + nepalsk + newari + ndonga + nias + niger-kordofaniansk språk + niueansk + nederlandsk + nynorsk + norsk + nogai + gammalnorsk + n'ko + sør-ndebele + nordsotho + nubisk språk + navajo + klassisk newarisk + nyanja + nyamwezi + nyankole + nyoro + nzima + oksitansk + ojibwa + oromo + oriya + ossetisk + osage + ottomansk tyrkisk + otomisk språk + panjabi + papuisk språk + pangasinan + pahlavi + pampanga + papiamento + palauisk + gammalpersisk + filippinsk språk + fønikisk + pali + polsk + ponapisk + prakrit-språk + gammalprovençalsk + pashto + portugisisk + quechua + rajasthani + rapanui + rarotongansk + retoromansk + rundi + rumensk + romansk språk + romani + rot + russisk + aromansk + kinjarwanda + sanskrit + sandawe + jakutsk + søramerikansk indiansk språk + salishansk språk + samaritansk arameisk + sasak + santali + sardinsk + siciliansk + skotsk + sindhi + nordsamisk + selkupisk + semittisk språk + sango + gammalirsk + teiknspråk + serbokroatisk + shan + singalesisk + sidamo + sioux-språk + sino-tibetansk språk + slovakisk + slovensk + slavisk språk + samoansk + sørsamisk + samisk språk + lulesamisk + enaresamisk + skoltesamisk + shona + soninke + somali + sogdisk + songhai + albansk + serbisk + sranan tongo + serer + swati + nilo-saharaspråk + sørsotho + sundanesisk + sukuma + susu + sumerisk + svensk + swahili + klassisk syrisk + syrisk + tamil + taispråk + telugu + temne + tereno + tetum + tatsjikisk + thai + tigrinja + tigré + tivi + turkmensk + tokelau + tagalog + klingon + tlingit + tamasjek + tswana + tonga (Tonga-øyane) + tonga (Nyasa) + tok pisin + tyrkisk + tsonga + tsimshian + tatarisk + tumbuka + tupi-språk + altaisk språk + tuvalu + twi + tahitisk + tuvinisk + udmurt + uigurisk + ugaritisk + ukrainsk + umbundu + ikkje bestemt + urdu + usbekisk + vai + venda + vietnamesisk + volapyk + votisk + vallonsk + wakasjansk språk + walamo + waray + washo + sorbisk språk + wolof + kalmyk + xhosa + yao + yapesisk + jiddisk + joruba + jupisk språk + zhuang + zapotec + blissymbol + zenaga + kinesisk + forenkla kinesisk + tradisjonell kinesisk + zande + zulu + zuni + utan språkleg innhald + zaza + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + verda + Afrika + Nord-Amerika + Sør-Amerika + Oseania + Vest-Afrika + Sentral-Amerika + Aust-Afrika + Nord-Afrika + Sentral-Afrika + Sørlege Afrika + Amerika + nordlege Amerika + Karibia + Aust-Asia + Sør-Asia + Søraust-Asia + Sør-Europa + Australia og New Zealand + Melanesia + Mikronesia + Polynesia + Sørlege Sentral-Asia + Asia + Sentral-Asia + Vest-Asia + Europa + Aust-Europa + Nord-Europa + Vest-Europa + Samveldet av uavhengige statar + Latin-Amerika og Karibia + Kanaløyane + Andorra + Dei sameinte arabiske emirata + Afghanistan + Antigua og Barbuda + Anguilla + Albania + Armenia + Dei nederlandske Antillane + Angola + Antarktis + Argentina + Amerikansk Samoa + Austerrike + Australia + Aruba + Åland + Aserbajdsjan + Bosnia og Hercegovina + Barbados + Bangladesh + Belgia + Burkina Faso + Bulgaria + Bahrain + Burundi + Benin + Bermuda + Brunei Darussalam + Bolivia + Brasil + Bahamas + Bhutan + Bouvetøya + Botswana + Kviterussland + Belize + Canada + Kokosøyane + Kongo-Kinshasa + Den sentralafrikanske republikken + Kongo-Brazzaville + Sveits + Elfenbeinskysten + Cookøyane + Chile + Kamerun + Kina + Colombia + Costa Rica + Serbia og Montenegro + Cuba + Kapp Verde + Christmasøya + Kypros + Tsjekkia + Tyskland + Djibouti + Danmark + Dominica + Den dominikanske republikken + Algerie + Ecuador + Estland + Egypt + Vest-Sahara + Eritrea + Spania + Etiopia + Finland + Fiji + Falklandsøyane + Mikronesiaføderasjonen + Færøyane + Frankrike + Gabon + Storbritannia + Grenada + Georgia + Fransk Guyana + Guernsey + Ghana + Gibraltar + Grønland + Gambia + Guinea + Guadeloupe + Ekvatorial-Guinea + Hellas + Sør-Georgia og Sør-Sandwich-øyane + Guatemala + Guam + Guinea-Bissau + Guyana + Hongkong + Heard- og McDonaldsøyane + Honduras + Kroatia + Haiti + Ungarn + Indonesia + Irland + Israel + Man + India + Britiske område i Det indiske hav + Irak + Iran + Island + Italia + Jersey + Jamaica + Jordan + Japan + Kenya + Kirgisistan + Kambodsja + Kiribati + Komorene + St. Christopher og Nevis + Nord-Korea + Sør-Korea + Kuwait + Caymanøyane + Kasakhstan + Laos + Libanon + St. Lucia + Liechtenstein + Sri Lanka + Liberia + Lesotho + Litauen + Luxembourg + Latvia + Libya + Marokko + Monaco + Moldova + Montenegro + Madagaskar + Marshalløyane + Makedonia + Mali + Myanmar + Mongolia + Macao + Nord-Marianane + Martinique + Mauritania + Montserrat + Malta + Mauritius + Maldivane + Malawi + Mexico + Malaysia + Mosambik + Namibia + Ny-Caledonia + Niger + Norfolkøyane + Nigeria + Nicaragua + Nederland + Noreg + Nepal + Nauru + Niue + New Zealand + Oman + Panama + Peru + Fransk Polynesia + Papua Ny-Guinea + Filippinane + Pakistan + Polen + St. Pierre og Miquelon + Pitcairn + Puerto Rico + Palestinsk territorium + Portugal + Palau + Paraguay + Qatar + Ytre Oseania + Den europeiske unionen + Réunion + Romania + Serbia + Russland + Rwanda + Saudi Arabia + Salomonøyane + Seychellane + Sudan + Sverige + Singapore + Saint Helena + Slovenia + Svalbard og Jan Mayen + Slovakia + Sierra Leone + San Marino + Senegal + Somalia + Surinam + São Tomé og Príncipe + El Salvador + Syria + Swaziland + Turks- og Caicosøyane + Tchad + Franske sørområde + Togo + Thailand + Tadsjikistan + Tokelau + Aust-Timor + Turkmenistan + Tunisia + Tonga + Tyrkia + Trinidad og Tobago + Tuvalu + Taiwan + Tanzania + Ukraina + Uganda + USAs ytre småøyar + USA + Uruguay + Usbekistan + Vatikanstaten + St. Vincent og Grenadinane + Venezuela + Jomfruøyane (britisk) + Jomfruøyane (USA) + Vietnam + Vanuatu + Wallis og Futuna + Samoa + Yemen + Mayotte + Sør-Afrika + Zambia + Zimbabwe + (ukjent eller ugyldig område) + + + tradisjonell tysk ortografi + tysk ortografi frå 1996 + austarmensk + vestarmensk + boontling + det internasjonale fonetiske alfabetet (IPA) + det uralske fonetiske alfabetet UPA + monotonisk rettskriving + polytonisk rettskriving + revidert rettskriving + resisk dialekt + saaho-dialekt + scouse-dialekt + valensisk dialekt + + + kalender + kollasjon + valuta + + + tradisjonell kinesisk sortering + buddhistisk kalender + kinesisk kalender + direkte sortering + forenkla kinesisk sortering + gregoriansk kalender + hebraisk kalender + islamsk kalender + islamsk sivil kalender + japansk kalender + telefonkatalogsortering + pinyin-sortering + streksortering + tradisjonell sortering + + + amerikansk + metrisk + + + + [a à b-e é f-o ó ò ô p-z æ ø å] + [á ǎ č ç đ è ê ń ñ ŋ š ŧ ü ž ä ö] + [a-z] + + + « + » + + + + + + + + + + jan + feb + mar + apr + mai + jun + jul + aug + sep + okt + nov + des + + + januar + februar + mars + april + mai + juni + juli + august + september + oktober + november + desember + + + + + J + F + M + A + M + J + J + A + S + O + N + D + + + + + + + sø. + + ty + on + to + fr + la + + + søndag + måndag + tysdag + onsdag + torsdag + fredag + laurdag + + + + + må. + la. + + + S + M + T + O + T + F + L + + + + + + + K1 + K2 + K3 + K4 + + + 1. kvartal + 2. kvartal + 3. kvartal + 4. kvartal + + + + formiddag + ettermiddag + + + f.Kr. + e.Kr. + + + f.Kr. + e.Kr. + + + + + + EEEE d. MMMM yyyy + + + + + d. MMMM yyyy + + + + + d. MMM. yyyy + + + + + dd.MM.yy + + + + + + + 'kl'. HH.mm.ss v + + + + + HH.mm.ss z + + + + + HH.mm.ss + + + + + HH.mm + + + + + + + {1} {0} + + + + d. MMMM + dd.MM + mm.ss + MM.yy + Q yy + MMMM yyyy + + + {0} – {1} + + M-M + + + E dd.MM - E dd.MM + E dd.MM - E dd.MM + + + MMM-MMM + + + E d. MMM - E d. MMM + E d. - E d. MMM + + + d. MMM - d. MMM + d.-d. MMM + + + dd.MM - dd.MM + dd.MM - dd.MM + + + d-d + + + HH-HH + + + HH.mm-HH.mm + HH.mm-HH.mm + + + HH.mm-HH.mm v + HH.mm-HH.mm v + + + HH-HH v + + + y-y + + + MM.yy - MM.yy + MM.yy - MM.yy + + + E dd.MM.yy - E dd.MM.yy + E dd.MM.yy - E dd.MM.yy + E dd.MM.yy - E dd.MM.yy + + + MMM-MMM yyyy + MMM yyyy - MMM yyyy + + + E d. MMM - E d. MMM yyyy + E d. - E d. MMM yyyy + E d. MMM yyyy - E d. MMM yyyy + + + d. MMM - d. MMM yyyy + d.-d. MMM yyyy + d. MMM yyyy - d. MMM yyyy + + + dd.MM.yy - dd.MM.yy + dd.MM.yy - dd.MM.yy + dd.MM.yy - dd.MM.yy + + + + + + æra + + + år + + + månad + + + veke + + + dag + i dag + i morgon + i går + + + vekedag + + + f.m./e.m.-val + + + time + + + minutt + + + sekund + + + sone + + + + + + +HH.mm;-HH.mm + GMT{0} + {0} + + ukjend + + + Sørpolen + + + Påskeøya + + + Kapp Verde + + + Kanariøyane + + + Godthåb + + + Hongkong + + + Luxemburg + + + Ulan Bator + + + Mauritania + + + Maldivane + + + Mexico by + + + Azorane + + + Lisboa + + + Moskva + + + Tasjkent + + + + sentralafrikansk tid + + + + + austafrikansk tid + + + + + sørafrikansk tid + sørafrikansk standardtid + + + + + vestafrikansk tid + vestafrikansk sommartid + + + + + sentralaustralsk tid + sentralaustralsk standardtid + sentralaustralsk sommartid + + + + + vest-sentralaustralsk tid + vest-sentralaustralsk standardtid + vest-sentralaustralsk sommartid + + + + + austaustralsk tid + austaustralsk standardtid + austaustralsk sommartid + + + + + vestaustralsk tid + vestaustralsk standardtid + vestaustralsk sommartid + + + + + sentraleuropeisk tid + sentraleuropeisk sommartid + + + + + austeuropeisk tid + austeuropeisk sommartid + + + + + vesteuropeisk tid + vesteuropeisk sommartid + + + + + Greenwich middeltid + + + + + + + , +   + ; + % + 0 + + + + ×10^ + + + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0 % + + + + + + + #,##0.00 ¤ + + + {0} {1} + {0} {1} + + + + andorransk peseta + + + UAE dirham + + + afghani (1927-2002) + + + afghani + + + albansk lek + + + armensk dram + + + nederlansk antillegylden + + + angolsk kwanza + + + angolsk kwanza (1977-1990) + + + angolsk ny kwanza (1990-2000) + + + angolsk kwanza reajustado (1995-1999) + + + argentisk austral + + + argentinsk peso (1983-1985) + + + argentinsk peso + + + austerriksk schilling + + + australsk dollar + + + arubisk gylden + + + aserbaijansk manat + + + bosnisk-hercegovinsk dinar + + + bosnisk-hercegovinsk mark (konvertibel) + + + barbadisk dollar + + + bangladeshisk taka + + + belgisk franc (konvertibel) + + + belgisk franc + + + belgisk franc (finansiell) + + + bulgarsk hard lev + + + bulgarsk ny lev + + + bahrainsk dinar + + + burundisk franc + + + bermudisk dollar + + + bruneisk dollar + + + boliviano + + + bolivisk peso + + + bolivisk mvdol + + + brasiliansk cruzeiro novo (1967-1986) + + + brasiliansk cruzado + + + brasiliansk cruzeiro (1990-1993) + + + brasiliansk real + BRL + + + brasiliansk cruzado novo + + + brasiliansk cruzeiro + + + bahamisk dollar + + + bhutansk ngultrum + + + burmesisk kyat + + + kinesisk yuan renminbi + + + kappverdisk escudo + + + dansk krone + + + euro + EUR + + + britisk pund sterling + GBP + + + Guinea-Bissau-peso + + + indisk rupi + INR + + + japansk yen + JPY + + + mosambikisk metical + + + norsk krone + kr + + + russisk rubel + + + Sao Tome og Principe-dobra + + + amerikansk dollar + USD + + + CFA franc BCEAO + + + ukjend eller ugyldig valuta + + + sørafrikansk rand (finansiell) + + + sørafrikansk rand + + + zambisk kwacha + + + zairisk ny zaire + + + zairisk zaire + + + zimbabwisk dollar + + + + + + ja:j + nei:n + + + diff --git a/libs/Zend/Locale/Data/nn_NO.xml b/libs/Zend/Locale/Data/nn_NO.xml new file mode 100644 index 0000000..8ab5c64 --- /dev/null +++ b/libs/Zend/Locale/Data/nn_NO.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/no.xml b/libs/Zend/Locale/Data/no.xml new file mode 100644 index 0000000..5f9e756 --- /dev/null +++ b/libs/Zend/Locale/Data/no.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/libs/Zend/Locale/Data/nr.xml b/libs/Zend/Locale/Data/nr.xml new file mode 100644 index 0000000..efd60cd --- /dev/null +++ b/libs/Zend/Locale/Data/nr.xml @@ -0,0 +1,236 @@ + + + + + + + + + + + isiNdebele + + + + [a-z] + + + + + + + + + + + + + + Jan + Feb + Mat + Apr + Mey + Jun + Jul + Arh + Sep + Okt + Usi + Dis + + + Janabari + uFeberbari + uMatjhi + u-Apreli + Meyi + Juni + Julayi + Arhostosi + Septemba + Oktoba + Usinyikhaba + Disemba + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + Son + Mvu + Bil + Tha + Ne + Hla + Gqi + + + uSonto + uMvulo + uLesibili + Lesithathu + uLesine + ngoLesihlanu + umGqibelo + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + AM + PM + + + BC + AD + + + BC + AD + + + + + + EEEE, yyyy MMMM dd + + + + + yyyy MMMM d + + + + + yyyy MMM d + + + + + yy/MM/dd + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1} {0} + + + + Q yy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + , +   + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + ¤#,##0.00 + + + + + + R + + + + diff --git a/libs/Zend/Locale/Data/nr_ZA.xml b/libs/Zend/Locale/Data/nr_ZA.xml new file mode 100644 index 0000000..623df86 --- /dev/null +++ b/libs/Zend/Locale/Data/nr_ZA.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/nso.xml b/libs/Zend/Locale/Data/nso.xml new file mode 100644 index 0000000..920f6a8 --- /dev/null +++ b/libs/Zend/Locale/Data/nso.xml @@ -0,0 +1,238 @@ + + + + + + + + + + + Sesotho sa Leboa + + + + [a b d e ê f-o ô p r s š t u w-y] + [c q v z] + [a-z] + + + + + + + + + + + + + + Jan + Feb + Mat + Apo + Mei + Jun + Jul + Ago + Set + Okt + Nof + Dis + + + Janaware + Feberware + Matšhe + Aporele + Mei + June + Julae + Agostose + Setemere + Oktobore + Nofemere + Disemere + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + Son + Mos + Bed + Rar + Ne + Hla + Mok + + + Sontaga + Mosupalogo + Labobedi + Laboraro + Labone + Labohlano + Mokibelo + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + AM + PM + + + BC + AD + + + BC + AD + + + + + + EEEE, yyyy MMMM dd + + + + + yyyy MMMM d + + + + + yyyy MMM d + + + + + yy/MM/dd + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1} {0} + + + + Q yy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + , +   + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + ¤#,##0.00 + + + + + + R + + + + diff --git a/libs/Zend/Locale/Data/nso_ZA.xml b/libs/Zend/Locale/Data/nso_ZA.xml new file mode 100644 index 0000000..8e3f904 --- /dev/null +++ b/libs/Zend/Locale/Data/nso_ZA.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/ny.xml b/libs/Zend/Locale/Data/ny.xml new file mode 100644 index 0000000..5e8d21f --- /dev/null +++ b/libs/Zend/Locale/Data/ny.xml @@ -0,0 +1,195 @@ + + + + + + + + + + [a-p r-u w ŵ y z] + [q v x] + + + + + + + + Jan + Feb + Mal + Epu + Mei + Jun + Jul + Oga + Sep + Oku + Nov + Dis + + + Januwale + Febuluwale + Malichi + Epulo + Mei + Juni + Julai + Ogasiti + Seputemba + Okutoba + Novemba + Disemba + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + Mul + Lem + Wir + Tat + Nai + San + Wer + + + Lamulungu + Lolemba + Lachiwiri + Lachitatu + Lachinayi + Lachisanu + Loweruka + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + AM + PM + + + BC + AD + + + BC + AD + + + + + + EEEE, yyyy MMMM dd + + + + + yyyy MMMM d + + + + + yyyy MMM d + + + + + yy/MM/dd + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1} {0} + + + + Q yy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + + Malawian Kwacha + K + + + + diff --git a/libs/Zend/Locale/Data/ny_MW.xml b/libs/Zend/Locale/Data/ny_MW.xml new file mode 100644 index 0000000..c8e3c1a --- /dev/null +++ b/libs/Zend/Locale/Data/ny_MW.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/om.xml b/libs/Zend/Locale/Data/om.xml new file mode 100644 index 0000000..05d3ac0 --- /dev/null +++ b/libs/Zend/Locale/Data/om.xml @@ -0,0 +1,336 @@ + + + + + + + + + + + Afrikoota + Afaan Sidaamaa + Arabiffaa + Afaan Azerbaijani + Afaan Belarusia + Afaan Bulgariya + Afaan Bihari + Afaan Baangladeshi + Afaan Bosniyaa + Afaan Katalaa + Afaan Czech + Welishiffaa + Afaan Deenmaark + Afaan Jarmanii + Afaan Giriiki + Ingliffa + Afaan Esperantoo + Afaan Ispeen + Afaan Istooniya + Afaan Baskuu + Afaan Persia + Afaan Fiilaandi + Afaan Filippinii + Afaan Faroese + Afaan Faransaayii + Afaan Firisiyaani + Afaan Ayirishii + Scots Gaelic + Afaan Galishii + Afaan Guarani + Afaan Gujarati + Afaan Hebrew + Afaan Hindii + Afaan Croatian + Afaan Hangaari + Interlingua + Afaan Indoneziya + Ayiislandiffaa + Afaan Xaaliyaani + Afaan Japanii + Afaan Java + Afaan Georgian + Afaan Kannada + Afaan Korea + Afaan Laatini + Afaan Liituniyaa + Afaan Lativiyaa + Afaan Macedooniyaa + Malayaalamiffaa + Afaan Maratii + Malaayiffaa + Afaan Maltesii + Afaan Nepalii + Afaan Dachii + Afaan Norwegian + Afaan Norweyii + Afaan Occit + Oromoo + Afaan Punjabii + Afaan Polandii + Afaan Porchugaal + Afaan Portugali (Braazil) + Afaan Protuguese + Afaan Romaniyaa + Afaan Rushiyaa + Afaan Sinhalese + Afaan Slovak + Afaan Islovaniyaa + Afaan Albaniyaa + Afaan Serbiya + Afaan Sudaanii + Afaan Suwidiin + Suwahilii + Afaan Tamilii + Afaan Telugu + Afaan Tayii + Afaan Tigiree + Lammii Turkii + Afaan Kilingon + Afaan Turkii + Afaan Ukreenii + Afaan Urdu + Afaan Uzbek + Afaan Veetinam + Afaan Xhosa + Chinese + Afaan Zuulu + + + + + + Brazil + China + Germany + Itoophiyaa + France + United Kingdom + India + Italy + Japan + Keeniyaa + Russia + United States + + + + [a-z] + + + + + + + + Ama + Gur + Bit + Elb + Cam + Wax + Ado + Hag + Ful + Onk + Sad + Mud + + + Amajjii + Guraandhala + Bitooteessa + Elba + Caamsa + Waxabajjii + Adooleessa + Hagayya + Fuulbana + Onkololeessa + Sadaasa + Muddee + + + + + J + F + M + A + M + J + J + A + S + O + N + D + + + + + + + Dil + Wix + Qib + Rob + Kam + Jim + San + + + Dilbata + Wiixata + Qibxata + Roobii + Kamiisa + Jimaata + Sanbata + + + + + S + M + T + W + T + F + S + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + WD + WB + + + KD + KB + + + + + + EEEE, MMMM d, yyyy + + + + + dd MMMM yyyy + + + + + dd-MMM-yyyy + + + + + dd/MM/yy + + + + + + + h:mm:ss a v + + + + + h:mm:ss a z + + + + + h:mm:ss a + + + + + h:mm a + + + + + + + {1} {0} + + + + dd MMMM + dd/MM + MM/yy + Q yy + MMMM yyyy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + + + ¤#,##0.00 + + + + + + Brazilian Real + + + Chinese Yuan Renminbi + + + Itoophiyaa Birrii + $ + + + Euro + + + British Pound Sterling + + + Indian Rupee + + + Japanese Yen + + + Ksh + + + Russian Ruble + + + US Dollar + + + + diff --git a/libs/Zend/Locale/Data/om_ET.xml b/libs/Zend/Locale/Data/om_ET.xml new file mode 100644 index 0000000..3e01f66 --- /dev/null +++ b/libs/Zend/Locale/Data/om_ET.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/om_KE.xml b/libs/Zend/Locale/Data/om_KE.xml new file mode 100644 index 0000000..7c13206 --- /dev/null +++ b/libs/Zend/Locale/Data/om_KE.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + ETB + + + + diff --git a/libs/Zend/Locale/Data/or.xml b/libs/Zend/Locale/Data/or.xml new file mode 100644 index 0000000..18d68fd --- /dev/null +++ b/libs/Zend/Locale/Data/or.xml @@ -0,0 +1,234 @@ + + + + + + + + + + + ଓଡ଼ିଆ + + + ଭାରତ + + + + [୦-୯ ଅ-ଋ ଏ ଐ ଓ-ନ ପ-ର ଲ ଳ ଶ-ହ {ଡ଼}ଡ଼ {ଢ଼}ଢ଼ ୟ ୱ ଵ ଂ ଃ ଁ ୍ ଼ ା-ୃ େ ୈ ୋ ୌ] + [\u200C \u200D] + + + + + + + + ଜାନୁଆରୀ + ଫେବ୍ରୁୟାରୀ + ମାର୍ଚ୍ଚ + ଅପ୍ରେଲ + ମେ + ଜୁନ + ଜୁଲାଇ + ଅଗଷ୍ଟ + ସେପ୍ଟେମ୍ବର + ଅକ୍ଟୋବର + ନଭେମ୍ବର + ଡିସେମ୍ବର + + + ଜାନୁଆରୀ + ଫେବ୍ରୁୟାରୀ + ମାର୍ଚ୍ଚ + ଅପ୍ରେଲ + ମେ + ଜୁନ + ଜୁଲାଇ + ଅଗଷ୍ଟ + ସେପ୍ଟେମ୍ବର + ଅକ୍ଟୋବର + ନଭେମ୍ବର + ଡିସେମ୍ବର + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + ରବି + ସୋମ + ମଙ୍ଗଳ + ବୁଧ + ଗୁରୁ + ଶୁକ୍ର + ଶନି + + + ରବିବାର + ସୋମବାର + ମଙ୍ଗଳବାର + ବୁଧବାର + ଗୁରୁବାର + ଶୁକ୍ରବାର + ଶନିବାର + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + AM + PM + + + BCE + CE + + + + + + MMMM d,EEEE, yyyy + + + + + MMMM d, yyyy + + + + + dd-MM-yyyy + + + + + dd-MM-yy + + + + + + + h:mm:ss a v + + + + + h:mm:ss a z + + + + + h:mm:ss a + + + + + h:mm a + + + + + + + {1} {0} + + + + d MMMM + dd-MM + Q yy + MM-yyyy + MMMM yyyy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + . + , + + + + + + #,##,##0.### + + + + + + + #,##,##0% + + + + + + + ¤ #,##,##0.00 + + + + + + ଟଙକା + + + + + + ହଁ + ନା + + + diff --git a/libs/Zend/Locale/Data/or_IN.xml b/libs/Zend/Locale/Data/or_IN.xml new file mode 100644 index 0000000..5cdef6f --- /dev/null +++ b/libs/Zend/Locale/Data/or_IN.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/pa.xml b/libs/Zend/Locale/Data/pa.xml new file mode 100644 index 0000000..e6de59a --- /dev/null +++ b/libs/Zend/Locale/Data/pa.xml @@ -0,0 +1,329 @@ + + + + + + + + + + + ਅਬਖਾਜ਼ੀਅਨ + ਅਚੀਨੀ + ਅਕੋਲੀ + ਅਫ਼ਰੀਕੀ + ਅਪਾਚੇ ਭਾਸ਼ਾ + ਅਰਬੀ + ਅਸਾਮੀ + ਆਸਟਰੇਲੀਅਨ ਭਾਸ਼ਾ + ਅਜ਼ੇਰਬੈਜਨਿ + ਬੈਲਟਿਕ ਭਾਸ਼ਾ + ਬੇਲਾਰੂਸੀਅਨ + ਬੰਗਾਲੀ + ਡੈਨਿਸ਼ + ਜਰਮਨ + ਅੰਗਰੇਜ਼ੀ + ਏਸਪਰੇਂਟੋ + ਸਪੇਨਿਸ਼ + ਫਿਨਿਸ਼ + ਫਰੈਂਚ + ਗੁਜਰਾਤੀ + ਹਿੰਦੀ + ਇੰਡੋਨੇਸ਼ੀਆਈ + ਇਤਾਲਵੀ + ਜਾਪਾਨੀ + ਮੈਕੇਡੋਨੀਅਨ + ਡੱਚ + ਨਾਰਵੇਜੀਅਨ + ਪੰਜਾਬੀ + ਪੋਰਤੂਗੂਈਸ + ਸਵੈਡਿਸ਼ + ਤਾਮਿਲ + ਤੇਲਗੂ + ਥਾਈ + ਤ੍ਵਿ + ਉਇਘੁਰ + und + + + + + + + + + ਭਾਰਤ + TO + ਅਣਜਾਣ + + + + [਼ ੰ ੱ ੦-੯ ੴ ੳ ਉ ਊ ਓ ਅ ਆ ਐ ਔ ੲ ਇ ਈ ਏ ਸ {ਸ਼} ਹ ਕ ਖ {ਖ਼} ਗ {ਗ਼} ਘ-ਜ {ਜ਼} ਝ-ਨ ਪ ਫ {ਫ਼} ਬ-ਰ ਲ ਵ ੜ ਾ-ੂ ੇ ੈ ੋ-੍] + [\u200C \u200D ਁ-ਃ {ਲ਼}] + + + ' + ' + " + " + + + + + + + + ਜਨਵਰੀ + ਫ਼ਰਵਰੀ + ਮਾਰਚ + ਅਪ੍ਰੈਲ + ਮਈ + ਜੂਨ + ਜੁਲਾਈ + ਅਗਸਤ + ਸਤੰਬਰ + ਅਕਤੂਬਰ + ਨਵੰਬਰ + ਦਸੰਬਰ + + + ਜਨਵਰੀ + ਫ਼ਰਵਰੀ + ਮਾਰਚ + ਅਪ੍ਰੈਲ + ਮਈ + ਜੂਨ + ਜੁਲਾਈ + ਅਗਸਤ + ਸਤੰਬਰ + ਅਕਤੂਬਰ + ਨਵੰਬਰ + ਦਸੰਬਰ + + + + + + + ਮਾ + + + ਜੂ + ਜੁ + + + + + + + + + + + + ਐਤ. + ਸੋਮ. + ਮੰਗਲ. + ਬੁਧ. + ਵੀਰ. + ਸ਼ੁਕਰ. + ਸ਼ਨੀ. + + + ਐਤਵਾਰ + ਸੋਮਵਾਰ + ਮੰਗਲਵਾਰ + ਬੁਧਵਾਰ + ਵੀਰਵਾਰ + ਸ਼ੁੱਕਰਵਾਰ + ਸ਼ਨੀਚਰਵਾਰ + + + + + + ਸੋ + ਮੰ + ਬੁੱ + ਵੀ + ਸ਼ੁੱ + ਸ਼ + + + + + + + Q1 + Q2 + Q3 + Q4 + + + ਪਹਿਲਾਂ ਚੌਥਾਈ + ਦੂਜਾ ਚੌਥਾਈ + ਤੀਜਾ ਚੌਥਾਈ + ਚੌਥਾ ਚੌਥਾਈ + + + + ਸਵੇਰੇ + ਸ਼ਾਮ + + + ਈਸਾਪੂਰਵ + ਸੰਨ + + + BCE + CE + + + + + + EEEE, dd MMMM yyyy + + + + + yyyy MMMM d + + + + + yyyy MMM d + + + + + dd/MM/yyy + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1} {0} + + + + HH:mm:ss 13:25:59 + d/M + mm:ss + MMM yy + Q yy + + + + + ਸਾਲ + + + ਮਹੀਨਾ + + + ਹਫ਼ਤਾ + + + ਦਿਨ + ਅੱਜ + ਭਲਕ + ਭਲਕ + ਤਿੰਨ ਦਿਨ ਬਾਅਦ + ਪਰਸੋਂ + ਤਿੰਨ ਦਿਨ ਪਹਿਲਾਂ + + + ਹਫ਼ਤੇ ਦਾ ਦਿਨ + + + ਘੰਟਾ + + + ਮਿੰਟ + + + ਖੇਤਰ + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + + + + + + #,##,##0.### + + + + + + + #,##,##0% + + + + + + + ¤ #,##,##0.00 + + + + + + ਅਫ਼ਗਾਨੀ + + + ਯੂਰੋ + + + ਰੁਪਿਯ + ਰੁ. + + + ਅਣਜਾਣ + ਅਣਜਾਣ + + + + + + ਹਾਂ + ਨਹੀਂ + + + + diff --git a/libs/Zend/Locale/Data/pa_Arab.xml b/libs/Zend/Locale/Data/pa_Arab.xml new file mode 100644 index 0000000..093906c --- /dev/null +++ b/libs/Zend/Locale/Data/pa_Arab.xml @@ -0,0 +1,130 @@ + + + + + + + + + + + + پکستان + + + + + + + [ُ ء آ ؤ ئ-ب پ ت ث ٹ ج چ ح-ذ ڈ ر ز ڑ ژ س-غ ف ق ک گ ل-ن ں ه ھ ہ و ی ے] + [أ ٻ ة ٺ ټ ٽ] + + + + + + + + جنوری + فروری + مارچ + اپریل + مئ + جون + جولائی + اگست + ستمبر + اکتوبر + نومبر + دسمبر + + + + + + + اتوار + پیر + منگل + بُدھ + جمعرات + جمعہ + ہفتہ + + + + + + + چوتھاي پہلاں + چوتھاي دوجا + چوتھاي تيجا + چوتھاي چوتھا + + + + + + ايساپورو + سں + + + + + ورھا + + + مہينا + + + ہفتہ + + + دئن + + + ہفتے دا دن + + + گھنٹا + + + منٹ + + + ٹپہ + + + + + + + + + يورو + + + روپئیہ [INR] + ر [INR] + + + روپئیہ + ر + + + + + + ہاں + نہيں + + + + diff --git a/libs/Zend/Locale/Data/pa_Arab_PK.xml b/libs/Zend/Locale/Data/pa_Arab_PK.xml new file mode 100644 index 0000000..80fa2ed --- /dev/null +++ b/libs/Zend/Locale/Data/pa_Arab_PK.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Świat + Afryka + Ameryka Północna + Ameryka Południowa + Oceania + Afryka Zachodnia + Ameryka Środkowa + Afryka Wschodnia + Afryka Północna + Afryka Środkowa + Afryka Południowa + Ameryka + Ameryka Północna - Kanada, USA + Karaiby + Azja Wschodnia + Azja Południowa + Azja Południowo-Wschodnia + Europa Południowa + Australia i Nowa Zelandia + Melanezja + Region Mikronezji + Polinezja + Azja Południowo-Środkowa + Azja + Azja Środkowa + Azja Zachodnia + Europa + Europa Wschodnia + Europa Północna + Europa Zachodnia + Wspólnota Niezależnych Państw + Ameryka Łacińska i Karaiby + Wyspy Normandzkie + Andora + Zjednoczone Emiraty Arabskie + Afganistan + Antigua i Barbuda + Anguilla + Albania + Armenia + Antyle Holenderskie + Angola + Antarktyka + Argentyna + Samoa Amerykańskie + Austria + Australia + Aruba + Wyspy Alandzkie + Azerbejdżan + Bośnia i Hercegowina + Barbados + Bangladesz + Belgia + Burkina Faso + Bułgaria + Bahrajn + Burundi + Benin + Saint Barthélemy + Bermudy + Brunei Darussalam + Boliwia + Brazylia + Bahamy + Bhutan + Wyspa Bouveta + Botswana + Białoruś + Belize + Kanada + Wyspy Kokosowe + Demokratyczna Republika Konga + Republika Środkowej Afryki + Kongo + Szwajcaria + Wybrzeże Kości Słoniowej + Wyspy Cooka + Chile + Kamerun + Chiny + Kolumbia + Kostaryka + Serbia i Czarnogóra + Kuba + Wyspy Zielonego Przylądka + Wyspa Bożego Narodzenia + Cypr + Czechy + Niemcy + Dżibuti + Dania + Dominika + Republika Dominikańska + Algieria + Ekwador + Estonia + Egipt + Sahara Zachodnia + Erytrea + Hiszpania + Etiopia + Finlandia + Fidżi + Falklandy + Mikronezja + Wyspy Owcze + Francja + Gabon + Wielka Brytania + Grenada + Gruzja + Gujana Francuska + Wyspa Guernsey + Ghana + Gibraltar + Grenlandia + Gambia + Gwinea + Gwadelupa + Gwinea Równikowa + Grecja + Georgia Południowa i Sandwich Południowy + Gwatemala + Guam + Gwinea Bissau + Gujana + Hongkong + Wyspy Heard i McDonalda + Honduras + Chorwacja + Haiti + Węgry + Indonezja + Irlandia + Izrael + Wyspa Man + Indie + Terytorium Brytyjskie Oceanu Indyjskiego + Irak + Iran + Islandia + Włochy + Wyspa Jersey + Jamajka + Jordania + Japonia + Kenia + Kirgistan + Kambodża + Kiribati + Komory + Saint Kitts i Nevis + Korea Północna + Korea Południowa + Kuwejt + Kajmany + Kazachstan + Laos + Liban + Saint Lucia + Liechtenstein + Sri Lanka + Liberia + Lesotho + Litwa + Luksemburg + Łotwa + Libia + Maroko + Monako + Mołdawia + Czarnogóra + Sint Maarten + Madagaskar + Wyspy Marshalla + Macedonia + Mali + Birma + Mongolia + Makau + Mariany Północne + Martynika + Mauretania + Montserrat + Malta + Mauritius + Malediwy + Malawi + Meksyk + Malezja + Mozambik + Namibia + Nowa Kaledonia + Niger + Wyspa Norfolk + Nigeria + Nikaragua + Holandia + Norwegia + Nepal + Nauru + Niue + Nowa Zelandia + Oman + Panama + Peru + Polinezja Francuska + Papua Nowa Gwinea + Filipiny + Pakistan + Polska + Saint-Pierre i Miquelon + Pitcairn + Portoryko + Terytoria Palestyńskie + Portugalia + Palau + Paragwaj + Katar + Oceania inne + Unia Europejska + Reunion + Rumunia + Serbia + Rosja + Rwanda + Arabia Saudyjska + Wyspy Salomona + Seszele + Sudan + Szwecja + Singapur + Wyspa Świętej Heleny + Słowenia + Svalbard i Jan Mayen + Słowacja + Sierra Leone + San Marino + Senegal + Somalia + Surinam + Wyspy Świętego Tomasza i Książęca + Salwador + Syria + Suazi + Turks i Caicos + Czad + Francuskie Terytoria Południowe + Togo + Tajlandia + Tadżykistan + Tokelau + Timor Wschodni + Turkmenistan + Tunezja + Tonga + Turcja + Trynidad i Tobago + Tuvalu + Tajwan + Tanzania + Ukraina + Uganda + Dalekie Wyspy Mniejsze Stanów Zjednoczonych + Stany Zjednoczone + Urugwaj + Uzbekistan + Watykan + Saint Vincent i Grenadyny + Wenezuela + Brytyjskie Wyspy Dziewicze + Wyspy Dziewicze Stanów Zjednoczonych + Wietnam + Vanuatu + Wallis i Futuna + Samoa + Jemen + Majotta + Republika Południowej Afryki + Zambia + Zimbabwe + Nieznany lub nieprawidłowy region + + + tradycyjna ortografia niemiecka + standardowa ortografia regionu Resia + ortografia niemiecka z 1996 r. + szesnastowieczny francuski + siedemnastowieczny francuski + ormiański wchodni + ormiański zachodni + turecki zunifikowany alfabet łaciński + dialekt San Giorgio/Bila + dialekt Boontling + fonetyczny międzynarodowy + fonetyczny + dialekt Lipovaz w regionie Resia + monotoniczny + dialekt Natisone + dialekt Gniva/Njiva + dialekt Oseacco/Osojane + politoniczny + komputerowy + ortografia zreformowana + dialekt regionu Resia + dialekt Saho + standardowy szkocki angielski + dialekt Scouse + dialekt Stolvizza/Solbica + ortografia taraszkiewicka + walencki + + + kalendarz + sortowanie + waluta + + + chiński tradycyjny porządek sortowania - Big5 + kalendarz buddyjski + kalendarz chiński + bezpośredni porządek sortowania + chiński uproszczony porządek sortowania - GB2312 + kalendarz gregoriański + kalendarz hebrajski + narodowy kalendarz hinduski + kalendarz islamski + cywilny kalendarz islamski + kalendarz japoński + porządek sortowania książki telefonicznej + porządek sortowania pinyin + kalendarz Republiki Chińskiej + porządek akcentów + tradycyjny porządek sortowania + + + anglosaski + metryczny + + + Język: {0} + Pismo: {0} + Region: {0} + + + + [a ą b c ć d e ę f-l ł m n ń o ó p r s ś t u w y z ź ż] + [q v x] + [a-z] + + + + + + + + + + + + + + EEEE, d MMMM, yyyy G + + + + + d MMMM, yyyy G + + + + + d MMM, yyyy G + + + + + + E d MMMM + d MMM + + + + + + + + sty + lut + mar + kwi + maj + cze + lip + sie + wrz + paź + lis + gru + + + stycznia + lutego + marca + kwietnia + maja + czerwca + lipca + sierpnia + września + października + listopada + grudnia + + + + + s + l + m + k + m + c + l + s + w + p + l + g + + + styczeń + luty + marzec + kwiecień + maj + czerwiec + lipiec + sierpień + wrzesień + październik + listopad + grudzień + + + + + + + niedz. + pon. + wt. + śr. + czw. + pt. + sob. + + + niedziela + poniedziałek + wtorek + środa + czwartek + piątek + sobota + + + + + N + P + W + Ś + C + P + S + + + + + + + K1 + K2 + K3 + K4 + + + I kwartał + II kwartał + III kwartał + IV kwartał + + + + + 1 kw. + 2 kw. + 3 kw. + 4 kw. + + + 1 + 2 + 3 + 4 + + + + AM + PM + + + p.n.e. + n.e. + + + p.n.e. + n.e. + + + + + + EEEE, d MMMM yyyy + + + + + d MMMM yyyy + + + + + yyyy-MM-dd + + + + + yy-MM-dd + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1} {0} + + + + HH:mm + HH:mm:ss + H:mm + L + E, M-d + LLL + d MMM E + d MMMM E + d MMMM + MMM d + MM-dd + d.M + d + hh:mm a + hh:mm:ss a + mm:ss + mm:ss + yyyy + yyyy-M + EEE, d.M.yyyy + yyyy MMM + EEE, d MMM yyyy + LLLL yyyy + yyyy Q + yyyy QQQ + MM/yy + MMM yy + Q yy + yyyy-MM + LLLL yyyy + + + {0} - {1} + + M-M + + + E, dd.MM - E, dd.MM + E, dd.MM - E, dd.MM + + + LLL-LLL + + + E, d MMM - E, d MMM + E, MM-d – E, MM-d + + + LLLL-LLLL + + + d MMM - d MMM + d-d MMM + + + dd.MM-dd.MM + dd.MM-dd.MM + + + d-d + + + HH-HH + HH-HH + + + HH:mm-HH:mm + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH-HH v + HH-HH v + + + y-y + + + MM.yy-MM.yy + MM.yy-MM.yy + + + E, dd.MM.yyyy - E, dd.MM.yyyy + E, dd.MM.yyyy - E, dd.MM.yyyy + E, dd-MM-yyyy-E, dd-MM-yyyy + + + LLL-LLL yyyy + LLL yyyy - LLL yyyy + + + E, d MMM - E, d MMM yyyy + E, d - E, d MMM yyyy + E, d MMM yyyy - E, d MMM yyyy + + + MM.yyyy - MM.yyyy + MM.yyyy - MM.yyyy + + + d MMM - d MMM yyyy + d-d MMM yyyy + d MMM yyyy - d MMM yyyy + + + dd.MM-dd.MM.yyyy + dd-dd.MM.yy + dd.MM.yyyy-dd.MM.yyyy + + + + + + Era + + + Rok + + + Miesiąc + + + Tydzień + + + Dzień + Dzisiaj + Jutro + Pojutrze + Za trzy dni + Wczoraj + Przedwczoraj + Trzy dni temu + + + Dzień tygodnia + + + Dayperiod + + + Godzina + + + Minuta + + + Sekunda + + + Strefa + + + + + + +HH:mm;-HH:mm + GMT{0} + Czas: {0} + {1} ({0}) + + Nieznane + + + GMT-01:0 + + + GMT-02:00 + + + Andora + + + Dubaj + + + Afganistan + + + Antigua i Barbuda + + + Tirana + + + Erewan + + + Curaçao + + + Stacja Naukowa Rothera + + + Archipelag Palmera + + + Biegun południowy + + + Stacja Syowa + + + Wybrzeże Mawsona + + + Stacja Davis + + + Stacja Vostok + + + Stacja Casey + + + Mc Murdo + + + Samoa Amerykańskie + + + Wiedeń + + + Adelajda + + + Wyspa Lord Howe + + + Maarianhamina + + + Azerbejdżan + + + Sarajewo + + + Dakka + + + Bruksela + + + Wagadugu + + + Bułgaria + + + Bahrajn + + + Bużumbura + + + Porto Novo + + + Bermudy + + + Boliwia + + + Pôrto Velho + + + Cuiabá + + + Belém + + + Săo Paulo + + + Salvador + + + Maceió + + + Bahamy + + + Bhutan + + + Mińsk + + + Wyspy Kokosowe + + + Kinszasa + + + Bangi + + + Kongo Brazzaville + + + Zurych + + + Abidżan + + + Wyspy Cooka + + + Wyspa Wielkanocna + + + Duala + + + Kaszgar + + + Urumczi + + + Czunking + + + Szanghaj + + + Kolumbia + + + Kostaryka + + + Hawana + + + Zielony Przylądek + + + Wyspa Bożego Narodzenia + + + Nikozja + + + Praga + + + Niemcy + + + Dżibuti + + + Kopenhaga + + + Dominika + + + Republika Dominikańska + + + Algier + + + Ekwador + + + Tallin + + + Kair + + + Ujun + + + Asmara + + + Wyspy Kanaryjskie + + + Madryt + + + Addis Abeba + + + Finlandia + + + Fidżi + + + Falklandy (Malwiny) + + + Wyspy Owcze + + + Paryż + + + Londyn + + + Gruzja + + + Kajenna + + + Akra + + + Grenlandia + + + Bandżul + + + Konakri + + + Gwadelupa + + + Ateny + + + Georgia Południowa + + + Gwatemala + + + Gujana + + + Hongkong + + + Honduras + + + Zagrzeb + + + Haiti + + + Budapeszt + + + Dżakarta + + + Irlandia + + + Jerozolima + + + Wyspa Man + + + Kalkuta + + + Czagos + + + Bagdad + + + Teheran + + + Rejkiawik + + + Rzym + + + Jamajka + + + Jordania + + + Tokio + + + Biszkek + + + Kambodża + + + Komory + + + Saint Kitts + + + Korea Północna + + + Seul + + + Kuwejt + + + Kajmany + + + Aktau + + + Uralsk + + + Aktiubińsk + + + Kyzył Orda + + + Ałma Ata + + + Wientian + + + Bejrut + + + Saint Lucia + + + Liechtenstein + + + Kolombo + + + Wilno + + + Luksemburg + + + Ryga + + + Trypolis + + + Monako + + + Kiszyniów + + + Czarnogóra + + + Antananarywa + + + Macedonia + + + Rangun + + + Howd + + + Ułan Bator + + + Czojbalsan + + + Makau + + + Mariany Północne + + + Martynika + + + Nawakszut + + + Malediwy + + + Meksyk + + + Kuczing + + + Windhuk + + + Numea + + + Niamej + + + Wyspa Norfolk + + + Nikaragua + + + Holandia + + + Norwegia + + + Nepal + + + Maskat + + + Peru + + + Markizy + + + Papua Nowa Gwinea + + + Filipiny + + + Karaczi + + + Warszawa + + + Saint Pierre i Miquelon + + + Wyspy Pitcairn + + + Portoryko + + + Terytoria Palestyńskie + + + Azory + + + Madera + + + Lizbona + + + Asunción + + + Katar + + + Bukareszt + + + Belgrad + + + Moskwa + + + Wołgograd + + + Jekaterynburg + + + Nowosybirsk + + + Krasnojarsk + + + Irkuck + + + Jakuck + + + Władywostok + + + Sachalin + + + Kamczatka + + + Rijad + + + Wyspy Salomona + + + Mahé + + + Chartum + + + Sztokholm + + + Singapur + + + Święta Helena + + + Lublana + + + Bratysława + + + Mogadiszu + + + Surinam + + + Săo Tomé + + + Salwador + + + Damaszek + + + Turks i Caicos + + + Ndżamena + + + Wyspy Kerguelena + + + Lomé + + + Tajlandia + + + Duszanbe + + + Tokelau + + + Timor Wschodni + + + Aszchabad + + + Tonga + + + Stambuł + + + Port-of-Spain + + + Tuvalu + + + Tajpej + + + Dar es-Salaam + + + Użgorod + + + Kijów + + + Symferopol + + + Zaporoże + + + New Salem + + + + + Vincennes + + + Petersburg + + + Knox + + + Winamac + + + Marengo + + + Vevay + + + Monticello + + + Nowy Jork + + + Urugwaj + + + Samarkanda + + + Taszkient + + + Watykan + + + Saint Vincent + + + Wenezuela + + + Brytyjskie Wyspy Dziewicze + + + Saint Thomas + + + Sajgon + + + Vanuatu + + + Wallis i Futuna + + + Samoa + + + Jemen + + + Majotta + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + + Czas środkowoeuropejski + Czas środkowoeuropejski letni + + true + + + + Czas wschodnioeuropejski + Czas wschodnioeuropejski letni + + + + + Czas zachodnioeuropejski + Czas zachodnioeuropejski letni + + + + + + + , +   + ; + % + 0 + # + + + - + E + + + NaN + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + #,##0.00 ¤ + + + {0} {1} + + + + peseta andorska + pesety andorskie + peset andorskich + + + dirham arabski + dirhamy arabskie + dirhamów arabskich + + + afgani (1927-2002) + afgani (1927-2002) + afgani (1927-2002) + + + afgani + afgani + afgani + Af + + + lek albański + leki albańskie + leków albańskich + lek + + + dram armeński + dramy armeńskie + dramów armeńskich + dram + + + gulden Antyle Holenderskie + guldeny Antyle Holenderskie + guldenów (Antyle Holenderskie) + NA f. + + + kwanza angolańska + kwanzy angolańskie + kwanz angolańskich + + + kwanza angolańska (1977-1990) + kwanzy angolańskie (1977-1990) + kwanz angolańskich (1977-1990) + + + nowa kwanza angolańska (1990-2000) + nowe kwanzy angolańskie (1990-2000) + nowych kwanz angolańskich (1990-2000) + + + kwanza angolańska Reajustado (1995-1999) + kwanzy angolańskie Reajustado (1995-1999) + kwanz angolańskich Reajustado (1995-1999) + + + austral argentyński + + + peso argentyńskie (1983-1985) + + + peso argentyńskie + Arg$ + + + szyling austriacki  + + + dolar australijski + dolary australijskie + dolar australijski + dolarów australijskich + $A + + + gulden arubski + + + manat azerbejdżański + + + manat azerski + manaty azerskie + manat azerski + manatów azerskich + + + dinar Bośni i Hercegowiny + + + marka konwertybilna Bośni i Hercegowiny + marki wymienne Bośni i Hercegowiny + marka wymienna Bośni i Hercegowiny + marek wymiennych Bośni i Hercegowiny + KM + + + dolar Barbadosu + BDS$ + + + taka bengalska + Tk + + + frank belgijski (zamienny) + + + frank belgijski + BF + + + frank belgijski (finansowy) + + + lew bułgarski + lev + + + nowy lew bułgarski + + + dinar bahrański + BD + + + frank burundyjski + Fbu + + + dolar bermudzki + Ber$ + + + dolar brunejski + + + boliviano + Bs + + + peso boliwijskie + + + mvdol boliwijski + + + cruzeiro novo brazylijskie (1967-1986) + + + cruzado brazylijskie + + + cruzeiro brazylijskie (1990-1993) + + + real brazylijski + + + nowe cruzado brazylijskie + + + cruzeiro brazylijskie + + + dolar bahamski + + + ngultrum Bhutanu + Nu + + + kyat birmański + + + pula + + + rubel białoruski (1994-1999) + + + rubel białoruski + ruble białoruskie + rubel białoruski + rubli białoruskich + Rbl + + + dolar belizeński + BZ$ + + + dolar kanadyjski + dolary kanadyjskie + dolar kanadyjski + dolarów kanadyjskich + Can$ + + + frank kongijski + + + frank szwajcarski + franki szwajcarskie + frank szwajcarski + franków szwajcarskich + SwF + + + peso chilijskie + Ch$ + + + juan renminbi + Y + + + peso kolumbijskie + Col$ + + + colon kostarykański + C + + + stary dinar serbski + + + korona czechosłowacka + korony czechosłowackie + korona czechosłowacka + koron czechosłowackich + + + peso kubańskie + + + escudo Zielonego Przylądka + CVEsc + + + funt cypryjski + £C + + + korona czeska + korony czeskie + korona czeska + koron czeskich + + + wschodnia marka wschodnioniemiecka + + + marka niemiecka + marki niemieckie + marka niemiecka + marek niemieckich + + + frank Dżibuti + DF + + + korona duńska + korony duńskie + korona duńska + koron duńskich + DKr + + + peso dominikańskie + RD$ + + + dinar algierski + DA + + + sucre ekwadorski + + + korona estońska + korony estońskie + korona estońska + koron estońskich + + + funt egipski + + + nakfa erytrejska + + + peseta hiszpańska (Konto A) + + + peseta hiszpańska (konto wymienne) + + + peseta hiszpańska + + + birr etiopski + Br + + + euro + euro + euro + euro + + + marka fińska + + + dolar fidżi + F$ + + + funt Wysp Falklandzkich + + + frank francuski  + franki francuskie + frank francuski + franków francuskich + + + funt szterling + £ + + + kupon gruziński larit + + + lari gruzińskie + lari + + + cedi ghańskie + + + cedi Ghany + + + funt gibraltarski + + + dalasi gambijskie + + + frank gwinejski + GF + + + syli gwinejskie + + + ekwele gwinejskie Gwinei Równikowej + + + drachma grecka + + + quetzal gwatemalski + Q + + + escudo Gwinea Portugalska + + + peso Guinea-Bissau + + + dolar gujański + G$ + + + dolar hongkoński + HK$ + + + lempira Hondurasu + L + + + dinar chorwacki + + + kuna chorwacka + + + gourde haitańskie + + + forint węgierski  + forinty węgierskie + forint węgierski + forintów węgierskich + Ft + + + rupia indonezyjska + Rp + + + funt irlandzki + IR£ + + + funt izraelski + + + nowy szekel izraelski + + + rupia indyjska + INR + + + dinar iracki + ID + + + rial irański + RI + + + korona islandzka + + + lir włoski + + + dolar jamajski + J$ + + + dinar jordański + JD + + + jen japoński + jeny japońskie + jen japoński + jenów japońskich + ¥ + + + szyling kenijski + K Sh + + + som kirgiski + som + + + riel kambodżański + CR + + + frank komoryjski + CF + + + won północnokoreański + + + won południowokoreański + + + dinar kuwejcki + KD + + + dolar kajmański + + + tenge kazachskie + T + + + kip laotański + + + funt libański + LL + + + rupia lankijska + SL Re + + + dolar liberyjski + + + loti Lesoto + M + + + lit litewski + + + talon litewski + + + frank luksemburski + + + łat łotewski + + + rubel łotewski + + + dinar libijski + LD + + + dirham marokański + + + frank marokański + franki marokańskie + frank marokański + franków marokańskich + + + lej mołdawski + + + ariar malgaski + + + frank malgaski + + + denar macedoński + MDen + + + frank malijski + + + kyat Myanmar + + + tugrik mongolski + Tug + + + pataka Macao + + + ouguiya mauterańska + UM + + + lira maltańska + Lm + + + funt maltański + + + rupia Mauritius + + + rufiyaa malediwska + + + kwacha malawska + MK + + + peso meksykańskie + MEX$ + + + peso srebrne meksykańskie (1861-1992) + + + ringgit malezyjski + RM + + + escudo mozambickie + + + metical Mozambik + Mt + + + metical Mozambiku + + + dolar namibijski + N$ + + + naira nigeryjska + + + cordoba nikaraguańska + + + cordoba oro nikaraguańska + + + gulden holenderski  + + + korona norweska + korony norweskie + korona norweska + koron norweskich + NKr + + + rupia nepalska + Nrs + + + dolar nowozelandzki + dolary nowozelandzkie + dolar nowozelandzki + dolarów nowozelandzkich + $NZ + + + rial Omanu + RO + + + balboa panamski + + + inti peruwiański + + + nowy sol peruwiański + + + sol peruwiański + + + kina Papua Nowa Gwinea + + + peso filipińskie + + + rupia pakistańska + Pra + + + złoty polski + złote polskie + złoty polski + złotych polskich + + + + złoty polski (1950-1995) + + + escudo portugalskie + + + guarani paragwajskie + + + rial katarski + QR + + + dolar rodezyjski + + + lej rumuński + leu + + + nowa leja rumuńska + + + dinar serbski + + + rubel rosyjski + ruble rosyjskie + rubel rosyjski + rubli rosyjskich + + + rubel rosyjski (1991-1998) + + + frank ruandyjski + + + rial saudyjski + SRl + + + dolar Wysp Salomona + SI$ + + + rupia seszelska + SR + + + dinar sudański + + + funt sudański + + + stary funt sudański + + + korona szwedzka + korony szwedzkie + korona szwedzka + koron szwedzkich + SKr + + + dolar singapurski + S$ + + + funt Wyspy Świętej Heleny + + + tolar słoweński + tolary słoweńskie + tolar słoweński + tolarów słoweńskich + + + korona słowacka + korony słowackie + korona słowacka + koron słowackich + Sk + + + leone Sierra Leone + + + szyling somalijski + Sh. + + + dolar surinamski + dolary surinamskie + dolar surinamski + dolarów surinamskich + + + gulden surinamski + Sf + + + dobra Wysp Świętego Tomasza i Książęcej + Db + + + rubel radziecki + ruble radzieckie + rubel radziecki + rubli radzieckich + + + colon salwadorski + + + funt syryjski + LS + + + lilangeni Suazi + E + + + baht tajski + + + rubel tadżycki + + + somoni tadżyckie + + + manat turkmeński + + + dinar tunezyjski + + + paʻanga Tonga + T$ + + + escudo timorskie + + + lir turecki + liry tureckie + lira turecka + lir tureckich + TL + + + nowa lira turecka + nowe liry tureckie + nowa lira turecka + nowych lir tureckich + + + dolar Trynidadu i Tobago + TT$ + + + nowy dolar tajwański + NT$ + + + szyling tanzański + T Sh + + + hrywna ukraińska + hrywny ukraińskie + hrywna ukraińska + hrywien ukraińskich + + + karbowaniec ukraiński + karbowańce ukraińskie + karbowaniec ukraiński + karbowańców ukraińskich + + + szyling ugandyjski (1966-1987) + + + szyling ugandyjski + USh + + + dolar amerykański  + dolary amerykańskie + dolar amerykański + dolarów amerykańskich + $ + + + peso urugwajskie (1975-1993) + + + peso urugwajskie + Ur$ + + + som uzbecki + + + boliwar wenezuelski + Be + + + boliwar fuerte + + + dong wietnamski + + + vatu Vanuatu + VT + + + tala samoańska + + + frank CFA BEAC + + + srebro + + + złoto + + + dolar wschodniokaraibski + EC$ + + + specjalne prawa ciągnienia + + + ECU + + + frank złoty francuski + + + UIC-frank francuski + + + frank CFA + + + pallad + + + frank CFP + CFPF + + + platyna + + + nieznana/nieprawidłowa waluta + XXX + nieznana/nieprawidłowa waluta + XXX + + + dinar jemeński + + + rial jemeński + YRl + + + nowy dinar jugosławiański + + + dinar jugosławiański wymienny + + + rand południowoafrykański (finansowy) + + + rand południowoafrykański + R + + + kwacha zambijska + + + nowy zair zairski + + + zair zairski + + + dolar Zimbabwe + Z$ + + + + + + {0} dni + {0} dzień + {0} dni + + + {0} godziny + {0} godzina + {0} godzin + + + {0} minuty + {0} minuta + {0} minut + + + {0} miesiące + {0} miesiąc + {0} miesięcy + + + {0} sekundy + {0} sekunda + {0} sekund + + + {0} tygodnie + {0} tydzień + {0} tygodni + + + {0} lata + {0} rok + {0} lat + + + + + tak:t + nie:n + + + diff --git a/libs/Zend/Locale/Data/pl_PL.xml b/libs/Zend/Locale/Data/pl_PL.xml new file mode 100644 index 0000000..1b20565 --- /dev/null +++ b/libs/Zend/Locale/Data/pl_PL.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/plurals.xml b/libs/Zend/Locale/Data/plurals.xml new file mode 100644 index 0000000..676a61c --- /dev/null +++ b/libs/Zend/Locale/Data/plurals.xml @@ -0,0 +1,76 @@ + + + + + + + + + n is 0 + n is 1 + n is 2 + n mod 100 in 3..10 + n mod 100 in 11..99 + + + n is 1 + + + n in 0..1 + + + n within 0..2 and n is not 2 + + + n is 0 + n mod 10 is 1 and n mod 100 is not 11 + + + n is 1 + n is 2 + + + n is 1 + n is 0 OR n is not 1 AND n mod 100 in 1..19 + + + n mod 10 is 1 and n mod 100 not in 11..19 + n mod 10 in 2..9 and n mod 100 not in 11..19 + + + n mod 10 is 1 and n mod 100 is not 11 + n mod 10 in 2..4 and n mod 100 not in 12..14 + n mod 10 is 0 or n mod 10 in 5..9 or n mod 100 in 11..14 + + + n is 1 + n in 2..4 + + + n is 1 + n mod 10 in 2..4 and n mod 100 not in 12..14 and n mod 100 not in 22..24 + + + n mod 100 is 1 + n mod 100 is 2 + n mod 100 in 3..4 + + + n is 1 + n is 0 or n mod 100 in 2..10 + n mod 100 in 11..19 + + + n mod 10 is 1 + + + n is 1 + n is 2 + n is 8 or n is 11 + + + diff --git a/libs/Zend/Locale/Data/ps.xml b/libs/Zend/Locale/Data/ps.xml new file mode 100644 index 0000000..53368b5 --- /dev/null +++ b/libs/Zend/Locale/Data/ps.xml @@ -0,0 +1,434 @@ + + + + + + + + + fa_AF + + + افريکاني + امهاري + عربي + اسمائى ژبه + أذربائجاني + بلوڅي + بېلاروسي + بلغاري + بيهاري + بنګالي + برېتون + بوسني + کټلاني + چېک + ويلشي + ډېنش + الماني + یوناني + انګلیسي + اسپرانتو + هسپانوي + حبشي + باسکي + فارسي + فینلنډي + تګالوګ + فاروئې + فرانسوي + فريزي + ائيرلېنډي + سکاټلېنډي ګېلک + ګلېشيايي + ګوراني + ګجراتي + عبري + هندي + کروواتي + هنګري + ارمني + انټرلنګوا + انډونېشيايي + آسا نا جبة + هند و اروپایي + أيسلېنډي + ایټالوي + جاپانی + جاوايې + جورجيائي + کمبوډيايې يا د کمبوډيا + کنأډه + کوريائي + کردي + کرګيز + لاتیني + لويتين + ليتواني + لېټواني + ملغاسي + مقدوني + مالايالم + مغولي + مراټهي + ملایا + مالټايي + نېپالي + هالېنډي + ناروېئي (نائنورسک) + ناروېئې + اوکسيټاني + اوريا + پنجابي + پولنډي + پښتو + پورتګالي + پرتگال (برازيل) + پرتګالي (پرتګال) + روماني + روسي + سنسکریټ + سندهي + سرب-کروشيايي + سينهالي + سلوواکي + سلوواني + سومالي + الباني + سربيائي + سيسوتو + سوډاني + سویډنی + سواهېلي + تامل + تېليګو + تاجک + تايلېنډي + تيګريني + ترکمني + کلينګاني + ترکي + تاتار + توی + اويگور + اوکرانايي + اردو + ازبکي + وېتنامي + خوسا + يديش + چیني + زولو + + + + + + افغانستان + البانیه + انګولا + انتارکتیکا + اتریش + بنګله‌دیش + بلغاریه + کاناډا + سویس + چین + کولمبیا + کیوبا + المان + ډنمارک + الجزایر + مصر + هسپانیه + حبشه + فنلینډ + فرانسه + برتانیه + ګانا + ګیانا + یونان + ګواتیمالا + هانډوراس + مجارستان + اندونیزیا + هند + عراق + آیسلینډ + ایټالیه + جمیکا + جاپان + کمبودیا + کویټ + لاوس + لبنان + لایبریا + لیبیا + مراکش + مغولستان + مالیزیا + نایجیریا + نکاراګوا + هالېنډ + ناروې + نیپال + نیوزیلنډ + پاکستان + پولنډ + فلسطین + پورتګال + روسیه + روندا + سعودی عربستان + سویډن + سالوېډور + سوریه + تاجکستان + تنزانیا + یوروګوای + یمن + + + + + + + [َ ِ ُ ً ٍ ٌ ّ ْ ٔ ٰ آ ا أ ء ب پ ت ټ ث ج ځ چ څ ح-د ډ ذ ر ړ ز ژ ږ س ش ښ ص-غ ف ق ک ګ ل-ن ڼ ه ة و ؤ ی ي ې ۍ ئ] + [\u200C \u200D] + + + + + + + + 1 + 2 + 3 + 4 + مـی + جون + 7 + 8 + 9 + 10 + 11 + 12 + + + جنوري + فبروري + مارچ + اپریل + می + جون + جولای + اګست + سپتمبر + اکتوبر + نومبر + دسمبر + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + یکشنبه + دوشنبه + سه‌شنبه + چهارشنبه + پنجشنبه + جمعه + شنبه + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + غ.م. + غ.و. + + + ق.م. + م. + + + + + + EEEE د yyyy د MMMM d + + + + + د yyyy د MMMM d + + + + + d MMM yyyy + + + + + yyyy/M/d + + + + + + + H:mm:ss (v) + + + + + H:mm:ss (z) + + + + + H:mm:ss + + + + + H:mm + + + + + + + {1} {0} + + + + d MMMM + M/d + mm:ss + Q yy + yyyy/M + د yyyy د MMMM + + + + + + + + وری + غویی + غبرګولی + چنګاښ + زمری + وږی + تله + لړم + لیندۍ + مرغومی + سلواغه + کب + + + وری + غویی + غبرګولی + چنګاښ + زمری + وږی + تله + لړم + لیندۍ + مرغومی + سلواغه + کب + + + + + + + +HH:mm;-HH:mm + GMT{0} + د {0} په وخت + + کابل + + + + + + ٫ + ٬ + ٪ + ۰ + + ×۱۰^ + + + + + #,##0.00 ¤ + + + + + + افغانۍ + ؋ + + + + diff --git a/libs/Zend/Locale/Data/ps_AF.xml b/libs/Zend/Locale/Data/ps_AF.xml new file mode 100644 index 0000000..034dc06 --- /dev/null +++ b/libs/Zend/Locale/Data/ps_AF.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/pt.xml b/libs/Zend/Locale/Data/pt.xml new file mode 100644 index 0000000..0ef9b64 --- /dev/null +++ b/libs/Zend/Locale/Data/pt.xml @@ -0,0 +1,4344 @@ + + + + + + + + + + + {0} ({1}) + , + + + afar + abkhazian + achinese + acoli + adangme + adyghe + avéstico + africâner + Idioma afro-asiático + Afrihili + ainu + Akan + acadiano + aleúte + idiomas algonquianos + altai do sul + amárico + aragonês + inglês arcaico + angika + idiomas apache + árabe + aramaico + araucano + arapaho + Idioma artificial + arauaqui + assamês + asturiano + idiomas atabascanos + idiomas australianos + avaric + awadhi + aimara + azerbaijano + bashkir + banda + idiomas bamileke + balúchi + balinês + basa + Idioma báltico + bielo-russo + beja + bemba + berbere + búlgaro + biari + bhojpuri + bislamá + bikol + bini + siksika + bambara + bengali + banto + tibetano + bretão + braj + bósnio + bataque + Buriat + buguinês + Blin + catalão + caddo + Idioma indígena centro-americano + caribe + Idioma caucásico + atsam + checheno + cebuano + Idioma céltico + chamorro + chibcha + chagatai + chuukese + mari + chinook jargon + choctaw + chipewyan + cheroqui + cheiene + Idioma chamic + córsico + copta + crioulo ou pidgin baseado no inglês + crioulo ou pidgin baseado no francês + crioulo ou pidgin baseado no português + cree + turco da Criméia + crioulo ou pidgin + tcheco + kashubian + eslavo eclesiástico + cuxitas (outros) + chuvash + galês + dinamarquês + dacota + dargwa + dayak + alemão + alemão da Áustria + alto alemão suíço + delaware + slave + dogrib + dinka + dogri + Idioma dravítico + sérvio baixo + duala + holandês medieval + divehi + diúla + dzonga + eve + efique + egípcio arcaico + ekajuk + grego + elamite + inglês + inglês australiano + inglês do Canadá + inglês britânico + inglês americano + inglês medieval + esperanto + espanhol + espanhol (América Latina) + espanhol ibérico + estoniano + basco + ewondo + persa + fangue + fanti + fula + finlandês + filipino + Idioma ugro-finês + fijiano + feroês + fom + francês + francês do Canadá + francês suíço + francês medieval + francês arcaico + frisão do norte + frisão oriental + friulano + frisão + irlandês + ga + gayo + gbaia + gaélico escocês + Idioma germânico + geez + gilbertês + galego + alemão medieval alto + guarani + alemão arcaico alto + gondi + gorontalo + gótico + Gerbo + grego arcaico + alemão suíço + guzerate + manx + gwichʼin + hauçá + haida + havaiano + hebraico + hindi + hiligaynon + himachali + hitita + hmong + hiri motu + croata + upper sorbian + haitiano + húngaro + hupa + armênio + herero + interlíngua + ibã + indonésio + interlingue + ibo + sichuan yi + ijo + inupiaque + ilocano + Idioma índico + Idioma indo-europeu + inguche + ido + iraniano + idiomas iroqueses + islandês + italiano + inuktitut + japonês + lojban + judaico-persa + judaico-arábico + javanês + georgiano + kara-Kalpak + kabyle + kachin + jju + kamba + karen + kawi + kabardiano + tyap + koro + congolês + khasi + khoisan (outros) + khotanês + quicuio + Kuanyama + cazaque + groenlandês + cmer + quimbundo + canarês + coreano + concani + kosraean + kpelle + canúri + karachay-Balkar + careliano + kru + kurukh + kashmiri + curdo + kumyk + kutenai + komi + córnico + quirguiz + latim + ladino + lahnda + lamba + luxemburguês + lezghian + luganda + limburgish + lingala + laosiano + mongo + lozi + lituano + luba-catanga + luba-Lulua + luiseno + lunda + luo + lushai + letão + madurês + magahi + maithili + makasar + mandinga + austronésio + massai + mocsa + mandar + mende + malgaxe + irlandês medieval + marshalês + maori + miquemaque + minangkabau + idiomas diversos + macedônio + mon-khmer (outros) + malaiala + mongol + manchu + manipuri + Idioma manobo + moldávio + mohawk + mossi + marata + malaio + maltês + idiomas múltiplos + idiomas munda + creek + mirandês + marwari + birmanês + maia + erzya + nauruano + náuatle + Idioma indígena norte-americano + napolitano + bokmål norueguês + ndebele do norte + alto alemão; baixo saxão + nepali + newari + dongo + nias + Idioma cordofano-nigeriano + niueano + holandês + neerlandês + nynorsk norueguês + norueguês + nogai + nórdico arcaico + n'ko + ndebele do sul + soto setentrional + idiomas núbios + navajo + newari clássico + nianja + nyamwezi + nyankole + nyoro + nzima + occitânico + ojibwa + oromo + oriya + ossetic + osage + turco otomano + idiomas otomanos + panjabi + Idioma papuano + pangasinã + pálavi + pampanga + papiamento + palauano + persa arcaico + Idioma filipino + fenício + páli + polonês + pohnpeian + idiomas prácrito + provençal arcaico + pashto + português + português do Brasil + português ibérico + quíchua + rajastani + rapanui + rarotongano + reto-romano + rundi + romeno + Idioma romântico + romani + root + russo + aromeno + kinyarwanda + sânscrito + sandawe + iacuto + Idioma indígeno sul-americano + idiomas salisanos + aramaico samaritano + sasak + santali + sardo + siciliano + escocês + sindi + sami do norte + selkup + Idioma semítico + sango + irlandês arcaico + linguagem de sinais + servo-croata + shan + cingalês + sidamo + idiomas sioux + Idioma sino-tibetano + eslovaco + esloveno + idiomas eslavos + samoano + sami do sul + Idioma sami + lule sami + inari sami + skolt sami + shona + soninke + somali + sogdien + songai + albanês + sérvio + sranan tongo + serere + swati + Idioma nilo-saariano + soto do sul + sundanês + sukuma + sosso + sumério + sueco + suaíli + siríaco clássico + siríaco + tâmil + Idioma tailandês + telugu + timne + tereno + tétum + tadjique + tailandês + tigrínia + tigré + tiv + turcomano + toquelauano + tagalog + klingon + tlinguite + tamaxeque + tswana + tonganês + tonganês de Nyasa + tok pisin + turco + tsonga + tsimshian + tatar + tumbuka + idiomas tupi + Idioma altaico + tuvaluano + twi + taitiano + tuvinian + udmurt + uighur + ugarítico + ucraniano + umbundu + indeterminado + urdu + usbeque + vai + venda + vietnamita + volapuque + votic + valão + idiomas wakashan + walamo + waray + washo + idiomas sórbios + uolofe + kalmyk + xosa + iao + yapese + iídiche + ioruba + idiomas iúpique + zhuang + zapoteca + símbolos blis + zenaga + chinês + chinês (simplificado) + chinês (tradicional) + zande + zulu + zunhi + sem conteúdo lingüístico + zaza + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Mundo + África + América do Norte + América do Sul + Oceania + África Ocidental + América Central + África Oriental + África do Norte + África Central + África Austral + Américas + América Setentrional + Caribe + Ásia Oriental + Ásia do Sul + Ásia Oriental e do Sul + Europa do Sul + Austrália e Nova Zelândia + Melanésia + Região da Micronésia + Polinésia + Ásia Central e do Sul + Ásia + Ásia Central + Ásia Ocidental + Europa + Europa Oriental + Europa Setentrional + Europa Ocidental + Comunidade dos Estados Independentes + América Latina e Caribe + Andorra + Emirados Árabes Unidos + Afeganistão + Antígua e Barbuda + Anguilla + Albânia + Armênia + Antilhas Holandesas + Angola + Antártida + Argentina + Samoa Americana + Áustria + Austrália + Aruba + Ilhas Aland + Azerbaijão + Bósnia-Herzegovina + Barbados + Bangladesh + Bélgica + Burquina Faso + Bulgária + Bahrain + Burundi + Benin + San Bartolomeu + Bermudas + Brunei + Bolívia + Brasil + Bahamas + Butão + Ilha Bouvet + Botsuana + Belarus + Belize + Canadá + Ilhas Cocos (Keeling) + Congo-Kinshasa + República Centro-Africana + Congo + Suíça + Costa do Marfim + Ilhas Cook + Chile + República dos Camarões + China + Colômbia + Costa Rica + Sérvia e Montenegro + Cuba + Cabo Verde + Ilhas Natal + Chipre + República Tcheca + Alemanha + Djibuti + Dinamarca + Dominica + República Dominicana + Argélia + Equador + Estônia + Egito + Saara Ocidental + Eritréia + Espanha + Etiópia + Finlândia + Fiji + Ilhas Malvinas + Micronésia + Ilhas Faroe + França + Gabão + Reino Unido + Granada + Geórgia + Guiana Francesa + Guernsey + Gana + Gibraltar + Groênlandia + Gâmbia + Guiné + Guadalupe + Guiné Equatorial + Grécia + Geórgia do Sul e Ilhas Sandwich do Sul + Guatemala + Guam + Guiné Bissau + Guiana + Hong Kong + Ilha Heard e Ilhas McDonald + Honduras + Croácia + Haiti + Hungria + Indonésia + Irlanda + Israel + Ilha de Man + Índia + Território Britânico do Oceano Índico + Iraque + Irã + Islândia + Itália + Jersey + Jamaica + Jordânia + Japão + Quênia + Quirguistão + Camboja + Quiribati + Comores + São Cristovão e Nevis + Coréia do Norte + Coréia do Sul + Kuwait + Ilhas Caiman + Casaquistão + República Democrática Popular de Lao + Líbano + Santa Lúcia + Liechtenstein + Sri Lanka + Libéria + Lesoto + Lituânia + Luxemburgo + Letônia + Líbia + Marrocos + Mônaco + Moldávia + Montenegro + San Martin + Madagascar + Ilhas Marshall + Macedônia + Mali + Mianmar + Mongólia + Macau + Ilhas Marianas do Norte + Martinica + Mauritânia + Montserrat + Malta + Maurício + Maldivas + Malawi + México + Malásia + Moçambique + Namíbia + Nova Caledônia + Níger + Ilha Norfolk + Nigéria + Nicarágua + Holanda + Noruega + Nepal + Nauru + Niue + Nova Zelândia + Omã + Panamá + Peru + Polinésia Francesa + Papua-Nova Guiné + Filipinas + Paquistão + Polônia + Saint Pierre e Miquelon + Pitcairn + Porto Rico + Território da Palestina + Portugal + Palau + Paraguai + Catar + Oceania Exterior + União Européia + Reunião + Romênia + Sérvia + Rússia + Ruanda + Arábia Saudita + Ilhas Salomão + Seychelles + Sudão + Suécia + Cingapura + Santa Helena + Eslovênia + Svalbard e Jan Mayen + Eslováquia + Serra Leoa + San Marino + Senegal + Somália + Suriname + São Tomé e Príncipe + El Salvador + Síria + Suazilândia + Ilhas Turks e Caicos + Chade + Territórios Franceses do Sul + Togo + Tailândia + Tadjiquistão + Tokelau + Timor Leste + Turcomenistão + Tunísia + Tonga + Turquia + Trinidad e Tobago + Tuvalu + Taiwan + Tanzânia + Ucrânia + Uganda + Ilhas Menores Distantes dos Estados Unidos + Estados Unidos + Uruguai + Uzbequistão + Vaticano + São Vicente e Granadinas + Venezuela + Ilhas Virgens Britânicas + Ilhas Virgens dos EUA + Vietnã + Vanuatu + Wallis e Futuna + Samoa + Iêmen + Mayotte + África do Sul + Zâmbia + Zimbábue + Região desconhecida ou inválida + + + ortografia alemã tradicional + ortografia resiana padronizada + ortografia alemã de 1996 + francês antigo de 1606 + armênio oriental + armênio ocidental + alfabeto latino turco unificado + dialeto san giorgio/bila + boontling + fonética do Alfabeto Fonético Internacional + fonética do Alfabeto Fonético Urálico + dialeto lipovaz de Resian + monotônico + dialeto natisone + dialeto gniva/njiva + dialeto oseacco/osojane + politônico + computador + Ortografia Revisada + resiano + saho + inglês padrão escocês + scouse + dialeto stolvizza/solbica + ortografia taraskievica + + + Calendário + Intercalação + Moeda + + + Ordem do Chinês Tradicional - Big5 + Calendário Budista + Calendário Chinês + Ordem Direta + Ordem do Chinês Simplificado - GB2312 + Calendário Gregoriano + Calendário Hebraico + Calendário Nacional Indiano + Calendário Islâmico + Calendário Civil Islâmico + Calendário Japonês + Ordem de Lista Telefônica + Ordem Pin-yin + Calendário da República da China + Ordem dos Traços + Ordem Tradicional + + + americano + métrico + + + Idioma: {0} + Roteiro: {0} + Região: {0} + + + + [a á à â ã b c ç d e é ê f-i í j-o ó ò ô õ p-u ú ü v-z] + [ă å ä ā æ è ĕ ë ē ì ĭ î ï ī k ñ º ŏ ö ø ō œ ß ù ŭ û ū w y ÿ] + [a-z] + + + + + + + + + + + + + + EEEE, d 'de' MMMM 'de' yyyy G + + + + + d 'de' MMMM 'de' yyyy G + + + + + d 'de' MMMM 'de' yyyy G + + + + + d/M/yyyy + + + + + + + HH'h'mm'min'ss's' + + + + + + + + + jan + fev + mar + abr + mai + jun + jul + ago + set + out + nov + dez + + + janeiro + fevereiro + março + abril + maio + junho + julho + agosto + setembro + outubro + novembro + dezembro + + + + + J + F + M + A + M + J + J + A + S + O + N + D + + + + + + + dom + seg + ter + qua + qui + sex + sáb + + + domingo + segunda-feira + terça-feira + quarta-feira + quinta-feira + sexta-feira + sábado + + + + + D + S + T + Q + Q + S + S + + + + + + + T1 + T2 + T3 + T4 + + + 1º trimestre + 2º trimestre + 3º trimestre + 4º trimestre + + + + + 1 + 2 + 3 + 4 + + + + AM + PM + + + Antes de Cristo + Ano do Senhor + + + a.C. + d.C. + + + + + + EEEE, d 'de' MMMM 'de' yyyy + + + + + d 'de' MMMM 'de' yyyy + + + + + dd/MM/yyyy + + + + + dd/MM/yy + + + + + + + HH'h'mm'min'ss's' v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1} {0} + + + + HH:mm + HH:mm:ss + H:mm + L + EEE, dd/MM + LLL + EEE, d MMM + EEE, d MMMM + d MMMM + d MMM + dd/MM + d/M + d + mm:ss + mm:ss + yyyy + MM/yyyy + EEE, dd/MM/yyyy + MMM 'de' yyyy + EEE, d 'de' MMM 'de' yyyy + MMMM 'de' yyyy + yyyy Q + yyyy QQQ + MM/yy + MMM yy + EEE, d 'de' MMM 'de' yy + d 'de' MMM 'de' yy + Q yy + MM/yyyy + MMM 'de' yyyy + + + {0} - {1} + + M-M + + + E, dd/MM - E, dd/MM + E, dd/MM - E, dd/MM + + + MMM-MMM + + + E, d 'de' MMM - E, d 'de' MMM + E, d - E, d 'de' MMM + + + LLLL-LLLL + + + d 'de' MMM - d 'de' MMM + d-d 'de' MMM + + + dd/MM - dd/MM + dd/MM - dd/MM + + + d-d + + + HH-HH + HH-HH + + + HH:mm-HH:mm + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH-HH v + HH-HH v + + + y-y + + + MM/yy - MM/yy + MM/yy - MM/yy + + + E, dd/MM/yy - E, dd/MM/yy + E, dd/MM/yy - E, dd/MM/yy + E, dd/MM/yy - E, dd/MM/yy + + + MMM-MMM 'de' yyyy + MMM 'de' yyyy - MMM 'de' yyyy + + + E, d 'de' MMM - E, d 'de' MMM 'de' yyyy + E, d - E, d 'de' MMM 'de' yyyy + E, d 'de' MMM 'de' yyyy - E, d 'de' MMM 'de' yyyy + + + yyyy-MM – MM + yyyy-MM – yyyy-MM + + + d 'de' MMM - d 'de' MMM 'de' yyyy + d-d 'de' MMM 'de' yyyy + d 'de' MMM 'de' yyyy - d 'de' MMM 'de' yyyy + + + dd/MM/yy - dd/MM/yy + dd/MM/yy - dd/MM/yy + dd/MM/yy - dd/MM/yy + + + + + + Era + + + Ano + + + Mês + + + Semana + + + Dia + Hoje + Amanhã + Depois de amanhã + Três dias a partir de hoje + Ontem + Antes de ontem + Três dias atrás + + + Dia da semana + + + Período do dia + + + Hora + + + Minuto + + + Segundo + + + Fuso + + + + + + + + EEEE, d MMMM y G + + + + + d 'de' MMMM 'de' y G + + + + + d MMM y G + + + + + d/M/yy + + + + + + + + Antes de R.O.C. + + + Antes de R.O.C. + + + + + + +HH:mm;-HH:mm + GMT{0} + Horário {0} + {1} ({0}) + + Desconhecido + + + Cabul + + + Antígua + + + Anguila + + + Tirana + + + Ierevan + + + Curaçao + + + Pólo Sul + + + Dumont D'Urville + + + Tucumã + + + Córdoba + + + Viena + + + Dacca + + + Bruxelas + + + Sófia + + + Barein + + + Porto Novo + + + Bermudas + + + Eirunepé + + + Cuiabá + + + Belém + + + Araguaína + + + São Paulo + + + Maceió + + + Fernando de Noronha + + + St. Johns + + + Zurique + + + Abidjã + + + Ilha de Páscoa + + + Xangai + + + Bogotá + + + Cabo Verde + + + Nicósia + + + Berlim + + + Djibuti + + + Copenhague + + + Argel + + + Galápagos + + + Guaiaquil + + + Canárias + + + Madri + + + Helsinque + + + Ilhas Faroe + + + Londres + + + Granada + + + Caiena + + + Guadalupe + + + Atenas + + + Geórgia do Sul + + + Guiana + + + Porto Príncipe + + + Budapeste + + + Jacarta + + + Jerusalém + + + Bagdá + + + Teerã + + + Roma + + + Amã + + + Tóquio + + + Nairóbi + + + São Cristóvão + + + Seul + + + Caimã + + + Vienciana + + + Beirute + + + Santa Lúcia + + + Monróvia + + + Luxemburgo + + + Trípoli + + + Mônaco + + + Martinica + + + Ilhas Maurício + + + Maldivas + + + Cidade do México + + + Mérida + + + Cancún + + + Manágua + + + Amsterdã + + + Catmandu + + + Panamá + + + Taiti + + + Varsóvia + + + Porto Rico + + + Açores + + + Lisboa + + + Asunción + + + Catar + + + Ilha Reunião + + + Bucareste + + + Moscou + + + Riad + + + Estocolmo + + + Cingapura + + + Santa Helena + + + Dacar + + + São Tomé + + + Salvador + + + Damasco + + + Lomé + + + Tunísia + + + Istambul + + + Porto Espanha + + + New Salen, Dakota do Norte + + + Central + + + Indianápolis + + + Nova Iorque + + + Montevidéu + + + São Vicente + + + St. Thomas + + + Ilha Mayotte + + + Johannesburgo + + + + Horário do Acre + Horário de Verão do Acre + + + ACT + ACST + + true + + + + Horário do Afeganistão + + + + + Horário da África Central + + + + + Horário da África Oriental + + + + + Horário da África do Sul + Horário Padrão da África do Sul + + + + + Horário da África Ocidental + Horário de Verão da África Ocidental + + + + + Horário do Aktyubinsk + Horário de Verão do Aktyubinsk + + + + + Horário do Alaska + Horário Padrão do Alasca + Horário de Verão do Alasca + + true + + + + Horário do Alasca-Havaí + Horário Padrão do Alaska-Havaí + Horário de Verão do Alaska-Havaí + + + + + Horário do Almaty + Horário de Verão do Almaty + + + + + Horário do Amazonas + Horário de Verão do Amazonas + + true + + + + Horário Central + Horário Padrão Central + Horário de Verão Central + + + + + Horário Oriental + Horário Padrão Oriental + Horário de Verão Oriental + + + + + Horário da Montanha + Horário Padrão da Montanha + Horário de Verão da Montanha + + + + + Horário do Pacífico + Horário Padrão do Pacífico + Horário de Verão do Pacífico + + + + + Horário do Anadyr + Horário de Verão do Anadyr + + + + + Horário do Aqtau + Horário de Verão do Aqtau + + + + + Horário do Aqtobe + Horário de Verão do Aqtobe + + + + + Horário da Arábia + Horário Padrão da Arábia + Horário de Verão Árabe + + + AT (Arábia) + AST (Arábia) + ADT (Arábia) + + + + + Horário da Argentina + Horário de Verão da Argentina + + + + + Horário da Argentina Ocidental + + + + + Horário da Armênia + Horário de Verão da Armênia + + + AMT (Armênia) + AMST (Armênia) + + + + + Horário de Ashkhabad + Horário de Verão de Ashkhabad + + + + + Horário do Atlântico + Horário Padrão do Atlântico + Horário de Verão do Atlântico + + + + + Horário da Austrália Central + Horário Padrão da Austrália Central + Horário de Verão da Austrália Central + + + ACT (Austrália) + ACST (Austrália) + ACDT (Austrália) + + + + + Horário da Austrália Centro Ocidental + Horário Padrão da Austrália Centro Ocidental + Horário de Verão da Austrália Centro Ocidental + + + + + Horário da Austrália Oriental + Horário Padrão da Austrália Oriental + Horário de Verão da Austrália Oriental + + + + + Horário da Austrália Ocidental + Horário Padrão da Austrália Ocidental + Horário de Verão da Austrália Ocidental + + + + + Horário do Arzeibaijão + Horário de Verão do Arzeibaijão + + + + + Horário de Açores + Horário de Verão de Açores + + + + + Horário de Baku + Horário de Verão de Baku + + + + + Horário de Bangladesh + + + + + Horário de Bering + Horário Padrão de Bering + Horário de Verão de Bering + + + + + Horário do Butão + + + + + Horário da Bolívia + + + + + Horário de Bornéo + Horário de Verão de Bornéo + + + + + Horário de Brasília + Horário de Verão de Brasília + + true + + + + Horário de Brunei Darussalam + + + + + Horário de Cabo Verde + Horário de Verão de Cabo Verde + + + + + Horário de Chamorro + Horário Padrão de Chamorro + + + + + Horário de Changbai + + + + + Horário de Padrão de Chatham + Horário de Verão de Chatham + + + + + Horário do Chile + Horário de Verão do Chile + + + + + Horário da China + Horário Padrão da China + Horário de Verão da China + + + CT (China) + CST (China) + CDT (China) + + + + + Horário de Choibalsan + Horário de Verão de Choibalsan + + + + + Horário das Ilhas Christmas + + + + + Horário das Ilhas Coco + + + + + Horário da Colômbia + Horário de Verão da Colômbia + + + + + Horário das Ilhas Cook + Meio Horário de Verão das Ilhas Cook + + + + + Horário de Cuba + Horário Padrão de Cuba + Horário de Verão de Cuba + + + CST (Cuba) + CDT (Cuba) + + + + + Horário de Dacca + + + + + Horário de Davis + + + + + Horário de Dumont-d'Urville + + + + + Horário de Dushanbe + Horário de Verão de Dushanbe + + + + + Horário da Guiana Holandesa + + + + + Horário do Timor do Leste + + + + + Horário da Ilha de Páscoa + Horário de Verão da Ilha de Páscoa + + + + + Horário do Equador + + + + + Horário da Europa Central + Horário de Verão da Europa Central + + + + + Horário Padrão da Europa Oriental + Horário de Verão da Europa Oriental + + + + + Horário da Europa Ocidental + Horário de Verão da Europa Ocidental + + + + + Horário das Ilhas Malvinas + Horário de Verão das Ilhas Malvinas + + + + + Horário de Fiji + Horário de Verão de Fiji + + + + + Horário da Guiana Francesa + + + + + Horário da Antártida e do Sul da França + + + + + Horário de Frunze + Horário de Verão de Frunze + + + + + Horário do Meridiano de Greenwich + + true + + + + Horário de Galápagos + + + + + Horário de Gambier + + + + + Horário da Georgia + Horário de Verão da Georgia + + + + + Horário das Ilhas Gilberto + + + + + Horário da Groelândia Central + Horário de Verão da Groenlândia Central + + + + + Horário da Groelândia Oriental + Horário de Verão da Groelândia Oriental + + + + + Horário da Groenlândia Ocidental + Horário de Verão da Groenlândia Ocidental + + + + + Horário Padrão de Guam + + + GST (Guam) + + + + + Horário do Golfo + Horário Padrão do Golfo + + + + + Horário da Guiana + + + + + Horário Padrão do Havaí + + true + + + + Horário de Hong Kong + Horário de Verão de Hong Kong + + + + + Horário de Hovd + Horário de Verão de Hovd + + + + + Horário Padrão da Índia + + + + + Horário do Oceano Índico + + + + + Horário da Indochina + + + + + Horário da Indonésia Central + + + + + Horário da Indonésia Oriental + + + + + Horário da Indonésia Ocidental + + + + + Horário Padrão do Irã + Horário de Verão do Irã + + + + + Horário de Irkutsk + Horário de Verão de Irkutsk + + + + + Horário de Israel + Horário Padrão de Israel + Horário de Verão de Israel + + + IST (Israel) + + + + + Horário do Japão + Horário Padrão do Japão + Horário de Verão do Japão + + + + + Horário de Petropavlovsk-Kamchatski + Horário de Verão de Petropavlovsk-Kamchatski + + + + + Horário de Karachi + + + + + Horário de Kashgar + + + + + Horário do Casaquistão do Leste + Horário Padrão do Cazaquistão do Leste + + + + + Horário do Casaquistão do Oeste + Horário do Cazaquistão Ocidental + + + + + Horário de Kizilorda + Horário de Verão de Kizilorda + + + + + Horário da Coréia + Horário Padrão da Coréia + Horário de Verão da Coréia + + + + + Horário da Coréia + + + + + Horário de Krasnoyarsk + Horário de Verão de Krasnoyarsk + + + + + Horário de Kuybyshev + Horário de Verão de Kuybyshev + + + + + Horário de Kwajalein + + + + + Horário do Quirguistão + + + + + Horário de Lanka + + + + + Horário das Ilhas Line + + + + + Horário de Long-Shu + + + + + Horário de Lord Howe + Horário Padrão de Lord Howe + Horário de Verão de Lord Howe + + + + + Horário de Macau + Horário de Verão de Macau + + + + + Horário de Magadan + Horário de Verão de Magadan + + + + + Horário de Malaia + + + + + Horário da Malásia + + + + + Horário das Ilhas Maldivas + + + + + Horário das Marquesas + + + + + Horário das Ilhas Marshall + + + + + Horário das Ilhas Maurício + + + + + Horário de Mawson + + + + + Horário de Ulan Bator + Horário de Verão de Ulan Bator + + + + + Horário de Moscou + Horário Padrão de Moscou + Horário de Verão de Moscou + + + + + Horário de Mianmar + + + + + Horário de Nauru + + + + + Horário do Nepal + + + + + Horário da Nova Caledônia + Horário de Verão da Nova Caledônia + + + + + Horário da Nova Zelândia + Horário Padrão da Nova Zelândia + Horário de Verão da Nova Zelândia + + + + + Horário de Newfoundland + Horário Padrão de Terra Nova + Horário de Verão de Terra Nova + + + + + Horário de Niue + + + + + Horário das Ilhas Norfolk + + + + + Horário de Fernando de Noronha + Horário de Verão de Fernando de Noronha + + + + + Horário das Ilhas Mariana do Norte + + + + + Horário de Novosibirsk + Horário de Verão de Novosibirsk + + + + + Horário de Omsk + Horário de Verão de Omsk + + + + + Horário do Paquistão + Horário de Verão do Paquistão + + + + + Horário de Palau + + + + + Horário de Papua Nova Guiné + + + + + Horário do Paraguai + Horário de Verão do Paraguai + + + + + Horário do Peru + Horário de Verão do Peru + + + + + Horário das Filipinas + Horário de Verão das Filipinas + + + + + Horário das Ilhas Fênix + + + + + Horário de Pierre e Miquelon + Horário Padrão de Pierre e Miquelon + Horário de Verão de Pierre e Miquelon + + + + + Horário de Pitcairn + + + + + Horário de Ponape + + + + + Horário de Qyzylorda + Horário de Verão de Qyzylorda + + + + + Horário das Ilhas Reunião + + + + + Horário de Rothera + + + + + Horário de Sakhalin + Horário de Verão de Sakhalin + + + + + Horário de Samara + Horário de Verão de Samara + + + + + Horário de Samarkand + Horário de Verão de Samarkand + + + + + Horário Padrão de Samoa + + + + + Horário das Ilhas Seychelles + + + + + Horário de Shevchenko + Horário de Verão de Shevchenko + + + + + Horário Padrão de Cingapura + + + + + Horário das Ilhas Salomão + + + + + Horário da Georgia do Sul + + + GST (Georgia do Sul) + + + + + Horário do Suriname + + + + + Horário de Sverdlovsk + Horário de Verão de Sverdlovsk + + + + + Horário de Syowa + + + + + Horário do Haiti + + + + + Horário do Tajiquistão + + + + + Horário de Tashkent + Horário de Verão de Tashkent + + + + + Horário de Tbilisi + Horário de Verão de Tbilisi + + + + + Horário de Tokelau + + + + + Horário de Tonga + Horário de Verão de Tonga + + + + + Horário de Truk + + + + + Horário da Turquia + Horário de Verão da Turquia + + + + + Horário do Turcomenistão + Horário de Verão do Turcomenistão + + + + + Horário de Tuvalu + + + + + Horário de Ural'sk + Horário de Verão de Ural'sk + + + + + Horário do Uruguai + Horário de Verão do Uruguai + + + + + Horário de Urumqi + + + + + Horário do Uzbequistão + Horário de Verão do Uzbequistão + + + + + Horário de Vanuatu + Horário de Verão de Vanuatu + + + + + Horário da Venezuela + + + + + Horário de Vladivostok + Horário de Verão de Vladivostok + + + + + Horário de Volgograd + Horário de Verão de Volgograd + + + + + Horário de Vostok + + + + + Horário das Ilhas Wake + + + + + Horário de Wallis e Fortuna + + + + + Horário de Yakutsk + Horário de Verão de Yakutsk + + + + + Horário de Yekaterinburg + Horário de Verão de Yekaterinburg + + + + + Horário de Yerevan + Horário de Verão de Yerevan + + + + + Horário de Yukon + Horário Padrão de Yukon + Horário de Verão de Yukon + + + + + + + , + . + ; + % + 0 + # + + + - + E + + + NaN + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + ¤#,##0.00;(¤#,##0.00) + + + {0} {1} + + + + Peseta de Andorra + Peseta de Andorra + Pesetas de Andorra + + + Dirém dos Emirados Árabes Unidos + Dirham de UAE + Dirhans de UAE + + + Afegane (1927-2002) + Afghani (AFA) + Afghani (AFA) + + + Afegane + Afghani + Afghanis + Af + + + Lek Albanês + Lek albanês + Leks albaneses + lek + + + Dram Arménio + Dram armênio + Drams armênios + dram + + + Guilder das Antilhas Holandesas + Florim das Antilhas Holandesas + Florins das Antilhas Holandesas + NA f. + + + Cuanza angolano + Kwanza angolano + Kwanzas angolanos + + + Cuanza angolano (1977-1990) + Kwanza angolano (AOK) + Kwanzas angolanos (AOK) + + + Novo cuanza angolano (1990-2000) + Novo kwanza angolano (AOK) + Novos kwanzas angolanos (AOK) + + + Cuanza angolano reajustado (1995-1999) + Kwanza angolano reajustado (AOR) + Kwanzas angolanos reajustados (AOR) + + + Austral argentino + Austral argentino + Austrais argentinos + + + Peso argentino (1983-1985) + Peso argentino (ARP) + Pesos argentinos (ARP) + + + Peso argentino + Peso argentino + Pesos argentinos + Arg$ + + + Xelim austríaco + Schilling australiano + Schillings australianos + + + Dólar australiano + Dólar australiano + Dólares australianos + $A + + + Guilder de Aruba + Florim de Aruba + Florins de Aruba + + + Manat azerbaijano + Manat do Azeibaijão (AZM) + Manats do Azeibaijão (AZM) + + + Manat do Azerbaijão + Manat do Azeibaijão + Manats do Azeibaijão + + + Dinar da Bósnia-Herzegovina + Dinar da Bósnia Herzegovina + Dinares da Bósnia Herzegovina + + + Marco bósnio-herzegovino conversível + Marca conversível da Bósnia Herzegovina + Marcas conversíveis da Bósnia Herzegovina + KM + + + Dólar de Barbados + Dólar de Barbados + Dólares de Barbados + BDS$ + + + Taka de Bangladesh + Taka de Bangladesh + Takas de Bangladesh + Tk + + + Franco belga (conversível) + Franco belga (conversível) + Francos belgas (conversível) + + + Franco belga + Franco belga + Francos belgas + BF + + + Franco belga (financeiro) + Franco belga (financeiro) + Francos belgas (financeiro) + + + Lev forte búlgaro + Lev pesado da Bulgária + Levs pesados da Bulgária + lev + + + Lev novo búlgaro + Novo lev da Bulgária + Novos levs da Bulgária + + + Dinar bareinita + Dinar do Bahraini + Dinares do Bahraini + BD + + + Franco do Burundi + Franco do Burundi + Francos do Burundi + Fbu + + + Dólar das Bermudas + Dólar das Bermudas + Dólares das Bermudas + Ber$ + + + Dólar do Brunei + Dólar de Brunei + Dólares de Brunei + + + Boliviano + Boliviano + Bolivianos + Bs + + + Peso boliviano + Peso boliviano + Pesos bolivianos + + + Mvdol boliviano + Mvdol boliviano + Mvdols bolivianos + + + Cruzeiro novo brasileiro (1967-1986) + Cruzeiro novo brasileiro + Cruzeiro novo brasileiro (BRB) + + + Cruzado brasileiro + Cruzado brasileiro + Cruzados brasileiros + + + Cruzeiro brasileiro (1990-1993) + Cruzeiro brasileiro (BRE) + Cruzeiros brasileiros (BRE) + + + Real brasileiro + Real brasileiro + Reais brasileiros + + + Cruzado novo brasileiro + Cruzado novo brasileiro + Cruzados novos brasileiros + + + Cruzeiro brasileiro + Cruzeiro brasileiro + Cruzeiros brasileiros + + + Dólar das Bahamas + Dólar de Bahamian + Dólares de Bahamian + + + Ngultrum do Butão + Ngultrum do Butão + Ngultruns do Butão + Nu + + + Kyat birmanês + Kyat burmês + Kyats burmeses + + + Pula botsuanesa + Pula de Botsuana + Pulas de Botsuana + + + Rublo novo bielo-russo (1994-1999) + Novo rublo bielorusso + Novos rublos bielorussos + + + Rublo bielo-russo + Rublo bielorusso + Rublos bielorussos + Rbl + + + Dólar do Belize + Dólar de Belize + Dólares de Belize + BZ$ + + + Dólar canadense + Dólar canadense + Dólares canadenses + Can$ + + + Franco congolês + Franco congolês + Francos congoleses + + + Euro WIR + Euro WIR + Euros WIR + + + Franco suíço + Franco suíço + Francos suíços + SwF + + + Franco WIR + Franco WIR + Francos WIR + + + Unidades de Fomento chilenas + Unidade de fomento chilena + Unidades de fomento chilenas + + + Peso chileno + Peso chileno + Pesos chilenos + Ch$ + + + Yuan Renminbi chinês + Yuan chinês + Yuans chineses + Y + + + Peso colombiano + Peso colombiano + Pesos colombianos + Col$ + + + Unidade de Valor Real + Unidade de valor real + Unidades de valor real + + + Colon da Costa Rica + Colon costa-riquenho + Colons costa-riquenhos + C + + + Dinar Antigo sérvio + Dinar antigo da Sérvia + Dinares antigos da Sérvia + + + Coroa Forte checoslovaca + Corona tcheca + Coronas tchecas + + + Peso cubano + Peso cubano + Pesos cubanos + + + Escudo cabo-verdiano + Escudo de Cabo Verde + Escudos de Cabo Verde + CVEsc + + + Libra cipriota + Libra do Chipre + Libras do Chipre + £C + + + Coroa checa + Corona da República Tcheca + Coronas da República Tcheca + + + Ostmark da Alemanha Oriental + Ostmark da Alemannha Oriental + Ostmarks da Alemannha Oriental + + + Marco alemão + Marco alemão + Marcos alemães + + + Franco do Djibuti + Franco de Djibouti + Francos de Djibouti + DF + + + Coroa dinamarquesa + Krone dinamarquês + Krones dinamarqueses + DKr + + + Peso dominicano + Peso dominicano + Pesos dominicanos + RD$ + + + Dinar argelino + Dinar algeriano + Dinares algerianos + DA + + + Sucre equatoriano + Sucre equatoriano + Sucres equatorianos + + + Unidade de Valor Constante (UVC) do Equador + Unidade de valor constante equatoriana (UVC) + Unidades de valor constante equatoriana (UVC) + + + Coroa estoniana + Kroon estoniano + Kroons estonianos + + + Libra egípcia + Libra egípcia + Libras egípcias + + + Ekwele + Ekwele + Ekweles + + + Nakfa da Eritréia + Nakfa da Eritréia + Nakfas da Eritréia + + + Peseta espanhola (conta A) + Peseta espanhola (conta A) + Pesetas espanholas (conta A) + + + Peseta espanhola (conta conversível) + Peseta espanhola (conta conversível) + Pesetas espanholas (conta conversível) + + + Peseta espanhola + Peseta espanhola + Pesetas espanholas + + + + Birr etíope + Birr etíope + Birrs etíopes + Br + + + Euro + Euro + Euros + + + Marca finlandesa + Markka finlandesa + Markkas finlandesas + + + Dólar de Fiji + Dólar de Fiji + Dólares de Fiji + F$ + + + Libra das Malvinas + Libra das Ilhas Malvinas + Libras das Ilhas Malvinas + + + Franco francês + Franco francês + Francos franceses + + + Libra esterlina britânica + Libra esterlina britânica + Libras esterlinas britânicas + £ + + + Cupom Lari georgiano + Kupon larit da Geórgia + Kupon larits da Geórgia + + + Lari georgiano + Lari da Geórgia + Laris da Geórgia + lari + + + Cedi de Gana (1979-2007) + Cedi de Gana (GHC) + Cedis de Gana (GHC) + + + Cedi ganês + Cedi de Gana + Cedis de Gana + + + Libra de Gibraltar + Libra de Gibraltar + Libras de Gibraltar + + + Dalasi de Gâmbia + Dalasi da Gâmbia + Dalasis da Gâmbia + + + Franco de Guiné + Franco da Guinéa + Francos da Guinéa + GF + + + Syli da Guiné + Syli da Guinéa + Sylis da Guinéa + + + Ekwele da Guiné Equatorial + Ekwele da Guinéa Equatorial + Ekweles da Guinéa Equatorial + + + Dracma grego + Dracma grego + Dracmas gregos + + + Quetçal da Guatemala + Quetzal da Guatemala + Quetzales da Guatemala + Q + + + Escudo da Guiné Portuguesa + Escudo da Guinéa Portuguesa + Escudos da Guinéa Portuguesa + + + Peso da Guiné-Bissau + Peso de Guiné-Bissau + Pesos de Guiné-Bissau + + + Dólar da Guiana + Dólar da Guiana + Dólares da Guiana + G$ + + + Dólar de Hong Kong + Dólar de Hong Kong + Dólar de Hong Kong + HK$ + + + Lempira de Honduras + Lempira de Honduras + Lempiras de Honduras + L + + + Dinar croata + Dinar croata + Dinares croata + + + Kuna croata + Kuna croata + Kunas croatas + + + Gurde do Haiti + Gourde haitiano + Gourdes haitianos + + + Forinte húngaro + Forint húngaro + Forints húngaros + Ft + + + Rupia indonésia + Rúpia da Indonésia + Rúpias da Indonésia + Rp + + + Libra irlandesa + Libra irlandesa + Libras irlandesas + IR£ + + + Libra israelita + Libra israeli + Libras israelis + + + Sheqel Novo israelita + Sheqel novo israeli + Sheqels novos israelis + + + Rúpia indiana + Rúpia indú + Rúpias indús + 0≤Rs.|1≤Re.|1 + + + Dinar iraquiano + Dinar iraquiano + Dinares iraquianos + ID + + + Rial iraniano + Rial iraniano + Riales iranianos + RI + + + Coroa islandesa + Krona islandesa + Kronas islandesas + + + Lira italiana + Lira italiana + Liras italianas + + + + Dólar jamaicano + Dólar jamaicano + Dólares jamaicanos + J$ + + + Dinar jordaniano + Dinar jordaniano + Dinares jordanianos + JD + + + Iene japonês + Ien japonês + Ienes japoneses + ¥ + + + Xelim queniano + Shilling queniano + Shillings quenianos + K Sh + + + Som do Quirguistão + Som do Quirguistão + Soms do Quirguistão + som + + + Riel cambojano + Riel cambojano + Rieles cambojanos + CR + + + Franco de Comores + Franco de Comoro + Francos de Comoro + CF + + + Won norte-coreano + Won norte coreano + Wons norte coreano + + + Won sul-coreano + Won sul-coreano + Won sul coreano + + + Dinar coveitiano + Wons sul coreanos + Dinares kuaitianos + KD + + + Dólar das Ilhas Caiman + Dólar das Ilhas Cayman + Dólares das Ilhas Caiman + + + Tenge do Cazaquistão + Tengue do Casaquistão + T + + + Kip de Laos + Kip do Laos + Kips do Laos + + + Libra libanesa + Libra libanesa + Libras libanesas + LL + + + Rupia do Sri Lanka + Rúpia do Siri Lanka + Rúpias do Siri Lanka + SL Re + + + Dólar liberiano + Dólar da Libéria + Dólares da Libéria + + + Loti do Lesoto + Loti do Lesoto + Lotis do Lesoto + M + + + Maloti + Maloti + Malotis + + + Lita lituano + Lita lituana + Litas lituanas + + + Talonas lituano + Talonas lituanas + Talonases lituanas + + + Franco conversível de Luxemburgo + Franco conversível de Luxemburgo + Francos conversíveis de Luxemburgo + + + Franco luxemburguês + Franco de Luxemburgo + Francos de Luxemburgo + + + Franco financeiro de Luxemburgo + Franco financeiro de Luxemburgo + Francos financeiros de Luxemburgo + + + Lats letão + Lats da Letônia + Latses da Letônia + + + Rublo letão + Rublo da Letônia + Rublos da Letônia + + + Dinar líbio + Dinar líbio + Dinares líbios + LD + + + Dirém marroquino + Dirham marroquino + Dirhams marroquinos + + + Franco marroquino + Franco marroquino + Francos marroquinos + + + Leu da Moldávia + Leu da Moldávia + Leus da Moldávia + + + Ariary de Madagascar + Ariari de Madagascar + Ariaries de Madagascar + + + Franco de Madagascar + Franco de Madagascar + Francos de Madagascar + + + Dinar macedônio + Denar da Macedônia + Denares da Macedônia + MDen + + + Franco de Mali + Franco de Mali + Francos de Mali + + + Kyat de Mianmar + Kyat de Mianmar + Kyats de Mianmar + + + Tugrik mongol + Tugrik da Mongólia + Tugriks da Mongólia + Tug + + + Pataca macaense + Pataca de Macau + Patacas de Macau + + + Ouguiya da Mauritânia + Ouguiya da Mauritânia + Ouguiyas da Mauritânia + UM + + + Lira maltesa + Lira Maltesa + Liras maltesas + Lm + + + Libra maltesa + Libra maltesa + Libras maltesas + + + Rupia de Maurício + Rúpia das Ilhas Maurício + Rúpias das Ilhas Maurício + + + Rupias das Ilhas Maldivas + Rufiyaa das Ilhas Maldivas + Rufiyaas das Ilhas Maldivas + + + Cuacha do Maláui + Kwacha do Malawi + Kwachas do Malawi + MK + + + Peso mexicano + Peso mexicano + Pesos mexicanos + MEX$ + + + Peso Prata mexicano (1861-1992) + Peso de prata mexicano (MXP) + Pesos de prata mexicanos (MXP) + + + Unidade de Investimento (UDI) mexicana + Unidade de investimento mexicana (UDI) + Unidades de investimento mexicanas (UDI) + + + Ringgit malaio + Ringgit malaio + Ringgits da Malásia + RM + + + Escudo de Moçambique + Escudo de Moçambique + Escudos de Moçambique + + + Metical antigo de Moçambique + Metical antigo de Moçambique + Meticales antigos de Moçambique + Mt + + + Metical do Moçambique + Metical de Moçambique + Meticales de Moçambique + MTn + + + Dólar da Namíbia + Dólar da Namíbia + Dólares da Namíbia + N$ + + + Naira nigeriana + Naira da Nigéria + Nairas da Nigéria + + + Córdoba nicaraguense + Córdoba nicaraguense + Córdobas da Nicarágua + + + Córdoba Ouro nicaraguense + Córdoba de ouro da Nicarágua + Córdobas de ouro da Nicarágua + + + Florim holandês + Florim holandês + Florins holandeses + + + Coroa norueguesa + Crone norueguês + Crones noruegueses + NKr + + + Rupia nepalesa + Rúpia nepalesa + Rúpias nepalesas + Nrs + + + Dólar da Nova Zelândia + Dólar da Nova Zelândia + Dólares da Nova Zelândia + $NZ + + + Rial de Omã + Rial de Omã + Riales de Omã + RO + + + Balboa panamenho + Balboa do Panamá + Balboas do Panamá + + + Inti peruano + Inti peruano + Intis peruanos + + + Sol Novo peruano + Novo sol peruano + Novos soles peruanos + + + Sol peruano + Sol peruano + Soles peruanos + + + Kina da Papua-Nova Guiné + Kina de Papua Nova Guiné + Kinas de Papua Nova Guiné + + + Peso filipino + peso filipino + Pesos filipinos + Php + + + Rupia paquistanesa + rúpia paquistanesa + Rúpias paquistanesas + Pra + + + Zloti polonês + Zloti polonês + Zlotis poloneses + Zl + + + Zloti polonês (1950-1995) + Zloti polonês (PLZ) + Zlotis poloneses (PLZ) + + + Escudo português + Escudo português + Escudos portugueses + Esc. + + + Guarani paraguaio + Guarani paraguaio + Guaranis paraguaios + + + Rial catariano + Rial do Quatar + Riales do Quatar + QR + + + Dólar rodesiano + Dólar da Rodésia + Dólares da Rodésia + + + Leu romeno antigo + Leu antigo da Romênia + Leus antigos da Romênia + + + Leu romeno + Leu da Romênia + Lei da Romênia + 0≤lei|1≤leu|1 + + + Dinar sérvio + Dinar sérvio + Dinares sérvios + + + Rublo russo + Rúpias russa + Rúpias russas + + + Rublo russo (1991-1998) + Rúpia russa (RUR) + Rúpias russas (RUR) + + + Franco ruandês + Franco de Ruanda + Francos de Ruanda + + + Rial saudita + Riyal saudita + Riyales sauditas + SRI + + + Dólar das Ilhas Salomão + Dólar das Ilhas Salomão + Dólares das Ilhas Salomão + SI$ + + + Rupia das Seychelles + Rúpia das Ilhas Seychelles + Rúpias das Ilhas Seychelles + SR + + + Dinar sudanês + Dinar antigo do Sudão + Dinares antigos do Sudão + + + Libra sudanesa + Libra sudanesa + Libras sudanesas + + + Libra sudanesa antiga + Libra antiga sudanesa + Libras antigas sudanesas + + + Coroa sueca + Crona suéca + Cronas suécas + SKr + + + Dólar de Cingapura + Dólar de Singapura + Dólares de Singapura + S$ + + + Libra de Santa Helena + Libra de Santa Helena + Libras de Santa Helena + + + Tolar Bons esloveno + Tolar da Eslovênia + Tolares da Eslovênia + + + Coroa eslovaca + Coruna eslovaca + Corunas eslovacas + Sk + + + Leone de Serra Leoa + Leone de Serra Leoa + Leones de Serra Leoa + + + Xelim somali + Shilling da Somália + Shillings da Somália + Sh. + + + Dólar do Suriname + Dólar do Suriname + Dólares do Suriname + + + Florim do Suriname + Florim do Suriname + Florins do Suriname + Sf + + + Dobra de São Tomé e Príncipe + Dobra de San Tomé e Príncipe + Dobras de San Tomé e Príncipe + Db + + + Rublo soviético + Rúpia soviética + Rúpias soviéticas + + + Colom salvadorenho + Colon de El Salvador + Colons de El Salvador + + + Libra síria + Libra síria + Libras sírias + LS + + + Lilangeni da Suazilândia + Lilangeni da Suazilândia + Lilangenis da Suazilândia + E + + + Baht tailandês + Baht da Tailândia + Bahts da Tailândia + + + Rublo do Tadjiquistão + Rúpia do Tajaquistão + Rúpias do Tajaquistão + + + Somoni tadjique + Somoni do Tajaquistão + Somonis do Tajaquistão + + + Manat do Turcomenistão + Manat do Turcomenistão + Manats do Turcomenistão + + + Dinar tunisiano + Dinar da Tunísia + Dinares da Tunísia + + + Paʻanga de Tonga + Paʻanga de Tonga + Paʻangas de Tonga + T$ + + + Escudo timorense + Escudo do Timor + Escudos do Timor + + + Lira turca antiga + Lira turca antiga + Liras turcas antigas + TL + + + Lira turca + Nova Lira turca + Liras turcas + + + Dólar de Trinidad e Tobago + Dólar de Trinidad e Tobago + Dólares de Trinidad e Tobago + TT$ + + + Dólar Novo de Taiwan + Dólar de Taiwan + Dólares de Taiwan + NT$ + + + Xelim da Tanzânia + Shilling da Tanzânia + Shillings da Tanzânia + T Sh + + + Hryvnia ucraniano + Hryvnia da Ucrânia + Hryvnias da Ucrânia + + + Karbovanetz ucraniano + Karbovanetz da Ucrânia + Karbovanetzs da Ucrânia + + + Xelim ugandense (1966-1987) + Shilling de Uganda (UGS) + Shillings de Uganda (UGS) + + + Xelim ugandense + Shilling de Uganda + Shillings de Uganda + U Sh + + + Dólar norte-americano + Dólar americano + Dólares americanos + + + Dólar norte-americano (Dia seguinte) + Dólar americano (dia seguinte) + Dólares americanos (dia seguinte) + + + Dólar norte-americano (Mesmo dia) + Dólar americano (mesmo dia) + Dólares americanos (mesmo dia) + + + Peso uruguaio en unidades indexadas + Peso uruguaio em unidades indexadas + Pesos uruguaios em unidades indexadas + + + Peso uruguaio (1975-1993) + Peso uruguaio (UYP) + Pesos uruguaios (UYP) + + + Peso uruguaio + Peso uruguaio + Pesos uruguaios + Ur$ + + + Sum do Usbequistão + Sum do Uzbequistão + Sums do Uzbequistão + + + Bolívar venezuelano + Bolívar venezuelano + Bolívares venezuelano + Be + + + Bolívar v enezuelano forte + Bolívar forte da Venezuela + Bolívares fortes da Venezuela + + + Dong vietnamita + Dong vietnamês + Dongs vietnameses + đ + + + Vatu de Vanuatu + Vatu de Vanuatu + Vatus de Vanuatu + VT + + + Tala da Samoa Ocidental + Tala da Samoa Ocidental + Talas da Samoa Ocidental + + + Franco CFA BEAC + Franco CFA de BEAC + Francos CFA de BEAC + + + Prata + Prata + + + Ouro + Ouro + + + Unidade Composta Européia + Unidade de composição européia + Unidades de composição européias + + + Unidade Monetária Européia + Unidade monetária européia + Unidades monetárias européias + + + Unidade de Conta Européia (XBC) + Unidade européia de conta (XBC) + Unidades européias de conta (XBC) + + + Unidade de Conta Européia (XBD) + Unidade européia de conta (XBD) + Unidades européias de conta (XBD) + + + Dólar do Caribe Oriental + Dólar do Caribe Oriental + Dólares do Caribe Oriental + EC$ + + + Direitos Especiais de Giro + direitos de desenho especiais + direitos de desenho especiais + + + Unidade de Moeda Européia + Unidade de moeda européia + Unidades de moedas européias + + + Franco-ouro francês + Franco de ouro francês + Francos de ouro franceses + + + Franco UIC francês + Franco UIC francês + Francos UIC franceses + + + Franco CFA BCEAO + Franco CFA de BCEAO + Francos CFA de BCEAO + + + Paládio + Paládio + + + Franco CFP + Franco CFP + Francos CFP + CFPF + + + Platina + Platina + + + Fundos RINET + Fundos RINET + + + Código de Moeda de Teste + Código de moeda de teste + + + Moeda Desconhecida ou Inválida + moeda desconhecida ou inválida + + + Dinar iemenita + Dinar do Iêmen + Dinares do Iêmen + + + Rial iemenita + Rial do Iêmen + Riales do Iêmen + YRl + + + Dinar forte iugoslavo + Dinar pesado da Iugoslávia + Dinares pesados da Iugoslávia + + + Super Dinar iugoslavo + Dinar noviy da Iugoslávia + Dinares noviy da Iugoslávia + + + Dinar conversível iugoslavo + Dinar conversível da Iugoslávia + Dinares conversíveis da Iugoslávia + + + Rand sul-africano (financeiro) + Rand da África do Sul (financeiro) + Rands da África do Sul (financeiro) + + + Rand sul-africano + Rand da África do Sul + Rands da África do Sul + R + + + Cuacha zambiano + Kwacha da Zâmbia + Kwachas da Zâmbia + + + Zaire Novo zairense + Novo zaire do Zaire + Novos zaires do Zaire + + + Zaire zairense + Zaire do Zaire + Zaires do Zaire + + + Dólar do Zimbábue + Dólar do Zimbábue + Dólares do Zimbábue + Z$ + + + + + + {0} dia + {0} dias + + + {0} hora + {0} horas + + + {0} minuto + {0} minutos + + + {0} mês + {0} meses + + + {0} segundo + {0} segundos + + + {0} semana + {0} semanas + + + {0} ano + {0} anos + + + + + sim:s + não:nao:n + + + diff --git a/libs/Zend/Locale/Data/pt_BR.xml b/libs/Zend/Locale/Data/pt_BR.xml new file mode 100644 index 0000000..7b905f5 --- /dev/null +++ b/libs/Zend/Locale/Data/pt_BR.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/pt_PT.xml b/libs/Zend/Locale/Data/pt_PT.xml new file mode 100644 index 0000000..79ef314 --- /dev/null +++ b/libs/Zend/Locale/Data/pt_PT.xml @@ -0,0 +1,1962 @@ + + + + + + + + + + + + afrikaans + idioma afro-asiático + afrihili + akan + idioma algonquiano + inglês, arcaico (aprox. 450-1100) + idioma apache + idioma artifical + idioma atabascano + idioma australiano + Awadhi + bamileke Languages + idioma báltico + buriat + Buginese + blin + idioma indígena centro-americano + idioma caucásico + chechene + idioma céltico + jargão chinook + idioma chamic + crioulo ou pidgin do inglês + crioulo ou pidgin do francês + crioulo ou pidgin do português + turco da Crimeia + checo + idioma cuchita + alemão alto (Suíça) + idioma dravítico + diula + egípcio clássico + Inglês + inglês, medieval (1100-1500) + estónio + idioma ugro-finês + francês, medieval (aprox.1400-1600) + francês, arcaico (842-aprox.1400) + frísio oriental + idioma germânico + alemão, medieval alto (aprox.1050-1500) + alemão, arcaico alto (aprox.750-1050) + grebo + grego clássico + alemão da Suíça + sorbiano superior + arménio + Iban + igbo + Inupiaq + idioma índico + idioma indo-europeu + jv + kara-kalpak + khoisan + kuanyama + karachay-balkar + lezghiano + luba-lulua + irlandês, medieval (900-1200) + macedónio + mon-khmer (other) + idioma manobo + Nauatle + idioma indígena norte-americano + baixo alemão + nigeriano - cordofano + flamengo (Bélgica) + norse, old + soto, setentrional + idioma núbio + provençal + ossético + idioma otomano + idioma papuano + persa arcaico (aprox. 600-400 a.C.) + idioma filipino + polaco + idioma prácito + provençal, arcaico (até 1500) + português europeu + reto-romance + idioma românico + romanês + idioma indígeno sul-americano + salishan languages + idioma semítico + linguages de sinais + idioma sioux + idioma sino-tibetano + idioma eslavo + idioma sami + idioma nilo-sariano + tamil + idioma tailândes + tetum + tajique + tagalogue + tonga + toganês + idioma tupi + idioma altaico + tuviniano + idioma wakashan + idioma sórbio + idioma iúpique + chinês simplificado + chinês tradicional + zazaki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Oceânia + Norte de África + África Interior + África Meridional + Sudeste Asiático + Micronésia + Ásia Sul-Central + Europa de Leste + Europa do Norte + 172 + Emiratos Árabes Unidos + Anguilha + Arménia + Antárctica + Ilhas Alanda + Azerbeijão + Bangladeche + Burkina-Faso + Bareine + Benim + Baamas + Bielorrússia + Ilhas Cocos + República Democrática do Congo + Congo-Brazzaville + Ilha do Natal + República Checa + Estónia + Egipto + Sara Ocidental + Eritreia + Ilhas Falkland ou Malvinas + Estados Federados da Micronésia + Ilhas Faroé + Gronelândia + Guiné-Bissau + Hong Kong - Região Administrativa Especial da China + Irão + Quénia + Quirguizistão + Saint Kitts e Nevis + Coreia do Norte + Coreia do Sul + Cuaite + Ilhas Caimão + Cazaquistão + Lao, República Popular Democrática + Letónia + Mónaco + Moldávia, República da + Madagáscar + Macedónia, República da + Macau - Região Administrativa Especial da China + Ilhas Mariana do Norte + Monserrate + Maurícias + Malaui + Nova Caledónia + Ilha Norfolque + Países Baixos + Papua Nova Guiné + Polónia + Território Palestiniano + Oceânia Insular + União Europeia + Roménia + Seicheles + Singapura + Eslovénia + Esvalbarda e Jan Mayen + São Marino + Ilhas Turcas e Caicos + Tajiquistão + Toquelau + Turquemenistão + Trindade e Tobago + Ilhas Minor Outlying (E.U.A) + Usbequistão + The main pump fixing screws with the correct strength class + Ilhas Virgin E.U.A. + Vietname + Iémen + Zimbabué + + + Alemão Tradicional + Alemão Moderno + arménio oriental + arménio ocidental + dialecto san giorgio/bila + buntlingue + Alfabeto Fonético Internacional + Alfabeto Fonético Urálico + dialecto lipovaz de Resian + monotónico + dialecto natisone + dialecto gniva/njiva + dialecto oseacco/osojane + politónico + Computador + Revisão Ortográfica + Saho + Scouse + dialecto stolvizza/solbica + + + Ordem + + + Ordem de Chinês Tradicional - Big5 + Ordem Directa + Ordem de Chinês Simplificado - GB2312 + Ordem da Lista Telefónica + + + Métrico + + + + [á à ă â å ä ā æ ç é è ĕ ê ë ē í ì ĭ î ï ī ñ ó ò ŏ ô ö ø ō œ ß ú ù ŭ û ü ū ÿ] + + + + + + + + + + + + + + EEEE, MMMM d, yyyy G + + + + + MMMM d, yyyy G + + + + + MMM d, yyyy G + + + + + M/d/yyyy + + + + + + d de MMMM + d-M + MM-yy + + + + + + + + Jan + Fev + Mar + Abr + Mai + Jun + Jul + Ago + Set + Out + Nov + Dez + + + Janeiro + Fevereiro + Março + Abril + Maio + Junho + Julho + Agosto + Setembro + Outubro + Novembro + Dezembro + + + + + + + 1.º trimestre + 2.º trimestre + 3.º trimestre + 4.º trimestre + + + + Antes do meio-dia + Depois do meio-dia + + + a.C. + d.C. + + + + + + yyyy/MM/dd + + + + + yy/MM/dd + + + + + + + HH'H'mm'm'ss's' v + + + + + + E d MMM + EEE, d 'de' MMMM + d 'de' MMMM + d 'de' MMM + d-M + MM-yy + MM-yyyy + + + + E, MM/dd - E, MM/dd + E, MM/dd - E, MM/dd + + + MM/dd - MM/dd + MM/dd - MM/dd + + + + + + Em três dias + Anteontem + Trás-anteontem + + + + + + + + EEEE, MMMM d, y G + + + + + MMMM d, y G + + + + + MMM d, y G + + + + + M/d/yy + + + + + + + + Tucumán + + + Cuibá + + + Araguaina + + + Baía + + + St.John's + + + Páscoa + + + Madrid + + + Marrocos + + + Ulan Bator + + + Cancun + + + Kaliningrado + + + Moscovo + + + Sacalina + + + Center + + + Petersburgo + + + + Hora do Acre + Hora de Verão do Acre + + false + + + + Hora do Afeganistão + + true + + + + Hora da África Central + + true + + + + Hora da África Oriental + + true + + + + Hora do Sara Ocidental + + + Hora do Sara Ocidental + + true + + + + Hora da África do Sul + Hora Padrão da África do Sul + + true + + + + Hora da Nigéria + Hora da África Ocidental + Hora de Verão da África Ocidental + + + Hora da Nigéria + + true + + + + Hora de Aktyubinsk + Hora de Verão de Aktyubinsk + + true + + + + Hora do Alaska + Hora Padrão do Alaska + Hora de Verão do Alaska + + + + + Hora do Alaska- Havai + Hora Padrão do Alaska-Havai + Hora de Verão do Alaska-Havai + + true + + + + Hora de Almaty + Hora de Verão de Almaty + + true + + + + Hora do Amazonas + Hora de Verão do Amazonas + + false + + + + Hora Central + Hora Padrão Central + Hora de Verão Central + + + + + Hora Oriental + Hora Padrão Oriental + Hora de Verão Oriental + + true + + + + Hora da Montanha + Hora Padrão da Montanha + Hora de Verão da Montanha + + true + + + + Hora do Pacífico + Hora Padrão do Pacífico + Hora de Verão do Pacífico + + true + + + + Hora de Anadyr + Hora de Verão de Anadyr + + true + + + + Hora de Aqtau + Hora de Verão de Aqtau + + true + + + + Hora de Aqtobe + Hora de Verão de Aqtobe + + true + + + + Hora da Arábia + Hora Padrão da Arábia + Hora de Verão da Arábia + + + + + Hora da Argentina + Hora de Verão da Argentina + + true + + + + Hora da Argentina Ocidental + + true + + + + Hora da Arménia + Hora da Arménia + Hora de Verão da Arménia + + + Hora da Arménia + AMT (Arménia) + AMST (Arménia) + + true + + + + Hora do Turquemenistão + Hora de Ashkhabad + Hora de Verão de Ashkhabad + + + Hora do Turquemenistão + + true + + + + Hora do Atlântico + Hora Padrão do Atlântico + Hora de Verão do Atlântico + + true + + + + Hora da Austrália Central + Hora Padrão da Austrália Central + Hora de Verão da Austrália Central + + true + + + + Hora da Austrália Central Ocidental + Hora Padrão da Austrália Central Ocidental + Hora de Verão da Austrália Central Ocidental + + true + + + + Hora da Austrália Oriental + Hora Padrão da Austrália Oriental + Hora de Verão da Austrália Oriental + + true + + + + Hora da Austrália Ocidental + Hora Padrão da Austrália Ocidental + Hora de Verão da Austrália Ocidental + + + + + Hora do Azerbeijão + Hora do Azerbeijão + Hora de Verão do Azerbeijão + + + Hora do Azerbeijão + + true + + + + Hora dos Açores + Hora de Verão dos Açores + + true + + + + Hora do Azerbeijão + Hora de Baku + Hora de Verão de Baku + + + Hora do Azerbeijão + + true + + + + Hora do Bangladesh + Hora do Bangladesh + + + Hora do Bangladesh + + true + + + + Hora de Bering + Hora Padrão de Bering + Hora de Verão de Bring + + true + + + + Hora do Botão + Hora do Botão + + + Hora do Botão + + true + + + + Hora da Bolívia + + true + + + + Hora do Bornéu + Hora de Verão do Bornéu + + true + + + + Hora de Brasília + Hora de Verão de Brasília + + false + + + true + + + + Hora do Brunei + Hora do Brunei Darussalam + + + Hora do Brunei + + true + + + + Hora de Cabo Verde + Hora de Verão de Cabo Verde + + true + + + + Hora de Chamarro + Hora Padrão de Chamarro + + true + + + + Hora de Changbai + + true + + + + Hora Padrão de Chatham + Hora de Verão de Chatham + + true + + + + Hora do Chile + Hora de Verão do Chile + + true + + + + Hora da China + Hora Padrão da China + Hora de Verão da China + + true + + + + Hora de Choibalsan + Hora de Verão de Choibalsan + + true + + + + Hora da Ilha de Natal + + true + + + + Hora das Ilhas Cocos + + true + + + + Hora da Colômbia + Hora de Verão da Colômbia + + true + + + + Hora das Ilhas Cook + Hora das Ilhas Cook + Hora Intermédia de Verão das Ilhas Cook + + + Hora das Ilhas Cook + + true + + + + Hora de Cuba + Hora Padrão de Cuba + Hora de Verão de Cuba + + true + + + + Hora do Bangladesh + Hora de Dacca + + + Hora do Bangladesh + + true + + + + Hora de Davis + + + + true + + + + Hora de Dumont-d'Urville + + + + + Hora do Tajiquistão + Hora de Dushanbe + Hora de Verão de Dushanbe + + + Hora do Tajiquistão + + true + + + + Hora da Guiana Holandesa + + true + + + + Hora de Timor Leste + Hora de Timor Leste + + + Hora de Timor Leste + + true + + + + Hora da Ilha de Páscoa + Hora de Verão da Ilha de Páscoa + + true + + + + Hora do Equador + + true + + + + Horário Padrão da Europa Central + Hora de Verão da Europa Central + + true + + + + Hora da Europa Oriental + Hora de Verão da Europa Oriental + + true + + + + Hora da Europa Ocidental + Hora de Verão da Europa Ocidental + + true + + + + Hora das Ilhas Malvinas + Hora de Verão das Ilhas Malvinas + + true + + + + Hora das Ilhas Fiji + Hora das Ilhas Fiji + Hora de Verão das Ilhas Fiji + + + Hora das Ilhas Fiji + + true + + + + Hora da Guiana Francesa + + true + + + + Hora da Antártida e dos Territórios Franceses do Sul + + true + + + + Hora do Quirguizistão + Hora de Frunze + Hora de Verão de Frunze + + + Hora do Quirguizistão + + true + + + + Hora do Meridiano de Greenwich + + + + + Hora de Galápagos + + + + + Hora de Gambier + + + + + Hora da Geórgia + Hora da Georgia + Hora de Verão da Georgia + + + Hora da Geórgia + + true + + + + Hora das Ilhas Gilbert + + + + true + + + + Hora da Gronelândia Central + Hora de Verão da Gronelândia Central + + true + + + + Hora Padrão de Guam + + + + + Hora Padrão do Golfo + + true + + + + Hora Padrão do Havai + + + + + Hora de Hong Kong - Região Administrativa Especial da China + Hora de Hong Kong + Hora de Verão de Hong Kong + + + Hora de Hong Kong - Região Administrativa Especial da China + + true + + + + Hora de Hovd + Hora de Verão de Hovd + + true + + + + Hora da Índia + Hora Padrão da Índia + + + Hora da Índia + + true + + + + Hora do Oceano Índico + + + + + Hora do Vietname + + + Hora do Vietname + + true + + + + Hora da Indonésia Central + + true + + + + Hora da Indonésia Oriental + + true + + + + Hora da Indonésia Ocidental + + true + + + + Hora do Irão + Hora Padrão do Irão + Hora de Verão do Irão + + + Hora do Irão + + true + + + true + + + + Hora de Irkutsk + Hora de Verão de Irkutsk + + true + + + + Hora de Israel + Hora Padrão de Israel + Hora de Verão de Israel + + + Hora de Israel + + true + + + + Hora do Japão + Hora Padrão do Japão + Hora de Verão do Japão + + true + + + + Hora de Petropavlovsk-Kamchatski + Hora de Verão de Petropavlovsk-Kamchatski + + true + + + + Hora do Paquistão + Hora de Carachi + + + Hora do Paquistão + + true + + + + Hora de Kashgar + + true + + + + Hora do Casaquistão do Leste + Hora Padrão do Cazaquistão do Leste + + true + + + + Hora do Casaquistão do Oeste + Hora Padrão do Casaquistão do Oeste + + true + + + + Hora de Kizilorda + Hora de Verão de Kizilorda + + true + + + + Hora da Coreia + Hora Padrão da Coreia + Hora de Verão da Coreia + + true + + + + Hora de Kosrae + + + + + Hora de Krasnoyarsk + Hora de Verão de Krasnoyarsk + + true + + + + Hora de Kuybyshev + Hora de Verão de Kuybyshev + + true + + + + Hora de Kwajalein + + + + + Hora do Quirguizistão + Hora do Quirguizistão + + + Hora do Quirguizistão + + true + + + + Hora do Sri Lanka + Hora do Sri Lanka + + + Hora do Sri Lanka + + true + + + + Hora da Libéria + + + Hora da Libéria + + true + + + + Hora das Ilhas Line + + true + + + + Hora de Long-Shu + + true + + + + Hora de Lord Howe + Hora Padrão de Lord Howe + Hora de Verão de Lord Howe + + + + + Hora de Macau - Região Administrativa Especial da China + Hora de Macau + Hora de Verão de Macau + + + Hora de Macau - Região Administrativa Especial da China + + true + + + + Hora de Magadan + Hora de Verão de Magadan + + true + + + + Hora da Malásia + Hora de Malaia + + + Hora da Malásia + + true + + + + Hora da Malásia + + true + + + + Hora das Ilhas Maldivas + + + + + Hora das Marquesas + + true + + + + Hora das Ilhas Marshall + + true + + + + Hora das Ilhas Maurícias + + + + + Hora de Mawson + + + + + Hora de Ulan Bator + Hora de Verão de Ulan Bator + + true + + + + Hora de Moscovo + Hora Padrão de Moscovo + Hora de Verão de Moscovo + + true + + + + Hora de Mianmar + + + Hora de Mianmar + + true + + + + Hora de Nauru + + true + + + + Hora do Nepal + Hora do Nepal + + + Hora do Nepal + + true + + + + Hora da Nova Caledónia + Hora da Nova Caledónia + Hora de Verão da Nova Caledónia + + + Hora da Nova Caledónia + + true + + + + Hora da Nova Zelândia + Hora Padrão da Nova Zelândia + Hora de Verão da Nova Zelândia + + true + + + + Horário Padrão da Terra Nova + Horário de Verão da Terra Nova + + + + + Hora de Niue + Hora de Niue + + + Hora de Niue + + true + + + + Hora da Ilha Norfolque + + + Hora da Ilha Norfolque + + true + + + + Hora das Ilhas Mariana do Norte + Hora das Ilhas Mariana do Norte + + + Hora das Ilhas Mariana do Norte + + true + + + + Hora de Novosibirsk + Hora de Verão de Novosibirsk + + true + + + + Hora de Omsk + Hora de Verão de Omsk + + true + + + true + + + + Hora do Paquistão + Hora de Verão do Paquistão + + + Hora do Paquistão + + true + + + + Hora de Palau + Hora de Palau + + + Hora de Palau + + true + + + + Hora da Papua Nova Guiné + Hora da Papua Nova Guiné + + + Hora da Papua Nova Guiné + + true + + + + Hora das Filipinas + Hora das Filipinas + Hora de Verão das Filipinas + + + Hora das Filipinas + + true + + + + Hora das Ilhas Fénix + + true + + + + Hora de Pitcairn + Hora de Pitcairn + + + Hora de Pitcairn + + true + + + + Hora de Ponape + + true + + + + Hora de Qyzylorda + Hora de Verão de Qyzylorda + + true + + + + Hora das Ilhas de Reunião + + + + + Hora de Rothera + + + + + Hora de Sakhalin + Hora de Verão de Sakhalin + + true + + + + Hora de Samara + Hora de Verão de Samara + + true + + + + Hora de Samarkand + Hora de Verão de Samarkand + + true + + + + Hora da Samoa + Hora Padrão da Samoa + + + Hora da Samoa + + true + + + + Hora das Ilhas Seicheles + + + + + Hora de Shevchenko + Hora de Verão de Shevchenko + + true + + + + Hora de Singapura + Hora Padrão de Singapura + + + Hora de Singapura + + true + + + + Hora das Ilhas Salomão + + + Hora das Ilhas Salomão + + true + + + + Hora da Georgia do Sul + + true + + + + Hora de Sverdlovsk + Hora de Verão de Sverdlovsk + + true + + + + Hora de Syowa + + + + + Hora da Polinésia Francesa + Hora do Tahiti + + + Hora da Polinésia Francesa + + true + + + + Hora do Tajiquistão + Hora do Tajiquistão + + + Hora do Tajiquistão + + true + + + + Hora de Tashkent + Hora de Tashkent + Hora de Verão de Tashkent + + + Hora do Uzbequistão + + true + + + + Hora da Geórgia + Hora de Tbilisi + Hora de Verão de Tbilisi + + + Hora de Geórgia + + true + + + + Hora de Toquelau + Hora de Toquelau + + + Hora de Toquelau + + true + + + + Hora de Tonga + Hora de Verão de Tonga + + + Hora de Tonga + + true + + + + Hora de Truk + + true + + + + Hora da Turquia + Hora de Verão da Turquia + + true + + + + Hora do Turquemenistão + Hora do Turquemenistão + Hora de Verão do Turquemenistão + + + Hora do Turquemenistão + + true + + + + Hora de Tuvalu + + + Hora de Tuvalu + + true + + + + Hora de Ural'sk + Hora de Verão de Ural'sk + + true + + + + Hora de Urumqi + + true + + + + Hora do Uzbequistão + Hora do Uzbequistão + Hora de Verão do Uzbequistão + + + Hora do Uzbequistão + + true + + + + Hora de Vanuatu + Hora de Vanuatu + + + Hora de Vanuatu + + true + + + + Hora de Vladivostok + Hora de Verão de Vladivostok + + true + + + + Hora de Volvograd + Hora de Verão de Volgograd + + true + + + + Hora de Vostok + + + + + Hora das Ilhas Wake + + + + + Hora de Wallis e Futuna + Hora de Wallis e Futuna + + + Hora de Wallis e Futuna + + true + + + + Hora de Yakutsk + Hora de Verão de Yakutsk + + true + + + + Hora de Yekaterinburg + Hora de Verão de Yekaterinburg + + true + + + + Hora da Arménia + Hora de Yerevan + Hora de Verão de Yerevan + + + Hora da Arménia + + true + + + + + +   + + + + + #,##0.00 ¤ + + + + + + Dirham dos Emirados Árabes Unidos + + + Afeghani (1927-2002) + + + Afeghani + + + Florim das Antilhas Holandesa + + + Florim de Aruba + + + Dinar da Bósnia-Herzegóvina + + + Marco bósnio-herzegóvino conversível + + + Franco belga (convertível) + + + Rublo novo bielorusso (1994-1999) + + + Libra de Chipre + + + Coroa da República Checa + + + Unidad de Valor Constante (UVC) do Equador + + + Dólar das Fiji + + + Cedi do Gana + + + Dalasi da Gâmbia + + + Franco da Guiné + + + Quetzal da Guatemala + + + Lempira das Honduras + + + Dinar koweitiano + + + Dólar das Ilhas Caimão + + + Dinar macedónio + + + Franco do Mali + + + Cuacha do Malawi + + + Peso Plata mexicano (1861-1992) + + + Unidad de Inversion (UDI) mexicana + + + Córdoba nicaraguano + + + Córdoba Ouro nicaraguano + + + Zloti polaco + + + Zloti polaco (1950-1995) + + + #,##0.00 ¤;-#,##0.00 ¤ + $ + , + + + Rial do Qatar + + + Dólar de Singapura + + + Xelim de Tanzânia + + + Tala de Samoa Ocidental + + + Unidade Composta Europeia + + + Unidade Monetária Europeia + + + Unidade de Conta Europeia (XBC) + + + Unidade de Conta Europeia (XBD) + + + Unidade da Moeda Europeia + + + Moeda inválida ou desconhecida + + + Dinar forte jugoslavo + + + Super Dinar jugoslavo + + + Dinar conversível jugoslavo + + + Dólar do Zimbabwe + + + + + + não:n + + + diff --git a/libs/Zend/Locale/Data/ro.xml b/libs/Zend/Locale/Data/ro.xml new file mode 100644 index 0000000..7e28249 --- /dev/null +++ b/libs/Zend/Locale/Data/ro.xml @@ -0,0 +1,1792 @@ + + + + + + + + + + + abhază + afrikaans + limbă afro-asiatică + ainu + akkadiană + aleută + altaică meridională + amharică + aragoneză + engleză veche + limbă apașă + arabă + aramaică + limbă artificială + asameză + limbă australiană + avară + aymara + azeră + bașkiră + limbă baltică + bielorusă + berberă + bulgară + bihari + bengaleză + bantu + tibetană + bretonă + bosniacă + catalană + limbă central-amerindiană + limbă caucaziană + cecenă + limbă celtică + corsicană + coptă + cehă + slavonă + ciuvașă + galeză + daneză + germană + germană austriacă + germană standard elvețiană + limbă dravidiană + egipteană veche + greacă + elamită + engleză + engleză australiană + engleză canadiană + engleză britanică + engleză americană + esperanto + spaniolă + spaniolă latino-americană + spaniolă iberică + estonă + bască + persană + finlandeză + filipineză + limbă fino-ugrică + fijiană + faroeză + franceză + franceză canadiană + franceză elvețiană + franceză veche + friziană + irlandeză + galică scoțiană + limbă germanică + galiciană + guarani + gotică + greacă veche + germană elvețiană + gujarati + hawaiană + ebraică + hindi + hitită + croată + haitiană + maghiară + armeană + interlingua + indoneziană + interlingue + inupiak + limbă indiană + limbă indo-europeană + limbă iraniană + islandeză + italiană + japoneză + iudeo-persană + iudeo-arabă + javaneză + georgiană + congoleză + cazacă + groenlandeză + khmeră + kannada + coreeană + kashmiri + kurdă + kirghiză + latină + luxemburgheză + lingala + laoțiană + lituaniană + letonă + malgașă + maori + limbi diverse + macedoneană + malayalam + mongolă + manciuriană + moldovenească + marathi + malaeziană + malteză + limbi multiple + limbă munda + birmaneză + limbă maya + limbă nord-amerindiană + napolitană + nepaleză + olandeză + flamandă + norvegiană nynorsk + norvegiană + limbă nubiană + navajo + occitană + oromo + oriya + turcă otomană + limbă otomi + punjabi + limbă papuașă + persană veche + limbă filipineză + feniciană + pali + poloneză + provensală veche + pașto + portugheză + portugheză braziliană + portugheză iberică + quechua + retoromană + română + limbă romanică + rusă + aromână + sanscrită + limbă sud-amerindiană + aramaică samariteană + sardiniană + siciliană + scoțiană + sindhi + limbă semitică + irlandeză veche + limbaj mimico-gestual + sârbo-croată + singaleză + limbă sino-tibetană + slovacă + slovenă + limbă slavă + samoană + somaleză + albaneză + sârbă + sesotho + sundaneză + sumeriană + suedeză + swahili + siriană + tamil + limbă thailandeză + telugu + tadjică + thailandeză + tigrinya + turkmenă + tagalog + klingoniană + setswana + turcă + tătară + limbă altaică + twi + tahitiană + uigură + ucraineană + limbă necunoscută sau incorectă + urdu + uzbecă + vietnameză + volapuk + valonă + wolof + calmucă + xhosa + idiș + yoruba + zapotecă + chineză + chineză simplificată + chineză tradițională + zulu + fară conținut lingvistic + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Lume + Africa + America de Nord + America de Sud + Oceania + Africa Occidentală + America Centrală + Africa Orientală + Africa Septentrională + Africa Centrală + Africa Meridională + Americi + America Septentrională + Caraibe + Asia Orientală + Asia Meridională + Asia de Sud-Est + Europa Meridională + Australia și Noua Zeelandă + Melanezia + Regiunea Micronezia + Polinezia + Asia Centrală de Sud + Asia + Asia Centrală + Asia Occidentală + Europa + Europa Orientală + Europa Septentrională + Europa Occidentală + Comunitatea Statelor Independente + America Latină și Caraibe + Insulele Anglo-Normande + Andorra + Emiratele Arabe Unite + Afganistan + Antigua și Barbuda + Anguilla + Albania + Armenia + Antilele Olandeze + Angola + Antarctica + Argentina + Samoa Americană + Austria + Australia + Aruba + Insulele Aland + Azerbaidjan + Bosnia și Herțegovina + Barbados + Bangladesh + Belgia + Burkina Faso + Bulgaria + Bahrain + Burundi + Benin + Bermuda + Brunei + Bolivia + Brazilia + Bahamas + Bhutan + Insula Bouvet + Botswana + Bielorusia + Belize + Canada + Insulele Cocos + Republica Democrată Congo + Republica Centrafricană + Congo + Eleveția + Coasta de Fildeș + Insulele Cook + Chile + Camerun + China + Columbia + Costa Rica + Serbia și Muntenegru + Cuba + Capul Verde + Insula Christmas + Cipru + Republica Cehă + Germania + Djibouti + Danemarca + Dominica + Republica Dominicană + Algeria + Ecuador + Estonia + Egipt + Sahara de Vest + Eritreea + Spania + Etiopia + Finlanda + Fiji + Insulele Falkland + Micronezia + Insulele Feroe + Franța + Gabon + Regatul Unit + Grenada + Georgia + Guyana Franceză + Guernsey + Ghana + Gibraltar + Groenlanda + Gambia + Guineea + Guadelupa + Guineea Ecuatorială + Grecia + Insulele Georgia de Sud și Sandwich de Sud + Guatemala + Guam + Guineea-Bissau + Guyana + Hong Kong + Insula Heard și Insulele McDonald + Honduras + Croația + Haiti + Ungaria + Indonezia + Irlanda + Israel + Insula Man + India + Teritoriul Britanic din Oceanul Indian + Irak + Iran + Islanda + Italia + Jersey + Jamaica + Iordania + Japonia + Kenya + Kirghizstan + Cambodgia + Kiribati + Comore + Saint Kitts și Nevis + Coreea de Nord + Coreea de Sud + Kuweit + Insulele Cayman + Kazahstan + Laos + Liban + Sfânta Lucia + Liechtenstein + Sri Lanka + Liberia + Lesotho + Lituania + Luxemburg + Letonia + Libia + Maroc + Monaco + Moldova, Republica + Muntenegru + Madagascar + Insulele Marshall + Macedonia + Mali + Myanmar + Mongolia + Macao + Insulele Mariane de Nord + Martinica + Mauritania + Montserrat + Malta + Mauritius + Maldive + Malawi + Mexic + Malaezia + Mozambic + Namibia + Noua Caledonie + Niger + Insulele Norfolk + Nigeria + Nicaragua + Olanda + Norvegia + Nepal + Nauru + Niue + Noua Zeelandă + Oman + Panama + Peru + Polinezia Franceză + Papua Noua Guinee + Filipine + Pakistan + Polonia + Saint Pierre și Miquelon + Pitcairn + Porto Rico + Teritoriul Palestinian + Portugalia + Palau + Paraguay + Qatar + Oceania Periferică + Uniunea Europeană + Reunion + România + Serbia + Rusia + Rwanda + Arabia Saudită + Insulele Solomon + Seychelles + Sudan + Suedia + Singapore + Sfânta Elena + Slovenia + Svalbard și Jan Mayen + Slovacia + Sierra Leone + San Marino + Senegal + Somalia + Surinam + Sao Tome și Principe + El Salvador + Siria + Swaziland + Insulele Turks și Caicos + Ciad + Teritoriile Australe și Antarctice Franceze + Togo + Thailanda + Tadjikistan + Tokelau + Timorul de Est + Turkmenistan + Tunisia + Tonga + Turcia + Trinidad-Tobago + Tuvalu + Taiwan + Tanzania + Ucraina + Uganda + Teritoriile Îndepărtate ale Statelor Unite + Statele Unite + Uruguay + Uzbekistan + Vatican + Saint Vincent și Grenadines + Venezuela + Insulele Virgine Britanice + Insulele Virgine S.U.A. + Vietnam + Vanuatu + Wallis și Futuna + Samoa + Yemen + Mayotte + Africa de Sud + Zambia + Zimbabwe + Regiune necunoscută sau incorectă + + + sortare + monedă + + + sortare pentru chineza tradițională - Big5 + calendar budist + calendar chinezesc + sortare directă + sortare pentru chineza simplificată - GB2312 + calendar gregorian + calendar ebraic + calendar islamic + calendar islamic civil + calendar japonez + sortare după cartea de telefon + sortare pinyin + sortare după numărul de linii + sortare tradițională + + + american + metric + + + Limbă: {0} + Scriere: {0} + Regiune: {0} + + + + lowercase-words + lowercase-words + lowercase-words + lowercase-words + + + [a ă â b-i î j-p r s ș t ț u v x z] + [q w y] + [a ă â b-i î j-s ș t ț u-z] + + + + + « + » + + + GanjkHmsSEDFwWxhKzAeugXZvcL + {0} – {1} + + + + + era budistă + + + e.b. + + + + + + EEEE, d MMMM, yyyy G + + + + + + + + + ian. + feb. + mar. + apr. + mai + iun. + iul. + aug. + sept. + oct. + nov. + dec. + + + ianuarie + februarie + martie + aprilie + mai + iunie + iulie + august + septembrie + octombrie + noiembrie + decembrie + + + + + I + F + M + A + M + I + I + A + S + O + N + D + + + + + + + D + L + Ma + Mi + J + V + S + + + duminică + luni + marți + miercuri + joi + vineri + sâmbătă + + + + + D + L + M + M + J + V + S + + + sâmbătă + + + + + + + T1 + T2 + T3 + T4 + + + I + II + IV + + + trimestrul 1 + trimestrul 2 + trimestrul 3 + trimestrul 4 + + + + + 1 + 2 + 3 + 4 + + + trimestrul al I-lea + trimestrul al II-lea + trimestrul al III-lea + trimestrul al IV-lea + + + + AM + PM + + + înainte de Hristos + după Hristos + + + î.e.n. + e.n. + + + + + + EEEE, d MMMM yyyy + + + + + d MMMM yyyy + + + + + dd.MM.yyyy + + + + + dd.MM.yyyy + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1}, {0} + + + + H:mm + E, d MMM + d MMMM + d MMM + dd.MM + d.M + d + yyyy + M.yyyy + MMM yyyy + MMMM yyyy + MM.yy + MMM yy + Q yy + MM.yyyy + MMMM yyyy + + + {0} - {1} + + M-M + + + dd.MM - dd.MM + dd.MM - dd.MM + + + MMM-MMM + + + d MMM - d MMM + d-d MMM + + + d MMM - d MMM + d-d MMM + + + dd.MM - dd.MM + dd.MM - dd.MM + + + d-d + + + HH-HH + + + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH-HH v + + + y-y + + + MM.yyyy - MM.yyyy + MM.yyyy - MM.yyyy + + + dd.MM.yyyy - dd.MM.yyyy + dd.MM.yyyy - dd.MM.yyyy + dd.MM.yyyy - dd.MM.yyyy + + + MMM-MMM yyyy + MMM yyyy - MMM yyyy + + + d MMM - d MMM yyyy + d-d MMM yyyy + d MMM yyyy - d MMM yyyy + + + d MMM - d MMM yyyy + d-d MMM yyyy + d MMM yyyy - d MMM yyyy + + + dd.MM.yyyy - dd.MM.yyyy + dd.MM.yyyy - dd.MM.yyyy + dd.MM.yyyy - dd.MM.yyyy + + + + + + eră + + + an + + + lună + + + săptămână + + + zi + azi + mâine + poimâine + răspoimâine + ieri + alaltăieri + răsalaltăieri + + + zi a săptămânii + + + perioada zilei + + + oră + + + minut + + + secundă + + + zonă + + + + + + +HH:mm;−HH:mm + GMT{0} + {0} + + Necunoscut + + + Tirana + + + Erevan + + + Polul Sud + + + Dumont D'Urville + + + Viena + + + Bruxelles + + + Insula Paștelui + + + Capul Verde + + + Copenhaga + + + Alger + + + Insulele Canare + + + Addis Abeba + + + Londra + + + Guadalupe + + + Atena + + + Georgia de Sud + + + Budapesta + + + Ierusalim + + + Bagdad + + + Teheran + + + Roma + + + St. Kitts + + + Seul + + + Kuweit + + + St. Lucia + + + Luxemburg + + + Chișinău + + + Ulan Bator + + + Martinica + + + Maldive + + + Marchize + + + Varșovia + + + Azore + + + Lisabona + + + Quatar + + + București + + + Moscova + + + Ekaterinburg + + + Irkuțk + + + Yakuțk + + + Sahalin + + + Kamciatka + + + Riyad + + + Sf. Elena + + + Salvador + + + Damasc + + + Zaporoje + + + Ora statului Alaska + + + Saint Vincent și Grenadines + + + St. Thomas + + + + + + , + . + ; + % + 0 + + + - + E + + + NaN + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + #,##0.00 ¤ + + + + + + pesetă andorrană + + + dirham Emiratele Arabe Unite + + + leka albaneză + + + dram armean + + + gulden Antilele Olandeze + + + peso argentinian (1983–1985) + + + peso argentinian + + + șiling austriac + + + dolar australian + + + manat azerbaidjan + + + dinar Bosnia-Herțegovina + + + marcă convertibilă bosniacă + + + dolar Barbados + + + taka Bangladeș + + + franc belgian (convertibil) + + + franc belgian + + + franc belgian (financiar) + + + leva bulgărească nouă + + + franc Burundi + + + dolar Bermude + + + dolar Brunei + + + boliviano + + + peso bolivian + + + mvdol bolivian + + + cruzeiro brazilian (1990–1993) + + + real brazilian + + + cruzeiro brazilian + + + dolar Bahamas + + + ngultrum Bhutan + + + kyat birman + + + rublă bielorusă + + + dolar Belize + + + dolar canadian + + + franc congolez + + + franc elvețian + + + peso chilian + + + yuan renminbi chinezesc + + + peso columbian + + + colon costarican + + + dinar vechi Serbia și Muntenegru + + + peso cubanez + + + escudo al Capului Verde + + + liră cipriotă + + + coroană cehă + + + marcă est-germană + + + marcă germană + + + franc Djibouti + + + coroană daneză + + + peso dominican + + + dinar algerian + + + sucre Ecuador + + + coroană estoniană + + + liră egipteană + + + pesetă spaniolă + + + birr etiopian + + + euro + euro + + + marcă finlandeză + + + dolar Fiji + + + liră Insulele Falkland + + + franc francez + + + liră sterlină + + + lari georgian + + + cedi Ghana + + + liră Gibraltar + + + dalasi Gambia + + + franc Guineea + + + drahmă grecească + + + quetzal Guatemala + + + peso Guineea-Bissau + + + dolar Guyana + + + dolar Hong Kong + + + lempira Honduras + + + dinar croat + + + kuna croată + + + gourde Haiti + + + forint maghiar + + + rupie indoneziană + + + liră irlandeză + + + liră israeliană + + + șechel israelian nou + + + rupie indiană + + + dinar irakian + + + rial iranian + + + coroană islandeză + + + liră italiană + + + dolar jamaican + + + dinar iordanian + + + yen japonez + + + șiling kenyan + + + som Kirghizstan + + + riel cambodgian + + + franc comorian + + + won nord-coreean + + + won sud-coreean + + + dinar kuweitian + + + dolar Insulele Cayman + + + kip Laos + + + liră libaneză + + + rupie Sri Lanka + + + dolar liberian + + + lit lituanian + + + franc convertibil luxemburghez + + + franc luxemburghez + + + franc financiar luxemburghez + + + lats Letonia + + + rublă Letonia + + + dinar libian + + + dirham marocan + + + franc marocan + + + leu moldovenesc + + + franc Madagascar + + + dinar macedonean + + + franc Mali + + + kyat Myanmar + + + tugrik mongol + + + liră malteză + + + peso mexican + + + peso mexican de argint (1861–1992) + + + ringgit malaiezian + + + escudo Mozambic + + + metical Mozambic vechi + + + metical Mozambic + + + dolar namibian + + + cordoba Nicaragua + + + gulden olandez + + + coroană norvegiană + + + rupie nepaleză + + + dolar neozeelandez + + + riyal Oman + + + balboa panamez + + + inti Peru + + + sol nou Peru + + + sol Peru + + + kina Papua-Noua Guinee + + + peso filipinez + + + rupie pakistaneză + + + zlot nou polonez + + + zlot polonez (1950–1995) + + + guarani Paraguay + + + riyal Qatar + + + dolar rhodesian + + + leu vechi + 0≤lei vechi|1≤leu vechi|1<lei vechi + + + leu + 0≤lei|1≤leu|1<lei + + + dinar sârbesc + + + rublă rusească + + + franc rwandez + + + riyal Arabia Saudită + + + dolar Insulele Solomon + + + rupie Seychelles + + + dinar sudanez + + + liră sudaneză + + + coroană suedeză + + + dolar Singapore + + + liră Insula Sf. Elena + + + tolar sloven + + + coroană slovacă + + + leu Sierra Leone + + + șiling somalez + + + dolar Surinam + + + gulden Surinam + + + dobra Sao Tome și Principe + + + rublă sovietică + + + colon El Salvador + + + liră siriană + + + baht thailandez + + + rublă Tadjikistan + + + dinar tunisian + + + liră turcească + lire turcești + + + liră turcească nouă + lire turcești noi + + + dolar Trinidad-Tobago + + + dolar nou Taiwan + + + șiling tanzanian + + + hryvna ucraineană + + + carboavă ucraineană + + + șiling ugandez (1966–1987) + + + șiling ugandez + + + dolar american + + + dolar american (ziua următoare) + + + dolar american (aceeași zi) + + + peso Uruguay (1975–1993) + + + peso nou Uruguay + + + sum Uzbekistan + + + bolivar Venezuela + + + dong vietnamez + + + franc Comunitatea Financiară + + + argint + + + aur + + + dolar Caraibele de Est + + + drepturi speciale de tragere + + + franc francez aur + + + paladiu + + + platină + + + cod monetar de test + + + monedă necunoscută sau incorectă + + + dinar Yemen + + + riyal Yemen + + + dinar iugoslav greu + + + dinar iugoslav nou + + + dinar iugoslav convertibil + + + rand sud-african (financiar) + + + rand sud-african + + + zair nou + + + dolar Zimbabwe + + + + + + da:d + nu:n + + + diff --git a/libs/Zend/Locale/Data/ro_MD.xml b/libs/Zend/Locale/Data/ro_MD.xml new file mode 100644 index 0000000..97e9773 --- /dev/null +++ b/libs/Zend/Locale/Data/ro_MD.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/ro_RO.xml b/libs/Zend/Locale/Data/ro_RO.xml new file mode 100644 index 0000000..f02d416 --- /dev/null +++ b/libs/Zend/Locale/Data/ro_RO.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/root.xml b/libs/Zend/Locale/Data/root.xml new file mode 100644 index 0000000..d6f3f39 --- /dev/null +++ b/libs/Zend/Locale/Data/root.xml @@ -0,0 +1,2554 @@ + + + + + + + + + + + + {0} ({1}) + , + + + US + Metric + + + {0} + {0} + {0} + + + + + mixed + mixed + mixed + mixed + mixed + mixed + mixed + mixed + mixed + mixed + mixed + mixed + mixed + mixed + + + [] + [] + [a-z] + + + + + + + + + GyMdkHmsSEDFwWahKzYeugAZvcL + {0} - {1} + + + + + + + + + + + + + AM + PM + + + + + + BE + + + + + + + + + + EEEE, MMMM d, yyyy G + + + + + MMMM d, yyyy G + + + + + MMM d, yyyy G + + + + + M/d/yyyy + + + + + + + + + + + + + + + + + + + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + + + + + + + AM + PM + + + + + EEEE y'x'G-Ml-d + + + + + y'x'G-Ml-d + + + + + y'x'G-Ml-d + + + + + y'x'G-Ml-d + + + + + + + + + + + + + + + + + + + + + + + Tout + Baba + Hator + Kiahk + Toba + Amshir + Baramhat + Baramouda + Bashans + Paona + Epep + Mesra + Nasie + + + + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + + + + + + + + + + + + + AM + PM + + + + + + ERA0 + ERA1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + Meskerem + Tekemt + Hedar + Tahsas + Ter + Yekatit + Megabit + Miazia + Genbot + Sene + Hamle + Nehasse + Pagumen + + + + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + + + + + + + + + + + + + AM + PM + + + + + + ERA0 + ERA1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + + + + + + + + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + + + + + + + + + + Q1 + Q2 + Q3 + Q4 + + + + + + + + 1 + 2 + 3 + 4 + + + + + + + AM + PM + + + + + + BCE + CE + + + + + + + + + + EEEE, yyyy MMMM dd + + + + + yyyy MMMM d + + + + + yyyy MMM d + + + + + yyyy-MM-dd + + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1} {0} + + + + H:mm + L + E, M-d + LLL + E MMM d + E MMMM d + MMMM d + MMM d + M-d + d + mm:ss + yyyy + yyyy-M + EEE, yyyy-M-d + yyyy MMM + EEE, yyyy MMM d + yyyy MMMM + yyyy Q + yyyy QQQ + + + {0} ({2}: {1}) + {0} {1} + {0} {1} + {0} ({2}: {1}) + {0} ({2}: {1}) + {0} ({2}: {1}) + {0} ({2}: {1}) + {0} ({2}: {1}) + {0} {1} + {0} ({2}: {1}) + {0} {1} + + + {0} – {1} + + M-M + + + E, MM-dd – E, MM-dd + E, MM-dd – E, MM-dd + + + LLL-LLL + + + E, MM-d – E, MM-d + E, MM-d – E, MM-d + + + LLLL-LLLL + + + MM-d – MM-d + MM-d – d + + + MM-dd – MM-dd + MM-dd – dd + + + d-d + + + HH-HH + HH-HH + + + HH:mm-HH:mm + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH-HH v + HH-HH v + + + y-y + + + yyyy-MM – MM + yyyy-MM – yyyy-MM + + + E, yyyy-MM-dd – E, yyyy-MM-dd + E, yyyy-MM-dd – E, yyyy-MM-dd + E, yyyy-MM-dd – E, yyyy-MM-dd + + + yyyy-MM – MM + yyyy-MM – yyyy-MM + + + E, yyyy-MM-dd – E, yyyy-MM-dd + E, yyyy-MM-dd – E, yyyy-MM-dd + E, yyyy-MM-dd – E, yyyy-MM-dd + + + yyyy-MM – MM + yyyy-MM – yyyy-MM + + + yyyy-MM-dd – MM-d + yyyy-MM-d – d + yyyy-MM-dd – yyyy-MM-dd + + + yyyy-MM-dd – MM-dd + yyyy-MM-dd – dd + yyyy-MM-dd – yyyy-MM-dd + + + + + + Era + + + Year + + + Month + + + Week + + + Day + Today + Tomorrow + Yesterday + + + Day of the Week + + + Dayperiod + + + Hour + + + Minute + + + Second + + + Zone + + + + + + + + + + + + + + + + Tishri + Heshvan + Kislev + Tevet + Shevat + Adar I + Adar + Nisan + Iyar + Sivan + Tamuz + Av + Elul + + + + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + + + + + + + + + + + + + AM + PM + + + + + + AM + + + + + + + + + + + + + + + + + + + + + + + + + + + + Chaitra + Vaisakha + Jyaistha + Asadha + Sravana + Bhadra + Asvina + Kartika + Agrahayana + Pausa + Magha + Phalguna + + + + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + + + + + + + AM + PM + + + + + + SAKA + + + + + + + + + + + + + + + + + + + + + + + + + + + + Muharram + Safar + Rabiʻ I + Rabiʻ II + Jumada I + Jumada II + Rajab + Shaʻban + Ramadan + Shawwal + Dhuʻl-Qiʻdah + Dhuʻl-Hijjah + + + + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + + + + + + + AM + PM + + + + + + AH + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AM + PM + + + + + + Taika + Hakuchi + Hakuhō + Shuchō + Taihō + Keiun + Wadō + Reiki + Yōrō + Jinki + Tempyō + Tempyō-kampō + Tempyō-shōhō + Tempyō-hōji + Temphō-jingo + Jingo-keiun + Hōki + Ten-ō + Enryaku + Daidō + Kōnin + Tenchō + Shōwa + Kajō + Ninju + Saiko + Tennan + Jōgan + Genkei + Ninna + Kampyō + Shōtai + Engi + Enchō + Shōhei + Tengyō + Tenryaku + Tentoku + Ōwa + Kōhō + Anna + Tenroku + Ten-en + Jōgen + Tengen + Eikan + Kanna + Ei-en + Eiso + Shōryaku + Chōtoku + Chōhō + Kankō + Chōwa + Kannin + Jian + Manju + Chōgen + Chōryaku + Chōkyū + Kantoku + Eishō + Tengi + Kōhei + Jiryaku + Enkyū + Shōho + Shōryaku + Eiho + Ōtoku + Kanji + Kaho + Eichō + Shōtoku + Kōwa + Chōji + Kashō + Tennin + Ten-ei + Eikyū + Gen-ei + Hoan + Tenji + Daiji + Tenshō + Chōshō + Hoen + Eiji + Kōji + Tenyō + Kyūan + Ninpei + Kyūju + Hogen + Heiji + Eiryaku + Ōho + Chōkan + Eiman + Nin-an + Kaō + Shōan + Angen + Jishō + Yōwa + Juei + Genryuku + Bunji + Kenkyū + Shōji + Kennin + Genkyū + Ken-ei + Shōgen + Kenryaku + Kenpō + Shōkyū + Jōō + Gennin + Karoku + Antei + Kanki + Jōei + Tempuku + Bunryaku + Katei + Ryakunin + En-ō + Ninji + Kangen + Hōji + Kenchō + Kōgen + Shōka + Shōgen + Bun-ō + Kōchō + Bun-ei + Kenji + Kōan + Shōō + Einin + Shōan + Kengen + Kagen + Tokuji + Enkei + Ōchō + Shōwa + Bunpō + Genō + Genkyō + Shōchū + Kareki + Gentoku + Genkō + Kemmu + Engen + Kōkoku + Shōhei + Kentoku + Bunchũ + Tenju + Kōryaku + Kōwa + Genchũ + Meitoku + Kakei + Kōō + Meitoku + Ōei + Shōchō + Eikyō + Kakitsu + Bun-an + Hōtoku + Kyōtoku + Kōshō + Chōroku + Kanshō + Bunshō + Ōnin + Bunmei + Chōkyō + Entoku + Meiō + Bunki + Eishō + Taiei + Kyōroku + Tenmon + Kōji + Eiroku + Genki + Tenshō + Bunroku + Keichō + Genwa + Kan-ei + Shōho + Keian + Shōō + Meiryaku + Manji + Kanbun + Enpō + Tenwa + Jōkyō + Genroku + Hōei + Shōtoku + Kyōhō + Genbun + Kanpō + Enkyō + Kan-en + Hōryaku + Meiwa + An-ei + Tenmei + Kansei + Kyōwa + Bunka + Bunsei + Tenpō + Kōka + Kaei + Ansei + Man-en + Bunkyū + Genji + Keiō + Meiji + Taishō + Shōwa + Heisei + + + M + T + S + H + + + + + + + EEEE, MMMM d, y G + + + + + MMMM d, y G + + + + + MMM d, y G + + + + + M/d/yy + + + + + + + + + + {1} {0} + + + + E d + H + HH:mm + HH:mm:ss + E MMM d + MMMM d + M-d + mm:ss + yyyy GGG + GGGGG yy-MM + GGGGG yy MMM + GGGGG yy Q + + + {0} ({2}: {1}) + {0} {1} + {0} {1} + {0} ({2}: {1}) + {0} ({2}: {1}) + {0} ({2}: {1}) + {0} ({2}: {1}) + {0} ({2}: {1}) + {0} {1} + {0} ({2}: {1}) + {0} {1} + + + + + + + + + + + + + + + + Farvardin + Ordibehesht + Khordad + Tir + Mordad + Shahrivar + Mehr + Aban + Azar + Dey + Bahman + Esfand + + + + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + + + + + + + AM + PM + + + + + + AP + + + + + + + + + + + + + + + + + + + + + + + + + + AM + PM + + + + + + Before R.O.C. + R.O.C. + + + + + + + + + + EEEE, MMMM d, G y + + + + + MMMM d, G y + + + + + MMM d, G y + + + + + G y/M/d + + + + + + + + + + + + + +HH:mm;-HH:mm + {0}/{1} + GMT{0} + {0} + {1} ({0}) + + + + + Unknown + + + Dumont d'Urville + + + St. John's + + + New Salem, North Dakota + + + Center, North Dakota + + + Vincennes, Indiana + + + Petersburg, Indiana + + + Tell City, Indiana + + + Knox, Indiana + + + Winamac, Indiana + + + Marengo, Indiana + + + Vevay, Indiana + + + Monticello, Kentucky + + + + ACT (Acre) + ACST (Acre) + + + + + AFT + + + + + CAT + + + + + EAT + + + + + SAST + + + + + WAT + WAST + + + + + AKTT + AKTST + + + + + AKST + AKDT + + + + + AHST + AHDT + + + + + ALMT + ALMST + + + + + AMT + AMST + + + + + CST + CDT + + + + + EST + EDT + + + + + MST + MDT + + + + + PST + PDT + + + + + ANAT + ANAST + + + + + AQTT (Aqtau) + AQTST (Aqtau) + + + + + AQTT (Aqtobe) + AQTST (Aqtobe) + + + + + AST (SA) + ADT (SA) + + + + + ART + ARST + + + + + WART + + + + + AMT (AM) + AMST (AM) + + + + + ASHT + ASHST + + + + + AST + ADT + + + + + ACST + ACDT + + + + + ACWST + ACWDT + + + + + AEST + AEDT + + + + + AWST + AWDT + + + + + AZT + AZST + + + + + AZOT + AZOST + + + + + BAKT + BAKST + + + + + BDT + + + + + BST (Bering) + BDT (Bering) + + + + + BTT + + + + + BOT + + + + + BORT + BORST + + + + + BRT + BRST + + + + + BNT + + + + + CVT + CVST + + + + + ChST + + + + + CHAT + + + + + CHAST + CHADT + + + + + CLT + CLST + + + + + CST (CN) + CDT (CN) + + + + + CHOT + CHOST + + + + + CXT + + + + + CCT + + + + + COT + COST + + + + + CKT + CKHST + + + + + CST (CU) + CDT (CU) + + + + + DACT + + + + + DAVT + + + + + DDUT + + + + + DUST + DUSST + + + + + NEGT + + + + + TLT + + + + + EAST + EASST + + + + + ECT + + + + + CET + CEST + + + + + EET + EEST + + + + + WET + WEST + + + + + FKT + FKST + + + + + FJT + FJST + + + + + GFT + + + + + TFT + + + + + FRUT + FRUST + + + + + GMT + + + + + GALT + + + + + GAMT + + + + + GET + GEST + + + + + GILT + + + + + CGT + CGST + + + + + EGT + EGST + + + + + WGT + WGST + + + + + GST (GU) + + + + + GST + + + + + GYT + + + + + HST + + + + + HKT + HKST + + + + + HOVT + HOVST + + + + + IST + + + + + IOT + + + + + ICT + + + + + CIT + + + + + EIT + + + + + WIT + + + + + IRST + IRDT + + + + + IRKT + IRKST + + + + + IST (IL) + IDT + + + + + JST + JDT + + + + + PETT + PETST + + + + + KART + + + + + KAST + + + + + EKST + + + + + WKST + + + + + KIZT + KIZST + + + + + KST + KDT + + + + + KOST + + + + + KRAT + KRAST + + + + + KUYT + KUYST + + + + + KWAT + + + + + KGT + + + + + LKT + + + + + LINT + + + + + LONT + + + + + LHST + LHDT + + + + + MOT + MOST + + + + + MAGT + MAGST + + + + + MALT + + + + + MYT + + + + + MVT + + + + + MART + + + + + MHT + + + + + MUT + MUST + + + + + MAWT + + + + + ULAT + ULAST + + + + + MSK + MSKS + + + + + MMT + + + + + NRT + + + + + NPT + + + + + NCT + NCST + + + + + NZST + NZDT + + + + + NST + NDT + + + + + NUT + + + + + NFT + + + + + FNT + FNST + + + + + MPT + + + + + NOVT + NOVST + + + + + OMST + OMSST + + + + + PKT + PKST + + + + + PWT + + + + + PGT + + + + + PYT + PYST + + + + + PET + PEST + + + + + PHT + PHST + + + + + PHOT + + + + + PMST + PMDT + + + + + PNT + + + + + PONT + + + + + QYZT + QYZST + + + + + RET + + + + + ROTT + + + + + SAKT + SAKST + + + + + SAMT + SAMST + + + + + SAMT (Samarkand) + SAMST (Samarkand) + + + + + SST + + + + + SCT + + + + + SHET + SHEST + + + + + SGT + + + + + SBT + + + + + GST (GS) + + + + + SRT + + + + + SVET + SVEST + + + + + SYOT + + + + + TAHT + + + + + TJT + + + + + TAST + TASST + + + + + TBIT + TBIST + + + + + TKT + + + + + TOT + TOST + + + + + TRUT + + + + + TRT + TRST + + + + + TMT + TMST + + + + + TVT + + + + + URAT + URAST + + + + + UYT + UYST + + + + + URUT + + + + + UZT + UZST + + + + + VUT + VUST + + + + + VET + + + + + VLAT + VLAST + + + + + VOLT + VOLST + + + + + VOST + + + + + WAKT + + + + + WFT + + + + + YAKT + YAKST + + + + + YEKT + YEKST + + + + + YERT + YERST + + + + + YST + YDT + + + + + + + . + , + ; + % + 0 + # + + + - + E + + + NaN + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + [:letter:] + [:digit:] +   + + + [:letter:] + [:digit:] +   + + + + + ¤ #,##0.00 + + + {0} {1} + + + + BRL + R$ + + + EUR + + + + GBP + UK£ + + + INR + 0≤Rs.|1≤Re.|1<Rs. + + + ITL + IT₤ + + + JPY + JP¥ + + + USD + US$ + + + + + + {0} d + + + {0} h + + + {0} min + + + {0} m + + + {0} s + + + {0} w + + + {0} y + + + + + yes:y + no:n + + + diff --git a/libs/Zend/Locale/Data/ru.xml b/libs/Zend/Locale/Data/ru.xml new file mode 100644 index 0000000..fe6a95e --- /dev/null +++ b/libs/Zend/Locale/Data/ru.xml @@ -0,0 +1,4048 @@ + + + + + + + + + + + {0} ({1}) + , + + + афар + абхазский + ачехский + ачоли + адангме + адыгейский + авестийский + африкаанс + афразийский язык + африхили + айну + акан + аккадский + алеутский + алгонкинские языки + южноалтайский + амхарский + арагонский + староанглийский + ангика + апачские языки + арабский + арамейский + арауканский + арапахо + искусственный язык + аравакский + ассамский + астурийский + атапачские языки + австралийский язык + аварский + авадхи + аймара + азербайджанский + башкирский + банда + бамилеке языки + белуджский + балийский + баса + балтийский язык + белорусский + беджа + бемба + берберский + болгарский + бихари + бходжпури + бислама + бикольский + бини + сиксика + бамбарийский + бенгальский + банту + тибетский + бретонский + брауи + боснийский + батакский + бурятский + бугийский + билин (блин) + каталанский + каддо + язык индейцев Центральной Америки + кариб + кавказский язык + атсам + чеченский + кебуано + кельтские другие + чаморро + чибча + чагатайский + чукотский + марийский (черемисский) + чинук жаргон + чоктав + чипевайян + чероки + чейенн + чамский язык + корсиканский + коптский + англо-креольские и пиджин + франко-креольские и пиджины + португало-креольские и пиджины + криийский + крымско-татарский + креольские и пиджины + чешский + кашубианский + церковнославянский + кушитский язык + чувашский + валлийский + датский + дакота + даргва + даяк + немецкий + австрийский немецкий + Швейцарский верхненемецкий + делаварский + славянский + догриб + динка + догри + дравидийский язык + нижнелужицкий + дуала + средненидерландский + мальдивский + диула (дьюла) + дзонг-кэ + эве + эфик + древнеегипетский + экаджук + греческий + эламский + английский + австралийский английский + Канадский английский + британский английский + американский английский + среднеанглийский + эсперанто + испанский + Латино-американский испанский + Испанский иберийский + эстонский + баскский + эвондо + персидский + фанг + фанти + фулах + финский + филиппинский + финно-угорский язык + фиджи + фарерский + фон + французский + Канадский французский + Швейцарский французский + среднефранцузский + старофранцузский + фризский северный + восточный фризский + фриульский + фризский + ирландский + га + гайо + гбая + гэльский + германский язык + геэз + гильбертский + галисийский + средневерхненемецкий + гуарани + древневерхненемецкий + гонди + горонтало + готский + гребо + древнегреческий + Швейцарский немецкий + гуджарати + мэнский + гвичин + хауса + хайда + гавайский + иврит + хинди + хилигайнон + химачали + хеттский + хмонг + хиримоту + хорватский + верхнелужицкий + гаитянский + венгерский + хупа + армянский + гереро + интерлингва + ибанский + индонезийский + интерлингве + игбо + сычуань + иджо + инупиак + илоко + индийский язык + индоевропейский язык + ингушский + идо + иранский язык + ирокезские языки + исландский + итальянский + инуктитут + японский + ложбан + еврейско-персидский + еврейско-арабский + яванский + грузинский + каракалпакский + кабильский + качинский + каджи + камба + каренский + кави + кабардинский + тьяп + коро + конго + кхаси + койсанский язык + хотанский + кикуйю + кунама + казахский + эскимосский (гренландский) + кхмерский + кимбундийский + каннада + корейский + конкани + косраенский + кпелле + канури + карачаево-балкарский + карельский + кру + курух + кашмири + курдский + кумыкский + кутенаи + коми + корнийский + киргизский + латинский + ладино + лахнда + ламба + люксембургский + лезгинский + ганда + лимбургский + лингала + лаосский + монго + лози + литовский + луба-катанга + луба-лулуа + луисеньо + лунда + луо (Кения и Танзания) + лушай + латышский + мадурский + магахи + майтхили + макассарский + мандинго + австронезийский + масаи + мокшанский + мандарский + менде + малагасийский + среднеирландский + маршалльский + маори + микмак + минангкабау + смешанные языки + македонский + монкхмерский язык + малаялам + монгольский + маньчжурский + манипурский + манобо языки + молдавский + мохаук + моси + маратхи + малайский + мальтийский + несколько языков + мунда языки + крик + мирандийский + марвари + бирманский + майя языки + эрзя + науру + ацтекский + язык индейцев Северной Америки + неаполитанский + норвежский букмол + ндебели (северный) + нижнегерманский + непальский + неварский + ндонга + ниас + нигер-кордофанский язык + ниуэ + голландский + Бельгийский фламандский + норвежский нюнорск + норвежский + ногайский + старонорвежский + нко + ндебели южный + сото северный + нубийские языки + навахо + невари (классический) + ньянджа + ньямвези + ньянколе + ньоро + нзима + окситанский + оджибва + оромо + ория + осетинский + оседжи + старотурецкий + отомангские языки + панджаби (пенджаби) + папуасский язык + пангасинан + пехлевийский + пампанга + папьяменто + палау + староперсидский + филиппинский язык + финикийский + пали + польский + понапе + пракриты языки + старопровансальский + пашто (пушту) + португальский + бразильский португальский + Португальский иберийский + кечуа + раджастхани + рапануи + раротонганский + ретороманский + рунди + румынский + романский язык + цыганский + корневой язык + русский + арумынский + киньяруанда + санскрит + сандаве + якутский + язык индейцев Южной Америки + салишские языки + самаритянский арамейский + сасаки + сантали + сардинский + сицилийский + шотландский + синдхи + саамский (северный) + селькупский + семитский язык + санго + староирландский + язык глухонемых + сербскохорватский + шанский + сингальский + сидама + сиу языки + синотибетский язык + словацкий + словенский + славянский язык + самоанский + саамский (южный) + саамские языки + луле-саамский + инари-саамский + скольт-саамский + шона + сонинке + сомали + согдийский + cонгаи + албанский + сербский + сранан тонго + серер + свази + нило-сахарский язык + сото южный + сунданский + сукума + сусу + шумерский + шведский + суахили + классический сирийский + сирийский + тамильский + тайский язык + телугу + темне + терено + тетум + таджикский + тайский + тигринья + тигре + тиви + туркменский + токелайский + тагалог + клингонский + тлингит + тамашек + тсвана + тонга + ньяса (тонга) + ток-писин + турецкий + тсонга + цимшиан + татарский + тумбука + тупи + алтайский язык + тувалу + тви + таитянский + тувинский + удмуртский + уйгурский + угаритский + украинский + умбунду + неизвестный или недействительный язык + урду + узбекский + ваи + венда + вьетнамский + волапюк + водский + валлонский + вакашские языки + воламо + варай + вашо + лужицкие языки + волоф + калмыцкий + ксоза + яо + яп + идиш + йоруба + юпикский язык + чжуань + сапотекский + блиссимволика + зенагский + китайский + упрощенный китайский + Традиционный китайский + занде + зулу + зуньи + без языкового содержания + заза + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Мир + Африка + Северная Америка + Южная Америка + Океания + Западная Африка + Центральная Америка + Восточная Африка + Северная Африка + Центральная Африка + Южная Африка [018] + Центральная и Южная Америка + Северная Америка (021) + Карибы + Восточная Азия + Южная Азия + Юго-Восточная Азия + Южная Европа + Австралия и Новая Зеландия + Меланезия + Микронезия + Полинезия + Юг Средней Азии + Азия + Средняя Азия + Ближний и Средний Восток + Европа + Восточная Европа + Северная Европа + Западная Европа + СНГ + Латинская Америка и Карибские о-ва + Нормандские острова + Андорра + Объединенные Арабские Эмираты + Афганистан + Антигуа и Барбуда + Ангуилла + Албания + Армения + Нидерландские Антильские острова + Ангола + Антарктика + Аргентина + Американское Самоа + Австрия + Австралия + Аруба + Аландские острова + Азербайджан + Босния и Герцеговина + Барбадос + Бангладеш + Бельгия + Буркина Фасо + Болгария + Бахрейн + Бурунди + Бенин + Остров Святого Бартоломея + Бермудские Острова + Бруней Даруссалам + Боливия + Бразилия + Багамские острова + Бутан + Остров Буве + Ботсвана + Беларусь + Белиз + Канада + Кокосовые острова + Демократическая Республика Конго + Центрально-Африканская Республика + Конго + Швейцария + Кот д’Ивуар + Острова Кука + Чили + Камерун + Китай + Колумбия + Коста-Рика + Сербия и Черногория + Куба + Острова Зеленого Мыса + Остров Рождества + Кипр + Чешская республика + Германия + Джибути + Дания + Остров Доминика + Доминиканская Республика + Алжир + Эквадор + Эстония + Египет + Западная Сахара + Эритрея + Испания + Эфиопия + Финляндия + Фиджи + Фолклендские острова + Федеративные Штаты Микронезии + Фарерские острова + Франция + Габон + Великобритания + Гренада + Грузия + Французская Гвиана + Гернси + Гана + Гибралтар + Гренландия + Гамбия + Гвинея + Гваделупа + Экваториальная Гвинея + Греция + Южная Джорджия и Южные Сандвичевы Острова + Гватемала + Гуам + Гвинея-Биссау + Гайана + Гонконг + Острова Херд и Макдональд + Гондурас + Хорватия + Гаити + Венгрия + Индонезия + Ирландия + Израиль + Остров Мэн + Индия + Британская территория в Индийском океане + Ирак + Иран + Исландия + Италия + Джерси + Ямайка + Иордания + Япония + Кения + Кыргызстан + Камбоджа + Кирибати + Коморские Острова + Сент-Киттс и Невис + Корейская Народно-Демократическая Республика + Республика Корея + Кувейт + Каймановы острова + Казахстан + Лаос + Ливан + Сент-Люсия + Лихтенштейн + Шри-Ланка + Либерия + Лесото + Литва + Люксембург + Латвия + Ливия + Марокко + Монако + Молдова + Черногория + Остров Святого Мартина + Мадагаскар + Маршалловы Острова + Македония + Мали + Мьянма + Монголия + Макао + Северные Марианские Острова + Мартиник + Мавритания + Монсеррат + Мальта + Маврикий + Мальдивы + Малави + Мексика + Малайзия + Мозамбик + Намибия + Новая Каледония + Нигер + Остров Норфолк + Нигерия + Никарагуа + Нидерланды + Норвегия + Непал + Науру + Ниуе + Новая Зеландия + Оман + Панама + Перу + Французская Полинезия + Папуа-Новая Гвинея + Филиппины + Пакистан + Польша + Сен-Пьер и Микелон + Питкерн + Пуэрто-Рико + Палестинская автономия + Португалия + Палау + Парагвай + Катар + Внешняя Океания + Европейский союз + Реюньон + Румыния + Сербия + Россия + Руанда + Саудовская Аравия + Соломоновы Острова + Сейшельские Острова + Судан + Швеция + Сингапур + Остров Святой Елены + Словения + Свальбард и Ян-Майен + Словакия + Сьерра-Леоне + Сан-Марино + Сенегал + Сомали + Суринам + Сан-Томе и Принсипи + Сальвадор + Сирийская Арабская Республика + Свазиленд + Острова Тёркс и Кайкос + Чад + Французские Южные Территории + Того + Таиланд + Таджикистан + Токелау + Восточный Тимор + Туркменистан + Тунис + Тонга + Турция + Тринидад и Тобаго + Тувалу + Тайвань + Танзания + Украина + Уганда + Внешние малые острова (США) + США + Уругвай + Узбекистан + Ватикан + Сент-Винсент и Гренадины + Венесуэла + Британские Виргинские Острова + Американские Виргинские Острова + Вьетнам + Вануату + Уоллис и Футуна + Самоа + Йемен + Майотта + Южная Африка + Замбия + Зимбабве + Неизвестный или недействительный регион + + + Традиционная немецкая орфография + Стандартизированная резьянская орфография + Правила немецкой орфографии установленные с 1996 года + Поздне-средневековый французский до 1606 г. + Восточно-армянский + Западно-армянский + Унифицированный тюрско-латинский алфавит + Международный фонетический алфавит + Монотонный + Многотональный + Компьютерный + Резьянский + Сахо + Англо-шотландский + Тарашкевица + Валенсийский + + + Календарь + Сопоставление + Валюта + + + традиционный китайский - Big5 + Буддийский календарь + Китайский календарь + прямой порядок + упрощенный китайский - GB2312 + Григорианский календарь + Еврейский календарь + Национальный календарь Индии + Исламский календарь + Исламский гражданский календарь + Японский календарь + порядок телефонной книги + пиньинь + Китайский календарь + по чертам + традиционный порядок + + + Англо-американская + Метрическая + + + Язык: {0} + Написание: {0} + Регион: {0} + + + + titlecase-firstword + + + [а-е ё ж-я] + [a-e g i m n p r t-x] + [a-z] + + + « + » + + + + + GanjkHmsSEDFwWxhKzAeugXZvcL + + + + + + янв. + февр. + марта + апр. + мая + июня + июля + авг. + сент. + окт. + нояб. + дек. + + + января + февраля + марта + апреля + мая + июня + июля + августа + сентября + октября + ноября + декабря + + + + + янв. + февр. + март + апр. + май + июнь + июль + авг. + сент. + окт. + нояб. + дек. + + + Я + Ф + М + А + М + И + И + А + С + О + Н + Д + + + Январь + Февраль + Март + Апрель + Май + Июнь + Июль + Август + Сентябрь + Октябрь + Ноябрь + Декабрь + + + + + + + Вс + Пн + Вт + Ср + Чт + Пт + Сб + + + воскресенье + понедельник + вторник + среда + четверг + пятница + суббота + + + + + В + П + В + С + Ч + П + С + + + Воскресенье + Понедельник + Вторник + Среда + Четверг + Пятница + Суббота + + + + + + + 1-й кв. + 2-й кв. + 3-й кв. + 4-й кв. + + + 1-й квартал + 2-й квартал + 3-й квартал + 4-й квартал + + + + + 1 + 2 + 3 + 4 + + + + AM + PM + + + до н.э. + н.э. + + + до н.э. + н.э. + + + + + + EEEE, d MMMM yyyy 'г'. + + + + + d MMMM yyyy 'г'. + + + + + dd.MM.yyyy + + + + + dd.MM.yy + + + + + + + H:mm:ss v + + + + + H:mm:ss z + + + + + H:mm:ss + + + + + H:mm + + + + + + + {1} {0} + + + + E d + H + HH:mm + HH:mm:ss + H:mm + L + E, M-d + LLL + E MMM d + E MMMM d + d MMMM + d MMM + dd.MM + d.M + d + mm:ss + mm:ss + yyyy + yyyy-M + EEE, yyyy-M-d + MMM. y + E, d MMM. y + MMMM y + Q y + yyyy QQQ + MM.yy + MMM yy + EEE, d MMM yy + Q yy + yyyy + LLLL yyyy + MM.yyyy + MMMM yyyy + QQQQ yyyy 'г'. + + + {0} - {1} + + M-M + + + E, MM-dd – E, MM-dd + E, MM-dd – E, MM-dd + + + MMM-MMM + + + d MMM - d MMM + d-d MMM + + + LLLL-LLLL + + + d MMM - d MMM + d-d MMM + + + dd.MM - dd.MM + dd.MM - dd.MM + + + d-d + + + HH-HH + HH-HH + + + HH:mm-HH:mm + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH-HH v + HH-HH v + + + y-y + + + MM.yy - MM.yy + MM.yy - MM.yy + + + dd.MM.yy - dd.MM.yy + dd.MM.yy - dd.MM.yy + dd.MM.yy - dd.MM.yy + + + MMM-MMM yyyy 'г'. + MMM yyyy - MMM yyyy 'г'. + + + d MMM - d MMM yyyy 'г'. + d-d MMM yyyy 'г'. + d MMM yyyy - d MMM yyyy 'г'. + + + LLLL-LLLL yyyy 'г'. + LLLL yyyy - LLLL yyyy 'г'. + + + d MMM - d MMM yyyy 'г'. + d-d MMM yyyy 'г'. + d MMM yyyy - d MMM yyyy 'г'. + + + dd.MM.yy - dd.MM.yy + dd.MM.yy - dd.MM.yy + dd.MM.yy - dd.MM.yy + + + + + + Эра + + + Год + + + Месяц + + + Неделя + + + День + Сегодня + Завтра + Послезавтра + Вчера + Позавчера + + + День недели + + + AM/PM + + + Час + + + Минута + + + Секунда + + + Часовой пояс + + + + + + + + Тишрей + Хешван + Кислев + Тевет + Шеват + Адар + Нисан + Ияр + Сиван + Таммуз + Ав + Элул + + + Тишрей + Хешван + Кислев + Тевет + Шеват + Адар + Нисан + Ияр + Сиван + Таммуз + Ав + Элул + + + + + + + + + Мухаррам + Сафар + Раби-уль-авваль + Раби-уль-ахир + Джумад-уль-авваль + Джумад-уль-ахир + Раджаб + Шаабан + Рамадан + Шавваль + Зуль-Каада + Зуль-Хиджжа + + + Мухаррам + Сафар + Раби-уль-авваль + Раби-уль-ахир + Джумад-уль-авваль + Джумад-уль-ахир + Раджаб + Шаабан + Рамадан + Шавваль + Зуль-Каада + Зуль-Хиджжа + + + + + + + + + Фарвардин + Ордибехешт + Хордад + Тир + Мордад + Шахривер + Мехр + Абан + Азер + Дей + Бахман + + + Фарвардин + Ордибехешт + Хордад + Тир + Мордад + Шахривер + Мехр + Абан + Азер + Дей + Бахман + Эсфанд + + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + {1} ({0}) + + Неизвестный + + + Андорра + + + Дубай + + + Кабул + + + Антигуа + + + Ангилья + + + Тирана + + + Ереван + + + Кюрасао + + + Луанда + + + Ротера + + + Палмер + + + Южный полюс + + + Сева + + + Моусон + + + Дейвис + + + Восток + + + Кейси + + + Дюмон-д'Юрвиль + + + Мак-Мердо + + + Рио-Гальегос + + + Мендоса + + + Сан-Хуан + + + Ушуая + + + Ла-Риоха + + + Сан-Луис + + + Катамарка + + + Жужуй + + + Тукуман + + + Кордова + + + Буэнос-Айрес + + + Паго-Паго + + + Вена + + + Перт + + + Юкла + + + Дарвин + + + Аделаида + + + Брокен-Хилл + + + Керри + + + Мельбурн + + + Хобарт + + + Линдеман + + + Сидней + + + Брисбен + + + Лорд-Хау, о-в + + + Аруба + + + Мариехамн + + + Баку + + + Сараево + + + Барбадос + + + Дакка + + + Брюссель + + + Уагадугу + + + София + + + Бахрейн + + + Бужумбура + + + Порто-Ново + + + Бермуды + + + Бруней + + + Ла-Пас + + + Эйрунепе + + + Риу-Бранку + + + Порту-Велью + + + Боа-Виста + + + Манаус + + + Куяба + + + Кампу-Гранди + + + Белен + + + Арагуаина + + + Сан-Паулу + + + Баия + + + Форталеза + + + Масейо + + + Ресифи + + + Норонха + + + Нассау + + + Тимпу + + + Габороне + + + Минск + + + Белиз + + + Доусон + + + Уайтхорс + + + Инувик + + + Ванкувер + + + Досон-Крик + + + Йеллоунайф + + + Эдмонтон + + + Свифт-Карент + + + Кеймбридж-Бей + + + Реджайна + + + Виннипег + + + Резолют + + + Рейни-Ривер + + + Ранкин-Инлет + + + Корал-Харбор + + + Тандер-Бей + + + Нипигон + + + Торонто + + + Монреаль + + + Икалуит + + + Пангниртанг + + + Монктон + + + Галифакс + + + Гус-Бей + + + Глейс-Бей + + + Бланк-Саблон + + + Сент-Джонс + + + Кокосовые острова + + + Киншаса + + + Лубумбаши + + + Банги + + + Браззавиль + + + Цюрих + + + Абиджан + + + Раротонга + + + Пасхи, о-в + + + Сантьяго + + + Дуала + + + Кашгар + + + Урумчи + + + Чунцин + + + Шанхай + + + Харбин + + + Богота + + + Коста-Рика + + + Гавана + + + Острова Зеленого Мыса + + + Рождества, о-в + + + Никосия + + + Прага + + + Берлин + + + Джибути + + + Копенгаген + + + Доминика + + + Санто-Доминго + + + Алжир + + + Галапагос, о-ва + + + Гуаякиль + + + Таллин + + + Каир + + + Эль-Аюн + + + Асмера + + + Канарские о-ва + + + Сеута + + + Мадрид + + + Аддис-Абеба + + + Хельсинки + + + Фиджи + + + Стэнли + + + Трук, о-ва + + + Понапе, о-в + + + Косрае + + + Фарерские острова + + + Париж + + + Либревиль + + + Лондон + + + Гренада + + + Тбилиси + + + Кайенна + + + Гернси + + + Аккра + + + Гибралтар + + + Туле + + + Готхоб + + + Скорсбисунн + + + Денмарксхавн + + + Банжул + + + Конакри + + + Гваделупа + + + Малабо + + + Афины + + + Ю.Джорджия и Ю.Сэндвинчевы о-ва + + + Гватемала + + + Гуам + + + Бисау + + + Гайана + + + Гонконг + + + Тегусигальпа + + + Загреб + + + Порт-о-Пренс + + + Будапешт + + + Джакарта + + + Понтианак + + + Макасар + + + Джайпур + + + Дублин + + + Иерусалим + + + Мэн, о-в + + + Калькутта + + + Чагос + + + Багдад + + + Тегеран + + + Рейкьявик + + + Рим + + + Джерси + + + Ямайка + + + Амман + + + Токио + + + Найроби + + + Бишкек + + + Пномпень + + + Эндербери, о-в + + + Киритимати + + + Тарава + + + Коморские острова + + + Сент-Китс + + + Пхеньян + + + Сеул + + + Кувейт + + + Каймановы острова + + + Актау + + + Орал (Уральск) + + + Актобе (Актюбинск) + + + Кызылорда + + + Алматы + + + Вьентьян + + + Бейрут + + + Сент-Люсия + + + Вадуц + + + Коломбо + + + Монровия + + + Масеру + + + Вильнюс + + + Люксембург + + + Рига + + + Триполи + + + Касабланка + + + Монако + + + Кишинев + + + Подгорица + + + Антананариву + + + Кваджалейн + + + Маджуро + + + Скопье + + + Бамако + + + Рангун + + + Ховд + + + Улан-Батор + + + Чойбалсан + + + Макао + + + Сайпан + + + Мартиника + + + Нуакшот + + + Монсеррат + + + Мальта + + + Маврикий + + + Мальдивы + + + Блантайр + + + Тихуана + + + Эрмосильо + + + Масатлан + + + Чиуауа + + + Монтеррей + + + Мехико + + + Мерида + + + Канкун + + + Куала-Лумпур + + + Кучинг + + + Мапуту + + + Виндхук + + + Нумеа + + + Ниамей + + + Норфолк + + + Лагос + + + Манагуа + + + Амстердам + + + Осло + + + Катманду + + + Науру + + + Ниуэ + + + Чатем, о-в + + + Окленд + + + Маскат + + + Панама + + + Лима + + + Таити, о-в + + + Маркизские о-ва + + + Гамбье, о-ва + + + Порт-Морсби + + + Манила + + + Карачи + + + Варшава + + + Микелон + + + Питкерн + + + Пуэрто-Рико + + + Газа + + + Азорские о-ва + + + Мадейра, о-в + + + Лиссабон + + + Палау + + + Асунсьон + + + Катар + + + Реюньон + + + Бухарест + + + Белград + + + Калининград + + + Москва + + + Волгоград + + + Самара + + + Екатеринбург + + + Омск + + + Новосибирск + + + Красноярск + + + Иркутск + + + Якутск + + + Владивосток + + + Сахалин, о-в + + + Магадан + + + Петропавловск-Камчатский + + + Анадырь + + + Кигали + + + Эр-Рияд + + + Гвадалканал + + + Маэ + + + Хартум + + + Стокгольм + + + Сингапур + + + Св. Елены, о-в + + + Любляна + + + Лонгйир + + + Братислава + + + Фритаун + + + Сан-Марино + + + Дакар + + + Могадишо + + + Парамарибо + + + Сан-Томе + + + Сальвадор + + + Дамаск + + + Мбабане + + + Гранд Турк + + + Нджамена + + + Кергелен + + + Ломе + + + Бангкок + + + Душанбе + + + Факаофо + + + Дили + + + Ашгабат + + + Тунис + + + Тонгатапу + + + Стамбул + + + Порт-оф-Спейн + + + Фунафути + + + Тайбэй + + + Дар-эс-Салам + + + Ужгород + + + Киев + + + Симферополь + + + Запорожье + + + Кампала + + + Мидуэй, о-ва + + + Джонстон, ат. + + + Уэйк, о-в + + + Адак, о-в + + + Ном + + + Гонолулу + + + Анкоридж + + + Якутат + + + Джуно + + + Лос-Анджелес + + + Бойсе + + + Финикс + + + Шипрок + + + Денвер + + + Нью-Салем + + + Северная Дакота - Центр + + + Чикаго + + + Меномини + + + Винсенс + + + Петерсбург + + + Телл-Сити + + + Нокс + + + Винамак + + + Маренго + + + Индианаполис + + + Луисвилл + + + Вивэй + + + Монтиселло + + + Детройт + + + Нью-Йорк + + + Монтевидео + + + Самарканд + + + Ташкент + + + Ватикан + + + Сент-Винсент + + + Каракас + + + Тортола + + + Сент-Томас + + + Сайгон + + + Эфате + + + Уоллис + + + Апия + + + Аден + + + Майорка + + + Йоханнесбург + + + Лусака + + + Хараре + + + + Акри время + Акри стандартное время + Акри летнее время + + + Акри время + Акри стандартное время + Акри летнее время + + + + + Афганистан время + + + Афганистан время + + true + + + + Центральноафриканское время + + + + + Восточноафриканское время + + + + + Южноафриканское время + + + + + Западноафриканское время + Западноафриканское летнее время + + + + + Актюбинск стандартное время + Актюбинск летнее время + + + Актюбинск стандартное время + Актюбинск летнее время + + true + + + + Аляска время + Аляска стандартное время + Аляска летнее время + + + Аляска время + Аляска стандартное время + Аляска летнее время + + true + + + true + + + + Алма-Ата стандартное время + Алма-Ата летнее время + + + Алма-Ата стандартное время + Алма-Ата летнее время + + true + + + + Средне-американское время + Средне-американское стандартное время + Средне-американское летнее время + + + Средне-американское время + Средне-американское стандартное время + Средне-американское летнее время + + true + + + + Восточно-американское время + Восточно-американское стандартное время + Восточно-американское летнее время + + + Восточно-американское время + Восточно-американское стандартное время + Восточно-американское летнее время + + true + + + + Горное время (США) + Горное стандартное время (США) + Горное летнее время (США) + + + Горное время (США) + Горное стандартное время (США) + Горное летнее время (США) + + true + + + + Тихоокеанское время + Тихоокеанское стандартное время + Тихоокеанское летнее время + + + Тихоокеанское время + Тихоокеанское стандартное время + Тихоокеанское летнее время + + true + + + + Анадырь стандартное время + Анадырь летнее время + + + Анадырь стандартное время + Анадырь летнее время + + true + + + + Актау стандартное время + Актау летнее время + + + Актау стандартное время + Актау летнее время + + true + + + + Актобе стандартное время + Актобе летнее время + + + Актобе стандартное время + Актобе летнее время + + true + + + + Саудовская Аравия время + Саудовская Аравия стандартное время + Саудовская Аравия летнее время + + + Саудовская Аравия время + Саудовская Аравия стандартное время + Саудовская Аравия летнее время + + true + + + + Аргентина стандартное время + Аргентина летнее время + + + Аргентина стандартное время + Аргентина летнее время + + true + + + + Аргентина (запад) стандартное время + + + Аргентина (запад) стандартное время + + true + + + + Армения время + Армения стандартное время + Армения летнее время + + + Армения время + Армения стандартное время + Армения летнее время + + true + + + + Атлантическое время + Атлантическое стандартное время + Атлантическое летнее время + + + Атлантическое время + Атлантическое стандартное время + Атлантическое летнее время + + + + + Бразилия стандартное время + Бразилия дневное время + + + Бразилия стандартное время + Бразилия дневное время + + + + + Китайское стандартное время + + + Китайское стандартное время + + + + + Центральноевропейское время + Центральноевропейское летнее время + + + Центральноевропейское время + Центральноевропейское летнее время + + true + + + + Восточноевропейское время + Восточноевропейское летнее время + + + Восточноевропейское время + Восточноевропейское летнее время + + true + + + + Гонконгское стандартное время + Гонконгское летнее время + + + Гонконгское стандартное время + Гонконгское летнее время + + + + + Индийское стандартное время + + + Индийское стандартное время + + + + + Индокитайское стандартное время + + + Индокитайское стандартное время + + + + + Центральная Индонезия стандартное время + + + Центральная Индонезия стандартное время + + + + + Восточная Индонезия стандартное время + + + Восточная Индонезия стандартное время + + + + + Западная Индонезия стандартное время + + + Западная Индонезия стандартное время + + + + + Израиль стандартное время + Израиль летнее время + + + Израиль стандартное время + Израиль летнее время + + + + + Японское стандартное время + + + Японское стандартное время + + + + + Корейское стандартное время + + + Корейское стандартное время + + + + + Куйбышевское время + Куйбышевское летнее время + + + Куйбышевское время + Куйбышевское летнее время + + true + + + + Московское время + Московское стандартное время + Московское летнее время + + + Московское время + Московское стандартное время + Московское летнее время + + true + + + + Самарское стандартное время + Самарское летнее время + + + Самарское стандартное время + Самарское летнее время + + true + + + + Турецкое время + Турецкое стандартное время + Турецкое летнее время + + + Турецкое время + Турецкое стандартное время + Турецкое летнее время + + true + + + + Волгоградское время + Волгоградское летнее время + + + Волгоградское время + Волгоградское летнее время + + true + + + + + + , +   + ; + % + 0 + # + + + - + E + + + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0 % + + + + + + + #,##0.00 ¤ + + + + + + Андоррская песета + андоррские песеты + андоррских песет + андоррских песет + + + Дирхам (ОАЭ) + + + Афгани (1927-2002) + + + Афгани + + + Албанский лек + албанских лека + албанских леков + lek + + + Армянский драм + армянских драма + армянских драмов + dram + + + Нидерландский антильский гульден + NA f. + + + Ангольская кванза + + + Ангольская кванза (1977-1990) + ангольские кванзы + ангольских кванз + + + Ангольская новая кванза (1990-2000) + + + Ангольская кванза реюстадо (1995-1999) + ангольские кванзы реюстадо (1995-1999) + ангольских кванз реюстадо (1995-1999) + + + Аргентинский аустрал + + + Аргентинское песо (1983-1985) + + + Аргентинское песо + Arg$ + + + Австрийский шиллинг + + + Австралийский доллар + $A + + + Арубанский гульден + + + Старый азербайджанский манат + + + Азербайджанский манат + + + Динар Боснии и Герцеговины + + + Конвертируемая марка Боснии и Герцеговины + + + Барбадосский доллар + BDS$ + + + Бангладешская така + Tk + + + Бельгийский франк (конвертируемый) + + + Бельгийский франк + BF + + + Бельгийский франк (финансовый) + + + Лев + lev + + + Болгарский лев + + + Бахрейнский динар + BD + + + Бурундийский франк + Fbu + + + Бермудский доллар + Ber$ + + + Брунейский доллар + + + Боливиано + Bs + + + Боливийское песо + + + Боливийский мвдол + + + Бразильский новый крузейро (1967-1986) + + + Бразильское крузадо + + + Бразильский крузейро (1990-1993) + + + Бразильский реал + + + Бразильское новое крузадо + + + Бразильский крузейро + + + Багамский доллар + + + Нгултрум + Nu + + + Джа + + + Ботсванская пула + + + Белорусский рубль (1994-1999) + + + Белорусский рубль + Rbl + + + Белизский доллар + BZ$ + + + Канадский доллар + Can$ + + + Конголезский франк + + + WIR евро + + + Швейцарский франк + SwF + + + WIR франк + + + Условная расчетная единица Чили + + + Чилийское песо + Ch$ + + + Юань Ренминби + Y + + + Колумбийское песо + Col$ + + + Единица реальной стоимости Колумбии + + + Костариканский колон + C + + + Старый Сербский динар + + + Чехословацкая твердая крона + + + Кубинское песо + + + Эскудо Кабо-Верде + CVEsc + + + Кипрский фунт + £C + + + Чешская крона + + + Восточногерманская марка + + + Немецкая марка + + + Франк Джибути + DF + + + Датская крона + DKr + + + Доминиканское песо + RD$ + + + Алжирский динар + DA + + + Эквадорский сукре + + + Постоянная единица стоимости Эквадора + + + Эстонская крона + + + Египетский фунт + + + Эквеле + + + Накфа + + + Испанская песета (А) + + + Испанская песета (конвертируемая) + + + Испанская песета + + + Эфиопский быр + Br + + + Евро + + + Финская марка + + + Доллар Фиджи + F$ + + + Фунт Фолклендских островов + + + Французский франк + + + Английский фунт стерлингов + £ + + + Грузинский купон + + + Грузинский лари + lari + + + Ганский седи + + + Седи Ганы + + + Гибралтарский фунт + + + Гамбийский даласи + + + Гвинейский франк + GF + + + Гвинейская сили + + + Эквеле экваториальной Гвинеи + + + Греческая драхма + + + Гватемальский кетсаль + Q + + + Эскудо Португальской Гвинеи + + + Песо Гвинеи-Бисау + + + Гайанский доллар + G$ + + + Гонконгский доллар + HK$ + + + Гондурасская лемпира + L + + + Хорватский динар + + + Хорватская куна + + + Гаитянский гурд + + + Венгерский форинт + Ft + + + Индонезийская рупия + Rp + + + Ирландский фунт + IR£ + + + Израильский фунт + + + Новый израильский шекель + + + Индийская рупия + INR + + + Иракский динар + ID + + + Иранский риал + RI + + + Исландская крона + + + Итальянская лира + + + Ямайский доллар + J$ + + + Иорданский динар + JD + + + Японская иена + ¥ + + + Кенийский шиллинг + K Sh + + + Киргизский сом + som + + + Камбоджийский риель + CR + + + Франк Коморских островов + CF + + + Северо-корейская вона + + + Вона Республики Кореи + + + Кувейтский динар + KD + + + Доллар Каймановых островов + + + Казахский тенге + T + + + Кип ЛНДР + + + Ливанский фунт + LL + + + Шри-Ланкийская рупия + SL Re + + + Либерийский доллар + + + Лоти + M + + + Малоти + + + Литовский лит + + + Литовский талон + + + Конвертируемый франк Люксембурга + + + Люксембургский франк + + + Финансовый франк Люксембурга + + + Латвийский лат + + + Латвийский рубль + + + Ливийский динар + LD + + + Марокканский дирхам + + + Марокканский франк + + + Молдавский лей + + + Ариари + + + Малагасийский франк + + + Македонский динар + MDen + + + Малийский франк + + + Кьят + + + Монгольский тугрик + Tug + + + Патака + + + Мавританская угия + UM + + + Мальтийская лира + Lm + + + Мальтийский фунт + + + Маврикийская рупия + + + Мальдивская руфия + + + Малавийская квача + MK + + + Мексиканское новое песо + MEX$ + + + Мексиканское серебряное песо (1861-1992) + + + Мексиканская пересчетная единица (UDI) + + + Малайзийский ринггит + RM + + + Мозамбикское эскудо + + + Старый мозамбикский метикал + Mt + + + Метикал + + + Доллар Намибии + N$ + + + Нигерийская найра + + + Никарагуанская кордоба + + + Золотая кордоба + + + Нидерландский гульден + + + Норвежская крона + NKr + + + Непальская рупия + Nrs + + + Новозеландский доллар + $NZ + + + Оманский риал + RO + + + Панамское бальбоа + + + Перуанское инти + + + Перуанский новый соль + + + Перуанский соль + + + Кина + + + Филиппинское песо + + + Пакистанская рупия + Pra + + + Польский злотый + Zl + + + Злотый + + + Португальское эскудо + + + Парагвайский гуарани + + + Катарский риал + QR + + + Родезийский доллар + + + Старый Румынский лей + leu + + + Румынский лей + + + Сербский динар + + + Российский рубль + Российских рубля + Российских рублей + Российский рубль + Российского рубля + руб. + + + Российский рубль (1991-1998) + р. + + + Франк Руанды + + + Саудовский риал + SRl + + + Доллар Соломоновых островов + SI$ + + + Сейшельская рупия + SR + + + Суданский динар + + + Суданский фунт + + + Шведская крона + SKr + + + Сингапурский доллар + S$ + + + Фунт острова Святой Елены + + + Словенский толар + + + Словацкая крона + Sk + + + Леоне + + + Сомалийский шиллинг + Sh. + + + Суринамский доллар + + + Суринамский гульден + Sf + + + Добра + Db + + + Рубль СССР + + + Сальвадорский колон + + + Сирийский фунт + LS + + + Свазилендский лилангени + E + + + Таиландский бат + + + Таджикский рубль + + + Таджикский сомони + + + Туркменский манат + + + Тунисский динар + + + Паанга + T$ + + + Тиморское эскудо + + + Турецкая лира + турецкие лиры + турецких лир + туркцкая лира + турецких лир + TL + + + Новая турецкая лира + новые турецкие лиры + Новых турецких лир + Новая турецкая лира + новых турецких лир + + + Доллар Тринидада и Тобаго + TT$ + + + Новый тайваньский доллар + NT$ + + + Танзанийский шиллинг + T Sh + + + Украинская гривна + грн. + + + Карбованец (украинский) + + + Старый угандийский шиллинг + + + У£гандийский шиллинг + + + Доллар США + $ + + + Доллар США следующего дня + + + Доллар США текущего дня + + + Уругвайское старое песо (1975-1993) + + + Уругвайское песо + + + Узбекский сум + + + Венесуэльский боливар + Be + + + Вьетнамский донг + Донг + + + Вату + VT + + + Тала + + + Франк КФА ВЕАС + + + Серебро + + + Золото + + + Европейская составная единица + + + Европейская денежная единица + + + расчетная единица европейского валютного соглашения (XBC) + + + расчетная единица европейского валютного соглашения (XBD) + + + Восточно-карибский доллар + EC$ + + + СДР (специальные права заимствования) + + + ЭКЮ (единица европейской валюты) + + + Французский золотой франк + + + Французский UIC-франк + + + Франк КФА ВСЕАО + + + Палладий + + + Франк КФП + CFPF + + + Платина + + + единица RINET-фондов + + + тестовый валютный код + + + Неизвестная или недействительная валюта + + + Йеменский динар + + + Йеменский риал + YRl + + + Югославский твердый динар + + + Югославский новый динар + + + Югославский динар + + + Южноафриканский рэнд (финансовый) + + + Южноафриканский рэнд + R + + + Квача (замбийская) + + + Новый заир + + + Заир + + + Доллар Зимбабве + Z$ + + + + + + да:д + нет:н + + + diff --git a/libs/Zend/Locale/Data/ru_RU.xml b/libs/Zend/Locale/Data/ru_RU.xml new file mode 100644 index 0000000..8e003d7 --- /dev/null +++ b/libs/Zend/Locale/Data/ru_RU.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/ru_UA.xml b/libs/Zend/Locale/Data/ru_UA.xml new file mode 100644 index 0000000..7790fda --- /dev/null +++ b/libs/Zend/Locale/Data/ru_UA.xml @@ -0,0 +1,117 @@ + + + + + + + + + + + + апачский + слэйви + маршальский + клингон + + + US + Metric + + + + + + + + + d MMMM yyyy + + + + + d MMM yyyy + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + E, dd.MM - E, dd.MM + E, dd.MM - E, dd.MM + + + E, d MMM - E, d MMM + E, d - E, d MMM + + + HH-HH 'ч.' + + + HH-HH 'ч.', v + + + E, dd.MM.yy - E, dd.MM.yy + E, dd.MM.yy - E, dd.MM.yy + E, dd.MM.yy - E, dd.MM.yy + + + MMM-MMM yyyy + MMM yyyy - MMM yyyy + + + E, d MMM - E, d MMM yyyy 'г'. + E, d - E, d MMM yyyy 'г'. + E, d MMM yyyy - E, d MMM yyyy 'г'. + + + LLLL-LLLL yyyy + LLLL yyyy - LLLL yyyy + + + d MMM - d MMM yyyy + d-d MMM yyyy + d MMM yyyy - d MMM yyyy + + + + + + + + + + ESB + + + RHD + + + YUM + + + + + diff --git a/libs/Zend/Locale/Data/rw.xml b/libs/Zend/Locale/Data/rw.xml new file mode 100644 index 0000000..18b2569 --- /dev/null +++ b/libs/Zend/Locale/Data/rw.xml @@ -0,0 +1,311 @@ + + + + + + + + + + + Ikinyafurikaneri + Inyamuhariki + Icyarabu + Icyasamizi + Inyazeribayijani + Ikibelarusiya + Urunyabuligariya + Inyebihari + Ikibengali + Inyebiritoni + Inyebosiniya + Igikatalani + Igiceke + Ikigaluwa + Ikidaninwa + Ikidage + Ikigereki + Icyongereza + Icyesiperanto + Icyesipanyolo + Icyesitoniya + Ikibasiki + Inyeperisi + Igifinilande + Ikinyafilipine + Inyefaroyizi + Igifaransa + Igifiriziyani + Ikirilandi + Ikigaluwa cy'Igisweduwa + Ikigalisiya + Inyaguwarani + Inyegujarati + Igiheburayo + Igihindi + Igikorowasiya + Igihongiriya + Ikinyarumeniya + Ururimi Gahuzamiryango + Ikinyendoziya + Uruhuzandimi + Igisilande + Igitaliyani + Ikiyapani + Inyejava + Inyejeworujiya + Igikambodiya + Igikanada + Igikoreya + Inyekuridishi + Inkerigizi + Ikilatini + Ilingala + Ikilawotiyani + Ikilituwaniya + Ikinyaletoviyani + Ikimasedoniyani + Ikimalayalami + Ikimongoli + Ikimarati + Ikimalayi + Ikimaliteze + Ikinepali + Ikinerilande + Inyenoruveji (Nyonorusiki) + Ikinoruveji + Inyogusitani + Inyoriya + Igipunjabi + Igipolone + Impashito + Igiporutugali + Inyeporutigali (Brezili) + Inyeporutigali (Igiporutigali) + Ikinyarumaniya + Ikirusiya + Igisansikiri + Igisindi + Inyeseribiya na Korowasiya + Inyesimpaleze + Igisilovaki + Ikinyasiloveniya + Igisomali + Icyalubaniya + Igiseribe + Inyesesoto + Inyesudani + Igisuweduwa + Igiswahili + Igitamili + Igitelugu + Igitayi + Inyatigirinya + Inyeturukimeni + Inyekilingoni + Igiturukiya + Inyetuwi + Ikiwiguri + Ikinyayukereni + Inyeyurudu + Inyeyuzubeki + Ikinyaviyetinamu + Inyehawusa + Inyeyidishi + Inyezulu + + + Igitonga + + + + [a-z] + + + + + « + » + + + + + + + + mut. + gas. + wer. + mat. + gic. + kam. + nya. + kan. + nze. + ukw. + ugu. + uku. + + + Mutarama + Gashyantare + Werurwe + Mata + Gicuransi + Kamena + Nyakanga + Kanama + Nzeli + Ukwakira + Ugushyingo + Ukuboza + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + cyu. + mbe. + kab. + gtu. + kan. + gnu. + gnd. + + + Ku cyumweru + Kuwa mbere + Kuwa kabiri + Kuwa gatatu + Kuwa kane + Kuwa gatanu + Kuwa gatandatu + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + I1 + I2 + I3 + I4 + + + igihembwe cya mbere + igihembwe cya kabiri + igihembwe cya gatatu + igihembwe cya kane + + + + AM + PM + + + BCE + CE + + + + + + EEEE, yyyy MMMM dd + + + + + yyyy MMMM d + + + + + yyyy MMM d + + + + + yy/MM/dd + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1} {0} + + + + Q yy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + , + . + + + + F + + + + diff --git a/libs/Zend/Locale/Data/rw_RW.xml b/libs/Zend/Locale/Data/rw_RW.xml new file mode 100644 index 0000000..ac60d3b --- /dev/null +++ b/libs/Zend/Locale/Data/rw_RW.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/sa.xml b/libs/Zend/Locale/Data/sa.xml new file mode 100644 index 0000000..5022d5f --- /dev/null +++ b/libs/Zend/Locale/Data/sa.xml @@ -0,0 +1,259 @@ + + + + + + + + + + + अफर + अब्खासियन् + अचिनीस् + अचोलि + अडङ्गमे + अफ्रिक्कान्स् + आफ्रो एष्यन् भाषा + अफ्रिहिलि + अयिनु + अकन् + अक्काटियान् + अलियुट् + अल्गोण्क्यन् भाषा + अंहाऱिक् + अङ्गिक + अपाचे भाषा + अऱबिक् + प्राचीन ईजिप्त्यन् + पुरातन यवन भाषा + नोर्वीजियन् बॊकामल् + संस्कृत भाषा + अल्बेनियन् + आळटिक् भाषा + अज्ञात भाषा + + + + + + + + + + + + भारतम् + + + + [़ ँ-ः ॑-॔ ॐ अ-ऋ ॠ ऌ ॡ ए ऐ ओ-न र ल ळ व-ह ऽ-ॄ ॢ ॣ े ै ो-्] + [\u200C \u200D ०-९ ऍ ऑ ॅ ॉ] + [a-z] + + + + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + AM + PM + + + BCE + CE + + + + + + EEEE d MMMM yyyy + + + + + d MMMM yyyy + + + + + dd-MM-yyyy + + + + + d-MM-yy + + + + + + + hh:mm:ss a v + + + + + hh:mm:ss a z + + + + + hh:mm:ss a + + + + + hh:mm a + + + + + + + {1} {0} + + + + d MMMM + dd-MM + Q yy + MM-yyyy + MMMM yyyy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + + + + + + #,##,##0.### + + + + + + + #,##,##0% + + + + + + + ¤#,##,##0.00 + + + + + + रु + + + + diff --git a/libs/Zend/Locale/Data/sa_IN.xml b/libs/Zend/Locale/Data/sa_IN.xml new file mode 100644 index 0000000..21b98b7 --- /dev/null +++ b/libs/Zend/Locale/Data/sa_IN.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/se.xml b/libs/Zend/Locale/Data/se.xml new file mode 100644 index 0000000..fa43194 --- /dev/null +++ b/libs/Zend/Locale/Data/se.xml @@ -0,0 +1,656 @@ + + + + + + + + + + + afrikánsagiella + aragoniagiella + boares eaŋgalasgiella + apachegielat + arábagiella + asturiagiella + vilges-ruoššagiella + bulgáriagiella + bengalgiella + bretonagiella + bosniagiella + katalánagiella + kelttalaš gielat + marigiella + corsicagiella + čeahkagiella + dánskkagiella + duiskkagiella + greikkagiella + eaŋgalsgiella + spánskkagiella + esttegiella + persijagiella + suomagiella + fenno-ugrálaš gielat + fearagiella + fránskkagiella + friisagiella + iirragiella + germánalaš gielat + gujaratagiella + manksgiella + hindigiella + kroátiagiella + armeenalaš gielat + islánddagiella + itáliagiella + gárjilgiella + komigiella + kornagiella + láhtengiella + luxemburggagiella + liettuvagiella + látviagiella + mokšagiella + makedoniagiella + ersagiella + girjedárogiella + hollánddagiella + ođđadárogiella + dárogiella + oksitánagiella + polskkagiella + portugálagiella + retorománagiella + romániagiella + románalaš gielat + ruoššagiella + sardigiella + sisiliagiella + davvisámegiella + selkupagiella + slovákiagiella + slovenagiella + lullisámegiella + sámegielat + julevsámegiella + anárašgiella + nuortalašgiella + albánagiella + serbiagiella + ruoŧagiella + udmurtagiella + ukrainagiella + vallonagiella + sorbigiella + + + + + + + + máilbmi + Afrihkká + dávvi-Amerihkká ja gaska-Amerihkká + mátta-Amerihkká + Oseania + oarji-Afrihkká + gaska-Amerihkká + nuorta-Afrihkká + davvi-Afrihkká + gaska-Afrihkká + mátta-Afrihkká + Amerihkká + dávvi-Amerihkká + Karibia + nuorta-Ásia + mátta-Ásia + mátta-nuorta-Ásia + mátta-Eurohpá + Austrália ja Ođđa-Selánda + Melanesia + Polynesia + mátta-gaska-Ásia + Ásia + gaska-Ásia + oarji-Ásia + Eurohpá + nuorta-Eurohpá + davvi-Eurohpá + oarji-Eurohpá + Lulli-Amerihkká ja Karibia + Andorra + Ovttastuvvan Arábaemiráhtat + Afghanistan + Antigua ja Barbuda + Anguilla + Albánia + Armenia + Angola + Antárktis + Argentina + Amerihká Samoa + Nuortariika + Austrália + Aruba + Ålánda + Aserbaižan + Bosnia-Hercegovina + Barbados + Bangladesh + Belgia + Burkina Faso + Bulgária + Bahrain + Burundi + Benin + Bermuda + Brunei + Bolivia + Brasil + Bahamas + Bhutan + Botswana + Vilges-Ruošša + Belize + Kanáda + Kongo-Kinshasa + Kongo-Brazzaville + Šveica + Chile + Kamerun + Kiinná + Kolombia + Costa Rica + Kuba + Kap Verde + Kypros + Čeahkka + Duiska + Djibouti + Dánmárku + Dominica + Algeria + Ecuador + Estlánda + Egypta + Oarje-Sahára + Eritrea + Spánia + Etiopia + Suopma + Fijisullot + Falklandsullot + Mikronesia + Fearsullot + Frankriika + Gabon + Stuorra-Británnia + Grenada + Georgia + Frankriikka Guayana + Guernsey + Ghana + Gibraltar + Kalaallit Nunaat + Gámbia + Guinea + Guadeloupe + Ekvatoriála Guinea + Greika + Lulli Georgia ja Lulli Sandwich-sullot + Guatemala + Guam + Guinea-Bissau + Guyana + Hongkong + Honduras + Kroátia + Haiti + Ungár + Indonesia + Irlánda + Israel + India + Irak + Iran + Islánda + Itália + Jersey + Jamaica + Jordánia + Japána + Kenia + Kirgisistan + Kampučea + Kiribati + Komorosullot + Saint Kitts ja Nevis + Davvi-Korea + Mátta-Korea + Kuwait + Kasakstan + Laos + Libanon + Saint Lucia + Liechtenstein + Sri Lanka + Liberia + Lesotho + Lietuva + Luxembourg + Látvia + Libya + Marokko + Monaco + Moldávia + Montenegro + Madagaskar + Marshallsullot + Makedonia + Mali + Burma + Mongolia + Makáo + Davvi-Mariánat + Martinique + Mauretánia + Montserrat + Málta + Mauritius + Malediivvat + Malawi + Meksiko + Malesia + Mosambik + Namibia + Ođđa-Kaledonia + Niger + Nigeria + Nicaragua + Vuolleeatnamat + Norga + Nepal + Nauru + Niue + Ođđa-Selánda + Oman + Panama + Peru + Papua-Ođđa-Guinea + Filippiinnat + Pakistan + Polen + Saint Pierre ja Miquelon + Pitcairn + Puerto Rico + Palestina + Portugála + Palau + Paraguay + Qatar + EU + Reunion + Románia + Serbia + Ruošša + Rwanda + Saudi-Arábia + Seychellsullot + Sudan + Ruoŧŧa + Singapore + Saint Helena + Slovenia + Svalbárda ja Jan Mayen + Slovákia + Sierra Leone + San Marino + Senegal + Somália + Surinam + São Tomé ja Príncipe + El Salvador + Syria + Svazieana + Turks ja Caicos-sullot + Chad + Togo + Thaieana + Tažikistan + Tokelau + Nuorta-Timor + Turkmenistan + Tunisia + Tonga + Durka + Trinidad ja Tobago + Tuvalu + Taiwan + Tanzánia + Ukraina + Uganda + Amerihká ovttastuvvan stáhtat + Uruguay + Usbekistan + Vatikána + Saint Vincent ja Grenadine + Venezuela + Vietnam + Vanuatu + Wallis ja Futuna + Samoa + Jemen + Mayotte + Mátta-Afrihká + Zambia + Zimbabwe + + + kaleandar + valuhtta + + + SI + + + giella: {0} + + + + lowercase-words + lowercase-words + lowercase-words + lowercase-words + lowercase-words + lowercase-words + titlecase-words + lowercase-words + lowercase-words + + + [a á b c č d đ e-n ŋ o p r s š t ŧ u v z ž] + [à å ä æ ç é è ń ñ ó ò ö ø q ú ü w-y] + [a á à å ä æ b c č d đ e é è f-n ń ŋ o ó ò ö ø p-s š t ŧ u ú v x-z ž] + + + + + + + + + {0}–{1} + + + + + + ođđj + guov + njuk + cuo + mies + geas + suoi + borg + čakč + golg + skáb + juov + + + ođđajagemánnu + guovvamánnu + njukčamánnu + cuoŋománnu + miessemánnu + geassemánnu + suoidnemánnu + borgemánnu + čakčamánnu + golggotmánnu + skábmamánnu + juovlamánnu + + + + + O + G + N + C + M + G + S + B + Č + G + S + J + + + + + + + sotn + vuos + maŋ + gask + duor + bear + láv + + + sotnabeaivi + vuossárga + maŋŋebárga + gaskavahkku + duorasdat + bearjadat + lávvardat + + + + + s + v + m + g + d + b + l + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + AM + PM + + + Ovdal Kristtusa + + + OK + CE + + + + + + EEEE, yyyy MMMM dd + + + + + yyyy MMMM d + + + + + yyyy MMM d + + + + + yy/MM/dd + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1} {0} + + + + Q yy + + + + + jáhki + + + mánnu + + + váhkku + + + beaivi + + + váhkkubeaivi + + + tiibmu + + + minuhtta + + + sekunda + + + sone + + + + + + +HH:mm;−HH:mm + GMT{0} + {0} + {0} ({1}) + + + + + , +   + ; + % + 0 + # + + + + ×10^ + + + ¤¤¤ + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0 % + + + + + + + #,##0.00 ¤ + + + + + + suoma márkki + + + norgga kruvdno + + + ruoŧŧa kruvdno + + + silba + + + golli + + + + + + jo + ii + + + + diff --git a/libs/Zend/Locale/Data/se_FI.xml b/libs/Zend/Locale/Data/se_FI.xml new file mode 100644 index 0000000..7d86ac5 --- /dev/null +++ b/libs/Zend/Locale/Data/se_FI.xml @@ -0,0 +1,248 @@ + + + + + + + + + + fi-FI + + + ang + apa + be + cs + da + de + el + en + es + et + fi + fiu + fo + fr + gem + is + nb + nn + no + ru + se + sma + smi + smj + smn + sms + sv + + + Afrihká + Mátta-Amerihká + Oarji-Afrihká + 014 + Davvi-Afrihká + Gaska-Afrihká + Davvi-Amerihká + Nuorta-Ásia + Mátta-Ásia + Mátta-Eurohpa + Gaska-Ásia + Oarji-Ásia + Eurohpa + Nuorta-Eurohpá + Davvi-Eurohpa + Oarji-Eurohpa + AT + AU + AX + BE + BG + BR + BY + CH + CM + CN + CZ + DE + DK + EE + ES + FI + FO + FR + GL + GR + HR + HU + IE + IQ + IR + IS + IT + JP + KP + KR + LB + LT + LV + MA + MG + MH + MK + MP + MR + MV + MY + NL + NO + NZ + PH + PL + PS + RU + SE + SI + SJ + SK + SR + TD + TL + TR + US + ZA + + + calendar + currency + + + Metric + + + + + + + + + ođđajage + guovva + njukča + cuoŋo + miesse + geasse + suoidne + borge + čakča + golggot + skábma + juovla + + + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + aejlege + måanta + däjsta + gaskevahkoe + dåarsta + bearjadahke + laavadahke + + + + + S + M + D + G + D + B + L + + + + + + BCE + + + BCE + + + + + Year + + + Month + + + Week + + + Day + + + Day of the Week + + + Hour + + + Minute + + + Second + + + Zone + + + + + + {1} ({0}) + + + + + + FIM + + + NOK + + + SEK + + + XAG + + + XAU + + + + + + yes:y + no:n + + + + diff --git a/libs/Zend/Locale/Data/se_NO.xml b/libs/Zend/Locale/Data/se_NO.xml new file mode 100644 index 0000000..ffe5001 --- /dev/null +++ b/libs/Zend/Locale/Data/se_NO.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/sh.xml b/libs/Zend/Locale/Data/sh.xml new file mode 100644 index 0000000..fbccdaa --- /dev/null +++ b/libs/Zend/Locale/Data/sh.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/sh_BA.xml b/libs/Zend/Locale/Data/sh_BA.xml new file mode 100644 index 0000000..55d169b --- /dev/null +++ b/libs/Zend/Locale/Data/sh_BA.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/sh_CS.xml b/libs/Zend/Locale/Data/sh_CS.xml new file mode 100644 index 0000000..197f69e --- /dev/null +++ b/libs/Zend/Locale/Data/sh_CS.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/sh_YU.xml b/libs/Zend/Locale/Data/sh_YU.xml new file mode 100644 index 0000000..ce313d9 --- /dev/null +++ b/libs/Zend/Locale/Data/sh_YU.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/si.xml b/libs/Zend/Locale/Data/si.xml new file mode 100644 index 0000000..fbf2dde --- /dev/null +++ b/libs/Zend/Locale/Data/si.xml @@ -0,0 +1,239 @@ + + + + + + + + + + + සිංහල + + + + + + ශ්‍රී ලංකාව + + + දිනදසුන + මුදල් + + + බුද්‍ධ දිනදසුන + දිනදසුන + + + + [\u200C \u200D ං ඃ අ-ඖ ක-න ඳ-ර ල ව-ෆ ් ා-ු ූ ෘ-ෟ ෲ ෳ] + + + + + + + + ජන + පෙබ + මාර්ත + අප්‍රේල + මැය + ජූන + ජූල + අගෝ + සැප + ඔක + නොවැ + දෙසැ + + + ජනවාර + පෙබරවාර + මාර්ත + අප්‍රේල් + මැයි + ජූන + ජූලි + අගෝස්තු + සැප්තැම්බර් + ඔක්තෝබර් + නොවැම්බර් + දෙසැම්බර් + + + + + + පෙ + මා + + මැ + ජූ + ජූ + + සැ + + නො + දෙ + + + + + + + ඉරි + සඳු + අඟ + බදා + බ්‍රහ + සිකු + සෙන + + + ඉරිදා + සඳුදා + අඟහරුවාදා + බදාදා + බ්‍රහස්පතින්දා + සිකුරාදා + සෙනසුරාදා + + + + + + + + + බ්‍ර + සි + සෙ + + + + + + + කාර්:1 + කාර්:2 + කාර්:3 + කාර්:4 + + + 1 වන කාර්තුව + 2 වන කාර්තුව + 3 වන කාර්තුව + 4 වන කාර්තුව + + + + පෙ.ව. + ප.ව. + + + ක්‍රිස්තු පූර්‍ව + ක්‍රිස්තු වර්‍ෂ + + + ක්‍රි.පූ. + ක්‍රි.ව. + + + + + + EEEE, yyyy MMMM d + + + + + yyyy MMMM d + + + + + yyyy MMM d + + + + + yyyy/MM/dd + + + + + + + h:mm:ss a v + + + + + h:mm:ss a z + + + + + h:mm:ss a + + + + + h:mm a + + + + + + අද + හෙට + ඊයෙ + + + + + + + + ශ්‍රී ලංකා වේලාව + + + + + + + + + #,##,##0.### + + + + + + + #,##,##0% + + + + + + + ¤#,##,##0.00;(¤#,##,##0.00) + + + + + + ලංකා රුපියල + SL Re + + + + + + ඔව්:ඔ + නැත:නැ + + + diff --git a/libs/Zend/Locale/Data/si_LK.xml b/libs/Zend/Locale/Data/si_LK.xml new file mode 100644 index 0000000..81be1a6 --- /dev/null +++ b/libs/Zend/Locale/Data/si_LK.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/sid.xml b/libs/Zend/Locale/Data/sid.xml new file mode 100644 index 0000000..517ab79 --- /dev/null +++ b/libs/Zend/Locale/Data/sid.xml @@ -0,0 +1,256 @@ + + + + + + + + + + + Arabic + German + English + Spanish + French + Hindi + Italian + Japanese + Portuguese + Russian + Sidaamu Afo + Chinese + + + + + + Brazil + China + Germany + Itiyoophiya + France + United Kingdom + India + Italy + Japan + Russia + United States + + + + [a-z] + + + + + + + + Jan + Feb + Mar + Apr + May + Jun + Jul + Aug + Sep + Oct + Nov + Dec + + + January + February + March + April + May + June + July + August + September + October + November + December + + + + + J + F + M + A + M + J + J + A + S + O + N + D + + + + + + + Sam + San + Mak + Row + Ham + Arb + Qid + + + Sambata + Sanyo + Maakisanyo + Roowe + Hamuse + Arbe + Qidaame + + + + + S + S + M + R + H + A + Q + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + soodo + hawwaro + + + YIA + YIG + + + + + + EEEE, MMMM dd, yyyy + + + + + dd MMMM yyyy + + + + + dd-MMM-yyyy + + + + + dd/MM/yy + + + + + + + h:mm:ss a v + + + + + h:mm:ss a z + + + + + h:mm:ss a + + + + + h:mm a + + + + + + + {1} {0} + + + + dd MMMM + dd/MM + MM/yy + Q yy + MMMM yyyy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + + + ¤#,##0.00 + + + + + + Brazilian Real + + + Chinese Yuan Renminbi + + + $ + + + Euro + + + British Pound Sterling + + + Indian Rupee + + + Japanese Yen + + + Russian Ruble + + + US Dollar + + + + diff --git a/libs/Zend/Locale/Data/sid_ET.xml b/libs/Zend/Locale/Data/sid_ET.xml new file mode 100644 index 0000000..d859c1a --- /dev/null +++ b/libs/Zend/Locale/Data/sid_ET.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/sk.xml b/libs/Zend/Locale/Data/sk.xml new file mode 100644 index 0000000..34bfc14 --- /dev/null +++ b/libs/Zend/Locale/Data/sk.xml @@ -0,0 +1,1805 @@ + + + + + + + + + + + abcházsky + africký + ainský + akadský + amharský + arabský + umelý jazyk + asámsky + austrálsky jazyk + avarský + azerbajdžanský + baškírsky + balijský + baltský jazyk + bieloruský + berberský + bulharský + biharský + bengálsky + tibetský + bretónsky + bosniansky + katalánsky + jazyk stredoamerických indiánov + karibský + kaukazský jazyk + čečenský + keltský jazyk + český + walesky + dánsky + dakotský + nemecký + staroegyptský + grécky + anglický + anglický (Veľká Británia) + anglický (USA) + esperantsky + španielsky + estónsky + baskický + perzský + fínsky + filipínsky + ugrofínsky jazyk + faersky + francúzsky + frizijsky + írsky + škótskou gaelštinou + germánsky jazyk + galicijsky + guaransky + gotický + starogrécky + nemecký (Švajčiarsko) + gudžaratsky + havajský + hebrejský + hindština + chorvátsky + haitský + maďarský + arménsky + interlingua + indonézsky + interlingue + indoeurópsky jazyk + iránsky jazyk + islandský + taliansky + japonský + javanský + gruzínsky + konžský + kambodžský + kanadský + kórejský + kurdský + kyrgyzský + latinský + luxemburgský + lingalsky + laoský + litovský + lotyšský + macedónsky + malajalamsky + mongolský + marathsky + malajský + maltský + burmský + jazyk mayov + jazyk severoamerických indiánov + nepálsky + holandský + nórsky (nynorsk) + nórsky + jazyk navajov + okcitánsky + urijský + pandžábsky + papuánsky + poľský + paštúnsky + portugalský + rétorománsky + rumunský + ruský + sanskrtom + jazyk juhoamerických indiánov + sicílsky + sindhsky + znaková reč + srbochorvátsky + sinhalézsky + slovenský + slovinský + slovanský jazyk + somálsky + albánsky + srbský + sesothsky + sundsky + sumerský + švédsky + swahilsky + sýrsky + tamilský + telugsky + tadžidský + thajský + tigrinyjský + turkménsky + tagalogčina + klingonský + turecký + tatársky + twisky + tahitský + uighursky + ukrajinský + neznámy alebo neplatný jazyk + urdština + uzbecký + vietnamský + valónsky + wolof + xhosky + jidišsky + čínsky + čínština (zjednodušená) + čínština (tradičná) + zulu + bez jazykového obsahu + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Svet + Afrika + Severná Amerika (003) + Južná Amerika + Oceánia + Západná Afrika + Stredná Amerika + Východná Afrika + Severná Afrika + Stredná Afrika + Južná Afrika [018] + Americký kontinent + Severná Amerika + Karibik + Východná Ázia + Južná Ázia + Juhovýchodná Ázia + Južná Európa + Austrália a Nový Zéland + Melanézia + Mikronésia + Polynézia + Stredná a južná Ázia + Ázia + Stredná Ázia + Západná Ázia + Európa + Východná Európa + Severná Európa + Západná Európa + Spoločenstvo nezávislých štátov + Československo + Latinská Amerika a Karibik + Kanál La Manche + Andorra + Spojené arabské emiráty + Afganistan + Antigua a Barbados + Anguilla + Albánsko + Arménsko + Holandské Antily + Angola + Antarctica + Argentína + Americká Samoa + Rakúsko + Austrália + Aruba + Alandské ostrovy + Azerbajdžan + Bosna a Hercegovina + Barbados + Bangladéš + Belgicko + Burkina Faso + Bulharsko + Bahrajn + Burundi + Benin + Svätý Bartolomej + Bermudy + Brunej + Bolívia + Brazília + Bahamy + Bután + Bouvetov ostrov + Botswana + Bielorusko + Belize + Kanada + Kokosové (Keelingove) ostrovy + Konžská demokratická republika + Stredoafrická republika + Kongo + Švajčiarsko + Pobrežie Slonoviny + Cookove ostrovy + Čile + Kamerun + Čína + Kolumbia + Kostarika + Srbsko a Čierna Hora + Kuba + Kapverdy + Vianočný ostrov + Cyprus + Česká republika + Nemecko + Džibuti + Dánsko + Dominika + Dominikánska republika + Alžírsko + Ekvádor + Estónsko + Egypt + Západná Sahara + Eritrea + Španielsko + Etiópia + Fínsko + Fidži + Falklandské ostrovy + Mikronézia, Federatívne štáty + Faerské ostrovy + Francúzsko + Gabon + Spojené kráľovstvo + Grenada + Gruzínsko + Francúzska Guayana + Guernsey + Ghana + Gibraltár + Grónsko + Gambia + Guinea + Guadeloupe + Rovníková Guinea + Grécko + Južná Georgia a Južné Sandwichove ostrovy + Guatemala + Guam + Guinea-Bissau + Guayana + Hong Kong + Heardove ostrovy a McDonaldove ostrovy + Honduras + Chorvátsko + Haiti + Maďarsko + Indonézia + Írsko + Izrael + Ostrov Man + India + Britské územie v Indickom oceáne + Irak + Irán + Island + Taliansko + Jersey + Jamajka + Jordánsko + Japonsko + Keňa + Kirgizsko + Kambodža + Kiribati + Komory + Saint Kitts a Nevis + Kórea, Severná + Kórea, Južná + Kuvajt + Kajmanské ostrovy + Kazachstan + Laoská ľudovodemokratická republika + Libanon + Svätá Lucia + Lichtenštajnsko + Srí Lanka + Libéria + Lesotho + Litva + Luxembursko + Lotyšsko + Lýbijská arabská džamahírija + Maroko + Monako + Moldavsko, republika + Čierna Hora + Svätý Martin + Madagaskar + Marshallove ostrovy + Macedónsko, republika + Mali + Mjanmarsko + Mongolsko + Macao + Severné Mariány + Martinik + Mauritánia + Montserrat + Malta + Maurícius + Maldivy + Malawi + Mexiko + Malajzia + Mozambik + Namíbia + Nová Kaledónia + Niger + Norfolkov ostrov + Nigéria + Nikaragua + Holandsko + Nórsko + Nepál + Nauru + Niue + Nový Zéland + Omán + Panama + Peru + Francúzska Polynézia + Papua Nová Guinea + Filipíny + Pakistan + Poľsko + Saint Pierre a Miquelon + Pitcairnove ostrovy + Portoriko + Palestínske územie + Portugalsko + Palau + Paraguaj + Katar + Tichomorie - ostatné + Európska únia + Reunion + Rumunsko + Srbsko + Ruská federácia + Rwanda + Saudská Arábia + Šalamúnove ostrovy + Seychelské ostrovy + Sudán + Švédsko + Singapur + Svätá Helena + Slovinsko + Špicbergy a Jan Mayen + Slovenská republika + Sierra Leone + San Maríno + Senegal + Somálsko + Surinam + Svätý Tomáš a Princove ostrovy + Salvador + Sýrska arabská republika + Svazijsko + Turks a Caicos + Čad + Francúzske južné územia + Togo + Thajsko + Tadžikistan + Tokelau + Východný Timor + Turkménsko + Tunisko + Tonga + Turecko + Trinidad a Tobago + Tuvalu + Tajwan + Tanzánia + Ukrajina + Uganda + Menšie odľahlé ostrovy USA + Spojené štáty + Uruguaj + Uzbekistan + Svätá stolica (Vatikánsky mestský štát) + Svätý Vincent a Grenadíny + Venezuela + Britské panenské ostrovy + Panenské ostrovy - USA + Vietnam + Vanuatu + Wallis a Futuna + Samoa + Jemen + Mayotte + Južná Afrika + Zambia + Zimbabwe + Neznámy alebo neplatný región + + + Kalendár + Triedenie + Mena + + + Tradičný čínsky Big5 + Buddhistický kalendár + Čínsky kalendár + Priame triedenie + Zjednodušený čínsky GB2312 + Gregoriánsky kalendár + Židovský kalendár + Indický národný kalendár + Islamský kalendár + Islamský občiansky kalendár + Japonský kalendár + Lexikografické triedenie + Triedenie pinyin + Kalendár Čínskej republiky + Tiedenie podľa ťahov + Tradičné + + + Americký + Metrický + + + Jazyk: {0} + Skript: {0} + Región: {0} + + + + [a á ä b c č d ď e é f-h {ch} i í j-l ĺ ľ m n ň o ó ô p-r ŕ s š t ť u ú v-y ý z ž] + [á à ă â å ā æ ä ç é è ĕ ê ë ē í ì ĭ î ï ī ñ ó ò ŏ ö ø ō œ ô ß ú ù ŭ û ü ū ÿ] + + + + + + + + + GanjkHmsSEDFwWxhKzAeugXZvcL + + + + + + jan + feb + mar + apr + máj + jún + júl + aug + sep + okt + nov + dec + + + január + február + marec + apríl + máj + jún + júl + august + september + október + november + december + + + + + j + f + m + a + m + j + j + a + s + o + n + d + + + + + + + Ne + Po + Ut + St + Št + Pi + So + + + Nedeľa + Pondelok + Utorok + Streda + Štvrtok + Piatok + Sobota + + + + + N + P + U + S + Š + P + S + + + + + + + Q1 + Q2 + Q3 + Q4 + + + 1. štvrťrok + 2. štvrťrok + 3. štvrťrok + 4. štvrťrok + + + + AM + PM + + + pred n.l. + n.l. + + + + + + EEEE, d. MMMM yyyy + + + + + d. MMMM yyyy + + + + + d.M.yyyy + + + + + d.M.yyyy + + + + + + + H:mm:ss v + + + + + H:mm:ss z + + + + + H:mm:ss + + + + + H:mm + + + + + + + {1} {0} + + + + d. MMMM + d.M + mm:ss + Q yy + QQQQ yy + M.yyyy + MMMM yyyy + + + {0} - {1} + + M.-M. + + + E, d.M. - E, d.M. + E, d.M. - E, d.M. + + + MMM-MMM + + + E, d. MMM - E, d. MMM + E, d. - E, d. MMM + + + LLLL-LLLL + + + d. MMM - d. MMM + d.-d. MMM + + + d.M. - d.M. + d.M. - d.M. + + + d.-d. + + + HH-HH + H-H + + + HH:mm-HH:mm + H:mm-H:mm + H:mm-H:mm + + + HH:mm-HH:mm v + H:mm-H:mm v + H:mm-H:mm v + + + HH-HH v + H-H v + + + y-y + + + M.yyyy - M.yyyy + M.yyyy - M.yyyy + + + E, d.M.yyyy - E, d.M.yyyy + E, d.M.yyyy - E, d.M.yyyy + E, d.M.yyyy - E, d.M.yyyy + + + MMM-MMM yyyy + MMM yyyy - MMM yyyy + + + E, d. MMM - E, d. MMM yyyy + E, d. - E, d. MMM yyyy + E, d. MMM yyyy - E, d. MMM yyyy + + + d. MMM - d. MMM yyyy + d.-d. MMM yyyy + d. MMM yyyy - d. MMM yyyy + + + d.M.yyyy - d.M.yyyy + d.M.yyyy - d.M.yyyy + d.M.yyyy - d.M.yyyy + + + + + + éra + + + rok + + + mesiac + + + týždeň + + + deň + dnes + zajtra + pozajtra + o tri dni + včera + predvčerom + pred tromi dňami + + + deň v týždni + + + hodina + + + minúta + + + sekunda + + + zóna + + + + + + +HHmm;-HHmm + GMT{0} + {0} + + Neznáme časové pásmo + + + Južný pól + + + Dumont D'Urville + + + Bermudy + + + Veľkonočné ostrovy + + + Šanghaj + + + Kostarika + + + Kapverdy + + + Džibutsko + + + Dominika + + + Galapágy + + + Kanárske ostrovy + + + Fidži + + + Londýn + + + Gibraltár + + + Hongkong + + + Jamajka + + + St. Kitts + + + Kuvajt + + + St. Lucia + + + Luxembursko + + + Monako + + + Ulanbátar + + + Macao + + + Martinik + + + Maurícius + + + Maledivy + + + Pitcairnove ostrovy + + + Portoriko + + + Azorské ostrovy + + + Lisabon + + + Katar + + + Moskva + + + Jekaterinburg + + + Krasnojarsko + + + Irkutsko + + + Jakutsko + + + Sachalin + + + Kamčatka + + + Singapur + + + Salvádor + + + Užhorod + + + Kyjev + + + Záporožie + + + Aljaška + + + New Salem, Severná Dakota + + + Taškent + + + St. Vincent + + + St. Thomas + + + + + + , +   + + + + + #,##0.00 ¤ + + + + + + Andorská peseta + + + UAE dirham + + + Albánsky lek + lek + + + Armenský dram + dram + + + Nizozemský Antilský guilder + NA f. + + + Angolská kwanza + + + Angolská kwanza (1977-1990) + + + Angolská nová kwanza (1990-2000) + + + Angolská kwanza Reajustado (1995-1999) + + + Argentinský austral + + + Argentinské peso (1983-1985) + + + Argentinské peso + Arg$ + + + Rakúsky šiling + + + Austrálsky dolár + $A + + + Arubský guilder + + + Azerbaidžanský manat + + + Bosnianský dinár + + + Bosnianský konvertibilná marka + KM + + + Barbadoský dolár + BDS$ + + + Bangladéšska taka + Tk + + + Belgický frank (konvertibilný) + + + Belgický frank + BF + + + Belgický frank (finančný) + + + Bulharský leva + lev + + + Bulharský leva nový + + + Bahraiský dinár + BD + + + Burundský frank + Fbu + + + Bermudský dolár + Ber$ + + + Bruneiský dolár + + + Bolívijské Boliviano + + + Bolivíjske peso + + + Bolivíjske mvdol + + + Bolivíjske Cruzeiro Novo (1967-1986) + + + Bolivíjske cruzado + + + Bolivíjske cruzeiro (1990-1993) + + + Bolivíjsky real + + + Brazílske Cruzado Novo + + + Brazílske cruzeiro + + + Bahamský dolár + + + Bhutansky ngultrum + Nu + + + Burmese Kyat + + + Botswanan Pula + + + Belarussian nový rubeľ (1994-1999) + + + Belarussian rubeľ + Rbl + + + Belize dolár + BZ$ + + + Kanadský dolár + Can$ + + + Konžský frank Congolais + + + Švajčiarský frank + SwF + + + Čílske Unidades de Fomento + + + Čílske peso + Ch$ + + + Čínsky Yuan Renminbi + Y + + + Colombijské peso + Col$ + + + Kostarikský colon + C + + + Československá koruna + + + Kubánske peso + + + Cape Verde eskudo + CVEsc + + + Cypruská libra + £C + + + Česká koruna + + + Východonemecká marka + + + Nemecká marka + + + Džibutský frank + DF + + + Dánska krone + DKr + + + Dominikánske peso + RD$ + + + Alžírsky dinár + DA + + + Ekuadorský sucre + + + Ekuadorský Unidad de Valor Constante (UVC) + + + Estónska kroon + + + Egyptská libra + + + Eritrejská nakfa + + + Španielská peseta + + + Ethiopský birr + Br + + + Euro + + + Finská marka + + + Fiji dolár + F$ + + + Falklandská libra + + + Francúzsky frank + + + Britská libra + + + Gruzínsky Kupon Larit + + + Gruzínsky lari + lari + + + Ghanský cedi + + + Gibraltarská libra + + + Gambský dalasi + + + Guinejský frank + GF + + + Guinejský syli + + + Rovníková Guinea Ekwele Guineana + + + Grécka drachma + + + Guatemalský quetzal + Q + + + Portugalská Guinea eskudo + + + Guinea-Bissau peso + + + Guyanský dolár + G$ + + + Hong Kongský dolár + HK$ + + + Hoduraská lempira + L + + + Chorvátsky dinár + + + Chorvátska kuna + + + Haitské gourde + + + Maďarský forint + Ft + + + Indonézska rupia + Rp + + + Írska libra + IR£ + + + Izraelská libra + + + Izraelský šekel + + + Indijská rupia + INR + + + Iracký dinár + ID + + + Iránsky rial + RI + + + Islandská krona + + + Talianská lira + + + Jamajský dolár + J$ + + + Jordánsky dinár + JD + + + Japonský yen + + + Keňský šiling + K Sh + + + Kyrgyský som + som + + + Kambodžský riel + CR + + + Comoro frank + CF + + + Severokórejský won + + + Juhokórejský won + + + Kuvaitský dinár + KD + + + Kajmanský dolár + + + Kazažský tenge + T + + + Laoský kip + + + Libanonská libra + LL + + + Šrilanská rupia + SL Re + + + Libérský dolár + + + Lesothský loti + M + + + Litevská lita + + + Litevský talonas + + + Luxemburský frank + + + Lotyšský lats + + + Lotyšský rubeľ + + + Libyjský dinár + LD + + + Marocký dirham + + + Marocký frank + + + Moldavský leu + + + Madagaskarský ariary + + + Madagaskarský frank + + + Macedónsky denár + MDen + + + Malský frank + + + Myanmarský kyat + + + Mongolský tugrik + Tug + + + Macao Pataca + + + Mauritania Ouguiya + UM + + + Maltská lira + Lm + + + Maltská libra + + + Mauritská rupia + + + Maldivská rufiyaa + + + Malavská kwacha + MK + + + Mexické peso + MEX$ + + + Mexické striborné peso (1861-1992) + + + Mexické Unidad de Inversion (UDI) + + + Malajský ringgit + RM + + + Mozambijské eskudo + + + Mozambijské metical + Mt + + + Namibský dolár + N$ + + + Nigerská naira + + + Nikaragujská cordoba + + + Nikaragujská Cordoba Oro + + + Nizozemský guilder + + + Nórksy krone + NKr + + + Nepálska rupia + Nrs + + + Novozélandský dolár + $NZ + + + Ománský rial + RO + + + Panamská balboa + + + Peruvský inti + + + Peruvský sol Nuevo + + + Peruvský sol + + + Papua Nová Guinea kina + + + Filipínske peso + + + Pakistanská rupia + Pra + + + Polský zloty + Zl + + + Polský zloty (1950-1995) + + + Portugalské eskudo + + + Paraguayské guarani + + + Qatarský rial + QR + + + Rumunský leu + leu + + + Rumunský Lei + + + Srbský dinár + + + Ruský rubeľ + + + Ruský rubeľ (1991-1998) + + + Rwandský frank + + + Saudský riyal + SRl + + + Solomon Islands dolár + SI$ + + + Sejšelská rupia + SR + + + Sudánsky dinár + + + Sudánska libra + + + Švédska krona + SKr + + + Singapúrsky dolár + S$ + + + Libra + + + Slovinský Tolar + + + Slovenská koruna + Sk + + + Sierra Leone Leone + + + Somálsky šiling + Sh. + + + Surinamský guilder + Sf + + + Sao Tome a Principe dobra + Db + + + Sovietský rubeľ + + + El Salvadorský colon + + + Syrská libra + LS + + + Swaziland lilangeni + E + + + Thajský bát + + + Tadžikistanský rubeľ + + + Tadžikistanský somoni + + + Turkménsky manat + + + Tuniský dinár + + + Tonga Paʻanga + T$ + + + Timorské eskudo + + + Turecká lira + TL + + + Nová turecká líra + + + Trinidad a Tobago dolár + TT$ + + + Taiwanský nový dolár + NT$ + + + Tanzanský šiling + T Sh + + + Ukrainská hrivna + + + Ukrainský karbovanetz + + + Ugandan šiling (1966-1987) + + + Ugandský šiling + U Sh + + + US dolár + + + US dolár (Next day) + + + US dolár (Same day) + + + Uruguajské peso (1975-1993) + + + Uruguajské peso Uruguayo + Ur$ + + + Uzbekistanský sum + + + Venezuelský bolivar + Be + + + Vietnamský dong + + + Vanuatu vatu + VT + + + Západná Samoa tala + + + CFA frank BEAC + + + Zlato + + + East Caribbean dolár + EC$ + + + Špeciálne práva čerpania + + + Francúzsky zlatý frank + + + Francúzsky UIC-frank + + + CFA frank BCEAO + + + CFP frank + CFPF + + + Jemenský dinár + + + Jemenský rial + YRl + + + Juhoslávsky dinár [YUD] + + + Juhoslávsky Noviy dinár + + + Juhoslávsky dinár + + + Juhoafrický rand (financial) + + + Juhoafrický rand + R + + + Zambská kwacha + + + Zairský nový zaire + + + Zairský Zaire + + + Zimbabský dolár + Z$ + + + + + + ano:a + nie:n + + + diff --git a/libs/Zend/Locale/Data/sk_SK.xml b/libs/Zend/Locale/Data/sk_SK.xml new file mode 100644 index 0000000..2abb487 --- /dev/null +++ b/libs/Zend/Locale/Data/sk_SK.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/sl.xml b/libs/Zend/Locale/Data/sl.xml new file mode 100644 index 0000000..3f0ec0f --- /dev/null +++ b/libs/Zend/Locale/Data/sl.xml @@ -0,0 +1,1380 @@ + + + + + + + + + + + {0} ({1}) + , + + + afar + abhaščina + afrikanščina + amharščina + arabščina + asamščina + ajmara + azerbajdžanščina + baškirščina + beloruščina + bolgarščina + bihari + bengalščina + bretonščina + bosanščina + katalonščina + češčina + valižanščina + danščina + nemščina + grščina + angleščina + angleščina (VB) + angleščina (ZDA) + esperanto + španščina + estonščina + baskovščina + perzijščina + finščina + tagalogščina + ferščina + francoščina + frizijščina + irščina + škotska galščina + galicijščina + gvaranijščina + gudžarati + hebrejščina + hindijščina + hrvaščina + madžarščina + armenščina + interlingua + indonezijščina + jeziki + islandščina + italijanščina + japonščina + javanščina + gruzinščina + kamboščina + kanada + korejščina + kašmirščina + kurdščina + kirgizijščina + latinščina + luksemburščina + lingala + laoščina + litovščina + letonščina + makedonščina + malajalamščina + mongolščina + maharaščina + malajščina + malteščina + burmanščina + nepalščina + nizozemščina + novonorveščina + norveščina + okcitanščina + orijščina + pandžabščina + poljščina + paštu + portugalščina + iberska portugalščina + reto-romanščina + romunščina + ruščina + sanskrt + sindi + srbohrvaščina + singalščina + slovaščina + slovenščina + somalščina + albanščina + srbščina + sesoto + sundanščina + švedščina + svahili + tamilščina + telugijščina + tajščina + tigrejščina + turkmenščina + tagalog + klingonščina + turščina + tvi (dialekt jezika akan) + ujgurščina + ukrajinščina + Neznan ali neveljaven jezik + urdu + uzbekistanščina + vietnamščina + volofščina + xhosa + jidiš + kitajščina + poenostavljena kitajščina + tradicionalna kitajščina + zulujščina + + + + + + + + + + + + + + + + + + Svet + Afrika + Južna Amerika + Oceanija + Zahodna Afrika + Centralna Amerika + Vzhodna Afrika + Severna Afrika + Centralna Afrika + Južna Afrika [018] + Amerike + Severna Amerika + Karibi + Vzhodna Azija + Južna Azija + Jugovzhodna Azija + Južna Evropa + Avstralija i Nova Zelandija + Melanezija + Micronezija + Polinezija + Južno-centralna Azija + Azija + Osrednja Azija + Zahodna Azija + Evropa + Vzhodna Evropa + Severna Evropa + Zapadna Evropa + Skupnost neodvisnih držav + Latinska Amerika in Karibsko otočje + Kanalski otoki + Andora + Združeni arabski emirati + Afganistan + Antigva in Barbuda + Angvila + Albanija + Armenija + Nizozemski Antili + Angola + Antarktika + Argentina + Ameriška Samoa + Avstrija + Avstralija + Aruba + Alandski otoki + Azerbajdžan + Bosna in Hercegovina + Barbados + Bangladeš + Belgija + Burkina Faso + Bolgarija + Bahrajn + Burundi + Benin + Bermuda + Brunej + Bolivija + Brazilija + Bahami + Butan + Otok Bouvet + Bocvana + Belorusija + Belize + Kanada + Kokosovi otoki + Demokratična republika Kongo + Centralnoafriška republika + Kongo + Švica + Slonokoščena obala + Cookovi otoki + Čile + Kamerun + Kitajska + Kolumbija + Kostarika + Srbija in Črna gora + Kuba + Kapverdski otoki + Božični otok + Ciper + Češka + Nemčija + Džibuti + Danska + Dominika + Dominikanska republika + Alžirija + Ekvador + Estonija + Egipt + Zahodna Sahara + Eritreja + Španija + Etiopija + Finska + Fidži + Falklandski (Malvinski) otoki + Mikronezija + Fererski otoki + Francija + Gabon + Velika Britanija + Grenada + Gruzija + Francoska Gvajana + Guernsey + Gana + Gibraltar + Grenlandija + Gambija + Gvineja + Guadeloupe + Ekvatorialna Gvineja + Grčija + Južna Georgija in Južni Sandwich Islands + Gvatemala + Guam + Gvineja Bissau + Gvajana + Hong Kong S.A.R. Kitajske + Heardov otok in McDonaldovi otoki + Honduras + Hrvaška + Haiti + Madžarska + Indonezija + Irska + Izrael + Otok Man + Indija + Britanska Indija + Irak + Iran + Islandija + Italija + Jersey + Jamajka + Jordan + Japonska + Kenija + Kirgizistan + Kambodža + Kiribati + Komori + Saint Kitts in Nevis + Severna Koreja + Južna Koreja + Kuvajt + Kajmanski otoki + Kazahstan + Ljudska demokratična republika Laos + Libanon + Saint Lucia + Liechtenstein + Šrilanka + Liberija + Lesoto + Litva + Luxemburg + Latvija + Libija + Maroko + Monako + Republika Moldova + Črna gora + Madagaskar + Marshallovi otoki + Republika Makedonija + Mali + Myanmar + Mongolija + Makao S.A.R. Kitajske + Severni Marianski otoki + Martinik + Mavretanija + Montserrat + Malta + Mauritius + Maldivi + Malavi + Mehika + Malezija + Mozambik + Namibija + Nova Kaledonija + Niger + Otok Norfolk + Nigerija + Nikaragva + Nizozemska + Norveška + Nepal + Nauru + Niue + Nova Zelandija + Oman + Panama + Peru + Francoska Polinezija + Papua Nova Gvineja + Filipini + Pakistan + Poljska + Saint Pierre in Miquelon + Pitcairn + Portoriko + Palestinsko ozemlje + Portugalska + Palau + Paragvaj + Katar + Ostala oceanija + Evropska unija + Reunion + Romunija + Srbija + Ruska federacija + Ruanda + Saudova Arabija + Salomonovo otočje + Sejšeli + Sudan + Švedska + Singapur + Sveta Helena + Slovenija + Svalbard in Jan Mayen + Slovaška + Sierra Leone + San Marino + Senegal + Somalija + Surinam + Sao Tome in Principe + Salvador + Sirija + Svazi + Otočji Turks in Caicos + Čad + Francoski južni teritorij + Togo + Tajska + Tadžikistan + Tokelau + Vzhodni Timor + Turkmenistan + Tunizija + Tonga + Turčija + Trinidad in Tobago + Tuvalu + Tajvan + Tanzanija + Ukrajina + Uganda + Ameriški manjši oddaljeni otoki + Združene države Amerike + Urugvaj + Uzbekistan + Vatikan + Saint Vincent in Grenadine + Venezuela + Britanski Deviški otoki + Ameriški Deviški otoki + Vietnam + Vanuatu + Wallis in Futuna + Samoa + Jemen + Mayotte + Južna Afrika + Zambija + Zimbabve + Neznana ali neveljavna regija + + + armenska (vzhodna) + armenska (zahodna) + + + Kolendar + Zlaganje + Valuta + + + Razvrščanje po sistemu tradicionalne kitajščine - Big5 + Budistični kolendar + Kitajski kolendar + Direktno zlaganje + Razvrščanje po sistemu poenostavljene kitajščine - GB2312 + Gregorijanski kolendar + Hebrejski kolendar + Islamski kolendar + Islamski civilni kolendar + Japonski kolendar + Zlaganje po abecedi + Pinyin zlaganje + Stroke order zlaganje + Tradicionano zlaganje + + + Imperialni + Metrični + + + Jezik: {0} + Regija: {0} + + + + lowercase-words + + + [a-c č d-p r s š t-v z ž] + [q w-y] + + + » + « + + + + + GanjkHmsSEDFwWxhKzAeugXZvcL + + + + + + jan + feb + mar + apr + maj + jun + jul + avg + sep + okt + nov + dec + + + januar + februar + marec + april + maj + junij + julij + avgust + september + oktober + november + december + + + + + j + f + m + a + m + j + j + a + s + o + n + d + + + + + + + ned + pon + tor + sre + čet + pet + sob + + + nedelja + ponedeljek + torek + sreda + četrtek + petek + sobota + + + + + n + p + t + s + č + p + s + + + + + + + Q1 + K2 + Q3 + Q4 + + + Prvo četrtletje + Q2 + Tretje četrtletje + Četrto četrtletje + + + + dop. + pop. + + + pred našim štetjem + naše štetje + + + pr.n.š. + po Kr. + + + + + + EEEE, dd. MMMM yyyy + + + + + dd. MMMM yyyy + + + + + d.M.yyyy + + + + + d.M.yy + + + + + + + H:mm:ss v + + + + + H:mm:ss z + + + + + H:mm:ss + + + + + H:mm + + + + + + + {1} {0} + + + + HH:mm + HH:mm:ss + d MMMM + dd. MMMM + d.M + mm:ss + Q yy + M.yyyy + MMMM yyyy + + + {0} - {1} + + M.-M. + + + E, d.M. - E, d.M. + E, d.M. - E, d.M. + + + MMM-MMM + + + E, dd. MMM - E, dd. MMM + E, dd. - E, dd. MMM + + + dd. MMM - dd. MMM + dd.-dd. MMM + + + d.M. - d.M. + d.M. - d.M. + + + d.-d. + + + H-H + + + H:mm-H:mm + H:mm-H:mm + + + H:mm-H:mm v + H:mm-H:mm v + + + H-H v + + + y-y + + + M.yy - M.yy + M.yy - M.yy + + + E, d.M.yy - E, d.M.yy + E, d.M.yy - E, d.M.yy + E, d.M.yy - E, d.M.yy + + + MMM-MMM yyyy + MMM yyyy - MMM yyyy + + + E, dd. MMM - E, dd. MMM yyyy + E, dd. - E, dd. MMM yyyy + E, dd. MMM yyyy - E, dd. MMM yyyy + + + dd. MMM - dd. MMM yyyy + dd.-dd. MMM yyyy + dd. MMM yyyy - dd. MMM yyyy + + + d.M.yy - d.M.yy + d.M.yy - d.M.yy + d.M.yy - d.M.yy + + + + + + Doba + + + Leto + + + Mesec + + + Teden + + + dan + danes + Jutri + pojutrišnjem + čez tri dni + včeraj + predvčerajšnjim + pred tremi dnevi + + + Dan v tednu + + + Čas dneva + + + Ura + + + Minuta + + + Sekunda + + + Območje + + + + + + +HHmm;-HHmm + GMT{0} + {0} + {1} ({0}) + + Neznano + + + Andora + + + Dubaj + + + Tirana + + + Erevan + + + Južni pol + + + Dumont D'Urville + + + Dunaj + + + Daka + + + Bruselj + + + Sofija + + + Bahrajn + + + Bermudi + + + Brunej + + + St Johns + + + Kokosovi + + + Kinšasa + + + Lubumbaši + + + Abidžan + + + Velikonočni otok + + + Šangaj + + + Kostarika + + + Zelenortski otoki + + + Božični + + + Nikozija + + + Džibuti + + + Kopenhagen + + + Dominika + + + Alžir + + + Talin + + + Kairo + + + Kanarski otoki + + + Adis Abeba + + + Fidži + + + Ferski otoki + + + Pariz + + + Akra + + + Gvadelupe + + + Atene + + + Gvatemala + + + Bisau + + + Gvajana + + + Hongkong + + + Budimpešta + + + Džakarta + + + Bagdad + + + Teheran + + + Rim + + + Jamajka + + + Aman + + + Tokio + + + Biškek + + + St. Kitts + + + Pjongjang + + + Seul + + + Kuvajt + + + Kajman + + + Almati + + + Bejrut + + + St. Lucia + + + Vilna + + + Luksemburg + + + Monako + + + Ulan Bator + + + Macao + + + Martinik + + + Maldivi + + + Karači + + + Varšava + + + Portoriko + + + Azori + + + Lizbona + + + Katar + + + Bukarešta + + + Moskva + + + Jekaterinburg + + + Krasnojarsk + + + Kamčatka + + + Anadir + + + Rijad + + + Kartum + + + Singapur + + + St. Helena + + + Mogadiš + + + Salvador + + + Damask + + + Ašgabat + + + Darussalam + + + Užgorod + + + Kijev + + + Zaporožje + + + New Salem + + + Center + + + Vincennes + + + Petersburg + + + Tell City + + + Knox + + + Winamac + + + Marengo + + + Vevay + + + Monticello + + + Taškent + + + St. Vincent + + + St. Thomas + + + Sajgon + + + + Srednjeevropski čas + Srednjeevropski poletni čas + + + + + Vzhodnoevropski čas + Vzhodnoevropski poletni čas + + + + + + + , + . + ; + % + 0 + # + + + - + E + + + NaN + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + #,##0.00 ¤ + + + + + + dirham Združenih Arabskih Emiratov + + + argentinski peso + + + avstralski dolar + + + bolgarski lev + + + brunejski dolar + + + bolivijski boliviano + + + Brazilski Real + + + kanadski dolar + + + švicarski frank + + + čilski peso + + + Kitajski Yuan Renminbi + + + kolumbijski peso + + + češka krona + + + nemška marka + + + danska krone + + + estonska krona + + + egiptovski funt + + + Evro + + + fidžijski dolar + + + francoski frank + + + Britanski Funt Sterling + + + hongkonški dolar + + + hrvaška kuna + + + madžarski forint + + + indonezijska rupija + + + izraelski šekel + + + Indijski Rupi + + + Japonski Jen + + + kenijski šiling + + + južnokorejski von + + + litovski litas + + + maroški dirham + + + malteška lira + + + mehiški peso + + + malezijski ringgit + + + norveška krona + + + novozelandski dolar + + + perujski novi sol + + + filipinski peso + + + pakistanska rupija + + + poljski novi zlot + + + romunski leu + + + srbski dinar + + + Ruska Rublja + + + saudski rial + + + švedska krona + + + singapurski dolar + + + Slovenski tolar + + + slovaška krona + + + tajski baht + + + turška lira + + + nova turška lira + + + novi tajvanski dolar + + + ukrajinska grivna + + + Ameriški Dolar + + + venezuelski bolivar + + + vientnamski dong + + + Neznana ali neveljavna valuta + XXX + + + južnoafriški rand + + + + + + {0} dnevi + {0} dan + {0} dni + {0} dni + + + {0} ure + {0} ura + {0} ur + {0} uri + + + {0} minute + {0} minuta + {0} minut + {0} minuti + + + {0} meseci + {0} mesec + {0} meseci + {0} meseca + + + {0} sekunde + {0} sekunda + {0} sekund + {0} sekundi + + + {0} tedni + {0} teden + {0} tednov + {0} tedna + + + {0} leta + {0} leto + {0} let + {0} leti + + + + + da:d:ja:j + no:NO:n:N:ne:NE + + + diff --git a/libs/Zend/Locale/Data/sl_SI.xml b/libs/Zend/Locale/Data/sl_SI.xml new file mode 100644 index 0000000..885caa7 --- /dev/null +++ b/libs/Zend/Locale/Data/sl_SI.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/so.xml b/libs/Zend/Locale/Data/so.xml new file mode 100644 index 0000000..76595f8 --- /dev/null +++ b/libs/Zend/Locale/Data/so.xml @@ -0,0 +1,568 @@ + + + + + + + + + + + Afrikaanays + Amhari + Carabi + Asaamiis + Azerbaijan + Beleruusiyaan + Bulgeeriyaan + Bixaari + Bangaali + Bereton + Boosniya + Katalaan + Jeeg + Welsh + Danmarkays + Jarmal + Jarmal (Iswiiserlaand) + Giriik + Ingiriisi + Ingiriisi (Boqortooyada Midowday) + Ingiriisi (Maraykan) + Isberento + Isbaanish + Isbaanishka Laatiin Ameerika + Isbaanish (Isbayn) + Istooniyaan + Basquu + Faarisi + Fiinlaandees + Tagalog + Farowsi + Faransiis + Faransiis (Iswiiserlaand) + Firiisiyan Galbeed + Ayrish + Iskot Giilik + Galiisiyaan + Guraani + Gujaraati + Cibri + Hindi + Koro'eeshiyaan + Hangariyaan + Armeeniyaan + Interlinguwa + Indunuusiyaan + Interlingue + Ayslandays + Talyaani + Jabbaaniis + Jafaaniis + Joorijiyaan + Kamboodhian + Kannadays + Kuuriyaan + Kurdishka + Kirgiis + Laatiin + Lingala + Laothian + Lituwaanays + Laatfiyaan + Masadooniyaan + Malayalam + Mangooli + Maarati + Malaay + Maltiis + Nebaali + Holandays + Nowrwejiyan (naynoroski) + Af Noorwiijiyaan + Okitaan + Oriya + Bunjaabi + Boolish + Bashtuu + Boortaqiis + Boortaqiiska Baraasiil + Boortaqiis (Boortuqaal) + Romanka + Ruush + Sanskrit + SINDHI + Serbiyaan + Sinhaleys + Isloofaak + Islofeeniyaan + Soomaali + Albaaniyaan + Seerbiyaan + Sesooto + Suudaaniis + Swiidhis + Sawaaxili + Tamiil + Teluugu + Taaylandays + Tigrinya + Turkumaanish + Kiligoon + Turkish + Tiwiyan + UIGHUR + Yukreeniyaan + Af aan la aqoon ama aan sax ahayn + Urduu + Usbakis + Fiitnaamays + Hoosta + Yadhish + Jayniis + Zuulu + + + + + + + + Afrikada Bari + Aasiyada Bari + Yurubta Bari + Imaaraadka Carabta ee Midoobay + Afgaanistaan + Armeeniya + Angoola + Osteeriya + Awstraaliya + Boosniya Heersigoviina + Baarbadoos + Bangaala-Deesh + Beljiyam + Baxrayn + Beniin + Braasiil + Kanada + Swiiserlaand + Jili + Kameruun + Shiinaha + Kuuba + Jekoslafaakiya + Jarmal + Jabuuti + Danmaark + Ikwadoor + Masar + Isbeyn + Itoobiya + Fiinlaand + Faransiis + United Kingdom + Giriinaada + Gini + Giriigga + Korweeshiya + Hangeri + Indoneesiya + Ayrlaanda + Israaʼiil + Hindiya + Ciraaq + Iiraan + Iislaand + Talyaani + Jameyka + Urdun + Jabbaan + Kiiniya + Kamboodiya + Kuuriyada Waqooyi + Kuuriyada Koonfureed + Kuwayt + Kasaakhistaan + Lubnaan + Siirilaanka + Laybeeriya + Losooto + Luksemboorg + Laatfiya + Liibiya + Marooko + Moonako + Makadooniya + Maali + Muritaaniya + Maalda + Maaldiqeen + Malaawi + Meksiko + Musambiig + Namiibiya + Nayjeeriya + Nikaraaguwa + Noorweey + Neyuusilaand + Cumaan + Filibiin + Bakistaan + Booland + Bortuqaal + Qadar + Rumaaniya + Ruush + Sacuudi Carabiya + Sudaan + Iswidhan + Siraaliyoon + Soomaaliya + Suuriya + Jaad + Toogo + Taylaand + Tuniisiya + Tonga + Turki + Tansaaniya + Ugaanda + Qaramada Midoobey ee Maraykanka + Faatikaan + Fenisuweela + Fiyetnaam + Yaman + Koonfur Afrika + Saambiya + Simbaabwe + Far aan la aqoon amase aan saxnayn + + + Habeentiris + Lacag + + + Habeentiriska yuhuudda + Habeentiriska islaamka + Habeentiriska jabbaanka + + + + [a-z] + + + + + + + + Kob + Lab + Sad + Afr + Sha + Lix + Tod + Sid + Sag + Tob + KIT + LIT + + + Bisha Koobaad + Bisha Labaad + Bisha Saddexaad + Bisha Afraad + Bisha Shanaad + Bisha Lixaad + Bisha Todobaad + Bisha Sideedaad + Bisha Sagaalaad + Bisha Tobnaad + Bisha Kow iyo Tobnaad + Bisha Laba iyo Tobnaad + + + + + K + L + S + A + S + L + T + S + S + T + K + L + + + + + + + Axa + Isn + Sal + Arb + Kha + Jim + Sab + + + Axad + Isniin + Salaaso + Arbaco + Khamiis + Jimco + Sabti + + + + + A + I + S + A + K + J + S + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + sn + gn + + + Ciise ka hor + Ciise ka dib + + + + + + EEEE, MMMM dd, yyyy + + + + + dd MMMM yyyy + + + + + dd-MMM-yyyy + + + + + dd/MM/yy + + + + + + + h:mm:ss a v + + + + + h:mm:ss a z + + + + + h:mm:ss a + + + + + h:mm a + + + + + + + {1} {0} + + + + dd MMMM + dd/MM + MM/yy + Q yy + MMMM yyyy + + + {0} - {1} + + M-M + + + E, dd/MM - E, dd/MM + E, dd/MM - E, dd/MM + + + MMM-MMM + + + E, dd MMM - E, dd MMM + E, dd - E, dd MMM + + + dd MMM - dd MMM + dd-dd MMM + + + dd/MM - dd/MM + dd/MM - dd/MM + + + d-d + + + h a - h a + h-h a + + + h:mm a - h:mm a + h:mm-h:mm a + h:mm-h:mm a + + + h:mm a - h:mm a v + h:mm-h:mm a v + h:mm-h:mm a v + + + h a - h a v + h-h a v + + + y-y + + + MM/yy - MM/yy + MM/yy - MM/yy + + + E, dd/MM/yy - E, dd/MM/yy + E, dd/MM/yy - E, dd/MM/yy + E, dd/MM/yy - E, dd/MM/yy + + + MMM-MMM yyyy + MMM yyyy - MMM yyyy + + + E, MMM dd - E, MMM dd, yyyy + E, MMM dd - E, MMM dd, yyyy + E, MMM dd, yyyy - E, MMM dd, yyyy + + + dd MMM - dd MMM yyyy + dd-dd MMM yyyy + dd MMM yyyy - dd MMM yyyy + + + dd/MM/yy - dd/MM/yy + dd/MM/yy - dd/MM/yy + dd/MM/yy - dd/MM/yy + + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + Far aan la aqoon amase aan saxnayn + + + + + + . + , + + + + + ¤#,##0.00 + + + + + + Brazilian Real + + + Chinese Yuan Renminbi + + + Faran Jabbuuti + + + Birta Itoobbiya + + + Yuuroo + + + British Pound Sterling + + + Indian Rupee + + + Japanese Yen + + + Ksh + + + Russian Ruble + + + Shilin soomaali + $ + + + Doollar maraykan + + + Lacag aan la qoon ama aan saxnayn + + + + + + haa:h + maya:m + + + diff --git a/libs/Zend/Locale/Data/so_DJ.xml b/libs/Zend/Locale/Data/so_DJ.xml new file mode 100644 index 0000000..29b86a8 --- /dev/null +++ b/libs/Zend/Locale/Data/so_DJ.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + $ + + + SOS + + + + diff --git a/libs/Zend/Locale/Data/so_ET.xml b/libs/Zend/Locale/Data/so_ET.xml new file mode 100644 index 0000000..cda11b8 --- /dev/null +++ b/libs/Zend/Locale/Data/so_ET.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + $ + + + SOS + + + + diff --git a/libs/Zend/Locale/Data/so_KE.xml b/libs/Zend/Locale/Data/so_KE.xml new file mode 100644 index 0000000..87eb74f --- /dev/null +++ b/libs/Zend/Locale/Data/so_KE.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + SOS + + + + diff --git a/libs/Zend/Locale/Data/so_SO.xml b/libs/Zend/Locale/Data/so_SO.xml new file mode 100644 index 0000000..91477bc --- /dev/null +++ b/libs/Zend/Locale/Data/so_SO.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/sq.xml b/libs/Zend/Locale/Data/sq.xml new file mode 100644 index 0000000..d6fcc72 --- /dev/null +++ b/libs/Zend/Locale/Data/sq.xml @@ -0,0 +1,662 @@ + + + + + + + + + + + Afrikanisht + Amharike + Arabisht + Asamezisht + Azerbajxhanisht + Bjellorusisht + Bullgarisht + Bihari + Bengalisht + Breton + Boshnjakisht + Katalonisht + Çekisht + Uellsisht + Danisht + Gjermanisht + Greqisht + Anglisht + Esperanto + Spanjisht + Estonisht + Baskisht + Persisht + Finlandisht + Tagalogisht + Faroisht + Frengjisht + Frizianisht + Irlandisht + Galisht + Galicianisht + Guarani + Guxharati + Hebraisht + Hindi + Kroatisht + Hungarisht + Armen + Interlingua + Indonezisht + Gjuha nderkombtare + Islandisht + Italisht + Japanisht + Javanisht + Gjeorgjisht + Kamboxhiane + Kanada + Koreançe + Kurd + Kyrgyz + Latinisht + Lingala + Laosisht + Lituanisht + Letonisht + Maqedonisht + Malajalam + Mongolisht + Marati + Malajzisht + Maltisht + Nepalisht + Hollandisht + Norvegjisht (Nynorsk) + Norvegjisht + Oksitanisht + Orija + Punxhabi + Polonisht + Pashto + Portugeze + Portugalisht (Brazil) + Portugalisht (Portugali) + Rumanisht + Rusisht + Sanskritisht + Si'ndi + Serbo-Kroatisht + Sinhalezisht + Sllovakisht + Sllovenisht + Somalisht + shqipe + Serbisht + Sesotho + Sundanisht + Suedisht + Suahilisht + Tamil + Telugu + Tajlandisht + Tigrinja + Turk + Klingon + Turqisht + Twi + Ujgur + Ukrainisht + Unknown or Invalid Language + Urdu + Uzbekistanisht + Vietnamisht + Xhosa + Jiden + Kineze + Zulu + + + + + + + + Andorrë + Emiratet Arabe te Bashkuara + Afganistan + Antigua e Barbuda + Shqipëria + Armeni + Angolë + Argjentinë + Austri + Australi + Ishujt Aland + Azerbajxhan + Bosnja dhe Hercegovina + Belgjikë + Bullgari + Bahrein + Brunej + Bolivi + Brazili + Butan + Botsvana + Bjellorusi + Kanada + Republika Qendrore e Afrikës + Kongo + Zvicër + Bregu i Fildishtë + Kili + Kamerun + Kinë + Kolumbi + Kosta Rika + Serbië en Montenegro + Kubë + Kap Verde + Qipro + Republika e Çekisë + Gjermani + Xhibuti + Danimarkë + Dominikë + Republika Dominikanë + Algjeri + Ekuator + Estoni + Egjipt + Saharaja Perëndimore + Eritre + Spanjë + Etiopi + Finlandë + Fixhi + Mikronezi + Francë + Gjabon + Mbretëria e Bashkuar + Gjeorgji + Ganë + Gambi + Guine + Guineja Ekuatoriale + Greqi + Guatemalë + Guine Bisau + Guajana + Kroaci + Hungari + Indonezi + Irlandë + Izrael + Indi + Irak + Islandë + Itali + Xhamajkë + Jordani + Japoni + Kenia + Kirgistan + Kamboxhi + Qiribati + Komore + Saint Kitts e Nevis + Koreja e Veriut + Koreja e Jugut + Kuvajt + Kazakistan + Liban + Lihtënshtajn + Liberi + Lesoto + Lituani + Luksemburg + Letoni + Libi + Maroko + Monako + Moldavi + Madagaskar + Ishujt Marshall + Maqedoni + Mongoli + Mauritani + Maltë + Maldivit + Malavi + Meksikë + Malajzi + Mozambik + Namibi + Nigeri + Nikaragua + Vendet e Ulëta + Norvegji + Zelanda e Re + Papua Guineja e Re + Filipine + Poloni + Portugali + Paraguaj + Katar + Rumani + Rusi + Ruanda + Arabia Saudite + Ishujt Solomon + Sishel + Suedi + Singapor + Slloveni + Sllovaki + Siera Leone + Somali + Sao Tome e Prinsipe + Siri + Svazilandë + Çad + Togo + Tajlandë + Taxhikistan + Tunisi + Tonga + Turqi + Trinidad e Tobago + Tajvan + Tanzani + Ukrainë + Shtetet e Bashkuara të Amerikës + Uruguaj + Vatikan + Saint Vincent e Grenadinet + Venezuelë + Jemen + Afrika e Jugut + Zambi + Zimbabve + Rajon i panjohur ose i pavlefshëm + + + + [a-c ç d {dh} e ë f g {gj} h-l {ll} m n {nj} o-r {rr} s {sh} t {th} u v x {xh} y z {zh}] + [w] + + + GanjkHmsSEDFwWxhKzAeugXZvcL + + + + + + Jan + Shk + Mar + Pri + Maj + Qer + Kor + Gsh + Sht + Tet + Nën + Dhj + + + janar + shkurt + mars + prill + maj + qershor + korrik + gusht + shtator + tetor + nëntor + dhjetor + + + + + J + S + M + P + M + Q + K + G + S + T + N + D + + + + + + + Die + Hën + Mar + Mër + Enj + Pre + Sht + + + e diel + e hënë + e martë + e mërkurë + e enjte + e premte + e shtunë + + + + + D + H + M + M + E + P + S + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + + 1 + 2 + 3 + 4 + + + + PD + MD + + + p.e.r. + n.e.r. + + + + + + EEEE, dd MMMM yyyy + + + + + dd MMMM yyyy + + + + + yyyy-MM-dd + + + + + yy-MM-dd + + + + + + + h.mm.ss.a v + + + + + h.mm.ss.a z + + + + + h:mm:ss.a + + + + + h.mm.a + + + + + + + {1} {0} + + + + H:mm + L + E, d.M + LLL + E d MMM + E d MMMM + d MMMM + dd MMMM + d MMM + MM-dd + M-d + d + mm:ss + yyyy + M.yyyy + EEE, d.M.yyyy + MMM yyyy + d MMM yyyy + MMMM yyyy + Q yy + yyyy-MM + MMMM yyyy + + + {0} - {1} + + M-M + + + E, MM-dd - E, MM-dd + E, MM-dd - E, MM-dd + + + MMM-MMM + + + E, dd MMM - E, dd MMM + E, dd - E, dd MMM + + + dd MMM - dd MMM + dd-dd MMM + + + MM-dd - MM-dd + MM-dd - MM-dd + + + d-d + + + h.a - h.a + h.-h.a + + + h.mm.a - h.mm.a + h.mm.-h.mm.a + h.mm.-h.mm.a + + + h.mm.a - h.mm.a v + h.mm.-h.mm.a v + h.mm.-h.mm.a v + + + h.a - h.a v + h.-h.a v + + + y-y + + + yy-MM - yy-MM + yy-MM - yy-MM + + + E, yy-MM-dd - E, yy-MM-dd + E, yy-MM-dd - E, yy-MM-dd + E, yy-MM-dd - E, yy-MM-dd + + + MMM-MMM yyyy + MMM yyyy - MMM yyyy + + + E, dd MMM - E, dd MMM yyyy + E, dd - E, dd MMM yyyy + E, dd MMM yyyy - E, dd MMM yyyy + + + dd MMM - dd MMM yyyy + dd-dd MMM yyyy + dd MMM yyyy - dd MMM yyyy + + + yy-MM-dd - yy-MM-dd + yy-MM-dd - yy-MM-dd + yy-MM-dd - yy-MM-dd + + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + Unknown + + + + Ora qendrore evropiane + + + + + Ora lindore evropiane + + + + + Ora standarde e Moskës + + + + + + + , + . + + + + + ¤#,##0.00 + + + + + + Lek + + + Real Brazilian + + + Renminbi(Yuan) Kinez + + + Euro + + + Paund Sterlina Britanike + + + Rupee indiane + + + Jeni Japonez + + + Rubla ruse + + + Dollar amerikan + + + Unknown or Invalid Currency + XXX + + + + + + {0} ditë + {0} ditë + + + {0} orë + + + {0} minutë + {0} minuta + + + {0} muaj + + + {0} sekondë + {0} sekonda + + + {0} javë + + + {0} vit + {0} vjet + + + + + po:p + jo:j + + + diff --git a/libs/Zend/Locale/Data/sq_AL.xml b/libs/Zend/Locale/Data/sq_AL.xml new file mode 100644 index 0000000..aa1dc10 --- /dev/null +++ b/libs/Zend/Locale/Data/sq_AL.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/sr.xml b/libs/Zend/Locale/Data/sr.xml new file mode 100644 index 0000000..f462022 --- /dev/null +++ b/libs/Zend/Locale/Data/sr.xml @@ -0,0 +1,2300 @@ + + + + + + + + + + + Африканерски + Акадијски + Амхарски + Староенглески + Апачки језик + Арапски + Асемијски + Аустралијски језик + Аварски + Азербејџански + Балтички језик + Белоруски + Бугарски + Бихарски + Бенгласки + Банту + Тибетански + Бретонски + Босански + Каталонски + Централно амерички Индијански језик + Чеченски + Келтски + Чероки + Корзикански + Коптски + Чешки + Старословенски + Велшки + Дански + Дакота + Немачки + Делавер + Староегипатски + Грчки + Енглески + Енглески (САД) + Есперанто + Шпански + Шпански (Јужна Америка и Кариби) + Естонски + Баскијски + Персијски + Фински + Тагалог + Угро-фински + Фарски + Француски + Старофранцуски + Фризијски + Ирски + Шкотски Галски + Германски језик + Галски + Гварани + Старонемачки + Готски + Старогрчки + Немачки (Швајцарска) + Гуџарати + Хавајски + Хебрејски + Хинди + Хрватски + Хаитски + Мађарски + Јерменски + Интерлингва + Индонежански + Међујезички + Индо-европски језик + Ирански језик + Исландски + Италијански + Јапански + Јудео-персијски + Јудео-арапски + Јавански + Грузијски + Козачки + Кмерски + Канада + Корејски + Курдски + Киргиски + Латински + Луксембуршки + Лингала + Лаоски + Литвански + Летонски + Масаи + Маорски + Македонски + Малајалам + Монголски + Молдавски + Марати + Малајски + Мелтешки + Бурмански + Језик северноамеричких Индијанаца + Непалски + Холандски + Фламански + Норвешки + Навахо + Провансалски + Оријски + Панџабски + Староперсијски + Филипински језик + Пољски + Старопровансалски + Паштунски + Португалски + Португалски (Португалија) + Рето-Романски + Румунски + Руски + Санскрит + Језик јужноамеричких Индијанаца + Сардињаски + Сицилијански + Синди + Староирски + Знаковни језик + Српскохрватски + Сингалески + Словачки + Словеначки + Словенски језик + Сомалски + Албански + Српски + Сесото + Судански + Сумерски + Шведски + Свахили + Тамилски + Телугу + Тајландски + Тигриња + Туркменски + Тагалски + Клингонски + Турски + Татарски + Тви + Тахићански + Ујгурски + Украјински + Непознат или неважећи језик + Урду + Узбечки + Вијетнамски + Хауса + Јидиш + Кинески + Кинески (поједностављен) + Кинески (традиционални) + Зулу + Без лингвистичког садржаја + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Свет + Африка + Северноамерички континент + Јужна Америка + Океанија + Западна Африка + Централна Америка + Источна Африка + Северна Африка + Централна Африка + Јужна Африка + Америке + Северна Америка + Кариби + Источна Азија + Јужна Азија + Југоисточна Азија + Јужна Европа + Аустралија и Нови Зеланд + Меланезија + Микронезијски регион + Полинезија + Јужно-централна Азија + Азија + Централна Азија + Западна Азија + Европа + Источна Европа + Северна Европа + Западна Европа + Латинска Америка и Кариби + Каналска острва + Андора + Уједињени Арапски Емирати + Авганистан + Антигве и Барбуда + Ангвила + Албанија + Арменија + Холандски Антили + Ангола + Антарктик + Аргентина + Америчка Самоа + Аустрија + Аустралија + Аруба + Аландска острва + Азербејџан + Босна и Херцеговина + Барбадос + Бангладеш + Белгија + Буркина Фасо + Бугарска + Бахреин + Бурунди + Бенин + Бермуда + Брунеј + Боливија + Бразил + Бахами + Бутан + Буве Острва + Боцвана + Белорусија + Белизе + Канада + Кокос (Келинг) Острва + Демократска република Конго + Централно Афричка Република + Конго + Швајцарска + Обала Слоноваче + Кукова Острва + Чиле + Камерун + Кина + Колумбија + Костарика + Србија и Црна Гора + Куба + Капе Верде + Божићна острва + Кипар + Чешка + Немачка + Џибути + Данска + Доминика + Доминиканска Република + Алжир + Еквадор + Естонија + Египат + Западна Сахара + Еритреја + Шпанија + Етиопија + Финска + Фиџи + Фолкландска Острва + Микронезија + Фарска Острва + Француска + Габон + Велика Британија + Гренада + Грузија + Француска Гвајана + Гурнси + Гана + Гибралтар + Гренланд + Гамбија + Гвинеја + Гваделупе + Екваторијална Гвинеја + Грчка + Јужна Џорџија и Јужна Сендвич Острва + Гватемала + Гуам + Гвинеја-Бисао + Гвајана + Хонг Конг + Херд и Мекдоналд Острва + Хондурас + Хрватска + Хаити + Мађарска + Индонезија + Ирска + Израел + Острво Ман + Индија + Британско Индијска океанска територија + Ирак + Иран + Исланд + Италија + Џерси + Јамајка + Јордан + Јапан + Кенија + Киргизстан + Камбоџа + Кирибати + Коморска Острва + Сент Китс и Невис + Северна Кореја + Јужна Кореја + Кувајт + Кајманска Острва + Казахстан + Лаос + Либан + Сент Луција + Лихтенштајн + Шри Ланка + Либерија + Лесото + Литванија + Луксембург + Летонија + Либија + Мароко + Монако + Молдавија + Црна Гора + Сент Мартин + Мадагаскар + Маршалска Острва + Македонија + Мали + Мијанмар + Монголија + Макао + Северна Маријанска Острва + Мартиник + Мауританија + Монсерат + Малта + Маурицијус + Малдиви + Малави + Мексико + Малезија + Мозамбик + Намибија + Нова Каледонија + Нигер + Норфолк Острво + Нигерија + Никарагва + Холандија + Норвешка + Непал + Науру + Ниуе + Нови Зеланд + Оман + Панама + Перу + Француска Полинезија + Папуа Нова Гвинеја + Филипини + Пакистан + Пољска + Сен Пјер и Микелон + Питкерн + Порто Рико + Палестинска територија + Португал + Палау + Парагвај + Катар + Остала океанија + Европска унија + Реинион + Румунија + Србија + Русија + Руанда + Саудијска Арабија + Соломонска Острва + Сејшели + Судан + Шведска + Сингапур + Света Јелена + Словенија + Свалбард и Јанмајен Острва + Словачка + Сијера Леоне + Сан Марино + Сенегал + Сомалија + Суринам + Сао Томе и Принципе + Салвадор + Сирија + Свазиленд + Туркс и Кајкос Острва + Чад + Француске Јужне Територије + Того + Тајланд + Таџикистан + Токелау + Тимор-Лесте + Туркменистан + Тунис + Тонга + Турска + Тринидад и Тобаго + Тувалу + Тајван + Танзанија + Украјина + Уганда + Мања удаљена острва САД + Сједињене Америчке Државе + Уругвај + Узбекистан + Ватикан + Сент Винсент и Гренадини + Венецуела + Британска Девичанска Острва + С.А.Д. Девичанска Острва + Вијетнам + Вануату + Валис и Футуна Острва + Самоа + Јемен + Мајоте + Јужноафричка Република + Замбија + Зимбабве + Непозната или неважећа област + + + Француски из касног средњег века до 1606. + Шкотски стандардни Енглески + + + Календар + Сортирање + Валута + + + Традиционално кинеско сортирање + Будистички календар + Кинески календар + Директно сортирање + Поједностављено кинеско сортирање + Грегоријански календар + Хебрејски календар + Исламски календар + Исламски цивилни календар + Јапански календар + Сортирање као телефонски именик + Пињин сортирање + Сортирање по броју црта + Традиционално сортирање + + + САД + Метрички + + + {0} + {0} + + + + [а-д ђ е-и ј к л љ м н њ о-т ћ у-ч џ ш] + [a á à ă â å ä ā æ b c ç d e é è ĕ ê ë ē f-i í ì ĭ î ï ī j-n ñ o ó ò ŏ ô ö ø ō œ p-s ß t u ú ù ŭ û ü ū v-y ÿ z] + [a-z] + + + + + + + + + GanjkHmsSEDFwWxhKzAeugXZvcL + + + + + + јан + феб + мар + апр + мај + јун + јул + авг + сеп + окт + нов + дец + + + јануар + фебруар + март + април + мај + јун + јул + август + септембар + октобар + новембар + децембар + + + + + ј + ф + м + а + м + ј + ј + а + с + о + н + д + + + + + + + нед + пон + уто + сре + чет + пет + суб + + + недеља + понедељак + уторак + среда + четвртак + петак + субота + + + + + н + п + у + с + ч + п + с + + + + + + + К1 + К2 + К3 + К4 + + + Прво тромесечје + Друго тромесечје + Треће тромесечје + Четврто тромесечје + + + + преподне + поподне + + + Пре нове ере + Нове ере + + + п. н. е. + н. е + + + п.н.е. + н.е. + + + + + + EEEE, dd. MMMM yyyy. + + + + + dd. MMMM yyyy. + + + + + dd.MM.yyyy. + + + + + d.M.yy. + + + + + + + HH.mm.ss v + + + + + HH.mm.ss z + + + + + HH.mm.ss + + + + + HH.mm + + + + + + + {1} {0} + + + + E d. + L + E d. MMM + MMMM d. + dd. MMMM + MMM d. + dd.MMM + MM-dd + d/M + d + hh:mm a + hh:mm:ss a + mm:ss + yyyy. + EEE, d. M. yyyy. + EEE, d. MMM yyyy. + MM.yy + d. MMM yy. + dd.MM.yy + Q yy + QQQQ yy + yyyy. + yyyy-MM + MMMM yyyy. + + + {0} - {1} + + M-M + + + E, d.M - E, d.M + E, d.M - E, d.M + + + MMM-MMM + + + E, dd. MMM - E, dd. MMM + E, dd. - E, dd. MMM + + + dd. MMM - dd. MMM + dd.-dd. MMM + + + d.M - d.M + d.M - d.M + + + d-d + + + HH-HH + + + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH-HH v + + + y-y + + + yyyy M - M + yyyy M - M + + + E, d.M.yy. - E, d.M.yy. + E, d.M.yy. - E, d.M.yy. + E, d.M.yy. - E, d.M.yy. + + + MMM-MMM yyyy. + MMM yyyy. - MMM yyyy. + + + E, dd. MMM - E, dd. MMM yyyy. + E, dd. - E, dd. MMM yyyy. + E, dd. MMM yyyy. - E, dd. MMM yyyy. + + + dd. MMM - dd. MMM yyyy. + dd.-dd. MMM yyyy. + dd. MMM yyyy. - dd. MMM yyyy. + + + d.M.yy. - d.M.yy. + d.M.yy. - d.M.yy. + d.M.yy. - d.M.yy. + + + + + + ера + + + година + + + месец + + + недеља + + + дан + данас + сутра + прекосутра + за три дана + јуче + прекјуче + пре три дана + + + дан у недељи + + + доба дана + + + час + + + минут + + + секунд + + + зона + + + + + + +HHmm;-HHmm + GMT{0} + {0} + + Непознат или неважећи град + + + Андора + + + Дубаи + + + Кабул + + + Антигва + + + Ангвила + + + Тирана + + + Јереван + + + Кирасо + + + Луанда + + + Ротера + + + Палмер + + + Јужни пол + + + Шова + + + Мосон + + + Дејвис + + + Восток + + + Касеј + + + Димон д’Урвил + + + Макмурдо + + + Мендоза + + + Сан Хуан + + + Катамарка + + + Кордоба + + + Буенос Аирес + + + Паго Паго + + + Беч + + + Перт + + + Иукла + + + Дарвин + + + Аделајд + + + Брокен Хил + + + Курие + + + Мелбурн + + + Хобарт + + + Сиднеј + + + Бризбејн + + + Аруба + + + Баку + + + Барбадос + + + Дака + + + Брисел + + + Уагадугу + + + Софија + + + Бахреин + + + Буџумбура + + + Порто Ново + + + Бермуди + + + Брунеји + + + Ла Паз + + + Еирунепе + + + Рио Бранко + + + Порто Вељо + + + Боа Виста + + + Манаус + + + Куиаба + + + Кампо Гранде + + + Белем + + + Арагвајана + + + Сао Паоло + + + Бахиа + + + Форталеза + + + Масејо + + + Ресифе + + + Нороња + + + Насау + + + Тхимпху + + + Габорон + + + Минск + + + Белизе + + + Досон + + + Инувик + + + Ванкувер + + + Досон Крик + + + Едмонтон + + + Кембриџ Беј + + + Винипег + + + Корал Харбур + + + Торонто + + + Монтреал + + + Халифакс + + + Гус Беј + + + Глејс Беј + + + Бланк-Сејблон + + + Св. Џон + + + Кокосова острва + + + Киншаса + + + Лумумбаши + + + Бангуи + + + Бразавил + + + Цирих + + + Абиџан + + + Раротонга + + + Ускршње острво + + + Сантијаго + + + Дуала + + + Кашгар + + + Чонгкинг + + + Шангај + + + Харбин + + + Богота + + + Костарика + + + Хавана + + + Капе Верде + + + Божићно острво + + + Никозија + + + Берлин + + + Џибути + + + Копенхаген + + + Доминика + + + Санто Доминго + + + Алжир + + + Галапагос + + + Гвајакил + + + Талин + + + Каиро + + + Ел Ајун + + + Асмера + + + Канарска острва + + + Сеута + + + Мадрид + + + Адис Абеба + + + Хелсинки + + + Фиџи + + + Стенли + + + Трук + + + Понапе + + + Кошре + + + Фарска Острва + + + Париз + + + Либревил + + + Лондон + + + Гренада + + + Тбилиси + + + Кајен + + + Акра + + + Гибралтар + + + Туле + + + Нук + + + Скорезбисунд + + + Данмарксхаген + + + Банжул + + + Конакри + + + Гвадалупе + + + Малабо + + + Атина + + + Јужна Џорџија + + + Гватемала + + + Гуам + + + Бисао + + + Гуана + + + Хонг Конг + + + Порт-о-Пренс + + + Будимпешта + + + Џакарта + + + Макасар + + + Џајапура + + + Даблин + + + Чагос + + + Багдад + + + Техеран + + + Рејкјавик + + + Рим + + + Јамајка + + + Аман + + + Токио + + + Најроби + + + Бишкек + + + Пном Пен + + + Ендербери + + + Киритимати + + + Тарава + + + Коморо + + + Сент Китс + + + Пјонгјанг + + + Сеул + + + Кувајт + + + Кајманска острва + + + Актау + + + Орал + + + Акутобе + + + Алма-Ата + + + Вијетијан + + + Бејрут + + + Св. Луција + + + Вадуц + + + Коломбо + + + Монровија + + + Масеру + + + Виљнус + + + Луксембург + + + Рига + + + Триполи + + + Казабланка + + + Монако + + + Кишњев + + + Антананариво + + + Кваџалејин + + + Мајуро + + + Бамако + + + Рангун + + + Ховд + + + Улан Батор + + + Чојбалсан + + + Макау + + + Сајпан + + + Мартиник + + + Навакшут + + + Монтсерат + + + Малта + + + Маурицијус + + + Малдиви + + + Блантир + + + Тихуана + + + Хермосиљо + + + Мазатлан + + + Чихуахуа + + + Монтереј + + + Мексико Сити + + + Мерида + + + Канкун + + + Куала Лумпур + + + Мапуто + + + Виндхук + + + Нумеа + + + Нијамеј + + + Норфолк + + + Лагос + + + Манагва + + + Амстердам + + + Осло + + + Катманду + + + Науру + + + Ниуе + + + Катхам + + + Окланд + + + Мускат + + + Панама + + + Лима + + + Тахити + + + Маркиз + + + Гамбије + + + Порт Морзби + + + Манила + + + Карачи + + + Варшава + + + Микелон + + + Питкаирн + + + Порто Рико + + + Газа + + + Азори + + + Лисабон + + + Палау + + + Асунсион + + + Катар + + + Уједињење + + + Букурешт + + + Москва + + + Волгоград + + + Самара + + + Јекатеринбург + + + Омск + + + Новосибирск + + + Краснојарск + + + Иркуцк + + + Јакутск + + + Владивосток + + + Сахалин + + + Магадан + + + Камчатка + + + Анадир + + + Кигали + + + Ријад + + + Гвадалканал + + + Махе + + + Картум + + + Стокхолм + + + Сингапур + + + Света Јелена + + + Фритаун + + + Дакар + + + Могадиш + + + Парамирбо + + + Сао Томе + + + Салвадор + + + Дамаск + + + Мбабане + + + Гранд Турк + + + Нџамена + + + Кергелен + + + Ломе + + + Банкок + + + Душанбе + + + Факаофо + + + Дили + + + Ашхабад + + + Тунис + + + Тонгатапу + + + Истанбул + + + Порт оф Спејн + + + Фанафути + + + Тајпеј + + + Дар-ес-Салам + + + Ужгород + + + Кијев + + + Запорожје + + + Кампала + + + Мидвеј + + + Џонстон + + + Ваке + + + Адак + + + Хонолулу + + + Енкориџ + + + Лос Анђелес + + + Бојзи + + + Феникс + + + Шипрок + + + Денвер + + + Нови Салем, Северна Даткоа + + + Центар, Северна Дакота + + + Чикаго + + + Петерсбург, Индијана + + + Тел Сити + + + Кнокс, Индијана + + + Маренго, Индијана + + + Индианаполис + + + Луивиле + + + Монтичело, Кентаки + + + Детроит + + + Њујорк + + + Монтевидео + + + Самарканд + + + Ташкент + + + Сент Винсент + + + Каракас + + + Тортола + + + Св. Тома + + + Ефате + + + Валис + + + Апија + + + Аден + + + Мајоте + + + Јоханесбург + + + Лусака + + + Хараре + + + + Средњеевропско време + Средњеевропско летње време + + + + + Источноевропско време + Источноевропско летње време + + + + + + + , + . + ; + % + 0 + # + + + - + е + + + NaN + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + #,##0.00 ¤ + + + {0} {1} + {0} {1} + {0} {1} + {0} {1} + + + + Уједињени арапски емирати дирхам + + + Албански лек + Албанске леке + Албанских лека + + + Јерменски драм + Јерменска драма + Јерменских драма + + + Аргентински пезо + + + Аустријски шилинг + + + Аустралијски долар + Аустралијска долара + Аустралијских долара + $A + + + Босанско-Херцеговачки динар + Босанско-Херцеговачка динара + Босанско-Херцеговачких динара + + + Конвертибилна марка + Босанско-Херцеговачке конвертибилне марке + Босанско-Херцеговачких конвертабилних марака + KM + + + Белгијски франак + BF + + + Бугарски лев + Бугарска лева + Бугарских лева + + + Брунејски долар + + + Боливијски Боливиано + + + Бразилски Реал + + + Канадски долар + Канадска долара + Канадских долара + Can$ + + + Швајцарски франак + Швајцарска франка + Швајцарских франака + SwF + + + Чилеански пезо + + + Кинески Јуан Ренминби + Y + + + Колумбијски пезо + + + Српски Динар (Србија и Црна Гора) + + + Чешка круна + + + Немачка марка + Немачке марке + Немачких марака + + + Данска круна + DKr + + + Естонска кроон + + + Египатска фунта + + + Шпанска пезета + + + Евро + + + Финска марка + Финске марке + Финских марака + + + Фиџи долар + + + Француски франак + Француска франка + Француских франака + + + Фунта стерлинга + + + Драхма + + + Хонг Конгски Долари + + + Хрватски динар + Хрватска динара + Хрватских динара + + + Куна + Хрватске куне + Хрватских куна + + + Мађарска форинта + + + Индонезијска рупиах + + + Ирска фунта + IR£ + + + Израелски шекел + + + Индијски Рупи + INR + + + Италијанска лира + Италијанске лире + Италијанских лира + + + Јен + Јапанска јена + Јапанских јена + + + Кенијски шилинг + + + Јужнокорејски Вон + + + Кувајтски динар + KD + + + Литвански литас + + + Луксембуршки франак + + + Либијски динар + Либијска динара + Либијских динара + Либијски динар + + + Марокански дирхам + + + Македонијски денар + Македонијска денара + Македонијских денара + Македонијски денар + + + Малтешка лира + + + Мексички песо + + + Малезијски ринггит + + + Холандски гулден + + + Норвешка круна + Норвешке круне + Норвешких круна + Норвешка круна + NKr + + + Новозеландски долар + + + Перуански нуево сол + + + Филипински песо + + + Пакистански рупи + + + Португалски ескудо + + + Румунски леу + + + Српски Динар + Српска динара + Српских динара + Српски динар + + + Руска рубља + Руске рубље + Руских рубљи + Руска рубља + + + Руска рубља (1991-1998) + + + Шведска круна + SKr + + + Сингапурски долар + + + Толар + + + Словачка круна + + + Стара Турска Лира + Старе турске лире + Старих турских лира + + + Нова турска лира + Турске лире + Турских лира + Турска лира + + + Нови тајвански долар + + + Украјинска хривња + + + Амерички долар + Америчка долара + Америчких долара + Амерички долар + + + Венецуелански боливар + + + Вијетнамски донг + + + Непозната или неважећа валута + Непознате или неважеће валуте + Непознатих или неважећих валута + + + Дин + + + Јужно Афрички Ранд + + + + + + {0} дана + {0} дана + {0} дан + + + {0} сата + {0} сати + {0} сат + + + {0} минута + {0} минута + {0} минут + + + {0} месеца + {0} месеци + {0} месец + + + {0} секунде + {0} секунди + {0} секунда + + + {0} недеље + {0} недеља + {0} недеља + + + {0} године + {0} година + {0} година + + + + + да:д + не:н + + + + diff --git a/libs/Zend/Locale/Data/sr_BA.xml b/libs/Zend/Locale/Data/sr_BA.xml new file mode 100644 index 0000000..c9b0f64 --- /dev/null +++ b/libs/Zend/Locale/Data/sr_BA.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/sr_CS.xml b/libs/Zend/Locale/Data/sr_CS.xml new file mode 100644 index 0000000..5e10311 --- /dev/null +++ b/libs/Zend/Locale/Data/sr_CS.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/sr_Cyrl.xml b/libs/Zend/Locale/Data/sr_Cyrl.xml new file mode 100644 index 0000000..74183b5 --- /dev/null +++ b/libs/Zend/Locale/Data/sr_Cyrl.xml @@ -0,0 +1,10 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Svet + Afrika + Severnoamerički kontinent + Južna Amerika + Okeanija + Zapadna Afrika + Centralna Amerika + Istočna Afrika + Severna Afrika + Centralna Afrika + Južna Afrika + Amerike + Severna Amerika + Karibi + Istočna Azija + Južna Azija + Jugoistočna Azija + Južna Evropa + Australija i Novi Zeland + Melanezija + Micronezija + Polinezija + Južno-centralna Azija + Azija + Zapadna Azija + Evropa + Istočna Evropa + Severna Evropa + Zapadna Evropa + Latinska Amerika i Karibi + Kanalska ostrva + Andora + Ujedinjeni Arapski Emirati + Avganistan + Antigva i Barbuda + Angvila + Albanija + Armenija + Holandski Antili + Angola + Antarktika + Argentina + Američka Samoa + Austrija + Australija + Aruba + Alandska ostrva + Azerbejdžan + Bosna i Hercegovina + Barbados + Bangladeš + Belgija + Burkina Faso + Bugarska + Bahrein + Burundi + Benin + Bermuda + Brunej + Bolivija + Brazil + Bahami + Butan + Buve Ostrva + Bocvana + Belorusija + Belise + Kanada + Kokos (Keling) Ostrva + Demokratska Republika Kongo + Centralno Afrička Republika + Kongo + Švajcarska + Obala Slonovače + Kukova Ostrva + Čile + Kamerun + Kina + Kolumbija + Kostarika + Srbija i Crna Gora + Kuba + Kape Verde + Božićna Ostrva + Kipar + Češka + Nemačka + Džibuti + Danska + Dominika + Dominikanska Republika + Alžir + Ekvador + Estonija + Egipat + Zapadna Sahara + Eritreja + Španija + Etiopija + Finska + Fidži + Folklandska Ostrva + Mikronezija + Farska Ostrva + Francuska + Gabon + Velika Britanija + Grenada + Gruzija + Francuska Gvajana + Gurnsi + Gana + Gibraltar + Grenland + Gambija + Gvineja + Gvadelupe + Ekvatorijalna Gvineja + Grčka + Južna Džordžija i Južna Sendvič Ostrva + Gvatemala + Guam + Gvineja-Bisao + Gvajana + Hong Kong + Herd i Mekdonald Ostrva + Honduras + Hrvatska + Haiti + Mađarska + Indonezija + Irska + Izrael + Ostrvo Man + Indija + Britansko Indijska Okeanska Teritorija + Irak + Iran + Island + Italija + Džersi + Jamajka + Jordan + Japan + Kenija + Kirgizstan + Kambodža + Kiribati + Komorska Ostrva + Sent Kits i Nevis + Severna Koreja + Južna Koreja + Kuvajt + Kajmanska Ostrva + Kazahstan + Laos + Liban + Sent Lucija + Lihtenštajn + Šri Lanka + Liberija + Lesoto + Litvanija + Luksemburg + Letonija + Libija + Maroko + Monako + Moldavija + Crna Gora + Madagaskar + Maršalska Ostrva + Makedonija + Mali + Mijanmar + Mongolija + Makao + Severna Marijanska Ostrva + Martinik + Mauritanija + Monserat + Malta + Mauricius + Maldivi + Malavi + Meksiko + Malezija + Mozambik + Namibija + Nova Kaledonija + Niger + Norfolk Ostrvo + Nigerija + Nikaragva + Holandija + Norveška + Nepal + Nauru + Niue + Novi Zeland + Oman + Panama + Peru + Francuska Polinezija + Papua Nova Gvineja + Filipini + Pakistan + Poljska + Sen Pjer i Mikelon + Pitcairn + Porto Riko + Palestinska Teritorija + Portugal + Palau + Paragvaj + Katar + Ostala okeanija + Evropska unija + Rejunion + Rumunija + Srbija + Rusija + Ruanda + Saudijska Arabija + Solomonska Ostrva + Sejšeli + Sudan + Švedska + Singapur + Sveta Jelena + Slovenija + Svalbard i Janmajen Ostrva + Slovačka + Sijera Leone + San Marino + Senegal + Somalija + Surinam + Sao Tome i Principe + Salvador + Sirija + Svazilend + Turks i Kajkos Ostrva + Čad + Francuske Južne Teritorije + Togo + Tajland + Tadžikistan + Tokelau + Istočni Timor + Turkmenistan + Tunis + Tonga + Turska + Trinidad i Tobago + Tuvalu + Tajvan + Tanzanija + Ukrajina + Uganda + Manja Udaljena Ostrva SAD + Sjedinjene Američke Države + Urugvaj + Uzbekistan + Vatikan + Sent Vinsent i Grenadini + Venecuela + Britanska Devičanska Ostrva + S.A.D. Devičanska Ostrva + Vijetnam + Vanuatu + Valis i Futuna Ostrva + Samoa + Jemen + Majote + Južnoafrička Republika + Zambija + Zimbabve + Nepoznat ili nevažeći region + + + Kalendar + Sortiranje + Valuta + + + Tradicionalno kinesko sortiranje + Budistički kalendar + Kineski kalendar + Direktno sortiranje + Pojednostavljeno kinesko sortiranje + Gregorijanski kalendar + Hebrejski kalendar + Islamski kalendar + Islamski civilni kalendar + Japanski kalendar + Sortiranje kao telefonski imenik + Pinjin sortiranje + Sortiranje po broju crta + Tradicionalno sortiranje + + + SAD + Metrički + + + + [a-c č ć d đ {dž} e-l {lj} m n {nj} o p r s š t-v z ž] + [q w-y] + + + + + + + + jan + feb + mar + apr + maj + jun + jul + avg + sep + okt + nov + dec + + + januar + februar + mart + april + maj + jun + jul + avgust + septembar + oktobar + novembar + decembar + + + + + j + f + m + a + m + j + j + a + s + o + n + d + + + + + + + ned + pon + uto + sre + čet + pet + sub + + + nedelja + ponedeljak + utorak + sreda + četvrtak + petak + subota + + + + + n + p + u + s + č + p + s + + + + + + + K1 + K2 + K3 + K4 + + + Prvo tromesečje + Drugo tromesečje + Treće tromesečje + Četvrto tromesečje + + + + AM + PM + + + Pre nove ere + Nove ere + + + p. n. e. + n. e + + + p.n.e. + n. e. + + + + + + HH.mm-HH.mm + HH.mm-HH.mm + + + HH.mm-HH.mmv + HH.mm-HH.mmv + + + HH-HHv + + + M.yy - M.yy + M.yy - M.yy + + + + + + era + + + godina + + + mesec + + + nedelja + + + dan + danas + sutra + prekosutra + za tri dana + juče + prekjuče + pre tri dana + + + dan u nedelji + + + doba dana + + + čas + + + minut + + + sekund + + + zona + + + + + + + Nepoznat ili nevažeći grad + + + Andora + + + Dubai + + + Kabul + + + Antigva + + + Angvila + + + Tirana + + + Jerevan + + + Kiraso + + + Luanda + + + Rotera + + + Palmer + + + Južni pol + + + Šova + + + Moson + + + Dejvis + + + Vostok + + + Kasej + + + Dimon d’Urvil + + + MakMurdo + + + Buenos Aires + + + Pago Pago + + + Beč + + + Aruba + + + Baku + + + Barbados + + + Daka + + + Brisel + + + Uagadugu + + + Sofija + + + Bahrein + + + Budžumbura + + + Porto Novo + + + Bermudi + + + Bruneji + + + La Paz + + + Rio Branko + + + Porto Veljo + + + Boa Vista + + + Manaus + + + Kuiaba + + + Kampo Grande + + + Belem + + + Aragvajana + + + Sao Paolo + + + Fortaleza + + + Masejo + + + Resife + + + Noronja + + + Nasau + + + Thimphu + + + Gaboron + + + Minsk + + + Belize + + + Kokosova ostrva + + + Kinšasa + + + Lumumbaši + + + Bangui + + + Brazavil + + + Cirih + + + Abidžan + + + Rarotonga + + + Uskršnje ostrvo + + + Santijago + + + Duala + + + Šangaj + + + Bogota + + + Kostarika + + + Havana + + + Kape Verde + + + Božićno ostrvo + + + Nikozija + + + Berlin + + + Džibuti + + + Kopenhagen + + + Dominika + + + Santo Domingo + + + Alžir + + + Galapagos + + + Gvajakil + + + Talin + + + Kairo + + + El Ajun + + + Asmera + + + Kanarska ostrva + + + Seuta + + + Madrid + + + Adis Abeba + + + Helsinki + + + Fidži + + + Stenli + + + Truk + + + Ponape + + + Košre + + + Farska Ostrva + + + Pariz + + + Librevil + + + London + + + Grenada + + + Tbilisi + + + Kajen + + + Akra + + + Gibraltar + + + Tule + + + Nuk + + + Skorezbisund + + + Danmarkshagen + + + Banžul + + + Konakri + + + Gvadalupe + + + Malabo + + + Atina + + + Južna Džordžija + + + Gvatemala + + + Guam + + + Bisao + + + Guana + + + Hong Kong + + + Port-o-Prens + + + Budimpešta + + + Džakarta + + + Makasar + + + Džajapura + + + Dablin + + + Čagos + + + Bagdad + + + Teheran + + + Rejkjavik + + + Rim + + + Jamajka + + + Aman + + + Tokio + + + Najrobi + + + Biškek + + + Pnom Pen + + + Enderberi + + + Kiritimati + + + Tarava + + + Komoro + + + Sent Kits + + + Pjongjang + + + Seul + + + Kuvajt + + + Kajmanska ostrva + + + Aktau + + + Akutobe + + + Alma-Ata + + + Vijetijan + + + Bejrut + + + Sv. Lucija + + + Vaduc + + + Kolombo + + + Monrovija + + + Maseru + + + Viljnus + + + Luksemburg + + + Riga + + + Tripoli + + + Kazablanka + + + Monako + + + Kišnjev + + + Antananarivo + + + Kvadžalejin + + + Majuro + + + Bamako + + + Rangun + + + Hovd + + + Ulan Bator + + + Čojbalsan + + + Makau + + + Sajpan + + + Martinik + + + Navakšut + + + Montserat + + + Malta + + + Mauricijus + + + Maldivi + + + Blantir + + + Kuala Lumpur + + + Maputo + + + Vindhuk + + + Numea + + + Nijamej + + + Norfolk + + + Lagos + + + Managva + + + Amsterdam + + + Oslo + + + Katmandu + + + Nauru + + + Niue + + + Okland + + + Muskat + + + Panama + + + Lima + + + Tahiti + + + Markiz + + + Gambije + + + Port Morzbi + + + Manila + + + Karači + + + Varšava + + + Mikelon + + + Pitkairn + + + Porto Riko + + + Gaza + + + Azori + + + Lisabon + + + Palau + + + Asunsion + + + Katar + + + Ujedinjenje + + + Bukurešt + + + Moskva + + + Krasnojarsk + + + Kamčatka + + + Anadir + + + Kigali + + + Rijad + + + Gvadalkanal + + + Mahe + + + Kartum + + + Stokholm + + + Singapur + + + Sveta Jelena + + + Fritaun + + + Dakar + + + Mogadiš + + + Paramirbo + + + Sao Tome + + + Salvador + + + Damask + + + Mbabane + + + Grand Turk + + + Ndžamena + + + Kergelen + + + Lome + + + Bankok + + + Dušanbe + + + Fakaofo + + + Dili + + + Ašhabad + + + Tunis + + + Tongatapu + + + Istanbul + + + Port of Spejn + + + Fanafuti + + + Tajpej + + + Dar-es-Salam + + + Užgorod + + + Kijev + + + Zaporožje + + + Kampala + + + Midvej + + + Džonston + + + Vake + + + Enkoridž + + + Montevideo + + + Taškent + + + Sent Vinsent + + + Karakas + + + Tortola + + + Sv. Toma + + + Efate + + + Valis + + + Apija + + + Aden + + + Majote + + + Johanesburg + + + Lusaka + + + Harare + + + + Srednje Evropsko Vreme + Centralno Evropsko Letnje Vreme + + + + + + + + Ujedinjeni arapski emirati dirham + + + Argentinski pezo + + + Austrijski šiling + + + Australijski dolar + + + Konvertibilna marka + + + Belgijski franak + + + Bugarski lev + + + Brunejski dolar + + + Bolivijski Boliviano + + + Brazilski Real + + + Kanadski dolar + + + Švajcarski franak + + + Čileanski pezo + + + Kineski Juan Renminbi + U + + + Kolumbijski pezo + + + Srpski Dinar (Srbija i Crna Gora) + + + Češka kruna + + + Nemačka marka + + + Danska kruna + + + Estonska kroon + + + Egipatska funta + + + Španska pezeta + + + EVRO + + + Finska marka + + + Fidži dolar + + + Francuski franak + + + Funta sterlinga + + + Drahma + + + Hong Kongski Dolari + + + Hrvatski dinar + + + Kuna + + + Mađarska forinta + + + Indonezijska rupiah + + + Irska funta + + + Izraelski šekel + + + Indijski Rupi + + + Italijanska lira + + + Jen + + + Kenijski šiling + + + Južno-korejski Von + + + Kuvajtski dinar + + + Litvanski litas + + + Luksemburški franak + + + Marokanski dirham + + + Malteška lira + + + Meksički peso + + + Malezijski ringgit + + + Holandski gulden + + + Norveška kruna + + + Novozelandski dolar + + + Peruanski nuevo sol + + + Filipinski peso + + + Pakistanski rupi + + + Portugalski eskudo + + + Rumunski leu + + + Srpski Dinar + + + Ruska rublja + + + Ruska rublja (1991-1998) + + + Švedska kruna + + + Singapurski dolar + + + Tolar + + + Slovačka kruna + + + Turska lira + + + Nova turska lira + + + Novi tajvanski dolar + + + Ukrajinska hrivnja + + + Američki dolar + + + Venecuelanski bolivar + + + Vijetnamski dong + + + Nepoznata ili nevažeća valuta + + + Din + + + Južna Afrika Rand + + + + + + da:d + ne:n + + + + diff --git a/libs/Zend/Locale/Data/sr_Latn_BA.xml b/libs/Zend/Locale/Data/sr_Latn_BA.xml new file mode 100644 index 0000000..c554c56 --- /dev/null +++ b/libs/Zend/Locale/Data/sr_Latn_BA.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + världen + Afrika + Nordamerika + Sydamerika + Oceanien + Västafrika + Centralamerika + Östafrika + Nordafrika + Centralafrika + södra Afrika + Nord- och Sydamerika + norra Amerika + Karibien + Östasien + södra Asien + Sydostasien + Sydeuropa + Australien och Nya Zeeland + Melanesien + Mikronesiska öarna + Polynesien + södra Centralasien + Asien + Centralasien + Västasien + Europa + Östeuropa + Nordeuropa + Västeuropa + Oberoende staters samvälde + Latinamerika och Karibien + Kanalöarna + Andorra + Förenade Arabemiraten + Afghanistan + Antigua och Barbuda + Anguilla + Albanien + Armenien + Nederländska Antillerna + Angola + Antarktis + Argentina + Amerikanska Samoa + Österrike + Australien + Aruba + Åland + Azerbajdzjan + Bosnien och Hercegovina + Barbados + Bangladesh + Belgien + Burkina Faso + Bulgarien + Bahrain + Burundi + Benin + S:t Barthélemy + Bermuda + Brunei + Bolivia + Brasilien + Bahamas + Bhutan + Bouvetön + Botswana + Vitryssland + Belize + Kanada + Kokosöarna + Kongo-Kinshasa + Centralafrikanska republiken + Kongo-Brazzaville + Schweiz + Elfenbenskusten + Cooköarna + Chile + Kamerun + Kina + Colombia + Costa Rica + Serbien och Montenegro + Kuba + Kap Verde + Julön + Cypern + Tjeckien + Tyskland + Djibouti + Danmark + Dominica + Dominikanska republiken + Algeriet + Ecuador + Estland + Egypten + Västsahara + Eritrea + Spanien + Etiopien + Finland + Fiji + Falklandsöarna + Mikronesien + Färöarna + Frankrike + Gabon + Storbritannien + Grenada + Georgien + Franska Guyana + Guernsey + Ghana + Gibraltar + Grönland + Gambia + Guinea + Guadeloupe + Ekvatorialguinea + Grekland + Sydgeorgien och Södra Sandwichöarna + Guatemala + Guam + Guinea-Bissau + Guyana + Hongkong + Heard- och McDonaldöarna + Honduras + Kroatien + Haiti + Ungern + Indonesien + Irland + Israel + Isle of Man + Indien + Brittiska Indiska oceanöarna + Irak + Iran + Island + Italien + Jersey + Jamaica + Jordanien + Japan + Kenya + Kirgizistan + Kambodja + Kiribati + Komorerna + S:t Kitts och Nevis + Nordkorea + Sydkorea + Kuwait + Caymanöarna + Kazakstan + Laos + Libanon + S:t Lucia + Liechtenstein + Sri Lanka + Liberia + Lesotho + Litauen + Luxemburg + Lettland + Libyen + Marocko + Monaco + Moldavien + Montenegro + S:t Martin + Madagaskar + Marshallöarna + Makedonien + Mali + Myanmar + Mongoliet + Macao + Nordmarianerna + Martinique + Mauretanien + Montserrat + Malta + Mauritius + Maldiverna + Malawi + Mexiko + Malaysia + Moçambique + Namibia + Nya Kaledonien + Niger + Norfolkön + Nigeria + Nicaragua + Nederländerna + Norge + Nepal + Nauru + Niue + Nya Zeeland + Oman + Panama + Peru + Franska Polynesien + Papua Nya Guinea + Filippinerna + Pakistan + Polen + S:t Pierre och Miquelon + Pitcairn + Puerto Rico + Palestinska territoriet + Portugal + Palau + Paraguay + Qatar + Yttre öar i Oceanien + Europeiska unionen + Réunion + Rumänien + Serbien + Ryssland + Rwanda + Saudiarabien + Salomonöarna + Seychellerna + Sudan + Sverige + Singapore + S:t Helena + Slovenien + Svalbard och Jan Mayen + Slovakien + Sierra Leone + San Marino + Senegal + Somalia + Surinam + São Tomé och Príncipe + El Salvador + Syrien + Swaziland + Turks- och Caicosöarna + Tchad + Franska Sydterritorierna + Togo + Thailand + Tadzjikistan + Tokelau + Östtimor + Turkmenistan + Tunisien + Tonga + Turkiet + Trinidad och Tobago + Tuvalu + Taiwan + Tanzania + Ukraina + Uganda + USA:s yttre öar + USA + Uruguay + Uzbekistan + Vatikanstaten + S:t Vincent och Grenadinerna + Venezuela + Brittiska Jungfruöarna + Amerikanska Jungfruöarna + Vietnam + Vanuatu + Wallis- och Futunaöarna + Samoa + Jemen + Mayotte + Sydafrika + Zambia + Zimbabwe + okänd eller ogiltig regionkod + + + traditionell tysk stavning + 1994 års stavning + 1996 års reformerad tysk stavning + 1606 års stavning + 1694 års stavning + östarmeniska + västarmeniska + 1926 års stavning + Bila-dialekt + boontling + internationell fonetisk notation - IPA + uralisk fonetisk notation + Lipovaz-dialekt + monotonisk stavning + natisonsk dialekt + Njiva-dialekt + Osojane-dialekt + polytonisk stavning + reformerad stavning + resisk dialekt + saho-dialekt + skotska + scouse + Solbica-dialekt + Taraskievika-stavning + valensisk dialekt + + + kalender + sorteringsordning + valuta + + + traditionell kinesiska i big5-ordning + buddistisk kalender + kinesisk kalender + direkt ordning + förenklad kinesiska i gb2312-ordning + gregoriansk kalender + hebreisk kalender + indisk kalender + islamisk kalender + islamisk civil kalender + japansk kalender + telefonkatalogsordning + pinyinordning + kinesiska republikens kalender + streckordning + traditionell ordning + + + engelska enheter + SI-enheter + + + språk: {0} + skrift: {0} + område: {0} + + + + lowercase-words + lowercase-words + lowercase-words + lowercase-words + lowercase-words + lowercase-words + lowercase-words + titlecase-words + lowercase-words + lowercase-words + + + [a-v x-z å ä ö] + [á à â ã ā ç é ë í-ï ī ñ ó ú w ÿ ü æ ø] + [a-z] + + + + + + + + + {0} till {1} + + + fm + em + + + + EEEE d MMMM yyyy + + + + + d MMMM yyyy G + + + + + d MMM yyyy G + + + + + yyyy-MM-dd + + + + + + MMM -yy + + + + + + + + tout + bâbâ + hâtour + kiahk + toubah + amshîr + barmahât + barmoudah + bashans + ba’ounah + abîb + misra + al-nasi + + + + + + + + + mäskäräm + teqemt + hedar + tahesas + yäkatit + mägabit + miyazya + guenbot + säné + hamlé + nähasé + pagumén + + + + + + + + + jan + feb + mar + apr + maj + jun + jul + aug + sep + okt + nov + dec + + + januari + februari + mars + april + maj + juni + juli + augusti + september + oktober + november + december + + + + + J + F + M + A + M + J + J + A + S + O + N + D + + + + + + + sön + mån + tis + ons + tors + fre + lör + + + söndag + måndag + tisdag + onsdag + torsdag + fredag + lördag + + + + + S + M + T + O + T + F + L + + + + + + + K1 + K2 + K3 + K4 + + + 1:a kvartalet + 2:a kvartalet + 3:e kvartalet + 4:e kvartalet + + + + + 1 + 2 + 3 + 4 + + + + fm + em + + + före Kristus + efter Kristus + + + f.Kr. + e.Kr. + + + + + + EEEE 'den' d MMMM yyyy + + + + + d MMMM yyyy + + + + + d MMM yyyy + + + + + yyyy-MM-dd + + + + + + + 'kl'. HH.mm.ss v + + + + + HH.mm.ss z + + + + + HH.mm.ss + + + + + HH.mm + + + + + + + {1} {0} + + + + HH.mm + HH.mm.ss + H.mm + L + E d/M + LLL + E d MMM + EEE d MMMM + E d MMMM + d MMMM + d MMM + d/M + dd/MM + d/M + d + hh.mm + HH:mm:ss + mm.ss + mm.ss + yyyy + yyyy-MM + EEE, yyyy-MM-dd + yyyy MMM + EEE d MMM yyyy + yyyy MMMM + yyyy Q + yyyy QQQ + yy-MM + MMM -yy + Q yy + yyyy-MM + MMM yyyy + QQQQ yyyy + + + {0} – {1} + + M-M + + + E d/M – E d/M + E d/M – E d/M + + + MMM–MMM + + + E d MMM – E d MMM + E d – E d MMM + + + LLLL–LLLL + + + d MMM – d MMM + d–d MMM + + + d/M – d/M + d/M – d/M + + + d–d + + + HH–HH + HH-HH + + + HH.mm–HH.mm + HH.mm-HH.mm + HH.mm-HH.mm + + + HH.mm–HH.mm v + HH.mm-HH.mm v + HH.mm-HH.mm v + + + HH–HH + HH-HH v + + + y-y + + + yyyy-MM - yyyy-MM + yyyy-MM – yyyy-MM + + + E, yyyy-MM-dd – E, yyyy-MM-dd + E, yyyy-MM-dd – E, yyyy-MM-dd + E, yyyy-MM-dd – E, yyyy-MM-dd + + + MMM-MMM yyyy + MMM yyyy – MMM yyyy + + + E dd MMM–E dd MMM yyyy + E dd MMM–E dd MMM yyyy + E dd MMM yyyy–E dd MMM yyyy + + + d MMM–d MMM yyyy + d–d MMM yyyy + d MMM yyyy–d MMM yyyy + + + yyyy-MM-dd - yyyy-MM-dd + yyyy-MM-dd – dd + yyyy-MM-dd – yyyy-MM-dd + + + + + + era + + + år + + + månad + + + vecka + + + dag + idag + imorgon + i övermorgon + igår + i förrgår + för tre dagar sedan + + + veckodag + + + tidsvisning + + + timme + + + minut + + + sekund + + + tidszon + + + + + + + + tishrí + heshván + kislév + tevét + shevát + adár + adár II + nisán + ijjár + siván + tammúz + ab + elúl + + + tishrí + heshván + kislév + tevét + shevát + adár + adár II + nisán + ijjár + siván + tammúz + ab + elúl + + + + + + + + + chaitra + vaishākh + jyaishtha + āshādha + shrāvana + bhādrapad + āshwin + kārtik + mārgashīrsha + paush + māgh + phālgun + + + + + + + + + muharram + safar + rabi’ al-awwal + rabi’ al-akhir + jumada-l-ula + jumada-l-akhira + rajab + sha’ban + ramadan + dhu-l-ga’da + dhu-l-hijja + + + muharram + safar + rabi’ al-awwal + rabi’ al-akhir + jumada-l-ula + jumada-l-akhira + rajab + sha’ban + ramadan + shawwal + dhu-l-ga’da + dhu-l-hijja + + + + + muharram + safar + rabi’ al-awwal + rabi’ al-akhir + jumada-l-ula + jumada-l-akhira + rajab + sha’ban + ramadan + dhu-l-ga’da + dhu-l-hijja + + + + + + + + + farvardin + ordibehesht + khordād + tir + mordād + shahrivar + mehr + ābān + āzar + dey + bahman + esfand + + + + + + + +HH.mm;-HH.mm + GMT{0} + {0} + {0}tid ({1}) + + Okänd + + + Tirana + + + Jerevan + + + Curaçao + + + sydpolen + + + Dumont d’Urville + + + Ushuaïa + + + San Salvador de Jujuy + + + Córdoba + + + Pango Pango + + + Wien + + + Dacca + + + Bryssel + + + Porto Novo + + + Eirunepé + + + Cuiabá + + + Belém + + + São Paulo + + + Maceió + + + Thimpu + + + Gabonore + + + Régina + + + Montréal + + + St. Johns + + + Zürich + + + Påskön + + + Bogotá + + + Havanna + + + Kap Verde + + + Julön + + + Prag + + + Köpenhamn + + + Alger + + + Galápagos + + + Tallin + + + Kairo + + + Kanarieöarna + + + Addis Abeba + + + Helsingfors + + + Torshamn + + + + + Godthåb + + + Ittoqqortoormiit + + + + + Malobo + + + Aten + + + Grytviken + + + Hongkong + + + Tequciqalpa + + + Port au Prince + + + Kolkata + + + Bagdad + + + Teheran + + + Rom + + + S:t Kitts + + + Söul + + + + + Alma-Ata + + + S:t Lucia + + + Vadus + + + Luxemburg + + + Chrisinau + + + Podgorika + + + + + Tjojbalsan + + + Macao + + + Maldiverna + + + Mazatlán + + + Mérida + + + Cancún + + + Kathmandu + + + Muskat + + + Manilla + + + Warszawa + + + Azorerna + + + Lissabon + + + Asunción + + + Réunion + + + Bukarest + + + Belgrad + + + Moskva + + + Jekaterinburg + + + Krasnojarsk + + + Jakutsk + + + Sachalin + + + Kamtjatka + + + Anadir + + + Ljubliana + + + São Tomé + + + San Salvador + + + Damaskus + + + Dusjanbe + + + Uzjgorod + + + Zaporizjzja + + + North Dakota + + + Tasjkent + + + Saint Vincent + + + Saint Thomas + + + Lukasa + + + + västbrasiliansk tid + västbrasiliansk normaltid + västbrasiliansk sommartid + + false + + + + afghanisk tid + afghanisk normalid + afghanisk sommartid + + + + + centralafrikansk tid + centralafrikansk tid + centralafrikansk sommartid + + false + + + + östafrikansk tid + östafrikansk normaltid + östafrikansk sommartid + + false + + + + västsaharisk tid + västsaharisk normaltid + västsaharisk sommartid + + + + + sydafrikansk tid + sydafrikansk normaltid + sydafrikansk sommartid + + false + + + + västafrikansk tid + västafrikansk normaltid + västafrikansk sommartid + + false + + + + Aqtobetid + Aqtobenormaltid + Aqtobesommartid + + + + + alaskatid + Alaska, normaltid + Alaska, sommartid + + + + + hawaiiansk tid + hawaiisk normaltid + hawaiisk sommartid + + + + + Alma-Atatid + Alma-Atanormaltid + Alma-Atasommartid + + + + + amazonastid + Amazonasnormaltid + Amazonassommartid + + + + + centralnordamerikansk tid + Central, normaltid + Central, sommartid + + + + + östnordamerikansk tid + Eastern, normaltid + Eastern, sommartid + + + + + Klippiga Bergentid + Mountain, normaltid + Mountain, sommartid + + + + + västnordamerikansk tid + Pacific, normaltid + Pacific, sommartid + + + + + Anadirtid + Anadirnormaltid + Anadirsommartid + + + + + Aqtautid + Aqtaunormaltid + Aqtausommartid + + + + + Aqtöbetid + Aqtöbenormaltid + Aqtöbesommartid + + + + + saudiarabisk tid + saudiarabisk normaltid + saudiarabisk sommartid + + + AT (saudiarabisk) + AST (saudiarabisk) + ADT (saudiarabisk) + + + + + östargentinsk tid + östargentinsk normaltid + östargentinsk sommartid + + + + + västargentinsk tid + västargentinsk normaltid + västargentinsk sommartid + + + + + armenisk tid + armenisk normaltid + armenisk somartid + + + + + Ashkhabadtid + Ashkhabadnormaltid + Ashkhabadsommartid + + + + + nordamerikansk atlanttid + Atlantic, normaltid + Atlantic, sommartid + + + + + centralaustralisk tid + centralaustralisk normaltid + centralaustralisk sommartid + + + + + östaustralisk tid + östaustralisk normaltid + östaustralisk sommartid + + + + + västaustralisk tid + västaustralisk normaltid + västaustralisk sommartid + + + + + azerbajdzjansk tid + azerbajdzjansk normaltid + azerbajdzjansk sommartid + + + + + azorisk tid + azorisk normaltid + azorisk sommartid + + + + + Bakutid + Bakunormaltid + Bakusommartid + + + + + bangladeshisk tid + bangladeshisk normaltid + bangladeshisk sommartid + + + + + beringsundstid + beringsundsnormaltid + beringsundssommartid + + + + + bhutansk tid + bhutansk normaltid + bhutansk sommartid + + + + + boliviansk tid + boliviansk normaltid + boliviansk sommartid + + + + + borneotid + Borneonormaltid + Borneosommartid + + + + + brasiliansk tid + Brasilianormaltid + Brasiliasommartid + + + + + brittisk tid + brittisk normaltid + brittisk sommartid + + + + + Bruneitid + Bruneinormaltid + Bruneisommartid + + + + + Kap Verdetid + Kap Verdenormaltid + Kap Verdesommartid + + + + + chamorrotid + Chamorronormaltid + Chamorrosommartid + + + + + changbaitid + Changbainormaltid + Changbaisommartid + + + + + Chathamtid + Chathamnormaltid + Chathamsommartid + + + + + chilensk tid + chilensk normaltid + chilensk sommartid + + + + + kinesisk tid + Kina, normaltid + Kina, sommartid + + + + + Choibalsantid + Choibalsannormaltid + Choibalsansommartid + + + + + Julöns tid + Julöns normaltid + Julöns sommartid + + + + + Keelingöarnas tid + Keelingöarnas normaltid + Keelingöarnas sommartid + + + + + colombiansk tid + colombiansk normaltid + colombiansk sommartid + + + + + Cooköarnas tid + Cooköarnas normaltid + Cooköarnas sommartid + + + + + kubansk tid + kubansk normaltid + kubansk sommartid + + + + + daccatid + Daccanormaltid + Daccasommartid + + + + + dominikansk tid + dominikansk normaltid + dominikansk sommartid + + + + + Dushanbetid + Dushanbenormaltid + Dushanbesommartid + + + + + Holländska Guianatid + Holländska Guiananormaltid + Holländska Guianasommartid + + + + + östimoransk tid + östimorisk normaltid + östimorisk sommartid + + + + + Påsköns tid + Påsköns normaltid + Påsköns sommartid + + + + + equadoriansk tid + equadoriansk normaltid + equadoriansk sommartid + + + + + centraleuropeisk tid + Centraleuropa, normaltid + Centraleuropa, sommartid + + true + + + + östeuropeisk tid + Östeuropa, normaltid + Östeuropa, sommartid + + true + + + + västeuropeisk tid + västeuropeisk normaltid + västeuropeisk sommartid + + true + + + + falklandsöarnas tid + falklandsöarnas normaltid + falklandsöarnas sommartid + + + + + Fijis tid + Fijis normaltid + Fijis sommartid + + + + + Franska Guianatid + Franska Guiananormaltid + Franska Guianasommartid + + + + + Franska Sydterritoriernas tid + Franska Sydterritoriernas normaltid + Franska Sydterritoriernassommartid + + + + + Bisjkektid + Bisjkeknormaltid + Bisjkeksommartid + + + + + Greenwichtid + Greenwichtid + Greenwichtid har per definition ingen sommartid + + true + + + + galapagostid + Galápagosnormaltid + Galápagossommartid + + + + + Gambiertid + Gambiernormaltid + Gambiersommartid + + + + + georgientid + georgisk normaltid + georgisk sommartid + + + + + Kiribatitid + Kiribatinormaltid + Kiribatisommartid + + + + + Goose Baytid + Goose Baynormaltid + Goose Baysommartid + + + + + centralgrönländsk tid + centralgrönländsk normaltid + centralgrönländsk sommartid + + + + + östgrönländsk tid + östgrönländsk normaltid + östgrönländsk sommartid + + + + + västgrönländsk tid + västgrönländsk normaltid + västgrönländsk sommartid + + + + + Guamtid + Guamnormaltid + Guamsommartid + + + + + persiska golfen-tid + persiska golfen-tid + Persiska Golfensommartid + + + + + Guyanatid + Guyananormaltid + Guyanasommartid + + + + + Honolulutid + Honolulunormaltid + Honolulusommartid + + + + + Hongkongtid + Hongkongnormaltid + Hongkongsommartid + + + + + Hovdtid + Hovdnormaltid + Hovdsommartid + + + + + indisk tid + indisk normaltid + indisk sommartid + + + + + Brittiska Indiska oceanöarnas tdi + Brittiska Indiska oceanöarnas normaltdi + Brittiska Indiska oceanöarnas sommartdi + + + + + indokinesisk tid + indokinesisk normaltid + indokinesisk sommartid + + + + + centralindonesisk tid + centralindonesisk normaltid + centralindonesisk sommartid + + + + + östindonesisk tid + östindonesisk normaltid + östindonesisk sommartid + + + + + västindonesisk tid + västindonesisk normaltid + västindonesisk sommartid + + + + + iransk tid + iransk normaltid + iransk sommartid + + + + + irländsk tid + irländsk normaltid + irländsk sommartid + + + + + Irkutsktid + Irkutsknormaltid + Irkutsksommartid + + + + + israelisk tid + Israel, normaltid + Israel, sommartid + + + IT + IST (Israel) + + + + + japansk tid + Japan, normaltid + Japan, sommartid + + + + + Kamtjatkatid + Kamtjatkanormaltid + Kamtjatkasommartid + + + + + Karachisommartid + + + + + Kashgartid + Kashgarnormaltid + Kashgarsommartid + + + + + Alma-Atatid + Alma-Atanormaltid + Alma-Atasommartid + + + + + Aqtöbetid + Aqtöbenormaltid + Aqtöbesommartid + + + + + Qyzylordatid + Qyzylordanormaltid + Qyzylordasommartid + + + + + koreansk tid + koreansk normaltid + koreansk sommartid + + + + + Kosraetid + Kosraenormaltid + Kosraesommartid + + + + + Krasnojarsktid + Krasnojarsknormaltid + Krasnojarsksommartid + + + + + Kuybyshevtid + Kuybyshevnormaltid + Kuybyshevsommartid + + + + + Marshallöarnas tid + Marshallöarnas normaltid + Marshallöarnas sommartid + + + + + kirgizisk tid + kirgizisk normaltid + kirgizisk sommartid + + + + + Sri Lankatid + Sri Lankanormaltid + Sri Lankasommartid + + + + + liberiansk tid + liberiansk normaltid + liberiansk sommartid + + + + + Lineöarnas tid + Lineöarnas normaltid + Lineöarnas sommartid + + + + + Chongqingtid + Chongqingnormaltid + Chongqingsommartid + + + + + Macautid + Macaunormaltid + Macausommartid + + + + + Magadantid + Magadannormaltid + Magadansommartid + + + + + malaysisk tid + malaysisk normaltid + malaysisk sommartid + + + + + malaysisk tid + malaysisk normaltid + malaysisk sommartid + + + + + Maldivernas tid + Maldivernas normaltid + Maldivernas sommartid + + + + + Marquesastid + Marquesasnormaltid + Marquesassommartid + + + + + Marshallötid + Marshallönormaltid + Marshallösommartid + + + + + Mauritiussommartid + Mauritiustid + + + + + Ulan Bator-tid + Ulan Batornormaltid + Ulan Batorsommartid + + + + + Moskvatid + Moskvanormaltid + Moskvasommartid + + + + + burmesisk tid + burmesisk normaltid + burmesisk sommartid + + + + + Naurutid + Naurunormaltid + Naurusommartid + + + + + nepalesisk tid + nepalesisk normaltid + nepalesisk sommartid + + + + + Nya Kaledonientid + Nya Kaledoniennormaltid + Nya Kaledoniensommartid + + + + + nyzeeländsk tid + nyzeeländsk normaltid + nyzeeländsk sommartid + + + + + New Foundland-tid + Newfoundland, normaltid + Newfoundland, sommartid + + + + + Niuetid + Niuenormaltid + Niuesommartid + + + + + Norfolköns tid + Norfolköns normaltid + Norfolköns sommartid + + + + + Fernando de Noronhatid + Fernando de Noronhanormalid + Fernando de Noronhasommartid + + + + + Nordmarianernas tid + Nordmarianernas normaltid + Nordmarianernas sommartid + + + + + Novosibirsktid + Novosibirsknormaltid + Novosibirsksommartid + + + + + Omsktid + Omsknormaltid + Omsksommartid + + + + + Oraltid + Oralnormaltid + Oralsommartid + + + + + pakistansk tid + pakistansk normaltid + pakistansk sommartid + + + + + Palautid + Palaunormaltid + Palausommartid + + + + + Papua Nya Guineas tid + Papua Nya Guineas normaltid + Papua Nya Guineas sommartid + + + + + paraguyansk tid + paraguyansk normalid + paraguyansk sommartid + + + + + peruansk tid + peruansk normalid + peruansk sommartid + + + + + filippinsk tid + filippinsk normaltid + filippinsk sommartid + + + + + Enderburytid + Enderburynormaltid + Enderburysommartid + + + + + Pierre och Miquelontid + Pierre och Miquelonnormalid + Pierre och Miquelonsommartid + + + + + Pitcairntid + Pitcairnnormaltid + Pitcairnsommartid + + + + + Ponapetid + Ponapenormaltid + Ponapesommartid + + + + + Qyzylordatid + Qyzylordanormaltid + Qyzylordasommartid + + + + + Réuniontid + Réunionnormaltid + Réunionsommartid + + + + + Sachalintid + Sachalinnormaltid + Sachalinsommartid + + + + + Samaratid + Samaranormaltid + Samarasommartid + + + + + Samarkandtid + Samarkandnormaltid + Samarkandsommartid + + + + + samoansk tid + samoansk normaltid + samoansk sommartid + + + + + Seychellernas tid + Seychellernas normaltid + Seychellernas sommartid + + + + + Aqtautid + Aqtaunormaltid + Aqtausommartid + + + + + Singaporetid + Singaporenormaltid + Singaporesommartid + + + + + Salomonöarnas tid + Salomonöarnas normaltid + Salomonöarnas sommartid + + + + + sydgeorgisk tid + sydgeorgisk normaltid + sydgeorgisk sommartid + + + + + Surinamtid + Surinamnormaltid + Surinamsommartid + + + + + Sverdlovsktid + Sverdlovsknormaltid + Sverdlovsksommartid + + + + + Tahititid + Tahitinormaltid + Tahitisommartid + + + + + Tadzjikistantid + Tadzjikistannormaltid + Tadzjikistansommartid + + + + + uzbekisk tid + uzbekisk normaltid + uzbekisk sommartid + + + + + georgisk tid + georgisk normaltid + georgisk sommartid + + + + + Tokelautid + Tokelaunormaltid + Tokelausommartid + + + + + Tongasommmartid + Tongatid + + + + + Truktid + Truknormaltid + Truksommartid + + + + + turkisk tid + turkisk normaltid + turkisk sommartid + + + + + turkmenisk tid + turkmenisk normaltid + turkmenisk sommartid + + + + + Tuvalutid + Tuvalunormaltid + Tuvalusommartid + + + + + Oraltid + Oralnormaltid + Oralsommartid + + + + + uruguayansk tid + uruguayansk normaltid + uruguayansk sommartid + + + + + Urumqitid + Urumqinormaltid + Urumqisommartid + + + + + uzbeskisk tid + uzbeskisk normaltid + uzbeskisk sommartid + + + + + Vanuatutid + Vanuatunormaltid + Vanuatusommartid + + + + + venezulansk tid + venezulansk normaltid + venezulansk sommartid + + + + + Vladivostoktid + Vladivostoknormaltid + Vladivostoksommartid + + + + + Volvogradtid + Volvogradnormaltid + Volvogradsommartid + + + + + Waketid + Wakenormaltid + Wakesommartid + + + + + Wallis- och Futunaöarnas tid + Wallis- och Futunaöarnas normaltid + Wallis- och Futunaöarnas sommartid + + + + + Jakutsktid + Jakutsknormaltid + Jakutsksommartid + + + + + Jekaterinburgtid + Jekaterinburgnormaltid + Jekaterinburgsommartid + + + + + Yerevantid + Yerevannormaltid + Yerevansommartid + + + + + Yukontid + Yukonnormaltid + Yukonsommartid + + + + + + + , +   + ; + % + 0 + # + + + + ×10^ + + + ¤¤¤ + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0 % + + + + + + + #,##0.00 ¤ + + + {0} {1} + {0} {1} + + + + andorransk peseta + andorranska pesetas + + + Förenade Arabemiratens dirham + Förenade Arabemiratens dirham + + + afghani (1927-2002) + afghani (1927-2002) + + + afghani + afghani + + + albansk gamla lek + albanska gamla lek + + + albansk lek + albanska lek + lek + + + armenisk dram + armeniska dram + dram + + + Nederländska Antillernas gulden + Nederländska Antillernas gulden + NA f. + + + angolansk kwanza + angolanska kwanza + + + angolansk kwanza (1977-1990) + angolanska kwanza (1977-1990) + + + angolansk ny kwanza (1990-2000) + angolanska nya kwanza (1990-2000) + + + angolansk kwanza reajustado (1995-1999) + angolanska kwanza reajustado (1995-1999) + + + argentinsk austral + argentinska australer + + + argentinsk peso (1983-1985) + argentinska pesos (1983-1985) + + + argentinsk peso + argentinsk peso + argentinska pesos + Arg$ + + + argentinsk gamla peso + argentinska gamla pesos + + + österrikisk schilling + österrikiska schilling + + + australisk dollar + australiska dollar + $A + + + Aruba-gulden + Aruba-gulden + + + azerbajdzjansk manat (1993-2006) + azerbajdzjanska manat (1993-2006) + + + azerbajdzjansk manat + AZN + + + bosnisk-hercegovinsk dinar + bosnisk-hercegovinska dinarer + BAD + + + bosnisk-hercegovinsk mark (konvertibel) + bosnisk-hercegovinska mark (konvertibla) + KM + + + Barbados-dollar + Barbados-dollar + BDS$ + + + bangladeshisk taka + bangladeshiska taka + Tk + + + belgisk franc (konvertibel) + belgiska franc (konvertibla) + + + belgisk franc + belgiska franc + BF + + + belgisk franc (finansiell) + belgiska franc (finansiella) + + + bulgarisk lev (1962–1999) + bulgariska lev (1962–1999) + + + bulgarisk lev (1952–1962) + bulgariska lev (1952–1962) + + + bulgarisk ny lev + bulgariska nya lev + + + Bahrain-dinar + BHD + BD + + + burundisk franc + burundiska franc + Fbu + + + Bermuda-dollar + Bermuda-dollar + Ber$ + + + Brunei-dollar + Brunei-dollar + + + boliviano + boliviano + + + boliviansk peso + bolivianska pesos + + + boliviansk mvdol + bolivianska mvdol + + + brasiliansk cruzeiro novo (1967-1986) + brasilianska cruzeiro novo (1967-1986) + + + brasiliansk cruzado + brasilianska cruzado + + + brasiliansk cruzeiro (1990-1993) + brasilianska cruzeiro (1990-1993) + + + brasiliansk real + brasilianska real + BRL + + + brasiliansk cruzado novo + brasilianska cruzado novo + + + brasiliansk cruzeiro + brasilianska cruzeiros + + + Bahamas-dollar + Bahamas-dollar + + + bhutanesisk ngultrum + bhutanesiska ngultrum + Nu + + + burmesisk kyat + burmesiska kyat + + + botswansk pula + botswanska pula + + + vitrysk ny rubel (1994-1999) + vitryska nya rubel (1994-1999) + + + vitrysk rubel + vitryska rubel + Rbl + + + belizisk dollar + BZD + BZ$ + + + kanadensisk dollar + kanadensiska dollar + Can$ + + + kongolesisk franc + kongolesiska franc + + + euro (konvertibelt konto, WIR Bank, Schweiz) + euro (konvertibelt konto, WIR Bank, Schweiz) + + + schweizisk franc + schweiziska franc + SwF + + + franc (konvertibelt konto, WIR Bank, Schweiz) + franc (konvertibelt konto, WIR Bank, Schweiz) + + + chilensk unidad de fomento + chilenska unidad de fomento + + + chilensk peso + chilenska pesos + Ch$ + + + Kina-dollar + Kina-dollar + + + kinesisk yuan renminbi + kinesiska yuan renminbi + Y + + + colombiansk peso + colombianska pesos + Col$ + + + colombiansk unidad de valor real + colombianska unidad de valor real + + + costarikansk colón + costarikanska colón + C + + + jugoslavisk dinar + jugoslaviska dinarer + + + tjeckoslovakiska krona + tjeckoslovakiska kronor + + + tjeckisk hård koruna + tjeckiska hårda koruna + + + kubansk peso + kubanska pesos + + + kapverdisk escudo + kapverdiska escudos + CVEsc + + + cypriotiskt pund + cypriotiska pund + £C + + + tjeckisk koruna + tjeckiska koruna + + + östtysk mark + östtyska mark + + + tysk mark + tyska mark + + + djiboutisk franc + djiboutiska franc + DF + + + dansk krona + danska kronor + DKr + + + dominikansk peso + dominikanska pesos + RD$ + + + algerisk dinar + algeriska dinarer + DA + + + ecuadoriansk sucre + ecuadorianska sucre + + + ecuadoriansk unidad de valor constante + ecuadorianska unidad de valor constante + + + estnisk krona + estniska kronor + + + egyptiskt pund + egyptiska pund + + + ekwele + ekwele + + + eritreansk nakfa + eritreanska nakfa + + + spansk peseta (konto) + spanska pesetas (konto) + + + spansk peseta (konvertibelt konto) + spanska pesetas (konvertibelt konto) + + + spansk peseta + spanska pesetas + + + etiopisk birr + etiopiska birr + Br + + + euro + euro + + + finsk mark + finska mark + mk + + + Fiji-dollar + Fiji-dollar + F$ + + + Falklandsöarnas pund + Falklandsöarnas pund + + + fransk franc + franska franc + + + brittiskt pund sterling + brittiska pund sterling + + + georgisk kupon larit + georgiska kupon larit + + + georgisk lari + georgiska lari + lari + + + ghanansk cedi (1979-2007) + ghananska cedi (1979-2007) + + + ghanansk cedi + ghananska cedi + + + gibraltiskt pund + gibraltiska pund + + + gambisk dalasi + gambiska dalasi + + + guineansk syli (1972-1986) + guineanska syli (1972-1986) + + + guineansk franc + guineanska franc + GF + + + guineansk syli + guineanska syli + + + ekvatorialguineansk ekwele + ekvatorialguineanska ekweler + + + grekisk drachma + grekiska drachmer + + + guatemalansk quetzal + guatemalanska quetzal + Q + + + Portugisiska Guinea-escudo + Portugisiska Guinea-escudos + + + Guinea-Bissau-peso + Guinea-Bissau-pesos + + + guyanansk dollar + guyanska dollar + G$ + + + Hongkong-dollar + Hongkong-dollar + HK$ + + + honduransk lempira + honduranska lempiror + L + + + kroatisk dinar + kroatiska dinarer + + + kroatisk kuna + kroatiska kunor + + + haitisk gourde + haitiska gourder + + + ungersk forint + ungerska forinter + Ft + + + indonesisk rupiah + indonesiska rupier + Rp + + + irländskt pund + irländska pund + IR£ + + + israeliskt pund + israeliska pund + + + israelisk gammal shekel + israeliska gamla shekel + + + israelisk ny shekel + israeliska nya shekel + + + indisk rupie + indiska rupier + INR + + + irakisk dinar + irakiska dinarer + ID + + + iransk rial + iranska rial + RI + + + isländsk krona + isländska kronor + + + italiensk lira + italienska lire + + + Jamaica-dollar + Jamaica-dollar + J$ + + + jordansk dinar + jordanska dinarer + JD + + + japansk yen + japanska yen + + + kenyansk shilling + kenyanska shilling + K Sh + + + kirgizisk som + kirgiziska somer + som + + + kambodjansk riel + kambodjanska riel + CR + + + komorisk franc + komoriska franc + CF + + + nordkoreansk won + nordkoreanska won + + + sydkoreansk won + sydkoreanska won + + + kuwaitisk dinar + kuwaitiska dinarer + KD + + + Cayman-dollar + Cayman-dollar + KYD + + + kazakisk tenge + kazakiska tenger + T + + + laotisk kip + laotiska kiper + + + libanesiskt pund + libanesiska pund + LL + + + srilankesisk rupie + srilankesiska rupier + SL Re + + + Liberia-dollar + Liberia-dollar + + + lesothisk loti + lesothiska lotier + M + + + lesothisk maloti + lesothiska malotier + + + lettisk lita + litauiska litor + + + lettisk talonas + lettiska talonas + + + luxemburgsk franc (konvertibel) + luxemburgska franc (konvertibla) + + + luxemburgsk franc + luxemburgska franc + + + luxemburgsk franc (finansiell) + luxemburgska franc (finansiella) + + + lettisk lats + lettiska lats + + + lettisk rubel + lettiska rubel + + + libysk dinar + libyska dinarer + LD + + + marockansk dirham + marockanska dirhamer + + + marockansk franc + marockanska franc + + + moldavisk leu + moldaviska leu + + + madagaskisk ariary + madagaskiska ariary + + + madagaskisk franc + madagaskiska franc + + + makedonisk denar + makedoniska denarer + MDen + + + malisk franc + maliska franc + + + myanmarisk kyat + myanmariska kyat + + + mongolisk tugrik + mongoliska tugrik + Tug + + + Macao-pataca + Macao-pataca + + + mauretansk ouguiya + mauretanska ouguiya + UM + + + maltesisk lira + maltesiska lire + Lm + + + maltesiskt pund + maltesiska pund + + + mauritisk rupie + mauritiska rupier + + + maldivisk rufiyaa + maldiviska rufiyer + + + malawisk kwacha + malawiska kwacha + MK + + + mexikansk peso + mexikanska pesos + MEX$ + + + mexikansk silverpeso (1861-1992) + mexikanska silverpesos (1861-1992) + + + mexikansk unidad de inversion + mexikanska unidad de inversion + + + malaysisk ringgit + malaysiska ringgiter + RM + + + moçambikisk escudo + moçambikiska escudos + + + gammal moçambikisk metical + gammla moçambikiska metical + Mt + + + moçambikisk metical + moçambikiska metical + + + Namibia-dollar + Namibia-dollar + N$ + + + nigeriansk naira + nigerianska naira + + + nicaraguansk córdoba + nicaraguanska córdoba + + + nicaraguansk córdoba oro + nicaraguanska córdoba oro + + + nederländsk gulden + nederländska gulden + + + norsk krona + norska kronor + NKr + + + nepalesisk rupie + nepalesiska rupier + Nrs + + + nyzeeländsk dollar + nyzeeländska dollar + $NZ + + + omansk rial + omanska rial + RO + + + panamansk balboa + panamanska balboa + + + peruansk inti + peruanska intier + + + peruansk sol nuevo + peruanska sol nuevo + + + peruansk sol + peruanska sol + + + papuansk kina + papuanska kinor + + + filippinsk peso + filippinska pesos + + + pakistansk rupie + pakistanska rupier + Pra + + + polsk zloty + polska zloty + Zl + + + polsk zloty (1950-1995) + polska zloty (1950-1995) + + + portugisisk escudo + portugisiska escudos + + + paraguaysk guarani + paraguayska guarani + + + qatarisk rial + qatariska rial + QR + + + rhodesisk dollar + rhodesiska dollar + + + ROK + + + gammal rumänsk leu + gamla rumänska leu + leu + + + rumänsk leu + rumänska leu + + + Serbisk dinar + serbiska dinarer + + + rysk rubel + ryska rubel + + + rysk rubel (1991-1998) + ryska rubel (1991-1998) + + + rwandisk franc + rwandiska franc + + + saudisk riyal + saudiska riyal + SRl + + + Salomon-dollar + Salomon-dollar + SI$ + + + seychellisk rupie + seychelliska rupier + SR + + + sudanesisk dinar + sudanska gamla dinarer + + + sudanesiskt pund + sudanska pund + + + gammalt sudanesiskt pund + sudanska gamla pund + + + svensk krona + svenska kronor + kr + + + Singapore-dollar + Singapore-dollar + S$ + + + S:t Helena-pund + S:t Helena-pund + + + slovensk tolar + slovenska tolar + + + slovakisk koruna + slovakiska korunor + Sk + + + sierraleonsk leone + sierraleonska leoner + + + somalisk shilling + somaliska shilling + Sh. + + + Surinam-dollar + Surinam-dollar + + + surinamesisk gulden + Surinam-gulden + Sf + + + São Tomé och Príncipe-dobra + São Tomé och Príncipe-dobror + Db + + + sovjetisk rubel + sovjetiska rubler + + + salvadoransk colón + salvadoranska colón + + + syriskt pund + syriska pund + LS + + + swaziländsk lilangeni + swaziländska lilangeni + E + + + thailändsk baht + thailändska baht + + + tadzjikisk rubel + tadzjikiska rubler + + + tadzjikisk somoni + tadzjikiska somoni + + + turkmensk manat + turkmenska manat + + + tunisisk dinar + tunisiska dinarer + + + tongansk paʻanga + tonganska paʻanga + T$ + + + timoriansk escudo + timorianska escudos + + + gammal turkisk lira + gammal turkisk lira + gamla turkiska lire + TL + + + ny turkisk lira + turkisk lira + turkiska lire + + + Trinidad ochTobago-dollar + Trinidad ochTobago-dollar + TT$ + + + taiwanesisk ny dollar + taiwanesiska nya dollar + NT$ + + + tanzanisk shilling + tanzaniska shilling + T Sh + + + ukrainsk hryvnia + ukrainska hryvnia + + + ukrainsk karbovanetz + ukrainska karbovanetz + + + ugandisk shilling (1966-1987) + ugandiska shilling (1966-1987) + + + UGW + + + ugandisk shilling + ugandiska shilling + U Sh + + + US-dollar + US-dollar + + + US-dollar (nästa dag) + US-dollar (nästa dag) + + + US-dollar (samma dag) + US-dollar (samma dag) + + + uruguayanska peso en unidades indexadas + + + UYN + + + uruguayansk peso (1975-1993) + uruguayanska pesos (1975-1993) + + + uruguayansk peso + uruguayanska pesos + Ur$ + + + uzbekisk sum + uzbekiska sum + + + venezuelansk bolivar + venezuelanska bolivar + Be + + + venezuelansk bolivar fuerte + venezuelanska bolivar fuerte + + + vietnamesisk gammal dong + vietnamesiska gamla dong + + + vietnamesisk dong + vietnamesiska dong + + + vanuatisk vatu + vanuatiska vatu + VT + + + västsamoansk tala + västsamoanska tala + + + CFA Franc BEAC + centralafrikanska franc + + + silver + silveruns + + + guld + gulduns + + + europeisk kompositenhet + europeiska kompositenheter + + + europeisk monetär enhet + europeiska monetära enheter + + + europeisk kontoenhet (XBC) + europeiska kontoenheter (XBC) + + + europeisk kontoenhet (XBD) + europeiska kontoenheter (XBD) + + + östkaribisk dollar + östkaribiska dollar + EC$ + + + IMF särskild dragningsrätt + IMF särskilda dragningsrätter + + + europeisk valutaenhet + europeiska valutaenheter + + + fransk guldfranc + franska guldfranc + + + French UIC-Franc + internationella järnvägsunionens franc + + + CFA Franc BCEAO + västafrikanska franc + + + palladium + palladium + + + CFP-franc + Stilla Havet-franc + CFPF + + + platina + platina + + + RINET-fond + RINET-fond + + + test-valutakod + test-valutakod + + + okänd eller ogiltig valuta + okänd/ogiltig valuta + okänd eller ogiltig valuta + + + jemenitisk dinar + jemenitiska dinarer + + + jemenitisk rial + jemenitiska rial + YRl + + + jugoslavisk hård dinar + jugoslaviska hårda dinarer + + + jugoslavisk ny dinar + jugoslaviska nya dinarer + + + jugoslavisk dinar (konvertibel) + jugoslaviska dinarer (konvertibla) + + + sydafrikansk rand (finansiell) + sydafrikanska rand (finansiella) + + + sydafrikansk rand + sydafrikanska rand + R + + + zambisk kwacha + zambiska kwacha + + + zairisk ny zaire + zaïriska nya zaïre + + + zairisk zaire + zaïriska zaïre + + + Zimbabwe-dollar + Zimbabwe-dollar + Z$ + + + + + + {0} dag + {0} dagar + + + {0} timme + {0} timmar + + + {0} minut + {0} minuter + + + {0} månad + {0} månader + + + {0} sekund + {0} sekunder + + + {0} vecka + {0} veckor + + + {0} år + {0} år + + + + + ja:j + nej:n + + + diff --git a/libs/Zend/Locale/Data/sv_FI.xml b/libs/Zend/Locale/Data/sv_FI.xml new file mode 100644 index 0000000..481e63d --- /dev/null +++ b/libs/Zend/Locale/Data/sv_FI.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + fenikiska + + + Amerika + Bosnien-Hercegovina + Hongkong + Macao + USA:s yttre öar + + + 1996 års stavning + internationell fonetisk notation (IPA) + uralisk fonetisk notation (UPA) + + + kinesiska i big5-sorteringsordning + kinesiska i gb2312-sorteringsordning + telefonkatalogssorteringsordning + kinesiska i pinyin-sorteringsordning + kinesiska i strecksorteringsordning + traditionell sorteringsordning + + + imperiska enheter + + + + [a à b-e é f-v x-z å ä ö] + [à ã ç é ë í ñ ó š w ÿ ü ž] + + + + + + + dagsperiod + + + + + + +HH:mm;−HH:mm + + + + diff --git a/libs/Zend/Locale/Data/sv_SE.xml b/libs/Zend/Locale/Data/sv_SE.xml new file mode 100644 index 0000000..94e673f --- /dev/null +++ b/libs/Zend/Locale/Data/sv_SE.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/sw.xml b/libs/Zend/Locale/Data/sw.xml new file mode 100644 index 0000000..dac6ae6 --- /dev/null +++ b/libs/Zend/Locale/Data/sw.xml @@ -0,0 +1,408 @@ + + + + + + + + + + + kiafrikans + kiamhariki + kiarabu + kubafu + kiazabaijani + kibelarusi + kibulgaria + kibihari + kibengali; kibangla + kibreton + kibosnia + kikatalan + kicheki + kiwelsh + kidenmarki + kijerumani + kigiriki + kiingereza + kiesperanto + kihispania + kiestonia + kibaski + kiajemi + kifinlandi + kitagalog + kifaroe + kifaransa + kifrisia + kiairish + kiskotlandi + kigalisia + guarani + kigujarati + kiyahudi + kihindi + kikroeshia + kihungari + muarmeni + kiinterlingua + kiindonesia + lugha ya kisayansi + kiaislandi + kiitaliano + kijapani + kijava + kijiojia + kicambodia + kikannada + kikorea + kikurdi + kugizi + kirumi + kilingala + kilaosi + kilithuania + kilatvia + kimasedonia + kimalayalam + kimongolia + kimarathi + kimalaysia + kimalta + kinepali + kiholanzi + kinorwei + kiositani + kioriya + kipunjabi + kipolandi + kipashto + kireno + kireno (brazil) + kireno (ureno) + kiromania + kirusi + kisanskriti + msindhi + kiserbia-kroeshia + kisinhali + kislovakia + kislovenia + kisomali + kialbania + kiserbia + sesotho + kinubi + kisweden + Kiswahili + kitamil + kitelugu + kithailand + kitigrinya + wataki weume + kiklingon + kituruki + kitwii + ombwa + kiukrania + kiurdu + kiuzbeki + kivietnam + kikhosa + kiyidish + kichina + kizulu + + + Muugano wa Falme za Nchi za Kiarabu + Antigua na Barbuda + Ajentina + Bosnia na Herzegowina + Ubelgiji + Brazili + Visiwa vya Bahama + Kanada + Jamhuri ya Afrika ya Kati + Kongo + Uswisi + Pwani ya Pembe + Kamerun + Uchina + Kolombia + Serbiya da Montenegro + Rasi Verde + Jamhuri ya Czech + Udachi + Jibuti + Udenmarki + Dominika + Jamhuri ya Dominikan + Ekvado + Misri + Uhispania + Uhabeshi + Ufaransa + Uingereza + Guinea ya Ikweta + Kroatia + Hungaria + Uyahudi + Uhindi + Iraki + Uajemi + Barafu + Uitaliani + Jamaika + Ujapani + Kenya + Kampuchea + Visiwa vya Komoro + Saint Kitts na Nevis + Korea ya Kaskazini + Korea ya Kusini + Luksemburg + Moroko + Monako + Visiwa vya Marshall + Meksiko + Malasya + Msumbiji + Nikaragua + Uholanzi + Unorwe + Nepali + Papua Guinea Mpya + Filipino + Ureno + Paragwai + Urusi + Arabuni Saudi + Visiwa vya Solomon + Visiwa vya Shelisheli + Uswidi + Somali + Sao Tome na Principe + Chadi + Timor ya Mashariki + Kitonga + Uturuki + Trinidad na Tobago + Tanzania + Muungano wa Nchi za Amerika + Urugwai + Vatikano + Saint Vincent na Grenadines + Yemeni + Afrika ya Kusini + + + + [a-d {dh} e-n {ng} {ng'} {ny} o p r s {sh} t {th} u-w y z] + [q x] + [a-z] + + + + + + + + + + + + + + Jan + Feb + Mac + Apr + Mei + Jun + Jul + Ago + Sep + Okt + Nov + Des + + + Januari + Februari + Machi + Aprili + Mei + Juni + Julai + Agosti + Septemba + Oktoba + Novemba + Desemba + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + Jpi + Jtt + Jnn + Jtn + Alh + Iju + Jmo + + + Jumapili + Jumatatu + Jumanne + Jumatano + Alhamisi + Ijumaa + Jumamosi + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + R1 + R2 + R3 + R4 + + + robo ya kwanza + robo ya pili + robo ya tatu + robo ya nne + + + + AM + PM + + + Kabla ya Kristo + Baada ya Kristo + + + KK + BK + + + + + + EEEE, yyyy MMMM dd + + + + + yyyy MMMM d + + + + + yyyy MMM d + + + + + yy/MM/dd + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1} {0} + + + + Q yy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + Saa za Africa Mashariki + + + + + + + + + #,##0.00 ¤ + + + + + + KSh + + + Shilingi ya Tanzania + TSh + + + + diff --git a/libs/Zend/Locale/Data/sw_KE.xml b/libs/Zend/Locale/Data/sw_KE.xml new file mode 100644 index 0000000..13249d0 --- /dev/null +++ b/libs/Zend/Locale/Data/sw_KE.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + ¤#,##0.00 + + + + + diff --git a/libs/Zend/Locale/Data/sw_TZ.xml b/libs/Zend/Locale/Data/sw_TZ.xml new file mode 100644 index 0000000..19bd645 --- /dev/null +++ b/libs/Zend/Locale/Data/sw_TZ.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/syr.xml b/libs/Zend/Locale/Data/syr.xml new file mode 100644 index 0000000..ed82478 --- /dev/null +++ b/libs/Zend/Locale/Data/syr.xml @@ -0,0 +1,221 @@ + + + + + + + + + + + ܣܘܪܝܝܐ + + + ܣܘܪܝܝܐ + + + + + + + [ܑ ܰ-݊ ܃-܉ ܁ ܂ ܀ ܊-܍ ܐ ܒ-ܔ ܖ ܕ ܗ-ܬ] + [܏\u200C \u200D ܭ-ܯ ݍ-ݏ] + + + + + + + + ܏ܟܢ ܏ܒ + ܫܒܛ + ܐܕܪ + ܢܝܣܢ + ܐܝܪ + ܚܙܝܪܢ + ܬܡܘܙ + ܐܒ + ܐܝܠܘܠ + ܏ܬܫ ܏ܐ + ܏ܬܫ ܏ܒ + ܏ܟܢ ܏ܐ + + + ܏ܟܢ ܏ܒ + ܫܒܛ + ܐܕܪ + ܢܝܣܢ + ܐܝܪ + ܚܙܝܪܢ + ܬܡܘܙ + ܐܒ + ܐܝܠܘܠ + ܏ܬܫ ܏ܐ + ܏ܬܫ ܏ܒ + ܏ܟܢ ܏ܐ + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + AM + PM + + + BCE + CE + + + + + + dd MMMM, yyyy + + + + + dd MMMM, yyyy + + + + + dd/MM/yyyy + + + + + dd/MM/yyyy + + + + + + + h:mm:ss a v + + + + + h:mm:ss a z + + + + + h:mm:ss + + + + + h:mm + + + + + + + {1} {0} + + + + dd MMMM + dd/MM + mm:ss + Q yy + MM/yyyy + MMMM, yyyy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + + + #,##0.###;#,##0.###- + + + + + + + ¤ #,##0.00;¤ #,##0.00- + + + + + + ل.س.‏ + + + + + diff --git a/libs/Zend/Locale/Data/syr_SY.xml b/libs/Zend/Locale/Data/syr_SY.xml new file mode 100644 index 0000000..16da753 --- /dev/null +++ b/libs/Zend/Locale/Data/syr_SY.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/ta.xml b/libs/Zend/Locale/Data/ta.xml new file mode 100644 index 0000000..727e29e --- /dev/null +++ b/libs/Zend/Locale/Data/ta.xml @@ -0,0 +1,614 @@ + + + + + + + + + + + அபார் + அப்காஸின் + ஆப்ரிகன்ஸ் + அம்ஹாரிக் + அரபு + அஸ்ஸாமி + அயமரா + அசர்பாய்ஜானி + பாஷ்கிர் + பைலோருஷ்ன் + பல்கேரியன் + பிஹாரி + பிஸ்லாமா + வங்காளம் + திபெத்து + பிரிடன் + போஸ்னியன் + காடலான் + கார்சியன் + செக் + வெல்ஷ் + டானிஷ் + ஜெர்மன் + புடானி + கிரேக்கம் + ஆங்கிலம் + எஸ்பரேன்டோ + ஸ்பேனிஷ் + எஸ்டோனியன் + பஸ்க் + பர்ஸியன் + பின்னிஷ் + ஃபிலிபினோ + பிஜி + பைரோஸி + பிரெஞ்சு + பிரிஷியன் + ஐரிஷ் + ஸ்காட்ஸ் காலெக் + கெலிஸியன் + குரானி + குஜராத்தி + ஹொஸா + ஹுப்ரு + இந்தி + கரோஷியன் + ஹங்கேரியன் + ஆர்மேனியன் + இன்டர்லிங்குவா [ia] + இந்தோனேஷியன் + இன்டர்லிங்குவா + இனுபெக் + ஐஸ்லென்டிக் + இத்தாலியன் + இனுகிடட் + ஜப்பானீஸ் + ஜாவானீஸ் + ஜியோர்ஜியன் + கசாக் + கிரின்லென்டிக் + கம்போடியன் + கன்னடம் + கொரியன் + கொங்கனி + காஷ்மிரி + குர்திஷ் + கிர்கிஷ் + லாதின் + லிங்காலா + லோத்தியன் + லுத்தேனியன் + லேட்வியன் (லேட்டிஷ்) + மலகெஸி + மோரி + மெக்கடோனியன் + மலையாளம் + மங்கோலியன் + மோல்டேவியன் + மராத்தி + மலாய் + மால்டிஸ் + பர்மிஸ் + நாரூ + நேப்பாலி + டச்சு + நார்வீஜியன் (நைநோர்ஸ்க்) + நார்வேகியன் + ஆகிடியன் + ஒரோம (அபன்) + ஒரியா + பஞ்சாபி + போலிஷ் + பேஷ்டோ (புஷ்டோ) + போர்த்துகீஸ் + போர்த்துக்கீசியம்(பிரேசில்) + போர்த்துகீசியம் (போர்ச்சுக்கல்) + கியுசா + ரைட்டோ-ரோமென்ஸ் + கிருந்தி + ரோமேனியன் + ரஷியன் + கின்யர்வென்டா + சமஸ்கிருதம் + சிந்தி + சென்க்ரோ + செர்போ-க்ரோஷியன் + சிங்களம் + ஸ்லோவெக் + ஸ்லோவினேயின் + ஸெமோன் + ஷோனா + சோமாலி + அல்பெனியன் + சர்பியன் + ஷிஸ்வாதி + ஷெஸ்ஸோதோ + சுடானீஸ் + ஷீவிடிஸ் + சுவாஹிலி + தமிழ் + தெலுங்கு + தாஜிக் + தாய் + டிக்ரின்யா + டர்க்மென் + டாகாலோக் + கிளிங்கன் + ஸெட்ஸ்வானா + டோங்கா + டர்கிஷ் + ஸோங்கா + டாடர் + த்திவி + யுகுர் + உக்ரேனியன் + உருது + உஸ்பெக் + வியட்நாமிஸ் + ஒலபுக் + ஒலோப் + ஹோஷா + ஈத்திஷ + யோருப்பா + ஜுவாங் + சீனம் + எளிய சீனம் + மரபு சீனம் + ஜூலூ + + + ஆப்ரிக்கா + மத்திய அமெரிக்கா + கிழக்கு ஆப்ரிக்கா + கரீபியன் + கிழக்கு ஆசியா + ஆஸ்திரேலியா மற்றும் நியூசிலாந்து + ஆசியா + மத்திய ஆசியா + கிழக்கு ஐரோப்பா + அன்டோரா + ஐக்கிய அரபு கூட்டாட்சி + ஆப்கானிஸ்தான் + ஆன்டிகுவா பார்புடா + அல்பேனியா + ஆர்மீனியா + அங்கோலா + அன்டார்டிகா + அர்ஜெண்டினா + அமெரிக்க சமோவா + ஆஸ்திரியா + ஆஸ்திரேலியா + ஆலந்து தீவுகள் + அஜர்பைஜான் + போஸ்னியா ஹெர்ஸிகோவினா + பார்படோஸ் + பங்களாதேஷ் + பெல்ஜியம் + பர்கினோ பாஸோ + பல்கேரியா + பஹ்ரைன் + புருண்டி + பெனின் + பெர்முடா + புரூனேய் + பொலிவியா + பிரேஸில் + பஹாமாஸ் + பூடான் + போட்ஸ்வானா + பெலாரூஸ் + பெலிஸ் + கனடா + காங்கோ - கின்சாசா + மத்திய ஆப்ரிக்கக் குடியரசு + காங்கோ + ஸ்விட்சர்லாந்து + ஐவரி கோஸ்ட் + குக் தீவுகள் + சிலி + கேமரூன் + சீன + கொலம்பியா + கோஸ்டாரிகா + கியூபா + கேப் வெர்டே + கிறிஸ்துமஸ் தீவு + சைப்ரஸ் + செக் குடியரசு + ஜெர்மன் + ஜிபௌடி + டென்மார்க் + டொமினிகா + டொமினிகன் குடியரசு + அல்ஜீரியா + ஈக்வடார் + எஸ்டோனியா + எகிப்து + ஸ்பெயின் + எதியோப்பியா + பின்லாந்து + பிஜி + பிரான்ஸ் + காபோன் + பிரிடிஷ் கூட்டரசு + கிரனெடா + ஜார்ஜியா + கானா + காம்பியா + கினி + ஈக்குவிடோரியல் கினி + கிரீஸ் + குவாத்தாமாலா + கினி-பிஸ்ஸாவ் + கயானா + ஹாண்டுராஸ் + குரோசியா + ஹெய்தி + ஹங்கேரி + இந்தோனேஷியா + அயர்லாந்து + இஸ்ரேல் + இந்தியா + இராக் + ஈரான் + ஐஸ்லாந்து + இத்தாலி + ஜமாய்க்கா + ஜொர்டான் + ஜப்பான் + கென்யா + கிர்கிஸ்தான் + கம்போடியா + கிரிபடி + கோமரோஸ் + வட கொரியா + தென் கொரியா + குவைத்து + கஜகஸ்தான் + லாவோஸ் + லெபனான் + லிச்டெண்ஸ்டீன் + இலங்கை + லைபீரியா + லெசோதோ + லிதுவேனியா + லக்ஸ்சம்பர்க் + லாட்வியா + லிப்யா + மொரோக்கோ + மொனாக்கோ + மால்டோவா + மசெடோணியா + மாலீ + மியான்மார் + மங்கோலியா + மால்டா + மோரிசியஸ் + மாலத்தீவு + மலாவீ + மெக்சிகோ + மலேஷியா + னாமீபியா + நிகாராகுவா + நெதர்லாந்து + நார்வே + நேபாளம் + நௌரு + நியூசிலாந்து + ஓமான் + பணாமா + பெரு + பாப்புவா-நியூகினி + பிலிப்பைன்ஸ் + பாகிஸ்தான் + போலந்து + போர்ச்சுக்கல் + பாரகுவே + காடார் + ருமேனியா + ரஷ்யா + சவூதி அரேபியா + சாலமன் தீவுகள் + ஸ்வீடன் + சிங்கப்பூர் + ஸ்லோவேனியா + ஸ்லோவாகியா + சான்மெரினோ + சூரினாம் + எல் சால்வடார் + சிரியா + சாட் + தாய்லாந்து + தாஜிகிஸ்தான் + கிழக்கு திமோர் + துர்க்மெனிஸ்தான் + துனிசியா + தொங்கா + துருக்கி + திரினிடாட் தொபாகோ + துவாலூ + தைவான் + உக்ரைன் + ஐக்கிய அமெரிக்கா குடியரசு + உருகுவே + உஸ்பெகிஸ்தான் + வாடிகன் + வெனஜுவேலா + வியட்நாம் + வனுவாட்டு + சமோவா + யேமன் + தென் ஆப்ரிக்கா + ஜிம்பாப்வே + + + + [ஃ அ-ஊ எ-ஐ ஒ-க ங ச ஜ ஞ ட ண த ந-ப ம-வ ஷ-ஹ ா-ூ ெ-ை ொ-்] + [a g i m t] + [a-z] + + + ' + ' + " + " + + + + + + + + ஜன. + பிப். + மார். + ஏப். + மே + ஜூன் + ஜூலை + ஆக. + செப். + அக். + நவ. + டிச. + + + ஜனவரி + பிப்ரவரி + மார்ச் + ஏப்ரல் + மே + ஜூன் + ஜூலை + ஆகஸ்ட் + செப்டம்பர் + அக்டோபர் + நவம்பர் + டிசம்பர் + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + ஞா + தி + செ + பு + வி + வெ + + + + ஞாயிறு + திங்கள் + செவ்வாய் + புதன் + வியாழன் + வெள்ளி + சனி + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + Q1 + Q2 + Q3 + Q4 + + + 1ஆம் காலாண்டு + 2ஆம் காலாண்டு + 3ஆம் காலாண்டு + 4ஆம் காலாண்டு + + + + காலை + மாலை + + + கிறிஸ்துவுக்கு முன் + அனோ டோமினி + + + கிமு + கிபி + + + + + + EEEE d MMMM yyyy + + + + + d MMMM yyyy + + + + + dd-MM-yyyy + + + + + d-M-yy + + + + + + + h:mm:ss a v + + + + + h:mm:ss a z + + + + + h:mm:ss a + + + + + h:mm a + + + + + + + {1} {0} + + + + d MMMM + dd-MM + Q yy + MM-yyyy + MMMM yyyy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + பிரிஸ்பேன் + + + கேம்போ கிராண்டே + + + கேம்பிரிட்ஜ் பே + + + ஈஸ்டர் + + + ஜகார்த்தா + + + ஜெயபூரா + + + லாஸ் ஏஞ்சல்ஸ் + + + ஃபோனிக்ஸ் + + + தேன்வர் + + + சென்டர் + + + சிகாகோ + + + இந்தியானாபோலிஸ் + + + நியூயார்க் + + + + இந்திய நேரப்படி + + true + + + + + + + + #,##,##0.### + + + + + + + #,##,##0% + + + + + + + ¤ #,##,##0.00 + + + + + + ரூ + + + + + + ஆம் + இல்லை + + + diff --git a/libs/Zend/Locale/Data/ta_IN.xml b/libs/Zend/Locale/Data/ta_IN.xml new file mode 100644 index 0000000..b8a31c7 --- /dev/null +++ b/libs/Zend/Locale/Data/ta_IN.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/te.xml b/libs/Zend/Locale/Data/te.xml new file mode 100644 index 0000000..a0f09df --- /dev/null +++ b/libs/Zend/Locale/Data/te.xml @@ -0,0 +1,337 @@ + + + + + + + + + + + అరబిక్ + బీహారి + బెంగాలి + చెక్ + డానిష్ + ఙర్మన్ + గ్రీకు + ఆంగ్లం + స్పానిష్ + ఈస్టోనియను + పార్శీ + ఫిన్నిష్ + ఫ్రెంచ్ + ఐరిష్ + గుజరాతి + హీబ్రూ + హిందీ + హంగేరియను + ఇండొనేసియన్ + ఐస్ లాండు + ఇటాలియన్ భాష + జపాను భాష + కన్నడ + లాటిన్ + లిథువేనియను + లాత్వియను + మలయాళం + మంగోలియన్ + మరాఠి + నేపాలి + డచ్ + నార్వేజియన్ + పంజాబి + పోలిష్ + పొర్చుగల్ భాష + రొమేనియను + రష్యన్ భాష + సింహళీ + స్వీడిష్ + స్వాహిలి + తమిళం + తెలుగు + థాయి + ఉర్దు + ఖోస + చైనా భాష + జూలూ + + + + + + + + + + + + బ్రజిల్ + చైనా + ఙర్మని + ఫ్రాన్స్‌ + బ్రిటన్ + భారత దేళం + ఇటలి + జపాసు + రష్య + ఠాఙ్గ + ఐక్య రాష్ట్ర అమెరిక + + + ప్రాచీన ఙర్మన వర్ణక్రమం + 1996 ఙర్మన వర్ణక్రమం + సవరించబడిన వర్ణక్రమం + + + + [అ-ఋ ౠ ఌ ౡ ఎ-ఐ ఒ-న ప-ళ వ-హ ఁ-ః ్ ా-ౄ ె-ై ొ-ౌ ౕ ౖ] + [\u200C \u200D ౦-౯ b c e g m q t] + + + ' + ' + " + " + + + + + + + + జనవరి + ఫిబ్రవరి + మార్చి + ఏప్రిల్ + మే + జూన్ + జూలై + ఆగస్టు + సెప్టెంబర్ + అక్టోబర్ + నవంబర్ + డిసెంబర్ + + + జనవరి + ఫిబ్రవరి + మార్చి + ఏప్రిల్ + మే + జూన్ + జూలై + ఆగస్టు + సెప్టెంబర్ + అక్టోబర్ + నవంబర్ + డిసెంబర్ + + + + + + ఫి + + + మె + జు + జు + + సె + + + డి + + + + + + + ఆది + సోమ + మంగళ + బుధ + గురు + శుక్ర + శని + + + ఆదివారం + సోమవారం + మంగళవారం + బుధవారం + గురువారం + శుక్రవారం + శనివారం + + + + + + 2 + సొ + భు + గు + శు + + + + + + + + Q1 + Q2 + Q3 + Q4 + + + ఒకటి 1 + రెండు 2 + మూడు 3 + నాలుగు 4 + + + + పూర్వాహ్నం + అపరాహ్నం + + + ఈసాపూర్వ. + సన్. + + + BCE + CE + + + + + + EEEE d MMMM yyyy + + + + + d MMMM yyyy + + + + + dd-MM-yyyy + + + + + dd-MM-yy + + + + + + + h:mm:ss a v + + + + + h:mm:ss a z + + + + + h:mm:ss a + + + + + h:mm a + + + + + + + {1} {0} + + + + d MMMM + dd-MM + Q yy + MM-yyyy + MMMM yyyy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + + + + + + #,##,##0.### + + + + + + + #,##,##0% + + + + + + + ¤ #,##,##0.00 + + + + + + బ్రజిల్ దేశ రియాల్ + రి$ + + + చైనా దేశ యువాన్ రెన్‌మిన్‌బి + యు + + + యురొ + + + బ్ిటిష్ పౌన్డ స్టెర్లిగ్ + + + రూపాయి + రూ. + + + జపాను దేశ యెస్ + + + రష్య దేశ రూబల్ + రూబల్ + + + ఐక్య రాష్ట్ర అమెరిక డాలర్ + + + + + + అవను + కాదు + + + diff --git a/libs/Zend/Locale/Data/te_IN.xml b/libs/Zend/Locale/Data/te_IN.xml new file mode 100644 index 0000000..838e48a --- /dev/null +++ b/libs/Zend/Locale/Data/te_IN.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/telephoneCodeData.xml b/libs/Zend/Locale/Data/telephoneCodeData.xml new file mode 100644 index 0000000..e7f478c --- /dev/null +++ b/libs/Zend/Locale/Data/telephoneCodeData.xml @@ -0,0 +1,747 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/libs/Zend/Locale/Data/tg.xml b/libs/Zend/Locale/Data/tg.xml new file mode 100644 index 0000000..787b887 --- /dev/null +++ b/libs/Zend/Locale/Data/tg.xml @@ -0,0 +1,269 @@ + + + + + + + + + + + Белорусӣ + Булғорӣ + Биҳарӣ + Бенгалӣ + Бретонӣ + Босниягӣ + Каталанӣ + Чехӣ + Даниягӣ + Немисӣ + Юнонӣ + Англисӣ + Эсперанто + Испанӣ + Эстонӣ + Баскӣ + Форсӣ + Финнӣ + Филиппинӣ + Фарозӣ + Фаронсавӣ + Фрисианӣ + Ирландӣ + Шотландӣ-Галикӣ + Галисианӣ + Горанӣ + Гуҷаратӣ + Яҳудӣ + Ҳиндӣ + Маҷорӣ + Байни забонӣ + Индонезӣ + Исландӣ + Ҷопонӣ + Ҷаванизӣ + Гурҷӣ + Қирғизӣ + Лотинӣ + Лаосӣ + Литвонӣ + Латвиягӣ + Ҳолландӣ + Норвегӣ + Урисоӣ + Лаҳистонӣ + Португалӣ + Португалӣ (Бразилия) + Руминӣ + Русӣ + Шведӣ + Ӯйғурӣ + Украинӣ + Урду + Ӯзбекӣ + Яҳудии Аврупои шарқӣ + Чинӣ + Зулу + + + + + + Афғонистан + Тонга + + + + [а-г ғ д е ё ж-и ӣ й к қ л-у ӯ ф х ҳ ч ҷ ш ъ э-я] + [ц щ ы ь] + + + « + » + « + + + + + + + + + Янв + Фев + Мар + Апр + Май + Июн + Июл + Авг + Сен + Окт + Ноя + Дек + + + Январ + Феврал + Март + Апрел + Май + Июн + Июл + Август + Сентябр + Октябр + Ноябр + Декабр + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + Яшб + Дшб + Сшб + Чшб + Пшб + Ҷмъ + Шнб + + + Якшанбе + Душанбе + Сешанбе + Чоршанбе + Панҷшанбе + Ҷумъа + Шанбе + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + пе. чо. + па. чо. + + + Пеш аз милод + ПаМ + + + ПеМ + ПаМ + + + + + + EEEE, yyyy MMMM dd + + + + + yyyy MMMM d + + + + + yyyy MMM d + + + + + yy/MM/dd + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1} {0} + + + + Q yy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + + Сомонӣ + сом + + + + diff --git a/libs/Zend/Locale/Data/tg_Cyrl.xml b/libs/Zend/Locale/Data/tg_Cyrl.xml new file mode 100644 index 0000000..1d3bdb9 --- /dev/null +++ b/libs/Zend/Locale/Data/tg_Cyrl.xml @@ -0,0 +1,10 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + โลก + แอฟริกา + อเมริกาเหนือ + อเมริกาใต้ + โอเชียเนีย + แอฟริกาตะวันตก + อเมริกากลาง + แอฟริกาตะวันออก + แอฟริกาเหนือ + แอฟริกากลาง + แอฟริกาใต้ [018] + อเมริกา + อเมริกาตอนเหนือ + แคริบเบียน + เอเชียตะวันออก + เอเชียใต้ + เอเชียตะวันออกเฉียงใต้ + ยุโรปใต้ + ออสเตรเลียและนิวซีแลนด์ + เมลานีเซีย + เขตไมโครนีเซีย + โปลินีเซีย + เอเชียกลางตอนใต้ + เอเชีย + เอเชียกลาง + เอเชียตะวันตก + ยุโรป + ยุโรปตะวันออก + ยุโรปเหนือ + ยุโรปตะวันตก + เครือรัฐอิสระ + ละตินอเมริกาและคาริบเบียน + หมู่เกาะแชนเนล + อันดอร์รา + สหรัฐอาหรับเอมิเรตส์ + อัฟกานิสถาน + แอนติกาและบาร์บูดา + แองกวิลลา + แอลเบเนีย + อาร์เมเนีย + เนเธอร์แลนด์แอนทิลลิส + แองโกลา + แอนตาร์กติกา + อาร์เจนตินา + อเมริกันซามัว + ออสเตรีย + ออสเตรเลีย + อารูบา + หมู่เกาะโอลันด์ + อาเซอร์ไบจาน + บอสเนียและเฮอร์เซโกวีนา + บาร์เบโดส + บังกลาเทศ + เบลเยียม + บูร์กินาฟาโซ + บัลแกเรีย + บาห์เรน + บุรุนดี + เบนิน + เซ‹‹นต์บาร์เธเลมี + เบอร์มิวดา + บรูไน + โบลิเวีย + บราซิล + บาฮามาส + ภูฏาน + เกาะบูเวต + บอตสวานา + เบลารุส + เบลีซ + แคนาดา + หมู่เกาะโคโคส (คีลิง) + คองโก-กินชาซา + สาธารณรัฐแอฟริกากลาง + คองโก-บราซซาวิล + สวิตเซอร์แลนด์ + โกตดิวัวร์ + หมู่เกาะคุก + ชิลี + แคเมอรูน + จีน + โคลอมเบีย + คอสตาริกา + เซอร์เบียและมอนเตเนโกร + คิวบา + เคปเวิร์ด + เกาะคริสต์มาส + ไซปรัส + สาธารณรัฐเช็ก + เยอรมนี + จิบูตี + เดนมาร์ก + โดมินิกา + สาธารณรัฐโดมินิกัน + แอลจีเรีย + เอกวาดอร์ + เอสโตเนีย + อียิปต์ + ซาฮาราตะวันตก + เอริเทรีย + สเปน + เอธิโอเปีย + ฟินแลนด์ + ฟิจิ + หมู่เกาะฟอล์กแลนด์ + ไมโครนีเซีย + หมู่เกาะฟาโร + ฝรั่งเศส + กาบอง + สหราชอาณาจักร + เกรนาดา + จอร์เจีย + เฟรนช์เกียนา + เกิร์นซีย์ + กานา + ยิบรอลตาร์ + กรีนแลนด์ + แกมเบีย + กินี + กวาเดอลูป + อิเควทอเรียลกินี + กรีซ + เกาะเซาท์จอร์เจียและหมู่เกาะเซาท์แซนด์วิช + กัวเตมาลา + กวม + กินี-บิสเซา + กายอานา + ฮ่องกง + เกาะเฮิร์ดและหมู่เกาะแมกดอนัลด์ + ฮอนดูรัส + โครเอเชีย + เฮติ + ฮังการี + อินโดนีเซีย + ไอร์แลนด์ + อิสราเอล + เกาะแมน + อินเดีย + บริติชอินเดียนโอเชียนเทร์ริทอรี + อิรัก + อิหร่าน + ไอซ์แลนด์ + อิตาลี + เจอร์ซีย์ + จาเมกา + จอร์แดน + ญี่ปุ่น + เคนยา + คีร์กีซสถาน + กัมพูชา + คิริบาตี + คอโมโรส + เซนต์คิตส์และเนวิส + เกาหลีเหนือ + เกาหลีใต้ + คูเวต + หมู่เกาะเคย์แมน + คาซัคสถาน + ลาว + เลบานอน + เซนต์ลูเซีย + ลิกเตนสไตน์ + ศรีลังกา + ไลบีเรีย + เลโซโท + ลิทัวเนีย + ลักเซมเบิร์ก + ลัตเวีย + ลิเบีย + โมร็อกโก + โมนาโก + มอลโดวา + มอนเตเนโกร + เซนต์มาติน + มาดากัสการ์ + หมู่เกาะมาร์แชลล์ + มาซิโดเนีย + มาลี + พม่า + มองโกเลีย + มาเก๊า + หมู่เกาะนอร์เทิร์นมาเรียนา + มาร์ตินีก + มอริเตเนีย + มอนต์เซอร์รัต + มอลตา + มอริเชียส + มัลดีฟส์ + มาลาวี + เม็กซิโก + มาเลเซีย + โมซัมบิก + นามิเบีย + นิวแคลิโดเนีย + ไนเจอร์ + เกาะนอร์ฟอล์ก + ไนจีเรีย + นิการากัว + เนเธอร์แลนด์ + นอร์เวย์ + เนปาล + นาอูรู + นีอูเอ + นิวซีแลนด์ + โอมาน + ปานามา + เปรู + เฟรนช์โพลีนีเซีย + ปาปัวนิวกินี + ฟิลิปปินส์ + ปากีสถาน + โปแลนด์ + แซงปีแยร์และมีเกอลง + พิตแคร์น + เปอร์โตริโก + ปาเลซติเนียนเทร์ริทอรี + โปรตุเกส + ปาเลา + ปารากวัย + กาตาร์ + เอาต์ไลอิงโอเชียเนีย + สหภาพยุโรป + เรอูเนียง + โรมาเนีย + เซอร์เบีย + รัสเซีย + รวันดา + ซาอุดีอาระเบีย + หมู่เกาะโซโลมอน + เซเชลส์ + ซูดาน + สวีเดน + สิงคโปร์ + เซนต์เฮเลนา + สโลวีเนีย + สฟาลบาร์และแจนมาเยน + สโลวาเกีย + เซียร์ราลีโอน + ซานมารีโน + เซเนกัล + โซมาเลีย + ซูรินาเม + เซาตูเมและปรินซิปี + เอลซัลวาดอร์ + ซีเรีย + สวาซิแลนด์ + หมู่เกาะเติกส์และหมู่เกาะเคคอส + ชาด + อาณาเขตทางใต้ของฝรั่งเศส + โตโก + ไทย + ทาจิกิสถาน + โตเกเลา + ติมอร์ตะวันออก + เติร์กเมนิสถาน + ตูนิเซีย + ตองกา + ตุรกี + ตรินิแดดและโตเบโก + ตูวาลู + ไต้หวัน + แทนซาเนีย + ยูเครน + ยูกันดา + หมู่เกาะสหรัฐไมเนอร์เอาต์ไลอิง + สหรัฐอเมริกา + อุรุกวัย + อุซเบกิสถาน + วาติกัน + เซนต์วินเซนต์และเกรนาดีนส์ + เวเนซุเอลา + หมู่เกาะบริติชเวอร์จิน + ยูเอสเวอร์จินไอส์แลนด์ + เวียดนาม + วานูอาตู + วาลลิสและฟุตูนา + ซามัว + เยเมน + มายอต + แอฟริกาใต้ + แซมเบีย + ซิมบับเว + ไม่ทราบ + + + เยอรมันออร์โธกราฟีดั้งเดิม + เยอรมันออร์โธกราฟีปี 1996 + อาร์เมเนียตะวันออก + อาร์เมเนียตะวันตก + สัทอักษรสากล + ภาษาพื้นเมืองนาทิโซเน + โพลีโทนิก + คอมพิวเตอร์ + ออร์โธกราฟิปรับปรุง + เรเซียน + ซาโฮ + + + ปฏิทิน + การเรียงลำดับ + เงินตรา + + + เรียงตามอักษรจีนดั้งเดิม + ปฏิทินพุทธ + ปฏิทินจีน + เรียงตามลำดับโดยตรง + เรียงตามอักษรจีนประยุกต์ + ปฏิทินเกรกอเรียน + ปฏิทินฮิบรู + ปฏิทินแห่งชาติอินเดีย + ปฏิทินอิสลาม + ปฏิทินอิสลามซีวิล + ปฏิทินญี่ปุ่น + เรียงตามสมุดโทรศัพท์ + เรียงตามการถอดเสียงภาษาจีน + ปฏิทินไต้หวัน + เรียงตามการลากเส้น + เรียงตามแบบดั้งเดิม + + + อเมริกัน + เมตริก + + + {0} + {0} + {0} + + + + [ฯ ๆ ๎ ็-ํ ก-ฮ ะ-ฺ เ-ๅ] + [\u200B a e g m n p q t] + + + ' + ' + " + " + + + GanjkHmsSEDFwWxhKzAeugXZvcL + + + + + + พ.ศ. + + + + + + EEEEที่ d MMMM G yyyy + + + + + d MMMM yyyy + + + + + d MMM yyyy + + + + + d/M/yyyy + + + + + + + H นาฬิกา m นาที ss วินาที + + + + + H นาฬิกา m นาที + + + + + H:mm:ss + + + + + H:mm + + + + + + + {1}, {0} + + + + M/yyyy + MMM yyyy + + + + + ก่อนเที่ยง + หลังเที่ยง + + + ก่อนเที่ยง + หลังเที่ยง + + + + + + ม.ค. + ก.พ. + มี.ค. + เม.ย. + พ.ค. + มิ.ย. + ก.ค. + ส.ค. + ก.ย. + ต.ค. + พ.ย. + ธ.ค. + + + มกราคม + กุมภาพันธ์ + มีนาคม + เมษายน + พฤษภาคม + มิถุนายน + กรกฎาคม + สิงหาคม + กันยายน + ตุลาคม + พฤศจิกายน + ธันวาคม + + + + + ม.ค. + ก.พ. + มี.ค. + เม.ย. + พ.ค. + มิ.ย. + ก.ค. + ส.ค. + ก.ย. + ต.ค. + พ.ย. + ธ.ค. + + + + + + + อา. + จ. + อ. + พ. + พฤ. + ศ. + ส. + + + พฤ + + + วันอาทิตย์ + วันจันทร์ + วันอังคาร + วันพุธ + วันพฤหัสบดี + วันศุกร์ + วันเสาร์ + + + + + + + + + + + + + + + + + + Q1 + Q2 + Q3 + Q4 + + + ไตรมาส 1 + ไตรมาส 2 + ไตรมาส 3 + ไตรมาส 4 + + + + + 1 + 2 + 3 + 4 + + + + ก่อนเที่ยง + หลังเที่ยง + + + ปีก่อนคริสต์ศักราชที่ + คริสต์ศักราช + + + ปีก่อน ค.ศ. ที่ + ค.ศ. + + + + + + EEEEที่ d MMMM G yyyy + + + + + d MMMM yyyy + + + + + d MMM yyyy + + + + + d/M/yyyy + + + + + + + H นาฬิกา m นาที ss วินาที v + + + + + H นาฬิกา m นาที ss วินาที z + + + + + H:mm:ss + + + + + H:mm + + + + + + + {1}, {0} + + + + HH:mm + HH:mm:ss + H:mm + L + E, d-M + LLL + E d MMM + E d MMMM + d MMMM + d MMM + d/M + d + mm:ss + mm:ss + yyyy + M/yyyy + EEE d/M/yyyy + MMM yyyy + EEE d MMM yyyy + MMMM yyyy + Q yyyy + QQQ yyyy + Q yy + M/yyyy + MMMM yyyy + + + {0} - {1} + + M-M + + + E d/M – E d/M + E d – E d/M + + + LLL-LLL + + + E d MMM – E d MMM + E d – E d MMM + + + LLLL-LLLL + + + d MMM – d MMM + d – d MMM + + + d/M - d/M + d/M - d/M + + + d-d + + + H-H + + + H:mm-H:mm + H:mm-H:mm + + + y-y + + + M–M/yy + M/yyyy - M/yyyy + + + E d/M/yy – E d/M/yy + E d – E d/M/yy + E d/M/yy – E d/M/yy + + + MMM-MMM yyyy + MMM yyyy - MMM yyyy + + + E d MMM – E d MMM yyyy + E d – E d MMM yyyy + E d MMM yyyy – E d MMM yyyy + + + M–M/yyyy + M/yyyy – M/yyyy + + + d MMM – d MMM yyyy + d–d MMM yyyy + d MMM yyyy – d MMM yyyy + + + d/M/yy – d/M/yy + d-d/M/yy + d/M/yy – d/M/yy + + + + + + สมัย + + + ปี + + + เดือน + + + สัปดาห์ + + + วัน + วันนี้ + พรุ่งนี้ + มะรืนนี้ + สามวันถัดไป + เมื่อวานนี้ + เมื่อวานซืน + สามวันก่อนหน้า + + + วันในสัปดาห์ + + + ช่วงวัน + + + ชั่วโมง + + + นาที + + + วินาที + + + เขต + + + + + ก่อนเที่ยง + หลังเที่ยง + + + ก่อนเที่ยง + หลังเที่ยง + + + ก่อนเที่ยง + หลังเที่ยง + + + + +HHmm;-HHmm + GMT{0} + {0} + {1} ({0}) + + ไม่ทราบ + + + อันดอร์รา + + + ดูใบ + + + คาบูล + + + แอนติกา + + + แองกิลลา + + + ติรานา + + + เยเรวาน + + + ลูอันดา + + + โรเธรา + + + พาล์เมอร์ + + + ขั้วโลกใต้ + + + เซียวา + + + มอร์สัน + + + ดาวีส์ + + + วอสต็อค + + + เคซีย์ + + + ดูมอนต์ดียูร์วิลล์ + + + แมคมัวโด + + + ริโอกาลเลกอส + + + เมนดูซา + + + ซานฮวน + + + อูชูเอีย + + + ลาริโอจา + + + ซันลูอิส + + + กาตามาร์กา + + + จูจิว + + + ทูคูแมน + + + คอร์โดบา + + + บัวโนสไอเรส + + + ปาโก ปาโก + + + เวียนนา + + + เพิิร์ท + + + ยูคลา + + + ดาร์วิน + + + แอดิเลด + + + โบรกเคนฮิว + + + คูร์รี + + + เมลเบิร์น + + + โฮบาร์ต + + + ลินดีแมน + + + ซิดนีย์ + + + บริสเบน + + + ลอร์ดโฮวี + + + อารูบา + + + บากู + + + บาร์เบโดส + + + ดากา + + + บรัสเซลส์ + + + วากาดูกู + + + โซเฟีย + + + บาห์เรน + + + บูจุมบูรา + + + ปอร์โต-โนโว + + + เบอร์มิวดา + + + บรูไนดารุสซาลาม + + + ลาปาซ + + + เอรูเนเป + + + รีโอบรังโก + + + ปอร์ตูเวลโย + + + บัววีชตา + + + มาเนาส์ + + + กุยาบา + + + กัมปูกรันดี + + + เบเลง + + + อารากัวนา + + + เซาเปาลู + + + บาเยีย + + + ฟอร์ตาเลซา + + + มาเซโอ + + + เรซีเฟ + + + โนรอนฮา + + + แนสซอ + + + ทิมพู + + + กาโบโรเน + + + เบลีซ + + + ดอว์สัน + + + ไวต์ฮอร์ส + + + อินูวิก + + + แวนคูเวอร์ + + + ดอว์สัน ครีก + + + เยลโลว์ไนฟ์ + + + เอดมันตัน + + + สวิฟต์เคอร์เรนต์ + + + อ่าวแคมบริดจ์ + + + ริไจนา + + + วินนิเพก + + + เรโซลูท + + + เรนนี่ริเวอร์ + + + แรงกินอินเล็ต + + + คอรัลฮาร์เบอร์ + + + ทันเดอร์เบย์ + + + นิปิกอน + + + โทรอนโต + + + มอนทริออล + + + อีกวาลิต + + + พางนีทัง + + + มองตัน + + + แฮลิแฟกซ์ + + + กูสเบย์ + + + อ่าวแกลซ + + + บลังค์-ซาบลอน + + + เซนต์จอนส์ + + + โคโคส + + + กินชาซา + + + ลูบัมบาชิ + + + บังกี + + + บราซซาวิล + + + ซูริค + + + อีสเตอร์ + + + ซันติอาโก + + + กัชการ์ + + + อุรุมชี + + + ฉงชิ่ง + + + เซี่ยงไฮ้ + + + ฮาร์บิน + + + โบโกตา + + + คอสตาริกา + + + ฮาวานา + + + เคปเวิร์ด + + + คริสต์มาส + + + นิโคเซีย + + + เบอร์ลิน + + + จิบูตี + + + โคเปนเฮเกน + + + โดมินิกา + + + ซานโต โดมิงโก + + + แอลเจียร์ + + + กาลาปากอส + + + กัวยากิล + + + ไคโร + + + เอลไอย์อุง + + + แอสมารา + + + คานารี + + + เซวตา + + + มาดริด + + + แอดดิสอาบาบา + + + เฮลซิงกิ + + + ฟิจิ + + + สแตนลีย์ + + + ทรัก + + + โปนาเป + + + คอสแร + + + ปารีส + + + ลีเบรอวิล + + + ลอนดอน + + + เกรนาดา + + + ทบิลิซิ + + + กาแยน + + + อักกรา + + + ยิบรอลตาร์ + + + ทูเล + + + กอดแธบ + + + สกอเรสไบซันด์ + + + ดานมาร์กสฮาวน์ + + + บันจูล + + + โกนากรี + + + กวาเดอลูป + + + มาลาโบ + + + เอเธนส์ + + + เซาท์ จอร์เจีย + + + กัวเตมาลา + + + กวม + + + บิสเซา + + + กายอานา + + + ฮ่องกง + + + บูดาเปส + + + จาการ์ตา + + + พอนเทียนัก + + + มากัสซาร์ + + + จายาปุระ + + + ดับบลิน + + + เยรูซาเร็ม + + + แบกแดด + + + เตหะราน + + + เรคยาวิก + + + โรม + + + จาเมกา + + + อัมมาน + + + โตเกียว + + + ไนโรเบีย + + + บิชเคก + + + พนมเปญ + + + เอนเดอร์เบอร์รี + + + คิริทิมาตี + + + ทาราวา + + + โคโมโร + + + เปียงยาง + + + โซล + + + คูเวต + + + เคย์แมน + + + อัคตาอู + + + ออรัล + + + อัคโทบี + + + ไคซีลอร์ดา + + + อัลมาตี + + + เวียงจันทน์ + + + เบรุต + + + เซนต์ลูเซีย + + + วาดุซ + + + โคลัมโบ + + + มันโรเวีย + + + มาเซรู + + + วิลนีอุส + + + ลักเซมเบิร์ก + + + ตรีโปลี + + + คาสซาบลางก้า + + + โมนาโก + + + อันตานานาริโว + + + ควจาเลน + + + มาจูโร + + + บามาโก + + + ย่างกุ้ง + + + ฮอฟด์ + + + อูลานบาตอร์ + + + โชบาลซาน + + + มาเก๊า + + + ไซปัน + + + มาร์ตินีก + + + นูแอกชอต + + + มอนเซอร์รัต + + + มอลตา + + + มอริเชียส + + + มัลดีฟส์ + + + ทิฮัวนา + + + เอร์โมซีโย + + + มาซาทลาน + + + ชีวาวา + + + มอนเตร์เรย์ + + + เม็กซิโกซิตี + + + เมรีดา + + + แคนคุน + + + กัวลาลัมเปอร์ + + + กูชิง + + + มาปูโต + + + วินด์ฮุก + + + นูเมอา + + + นีอาเมย์ + + + ลากอส + + + อัมสเตอดัม + + + ออสโล + + + กาตมันดุ + + + นาอูรู + + + นีอูเอ + + + แชแธม + + + โอคแลนด์ + + + มัสกัต + + + ปานามา + + + ลิมา + + + ทาฮิติ + + + มาร์เควซัส + + + แกมเบียร์ + + + พอร์ตมอร์สบี + + + มะนิลา + + + การาจี + + + วอร์ซอ + + + มีเกอลง + + + พิตแคร์น + + + เปอโตริโก + + + กาซา + + + อาซอเรส + + + มาเดรา + + + ลิสบอน + + + ปาเลา + + + อะซุนซิออง + + + กาตาร์ + + + เรอูนียง + + + บูคาเรส + + + คาลินิงกราด + + + มอสโก + + + วอลโกกราด + + + ซามารา + + + ยีคาเตอรินเบิร์ก + + + โอมสก์ + + + โนโวซิบิร์สก์ + + + ครัสโนยาร์สก์ + + + อีร์คุตสค์ + + + ยาคุตสค์ + + + วลาดิโวสต็อก + + + ซาคาลิน + + + มากาดาน + + + คามชัตกา + + + อานาดีร์ + + + คิกาลี + + + ริยาร์ด + + + กัวดัลคานัล + + + คาร์ทูม + + + สตอกโฮล์ม + + + สิงคโปร์ + + + เซนต์เฮเลนา + + + ลองเยียร์เบียน + + + ฟรีทาวน์ + + + ดาการ์ + + + โมกาดิชู + + + ปารามาริโบ + + + ซาโอโตเมะ + + + เอลซัลวาดอร์ + + + ดามัสกัส + + + อัมบาบาเน + + + โลเม + + + กรุงเทพ + + + ดูชานเบ + + + ฟาเคาโฟ + + + ดิลี + + + อาชกาบัต + + + ตูนิส + + + ตองกาตาปู + + + อิสตันบูล + + + พอร์ทออฟสเปน + + + ฟูนะฟูตี + + + ไทเป + + + อัซโกร็อด + + + เคียฟ + + + ซิมเฟอโรโปล + + + ซาโปโรซี + + + คัมพาลา + + + มิดเวย์ + + + จอห์นสตัน + + + เวก + + + เอดัก + + + นอม + + + โฮโนลูลู + + + แองเคอเรจ + + + ยากูทัต + + + จูโน + + + ลอสแองเจลิส + + + บอยซี + + + ฟีนิกซ์ + + + ชิปร็อก + + + เดนเวอร์ + + + นิวเซเลม, นอร์ทดาโคตา + + + เซนเตอร์ + + + ชิคาโก + + + เมโนมินี + + + วินเซนเนส + + + ปีเตอร์สเบิร์ก + + + เทลล์ซิตี, อินดีแอนา + + + นอกซ์ + + + วินาแมค, อินดีแอนา + + + มาเรงโก + + + อินเดียแนโพลิส + + + ลูส์วิลล์ + + + วีเวย์ + + + มอนติเซลโล + + + ดีทรอยต์ + + + นิวยอร์ก + + + มอนเตวิเดโอ + + + ซามาร์กานด์ + + + ทาชเคนต์ + + + เซนต์วินเซนต์ + + + คาราคัส + + + เซนต์โธมัส + + + ไซง่อน + + + วาลลิส + + + อาปีอา + + + เอเดน + + + มาโยเต + + + โจฮันเนสเบอร์ก + + + ลูซากา + + + ฮาราเร + + + + เวลาอาเกร + เวลาฤดูร้อนอาเกร + + + + + เวลาแอฟริกากลาง + + + + + เวลาแอฟริกาตะวันออก + + + + + เวลามาตรฐานแอฟริกาใต้ + + + + + เวลาแอฟริกาตะวันตก + เวลาฤดูร้อนแอฟริกาตะวันตก + + + + + เวลาอะแลสกา + เวลามาตรฐานอะแลสกา + + + + + เวลามาตรฐานอะแลสกา-ฮาวาย + + + + + เวลาอะเมซอน + เวลาฤดูร้อนอะเมซอน + + + + + เวลากลาง + เวลามาตรฐานกลาง + + + + + เวลาตะวันออก + เวลามาตรฐานตะวันออก + + + + + เวลาแปซิฟิค + เวลามาตรฐานแปซิฟิค + + + + + เวลาอัคตาอู + เวลาฤดูร้อนอัคตาอู + + + AQTT (อัคตาอู) + AQTST (อัคตาอู) + + + + + เวลาอาระเบีย + เวลามาตรฐานอาระเบีย + + + AST (อาระเบีย) + ADT (อาระเบีย) + + + + + เวลาอาร์เจนตินา + เวลาฤดูร้อนอาร์เจนตินา + + + + + เวลาอาร์เจนตินาตะวันตก + + + + + เวลาอาร์เมเนีย + เวลาฤดูร้อนอาร์เมเนีย + + + AMT (อาร์เมเนีย) + AMST (อาร์เมเนีย) + + + + + เวลาแอตแลนติก + เวลามาตรฐานแอตแลนติก + + + + + เวลาออสเตรเลียกลาง + เวลามาตรฐานออสเตรเลียกลาง + + + + + เวลาออสเตรเลียตะวันออก + เวลามาตรฐานออสเตรเลียตะวันออก + + + + + เวลาออสเตรเลียตะวันตก + เวลามาตรฐานออสเตรเลียตะวันตก + + + + + เวลาฤดูร้อนอาโซเรช + เวลาฤดูร้อนอาโซเรช + + + + + เวลาบากู + เวลาฤดูร้อนบากู + + + + + เวลาบังกลาเทศ + + + + + เวลาเบริง + เวลามาตรฐานเบริง + + + BST (เบริง) + BDT (เบริง) + + + + + เวลาภูฏาน + + + + + เวลาบอร์เนียว + เวลาฤดูร้อนบอร์เนียว + + + + + เวลาบราซิเลีย + เวลาฤดูร้อนบราซิเลีย + + + + + เวลามาตรฐานชามอร์โร + + + + + เวลาชิลี + เวลาฤดูร้อนชิลี + + + + + เวลามาตรฐานจีน + + + CST (จีน) + CDT (จีน) + + + + + เวลาดูชานเบ + เวลาฤดูร้อนดูชานเบ + + + + + เวลาติมอร์ตะวันออก + + + + + เวลาเอกวาดอร์ + + + + + เวลายุโรปกลาง + เวลาฤดูร้อนยุโรปกลาง + + + + + เวลายุโรปตะวันออก + เวลาฤดูร¹‰อนยุโรปตะวันออก + + + + + เวลายุโรปตะวันตก + เวลาฤดูร้อนยุโรปตะวันตก + + + + + เวลามาตรฐานกรีนิช + + + + + เวลากาลาปาโกส + + + + + เวลาจอร์เจีย + เวลาฤดูร้อนจอร์เจีย + + + + + เวลากรีนแลนด์กลาง + เวลาฤดูร้อนกรีนแลนด์กลาง + + + + + เวลากรีนแลนด์ตะวันออก + เวลาฤดูร้อนกรีนแลนด์ตะวันออก + + + + + เวลากรีนแลนด์ตะวันตก + เวลาฤดูร้อนกรีนแลนด์ตะวันตก + + + + + เวลามาตรฐานกวม + + + GST (กวม) + + + + + เวลามาตรฐานอินเดีย + + + + + เวลาอินโดนีเซียกลาง + + + + + เวลาอินโดนีเซียตะวันออก + + + + + เวลาอินโดนีเซียตะวันตก + + + + + เวล¥ามาตรฐานอิสราเอล + + + IST (อิสราเอล) + + + + + เวลามาตรฐานคาซัคสถานตะวันออก + + + + + เวลามาตรฐานคาซัคสถาน + + + + + เวลาเกาหลี + เวลามาตรฐานเกาหลี + + + + + เวลาควาจาเลน + + + + + เวลามาเก๊า + เวลาฤดูร้อนมาเก๊า + + + + + เวลามาลายา + + + + + เวลามาเลเซีย + + + + + เวลาหมู่เกาะมาร์แชลล์ + + + + + เวลาอูลานบาตอร์ + เวลาฤดูร้อนอูลานบาตอร์ + + + + + เวลานิวซีแลนด์ + เวลามาตรฐานนิวซีแลนด์ + + + + + เวลานิวฟันด์แลนด์ + เวลามาตรฐานนิวฟันด์แลนด์ + + + + + เวลาหมู่เกาะมาเรียนาเหนือ + + + + + เวลาปากีสถาน + เวลาฤดูร้อนปากีสถาน + + + + + ปีแยร์และมีเกอลง + เวลามาตรฐานปีแยร์และมีเกอลง + + + + + เวลาคืยซิลออร์ดา + เวลาฤดูร้อนคืยซิลออร์ดา + + + + + เวลาซามารา + เวลาฤดูร้อนซามารา + + + + + เวลาซามาร์คันด์ + เวลาฤดูร้อนซามาร์คันด์ + + + SAMT (ซามาร์คันด์) + SAMST (ซามาร์คันด์) + + + + + เวลามาตรฐานซามัว + + + + + เวลาซูรินาเม + + + + + เวลาสเวียร์ดลอฟสค์ + เวลาฤดูร้อนสเวียร์ดลอฟสค์ + + + + + เวลาทาจิกิสถาน + + + + + เวลาฤดูร้อนทาชเคนต์ + + + + + เวลาทบิลิซิ + เวลาฤดูร้อนทบิลิซิ + + + + + เวลาตุรกี + เวลาฤดูร้อนตุรกี + + + + + เวลาเติร์กเมนิสถาน + เวลาฤดูร้อนเติร์กเมนิสถาน + + + + + เวลาอุซเบกิสถาน + เวลาฤดูร้อนอุซเบกิสถาน + + + + + เวลาเยคาเตรินบูร์ก + เวลาฤดูร้อนเยคาเตรินบูร์ก + + + + + เวลาเยเรวาน + เวลาฤดูร้อนเยเรวาน + + + + + เวลายูคอน + เวลามาตรฐานยูคอน + + + + + + + . + , + ; + % + 0 + # + + + - + E + + + NaN + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + ¤#,##0.00;¤-#,##0.00 + + + + + + เปเซตาอันดอร์รา + + + ดีแรห์มสหรัฐอาหรับเอมิเรตส์ + + + อัฟกานี (1927-2002) + + + อัฟกานี + + + เลกอัลบาเนีย + + + ดรัมอาเมเนีย + + + กิลเดอร์เนเธอร์แลนด์แอนทิลลิส + + + กวานซาแองโกลา + + + กวานซาแองโกลา (1977-1990) + + + นิวกวานซาแองโกลา (1990-2000) + + + กวานซารีจัสทาโดแองโกลา (1995-1999) + + + ออสตรัลอาร์เจนตินา + + + เปโซอาร์เจนติน่า (1983-1985) + + + เปโซอาร์เจนติน่า + Arg$ + + + ชิลลิงออสเตรีย + + + ดอลลาร์ออสเตรเลีย + $A + + + กิลเดอร์อารูบา + + + มานัตอาเซอร์ไบจัน + + + มานัตอาเซอร์ไบจาน + + + ดีนาร์บอสเนีย-เฮอร์เซโกวีนา + + + มาร​์กบอสเนีย-เฮอร์เซโกวีนา + + + ดอลลาร์บาร์เบโดส + + + ตากาบังกลาเทศ + + + ฟรังก์เบลเยียม (เปลี่ยนแปลงได้) + + + ฟรังก์เบลเยียม + + + ฟรังก์เบลเยียม (การเงิน) + + + ฮาร์ดลีฟบัลแกเรีย + + + นิวลีฟบัลแกเรีย + + + ดีนาร์บาห์เรน + + + ฟรังก์บุรุนดี + + + ดอลลาร์เบอร์มิวดา + + + ดอลลาร์บรูไน + + + โบลิเวียโน + + + เปโซโบลิเวีย + + + มฟดอลโบลิเวีย + + + ครูเซโรโนโวบราซิล (1967-1986) + + + ครูซาโดบราซิล + + + ครูเซโรบราซิล (1990-1993) + + + รีล + R$ + + + ครูซาโดโนโวบราซิล + + + ครูเซโรบราซิล + + + ดอลลาร์บาฮามาส + + + กัลทรัมภูฏาน + + + จ๊าดพม่า + + + พูลาบอตสวานา + + + นิวรูเบิลเบลารัสเซีย (1994-1999) + + + รูเบิลเบลารุส + + + ดอลลาร์เบลีซ + + + ดอลลาร์แคนาดา + Can$ + + + ฟรังก์คองโก + + + ยูโรดับเบิลยูไออาร์ + + + ฟรังก์สวิส + + + ฟรังก์ดับเบิลยูไออาร์ + + + ฟูเมนโตชิลี + + + เปโซชิลี + Ch$ + + + หยวนเหรินเหมินบี้ + + + + เปโซโคลัมเบีย + + + วาเลอร์รีล + + + โคลอนคอสตาริกา + + + ดีนาร์เซอร์เบียเก่า + + + ฮาร์ดโครูนาเช็กโกสโลวัก + + + เปโซคิวบา + + + เคปเวอร์เดอร์เอสคูโด + + + ปอนด์ไซปรัส + + + โครูนาสาธารณรัฐเช็ก + + + ออสต์มาร์กเยอรมันตะวันออก + + + มาร์กเยอรมนี + + + ฟรังก์จิบูตี + + + โครนเดนมาร์ก + + + เปโซโดมินิกา + + + ดีนาร์แอลจีเรีย + + + ซูเกรเอกวาดอร์ + + + วาเลอร์คอนสแตนต์เอกวาดอร์ + + + ครูนเอสโตเนีย + + + ปอนด์อียิปต์ + + + เอ็กเวเล + + + นากฟาเอริเทรีย + + + เปเซตาสเปน (บัญชี) + + + เปเซตาสเปน (บัญชีที่เปลี่ยนแปลงได้) + + + เปเซตาสเปน + + + เบอรร์เอธิโอเปีย + + + ยูโร + + + + มาร์กกาฟินแลนด์ + + + ดอลลาร์ฟิจิ + F$ + + + ปอนด์เกาะฟอล์กแลนด์ + + + ฟรังก์ฝรั่งเศส + + + ปอนด์สเตอร์ลิงอังกฤษ + \u00A3 + + + คูปอนลาริตจอร์เจีย + + + ลารีจอร์เจีย + + + เซดีกานา + + + ปอนด์ยิบรอลตาร์ + + + ดาลาซีแกมเบีย + + + ฟรังก์กินี + + + ไซลีกินี + + + เอ็กเวเลกินีนาอิเควทอเรียลกินี + + + ดรัชมากรีก + + + เควตซัลกัวเตมาลา + + + เอสคูโดกินีโปรตุเกส + + + เปโซกีนีบิสเซา + + + ดอลลาร์กายอานา + + + เหรียญฮ่องกง + HK$ + + + เลมปิราฮอดูรัส + + + ดีนาร์โครเอเชีย + + + คูนาโครเอเชีย + + + กอร์ดเฮติ + + + ฟอรินต์ฮังการี + + + รูเปียอินโดนีเซีย + Rp + + + ปอนด์ไอริช + IR\u00A3 + + + ปอนด์อิสราเอล + + + เชเกลอิสราเอล + + + รูปีอินเดีย + 0≤Rs.|1≤Re.|1<Rs. + + + ดีนาร์อิรัก + + + เรียลอิหร่าน + + + โครนาไอซ์แลนด์ + + + ลีราอิตาลี + + + ดอลลาร์จาเมกา + + + ดีนาร์จอร์แดน + + + เยน + \u00A5 + + + ชิลลิ่งเคนยา + + + ซอมคีร์กีซสถาน + + + เรียลกัมพูชา + + + ฟรังก์คอโมโรส + + + วอนเกาหลีเหนือ + + + วอนเกาหลีใต้ + + + ดีนาร์คูเวต + + + ดอลลาร์ห඀¡ู่เกาะเคย์แมน + + + เทนจ์คาซัคสถาน + + + กีบลาว + + + ปอนด์เลบานอน + + + รูปีศรีลังกา + + + ดอลลาร์ไลบีเรีย + + + โลตีเลโซโท + + + มาโลตี + + + ลีตาลิทัวเนีย + + + ทาโลนัสลิทัวเนีย + + + คอนเวอร์ทิเบิลฟรังก์ลักเซมเบิร์ก + + + ฟรังก์ลักเซมเบิร์ก + + + ไฟแนลเชียลฟรังก์ลักเซมเบิร์ก + + + ลัตส์ลัตเวีย + + + รูเบิลลัตเวีย + + + ดีนาร์ลิเบีย + + + ดีแรห์มโมร็อกโก + + + ฟรังก์โมร็อกโก + + + ลิวมอลโดวาน + + + อาเรียรีมาดากัสการ์ + + + ฟรังก์มาดากัสการ์ + + + ดีนาร์มาซิโดเนีย + + + ฟรังก์มาลี + + + จัคพม่า + + + ตูกริกมองโกเลีย + + + ปาตากามาเก๊า + + + ออกิวยามอริเตเนีย + + + ลีรามอลตา + + + ปอนด์มอลตา + + + รูปีมอริเชียส + + + รูฟิยาเกาะมัลดีฟส์ + + + ควาชามาลาวี + + + เปโซแม็กซิโก + MEX$ + + + ซิลเวอรืเม็กซิโก (1861-1992) + + + อินเวอร์เซียนเม็กซิโก + + + ริงกิตมาเลเซีย + RM + + + เอสคูโดโมซัมบิก + + + เมทิคัลโมซัมบิก + + + เมติคัลโมซัมบิก + + + ดอลลาร์นามิเบีย + + + ไนราไนจีเรีย + + + คอร์โดบานิการากัว + + + คอร์โดบาโอโรนิการากัว + + + กิลเดอร์เนเธอร์แลนด์ + + + โครนนอร์เวย์ + + + รูปีเนปาล + + + ดอลลาร์นิวซีแลนด์ + $NZ + + + เรียลโอมาน + + + บัลบัวปานามา + + + อินตีเปรู + + + ซอลนูโวเปรู + + + ซอลเปรู + + + กีนาปาปัวนิวกีนี + + + เปโซฟิลิปปินส์ + + + รูปีปากีสถาน + Pra + + + ซลอตีโปแลนด์ + + + ซวอตีโปแลนด์ (1950-1995) + + + เอสคูโดโปรตุเกส + + + กวารานีปารากวัย + + + เรียลกาตาร์ + + + ดอลลาร์โรดีเซีย + + + ลิวโรมาเนียเก่า + + + ลิวโรมาเนีย + + + ดีนาร์เซอร์เบีย + + + รูเบิลรัสเซีย + RUB + + + รูเบิลรัสเซีย (1991-1998) + + + ฟรังก์รวันดา + + + เรียลซาอุดิอาระเบีย + + + ดอลลาร์เกาะโซโลมอน + + + รูปีเซเชลส์ + + + ดีนาร์ซูดาน + + + ปอนด์ซูดาน + + + โครนาสวีเดน + + + ดอลลาร์สิงคโปร์ + S$ + + + ปอนด์เซนต์เฮเลนา + + + ทอลาร์สโลวีเนีย + + + โครูนาสโลวัก + + + ลีโอนเซียร์ราลีโอน + + + ชิลลิงโซมาเลีย + + + ดอลลาร์ซูรินาเม + + + กิลเดอร์สุรินัม + + + ดอบราเซาตูเมและปรินซิปี + + + รูเบิลโซเวียต + + + โคลอนเอลซัลวาดอร์ + + + ปอนด์ซีเรีย + + + ลิลันกีนีสวาซิแลนด์ + + + บาท + ฿ + + + รูเบิลทาจิกิสถาน + + + โซโมนีทาจิกิสถาน + + + มานัตเติร์กเมนิสถาน + + + ดีนาร์ตูนิเซีย + + + ปาอังกาตองกา + + + เอสคูโดติมอร์ + + + ลีราตุรกี + + + ตุรกี ลีร่า ใหม่ + + + ดอลลาร์ตรินิแดดและโตเบโก + + + ดอลลาร์ไต้หวัน + + + ชิลลิงแทนซาเนีย + + + ฮรีฟเนียยูเครน + + + คาร์โบวาเนตซ์ยูเครน + + + ซิลลิ่งอูกันดา (1966-1987) + + + ชิลลิงยูกันดา + + + ดอลลาร์สหรัฐ + US$ + + + ดอลลาร์สหรัฐ (วันถัดไป) + + + ดอลลาร์สหรัฐ (วันเดียวกัน) + + + เปโซอุรุกวัย (1975-1993) + + + เปโซอุรุกวัย + + + ซัมอุซเบกิสถาน + + + โบลิวาร์เวเนซุเอลา + + + ฟูร์เตโบลีวาร์เวเนซุเอลา + + + ดองเวียดนาม + + + วาตูวานูอาตู + + + ทาลาซามัวตะวันตก + + + ฟรังก์เซฟาธนาคารรัฐแอฟริกากลาง + + + เงิน + + + ทอง + + + หน่วยคอมโพสิตยุโรป + + + หน่วยโมเนทารียุโรป + + + หน่วยบัญชียุโรป [XBC] + + + หน่วยบัญชียุโรป [XBD] + + + ดอลลาร์แคริบเบียนตะวันออก + + + หน่วยสกุลเงินยุโรป + + + ฟรังก์ทองฝรั่งเศส + + + ฟรังก์ยูไอซีฝรั่งเศส + + + ฟรังก์เซฟาธนาคารกลางรัฐแอฟริกาตะวันตก + + + พัลลาดีม + + + ฟรังก์ซีเอฟพี + + + แพลตินัม + + + กองทุนไรเน็ต + + + รหัสทดสอบสกุลเงิน + + + ไม่มีหน่วยเงินตรา + XXX + + + ดีนาร์เยเมน + + + เรียลเยเมน + + + ฮาร์ดดีนาร์ยูโกสลาเวีย + + + โนวิย์ดีนาร์ยูโกสลาเวีย + + + ดีนาร์ยูโกสลาเวีย + + + แรนด์แอฟริกาใต้ (การเงิน) + + + แรนด์แอฟริกาใต้ + + + กวาชาแซมเบีย + + + นิวแซร์คองโก + + + แซร์คองโก + + + ดอลลาร์ซิมบับเว + + + + + + {0} วัน + + + {0} ชั่วโมง + + + {0} นาที + + + {0} เดือน + + + {0} วินาที + + + {0} สัปดาห์ + + + {0} ปี + + + + + ใช่ + ไม่ + + + + diff --git a/libs/Zend/Locale/Data/th_TH.xml b/libs/Zend/Locale/Data/th_TH.xml new file mode 100644 index 0000000..39501e6 --- /dev/null +++ b/libs/Zend/Locale/Data/th_TH.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/ti.xml b/libs/Zend/Locale/Data/ti.xml new file mode 100644 index 0000000..d0de302 --- /dev/null +++ b/libs/Zend/Locale/Data/ti.xml @@ -0,0 +1,333 @@ + + + + + + + + + + + አፍሪቃንሰኛ + አምሐረኛ + ዓረበኛ + አዜርባይጃንኛ + ቤላራሻኛ + ቡልጋሪኛ + ቢሃሪ + በንጋሊኛ + ብሬቶን + ቦስኒያን + ካታላን + ቼክኛ + ወልሽ + ዴኒሽ + ጀርመን + ግሪከኛ + እንግሊዝኛ + ኤስፐራንቶ + ስፓኒሽ + ኤስቶኒአን + ባስክኛ + ፐርሲያኛ + ፊኒሽ + ታጋሎገኛ + ፋሮኛ + ፈረንሳይኛ + ፍሪሰኛ + አይሪሽ + እስኮትስ ጌልክኛ + ጋለቪኛ + ጓራኒ + ጉጃራቲኛ + ዕብራስጥ + ሕንደኛ + ክሮሽያንኛ + ሀንጋሪኛ + ኢንቴር ቋንቋ + እንዶኑሲኛ + አይስላንደኛ + ጣሊያንኛ + ጃፓንኛ + ጃቫንኛ + ጊዮርጊያኛ + ካማደኛ + ኮሪያኛ + ኩርድሽ + ኪሩጋዚ + ላቲንኛ + ሊቱአኒየን + ላቲቪያን + ማክዶኒኛ + ማላያላምኛ + ማራቲኛ + ማላይኛ + ማልቲስኛ + ኔፖሊኛ + ደች + ኖርዌይኛ (ናይ ኝኖርስክ) + ኖርዌጂያን + ኦኪታንኛ + ኦሪያ + ፑንጃቢኛ + ፖሊሽ + ፓሽቶ + ፖርቱጋሊኛ + ፖርቱጋልኛ (ናይ ብራዚል) + ፖርቱጋልኛ (ናይ ፖርቱጋል) + ሮማኒያን + ራሽኛ + ሰርቦ- ክሮዊታን + ስንሃልኛ + ስሎቨክኛ + ስቁቪኛ + አልቤኒኛ + ሰርቢኛ + ሰሴቶ + ሱዳንኛ + ስዊድንኛ + ሰዋሂሊኛ + ታሚልኛ + ተሉጉኛ + ታይኛ + ትግርኛ + ናይ ቱርኪ ሰብዓይ (ቱርካዊ) + ክሊንግኦንኛ + ቱርከኛ + ትዊ + ዩክረኒኛ + ኡርዱኛ + ኡዝበክኛ + ቪትናምኛ + ዞሳኛ + ዪዲሽ + ዙሉኛ + + + + + + + + + + + [፟ ሀ-ሆ ለ-ቆ ቈ ቊ-ቍ ቐ-ቖ ቘ ቚ-ቝ በ-ኆ ኈ ኊ-ኍ ነ-ኮ ኰ ኲ-ኵ ኸ-ኾ ዀ ዂ-ዅ ወ-ዎ ዐ-ዖ ዘ-ዮ ደ-ዷ ጀ-ጎ ጐ ጒ-ጕ ጠ-ፗ] + [᎐-᎙ ሇ ⶀ ᎀ-ᎃ ⶁ-ⶄ ቇ ᎄ-ᎇ ⶅ-ⶇ ኇ ⶈ-ⶊ ኯ ዏ ⶋ ዯ ⶌ ዸ-ዿ ⶍ ⶎ ጏ ጘ-ጟ ⶓ-ⶖ ⶏ-ⶑ ፇ ᎈ-ᎏ ⶒ ፘ-ፚ ⶠ-ⶦ ⶨ-ⶮ ⶰ-ⶶ ⶸ-ⶾ ⷀ-ⷆ ⷈ-ⷎ ⷐ-ⷖ ⷘ-ⷞ] + + + + + + + + ጃንዩ + ፌብሩ + ማርች + ኤፕረ + ሜይ + ጁን + ጁላይ + ኦገስ + ሴፕቴ + ኦክተ + ኖቬም + ዲሴም + + + ጃንዩወሪ + ፌብሩወሪ + ማርች + ኤፕረል + ሜይ + ጁን + ጁላይ + ኦገስት + ሴፕቴምበር + ኦክተውበር + ኖቬምበር + ዲሴምበር + + + + + + + + + + + + + + + + + + + + + + + ሰንበ + ሰኑይ + ሠሉስ + ረቡዕ + ኃሙስ + ዓርቢ + ቀዳም + + + ሰንበት + ሰኑይ + ሠሉስ + ረቡዕ + ኃሙስ + ዓርቢ + ቀዳም + + + + + + + + + + + + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + ንጉሆ ሰዓተ + ድሕር ሰዓት + + + ዓ/ዓ + ዓ/ም + + + + + + EEEE፣ dd MMMM መዓልቲ yyyy G + + + + + dd MMMM yyyy + + + + + dd-MMM-yyyy + + + + + dd/MM/yy + + + + + + + h:mm:ss a v + + + + + h:mm:ss a z + + + + + h:mm:ss a + + + + + h:mm a + + + + + + + {1} {0} + + + + dd MMMM + dd/MM + MM/yy + Q yy + MMMM yyyy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + + + ¤#,##0.00 + + + + + + የብራዚል ሪል + + + የቻይና ዩአን ረንሚንቢ + Y + + + የኢትዮጵያ ብር + $ + + + አውሮ + + + የእንግሊዝ ፓውንድ ስተርሊንግ + + + የሕንድ ሩፒ + + + የጃፓን የን + + + የራሻ ሩብል + + + የአሜሪካን ዶላር + USD + + + + diff --git a/libs/Zend/Locale/Data/ti_ER.xml b/libs/Zend/Locale/Data/ti_ER.xml new file mode 100644 index 0000000..262bfad --- /dev/null +++ b/libs/Zend/Locale/Data/ti_ER.xml @@ -0,0 +1,133 @@ + + + + + + + + + + + [፟ ፡ ፣-፧ ። ፠ ፨ ፲-፼ ፩-፱ ሀ-ሆ ለ-ሟ ረ-ቆ ቈ ቊ-ቍ ቐ-ቖ ቘ ቚ-ቝ በ-ኆ ኈ ኊ-ኍ ነ-ኮ ኰ ኲ-ኵ ኸ-ኾ ዀ ዂ-ዅ ወ-ዎ ዐ-ዖ ዘ-ዮ ደ-ዷ ጀ-ጎ ጐ ጒ-ጕ ጠ-ጯ ጸ-ጿ ፈ-ፗ] + [᎐-᎙ ሇ ⶀ ᎀ-ᎃ ⶁ ሠ-ሧ ⶂ-ⶄ ቇ ᎄ-ᎇ ⶅ-ⶇ ኇ ⶈ-ⶊ ኯ ዏ ⶋ ዯ ⶌ ዸ-ዿ ⶍ ⶎ ጏ ጘ-ጟ ⶓ-ⶖ ⶏ-ⶑ ፀ-ፇ ᎈ-ᎏ ⶒ ፘ-ፚ ⶠ-ⶦ ⶨ-ⶮ ⶰ-ⶶ ⶸ-ⶾ ⷀ-ⷆ ⷈ-ⷎ ⷐ-ⷖ ⷘ-ⷞ] + + + + + + + + ጥሪ + ለካቲ + መጋቢ + ሚያዝ + ግንቦ + ሰነ + ሓምለ + ነሓሰ + መስከ + ጥቅም + ሕዳር + ታሕሳ + + + ጥሪ + ለካቲት + መጋቢት + ሚያዝያ + ግንቦት + ሰነ + ሓምለ + ነሓሰ + መስከረም + ጥቅምቲ + ሕዳር + ታሕሳስ + + + + + + + ሰሉስ + ሓሙስ + + + ሰሉስ + ሓሙስ + + + + + + + EEEE፡ dd MMMM መዓልቲ yyyy G + + + + + + {0} - {1} + + E፡ MM-dd - E፡ MM-dd + E፡ MM-dd - E፡ MM-dd + + + MMM-MMM + + + E፡ MMM d - E፡ MMM d + E፡ MMM d - E፡ MMM d + + + MMM d - MMM d + MMM d-d + + + MM-dd - MM-dd + MM-dd - MM-dd + + + yyyy-MM - yyyy-MM + yyyy-MM - yyyy-MM + + + E፡ yyyy-MM-dd - E፡ yyyy-MM-dd + E፡ yyyy-MM-dd - E፡ yyyy-MM-dd + E፡ yyyy-MM-dd - E፡ yyyy-MM-dd + + + yyyy MMM-MMM + yyyy MMM - yyyy MMM + + + E፡ dd MMM መዓልቲ yyyy G - E፡ dd MMM መዓልቲ yyyy G + E፡ dd MMM መዓልቲ yyyy G - E፡ dd MMM መዓልቲ yyyy G + E፡ dd MMM መዓልቲ yyyy G - E፡ dd MMM መዓልቲ yyyy G + + + yyyy MMM d - MMM d + yyyy MMM d-d + yyyy MMM d - yyyy MMM d + + + yyyy-MM-dd - yyyy-MM-dd + yyyy-MM-dd - yyyy-MM-dd + yyyy-MM-dd - yyyy-MM-dd + + + + + + + + + + $ + + + ETB + + + + diff --git a/libs/Zend/Locale/Data/ti_ET.xml b/libs/Zend/Locale/Data/ti_ET.xml new file mode 100644 index 0000000..e752142 --- /dev/null +++ b/libs/Zend/Locale/Data/ti_ET.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/tig.xml b/libs/Zend/Locale/Data/tig.xml new file mode 100644 index 0000000..839fd45 --- /dev/null +++ b/libs/Zend/Locale/Data/tig.xml @@ -0,0 +1,509 @@ + + + + + + + + + + + አፋርኛ + አብሐዚኛ + አፍሪቃንስኛ + አምሐረኛ + ዐርቢኛ + አሳሜዛዊ + አያማርኛ + አዜርባይጃንኛ + ባስኪርኛ + ቤላራሻኛ + ቡልጋሪኛ + ቢሃሪ + ቢስላምኛ + በንጋሊኛ + ትበትንኛ + ብሬቶንኛ + ብሊን + ካታላንኛ + ኮርሲካኛ + ቼክኛ + ወልሽ + ዴኒሽ + ጀርመን + ድዞንግኻኛ + ግሪክኛ + እንግሊዝኛ + ኤስፐራንቶ + ስፓኒሽ + ኤስቶኒአን + ባስክኛ + ፐርሲያኛ + ፊኒሽ + ፊጂኛ + ፋሮኛ + ፈረንሳይኛ + ፍሪስኛ + አይሪሽ + እስኮትስ ጌልክኛ + ግዕዝኛ + ጋለጋኛ + ጓራኒኛ + ጉጃርቲኛ + ሃውሳኛ + ዕብራስጥ + ሐንድኛ + ክሮሽያንኛ + ሀንጋሪኛ + አርመናዊ + ኢንቴርሊንጓ + እንዶኒሲኛ + እንተርሊንግወ + እኑፒያቅኛ + አይስላንድኛ + ጣሊያንኛ + እኑክቲቱትኛ + ጃፓንኛ + ጃቫንኛ + ጊዮርጊያን + ካዛክኛ + ካላሊሱትኛ + ክመርኛ + ካናዳኛ + ኮሪያኛ + ካሽሚርኛ + ኩርድሽኛ + ኪርጊዝኛ + ላቲንኛ + ሊንጋላኛ + ላውስኛ + ሊቱአኒያን + ላትቪያን + ማላጋስኛ + ማዮሪኛ + ማከዶኒኛ + ማላያላምኛ + ሞንጎላዊኛ + ሞልዳቫዊና + ማራዚኛ + ማላይኛ + ማልቲስኛ + ቡርማኛ + ናኡሩ + ኔፓሊኛ + ደች + ኖርዌጂያን + ኦኪታንኛ + ኦሮምኛ + ኦሪያኛ + ፓንጃቢኛ + ፖሊሽ + ፑሽቶኛ + ፖርቱጋሊኛ + ኵቿኛ + ሮማንስ + ሩንዲኛ + ሮማኒያን + ራሽኛ + ኪንያርዋንድኛ + ሳንስክሪትኛ + ሲንድሂኛ + ሳንጎኛ + ስንሃልኛ + ሲዳምኛ + ስሎቫክኛ + ስሎቪኛ + ሳሞአኛ + ሾናኛ + ሱማልኛ + ልቤኒኛ + ሰርቢኛ + ስዋቲኛ + ሶዞኛ + ሱዳንኛ + ስዊድንኛ + ስዋሂሊኛ + ታሚልኛ + ተሉጉኛ + ታጂኪኛ + ታይኛ + ትግርኛ + ትግረ + ቱርክመንኛ + ታጋሎገኛ + ጽዋናዊኛ + ቶንጋ + ቱርክኛ + ጾንጋኛ + ታታርኛ + ትዊኛ + ኡዊግሁርኛ + ዩክረኒኛ + ኡርዱኛ + ኡዝበክኛ + ቪትናምኛ + ቮላፑክኛ + ዎሎፍኛ + ዞሳኛ + ይዲሻዊኛ + ዮሩባዊኛ + ዡዋንግኛ + ቻይንኛ + ዙሉኛ + + + + + + አንዶራ + የተባበሩት አረብ ኤምሬትስ + አልባኒያ + አርሜኒያ + ኔዘርላንድስ አንቲልስ + አርጀንቲና + ኦስትሪያ + አውስትሬሊያ + አዘርባጃን + ቦስኒያ እና ሄርዞጎቪኒያ + ባርቤዶስ + ቤልጄም + ቡልጌሪያ + ባህሬን + ቤርሙዳ + ቦሊቪያ + ብራዚል + ቡህታን + ቤላሩስ + ቤሊዘ + ኮንጎ + የመካከለኛው አፍሪካ ሪፐብሊክ + ስዊዘርላንድ + ቺሊ + ካሜሩን + ቻይና + ኮሎምቢያ + ሰርቢያ + ኬፕ ቬርዴ + ሳይፕረስ + ቼክ ሪፑብሊክ + ጀርመን + ዴንማርክ + ዶሚኒካ + ዶሚኒክ ሪፑብሊክ + አልጄሪያ + ኢኳዶር + ኤስቶኒያ + ግብጽ + ምዕራባዊ ሳህራ + ኤርትራ + ስፔን + ኢትዮጵያ + ፊንላንድ + ፊጂ + ሚክሮኔዢያ + ፈረንሳይ + እንግሊዝ + ጆርጂያ + የፈረንሳይ ጉዊአና + ጋምቢያ + ጊኒ + ኢኳቶሪያል ጊኒ + ግሪክ + ቢሳዎ + ጉያና + ሆንግ ኮንግ + ክሮኤሽያ + ሀይቲ + ሀንጋሪ + ኢንዶኔዢያ + አየርላንድ + እስራኤል + ህንድ + ኢራቅ + አይስላንድ + ጣሊያን + ጃማይካ + ጆርዳን + ጃፓን + ካምቦዲያ + ኮሞሮስ + ደቡብ ኮሪያ + ሰሜን ኮሪያ + ክዌት + ሊባኖስ + ሊቱዌኒያ + ላትቪያ + ሊቢያ + ሞሮኮ + ሞልዶቫ + ማከዶኒያ + ሞንጎሊያ + ማካዎ + ሞሪቴኒያ + ማልታ + ማሩሸስ + ሜክሲኮ + ማሌዢያ + ናሚቢያ + ኒው ካሌዶኒያ + ናይጄሪያ + ኔዘርላንድ + ኖርዌ + ኔፓል + ኒው ዚላንድ + ፔሩ + የፈረንሳይ ፖሊኔዢያ + ፓፑዋ ኒው ጊኒ + ፖላንድ + ፖርታ ሪኮ + ሮሜኒያ + ራሺያ + ሳውድአረቢያ + ሱዳን + ስዊድን + ሲንጋፖር + ስሎቬኒያ + ስሎቫኪያ + ሴኔጋል + ሱማሌ + ሲሪያ + ቻድ + የፈረንሳይ ደቡባዊ ግዛቶች + ታይላንድ + ታጃኪስታን + ምስራቅ ቲሞር + ቱኒዚያ + ቱርክ + ትሪኒዳድ እና ቶባጎ + ታንዛኒያ + ዩጋንዳ + አሜሪካ + ዩዝበኪስታን + ቬንዙዌላ + የእንግሊዝ ድንግል ደሴቶች + የአሜሪካ ቨርጂን ደሴቶች + የመን + ደቡብ አፍሪካ + ዛምቢያ + + + + [፟ ፡ ፣-፧ ። ፠ ፨ ᎐-᎙ ፲-፼ ፩-፱ ሀ-ሏ ⶀ ሐ-ሟ ᎀ-ᎃ ⶁ ሠ-ሯ ⶂ ሰ-ሷ ⶃ ሸ-ሿ ⶄ ቀ-ቈ ቊ-ቍ ቐ-ቖ ቘ ቚ-ቝ በ-ቧ ᎄ-ᎇ ⶅ ቨ-ቷ ⶆ ቸ-ቿ ⶇ ኀ-ኈ ኊ-ኍ ነ-ኗ ⶈ ኘ-ኟ ⶉ አ-ኧ ⶊ ከ-ኰ ኲ-ኵ ኸ-ኾ ዀ ዂ-ዅ ወ-ዖ ዘ-ዟ ⶋ ዠ-ዷ ⶌ ዸ-ዿ ⶍ ጀ-ጇ ⶎ ገ-ጐ ጒ-ጕ ጘ-ጟ ⶓ-ⶖ ጠ-ጧ ⶏ ጨ-ጯ ⶐ ጰ-ጷ ⶑ ጸ-ፏ ᎈ-ᎋ ፐ-ፗ ᎌ-ᎏ ⶒ ፘ-ፚ ⶠ-ⶦ ⶨ-ⶮ ⶰ-ⶶ ⶸ-ⶾ ⷀ-ⷆ ⷈ-ⷎ ⷐ-ⷖ ⷘ-ⷞ] + + + + + + + + ጃንዩ + ፌብሩ + ማርች + ኤፕረ + ሜይ + ጁን + ጁላይ + ኦገስ + ሴፕቴ + ኦክተ + ኖቬም + ዲሴም + + + ጃንዩወሪ + ፌብሩወሪ + ማርች + ኤፕረል + ሜይ + ጁን + ጁላይ + ኦገስት + ሴፕቴምበር + ኦክተውበር + ኖቬምበር + ዲሴምበር + + + + + + + + + + + + + + + + + + + + + + + ሰ/ዓ + ሰኖ + ታላሸ + ኣረር + ከሚሽ + ጅምዓ + ሰ/ን + + + ሰንበት ዓባይ + ሰኖ + ታላሸኖ + ኣረርባዓ + ከሚሽ + ጅምዓት + ሰንበት ንኢሽ + + + + + + + + + + + + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + ቀደም ሰርምዕል + ሓቆ ስርምዕል + + + ዓ/ዓ + ዓ/ም + + + + + + EEEE፡ dd MMMM ዮም yyyy G + + + + + dd MMMM yyyy + + + + + dd-MMM-yyyy + + + + + dd/MM/yy + + + + + + + h:mm:ss a v + + + + + h:mm:ss a z + + + + + h:mm:ss a + + + + + h:mm a + + + + + + + {1} {0} + + + + dd MMMM + dd/MM + MM/yy + Q yy + MMMM yyyy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + + + ¤#,##0.00 + + + + + + የብራዚል ሪል + + + የቻይና ዩአን ረንሚንቢ + Y + + + $ + + + የኢትዮጵያ ብር + + + አውሮ + + + የእንግሊዝ ፓውንድ ስተርሊንግ + + + የሕንድ ሩፒ + + + የጃፓን የን + + + የራሻ ሩብል + + + የአሜሪካን ዶላር + + + + diff --git a/libs/Zend/Locale/Data/tig_ER.xml b/libs/Zend/Locale/Data/tig_ER.xml new file mode 100644 index 0000000..852368a --- /dev/null +++ b/libs/Zend/Locale/Data/tig_ER.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/tl.xml b/libs/Zend/Locale/Data/tl.xml new file mode 100644 index 0000000..97a6e8c --- /dev/null +++ b/libs/Zend/Locale/Data/tl.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/libs/Zend/Locale/Data/tn.xml b/libs/Zend/Locale/Data/tn.xml new file mode 100644 index 0000000..6b65b23 --- /dev/null +++ b/libs/Zend/Locale/Data/tn.xml @@ -0,0 +1,317 @@ + + + + + + + + + + + Seburu + Amhariki + Arabic + Azerbaijani + Belarusian + Bulgarian + Bihari + Bengali + SeBosnia + Catalan + Se Czeck + Welsh + Danish + German + SeGerika + Sekgoa + Esperanto + Spanish + Estonian + Basque + Mo/SePerishia + Se-Finland + Tagalog + Faroese + Se Fora + Frisian + Irish + Scots Gaelic + Galician + Gujarati + Se heberu + Hindi + Croatian + Hungarian + Interlingua + Indonesian + Icelandic + Se Italiano + Se Japan + Javanese + Mo/SeJojia + Kannada + Se Korea + Latin + Lithuanian + Latvian + Macedonian + Malayalam + Marathi + Malay + Maltese + Nepali + Se Dutch + Puo ya kwa Norway + Occitan + Punjabi + Se Poland + Se Potoketsi + Se Roma + Russian + Slovak + Slovenian + Albanian + Serbian + Mo/SeSundane + Swedish + Swahili + Tamil + Telugu + Thai + Tigrinya + Klingon + Setswana + Turkish + Ukrainian + Urdu + Uzbek + Vietnamese + IsiXhosa + IsiZulu + + + + [a b d e ê f-o ô p r-u w y] + [c q v x z] + [a-z] + + + + + + + + + + + + + + Fer + Tlh + Mop + Mor + Mot + See + Phu + Pha + Lwe + Dip + Ngw + Sed + + + Ferikgong + Tlhakole + Mopitlo + Moranang + Motsheganang + Seetebosigo + Phukwi + Phatwe + Lwetse + Diphalane + Ngwanatsele + Sedimonthole + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + Tsh + Mos + Bed + Rar + Ne + Tla + Mat + + + Tshipi + Mosopulogo + Labobedi + Laboraro + Labone + Labotlhano + Matlhatso + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + AM + PM + + + BC + AD + + + BC + AD + + + + + + EEEE, yyyy MMMM dd + + + + + yyyy MMMM d + + + + + yyyy MMM d + + + + + yy/MM/dd + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1} {0} + + + + Q yy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + , +   + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + ¤#,##0.00 + + + + + + R + + + + diff --git a/libs/Zend/Locale/Data/tn_ZA.xml b/libs/Zend/Locale/Data/tn_ZA.xml new file mode 100644 index 0000000..bac2df5 --- /dev/null +++ b/libs/Zend/Locale/Data/tn_ZA.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/to.xml b/libs/Zend/Locale/Data/to.xml new file mode 100644 index 0000000..8802489 --- /dev/null +++ b/libs/Zend/Locale/Data/to.xml @@ -0,0 +1,617 @@ + + + + + + + + + + + {0} ({1}) + , + + + lea fakaʻalepea + lea faʻu pē kehe + lea fakasiamane + lea fakakalisi + lea fakapilitānia + lea fakasepeni + lea fakapēsia + lea fakafinilani + lea fakafisi + lea fakafalanisē + lea fakaʻaealani + lea fakakilipasi + lea fakakalisimuʻa + lea fakahauaiʻi + lea fakahepelū + lea fakaʻītali + lea fakasiapani + lea fakakōlea + lea fakalatina + lea fakamāsolo + lea fakamauli + lea kehekehe + lea fakamalei + lea fakapema + lea fakanaulu + lea fakaniuē + lea fakaholani + lea fakanoauē + lea fakapotukali + lea fakapotukali-palāsili + lea fakalapanui + lea fakalalotonga + lea fakalusia + lea fakasikotilani + lea fakaʻilonga + lea fakahaʻamoa + lea fakasueteni + lea fakatokelau + lea fakatonga + lea fakatoake + lea fakatūvalu + lea fakatahisi + lea taʻeʻiloa + lea fakasiaina + lea fakasiaina fakangofua + lea fakasiaina tukufakaholo + ʻikai ha lea + + + + + + + + + + + + + + + + + + + Māmani + ʻAfelika + ʻAmelika tokelau + ʻAmelika tonga + ʻOseania + ʻAfelika hihifo + ʻAmelika lotoloto + ʻAfelika hahake + ʻAfelika tokelau + ʻAfelika lotoloto + ʻAfelika fakatonga + Ongo ʻAmelika + ʻAmelika tonga ange + Kalipea + ʻĒsia hahake + ʻĒsia tonga + ʻĒsia tongahahake + ʻEulope tonga + ʻAositelēlia mo Nuʻusila + Melanisia + Potu fonua Mikolonisia + Polinisia + ʻĒsia tongalotoloto + ʻĒsia + ʻĒsia lotoloto + ʻĒsia hihifo + ʻEulope + ʻEulope hahake + ʻEulope tokelau + ʻEulope hihifo + Komoniueli + ʻAmelika fakalatina mo Kalipea + Anitikua mo Palaputa + Anikuila + ʻAnetātika + Haʻamoa fakaʻamelika + ʻAositelēlia + Pelesiume + Palāsili + Pahama + Motu Puveti + Potisiuana + Pelise + Kānata + Suisilani + ʻOtumotu Kuki + Siaina + Motu Kilisimasi + Siamane + Tominika + ʻIsipite + Sepeni + Finilani + Fisi + Mikolonisia + Falanisē + Pilitānia + Kelenatā + Kuenisī + Kana + Sipalālitā + Kamipia + Kalisi + ʻOtumotu Siosia-tonga mo Saniuisi-tonga + Kuami + Kuiana + Hongi Kongi + ʻOtumotu Heati mo Makitonali + Honitulasi + ʻAealani + ʻIsileli + Motu Mani + ʻInitia + Potu fonua moana ʻInitia fakapilitānia + ʻĪtali + Selusī + Siapani + Kenia + Kilipasi + Kōloa tokelau + Kōlea tonga + Sīloni + Laipelia + Lesoto + ʻOtumotu Māsolo + ʻOtumotu Maliana tokelau + Moʻungaselati + Malita + Maulitiusi + Malaui + Mekesikō + Namipia + Niu Kaletonia + Motu Nōfoliki + Naisilia + Holani + Noauē + Naulu + Niuē + Nuʻusila + Panamā + Polinisia fakafalanisē + Papuaniukini + Pakisitani + Pitikeni + Potukali + Palau + ʻEulope fakataha + Lūsia + Luanitā + ʻOtumotu Solomone + ʻOtumotu Seiseli + Suēteni + Singapula + Potu fonua tonga fakafalanisē + Tokelau + Tonga + Toake + Tilinitati mo Topako + Tūvalu + ʻOtumotu siʻi ʻo ʻAmelika + Puleʻanga fakataha ʻAmelika + Vatikani + ʻOtumotu Vilikini fakapilitānia + ʻOtumotu Vilikini fakaʻamelika + Vanuatu + ʻUvea mo Futuna + Haʻamoa + ʻAfelika tonga + Simipapue + Potu fonua taʻeʻiloa pe hala + + + tohi māhina + tohi hokohoko + paʻanga + + + fakaputa + fakasiaina + hangatonu + fakakelekolia + fakahepelū + fakaʻinitia + fakamohameti + fakamohameti-sivile + fakasiapani + + + fakaʻamelika + fakamita + + + + [a á ā e é ē f h ʻ i í ī k-n {ng} o ó ō p s-u ú ū v] + [à ă â å ä æ b c ç d è ĕ ê ë g ì ĭ î ï j ñ ò ŏ ô ö ø œ q r ß ù ŭ û ü w-y ÿ z] + [a-z] + + + + + « + » + + + + + + + + Sān + Fēp + Maʻa + ʻEpe + + Sun + Siu + ʻAok + Sēp + ʻOka + Nōv + Tis + + + Sānuali + Fēpueli + Maʻasi + ʻEpeleli + + Sune + Siulai + ʻAokosi + Sēpitema + ʻOkatopa + Nōvema + Tisema + + + + + S + F + M + E + M + S + S + A + S + O + N + T + + + + + + + Sāp + Mōn + Tus + Pul + Tuʻa + Fal + Tok + + + Sāpate + Mōnite + Tusite + Pulelulu + Tuʻapulelulu + Falaite + Tokonaki + + + + + S + M + T + P + T + F + T + + + + + + + K1 + K2 + K3 + K4 + + + kuata ʻuluaki + kuata ua + kuata tolu + kuata fā + + + + + 1 + 2 + 3 + 4 + + + kuata 1 + kuata 2 + kuata 3 + kuata 4 + + + + HH + EA + + + ki muʻa + taʻu ʻo Sīsū + + + KM + TS + + + KāMā + TāSā + + + + + + EEEE d MMMM yyyy + + + + + d MMMM yyyy + + + + + d MMM yyyy + + + + + dd-MM-yyyy + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1} {0} + + + + H:mm + L + E d-M + LLL + E d MMM + E d MMMM + d MMMM + d MMM + d-M + d + mm:ss + yyyy + M-yyyy + EEE d-M-yyyy + MMM yyyy + EEE d MMM yyyy + MMMM yyyy + yyyy Q + yyyy QQQ + MM-yy + MMM yy + Q yy + + + + + kuonga + + + taʻu + + + māhina + + + uike + + + ʻaho + ʻahó ni + ʻapongipongi + ʻahepongipongi + ʻaneafi + ʻaneheafi + + + ʻaho ʻo e uike + + + HH/EA + + + houa + + + miniti + + + sekoni + + + vahetaimi + + + + + + +HH:mm;-HH:mm + GMT{0} + Houa {0} + + + houa fakafisi + houa fakafisi fakamaama + + + + + houa fakahauaʻi + + + + + houa fakanuʻusila + houa fakanuʻusila fakasīpinga + houa fakanuʻusila fakamaama + + + + + houa fakaniuē + + + + + houa fakahaʻamoa + + + + + houa fakatahisi + + + + + houa fakatokelau + + + + + houa fakatonga + houa fakatonga lotohē + + + + + houa fakatūvalu + + + + + houa fakaʻuvea mo futuna + + + + + + + . + , + ; + % + 0 + # + + + - + E + + + NaN + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + ¤ #,##0.00 + + + {0} {1} + + + + + {0} ʻa + + + {0} m + + + {0} u + + + {0} t + + + + + ʻio + ʻikai + + + + diff --git a/libs/Zend/Locale/Data/to_TO.xml b/libs/Zend/Locale/Data/to_TO.xml new file mode 100644 index 0000000..0644ff1 --- /dev/null +++ b/libs/Zend/Locale/Data/to_TO.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/tr.xml b/libs/Zend/Locale/Data/tr.xml new file mode 100644 index 0000000..0079d58 --- /dev/null +++ b/libs/Zend/Locale/Data/tr.xml @@ -0,0 +1,3837 @@ + + + + + + + + + + + {0} ({1}) + , + + + Afar + Abazca + Achinese + Acoli + Adangme + Çerkezce + Avestçe + Afrikaan Dili + Diğer Afro-Asyatik Diller + Afrihili + Ainu + Akan + Akad Dili + Aleut + Algonquian Dilleri + Güney Altayca + Amharik + Aragonca + Eski İngilizce + Angika + Apaçi Dilleri + Arapça + Aramice + Araucanian Dili + Arapaho Dili + Diğer Yapay Diller + Arawak Dili + Assamca + Asturyasca + Atabaşkan Dilleri + Avustralya Dilleri + Avar Dili + Awadhi + Aymara + Azerice + Başkırt Dili + Banda Dili + Bamileke Dilleri + Baluchi + Bali Dili + Basa Dili + Diğer Baltık Dilleri + Beyaz Rusça + Beja Dili + Bemba + Berberi + Bulgarca + Bihari + Bhojpuri + Bislama + Bikol + Bini + Siksika + Bambara + Bengal Dili + Bantu Dili + Tibetçe + Breton Dili + Braj + Boşnakça + Batak + Buryat + Bugis + Blin + Katalanca + Caddo + Diğer Orta Amerika Yerli Dilleri + Carib + Diğer Kafkas Dilleri + Atsam + Çeçence + Cebuano + Diğer Kelt Dilleri + Chamorro + Chibcha + Çağatay Dili + Chuukese + Mari + Chinook Jargon + Choctaw + Chipewyan + Çeroki + Şayen Dili + Chamic Dilleri + Korsika Dili + Kiptice + Diğer İngilizce tabanlı Creole ve Pidgin Dilleri + Diğer Fransızca tabanlı Creole ve Pidgin Dilleri + Diğer Portekizce tabanlı Creole ve Pidgin Dilleri + Cree + Kırım Türkçesi + Diğer Creole ve Pidgin Dilleri + Çekçe + Kashubian + Kilise Slavcası + Diğer Kuşitik Diller + Çuvaş + Galce + Danca + Dakota + Dargva + Dayak + Almanca + Avusturya Almancası + İsviçre Yüksek Almancası + Delaware + Slavey + Dogrib + Dinka + Dogri + Diğer Dravid Dilleri + Aşağı Sorbça + Duala + Ortaçağ Felemenkçesi + Divehi + Dyula + Butan Dili + Ewe + Efik + Eski Mısır Dili + Ekajuk + Yunanca + Elam + İngilizce + Avustralya İngilizcesi + Kanada İngilizcesi + İngiliz İngilizcesi + Amerikan İngilizcesi + Ortaçağ İngilizcesi + Esperanto + İspanyolca + Latin Amerika İspanyolcası + İber İspanyolcası + Estonya Dili + Baskça + Ewondo + Farsça + Fang + Fanti + Fulah + Fince + Filipino + Diğer Finno - Ugrik Dilleri + Fiji Dili + Faroe Dili + Fon + Fransızca + Kanada Fransızcası + İsviçre Fransızcası + Ortaçağ Fransızcası + Eski Fransızca + Kuzey Frizce + Doğu Frizcesi + Friulian + Batı Frizcesi + İrlanda Dili + Ga + Gayo + Gbaya + İskoç Gal Dili + Diğer Germen Dilleri + Geez + Gilbertese + Galiçya Dili + Ortaçağ Yüksek Almancası + Guarani + Eski Yüksek Almanca + Gondi + Gorontalo + Gotça + Grebo + Antik Yunanca + İsviçre Almancası + Gujarati + Manks + Gwichʼin + Hausa + Haida + Hawaii Dili + İbranice + Hintçe + Hiligaynon + Himachali + Hititçe + Hmong + Hiri Motu + Hırvatça + Yukarı Sorbça + Haiti Dili + Macarca + Hupa + Ermenice + Herero + Interlingua + Iban + Endonezya Dili + Interlingue + Igbo + Sichuan Yi + Ijo + Inupiak + Iloko + Diğer Hint Dilleri + Diğer Hint-Avrupa Dilleri + İnguş Dili + Ido + Diğer İran Dilleri + Iroquoian Dilleri + İzlandaca + İtalyanca + Inuktitut + Japonca + Lojban + Yahudi Farsçası + Yahudi Arapçası + Java Dili + Gürcüce + Karakalpakça + Kabile + Kaçin + Jju + Kamba + Karen + Kawi + Kabardeyce + Tyap + Koro + Kongo + Khasi + Diğer Hoisan Dilleri + Hotanca + Kikuyu + Kuanyama + Kazak Dili + Grönland Dili + Kamboçya Dili + Kimbundu + Kannada + Korece + Konkani + Kosraean + Kpelle + Kanuri + Karaçay-Balkar + Karelian + Kru + Kurukh + Keşmirce + Kürtçe + Kumukça + Kutenai + Komi + Cornish + Kırgızca + Latince + Ladino + Lahnda + Lamba + Lüksemburg Dili + Lezgice + Ganda + Limburgish + Lingala + Laos Dili + Mongo + Lozi + Litvanya Dili + Luba-Katanga + Luba-Lulua + Luiseno + Lunda + Luo + Lushai + Letonya Dili + Madura Dili + Magahi + Maithili + Makasar + Mandingo + Avustronezya Dili + Masai + Moksha + Mandar + Mende + Malaga Dili + Ortaçağ İrlandacası + Marshall Adaları Dili + Maori + Micmac + Minangkabau + Çeşitli Diller + Makedonca + Diğer Mon-Khmer Dilleri + Malayalam + Moğolca + Mançurya Dili + Manipuri + Manobo Dilleri + Moldovaca + Mohawk + Mossi + Marathi + Malay + Malta Dili + Birden Fazla Dil + Munda Dilleri + Creek + Miranda Dili + Marwari + Birmanya Dili + Maya Dilleri + Erzya + Nauru Dili + Nahuatl + Diğer Kuzey Amerika Yerli Dilleri + Napolice + Norveççe Bokmål + Kuzey Ndebele + Aşağı Almanca + Nepalce + Newari + Ndonga + Nias + Diğer Nijer-Kordofan Dilleri + Niuean + Hollanda Dili + Felemenkçe + Norveççe Nynorsk + Norveççe + Nogay Dili + Old Norse + N’Ko + Güney Ndebele + Kuzey Sotho + Nubian Dilleri + Navaho Dili + Klasik Nevari + Nyanja + Nyamwezi + Nyankole + Nyoro + Nzima + Occitan + Ojibwa + Oromo + Oriya + Oset + Osage + Osmanlı Türkçesi + Otomi Dilleri + Pencap Dili + Diğer Papua Dilleri + Pangasinan + Pehlevi + Pampanga + Papiamento + Palau Dili + Eski Farsça + Diğer Filipinler Dilleri + Fenike Dili + Pali + Lehçe + Pohnpeian + Prakrit Dilleri + Eski Provensal + Peştuca + Portekizce + Brezilya Portekizcesi + İber Portekizcesi + Quechua + Rajasthani + Rapanui + Rarotongan + Rhaeto-Roman Dili + Kirundi + Romence + Diğer Roman Dilleri + Romanca + Köken + Rusça + Aromanca + Kinyarwanda + Sanskritçe + Sandawe + Yakutça + Diğer Güney Amerika Yerli Dilleri + Salishan Dilleri + Samarit Aramcası + Sasak + Santali + Sardunya Dili + Sicilyaca + İskoç + Sindhi + Kuzey Sami + Selkup + Diğer Semitik Diller + Sangho + Eski İrlandaca + İşaret Dilleri + Sırp-Hırvat Dili + Shan Dili + Sinhal Dili + Sidamo + Siu Dilleri + Diğer Sino-Tibet Dilleri + Slovakça + Slovence + Diğer Slav Dilleri + Samoa Dili + Güney Sami + Diğer Sami Dilleri + Lule Sami + Inari Sami + Skolt Sami + Shona + Soninke + Somali Dili + Sogdiana Dili + Songhai + Arnavutça + Sırpça + Sranan Tongo + Serer + Siswati + Diğer Nil-Sahara Dilleri + Güney Sotho + Sunda Dili + Sukuma + Susu + Sümerce + İsveççe + Swahili + Klasik Süryanice + Süryanice + Tamil + Tai Dili + Telugu + Timne + Tereno + Tetum + Tacik Dili + Tay Dili + Tigrinya + Tigre + Tiv + Türkmence + Tokelau + Tagalog + Klingon + Tlingit + Tamaşek + Setswana + Tonga + Nyasa Tonga + Tok Pisin + Türkçe + Tsonga + Tsimshian + Tatarca + Tumbuka + Tupi dilleri + Diğer Altay Dilleri + Tuvalu + Twi + Tahiti Dili + Tuvaca + Udmurtça + Uygurca + Ugarit Dili + Ukraynaca + Umbundu + Bilinmeyen veya Geçersiz Dil + Urduca + Özbekçe + Vai + Venda + Vietnamca + Volapük + Votic + Walloon + Wakashan Dilleri + Walamo + Waray + Washo + Sorb Dilleri + Wolof + Kalmık + Xhosa + Yao + Yapça + Yiddiş + Yoruba + Yupik Dilleri + Zhuang + Zapotek Dili + Blis Sembolleri + Zenaga + Çince + Basitleştirilmiş Çince + Geleneksel Çince + Zande + Zulu + Zuni + Dilbilim içeriği yok + Zazaca + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Dünya + Afrika + Kuzey Amerika + Güney Amerika + Okyanusya + Batı Afrika + Orta Amerika + Doğu Afrika + Kuzey Afrika + Orta Afrika + Güney Afrika [018] + Amerika + Amerika'nın Kuzeyi + Karayipler + Doğu Asya + Güney Asya + Güney Doğu Asya + Güney Avrupa + Avustralya ve Yeni Zelanda + Melanezya + Mikronezya + Polinezya + Güney Orta Asya + Asya + Orta Asya + Batı Asya + Avrupa + Doğu Avrupa + Kuzey Avrupa + Batı Avrupa + Bağımsız Devletler Topluluğu + Latin Amerika ve Karayipler + Kanal Adaları + Andora + Birleşik Arap Emirlikleri + Afganistan + Antigua ve Barbuda + Anguilla + Arnavutluk + Ermenistan + Hollanda Antilleri + Angola + Antarktika + Arjantin + Amerikan Samoası + Avusturya + Avustralya + Aruba + Aland Adaları + Azerbaycan + Bosna Hersek + Barbados + Bangladeş + Belçika + Burkina Faso + Bulgaristan + Bahreyn + Burundi + Benin + Saint Barthelemy + Bermuda + Brunei + Bolivya + Brezilya + Bahamalar + Bhutan + Bouvet Adası + Botsvana + Beyaz Rusya + Belize + Kanada + Cocos Adaları + Kongo Demokratik Cumhuriyeti + Orta Afrika Cumhuriyeti + Kongo + İsviçre + Fildişi Sahilleri + Cook Adaları + Şili + Kamerun + Çin + Kolombiya + Kosta Rika + Sırbistan-Karadağ + Küba + Cape Verde + Christmas Adası + Güney Kıbrıs Rum Kesimi + Çek Cumhuriyeti + Almanya + Cibuti + Danimarka + Dominik + Dominik Cumhuriyeti + Cezayir + Ekvator + Estonya + Mısır + Batı Sahara + Eritre + İspanya + Etiyopya + Finlandiya + Fiji + Falkland Adaları + Mikronezya Federal Eyaletleri + Faroe Adaları + Fransa + Gabon + Birleşik Krallık + Granada + Gürcistan + Fransız Guyanası + Guernsey + Gana + Cebelitarık + Grönland + Gambia + Gine + Guadeloupe + Ekvator Ginesi + Yunanistan + Güney Georgia ve Güney Sandwich Adaları + Guatemala + Guam + Gine-Bissau + Guyana + Hong Kong + Heard Adası ve McDonald Adaları + Honduras + Hırvatistan + Haiti + Macaristan + Endonezya + İrlanda + İsrail + Man Adası + Hindistan + Hint Okyanusu İngiliz Bölgesi + Irak + İran + İzlanda + İtalya + Jersey + Jamaika + Ürdün + Japonya + Kenya + Kırgızistan + Kamboçya + Kiribati + Komorlar + Saint Kitts ve Nevis + Kuzey Kore + Güney Kore + Kuveyt + Kayman Adaları + Kazakistan + Laos + Lübnan + Saint Lucia + Liechtenstein + Sri Lanka + Liberya + Lesotho + Litvanya + Lüksemburg + Letonya + Libya + Fas + Monako + Moldovya Cumhuriyeti + Karadağ + Saint Martin + Madagaskar + Marshall Adaları + Makedonya + Mali + Myanmar + Moğolistan + Makao + Kuzey Mariana Adaları + Martinik + Moritanya + Montserrat + Malta + Mauritius + Maldivler + Malavi + Meksika + Malezya + Mozambik + Namibya + Yeni Kaledonya + Nijer + Norfolk Adası + Nijerya + Nikaragua + Hollanda + Norveç + Nepal + Nauru + Niue + Yeni Zelanda + Umman + Panama + Peru + Fransız Polinezyası + Papua Yeni Gine + Filipinler + Pakistan + Polonya + Saint Pierre ve Miquelon + Pitcairn + Porto Riko + Filistin Bölgesi + Portekiz + Palau + Paraguay + Katar + Uzak Okyanusya + Avrupa Birliği + Reunion + Romanya + Sırbistan + Rusya Federasyonu + Ruanda + Suudi Arabistan + Solomon Adaları + Seyşeller + Sudan + İsveç + Singapur + Saint Helena + Slovenya + Svalbard ve Jan Mayen + Slovakya + Sierra Leone + San Marino + Senegal + Somali + Surinam + Sao Tome ve Principe + El Salvador + Suriye + Svaziland + Turks ve Caicos Adaları + Çad + Fransız Güney Bölgeleri + Togo + Tayland + Tacikistan + Tokelau + Doğu Timor + Türkmenistan + Tunus + Tonga + Türkiye + Trinidad ve Tobago + Tuvalu + Tayvan + Tanzanya + Ukrayna + Uganda + Amerika Birleşik Devletleri Küçük Dış Adaları + Amerika Birleşik Devletleri + Uruguay + Özbekistan + Vatikan + Saint Vincent ve Grenadinler + Venezuela + İngiliz Virgin Adaları + ABD Virgin Adaları + Vietnam + Vanuatu + Wallis ve Futuna + Samoa + Yemen + Mayotte + Güney Afrika + Zambiya + Zimbabve + Bilinmeyen veya Geçersiz Bölge + + + Geleneksel Alman Yazım Kuralları + Standart Resia Yazım Kuralları + 1996 Alman Yazım Kuralları + 1606'ya Dek Geç Ortaçağ Fransızcası + Doğu Ermenicesi + Batı Ermenicesi + Birleştirilmiş Yeni Türk Alfabesi + San Giorgio/Bila Lehçesi + Boontling + IPA Ses Bilimi + UPA Ses Bilimi + Resia Lipovaz Lehçesi + Monotonik + Natisone Lehçesi + Gniva/Njiva Lehçesi + Oseacco/Osojane Lehçesi + Politonik + Bilgisayar + Gözden Geçirilmiş Yazım Kuralları + Resia Lehçesi + Saho + İskoç Standart İngilizcesi + Scouse + Stolvizza/Solbica Lehçesi + Taraskievica Yazım Kuralları + + + Takvim + Sıralama + Para Birimi + + + Geleneksel Çince Sıralaması - Big5 + Budist Takvimi + Çin Takvimi + Düz Sıralama + Basitleştirilmiş Çince Sıralaması - GB2312 + Miladi Takvim + Yahudi Takvimi + Ulusal Hint Takvimi + Hicri Takvim + Arap Takvimi + Japon Takvimi + Telefon Defteri Sıralaması + Pinyin Sıralaması + Çin Cumhuriyeti Takvimi + Stroke Sıralaması + Geleneksel Sıralama + + + ABD + Metrik + + + Dil: {0} + Betik: {0} + Bölge: {0} + + + + [a-c ç d-g ğ h ı i İ {i̇} j-o ö p r s ş t u ü v y z] + [á à ă â å ä ā æ é è ĕ ê ë ē í ì ĭ î ï ī ñ ó ò ŏ ô ø ō œ q ß ú ù ŭ û ū w x ÿ] + [a-z] + + + + + + + + + GanjkHmsSEDFwWxhKzAeugXZvcL + + + + + yy MMM + + + + + + + + Tût + Bâbe + Hatur + Keyhek + Tûbe + Imşir + Bermuhat + Bermude + Peyştes + Bune + Ebip + Mısrî + Nesî + + + + + + + + + Oca + Şub + Mar + Nis + May + Haz + Tem + Ağu + Eyl + Eki + Kas + Ara + + + Ocak + Şubat + Mart + Nisan + Mayıs + Haziran + Temmuz + Ağustos + Eylül + Ekim + Kasım + Aralık + + + + + O + Ş + M + N + M + H + T + A + E + E + K + A + + + + + + + Paz + Pzt + Sal + Çar + Per + Cum + Cmt + + + Pazar + Pazartesi + Salı + Çarşamba + Perşembe + Cuma + Cumartesi + + + + + P + P + S + Ç + P + C + C + + + + + + + Ç1 + Ç2 + Ç3 + Ç4 + + + 1. çeyrek + 2. çeyrek + 3. çeyrek + 4. çeyrek + + + + + 1 + 2 + 3 + 4 + + + + AM + PM + + + Milattan Önce + Milattan Sonra + + + + MS + + + + + + dd MMMM yyyy EEEE + + + + + d MMMM yyyy + + + + + dd.MMM.yyyy + + + + + dd.MM.yyyy + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1} {0} + + + + d E + H + HH:mm + HH:mm:ss + HH:mm + L + d-M E + LLL + d MMM E + d MMMM E + d MMMM + d MMM + d/M + d + hh:mm a + hh:mm:ss a + mm:ss + mm:ss + yyyy + M/yyyy + d/M/yyyy EEE + MMM yyyy + d MMM yyyy EEE + MMMM yyyy + Q yyyy + QQQ yyyy + MM/yy + MMM yy + Q yy + QQQQ yy + yyyy + + + {0} - {1} + + M-M + + + dd.MM E - dd.MM E + dd.MM E - dd.MM E + + + MMM-MMM + + + d MMM E - d MMM E + d MMM E - d MMM E + + + d MMM - d MMM + d-d MMM + + + dd.MM - dd.MM + dd.MM - dd.MM + + + d-d + + + HH-HH + + + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH-HH v + + + y-y + + + MM.yyyy - MM.yyyy + MM.yyyy - MM.yyyy + + + dd.MM.yyyy E - dd.MM.yyyy E + dd.MM.yyyy E - dd.MM.yyyy E + dd.MM.yyyy E - dd.MM.yyyy E + + + MMM-MMM yyyy + MMM yyyy - MMM yyyy + + + dd MMM yyyy E - dd MMM yyyy E + dd MMM yyyy E - dd MMM yyyy E + dd MMM yyyy E - dd MMM yyyy E + + + d MMM - d MMM yyyy + d-d MMM yyyy + d MMM yyyy - d MMM yyyy + + + dd.MM.yyyy - dd.MM.yyyy + dd.MM.yyyy - dd.MM.yyyy + dd.MM.yyyy - dd.MM.yyyy + + + + + + Miladi Dönem + + + Yıl + + + Ay + + + Hafta + + + Gün + Bugün + Yarın + Yarından sonraki gün + Üç gün sonra + Dün + Evvelsi gün + Üç gün önce + + + Haftanın Günü + + + AM/PM + + + Saat + + + Dakika + + + Saniye + + + Saat Dilimi + + + + + + + + Tişri + Heşvan + Şevat + Veadar + İyar + + + Tişri + Heşvan + Şevat + Veadar + İyar + + + + + + + + + Muharrem + Safer + Rebiülevvel + Rebiülahir + Cemaziyelevvel + Cemaziyelahir + Recep + Şaban + Ramazan + Şevval + Zilkade + Zilhicce + + + Muharrem + Safer + Rebiülevvel + Rebiülahir + Cemaziyelevvel + Cemaziyelahir + Recep + Şaban + Ramazan + Şevval + Zilkade + Zilhicce + + + + + + + + + Muharrem + Safer + Rebiülevvel + Rebiülahir + Cemaziyelevvel + Cemaziyelahir + Recep + Şaban + Ramazan + Şevval + Zilkade + Zilhicce + + + + + + + + + Ferverdin + Ordibeheşt + Hordad + Şehriver + Azer + Behmen + Esfend + + + Ferverdin + Ordibeheşt + Hordad + Şehriver + Azer + Behmen + Esfend + + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} Saati + {1} ({0}) + + Bilinmeyen + + + Kabil + + + Tiran + + + Güney Kutbu + + + Dumont D'Urville + + + Viyana + + + Sidney + + + Bakü + + + Brüksel + + + Sofya + + + Bahreyn + + + Zürih + + + Kaşgar + + + Urumçi + + + Çunking + + + Şangay + + + Kosta Rika + + + Noel + + + Lefkoşa + + + Cibuti + + + Kopenhag + + + Dominik + + + Cezayir + + + Kahire + + + El Ayun + + + Kanarya Adaları + + + Septe + + + Londra + + + Tiflis + + + Cebelitarık + + + Atina + + + Güney Gürcistan + + + Budapeşte + + + Cakarta + + + Kudüs + + + Bağdat + + + Tahran + + + Roma + + + Jameika + + + Bişkek + + + St. Kitts + + + Seul + + + Kuveyt + + + Kayman + + + Şevçenko + + + Uralsk + + + Aktöbe + + + Kızılorda + + + Almatı + + + Beyrut + + + St. Lucia + + + Kolombo + + + Lüksemburg + + + Trablus + + + Kazablanka + + + Monako + + + Kobdo + + + Ulanbator + + + Çoybalsan + + + Makau + + + Martinik + + + Moritus + + + Maldivler + + + Meksiko City + + + Kuçing + + + Nauru Adası + + + Markiz + + + Karaçi + + + Varşova + + + Pitcairn Adaları + + + Porto Riko + + + Gazze + + + Azor Adaları + + + Lizbon + + + Katar + + + Reunion Adası + + + Bükreş + + + Moskova + + + İrkutsk + + + Sahalin + + + Kamçatka + + + Anadır + + + Riyad + + + Kartum + + + Stokholm + + + Singapur + + + Salvador + + + Şam + + + Duşanbe + + + Aşkabat + + + Tunus + + + İstanbul + + + İspanya Limanı + + + Ujgorod + + + Zaporojye + + + New Salem, Kuzey Dakota + + + Merkez, Kuzey Dakota + + + + + Knox + + + Marengo + + + Semerkand + + + Taşkent + + + St. Vincent + + + St. Thomas + + + Saygon + + + Mayote + + + + Acre Saati + Acre Yaz Saati + + + + + Afganistan Saati + + + + + Orta Afrika Saati + + + + + Doğu Afrika Saati + + + + + Güney Afrika Saati + Güney Afrika Standart Saati + + + + + Batı Afrika Saati + Batı Afrika Yaz Saati + + + + + Aktyubinsk Saati + Aktyubinsk Yaz Saati + + + + + Alaska Saati + Alaska Standart Saati + Alaska Yaz Saati + + + + + Alaska-Hawaii Saati + Alaska-Hawaii Standart Saati + Alaska-Hawaii Yaz Saati + + + + + Almatı Saati + Almatı Yaz Saati + + + + + Amazon Saati + Amazon Yaz Saati + + + + + Merkezi Saat + Merkezi Standart Saati + Merkezi Yaz Saati + + + + + Doğu Saati + Doğu Standart Saati + Doğu Yaz Saati + + + + + ABD Sıradağlar Saati + ABD Sıradağlar Standart Saati + ABD Sıradağlar Yaz Saati + + + + + Pasifik Saati + Pasifik Standart Saati + Pasifik Yaz Saati + + + + + Anadır Saati + Anadır Yaz Saati + + + + + Aktau Saati + Aktau Yaz Saati + + + AQTT (Aktau) + AQTST (Aktau) + + + + + Aktöbe Saati + Aktöbe Yaz Saati + + + AQTT (Aktöbe) + AQTST (Aktöbe) + + + + + Arap Saati + Arap Standart Saati + Arap Yaz Saati + + + AT (Arabistan) + AST (Arap) + ADT (Arap) + + + + + Arjantin Saati + Arjantin Yaz Saati + + + + + Batı Arjantin Saati + + + + + Ermenistan Saati + Ermenistan Yaz Saati + + + AMT (Ermenistan) + AMST (Ermenistan) + + + + + Aşkabat Saati + Aşkabat Yaz Saati + + + + + Atlantik Saati + Atlantik Standart Saati + Atlantik Yaz Saati + + + + + Orta Avustralya Saati + Orta Avustralya Standart Saati + Orta Avustralya Yaz Saati + + + + + Orta Batı Saati + Batı Merkezi Standart Saati + Avustralya Batı Merkezi Yaz Saati + + + + + Doğu Avustralya Saati + Doğu Avustralya Standart Saati + Doğu Avustralya Yaz Saati + + + + + Batı Avustralya Saati + Batı Avustralya Standart Saati + Batı Avustralya Yaz Saati + + + + + Azerbaycan Saati + Azerbaycan Yaz Saati + + + + + Azor Saati + Azor Yaz Saati + + + + + Bakü Saati + Bakü Yaz Saati + + + + + Bangladeş Saati + + + + + Bering Saati + Bering Standart Saati + Bering Yaz Saati + + + + + Bhutan Saati + + + + + Bolivya Saati + + + + + Borneo Saati + Borneo Yaz Saati + + + + + Brasilia Saati + Brasilia Yaz Saati + + + + + Brunei Saati + + + + + Cape Verde Saati + Cape Verde Yaz Saati + + + + + Chamorro Saati + Chamorro Standart Saati + + + + + Changbai Saati + + + + + Chatham Standart Saati + Chatham Yaz Saati + + + + + Şili Saati + Şili Yaz Saati + + + + + Çin Saati + Çin Standart Saati + Çin Yaz Saati + + + CT (Çin) + CST (Çin) + CDT (Çin) + + + + + Çoybalsan Saati + Çoybalsan Yaz Saati + + + + + Christmas Adası Saati + + + + + Cocos Adaları Saati + + + + + Kolombiya Saati + Kolombiya Yaz Saati + + + + + Cook Adaları Saati + Cook Adaları Yarı Yaz Saati + + + + + Küba Saati + Küba Standart Saati + Küba Yaz Saati + + + CST (Küba) + CDT (Küba) + + + + + Dakka Saati + + + + + Davis Saati + + + + + Dumont-d'Urville Saati + + + + + Duşanbe Saati + Duşanbe Yaz Saati + + + + + Hollanda Guyanası Saati + + + + + Doğu Timor Saati + + + + + Easter Adası Saati + Easter Adası Yaz Saati + + + + + Ekvator Saati + + + + + Orta Avrupa Saati + Orta Avrupa Yaz Saati + + + + + Doğu Avrupa Saati + Doğu Avrupa Yaz Saati + + + + + Batı Avrupa Saati + Batı Avrupa Yaz Saati + + + + + Falkland Adaları Saati + Falkland Adaları Yaz Saati + + + + + Fiji Saati + Fiji Yaz Saati + + + + + Fransız Guyanası Saati + + + + + Fransız Güney Bölgeleri Saati + + + + + Bişkek Saati + Bişkek Yaz Saati + + + + + Greenwich Merkez Saati + + + + + Galapagos Saati + + + + + Gambier Saati + + + + + Gürcistan Saati + Gürcistan Yaz Saati + + + + + Gilbert Adaları Saati + + + + + Orta Grönland Saati + Orta Grönland Yaz Saati + + + + + Doğu Grönland Saati + Doğu Grönland Yaz Saati + + + + + Batı Grönland Saati + Batı Grönland Yaz Saati + + + + + Guam Standart Saati + + + GST (Guam) + + + + + Körfez Saati + Gulf Standart Saati + + + + + Guyana Saati + + + + + Hawaii-Aleutian Standart Saati + + + + + Hong Kong Saati + Hong Kong Yaz Saati + + + + + Hovd Saati + Hovd Yaz Saati + + + + + Hindistan Standart Saati + + + + + Hint Okyanusu Saati + + + + + Çinhindi Saati + + + + + Orta Endonezya Saati + + + + + Doğu Endonezya Saati + + + + + Batı Endonezya Saati + + + + + İran Standart Saati + İran Yaz Saati + + + + + Irkutsk Saati + Irkutsk Yaz Saati + + + + + İsrail Saati + İsrail Standart Saati + İsrail Yaz Saati + + + IST (İsrail) + + + + + Japonya Saati + Japonya Standart Saati + Japonya Yaz Saati + + + + + Petropavlovsk-Kamçatski Saati + Petropavlovsk-Kamçatski Yaz Saati + + + + + Karaçi Saati + + + + + Kaşgar Saati + + + + + Doğu Kazakistan Saati + Doğu Kazakistan Standart Saati + + + + + Batı Kazakistan Saati + Batı Kazakistan Standart Saati + + + + + Kızılorda Saati + Kızılorda Yaz Saati + + + + + Kore Saati + Kore Standart Saati + Kore Yaz Saati + + + + + Kosrae Saati + + + + + Krasnoyarsk Saati + Krasnoyarsk Yaz Saati + + + + + Kuybişev Saati + Kuybişev Yaz Saati + + + + + Kwajalein Saati + + + + + Kırgızistan Saati + + + + + Lanka Saati + + + + + Line Adaları Saati + + + + + Long-Shu Saati + + + + + Lord Howe Saati + Lord Howe Standart Saati + Lord Howe Yaz Saati + + + + + Makao Saati + Makao Yaz Saati + + + + + Magadan Saati + Magadan Yaz Saati + + + + + Malaya Saati + + + + + Malezya Saati + + + + + Maldivler Saati + + + + + Markiz Saati + + + + + Marshall Adaları Saati + + + + + Mauritius Saati + + + + + Mawson Saati + + + + + Ulan Batur Saati + Ulan Batur Yaz Saati + + + + + Moskova Saati + Moskova Standart Saati + Moskova Yaz Saati + + + + + Myanmar Saati + + + + + Nauru Saati + + + + + Nepal Saati + + + + + Yeni Kaledonya Saati + Yeni Kaledonya Yaz Saati + + + + + Yeni Zelanda Saati + Yeni Zelanda Standart Saati + Yeni Zelanda Yaz Saati + + + + + Newfoundland Saati + Newfoundland Standart Saati + Newfoundland Yaz Saati + + + + + Niue Saati + + + + + Norfolk Adası Saati + + + + + Fernando de Noronha Saati + Fernando de Noronha Yaz Saati + + + + + Kuzey Mariana Adaları Saati + + + + + Novosibirsk Saati + Novosibirsk Yaz Saati + + + + + Omsk Saati + Omsk Yaz Saati + + + + + Pakistan Saati + Pakistan Yaz Saati + + + + + Palau Saati + + + + + Papua Yeni Gine Saati + + + + + Paraguay Saati + Paraguay Yaz Saati + + + + + Peru Saati + Peru Yaz Saati + + + + + Filipinler Saati + Filipinler Yaz Saati + + + + + Phoenix Adaları Saati + + + + + Pierre ve Miquelon Saati + Pierre ve Miquelon Standart Saati + Pierre ve Miquelon Yaz Saati + + + + + Pitcairn Saati + + + + + Ponape Saati + + + + + Kızılorda Saati + Kızılorda Yaz Saati + + + + + Reunion Saati + + + + + Rothera Saati + + + + + Sakhalin Saati + Sakhalin Yaz Saati + + + + + Samara Saati + Samara Yaz Saati + + + + + Semerkand Saati + Semerkand Yaz Saati + + + SAMT (Semerkand) + SAMST (Semerkand) + + + + + Samoa Standart Saati + + + + + Seyşeller Saati + + + + + Şevçenko Saati + Şevçenko Yaz Saati + + + + + Singapur Standart Saati + + + + + Solomon Adaları Saati + + + + + Güney Georgia Saati + + + GST (Güney Georgia) + + + + + Surinam Saati + + + + + Sverdlovsk Saati + Sverdlovsk Yaz Saati + + + + + Showa Saati + + + + + Tahiti Saati + + + + + Tacikistan Saati + + + + + Taşkent Saati + Taşkent Yaz Saati + + + + + Tiflis Saati + Tiflis Yaz Saati + + + + + Tokelau Saati + + + + + Tonga Saati + Tonga Yaz Saati + + + + + Truk Saati + + + + + Türkiye Saati + Türkiye Yaz Saati + + + + + Türkmenistan Saati + Türkmenistan Yaz Saati + + + + + Tuvalu Saati + + + + + Oral Saati + Oral Yaz Saati + + + + + Uruguay Saati + Uruguay Yaz Saati + + + + + Urumçi Saati + + + + + Özbekistan Saati + Özbekistan Yaz Saati + + + + + Vanuatu Saati + Vanuatu Yaz Saati + + + + + Venezuela Saati + + + + + Vladivostok Saati + Vladivostok Yaz Saati + + + + + Volgograd Saati + Volgograd Yaz Saati + + + + + Vostok Saati + + + + + Wake Adası Saati + + + + + Wallis ve Futuna Saati + + + + + Yakutsk Saati + Yakutsk Yaz Saati + + + + + Yekaterinburg Saati + Yekaterinburg Yaz Saati + + + + + Erivan Saati + Erivan Yaz Saati + + + + + Yukon Saati + Yukon Standart Saati + Yukon Yaz Saati + + + + + + + , + . + ; + % + 0 + # + + + - + E + + + NaN + + + + + #,##0.### + + + + + + + #E0 + + + + + + + % #,##0 + + + + + + + #,##0.00 ¤ + + + {0} {1} + + + + Andora Pesetası + + + Birleşik Arap Emirlikleri Dirhemi + + + Afganistan Afganisi (1927-2002) + + + Afganistan Afganisi + Af + + + Arnavutluk Leki + lek + + + Ermenistan Dramı + dram + + + Hollanda Antilleri Guldeni + NA f. + + + Angola Kvanzası + + + Angola Kvanzası (1977-1990) + + + Yeni Angola Kvanzası (1990-2000) + + + Angola Kvanzası Reajustado (1995-1999) + + + Arjantin Australi + + + Arjantin Pezosu (1983-1985) + + + Arjantin Pezosu + Arg$ + + + Avusturya Şilini + + + Avustralya Doları + $A + + + Aruba Florini + + + Azerbaycan Manatı + + + Azeri Manatı + + + Bosna Hersek Dinarı + + + Konvertibl Bosna Hersek Markı + KM + + + Barbados Doları + BDS$ + + + Bangladeş Takası + Tk + + + Belçika Frangı (konvertibl) + + + Belçika Frangı + BF + + + Belçika Frangı (finansal) + + + Bulgar Levası (Hard) + lev + + + Yeni Bulgar Levası + + + Bahreyn Dinarı + BD + + + Burundi Frangı + Fbu + + + Bermuda Doları + Ber$ + + + Brunei Doları + + + Bolivya Bolivyanosu + Bs + + + Bolivya Pezosu + + + Bolivya Mvdol + + + Yeni Brezilya Kruzeirosu (1967-1986) + + + Brezilya Kruzadosu + + + Brezilya Kruzeirosu (1990-1993) + + + Brezilya Reali + + + Yeni Brezilya Kruzadosu + + + Brezilya Kruzeirosu + + + Bahama Doları + + + Bhutan Ngultrumu + Nu + + + Burma Kyatı + + + Botsvana Pulası + + + Yeni Beyaz Rusya Rublesi (1994-1999) + + + Beyaz Rusya Rublesi + Rbl + + + Belize Doları + BZ$ + + + Kanada Doları + Can$ + + + Kongo Frangı + + + WIR Avrosu + + + İsviçre Frangı + SwF + + + WIR Frangı + + + Şili Unidades de Fomento + + + Şili Pezosu + Ch$ + + + Çin Yuanı Renminbi + Y + + + Kolombiya Pezosu + Col$ + + + Unidad de Valor Real + + + Kosta Rika Kolonu + C + + + Eski Sırbistan Dinarı + + + Çekoslavak Korunası (Hard) + + + Küba Pezosu + + + Cape Verde Esküdosu + CVEsc + + + Güney Kıbrıs Lirası + £C + + + Çek Cumhuriyeti Korunası + + + Doğu Alman Markı + + + Alman Markı + + + Cibuti Frangı + DF + + + Danimarka Kronu + DKr + + + Dominik Pezosu + RD$ + + + Cezayir Dinarı + DA + + + Ekvator Sukresi + + + Ekvator Unidad de Valor Constante (UVC) + + + Estonya Krunu + + + Mısır Lirası + + + Ekuele + + + Eritre Nakfası + + + İspanyol Pesetası (A hesabı) + + + İspanyol Pesetası (konvertibl hesap) + + + İspanyol Pezetası + + + + Etiyopya Birri + Br + + + Euro + + + Fin Markkası + + + Fiji Doları + F$ + + + Falkland Adaları Lirası + + + Fransız Frangı + + + İngiliz Sterlini + £ + + + Gürcistan Kupon Larisi + + + Gürcistan Larisi + lari + + + Gana Sedisi (1979-2007) + + + Gana Sedisi + + + Cebelitarık Lirası + + + Gambiya Dalasisi + + + Gine Frangı + GF + + + Gine Syli + + + Ekvator Ginesi Ekuelesi + + + Yunan Drahmisi + + + Guatemala Ketzali + Q + + + Portekiz Ginesi Esküdosu + + + Gine-Bissau Pezosu + + + Guyana Doları + G$ + + + Hong Kong Doları + HK$ + + + Honduras Lempirası + L + + + Hırvat Dinarı + + + Hırvat Kunası + + + Haiti Gurdu + + + Macar Forinti + Ft + + + Endonezya Rupiahı + Rp + + + İrlanda Lirası + IR£ + + + İsrail Lirası + + + Yeni İsrail Şekeli + + + Hindistan Rupisi + INR + + + Irak Dinarı + ID + + + İran Riyali + RI + + + İzlanda Kronu + + + İtalyan Lireti + + + + Jamaika Doları + J$ + + + Ürdün Dinarı + JD + + + Japon Yeni + ¥ + + + Kenya Şilini + K Sh + + + Kırgız Somu + som + + + Kamboçya Rieli + CR + + + Komorlar Frangı + CF + + + Kuzey Kore Wonu + + + Güney Kore Wonu + + + Kuveyt Dinarı + KD + + + Kayman Adaları Doları + + + Kazakistan Tengesi + T + + + Laos Kipi + + + Lübnan Lirası + LL + + + Sri Lanka Rupisi + SL Re + + + Liberya Doları + + + Lesotho Lotisi + M + + + Maloti + + + Litvanya Litası + + + Litvanya Talonu + + + Konvertibl Lüksemburg Frangı + + + Lüksemburg Frangı + + + Finansal Lüksemburg Frangı + + + Letonya Latı + + + Letonya Rublesi + + + Libya Dinarı + LD + + + Fas Dirhemi + + + Fas Frangı + + + Moldova Leyi + + + Madagaskar Ariary + + + Madagaskar Frangı + + + Makedonya Dinarı + MDen + + + Mali Frangı + + + Myanmar Kyatı + + + Moğol Tugriki + Tug + + + Makao Patacası + + + Moritanya Ouguiyası + UM + + + Malta Lirası + Lm + + + Malta Sterlini + + + Mauritius Rupisi + + + Maldiv Adaları Rufiyaa + + + Malavi Kvaçası + MK + + + Meksika Pezosu + MEX$ + + + Gümüş Meksika Pezosu (1861-1992) + + + Meksika Unidad de Inversion (UDI) + + + Malezya Ringiti + RM + + + Mozambik Esküdosu + + + Eski Mozambik Metikali + Mt + + + Mozambik Metikali + MTn + + + Namibya Doları + N$ + + + Nijerya Nairası + + + Nikaragua Kordobası + + + Nikaragua Kordobası (Oro) + + + Hollanda Florini + + + Norveç Kronu + NKr + + + Nepal Rupisi + Nrs + + + Yeni Zelanda Doları + $NZ + + + Umman Riyali + RO + + + Panama Balboası + + + Peru İnti + + + Yeni Peru Solu + + + Peru Solu + + + Papua Yeni Gine Kinası + + + Filipinler Pezosu + Php + + + Pakistan Rupisi + Pra + + + Polonya Zlotisi + Zl + + + Polonya Zlotisi (1950-1995) + + + Portekiz Esküdosu + + + Paraguay Guaranisi + + + Katar Riyali + QR + + + Rodezya Doları + + + Eski Romen Leyi + leu + + + Romen Leyi + + + Sırp Dinarı + + + Rus Rublesi + + + Rus Rublesi (1991-1998) + + + Ruanda Frangı + + + Suudi Arabistan Riyali + SRl + + + Solomon Adaları Doları + SI$ + + + Seyşeller Rupisi + SR + + + Sudan Dinarı + + + Sudan Lirası + + + Eski Sudan Lirası + + + İsveç Kronu + SKr + + + Singapur Doları + S$ + + + Saint Helena Lirası + + + Slovenya Toları + + + Slovak Korunası + Sk + + + Sierra Leone Leonesi + + + Somali Şilini + Sh. + + + Surinam Doları + + + Surinam Guldeni + Sf + + + Sao Tome ve Principe Dobrası + Db + + + Sovyet Rublesi + + + El Salvador Kolonu + + + Suriye Lirası + LS + + + Swaziland Lilangenisi + E + + + Tayland Bahtı + + + Tacikistan Rublesi + + + Tacikistan Somonisi + + + Türkmenistan Manatı + + + Tunus Dinarı + + + Tonga Paʻangası + T$ + + + Timor Esküdosu + + + Eski Türk Lirası + TL + + + Türk Lirası + + + Trinidad ve Tobago Doları + TT$ + + + Yeni Tayvan Doları + NT$ + + + Tanzanya Şilini + T Sh + + + Ukrayna Grivnası + + + Ukrayna Karbovanetz + + + Uganda Şilini (1966-1987) + + + Uganda Şilini + U Sh + + + ABD Doları + $ + + + ABD Doları (Ertesi gün) + + + ABD Doları (Aynı gün) + + + Uruguay Peso en Unidades Indexadas + + + Uruguay Pezosu (1975-1993) + + + Uruguay Pezosu (Uruguayo) + Ur$ + + + Özbekistan Sumu + + + Venezuela Bolivarı + Be + + + Güçlü Venezuela Bolivarı + BsF + + + Vietnam Dongu + + + Vanuatu Vatusu + VT + + + Batı Samoa Talası + + + CFA Frangı BEAC + + + Gümüş + + + Altın + + + Birleşik Avrupa Birimi + + + Avrupa Para Birimi (EMU) + + + Avrupa Hesap Birimi (XBC) + + + Avrupa Hesap Birimi (XBD) + + + Doğu Karayip Doları + EC$ + + + Özel Çekme Hakkı (SDR) + + + Avrupa Para Birimi + + + Fransız Altın Frangı + + + Fransız UIC-Frangı + + + CFA Frangı BCEAO + + + Paladyum + + + CFP Frangı + CFPF + + + Platin + + + RINET Fonları + + + Test Para Birimi Kodu + + + Bilinmeyen veya Geçersiz Para Birimi + + + Yemen Dinarı + + + Yemen Riyali + YRl + + + Yugoslav Dinarı (Hard) + + + Yeni Yugoslav Dinarı + + + Konvertibl Yugoslav Dinarı + + + Güney Afrika Randı (finansal) + + + Güney Afrika Randı + R + + + Zambiya Kvaçası + + + Yeni Zaire Zairesi + + + Zaire Zairesi + + + Zimbabwe Doları + Z$ + + + + + + {0} gün + + + {0} saat + + + {0} dakika + + + {0} ay + + + {0} saniye + + + {0} hafta + + + {0} yıl + + + + + evet:e + hayır:hayir:h + + + diff --git a/libs/Zend/Locale/Data/tr_TR.xml b/libs/Zend/Locale/Data/tr_TR.xml new file mode 100644 index 0000000..3941faa --- /dev/null +++ b/libs/Zend/Locale/Data/tr_TR.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/ts.xml b/libs/Zend/Locale/Data/ts.xml new file mode 100644 index 0000000..06c0a44 --- /dev/null +++ b/libs/Zend/Locale/Data/ts.xml @@ -0,0 +1,260 @@ + + + + + + + + + + + Xi Czech + Xi Danish + Xi Jarimani + Xi Giriki + Xi Nghezi + Xi spain + hi xi Estonia + Xi Finnish + Xi Furwa + XiHeberu + hi xi Hungary + hi xi Iceland + Xi Ithali + Xi Japani + Xikorea + hi xi Lithuania + hi xi Latvia + Xi bunu + Xi Norway + Xi Polixi + Putukezi + hi xi Romania + Xi Rhaxiya + Xi Swiden + Xitsonga + + + + [a-z] + + + + + + + + + + + + + + Sun + Yan + Kul + Dzi + Mud + Kho + Maw + Mha + Ndz + Nhl + Huk + N'w + + + Sunguti + Nyenyenyani + Nyenyankulu + Dzivamisoko + Mudyaxihi + Khotavuxika + Mawuwani + Mhawuri + Ndzhati + Nhlangula + Hukuri + N'wendzamhala + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + Son + Mus + Bir + Har + Ne + Tlh + Mug + + + Sonto + Musumbhunuku + Ravumbirhi + Ravunharhu + Ravumune + Ravuntlhanu + Mugqivela + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + K1 + K2 + K3 + K4 + + + Kotara yo sungula + Kotara ya vumbirhi + Kotara ya vunharhu + Kotara ya vumune + + + + AM + PM + + + BC + AD + + + BC + AD + + + + + + EEEE, yyyy MMMM dd + + + + + yyyy MMMM d + + + + + yyyy MMM d + + + + + yy/MM/dd + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1} {0} + + + + Q yy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + , +   + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + ¤#,##0.00 + + + + + + R + + + + diff --git a/libs/Zend/Locale/Data/ts_ZA.xml b/libs/Zend/Locale/Data/ts_ZA.xml new file mode 100644 index 0000000..6e9a375 --- /dev/null +++ b/libs/Zend/Locale/Data/ts_ZA.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/tt.xml b/libs/Zend/Locale/Data/tt.xml new file mode 100644 index 0000000..cb14df2 --- /dev/null +++ b/libs/Zend/Locale/Data/tt.xml @@ -0,0 +1,214 @@ + + + + + + + + + + + Татар + + + Россия + + + + [а ә б-е ё ж җ з-о ө п-у ү ф х һ ц-я] + + + + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + AM + PM + + + BCE + CE + + + + + + d MMMM yyyy + + + + + d MMMM yyyy + + + + + dd.MM.yyyy + + + + + dd.MM.yyyy + + + + + + + h:mm:ss a v + + + + + H:mm:ss z + + + + + H:mm:ss + + + + + H:mm + + + + + + + {1} {0} + + + + H:mm + d MMMM + dd.MM + mm:ss + Q yy + MM.yyyy + MMMM yyyy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + , +   + + + + + #,##0.00¤ + + + + + + р. + + + + diff --git a/libs/Zend/Locale/Data/tt_RU.xml b/libs/Zend/Locale/Data/tt_RU.xml new file mode 100644 index 0000000..774676b --- /dev/null +++ b/libs/Zend/Locale/Data/tt_RU.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/ug.xml b/libs/Zend/Locale/Data/ug.xml new file mode 100644 index 0000000..c7b25ad --- /dev/null +++ b/libs/Zend/Locale/Data/ug.xml @@ -0,0 +1,190 @@ + + + + + + + + + + + Uyghur + + + + + + + [ئ-ب پ ت ج چ خ د ر ز ژ س ش غ ف-ك ڭ گ ل-ه ە و ۆ-ۈ ۋ ى ي ې] + + + + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + AM + PM + + + BCE + CE + + + + + + EEEE, yyyy MMMM dd + + + + + yyyy MMMM d + + + + + yyyy MMM d + + + + + yy/MM/dd + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1} {0} + + + + Q yy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + diff --git a/libs/Zend/Locale/Data/ug_Arab.xml b/libs/Zend/Locale/Data/ug_Arab.xml new file mode 100644 index 0000000..82d16f3 --- /dev/null +++ b/libs/Zend/Locale/Data/ug_Arab.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Світ + Африка + Північноамериканський континент + Південна Америка + Океанія + Західна Африка + Центральна Америка + Східна Африка + Північна Африка + Центральна Африка + Південна Африка + Америки + Північна Америка + Карибський басейн + Східна Азія + Південна Азія + Південно-Східна Азія + Південна Європа + Австралія та Нова Зеландія + Меланезія + Мікронезійський регіон + Полінезія + Південно-Центральна Азія + Азія + Центральна Азія + Західна Азія + Європа + Східна Європа + Північна Європа + Західна Європа + Співдружність Незалежних Держав + Латинська Америка і Карибський басейн + Нормандські острови + Андорра + Обʼєднані Арабські Емірати + Афганістан + Антигуа і Барбуда + Ангілья + Албанія + Вірменія + Нідерландські Антильські Острови + Ангола + Антарктида + Аргентина + Американське Самоа + Австрія + Австралія + Аруба + Аландські острови + Азербайджан + Боснія і Герцоговина + Барбадос + Бангладеш + Бельгія + Буркіна-Фасо + Болгарія + Бахрейн + Бурунді + Бенін + Острів Святого Бартоломея + Бермуди + Бруней + Болівія + Бразилія + Багами + Бутан + Острів Буве + Ботсвана + Білорусь + Беліз + Канада + Кокосові острови + Демократична Республіка Конґо + Центральноафриканська Республіка + Конґо - Браззавіль + Швейцарія + Кот-д’Івуар + Острови Кука + Чилі + Камерун + Китай + Колумбія + Коста-Рика + Сербія та Чорногорія + Куба + Кабо-Верде + Острів Різдва + Кіпр + Чеська республіка + Німеччина + Джібуті + Данія + Домінік + Домініканська Республіка + Алжир + Еквадор + Естонія + Єгипет + Західна Сахара + Еритрея + Іспанія + Ефіопія + Фінляндія + Фіджі + Фолклендські острови + Мікронезія + Фарерські острови + Франція + Габон + Великобританія + Гренада + Грузія + Французька Гвіана + Гернсі + Гана + Гібралтар + Гренландія + Гамбія + Гвінея + Гваделупа + Екваторіальна Гвінея + Греція + Південна Джорджія та Південні Сандвічеві Острови + Гватемала + Гуам + Гвінея-Біссау + Гайана + Гонконґ + Острови Херд і Мак-Дональд + Гондурас + Хорватія + Гаїті + Угорщина + Індонезія + Ірландія + Ізраїль + Острів Мен + Індія + Британські території Індійського океану + Ірак + Іран + Ісландія + Італія + Джерсі + Ямайка + Йорданія + Японія + Кенія + Киргизстан + Камбоджа + Кірибаті + Коморські Острови + Сент-Кітс і Невіс + Північна Корея + Південна Корея + Кувейт + Кайманові острови + Казахстан + Лаос + Ліван + Сент-Люсія + Ліхтенштейн + Шрі-Ланка + Ліберія + Лесото + Литва + Люксембург + Латвія + Лівія + Марокко + Монако + Молдова + Чорногорія + Острів Святого Мартіна + Мадагаскар + Маршаллові Острови + Македонія + Малі + Мʼянма + Монголія + Макао + Північні Маріанські Острови + Мартиніка + Мавританія + Монсеррат + Мальта + Маврикій + Мальдіви + Малаві + Мексика + Малайзія + Мозамбік + Намібія + Нова Каледонія + Нігер + Острів Норфолк + Нігерія + Нікарагуа + Нідерланди + Норвегія + Непал + Науру + Нія + Нова Зеландія + Оман + Панама + Перу + Французька Полінезія + Папуа Нова Гвінея + Філіппіни + Пакистан + Польща + Сен-Пʼєр і Мікелон + Піткерн + Пуерто-Ріко + Палестина + Португалія + Палау + Парагвай + Катар + Інша Океанія + Європейський Союз + Реюньйон + Румунія + Сербія + Росія + Руанда + Саудівська Аравія + Соломонові Острови + Сейшели + Судан + Швеція + Сінгапур + Острів Святої Єлени + Словенія + Острови Свальбард та Ян-Маєн + Словакія + Сьєрра-Леоне + Сан-Марино + Сенегал + Сомалі + Суринам + Сан-Томе і Прінсіпі + Сальвадор + Сирія + Свазіленд + Теркс і Кайкос + Чад + Французькі Південні Території + Того + Таїланд + Таджикистан + Токелау + Східний Тимор + Туркменистан + Туніс + Тонга + Туреччина + Тринідад і Тобаго + Тувалу + Тайвань + Танзанія + Україна + Уганда + Віддалені Острови США + США + Уругвай + Узбекистан + Ватикан + Сент-Вінсент і Гренадини + Венесуела + Віргінські острови Британії + Віргінські острови США + Вʼєтнам + Вануату + Уолліс і Футуна + Самоа + Ємен + Майот + ПАР + Замбія + Зімбабве + Невідомий або неправильний регіон + + + Традиційна німецька орфографія + Стандартизована резьянська орфографія + Нова німецька орфографія з 1996 р. + Пізньосередньофранцузська до 1606 + Східновірменський + Західновірменський + Уніфікований турецький латинський алфавіт + Діалект Сан-Джорджіо/Біла + Бунтлінг + Міжнародний фонетичний алфавіт + Уральський фонетичний алфавіт + Ліповазський діалект резьянської мови + Монотонічний + Натісонський діалект + Діалект Нджіва + Осоянський діалект + Політонічний + Комп'ютерний + Нова орфографія + Резьянський + Сахо + Шотландська англійська + Ліверпульський + Діалект Столвіца/Солбіка + Орфографія Тараскевича + + + Календар + Сортування + Валюта + + + Китайський традиційний + Буддійський календар + Китайський календар + Прямий порядок + Китайський спрощений + Григоріанський календар + Єврейський календар + Індійський світський календар + Мусульманський календар + Мусульманський світський календар + Японський календар + Телефонна книга + Порядок піньїн + Китайський григоріанський + Порядок ключів + Традиційний + + + США + Метрична + + + Мова з кодом {0} + Скрипт із кодом {0} + Територія з кодом {0} + + + + lowercase-words + lowercase-words + + + [ʼ а-г ґ д е є ж-и і ї й-щ ь ю я] + [i v x] + [a-z] + + + « + » + + + + + GanjkHmsSEDFwWxhKzAeugXZvcL + + + + + + Тот + Бабе + Хатур + Кіхак + Тобе + Амшир + Барамхат + Бармуда + Башнас + Бауна + Абіб + Мисра + Насі + + + Тот + Бабе + Хатур + Кіхак + Тобе + Амшир + Барамхат + Бармуда + Башнас + Бауна + Абіб + Мисра + Насі + + + + + + + + + січ. + лют. + бер. + квіт. + трав. + черв. + лип. + серп. + вер. + жовт. + лист. + груд. + + + січня + лютого + березня + квітня + травня + червня + липня + серпня + вересня + жовтня + листопада + грудня + + + + + Січ + Лют + Бер + Кві + Тра + Чер + Лип + Сер + Вер + Жов + Лис + Гру + + + С + Л + Б + К + Т + Ч + Л + С + В + Ж + Л + Г + + + Січень + Лютий + Березень + Квітень + Травень + Червень + Липень + Серпень + Вересень + Жовтень + Листопад + Грудень + + + + + + + Нд + Пн + Вт + Ср + Чт + Пт + Сб + + + Неділя + Понеділок + Вівторок + Середа + Четвер + Пʼятниця + Субота + + + + + Н + П + В + С + Ч + П + С + + + + + + + I кв. + II кв. + III кв. + IV кв. + + + I квартал + II квартал + III квартал + IV квартал + + + + + I кв. + II кв. + III кв. + IV кв. + + + 1 + 2 + 3 + 4 + + + + дп + пп + + + до нашої ери + нашої ери + + + до н.е. + н.е. + + + + + + EEEE, d MMMM yyyy 'р'. + + + + + d MMMM yyyy 'р'. + + + + + d MMM yyyy + + + + + dd.MM.yy + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1} {0} + + + + HH:mm + HH:mm:ss + H:mm + LLL + E, d MMM + E, d MMMM + d MMMM + d MMM + dd.MM + d + mm:ss + mm:ss + yyyy + LLL yyyy + EEE, d MMM yyyy + LLLL yyyy + MM.yy + MMM yy + Q yy + LLLL yyyy + QQQQ yyyy 'р'. + + + {0} – {1} + + M–M + + + E, dd.MM – E, dd.MM + E, dd.MM – E, dd.MM + + + LLL–LLL + + + E, d MMM – E, d MMM + E, d – E, d MMM + + + d MMM – d MMM + d–d MMM + + + dd.MM – dd.MM + dd.MM – dd.MM + + + d–d + + + HH–HH + + + HH:mm–HH:mm + HH:mm–HH:mm + + + HH:mm–HH:mm v + HH:mm–HH:mm v + + + HH–HH v + + + y–y + + + MM.yy – MM.yy + MM.yy – MM.yy + + + E, dd.MM.yy – E, dd.MM.yy + E, dd.MM.yy – E, dd.MM.yy + E, dd.MM.yy – E, dd.MM.yy + + + LLL–LLL yyyy + LLL yyyy – LLL yyyy + + + E, d MMM – E, d MMM yyyy + E, d – E, d MMM yyyy + E, d MMM yyyy – E, d MMM yyyy + + + d MMM – d MMM yyyy + d–d MMM yyyy + d MMM yyyy – d MMM yyyy + + + dd.MM.yy – dd.MM.yy + dd.MM.yy – dd.MM.yy + dd.MM.yy – dd.MM.yy + + + + + + Ера + + + Рік + + + Місяць + + + Тиждень + + + День + Сьогодні + Завтра + Післязавтра + Вчора + Позавчора + + + День тижня + + + Частина доби + + + Година + + + Хвилина + + + Секунда + + + Зона + + + + + + + + Тішри + Марчешван + Числьов + Тебет + Шеват + Адар Ⅰ + Адар + Нісан + Сиван + Таммуз + Аб + + + Тішри + Марчешван + Числьов + Тебет + Шеват + Адар Ⅰ + Адар + Нісан + Іар + Сиван + Таммуз + Аб + Елул + + + + + Адар I + + + Адар I + + + + + + + + + Мухаррам + Сафар + Рабі I + Рабі II + Джумада I + Джумада II + Раджаб + Шаабан + Рамадан + Даввал + Зу-ль-каада + Зу-ль-хіджа + + + + + + + + + Фарвардін + Ордібехешт + Хордад + Тір + Мордад + Шахрівер + Мехр + Абан + Азер + Дей + Бахман + Есфанд + + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + Невідомо + + + Андора + + + Дубаї + + + Кабул + + + Антигуа + + + Анґілья + + + Тірана + + + Єреван + + + Кюрасао + + + Луанда + + + Ротера + + + Палмер + + + Південний полюс + + + Сьова + + + Моусон + + + Девіс + + + Восток + + + Кейсі + + + Дюмон-д'Юрвіль + + + Мак-Мердо + + + Ріо-Ґалеґос + + + Мендоса + + + Сан-Хуан + + + Ушуая + + + Ла-Ріоха + + + Сан-Луїс + + + Катамарка + + + Жужуй + + + Тукуман + + + Кордоба + + + Буенос-Айрес + + + Паго Паго + + + Відень + + + Перт + + + Евкла + + + Дарвін + + + Аделаїда + + + Брокен-Гіл + + + Каррі + + + Мельбурн + + + Хобарт + + + Ліндеман + + + Сідней + + + Брисбен + + + Лорд-Хау + + + Аруба + + + Аландські острови + + + Баку + + + Сараєво + + + Барбадос + + + Дака + + + Брюссель + + + Уагадугу + + + Софія + + + Бахрейн + + + Бужумбура + + + Порто-Ново + + + Бермуди + + + Бруней + + + Ла-Пас + + + Ейрунепе + + + Ріо-Бранко + + + Порто-Велью + + + Боа-Віста + + + Манаус + + + Куяба + + + Кампу-Гранді + + + Белен + + + Арагуайна + + + Сан-Паулу + + + Байя + + + Форталеза + + + Масейо + + + Ресіфі + + + Норонья + + + Насау + + + Тхімпху + + + Габороне + + + Мінськ + + + Беліз + + + Доусон + + + Вайтгорс + + + Інувік + + + Ванкувер + + + Доусон-Крік + + + Єллоунайф + + + Едмонтон + + + Свіфт-Каррент + + + Кембридж-Бей + + + Реджайна + + + Вінніпеґ + + + Резолют + + + Рейні-Рівер + + + Ренкін-Інлет + + + Корал-Харбор + + + Тандер-Бей + + + Ніпігон + + + Торонто + + + Монреаль + + + Ікалуіт + + + Панґніртунґ + + + Монктон + + + Галіфакс + + + Гуз-Бей + + + Глейс-Бей + + + Бланк-Саблон + + + Сент-Джонс + + + Кокосові острови + + + Кіншаса + + + Лубумбаші + + + Бангі + + + Браззавіль + + + Цюріх + + + Абіджан + + + Раротонга + + + Острів Пасхи + + + Сантьяго + + + Дуала + + + Кашгар + + + Урумчі + + + Чунцин + + + Шанхай + + + Харбін + + + Богота + + + Коста Ріка + + + Гавана + + + Кабо-Верде + + + Острів Різдва + + + Нікосія + + + Прага + + + Берлін + + + Джибуті + + + Копенгаген + + + Домініка + + + Санто-Домінго + + + Алжир + + + Ґалапагос + + + Гуаякіль + + + Таллін + + + Каїр + + + Ель-Аюн + + + Асмера + + + Канари + + + Сеута + + + Мадрид + + + Аддис-Абеба + + + Гельсінкі + + + Фіджи + + + Стенлі + + + Трук + + + Понапе + + + Косрае + + + Фарерські острови + + + Париж + + + Лібревіль + + + Лондон + + + Гренада + + + Тбілісі + + + Кайенна + + + Ґернсі + + + Аккра + + + Гібралтар + + + Туле + + + Готхоб + + + Скорсбисун + + + Денмарксхавн + + + Банжул + + + Конакрі + + + Ґваделупа + + + Малабо + + + Афіни + + + Південна Джорджія + + + Гватемала + + + Гуам + + + Бісау + + + Ґайана + + + Гонконг + + + Тегусігальпа + + + Загреб + + + Порт-о-Пренс + + + Будапешт + + + Джакарта + + + Понтіанак + + + Макасар + + + Джайпур + + + Дублін + + + Єрусалим + + + Острів Мен + + + Калькутта + + + Чагос + + + Багдад + + + Тегеран + + + Рейк'явік + + + Рим + + + Джерсі + + + Ямайка + + + Амман + + + Токіо + + + Найробі + + + Бішкек + + + Пномпень + + + Ендербері + + + Кірітіматі + + + Тарава + + + Комори + + + Сент-Кітс і Невіс + + + Пхеньян + + + Сеул + + + Кувейт + + + Кайманові острови + + + Актау + + + Орал + + + Актобе + + + Кзил-Орда + + + Алмати + + + В’єнтьян + + + Бейрут + + + Сент-Лусія + + + Вадуц + + + Коломбо + + + Монровія + + + Масеру + + + Вільнюс + + + Люксембург + + + Рига + + + Тріполі + + + Касабланка + + + Монако + + + Кишинів + + + Подгориця + + + Антананаріву + + + Кваджалейн + + + Маджуро + + + Скоп'є + + + Бамако + + + Рангун + + + Говд + + + Улан-Батор + + + Чойбалсан + + + Макао + + + Сайпан + + + Мартініка + + + Нуакшот + + + Монсерат + + + Мальта + + + Маврикій + + + Мальдіви + + + Блантир + + + Тіхуана + + + Ермосільйо + + + Масатлан + + + Чіуауа + + + Монтерей + + + Мехіко + + + Меріда + + + Канкун + + + Куала-Лумпур + + + Кучінґ + + + Мапуту + + + Віндхук + + + Нумеа + + + Ніамей + + + Норфолк + + + Лагос + + + Манагуа + + + Амстердам + + + Осло + + + Катманду + + + Науру + + + Ніуе + + + Чатем + + + Окленд + + + Маскат + + + Панама + + + Ліма + + + Таїті + + + Маркизькі о-ви + + + Гамбер + + + Порт-Морсбі + + + Маніла + + + Карачі + + + Варшава + + + Мікелон + + + Піткерн + + + Пуерто Ріко + + + Газа + + + Азорські острови + + + Мадейра + + + Лісабон + + + Палау + + + Асунсьйон + + + Катар + + + Реюньйон + + + Бухарест + + + Белград + + + Калінінград + + + Москва + + + Волгоград + + + Самара + + + Єкатеринбург + + + Омськ + + + Новосибірськ + + + Красноярськ + + + Іркутськ + + + Якутськ + + + Владивосток + + + Сахалін + + + Магадан + + + Камчатка + + + Анадир + + + Кігалі + + + Ер-Ріяд + + + Гвадалканал + + + Махе + + + Хартум + + + Стокгольм + + + Сингапур + + + Острів Святої Єлени + + + Любляна + + + Лонгербюйн + + + Братислава + + + Фрітаун + + + Сан-Маріно + + + Дакар + + + Могадішо + + + Парамарібо + + + Сан-Томе і Принсіпі + + + Сальвадор + + + Дамаск + + + Мбабане + + + Гранд-Терк + + + Нджамена + + + Острів Кергелен + + + Ломе + + + Бангкок + + + Душанбе + + + Факаофо + + + Ділі + + + Ашгабат + + + Туніс + + + Тонгатапу + + + Стамбул + + + Порт-оф-Спейн + + + Фунафуті + + + Тайпей + + + Дар-ес-Салаам + + + Ужгород + + + Київ + + + Сімферополь + + + Запоріжжя + + + Кампала + + + Мідуей + + + Джонстон + + + Вей΀º + + + Адак + + + Ном + + + Гонолулу + + + Анкоридж + + + Якутат + + + Джуно + + + Лос-Анджелес + + + Бойсе + + + Фінікс + + + Шипрок + + + Денвер + + + Нью-Салем + + + Центр + + + Чикаго + + + Меноміні + + + Вінсенс + + + Петербург + + + Телл-сіті + + + Нокс + + + Вінамак + + + Маренго + + + Індіанаполіс + + + Луїсвілль + + + Вівей + + + Монтичелло + + + Детройт + + + Нью-Йорк + + + Монтевідео + + + Самарканд + + + Ташкент + + + Ватикан + + + Сент-Вінсент + + + Каракас + + + Тортола + + + Сент-Томас + + + Сайгон + + + Ефате + + + Уолліс + + + Апіа + + + Аден + + + Майорка + + + Йоганнесбург + + + Лусака + + + Хараре + + + + за центральноафриканським часом + + + + + за східноафриканським часом + + + + + за південноафриканським часом + за південноафриканським стандартним часом + + + + + за західноафриканським часом + за західноафриканським літнім часом + + + + + за північноамериканським центральним часом + за північноамериканським центральним стандартним часом + за північноамериканськ΀¸м центральним літнім часом + + true + + + + за північноамериканським східним часом + за північноамериканським східним стандартним часом + за північноамериканським східним літнім часом + + true + + + + за північноамериканським гірним часом + за північноамериканським гірним стандартним часом + за північноамериканським гірним літнім часом + + true + + + + за північноамериканським тихоокеанським часом + за північноамериканським тихоокеанським стандартним часом + за північноамериканським тихоокеанським літнім часом + + true + + + + за вірменським часом + за вірменським літнім часом + + + + + за атлантичним часом + за атлантичним стандартним часом + за атлантичним літнім часом + + + + + за центральноєвропейським часом + за центральноєвропейським літнім часом + + + + + за східноєвропейським часом + за східноєвропейським літнім часом + + + + + за західноєвропейським часом + за західноєвропейським літнім часом + + + + + за Грінвічем + + true + + + + за іранським стандартним часом + за іранським літнім часом + + + + + за іркутським часом + за іркутським літнім часом + + true + + + + за ізраїльським часом + + + + + за японським часом + за японським літнім часом + + + + + за камчатським часом + за камчатським літнім часом + + true + + + + за красноярським часом + за красноярським літнім часом + + true + + + + за куйбишевським часом + за куйбишевським літнім часом + + + + + за магаданським часом + за магаданським літнім часом + + true + + + + за московським часом + за московським стандартним часом + за московським літнім часом + + true + + + + за новосибірським часом + за новосибірським літнім часом + + + + + за омським часом + за омським літнім часом + + true + + + + за самарським часом + за самарським літнім часом + + + + + за турецьким часом + за турецьким літнім часом + + + + + за владивостоцьким часом + за владивостоцьким літнім часом + + true + + + + за волгоградським часом + за волгоградським літнім часом + + + + + за якутським часом + за якутським літнім часом + + true + + + + за єкатеринбурзьким часом + за єкатеринбурзьким літнім часом + + true + + + + + + , +   + ; + % + 0 + # + + + - + + + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + #,##0.00 ¤ + + + {0} {1} + {0} {1} + {0} {1} + + + + Андоррська песета + + + Дирхем ОАЕ + + + Афгані (1927-2002) + + + Афгані + Af + + + Албанський лек + lek + + + Вірменський драм + dram + + + Гульден Нідерландських Антіл + NA f. + + + Ангольська кванза + + + Ангольська кванза (1977-1990) + + + Ангольська нова кванза (1990-2000) + + + Ангольська кванза реаджастадо (1995-1999) + + + Аргентинський австрал + + + Аргентинський песо (1983-1985) + + + Аргентинський песо + Arg$ + + + Австрійський шилінг + + + Австралійський долар + $A + + + Арубський гульден + + + Азербайджанський манат (1993-2006) + + + Азербайджанський манат + + + Динар (Боснія і Герцеговина) + + + Конвертована марка Боснії і Герцоговини + KM + + + Барбадоський долар + BDS$ + + + Бангладеська така + Tk + + + Бельгійський франк (конвертований) + + + Бельгійський франк + BF + + + Бельгійський франк (фінансовий) + + + Болгарський твердий лев + lev + + + Болгарський новий лев + + + Бахрейнський динар + BD + + + Бурундійський франк + Fbu + + + Бермудський долар + Ber$ + + + Брунейський долар + + + Болівіано + Bs + + + Болівійське песо + + + Болівійський мвдол + + + Бразильське нове крузейро (1967-1986) + + + Бразильське крузадо + + + Бразильське крузейро (1990-1993) + + + Бразильський реал + + + Бразильське нове крузадо + + + Бразильське крузейро + + + Багамський долар + + + Бутанський нгултрум + Nu + + + Бірманський кіат + + + Ботсванська пула + + + Білоруський новий рубль (1994-1999) + білоруські нові рублі (1994-1999) + білоруських нових рублів (1994-1999) + + + Білоруський рубль + білоруські рублі + білоруських рублів + Rbl + + + Белізький долар + BZ$ + + + Канадський долар + Can$ + + + Конголезький франк + + + Євро WIR + + + Швейцарський франк + SwF + + + Франк WIR + + + Чилійський юнідадес де фоменто + + + Чілійський песо + Ch$ + + + Китайський юань + Y + + + Колумбійський песо + Col$ + + + Юнідад де валор ріал + + + Костариканський колон + C + + + Старий сербський динар + + + Чехословацька тверда крона + + + Кубинський песо + + + Ескудо Кабо-Верде + CVEsc + + + Кіпрський фунт + £C + + + Чеська крона + + + Марка НДР + + + Німецька марка + + + Джибутійський франк + DF + + + Датська крона + DKr + + + Домініканський песо + RD$ + + + Алжирський динар + DA + + + Еквадорський сукре + + + Еквадорський юнідад де валор константе + + + Естонська крона + + + Єгипетський фунт + + + Еквеле + + + Еритрейська накфа + + + Іспанська песета ("А" рахунок) + + + Іспанська песета (конвертовані рахунки) + + + Іспанська песета + + + Ефіопський бір + Br + + + Євро + євро + євро + євро + + + Фінляндська марка + + + Долар Фіджі + F$ + + + Фолклендський фунт + + + Французький франк + + + Англійський фунт стерлінгів + £ + + + Грузинський купон + грузинські купони + грузинських купонів + + + Грузинський ларі + lari + + + Ганський седі (1979-2007) + + + Ганський седі + + + Гібралтарський фунт + + + Гамбійська даласі + + + Гвійнейський франк + GF + + + Гвінейське сілі + + + Еквеле (Екваторіальна Ґвінея) + + + Грецька драхма + + + Гватемальський кетсаль + Q + + + Ескудо Португальської Гвінеї + + + Песо Гвінеї-Бісау + + + Гайянський долар + G$ + + + Гонконгівський долар + HK$ + + + Гондураська лемпіра + L + + + Хорватський динар + + + Хорватська куна + + + Гаїтянський гурд + + + Угорський форинт + Ft + + + Індонезійська рупія + Rp + + + Ірландський фунт + IR£ + + + Ізраїльський фунт + + + Ізраїльський новий шекель + + + Індійська рупія + INR + + + Іракський динар + ID + + + Іранський ріал + RI + + + Ісландська крона + + + Італійська ліра + + + + Ямайський долар + J$ + + + Йорданський динар + JD + + + Японська єна + ¥ + + + Кенійський шилінг + K Sh + + + Киргизький сом + som + + + Камбоджійський рієль + CR + + + Коморський франк + CF + + + Вона Північної Кореї + + + Вона Південної Кореї + + + Кувейтський динар + KD + + + Долар Кайманових островів + + + Казахстанський тенге + T + + + Лаоський кіп + + + Ліванський фунт + LL + + + Шрі-ланкійська рупія + SL Re + + + Ліберійський долар + + + Лесотський лоті + M + + + Малоті + + + Литовський літ + + + Литовський талон + + + Люксембурґський франк (Конвертований) + + + Люксембурзький франк + + + Люксембурґський франк (Фінансовий) + + + Латвійський лат + + + Латвійський рубль + + + Лівійський динар + LD + + + Марокканський дирхем + + + Марокканський франк + + + Молдовський лей + + + Мадагаскарський аріарі + + + Мадагаскарський франк + + + Македонський динар + MDen + + + Малійський франк + + + Кʼят Мʼянми + + + Монгольський тугрик + Tug + + + Макао патака + + + Мавританська угія + UM + + + Мальтійська ліра + Lm + + + Мальтійський фунт + + + Маврикійська рупія + + + Мальдівська руфія + + + Квача (Малаві) + MK + + + Мексиканське песо + MEX$ + + + Мексиканське срібне песо (1861-1992) + + + Мексиканський юнідад де інверсіон + + + Малайзійський рингіт + RM + + + Мозамбіцький ескудо + + + Старий мозамбіцький метикал + Mt + + + Мозамбіцький метикал + + + Намібійський долар + N$ + + + Нігерійська найра + + + Нікарагуанська кордоба + + + Нікарагуанська кордоба оро + + + Нідерландський гульден + + + Норвезька крона + NKr + + + Непальська рупія + Nrs + + + Новозеландський долар + $NZ + + + Оманський ріал + RO + + + Панамська бальбоа + + + Перуанський інті + + + Перуанський новий сол + + + Перуанський сол + + + Кіна Папуа Нової Гвінеї + + + Філіппінське песо + + + Пакистанська рупія + Pra + + + Польський злотий + Zl + + + Польський злотий (1950-1995) + + + Португальський ескудо + + + Парагвайський гуарані + + + Катарський ріал + QR + + + Родезійський долар + + + Старий румунський лей + leu + + + Румунський лей + + + Сербський динар + + + Російський рубль + російські рублі + російських рублів + Російський рубль + руб. + + + Російський рубль (1991-1998) + російські рублі (RUR) + російських рублів (RUR) + Російсьий рубль RUR + + + Руандійський франк + + + Саудівський ріал + SRl + + + Долар Соломонових Островів + SI$ + + + Сейшельська рупія + SR + + + Суданський динар + + + Суданський фунт + + + Старий суданський фунт + + + Шведська крона + SKr + + + Сінгапурський долар + S$ + + + Фунт Святої Єлени + + + Словенський толар + + + Словацька крона + Sk + + + Леоне Сьєрра-Леоне + + + Сомалійський шилінг + Sh. + + + Суринамський долар + + + Суринамський гульден + Sf + + + Добра Сан-Томе і Прінсіпі + Db + + + Радянський рубль + радянські рублі + радянських рублів + радянський рубль + + + Сальвадорський колон + + + Сирійський фунт + LS + + + Свазілендські лілангені + E + + + Таїландський бат + + + Таджицький рубль + + + Таджицький сомоні + + + Туркменський манат + + + Туніський динар + + + Паанга Тонго + T$ + + + Тіморський ескудо + + + Стара турецька ліра + старі турецькі ліри + старих турецьких лір + стара турецька ліра + TL + + + Турецька ліра + турецькі ліри + турецьких лір + турецька ліра + + + Долар Тринідаду і Тобаго + TT$ + + + Новий тайванський долар + NT$ + + + Танзанійський шилінг + T Sh + + + Українська гривня + гривні + гривень + гривня + гривні + грн. + + + Український карбованець + українські карбованці + українських карбованців + український карбованець + українського карбованця + крб. + + + Угандійський шилінг (1966-1987) + + + Угандійський шилінг + U Sh + + + Долар США + $ + + + Долар США (наступного дня) + + + Долар США (цього дня) + + + Уругвайський песо в індексованих одиницях + + + Уругвайське песо (1975-1993) + + + Уругвайське песо + Ur$ + + + Узбецький сум + + + Венесуельський болівар + Be + + + Венесуельський болівар фуерте + + + Вʼєтнамський донг + + + Вануатська вату + VT + + + Тала Західного Самоа + + + Франк Центральноафриканського фінансового товариства + + + Срібло + + + Золото + + + Європейська складена валютна одиниця + + + Одиниця Європейського валютного фонду + + + Європейська розрахункова одиниця XBC + + + Європейська розрахункова одиниця XBD + + + Східнокарибський долар + EC$ + + + Спеціальні права запозичення + + + Європейська валютна одиниця + + + Французький золотий франк + + + Французький франк UIC + + + Франк Західноафриканського фінансового товариства + + + Паладій + + + Французький тихоокеанський франк + CFPF + + + Платина + + + Фонди RINET + + + Код тестування валюти + + + Невідома грошова одиниця + невідомі грошові одиниці + невідомих грошових одиниць + невідома грошова одиниця + + + Єменський динар + + + Єменський ріал + YRl + + + Югославський твердий динар + + + Югославський новий динар + + + Югославський конвертований динар + + + Південноафриканський фінансовий ранд + + + Південноафриканський ранд + R + + + Квача (Замбія) + + + Заїрський новий заїр + + + Заїрський заїр + + + Зімбабвійський долар + Z$ + + + + + + {0} дні + {0} днів + {0} день + {0} дня + + + {0} години + {0} годин + {0} година + {0} години + + + {0} хвилини + {0} хвилин + {0} хвилина + {0} хвилини + + + {0} місяці + {0} місяців + {0} місяць + {0} місяця + + + {0} секунди + {0} секунд + {0} секунда + {0} секунди + + + {0} тижні + {0} тижнів + {0} тиждень + {0} тижня + + + {0} роки + {0} років + {0} рік + {0} року + + + + + так:т + ні:н + + + diff --git a/libs/Zend/Locale/Data/uk_UA.xml b/libs/Zend/Locale/Data/uk_UA.xml new file mode 100644 index 0000000..aa74720 --- /dev/null +++ b/libs/Zend/Locale/Data/uk_UA.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/ur.xml b/libs/Zend/Locale/Data/ur.xml new file mode 100644 index 0000000..603d9ab --- /dev/null +++ b/libs/Zend/Locale/Data/ur.xml @@ -0,0 +1,1054 @@ + + + + + + + + + + + ايفريکانز + امہاری + عربی + آسامی + آزربائیجانی + بيلاروسی + بلغاری + بِہاری + بنگالی + برِیٹن + بوسنی + کاٹالانين + چيک + ويلش + ڈينش + جرمن + يونانی + انگريزی + برطانوی انگریزی + امریکہ کی انگریزی + ايسپرانٹو + ہسپانوی + اسٹونين + باسکی + فارسی + فنّنِش + ٹيگالاگی + فیروئیز + فرانسيسی + فريژين + آئيرِش + سکاٹ گيلِک + گاليشيائی + گُارانی + گجراتی + عبرانی + ہندی + کراتی + ہنگیرین + ارمینی + انٹرلنگوی + انڈونيثيائی + برفستانی + اطالوی + جاپانی + جاوی + جارجی + کمبوڈیَن + کنّاڈا + کورين + كردش + کرغیزی + لاطينی + لِنگَلا + لاؤشِیَن + لتھُواینین + ليٹوين + مقدونيائی + مالايالم + منگؤلی + مراٹهی + مالائی + مالٹی + نيپالی + ڈچ + نورویجینی (نینورسک) + نارويجين + آکيٹانی + اورِیا + پنجابی + پولستانی + پشتو + پُرتگالی + پرتگالی (ﺑﺮﺍﺯﻳﻞ) + پرتگالی (پرتگال) + رومنی + روسی + سَنسکرِت + سندھی + سربو-کروئیشین + سنہالی + سلاواکی + سلوينی + سومالی + البانی + صربی + سیسوتھو + سُوڈانی + سويڈش + سواہیلی + تامِل + تيلوگو + تهائی + تگرینی + ترکمانی + ٹیگا لوگ + کلنگان + ترکی + توی + اُئِیگُور + يُوکرينی + اردو + ازبک + ويتنامی + خوسہ + يادش + چینی (آسان کردہ) + چینی (روایتی) + زُولُو + + + + + + + + متحدہ عرب امارات + افغانستان + انٹیگوا اور باربودا + البانیا + آر مینیا + نیدرلینڈز انٹیلیز + انگولا + انٹار ٹکا + ارجنٹینا + امریکی ساموا + آسٹریا + آسٹریلیا + آذر بائجان + بوسنیا ہرزگوینا + بنگلا دیش + بیلجئیم + برکینا فاسو + بلغاریہ + برنڈی + بینن + بولیویا + برازیل + باھا ماس + بھوٹان + جزیرہ بووٹ + بوٹسوانا + بیلا رس + کینیڈا + جزائر کوکوز + کانگو، جمہوری ریاست + جمہوریہ وسطی افریقہ + کانگو + سوئزر لینڈ + جزائر کُک + چلی + کیمرون + چین + کولمبیا + سربیا اور مانٹینیگرو + کیوبا + جزیرہ کرسمس + قبرص + جمہوریہ چیک + جرمنی + ڈنمارک + ڈومینیکن ریپبلک + الجیریا + ایکواڈور + ایسٹونیا + مصر + مغربی صحارا + اریٹیریا + سپین + ایتھوپیا + فن لینڈ + جزائر فاک لینڈ + مائکرونیزیا + جزائرفارو + فرانس + غیبون + برطانیہ + جارجیا + فرانسیسی گی آنا + گرنزی + گھانا + گرین لینڈ + گیمبیا + گنی + استوائی گنی + یونان + جنوبی جارجیا اور جزائر جنوبی سینڈوچ + گنی بسائو + جزیرہ ہرڈ اور جزائر مکڈونلڈ + ہونڈوراس + کروشیا + ہائٹی + ہنگری + انڈونیشیا + آئر لینڈ + اسرائیل + بھارت + بحرھند کا برٹش علاقہ + عراق + ایران + آئس لینڈ + اٹلی + جرسی + اردن + جاپان + کینیا + کرغستان + کمبوڈیا + کِرباتی + کوموروس + سینٹ کٹس اور نیوس + شمالی کوریا + جنوبی کوریا + جزائر کیمن + قزاقستان + لاؤس + لبنان + سینٹ لوسیا + لکٹنسٹائن + سری لنکا + لائبیریا + لیسوتھو + لتھوانیا + لٹوِیا + لیبیا + مراکش + مالدووا + مڈغاسکر + جزائر مارشل + مقدونیہ + مالی + میانمر + منگولیا + ماکاؤ + شمالی ماریاناجزائر + موریطانیہ + ملاوی + میکسیکو + ملائیشیا + موزنبیق + نمیبیا + نیو کیلیڈونیا + نائیجر + جزیرہ نارفولک + نائیجیریا + نکاراگوا + نیدرلینڈ + ناروے + نیپال + نیوزی لینڈ + عمان + پیرو + فرانسیسی پولینیسیا + پاپوا نیو گنی + فلپائن + پاکستان + پولینڈ + سینٹ پائرے اور میکویلون + فلسطین + پرتگال + پیراگوئے + رومانیہ + روس + روانڈا + سعودی عرب + جزائرسولمون + سے شلز + سوڈان + سویڈن + سینٹ ھیلینا + سلوانیہ + سلوواکیہ + سیرالیون + سان میرینو + سینیگال + صوپالیہ + سورینام + سیریا + سوازی لینڈ + جزائر کیکس اور ترکیّہ + چاڈ + جنوبی فرانسیسی علاقہ جات + ٹوگو + تھائی لینڈ + تاجکستان + ٹوکیلاؤ + مشرقی تیمور + ترکمانستان + تیونس + تونگا + ترکی + ٹرینیڈاڈ اور ٹوباگو + ٹوالو + تائیوان + تنزانیہ + یوکرائن + یوگنڈا + ریاست ہائے متحدہ اور بیرونی جزائر + ریاست ہائے متحدہ امریکا + ہوراگوئے + ازبکستان + ویٹیکن سٹی + سینٹ کیرن اور گریناڈائنز + وینزولا + جزائر ورجن، برٹش + جزائر ورجن، امریکہ + ویت نام + وانواٹو + والس اور فتونہ + ساموا + یمن + جنوبی افریقہ + زیمبیا + زمبابوے + Unknown or Invalid Region + + + کیلنڈر + موازنہ + کرنسی + + + روایتی چینی چھانٹ ترتیب-Big5 + بدھ کیلنڈر + روایتی چینی کیلنڈر + بلاواسطہ چھانٹ ترتیب + سادہ چینی چھانٹ ترتیب-GB2312 + گریگوری کیلنڈر + عبرانی کیلنڈر + ہندی کیلنڈر + اسلامی کیلنڈر + ہجری کیلنڈر + جاپانی کیلنڈر + فون نامہ چھانٹ ترتیب + پن ین چھانٹ ترتیب + سادہ چینی کیلنڈر + لکیری چھانٹ ترتیب + روایتی چھانٹ ترتیب + + + امریکی + اعشاری + + + زبان:{0} + رسم الخط:{0} + خطہ:{0} + + + + + + + [أ ؤ ا آ ب پ ت ٹ ث ج چ ح-د ڈ ذ ر ڑ ز ژ س-غ ف ق ک گ ل-ن ں و ہ ی ء ئ ے ٻ ة ٺ ټ ٽ ه ھ ي] + [ؐ ؑ ؓ ؔ َ ِ ُ ٰ ً ّ] + + + + + + + + جنوری + فروری + مار چ + اپريل + مئ + جون + جولائ + اگست + ستمبر + اکتوبر + نومبر + دسمبر + + + + + ج + ف + م + ا + م + ج + ج + ا + س + ا + ن + د + + + + + + + ا + پ + م + ب + ج + ج + ہ + + + اتوار + پير + منگل + بده + جمعرات + جمعہ + ہفتہ + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + 1سہ ماہی + 2سہ ماہی + 3سہ ماہی + 4سہ ماہی + + + پہلی سہ ماہی + دوسری سہ ماہی + تيسری سہ ماہی + چوتهی سہ ماہی + + + + + 1 + 2 + 3 + 4 + + + + قبل دوپہر + بعد دوپہر + + + قبل مسيح + عيسوی سن + + + ق م + عيسوی سن + + + + + + EEEE, d, MMMM yyyy + + + + + d, MMMM yyyy + + + + + d, MMM yyyy + + + + + d/M/yy + + + + + + + h:mm:ss a v + + + + + h:mm:ss a z + + + + + h:mm:ss a + + + + + h:mm a + + + + + + + {1} {0} + + + + HH:mm + LL + E, M-d + LLL + E MMM d + E MMMM d + MMMM d + MMM d + M-d + د + mm:ss + yyyy + yyyy-M + EEE, yyyy-d-M + yyyy MMM + EEE, yyyy MMM d + yyyy MMMM + Q yyyy + yyyy QQQ + yy Q + + + {0} – {1} + + M تا M + + + E, MM-dd تا E, MM-dd + E, MMM dd – E, MMM dd + + + LLL-LLL + + + E, MMM d – E, MMM d + E, MMM d – E, MMM d + + + LLLL-LLLL + + + MMM d تا MMM d + MMM d تا d + + + MM-dd تا MM-dd + M/d تا d + + + d-d + + + h a تا h a + h–h a + + + h:mm a تا h:mm a + h:mm تا h:mm a + h:mm تا h:mm a + + + h:mm a – h:mm a v + h:mm تا h:mm a v + h:mm تا h:mm a v + + + h a – h a v + h تا h a v + + + y تا y + + + yyyy-MM تا MM + yyyy-MM تا yyyy-MM + + + E, yyyy-MM-dd – E, yyyy-MM-dd + E, yyyy-MM-dd تا E, yyyy-MM-dd + E, yyyy-MM-dd – E, yyyy-MM-dd + + + MMM–MMM yyyy + MMM–MMM yyyy + + + E, MMM d – E, MMM d, yyyy + E, MMM d – E, MMM d, yyyy + E, MMM d, yyyy تا E, MMM d, yyyy + + + yyyy-MM تا MM + yyyy-MM تا yyyy-MM + + + MMM d تا MMM d, yyyy + MMM d–d, yyyy + MMM d, yyyy تا MMM d, yyyy + + + yyyy-MM-dd تا MM-dd + yyyy-MM-dd تا dd + MM-dd-yyyy تا MM-dd-yyyy + + + + + + دور + + + سال + + + مہینہ + + + ہفتہ + + + دن + آج + کل + پرسوں + ترسوں + کل + پرسوں + ترسوں + + + ہفتے کا دن + + + رات/صبح + + + گھنٹہ + + + منٹ + + + سیکنڈ + + + زون + + + + + + + + محرم + صفر + ر بيع الاول + ر بيع الثانی + جمادی الاول + جمادی الثانی + رجب + شعبان + رمضان + شوال + + + + + + + پہلی سہ ماہی + دوسری سہ ماہی + تيسری سہ ماہی + چوتهی سہ ماہی + + + + + + عيسوی سن + + + ق م + CE + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + Unknown + + + انڈورا + + + انگویلا + + + اروبا + + + بار باڈوس + + + بحرین + + + برمودہ + + + برونائی + + + بیلیز + + + کوسٹا ریکا + + + کیپ ورڈ + + + جبوتی + + + ڈومینیکا + + + فجی + + + غرناطہ + + + جبرالٹر + + + گواڈیلوپ + + + گوئٹے مالا + + + گوام + + + گیانا + + + ہانگ کانگ + + + جمائیکا + + + کویت + + + لیگزمبرگ + + + موناکو + + + مکائو + + + مارٹنیک + + + مونٹ سراٹ + + + مالٹا + + + ماریشس + + + مالدیپ + + + نورو + + + نیوئے + + + پانامہ + + + پٹ کیرن + + + پورٹو ریکو + + + پالائو + + + قطر + + + ری یونین + + + سنگاپور + + + ایلسلواڈور + + + مایوٹ + + + + + + . + , + ; + % + 0 + # + + + - + ق + + + یہ عدد نہیں + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + ¤#,##0.00 + + + ‏{0} {1} ‏ + + + + متحدہ عرب اماراتی درہم + + + ارجنٹائن پیسہ + + + آسٹریلین ڈالر + + + بلغارین لیو + + + بولیوین بولیویانو + + + برازیلی ریئل + + + کنیڈین ڈالر + + + سوئس فرانکس + + + چلّین پیسہ + + + یوآن رینمنبی + + + کولمبین پیسہ + + + چیک کرونا + + + ڈچ مارکس + + + ڈنمارک کرونر + + + ایسٹونین کرون + + + مصری پائونڈ + + + یورو + + + فرانسیسی فرانک + + + انگلستانی پاونڈ سٹرلنگ + + + ھانگ کانگ ڈالر + + + کروشین کونا + + + ہنگرین فورنٹ + + + انڈونیشین روپیہ + + + اسرائیلی شیکل + + + انڈین روپیہ + + + جاپانی ین + + + جنوبی کوریائی جیتا۔ + + + لیتھوانی لیٹاس + + + مراکشی درہم + + + میکسیکی پیسہ + + + ملائیشین رنگٹ + + + ناروے کرونر + + + نیوزی لینڈ ڈالر + + + پیروین نیووسول + + + فلپائینی پیسہ + + + پاکستانی روپیہ + روپے + + + پولش نیو زلوٹی + + + نیا رومانیائی لیو + + + سربین دینار + + + روسی روبل + + + سعودی ریال + + + سویڈن کرونر + + + سنگا پور ڈالر + + + سلوانین ٹولر + + + سلووک کرونا + + + تھائی باہت + + + ترکی لیرا + + + نیا ترکی لیرا + + + نیو تائیوان ڈالر + + + امریکی ڈالر + ڈالر + + + وینزویلا بولیور + + + جنوبی افریقی رانڈ + + + + + + yes:y + no:n + + + diff --git a/libs/Zend/Locale/Data/ur_IN.xml b/libs/Zend/Locale/Data/ur_IN.xml new file mode 100644 index 0000000..882816e --- /dev/null +++ b/libs/Zend/Locale/Data/ur_IN.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + #,##,##0.### + + + + + + + #,##,##0% + + + + + + + ¤ #,##,##0.00 + + + + + + diff --git a/libs/Zend/Locale/Data/ur_PK.xml b/libs/Zend/Locale/Data/ur_PK.xml new file mode 100644 index 0000000..57d3adc --- /dev/null +++ b/libs/Zend/Locale/Data/ur_PK.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/uz.xml b/libs/Zend/Locale/Data/uz.xml new file mode 100644 index 0000000..efa2e3e --- /dev/null +++ b/libs/Zend/Locale/Data/uz.xml @@ -0,0 +1,264 @@ + + + + + + + + + + + Арабча + Олмонча + Инглизча + Испанча + Французча + Ҳиндча + Италянча + Японча + Португалча + Русча + Ўзбек + Хитойча + + + + + + + + Афғонистон + Бразилия + Хитой + Олмония + Франция + Бирлашган Қироллик + Ҳиндистон + Италия + Япония + Россия + Қўшма Штатлар + Ўзбекистон + + + + [а-г ғ д е ё ж-к қ л-у ў ф х ҳ ч ш ъ э-я] + [ц щ ы ь] + + + + + + + + Янв + Фев + Мар + Апр + Май + Июн + Июл + Авг + Сен + Окт + Ноя + Дек + + + Муҳаррам + Сафар + Рабиул-аввал + Рабиул-охир + Жумодиул-уло + Жумодиул-ухро + Ражаб + Шаъбон + Рамазон + Шаввол + Зил-қаъда + Зил-ҳижжа + + + + + Я + Ф + М + А + М + И + И + А + С + О + Н + Д + + + + + + + Якш + Душ + Сеш + Чор + Пай + Жум + Шан + + + якшанба + душанба + сешанба + чоршанба + пайшанба + жума + шанба + + + + + Я + Д + С + Ч + П + Ж + Ш + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + AM + PM + + + BCE + CE + + + + + + EEEE, yyyy MMMM dd + + + + + yyyy MMMM d + + + + + yyyy MMM d + + + + + yy/MM/dd + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1} {0} + + + + Q yy + yyyy/M + MMMM yyyy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + کابل + + + + افغانستان وقتی + + + + + + + , +   + + + + Бразил реали + + + Хитой юани + + + Евро + + + Инглиз фунт стерлинги + + + Ҳинд рупияси + + + Япон йенаси + + + Рус рубли + + + АҚШ доллари + + + Ўзбекистон сўм + сўм + + + + diff --git a/libs/Zend/Locale/Data/uz_AF.xml b/libs/Zend/Locale/Data/uz_AF.xml new file mode 100644 index 0000000..d320916 --- /dev/null +++ b/libs/Zend/Locale/Data/uz_AF.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/uz_Arab.xml b/libs/Zend/Locale/Data/uz_Arab.xml new file mode 100644 index 0000000..7b54a28 --- /dev/null +++ b/libs/Zend/Locale/Data/uz_Arab.xml @@ -0,0 +1,166 @@ + + + + + + + + + + + + Afgʿoniston + Braziliya + Xitoy + Olmoniya + Fransiya + Birlashgan Qirollik + Hindiston + Italiya + Yaponiya + Rossiya + Qo'shma Shtatlar + Oʿzbekiston + + + + [a-v x-z ʿ] + + + + + + + + Yanv + Fev + Mar + Apr + May + Iyun + Iyul + Avg + Sen + Okt + Noya + Dek + + + Muharram + Safar + Rabiul-avval + Rabiul-oxir + Jumodiul-ulo + Jumodiul-uxro + Rajab + Shaʿbon + Ramazon + Shavvol + Zil-qaʿda + Zil-hijja + + + + + Y + F + M + A + M + I + I + A + S + O + N + D + + + Yanvar + + + + + + + Yaksh + Dush + Sesh + Chor + Pay + Jum + Shan + + + yakshanba + dushanba + seshanba + chorshanba + payshanba + juma + shanba + + + + + Y + D + S + C + P + J + S + + + + + + + + + + Brazil reali + + + Xitoy yuani + + + Evro + + + Ingliz funt sterlingi + + + Hind rupiyasi + + + Yapon yenasi + + + Rus rubli + + + AQSH dollari + + + Oʿzbekiston soʿm + soʿm + + + + diff --git a/libs/Zend/Locale/Data/uz_Latn_UZ.xml b/libs/Zend/Locale/Data/uz_Latn_UZ.xml new file mode 100644 index 0000000..8b62359 --- /dev/null +++ b/libs/Zend/Locale/Data/uz_Latn_UZ.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + + Thế giới + Châu Phi + Bắc Mỹ + Nam Mỹ + Châu Đại Dương + Tây Phi + Trung Mỹ + Đông Phí + Bắc Phi + Trung Phi + Miền Nam Châu Phi + Châu Mỹ + Miền Bắc Châu Mỹ + Ca-ri-bê + Đông Á + Nam Á + Đông Nam Á + Nam Âu + Úc và New Zealand + Melanesia + Vùng Micronesian + Polynesia + Trung Nam Á + Châu Á + Trung Á + Tây Á + Âu Châu + Đông Âu + Miền Bắc Châu Âu + Tây Âu + Châu Mỹ La-tinh và Ca-ri-be + Andorra + Các Tiểu Vương quốc A-rập Thống nhất + Áp-ga-ni-xtan + An-ti-gu-a và Ba-bu-đa + An-ba-ni + Ác-mê-ni-a + Tây Ấn Hà Lan + Ăng-gô-la + Nam Cực + Ác-hen-ti-na + Đảo Somoa thuộc Mỹ + Áo + Úc + Quần đảo Aland + Ai-déc-bai-gian + Bô-xni-a Héc-xê-gô-vi-na + Bác-ba-đốt + Băng-la-đét + Bỉ + Buốc-ki-na Pha-xô + Bun-ga-ri + Ba-ren + Bu-run-đi + Bê-nanh + BL + Bru-nây + Bô-li-vi-a + Bra-xin + Ba-ha-ma + Bu-tan (Bhutan) + Đảo Bouvet (Na Uy) + Bốt-xoa-na + Bê-la-rút + Bê-li-xê + Ca-na-đa + Quần đảo Cocos + Cộng hoà dân chủ Côngô + Cộng hòa Trung Phi + Công-gô + Thụy Sĩ + Bờ Biển Ngà + Quần Đảo Cook + Chi-lê + Ca-mơ-run + Trung Quốc + Cô-lôm-bi-a + Cốt-xta Ri-ca + Séc-bia + Cu Ba + Cáp-ve + Đảo Giáng Sinh + Síp + Cộng hòa Séc + Đức + Gi-bu-ti + Đan Mạch + Cộng hoà Đô-mi-ni-ca + An-giê-ri + Ê-cu-a-đo + E-xtô-ni-a + Ai Cập + Tây Sahara + Ê-ri-tơ-rê-a + Tây Ban Nha + Ê-ti-ô-pi-a + Phần Lan + Phi-gi + Quần Đảo Falkland + Mi-crô-nê-xi-a + Quần Đảo Faroe + Pháp + Ga-bông + Vương quốc Anh + Grê-na-đa + Gru-di-a + Quiana thuộc Pháp + Guernsey + Gha-na + Băng Đảo + Găm-bi-a + Ghi-nê + Ghi-nê Xích-đạo + Hy Lạp + Quần đảo Nam Georgia và Nam Sandwich + Goa-tê-ma-la + Đảo Gu-am + Ghi-nê Bít-xao + Guy-a-na + Hồng Kông + Đảo Heard và Quần đảo McDonald + Hôn-đu-rát + Crô-a-ti-a + Ha-i-ti + Hung-ga-ri + Nam Dương + Ai-len + I-xra-en + Đảo Man + Ấn Độ + Thuộc địa Anh tại Ấn Độ Dương + I-rắc + I-ran + Ai-xơ-len + Ý + Jersey + Ha-mai-ca + Gióc-đa-ni + Nhật Bản + Kê-ni-a + Cư-rơ-gư-xtan + Campuchia + Ki-ri-ba-ti + Cô-mô + Xan-kít và Nê-vi + Bắc Triều Tiên + Hàn Quốc + Cô-oét + Quần Đảo Cayman + Ka-dắc-xtan + Lào + Li-băng + Xan Lu-xi + Lich-ten-xtên + Xri Lan-ca + Li-bê-ri-a + Lê-xô-thô + Li-tu-a-ni-a + Lúc-xăm-bua + Lát-vi-a + Li-bi + Ma-rốc + Mô-na-cô + Môn-đô-va + Montenegro + MF + Ma-đa-gát-xca + Quần đảo Mác-san + Ma-xê-đô-ni-a + Ma-li + Mi-an-ma + Mông Cổ + Macao + Quần Đảo Bắc Mariana + MQ + Mô-ri-ta-ni + Man-ta + Mô-ri-xơ + Man-đi-vơ + Ma-la-uy + Mê-hi-cô + Ma-lay-xi-a + Mô-dăm-bích + Nam-mi-bi-a + New Caledonia + Ni-giê + Đảo Norfolk + Ni-giê-ri-a + Ni-ca-ra-goa + Hà Lan + Na Uy + Nê-pan + Niu Di-lân + Ô-man + Pa-na-ma + Pê-ru + Polynesia thuộc Pháp + Pa-pu-a Niu Ghi-nê + Phi-lip-pin + Pa-ki-xtan + Ba Lan + Saint Pierre và Miquelon + Lãnh thổ Palestine + Bồ Đào Nha + Pa-ra-goay + Ca-ta + Vùng xa xôi thuộc Châu Đại Dương + Liên Minh Châu Âu + RE + Ru-ma-ni + Xéc-bi + Nga + Ru-an-đa + A-rập Xê-út + Quần đảo Xô-lô-mông + Xây-sen + Xu-đăng + Thụy Điển + Xin-ga-po + Saint Helena + Xlô-ven-ni-a + Svalbard và Jan Mayen + Xlô-va-ki-a + Xi-ê-ra Lê-ôn + Xan Ma-ri-nô + Xê-nê-gan + Xô-ma-li + Xu-ri-nam + Xao Tô-mê và Prin-xi-pê + En-san-va-đo + Xi-ri + Xoa-di-len + Quần Đảo Turk và Caicos + Sát + Thuộc Địa Nam của Pháp + Tô-gô + Thái Lan + Tát-gi-ki-xtan + Tokelau + Đông Ti-mo + Tuốc-mê-ni-xtan + Tuy-ni-di + Tông-ga + Thổ Nhĩ Kỳ + Tri-ni-đát và Tô-ba-gô + Tu-va-lu + Đài Loan + Tan-da-ni-a + U-crai-na + U-gan-đa + Các đảo nhỏ xa trung tâm thuộc Mỹ + Hoa Kỳ + U-ru-goay + U-dơ-bê-ki-xtan + Va-ti-căng + Xan Vin-xen và Grê-na-din + Vê-nê-zu-ê-la + Đảo Virgin, thuộc Anh + Quần đảo Virgin, Mỹ + Việt Nam + Va-nu-a-tu + Wallis và Futuna + Xa-moa + Y-ê-men + YT + Nam Phi + Dăm-bi-a + Dim-ba-bu-ê + Vùng Chưa biết hoặc không Hợp lệ + + + gregorian + + + Ngôn ngữ: {0} + Chữ viết: {0} + Vùng: {0} + + + + [a à ả ã á ạ ă ằ ẳ ẵ ắ ặ â ầ ẩ ẫ ấ ậ b-d đ e è ẻ ẽ é ẹ ê ề ể ễ ế ệ f-i ì ỉ ĩ í ị j-o ò ỏ õ ó ọ ô ồ ổ ỗ ố ộ ơ ờ ở ỡ ớ ợ p-u ù ủ ũ ú ụ ư ừ ử ữ ứ ự v-y ỳ ỷ ỹ ý ỵ z] + [f j w z] + [a-d đ e-z] + + + + + + + + + + + + + + thg 1 + thg 2 + thg 3 + thg 4 + thg 5 + thg 6 + thg 7 + thg 8 + thg 9 + thg 10 + thg 11 + thg 12 + + + tháng một + tháng hai + tháng ba + tháng tư + tháng năm + tháng sáu + tháng bảy + tháng tám + tháng chín + tháng mười + tháng mười một + tháng mười hai + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + CN + Th 2 + Th 3 + Th 4 + Th 5 + Th 6 + Th 7 + + + Chủ nhật + Thứ hai + Thứ ba + Thứ tư + Thứ năm + Thứ sáu + Thứ bảy + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + SA + CH + + + tr. CN + sau CN + + + + + + EEEE, 'ngày' dd MMMM 'năm' yyyy + + + + + 'Ngày' dd 'tháng' M 'năm' yyyy + + + + + dd-MM-yyyy + + + + + dd/MM/yyyy + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {0} {1} + + + + H + HH:mm + HH:mm:ss + E, d-M + E d MMM + E d MMMM + d MMMM + d MMM + dd-MM + d-M + mm:ss + EEE, d-M-yyyy + MMM yyyy + EEE, d MMM yyyy + MMMM yyyy + Q yyyy + QQQ yyyy + Q yy + yyyy + MM-yyyy + + + {0} - {1} + + 'Tháng' M - 'Tháng' M + + + EEEE, dd/MM - EEEE, dd/MM + EEEE, dd/MM - EEEE, dd/MM + + + MMM-MMM + + + EEEE, 'ngày' dd 'tháng' M - EEEE, 'ngày' dd 'tháng' M + EEEE, 'ngày' dd - EEEE, 'ngày' dd 'tháng' M + + + 'Ngày' dd 'tháng' M - 'Ngày' dd 'tháng' M + 'Ngày' dd 'tháng' M - 'Ngày' dd 'tháng' M + + + dd/MM - dd/MM + dd/MM - dd/MM + + + 'Ngày' d-d + + + HH'h' - HH'h' + HH'h' - HH'h' + + + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH'h'-HH'h' v + HH'h'-HH'h' v + + + y-y + + + MM/yyyy - MM/yyyy + MM/yyyy - MM/yyyy + + + EEEE, dd/MM/yyyy - EEEE, dd/MM/yyyy + EEEE, dd/MM/yyyy - EEEE, dd/MM/yyyy + EEEE, dd/MM/yyyy - EEEE, dd/MM/yyyy + + + 'Tháng' M - 'Tháng' M 'năm' yyyy + 'Tháng' M 'năm' yyyy - 'Tháng' M 'năm' yyyy + + + EEEE, 'ngày' dd MMM - EEEE, 'ngày' dd MMM 'năm' yyyy + EEEE, 'ngày' dd MMM - EEEE, 'ngày' dd MMM 'năm' yyyy + EEEE, 'ngày' dd MMM 'năm' yyyy - EEEE, 'ngày' dd MMM 'năm' yyyy + + + 'Ngày' dd 'tháng' M - 'Ngày' dd 'tháng' M 'năm' yyyy + 'Ngày' dd 'tháng' M - 'Ngày' dd 'tháng' M 'năm' yyyy + 'Ngày' dd 'tháng' M 'năm' yyyy - 'Ngày' dd 'tháng' M 'năm' yyyy + + + dd/MM/yyyy - dd/MM/yyyy + dd/MM/yyyy - dd/MM/yyyy + dd/MM/yyyy - dd/MM/yyyy + + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + {1} ({0}) + + Không rõ + + + Andorra Time + + + Dumont D'Urville + + + Barbados Time + + + Bahrain Time + + + Belize Time + + + Costa Rica Time + + + Cape Verde Time + + + Djibouti Time + + + Dominica Time + + + Quần Đảo Canary + + + Fiji Time + + + Grenada Time + + + South Georgia and the South Sandwich Islands Time + + + Guatemala Time + + + Guyana Time + + + Hong Kong SAR China Time + + + Jamaica Time + + + Saint Kitts and Nevis Time + + + Kuwait Time + + + Laos Time + + + Saint Lucia Time + + + Luxembourg Time + + + Monaco Time + + + Malta Time + + + Mauritius Time + + + Maldives Time + + + Nauru Time + + + Panama Time + + + Palau Time + + + Qatar Time + + + Singapore Time + + + El Salvador Time + + + Taiwan Time + + + Saint Vincent and the Grenadines Time + + + U.S. Virgin Islands Time + + + Giờ Việt Nam + + + + + + , + . + ; + % + 0 + # + + + - + E + + + NaN + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + #,##0.00 ¤ + + + {0} {1} + + + + Điram UAE + + + Lép Bungari + + + BRL + + + Franc Thụy sĩ + + + CNY + + + Crun Extônia + + + Euro + + + Đô-la Fi-ji + + + Franc Pháp + + + Bảng Anh + + + Lari Georgia + + + Cedi Ghana (1979-2007) + + + Cedi Ghana + + + Pao Gibraltar + + + Franc Guinea + + + Syli Guinea + + + Drachma Hy Lạp + + + Quetzal Guatemala + + + Peso Guinea-Bissau + + + Đô-la Guyana + + + Đô-la Hồng Kông + + + Honduras Lempira + + + Gourde Haiti + + + Phôrin Hungari + + + Rupia Inđônêxia + + + Pao Ai-len + + + Pao Ixraen + + + Sêken Ixraen + + + Rupi Ấn Độ + 0≤Rs.|1≤Re.|1<Rs. + + + Dinar I-rắc + + + Rial I-ran + + + Lia Ý + + + Đô la Jamaica + + + Dinar Jordan + + + Yên Nhật + + + Si-ling Kê-ny-a + + + Won Hàn Quốc + + + Kazakhstan Tenge + + + Litat Lituani + + + Điaham Marốc + + + Lia xứ Man-tơ + + + Peso Mêhicô + + + Rinhgit Malaixia + + + Curon Na Uy + + + Đô-la New Zealand + + + Nuevo Sol Pêru + + + Peso Philíppin + + + Rupi Pakistan + + + Zloty Ba Lan + + + Lây Rumani + + + Đina Xéc-bi + + + Rúp Nga + + + Rian Ả rập Xêút + + + Cua-ron Thuỵ Điển + + + Đô-la Singapore + + + Tôla Xlôvênia + + + Cuaron Xlôvác + + + Bạt Thái Lan + + + Lia Thổ Nhĩ Kỳ + + + Lia Thổ Nhĩ Kỳ Mới + + + Đô-la Đài Loan + + + Rúp U-crai-na + + + Đô-la Mỹ + + + Bôliva Vênêduêla + + + đồng + + + + Vàng + + + Tiền tệ chưa biết hoặc không hợp lệ + + + Ran Nam Phi + + + + + + {0} ngày + + + {0} giờ + + + {0} phút + + + {0} tháng + + + {0} giây + + + {0} tuần + + + {0} năm + + + + + yes:y + no:n + + + diff --git a/libs/Zend/Locale/Data/vi_VN.xml b/libs/Zend/Locale/Data/vi_VN.xml new file mode 100644 index 0000000..fca79af --- /dev/null +++ b/libs/Zend/Locale/Data/vi_VN.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/wal.xml b/libs/Zend/Locale/Data/wal.xml new file mode 100644 index 0000000..aca2e4b --- /dev/null +++ b/libs/Zend/Locale/Data/wal.xml @@ -0,0 +1,380 @@ + + + + + + + + + + + ዐርቢኛ + ጀርመን + እንግሊዝኛ + ስፓኒሽ + ፈረንሳይኛ + ሐንድኛ + ጣሊያንኛ + ጃፓንኛ + ፖርቱጋሊኛ + ራሽኛ + ወላይታቱ + ቻይንኛ + + + + + + አንዶራ + የተባበሩት አረብ ኤምሬትስ + አልባኒያ + አርሜኒያ + ኔዘርላንድስ አንቲልስ + አርጀንቲና + ኦስትሪያ + አውስትሬሊያ + አዘርባጃን + ቦስኒያ እና ሄርዞጎቪኒያ + ባርቤዶስ + ቤልጄም + ቡልጌሪያ + ባህሬን + ቤርሙዳ + ቦሊቪያ + ብራዚል + ቡህታን + ቤላሩስ + ቤሊዘ + ኮንጎ + የመካከለኛው አፍሪካ ሪፐብሊክ + ስዊዘርላንድ + ቺሊ + ካሜሩን + ቻይና + ኮሎምቢያ + ሰርቢያ + ኬፕ ቬርዴ + ሳይፕረስ + ቼክ ሪፑብሊክ + ጀርመን + ዴንማርክ + ዶሚኒካ + ዶሚኒክ ሪፑብሊክ + አልጄሪያ + ኢኳዶር + ኤስቶኒያ + ግብጽ + ምዕራባዊ ሳህራ + ኤርትራ + ስፔን + ኢትዮጵያ + ፊንላንድ + ፊጂ + ሚክሮኔዢያ + ፈረንሳይ + እንግሊዝ + ጆርጂያ + የፈረንሳይ ጉዊአና + ጋምቢያ + ጊኒ + ኢኳቶሪያል ጊኒ + ግሪክ + ቢሳዎ + ጉያና + ሆንግ ኮንግ + ክሮኤሽያ + ሀይቲ + ሀንጋሪ + ኢንዶኔዢያ + አየርላንድ + እስራኤል + ህንድ + ኢራቅ + አይስላንድ + ጣሊያን + ጃማይካ + ጆርዳን + ጃፓን + ካምቦዲያ + ኮሞሮስ + ደቡብ ኮሪያ + ሰሜን ኮሪያ + ክዌት + ሊባኖስ + ሊቱዌኒያ + ላትቪያ + ሊቢያ + ሞሮኮ + ሞልዶቫ + ማከዶኒያ + ሞንጎሊያ + ማካዎ + ሞሪቴኒያ + ማልታ + ማሩሸስ + ሜክሲኮ + ማሌዢያ + ናሚቢያ + ኒው ካሌዶኒያ + ናይጄሪያ + ኔዘርላንድ + ኖርዌ + ኔፓል + ኒው ዚላንድ + ፔሩ + የፈረንሳይ ፖሊኔዢያ + ፓፑዋ ኒው ጊኒ + ፖላንድ + ፖርታ ሪኮ + ሮሜኒያ + ራሺያ + ሳውድአረቢያ + ሱዳን + ስዊድን + ሲንጋፖር + ስሎቬኒያ + ስሎቫኪያ + ሴኔጋል + ሱማሌ + ሲሪያ + ቻድ + የፈረንሳይ ደቡባዊ ግዛቶች + ታይላንድ + ታጃኪስታን + ምስራቅ ቲሞር + ቱኒዚያ + ቱርክ + ትሪኒዳድ እና ቶባጎ + ታንዛኒያ + ዩጋንዳ + አሜሪካ + ዩዝበኪስታን + ቬንዙዌላ + የእንግሊዝ ድንግል ደሴቶች + የአሜሪካ ቨርጂን ደሴቶች + የመን + ደቡብ አፍሪካ + ዛምቢያ + + + + [፟ ᎐-᎙ ሀ-ሏ ⶀ ሐ-ሟ ᎀ-ᎃ ⶁ ሠ-ሯ ⶂ ሰ-ሷ ⶃ ሸ-ሿ ⶄ ቀ-ቈ ቊ-ቍ ቐ-ቖ ቘ ቚ-ቝ በ-ቧ ᎄ-ᎇ ⶅ ቨ-ቷ ⶆ ቸ-ቿ ⶇ ኀ-ኈ ኊ-ኍ ነ-ኗ ⶈ ኘ-ኟ ⶉ አ-ኧ ⶊ ከ-ኰ ኲ-ኵ ኸ-ኾ ዀ ዂ-ዅ ወ-ዖ ዘ-ዟ ⶋ ዠ-ዷ ⶌ ዸ-ዿ ⶍ ጀ-ጇ ⶎ ገ-ጐ ጒ-ጕ ጘ-ጟ ⶓ-ⶖ ጠ-ጧ ⶏ ጨ-ጯ ⶐ ጰ-ጷ ⶑ ጸ-ፏ ᎈ-ᎋ ፐ-ፗ ᎌ-ᎏ ⶒ ፘ-ፚ ⶠ-ⶦ ⶨ-ⶮ ⶰ-ⶶ ⶸ-ⶾ ⷀ-ⷆ ⷈ-ⷎ ⷐ-ⷖ ⷘ-ⷞ] + + + + + + + + ጃንዩ + ፌብሩ + ማርች + ኤፕረ + ሜይ + ጁን + ጁላይ + ኦገስ + ሴፕቴ + ኦክተ + ኖቬም + ዲሴም + + + ጃንዩወሪ + ፌብሩወሪ + ማርች + ኤፕረል + ሜይ + ጁን + ጁላይ + ኦገስት + ሴፕቴምበር + ኦክተውበር + ኖቬምበር + ዲሴምበር + + + + + + + + + + + + + + + + + + + + + + + ወጋ + ሳይኖ + ማቆሳ + አሩዋ + ሃሙሳ + አርባ + ቄራ + + + ወጋ + ሳይኖ + ማቆሳኛ + አሩዋ + ሃሙሳ + አርባ + ቄራ + + + + + + + + + + + + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + ማለዶ + ቃማ + + + አዳ ዎዴ + ግሮተታ ላይታ + + + + + + EEEE፥ dd MMMM ጋላሳ yyyy G + + + + + dd MMMM yyyy + + + + + dd-MMM-yyyy + + + + + dd/MM/yy + + + + + + + h:mm:ss a v + + + + + h:mm:ss a z + + + + + h:mm:ss a + + + + + h:mm a + + + + + + + {1} {0} + + + + dd MMMM + dd/MM + MM/yy + Q yy + MMMM yyyy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + + + + + + ¤#,##0.00 + + + + + + የብራዚል ሪል + + + የቻይና ዩአን ረንሚንቢ + Y + + + የኢትዮጵያ ብር + $ + + + አውሮ + + + የእንግሊዝ ፓውንድ ስተርሊንግ + + + የሕንድ ሩፒ + + + የጃፓን የን + + + የራሻ ሩብል + + + የአሜሪካን ዶላር + + + + diff --git a/libs/Zend/Locale/Data/wal_ET.xml b/libs/Zend/Locale/Data/wal_ET.xml new file mode 100644 index 0000000..40941f7 --- /dev/null +++ b/libs/Zend/Locale/Data/wal_ET.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/wo.xml b/libs/Zend/Locale/Data/wo.xml new file mode 100644 index 0000000..a6bef20 --- /dev/null +++ b/libs/Zend/Locale/Data/wo.xml @@ -0,0 +1,200 @@ + + + + + + + + + + + Danwaa + Almaa + Angale + Españool + Finlaande + Fraañse + Itaaliee + Jappone + Olaande + Norweejiee + Portugees + Suweedwaa + + + + [a à b-e é ë f g i-n ñ ŋ o ó p-u w-y] + [ã h v z] + [a-z] + + + + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + AM + PM + + + BCE + CE + + + + + + EEEE, yyyy MMMM dd + + + + + yyyy MMMM d + + + + + yyyy MMM d + + + + + yy/MM/dd + + + + + + + HH:mm:ss v + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1} {0} + + + + Q yy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + diff --git a/libs/Zend/Locale/Data/wo_Latn.xml b/libs/Zend/Locale/Data/wo_Latn.xml new file mode 100644 index 0000000..7abe236 --- /dev/null +++ b/libs/Zend/Locale/Data/wo_Latn.xml @@ -0,0 +1,10 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 世界 + 非洲 + 北美洲 + 南美洲 + 大洋洲 + 西非 + 中美洲 + 东非 + 北非 + 中非 + 南部非洲 + 美洲 + 美洲北部 + 加勒比海 + 东亚 + 南亚 + 东南亚 + 南欧 + 澳大利亚和新西兰 + 美拉尼西亚 + 密克罗尼西亚 + 玻利尼西亚 + 中南亚 + 亚洲 + 中亚 + 西亚 + 欧洲 + 东欧 + 北欧 + 西欧 + 独联体 + 拉丁美洲和加勒比海 + 海峡群岛 + 安道尔 + 阿拉伯联合酋长国 + 阿富汗 + 安提瓜和巴布达 + 安圭拉 + 阿尔巴尼亚 + 亚美尼亚 + 荷属安的列斯群岛 + 安哥拉 + 南极洲 + 阿根廷 + 美属萨摩亚 + 奥地利 + 澳大利亚 + 阿鲁巴 + 奥兰群岛 + 阿塞拜疆 + 波斯尼亚和黑塞哥维那 + 巴巴多斯 + 孟加拉国 + 比利时 + 布基纳法索 + 保加利亚 + 巴林 + 布隆迪 + 贝宁 + 圣巴泰勒米 + 百慕大 + 文莱 + 玻利维亚 + 巴西 + 巴哈马 + 不丹 + 布维特岛 + 博茨瓦纳 + 白俄罗斯 + 伯利兹 + 加拿大 + 科科斯群岛 + 刚果(金) + 中非共和国 + 刚果(布) + 瑞士 + 象牙海岸 + 库克群岛 + 智利 + 喀麦隆 + 中国 + 哥伦比亚 + 哥斯达黎加 + 塞尔维亚和黑山 + 古巴 + 佛得角 + 圣诞岛 + 塞浦路斯 + 捷克共和国 + 德国 + 吉布提 + 丹麦 + 多米尼加 + 多米尼加共和国 + 阿尔及利亚 + 厄瓜多尔 + 爱沙尼亚 + 埃及 + 西撒哈拉 + 厄立特里亚 + 西班牙 + 埃塞俄比亚 + 芬兰 + 斐济 + 福克兰群岛 + 密克罗尼西亚联邦 + 法罗群岛 + 法国 + 加蓬 + 英国 + 格林纳达 + 格鲁吉亚 + 法属圭亚那 + 格恩西岛 + 加纳 + 直布罗陀 + 格陵兰 + 冈比亚 + 几内亚 + 瓜德罗普岛 + 赤道几内亚 + 希腊 + 南佐治亚和南三明治群岛 + 危地马拉 + 关岛 + 几内亚比绍 + 圭亚那 + 香港 + 赫德与麦克唐纳群岛 + 洪都拉斯 + 克罗地亚 + 海地 + 匈牙利 + 印度尼西亚 + 爱尔兰 + 以色列 + 曼岛 + 印度 + 英属印度洋领地 + 伊拉克 + 伊朗 + 冰岛 + 意大利 + 泽西岛 + 牙买加 + 约旦 + 日本 + 肯尼亚 + 吉尔吉斯斯坦 + 柬埔寨 + 基里巴斯 + 科摩罗 + 圣基茨和尼维斯 + 北朝鲜 + 韩国 + 科威特 + 开曼群岛 + 哈萨克斯坦 + 老挝人民民主共和国 + 黎巴嫩 + 圣卢西亚 + 列支敦士登 + 斯里兰卡 + 利比里亚 + 莱索托 + 立陶宛 + 卢森堡 + 拉脱维亚 + 利比亚 + 摩洛哥 + 摩纳哥 + 摩尔多瓦 + 黑山共和国 + 圣马丁 + 马达加斯加 + 马绍尔群岛 + 马其顿 + 马里 + 缅甸 + 蒙古 + 澳门 + 北马里亚纳群岛 + 马提尼克群岛 + 毛里塔尼亚 + 蒙塞拉特群岛 + 马耳他 + 毛里求斯 + 马尔代夫 + 马拉维 + 墨西哥 + 马来西亚 + 莫桑比克 + 纳米比亚 + 新喀里多尼亚 + 尼日尔 + 诺福克岛 + 尼日利亚 + 尼加拉瓜 + 荷兰 + 挪威 + 尼泊尔 + 瑙鲁 + 纽埃 + 新西兰 + 阿曼 + 巴拿马 + 秘鲁 + 法属波利尼西亚 + 巴布亚新几内亚 + 菲律宾 + 巴基斯坦 + 波兰 + 圣皮埃尔和密克隆 + 皮特凯恩 + 波多黎各 + 巴勒斯坦领土 + 葡萄牙 + 帕劳 + 巴拉圭 + 卡塔尔 + 大洋洲边远群岛 + 欧盟 + 留尼汪 + 罗马尼亚 + 塞尔维亚 + 俄罗斯 + 卢旺达 + 沙特阿拉伯 + 所罗门群岛 + 塞舌尔群岛 + 苏丹 + 瑞典 + 新加坡 + 圣赫勒拿 + 斯洛文尼亚 + 斯瓦尔巴特和扬马延 + 斯洛伐克 + 塞拉利昂 + 圣马力诺 + 塞内加尔 + 索马里 + 苏里南 + 圣多美和普林西比 + 萨尔瓦多 + 叙利亚 + 斯威士兰 + 特克斯和凯科斯群岛 + 乍得 + 法属南部领土 + 多哥 + 泰国 + 塔吉克斯坦 + 托克劳 + 东帝汶 + 土库曼斯坦 + 突尼斯 + 汤加 + 土耳其 + 特立尼达和多巴哥 + 图瓦卢 + 台湾 + 坦桑尼亚 + 乌克兰 + 乌干达 + 美国边远小岛 + 美国 + 乌拉圭 + 乌兹别克斯坦 + 梵蒂冈 + 圣文森特和格林纳丁斯 + 委内瑞拉 + 英属维京群岛 + 美属维京群岛 + 越南 + 瓦努阿图 + 瓦利斯和富图纳 + 萨摩亚 + 也门 + 马约特 + 南非 + 赞比亚 + 津巴布韦 + 未知或无效地区 + + + 传统德语拼字学 + 1996 年的德语拼字学 + 东亚美尼亚语 + 西亚美尼亚语 + 国际音标 + 多音 + 已修订的拼字学 + 萨霍 + + + 日历 + 对照 + 货币 + + + 繁体中文(Big5) + 佛教日历 + 农历 + 顺序 + 简体中文(GB2312) + 公历 + 希伯来日历 + 印度国家日历 + 伊斯兰日历 + 伊斯兰希吉来历 + 日本日历 + 电话簿顺序 + 拼音顺序 + 中华民国日历 + 笔划顺序 + 传统历法 + + + 美制 + 公制 + + + 语言:{0} + 脚本:{0} + 区域:{0} + + + + [一 丁 七 丈-与 专 且 世 丘-业 东 丝 丢 两 严 丧 个 中 丰 串 临 丸-主 丽 举 乃 久 么 义 之-乐 乔 乖 乘 乙 九 也-乡 书 买 乱 乾 了 予 争 事 二 于 亏 云 互 五 井 亚 些 亡 交 亦 亨 享 京 亮 亲 人 亿-仁 仅 仇 今 介 仍 从 仔 他 付 仙 代-以 仪 们 仰 仲 件 任 份 仿 企 伊 伍 伏-休 众 伙 会 伟 传 伤 伦 伯 估 伴 伸 似 伽 但 位-佑 体 何 余 佛 作 你 佤 佩 佳 使 例 供 依 侠 侦-侨 侬 侯 侵 便 促 俄 俊 俗 保 信 俩 修 俱 俾 倍 倒 候 倚 借 倦 值 倾 假 偌 偏 做 停 健 偶 偷 储 催 傲 傻 像 僧 儒 允 元-充 先 光 克 免 兑 兔 入 全 八-兮 兰 共 关-兹 养-兽 内 冈 再 冒 写 军 农 冠 冬 冰 冲 冷 准 凌 凝 几 凡 凤 凭 凯 凰 出 击 函 刀 分 切 刊 刑 划 列-创 初 判 利 别 到 制-券 刺 刻 剂 前 剑 剧 剩 剪 副 割 力 劝-务 劣 动-劫 励-劳 势 勇 勉 勋 勒 勤 勾 勿 包 匆 匈 化 北 匙 匹-医 十 千 升 午 半 华 协 卒 卓 单-南 博 占-卢 卫 印 危 即 卷 厄-历 厉 压-厍 厚 原 去 县 参 又-反 发 叔 取-叙 口-另 叫-叭 可 台 史 右 叶-叹 吃 各 合-吊 同-后 吐 向 吓 吗 君 吝 吟 否 吧 含 吵 吸 吹 吻 吾 呀 呆 呈 告 呐 员 呜 呢 呦 周 味 呵 呼 命 和 咖 咦 咧 咪 咬 咯 咱 哀 品 哇-哉 响 哎 哟 哥 哦 哩 哪 哭 哲 唉 唐 唤 唬 售 唯 唱 唷 商 啊 啡 啥 啦 啪 喀 喂 善 喇 喊 喏 喔 喜 喝 喵 喷 喻 嗒 嗨 嗯 嘉 嘛 嘴 嘻 嘿 器 四 回 因 团 园 困 围 固 国 图 圆 圈 土 圣 在 圭 地 场 圾 址 均 坎 坐 坑 块 坚-坜 坡 坤 坦 坪 垂 垃 型 垒 埃 埋 城 埔 域 培 基 堂 堆 堕 堡 堪 塑 塔 塞 填 境 增 墨 壁 士 壮 声 处 备 复 夏 夕 外 多 夜 夥 大 天-夫 央 失 头 夷-夺 奇-奉 奋 奏 契 奔 套 奥 女 奴 奶 她 好 如 妇 妈 妖 妙 妥 妨 妮 妹 妻 姆 姊 始 姐 姑 姓 委 姿 威 娃 娄 娘 娜 娟 婆 婚 媒 嫁 嫌 嫩 子 孔 孕 字-孙 孜 孝 孟 季 孤 学 孩 宁 它 宇-安 宋 完 宏 宗-实 审-室 宪 害 家 容 宽-宿 寂 寄 密 寇 富 寒 寝-察 寡 寨 寸 对 寻 导 寿 封 射 将 尊 小 少 尔 尖 尘 尚 尝 尤 就 尺 尼-尾 局-层 居 屋 屏 展 属 屠 山 岁 岂 岗 岘 岚 岛 岳 岸 峡 峰 崇 崩 川 州 巡 工-巨 巫 差 己 已 巴 巷 币-布 帅 师 希 帐 帕 帝 带 席 帮 常 帽 幅 幕 干-年 幸 幻-幽 广 庆 床 序 库-底 店 庙 府 庞 废 度 座 庭 康 庸 廉 廖 延 廷 建 开 弃 弄 弊 式 引 弗 弘 弟 张 弥 弦 弯 弱 弹 归 当 彝 形 彩 彬 彭 彰 影 彷 役 彻 彼 往 征 径 待 很 律 後 徐 徒 得 循 微 徵 德 心 必 忆 忌 忍 志-忙 忠 忧 快 念 忽 怀 态 怎 怒 怕 怖 思 怡 急 性 怨 怪 总 恋 恐 恢 恨 恩 恭 息 恰 恶 恼 悄 悉 悔 悟 悠 患 您 悲 情 惑 惜 惠 惧 惨 惯 想 惹 愁 愈 愉 意 愚 感 愧 慈 慎 慕 慢 慧 慰 憾 懂 懒 戈 戏-戒 或 战 截 戴 房-扁 扇 手 才 扎 扑 打 托 扣 执 扩 扫-扯 批 找-技 抄 把 抑 抓 投 抗 折 抢 护 报 披 抬 抱 抵 抹 抽 担 拆 拉 拍 拒 拔 拖 拘 招 拜 拟 拥 拦 拨 择 括 拳 拷 拼 拾 拿 持 指 按 挑 挖 挝 挡 挤 挥 挪 振 挺 捉 捐 捕 损 捡 换 捷 授 掉 掌 排 探 接 控-措 掸 描 提 插 握 援 搜 搞 搬 搭 摄 摆 摊 摔 摘 摩 摸 撒 撞 播 操 擎 擦 支 收 改 攻 放 政 故 效 敌 敏 救 教 敝 敢 散 敦 敬 数 敲 整 文 斋 斐 斗 料 斜 斥 断 斯 新 方 於 施 旁 旅 旋 族 旗 无 既 日-早 旭 时 旺 昂 昆 昌 明 昏 易 星 映 春 昨 昭 是 显 晃 晋 晒 晓 晚 晨 普 景 晴 晶 智 暂 暑 暖 暗 暮 暴 曰 曲 更 曹 曼 曾-最 月 有 朋 服 朗 望 朝 期 木 未-札 术 朱 朵 杀 杂 权 杉 李 材 村 杜 束 条 来 杨 杯 杰 松 板 极 析 林 果 枝 枢 枪 枫 架 柏 某 染 柔 查 柬 柯 柳 柴 标 栋 栏 树 校 样-根 格 桃 框 案 桌 桑 档 桥 梁 梅 梦 梯 械 梵 检 棉 棋 棒 棚 森 椅 植 椰 楚 楼 概 榜 模 樱 檀 欠-欣 欧 欲 欺 款 歉 歌 止-武 歪 死 殊 残 段 毅 母 每 毒 比 毕 毛 毫 氏 民 氛 水 永 求 汉 汗 汝 江-污 汤 汪 汶 汽 沃 沈 沉 沙 沟 沧 河 油 治 沿 泉 泊 法 泛 泡-泣 泥 注 泰 泳 泽 洋 洗 洛 洞 津 洪 洲 活 洽 派 流 浅 测 济 浑 浓 浦 浩 浪 浮 浴 海 涅 消 涉 涛 涨 涯 液 涵 淋 淑 淘 淡 深 混 添 清 渐 渡 渣 温 港 渴 游 湖 湾 源 溜 溪 滋 滑 满 滥 滨 滴 漂 漏 演 漠 漫 潘 潜 潮 澎 澳 激 灌 火 灭 灯 灰 灵 灿 炉 炎 炮 炸 点 烂 烈 烤 烦 烧 热 焦 然 煌 煞 照 煮 熊 熟 燃 燕 爆 爪 爬 爱 爵-爸 爽 片 版 牌 牙 牛 牡 牢 牧 物 牲 牵 特 牺 犯 状 犹 狂 狐 狗 狠 独 狮 狱 狼 猛 猜 献 玄 率 玉 王 玛 玩 玫 环 现 玲 玻 珊 珍 珠 班 球 理 琊 琪 琳 琴 瑙 瑜 瑞 瑟 瑰 瑶 璃 瓜 瓦 瓶 甘 甚 甜 生 用 田-申 电 男 甸 画 畅 界 留 略 番 疆 疏 疑 疗 疯 疲 疼 疾 病 痕 痛 痴 登 白 百 的 皆 皇 皮 盈 益 监 盒 盖 盘 盛 盟 目 直 相 盼 盾 省 眉 看 真 眠 眼 睛 睡 督 瞧 矛 矣 知 短 石 矶 码 砂 砍 研 破 础 硕 硬 碍 碎 碗 碟 碧 碰 磁 磅 磨 示 礼 社 祖 祝 神 祥 票 祸 禁 禅 福 秀 私 秋 种 科 秒 秘 租 秤 秦 秩 积 称 移 稀 程 稍 稣 稳 稿 穆 究 穷 穹 空 穿 突 窗 窝 立 站 竞-章 童 端 竹 笑 笔 笛 符 笨 第 等 筋 答 策 筹 签 简 算 管 箭 箱 篇 篮 簿 籍 米 类 粉 粒 粗 粹 精 糊 糕 糖 糟 系 素 索 紧 紫 累 繁 红 约 级 纪 纯 纲 纳 纵 纷 纸 纽 练 组 细-终 绍 经 结 绕 绘 给 络 统 继 绩 绪 续 维 绵 综 缅 缓 编 缘 缠 缩 缴 缶 缸 缺 罐 罕 罗 罚 罢 罪 置 署 羊 美 羞 群 羯 羽 翁 翅 翔 翘 翠 翰 翻 翼 耀 老 考 者 而 耍 耐 耗 耳 耶 聊 职 联 聚 聪 肉 肚 股 肤 肥 肩 肯 育 胁 胆 背 胎 胖 胞 胡 胶 胸 能 脆 脑 脱 脸 腊 腐 腓 腰 腹 腾 腿 臂 臣 自 臭 至 致 舌 舍 舒 舞 舟 航 般 舰 船 良 色 艺 艾 节 芒 芝 芦 芬 芭 花 芳 苍 苏 苗 若 苦 英 茂 茨 茫 茶 草 荒 荣 药 荷 莉 莎 莪 莫 莱 莲 获 菜 菩 菲 萄 萍 萤 营 萧 萨 落 著 葛 葡 蒂 蒋 蒙 蓉 蓝 蓬 蔑 蔡 薄 薪 藉 藏 藤 虎 虑 虫 虹 虽 虾 蚁 蛇 蛋 蛙 蛮 蜂 蜜 蝶 融 蟹 蠢 血 行 街 衡 衣 补 表 袋 被 袭 裁 裂 装 裕 裤 西 要 覆 见 观 规 视 览 觉 角 解 言 誉 誓 警 计 订 认 讨 让 训-记 讲 许 论 设 访 证 评 识 诉 词 译 试 诗 诚 话 诞 询 该 详 语 误 说 请 诸 诺 读 课 谁 调 谅 谈 谊 谋 谓 谜 谢 谨 谱 谷 豆 象 豪 貌 贝-负 贡-败 货-贪 购 贯 贱 贴 贵 费 贺 贼 贾 资 赋 赌 赏 赐 赔 赖 赚 赛 赞 赠 赢 赤 赫 走 赵 起 趁 超 越 趋 趣 足 跃 跌 跑 距 跟 路 跳 踏 踢 踩 身 躲 车 轨 轩 转 轮-轰 轻 载 较 辅 辆 辈 辉 辑 输 辛 辞 辨 辩 辱 边 达 迁 迅 过 迈 迎 运 近 返 还 这 进-迟 迦 迪 迫 述 迷 追 退 送 逃 逆 选 逊 透 逐 递 途 通 逛 逝 速 造 逢 逸 逻 逼 遇 遍 道 遗 遭 遮 遵 避 邀 邓 那 邦 邪 邮 邱 邻 郎 郑 部 郭 都 鄂 酋 配 酒 酷 酸 醉 醒 采 释 里-量 金 针 钓 钟 钢 钦 钱 钻 铁 铃 铢 铭 银 销 锁 锅 锋 错 锡 锦 键 锺 镇 镜 镭 长 门 闪 闭 问 间 闷 闹 闻 阁 阐 阔 队 阮 防-阶 阻 阿 陀 附-陆 陈 降 限 院 除 险 陪 陵-陷 隆 随 隐 隔 障 难 雄-集 雨 雪 雯 雳 零 雷 雾 需 震 霍 霖 露 霸 霹 青 靖 静 非 靠 面 革 靼 鞋 鞑 韦 韩 音 页 顶 项-须 顽-顿 预 领 颇 频 颗 题 额 风 飘 飙 飞 食 餐 饭 饮 饰 饱 饼 馆 首 香 馨 马 驱 驶 驻 驾 验 骑 骗 骚 骤 骨 高 鬼 魂 魅 魔 鱼 鲁 鲜 鸟 鸣 鸭 鸿 鹅 鹤 鹰 鹿 麦 麻 黄 黎 黑 默 鼓 鼠 鼻 齐 齿 龄 龙 龟] + [侣 傣 卑 厘 吕 堤 奎 巽 录 户 撤 楔 楠 滕 瑚 甫 盲 禄 粟 线 脚 钯 铂 锑 镑 魁] + [a-z] + + + + + + + + + GanjkHmsSEDFwWxhKzAeugXZvcL + + + + + M-dE + + + + + + + + 1月 + 2月 + 3月 + 4月 + 5月 + 6月 + 7月 + 8月 + 9月 + 10月 + 11月 + 12月 + + + 1月 + 2月 + 3月 + 4月 + 5月 + 6月 + 7月 + 8月 + 9月 + 10月 + 11月 + 12月 + + + + + 一月 + 二月 + 三月 + 四月 + 五月 + 六月 + 七月 + 八月 + 九月 + 十月 + 十一月 + 十二月 + + + 1月 + 2月 + 3月 + 4月 + 5月 + 6月 + 7月 + 8月 + 9月 + 10月 + 11月 + 12月 + + + 一月 + 二月 + 三月 + 四月 + 五月 + 六月 + 七月 + 八月 + 九月 + 十月 + 十一月 + 十二月 + + + + + + + 周日 + 周一 + 周二 + 周三 + 周四 + 周五 + 周六 + + + 星期日 + 星期一 + 星期二 + 星期三 + 星期四 + 星期五 + 星期六 + + + + + + + + + + + + + + + + + + 1季 + 2季 + 3季 + 4季 + + + 第1季度 + 第2季度 + 第3季度 + 第4季度 + + + + + 1 + 2 + 3 + 4 + + + + 上午 + 下午 + + + 公元前 + 公元 + + + 公元前 + 公元 + + + + + + yyyy年M月d日EEEE + + + + + yyyy年M月d日 + + + + + yyyy-M-d + + + + + yy-M-d + + + + + + + ahh时mm分ss秒v + + + + + ahh时mm分ss秒z + + + + + ahh:mm:ss + + + + + ah:mm + + + + + + + {1} {0} + + + + d日E + H时 + HH:mm + HH:mm:ss + H:mm + L + M-dE + LLL + MMMd日E + MMMMd日E + MMMMd日 + MMMMdd日 + MMMd日 + MM-dd + M-d + d日 + mm:ss + mm:ss + yyyy年 + yyyy-M + yyyy年M月d日,E + yyyy年MMM + yyyy年MMMd日EEE + yyyy年MMMM + yyyy年QQQ + y年QQQ + yy-MM + yy年MMM + yy年第Q季度 + yyyy年 + yyyy年M月 + yyyy年MMMM + + + {0}–{1} + + L至L + + + M-dE至M-dE + M-dE至M-dE + + + LLLL至LLLL + + + M月d日E至M月d日E + M月d日E至d日E + + + M月d日至M月d日 + M月d日至d日 + + + M-d至M-d + M-d至M-d + + + d日至d日 + + + ah至ah时 + ah至h时 + + + ah:mm至ah:mm + ah:mm至h:mm + ah:mm至h:mm + + + ah:mm至ah:mmv + ah:mm至h:mmv + ah:mm至h:mmv + + + ah至ah时v + ah至h时v + + + y至y + + + yy-M至yy-M + yy-M至yy-M + + + yy-M-dE至yy-M-dE + yy-M-dE至yy-M-dE + yy-M-dE至yy-M-dE + + + yyyy年M月至M月 + yyyy年M月至yyyy年M月 + + + yyyy年M月d日E至M月d日E + yyyy年M月d日E至d日E + yyyy年M月d日E至yyyy年M月d日E + + + yyyy年M月d日至M月d日 + yyyy年M月d日至d日 + yyyy年M月d日至yyyy年M月d日 + + + yy-M-d至yy-M-d + yy-M-d至yy-M-d + yy-M-d至yy-M-d + + + + + + 时期 + + + + + + + + + + + + + 今天 + 明天 + 后天 + 昨天 + 前天 + + + 周天 + + + 上午/下午 + + + 小时 + + + 分钟 + + + 秒钟 + + + 区域 + + + + + + + yyyy-M + + + + + + + 民国前 + 民国 + + + + + + Gy年M月d日EEEE + + + + + Gy年M月d日 + + + + + Gy-M-d + + + + + Gy-M-d + + + + + + + +HHmm;-HHmm + 格林尼治标准时间{0} + {0} + + 未知 + + + 安道尔 + + + 迪拜 + + + 喀布尔 + + + 安提瓜 + + + 安圭拉 + + + 地拉那 + + + 埃里温 + + + 库拉卡 + + + 罗安达 + + + 罗瑟拉 + + + 帕默尔 + + + 南极 + + + 斯尤瓦 + + + 莫森 + + + 戴维斯 + + + 沃斯托克 + + + 卡塞 + + + 杜蒙杜威勒 + + + 马克默多 + + + 里奥加耶戈斯 + + + 门多萨 + + + 圣胡安 + + + 乌斯怀亚 + + + 拉里奥哈 + + + 卡塔马卡 + + + 胡胡伊 + + + 图库曼 + + + 科尔多瓦 + + + 布宜诺斯艾利斯 + + + 帕果-帕果 + + + 维也纳 + + + 佩思 + + + 尤克拉 + + + 达尔文 + + + 阿德莱德 + + + 布罗肯希尔 + + + 库利 + + + 墨尔本 + + + 霍巴特 + + + 林德曼 + + + 悉尼 + + + 布里斯班 + + + 豪勋爵 + + + 阿鲁巴 + + + 玛丽港 + + + 巴库 + + + 萨拉热窝 + + + 巴巴多斯 + + + 达卡 + + + 布鲁塞尔 + + + 瓦加杜古 + + + 索非亚 + + + 巴林 + + + 布琼布拉 + + + 波多诺伏 + + + 百慕大 + + + 文莱 + + + 拉巴斯 + + + 依伦尼贝 + + + 里奥布郎库 + + + 波多韦柳 + + + 博阿维斯塔 + + + 马瑙斯 + + + 库亚巴 + + + 大坎普 + + + 贝伦 + + + 阿拉瓜伊纳 + + + 圣保罗 + + + 巴伊亚 + + + 福塔雷萨 + + + 马塞约 + + + 累西腓 + + + 洛罗尼亚 + + + 拿骚 + + + 廷布 + + + 哈博罗内 + + + 明斯克 + + + 伯利兹 + + + 道森 + + + 怀特霍斯 + + + 伊努维克 + + + 温哥华 + + + 道森克里克 + + + 耶洛奈夫 + + + 埃德蒙顿 + + + 斯威夫特卡伦特 + + + 坎布里季贝 + + + 里贾纳 + + + 温尼伯 + + + 雨河 + + + 雷今海口 + + + 珊瑚港 + + + 桑德贝 + + + 尼皮贡 + + + 多伦多 + + + 蒙特利尔 + + + 伊魁鲁伊特 + + + 旁涅唐 + + + 蒙克顿 + + + 哈利法克斯 + + + 古斯湾 + + + 格莱斯贝 + + + 圣约翰 + + + 可可斯 + + + 金沙萨 + + + 卢本巴希 + + + 班吉 + + + 布拉扎维 + + + 苏黎世 + + + 阿比让 + + + 拉罗汤加 + + + 复活节岛 + + + 圣地亚哥 + + + 杜阿拉 + + + 喀什葛尔 + + + 乌鲁木齐 + + + 重庆 + + + 上海 + + + 哈尔滨 + + + 波哥大 + + + 哥斯达黎加 + + + 哈瓦那 + + + 佛得角 + + + 圣诞岛 + + + 尼科西亚 + + + 布拉格 + + + 柏林 + + + 吉布提 + + + 哥本哈根 + + + 多米尼加 + + + 圣多明各 + + + 阿尔及尔 + + + 加拉帕哥斯 + + + 瓜亚基尔 + + + 塔林 + + + 开罗 + + + 阿尤恩 + + + 阿斯马拉 + + + 加那利 + + + 休达 + + + 马德里 + + + 亚的斯亚贝巴 + + + 赫尔辛基 + + + 斐济 + + + 史丹利 + + + 特鲁克群岛 + + + 波纳佩岛 + + + 库赛埃 + + + 法罗 + + + 巴黎 + + + 利伯维尔 + + + + BST + + 伦敦 + + + 格林纳达 + + + 第比利斯 + + + 卡宴 + + + 根西岛 + + + 阿克拉 + + + 直布罗陀 + + + 图勒 + + + 戈特霍布 + + + 斯科列斯比桑德 + + + Danmarkshavn(格陵兰东北城市) + + + 班珠尔 + + + 科纳克里 + + + 瓜德罗普 + + + 马拉博 + + + 雅典 + + + 南乔治亚 + + + 危地马拉 + + + 关岛 + + + 比绍 + + + 圭亚那 + + + 香港 + + + 特古西加尔巴 + + + 萨格勒布 + + + 太子港 + + + 布达佩斯 + + + 雅加达 + + + 坤甸 + + + 望加锡 + + + 查亚普拉 + + + 都柏林 + + + 耶路撒冷 + + + 马恩岛 + + + 加尔各答 + + + 查戈斯 + + + 巴格达 + + + 德黑兰 + + + 雷克雅未克 + + + 罗马 + + + 泽西岛 + + + 牙买加 + + + 安曼 + + + 东京 + + + 内罗毕 + + + 比什凯克 + + + 金边 + + + 恩德贝里 + + + 基里地马地岛 + + + 塔拉瓦 + + + 科摩罗 + + + 圣基茨 + + + 平壤 + + + 首尔 + + + 科威特 + + + 开曼 + + + 阿克图 + + + 乌拉尔 + + + 阿克托别 + + + 克孜勒奥尔达 + + + 阿拉木图 + + + 万象 + + + 贝鲁特 + + + 圣卢西亚 + + + 瓦杜兹 + + + 科伦坡 + + + 蒙罗维亚 + + + 马塞卢 + + + 维尔纽斯 + + + 卢森堡 + + + 里加 + + + 的黎波里 + + + 卡萨布兰卡 + + + 摩纳哥 + + + 基希讷乌 + + + 波德戈里察 + + + 安塔那利佛 + + + 夸贾林 + + + 马朱罗 + + + 斯科普里 + + + 巴马科 + + + 仰光 + + + 科布多 + + + 乌兰巴托 + + + 卓巴尔塞 + + + 澳门 + + + 塞班 + + + 马提尼克 + + + 努瓦克肖特 + + + 蒙特塞拉特 + + + 马耳他 + + + 毛里求斯 + + + 马尔代夫 + + + 布兰太尔 + + + 提华纳 + + + 埃莫西约 + + + 马萨特兰 + + + 奇瓦瓦 + + + 蒙特雷 + + + 墨西哥城 + + + 梅里达 + + + 坎昆 + + + 吉隆坡 + + + 古晋 + + + 马普托 + + + 温得和克 + + + 努美阿 + + + 尼亚美 + + + 诺福克 + + + 拉各斯 + + + 马那瓜 + + + 阿姆斯特丹 + + + 奥斯陆 + + + 加德满都 + + + 瑙鲁 + + + 纽埃 + + + 查塔姆 + + + 奥克兰 + + + 马斯喀特 + + + 巴拿马 + + + 利马 + + + 塔希提 + + + 马克萨斯 + + + 甘比尔 + + + 莫尔兹比港 + + + 马尼拉 + + + 卡拉奇 + + + 华沙 + + + 密克隆 + + + 皮特凯恩 + + + 波多黎各 + + + 加沙 + + + 亚述尔群岛 + + + 马德拉 + + + 里斯本 + + + 帕劳 + + + 亚松森 + + + 卡塔尔 + + + 留尼旺 + + + 布加勒斯特 + + + 贝尔格莱德 + + + 加里宁格勒 + + + 莫斯科 + + + 伏尔加格勒 + + + 萨马拉 + + + 叶卡捷林堡 + + + 鄂木斯克 + + + 诺沃西比尔斯克 + + + 克拉斯诺亚尔斯克 + + + 伊尔库茨克 + + + 雅库茨克 + + + 符拉迪沃斯托克 + + + 萨哈林 + + + 马加丹 + + + 堪察加 + + + 阿纳德尔 + + + 基加利 + + + 利雅得 + + + 瓜达尔卡纳尔 + + + 马埃 + + + 哈土穆 + + + 斯德哥尔摩 + + + 新加坡 + + + 圣赫勒拿 + + + 卢布尔维 + + + 朗伊尔城 + + + 布拉迪斯拉发 + + + 弗里敦 + + + 圣马力诺 + + + 达喀尔 + + + 摩加迪沙 + + + 帕拉马利玻 + + + 圣多美 + + + 萨尔瓦多 + + + 大马士革 + + + 姆巴巴纳 + + + 大土耳其 + + + 恩贾梅纳 + + + 凯尔盖朗 + + + 洛美 + + + 曼谷 + + + 杜尚别 + + + 法考福 + + + 帝力 + + + 阿什哈巴德 + + + 突尼斯 + + + 东加塔布 + + + 伊斯坦布尔 + + + 西班牙港 + + + 富纳富提 + + + 台北 + + + 达累斯萨拉姆 + + + 乌日戈罗德 + + + 基辅 + + + 辛菲罗波尔 + + + 扎波罗热 + + + 坎帕拉 + + + 中途岛 + + + 约翰斯顿 + + + 威克 + + + 艾德克 + + + 诺姆 + + + 檀香山 + + + 安克雷奇 + + + 亚库塔特 + + + 朱诺 + + + 洛杉矶 + + + 博伊西 + + + 凤凰城 + + + 舰石城 + + + 丹佛 + + + 北达科他 + + + 芝加哥 + + + 密诺米尼 + + + 温森斯 + + + 彼得斯堡 + + + 诺克斯 + + + 马伦戈 + + + 印地安纳波利斯 + + + 路易斯维尔 + + + 维维市(印第安纳州) + + + 蒙蒂塞洛 + + + 底特律 + + + 纽约 + + + 蒙得维的亚 + + + 撒马尔罕 + + + 塔什干 + + + 梵蒂冈 + + + 圣文森特 + + + 加拉加斯 + + + 托尔托拉 + + + 圣托马斯 + + + 胡志明市 + + + 埃法特 + + + 瓦利斯 + + + 阿皮亚 + + + 亚丁 + + + 马约特 + + + 约翰内斯堡 + + + 卢萨卡 + + + 哈拉雷 + + + + Acre 时间 + Acre 标准时间 + Acre 夏令时间 + + false + + + + 阿富汗時間 + + + + + 非洲中部时间 + 中部非洲标准时间 + + + 中部非洲时间 + + false + + + + 非洲东部时间 + 东部非洲标准时间 + + + 东部非洲时间 + + false + + + + 非洲南部时间 + 南部非洲标准时间 + + + 南部非洲时间 + 南部非洲标准时间 + + false + + + + 西部非洲时间 + 西部非洲标准时间 + 西部非洲夏令时间 + + + 南部非洲时间 + 西部非洲标准时间 + + false + + + + 阿尔卑斯时间 + 阿尔卑斯标准时间 + 阿尔卑斯夏令时间 + + false + + + + 阿拉斯加时间 + 阿拉斯加标准时间 + 阿拉斯加夏令时间 + + + 阿拉斯加标准时间 + 阿拉斯加夏令时间 + + false + + + + 阿拉斯加-夏威夷时间 + 阿拉斯加-夏威夷标准时间 + 阿拉斯加-夏威夷夏令时间 + + false + + + + Almaty 时间 + Almaty 标准时间 + Almaty 夏令时间 + + false + + + + 亚马逊时间 + 亚马逊标准时间 + 亚马逊夏令时间 + + false + + + + 美国中部时间 + 中部标准时间 + 中部夏令时间 + + false + + + + 美国东部时间 + 东部标准时间 + 东部夏令时间 + + false + + + + 美国山区时间 + 山区标准时间 + 山区夏令时间 + + false + + + + 美国太平洋时间 + 太平洋标准时间 + 太平洋夏令时间 + + false + + + + 阿納德爾時間 + 阿納德爾夏令時間 + + + + + 阿克图时间 + 阿克图标准时间 + 阿克图夏令时间 + + false + + + + 阿克托别时间 + 阿克托别标准时间 + 阿克托别夏令时间 + + false + + + + 阿拉伯时间 + 阿拉伯标准时间 + 阿拉伯夏令时间 + + false + + + + 阿根廷时间 + 阿根廷标准时间 + 阿根廷夏令时间 + + false + + + + 阿根廷西部时间 + 阿根廷西部标准时间 + 阿根廷西部夏令时间 + + false + + + + 亚美尼亚时间 + 亚美尼亚标准时间 + 亚美尼亚夏令时间 + + + AMT (Armenia) + AMST (Armenia) + AMDT (Armenia) + + false + + + + 阿什哈巴德时间 + 阿什哈巴德标准时间 + 阿什哈巴德夏令时间 + + false + + + + 大西洋时间 + 大西洋标准时间 + 大西洋夏令时间 + + false + + + + 澳大利亚中部时间 + 澳大利亚中部标准时间 + 澳大利亚中部夏令时间 + + + 澳大利亚中部时间 + 澳大利亚中部标准时间 + 澳大利亚中部夏令时间 + + false + + + + 澳大利亚中西部标准时间 + 澳大利亚中西部夏令时间 + + + 澳大利亚中西部标准时间 + 澳大利亚中西部夏令时间 + + + + + 澳大利亚东部时间 + 澳大利亚东部标准时间 + 澳大利亚东部夏令时间 + + + 澳大利亚东部时间 + 澳大利亚东部标准时间 + 澳大利亚东部夏令时间 + + false + + + + 澳大利亚西部时间 + 澳大利亚西部标准时间 + 澳大利亚西部夏令时间 + + + 澳大利亚西部时间 + 澳大利亚西部标准时间 + 澳大利亚西部夏令时间 + + false + + + + 阿塞拜疆时间 + 阿塞拜疆标准时间 + 阿塞拜疆夏令时间 + + false + + + + 亚述尔群岛时间 + 亚述尔群岛时间 + 亚述尔群岛夏令时间 + + + 亚述尔时间 + 亚述尔群岛时间 + 亚述尔群岛夏令时间 + + false + + + + 巴库时间 + 巴库标准时间 + 巴库夏令时间 + + + 巴库时间 + 巴库标准时间 + + false + + + + 孟加拉时间 + 孟加拉标准时间 + 孟加拉夏令时间 + + + 孟加拉夏令时间 + BDT + + false + + + + 白令时间 + 白令标准时间 + 白令夏令时间 + + false + + + + 不丹时间 + 不丹标准时间 + 不丹夏令时间 + + + 孟加拉标准时间 + + false + + + + 玻利維亞時間 + + + + + 婆罗洲时间 + 婆罗洲标准时间 + 婆罗洲夏令时间 + + false + + + + 巴西利亚时间 + 巴西利亚标准时间 + 巴西利亚夏令时间 + + false + + + + 汶萊時間 + + + + + 查莫罗标准时区 + + + 查莫罗标准时区 + + false + + + + 长白山时间 + + + + + 智利时间 + 智利标准时间 + 智利夏令时间 + + false + + + + 中国时间 + 中国标准时间 + 中国夏令时间 + + + CT(中国) + CST(中国) + CDT(中国) + + false + + + + 乔巴山时间 + 乔巴山标准时间 + 乔巴山夏令时间 + + false + + + + 哥倫比亞時間 + 哥倫比亞夏令時間 + + + + + 古巴時間 + 古巴標準時間 + 古巴夏令時間 + + + + + 达卡时间 + 达卡标准时间 + 达卡夏令时间 + + false + + + + 杜尚别时间 + 杜尚别标准时间 + 杜尚别夏令时间 + + false + + + + 荷属圭亚那时间 + 荷属圭亚那标准时间 + 荷属圭亚那夏令时间 + + false + + + + 东帝汶时间 + 东帝汶标准时间 + 东帝汶夏令时间 + + false + + + + 厄瓜多尔标准时间 + + false + + + + 中欧时间 + 中欧标准时间 + 中欧夏令时间 + + false + + + + 东欧时间 + 东欧标准时间 + 东欧夏令时间 + + false + + + + 西欧时间 + 欧洲西部时间 + 欧洲西部夏令时间 + + + 西欧时间 + 欧洲西部时间 + 欧洲西部夏令时间 + + false + + + + 法屬圭亞那時間 + + + + + 伏龙芝时间 + 伏龙芝标准时间 + 伏龙芝夏令时间 + + false + + + + 格林尼治标准时间 + + true + + + + 加拉帕戈斯时间 + 加拉帕戈斯时间 + 加拉帕戈斯夏令时间 + + + 加拉帕哥斯时间 + 加拉帕戈斯时间 + 加拉帕哥斯夏令时间 + + false + + + + 格鲁吉亚时间 + 格鲁吉亚标准时间 + 格鲁吉亚夏令时间 + + false + + + + 格林兰中部时间 + 格林兰中部标准时间 + 格林兰中部夏令时间 + + false + + + + 格林兰东部时间 + 格林兰东部标准时间 + 格林兰东部夏令时间 + + false + + + + 格林兰西部时间 + 格林兰西部标准时间 + 格林兰西部夏令时间 + + false + + + + 关岛时间 + 关岛标准时间 + 关岛夏令时间 + + + 关岛时间 + 关岛标准时间 + 关岛夏令时间 + + false + + + + 海湾标准时间 + + + + + 蓋亞那時間 + + + + + 夏威夷—阿留申标准时间 + + + 夏威夷—阿留申标准时间 + + false + + + + 香港時間 + 香港夏令時間 + + + + + 科布多時間 + 科布多夏令時間 + + + + + 印度标准时间 + + false + + + + 印度尼西亚中部标准时间 + + false + + + + 印度尼西亚东部标准时间 + + false + + + + 印度尼西亚西部标准时间 + + false + + + + 伊朗標準時間 + 伊朗夏令時間 + + + + + 伊爾庫茨克時間 + 伊爾庫茨克夏令時間 + + + + + 以色列时间 + 以色列标准时间 + 以色列夏令时间 + + + IST (Israel) + + false + + + + 日本時間 + 日本标准时间 + 日本夏令时间 + + + + + 卡拉奇时间 + 卡拉奇标准时间 + 卡拉奇夏令时间 + + false + + + + 喀什标准时间 + + false + + + + 哈萨克斯坦东部时间 + 哈萨克斯坦东部标准时间 + + false + + + + 哈萨克斯坦西部时间 + 哈萨克斯坦西部标准时间 + + false + + + + Kizilorda 时间 + Kizilorda 标准时间 + Kizilorda 夏令时间 + + false + + + + 韩国时间 + 韩国标准时间 + 韩国夏令时间 + + false + + + + 古比雪夫时间 + 古比雪夫时间 + 古比雪夫夏令时间 + + + 古比雪夫时间 + 古比雪夫夏令时间 + + false + + + + 夸贾林时间 + 夸贾林时间 + 夸贾林夏令时间 + + + 夸贾林时间 + + false + + + + Kyrgystan 时间 + Kyrgystan 标准时间 + Kyrgystan 夏令时间 + + false + + + + Lanka 时间 + Lanka 标准时间 + Lanka 夏令时间 + + false + + + + Long-Shu 时间 + Long-Shu 标准时间 + Long-Shu 夏令时间 + + false + + + + 罗德毫岛时间 + 罗德毫岛标准时间 + 罗德毫岛夏令时间 + + + 罗德毫岛标准时间 + + false + + + + 澳门时间 + 澳门标准时间 + 澳门夏令时间 + + false + + + + 馬加丹時間 + 馬加丹夏令時間 + + + + + 马来亚时间 + 马来亚标准时间 + 马来亚夏令时间 + + false + + + + 马来西亚时间 + 马来西亚标准时间 + 马来西亚夏令时间 + + false + + + + 马绍尔群岛时间 + 马绍尔群岛时间 + 马绍尔群岛夏令时间 + + + 马绍尔群岛时间 + + false + + + + 乌兰巴托时间 + 乌兰巴托标准时间 + 乌兰巴托夏令时间 + + false + + + + 莫斯科时间 + 莫斯科标准时间 + 莫斯科夏令时间 + + false + + + + 緬甸時間 + + + + + 尼泊爾時間 + + + + + 新西兰时间 + 新西兰标准时间 + 新西兰夏令时间 + + + 新西兰时间 + 新西兰标准时间 + 新西兰夏令时间 + + false + + + + 纽芬兰时间 + 纽芬兰标准时间 + 纽芬兰夏令时间 + + + 纽芬兰标准时间 + 纽芬兰夏令时间 + + false + + + + 爾南多-迪諾羅尼亞島時間 + 爾南多-迪諾羅尼亞島夏令時間 + + + + + 北马里亚纳群岛时间 + 北马里亚纳群岛时间 + 北马里亚纳群岛夏令时间 + + false + + + + 新西伯利亞時間 + 新西伯利亞夏令時間 + + + + + 鄂木斯克時間 + 鄂木斯克夏令時間 + + + + + 巴基斯坦时间 + 巴基斯坦标准时间 + 巴基斯坦夏令时间 + + false + + + + 巴拉圭時間 + 巴拉圭夏令時間 + + + + + 秘魯時間 + 秘魯夏令時間 + + + + + 菲律賓時間 + 菲律賓夏令時間 + + + + + 彼得岛和米克隆岛时间 + 彼得岛和米克隆岛标准时间 + 彼得岛和米克隆岛夏令时间 + + false + + + + 克孜勒奥尔达时间 + 克孜勒奥尔达标准时间 + 克孜勒奥尔达夏令时间 + + false + + + + 庫頁島時間 + 庫頁島夏令時間 + + + + + 萨马拉时间 + 萨马拉时间 + 萨马拉夏令时间 + + + 萨马拉时间 + 萨马拉夏令时间 + + false + + + + 撒马尔罕时间 + 撒马尔罕标准时间 + 撒马尔罕夏令时间 + + false + + + + 萨摩亚时间 + 萨摩亚标准时间 + 萨摩亚夏令时间 + + + 瑞典夏令时间 + + false + + + + 舍甫琴科时间 + 舍甫琴科夏令时间 + + false + + + + 新加坡標準時間 + + + + + 苏里南夏令时间 + 苏里南标准时间 + + + 蘇利南夏令時間 + + false + + + + 斯维尔德洛夫斯克时间 + 斯维尔德洛夫斯克标准时间 + 斯维尔德洛夫斯克夏令时间 + + false + + + + 塔吉克斯坦时间 + 塔吉克斯坦标准时间 + 塔吉克斯坦夏令时间 + + false + + + + 塔什干时间 + 塔什干标准时间 + 塔什干夏令时间 + + false + + + + 第比利斯时间 + 第比利斯标准时间 + 第比利斯夏令时间 + + false + + + + 土耳其时间 + 土耳其时间 + 土耳其夏令时间 + + + 土耳其时间 + 土耳其夏令时间 + + false + + + + 土库曼斯坦时间 + 土库曼斯坦标准时间 + 土库曼斯坦夏令时间 + + false + + + + 乌拉尔斯克时间 + 乌拉尔斯克标准时间 + 乌拉尔斯克夏令时间 + + false + + + + 烏拉圭時間 + 烏拉圭夏令時間 + + + + + 乌鲁木齐时间 + 乌鲁木齐标准时间 + 乌鲁木齐夏令时间 + + false + + + + 乌兹别克斯坦时间 + 乌兹别克斯坦标准时间 + 乌兹别克斯坦夏令时间 + + false + + + + 委內瑞拉時間 + + + + + 海參崴時間 + 海參崴夏令時間 + + + + + 雅庫茨克時間 + 雅庫茨克夏令時間 + + + + + 叶卡捷琳堡时间 + 叶卡捷琳堡标准时间 + 叶卡捷琳堡夏令时间 + + false + + + + 埃里温时间 + 埃里温标准时间 + 埃里温夏令时间 + + false + + + + 育空时间 + 育空标准时间 + 育空夏令时间 + + false + + + + + + . + , + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + ¤#,##0.00 + + + + + + 安道尔比塞塔 + + + 阿联酋迪拉姆 + + + 阿富汗尼 (1927-2002) + + + 阿富汗尼 + + + 阿尔巴尼亚列克 + + + 亚美尼亚德拉姆 + + + 荷兰安替兰盾 + + + 安哥拉宽扎 + + + 安哥拉宽扎 (1977-1990) + + + 安哥拉新宽扎 (1990-2000) + + + 安哥拉宽扎 Reajustado (1995-1999) + + + 阿根廷奥斯特 + + + 阿根廷比索 (1983-1985) + + + 阿根廷比索 + + + 奥地利先令 + + + 澳大利亚元 + + + 阿鲁巴基尔德元 + + + 阿塞拜疆马纳特 (1993-2006) + + + 阿塞拜疆马纳特 + + + 波士尼亚-赫塞哥维纳第纳尔 + + + 波士尼亚-赫塞哥维纳兑换券 + + + 巴巴多斯元 + + + 孟加拉塔卡 + + + 比利时法郎兑换券 + + + 比利时法郎 + + + 比利时法郎(金融) + + + 保加利亚硬列弗 + + + 保加利亚新列弗 + + + 巴林第纳尔 + + + 布隆迪法郎 + + + 百慕大元 + + + 文莱元 + + + 玻利维亚诺 + + + 玻利维亚比索 + + + 玻利维亚 Mvdol(资金) + + + 巴西克鲁赛罗 Novo (1967-1986) + + + 巴西克鲁扎多 + + + 巴西克鲁塞罗 (1990-1993) + + + 巴西雷亚尔 + + + 巴西克鲁扎多 Novo + + + 巴西克鲁塞罗 + + + 巴哈马元 + + + 不丹努扎姆 + + + 缅元 + + + 博茨瓦纳普拉 + + + 白俄罗斯新卢布 (1994-1999) + + + 白俄罗斯卢布 + + + 伯利兹元 + + + 加拿大元 + + + 刚果法郎 + + + 瑞士法郎 + + + 智利 Unidades de Fomento(资金) + + + 智利比索 + + + 人民币 + + + + 哥伦比亚比索 + + + 哥斯达黎加科朗 + + + 旧塞尔维亚第纳尔 + + + 捷克硬克郎 + + + 古巴比索 + + + 佛得角埃斯库多 + + + 塞浦路斯镑 + + + 捷克克郎 + + + 东德奥斯特马克 + + + 德国马克 + + + 吉布提法郎 + + + 丹麦克朗 + + + 多米尼加比索 + + + 阿尔及利亚第纳尔 + + + 厄瓜多尔苏克雷 + + + 厄瓜多尔 Unidad de Valor Constante (UVC) + + + 爱沙尼亚克朗 + + + 埃及镑 + + + 埃奎勒 + + + 厄立特里亚纳克法 + + + 西班牙比塞塔(帐户 A) + + + 西班牙比塞塔(兑换帐户) + + + 西班牙比塞塔 + + + 埃塞俄比亚比尔 + + + 欧元 + + + 芬兰马克 + + + 斐济元 + + + 福克兰镑 + + + 法国法郎 + + + 英镑 + + + 乔治亚库蓬拉瑞特 + + + 乔治亚拉瑞 + + + 加纳塞第 + + + 加纳塞迪 + + + 直布罗陀镑 + + + 冈比亚达拉西 + + + 几内亚法郎 + + + 几内亚西里 + + + 赤道几内亚埃奎勒 + + + 希腊德拉克马 + + + 危地马拉格查尔 + + + 葡萄牙几内亚埃斯库多 + + + 几内亚比绍比索 + + + 圭亚那元 + + + 港元 + HK$ + + + 洪都拉斯拉伦皮拉 + + + 克罗地亚第纳尔 + + + 克罗地亚库纳 + + + 海地古德 + + + 匈牙利福林 + + + 印度尼西亚盾 + + + 爱尔兰镑 + + + 以色列镑 + + + 以色列新谢克尔 + + + 印度卢比 + + + 伊拉克第纳尔 + + + 伊朗里亚尔 + + + 冰岛克朗 + + + 意大利里拉 + ITL + + + 牙买加元 + + + 约旦第纳尔 + + + 日元 + + + 肯尼亚先令 + + + 吉尔吉斯斯坦索姆 + + + 柬埔寨瑞尔 + + + 科摩罗法郎 + + + 朝鲜圆 + + + 韩圆 + + + + 科威特第纳尔 + + + 开曼元 + + + 哈萨克斯坦坚戈 + + + 老挝基普 + + + 黎巴嫩镑 + + + 斯里兰卡卢比 + + + 利比亚元 + + + 莱索托洛蒂 + + + 马洛蒂 + + + 立陶宛立特 + + + 立陶宛塔咯呐司 + + + 卢森堡可兑换法郎 + + + 卢森堡法郎 + + + 卢森堡金融法郎 + + + 拉脱维亚拉特 + + + 拉脱维亚卢布 + + + 利比亚第纳尔 + + + 摩洛哥迪拉姆 + + + 摩洛哥法郎 + + + 摩尔多瓦列伊 + + + 马达加斯加阿里亚里 + + + 马达加斯加法郎 + + + 马其顿戴代纳尔 + + + 马里法郎 + + + 缅甸开亚特 + + + 蒙古图格里克 + + + 澳门元 + P + + + 毛里塔尼亚乌吉亚 + + + 马耳他里拉 + + + 马耳他镑 + + + 毛里求斯卢比 + + + 马尔代夫拉菲亚 + + + 马拉维克瓦查 + + + 墨西哥比索 + + + 墨西哥银比索 (1861-1992) + + + 墨西哥 Unidad de Inversion (UDI)(资金) + + + 马来西亚林吉特 + + + 莫桑比克埃斯库多 + + + 莫桑比克梅蒂卡尔 + + + 莫桑比克美提卡 + + + 纳米比亚元 + + + 尼日利亚奈拉 + + + 尼加拉瓜科多巴 + + + 尼加拉瓜金科多巴 + + + 荷兰盾 + + + 挪威克朗 + + + 尼泊尔卢比 + + + 新西兰元 + + + 阿曼里亚尔 + + + 巴拿马巴波亚 + + + 秘鲁印锑 + + + 秘鲁新索尔 + + + 秘鲁索尔 + + + 巴布亚新几内亚基那 + + + 菲律宾比索 + + + 巴基斯坦卢比 + + + 波兰兹罗提 + + + 波兰兹罗提 (1950-1995) + + + 葡萄牙埃斯库多 + + + 巴拉圭瓜拉尼 + + + 卡塔尔里亚尔 + + + 罗得西亚元 + + + 旧罗马尼亚列伊 + + + 罗马尼亚列伊 + + + 塞尔维亚第纳尔 + + + 俄国卢布 + + + 俄国卢布 (1991-1998) + + + 卢旺达法郎 + + + 沙特里亚尔 + SRl + + + 所罗门群岛元 + + + 塞舌尔卢比 + + + 苏丹第纳尔 + + + 苏丹镑 + + + 旧苏丹镑 + + + 瑞典克朗 + + + 新加坡元 + S$ + + + 圣赫勒拿镑 + + + 斯洛文尼亚托拉尔 + + + 斯洛伐克克朗 + + + 塞拉利昂利昂 + + + 索马里先令 + + + 苏里南元 + + + 苏里南盾 + + + 圣多美和普林西比多布拉 + + + 苏联卢布 + + + 萨尔瓦多科朗 + + + 叙利亚镑 + + + 斯威士兰里兰吉尼 + + + 泰铢 + + + 塔吉克斯坦卢布 + + + 塔吉克斯坦索莫尼 + + + 土库曼斯坦马纳特 + + + 突尼斯第纳尔 + + + 汤加潘加 + + + 帝汶埃斯库多 + + + 土耳其里拉 + + + 新土耳其里拉 + + + 特立尼达和多巴哥元 + + + 新台币元 + NT$ + + + 坦桑尼亚先令 + + + 乌克兰格里夫尼亚 + + + 乌克兰币 + + + 乌干达先令 (1966-1987) + + + 乌干达先令 + + + 美元 + + + 美元(次日) + + + 美元(当日) + + + 乌拉圭新比索 (1975-1993) + + + 乌拉圭比索 + + + 乌兹别克斯苏姆 + + + 委内瑞拉博利瓦 + + + Venezuelan Bolivar Fuerte + + + 越南盾 + + + 瓦努阿图瓦图 + + + 西萨摩亚塔拉 + + + 中非金融合作法郎 + + + + + + 黄金 + + + 欧洲复合单位 + + + 欧洲货币联盟 + + + 欧洲计算单位 (XBC) + + + 欧洲计算单位 (XBD) + + + 东加勒比元 + + + 特别提款权 + + + 欧洲货币单位 + + + 法国金法郎 + + + 法国 UIC 法郎 + + + 非洲金融共同体法郎 + + + + + + 太平洋法郎 + + + + + + RINET 基金 + + + 为测试保留的代码 + + + 货币未知或无效 + + + 也门第纳尔 + + + 也门里亚尔 + + + 南斯拉夫硬第纳尔 + + + 南斯拉夫偌威第纳尔 + + + 南斯拉夫可兑换第纳尔 + + + 南非兰特 (金融) + + + 南非兰特 + + + 赞比亚克瓦查 + + + 新扎伊尔 + + + 扎伊尔 + + + 津巴布韦元 + + + + + + {0}日 + + + {0}时 + + + {0}分 + + + {0}月 + + + {0}秒 + + + {0}周 + + + {0}年 + + + + + 是:确定 + 否:否定 + + + diff --git a/libs/Zend/Locale/Data/zh_CN.xml b/libs/Zend/Locale/Data/zh_CN.xml new file mode 100644 index 0000000..b558011 --- /dev/null +++ b/libs/Zend/Locale/Data/zh_CN.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/zh_HK.xml b/libs/Zend/Locale/Data/zh_HK.xml new file mode 100644 index 0000000..eb4ba99 --- /dev/null +++ b/libs/Zend/Locale/Data/zh_HK.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/zh_Hans.xml b/libs/Zend/Locale/Data/zh_Hans.xml new file mode 100644 index 0000000..605d7c4 --- /dev/null +++ b/libs/Zend/Locale/Data/zh_Hans.xml @@ -0,0 +1,10 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 東非 + 非洲南部 + 東亞 + 南亞 + 東南亞 + 南歐 + 澳洲與紐西蘭 + 美拉尼西亞 + 密克羅尼西亞 + 玻里尼西亞 + 中南亞 + 亞洲 + 中亞 + 西亞 + 歐洲 + 東歐 + 北歐 + 西歐 + 獨立國協 + 海峽群島 + 安道爾 + 阿拉伯聯合大公國 + 安地卡及巴布達 + 安圭拉島 + 阿爾巴尼亞 + 亞美尼亞 + 荷屬安地列斯 + 南極洲 + 美屬薩摩亞群島 + 奧地利 + 澳洲 + 阿路巴 + 亞蘭群島 + 亞塞拜然 + 波士尼亞與赫塞格維納 + 巴貝多 + 孟加拉 + 比利時 + 布吉納法索 + 保加利亞 + 蒲隆地 + 貝南 + 聖巴瑟米 + 百慕達 + 汶萊 + 玻利維亞 + 巴哈馬 + 布威島 + 波札那 + 白俄羅斯 + 貝里斯 + 可可斯群島 + 剛果民主共和國 + 中非共和國 + 剛果 + 科特迪瓦 + 庫克群島 + 喀麥隆 + 中華人民共和國 + 哥倫比亞 + 哥斯大黎加 + 塞爾維亞和蒙特尼哥羅 + 維德角 + 聖誕島 + 賽普勒斯 + 捷克共和國 + 德國 + 吉布地 + 丹麥 + 多明尼加 + 多明尼加共和國 + 阿爾及利亞 + 厄瓜多爾 + 愛沙尼亞 + 厄利垂亞 + 衣索比亞 + 芬蘭 + 斐濟 + 福克蘭群島 + 密克羅尼西亞群島 + 法羅群島 + 法國 + 加彭 + 英國 + 格瑞納達 + 喬治亞共和國 + 法屬圭亞那 + 根西島 + 迦納 + 直布羅陀 + 格陵蘭 + 甘比亞 + 幾內亞 + 哥德普洛 + 赤道幾內亞 + 希臘 + 南喬治亞與南三明治群島 + 瓜地馬拉 + 關島 + 幾內亞比索 + 蓋亞納 + 中華人民共和國香港特別行政區 + 赫德與麥克當諾群島 + 宏都拉斯 + 克羅埃西亞 + 印尼 + 愛爾蘭 + 曼島 + 英屬印度洋領土 + 冰島 + 義大利 + 澤西島 + 牙買加 + 約旦 + 肯亞 + 吉爾吉斯 + 吉里巴斯 + 科摩羅群島 + 聖克里斯多福及尼維斯 + 北韓 + 南韓 + 開曼群島 + 哈薩克 + 寮國 + 聖露西亞 + 列支敦斯登 + 斯里蘭卡 + 賴比瑞亞 + 賴索扥 + 盧森堡 + 拉脫維亞 + 利比亞 + 摩納哥 + 摩爾多瓦 + 蒙特內哥羅 + 聖馬丁 + 馬達加斯加 + 馬紹爾群島 + 馬其頓 + 馬利 + 緬甸 + 澳門 + 北馬里亞納群島 + 馬丁尼克島 + 茅利塔尼亞 + 蒙特色拉特島 + 馬爾他 + 模里西斯 + 馬爾地夫 + 馬拉威 + 馬來西亞 + 莫三比克 + 納米比亞 + 新喀里多尼亞群島 + 尼日 + 諾福克島 + 奈及利亞 + 荷蘭 + 尼泊爾 + 諾魯 + 紐威島 + 紐西蘭 + 阿曼王國 + 巴拿馬 + 秘魯 + 法屬玻里尼西亞 + 巴布亞紐幾內亞 + 菲律賓 + 波蘭 + 聖彼德與密啟崙 + 皮特康 + 巴勒斯坦 + 帛琉 + 卡達 + 大洋洲邊疆群島 + 歐盟 + 留尼旺 + 羅馬尼亞 + 塞爾維亞 + 俄羅斯 + 盧安達 + 沙烏地阿拉伯 + 索羅門群島 + 塞席爾 + 蘇丹 + 聖赫勒拿島 + 斯洛維尼亞 + 冷岸及央麥恩群島 + 獅子山 + 聖馬利諾 + 塞內加爾 + 索馬利亞 + 蘇利南 + 聖多美及普林西比 + 薩爾瓦多 + 敘利亞 + 史瓦濟蘭 + 土克斯及開科斯群島 + 查德 + 法國南屬地 + 多哥共和國 + 泰國 + 塔吉克 + 托克勞群島 + 東帝汶 + 土庫曼 + 突尼西亞 + 東加 + 千里達及托巴哥 + 吐瓦魯 + 臺灣 + 坦尚尼亞 + 烏克蘭 + 烏干達 + 美屬邊疆群島 + 美國 + 烏拉圭 + 烏茲別克 + 梵蒂岡 + 聖文森及格瑞那丁 + 委內瑞拉 + 英屬維京群島 + 美屬維京群島 + 萬那杜 + 瓦利斯和福杜納群島 + 薩摩亞群島 + 葉門 + 馬約特 + 尚比亞 + 辛巴威 + 未確定的區域 + + + 1901 + 1996 + 亞美尼亞東部 + 亞美尼亞西部 + IPA 拼音 + UPA 拼音 + 單音 + Natisone 方言 + 電腦 + 已修訂 + SAAHO + + + 日曆 + 校對 + 貨幣 + + + 繁體中文 (Big5) + 佛教曆法 + 農曆 + 直接順序 + 簡體中文 (GB2312) + 公曆 + 希伯來曆法 + 印度國家曆法 + 伊斯蘭曆法 + 伊斯蘭城市曆法 + 日本曆法 + 電話簿順序 + 拼音順序 + 中華民國曆 + 筆劃順序 + 傳統曆法 + + + 語言:{0} + 文字:{0} + 地區:{0} + + + + [一 丁 七 丈-不 且 世 丘 丙 丟 並 中 串 丸 丹 主 乃 久 么 之 乎 乏 乖 乘 乙 九 也 乾 亂 了 予 事 二 于 云 互 五 井 些 亞 亡 交 亦 亨 享 京 亮 人 什 仁 仇 今 介 仍 仔 他 付 仙 代-以 仰 仲 件 任 份 企 伊 伍 伐 休 伙 伯 估 伴 伸 似 伽 但 佈 位-住 佔 何 余 佛 作 你 佩 佳 使 來 例 供 依 侯 侵 便 係-俄 俊 俗 保 俠 信 修 俱 俾 個 倍 們 倒 候 倚 借 倫 值 假 偉 偏 做 停 健 側-偷 傑 備 傢 傲 傳 傷 傻 傾 僅 像 僑 僧 價 儀 億 儒 儘 優 允 元-充 兇-光 克 免 兒 兔 入 內-兩 八-兮 共 兵-典 兼 冊 再 冒 冠 冬 冰 冷 准 凌 凝 凡 凰 凱 出 函 刀 分 切 刊 列 初 判 別 利 刪 到 制 刷 刺 刻 則 前 剛 剩 剪 副 割 創 劃 劇 劉 劍 力 功 加 助-劫 勁 勇 勉 勒 動 務 勝 勞 勢 勤 勵 勸 勿 包 匈 化 北 匹 區 十 千 升 午 半 卒-協 南 博 卡 印 危 即 卷 卻 厄 厘 厚 原 厭 厲 去 參 又 及 友 反 叔 取 受 口-另 叫-叭 可 台 史 右 司 吃 各 合-吊 同-后 吐 向 君 吝-吟 否 吧 含 吳 吵 吸 吹 吾 呀 呂 呆 告 呢 周 味 呵 呼 命 和 咖 咦 咧 咪 咬 咱 哀 品 哇-哉 哎 員 哥 哦 哩 哪 哭 哲 唉 唐 唬 售 唯 唱 唷 唸 商 啊 問 啟 啡 啥 啦 啪 喀 喂 善 喇 喊 喔 喜 喝 喬 單 喵 嗎 嗚 嗨 嗯 嘆 嘉 嘗 嘛 嘴 嘻 嘿 器 噴 嚇 嚴 囉 四 回 因 困 固 圈 國 圍 園 圓 圖 團 圜 土 在 圭 地 圾 址 均 坎 坐 坡 坤 坦 坪 垂 垃 型 埃 城 埔 域 執 培 基 堂 堅 堆 堡 堪 報 場 塊 塔 塗 塞 填 塵 境 增 墨 墮 壁 壓 壘 壞 壢 士 壯 壽 夏 夕 外 多 夜 夠 夢 夥 大 天-夫 央 失 夷 夸 夾 奇-奉 奎 奏 契 奔 套 奧 奪 奮 女 奴 奶 她 好 如 妙 妥 妨 妮 妳 妹 妻 姆 姊 始 姐 姑 姓 委 姿 威 娃 娘 婁 婆 婚 婦 媒 媽 嫌 嫩 子 孔 字 存 孝 孟 季 孤 孩 孫 學 它 宅 宇-安 宋 完 宏 宗-宜 客-室 宮 害 家 容 宿 寂 寄 密 富 寒 寞 察 寢 實-審 寫 寬 寮 寶 封 射 將 專 尊 尋 對-小 少 尖 尚 尤 就 尺 尼 尾 局 屁 居 屆 屋 屏 展 屠 層 屬 山 岡 岩 岸 峰 島 峽 崇 崙 崴 嵐 嶺 川 州 巡 工-巨 巫 差 己 已 巴 巷 市 布 希 帕 帛 帝 帥 師 席 帳 帶 常 帽 幅 幕 幣 幫 干-年 幸 幹 幻-幾 床 序 底 店 府 度 座 庫 庭 康 庸 廉 廖 廠 廢 廣 廳 延 廷 建 弄 式 引 弗 弘 弟 弦 弱 張 強 彈 彊 彌 彎 彞 形 彥 彩 彬 彭 彰 影 役 彼 往 征 待 很 律 後 徐-徒 得 從 復 微 徵 德 徹 心 必 忌 忍 志-忙 忠 快 念 忽 怎 怒 怕 怖 思 怡 急 性 怨 怪 恆 恐 恢 恥 恨 恩 恭 息 恰 悅 悉 悔 悟 悠 您 悲 悶 情 惑 惜 惠 惡 惱 想 惹 愁 愈 愉 意 愚 愛 感 慈 態 慕 慘 慢 慣 慧 慮 慰 慶 慾 憂 憐 憑 憲 憶 憾 懂 應 懶 懷 懼 戀 戈 成-戒 或 截 戰 戲 戴 戶 房-扁 扇 手 才 扎 打 托 扣 扥 扭 扯 批 找-技 抄 把 抓 投 抗 折 披 抬 抱 抵 抹 抽 拆 拉 拋 拍 拒 拔 拖 招 拜 括 拳 拼 拾 拿 持 指 按 挑 挖 挪 振 挺 捐 捕 捨 捲 捷 掃 授 掉 掌 排 掛 採 探 接 控 推 措 描 提 插 揚 換 握 揮 援 損 搖 搞 搬 搭 搶 摘 摩 摸 撐 撒 撞 撣 撥 播 撾 撿 擁 擇 擊 擋 操 擎 擔 據 擠 擦 擬 擴 擺 擾 攝 支 收 改 攻 放 政 故 效 敍 敏 救 敗-教 敝 敢 散 敦 敬 整 敵 數 文 斐 斗 料 斯 新 斷 方 於 施 旁 旅 旋 族 旗 既 日 旦 早 旭 旺 昂 昆 昇 昌 明 昏 易 星 映 春 昨 昭 是 時 晉 晒 晚 晨 普 景 晴 晶 智 暑 暖 暗 暫 暴 曆 曉 曰 曲 更 書 曼 曾-最 會 月 有 朋 服 朗 望 朝 期 木 未-札 朱 朵 杉 李 材 村 杜 束 杯-東 松 板 析 林 果 枝 架 柏 某 染 柔 查 柬 柳 柴 校 核 根 格 桃 案 桌 桑 梁 梅 條 梨 梯 械 梵 棄 棉 棋 棒 棚 森 椅 植 椰 楊 楓 楚 業 極 概 榜 榮 構 槍 樂 樓 標 樞 模 樣 樹 橋 機 橫 檀 檔 檢 欄 權 次 欣 欲 欺 欽 款 歉 歌 歐 歡-武 歲 歷 歸 死 殊 殘 段 殺 殼 毀 毅 母 每 毒 比 毛 毫 氏 民 氣 水 永 求 汗 汝 江-污 汪 汶 決 汽 沃 沈 沉 沒 沖 沙 河 油 治 沿 況 泉 泊 法 泡 波 泥 注 泰 泳 洋 洗 洛 洞 洩 洪 洲 活 洽 派 流 浦 浩 浪 浮 海 涇-涉 涯 液 涵 涼 淑 淚 淡 淨 深 混 淺 清 減 渡 測 港 游 湖 湯 源 準 溝 溪 溫 滄 滅 滋 滑 滴 滾 滿 漂 漏 演 漠 漢 漫 漲 漸 潔 潘 潛 潮 澤 澳 激 濃 濟 濤 濫 濱 灌 灣 火 灰 災 炎 炮 炸 為 烈 烏 烤 無 焦 然 煙 煞 照 煩 熊 熟 熱 燃 燈 燒 營 爆 爐 爛 爪 爬 爭 爵 父 爸 爺 爽 爾 牆-版 牌 牙 牛 牠 牧 物 牲 特 牽 犧 犯 狀 狂 狐 狗 狠 狼 猛 猜 猶 獄 獅 獎 獨 獲 獸 獻 玄 率 玉 王 玩 玫 玲 玻 珊 珍 珠 班 現 球 理 琉 琪 琴 瑙 瑜 瑞 瑟 瑤 瑪 瑰 環 瓜 瓦 瓶 甘 甚 甜 生 產 用 田-申 男 甸 界 留 畢 略 番 畫 異 當 疆 疏 疑 疼 病 痕 痛 痴 瘋 療 癡 登-百 的 皆 皇 皮 盃 益 盛 盜 盟 盡 監 盤 盧 目 盲 直 相 盼 盾 省 眉 看 真 眠 眼 眾 睛 睡 督 瞧 瞭 矛 矣 知 短 石 砂 砍 研 砲 破 硬 碎 碗 碟 碧 碩 碰 確 碼 磁 磨 磯 礎 礙 示 社 祕 祖 祝 神 祥 票 禁 禍 福 禪 禮 秀 私 秋 科 秒 秘 租 秤 秦 移 稅 程 稍 種 稱 稿 穆 穌 積 穩 究 穹 空 穿 突 窗 窩 窮 立 站 竟 章 童 端 競 竹 笑 笛 符 笨 第 筆 等 筋 答 策 简 算 管 箭 箱 節 範 篇 築 簡 簫 簽 簿 籃 籌 籍 米 粉 粗 精 糊 糕 糟 系 糾 紀 約 紅 納 紐 純 紙-紛 素 索 紫 累 細 紹 終 組 結 絕 絡 給 統 絲 經 綜 綠 維 綱 網 緊 緒 線 緣 編 緩 緬 緯 練 縣 縮 縱 總 績 繁 織 繞 繪 繳 繼 續 缸 缺 罕 罪 置 罰 署 罵 罷 羅 羊 美 羞 群 義 羽 翁 習 翔 翰 翹 翻 翼 耀 老 考 者 而 耍 耐 耗 耳 耶 聊 聖 聚 聞 聯 聰 聲 職 聽 肉 肚 股 肥 肩 肯 育 背 胎 胖 胞 胡 胸 能 脆 脫 腓 腔 腦 腰 腳 腿 膽 臉 臘 臣 臥 臨 自 臭 至 致 臺 與-舊 舌 舍 舒 舞 舟 航 般 船 艦 良 色 艾 芝 芬 花 芳 若 苦 英 茅 茫 茲 茶 草 荒 荷 莉 莊 莎 莫 菜 菩 華 菲 萄 萊 萬 落 葉 著 葛 葡 蒂 蒙 蒲 蒼 蓋 蓮 蔕 蔡 蔣 蕭 薄 薦 薩 薪 藉 藍 藏 藝 藤 藥 蘆 蘇 蘭 虎 處 虛 號 虧 蛋 蛙 蜂 蜜 蝶 融 螢 蟲 蟹 蠍 蠻 血 行 術 街 衛 衝 衡 衣 表 袋 被 裁 裂 裕 補 裝 裡 製 複 褲 西 要 覆 見 規 視 親 覺 覽 觀 角 解 觸 言 訂 計 訊 討 訓 託 記 訪 設 許 訴 註 証 評 詞 詢 試 詩 話-詳 誇 誌 認 誓 誕 語 誠 誤 說 誰 課 誼 調 談 請 諒 論 諸 諺 諾 謀 謂 講 謝 證 識 譜 警 譯 議 護 譽 讀 變 讓 讚 谷 豆 豈 豐 象 豪 豬 貌 貓 貝 貞 負-貢 貨 貪-責 貴 買 費 貼 賀 資 賈 賓 賜 賞 賢-賤 賦 質 賭 賴 賺 購 賽 贈 贊 贏 赤 赫 走 起 超 越 趕 趙 趣 趨 足 跌 跎 跑 距 跟 跡 路 跳 踏 踢 蹟 蹤 躍 身 躲 車 軌 軍 軒 軟 較 載 輔 輕 輛 輝 輩 輪 輯 輸 轉 轟 辛 辦 辨 辭 辯 辱 農 迅 迎 近 迦 迪 迫 述 迴 迷 追 退 送 逃 逆 透 逐 途 這-逛 逝 速 造 逢 連 週 進 逸 逼 遇 遊 運 遍 過 道-違 遙 遜 遠 適 遭 遮 遲 遷 選 遺 避-邁 還 邊 邏 那 邦 邪 邱 郎 部 郭 郵 都 鄂 鄉 鄭 鄰 配 酒 酷 酸 醉 醒 醜 醫 采 釋-量 金 針 釣 鈴 銀 銖 銘 銳 銷 鋒 鋼 錄 錢 錦 錫 錯 鍋 鍵 鍾 鎊 鎖 鎮 鏡 鐘 鐵 鑑 長 門 閃 閉 開 閒 間 閣 閱 闆 闊 闐 關 闡 防 阻 阿 陀 附 降 限 院-除 陪 陰 陳 陵-陸 陽 隆 隊 階 隔 際 障 隨 險 隱 隻 雄-集 雖 雙 雜 雞 離 難 雨 雪 雲 零 雷 電 需 震 霍 霧 露 霸 霹 靂 靈 青 靖 靜 非 靠 面 革 靼 鞋 韃 韋 韓 音 韻 響 頁 頂 項 順 須 預 頑 頓 頗 領 頭 頻 顆 題 額 顏 願 類 顧 顯 風 飄 飛 食 飯 飲 飽 飾 餅 養 餐 餘 館 首 香 馬 駐 駕 駛 騎 騙 騷 驅 驗 驚 骨 體 高 髮 鬆 鬥 鬧 鬱 鬼 魁 魂 魅 魔 魚 魯 鮮 鳥 鳳 鳴 鴻 鵝 鷹 鹿 麗 麥 麵 麻 麼 黃 黎 黑 默 點 黨 鼓 鼠 鼻 齊 齋 齒 齡 龍 龜] + [伏 侶 兌 兹 别 勳 卑 占 叶 堤 墎 奥 孜 峇 巽 彝 彞 敍 楔 渾 燦 狄 琳 瑚 甫 礁 简 芒 苗 茨 蚩 蜀 隴] + + + + + + + + + + + 上午 + 下午 + + + + EEEEy'x'G-Ml-d + + + + + + + + + 1月 + 2月 + 3月 + 4月 + 5月 + 6月 + 7月 + 8月 + 9月 + 10月 + 11月 + 12月 + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + 1月 + 2月 + 3月 + 4月 + 5月 + 6月 + 7月 + 8月 + 9月 + 10月 + 11月 + 12月 + + + + + + + 週日 + 週一 + 週二 + 週三 + 週四 + 週五 + 週六 + + + + + + + + + 第1季 + 第2季 + 第3季 + 第4季 + + + + + + 西元前 + 西元 + + + + + + yyyy/M/d + + + + + yyyy/M/d + + + + + + + ahh時mm分ss秒v + + + + + ahh時mm分ss秒z + + + + + ah:mm:ss + + + + + + d日(E) + H:mm + H:mm:ss + M-d(E) + MM/dd + M/d + yyyy/M + yyyy/M/d(EEE) + yyyy年M月 + yyyy年M月 + yyyy/MM + + + {0}至{1} + + + + M/dE至M/dE + M/dE至M/dE + + + LLLL至LLLL + + + M/d至M/d + M/d至M/d + + + ah時至ah時 + ah時至h時 + + + vah:mm至ah:mm + vah:mm至h:mm + vah:mm至h:mm + + + vah時至ah時 + vah時至h時 + + + yyyy/M至yyyy/M + yyyy/M至yyyy/M + + + yyyy/M/dE至yyyy/M/dE + yyyy/M/dE至yyyy/M/dE + yyyy/M/dE至yyyy/M/dE + + + yyyy年M月至M月 + yyyy/M至yyyy/M + + + yyyy/M/d至yyyy/M/d + yyyy/M/d至yyyy/M/d + yyyy/M/d至yyyy/M/d + + + + + + 年代 + + + + + + 後天 + 大後天 + 大前天 + + + 週天 + + + 小時 + + + 分鐘 + + + + + + 區域 + + + + + 上午 + 下午 + + + 民國前 + 民國 + + + + + + Gy/M/d + + + + + Gy/M/d + + + + + + + +HH:mm;-HH:mm + 格林威治標準時間{0} + {0}時間 + {1}({0}) + + 未知地區 + + + 安道爾 + + + 杜拜 + + + 阿富汗 + + + 安地卡及巴布達 + + + 安吉拉 + + + 阿爾巴尼亞 + + + 亞美尼亞 + + + 荷屬安地列斯 + + + 安哥拉 + + + 羅瑟拉 + + + 帕麥 + + + 南極 + + + 昭和 + + + 戴維斯 + + + 莫斯托克 + + + 凱西 + + + 杜蒙杜爾維爾 + + + 麥克馬多 + + + 加拉哥斯 + + + 門多薩 + + + 聖胡安 + + + 烏斯懷亞 + + + 拉略哈 + + + 聖路易 + + + 卡塔馬卡 + + + 胡韋 + + + 吐庫曼 + + + 哥多華 + + + 布宜諾斯艾利斯 + + + 派哥派哥 + + + 奧地利 + + + 伯斯 + + + 達爾文 + + + 阿得雷德 + + + 斷丘市 + + + 克黎 + + + 墨爾本 + + + 荷巴特 + + + 雪梨 + + + 布利斯班 + + + 羅豪島 + + + 阿魯巴 + + + 奧蘭群島 + + + 亞塞拜然 + + + 沙拉耶佛 + + + 巴貝多 + + + 孟加拉 + + + 布魯塞爾 + + + 布吉納法索 + + + 保加利亞 + + + 蒲隆地 + + + 貝南 + + + 百慕達 + + + 汶萊 + + + 玻利維亞 + + + 艾魯內佩 + + + 布蘭科 + + + 維留港 + + + 保維斯塔 + + + 瑪瑙斯 + + + 古雅巴 + + + 格蘭場 + + + 貝倫 + + + 阿拉圭那 + + + 聖保羅 + + + 巴伊阿 + + + 福塔力莎 + + + 馬瑟歐 + + + 雷西非 + + + 諾倫哈 + + + 巴哈馬 + + + 不丹 + + + 波札那 + + + 白俄羅斯 + + + 貝里斯 + + + 道生河 + + + 懷特霍斯 + + + 伊奴維克 + + + 溫哥華 + + + 道生灣 + + + 耐羅耐佛 + + + 艾德蒙吞 + + + 瑞夫卡倫特 + + + 劍橋灣 + + + 利宅那 + + + 溫尼伯 + + + 羅斯魯特 + + + 雨河鎮 + + + 蘭今灣 + + + 珊德灣 + + + 尼皮岡 + + + 多倫多 + + + 蒙特婁 + + + 伊魁特 + + + 潘尼爾東 + + + 蒙克頓 + + + 哈里法克斯 + + + 鵝灣 + + + 格雷斯貝 + + + 白朗薩布隆 + + + 聖約翰 + + + 科科斯群島 + + + 金夏沙 + + + 蘆佈巴西 + + + 中非共和國 + + + 剛果共和國 + + + 瑞士 + + + 象牙海岸 + + + 拉洛東加島 + + + 復活島 + + + 聖地牙哥 + + + 喀麥隆 + + + 喀什米爾 + + + 烏魯木齊 + + + 重慶 + + + 哈爾濱 + + + 哥倫比亞 + + + 哥斯大黎加 + + + 古巴 + + + 維德角 + + + 聖誕島 + + + 塞浦勒斯 + + + 捷克 + + + 德國 + + + 吉布地 + + + 丹麥 + + + 多明尼加 + + + 多明尼加共和國 + + + 阿爾及利亞 + + + 加拉巴哥群島 + + + 瓜亞基爾 + + + 愛沙尼亞 + + + 埃及 + + + 西撒哈拉 + + + 厄利垂亞 + + + 加納利 + + + 休達 + + + 馬德里 + + + 衣索比亞 + + + 芬蘭 + + + 斐濟 + + + 史坦萊 + + + 土魯克群島 + + + 波納佩 + + + 科斯里 + + + 法羅群島 + + + 加彭 + + + 倫敦 + + + 格瑞納達 + + + 喬治亞 + + + 法屬蓋亞那 + + + 根息 + + + 迦納 + + + 直布羅陀 + + + 杜里 + + + 高特哈市 + + + 斯可比海峽 + + + 丹馬沙文 + + + 斑竹 + + + 幾內亞 + + + 瓜德羅普 + + + 赤道幾內亞 + + + 希臘 + + + 南喬治亞與南三明治島 + + + 瓜地馬拉 + + + 關島 + + + 幾內亞比索 + + + 圭亞那 + + + 中華人民共和國香港特別行政區 + + + 德古斯加巴 + + + 克羅埃西亞 + + + 海地 + + + 匈牙利 + + + 雅加達 + + + 馬卡沙爾 + + + 加亞布拉 + + + 愛爾蘭 + + + 印度 + + + 英屬印度洋領地 + + + 伊拉克 + + + 伊朗 + + + 冰島 + + + 羅馬 + + + 牙買加 + + + 約旦 + + + 東京 + + + 奈洛比 + + + 吉爾吉斯 + + + 柬埔寨 + + + 恩得伯理島 + + + 吉里巴斯 + + + 科摩羅群島 + + + 聖啟斯與尼維斯 + + + 北韓 + + + 首爾 + + + 開曼 + + + 艾克陶 + + + 奧拉爾 + + + 阿克糾賓 + + + 奎茲羅答 + + + 阿拉木圖 + + + 寮國 + + + 貝鲁特特 + + + 聖露西亞 + + + 列支敦斯登 + + + 可倫坡 + + + 蒙羅維亞 + + + 賴索托 + + + 立陶宛 + + + 盧森堡 + + + 拉脫維亞 + + + 利比亞 + + + 卡薩布蘭卡 + + + 摩納哥 + + + 奇西瑙 + + + 波多里察 + + + 馬達加斯加 + + + 瓜加林島 + + + 馬朱諾 + + + 斯科普耶 + + + 巴馬科 + + + 緬甸 + + + 烏蘭巴托 + + + 卓巴爾塞 + + + 中華人民共和國澳門特別行政區 + + + 北馬里亞納群島 + + + 馬丁尼克 + + + 茅利塔尼亞 + + + 蒙賽拉特 + + + 馬爾他 + + + 模里西斯 + + + 馬爾地夫 + + + 馬拉威 + + + 提華納 + + + 厄莫休 + + + 馬薩特蘭 + + + 奇華華 + + + 蒙特瑞 + + + 墨西哥市 + + + 美里達 + + + 康庫 + + + 古晉 + + + 莫三比克 + + + 溫荷克 + + + 新喀里多尼亞 + + + 尼日 + + + 諾福克群島 + + + 奈及利亞 + + + 尼加拉瓜 + + + 荷蘭 + + + 奧斯陸 + + + 尼泊爾 + + + 諾魯 + + + 紐埃 + + + 查坦 + + + 奧克蘭 + + + 阿曼 + + + 巴拿馬 + + + 秘魯 + + + 大溪地 + + + 馬可薩斯島 + + + 岡必爾群島 + + + 巴布亞新幾內亞 + + + 菲律賓 + + + 喀拉蚩 + + + 波蘭 + + + 聖皮里及米圭隆 + + + 匹特開恩群島 + + + 加薩 + + + 亞速爾群島 + + + 馬得拉群島 + + + 帛琉 + + + 巴拉圭 + + + 卡達 + + + 留尼旺島 + + + 塞爾維亞 + + + 加里寧格勒 + + + 伏爾加格勒 + + + 沙馬拉 + + + 葉卡捷林堡 + + + 新西伯利亞 + + + 克拉斯諾雅斯克 + + + 伊爾庫次克 + + + 雅庫次克 + + + 海參崴 + + + 庫頁島 + + + 馬加丹 + + + 堪查加 + + + 阿那底河 + + + 盧安達 + + + 利雅德 + + + 瓜達卡納 + + + 塞席爾 + + + 卡土穆 + + + 斯德哥爾摩 + + + 聖赫勒拿島 + + + 斯洛維尼亞 + + + 隆意耳拜恩 + + + 布拉提拉瓦 + + + 獅子山 + + + 聖馬利諾 + + + 塞內加爾 + + + 摩加迪休 + + + 巴拉馬利波 + + + 聖多美普林西比 + + + 薩爾瓦多 + + + 敘利亞 + + + 史瓦濟蘭 + + + 土克斯和開卡斯群島 + + + 恩加納美 + + + 克格連群島 + + + 多哥 + + + 泰國 + + + 塔吉克 + + + 托克勞 + + + 東帝汶 + + + 土庫曼 + + + 坦尚尼亞 + + + 東加 + + + 伊斯坦堡 + + + 千里達 + + + 吐瓦魯 + + + 台灣 + + + 尚尼亞 + + + 烏茲哥洛 + + + 基輔 + + + 辛非洛浦 + + + 札波羅結 + + + 康培拉 + + + 中途島 + + + 強斯頓 + + + 艾達克 + + + 諾姆 + + + 安克里治 + + + 雅庫塔 + + + 朱諾 + + + 洛杉磯 + + + 波伊斯 + + + 鳳凰城 + + + 船岩峰 + + + 紐沙倫,北達科他州 + + + 申特城 + + + 美諾米克 + + + 溫森斯 + + + 彼得堡,印第安那州 + + + 泰爾城 + + + 諾克斯 + + + 威納麥克,印第安那州 + + + 馬倫哥 + + + 印第安那波里斯 + + + 路易斯維爾 + + + 維威 + + + 蒙提瑟洛 + + + 紐約 + + + 烏拉圭 + + + 撒馬爾罕 + + + 梵蒂岡 + + + 聖文森 + + + 卡拉卡斯 + + + 托托拉島 + + + 美屬維京群島 + + + 越南 + + + 愛發提 + + + 瓦利斯與富圖納群島 + + + 亞庇 + + + 葉門 + + + 馬約特島 + + + 南非 + + + 尚比亞 + + + 辛巴威 + + + + 艾克時間 + 艾克夏令時間 + + + ACT(艾克) + ACST(艾克) + + + + + 中非時間 + + + + + 東非時間 + + + + + 南非標準時間 + + + + + 西非時間 + 西非夏令時間 + + + + + 阿克秋賓斯克時間 + 阿克秋賓斯克夏令時間 + + + + + 阿拉斯加時間 + 阿拉斯加標準時間 + 阿拉斯加夏令時間 + + + AKST + AKDT + + + + + 阿拉斯加-夏威夷時間 + 阿拉斯加-夏威夷標準時間 + 阿拉斯加-夏威夷夏令時間 + + + + + 阿拉木圖時間 + 阿拉木圖夏令時間 + + + + + 亞馬遜時間 + 亞馬遜夏令時間 + + + + + 中部時間 + 中部標準時間 + 中部夏令時間 + + + + + 東部時間 + 東部標準時間 + 東部夏令時間 + + + + + 山區時間 + 山區標準時間 + 山區日光節約時間 + + + + + 太平洋時間 + 太平洋標準時間 + 太平洋夏令時間 + + + + + 阿克陶標準時間 + 阿克陶夏令時間 + + + AQTT (阿克陶) + AQTST (阿克陶) + + + + + 阿克托比時間 + 阿克托比夏令時間 + + + AQTT (阿克托比) + AQTST (阿克托比) + + + + + 阿拉伯時間 + 阿拉伯標準時間 + 阿拉伯夏令時間 + + + AT(阿拉伯) + AST(阿拉伯) + ADT (阿拉伯) + + + + + 阿根廷時間 + 阿根廷夏令時間 + + + + + 阿根廷西部時間 + 阿根廷西部時間 + 阿根廷西部夏令時間 + + + + + 亞美尼亞時間 + 亞美尼亞夏令時間 + + + AMT(亞美尼亞) + AMST(亞美尼亞) + + + + + 阿什哈巴德時間 + 阿什哈巴德夏令時間 + + + + + 大西洋時間 + 大西洋標準時間 + 大西洋夏令時間 + + + + + 澳洲中部時間 + 澳洲中部標準時間 + 澳洲中部夏令時間 + + + + + 澳洲東部時間 + 澳洲東部標準時間 + 澳洲東部夏令時間 + + + + + 澳洲西部時間 + 澳洲西部標準時間 + 澳洲西部夏令時間 + + + + + 亞塞拜然時間 + 亞塞拜然夏令時間 + + + + + 亞速爾群島時間 + 亞速爾群島夏令時間 + + + + + 巴庫時間 + 巴庫夏令時間 + + + + + 孟加拉時間 + + + + + 白令時間 + 白令標準時間 + 白令夏令時間 + + + BT(白令) + BST(白令) + BDT(白令) + + + + + 不丹時間 + + + + + 婆羅洲時間 + 婆羅洲夏令時間 + + + + + 巴西利亞時間 + 巴西利亞時間 + 巴西利亞夏令時間 + + + + + 長白山時間 + + + + + 智利時間 + 智利時間 + 智利夏令時間 + + + + + 中國時間 + 中國標準時間 + 中國夏令時間 + + + CT(中國) + CST(中國) + CDT(中國) + + + + + 喬巴山時間 + 喬巴山夏令時間 + + + + + CST(古巴) + CDT(古巴) + + + + + 達卡時間 + + + + + 杜尚別時間 + 杜尚別夏令時間 + + + + + 荷屬圭亞那時間 + 荷屬圭亞那時間 + 荷屬圭亞那夏令時間 + + + + + 東帝汶時間 + + + + + 厄瓜多時間 + + + + + 中歐標準時間 + 中歐夏令時間 + + + + + 東歐標準時間 + 東歐夏令時間 + + + + + 西歐時間 + 西歐夏令時間 + + + + + 伏龍芝時間 + 伏龍芝夏令時間 + + + + + 格林威治標準時間 + + + + + 加拉帕戈群島時間 + + + + + 喬治亞時間 + 喬治亞夏令時間 + + + + + 格陵蘭中部時間 + 格陵蘭中部夏令時間 + + + + + 格陵蘭東部時間 + 格陵蘭東部時間 + 格陵蘭東部夏令時間 + + + + + 格陵蘭西部時間 + 格陵蘭西部時間 + 格陵蘭西部夏令時間 + + + + + 關島標準時間 + + + GST (關島) + + + + + 夏威夷-阿留申標準時間 + + + + + 印度標準時間 + + + + + 印尼中部時間 + + + + + 印尼東部時間 + + + + + 印尼西部時間 + + + + + 以色列時間 + 以色列標準時間 + 以色列夏令時間 + + + IST(以色列) + + + + + 日本標準時間 + 日本夏令時間 + + + + + 喀拉蚩時間 + + + + + 喀什時間 + + + + + 東哈薩克時間 + 東哈薩克標準時間 + + + + + 西哈薩克時間 + 西哈薩克標準時間 + + + + + 吉力羅達時間 + 吉力羅達夏令時間 + + + + + 韓國時間 + 韓國標準時間 + 韓國夏令時間 + + + + + 古比雪夫時間 + 古比雪夫夏令時間 + + + + + 瓜加林環礁時間 + + + + + 吉爾吉斯時間 + + + + + 蘭卡時間 + + + + + 隴蜀時間 + + + + + 豪勳爵島時間 + 豪勳爵島標準時間 + 豪勳爵島夏令時間 + + + + + 澳門時間 + 澳門夏令時間 + + + + + 馬來亞時間 + + + + + 馬來西亞時間 + + + + + 馬紹爾群島時間 + + + + + 烏蘭巴托時間 + 烏蘭巴托夏令時間 + + + + + 紐西蘭時間 + 紐西蘭標準時間 + 紐西蘭夏令時間 + + + + + 紐芬蘭時間 + 紐芬蘭標準時間 + 紐芬蘭夏令時間 + + + + + 北馬里亞納群島時間 + + + + + 巴基斯坦時間 + 巴基斯坦夏令時間 + + + + + 聖彼德與密啟崙時間 + 聖彼德與密啟崙標準時間 + 聖彼德與密啟崙夏令時間 + + + + + 克孜勒奧爾達時間 + 克孜勒奧爾達夏令時間 + + + + + 薩馬拉時間 + 薩馬拉夏令時間 + + + + + 撒馬爾罕時間 + 撒馬爾罕夏令時間 + + + SAMT(撒馬爾罕) + SAMST(撒馬爾罕) + + + + + 薩摩亞標準時間 + + + + + 舍甫琴科時間 + + + + + 蘇利南時間 + 蘇利南時間 + + + + + 斯維爾德洛夫斯克時間 + 斯維爾德洛夫斯克夏令時間 + + + + + 塔吉克時間 + + + + + 塔什干時間 + 塔什干夏令時間 + + + + + 第比利斯時間 + 第比利斯夏令時間 + + + + + 土耳其時間 + 土耳其夏令時間 + + + + + 土庫曼時間 + 土庫曼夏令時間 + + + + + 烏拉斯克時間 + 烏拉斯克夏令時間 + + + + + 烏魯木齊時間 + + + + + 烏茲別克時間 + 烏茲別克夏令時間 + + + + + 凱薩琳堡時間 + 凱薩琳堡夏令時間 + + + + + 葉里溫時間 + 葉里溫夏令時間 + + + + + 育空時間 + 育空標準時間 + 育空夏令時間 + + + + + + + + 安道爾陪士特 + + + 阿拉伯聯合大公國迪爾汗 + + + Af + + + 阿爾巴尼亞列克 + lek + + + 亞美尼亞德拉姆 + dram + + + 荷屬安地列斯盾 + NA f. + + + 安哥拉寬扎 + + + 安哥拉寬扎(1977-1990) + + + 安哥拉新寬扎 (1990-2000) + + + 安哥拉新寬扎 Reajustado (1995-1999) + + + 阿根廷奧斯特納爾 + + + 阿根廷披索(1983-1985) + + + 阿根廷披索 + Arg$ + + + 奧地利先令 + + + 澳幣 + $A + + + 阿魯巴盾 + + + 阿塞拜彊馬特納 + + + 亞塞拜然蒙納特 + + + 波士尼亞-黑塞哥維那第納爾 + + + 波士尼亞-黑塞哥維那可轉換馬克 + KM + + + 巴貝多元 + BDS$ + + + 孟加拉塔卡 + Tk + + + 比利時法郎 (可轉換) + + + 比利時法郎 + BF + + + 比利時法郎 (金融) + + + 保加利亞硬列弗 + lev + + + 保加利亞新列弗 + + + 巴林第納爾 + BD + + + 蒲隆地法郎 + Fbu + + + 百慕達幣 + Ber$ + + + 汶萊元 + + + 玻利維亞貨幣單位 + Bs + + + 玻利維亞披索 + + + 玻利維亞幕多 + + + 巴西克魯薩多農瓦(1967-1986) + + + 巴西克魯賽羅 (1986-1989) + + + 巴西克魯賽羅 (1990-1993) + + + 巴西里拉 + + + 巴西克如爾達農瓦 + + + 巴西克魯賽羅 + + + 巴哈馬元 + + + 不丹那特倫 + Nu + + + 緬甸元 BUK + + + 波札那 - 普拉 + + + 白俄羅斯新盧布 (1994-1999) + + + 白俄羅斯盧布 + Rbl + + + 伯利茲元 + BZ$ + + + 加幣 + Can$ + + + 剛果法郎 + + + WIR 歐元 + + + SwF + + + WIR 法郎 + + + 卡林油達佛曼跎 + + + 智利披索 + Ch$ + + + 人民幣 + + + 哥倫比亞披索 + Col$ + + + 哥斯大黎加科郎 + C + + + 舊塞爾維亞第納爾 + + + 捷克斯洛伐克硬克朗 + + + 古巴披索 + + + 維德角埃斯庫多 + CVEsc + + + 賽浦路斯鎊 + £C + + + 捷克克朗 + + + 東德奧斯特馬克 + + + 德國馬克 + + + 吉布地法郎 + DF + + + 丹麥克羅納 + DKr + + + 多明尼加披索 + RD$ + + + 阿爾及利亞第納爾 + DA + + + 厄瓜多蘇克雷 + + + 厄瓜多爾由里達瓦康斯坦 (UVC) + + + 愛沙尼亞克朗 + + + 埃及鎊 + + + 埃奎維勒 + + + 厄立特里亞納克法 + + + 西班牙比塞塔(會計單位) + + + 西班牙比塞塔(可轉換會計單位) + + + 西班牙陪士特 + + + + 衣索比亞比爾 + Br + + + 歐元 + EUR + + + 芬蘭馬克 + + + 斐濟元 + F$ + + + 福克蘭群島鎊 + + + 法國法郎 + + + 英鎊 + GBP + + + 喬治庫旁拉里 + + + 喬治拉里 + lari + + + 迦納仙蔕 + + + GH¢ + + + 直布羅陀鎊 + + + 甘比亞達拉西 + + + 幾內亞法郎 + GF + + + 幾內亞西里 + + + 赤道幾內亞埃奎勒 + + + 希臘德拉克馬 + + + 瓜地馬拉格查爾 + Q + + + 葡屬幾內亞埃斯庫多 + + + 幾內亞披索披索 + + + 圭亞那元 + G$ + + + 港幣 + + + 洪都拉斯倫皮拉 + L + + + 克羅地亞第納爾 + + + 克羅地亞庫納 + + + 匈牙利 - 福林 + Ft + + + 印尼 - 盧布 + Rp + + + 愛爾蘭鎊 + IR£ + + + 以色列鎊 + + + 以色列新謝克爾 + + + 印度盧布 + 0≤Rs.|1≤Re.|1<Rs. + + + 伊拉克第納爾 + ID + + + 伊朗里亞爾 + RI + + + 冰島克朗 + + + 義大利里拉 + + + + 牙買加元 + J$ + + + 約旦第納爾 + JD + + + 日圓 + + + 肯尼亞先令 + K Sh + + + 吉爾吉斯索馬 + som + + + 柬埔寨瑞爾 + CR + + + 科摩羅法郎 + CF + + + 北朝鮮幣 + + + 韓國圜 + KRW + + + 科威特第納爾 + KD + + + 開曼群島美元 + + + 卡扎克斯坦坦吉 + T + + + 寮國基普 + + + 黎巴嫩鎊 + LL + + + 斯里蘭卡盧布 + SL Re + + + 賴比瑞亞元 + + + 賴索托羅蒂 + M + + + 馬洛蒂 + + + 立陶宛里塔 + + + 立陶宛特羅 + + + 盧森堡可兌換法郎 + + + 盧森堡法郎 + + + 盧森堡金融法郎 + + + 拉脫維亞拉特銀幣 + + + 拉脫維亞盧布 + + + 利比亞第納爾 + LD + + + 摩杜雲列伊 + + + 馬達加斯加艾瑞爾 + + + 馬達加斯加法郎 + + + 馬其頓第納爾 + MDen + + + 馬里法郎 + + + 緬甸元 + + + 蒙古圖格里克 + Tug + + + 澳門元 + MOP + + + 茅利塔尼亞烏吉亞 + UM + + + 馬爾他里拉 + Lm + + + 馬爾他鎊 + + + 模里西斯盧布 + + + 馬爾地夫海島盧非亞 + + + 馬拉維克瓦查 + MK + + + 墨西哥 - 披索 + MEX$ + + + 墨西哥銀披索 (1861-1992) + + + 墨西哥轉換單位(UDI) + + + 馬來西亞 - 林吉特 + RM + + + 莫桑比克埃斯庫多 + + + 莫三比克梅蒂卡爾 + Mt + + + MTn + + + 納米比亞元 + N$ + + + 奈及利亞奈拉 + + + 尼加拉瓜金科多巴 + + + 荷蘭盾 + + + 挪威克羅納 + NKr + + + 尼泊爾盧布 + Nrs + + + 紐西蘭幣 + $NZ + + + 阿曼里奧 + RO + + + 巴拿馬巴波亞 + + + 祕魯因蒂 + + + 秘魯新太陽幣 + + + 秘魯太陽幣 + + + 巴布亞紐幾內亞基那 + + + 菲律賓披索 + Php + + + 巴基斯坦盧布 + Pra + + + 波蘭茲羅提 + Zl + + + 波蘭茲羅提 (1950-1995) + + + 葡萄牙埃斯庫多 + + + 巴拉圭瓜拉尼 + + + 卡達爾里亞爾 + QR + + + 羅德西亞元 + + + 舊羅馬尼亞列伊 + + + 羅馬尼亞列伊 + 0≤lei|1≤leu|1 + + + 俄羅斯盧布 + + + 俄羅斯盧布 (1991-1998) + + + 盧安達法郎 + + + 沙烏地里雅 + + + 索羅門群島元 + SI$ + + + 塞舌爾群島盧布 + SR + + + 蘇丹第納爾 + + + 蘇丹鎊 + + + 瑞典克羅納 + SKr + + + 新加坡幣 + SGD + + + 聖赫勒拿鎊 + + + 斯洛維尼亞托勒 + + + 斯洛伐克克朗 + Sk + + + 獅子山利昂 + + + 索馬利亞先令 + Sh. + + + 蘇利南元 + + + 蘇里南盾 + Sf + + + 聖多美島和普林西比島多布拉 + Db + + + 蘇聯盧布 + + + 薩爾瓦多科郎 + + + 敘利亞鎊 + LS + + + 史瓦濟蘭里朗吉尼 + E + + + 泰銖 + + + 塔吉克斯坦盧布 + + + 塔吉克索莫尼 + + + 土庫曼馬納特 + + + 突尼西亞第納爾 + + + 東加潘加 + T$ + + + 帝汶埃斯庫多 + + + TL + + + 千里達及托巴哥元 + TT$ + + + 新臺幣 + + + 坦尚尼亞先令 + T Sh + + + 烏克蘭格里夫那 + + + 烏克蘭卡本瓦那茲 + + + 烏干達先令 (1966-1987) + + + 烏干達先令 + U Sh + + + $ + + + 美元 (第二天) + + + 美元 (同一天) + + + 烏拉圭披索 (1975-1993) + + + 烏拉圭披索 + Ur$ + + + 烏茲別克斯坦薩木 + + + 委內瑞拉博利瓦 + Be + + + BsF + + + 萬那杜萬杜 + VT + + + 西薩摩亞塔拉 + + + 西非法郎 BEAC + + + XAG + + + 黃金 + + + 歐洲綜合單位 + + + 歐洲貨幣單位 XBB + + + 歐洲會計單位(XBC) + + + 歐洲會計單位(XBD) + + + 格瑞那達元 + EC$ + + + 特殊提款權 + + + 歐洲貨幣單位 XEU + + + 法國金法郎 + + + 法國 UIC 法郎 + + + 西非法郎 BCEAO + + + 帕拉狄昂 + + + CFP 法郎 + CFPF + + + 白金 + + + XTS + + + XXX + + + 葉門第納爾 + + + 也門里亞爾 + YRl + + + 南斯拉夫第納爾硬幣 + + + 南斯拉夫挪威亞第納爾 + + + 南斯拉夫 可轉換第納爾 + + + 南非 - 蘭特 (金融) + + + 南非蘭特 + R + + + 尚比亞克瓦查 + + + 薩伊新扎伊爾 + + + 扎伊爾扎伊爾 + + + 辛巴威元 + Z$ + + + + + + 是:確定 + + + diff --git a/libs/Zend/Locale/Data/zh_Hant_HK.xml b/libs/Zend/Locale/Data/zh_Hant_HK.xml new file mode 100644 index 0000000..a20d8b1 --- /dev/null +++ b/libs/Zend/Locale/Data/zh_Hant_HK.xml @@ -0,0 +1,187 @@ + + + + + + + + + + + + 意大利 + 台灣 + + + 傳統德國拼字法 + 1996 德國拼字法 + San Giorgio/Bila 方言 + Gniva/Njiva 方言 + Oseacco/Osojane 方言 + 已修訂拼字法 + 蘇格蘭標準英語 + Stolvizza/Solbica 方言 + + + 十進制 + + + + + + + + M月d日E + yyyy年M月d日,E + + + + + + + + yyyy年M月d日EEEE + + + + + yyyy年M月d日 + + + + + yyyy年M月d日 + + + + + yy年M月d日 + + + + + + + ahh:mm:ss + + + + + + + {1}{0} + + + + yyyy/M + + + + M月d日E至M月d日E + M月d日E至d日E + + + M月d日至M月d日 + M月d日至d日 + + + ah至h時 + + + ah:mm至ah:mmv + ah:mm至h:mmv + ah:mm至h:mmv + + + ah時至ah時v + ah至h時v + + + yy年M月至M月 + yy年M月至yy年M月 + + + yy年M月d日E至M月d日E + yy年M月d日E至d日E + yy年M月d日E至yy年M月d日E + + + yy年M月d日至M月d日 + yy年M月d日至d日 + yy年M月d日至yy年M月d日 + + + + + + + + + + + + + + + ¤#,##0.00;(¤#,##0.00) + + + + + + 澳元 + + + 波斯尼亞-黑塞哥維那第納爾 + + + 波斯尼亞-黑塞哥維那可轉換馬克 + + + 加元 + + + 港元 + + + 意大利里拉 + + + 紐西蘭元 + + + 塞爾維亞第納爾 + + + 新加坡元 + + + 新台幣 + + + + + + {0}時 + + + {0}星期 + + + + + + + + + + diff --git a/libs/Zend/Locale/Data/zh_Hant_MO.xml b/libs/Zend/Locale/Data/zh_Hant_MO.xml new file mode 100644 index 0000000..5e12478 --- /dev/null +++ b/libs/Zend/Locale/Data/zh_Hant_MO.xml @@ -0,0 +1,124 @@ + + + + + + + + "); + } else { + $response->setRedirect($url); + } + $response->sendResponse(); + if (self::$exitOnRedirect) { + exit(); + } + } + + /** + * Produces string of random byte of given length. + * + * @param integer $len length of requested string + * @return string RAW random binary string + */ + static public function randomBytes($len) + { + $key = ''; + for($i=0; $i < $len; $i++) { + $key .= chr(mt_rand(0, 255)); + } + return $key; + } + + /** + * Generates a hash value (message digest) according to given algorithm. + * It returns RAW binary string. + * + * This is a wrapper function that uses one of available internal function + * dependent on given PHP configuration. It may use various functions from + * ext/openssl, ext/hash, ext/mhash or ext/standard. + * + * @param string $func digest algorithm + * @param string $data data to sign + * @return string RAW digital signature + * @throws Zend_OpenId_Exception + */ + static public function digest($func, $data) + { + if (function_exists('openssl_digest')) { + return openssl_digest($data, $func, true); + } else if (function_exists('hash')) { + return hash($func, $data, true); + } else if ($func === 'sha1') { + return sha1($data, true); + } else if ($func === 'sha256') { + if (function_exists('mhash')) { + return mhash(MHASH_SHA256 , $data); + } + } + throw new Zend_OpenId_Exception( + 'Unsupported digest algorithm "' . $func . '".', + Zend_OpenId_Exception::UNSUPPORTED_DIGEST); + } + + /** + * Generates a keyed hash value using the HMAC method. It uses ext/hash + * if available or user-level PHP implementation, that is not significantly + * slower. + * + * @param string $macFunc name of selected hashing algorithm (sha1, sha256) + * @param string $data data to sign + * @param string $secret shared secret key used for generating the HMAC + * variant of the message digest + * @return string RAW HMAC value + */ + static public function hashHmac($macFunc, $data, $secret) + { +// require_once "Zend/Crypt/Hmac.php"; +// return Zend_Crypt_Hmac::compute($secret, $macFunc, $data, Zend_Crypt_Hmac::BINARY); + if (function_exists('hash_hmac')) { + return hash_hmac($macFunc, $data, $secret, 1); + } else { + if (strlen($secret) > 64) { + $secret = self::digest($macFunc, $secret); + } + $secret = str_pad($secret, 64, chr(0x00)); + $ipad = str_repeat(chr(0x36), 64); + $opad = str_repeat(chr(0x5c), 64); + $hash1 = self::digest($macFunc, ($secret ^ $ipad) . $data); + return self::digest($macFunc, ($secret ^ $opad) . $hash1); + } + } + + /** + * Converts binary representation into ext/gmp or ext/bcmath big integer + * representation. + * + * @param string $bin binary representation of big number + * @return mixed + * @throws Zend_OpenId_Exception + */ + static protected function binToBigNum($bin) + { + if (extension_loaded('gmp')) { + return gmp_init(bin2hex($bin), 16); + } else if (extension_loaded('bcmath')) { + $bn = 0; + $len = strlen($bin); + for ($i = 0; $i < $len; $i++) { + $bn = bcmul($bn, 256); + $bn = bcadd($bn, ord($bin[$i])); + } + return $bn; + } + throw new Zend_OpenId_Exception( + 'The system doesn\'t have proper big integer extension', + Zend_OpenId_Exception::UNSUPPORTED_LONG_MATH); + } + + /** + * Converts internal ext/gmp or ext/bcmath big integer representation into + * binary string. + * + * @param mixed $bn big number + * @return string + * @throws Zend_OpenId_Exception + */ + static protected function bigNumToBin($bn) + { + if (extension_loaded('gmp')) { + $s = gmp_strval($bn, 16); + if (strlen($s) % 2 != 0) { + $s = '0' . $s; + } else if ($s[0] > '7') { + $s = '00' . $s; + } + return pack("H*", $s); + } else if (extension_loaded('bcmath')) { + $cmp = bccomp($bn, 0); + if ($cmp == 0) { + return (chr(0)); + } else if ($cmp < 0) { + throw new Zend_OpenId_Exception( + 'Big integer arithmetic error', + Zend_OpenId_Exception::ERROR_LONG_MATH); + } + $bin = ""; + while (bccomp($bn, 0) > 0) { + $bin = chr(bcmod($bn, 256)) . $bin; + $bn = bcdiv($bn, 256); + } + if (ord($bin[0]) > 127) { + $bin = chr(0) . $bin; + } + return $bin; + } + throw new Zend_OpenId_Exception( + 'The system doesn\'t have proper big integer extension', + Zend_OpenId_Exception::UNSUPPORTED_LONG_MATH); + } + + /** + * Performs the first step of a Diffie-Hellman key exchange by generating + * private and public DH values based on given prime number $p and + * generator $g. Both sides of key exchange MUST have the same prime number + * and generator. In this case they will able to create a random shared + * secret that is never send from one to the other. + * + * @param string $p prime number in binary representation + * @param string $g generator in binary representation + * @param string $priv_key private key in binary representation + * @return mixed + */ + static public function createDhKey($p, $g, $priv_key = null) + { + if (function_exists('openssl_dh_compute_key')) { + $dh_details = array( + 'p' => $p, + 'g' => $g + ); + if (!is_null($priv_key)) { + $dh_details['priv_key'] = $priv_key; + } + return openssl_pkey_new(array('dh'=>$dh_details)); + } else { + $bn_p = self::binToBigNum($p); + $bn_g = self::binToBigNum($g); + if (is_null($priv_key)) { + $priv_key = self::randomBytes(strlen($p)); + } + $bn_priv_key = self::binToBigNum($priv_key); + if (extension_loaded('gmp')) { + $bn_pub_key = gmp_powm($bn_g, $bn_priv_key, $bn_p); + } else if (extension_loaded('bcmath')) { + $bn_pub_key = bcpowmod($bn_g, $bn_priv_key, $bn_p); + } + $pub_key = self::bigNumToBin($bn_pub_key); + + return array( + 'p' => $bn_p, + 'g' => $bn_g, + 'priv_key' => $bn_priv_key, + 'pub_key' => $bn_pub_key, + 'details' => array( + 'p' => $p, + 'g' => $g, + 'priv_key' => $priv_key, + 'pub_key' => $pub_key)); + } + } + + /** + * Returns an associative array with Diffie-Hellman key components in + * binary representation. The array includes original prime number 'p' and + * generator 'g', random private key 'priv_key' and corresponding public + * key 'pub_key'. + * + * @param mixed $dh Diffie-Hellman key + * @return array + */ + static public function getDhKeyDetails($dh) + { + if (function_exists('openssl_dh_compute_key')) { + $details = openssl_pkey_get_details($dh); + if (isset($details['dh'])) { + return $details['dh']; + } + } else { + return $dh['details']; + } + } + + /** + * Computes the shared secret from the private DH value $dh and the other + * party's public value in $pub_key + * + * @param string $pub_key other party's public value + * @param mixed $dh Diffie-Hellman key + * @return string + * @throws Zend_OpenId_Exception + */ + static public function computeDhSecret($pub_key, $dh) + { + if (function_exists('openssl_dh_compute_key')) { + $ret = openssl_dh_compute_key($pub_key, $dh); + if (ord($ret[0]) > 127) { + $ret = chr(0) . $ret; + } + return $ret; + } else if (extension_loaded('gmp')) { + $bn_pub_key = self::binToBigNum($pub_key); + $bn_secret = gmp_powm($bn_pub_key, $dh['priv_key'], $dh['p']); + return self::bigNumToBin($bn_secret); + } else if (extension_loaded('bcmath')) { + $bn_pub_key = self::binToBigNum($pub_key); + $bn_secret = bcpowmod($bn_pub_key, $dh['priv_key'], $dh['p']); + return self::bigNumToBin($bn_secret); + } + throw new Zend_OpenId_Exception( + 'The system doesn\'t have proper big integer extension', + Zend_OpenId_Exception::UNSUPPORTED_LONG_MATH); + } + + /** + * Takes an arbitrary precision integer and returns its shortest big-endian + * two's complement representation. + * + * Arbitrary precision integers MUST be encoded as big-endian signed two's + * complement binary strings. Henceforth, "btwoc" is a function that takes + * an arbitrary precision integer and returns its shortest big-endian two's + * complement representation. All integers that are used with + * Diffie-Hellman Key Exchange are positive. This means that the left-most + * bit of the two's complement representation MUST be zero. If it is not, + * implementations MUST add a zero byte at the front of the string. + * + * @param string $str binary representation of arbitrary precision integer + * @return string big-endian signed representation + */ + static public function btwoc($str) + { + if (ord($str[0]) > 127) { + return chr(0) . $str; + } + return $str; + } + +} diff --git a/libs/Zend/OpenId/Consumer.php b/libs/Zend/OpenId/Consumer.php new file mode 100644 index 0000000..c5116a1 --- /dev/null +++ b/libs/Zend/OpenId/Consumer.php @@ -0,0 +1,921 @@ +_storage = new Zend_OpenId_Consumer_Storage_File(); + } else { + $this->_storage = $storage; + } + $this->_dumbMode = $dumbMode; + } + + /** + * Performs check (with possible user interaction) of OpenID identity. + * + * This is the first step of OpenID authentication process. + * On success the function does not return (it does HTTP redirection to + * server and exits). On failure it returns false. + * + * @param string $id OpenID identity + * @param string $returnTo URL to redirect response from server to + * @param string $root HTTP URL to identify consumer on server + * @param mixed $extensions extension object or array of extensions objects + * @param Zend_Controller_Response_Abstract $response an optional response + * object to perform HTTP or HTML form redirection + * @return bool + */ + public function login($id, $returnTo = null, $root = null, $extensions = null, + Zend_Controller_Response_Abstract $response = null) + { + return $this->_checkId( + false, + $id, + $returnTo, + $root, + $extensions, + $response); + } + + /** + * Performs immediate check (without user interaction) of OpenID identity. + * + * This is the first step of OpenID authentication process. + * On success the function does not return (it does HTTP redirection to + * server and exits). On failure it returns false. + * + * @param string $id OpenID identity + * @param string $returnTo HTTP URL to redirect response from server to + * @param string $root HTTP URL to identify consumer on server + * @param mixed $extensions extension object or array of extensions objects + * @param Zend_Controller_Response_Abstract $response an optional response + * object to perform HTTP or HTML form redirection + * @return bool + */ + public function check($id, $returnTo=null, $root=null, $extensions = null, + Zend_Controller_Response_Abstract $response = null) + + { + return $this->_checkId( + true, + $id, + $returnTo, + $root, + $extensions, + $response); + } + + /** + * Verifies authentication response from OpenID server. + * + * This is the second step of OpenID authentication process. + * The function returns true on successful authentication and false on + * failure. + * + * @param array $params HTTP query data from OpenID server + * @param string &$identity this argument is set to end-user's claimed + * identifier or OpenID provider local identifier. + * @param mixed $extensions extension object or array of extensions objects + * @return bool + */ + public function verify($params, &$identity = "", $extensions = null) + { + $this->_setError(''); + + $version = 1.1; + if (isset($params['openid_ns']) && + $params['openid_ns'] == Zend_OpenId::NS_2_0) { + $version = 2.0; + } + + if (isset($params["openid_claimed_id"])) { + $identity = $params["openid_claimed_id"]; + } else if (isset($params["openid_identity"])){ + $identity = $params["openid_identity"]; + } else { + $identity = ""; + } + + if ($version < 2.0 && !isset($params["openid_claimed_id"])) { + if ($this->_session === null) { + require_once "Zend/Session/Namespace.php"; + $this->_session = new Zend_Session_Namespace("zend_openid"); + } + $session = $this->_session; + if ($session->identity == $identity) { + $identity = $session->claimed_id; + } + } + + if (empty($params['openid_mode'])) { + $this->_setError("Missing openid.mode"); + return false; + } + if (empty($params['openid_return_to'])) { + $this->_setError("Missing openid.return_to"); + return false; + } + if (empty($params['openid_signed'])) { + $this->_setError("Missing openid.signed"); + return false; + } + if (empty($params['openid_sig'])) { + $this->_setError("Missing openid.sig"); + return false; + } + if ($params['openid_mode'] != 'id_res') { + $this->_setError("Wrong openid.mode '".$params['openid_mode']."' != 'id_res'"); + return false; + } + if (empty($params['openid_assoc_handle'])) { + $this->_setError("Missing openid.assoc_handle"); + return false; + } + if ($params['openid_return_to'] != Zend_OpenId::selfUrl()) { + /* Ignore query part in openid.return_to */ + $pos = strpos($params['openid_return_to'], '?'); + if ($pos === false || + SUBSTR($params['openid_return_to'], 0 , $pos) != Zend_OpenId::selfUrl()) { + + $this->_setError("Wrong openid.return_to '". + $params['openid_return_to']."' != '" . Zend_OpenId::selfUrl() ."'"); + return false; + } + } + + if ($version >= 2.0) { + if (empty($params['openid_response_nonce'])) { + $this->_setError("Missing openid.response_nonce"); + return false; + } + if (empty($params['openid_op_endpoint'])) { + $this->_setError("Missing openid.op_endpoint"); + return false; + /* OpenID 2.0 (11.3) Checking the Nonce */ + } else if (!$this->_storage->isUniqueNonce($params['openid_op_endpoint'], $params['openid_response_nonce'])) { + $this->_setError("Duplicate openid.response_nonce"); + return false; + } + } + + + if (!empty($params['openid_invalidate_handle'])) { + if ($this->_storage->getAssociationByHandle( + $params['openid_invalidate_handle'], + $url, + $macFunc, + $secret, + $expires)) { + $this->_storage->delAssociation($url); + } + } + + if ($this->_storage->getAssociationByHandle( + $params['openid_assoc_handle'], + $url, + $macFunc, + $secret, + $expires)) { + $signed = explode(',', $params['openid_signed']); + $data = ''; + foreach ($signed as $key) { + $data .= $key . ':' . $params['openid_' . strtr($key,'.','_')] . "\n"; + } + if (base64_decode($params['openid_sig']) == + Zend_OpenId::hashHmac($macFunc, $data, $secret)) { + if (!Zend_OpenId_Extension::forAll($extensions, 'parseResponse', $params)) { + $this->_setError("Extension::prepareResponse failure"); + return false; + } + /* OpenID 2.0 (11.2) Verifying Discovered Information */ + if (isset($params['openid_claimed_id'])) { + $id = $params['openid_claimed_id']; + if (!Zend_OpenId::normalize($id) || + !$this->_discovery($id, $discovered_server, $discovered_version) || + (!empty($params['openid_identity']) && + $params["openid_identity"] != $id) || + (!empty($params['openid_op_endpoint']) && + $params['openid_op_endpoint'] != $discovered_server) || + $discovered_version != $version) { + $this->_setError("Discovery information verification failed"); + return false; + } + } + return true; + } + $this->_storage->delAssociation($url); + $this->_setError("Signature check failed"); + return false; + } + else + { + /* Use dumb mode */ + if (isset($params['openid_claimed_id'])) { + $id = $params['openid_claimed_id']; + } else if (isset($params['openid_identity'])) { + $id = $params['openid_identity']; + } else { + $this->_setError("Missing openid.climed_id and openid.identity"); + return false; + } + + if (!Zend_OpenId::normalize($id) || + !$this->_discovery($id, $server, $discovered_version)) { + $this->_setError("Discovery failed"); + return false; + } + + /* OpenID 2.0 (11.2) Verifying Discovered Information */ + if ((isset($params['openid_identity']) && + $params["openid_identity"] != $id) || + (isset($params['openid_op_endpoint']) && + $params['openid_op_endpoint'] != $server) || + $discovered_version != $version) { + $this->_setError("Discovery information verification failed"); + return false; + } + + $params2 = array(); + foreach ($params as $key => $val) { + if (strpos($key, 'openid_ns_') === 0) { + $key = 'openid.ns.' . substr($key, strlen('openid_ns_')); + } else if (strpos($key, 'openid_sreg_') === 0) { + $key = 'openid.sreg.' . substr($key, strlen('openid_sreg_')); + } else if (strpos($key, 'openid_') === 0) { + $key = 'openid.' . substr($key, strlen('openid_')); + } + $params2[$key] = $val; + } + $params2['openid.mode'] = 'check_authentication'; + $ret = $this->_httpRequest($server, 'POST', $params2, $status); + if ($status != 200) { + return false; + } + $r = array(); + if (is_string($ret)) { + foreach(explode("\n", $ret) as $line) { + $line = trim($line); + if (!empty($line)) { + $x = explode(':', $line, 2); + if (is_array($x) && count($x) == 2) { + list($key, $value) = $x; + $r[trim($key)] = trim($value); + } + } + } + } + $ret = $r; + if (!empty($ret['invalidate_handle'])) { + if ($this->_storage->getAssociationByHandle( + $ret['invalidate_handle'], + $url, + $macFunc, + $secret, + $expires)) { + $this->_storage->delAssociation($url); + } + } + if (isset($ret['is_valid']) && $ret['is_valid'] == 'true') { + if (!Zend_OpenId_Extension::forAll($extensions, 'parseResponse', $params)) { + $this->_setError("Extension::parseResponse failure"); + return false; + } + return true; + } + $this->_setError("'Dumb' signature verification failed"); + return false; + } + } + + /** + * Store assiciation in internal chace and external storage + * + * @param string $url OpenID server url + * @param string $handle association handle + * @param string $macFunc HMAC function (sha1 or sha256) + * @param string $secret shared secret + * @param integer $expires expiration UNIX time + * @return void + */ + protected function _addAssociation($url, $handle, $macFunc, $secret, $expires) + { + $this->_cache[$url] = array($handle, $macFunc, $secret, $expires); + return $this->_storage->addAssociation( + $url, + $handle, + $macFunc, + $secret, + $expires); + } + + /** + * Retrive assiciation information for given $url from internal cahce or + * external storage + * + * @param string $url OpenID server url + * @param string &$handle association handle + * @param string &$macFunc HMAC function (sha1 or sha256) + * @param string &$secret shared secret + * @param integer &$expires expiration UNIX time + * @return void + */ + protected function _getAssociation($url, &$handle, &$macFunc, &$secret, &$expires) + { + if (isset($this->_cache[$url])) { + $handle = $this->_cache[$url][0]; + $macFunc = $this->_cache[$url][1]; + $secret = $this->_cache[$url][2]; + $expires = $this->_cache[$url][3]; + return true; + } + if ($this->_storage->getAssociation( + $url, + $handle, + $macFunc, + $secret, + $expires)) { + $this->_cache[$url] = array($handle, $macFunc, $secret, $expires); + return true; + } + return false; + } + + /** + * Performs HTTP request to given $url using given HTTP $method. + * Send additinal query specified by variable/value array, + * On success returns HTTP response without headers, false on failure. + * + * @param string $url OpenID server url + * @param string $method HTTP request method 'GET' or 'POST' + * @param array $params additional qwery parameters to be passed with + * @param int &$staus HTTP status code + * request + * @return mixed + */ + protected function _httpRequest($url, $method = 'GET', array $params = array(), &$status = null) + { + $client = $this->_httpClient; + if ($client === null) { + $client = new Zend_Http_Client( + $url, + array( + 'maxredirects' => 4, + 'timeout' => 15, + 'useragent' => 'Zend_OpenId' + ) + ); + } else { + $client->setUri($url); + } + + $client->resetParameters(); + if ($method == 'POST') { + $client->setMethod(Zend_Http_Client::POST); + $client->setParameterPost($params); + } else { + $client->setMethod(Zend_Http_Client::GET); + $client->setParameterGet($params); + } + + try { + $response = $client->request(); + } catch (Exception $e) { + $this->_setError('HTTP Request failed: ' . $e->getMessage()); + return false; + } + $status = $response->getStatus(); + $body = $response->getBody(); + if ($status == 200 || ($status == 400 && !empty($body))) { + return $body; + }else{ + $this->_setError('Bad HTTP response'); + return false; + } + } + + /** + * Create (or reuse existing) association between OpenID consumer and + * OpenID server based on Diffie-Hellman key agreement. Returns true + * on success and false on failure. + * + * @param string $url OpenID server url + * @param float $version OpenID protocol version + * @param string $priv_key for testing only + * @return bool + */ + protected function _associate($url, $version, $priv_key=null) + { + + /* Check if we already have association in chace or storage */ + if ($this->_getAssociation( + $url, + $handle, + $macFunc, + $secret, + $expires)) { + return true; + } + + if ($this->_dumbMode) { + /* Use dumb mode */ + return true; + } + + $params = array(); + + if ($version >= 2.0) { + $params = array( + 'openid.ns' => Zend_OpenId::NS_2_0, + 'openid.mode' => 'associate', + 'openid.assoc_type' => 'HMAC-SHA256', + 'openid.session_type' => 'DH-SHA256', + ); + } else { + $params = array( + 'openid.mode' => 'associate', + 'openid.assoc_type' => 'HMAC-SHA1', + 'openid.session_type' => 'DH-SHA1', + ); + } + + $dh = Zend_OpenId::createDhKey(pack('H*', Zend_OpenId::DH_P), + pack('H*', Zend_OpenId::DH_G), + $priv_key); + $dh_details = Zend_OpenId::getDhKeyDetails($dh); + + $params['openid.dh_modulus'] = base64_encode( + Zend_OpenId::btwoc($dh_details['p'])); + $params['openid.dh_gen'] = base64_encode( + Zend_OpenId::btwoc($dh_details['g'])); + $params['openid.dh_consumer_public'] = base64_encode( + Zend_OpenId::btwoc($dh_details['pub_key'])); + + while(1) { + $ret = $this->_httpRequest($url, 'POST', $params, $status); + if ($ret === false) { + return false; + } + + $r = array(); + $bad_response = false; + foreach(explode("\n", $ret) as $line) { + $line = trim($line); + if (!empty($line)) { + $x = explode(':', $line, 2); + if (is_array($x) && count($x) == 2) { + list($key, $value) = $x; + $r[trim($key)] = trim($value); + } else { + $bad_response = true; + } + } + } + if ($bad_response && strpos($ret, 'Unknown session type') !== false) { + $r['error_code'] = 'unsupported-type'; + } + $ret = $r; + + if (isset($ret['error_code']) && + $ret['error_code'] == 'unsupported-type') { + if ($params['openid.session_type'] == 'DH-SHA256') { + $params['openid.session_type'] = 'DH-SHA1'; + $params['openid.assoc_type'] = 'HMAC-SHA1'; + } else if ($params['openid.session_type'] == 'DH-SHA1') { + $params['openid.session_type'] = 'no-encryption'; + } else { + return false; + } + } else { + break; + } + } + + if ($status != 200) { + return false; + } + + if ($version >= 2.0 && + isset($ret['ns']) && + $ret['ns'] != Zend_OpenId::NS_2_0) { + return false; + } + + if (!isset($ret['assoc_handle']) || + !isset($ret['expires_in']) || + !isset($ret['assoc_type']) || + $params['openid.assoc_type'] != $ret['assoc_type']) { + return false; + } + + $handle = $ret['assoc_handle']; + $expiresIn = $ret['expires_in']; + + if ($ret['assoc_type'] == 'HMAC-SHA1') { + $macFunc = 'sha1'; + } else if ($ret['assoc_type'] == 'HMAC-SHA256' && + $version >= 2.0) { + $macFunc = 'sha256'; + } else { + return false; + } + + if ((empty($ret['session_type']) || + ($version >= 2.0 && $ret['session_type'] == 'no-encryption')) && + isset($ret['mac_key'])) { + $secret = base64_decode($ret['mac_key']); + } else if (isset($ret['session_type']) && + $ret['session_type'] == 'DH-SHA1' && + !empty($ret['dh_server_public']) && + !empty($ret['enc_mac_key'])) { + $dhFunc = 'sha1'; + } else if (isset($ret['session_type']) && + $ret['session_type'] == 'DH-SHA256' && + $version >= 2.0 && + !empty($ret['dh_server_public']) && + !empty($ret['enc_mac_key'])) { + $dhFunc = 'sha256'; + } else { + return false; + } + if (isset($dhFunc)) { + $serverPub = base64_decode($ret['dh_server_public']); + $dhSec = Zend_OpenId::computeDhSecret($serverPub, $dh); + if ($dhSec === false) { + return false; + } + $sec = Zend_OpenId::digest($dhFunc, $dhSec); + if ($sec === false) { + return false; + } + $secret = $sec ^ base64_decode($ret['enc_mac_key']); + } + if ($macFunc == 'sha1') { + if (strlen($secret) != 20) { + return false; + } + } else if ($macFunc == 'sha256') { + if (strlen($secret) != 32) { + return false; + } + } + $this->_addAssociation( + $url, + $handle, + $macFunc, + $secret, + time() + $expiresIn); + return true; + } + + /** + * Performs discovery of identity and finds OpenID URL, OpenID server URL + * and OpenID protocol version. Returns true on succees and false on + * failure. + * + * @param string &$id OpenID identity URL + * @param string &$server OpenID server URL + * @param float &$version OpenID protocol version + * @return bool + * @todo OpenID 2.0 (7.3) XRI and Yadis discovery + */ + protected function _discovery(&$id, &$server, &$version) + { + $realId = $id; + if ($this->_storage->getDiscoveryInfo( + $id, + $realId, + $server, + $version, + $expire)) { + $id = $realId; + return true; + } + + /* TODO: OpenID 2.0 (7.3) XRI and Yadis discovery */ + + /* HTML-based discovery */ + $response = $this->_httpRequest($id, 'GET', array(), $status); + if ($status != 200 || !is_string($response)) { + return false; + } + if (preg_match( + '/]*rel=(["\'])[ \t]*(?:[^ \t"\']+[ \t]+)*?openid2.provider[ \t]*[^"\']*\\1[^>]*href=(["\'])([^"\']+)\\2[^>]*\/?>/i', + $response, + $r)) { + $version = 2.0; + $server = $r[3]; + } else if (preg_match( + '/]*href=(["\'])([^"\']+)\\1[^>]*rel=(["\'])[ \t]*(?:[^ \t"\']+[ \t]+)*?openid2.provider[ \t]*[^"\']*\\3[^>]*\/?>/i', + $response, + $r)) { + $version = 2.0; + $server = $r[2]; + } else if (preg_match( + '/]*rel=(["\'])[ \t]*(?:[^ \t"\']+[ \t]+)*?openid.server[ \t]*[^"\']*\\1[^>]*href=(["\'])([^"\']+)\\2[^>]*\/?>/i', + $response, + $r)) { + $version = 1.1; + $server = $r[3]; + } else if (preg_match( + '/]*href=(["\'])([^"\']+)\\1[^>]*rel=(["\'])[ \t]*(?:[^ \t"\']+[ \t]+)*?openid.server[ \t]*[^"\']*\\3[^>]*\/?>/i', + $response, + $r)) { + $version = 1.1; + $server = $r[2]; + } else { + return false; + } + if ($version >= 2.0) { + if (preg_match( + '/]*rel=(["\'])[ \t]*(?:[^ \t"\']+[ \t]+)*?openid2.local_id[ \t]*[^"\']*\\1[^>]*href=(["\'])([^"\']+)\\2[^>]*\/?>/i', + $response, + $r)) { + $realId = $r[3]; + } else if (preg_match( + '/]*href=(["\'])([^"\']+)\\1[^>]*rel=(["\'])[ \t]*(?:[^ \t"\']+[ \t]+)*?openid2.local_id[ \t]*[^"\']*\\3[^>]*\/?>/i', + $response, + $r)) { + $realId = $r[2]; + } + } else { + if (preg_match( + '/]*rel=(["\'])[ \t]*(?:[^ \t"\']+[ \t]+)*?openid.delegate[ \t]*[^"\']*\\1[^>]*href=(["\'])([^"\']+)\\2[^>]*\/?>/i', + $response, + $r)) { + $realId = $r[3]; + } else if (preg_match( + '/]*href=(["\'])([^"\']+)\\1[^>]*rel=(["\'])[ \t]*(?:[^ \t"\']+[ \t]+)*?openid.delegate[ \t]*[^"\']*\\3[^>]*\/?>/i', + $response, + $r)) { + $realId = $r[2]; + } + } + + $expire = time() + 60 * 60; + $this->_storage->addDiscoveryInfo($id, $realId, $server, $version, $expire); + $id = $realId; + return true; + } + + /** + * Performs check of OpenID identity. + * + * This is the first step of OpenID authentication process. + * On success the function does not return (it does HTTP redirection to + * server and exits). On failure it returns false. + * + * @param bool $immediate enables or disables interaction with user + * @param string $id OpenID identity + * @param string $returnTo HTTP URL to redirect response from server to + * @param string $root HTTP URL to identify consumer on server + * @param mixed $extensions extension object or array of extensions objects + * @param Zend_Controller_Response_Abstract $response an optional response + * object to perform HTTP or HTML form redirection + * @return bool + */ + protected function _checkId($immediate, $id, $returnTo=null, $root=null, + $extensions=null, Zend_Controller_Response_Abstract $response = null) + { + $this->_setError(''); + + if (!Zend_OpenId::normalize($id)) { + $this->_setError("Normalisation failed"); + return false; + } + $claimedId = $id; + + if (!$this->_discovery($id, $server, $version)) { + $this->_setError("Discovery failed"); + return false; + } + if (!$this->_associate($server, $version)) { + $this->_setError("Association failed"); + return false; + } + if (!$this->_getAssociation( + $server, + $handle, + $macFunc, + $secret, + $expires)) { + /* Use dumb mode */ + unset($handle); + unset($macFunc); + unset($secret); + unset($expires); + } + + $params = array(); + if ($version >= 2.0) { + $params['openid.ns'] = Zend_OpenId::NS_2_0; + } + + $params['openid.mode'] = $immediate ? + 'checkid_immediate' : 'checkid_setup'; + + $params['openid.identity'] = $id; + + $params['openid.claimed_id'] = $claimedId; + + if ($version <= 2.0) { + if ($this->_session === null) { + require_once "Zend/Session/Namespace.php"; + $this->_session = new Zend_Session_Namespace("zend_openid"); + } + $session = $this->_session; + $session->identity = $id; + $session->claimed_id = $claimedId; + } + + if (isset($handle)) { + $params['openid.assoc_handle'] = $handle; + } + + $params['openid.return_to'] = Zend_OpenId::absoluteUrl($returnTo); + + if (empty($root)) { + $root = Zend_OpenId::selfUrl(); + if ($root[strlen($root)-1] != '/') { + $root = dirname($root); + } + } + if ($version >= 2.0) { + $params['openid.realm'] = $root; + } else { + $params['openid.trust_root'] = $root; + } + + if (!Zend_OpenId_Extension::forAll($extensions, 'prepareRequest', $params)) { + $this->_setError("Extension::prepareRequest failure"); + return false; + } + + Zend_OpenId::redirect($server, $params, $response); + return true; + } + + /** + * Sets HTTP client object to make HTTP requests + * + * @param Zend_Http_Client $client HTTP client object to be used + */ + public function setHttpClient($client) { + $this->_httpClient = $client; + } + + /** + * Returns HTTP client object that will be used to make HTTP requests + * + * @return Zend_Http_Client + */ + public function getHttpClient() { + return $this->_httpClient; + } + + /** + * Sets session object to store climed_id + * + * @param Zend_Session_Namespace $session HTTP client object to be used + */ + public function setSession(Zend_Session_Namespace $session) { + $this->_session = $session; + } + + /** + * Returns session object that is used to store climed_id + * + * @return Zend_Session_Namespace + */ + public function getSession() { + return $this->_session; + } + + /** + * Saves error message + * + * @param string $message error message + */ + protected function _setError($message) + { + $this->_error = $message; + } + + /** + * Returns error message that explains failure of login, check or verify + * + * @return string + */ + public function getError() + { + return $this->_error; + } + +} diff --git a/libs/Zend/OpenId/Consumer/Storage.php b/libs/Zend/OpenId/Consumer/Storage.php new file mode 100644 index 0000000..68e4ed0 --- /dev/null +++ b/libs/Zend/OpenId/Consumer/Storage.php @@ -0,0 +1,132 @@ +_dir = $dir; + if (!is_dir($this->_dir)) { + if (!@mkdir($this->_dir, 0700, 1)) { + /** + * @see Zend_OpenId_Exception + */ + require_once 'Zend/OpenId/Exception.php'; + throw new Zend_OpenId_Exception( + 'Cannot access storage directory ' . $dir, + Zend_OpenId_Exception::ERROR_STORAGE); + } + } + if (($f = fopen($this->_dir.'/assoc.lock', 'w+')) === null) { + /** + * @see Zend_OpenId_Exception + */ + require_once 'Zend/OpenId/Exception.php'; + throw new Zend_OpenId_Exception( + 'Cannot create a lock file in the directory ' . $dir, + Zend_OpenId_Exception::ERROR_STORAGE); + } + fclose($f); + if (($f = fopen($this->_dir.'/discovery.lock', 'w+')) === null) { + /** + * @see Zend_OpenId_Exception + */ + require_once 'Zend/OpenId/Exception.php'; + throw new Zend_OpenId_Exception( + 'Cannot create a lock file in the directory ' . $dir, + Zend_OpenId_Exception::ERROR_STORAGE); + } + fclose($f); + if (($f = fopen($this->_dir.'/nonce.lock', 'w+')) === null) { + /** + * @see Zend_OpenId_Exception + */ + require_once 'Zend/OpenId/Exception.php'; + throw new Zend_OpenId_Exception( + 'Cannot create a lock file in the directory ' . $dir, + Zend_OpenId_Exception::ERROR_STORAGE); + } + fclose($f); + } + + /** + * Stores information about association identified by $url/$handle + * + * @param string $url OpenID server URL + * @param string $handle assiciation handle + * @param string $macFunc HMAC function (sha1 or sha256) + * @param string $secret shared secret + * @param long $expires expiration UNIX time + * @return bool + */ + public function addAssociation($url, $handle, $macFunc, $secret, $expires) + { + $name1 = $this->_dir . '/assoc_url_' . md5($url); + $name2 = $this->_dir . '/assoc_handle_' . md5($handle); + $lock = @fopen($this->_dir . '/assoc.lock', 'w+'); + if ($lock === false) { + return false; + } + if (!flock($lock, LOCK_EX)) { + fclose($lock); + return false; + } + $f = @fopen($name1, 'w+'); + if ($f === false) { + fclose($lock); + return false; + } + $data = serialize(array($url, $handle, $macFunc, $secret, $expires)); + fwrite($f, $data); + if (function_exists('symlink')) { + @unlink($name2); + symlink($name1, $name2); + } else { + $f2 = @fopen($name2, 'w+'); + if ($f2) { + fwrite($f2, $data); + fclose($f2); + } + } + fclose($f); + fclose($lock); + return true; + } + + /** + * Gets information about association identified by $url + * Returns true if given association found and not expired and false + * otherwise + * + * @param string $url OpenID server URL + * @param string &$handle assiciation handle + * @param string &$macFunc HMAC function (sha1 or sha256) + * @param string &$secret shared secret + * @param long &$expires expiration UNIX time + * @return bool + */ + public function getAssociation($url, &$handle, &$macFunc, &$secret, &$expires) + { + $name1 = $this->_dir . '/assoc_url_' . md5($url); + $lock = @fopen($this->_dir . '/assoc.lock', 'w+'); + if ($lock === false) { + return false; + } + if (!flock($lock, LOCK_EX)) { + fclose($lock); + return false; + } + $f = @fopen($name1, 'r'); + if ($f === false) { + fclose($lock); + return false; + } + $ret = false; + $data = stream_get_contents($f); + if (!empty($data)) { + list($storedUrl, $handle, $macFunc, $secret, $expires) = unserialize($data); + if ($url === $storedUrl && $expires > time()) { + $ret = true; + } else { + $name2 = $this->_dir . '/assoc_handle_' . md5($handle); + fclose($f); + @unlink($name2); + @unlink($name1); + fclose($lock); + return false; + } + } + fclose($f); + fclose($lock); + return $ret; + } + + /** + * Gets information about association identified by $handle + * Returns true if given association found and not expired and false + * otherwise + * + * @param string $handle assiciation handle + * @param string &$url OpenID server URL + * @param string &$macFunc HMAC function (sha1 or sha256) + * @param string &$secret shared secret + * @param long &$expires expiration UNIX time + * @return bool + */ + public function getAssociationByHandle($handle, &$url, &$macFunc, &$secret, &$expires) + { + $name2 = $this->_dir . '/assoc_handle_' . md5($handle); + $lock = @fopen($this->_dir . '/assoc.lock', 'w+'); + if ($lock === false) { + return false; + } + if (!flock($lock, LOCK_EX)) { + fclose($lock); + return false; + } + $f = @fopen($name2, 'r'); + if ($f === false) { + fclose($lock); + return false; + } + $ret = false; + $data = stream_get_contents($f); + if (!empty($data)) { + list($url, $storedHandle, $macFunc, $secret, $expires) = unserialize($data); + if ($handle === $storedHandle && $expires > time()) { + $ret = true; + } else { + fclose($f); + @unlink($name2); + $name1 = $this->_dir . '/assoc_url_' . md5($url); + @unlink($name1); + fclose($lock); + return false; + } + } + fclose($f); + fclose($lock); + return $ret; + } + + /** + * Deletes association identified by $url + * + * @param string $url OpenID server URL + * @return bool + */ + public function delAssociation($url) + { + $name1 = $this->_dir . '/assoc_url_' . md5($url); + $lock = @fopen($this->_dir . '/assoc.lock', 'w+'); + if ($lock === false) { + return false; + } + if (!flock($lock, LOCK_EX)) { + fclose($lock); + return false; + } + $f = @fopen($name1, 'r'); + if ($f === false) { + fclose($lock); + return false; + } + $data = stream_get_contents($f); + if (!empty($data)) { + list($storedUrl, $handle, $macFunc, $secret, $expires) = unserialize($data); + if ($url === $storedUrl) { + $name2 = $this->_dir . '/assoc_handle_' . md5($handle); + fclose($f); + @unlink($name2); + @unlink($name1); + fclose($lock); + return true; + } + } + fclose($f); + fclose($lock); + return true; + } + + /** + * Stores information discovered from identity $id + * + * @param string $id identity + * @param string $realId discovered real identity URL + * @param string $server discovered OpenID server URL + * @param float $version discovered OpenID protocol version + * @param long $expires expiration UNIX time + * @return bool + */ + public function addDiscoveryInfo($id, $realId, $server, $version, $expires) + { + $name = $this->_dir . '/discovery_' . md5($id); + $lock = @fopen($this->_dir . '/discovery.lock', 'w+'); + if ($lock === false) { + return false; + } + if (!flock($lock, LOCK_EX)) { + fclose($lock); + return false; + } + $f = @fopen($name, 'w+'); + if ($f === false) { + fclose($lock); + return false; + } + $data = serialize(array($id, $realId, $server, $version, $expires)); + fwrite($f, $data); + fclose($f); + fclose($lock); + return true; + } + + /** + * Gets information discovered from identity $id + * Returns true if such information exists and false otherwise + * + * @param string $id identity + * @param string &$realId discovered real identity URL + * @param string &$server discovered OpenID server URL + * @param float &$version discovered OpenID protocol version + * @param long &$expires expiration UNIX time + * @return bool + */ + public function getDiscoveryInfo($id, &$realId, &$server, &$version, &$expires) + { + $name = $this->_dir . '/discovery_' . md5($id); + $lock = @fopen($this->_dir . '/discovery.lock', 'w+'); + if ($lock === false) { + return false; + } + if (!flock($lock, LOCK_EX)) { + fclose($lock); + return false; + } + $f = @fopen($name, 'r'); + if ($f === false) { + fclose($lock); + return false; + } + $ret = false; + $data = stream_get_contents($f); + if (!empty($data)) { + list($storedId, $realId, $server, $version, $expires) = unserialize($data); + if ($id === $storedId && $expires > time()) { + $ret = true; + } else { + fclose($f); + @unlink($name); + fclose($lock); + return false; + } + } + fclose($f); + fclose($lock); + return $ret; + } + + /** + * Removes cached information discovered from identity $id + * + * @param string $id identity + * @return bool + */ + public function delDiscoveryInfo($id) + { + $name = $this->_dir . '/discovery_' . md5($id); + $lock = @fopen($this->_dir . '/discovery.lock', 'w+'); + if ($lock === false) { + return false; + } + if (!flock($lock, LOCK_EX)) { + fclose($lock); + return false; + } + @unlink($name); + fclose($lock); + return true; + } + + /** + * The function checks the uniqueness of openid.response_nonce + * + * @param string $provider openid.openid_op_endpoint field from authentication response + * @param string $nonce openid.response_nonce field from authentication response + * @return bool + */ + public function isUniqueNonce($provider, $nonce) + { + $name = $this->_dir . '/nonce_' . md5($provider.';'.$nonce); + $lock = @fopen($this->_dir . '/nonce.lock', 'w+'); + if ($lock === false) { + return false; + } + if (!flock($lock, LOCK_EX)) { + fclose($lock); + return false; + } + $f = @fopen($name, 'x'); + if ($f === false) { + fclose($lock); + return false; + } + fwrite($f, $provider.';'.$nonce); + fclose($f); + fclose($lock); + return true; + } + + /** + * Removes data from the uniqueness database that is older then given date + * + * @param mixed $date date of expired data + */ + public function purgeNonces($date=null) + { + $lock = @fopen($this->_dir . '/nonce.lock', 'w+'); + if ($lock !== false) { + flock($lock, LOCK_EX); + } + if (!is_int($date) && !is_string($date)) { + foreach (glob($this->_dir . '/nonce_*') as $name) { + @unlink($name); + } + } else { + if (is_string($date)) { + $time = time($date); + } else { + $time = $date; + } + foreach (glob($this->_dir . '/nonce_*') as $name) { + if (filemtime($name) < $time) { + @unlink($name); + } + } + } + if ($lock !== false) { + fclose($lock); + } + } +} diff --git a/libs/Zend/OpenId/Exception.php b/libs/Zend/OpenId/Exception.php new file mode 100644 index 0000000..42d21ae --- /dev/null +++ b/libs/Zend/OpenId/Exception.php @@ -0,0 +1,58 @@ +$func($params)) { + return false; + } + } else { + return false; + } + } + } else if (!is_object($extensions) || + !($extensions instanceof Zend_OpenId_Extension) || + !$extensions->$func($params)) { + return false; + } + } + return true; + } + + /** + * Method to add additional data to OpenId 'checkid_immediate' or + * 'checkid_setup' request. This method addes nothing but inherited class + * may add additional data into request. + * + * @param array &$params request's var/val pairs + * @return bool + */ + public function prepareRequest(&$params) + { + return true; + } + + /** + * Method to parse OpenId 'checkid_immediate' or 'checkid_setup' request + * and initialize object with passed data. This method parses nothing but + * inherited class may override this method to do somthing. + * + * @param array $params request's var/val pairs + * @return bool + */ + public function parseRequest($params) + { + return true; + } + + /** + * Method to add additional data to OpenId 'id_res' response. This method + * addes nothing but inherited class may add additional data into response. + * + * @param array &$params response's var/val pairs + * @return bool + */ + public function prepareResponse(&$params) + { + return true; + } + + /** + * Method to parse OpenId 'id_res' response and initialize object with + * passed data. This method parses nothing but inherited class may override + * this method to do somthing. + * + * @param array $params response's var/val pairs + * @return bool + */ + public function parseResponse($params) + { + return true; + } + + /** + * Method to prepare data to store it in trusted servers database. + * + * @param array &$data data to be stored in tusted servers database + * @return bool + */ + public function getTrustData(&$data) + { + return true; + } + + /** + * Method to check if data from trusted servers database is enough to + * sutisfy request. + * + * @param array $data data from tusted servers database + * @return bool + */ + public function checkTrustData($data) + { + return true; + } +} diff --git a/libs/Zend/OpenId/Extension/Sreg.php b/libs/Zend/OpenId/Extension/Sreg.php new file mode 100644 index 0000000..0ee3e86 --- /dev/null +++ b/libs/Zend/OpenId/Extension/Sreg.php @@ -0,0 +1,300 @@ +_props = $props; + $this->_policy_url = $policy_url; + $this->_version = $version; + } + + /** + * Returns associative array of SREG variables + * + * @return array + */ + public function getProperties() { + if (is_array($this->_props)) { + return $this->_props; + } else { + return array(); + } + } + + /** + * Returns SREG policy URL + * + * @return string + */ + public function getPolicyUrl() { + return $this->_policy_url; + } + + /** + * Returns SREG protocol version + * + * @return float + */ + public function getVersion() { + return $this->_version; + } + + /** + * Returns array of allowed SREG variable names. + * + * @return array + */ + public static function getSregProperties() + { + return array( + "nickname", + "email", + "fullname", + "dob", + "gender", + "postcode", + "country", + "language", + "timezone" + ); + } + + /** + * Adds additional SREG data to OpenId 'checkid_immediate' or + * 'checkid_setup' request. + * + * @param array &$params request's var/val pairs + * @return bool + */ + public function prepareRequest(&$params) + { + if (is_array($this->_props) && count($this->_props) > 0) { + foreach ($this->_props as $prop => $req) { + if ($req) { + if (isset($required)) { + $required .= ','.$prop; + } else { + $required = $prop; + } + } else { + if (isset($optional)) { + $optional .= ','.$prop; + } else { + $optional = $prop; + } + } + } + if ($this->_version >= 1.1) { + $params['openid.ns.sreg'] = Zend_OpenId_Extension_Sreg::NAMESPACE_1_1; + } + if (!empty($required)) { + $params['openid.sreg.required'] = $required; + } + if (!empty($optional)) { + $params['openid.sreg.optional'] = $optional; + } + if (!empty($this->_policy_url)) { + $params['openid.sreg.policy_url'] = $this->_policy_url; + } + } + return true; + } + + /** + * Parses OpenId 'checkid_immediate' or 'checkid_setup' request, + * extracts SREG variables and sets ovject properties to corresponding + * values. + * + * @param array $params request's var/val pairs + * @return bool + */ + public function parseRequest($params) + { + if (isset($params['openid_ns_sreg']) && + $params['openid_ns_sreg'] === Zend_OpenId_Extension_Sreg::NAMESPACE_1_1) { + $this->_version= 1.1; + } else { + $this->_version= 1.0; + } + if (!empty($params['openid_sreg_policy_url'])) { + $this->_policy_url = $params['openid_sreg_policy_url']; + } else { + $this->_policy_url = null; + } + $props = array(); + if (!empty($params['openid_sreg_optional'])) { + foreach (explode(',', $params['openid_sreg_optional']) as $prop) { + $prop = trim($prop); + $props[$prop] = false; + } + } + if (!empty($params['openid_sreg_required'])) { + foreach (explode(',', $params['openid_sreg_required']) as $prop) { + $prop = trim($prop); + $props[$prop] = true; + } + } + $props2 = array(); + foreach (self::getSregProperties() as $prop) { + if (isset($props[$prop])) { + $props2[$prop] = $props[$prop]; + } + } + + $this->_props = (count($props2) > 0) ? $props2 : null; + return true; + } + + /** + * Adds additional SREG data to OpenId 'id_res' response. + * + * @param array &$params response's var/val pairs + * @return bool + */ + public function prepareResponse(&$params) + { + if (is_array($this->_props) && count($this->_props) > 0) { + if ($this->_version >= 1.1) { + $params['openid.ns.sreg'] = Zend_OpenId_Extension_Sreg::NAMESPACE_1_1; + } + foreach (self::getSregProperties() as $prop) { + if (!empty($this->_props[$prop])) { + $params['openid.sreg.' . $prop] = $this->_props[$prop]; + } + } + } + return true; + } + + /** + * Parses OpenId 'id_res' response and sets object's properties according + * to 'openid.sreg.*' variables in response + * + * @param array $params response's var/val pairs + * @return bool + */ + public function parseResponse($params) + { + if (isset($params['openid_ns_sreg']) && + $params['openid_ns_sreg'] === Zend_OpenId_Extension_Sreg::NAMESPACE_1_1) { + $this->_version= 1.1; + } else { + $this->_version= 1.0; + } + $props = array(); + foreach (self::getSregProperties() as $prop) { + if (!empty($params['openid_sreg_' . $prop])) { + $props[$prop] = $params['openid_sreg_' . $prop]; + } + } + if (isset($this->_props) && is_array($this->_props)) { + foreach (self::getSregProperties() as $prop) { + if (isset($this->_props[$prop]) && + $this->_props[$prop] && + !isset($props[$prop])) { + return false; + } + } + } + $this->_props = (count($props) > 0) ? $props : null; + return true; + } + + /** + * Addes SREG properties that are allowed to be send to consumer to + * the given $data argument. + * + * @param array &$data data to be stored in tusted servers database + * @return bool + */ + public function getTrustData(&$data) + { + $data[get_class()] = $this->getProperties(); + return true; + } + + /** + * Check if given $data contains necessury SREG properties to sutisfy + * OpenId request. On success sets SREG response properties from given + * $data and returns true, on failure returns false. + * + * @param array $data data from tusted servers database + * @return bool + */ + public function checkTrustData($data) + { + if (is_array($this->_props) && count($this->_props) > 0) { + $props = array(); + $name = get_class(); + if (isset($data[$name])) { + $props = $data[$name]; + } else { + $props = array(); + } + $props2 = array(); + foreach ($this->_props as $prop => $req) { + if (empty($props[$prop])) { + if ($req) { + return false; + } + } else { + $props2[$prop] = $props[$prop]; + } + } + $this->_props = (count($props2) > 0) ? $props2 : null; + } + return true; + } +} diff --git a/libs/Zend/OpenId/Provider.php b/libs/Zend/OpenId/Provider.php new file mode 100644 index 0000000..46b2681 --- /dev/null +++ b/libs/Zend/OpenId/Provider.php @@ -0,0 +1,781 @@ +_loginUrl = $loginUrl; + if ($trustUrl === null) { + $trustUrl = Zend_OpenId::selfUrl() . '?openid.action=trust'; + } else { + $trustUrl = Zend_OpenId::absoluteUrl($trustUrl); + } + $this->_trustUrl = $trustUrl; + if ($user === null) { + require_once "Zend/OpenId/Provider/User/Session.php"; + $this->_user = new Zend_OpenId_Provider_User_Session(); + } else { + $this->_user = $user; + } + if ($storage === null) { + require_once "Zend/OpenId/Provider/Storage/File.php"; + $this->_storage = new Zend_OpenId_Provider_Storage_File(); + } else { + $this->_storage = $storage; + } + $this->_sessionTtl = $sessionTtl; + } + + /** + * Sets the OP Endpoint URL + * + * @param string $url the OP Endpoint URL + * @return null + */ + public function setOpEndpoint($url) + { + $this->_opEndpoint = $url; + } + + /** + * Registers a new user with given $id and $password + * Returns true in case of success and false if user with given $id already + * exists + * + * @param string $id user identity URL + * @param string $password encoded user password + * @return bool + */ + public function register($id, $password) + { + if (!Zend_OpenId::normalize($id) || empty($id)) { + return false; + } + return $this->_storage->addUser($id, md5($id.$password)); + } + + /** + * Returns true if user with given $id exists and false otherwise + * + * @param string $id user identity URL + * @return bool + */ + public function hasUser($id) { + if (!Zend_OpenId::normalize($id)) { + return false; + } + return $this->_storage->hasUser($id); + } + + /** + * Performs login of user with given $id and $password + * Returns true in case of success and false otherwise + * + * @param string $id user identity URL + * @param string $password user password + * @return bool + */ + public function login($id, $password) + { + if (!Zend_OpenId::normalize($id)) { + return false; + } + if (!$this->_storage->checkUser($id, md5($id.$password))) { + return false; + } + $this->_user->setLoggedInUser($id); + return true; + } + + /** + * Performs logout. Clears information about logged in user. + * + * @return void + */ + public function logout() + { + $this->_user->delLoggedInUser(); + return true; + } + + /** + * Returns identity URL of current logged in user or false + * + * @return mixed + */ + public function getLoggedInUser() { + return $this->_user->getLoggedInUser(); + } + + /** + * Retrieve consumer's root URL from request query. + * Returns URL or false in case of failure + * + * @param array $params query arguments + * @return mixed + */ + public function getSiteRoot($params) + { + $version = 1.1; + if (isset($params['openid_ns']) && + $params['openid_ns'] == Zend_OpenId::NS_2_0) { + $version = 2.0; + } + if ($version >= 2.0 && isset($params['openid_realm'])) { + $root = $params['openid_realm']; + } else if ($version < 2.0 && isset($params['openid_trust_root'])) { + $root = $params['openid_trust_root']; + } else if (isset($params['openid_return_to'])) { + $root = $params['openid_return_to']; + } else { + return false; + } + if (Zend_OpenId::normalizeUrl($root) && !empty($root)) { + return $root; + } + return false; + } + + /** + * Allows consumer with given root URL to authenticate current logged + * in user. Returns true on success and false on error. + * + * @param string $root root URL + * @param mixed $extensions extension object or array of extensions objects + * @return bool + */ + public function allowSite($root, $extensions=null) + { + $id = $this->getLoggedInUser(); + if ($id === false) { + return false; + } + if ($extensions !== null) { + $data = array(); + Zend_OpenId_Extension::forAll($extensions, 'getTrustData', $data); + } else { + $data = true; + } + $this->_storage->addSite($id, $root, $data); + return true; + } + + /** + * Prohibit consumer with given root URL to authenticate current logged + * in user. Returns true on success and false on error. + * + * @param string $root root URL + * @return bool + */ + public function denySite($root) + { + $id = $this->getLoggedInUser(); + if ($id === false) { + return false; + } + $this->_storage->addSite($id, $root, false); + return true; + } + + /** + * Delete consumer with given root URL from known sites of current logged + * in user. Next time this consumer will try to authenticate the user, + * Provider will ask user's confirmation. + * Returns true on success and false on error. + * + * @param string $root root URL + * @return bool + */ + public function delSite($root) + { + $id = $this->getLoggedInUser(); + if ($id === false) { + return false; + } + $this->_storage->addSite($id, $root, null); + return true; + } + + /** + * Returns list of known consumers for current logged in user or false + * if he is not logged in. + * + * @return mixed + */ + public function getTrustedSites() + { + $id = $this->getLoggedInUser(); + if ($id === false) { + return false; + } + return $this->_storage->getTrustedSites($id); + } + + /** + * Handles HTTP request from consumer + * + * @param array $params GET or POST variables. If this parameter is omited + * or set to null, then $_GET or $_POST superglobal variable is used + * according to REQUEST_METHOD. + * @param mixed $extensions extension object or array of extensions objects + * @param Zend_Controller_Response_Abstract $response an optional response + * object to perform HTTP or HTML form redirection + * @return mixed + */ + public function handle($params=null, $extensions=null, + Zend_Controller_Response_Abstract $response = null) + { + if ($params === null) { + if ($_SERVER["REQUEST_METHOD"] == "GET") { + $params = $_GET; + } else if ($_SERVER["REQUEST_METHOD"] == "POST") { + $params = $_POST; + } else { + return false; + } + } + $version = 1.1; + if (isset($params['openid_ns']) && + $params['openid_ns'] == Zend_OpenId::NS_2_0) { + $version = 2.0; + } + if (isset($params['openid_mode'])) { + if ($params['openid_mode'] == 'associate') { + $response = $this->_associate($version, $params); + $ret = ''; + foreach ($response as $key => $val) { + $ret .= $key . ':' . $val . "\n"; + } + return $ret; + } else if ($params['openid_mode'] == 'checkid_immediate') { + $ret = $this->_checkId($version, $params, 1, $extensions, $response); + if (is_bool($ret)) return $ret; + if (!empty($params['openid_return_to'])) { + Zend_OpenId::redirect($params['openid_return_to'], $ret, $response); + } + return true; + } else if ($params['openid_mode'] == 'checkid_setup') { + $ret = $this->_checkId($version, $params, 0, $extensions, $response); + if (is_bool($ret)) return $ret; + if (!empty($params['openid_return_to'])) { + Zend_OpenId::redirect($params['openid_return_to'], $ret, $response); + } + return true; + } else if ($params['openid_mode'] == 'check_authentication') { + $response = $this->_checkAuthentication($version, $params); + $ret = ''; + foreach ($response as $key => $val) { + $ret .= $key . ':' . $val . "\n"; + } + return $ret; + } + } + return false; + } + + /** + * Generates a secret key for given hash function, returns RAW key or false + * if function is not supported + * + * @param string $func hash function (sha1 or sha256) + * @return mixed + */ + protected function _genSecret($func) + { + if ($func == 'sha1') { + $macLen = 20; /* 160 bit */ + } else if ($func == 'sha256') { + $macLen = 32; /* 256 bit */ + } else { + return false; + } + return Zend_OpenId::randomBytes($macLen); + } + + /** + * Processes association request from OpenID consumerm generates secret + * shared key and send it back using Diffie-Hellman encruption. + * Returns array of variables to push back to consumer. + * + * @param float $version OpenID version + * @param array $params GET or POST request variables + * @return array + */ + protected function _associate($version, $params) + { + $ret = array(); + + if ($version >= 2.0) { + $ret['ns'] = Zend_OpenId::NS_2_0; + } + + if (isset($params['openid_assoc_type']) && + $params['openid_assoc_type'] == 'HMAC-SHA1') { + $macFunc = 'sha1'; + } else if (isset($params['openid_assoc_type']) && + $params['openid_assoc_type'] == 'HMAC-SHA256' && + $version >= 2.0) { + $macFunc = 'sha256'; + } else { + $ret['error'] = 'Wrong "openid.assoc_type"'; + $ret['error-code'] = 'unsupported-type'; + return $ret; + } + + $ret['assoc_type'] = $params['openid_assoc_type']; + + $secret = $this->_genSecret($macFunc); + + if (empty($params['openid_session_type']) || + $params['openid_session_type'] == 'no-encryption') { + $ret['mac_key'] = base64_encode($secret); + } else if (isset($params['openid_session_type']) && + $params['openid_session_type'] == 'DH-SHA1') { + $dhFunc = 'sha1'; + } else if (isset($params['openid_session_type']) && + $params['openid_session_type'] == 'DH-SHA256' && + $version >= 2.0) { + $dhFunc = 'sha256'; + } else { + $ret['error'] = 'Wrong "openid.session_type"'; + $ret['error-code'] = 'unsupported-type'; + return $ret; + } + + if (isset($params['openid_session_type'])) { + $ret['session_type'] = $params['openid_session_type']; + } + + if (isset($dhFunc)) { + if (empty($params['openid_dh_consumer_public'])) { + $ret['error'] = 'Wrong "openid.dh_consumer_public"'; + return $ret; + } + if (empty($params['openid_dh_gen'])) { + $g = pack('H*', Zend_OpenId::DH_G); + } else { + $g = base64_decode($params['openid_dh_gen']); + } + if (empty($params['openid_dh_modulus'])) { + $p = pack('H*', Zend_OpenId::DH_P); + } else { + $p = base64_decode($params['openid_dh_modulus']); + } + + $dh = Zend_OpenId::createDhKey($p, $g); + $dh_details = Zend_OpenId::getDhKeyDetails($dh); + + $sec = Zend_OpenId::computeDhSecret( + base64_decode($params['openid_dh_consumer_public']), $dh); + if ($sec === false) { + $ret['error'] = 'Wrong "openid.session_type"'; + $ret['error-code'] = 'unsupported-type'; + return $ret; + } + $sec = Zend_OpenId::digest($dhFunc, $sec); + $ret['dh_server_public'] = base64_encode( + Zend_OpenId::btwoc($dh_details['pub_key'])); + $ret['enc_mac_key'] = base64_encode($secret ^ $sec); + } + + $handle = uniqid(); + $expiresIn = $this->_sessionTtl; + + $ret['assoc_handle'] = $handle; + $ret['expires_in'] = $expiresIn; + + $this->_storage->addAssociation($handle, + $macFunc, $secret, time() + $expiresIn); + + return $ret; + } + + /** + * Performs authentication (or authentication check). + * + * @param float $version OpenID version + * @param array $params GET or POST request variables + * @param bool $immediate enables or disables interaction with user + * @param mixed $extensions extension object or array of extensions objects + * @param Zend_Controller_Response_Abstract $response + * @return array + */ + protected function _checkId($version, $params, $immediate, $extensions=null, + Zend_Controller_Response_Abstract $response = null) + { + $ret = array(); + + if ($version >= 2.0) { + $ret['openid.ns'] = Zend_OpenId::NS_2_0; + } + $root = $this->getSiteRoot($params); + if ($root === false) { + return false; + } + + if (isset($params['openid_identity']) && + !$this->_storage->hasUser($params['openid_identity'])) { + $ret['openid.mode'] = ($immediate && $version >= 2.0) ? 'setup_needed': 'cancel'; + return $ret; + } + + /* Check if user already logged in into the server */ + if (!isset($params['openid_identity']) || + $this->_user->getLoggedInUser() !== $params['openid_identity']) { + $params2 = array(); + foreach ($params as $key => $val) { + if (strpos($key, 'openid_ns_') === 0) { + $key = 'openid.ns.' . substr($key, strlen('openid_ns_')); + } else if (strpos($key, 'openid_sreg_') === 0) { + $key = 'openid.sreg.' . substr($key, strlen('openid_sreg_')); + } else if (strpos($key, 'openid_') === 0) { + $key = 'openid.' . substr($key, strlen('openid_')); + } + $params2[$key] = $val; + } + if ($immediate) { + $params2['openid.mode'] = 'checkid_setup'; + $ret['openid.mode'] = ($version >= 2.0) ? 'setup_needed': 'id_res'; + $ret['openid.user_setup_url'] = $this->_loginUrl + . (strpos($this->_loginUrl, '?') === false ? '?' : '&') + . Zend_OpenId::paramsToQuery($params2); + return $ret; + } else { + /* Redirect to Server Login Screen */ + Zend_OpenId::redirect($this->_loginUrl, $params2, $response); + return true; + } + } + + if (!Zend_OpenId_Extension::forAll($extensions, 'parseRequest', $params)) { + $ret['openid.mode'] = ($immediate && $version >= 2.0) ? 'setup_needed': 'cancel'; + return $ret; + } + + /* Check if user trusts to the consumer */ + $trusted = null; + $sites = $this->_storage->getTrustedSites($params['openid_identity']); + if (isset($params['openid_return_to'])) { + $root = $params['openid_return_to']; + } + if (isset($sites[$root])) { + $trusted = $sites[$root]; + } else { + foreach ($sites as $site => $t) { + if (strpos($root, $site) === 0) { + $trusted = $t; + break; + } else { + /* OpenID 2.0 (9.2) check for realm wild-card matching */ + $n = strpos($site, '://*.'); + if ($n != false) { + $regex = '/^' + . preg_quote(substr($site, 0, $n+3), '/') + . '[A-Za-z1-9_\.]+?' + . preg_quote(substr($site, $n+4), '/') + . '/'; + if (preg_match($regex, $root)) { + $trusted = $t; + break; + } + } + } + } + } + + if (is_array($trusted)) { + if (!Zend_OpenId_Extension::forAll($extensions, 'checkTrustData', $trusted)) { + $trusted = null; + } + } + + if ($trusted === false) { + $ret['openid.mode'] = 'cancel'; + return $ret; + } else if (is_null($trusted)) { + /* Redirect to Server Trust Screen */ + $params2 = array(); + foreach ($params as $key => $val) { + if (strpos($key, 'openid_ns_') === 0) { + $key = 'openid.ns.' . substr($key, strlen('openid_ns_')); + } else if (strpos($key, 'openid_sreg_') === 0) { + $key = 'openid.sreg.' . substr($key, strlen('openid_sreg_')); + } else if (strpos($key, 'openid_') === 0) { + $key = 'openid.' . substr($key, strlen('openid_')); + } + $params2[$key] = $val; + } + if ($immediate) { + $params2['openid.mode'] = 'checkid_setup'; + $ret['openid.mode'] = ($version >= 2.0) ? 'setup_needed': 'id_res'; + $ret['openid.user_setup_url'] = $this->_trustUrl + . (strpos($this->_trustUrl, '?') === false ? '?' : '&') + . Zend_OpenId::paramsToQuery($params2); + return $ret; + } else { + Zend_OpenId::redirect($this->_trustUrl, $params2, $response); + return true; + } + } + + return $this->_respond($version, $ret, $params, $extensions); + } + + /** + * Perepares information to send back to consumer's authentication request, + * signs it using shared secret and send back through HTTP redirection + * + * @param array $params GET or POST request variables + * @param mixed $extensions extension object or array of extensions objects + * @param Zend_Controller_Response_Abstract $response an optional response + * object to perform HTTP or HTML form redirection + * @return bool + */ + public function respondToConsumer($params, $extensions=null, + Zend_Controller_Response_Abstract $response = null) + { + $version = 1.1; + if (isset($params['openid_ns']) && + $params['openid_ns'] == Zend_OpenId::NS_2_0) { + $version = 2.0; + } + $ret = array(); + if ($version >= 2.0) { + $ret['openid.ns'] = Zend_OpenId::NS_2_0; + } + $ret = $this->_respond($version, $ret, $params, $extensions); + if (!empty($params['openid_return_to'])) { + Zend_OpenId::redirect($params['openid_return_to'], $ret, $response); + } + return true; + } + + /** + * Perepares information to send back to consumer's authentication request + * and signs it using shared secret. + * + * @param float $version OpenID protcol version + * @param array $ret arguments to be send back to consumer + * @param array $params GET or POST request variables + * @param mixed $extensions extension object or array of extensions objects + * @return array + */ + protected function _respond($version, $ret, $params, $extensions=null) + { + if (empty($params['openid_assoc_handle']) || + !$this->_storage->getAssociation($params['openid_assoc_handle'], + $macFunc, $secret, $expires)) { + /* Use dumb mode */ + if (!empty($params['openid_assoc_handle'])) { + $ret['openid.invalidate_handle'] = $params['openid_assoc_handle']; + } + $macFunc = $version >= 2.0 ? 'sha256' : 'sha1'; + $secret = $this->_genSecret($macFunc); + $handle = uniqid(); + $expiresIn = $this->_sessionTtl; + $this->_storage->addAssociation($handle, + $macFunc, $secret, time() + $expiresIn); + $ret['openid.assoc_handle'] = $handle; + } else { + $ret['openid.assoc_handle'] = $params['openid_assoc_handle']; + } + if (isset($params['openid_return_to'])) { + $ret['openid.return_to'] = $params['openid_return_to']; + } + if (isset($params['openid_claimed_id'])) { + $ret['openid.claimed_id'] = $params['openid_claimed_id']; + } + if (isset($params['openid_identity'])) { + $ret['openid.identity'] = $params['openid_identity']; + } + + if ($version >= 2.0) { + if (!empty($this->_opEndpoint)) { + $ret['openid.op_endpoint'] = $this->_opEndpoint; + } else { + $ret['openid.op_endpoint'] = Zend_OpenId::selfUrl(); + } + } + $ret['openid.response_nonce'] = gmdate('Y-m-d\TH:i:s\Z') . uniqid(); + $ret['openid.mode'] = 'id_res'; + + Zend_OpenId_Extension::forAll($extensions, 'prepareResponse', $ret); + + $signed = ''; + $data = ''; + foreach ($ret as $key => $val) { + if (strpos($key, 'openid.') === 0) { + $key = substr($key, strlen('openid.')); + if (!empty($signed)) { + $signed .= ','; + } + $signed .= $key; + $data .= $key . ':' . $val . "\n"; + } + } + $signed .= ',signed'; + $data .= 'signed:' . $signed . "\n"; + $ret['openid.signed'] = $signed; + + $ret['openid.sig'] = base64_encode( + Zend_OpenId::hashHmac($macFunc, $data, $secret)); + + return $ret; + } + + /** + * Performs authentication validation for dumb consumers + * Returns array of variables to push back to consumer. + * It MUST contain 'is_valid' variable with value 'true' or 'false'. + * + * @param float $version OpenID version + * @param array $params GET or POST request variables + * @return array + */ + protected function _checkAuthentication($version, $params) + { + $ret = array(); + if ($version >= 2.0) { + $ret['ns'] = Zend_OpenId::NS_2_0; + } + $ret['openid.mode'] = 'id_res'; + + if (empty($params['openid_assoc_handle']) || + empty($params['openid_signed']) || + empty($params['openid_sig']) || + !$this->_storage->getAssociation($params['openid_assoc_handle'], + $macFunc, $secret, $expires)) { + $ret['is_valid'] = 'false'; + return $ret; + } + + $signed = explode(',', $params['openid_signed']); + $data = ''; + foreach ($signed as $key) { + $data .= $key . ':'; + if ($key == 'mode') { + $data .= "id_res\n"; + } else { + $data .= $params['openid_' . strtr($key,'.','_')]."\n"; + } + } + if (base64_decode($params['openid_sig']) === + Zend_OpenId::hashHmac($macFunc, $data, $secret)) { + $ret['is_valid'] = 'true'; + } else { + $ret['is_valid'] = 'false'; + } + return $ret; + } +} diff --git a/libs/Zend/OpenId/Provider/Storage.php b/libs/Zend/OpenId/Provider/Storage.php new file mode 100644 index 0000000..53aa7cd --- /dev/null +++ b/libs/Zend/OpenId/Provider/Storage.php @@ -0,0 +1,106 @@ +_dir = $dir; + if (!is_dir($this->_dir)) { + if (!@mkdir($this->_dir, 0700, 1)) { + throw new Zend_OpenId_Exception( + "Cannot access storage directory $dir", + Zend_OpenId_Exception::ERROR_STORAGE); + } + } + if (($f = fopen($this->_dir.'/assoc.lock', 'w+')) === null) { + throw new Zend_OpenId_Exception( + 'Cannot create a lock file in the directory ' . $dir, + Zend_OpenId_Exception::ERROR_STORAGE); + } + fclose($f); + if (($f = fopen($this->_dir.'/user.lock', 'w+')) === null) { + throw new Zend_OpenId_Exception( + 'Cannot create a lock file in the directory ' . $dir, + Zend_OpenId_Exception::ERROR_STORAGE); + } + fclose($f); + } + + /** + * Stores information about session identified by $handle + * + * @param string $handle assiciation handle + * @param string $macFunc HMAC function (sha1 or sha256) + * @param string $secret shared secret + * @param string $expires expiration UNIX time + * @return bool + */ + public function addAssociation($handle, $macFunc, $secret, $expires) + { + $name = $this->_dir . '/assoc_' . md5($handle); + $lock = @fopen($this->_dir . '/assoc.lock', 'w+'); + if ($lock === false) { + return false; + } + if (!flock($lock, LOCK_EX)) { + fclose($lock); + return false; + } + $f = @fopen($name, 'w+'); + if ($f === false) { + fclose($lock); + return false; + } + $data = serialize(array($handle, $macFunc, $secret, $expires)); + fwrite($f, $data); + fclose($f); + fclose($lock); + return true; + } + + /** + * Gets information about association identified by $handle + * Returns true if given association found and not expired and false + * otherwise + * + * @param string $handle assiciation handle + * @param string &$macFunc HMAC function (sha1 or sha256) + * @param string &$secret shared secret + * @param string &$expires expiration UNIX time + * @return bool + */ + public function getAssociation($handle, &$macFunc, &$secret, &$expires) + { + $name = $this->_dir . '/assoc_' . md5($handle); + $lock = @fopen($this->_dir . '/assoc.lock', 'w+'); + if ($lock === false) { + return false; + } + if (!flock($lock, LOCK_EX)) { + fclose($lock); + return false; + } + $f = @fopen($name, 'r'); + if ($f === false) { + fclose($lock); + return false; + } + $ret = false; + $data = stream_get_contents($f); + if (!empty($data)) { + list($storedHandle, $macFunc, $secret, $expires) = unserialize($data); + if ($handle === $storedHandle && $expires > time()) { + $ret = true; + } else { + fclose($f); + @unlink($name); + fclose($lock); + return false; + } + } + fclose($f); + fclose($lock); + return $ret; + } + + /** + * Removes information about association identified by $handle + * + * @param string $handle assiciation handle + * @return bool + */ + public function delAssociation($handle) + { + $name = $this->_dir . '/assoc_' . md5($handle); + $lock = @fopen($this->_dir . '/assoc.lock', 'w+'); + if ($lock === false) { + return false; + } + if (!flock($lock, LOCK_EX)) { + fclose($lock); + return false; + } + @unlink($name); + fclose($lock); + return true; + } + + /** + * Register new user with given $id and $password + * Returns true in case of success and false if user with given $id already + * exists + * + * @param string $id user identity URL + * @param string $password encoded user password + * @return bool + */ + public function addUser($id, $password) + { + $name = $this->_dir . '/user_' . md5($id); + $lock = @fopen($this->_dir . '/user.lock', 'w+'); + if ($lock === false) { + return false; + } + if (!flock($lock, LOCK_EX)) { + fclose($lock); + return false; + } + $f = @fopen($name, 'x'); + if ($f === false) { + fclose($lock); + return false; + } + $data = serialize(array($id, $password, array())); + fwrite($f, $data); + fclose($f); + fclose($lock); + return true; + } + + /** + * Returns true if user with given $id exists and false otherwise + * + * @param string $id user identity URL + * @return bool + */ + public function hasUser($id) + { + $name = $this->_dir . '/user_' . md5($id); + $lock = @fopen($this->_dir . '/user.lock', 'w+'); + if ($lock === false) { + return false; + } + if (!flock($lock, LOCK_SH)) { + fclose($lock); + return false; + } + $f = @fopen($name, 'r'); + if ($f === false) { + fclose($lock); + return false; + } + $ret = false; + $data = stream_get_contents($f); + if (!empty($data)) { + list($storedId, $storedPassword, $trusted) = unserialize($data); + if ($id === $storedId) { + $ret = true; + } + } + fclose($f); + fclose($lock); + return $ret; + } + + /** + * Verify if user with given $id exists and has specified $password + * + * @param string $id user identity URL + * @param string $password user password + * @return bool + */ + public function checkUser($id, $password) + { + $name = $this->_dir . '/user_' . md5($id); + $lock = @fopen($this->_dir . '/user.lock', 'w+'); + if ($lock === false) { + return false; + } + if (!flock($lock, LOCK_SH)) { + fclose($lock); + return false; + } + $f = @fopen($name, 'r'); + if ($f === false) { + fclose($lock); + return false; + } + $ret = false; + $data = stream_get_contents($f); + if (!empty($data)) { + list($storedId, $storedPassword, $trusted) = unserialize($data); + if ($id === $storedId && $password === $storedPassword) { + $ret = true; + } + } + fclose($f); + fclose($lock); + return $ret; + } + + /** + * Removes information abou specified user + * + * @param string $id user identity URL + * @return bool + */ + public function delUser($id) + { + $name = $this->_dir . '/user_' . md5($id); + $lock = @fopen($this->_dir . '/user.lock', 'w+'); + if ($lock === false) { + return false; + } + if (!flock($lock, LOCK_EX)) { + fclose($lock); + return false; + } + @unlink($name); + fclose($lock); + return true; + } + + /** + * Returns array of all trusted/untrusted sites for given user identified + * by $id + * + * @param string $id user identity URL + * @return array + */ + public function getTrustedSites($id) + { + $name = $this->_dir . '/user_' . md5($id); + $lock = @fopen($this->_dir . '/user.lock', 'w+'); + if ($lock === false) { + return false; + } + if (!flock($lock, LOCK_SH)) { + fclose($lock); + return false; + } + $f = @fopen($name, 'r'); + if ($f === false) { + fclose($lock); + return false; + } + $ret = false; + $data = stream_get_contents($f); + if (!empty($data)) { + list($storedId, $storedPassword, $trusted) = unserialize($data); + if ($id === $storedId) { + $ret = $trusted; + } + } + fclose($f); + fclose($lock); + return $ret; + } + + /** + * Stores information about trusted/untrusted site for given user + * + * @param string $id user identity URL + * @param string $site site URL + * @param mixed $trusted trust data from extension or just a boolean value + * @return bool + */ + public function addSite($id, $site, $trusted) + { + $name = $this->_dir . '/user_' . md5($id); + $lock = @fopen($this->_dir . '/user.lock', 'w+'); + if ($lock === false) { + return false; + } + if (!flock($lock, LOCK_EX)) { + fclose($lock); + return false; + } + $f = @fopen($name, 'r+'); + if ($f === false) { + fclose($lock); + return false; + } + $ret = false; + $data = stream_get_contents($f); + if (!empty($data)) { + list($storedId, $storedPassword, $sites) = unserialize($data); + if ($id === $storedId) { + if (is_null($trusted)) { + unset($sites[$site]); + } else { + $sites[$site] = $trusted; + } + rewind($f); + ftruncate($f, 0); + $data = serialize(array($id, $storedPassword, $sites)); + fwrite($f, $data); + $ret = true; + } + } + fclose($f); + fclose($lock); + return $ret; + } +} diff --git a/libs/Zend/OpenId/Provider/User.php b/libs/Zend/OpenId/Provider/User.php new file mode 100644 index 0000000..db73612 --- /dev/null +++ b/libs/Zend/OpenId/Provider/User.php @@ -0,0 +1,57 @@ +_session = new Zend_Session_Namespace("openid"); + } else { + $this->_session = $session; + } + } + + /** + * Stores information about logged in user in session data + * + * @param string $id user identity URL + * @return bool + */ + public function setLoggedInUser($id) + { + $this->_session->logged_in = $id; + return true; + } + + /** + * Returns identity URL of logged in user or false + * + * @return mixed + */ + public function getLoggedInUser() + { + if (isset($this->_session->logged_in)) { + return $this->_session->logged_in; + } + return false; + } + + /** + * Performs logout. Clears information about logged in user. + * + * @return bool + */ + public function delLoggedInUser() + { + unset($this->_session->logged_in); + return true; + } + +} diff --git a/libs/Zend/Paginator.php b/libs/Zend/Paginator.php new file mode 100644 index 0000000..107275f --- /dev/null +++ b/libs/Zend/Paginator.php @@ -0,0 +1,918 @@ +addPrefixPath($prefix, $path); + } + + /** + * Adds an array of adapter prefix paths to the plugin + * loader. + * + * + * $prefixPaths = array( + * 'My_Paginator_Adapter' => 'My/Paginator/Adapter/', + * 'Your_Paginator_Adapter' => 'Your/Paginator/Adapter/' + * ); + * + * + * @param array $prefixPaths + */ + public static function addAdapterPrefixPaths(array $prefixPaths) + { + if (isset($prefixPaths['prefix']) and isset($prefixPaths['path'])) { + self::addAdapterPrefixPath($prefixPaths['prefix'], $prefixPaths['path']); + } else { + foreach ($prefixPaths as $prefix => $path) { + if (is_array($path) and isset($path['prefix']) and isset($path['path'])) { + $prefix = $path['prefix']; + $path = $path['path']; + } + + self::addAdapterPrefixPath($prefix, $path); + } + } + } + + /** + * Adds a scrolling style prefix path to the plugin loader. + * + * @param string $prefix + * @param string $path + */ + public static function addScrollingStylePrefixPath($prefix, $path) + { + self::getScrollingStyleLoader()->addPrefixPath($prefix, $path); + } + + /** + * Adds an array of scrolling style prefix paths to the plugin + * loader. + * + * + * $prefixPaths = array( + * 'My_Paginator_ScrollingStyle' => 'My/Paginator/ScrollingStyle/', + * 'Your_Paginator_ScrollingStyle' => 'Your/Paginator/ScrollingStyle/' + * ); + * + * + * @param array $prefixPaths + */ + public static function addScrollingStylePrefixPaths(array $prefixPaths) + { + if (isset($prefixPaths['prefix']) and isset($prefixPaths['path'])) { + self::addScrollingStylePrefixPath($prefixPaths['prefix'], $prefixPaths['path']); + } else { + foreach ($prefixPaths as $prefix => $path) { + if (is_array($path) and isset($path['prefix']) and isset($path['path'])) { + $prefix = $path['prefix']; + $path = $path['path']; + } + + self::addScrollingStylePrefixPath($prefix, $path); + } + } + } + + /** + * Factory. + * + * @param mixed $data + * @param string $adapter + * @param array $prefixPaths + * @return Zend_Paginator + */ + public static function factory($data, $adapter = self::INTERNAL_ADAPTER, + array $prefixPaths = null) + { + if ($adapter == self::INTERNAL_ADAPTER) { + if (is_array($data)) { + $adapter = 'Array'; + } else if ($data instanceof Zend_Db_Table_Select) { + $adapter = 'DbTableSelect'; + } else if ($data instanceof Zend_Db_Select) { + $adapter = 'DbSelect'; + } else if ($data instanceof Iterator) { + $adapter = 'Iterator'; + } else if (is_integer($data)) { + $adapter = 'Null'; + } else { + $type = (is_object($data)) ? get_class($data) : gettype($data); + + /** + * @see Zend_Paginator_Exception + */ + require_once 'Zend/Paginator/Exception.php'; + + throw new Zend_Paginator_Exception('No adapter for type ' . $type); + } + } + + $pluginLoader = self::getAdapterLoader(); + + if (null !== $prefixPaths) { + foreach ($prefixPaths as $prefix => $path) { + $pluginLoader->addPrefixPath($prefix, $path); + } + } + + $adapterClassName = $pluginLoader->load($adapter); + + return new self(new $adapterClassName($data)); + } + + /** + * Returns the adapter loader. If it doesn't exist it's created. + * + * @return Zend_Loader_PluginLoader + */ + public static function getAdapterLoader() + { + if (self::$_adapterLoader === null) { + self::$_adapterLoader = new Zend_Loader_PluginLoader( + array('Zend_Paginator_Adapter' => 'Zend/Paginator/Adapter') + ); + } + + return self::$_adapterLoader; + } + + /** + * Set a global config + * + * @param Zend_Config $config + */ + public static function setConfig(Zend_Config $config) + { + self::$_config = $config; + + $adapterPaths = $config->get('adapterpaths'); + + if ($adapterPaths != null) { + self::addAdapterPrefixPaths($adapterPaths->adapterpath->toArray()); + } + + $prefixPaths = $config->get('prefixpaths'); + + if ($prefixPaths != null) { + self::addScrollingStylePrefixPaths($prefixPaths->prefixpath->toArray()); + } + + $scrollingStyle = $config->get('scrollingstyle'); + + if ($scrollingStyle != null) { + self::setDefaultScrollingStyle($scrollingStyle); + } + } + + /** + * Returns the default scrolling style. + * + * @return string + */ + public static function getDefaultScrollingStyle() + { + return self::$_defaultScrollingStyle; + } + + /** + * Sets the default scrolling style. + * + * @param string $scrollingStyle + */ + public static function setDefaultScrollingStyle($scrollingStyle = 'Sliding') + { + self::$_defaultScrollingStyle = $scrollingStyle; + } + + /** + * Returns the scrolling style loader. If it doesn't exist it's + * created. + * + * @return Zend_Loader_PluginLoader + */ + public static function getScrollingStyleLoader() + { + if (self::$_scrollingStyleLoader === null) { + self::$_scrollingStyleLoader = new Zend_Loader_PluginLoader( + array('Zend_Paginator_ScrollingStyle' => 'Zend/Paginator/ScrollingStyle') + ); + } + + return self::$_scrollingStyleLoader; + } + + /** + * Constructor. + */ + public function __construct(Zend_Paginator_Adapter_Interface $adapter) + { + $this->_adapter = $adapter; + + $config = self::$_config; + + if ($config != null) { + $setupMethods = array('ItemCountPerPage', 'PageRange'); + + foreach ($setupMethods as $setupMethod) { + $value = $config->get(strtolower($setupMethod)); + + if ($value != null) { + $setupMethod = 'set' . $setupMethod; + $this->$setupMethod($value); + } + } + } + } + + /** + * Serializes the object as a string. Proxies to {@link render()}. + * + * @return string + */ + public function __toString() + { + try { + $return = $this->render(); + return $return; + } catch (Exception $e) { + trigger_error($e->getMessage(), E_USER_WARNING); + } + + return ''; + } + + /** + * Returns the number of pages. + * + * @return integer + */ + public function count() + { + if (!$this->_pageCount) { + $this->_pageCount = $this->_calculatePageCount(); + } + + return $this->_pageCount; + } + + /** + * Returns the total number of items available. + * + * @return integer + */ + public function getTotalItemCount() + { + return count($this->_adapter); + } + + /** + * Clear the page item cache. + * + * @param int $pageNumber + * @return Zend_Paginator + */ + public function clearPageItemCache($pageNumber = null) + { + if (null === $pageNumber) { + $this->_pageItems = array(); + } else if (isset($this->_pageItems[$pageNumber])) { + unset($this->_pageItems[$pageNumber]); + } + + return $this; + } + + /** + * Returns the absolute item number for the specified item. + * + * @param integer $relativeItemNumber Relative item number + * @param integer $pageNumber Page number + * @return integer + */ + public function getAbsoluteItemNumber($relativeItemNumber, $pageNumber = null) + { + $relativeItemNumber = $this->normalizeItemNumber($relativeItemNumber); + + if ($pageNumber == null) { + $pageNumber = $this->getCurrentPageNumber(); + } + + $pageNumber = $this->normalizePageNumber($pageNumber); + + return (($pageNumber - 1) * $this->getItemCountPerPage()) + $relativeItemNumber; + } + + /** + * Returns the adapter. + * + * @return Zend_Paginator_Adapter_Interface + */ + public function getAdapter() + { + return $this->_adapter; + } + + /** + * Returns the number of items for the current page. + * + * @return integer + */ + public function getCurrentItemCount() + { + if ($this->_currentItemCount === null) { + $this->_currentItemCount = $this->getItemCount($this->getCurrentItems()); + } + + return $this->_currentItemCount; + } + + /** + * Returns the items for the current page. + * + * @return Traversable + */ + public function getCurrentItems() + { + if ($this->_currentItems === null) { + $this->_currentItems = $this->getItemsByPage($this->getCurrentPageNumber()); + } + + return $this->_currentItems; + } + + /** + * Returns the current page number. + * + * @return integer + */ + public function getCurrentPageNumber() + { + return $this->normalizePageNumber($this->_currentPageNumber); + } + + /** + * Sets the current page number. + * + * @param integer $pageNumber Page number + * @return Zend_Paginator $this + */ + public function setCurrentPageNumber($pageNumber) + { + $this->_currentPageNumber = (integer) $pageNumber; + $this->_currentItems = null; + $this->_currentItemCount = null; + + return $this; + } + + /** + * Returns an item from a page. The current page is used if there's no + * page sepcified. + * + * @param integer $itemNumber Item number (1 to itemCountPerPage) + * @param integer $pageNumber + * @return mixed + */ + public function getItem($itemNumber, $pageNumber = null) + { + $itemNumber = $this->normalizeItemNumber($itemNumber); + + if ($pageNumber == null) { + $pageNumber = $this->getCurrentPageNumber(); + } + + $page = $this->getItemsByPage($pageNumber); + $itemCount = $this->getItemCount($page); + + if ($itemCount == 0) { + /** + * @see Zend_Paginator_Exception + */ + require_once 'Zend/Paginator/Exception.php'; + + throw new Zend_Paginator_Exception('Page ' . $pageNumber . ' does not exist'); + } + + if ($itemNumber > $itemCount) { + /** + * @see Zend_Paginator_Exception + */ + require_once 'Zend/Paginator/Exception.php'; + + throw new Zend_Paginator_Exception('Page ' . $pageNumber . ' does not' + . ' contain item number ' . $itemNumber); + } + + return $page[$itemNumber - 1]; + } + + /** + * Returns the number of items per page. + * + * @return integer + */ + public function getItemCountPerPage() + { + return $this->_itemCountPerPage; + } + + /** + * Sets the number of items per page. + * + * @param integer $itemCountPerPage + * @return Zend_Paginator $this + */ + public function setItemCountPerPage($itemCountPerPage) + { + $this->_itemCountPerPage = (integer) $itemCountPerPage; + if ($this->_itemCountPerPage == 0) { + $this->_itemCountPerPage = 1; + } + $this->_pageCount = $this->_calculatePageCount(); + $this->_pageItems = array(); + $this->_currentItems = null; + $this->_currentItemCount = null; + + return $this; + } + + /** + * Returns the number of items in a collection. + * + * @param mixed $items Items + * @return integer + */ + public function getItemCount($items) + { + $itemCount = 0; + + if (is_array($items) or $items instanceof Countable) { + $itemCount = count($items); + } else { // $items is something like LimitIterator + foreach ($items as $item) { + $itemCount++; + } + } + + return $itemCount; + } + + /** + * Returns the items for a given page. + * + * @return Traversable + */ + public function getItemsByPage($pageNumber) + { + $pageNumber = $this->normalizePageNumber($pageNumber); + + if (isset($this->_pageItems[$pageNumber])) { + return $this->_pageItems[$pageNumber]; + } + + $offset = ($pageNumber - 1) * $this->_itemCountPerPage; + + $items = $this->_adapter->getItems($offset, $this->_itemCountPerPage); + + if (!$items instanceof Traversable) { + $items = new ArrayIterator($items); + } + + $this->_pageItems[$pageNumber] = $items; + + return $items; + } + + /** + * Returns a foreach-compatible iterator. + * + * @return Traversable + */ + public function getIterator() + { + return $this->getCurrentItems(); + } + + /** + * Returns the page range (see property declaration above). + * + * @return integer + */ + public function getPageRange() + { + return $this->_pageRange; + } + + /** + * Sets the page range (see property declaration above). + * + * @param integer $pageRange + * @return Zend_Paginator $this + */ + public function setPageRange($pageRange) + { + $this->_pageRange = (integer) $pageRange; + + return $this; + } + + /** + * Returns the page collection. + * + * @param string $scrollingStyle Scrolling style + * @return array + */ + public function getPages($scrollingStyle = null) + { + if ($this->_pages === null) { + $this->_pages = $this->_createPages($scrollingStyle); + } + + return $this->_pages; + } + + /** + * Returns a subset of pages within a given range. + * + * @param integer $lowerBound Lower bound of the range + * @param integer $upperBound Upper bound of the range + * @return array + */ + public function getPagesInRange($lowerBound, $upperBound) + { + $lowerBound = $this->normalizePageNumber($lowerBound); + $upperBound = $this->normalizePageNumber($upperBound); + + $pages = array(); + + for ($pageNumber = $lowerBound; $pageNumber <= $upperBound; $pageNumber++) { + $pages[$pageNumber] = $pageNumber; + } + + return $pages; + } + + /** + * Returns the page item cache. + * + * @return array + */ + public function getPageItemCache() + { + return $this->_pageItems; + } + + /** + * Retrieves the view instance. If none registered, attempts to pull f + * rom ViewRenderer. + * + * @return Zend_View_Interface|null + */ + public function getView() + { + if ($this->_view === null) { + /** + * @see Zend_Controller_Action_HelperBroker + */ + require_once 'Zend/Controller/Action/HelperBroker.php'; + + $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer'); + if ($viewRenderer->view === null) { + $viewRenderer->initView(); + } + $this->_view = $viewRenderer->view; + } + + return $this->_view; + } + + /** + * Sets the view object. + * + * @param Zend_View_Interface $view + * @return Zend_Paginator + */ + public function setView(Zend_View_Interface $view = null) + { + $this->_view = $view; + + return $this; + } + + /** + * Brings the item number in range of the page. + * + * @param integer $itemNumber + * @return integer + */ + public function normalizeItemNumber($itemNumber) + { + if ($itemNumber < 1) { + $itemNumber = 1; + } + + if ($itemNumber > $this->_itemCountPerPage) { + $itemNumber = $this->_itemCountPerPage; + } + + return $itemNumber; + } + + /** + * Brings the page number in range of the paginator. + * + * @param integer $pageNumber + * @return integer + */ + public function normalizePageNumber($pageNumber) + { + if ($pageNumber < 1) { + $pageNumber = 1; + } + + $pageCount = $this->count(); + + if ($pageCount > 0 and $pageNumber > $pageCount) { + $pageNumber = $pageCount; + } + + return $pageNumber; + } + + /** + * Renders the paginator. + * + * @param Zend_View_Interface $view + * @return string + */ + public function render(Zend_View_Interface $view = null) + { + if (null !== $view) { + $this->setView($view); + } + + $view = $this->getView(); + + return $view->paginationControl($this); + } + + /** + * Returns the items of the current page as JSON. + * + * @return string + */ + public function toJson() + { + return Zend_Json::encode($this->getCurrentItems()); + } + + /** + * Calculates the page count. + * + * @return integer + */ + protected function _calculatePageCount() + { + return (integer) ceil($this->_adapter->count() / $this->_itemCountPerPage); + } + + /** + * Creates the page collection. + * + * @param string $scrollingStyle Scrolling style + * @return stdClass + */ + protected function _createPages($scrollingStyle = null) + { + $pageCount = $this->count(); + $currentPageNumber = $this->getCurrentPageNumber(); + + $pages = new stdClass(); + $pages->pageCount = $pageCount; + $pages->itemCountPerPage = $this->getItemCountPerPage(); + $pages->first = 1; + $pages->current = $currentPageNumber; + $pages->last = $pageCount; + + // Previous and next + if ($currentPageNumber - 1 > 0) { + $pages->previous = $currentPageNumber - 1; + } + + if ($currentPageNumber + 1 <= $pageCount) { + $pages->next = $currentPageNumber + 1; + } + + // Pages in range + $scrollingStyle = $this->_loadScrollingStyle($scrollingStyle); + $pages->pagesInRange = $scrollingStyle->getPages($this); + $pages->firstPageInRange = min($pages->pagesInRange); + $pages->lastPageInRange = max($pages->pagesInRange); + + // Item numbers + if ($this->getCurrentItems() !== null) { + $pages->currentItemCount = $this->getCurrentItemCount(); + $pages->itemCountPerPage = $this->getItemCountPerPage(); + $pages->totalItemCount = $this->getTotalItemCount(); + $pages->firstItemNumber = (($currentPageNumber - 1) * $this->_itemCountPerPage) + 1; + $pages->lastItemNumber = $pages->firstItemNumber + $pages->currentItemCount - 1; + } + + return $pages; + } + + /** + * Loads a scrolling style. + * + * @param string $scrollingStyle + * @return Zend_Paginator_ScrollingStyle_Interface + */ + protected function _loadScrollingStyle($scrollingStyle = null) + { + if ($scrollingStyle === null) { + $scrollingStyle = self::$_defaultScrollingStyle; + } + + switch (strtolower(gettype($scrollingStyle))) { + case 'object': + if (!$scrollingStyle instanceof Zend_Paginator_ScrollingStyle_Interface) { + /** + * @see Zend_View_Exception + */ + require_once 'Zend/View/Exception.php'; + + throw new Zend_View_Exception('Scrolling style must implement ' . + 'Zend_Paginator_ScrollingStyle_Interface'); + } + + return $scrollingStyle; + + case 'string': + $className = self::getScrollingStyleLoader()->load($scrollingStyle); + + return new $className(); + + case 'null': + // Fall through to default case + + default: + /** + * @see Zend_View_Exception + */ + require_once 'Zend/View/Exception.php'; + + throw new Zend_View_Exception('Scrolling style must be a class ' . + 'name or object implementing Zend_Paginator_ScrollingStyle_Interface'); + } + } +} diff --git a/libs/Zend/Paginator/Adapter/Array.php b/libs/Zend/Paginator/Adapter/Array.php new file mode 100644 index 0000000..d3d3a4e --- /dev/null +++ b/libs/Zend/Paginator/Adapter/Array.php @@ -0,0 +1,81 @@ +_array = $array; + $this->_count = count($array); + } + + /** + * Returns an array of items for a page. + * + * @param integer $offset Page offset + * @param integer $itemCountPerPage Number of items per page + * @return array + */ + public function getItems($offset, $itemCountPerPage) + { + return array_slice($this->_array, $offset, $itemCountPerPage); + } + + /** + * Returns the total number of rows in the array. + * + * @return integer + */ + public function count() + { + return $this->_count; + } +} \ No newline at end of file diff --git a/libs/Zend/Paginator/Adapter/DbSelect.php b/libs/Zend/Paginator/Adapter/DbSelect.php new file mode 100644 index 0000000..b86c862 --- /dev/null +++ b/libs/Zend/Paginator/Adapter/DbSelect.php @@ -0,0 +1,203 @@ +_select = $select; + } + + /** + * Sets the total row count, either directly or through a supplied + * query. Without setting this, {@link getPages()} selects the count + * as a subquery (SELECT COUNT ... FROM (SELECT ...)). While this + * yields an accurate count even with queries containing clauses like + * LIMIT, it can be slow in some circumstances. For example, in MySQL, + * subqueries are generally slow when using the InnoDB storage engine. + * Users are therefore encouraged to profile their queries to find + * the solution that best meets their needs. + * + * @param Zend_Db_Select|integer $totalRowCount Total row count integer + * or query + * @return Zend_Paginator_Adapter_DbSelect $this + * @throws Zend_Paginator_Exception + */ + public function setRowCount($rowCount) + { + if ($rowCount instanceof Zend_Db_Select) { + $columns = $rowCount->getPart(Zend_Db_Select::COLUMNS); + + $countColumnPart = $columns[0][1]; + + if ($countColumnPart instanceof Zend_Db_Expr) { + $countColumnPart = $countColumnPart->__toString(); + } + + // The select query can contain only one column, which should be the row count column + if (false === strpos($countColumnPart, self::ROW_COUNT_COLUMN)) { + /** + * @see Zend_Paginator_Exception + */ + require_once 'Zend/Paginator/Exception.php'; + + throw new Zend_Paginator_Exception('Row count column not found'); + } + + $result = $rowCount->query(Zend_Db::FETCH_ASSOC)->fetch(); + + $this->_rowCount = count($result) > 0 ? $result[self::ROW_COUNT_COLUMN] : 0; + } else if (is_integer($rowCount)) { + $this->_rowCount = $rowCount; + } else { + /** + * @see Zend_Paginator_Exception + */ + require_once 'Zend/Paginator/Exception.php'; + + throw new Zend_Paginator_Exception('Invalid row count'); + } + + return $this; + } + + /** + * Returns an array of items for a page. + * + * @param integer $offset Page offset + * @param integer $itemCountPerPage Number of items per page + * @return array + */ + public function getItems($offset, $itemCountPerPage) + { + $this->_select->limit($itemCountPerPage, $offset); + + return $this->_select->query()->fetchAll(); + } + + /** + * Returns the total number of rows in the result set. + * + * @return integer + */ + public function count() + { + if ($this->_rowCount === null) { + $rowCount = clone $this->_select; + + /** + * The DISTINCT and GROUP BY queries only work when selecting one column. + * The question is whether any RDBMS supports DISTINCT for multiple columns, without workarounds. + */ + if (true === $rowCount->getPart(Zend_Db_Select::DISTINCT)) { + $columnParts = $rowCount->getPart(Zend_Db_Select::COLUMNS); + + $columns = array(); + + foreach ($columnParts as $part) { + if ($part[1] == '*' || $part[1] instanceof Zend_Db_Expr) { + $columns[] = $part[1]; + } else { + $columns[] = $rowCount->getAdapter()->quoteIdentifier($part[1], true); + } + } + + if (count($columns) == 1 && $columns[0] == '*') { + $groupPart = null; + } else { + $groupPart = implode(',', $columns); + } + } else { + $groupParts = $rowCount->getPart(Zend_Db_Select::GROUP); + + foreach ($groupParts as &$part) { + if (!($part == '*' || $part instanceof Zend_Db_Expr)) { + $part = $rowCount->getAdapter()->quoteIdentifier($part, true); + } + } + + $groupPart = implode(',', $groupParts); + } + + $countPart = empty($groupPart) ? 'COUNT(*)' : 'COUNT(DISTINCT ' . $groupPart . ')'; + $expression = new Zend_Db_Expr($countPart . ' AS ' . $rowCount->getAdapter()->quoteIdentifier(self::ROW_COUNT_COLUMN)); + + $rowCount->__toString(); // Workaround for ZF-3719 and related + $rowCount->reset(Zend_Db_Select::COLUMNS) + ->reset(Zend_Db_Select::ORDER) + ->reset(Zend_Db_Select::LIMIT_OFFSET) + ->reset(Zend_Db_Select::GROUP) + ->reset(Zend_Db_Select::DISTINCT) + ->columns($expression); + + $this->setRowCount($rowCount); + } + + return $this->_rowCount; + } +} diff --git a/libs/Zend/Paginator/Adapter/DbTableSelect.php b/libs/Zend/Paginator/Adapter/DbTableSelect.php new file mode 100644 index 0000000..47f4b6f --- /dev/null +++ b/libs/Zend/Paginator/Adapter/DbTableSelect.php @@ -0,0 +1,48 @@ +_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 new file mode 100644 index 0000000..c32ce9c --- /dev/null +++ b/libs/Zend/Paginator/Adapter/Interface.php @@ -0,0 +1,47 @@ +_iterator = $iterator; + $this->_count = count($iterator); + } + + /** + * Returns an iterator of items for a page, or an empty array. + * + * @param integer $offset Page offset + * @param integer $itemCountPerPage Number of items per page + * @return LimitIterator|array + */ + public function getItems($offset, $itemCountPerPage) + { + if ($this->_count == 0) { + return array(); + } + + return new LimitIterator($this->_iterator, $offset, $itemCountPerPage); + } + + /** + * Returns the total number of rows in the collection. + * + * @return integer + */ + public function count() + { + return $this->_count; + } +} \ No newline at end of file diff --git a/libs/Zend/Paginator/Adapter/Null.php b/libs/Zend/Paginator/Adapter/Null.php new file mode 100644 index 0000000..27e485f --- /dev/null +++ b/libs/Zend/Paginator/Adapter/Null.php @@ -0,0 +1,73 @@ +_count = $count; + } + + /** + * Returns an array of items for a page. + * + * @param integer $offset Page offset + * @param integer $itemCountPerPage Number of items per page + * @return array + */ + public function getItems($offset, $itemCountPerPage) + { + return array_fill(0, $itemCountPerPage, null); + } + + /** + * Returns the total number of rows in the array. + * + * @return integer + */ + public function count() + { + return $this->_count; + } +} \ No newline at end of file diff --git a/libs/Zend/Paginator/Exception.php b/libs/Zend/Paginator/Exception.php new file mode 100644 index 0000000..3be06c1 --- /dev/null +++ b/libs/Zend/Paginator/Exception.php @@ -0,0 +1,35 @@ +getPagesInRange(1, $paginator->count()); + } +} \ No newline at end of file diff --git a/libs/Zend/Paginator/ScrollingStyle/Elastic.php b/libs/Zend/Paginator/ScrollingStyle/Elastic.php new file mode 100644 index 0000000..1be24b6 --- /dev/null +++ b/libs/Zend/Paginator/ScrollingStyle/Elastic.php @@ -0,0 +1,61 @@ +getPageRange(); + $pageNumber = $paginator->getCurrentPageNumber(); + + $originalPageRange = $pageRange; + $pageRange = $pageRange * 2 - 1; + + if ($originalPageRange + $pageNumber - 1 < $pageRange) { + $pageRange = $originalPageRange + $pageNumber - 1; + } + + 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 new file mode 100644 index 0000000..358fb6d --- /dev/null +++ b/libs/Zend/Paginator/ScrollingStyle/Interface.php @@ -0,0 +1,38 @@ +getPageRange(); + $pageNumber = $paginator->getCurrentPageNumber(); + + $delta = $pageNumber % $pageRange; + + if ($delta == 0) { + $delta = $pageRange; + } + + $offset = $pageNumber - $delta; + $lowerBound = $offset + 1; + $upperBound = $offset + $pageRange; + + 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 new file mode 100644 index 0000000..5fa5879 --- /dev/null +++ b/libs/Zend/Paginator/ScrollingStyle/Sliding.php @@ -0,0 +1,78 @@ +getPageRange(); + } + + $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; + } else { + if ($pageNumber - $delta < 0) { + $delta = $pageNumber; + } + + $offset = $pageNumber - $delta; + $lowerBound = $offset + 1; + $upperBound = $offset + $pageRange; + } + + return $paginator->getPagesInRange($lowerBound, $upperBound); + } +} \ No newline at end of file diff --git a/libs/Zend/Pdf.php b/libs/Zend/Pdf.php new file mode 100644 index 0000000..95c2ac6 --- /dev/null +++ b/libs/Zend/Pdf.php @@ -0,0 +1,900 @@ +render($updateOnly, $file); + + fclose($file); + } + + /** + * Creates or loads PDF document. + * + * If $source is null, then it creates a new document. + * + * If $source is a string and $load is false, then it loads document + * from a binary string. + * + * If $source is a string and $load is true, then it loads document + * from a file. + + * $revision used to roll back document to specified version + * (0 - currtent version, 1 - previous version, 2 - ...) + * + * @param string $source - PDF file to load + * @param integer $revision + * @throws Zend_Pdf_Exception + * @return Zend_Pdf + */ + public function __construct($source = null, $revision = null, $load = false) + { + $this->_objFactory = Zend_Pdf_ElementFactory::createFactory(1); + + if ($source !== null) { + $this->_parser = new Zend_Pdf_Parser($source, $this->_objFactory, $load); + $this->_trailer = $this->_parser->getTrailer(); + if ($revision !== null) { + $this->rollback($revision); + } else { + $this->_loadPages($this->_trailer->Root->Pages); + } + + if ($this->_trailer->Info !== null) { + $this->properties = $this->_trailer->Info->toPhp(); + + if (isset($this->properties['Trapped'])) { + switch ($this->properties['Trapped']) { + case 'True': + $this->properties['Trapped'] = true; + break; + + case 'False': + $this->properties['Trapped'] = false; + break; + + case 'Unknown': + $this->properties['Trapped'] = null; + break; + + default: + // Wrong property value + // Do nothing + break; + } + } + + $this->_originalProperties = $this->properties; + } + } else { + $trailerDictionary = new Zend_Pdf_Element_Dictionary(); + + /** + * Document id + */ + $docId = md5(uniqid(rand(), true)); // 32 byte (128 bit) identifier + $docIdLow = substr($docId, 0, 16); // first 16 bytes + $docIdHigh = substr($docId, 16, 16); // second 16 bytes + + $trailerDictionary->ID = new Zend_Pdf_Element_Array(); + $trailerDictionary->ID->items[] = new Zend_Pdf_Element_String_Binary($docIdLow); + $trailerDictionary->ID->items[] = new Zend_Pdf_Element_String_Binary($docIdHigh); + + $trailerDictionary->Size = new Zend_Pdf_Element_Numeric(0); + + $this->_trailer = new Zend_Pdf_Trailer_Generator($trailerDictionary); + + /** + * Document catalog indirect object. + */ + $docCatalog = $this->_objFactory->newObject(new Zend_Pdf_Element_Dictionary()); + $docCatalog->Type = new Zend_Pdf_Element_Name('Catalog'); + $docCatalog->Version = new Zend_Pdf_Element_Name(Zend_Pdf::PDF_VERSION); + $this->_trailer->Root = $docCatalog; + + /** + * Pages container + */ + $docPages = $this->_objFactory->newObject(new Zend_Pdf_Element_Dictionary()); + $docPages->Type = new Zend_Pdf_Element_Name('Pages'); + $docPages->Kids = new Zend_Pdf_Element_Array(); + $docPages->Count = new Zend_Pdf_Element_Numeric(0); + $docCatalog->Pages = $docPages; + } + } + + /** + * Retrive number of revisions. + * + * @return integer + */ + public function revisions() + { + $revisions = 1; + $currentTrailer = $this->_trailer; + + while ($currentTrailer->getPrev() !== null && $currentTrailer->getPrev()->Root !== null ) { + $revisions++; + $currentTrailer = $currentTrailer->getPrev(); + } + + return $revisions++; + } + + /** + * Rollback document $steps number of revisions. + * This method must be invoked before any changes, applied to the document. + * Otherwise behavior is undefined. + * + * @param integer $steps + */ + public function rollback($steps) + { + for ($count = 0; $count < $steps; $count++) { + if ($this->_trailer->getPrev() !== null && $this->_trailer->getPrev()->Root !== null) { + $this->_trailer = $this->_trailer->getPrev(); + } else { + break; + } + } + $this->_objFactory->setObjectCount($this->_trailer->Size->value); + + // Mark content as modified to force new trailer generation at render time + $this->_trailer->Root->touch(); + + $this->pages = array(); + $this->_loadPages($this->_trailer->Root->Pages); + } + + + /** + * Load pages recursively + * + * @param Zend_Pdf_Element_Reference $pages + * @param array|null $attributes + */ + protected function _loadPages(Zend_Pdf_Element_Reference $pages, $attributes = array()) + { + if ($pages->getType() != Zend_Pdf_Element::TYPE_DICTIONARY) { + throw new Zend_Pdf_Exception('Wrong argument'); + } + + foreach ($pages->getKeys() as $property) { + if (in_array($property, self::$_inheritableAttributes)) { + $attributes[$property] = $pages->$property; + $pages->$property = null; + } + } + + + foreach ($pages->Kids->items as $child) { + if ($child->Type->value == 'Pages') { + $this->_loadPages($child, $attributes); + } else if ($child->Type->value == 'Page') { + foreach (self::$_inheritableAttributes as $property) { + if ($child->$property === null && array_key_exists($property, $attributes)) { + /** + * Important note. + * If any attribute or dependant object is an indirect object, then it's still + * shared between pages. + */ + if ($attributes[$property] instanceof Zend_Pdf_Element_Object) { + $child->$property = $attributes[$property]; + } else { + $child->$property = $this->_objFactory->newObject($attributes[$property]); + } + } + } + $this->pages[] = new Zend_Pdf_Page($child, $this->_objFactory); + } + } + } + + + /** + * Orginize pages to tha pages tree structure. + * + * @todo atomatically attach page to the document, if it's not done yet. + * @todo check, that page is attached to the current document + * + * @todo Dump pages as a balanced tree instead of a plain set. + */ + protected function _dumpPages() + { + $pagesContainer = $this->_trailer->Root->Pages; + $pagesContainer->touch(); + $pagesContainer->Kids->items->clear(); + + foreach ($this->pages as $page ) { + $page->render($this->_objFactory); + + $pageDictionary = $page->getPageDictionary(); + $pageDictionary->touch(); + $pageDictionary->Parent = $pagesContainer; + + $pagesContainer->Kids->items[] = $pageDictionary; + } + + $pagesContainer->Count->touch(); + $pagesContainer->Count->value = count($this->pages); + } + + + /** + * Create page object, attached to the PDF document. + * Method signatures: + * + * 1. Create new page with a specified pagesize. + * If $factory is null then it will be created and page must be attached to the document to be + * included into output. + * --------------------------------------------------------- + * new Zend_Pdf_Page(string $pagesize); + * --------------------------------------------------------- + * + * 2. Create new page with a specified pagesize (in default user space units). + * If $factory is null then it will be created and page must be attached to the document to be + * included into output. + * --------------------------------------------------------- + * new Zend_Pdf_Page(numeric $width, numeric $height); + * --------------------------------------------------------- + * + * @param mixed $param1 + * @param mixed $param2 + * @return Zend_Pdf_Page + */ + public function newPage($param1, $param2 = null) + { + if ($param2 === null) { + return new Zend_Pdf_Page($param1, $this->_objFactory); + } else { + return new Zend_Pdf_Page($param1, $param2, $this->_objFactory); + } + } + + /** + * Return the document-level Metadata + * or null Metadata stream is not presented + * + * @return string + */ + public function getMetadata() + { + if ($this->_trailer->Root->Metadata !== null) { + return $this->_trailer->Root->Metadata->value; + } else { + return null; + } + } + + /** + * Sets the document-level Metadata (mast be valid XMP document) + * + * @param string $metadata + */ + public function setMetadata($metadata) + { + $metadataObject = $this->_objFactory->newStreamObject($metadata); + $metadataObject->dictionary->Type = new Zend_Pdf_Element_Name('Metadata'); + $metadataObject->dictionary->Subtype = new Zend_Pdf_Element_Name('XML'); + + $this->_trailer->Root->Metadata = $metadataObject; + $this->_trailer->Root->touch(); + } + + /** + * Return the document-level JavaScript + * or null if there is no JavaScript for this document + * + * @return string + */ + public function getJavaScript() + { + return $this->_javaScript; + } + + + /** + * Return an associative array containing all the named actions in the PDF. + * Named actions (it's always "GoTo" actions) can be used to reference from outside + * the PDF, ex: 'http://www.something.com/mydocument.pdf#MyAction' + * + * @return array + */ + public function getNamedActions() + { + return $this->_namedActions; + } + + /** + * Extract fonts attached to the document + * + * returns array of Zend_Pdf_Resource_Font_Extracted objects + * + * @return array + */ + public function extractFonts() + { + $fontResourcesUnique = array(); + foreach ($this->pages as $page) { + $pageResources = $page->extractResources(); + + if ($pageResources->Font === null) { + // Page doesn't contain have any font reference + continue; + } + + $fontResources = $pageResources->Font; + + foreach ($fontResources->getKeys() as $fontResourceName) { + $fontDictionary = $fontResources->$fontResourceName; + + if (! ($fontDictionary instanceof Zend_Pdf_Element_Reference || + $fontDictionary instanceof Zend_Pdf_Element_Object) ) { + // Font dictionary has to be an indirect object or object reference + continue; + } + + $fontResourcesUnique[$fontDictionary->toString($this->_objFactory)] = $fontDictionary; + } + } + + $fonts = array(); + foreach ($fontResourcesUnique as $resourceReference => $fontDictionary) { + try { + // Try to extract font + $extractedFont = new Zend_Pdf_Resource_Font_Extracted($fontDictionary); + + $fonts[$resourceReference] = $extractedFont; + } catch (Zend_Pdf_Exception $e) { + if ($e->getMessage() != 'Unsupported font type.') { + throw $e; + } + } + } + + return $fonts; + } + + /** + * Extract font attached to the page by specific font name + * + * $fontName should be specified in UTF-8 encoding + * + * @return Zend_Pdf_Resource_Font_Extracted|null + */ + public function extractFont($fontName) + { + $fontResourcesUnique = array(); + foreach ($this->pages as $page) { + $pageResources = $page->extractResources(); + + if ($pageResources->Font === null) { + // Page doesn't contain have any font reference + continue; + } + + $fontResources = $pageResources->Font; + + foreach ($fontResources->getKeys() as $fontResourceName) { + $fontDictionary = $fontResources->$fontResourceName; + + if (! ($fontDictionary instanceof Zend_Pdf_Element_Reference || + $fontDictionary instanceof Zend_Pdf_Element_Object) ) { + // Font dictionary has to be an indirect object or object reference + continue; + } + + $resourceReference = $fontDictionary->toString($this->_objFactory); + if (isset($fontResourcesUnique[$resourceReference])) { + continue; + } else { + // Mark resource as processed + $fontResourcesUnique[$resourceReference] = 1; + } + + if ($fontDictionary->BaseFont->value != $fontName) { + continue; + } + + try { + // Try to extract font + return new Zend_Pdf_Resource_Font_Extracted($fontDictionary); + } catch (Zend_Pdf_Exception $e) { + if ($e->getMessage() != 'Unsupported font type.') { + throw $e; + } + // Continue searhing + } + } + } + + return null; + } + + /** + * Render the completed PDF to a string. + * If $newSegmentOnly is true, then only appended part of PDF is returned. + * + * @param boolean $newSegmentOnly + * @param resource $outputStream + * @return string + * @throws Zend_Pdf_Exception + */ + public function render($newSegmentOnly = false, $outputStream = null) + { + // Save document properties if necessary + if ($this->properties != $this->_originalProperties) { + $docInfo = $this->_objFactory->newObject(new Zend_Pdf_Element_Dictionary()); + + foreach ($this->properties as $key => $value) { + switch ($key) { + case 'Trapped': + switch ($value) { + case true: + $docInfo->$key = new Zend_Pdf_Element_Name('True'); + break; + + case false: + $docInfo->$key = new Zend_Pdf_Element_Name('False'); + break; + + case null: + $docInfo->$key = new Zend_Pdf_Element_Name('Unknown'); + break; + + default: + throw new Zend_Pdf_Exception('Wrong Trapped document property vale: \'' . $value . '\'. Only true, false and null values are allowed.'); + break; + } + + case 'CreationDate': + // break intentionally omitted + case 'ModDate': + $docInfo->$key = new Zend_Pdf_Element_String((string)$value); + break; + + case 'Title': + // break intentionally omitted + case 'Author': + // break intentionally omitted + case 'Subject': + // break intentionally omitted + case 'Keywords': + // break intentionally omitted + case 'Creator': + // break intentionally omitted + case 'Producer': + $docInfo->$key = new Zend_Pdf_Element_String((string)$value); + break; + + default: + // Set property using PDF type based on PHP type + $docInfo->$key = Zend_Pdf_Element::phpToPdf($value); + break; + } + } + + $this->_trailer->Info = $docInfo; + } + + $this->_dumpPages(); + + // Check, that PDF file was modified + // File is always modified by _dumpPages() now, but future implementations may eliminate this. + if (!$this->_objFactory->isModified()) { + if ($newSegmentOnly) { + // Do nothing, return + return ''; + } + + if ($outputStream === null) { + return $this->_trailer->getPDFString(); + } else { + $pdfData = $this->_trailer->getPDFString(); + while ( strlen($pdfData) > 0 && ($byteCount = fwrite($outputStream, $pdfData)) != false ) { + $pdfData = substr($pdfData, $byteCount); + } + + return ''; + } + } + + // offset (from a start of PDF file) of new PDF file segment + $offset = $this->_trailer->getPDFLength(); + // Last Object number in a list of free objects + $lastFreeObject = $this->_trailer->getLastFreeObject(); + + // Array of cross-reference table subsections + $xrefTable = array(); + // Object numbers of first objects in each subsection + $xrefSectionStartNums = array(); + + // Last cross-reference table subsection + $xrefSection = array(); + // Dummy initialization of the first element (specail case - header of linked list of free objects). + $xrefSection[] = 0; + $xrefSectionStartNums[] = 0; + // Object number of last processed PDF object. + // Used to manage cross-reference subsections. + // Initialized by zero (specail case - header of linked list of free objects). + $lastObjNum = 0; + + if ($outputStream !== null) { + if (!$newSegmentOnly) { + $pdfData = $this->_trailer->getPDFString(); + while ( strlen($pdfData) > 0 && ($byteCount = fwrite($outputStream, $pdfData)) != false ) { + $pdfData = substr($pdfData, $byteCount); + } + } + } else { + $pdfSegmentBlocks = ($newSegmentOnly) ? array() : array($this->_trailer->getPDFString()); + } + + // Iterate objects to create new reference table + foreach ($this->_objFactory->listModifiedObjects() as $updateInfo) { + $objNum = $updateInfo->getObjNum(); + + if ($objNum - $lastObjNum != 1) { + // Save cross-reference table subsection and start new one + $xrefTable[] = $xrefSection; + $xrefSection = array(); + $xrefSectionStartNums[] = $objNum; + } + + if ($updateInfo->isFree()) { + // Free object cross-reference table entry + $xrefSection[] = sprintf("%010d %05d f \n", $lastFreeObject, $updateInfo->getGenNum()); + $lastFreeObject = $objNum; + } else { + // In-use object cross-reference table entry + $xrefSection[] = sprintf("%010d %05d n \n", $offset, $updateInfo->getGenNum()); + + $pdfBlock = $updateInfo->getObjectDump(); + $offset += strlen($pdfBlock); + + if ($outputStream === null) { + $pdfSegmentBlocks[] = $pdfBlock; + } else { + while ( strlen($pdfBlock) > 0 && ($byteCount = fwrite($outputStream, $pdfBlock)) != false ) { + $pdfBlock = substr($pdfBlock, $byteCount); + } + } + } + $lastObjNum = $objNum; + } + // Save last cross-reference table subsection + $xrefTable[] = $xrefSection; + + // Modify first entry (specail case - header of linked list of free objects). + $xrefTable[0][0] = sprintf("%010d 65535 f \n", $lastFreeObject); + + $xrefTableStr = "xref\n"; + foreach ($xrefTable as $sectId => $xrefSection) { + $xrefTableStr .= sprintf("%d %d \n", $xrefSectionStartNums[$sectId], count($xrefSection)); + foreach ($xrefSection as $xrefTableEntry) { + $xrefTableStr .= $xrefTableEntry; + } + } + + $this->_trailer->Size->value = $this->_objFactory->getObjectCount(); + + $pdfBlock = $xrefTableStr + . $this->_trailer->toString() + . "startxref\n" . $offset . "\n" + . "%%EOF\n"; + + if ($outputStream === null) { + $pdfSegmentBlocks[] = $pdfBlock; + + return implode('', $pdfSegmentBlocks); + } else { + while ( strlen($pdfBlock) > 0 && ($byteCount = fwrite($outputStream, $pdfBlock)) != false ) { + $pdfBlock = substr($pdfBlock, $byteCount); + } + + return ''; + } + } + + + /** + * Set the document-level JavaScript + * + * @param string $javascript + */ + public function setJavaScript($javascript) + { + $this->_javaScript = $javascript; + } + + + /** + * Convert date to PDF format (it's close to ASN.1 (Abstract Syntax Notation + * One) defined in ISO/IEC 8824). + * + * @todo This really isn't the best location for this method. It should + * probably actually exist as Zend_Pdf_Element_Date or something like that. + * + * @todo Address the following E_STRICT issue: + * PHP Strict Standards: date(): It is not safe to rely on the system's + * timezone settings. Please use the date.timezone setting, the TZ + * environment variable or the date_default_timezone_set() function. In + * case you used any of those methods and you are still getting this + * warning, you most likely misspelled the timezone identifier. + * + * @param integer $timestamp (optional) If omitted, uses the current time. + * @return string + */ + public static function pdfDate($timestamp = null) + { + if (is_null($timestamp)) { + $date = date('\D\:YmdHisO'); + } else { + $date = date('\D\:YmdHisO', $timestamp); + } + return substr_replace($date, '\'', -2, 0) . '\''; + } + +} diff --git a/libs/Zend/Pdf/Cmap.php b/libs/Zend/Pdf/Cmap.php new file mode 100644 index 0000000..9feb18c --- /dev/null +++ b/libs/Zend/Pdf/Cmap.php @@ -0,0 +1,337 @@ + + *
    • {@link http://developer.apple.com/textfonts/TTRefMan/RM06/Chap6cmap.html} + *
    • {@link http://www.microsoft.com/OpenType/OTSpec/cmap.htm} + *
    • {@link http://partners.adobe.com/public/developer/opentype/index_cmap.html} + *
    + * + * @todo Write code for Zend_Pdf_FontCmap_HighByteMapping class. + * @todo Write code for Zend_Pdf_FontCmap_MixedCoverage class. + * @todo Write code for Zend_Pdf_FontCmap_TrimmedArray class. + * @todo Write code for Zend_Pdf_FontCmap_SegmentedCoverage class. + * + * @package Zend_Pdf + * @subpackage Fonts + * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ +abstract class Zend_Pdf_Cmap +{ + /**** Class Constants ****/ + + + /* Cmap Table Types */ + + /** + * Byte Encoding character map table type. + */ + const TYPE_BYTE_ENCODING = 0x00; + + /** + * High Byte Mapping character map table type. + */ + const TYPE_HIGH_BYTE_MAPPING = 0x02; + + /** + * Segment Value to Delta Mapping character map table type. + */ + const TYPE_SEGMENT_TO_DELTA = 0x04; + + /** + * Trimmed Table character map table type. + */ + const TYPE_TRIMMED_TABLE = 0x06; + + /** + * Mixed Coverage character map table type. + */ + const TYPE_MIXED_COVERAGE = 0x08; + + /** + * Trimmed Array character map table type. + */ + const TYPE_TRIMMED_ARRAY = 0x0a; + + /** + * Segmented Coverage character map table type. + */ + const TYPE_SEGMENTED_COVERAGE = 0x0c; + + /** + * Static Byte Encoding character map table type. Variant of + * {@link TYPE_BYTEENCODING}. + */ + const TYPE_BYTE_ENCODING_STATIC = 0xf1; + + /** + * Unknown character map table type. + */ + const TYPE_UNKNOWN = 0xff; + + + /* Special Glyph Names */ + + /** + * Glyph representing missing characters. + */ + const MISSING_CHARACTER_GLYPH = 0x00; + + + + /**** Public Interface ****/ + + + /* Factory Methods */ + + /** + * Instantiates the appropriate concrete subclass based on the type of cmap + * table and returns the instance. + * + * The cmap type must be one of the following values: + *
      + *
    • {@link Zend_Pdf_Cmap::TYPE_BYTE_ENCODING} + *
    • {@link Zend_Pdf_Cmap::TYPE_BYTE_ENCODING_STATIC} + *
    • {@link Zend_Pdf_Cmap::TYPE_HIGH_BYTE_MAPPING} + *
    • {@link Zend_Pdf_Cmap::TYPE_SEGMENT_TO_DELTA} + *
    • {@link Zend_Pdf_Cmap::TYPE_TRIMMED_TABLE} + *
    • {@link Zend_Pdf_Cmap::TYPE_MIXED_COVERAGE} + *
    • {@link Zend_Pdf_Cmap::TYPE_TRIMMED_ARRAY} + *
    • {@link Zend_Pdf_Cmap::TYPE_SEGMENTED_COVERAGE} + *
    + * + * Throws an exception if the table type is invalid or the cmap table data + * cannot be validated. + * + * @param integer $cmapType Type of cmap. + * @param mixed $cmapData Cmap table data. Usually a string or array. + * @return Zend_Pdf_Cmap + * @throws Zend_Pdf_Exception + */ + public static function cmapWithTypeData($cmapType, $cmapData) + { + switch ($cmapType) { + case Zend_Pdf_Cmap::TYPE_BYTE_ENCODING: + return new Zend_Pdf_Cmap_ByteEncoding($cmapData); + + case Zend_Pdf_Cmap::TYPE_BYTE_ENCODING_STATIC: + return new Zend_Pdf_Cmap_ByteEncoding_Static($cmapData); + + case Zend_Pdf_Cmap::TYPE_HIGH_BYTE_MAPPING: + throw new Zend_Pdf_Exception('High byte mapping cmap currently unsupported', + Zend_Pdf_Exception::CMAP_TYPE_UNSUPPORTED); + + case Zend_Pdf_Cmap::TYPE_SEGMENT_TO_DELTA: + return new Zend_Pdf_Cmap_SegmentToDelta($cmapData); + + case Zend_Pdf_Cmap::TYPE_TRIMMED_TABLE: + return new Zend_Pdf_Cmap_TrimmedTable($cmapData); + + case Zend_Pdf_Cmap::TYPE_MIXED_COVERAGE: + throw new Zend_Pdf_Exception('Mixed coverage cmap currently unsupported', + Zend_Pdf_Exception::CMAP_TYPE_UNSUPPORTED); + + case Zend_Pdf_Cmap::TYPE_TRIMMED_ARRAY: + throw new Zend_Pdf_Exception('Trimmed array cmap currently unsupported', + Zend_Pdf_Exception::CMAP_TYPE_UNSUPPORTED); + + case Zend_Pdf_Cmap::TYPE_SEGMENTED_COVERAGE: + throw new Zend_Pdf_Exception('Segmented coverage cmap currently unsupported', + Zend_Pdf_Exception::CMAP_TYPE_UNSUPPORTED); + + default: + throw new Zend_Pdf_Exception("Unknown cmap type: $cmapType", + Zend_Pdf_Exception::CMAP_UNKNOWN_TYPE); + } + } + + + /* Abstract Methods */ + + /** + * Object constructor + * + * Parses the raw binary table data. Throws an exception if the table is + * malformed. + * + * @param string $cmapData Raw binary cmap table data. + * @throws Zend_Pdf_Exception + */ + abstract public function __construct($cmapData); + + /** + * Returns an array of glyph numbers corresponding to the Unicode characters. + * + * If a particular character doesn't exist in this font, the special 'missing + * character glyph' will be substituted. + * + * See also {@link glyphNumberForCharacter()}. + * + * @param array $characterCodes Array of Unicode character codes (code points). + * @return array Array of glyph numbers. + */ + abstract public function glyphNumbersForCharacters($characterCodes); + + /** + * Returns the glyph number corresponding to the Unicode character. + * + * If a particular character doesn't exist in this font, the special 'missing + * character glyph' will be substituted. + * + * See also {@link glyphNumbersForCharacters()} which is optimized for bulk + * operations. + * + * @param integer $characterCode Unicode character code (code point). + * @return integer Glyph number. + */ + abstract public function glyphNumberForCharacter($characterCode); + + /** + * Returns an array containing the Unicode characters that have entries in + * this character map. + * + * @return array Unicode character codes. + */ + abstract public function getCoveredCharacters(); + + /** + * 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 + * glyph for each character code). + * + * @internal + * @return array Array representing => pairs. + */ + abstract public function getCoveredCharactersGlyphs(); + + + /**** Internal Methods ****/ + + + /* Internal Utility Methods */ + + /** + * Extracts a signed 2-byte integer from a string. + * + * Integers are always big-endian. Throws an exception if the index is out + * of range. + * + * @param string &$data + * @param integer $index Position in string of integer. + * @return integer + * @throws Zend_Pdf_Exception + */ + protected function _extractInt2(&$data, $index) + { + if (($index < 0) | (($index + 1) > strlen($data))) { + throw new Zend_Pdf_Exception("Index out of range: $index", + Zend_Pdf_Exception::INDEX_OUT_OF_RANGE); + } + $number = ord($data[$index]); + if (($number & 0x80) == 0x80) { // negative + $number = ~((((~ $number) & 0xff) << 8) | ((~ ord($data[++$index])) & 0xff)); + } else { + $number = ($number << 8) | ord($data[++$index]); + } + return $number; + } + + /** + * Extracts an unsigned 2-byte integer from a string. + * + * Integers are always big-endian. Throws an exception if the index is out + * of range. + * + * @param string &$data + * @param integer $index Position in string of integer. + * @return integer + * @throws Zend_Pdf_Exception + */ + protected function _extractUInt2(&$data, $index) + { + if (($index < 0) | (($index + 1) > strlen($data))) { + throw new Zend_Pdf_Exception("Index out of range: $index", + Zend_Pdf_Exception::INDEX_OUT_OF_RANGE); + } + $number = (ord($data[$index]) << 8) | ord($data[++$index]); + return $number; + } + + /** + * Extracts an unsigned 4-byte integer from a string. + * + * Integers are always big-endian. Throws an exception if the index is out + * of range. + * + * NOTE: If you ask for a 4-byte unsigned integer on a 32-bit machine, the + * resulting value WILL BE SIGNED because PHP uses signed integers internally + * for everything. To guarantee portability, be sure to use bitwise or + * similar operators on large integers! + * + * @param string &$data + * @param integer $index Position in string of integer. + * @return integer + * @throws Zend_Pdf_Exception + */ + protected function _extractUInt4(&$data, $index) + { + if (($index < 0) | (($index + 3) > strlen($data))) { + throw new Zend_Pdf_Exception("Index out of range: $index", + Zend_Pdf_Exception::INDEX_OUT_OF_RANGE); + } + $number = (ord($data[$index]) << 24) | (ord($data[++$index]) << 16) | + (ord($data[++$index]) << 8) | ord($data[++$index]); + return $number; + } + +} diff --git a/libs/Zend/Pdf/Cmap/ByteEncoding.php b/libs/Zend/Pdf/Cmap/ByteEncoding.php new file mode 100644 index 0000000..9322840 --- /dev/null +++ b/libs/Zend/Pdf/Cmap/ByteEncoding.php @@ -0,0 +1,442 @@ + $characterCode) { + + if (! isset($this->_glyphIndexArray[$characterCode])) { + $glyphNumbers[$key] = Zend_Pdf_Cmap::MISSING_CHARACTER_GLYPH; + continue; + } + + $glyphNumbers[$key] = $this->_glyphIndexArray[$characterCode]; + + } + return $glyphNumbers; + } + + /** + * Returns the glyph number corresponding to the Unicode character. + * + * If a particular character doesn't exist in this font, the special 'missing + * character glyph' will be substituted. + * + * See also {@link glyphNumbersForCharacters()} which is optimized for bulk + * operations. + * + * @param integer $characterCode Unicode character code (code point). + * @return integer Glyph number. + */ + public function glyphNumberForCharacter($characterCode) + { + if (! isset($this->_glyphIndexArray[$characterCode])) { + return Zend_Pdf_Cmap::MISSING_CHARACTER_GLYPH; + } + return $this->_glyphIndexArray[$characterCode]; + } + + /** + * Returns an array containing the Unicode characters that have entries in + * this character map. + * + * @return array Unicode character codes. + */ + public function getCoveredCharacters() + { + return array_keys($this->_glyphIndexArray); + } + + /** + * 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 + * glyph for each character code). + * + * @internal + * @return array Array representing => pairs. + */ + public function getCoveredCharactersGlyphs() + { + return $this->_glyphIndexArray; + } + + + /* Object Lifecycle */ + + /** + * Object constructor + * + * Parses the raw binary table data. Throws an exception if the table is + * malformed. + * + * @param string $cmapData Raw binary cmap table data. + * @throws Zend_Pdf_Exception + */ + public function __construct($cmapData) + { + /* Sanity check: This table must be exactly 262 bytes long. + */ + $actualLength = strlen($cmapData); + if ($actualLength != 262) { + throw new Zend_Pdf_Exception('Insufficient table data', + Zend_Pdf_Exception::CMAP_TABLE_DATA_TOO_SMALL); + } + + /* Sanity check: Make sure this is right data for this table type. + */ + $type = $this->_extractUInt2($cmapData, 0); + if ($type != Zend_Pdf_Cmap::TYPE_BYTE_ENCODING) { + throw new Zend_Pdf_Exception('Wrong cmap table type', + Zend_Pdf_Exception::CMAP_WRONG_TABLE_TYPE); + } + + $length = $this->_extractUInt2($cmapData, 2); + if ($length != $actualLength) { + throw new Zend_Pdf_Exception("Table length ($length) does not match actual length ($actualLength)", + Zend_Pdf_Exception::CMAP_WRONG_TABLE_LENGTH); + } + + /* Mapping tables should be language-independent. The font may not work + * as expected if they are not. Unfortunately, many font files in the + * wild incorrectly record a language ID in this field, so we can't + * call this a failure. + */ + $language = $this->_extractUInt2($cmapData, 4); + if ($language != 0) { + // Record a warning here somehow? + } + + /* The mapping between the Mac Roman and Unicode characters is static. + * For simplicity, just put all 256 glyph indices into one array keyed + * off the corresponding Unicode character. + */ + $i = 6; + $this->_glyphIndexArray[0x00] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x01] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x02] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x03] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x04] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x05] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x06] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x07] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x08] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x09] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x0a] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x0b] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x0c] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x0d] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x0e] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x0f] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x10] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x11] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x12] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x13] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x14] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x15] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x16] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x17] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x18] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x19] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x1a] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x1b] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x1c] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x1d] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x1e] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x1f] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x20] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x21] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x22] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x23] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x24] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x25] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x26] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x27] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x28] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x29] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x2a] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x2b] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x2c] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x2d] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x2e] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x2f] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x30] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x31] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x32] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x33] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x34] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x35] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x36] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x37] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x38] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x39] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x3a] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x3b] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x3c] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x3d] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x3e] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x3f] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x40] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x41] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x42] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x43] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x44] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x45] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x46] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x47] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x48] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x49] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x4a] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x4b] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x4c] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x4d] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x4e] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x4f] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x50] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x51] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x52] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x53] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x54] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x55] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x56] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x57] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x58] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x59] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x5a] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x5b] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x5c] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x5d] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x5e] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x5f] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x60] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x61] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x62] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x63] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x64] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x65] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x66] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x67] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x68] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x69] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x6a] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x6b] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x6c] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x6d] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x6e] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x6f] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x70] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x71] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x72] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x73] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x74] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x75] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x76] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x77] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x78] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x79] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x7a] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x7b] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x7c] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x7d] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x7e] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x7f] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xc4] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xc5] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xc7] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xc9] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xd1] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xd6] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xdc] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xe1] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xe0] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xe2] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xe4] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xe3] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xe5] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xe7] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xe9] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xe8] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xea] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xeb] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xed] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xec] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xee] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xef] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xf1] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xf3] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xf2] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xf4] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xf6] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xf5] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xfa] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xf9] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xfb] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xfc] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x2020] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xb0] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xa2] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xa3] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xa7] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x2022] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xb6] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xdf] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xae] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xa9] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x2122] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xb4] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xa8] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x2260] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xc6] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xd8] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x221e] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xb1] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x2264] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x2265] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xa5] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xb5] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x2202] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x2211] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x220f] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x03c0] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x222b] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xaa] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xba] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x03a9] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xe6] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xf8] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xbf] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xa1] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xac] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x221a] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x0192] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x2248] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x2206] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xab] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xbb] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x2026] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xa0] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xc0] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xc3] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xd5] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x0152] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x0153] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x2013] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x2014] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x201c] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x201d] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x2018] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x2019] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xf7] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x25ca] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xff] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x0178] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x2044] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x20ac] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x2039] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x203a] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xfb01] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xfb02] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x2021] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xb7] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x201a] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x201e] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x2030] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xc2] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xca] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xc1] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xcb] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xc8] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xcd] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xce] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xcf] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xcc] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xd3] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xd4] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xf8ff] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xd2] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xda] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xdb] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xd9] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x0131] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x02c6] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x02dc] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xaf] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x02d8] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x02d9] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x02da] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0xb8] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x02dd] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x02db] = ord($cmapData[$i++]); + $this->_glyphIndexArray[0x02c7] = ord($cmapData[$i]); + } + +} diff --git a/libs/Zend/Pdf/Cmap/ByteEncoding/Static.php b/libs/Zend/Pdf/Cmap/ByteEncoding/Static.php new file mode 100644 index 0000000..375c0cc --- /dev/null +++ b/libs/Zend/Pdf/Cmap/ByteEncoding/Static.php @@ -0,0 +1,59 @@ +_glyphIndexArray = $cmapData; + } + +} diff --git a/libs/Zend/Pdf/Cmap/SegmentToDelta.php b/libs/Zend/Pdf/Cmap/SegmentToDelta.php new file mode 100644 index 0000000..d162a2e --- /dev/null +++ b/libs/Zend/Pdf/Cmap/SegmentToDelta.php @@ -0,0 +1,401 @@ + $characterCode) { + + /* These tables only cover the 16-bit character range. + */ + if ($characterCode > 0xffff) { + $glyphNumbers[$key] = Zend_Pdf_Cmap::MISSING_CHARACTER_GLYPH; + continue; + } + + /* Determine where to start the binary search. The segments are + * ordered from lowest-to-highest. We are looking for the first + * segment whose end code is greater than or equal to our character + * code. + * + * If the end code at the top of the search range is larger, then + * our target is probably below it. + * + * If it is smaller, our target is probably above it, so move the + * search range to the end of the segment list. + */ + if ($this->_searchRangeEndCode >= $characterCode) { + $searchIndex = $this->_searchRange; + } else { + $searchIndex = $this->_segmentCount; + } + + /* Now do a binary search to find the first segment whose end code + * is greater or equal to our character code. No matter the number + * of segments (there may be hundreds in a large font), we will only + * need to perform $this->_searchIterations. + */ + for ($i = 1; $i <= $this->_searchIterations; $i++) { + if ($this->_segmentTableEndCodes[$searchIndex] >= $characterCode) { + $subtableIndex = $searchIndex; + $searchIndex -= $this->_searchRange >> $i; + } else { + $searchIndex += $this->_searchRange >> $i; + } + } + + /* If the segment's start code is greater than our character code, + * that character is not represented in this font. Move on. + */ + if ($this->_segmentTableStartCodes[$subtableIndex] > $characterCode) { + $glyphNumbers[$key] = Zend_Pdf_Cmap::MISSING_CHARACTER_GLYPH; + continue; + } + + if ($this->_segmentTableIdRangeOffsets[$subtableIndex] == 0) { + /* This segment uses a simple mapping from character code to + * glyph number. + */ + $glyphNumbers[$key] = ($characterCode + $this->_segmentTableIdDeltas[$subtableIndex]) % 65536; + + } else { + /* This segment relies on the glyph index array to determine the + * glyph number. The calculation below determines the correct + * index into that array. It's a little odd because the range + * offset in the font file is designed to quickly provide an + * address of the index in the raw binary data instead of the + * index itself. Since we've parsed the data into arrays, we + * must process it a bit differently. + */ + $glyphIndex = ($characterCode - $this->_segmentTableStartCodes[$subtableIndex] + + $this->_segmentTableIdRangeOffsets[$subtableIndex] - $this->_segmentCount + + $subtableIndex - 1); + $glyphNumbers[$key] = $this->_glyphIndexArray[$glyphIndex]; + + } + + } + return $glyphNumbers; + } + + /** + * Returns the glyph number corresponding to the Unicode character. + * + * If a particular character doesn't exist in this font, the special 'missing + * character glyph' will be substituted. + * + * See also {@link glyphNumbersForCharacters()} which is optimized for bulk + * operations. + * + * @param integer $characterCode Unicode character code (code point). + * @return integer Glyph number. + */ + public function glyphNumberForCharacter($characterCode) + { + /* This code is pretty much a copy of glyphNumbersForCharacters(). + * See that method for inline documentation. + */ + + if ($characterCode > 0xffff) { + return Zend_Pdf_Cmap::MISSING_CHARACTER_GLYPH; + } + + if ($this->_searchRangeEndCode >= $characterCode) { + $searchIndex = $this->_searchRange; + } else { + $searchIndex = $this->_segmentCount; + } + + for ($i = 1; $i <= $this->_searchIterations; $i++) { + if ($this->_segmentTableEndCodes[$searchIndex] >= $characterCode) { + $subtableIndex = $searchIndex; + $searchIndex -= $this->_searchRange >> $i; + } else { + $searchIndex += $this->_searchRange >> $i; + } + } + + if ($this->_segmentTableStartCodes[$subtableIndex] > $characterCode) { + return Zend_Pdf_Cmap::MISSING_CHARACTER_GLYPH; + } + + if ($this->_segmentTableIdRangeOffsets[$subtableIndex] == 0) { + $glyphNumber = ($characterCode + $this->_segmentTableIdDeltas[$subtableIndex]) % 65536; + } else { + $glyphIndex = ($characterCode - $this->_segmentTableStartCodes[$subtableIndex] + + $this->_segmentTableIdRangeOffsets[$subtableIndex] - $this->_segmentCount + + $subtableIndex - 1); + $glyphNumber = $this->_glyphIndexArray[$glyphIndex]; + } + return $glyphNumber; + } + + /** + * Returns an array containing the Unicode characters that have entries in + * this character map. + * + * @return array Unicode character codes. + */ + public function getCoveredCharacters() + { + $characterCodes = array(); + for ($i = 1; $i <= $this->_segmentCount; $i++) { + for ($code = $this->_segmentTableStartCodes[$i]; $code <= $this->_segmentTableEndCodes[$i]; $code++) { + $characterCodes[] = $code; + } + } + 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 + * glyph for each character code). + * + * @internal + * @return array Array representing => pairs. + */ + public function getCoveredCharactersGlyphs() + { + $glyphNumbers = array(); + + for ($segmentNum = 1; $segmentNum <= $this->_segmentCount; $segmentNum++) { + if ($this->_segmentTableIdRangeOffsets[$segmentNum] == 0) { + $delta = $this->_segmentTableIdDeltas[$segmentNum]; + + for ($code = $this->_segmentTableStartCodes[$segmentNum]; + $code <= $this->_segmentTableEndCodes[$segmentNum]; + $code++) { + $glyphNumbers[$code] = ($code + $delta) % 65536; + } + } else { + $code = $this->_segmentTableStartCodes[$segmentNum]; + $glyphIndex = $this->_segmentTableIdRangeOffsets[$segmentNum] - ($this->_segmentCount - $segmentNum) - 1; + + while ($code <= $this->_segmentTableEndCodes[$segmentNum]) { + $glyphNumbers[$code] = $this->_glyphIndexArray[$glyphIndex]; + + $code++; + $glyphIndex++; + } + } + } + + return $glyphNumbers; + } + + + + /* Object Lifecycle */ + + /** + * Object constructor + * + * Parses the raw binary table data. Throws an exception if the table is + * malformed. + * + * @param string $cmapData Raw binary cmap table data. + * @throws Zend_Pdf_Exception + */ + public function __construct($cmapData) + { + /* Sanity check: The table should be at least 23 bytes in size. + */ + $actualLength = strlen($cmapData); + if ($actualLength < 23) { + throw new Zend_Pdf_Exception('Insufficient table data', + Zend_Pdf_Exception::CMAP_TABLE_DATA_TOO_SMALL); + } + + /* Sanity check: Make sure this is right data for this table type. + */ + $type = $this->_extractUInt2($cmapData, 0); + if ($type != Zend_Pdf_Cmap::TYPE_SEGMENT_TO_DELTA) { + throw new Zend_Pdf_Exception('Wrong cmap table type', + Zend_Pdf_Exception::CMAP_WRONG_TABLE_TYPE); + } + + $length = $this->_extractUInt2($cmapData, 2); + if ($length != $actualLength) { + throw new Zend_Pdf_Exception("Table length ($length) does not match actual length ($actualLength)", + Zend_Pdf_Exception::CMAP_WRONG_TABLE_LENGTH); + } + + /* Mapping tables should be language-independent. The font may not work + * as expected if they are not. Unfortunately, many font files in the + * wild incorrectly record a language ID in this field, so we can't + * call this a failure. + */ + $language = $this->_extractUInt2($cmapData, 4); + if ($language != 0) { + // Record a warning here somehow? + } + + /* These two values are stored premultiplied by two which is convienent + * when using the binary data directly, but we're parsing it out to + * native PHP data types, so divide by two. + */ + $this->_segmentCount = $this->_extractUInt2($cmapData, 6) >> 1; + $this->_searchRange = $this->_extractUInt2($cmapData, 8) >> 1; + + $this->_searchIterations = $this->_extractUInt2($cmapData, 10) + 1; + + $offset = 14; + for ($i = 1; $i <= $this->_segmentCount; $i++, $offset += 2) { + $this->_segmentTableEndCodes[$i] = $this->_extractUInt2($cmapData, $offset); + } + + $this->_searchRangeEndCode = $this->_segmentTableEndCodes[$this->_searchRange]; + + $offset += 2; // reserved bytes + + for ($i = 1; $i <= $this->_segmentCount; $i++, $offset += 2) { + $this->_segmentTableStartCodes[$i] = $this->_extractUInt2($cmapData, $offset); + } + + for ($i = 1; $i <= $this->_segmentCount; $i++, $offset += 2) { + $this->_segmentTableIdDeltas[$i] = $this->_extractInt2($cmapData, $offset); // signed + } + + /* The range offset helps determine the index into the glyph index array. + * Like the segment count and search range above, it's stored as a byte + * multiple in the font, so divide by two as we extract the values. + */ + for ($i = 1; $i <= $this->_segmentCount; $i++, $offset += 2) { + $this->_segmentTableIdRangeOffsets[$i] = $this->_extractUInt2($cmapData, $offset) >> 1; + } + + /* The size of the glyph index array varies by font and depends on the + * extent of the usage of range offsets versus deltas. Some fonts may + * not have any entries in this array. + */ + for (; $offset < $length; $offset += 2) { + $this->_glyphIndexArray[] = $this->_extractUInt2($cmapData, $offset); + } + + /* Sanity check: After reading all of the data, we should be at the end + * of the table. + */ + if ($offset != $length) { + 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 new file mode 100644 index 0000000..c8c2d35 --- /dev/null +++ b/libs/Zend/Pdf/Cmap/TrimmedTable.php @@ -0,0 +1,224 @@ + $characterCode) { + + if (($characterCode < $this->_startCode) || ($characterCode > $this->_endCode)) { + $glyphNumbers[$key] = Zend_Pdf_Cmap::MISSING_CHARACTER_GLYPH; + continue; + } + + $glyphIndex = $characterCode - $this->_startCode; + $glyphNumbers[$key] = $this->_glyphIndexArray[$glyphIndex]; + + } + return $glyphNumbers; + } + + /** + * Returns the glyph number corresponding to the Unicode character. + * + * If a particular character doesn't exist in this font, the special 'missing + * character glyph' will be substituted. + * + * See also {@link glyphNumbersForCharacters()} which is optimized for bulk + * operations. + * + * @param integer $characterCode Unicode character code (code point). + * @return integer Glyph number. + */ + public function glyphNumberForCharacter($characterCode) + { + if (($characterCode < $this->_startCode) || ($characterCode > $this->_endCode)) { + return Zend_Pdf_Cmap::MISSING_CHARACTER_GLYPH; + } + $glyphIndex = $characterCode - $this->_startCode; + return $this->_glyphIndexArray[$glyphIndex]; + } + + /** + * Returns an array containing the Unicode characters that have entries in + * this character map. + * + * @return array Unicode character codes. + */ + public function getCoveredCharacters() + { + $characterCodes = array(); + for ($code = $this->_startCode; $code <= $this->_endCode; $code++) { + $characterCodes[] = $code; + } + 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 + * glyph for each character code). + * + * @internal + * @return array Array representing => pairs. + */ + public function getCoveredCharactersGlyphs() + { + $glyphNumbers = array(); + for ($code = $this->_startCode; $code <= $this->_endCode; $code++) { + $glyphNumbers[$code] = $this->_glyphIndexArray[$code - $this->_startCode]; + } + + return $glyphNumbers; + } + + + /* Object Lifecycle */ + + /** + * Object constructor + * + * Parses the raw binary table data. Throws an exception if the table is + * malformed. + * + * @param string $cmapData Raw binary cmap table data. + * @throws Zend_Pdf_Exception + */ + public function __construct($cmapData) + { + /* Sanity check: The table should be at least 9 bytes in size. + */ + $actualLength = strlen($cmapData); + if ($actualLength < 9) { + throw new Zend_Pdf_Exception('Insufficient table data', + Zend_Pdf_Exception::CMAP_TABLE_DATA_TOO_SMALL); + } + + /* Sanity check: Make sure this is right data for this table type. + */ + $type = $this->_extractUInt2($cmapData, 0); + if ($type != Zend_Pdf_Cmap::TYPE_TRIMMED_TABLE) { + throw new Zend_Pdf_Exception('Wrong cmap table type', + Zend_Pdf_Exception::CMAP_WRONG_TABLE_TYPE); + } + + $length = $this->_extractUInt2($cmapData, 2); + if ($length != $actualLength) { + throw new Zend_Pdf_Exception("Table length ($length) does not match actual length ($actualLength)", + Zend_Pdf_Exception::CMAP_WRONG_TABLE_LENGTH); + } + + /* Mapping tables should be language-independent. The font may not work + * as expected if they are not. Unfortunately, many font files in the + * wild incorrectly record a language ID in this field, so we can't + * call this a failure. + */ + $language = $this->_extractUInt2($cmapData, 4); + if ($language != 0) { + // Record a warning here somehow? + } + + $this->_startCode = $this->_extractUInt2($cmapData, 6); + + $entryCount = $this->_extractUInt2($cmapData, 8); + $expectedCount = ($length - 10) >> 1; + if ($entryCount != $expectedCount) { + throw new Zend_Pdf_Exception("Entry count is wrong; expected: $expectedCount; actual: $entryCount", + Zend_Pdf_Exception::CMAP_WRONG_ENTRY_COUNT); + } + + $this->_endCode = $this->_startCode + $entryCount - 1; + + $offset = 10; + for ($i = 0; $i < $entryCount; $i++, $offset += 2) { + $this->_glyphIndexArray[] = $this->_extractUInt2($cmapData, $offset); + } + + /* Sanity check: After reading all of the data, we should be at the end + * of the table. + */ + if ($offset != $length) { + 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.php b/libs/Zend/Pdf/Color.php new file mode 100644 index 0000000..0b004cb --- /dev/null +++ b/libs/Zend/Pdf/Color.php @@ -0,0 +1,44 @@ +_c = new Zend_Pdf_Element_Numeric($c); + $this->_m = new Zend_Pdf_Element_Numeric($m); + $this->_y = new Zend_Pdf_Element_Numeric($y); + $this->_k = new Zend_Pdf_Element_Numeric($k); + + if ($this->_c->value < 0) { $this->_c->value = 0; } + if ($this->_c->value > 1) { $this->_c->value = 1; } + + if ($this->_m->value < 0) { $this->_m->value = 0; } + if ($this->_m->value > 1) { $this->_m->value = 1; } + + if ($this->_y->value < 0) { $this->_y->value = 0; } + if ($this->_y->value > 1) { $this->_y->value = 1; } + + if ($this->_k->value < 0) { $this->_k->value = 0; } + if ($this->_k->value > 1) { $this->_k->value = 1; } + } + + /** + * Instructions, which can be directly inserted into content stream + * to switch color. + * Color set instructions differ for stroking and nonstroking operations. + * + * @param boolean $stroking + * @return string + */ + public function instructions($stroking) + { + return $this->_c->toString() . ' ' + . $this->_m->toString() . ' ' + . $this->_y->toString() . ' ' + . $this->_k->toString() . ($stroking? " K\n" : " k\n"); + } +} + diff --git a/libs/Zend/Pdf/Color/GrayScale.php b/libs/Zend/Pdf/Color/GrayScale.php new file mode 100644 index 0000000..50b858b --- /dev/null +++ b/libs/Zend/Pdf/Color/GrayScale.php @@ -0,0 +1,81 @@ +_grayLevel = new Zend_Pdf_Element_Numeric($grayLevel); + + if ($this->_grayLevel->value < 0) { + $this->_grayLevel->value = 0; + } + + if ($this->_grayLevel->value > 1) { + $this->_grayLevel->value = 1; + } + } + + /** + * Instructions, which can be directly inserted into content stream + * to switch color. + * Color set instructions differ for stroking and nonstroking operations. + * + * @param boolean $stroking + * @return string + */ + public function instructions($stroking) + { + return $this->_grayLevel->toString() . ($stroking? " G\n" : " g\n"); + } +} + diff --git a/libs/Zend/Pdf/Color/Html.php b/libs/Zend/Pdf/Color/Html.php new file mode 100644 index 0000000..ed4d31b --- /dev/null +++ b/libs/Zend/Pdf/Color/Html.php @@ -0,0 +1,407 @@ +_color = self::color($color); + } + + + /** + * Instructions, which can be directly inserted into content stream + * to switch color. + * Color set instructions differ for stroking and nonstroking operations. + * + * @param boolean $stroking + * @return string + */ + public function instructions($stroking) + { + return $this->_color->instructions($stroking); + } + + /** + * Creates a Zend_Pdf_Color object from the HTML representation. + * + * @param string $color May either be a hexidecimal number of the form + * #rrggbb or one of the 140 well-known names (black, white, blue, etc.) + * @return Zend_Pdf_Color + */ + public static function color($color) + { + $pattern = '/^#([A-Fa-f0-9]{2})([A-Fa-f0-9]{2})([A-Fa-f0-9]{2})$/'; + if (preg_match($pattern, $color, $matches)) { + $r = round((hexdec($matches[1]) / 255), 3); + $g = round((hexdec($matches[2]) / 255), 3); + $b = round((hexdec($matches[3]) / 255), 3); + if (($r == $g) && ($g == $b)) { + return new Zend_Pdf_Color_GrayScale($r); + } else { + return new Zend_Pdf_Color_Rgb($r, $g, $b); + } + } else { + return Zend_Pdf_Color_Html::namedColor($color); + } + } + + /** + * Creates a Zend_Pdf_Color object from the named color. + * + * @param string $color One of the 140 well-known color names (black, white, + * blue, etc.) + * @return Zend_Pdf_Color + */ + public static function namedColor($color) + { + switch (strtolower($color)) { + case 'aqua': + $r = 0.0; $g = 1.0; $b = 1.0; break; + case 'black': + $r = 0.0; $g = 0.0; $b = 0.0; break; + case 'blue': + $r = 0.0; $g = 0.0; $b = 1.0; break; + case 'fuchsia': + $r = 1.0; $g = 0.0; $b = 1.0; break; + case 'gray': + $r = 0.502; $g = 0.502; $b = 0.502; break; + case 'green': + $r = 0.0; $g = 0.502; $b = 0.0; break; + case 'lime': + $r = 0.0; $g = 1.0; $b = 0.0; break; + case 'maroon': + $r = 0.502; $g = 0.0; $b = 0.0; break; + case 'navy': + $r = 0.0; $g = 0.0; $b = 0.502; break; + case 'olive': + $r = 0.502; $g = 0.502; $b = 0.0; break; + case 'purple': + $r = 0.502; $g = 0.0; $b = 0.502; break; + case 'red': + $r = 1.0; $g = 0.0; $b = 0.0; break; + case 'silver': + $r = 0.753; $g = 0.753; $b = 0.753; break; + case 'teal': + $r = 0.0; $g = 0.502; $b = 0.502; break; + case 'white': + $r = 1.0; $g = 1.0; $b = 1.0; break; + case 'yellow': + $r = 1.0; $g = 1.0; $b = 0.0; break; + + case 'aliceblue': + $r = 0.941; $g = 0.973; $b = 1.0; break; + case 'antiquewhite': + $r = 0.980; $g = 0.922; $b = 0.843; break; + case 'aquamarine': + $r = 0.498; $g = 1.0; $b = 0.831; break; + case 'azure': + $r = 0.941; $g = 1.0; $b = 1.0; break; + case 'beige': + $r = 0.961; $g = 0.961; $b = 0.863; break; + case 'bisque': + $r = 1.0; $g = 0.894; $b = 0.769; break; + case 'blanchedalmond': + $r = 1.0; $g = 1.0; $b = 0.804; break; + case 'blueviolet': + $r = 0.541; $g = 0.169; $b = 0.886; break; + case 'brown': + $r = 0.647; $g = 0.165; $b = 0.165; break; + case 'burlywood': + $r = 0.871; $g = 0.722; $b = 0.529; break; + case 'cadetblue': + $r = 0.373; $g = 0.620; $b = 0.627; break; + case 'chartreuse': + $r = 0.498; $g = 1.0; $b = 0.0; break; + case 'chocolate': + $r = 0.824; $g = 0.412; $b = 0.118; break; + case 'coral': + $r = 1.0; $g = 0.498; $b = 0.314; break; + case 'cornflowerblue': + $r = 0.392; $g = 0.584; $b = 0.929; break; + case 'cornsilk': + $r = 1.0; $g = 0.973; $b = 0.863; break; + case 'crimson': + $r = 0.863; $g = 0.078; $b = 0.235; break; + case 'cyan': + $r = 0.0; $g = 1.0; $b = 1.0; break; + case 'darkblue': + $r = 0.0; $g = 0.0; $b = 0.545; break; + case 'darkcyan': + $r = 0.0; $g = 0.545; $b = 0.545; break; + case 'darkgoldenrod': + $r = 0.722; $g = 0.525; $b = 0.043; break; + case 'darkgray': + $r = 0.663; $g = 0.663; $b = 0.663; break; + case 'darkgreen': + $r = 0.0; $g = 0.392; $b = 0.0; break; + case 'darkkhaki': + $r = 0.741; $g = 0.718; $b = 0.420; break; + case 'darkmagenta': + $r = 0.545; $g = 0.0; $b = 0.545; break; + case 'darkolivegreen': + $r = 0.333; $g = 0.420; $b = 0.184; break; + case 'darkorange': + $r = 1.0; $g = 0.549; $b = 0.0; break; + case 'darkorchid': + $r = 0.6; $g = 0.196; $b = 0.8; break; + case 'darkred': + $r = 0.545; $g = 0.0; $b = 0.0; break; + case 'darksalmon': + $r = 0.914; $g = 0.588; $b = 0.478; break; + case 'darkseagreen': + $r = 0.561; $g = 0.737; $b = 0.561; break; + case 'darkslateblue': + $r = 0.282; $g = 0.239; $b = 0.545; break; + case 'darkslategray': + $r = 0.184; $g = 0.310; $b = 0.310; break; + case 'darkturquoise': + $r = 0.0; $g = 0.808; $b = 0.820; break; + case 'darkviolet': + $r = 0.580; $g = 0.0; $b = 0.827; break; + case 'deeppink': + $r = 1.0; $g = 0.078; $b = 0.576; break; + case 'deepskyblue': + $r = 0.0; $g = 0.749; $b = 1.0; break; + case 'dimgray': + $r = 0.412; $g = 0.412; $b = 0.412; break; + case 'dodgerblue': + $r = 0.118; $g = 0.565; $b = 1.0; break; + case 'firebrick': + $r = 0.698; $g = 0.133; $b = 0.133; break; + case 'floralwhite': + $r = 1.0; $g = 0.980; $b = 0.941; break; + case 'forestgreen': + $r = 0.133; $g = 0.545; $b = 0.133; break; + case 'gainsboro': + $r = 0.863; $g = 0.863; $b = 0.863; break; + case 'ghostwhite': + $r = 0.973; $g = 0.973; $b = 1.0; break; + case 'gold': + $r = 1.0; $g = 0.843; $b = 0.0; break; + case 'goldenrod': + $r = 0.855; $g = 0.647; $b = 0.125; break; + case 'greenyellow': + $r = 0.678; $g = 1.0; $b = 0.184; break; + case 'honeydew': + $r = 0.941; $g = 1.0; $b = 0.941; break; + case 'hotpink': + $r = 1.0; $g = 0.412; $b = 0.706; break; + case 'indianred': + $r = 0.804; $g = 0.361; $b = 0.361; break; + case 'indigo': + $r = 0.294; $g = 0.0; $b = 0.510; break; + case 'ivory': + $r = 1.0; $g = 0.941; $b = 0.941; break; + case 'khaki': + $r = 0.941; $g = 0.902; $b = 0.549; break; + case 'lavender': + $r = 0.902; $g = 0.902; $b = 0.980; break; + case 'lavenderblush': + $r = 1.0; $g = 0.941; $b = 0.961; break; + case 'lawngreen': + $r = 0.486; $g = 0.988; $b = 0.0; break; + case 'lemonchiffon': + $r = 1.0; $g = 0.980; $b = 0.804; break; + case 'lightblue': + $r = 0.678; $g = 0.847; $b = 0.902; break; + case 'lightcoral': + $r = 0.941; $g = 0.502; $b = 0.502; break; + case 'lightcyan': + $r = 0.878; $g = 1.0; $b = 1.0; break; + case 'lightgoldenrodyellow': + $r = 0.980; $g = 0.980; $b = 0.824; break; + case 'lightgreen': + $r = 0.565; $g = 0.933; $b = 0.565; break; + case 'lightgrey': + $r = 0.827; $g = 0.827; $b = 0.827; break; + case 'lightpink': + $r = 1.0; $g = 0.714; $b = 0.757; break; + case 'lightsalmon': + $r = 1.0; $g = 0.627; $b = 0.478; break; + case 'lightseagreen': + $r = 0.125; $g = 0.698; $b = 0.667; break; + case 'lightskyblue': + $r = 0.529; $g = 0.808; $b = 0.980; break; + case 'lightslategray': + $r = 0.467; $g = 0.533; $b = 0.6; break; + case 'lightsteelblue': + $r = 0.690; $g = 0.769; $b = 0.871; break; + case 'lightyellow': + $r = 1.0; $g = 1.0; $b = 0.878; break; + case 'limegreen': + $r = 0.196; $g = 0.804; $b = 0.196; break; + case 'linen': + $r = 0.980; $g = 0.941; $b = 0.902; break; + case 'magenta': + $r = 1.0; $g = 0.0; $b = 1.0; break; + case 'mediumaquamarine': + $r = 0.4; $g = 0.804; $b = 0.667; break; + case 'mediumblue': + $r = 0.0; $g = 0.0; $b = 0.804; break; + case 'mediumorchid': + $r = 0.729; $g = 0.333; $b = 0.827; break; + case 'mediumpurple': + $r = 0.576; $g = 0.439; $b = 0.859; break; + case 'mediumseagreen': + $r = 0.235; $g = 0.702; $b = 0.443; break; + case 'mediumslateblue': + $r = 0.482; $g = 0.408; $b = 0.933; break; + case 'mediumspringgreen': + $r = 0.0; $g = 0.980; $b = 0.604; break; + case 'mediumturquoise': + $r = 0.282; $g = 0.820; $b = 0.8; break; + case 'mediumvioletred': + $r = 0.780; $g = 0.082; $b = 0.522; break; + case 'midnightblue': + $r = 0.098; $g = 0.098; $b = 0.439; break; + case 'mintcream': + $r = 0.961; $g = 1.0; $b = 0.980; break; + case 'mistyrose': + $r = 1.0; $g = 0.894; $b = 0.882; break; + case 'moccasin': + $r = 1.0; $g = 0.894; $b = 0.710; break; + case 'navajowhite': + $r = 1.0; $g = 0.871; $b = 0.678; break; + case 'oldlace': + $r = 0.992; $g = 0.961; $b = 0.902; break; + case 'olivedrab': + $r = 0.420; $g = 0.557; $b = 0.137; break; + case 'orange': + $r = 1.0; $g = 0.647; $b = 0.0; break; + case 'orangered': + $r = 1.0; $g = 0.271; $b = 0.0; break; + case 'orchid': + $r = 0.855; $g = 0.439; $b = 0.839; break; + case 'palegoldenrod': + $r = 0.933; $g = 0.910; $b = 0.667; break; + case 'palegreen': + $r = 0.596; $g = 0.984; $b = 0.596; break; + case 'paleturquoise': + $r = 0.686; $g = 0.933; $b = 0.933; break; + case 'palevioletred': + $r = 0.859; $g = 0.439; $b = 0.576; break; + case 'papayawhip': + $r = 1.0; $g = 0.937; $b = 0.835; break; + case 'peachpuff': + $r = 1.0; $g = 0.937; $b = 0.835; break; + case 'peru': + $r = 0.804; $g = 0.522; $b = 0.247; break; + case 'pink': + $r = 1.0; $g = 0.753; $b = 0.796; break; + case 'plum': + $r = 0.867; $g = 0.627; $b = 0.867; break; + case 'powderblue': + $r = 0.690; $g = 0.878; $b = 0.902; break; + case 'rosybrown': + $r = 0.737; $g = 0.561; $b = 0.561; break; + case 'royalblue': + $r = 0.255; $g = 0.412; $b = 0.882; break; + case 'saddlebrown': + $r = 0.545; $g = 0.271; $b = 0.075; break; + case 'salmon': + $r = 0.980; $g = 0.502; $b = 0.447; break; + case 'sandybrown': + $r = 0.957; $g = 0.643; $b = 0.376; break; + case 'seagreen': + $r = 0.180; $g = 0.545; $b = 0.341; break; + case 'seashell': + $r = 1.0; $g = 0.961; $b = 0.933; break; + case 'sienna': + $r = 0.627; $g = 0.322; $b = 0.176; break; + case 'skyblue': + $r = 0.529; $g = 0.808; $b = 0.922; break; + case 'slateblue': + $r = 0.416; $g = 0.353; $b = 0.804; break; + case 'slategray': + $r = 0.439; $g = 0.502; $b = 0.565; break; + case 'snow': + $r = 1.0; $g = 0.980; $b = 0.980; break; + case 'springgreen': + $r = 0.0; $g = 1.0; $b = 0.498; break; + case 'steelblue': + $r = 0.275; $g = 0.510; $b = 0.706; break; + case 'tan': + $r = 0.824; $g = 0.706; $b = 0.549; break; + case 'thistle': + $r = 0.847; $g = 0.749; $b = 0.847; break; + case 'tomato': + $r = 0.992; $g = 0.388; $b = 0.278; break; + case 'turquoise': + $r = 0.251; $g = 0.878; $b = 0.816; break; + case 'violet': + $r = 0.933; $g = 0.510; $b = 0.933; break; + case 'wheat': + $r = 0.961; $g = 0.871; $b = 0.702; break; + case 'whitesmoke': + $r = 0.961; $g = 0.961; $b = 0.961; break; + case 'yellowgreen': + $r = 0.604; $g = 0.804; $b = 0.196; break; + + default: + throw new Zend_Pdf_Exception('Unknown color name: ' . $color); + } + if (($r == $g) && ($g == $b)) { + return new Zend_Pdf_Color_GrayScale($r); + } else { + 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 new file mode 100644 index 0000000..1ebc0ca --- /dev/null +++ b/libs/Zend/Pdf/Color/Rgb.php @@ -0,0 +1,106 @@ + 1) { $r = 1; } + + if ($g < 0) { $g = 0; } + if ($g > 1) { $g = 1; } + + if ($b < 0) { $b = 0; } + if ($b > 1) { $b = 1; } + + $this->_r = new Zend_Pdf_Element_Numeric($r); + $this->_g = new Zend_Pdf_Element_Numeric($g); + $this->_b = new Zend_Pdf_Element_Numeric($b); + } + + /** + * Instructions, which can be directly inserted into content stream + * to switch color. + * Color set instructions differ for stroking and nonstroking operations. + * + * @param boolean $stroking + * @return string + */ + public function instructions($stroking) + { + return $this->_r->toString() . ' ' + . $this->_g->toString() . ' ' + . $this->_b->toString() . ($stroking? " RG\n" : " rg\n"); + } +} + diff --git a/libs/Zend/Pdf/Element.php b/libs/Zend/Pdf/Element.php new file mode 100644 index 0000000..4df4d41 --- /dev/null +++ b/libs/Zend/Pdf/Element.php @@ -0,0 +1,159 @@ +_parentObject = &$parent; + } + + + /** + * Get top level parent indirect object. + * + * @return Zend_Pdf_Element_Object + */ + public function getParentObject() + { + return $this->_parentObject; + } + + + /** + * Mark object as modified, to include it into new PDF file segment. + * + * We don't automate this action to keep control on PDF update process. + * All new objects are treated as "modified" automatically. + */ + public function touch() + { + if ($this->_parentObject !== null) { + $this->_parentObject->touch(); + } + } + + /** + * Clean up resources, used by object + */ + public function cleanUp() + { + // Do nothing + } + + /** + * Convert PDF element to PHP type. + * + * @return mixed + */ + public function toPhp() + { + return $this->value; + } + + /** + * Convert PHP value into PDF element. + * + * @param mixed $input + * @return Zend_Pdf_Element + */ + public static function phpToPdf($input) + { + if (is_numeric($input)) { + return new Zend_Pdf_Element_Numeric($input); + } else if (is_bool($input)) { + return new Zend_Pdf_Element_Boolean($input); + } else if (is_array($input)) { + $pdfElementsArray = array(); + $isDictionary = false; + + foreach ($input as $key => $value) { + if (is_string($key)) { + $isDictionary = true; + } + $pdfElementsArray[$key] = Zend_Pdf_Element::phpToPdf($value); + } + + if ($isDictionary) { + return new Zend_Pdf_Element_Dictionary($pdfElementsArray); + } else { + return new Zend_Pdf_Element_Array($pdfElementsArray); + } + } else { + return new Zend_Pdf_Element_String((string)$input); + } + } +} + diff --git a/libs/Zend/Pdf/Element/Array.php b/libs/Zend/Pdf/Element/Array.php new file mode 100644 index 0000000..b6935c8 --- /dev/null +++ b/libs/Zend/Pdf/Element/Array.php @@ -0,0 +1,151 @@ +_items = new Zend_Pdf_PhpArray(); + + if ($val !== null && is_array($val)) { + foreach ($val as $element) { + if (!$element instanceof Zend_Pdf_Element) { + throw new Zend_Pdf_Exception('Array elements must be Zend_Pdf_Element objects'); + } + $this->_items[] = $element; + } + } else if ($val !== null){ + throw new Zend_Pdf_Exception('Argument must be an array'); + } + } + + + /** + * Provides access to $this->_items + * + * @param string $property + * @return Zend_Pdf_PhpArray + */ + public function __get($property) { + if ($property=='items') { + return $this->_items; + } + throw new Exception('Undefined property: Zend_Pdf_Element_Array::$' . $property); + } + + + /** + * Provides read-only access to $this->_items; + * + * @param unknown_type $offset + * @param unknown_type $value + */ + public function __set($property, $value) { + if ($property=='items') { + throw new Exception('Array container cannot be overwritten'); + } + throw new Exception('Undefined property: Zend_Pdf_Element_Array::$' . $property); + } + + /** + * Return type of the element. + * + * @return integer + */ + public function getType() + { + return Zend_Pdf_Element::TYPE_ARRAY; + } + + + /** + * Return object as string + * + * @param Zend_Pdf_Factory $factory + * @return string + */ + public function toString($factory = null) + { + $outStr = '['; + $lastNL = 0; + + foreach ($this->_items as $element) { + if (strlen($outStr) - $lastNL > 128) { + $outStr .= "\n"; + $lastNL = strlen($outStr); + } + + $outStr .= $element->toString($factory) . ' '; + } + $outStr .= ']'; + + return $outStr; + } + + /** + * Convert PDF element to PHP type. + * + * Dictionary is returned as an associative array + * + * @return mixed + */ + public function toPhp() + { + foreach ($this->_items as $item) { + $phpArray[] = $item->toPhp(); + } + + return $phpArray; + } +} diff --git a/libs/Zend/Pdf/Element/Boolean.php b/libs/Zend/Pdf/Element/Boolean.php new file mode 100644 index 0000000..08955b2 --- /dev/null +++ b/libs/Zend/Pdf/Element/Boolean.php @@ -0,0 +1,81 @@ +value = $val; + } + + + /** + * Return type of the element. + * + * @return integer + */ + public function getType() + { + return Zend_Pdf_Element::TYPE_BOOL; + } + + + /** + * Return object as string + * + * @param Zend_Pdf_Factory $factory + * @return string + */ + public function toString($factory = null) + { + return $this->value ? 'true' : 'false'; + } +} diff --git a/libs/Zend/Pdf/Element/Dictionary.php b/libs/Zend/Pdf/Element/Dictionary.php new file mode 100644 index 0000000..17e5c07 --- /dev/null +++ b/libs/Zend/Pdf/Element/Dictionary.php @@ -0,0 +1,181 @@ + Zend_Pdf_Element) + * + * @var array + */ + private $_items = array(); + + + /** + * Object constructor + * + * @param array $val - array of Zend_Pdf_Element objects + * @throws Zend_Pdf_Exception + */ + public function __construct($val = null) + { + if ($val === null) { + return; + } else if (!is_array($val)) { + throw new Zend_Pdf_Exception('Argument must be an array'); + } + + foreach ($val as $name => $element) { + if (!$element instanceof Zend_Pdf_Element) { + throw new Zend_Pdf_Exception('Array elements must be Zend_Pdf_Element objects'); + } + if (!is_string($name)) { + throw new Zend_Pdf_Exception('Array keys must be strings'); + } + $this->_items[$name] = $element; + } + } + + + /** + * Add element to an array + * + * @name Zend_Pdf_Element_Name $name + * @param Zend_Pdf_Element $val - Zend_Pdf_Element object + * @throws Zend_Pdf_Exception + */ + public function add(Zend_Pdf_Element_Name $name, Zend_Pdf_Element $val) + { + $this->_items[$name->value] = $val; + } + + /** + * Return dictionary keys + * + * @return array + */ + public function getKeys() + { + return array_keys($this->_items); + } + + + /** + * Get handler + * + * @param string $property + * @return Zend_Pdf_Element | null + */ + public function __get($item) + { + $element = isset($this->_items[$item]) ? $this->_items[$item] + : null; + + return $element; + } + + /** + * Set handler + * + * @param string $property + * @param mixed $value + */ + public function __set($item, $value) + { + if ($value === null) { + unset($this->_items[$item]); + } else { + $this->_items[$item] = $value; + } + } + + /** + * Return type of the element. + * + * @return integer + */ + public function getType() + { + return Zend_Pdf_Element::TYPE_DICTIONARY; + } + + + /** + * Return object as string + * + * @param Zend_Pdf_Factory $factory + * @return string + */ + public function toString($factory = null) + { + $outStr = '<<'; + $lastNL = 0; + + foreach ($this->_items as $name => $element) { + if (!is_object($element)) { + throw new Zend_Pdf_Exception('Wrong data'); + } + + if (strlen($outStr) - $lastNL > 128) { + $outStr .= "\n"; + $lastNL = strlen($outStr); + } + + $nameObj = new Zend_Pdf_Element_Name($name); + $outStr .= $nameObj->toString($factory) . ' ' . $element->toString($factory) . ' '; + } + $outStr .= '>>'; + + return $outStr; + } + + + /** + * Convert PDF element to PHP type. + * + * Dictionary is returned as an associative array + * + * @return mixed + */ + public function toPhp() + { + $phpArray = array(); + + foreach ($this->_items as $itemName => $item) { + $phpArray[$itemName] = $item->toPhp(); + } + + return $phpArray; + } +} diff --git a/libs/Zend/Pdf/Element/Name.php b/libs/Zend/Pdf/Element/Name.php new file mode 100644 index 0000000..a1f491d --- /dev/null +++ b/libs/Zend/Pdf/Element/Name.php @@ -0,0 +1,159 @@ +value = (string)$val; + } + + + /** + * Return type of the element. + * + * @return integer + */ + public function getType() + { + return Zend_Pdf_Element::TYPE_NAME; + } + + + /** + * Escape string according to the PDF rules + * + * @param string $inStr + * @return string + */ + public static function escape($inStr) + { + $outStr = ''; + + for ($count = 0; $count < strlen($inStr); $count++) { + $nextCode = ord($inStr[$count]); + + switch ($inStr[$count]) { + case '(': + // fall through to next case + case ')': + // fall through to next case + case '<': + // fall through to next case + case '>': + // fall through to next case + case '[': + // fall through to next case + case ']': + // fall through to next case + case '{': + // fall through to next case + case '}': + // fall through to next case + case '/': + // fall through to next case + case '%': + // fall through to next case + case '\\': + // fall through to next case + case '#': + $outStr .= sprintf('#%02X', $nextCode); + break; + + default: + if ($nextCode >= 33 && $nextCode <= 126 ) { + // Visible ASCII symbol + $outStr .= $inStr[$count]; + } else { + $outStr .= sprintf('#%02X', $nextCode); + } + } + + } + + return $outStr; + } + + + /** + * Unescape string according to the PDF rules + * + * @param string $inStr + * @return string + */ + public static function unescape($inStr) + { + $outStr = ''; + + for ($count = 0; $count < strlen($inStr); $count++) { + if ($inStr[$count] != '#' ) { + $outStr .= $inStr[$count]; + } else { + // Escape sequence + $outStr .= chr(base_convert(substr($inStr, $count+1, 2), 16, 10 )); + $count +=2; + } + } + return $outStr; + } + + + /** + * Return object as string + * + * @param Zend_Pdf_Factory $factory + * @return string + */ + public function toString($factory = null) + { + return '/' . self::escape((string)$this->value); + } +} diff --git a/libs/Zend/Pdf/Element/Null.php b/libs/Zend/Pdf/Element/Null.php new file mode 100644 index 0000000..26a6896 --- /dev/null +++ b/libs/Zend/Pdf/Element/Null.php @@ -0,0 +1,74 @@ +value = null; + } + + + /** + * Return type of the element. + * + * @return integer + */ + public function getType() + { + return Zend_Pdf_Element::TYPE_NULL; + } + + + /** + * Return object as string + * + * @param Zend_Pdf_Factory $factory + * @return string + */ + public function toString($factory = null) + { + return 'null'; + } +} diff --git a/libs/Zend/Pdf/Element/Numeric.php b/libs/Zend/Pdf/Element/Numeric.php new file mode 100644 index 0000000..d0cc7fe --- /dev/null +++ b/libs/Zend/Pdf/Element/Numeric.php @@ -0,0 +1,93 @@ +value = $val; + } + + + /** + * Return type of the element. + * + * @return integer + */ + public function getType() + { + return Zend_Pdf_Element::TYPE_NUMERIC; + } + + + /** + * Return object as string + * + * @param Zend_Pdf_Factory $factory + * @return string + */ + public function toString($factory = null) + { + if (is_integer($this->value)) { + return (string)$this->value; + } + + /** + * PDF doesn't support exponental format. + * Fixed point format must be used instead + */ + $prec = 0; $v = $this->value; + while (abs( floor($v) - $v ) > 1e-10) { + $prec++; $v *= 10; + } + return sprintf("%.{$prec}F", $this->value); + } +} diff --git a/libs/Zend/Pdf/Element/Object.php b/libs/Zend/Pdf/Element/Object.php new file mode 100644 index 0000000..3c5824a --- /dev/null +++ b/libs/Zend/Pdf/Element/Object.php @@ -0,0 +1,250 @@ + 0) ) { + throw new Zend_Pdf_Exception('Object number must be positive integer.'); + } + + if ( !(is_integer($genNum) && $genNum >= 0) ) { + throw new Zend_Pdf_Exception('Generation number must be non-negative integer.'); + } + + $this->_value = $val; + $this->_objNum = $objNum; + $this->_genNum = $genNum; + $this->_factory = $factory; + + $factory->registerObject($this); + } + + + /** + * Check, that object is generated by specified factory + * + * @return Zend_Pdf_ElementFactory + */ + public function getFactory() + { + return $this->_factory; + } + + /** + * Return type of the element. + * + * @return integer + */ + public function getType() + { + return $this->_value->getType(); + } + + + /** + * Get object number + * + * @return integer + */ + public function getObjNum() + { + return $this->_objNum; + } + + + /** + * Get generation number + * + * @return integer + */ + public function getGenNum() + { + return $this->_genNum; + } + + + /** + * Return reference to the object + * + * @param Zend_Pdf_Factory $factory + * @return string + */ + public function toString($factory = null) + { + if ($factory === null) { + $shift = 0; + } else { + $shift = $factory->getEnumerationShift($this->_factory); + } + + return $this->_objNum + $shift . ' ' . $this->_genNum . ' R'; + } + + + /** + * Dump object to a string to save within PDF file. + * + * $factory parameter defines operation context. + * + * @param Zend_Pdf_ElementFactory $factory + * @return string + */ + public function dump(Zend_Pdf_ElementFactory $factory) + { + $shift = $factory->getEnumerationShift($this->_factory); + + return $this->_objNum + $shift . " " . $this->_genNum . " obj \n" + . $this->_value->toString($factory) . "\n" + . "endobj\n"; + } + + /** + * Get handler + * + * @param string $property + * @return mixed + */ + public function __get($property) + { + return $this->_value->$property; + } + + /** + * Set handler + * + * @param string $property + * @param mixed $value + */ + public function __set($property, $value) + { + $this->_value->$property = $value; + } + + /** + * Call handler + * + * @param string $method + * @param array $args + * @return mixed + */ + public function __call($method, $args) + { + switch (count($args)) { + case 0: + return $this->_value->$method(); + case 1: + return $this->_value->$method($args[0]); + case 2: + return $this->_value->$method($args[0], $args[1]); + case 3: + return $this->_value->$method($args[0], $args[1], $args[2]); + case 4: + return $this->_value->$method($args[0], $args[1], $args[2], $args[3]); + default: + throw new Zend_Pdf_Exception('Unsupported number of arguments'); + } + } + + + /** + * Mark object as modified, to include it into new PDF file segment + */ + public function touch() + { + $this->_factory->markAsModified($this); + } + + /** + * Clean up resources, used by object + */ + public function cleanUp() + { + $this->_value = null; + } + + /** + * Convert PDF element to PHP type. + * + * @return mixed + */ + public function toPhp() + { + return $this->_value->toPhp(); + } +} diff --git a/libs/Zend/Pdf/Element/Object/Stream.php b/libs/Zend/Pdf/Element/Object/Stream.php new file mode 100644 index 0000000..96b3a88 --- /dev/null +++ b/libs/Zend/Pdf/Element/Object/Stream.php @@ -0,0 +1,409 @@ +_dictionary = new Zend_Pdf_Element_Dictionary(); + $this->_dictionary->Length = new Zend_Pdf_Element_Numeric(strlen( $val )); + $this->_streamDecoded = true; + } else { + $this->_dictionary = $dictionary; + $this->_streamDecoded = false; + } + } + + + /** + * Store original dictionary information in $_originalDictionary class member. + * Used to store information and to normalize filters information before defiltering. + * + */ + private function _storeOriginalDictionary() + { + $this->_originalDictionary = array(); + + $this->_originalDictionary['Filter'] = array(); + $this->_originalDictionary['DecodeParms'] = array(); + if ($this->_dictionary->Filter === null) { + // Do nothing. + } else if ($this->_dictionary->Filter->getType() == Zend_Pdf_Element::TYPE_ARRAY) { + foreach ($this->_dictionary->Filter->items as $id => $filter) { + $this->_originalDictionary['Filter'][$id] = $filter->value; + $this->_originalDictionary['DecodeParms'][$id] = array(); + + if ($this->_dictionary->DecodeParms !== null ) { + if ($this->_dictionary->DecodeParms->items[$id] !== null && + $this->_dictionary->DecodeParms->items[$id]->value !== null ) { + foreach ($this->_dictionary->DecodeParms->items[$id]->getKeys() as $paramKey) { + $this->_originalDictionary['DecodeParms'][$id][$paramKey] = + $this->_dictionary->DecodeParms->items[$id]->$paramKey->value; + } + } + } + } + } else if ($this->_dictionary->Filter->getType() != Zend_Pdf_Element::TYPE_NULL) { + $this->_originalDictionary['Filter'][0] = $this->_dictionary->Filter->value; + $this->_originalDictionary['DecodeParms'][0] = array(); + if ($this->_dictionary->DecodeParms !== null ) { + foreach ($this->_dictionary->DecodeParms->getKeys() as $paramKey) { + $this->_originalDictionary['DecodeParms'][0][$paramKey] = + $this->_dictionary->DecodeParms->$paramKey->value; + } + } + } + + if ($this->_dictionary->F !== null) { + $this->_originalDictionary['F'] = $this->_dictionary->F->value; + } + + $this->_originalDictionary['FFilter'] = array(); + $this->_originalDictionary['FDecodeParms'] = array(); + if ($this->_dictionary->FFilter === null) { + // Do nothing. + } else if ($this->_dictionary->FFilter->getType() == Zend_Pdf_Element::TYPE_ARRAY) { + foreach ($this->_dictionary->FFilter->items as $id => $filter) { + $this->_originalDictionary['FFilter'][$id] = $filter->value; + $this->_originalDictionary['FDecodeParms'][$id] = array(); + + if ($this->_dictionary->FDecodeParms !== null ) { + if ($this->_dictionary->FDecodeParms->items[$id] !== null && + $this->_dictionary->FDecodeParms->items[$id]->value !== null) { + foreach ($this->_dictionary->FDecodeParms->items[$id]->getKeys() as $paramKey) { + $this->_originalDictionary['FDecodeParms'][$id][$paramKey] = + $this->_dictionary->FDecodeParms->items[$id]->items[$paramKey]->value; + } + } + } + } + } else { + $this->_originalDictionary['FFilter'][0] = $this->_dictionary->FFilter->value; + $this->_originalDictionary['FDecodeParms'][0] = array(); + if ($this->_dictionary->FDecodeParms !== null ) { + foreach ($this->_dictionary->FDecodeParms->getKeys() as $paramKey) { + $this->_originalDictionary['FDecodeParms'][0][$paramKey] = + $this->_dictionary->FDecodeParms->items[$paramKey]->value; + } + } + } + } + + /** + * Decode stream + * + * @throws Zend_Pdf_Exception + */ + private function _decodeStream() + { + if ($this->_originalDictionary === null) { + $this->_storeOriginalDictionary(); + } + + /** + * All applied stream filters must be processed to decode stream. + * If we don't recognize any of applied filetrs an exception should be thrown here + */ + if (isset($this->_originalDictionary['F'])) { + /** @todo Check, how external files can be processed. */ + throw new Zend_Pdf_Exception('External filters are not supported now.'); + } + + foreach ($this->_originalDictionary['Filter'] as $id => $filterName ) { + $valueRef = &$this->_value->value->getRef(); + $this->_value->value->touch(); + switch ($filterName) { + case 'ASCIIHexDecode': + $valueRef = Zend_Pdf_Filter_AsciiHex::decode($valueRef); + break; + + case 'ASCII85Decode': + $valueRef = Zend_Pdf_Filter_Ascii85::decode($valueRef); + break; + + case 'FlateDecode': + $valueRef = Zend_Pdf_Filter_Compression_Flate::decode($valueRef, + $this->_originalDictionary['DecodeParms'][$id]); + break; + + case 'LZWDecode': + $valueRef = Zend_Pdf_Filter_Compression_Lzw::decode($valueRef, + $this->_originalDictionary['DecodeParms'][$id]); + break; + + default: + throw new Zend_Pdf_Exception('Unknown stream filter: \'' . $filterName . '\'.'); + } + } + + $this->_streamDecoded = true; + } + + /** + * Encode stream + * + * @throws Zend_Pdf_Exception + */ + private function _encodeStream() + { + /** + * All applied stream filters must be processed to encode stream. + * If we don't recognize any of applied filetrs an exception should be thrown here + */ + if (isset($this->_originalDictionary['F'])) { + /** @todo Check, how external files can be processed. */ + throw new Zend_Pdf_Exception('External filters are not supported now.'); + } + + $filters = array_reverse($this->_originalDictionary['Filter'], true); + + foreach ($filters as $id => $filterName ) { + $valueRef = &$this->_value->value->getRef(); + $this->_value->value->touch(); + switch ($filterName) { + case 'ASCIIHexDecode': + $valueRef = Zend_Pdf_Filter_AsciiHex::encode($valueRef); + break; + + case 'ASCII85Decode': + $valueRef = Zend_Pdf_Filter_Ascii85::encode($valueRef); + break; + + case 'FlateDecode': + $valueRef = Zend_Pdf_Filter_Compression_Flate::encode($valueRef, + $this->_originalDictionary['DecodeParms'][$id]); + break; + + case 'LZWDecode': + $valueRef = Zend_Pdf_Filter_Compression_Lzw::encode($valueRef, + $this->_originalDictionary['DecodeParms'][$id]); + break; + + default: + throw new Zend_Pdf_Exception('Unknown stream filter: \'' . $filterName . '\'.'); + } + } + + $this->_streamDecoded = false; + } + + /** + * Get handler + * + * @param string $property + * @return mixed + * @throws Zend_Pdf_Exception + */ + public function __get($property) + { + if ($property == 'dictionary') { + /** + * If stream is note decoded yet, then store original decoding options (do it only once). + */ + if (( !$this->_streamDecoded ) && ($this->_originalDictionary === null)) { + $this->_storeOriginalDictionary(); + } + + return $this->_dictionary; + } + + if ($property == 'value') { + if (!$this->_streamDecoded) { + $this->_decodeStream(); + } + + return $this->_value->value->getRef(); + } + + throw new Zend_Pdf_Exception('Unknown stream object property requested.'); + } + + + /** + * Set handler + * + * @param string $property + * @param mixed $value + */ + public function __set($property, $value) + { + if ($property == 'value') { + $valueRef = &$this->_value->value->getRef(); + $valueRef = $value; + $this->_value->value->touch(); + + $this->_streamDecoded = true; + + return; + } + + throw new Zend_Pdf_Exception('Unknown stream object property: \'' . $property . '\'.'); + } + + + /** + * Treat stream data as already encoded + */ + public function skipFilters() + { + $this->_streamDecoded = false; + } + + + /** + * Call handler + * + * @param string $method + * @param array $args + * @return mixed + */ + public function __call($method, $args) + { + if (!$this->_streamDecoded) { + $this->_decodeStream(); + } + + switch (count($args)) { + case 0: + return $this->_value->$method(); + case 1: + return $this->_value->$method($args[0]); + default: + throw new Zend_Pdf_Exception('Unsupported number of arguments'); + } + } + + /** + * Dump object to a string to save within PDF file + * + * $factory parameter defines operation context. + * + * @param Zend_Pdf_ElementFactory $factory + * @return string + */ + public function dump(Zend_Pdf_ElementFactory $factory) + { + $shift = $factory->getEnumerationShift($this->_factory); + + if ($this->_streamDecoded) { + $this->_storeOriginalDictionary(); + $this->_encodeStream(); + } else if ($this->_originalDictionary != null) { + $startDictionary = $this->_originalDictionary; + $this->_storeOriginalDictionary(); + $newDictionary = $this->_originalDictionary; + + if ($startDictionary !== $newDictionary) { + $this->_originalDictionary = $startDictionary; + $this->_decodeStream(); + + $this->_originalDictionary = $newDictionary; + $this->_encodeStream(); + } + } + + // Update stream length + $this->dictionary->Length->value = $this->_value->length(); + + return $this->_objNum + $shift . " " . $this->_genNum . " obj \n" + . $this->dictionary->toString($factory) . "\n" + . $this->_value->toString($factory) . "\n" + . "endobj\n"; + } + + /** + * Clean up resources, used by object + */ + public function cleanUp() + { + $this->_dictionary = null; + $this->_value = null; + } +} diff --git a/libs/Zend/Pdf/Element/Reference.php b/libs/Zend/Pdf/Element/Reference.php new file mode 100644 index 0000000..1bf7306 --- /dev/null +++ b/libs/Zend/Pdf/Element/Reference.php @@ -0,0 +1,280 @@ + 0) ) { + throw new Zend_Pdf_Exception('Object number must be positive integer'); + } + if ( !(is_integer($genNum) && $genNum >= 0) ) { + throw new Zend_Pdf_Exception('Generation number must be non-negative integer'); + } + + $this->_objNum = $objNum; + $this->_genNum = $genNum; + $this->_ref = null; + $this->_context = $context; + $this->_factory = $factory; + } + + /** + * Check, that object is generated by specified factory + * + * @return Zend_Pdf_ElementFactory + */ + public function getFactory() + { + return $this->_factory; + } + + + /** + * Return type of the element. + * + * @return integer + */ + public function getType() + { + if ($this->_ref === null) { + $this->_dereference(); + } + + return $this->_ref->getType(); + } + + + /** + * Return reference to the object + * + * @param Zend_Pdf_Factory $factory + * @return string + */ + public function toString($factory = null) + { + if ($factory === null) { + $shift = 0; + } else { + $shift = $factory->getEnumerationShift($this->_factory); + } + + return $this->_objNum + $shift . ' ' . $this->_genNum . ' R'; + } + + + /** + * Dereference. + * Take inderect object, take $value member of this object (must be Zend_Pdf_Element), + * take reference to the $value member of this object and assign it to + * $value member of current PDF Reference object + * $obj can be null + * + * @throws Zend_Pdf_Exception + */ + private function _dereference() + { + $obj = $this->_context->getParser()->getObject( + $this->_context->getRefTable()->getOffset($this->_objNum . ' ' . $this->_genNum . ' R'), + $this->_context + ); + + if ($obj === null ) { + $this->_ref = new Zend_Pdf_Element_Null(); + return; + } + + if ($obj->toString() != $this->_objNum . ' ' . $this->_genNum . ' R') { + throw new Zend_Pdf_Exception('Incorrect reference to the object'); + } + + $this->_ref = $obj; + $this->setParentObject($obj); + + $this->_factory->registerObject($this); + } + + /** + * Mark object as modified, to include it into new PDF file segment. + */ + public function touch() + { + if ($this->_ref === null) { + $this->_dereference(); + } + + $this->_ref->touch(); + } + + + /** + * Get handler + * + * @param string $property + * @return mixed + */ + public function __get($property) + { + if ($this->_ref === null) { + $this->_dereference(); + } + + return $this->_ref->$property; + } + + /** + * Set handler + * + * @param string $property + * @param mixed $value + */ + public function __set($property, $value) + { + if ($this->_ref === null) { + $this->_dereference(); + } + + $this->_ref->$property = $value; + } + + /** + * Call handler + * + * @param string $method + * @param array $args + * @return mixed + */ + public function __call($method, $args) + { + if ($this->_ref === null) { + $this->_dereference(); + } + + switch (count($args)) { + case 0: + return $this->_ref->$method(); + case 1: + return $this->_ref->$method($args[0]); + case 2: + return $this->_ref->$method($args[0], $args[1]); + case 3: + return $this->_ref->$method($args[0], $args[1], $args[2]); + case 4: + return $this->_ref->$method($args[0], $args[1], $args[2], $args[3]); + default: + throw new Zend_Pdf_Exception('Unsupported number of arguments'); + } + } + + /** + * Clean up resources + */ + public function cleanUp() + { + $this->_ref = null; + } + + /** + * Convert PDF element to PHP type. + * + * @return mixed + */ + public function toPhp() + { + if ($this->_ref === null) { + $this->_dereference(); + } + + return $this->_ref->toPhp(); + } +} diff --git a/libs/Zend/Pdf/Element/Reference/Context.php b/libs/Zend/Pdf/Element/Reference/Context.php new file mode 100644 index 0000000..a26b305 --- /dev/null +++ b/libs/Zend/Pdf/Element/Reference/Context.php @@ -0,0 +1,89 @@ +_stringParser = $parser; + $this->_refTable = $refTable; + } + + + /** + * Context parser + * + * @return Zend_Pdf_Parser + */ + public function getParser() + { + return $this->_stringParser; + } + + + /** + * Context reference table + * + * @return Zend_Pdf_Element_Reference_Table + */ + public function getRefTable() + { + return $this->_refTable; + } +} + diff --git a/libs/Zend/Pdf/Element/Reference/Table.php b/libs/Zend/Pdf/Element/Reference/Table.php new file mode 100644 index 0000000..40ae3bb --- /dev/null +++ b/libs/Zend/Pdf/Element/Reference/Table.php @@ -0,0 +1,193 @@ + next free object number + * + * @var array + */ + private $_free; + + /** + * Generation numbers for free objects. + * Array: objNum => nextGeneration + * + * @var array + */ + private $_generations; + + /** + * In use entries + * 'reference' => offset + * + * @var array + */ + private $_inuse; + + /** + * Generation numbers for free objects. + * Array: objNum => objGeneration + * + * @var array + */ + private $_usedObjects; + + + + /** + * Object constructor + */ + public function __construct() + { + $this->_parent = null; + $this->_free = array(); $this->_generations = array(); + $this->_inuse = array(); $this->_usedObjects = array(); + } + + + /** + * Add reference to the reference table + * + * @param string $ref + * @param integer $offset + * @param boolean $inuse + */ + public function addReference($ref, $offset, $inuse = true) + { + $refElements = explode(' ', $ref); + if (!is_numeric($refElements[0]) || !is_numeric($refElements[1]) || $refElements[2] != 'R') { + throw new Zend_Pdf_Exception("Incorrect reference: '$ref'"); + } + $objNum = (int)$refElements[0]; + $genNum = (int)$refElements[1]; + + if ($inuse) { + $this->_inuse[$ref] = $offset; + $this->_usedObjects[$objNum] = $objNum; + } else { + $this->_free[$ref] = $offset; + $this->_generations[$objNum] = $genNum; + } + } + + + /** + * Set parent reference table + * + * @param Zend_Pdf_Element_Reference_Table $parent + */ + public function setParent(self $parent) + { + $this->_parent = $parent; + } + + + /** + * Get object offset + * + * @param string $ref + * @return integer + */ + public function getOffset($ref) + { + if (isset($this->_inuse[$ref])) { + return $this->_inuse[$ref]; + } + + if (isset($this->_free[$ref])) { + return null; + } + + if (isset($this->_parent)) { + return $this->_parent->getOffset($ref); + } + + return null; + } + + + /** + * Get next object from a list of free objects. + * + * @param string $ref + * @return integer + * @throws Zend_Pdf_Exception + */ + public function getNextFree($ref) + { + if (isset($this->_inuse[$ref])) { + throw new Zend_Pdf_Exception('Object is not free'); + } + + if (isset($this->_free[$ref])) { + return $this->_free[$ref]; + } + + if (isset($this->_parent)) { + return $this->_parent->getNextFree($ref); + } + + throw new Zend_Pdf_Exception('Object not found.'); + } + + + /** + * Get next generation number for free object + * + * @param integer $objNum + * @return unknown + */ + public function getNewGeneration($objNum) + { + if (isset($this->_usedObjects[$objNum])) { + throw new Zend_Pdf_Exception('Object is not free'); + } + + if (isset($this->_generations[$objNum])) { + return $this->_generations[$objNum]; + } + + if (isset($this->_parent)) { + return $this->_parent->getNewGeneration($objNum); + } + + throw new Zend_Pdf_Exception('Object not found.'); + } +} + diff --git a/libs/Zend/Pdf/Element/Stream.php b/libs/Zend/Pdf/Element/Stream.php new file mode 100644 index 0000000..3161a57 --- /dev/null +++ b/libs/Zend/Pdf/Element/Stream.php @@ -0,0 +1,124 @@ +value = Zend_Pdf::getMemoryManager()->create($val); + } + + + /** + * Return type of the element. + * + * @return integer + */ + public function getType() + { + return Zend_Pdf_Element::TYPE_STREAM; + } + + + /** + * Stream length. + * (Method is used to avoid string copying, which may occurs in some cases) + * + * @return integer + */ + public function length() + { + return strlen($this->value->getRef()); + } + + + /** + * Clear stream + * + */ + public function clear() + { + $ref = &$this->value->getRef(); + $ref = ''; + $this->value->touch(); + } + + + /** + * Append value to a stream + * + * @param mixed $val + */ + public function append($val) + { + $ref = &$this->value->getRef(); + $ref .= (string)$val; + $this->value->touch(); + } + + + /** + * Return object as string + * + * @param Zend_Pdf_Factory $factory + * @return string + */ + public function toString($factory = null) + { + return "stream\n" . $this->value->getRef() . "\nendstream"; + } +} diff --git a/libs/Zend/Pdf/Element/String.php b/libs/Zend/Pdf/Element/String.php new file mode 100644 index 0000000..8497514 --- /dev/null +++ b/libs/Zend/Pdf/Element/String.php @@ -0,0 +1,246 @@ +value = (string)$val; + } + + + /** + * Return type of the element. + * + * @return integer + */ + public function getType() + { + return Zend_Pdf_Element::TYPE_STRING; + } + + + /** + * Return object as string + * + * @param Zend_Pdf_Factory $factory + * @return string + */ + public function toString($factory = null) + { + return '(' . self::escape((string)$this->value) . ')'; + } + + + /** + * Escape string according to the PDF rules + * + * @param string $inStr + * @return string + */ + public static function escape($inStr) + { + $outStr = ''; + $lastNL = 0; + + for ($count = 0; $count < strlen($inStr); $count++) { + if (strlen($outStr) - $lastNL > 128) { + $outStr .= "\\\n"; + $lastNL = strlen($outStr); + } + + $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; + } + } + + return $outStr; + } + + + /** + * Unescape string according to the PDF rules + * + * @param string $inStr + * @return string + */ + public static function unescape($inStr) + { + $outStr = ''; + + for ($count = 0; $count < strlen($inStr); $count++) { + if ($inStr[$count] != '\\' || $count == strlen($inStr)-1) { + $outStr .= $inStr[$count]; + } else { // Escape sequence + switch ($inStr{++$count}) { + // '\\n' - line feed (LF) + case 'n': + $outStr .= "\n"; + break; + + // '\\r' - carriage return (CR) + case 'r': + $outStr .= "\r"; + break; + + // '\\t' - horizontal tab (HT) + case 't': + $outStr .= "\t"; + break; + + // '\\b' - backspace (BS) + case 'b': + $outStr .= "\x08"; + break; + + // '\\f' - form feed (FF) + case 'f': + $outStr .= "\x0C"; + break; + + // '\\(' - left paranthesis + case '(': + $outStr .= '('; + break; + + // '\\)' - right paranthesis + case ')': + $outStr .= ')'; + break; + + // '\\\\' - backslash + case '\\': + $outStr .= '\\'; + break; + + // "\\\n" or "\\\n\r" + case "\n": + // skip new line symbol + if ($inStr[$count+1] == "\r") { + $count++; + } + break; + + default: + if (ord($inStr[$count]) >= ord('0') && + ord($inStr[$count]) <= ord('9')) { + // Character in octal representation + // '\\xxx' + $nextCode = '0' . $inStr[$count]; + + if (ord($inStr[$count+1]) >= ord('0') && + ord($inStr[$count+1]) <= ord('9')) { + $nextCode .= $inStr{++$count}; + + if (ord($inStr[$count+1]) >= ord('0') && + ord($inStr[$count+1]) <= ord('9')) { + $nextCode .= $inStr{++$count}; + } + } + + $outStr .= chr($nextCode); + } else { + $outStr .= $inStr[$count]; + } + break; + } + } + } + + return $outStr; + } + +} diff --git a/libs/Zend/Pdf/Element/String/Binary.php b/libs/Zend/Pdf/Element/String/Binary.php new file mode 100644 index 0000000..cc7d1d3 --- /dev/null +++ b/libs/Zend/Pdf/Element/String/Binary.php @@ -0,0 +1,110 @@ += 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 = ''; + } + } + + if ($nextHexCode != '') { + // We have odd number of digits. + // Final digit is assumed to be '0' + $outStr .= chr(base_convert($nextHexCode . '0', 16, 10)); + } + + return $outStr; + } + + + /** + * Return object as string + * + * @param Zend_Pdf_Factory $factory + * @return string + */ + public function toString($factory = null) + { + return '<' . self::escape((string)$this->value) . '>'; + } +} diff --git a/libs/Zend/Pdf/ElementFactory.php b/libs/Zend/Pdf/ElementFactory.php new file mode 100644 index 0000000..aedcb62 --- /dev/null +++ b/libs/Zend/Pdf/ElementFactory.php @@ -0,0 +1,441 @@ + Zend_Pdf_Element_Object + * + * @var array + */ + private $_modifiedObjects = array(); + + /** + * List of the removed objects + * + * Array: ojbectNumber => Zend_Pdf_Element_Object + * + * @var array + */ + private $_removedObjects = array(); + + /** + * List of registered objects. + * Used for resources clean up when factory is destroyed. + * + * Array of Zend_Pdf_Element objects + * + * @var array + */ + private $_registeredObjects = array(); + + /** + * PDF object counter. + * Actually it's an object number for new PDF object + * + * @var integer + */ + private $_objectCount; + + + /** + * List of the attached object factories. + * Array of Zend_Pdf_ElementFactory_Interface objects + * + * @var array + */ + private $_attachedFactories = array(); + + + /** + * Factory internal id + * + * @var integer + */ + private $_factoryId; + + /** + * Identity, used for factory id generation + * + * @var integer + */ + private static $_identity = 0; + + + /** + * Internal cache to save calculated shifts + * + * @var array + */ + private $_shiftCalculationCache = array(); + + + /** + * Object constructor + * + * @param integer $objCount + */ + public function __construct($objCount) + { + $this->_objectCount = (int)$objCount; + $this->_factoryId = self::$_identity++; + } + + + /** + * Factory generator + * + * @param integer $objCount + * @return Zend_Pdf_ElementFactory_Interface + */ + static public function createFactory($objCount) + { + return new Zend_Pdf_ElementFactory_Proxy(new Zend_Pdf_ElementFactory($objCount)); + } + + /** + * Close factory and clean-up resources + * + * @internal + */ + public function close() + { + $this->_modifiedObjects = null; + $this->_removedObjects = null; + $this->_attachedFactories = null; + + foreach ($this->_registeredObjects as $obj) { + $obj->cleanUp(); + } + $this->_registeredObjects = null; + } + + /** + * Get source factory object + * + * @return Zend_Pdf_ElementFactory + */ + public function resolve() + { + return $this; + } + + /** + * Get factory ID + * + * @return integer + */ + public function getId() + { + return $this->_factoryId; + } + + /** + * Set object counter + * + * @param integer $objCount + */ + public function setObjectCount($objCount) + { + $this->_objectCount = (int)$objCount; + } + + /** + * Get object counter + * + * @return integer + */ + public function getObjectCount() + { + $count = $this->_objectCount; + + foreach ($this->_attachedFactories as $attached) { + $count += $attached->getObjectCount() - 1; // -1 as "0" object is a special case and shared between factories + } + + return $count; + } + + + /** + * Attach factory to the current; + * + * @param Zend_Pdf_ElementFactory_Interface $factory + */ + public function attach(Zend_Pdf_ElementFactory_Interface $factory) + { + if ( $factory === $this || isset($this->_attachedFactories[$factory->getId()])) { + /** + * Don't attach factory twice. + * We do not check recusively because of nature of attach operation + * (Pages are always attached to the Documents, Fonts are always attached + * to the pages even if pages already use Document level object factory and so on) + */ + return; + } + + $this->_attachedFactories[$factory->getId()] = $factory; + } + + + /** + * Calculate object enumeration shift. + * + * @internal + * @param Zend_Pdf_ElementFactory_Interface $factory + * @return integer + */ + public function calculateShift(Zend_Pdf_ElementFactory_Interface $factory) + { + if ($factory === $this) { + return 0; + } + + if (isset($this->_shiftCalculationCache[$factory->_factoryId])) { + return $this->_shiftCalculationCache[$factory->_factoryId]; + } + + $shift = $this->_objectCount - 1; + + foreach ($this->_attachedFactories as $subFactory) { + $subFactoryShift = $subFactory->calculateShift($factory); + + if ($subFactoryShift != -1) { + // context found + $this->_shiftCalculationCache[$factory->_factoryId] = $shift + $subFactoryShift; + return $shift + $subFactoryShift; + } else { + $shift += $subFactory->getObjectCount()-1; + } + } + + $this->_shiftCalculationCache[$factory->_factoryId] = -1; + return -1; + } + + /** + * Retrive object enumeration shift. + * + * @param Zend_Pdf_ElementFactory_Interface $factory + * @return integer + * @throws Zend_Pdf_Exception + */ + public function getEnumerationShift(Zend_Pdf_ElementFactory_Interface $factory) + { + if (($shift = $this->calculateShift($factory)) == -1) { + throw new Zend_Pdf_Exception('Wrong object context'); + } + + return $shift; + } + + /** + * Mark object as modified in context of current factory. + * + * @param Zend_Pdf_Element_Object $obj + * @throws Zend_Pdf_Exception + */ + public function markAsModified(Zend_Pdf_Element_Object $obj) + { + if ($obj->getFactory() !== $this) { + throw new Zend_Pdf_Exception('Object is not generated by this factory'); + } + + $this->_modifiedObjects[$obj->getObjNum()] = $obj; + } + + + /** + * Remove object in context of current factory. + * + * @param Zend_Pdf_Element_Object $obj + * @throws Zend_Pdf_Exception + */ + public function remove(Zend_Pdf_Element_Object $obj) + { + if (!$obj->compareFactory($this)) { + throw new Zend_Pdf_Exception('Object is not generated by this factory'); + } + + $this->_modifiedObjects[$obj->getObjNum()] = $obj; + $this-> _removedObjects[$obj->getObjNum()] = $obj; + } + + + /** + * Generate new Zend_Pdf_Element_Object + * + * @todo Reusage of the freed object. It's not a support of new feature, but only improvement. + * + * @param Zend_Pdf_Element $objectValue + * @return Zend_Pdf_Element_Object + */ + public function newObject(Zend_Pdf_Element $objectValue) + { + $obj = new Zend_Pdf_Element_Object($objectValue, $this->_objectCount++, 0, $this); + $this->_modifiedObjects[$obj->getObjNum()] = $obj; + return $obj; + } + + /** + * Generate new Zend_Pdf_Element_Object_Stream + * + * @todo Reusage of the freed object. It's not a support of new feature, but only improvement. + * + * @param mixed $objectValue + * @return Zend_Pdf_Element_Object_Stream + */ + public function newStreamObject($streamValue) + { + $obj = new Zend_Pdf_Element_Object_Stream($streamValue, $this->_objectCount++, 0, $this); + $this->_modifiedObjects[$obj->getObjNum()] = $obj; + return $obj; + } + + + /** + * Enumerate modified objects. + * Returns array of Zend_Pdf_UpdateInfoContainer + * + * @param Zend_Pdf_ElementFactory_Interface $rootFactory + * @return array + */ + public function listModifiedObjects($rootFactory = null) + { + if ($rootFactory == null) { + $rootFactory = $this; + $shift = 0; + } else { + $shift = $rootFactory->getEnumerationShift($this); + } + + ksort($this->_modifiedObjects); + + $result = array(); + foreach ($this->_modifiedObjects as $objNum => $obj) { + if (key_exists($objNum, $this->_removedObjects)) { + $result[$objNum+$shift] = new Zend_Pdf_UpdateInfoContainer($objNum + $shift, + $obj->getGenNum()+1, + true); + } else { + $result[$objNum+$shift] = new Zend_Pdf_UpdateInfoContainer($objNum + $shift, + $obj->getGenNum(), + false, + $obj->dump($rootFactory)); + } + } + + foreach ($this->_attachedFactories as $factory) { + $result += $factory->listModifiedObjects($rootFactory); + } + + return $result; + } + + /** + * Register object in the factory + * + * It's used to clear "parent object" referencies when factory is closed and clean up resources + * + * @param Zend_Pdf_Element_Object $obj + */ + public function registerObject($obj) + { + $this->_registeredObjects[] = $obj; + } + + /** + * Check if PDF file was modified + * + * @return boolean + */ + public function isModified() + { + if (count($this->_modifiedObjects) != 0) { + return true; + } + + foreach ($this->_attachedFactories as $subFactory) { + if ($subFactory->isModified()) { + return true; + } + } + + return false; + } +} + diff --git a/libs/Zend/Pdf/ElementFactory/Interface.php b/libs/Zend/Pdf/ElementFactory/Interface.php new file mode 100644 index 0000000..3ba6122 --- /dev/null +++ b/libs/Zend/Pdf/ElementFactory/Interface.php @@ -0,0 +1,142 @@ +_factory = $factory; + } + + public function __destruct() + { + $this->_factory->close(); + $this->_factory = null; + } + + /** + * Close factory and clean-up resources + * + * @internal + */ + public function close() + { + // Do nothing + } + + /** + * Get source factory object + * + * @return Zend_Pdf_ElementFactory + */ + public function resolve() + { + return $this->_factory->resolve(); + } + + /** + * Get factory ID + * + * @return integer + */ + public function getId() + { + return $this->_factory->getId(); + } + + /** + * Set object counter + * + * @param integer $objCount + */ + public function setObjectCount($objCount) + { + $this->_factory->setObjectCount($objCount); + } + + /** + * Get object counter + * + * @return integer + */ + public function getObjectCount() + { + return $this->_factory->getObjectCount(); + } + + /** + * Attach factory to the current; + * + * @param Zend_Pdf_ElementFactory_Interface $factory + */ + public function attach(Zend_Pdf_ElementFactory_Interface $factory) + { + $this->_factory->attach($factory); + } + + /** + * Calculate object enumeration shift. + * + * @internal + * @param Zend_Pdf_ElementFactory_Interface $factory + * @return integer + */ + public function calculateShift(Zend_Pdf_ElementFactory_Interface $factory) + { + return $this->_factory->calculateShift($factory); + } + + /** + * Retrive object enumeration shift. + * + * @param Zend_Pdf_ElementFactory_Interface $factory + * @return integer + * @throws Zend_Pdf_Exception + */ + public function getEnumerationShift(Zend_Pdf_ElementFactory_Interface $factory) + { + return $this->_factory->getEnumerationShift($factory); + } + + /** + * Mark object as modified in context of current factory. + * + * @param Zend_Pdf_Element_Object $obj + * @throws Zend_Pdf_Exception + */ + public function markAsModified(Zend_Pdf_Element_Object $obj) + { + $this->_factory->markAsModified($obj); + } + + /** + * Remove object in context of current factory. + * + * @param Zend_Pdf_Element_Object $obj + * @throws Zend_Pdf_Exception + */ + public function remove(Zend_Pdf_Element_Object $obj) + { + $this->_factory->remove($obj); + } + + /** + * Generate new Zend_Pdf_Element_Object + * + * @todo Reusage of the freed object. It's not a support of new feature, but only improvement. + * + * @param Zend_Pdf_Element $objectValue + * @return Zend_Pdf_Element_Object + */ + public function newObject(Zend_Pdf_Element $objectValue) + { + return $this->_factory->newObject($objectValue); + } + + /** + * Generate new Zend_Pdf_Element_Object_Stream + * + * @todo Reusage of the freed object. It's not a support of new feature, but only improvement. + * + * @param mixed $objectValue + * @return Zend_Pdf_Element_Object_Stream + */ + public function newStreamObject($streamValue) + { + return $this->_factory->newStreamObject($streamValue); + } + + /** + * Enumerate modified objects. + * Returns array of Zend_Pdf_UpdateInfoContainer + * + * @param Zend_Pdf_ElementFactory $rootFactory + * @return array + */ + public function listModifiedObjects($rootFactory = null) + { + return $this->_factory->listModifiedObjects($rootFactory); + } + + /** + * Check if PDF file was modified + * + * @return boolean + */ + public function isModified() + { + return $this->_factory->isModified(); + } +} + diff --git a/libs/Zend/Pdf/Exception.php b/libs/Zend/Pdf/Exception.php new file mode 100644 index 0000000..c422e16 --- /dev/null +++ b/libs/Zend/Pdf/Exception.php @@ -0,0 +1,341 @@ +_isScreened to true if successful. + * + * @throws Zend_Pdf_Exception + */ + abstract public function screen(); + + /** + * Reads and parses the complete binary file. + * + * Must set $this->_isParsed to true if successful. + * + * @throws Zend_Pdf_Exception + */ + abstract public function parse(); + + + /* Object Lifecycle */ + + /** + * Object constructor. + * + * Verifies that the data source has been properly initialized. + * + * @param Zend_Pdf_FileParserDataSource $dataSource + * @throws Zend_Pdf_Exception + */ + public function __construct(Zend_Pdf_FileParserDataSource $dataSource) + { + if ($dataSource->getSize() == 0) { + throw new Zend_Pdf_Exception('The data source has not been properly initialized', + Zend_Pdf_Exception::BAD_DATA_SOURCE); + } + $this->_dataSource = $dataSource; + } + + /** + * Object destructor. + * + * Discards the data source object. + */ + public function __destruct() + { + $this->_dataSource = null; + } + + + /* Accessors */ + + /** + * Returns true if the file has passed a cursory validation check. + * + * @return boolean + */ + public function isScreened() + { + return $this->_isScreened; + } + + /** + * Returns true if the file has been successfully parsed. + * + * @return boolean + */ + public function isParsed() + { + return $this->_isParsed; + } + + /** + * Returns the data source object representing the file being parsed. + * + * @return Zend_Pdf_FileParserDataSource + */ + public function getDataSource() + { + return $this->_dataSource; + } + + + /* Primitive Methods */ + + /** + * Convenience wrapper for the data source object's moveToOffset() method. + * + * @param integer $offset Destination byte offset. + * @throws Zend_Pdf_Exception + */ + public function moveToOffset($offset) + { + $this->_dataSource->moveToOffset($offset); + } + + public function getOffset() { + return $this->_dataSource->getOffset(); + } + + public function getSize() { + return $this->_dataSource->getSize(); + } + + /** + * Convenience wrapper for the data source object's readBytes() method. + * + * @param integer $byteCount Number of bytes to read. + * @return string + * @throws Zend_Pdf_Exception + */ + public function readBytes($byteCount) + { + return $this->_dataSource->readBytes($byteCount); + } + + /** + * Convenience wrapper for the data source object's skipBytes() method. + * + * @param integer $byteCount Number of bytes to skip. + * @throws Zend_Pdf_Exception + */ + public function skipBytes($byteCount) + { + $this->_dataSource->skipBytes($byteCount); + } + + + /* Parser Methods */ + + /** + * Reads the signed integer value from the binary file at the current byte + * offset. + * + * Advances the offset by the number of bytes read. Throws an exception if + * an error occurs. + * + * @param integer $size Size of integer in bytes: 1-4 + * @param integer $byteOrder (optional) Big- or little-endian byte order. + * Use the BYTE_ORDER_ constants defined in {@link Zend_Pdf_FileParser}. + * If omitted, uses big-endian. + * @return integer + * @throws Zend_Pdf_Exception + */ + public function readInt($size, $byteOrder = Zend_Pdf_FileParser::BYTE_ORDER_BIG_ENDIAN) + { + if (($size < 1) || ($size > 4)) { + throw new Zend_Pdf_Exception("Invalid signed integer size: $size", + Zend_Pdf_Exception::INVALID_INTEGER_SIZE); + } + $bytes = $this->_dataSource->readBytes($size); + /* unpack() will not work for this method because it always works in + * the host byte order for signed integers. It also does not allow for + * variable integer sizes. + */ + if ($byteOrder == Zend_Pdf_FileParser::BYTE_ORDER_BIG_ENDIAN) { + $number = ord($bytes[0]); + if (($number & 0x80) == 0x80) { + /* This number is negative. Extract the positive equivalent. + */ + $number = (~ $number) & 0xff; + for ($i = 1; $i < $size; $i++) { + $number = ($number << 8) | ((~ ord($bytes[$i])) & 0xff); + } + /* Now turn this back into a negative number by taking the + * two's complement (we didn't add one above so won't + * subtract it below). This works reliably on both 32- and + * 64-bit systems. + */ + $number = ~$number; + } else { + for ($i = 1; $i < $size; $i++) { + $number = ($number << 8) | ord($bytes[$i]); + } + } + } else if ($byteOrder == Zend_Pdf_FileParser::BYTE_ORDER_LITTLE_ENDIAN) { + $number = ord($bytes[$size - 1]); + if (($number & 0x80) == 0x80) { + /* Negative number. See discussion above. + */ + $number = 0; + for ($i = --$size; $i >= 0; $i--) { + $number |= ((~ ord($bytes[$i])) & 0xff) << ($i * 8); + } + $number = ~$number; + } else { + $number = 0; + for ($i = --$size; $i >= 0; $i--) { + $number |= ord($bytes[$i]) << ($i * 8); + } + } + } else { + throw new Zend_Pdf_Exception("Invalid byte order: $byteOrder", + Zend_Pdf_Exception::INVALID_BYTE_ORDER); + } + return $number; + } + + /** + * Reads the unsigned integer value from the binary file at the current byte + * offset. + * + * Advances the offset by the number of bytes read. Throws an exception if + * an error occurs. + * + * NOTE: If you ask for a 4-byte unsigned integer on a 32-bit machine, the + * resulting value WILL BE SIGNED because PHP uses signed integers internally + * for everything. To guarantee portability, be sure to use bitwise operators + * operators on large unsigned integers! + * + * @param integer $size Size of integer in bytes: 1-4 + * @param integer $byteOrder (optional) Big- or little-endian byte order. + * Use the BYTE_ORDER_ constants defined in {@link Zend_Pdf_FileParser}. + * If omitted, uses big-endian. + * @return integer + * @throws Zend_Pdf_Exception + */ + public function readUInt($size, $byteOrder = Zend_Pdf_FileParser::BYTE_ORDER_BIG_ENDIAN) + { + if (($size < 1) || ($size > 4)) { + throw new Zend_Pdf_Exception("Invalid unsigned integer size: $size", + Zend_Pdf_Exception::INVALID_INTEGER_SIZE); + } + $bytes = $this->_dataSource->readBytes($size); + /* unpack() is a bit heavyweight for this simple conversion. Just + * work the bytes directly. + */ + if ($byteOrder == Zend_Pdf_FileParser::BYTE_ORDER_BIG_ENDIAN) { + $number = ord($bytes[0]); + for ($i = 1; $i < $size; $i++) { + $number = ($number << 8) | ord($bytes[$i]); + } + } else if ($byteOrder == Zend_Pdf_FileParser::BYTE_ORDER_LITTLE_ENDIAN) { + $number = 0; + for ($i = --$size; $i >= 0; $i--) { + $number |= ord($bytes[$i]) << ($i * 8); + } + } else { + throw new Zend_Pdf_Exception("Invalid byte order: $byteOrder", + Zend_Pdf_Exception::INVALID_BYTE_ORDER); + } + return $number; + } + + /** + * Returns true if the specified bit is set in the integer bitfield. + * + * @param integer $bit Bit number to test (i.e. - 0-31) + * @param integer $bitField + * @return boolean + */ + public function isBitSet($bit, $bitField) + { + $bitMask = 1 << $bit; + $isSet = (($bitField & $bitMask) == $bitMask); + return $isSet; + } + + /** + * Reads the signed fixed-point number from the binary file at the current + * byte offset. + * + * Common fixed-point sizes are 2.14 and 16.16. + * + * Advances the offset by the number of bytes read. Throws an exception if + * an error occurs. + * + * @param integer $mantissaBits Number of bits in the mantissa + * @param integer $fractionBits Number of bits in the fraction + * @param integer $byteOrder (optional) Big- or little-endian byte order. + * Use the BYTE_ORDER_ constants defined in {@link Zend_Pdf_FileParser}. + * If omitted, uses big-endian. + * @return float + * @throws Zend_Pdf_Exception + */ + public function readFixed($mantissaBits, $fractionBits, + $byteOrder = Zend_Pdf_FileParser::BYTE_ORDER_BIG_ENDIAN) + { + $bitsToRead = $mantissaBits + $fractionBits; + if (($bitsToRead % 8) !== 0) { + throw new Zend_Pdf_Exception('Fixed-point numbers are whole bytes', + Zend_Pdf_Exception::BAD_FIXED_POINT_SIZE); + } + $number = $this->readInt(($bitsToRead >> 3), $byteOrder) / (1 << $fractionBits); + return $number; + } + + /** + * Reads the Unicode UTF-16-encoded string from the binary file at the + * current byte offset. + * + * The byte order of the UTF-16 string must be specified. You must also + * supply the desired resulting character set. + * + * Advances the offset by the number of bytes read. Throws an exception if + * an error occurs. + * + * @todo Consider changing $byteCount to a character count. They are not + * always equivalent (in the case of surrogates). + * @todo Make $byteOrder optional if there is a byte-order mark (BOM) in the + * string being extracted. + * + * @param integer $byteCount Number of bytes (characters * 2) to return. + * @param integer $byteOrder (optional) Big- or little-endian byte order. + * Use the BYTE_ORDER_ constants defined in {@link Zend_Pdf_FileParser}. + * If omitted, uses big-endian. + * @param string $characterSet (optional) Desired resulting character set. + * You may use any character set supported by {@link iconv()}. If omitted, + * uses 'current locale'. + * @return string + * @throws Zend_Pdf_Exception + */ + public function readStringUTF16($byteCount, + $byteOrder = Zend_Pdf_FileParser::BYTE_ORDER_BIG_ENDIAN, + $characterSet = '') + { + if ($byteCount == 0) { + return ''; + } + $bytes = $this->_dataSource->readBytes($byteCount); + if ($byteOrder == Zend_Pdf_FileParser::BYTE_ORDER_BIG_ENDIAN) { + if ($characterSet == 'UTF-16BE') { + return $bytes; + } + return iconv('UTF-16BE', $characterSet, $bytes); + } else if ($byteOrder == Zend_Pdf_FileParser::BYTE_ORDER_LITTLE_ENDIAN) { + if ($characterSet == 'UTF-16LE') { + return $bytes; + } + return iconv('UTF-16LE', $characterSet, $bytes); + } else { + throw new Zend_Pdf_Exception("Invalid byte order: $byteOrder", + Zend_Pdf_Exception::INVALID_BYTE_ORDER); + } + } + + /** + * Reads the Mac Roman-encoded string from the binary file at the current + * byte offset. + * + * You must supply the desired resulting character set. + * + * Advances the offset by the number of bytes read. Throws an exception if + * an error occurs. + * + * @param integer $byteCount Number of bytes (characters) to return. + * @param string $characterSet (optional) Desired resulting character set. + * You may use any character set supported by {@link iconv()}. If omitted, + * uses 'current locale'. + * @return string + * @throws Zend_Pdf_Exception + */ + public function readStringMacRoman($byteCount, $characterSet = '') + { + if ($byteCount == 0) { + return ''; + } + $bytes = $this->_dataSource->readBytes($byteCount); + if ($characterSet == 'MacRoman') { + return $bytes; + } + return iconv('MacRoman', $characterSet, $bytes); + } + + /** + * Reads the Pascal string from the binary file at the current byte offset. + * + * The length of the Pascal string is determined by reading the length bytes + * which preceed the character data. You must supply the desired resulting + * character set. + * + * Advances the offset by the number of bytes read. Throws an exception if + * an error occurs. + * + * @param string $characterSet (optional) Desired resulting character set. + * You may use any character set supported by {@link iconv()}. If omitted, + * uses 'current locale'. + * @param integer $lengthBytes (optional) Number of bytes that make up the + * length. Default is 1. + * @return string + * @throws Zend_Pdf_Exception + */ + public function readStringPascal($characterSet = '', $lengthBytes = 1) + { + $byteCount = $this->readUInt($lengthBytes); + if ($byteCount == 0) { + return ''; + } + $bytes = $this->_dataSource->readBytes($byteCount); + if ($characterSet == 'ASCII') { + return $bytes; + } + return iconv('ASCII', $characterSet, $bytes); + } + +} diff --git a/libs/Zend/Pdf/FileParser/Font.php b/libs/Zend/Pdf/FileParser/Font.php new file mode 100644 index 0000000..7e58042 --- /dev/null +++ b/libs/Zend/Pdf/FileParser/Font.php @@ -0,0 +1,209 @@ +fontType = Zend_Pdf_Font::TYPE_UNKNOWN; + } + + + /* Accessors */ + + /** + * Get handler + * + * @param string $property + * @return mixed + */ + public function __get($property) + { + if (isset($this->_fontProperties[$property])) { + return $this->_fontProperties[$property]; + } else { + return null; + } + } + + /* NOTE: The set handler is defined below in the internal methods group. */ + + + /* Parser Methods */ + + /** + * Reads the Unicode UTF-16-encoded string from the binary file at the + * current offset location. Overridden to fix return character set at UTF-16BE. + * + * @todo Deal with to-dos in the parent method. + * + * @param integer $byteCount Number of bytes (characters * 2) to return. + * @param integer $byteOrder (optional) Big- or little-endian byte order. + * Use the BYTE_ORDER_ constants defined in {@link Zend_Pdf_FileParser}. If + * omitted, uses big-endian. + * @param string $characterSet (optional) --Ignored-- + * @return string + * @throws Zend_Pdf_Exception + */ + public function readStringUTF16($byteCount, + $byteOrder = Zend_Pdf_FileParser::BYTE_ORDER_BIG_ENDIAN, + $characterSet = '') + { + return parent::readStringUTF16($byteCount, $byteOrder, 'UTF-16BE'); + } + + /** + * Reads the Mac Roman-encoded string from the binary file at the current + * offset location. Overridden to fix return character set at UTF-16BE. + * + * @param integer $byteCount Number of bytes (characters) to return. + * @param string $characterSet (optional) --Ignored-- + * @return string + * @throws Zend_Pdf_Exception + */ + public function readStringMacRoman($byteCount, $characterSet = '') + { + return parent::readStringMacRoman($byteCount, 'UTF-16BE'); + } + + /** + * Reads the Pascal string from the binary file at the current offset + * location. Overridden to fix return character set at UTF-16BE. + * + * @param string $characterSet (optional) --Ignored-- + * @param integer $lengthBytes (optional) Number of bytes that make up the + * length. Default is 1. + * @return string + * @throws Zend_Pdf_Exception + */ + public function readStringPascal($characterSet = '', $lengthBytes = 1) + { + return parent::readStringPascal('UTF-16BE'); + } + + + /* Utility Methods */ + + /** + * Writes the entire font properties array to STDOUT. Used only for debugging. + */ + public function writeDebug() + { + print_r($this->_fontProperties); + } + + + + /**** Internal Methods ****/ + + + /* Internal Accessors */ + + /** + * Set handler + * + * NOTE: This method is protected. Other classes may freely interrogate + * the font properties, but only this and its subclasses may set them. + * + * @param string $property + * @param mixed $value + */ + public function __set($property, $value) + { + if (is_null($value)) { + unset($this->_fontProperties[$property]); + } else { + $this->_fontProperties[$property] = $value; + } + } + + + /* Internal Utility Methods */ + + /** + * If debug logging is enabled, writes the log message. + * + * The log message is a sprintf() style string and any number of arguments + * may accompany it as additional parameters. + * + * @param string $message + * @param mixed (optional, multiple) Additional arguments + */ + protected function _debugLog($message) + { + if (! $this->_debug) { + return; + } + if (func_num_args() > 1) { + $args = func_get_args(); + $message = array_shift($args); + $message = vsprintf($message, $args); + } + Zend_Log::log($message, Zend_Log::LEVEL_DEBUG, 'ZF'); + } + +} diff --git a/libs/Zend/Pdf/FileParser/Font/OpenType.php b/libs/Zend/Pdf/FileParser/Font/OpenType.php new file mode 100644 index 0000000..9e4b1b4 --- /dev/null +++ b/libs/Zend/Pdf/FileParser/Font/OpenType.php @@ -0,0 +1,1109 @@ + + *
  • {@link http://developer.apple.com/textfonts/TTRefMan/} + *
  • {@link http://www.microsoft.com/typography/OTSPEC/} + *
  • {@link http://partners.adobe.com/public/developer/opentype/index_spec.html} + * + * + * @package Zend_Pdf + * @subpackage FileParser + * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ +abstract class Zend_Pdf_FileParser_Font_OpenType extends Zend_Pdf_FileParser_Font +{ + /**** Instance Variables ****/ + + + /** + * Stores the scaler type (font type) for the font file. See + * {@link _readScalerType()}. + * @var integer + */ + protected $_scalerType = 0; + + /** + * Stores the byte offsets to the various information tables. + * @var array + */ + protected $_tableDirectory = array(); + + + + /**** Public Interface ****/ + + + /* Semi-Concrete Class Implementation */ + + /** + * Verifies that the font file is in the expected format. + * + * NOTE: This method should be overridden in subclasses to check the + * specific format and set $this->_isScreened! + * + * @throws Zend_Pdf_Exception + */ + public function screen() + { + if ($this->_isScreened) { + return; + } + $this->_readScalerType(); + } + + /** + * Reads and parses the font data from the file on disk. + * + * NOTE: This method should be overridden in subclasses to add type- + * specific parsing and set $this->isParsed. + * + * @throws Zend_Pdf_Exception + */ + public function parse() + { + if ($this->_isParsed) { + return; + } + + /* Screen the font file first, if it hasn't been done yet. + */ + $this->screen(); + + /* Start by reading the table directory. + */ + $this->_parseTableDirectory(); + + /* Then parse all of the required tables. + */ + $this->_parseHeadTable(); + $this->_parseNameTable(); + $this->_parsePostTable(); + $this->_parseHheaTable(); + $this->_parseMaxpTable(); + $this->_parseOs2Table(); + $this->_parseHmtxTable(); + $this->_parseCmapTable(); + + /* If present, parse the optional tables. + */ + /** + * @todo Add parser for kerning pairs. + * @todo Add parser for ligatures. + * @todo Add parser for other useful hinting tables. + */ + } + + + + /**** Internal Methods ****/ + + + /* Parser Methods */ + + /** + * Parses the OpenType table directory. + * + * The table directory contains the identifier, checksum, byte offset, and + * length of each of the information tables housed in the font file. + * + * @throws Zend_Pdf_Exception + */ + protected function _parseTableDirectory() + { + $this->moveToOffset(4); + + $tableCount = $this->readUInt(2); + $this->_debugLog('%d tables', $tableCount); + + /* Sanity check, in case we're not actually reading a OpenType file and + * the first four bytes coincidentally matched an OpenType signature in + * screen() above. + * + * There are at minimum 7 required tables: cmap, head, hhea, hmtx, maxp, + * name, and post. In the current OpenType standard, only 32 table types + * are defined, so use 50 as a practical limit. + */ + if (($tableCount < 7) || ($tableCount > 50)) { + throw new Zend_Pdf_Exception('Table count not within expected range', + Zend_Pdf_Exception::BAD_TABLE_COUNT); + } + + /* Skip the next 6 bytes, which contain values to aid a binary search. + */ + $this->skipBytes(6); + + /* The directory contains four values: the name of the table, checksum, + * offset to the table from the beginning of the font, and actual data + * length of the table. + */ + for ($tableIndex = 0; $tableIndex < $tableCount; $tableIndex++) { + $tableName = $this->readBytes(4); + + /* We ignore the checksum here for two reasons: First, the PDF viewer + * will do this later anyway; Second, calculating the checksum would + * require unsigned integers, which PHP does not currently provide. + * We may revisit this in the future. + */ + $this->skipBytes(4); + + $tableOffset = $this->readUInt(4); + $tableLength = $this->readUInt(4); + $this->_debugLog('%s offset: 0x%x; length: %d', $tableName, $tableOffset, $tableLength); + + /* Sanity checks for offset and length values. + */ + $fileSize = $this->_dataSource->getSize(); + if (($tableOffset < 0) || ($tableOffset > $fileSize)) { + 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)) { + throw new Zend_Pdf_Exception("Table length ($tableLength) not within expected range", + Zend_Pdf_Exception::INDEX_OUT_OF_RANGE); + } + + $this->_tableDirectory[$tableName]['offset'] = $tableOffset; + $this->_tableDirectory[$tableName]['length'] = $tableLength; + } + } + + + /** + * Parses the OpenType head (Font Header) table. + * + * The head table contains global information about the font such as the + * revision number and global metrics. + * + * @throws Zend_Pdf_Exception + */ + protected function _parseHeadTable() + { + $this->_jumpToTable('head'); + + /* We can read any version 1 table. + */ + $tableVersion = $this->_readTableVersion(1, 1); + + /* Skip the font revision number and checksum adjustment. + */ + $this->skipBytes(8); + + $magicNumber = $this->readUInt(4); + if ($magicNumber != 0x5f0f3cf5) { + throw new Zend_Pdf_Exception('Wrong magic number. Expected: 0x5f0f3cf5; actual: ' + . sprintf('%x', $magicNumber), + Zend_Pdf_Exception::BAD_MAGIC_NUMBER); + } + + /* Most of the flags we ignore, but there are a few values that are + * useful for our layout routines. + */ + $flags = $this->readUInt(2); + $this->baselineAtZero = $this->isBitSet(0, $flags); + $this->useIntegerScaling = $this->isBitSet(3, $flags); + + $this->unitsPerEm = $this->readUInt(2); + $this->_debugLog('Units per em: %d', $this->unitsPerEm); + + /* Skip creation and modification date/time. + */ + $this->skipBytes(16); + + $this->xMin = $this->readInt(2); + $this->yMin = $this->readInt(2); + $this->xMax = $this->readInt(2); + $this->yMax = $this->readInt(2); + $this->_debugLog('Font bounding box: %d %d %d %d', + $this->xMin, $this->yMin, $this->xMax, $this->yMax); + + /* The style bits here must match the fsSelection bits in the OS/2 + * table, if present. + */ + $macStyleBits = $this->readUInt(2); + $this->isBold = $this->isBitSet(0, $macStyleBits); + $this->isItalic = $this->isBitSet(1, $macStyleBits); + + /* We don't need the remainder of data in this table: smallest readable + * size, font direction hint, indexToLocFormat, and glyphDataFormat. + */ + } + + + /** + * Parses the OpenType name (Naming) table. + * + * The name table contains all of the identifying strings associated with + * the font such as its name, copyright, trademark, license, etc. + * + * @throws Zend_Pdf_Exception + */ + protected function _parseNameTable() + { + $this->_jumpToTable('name'); + $baseOffset = $this->_tableDirectory['name']['offset']; + + /* The name table begins with a short header, followed by each of the + * fixed-length name records, followed by the variable-length strings. + */ + + /* We only understand version 0 tables. + */ + $tableFormat = $this->readUInt(2); + if ($tableFormat != 0) { + throw new Zend_Pdf_Exception("Unable to read format $tableFormat table", + Zend_Pdf_Exception::DONT_UNDERSTAND_TABLE_VERSION); + } + $this->_debugLog('Format %d table', $tableFormat); + + $nameCount = $this->readUInt(2); + $this->_debugLog('%d name strings', $nameCount); + + $storageOffset = $this->readUInt(2) + $baseOffset; + $this->_debugLog('Storage offset: 0x%x', $storageOffset); + + /* Scan the name records for those we're interested in. We'll skip over + * encodings and languages we don't understand or support. Prefer the + * Microsoft Unicode encoding for a given name/language combination, but + * use Mac Roman if nothing else is available. We will extract the + * actual strings later. + */ + $nameRecords = array(); + for ($nameIndex = 0; $nameIndex < $nameCount; $nameIndex++) { + + $platformID = $this->readUInt(2); + $encodingID = $this->readUInt(2); + + if (! ( (($platformID == 3) && ($encodingID == 1)) || // Microsoft Unicode + (($platformID == 1) && ($encodingID == 0)) // Mac Roman + ) ) { + $this->skipBytes(8); // Not a supported encoding. Move on. + continue; + } + + $languageID = $this->readUInt(2); + $nameID = $this->readUInt(2); + $nameLength = $this->readUInt(2); + $nameOffset = $this->readUInt(2); + + $languageCode = $this->_languageCodeForPlatform($platformID, $languageID); + if (is_null($languageCode)) { + $this->_debugLog('Skipping languageID: 0x%x; platformID %d', $languageID, $platformID); + continue; // Not a supported language. Move on. + } + + $this->_debugLog('Adding nameID: %d; languageID: 0x%x; platformID: %d; offset: 0x%x (0x%x); length: %d', + $nameID, $languageID, $platformID, $baseOffset + $nameOffset, $nameOffset, $nameLength); + + /* Entries in the name table are sorted by platform ID. If an entry + * exists for both Mac Roman and Microsoft Unicode, the Unicode entry + * will prevail since it is processed last. + */ + $nameRecords[$nameID][$languageCode] = array('platform' => $platformID, + 'offset' => $nameOffset, + 'length' => $nameLength ); + } + + /* Now go back and extract the interesting strings. + */ + $fontNames = array(); + foreach ($nameRecords as $name => $languages) { + foreach ($languages as $language => $attributes) { + $stringOffset = $storageOffset + $attributes['offset']; + $this->moveToOffset($stringOffset); + if ($attributes['platform'] == 3) { + $string = $this->readStringUTF16($attributes['length']); + } else { + $string = $this->readStringMacRoman($attributes['length']); + } + $fontNames[$name][$language] = $string; + } + } + + $this->names = $fontNames; + } + + + /** + * Parses the OpenType post (PostScript Information) table. + * + * The post table contains additional information required for using the font + * on PostScript printers. It also contains the preferred location and + * thickness for an underline, which is used by our layout code. + * + * @throws Zend_Pdf_Exception + */ + protected function _parsePostTable() + { + $this->_jumpToTable('post'); + + /* We can read versions 1-4 tables. + */ + $tableVersion = $this->_readTableVersion(1, 4); + + $this->italicAngle = $this->readFixed(16, 16); + + $this->underlinePosition = $this->readInt(2); + $this->underlineThickness = $this->readInt(2); + + $fixedPitch = $this->readUInt(4); + $this->isMonospaced = ($fixedPitch !== 0); + + /* Skip over PostScript virtual memory usage. + */ + $this->skipBytes(16); + + /* The format of the remainder of this table is dependent on the table + * version. However, since it contains glyph ordering information and + * PostScript names which we don't use, move on. (This may change at + * some point in the future though...) + */ + } + + + /** + * Parses the OpenType hhea (Horizontal Header) table. + * + * The hhea table contains information used for horizontal layout. It also + * contains some vertical layout information for Apple systems. The vertical + * layout information for the PDF file is usually taken from the OS/2 table. + * + * @throws Zend_Pdf_Exception + */ + protected function _parseHheaTable() + { + $this->_jumpToTable('hhea'); + + /* We can read any version 1 table. + */ + $tableVersion = $this->_readTableVersion(1, 1); + + /* The typographic ascent, descent, and line gap values are Apple- + * specific. Similar values exist in the OS/2 table. We'll use these + * values unless better values are found in OS/2. + */ + $this->ascent = $this->readInt(2); + $this->descent = $this->readInt(2); + $this->lineGap = $this->readInt(2); + + /* The descent value is supposed to be negative--it's the distance + * relative to the baseline. However, some fonts improperly store a + * positive value in this field. If a positive value is found, flip the + * sign and record a warning in the debug log that we did this. + */ + if ($this->descent > 0) { + $this->_debugLog('Warning: Font should specify negative descent. Actual: %d; Using %d', + $this->descent, -$this->descent); + $this->descent = -$this->descent; + } + + /* Skip over advance width, left and right sidebearing, max x extent, + * caret slope rise, run, and offset, and the four reserved fields. + */ + $this->skipBytes(22); + + /* These values are needed to read the hmtx table. + */ + $this->metricDataFormat = $this->readInt(2); + $this->numberHMetrics = $this->readUInt(2); + $this->_debugLog('hmtx data format: %d; number of metrics: %d', + $this->metricDataFormat, $this->numberHMetrics); + } + + + /** + * Parses the OpenType hhea (Horizontal Header) table. + * + * The hhea table contains information used for horizontal layout. It also + * contains some vertical layout information for Apple systems. The vertical + * layout information for the PDF file is usually taken from the OS/2 table. + * + * @throws Zend_Pdf_Exception + */ + protected function _parseMaxpTable() + { + $this->_jumpToTable('maxp'); + + /* We don't care about table version. + */ + $this->_readTableVersion(0, 1); + + /* The number of glyphs in the font. + */ + $this->numGlyphs = $this->readUInt(2); + $this->_debugLog('number of glyphs: %d', $this->numGlyphs); + + // Skip other maxp table entries (if presented with table version 1.0)... + } + + + /** + * Parses the OpenType OS/2 (OS/2 and Windows Metrics) table. + * + * The OS/2 table contains additional metrics data that is required to use + * the font on the OS/2 or Microsoft Windows platforms. It is not required + * for Macintosh fonts, so may not always be present. When available, we use + * this table to determine most of the vertical layout and stylistic + * information and for the font. + * + * @throws Zend_Pdf_Exception + */ + protected function _parseOs2Table() + { + if (! $this->numberHMetrics) { + throw new Zend_Pdf_Exception("hhea table must be parsed prior to calling this method", + Zend_Pdf_Exception::PARSED_OUT_OF_ORDER); + } + + try { + $this->_jumpToTable('OS/2'); + } catch (Zend_Pdf_Exception $exception) { + /* This table is not always present. If missing, use default values. + */ + 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; + $this->fontWidth = Zend_Pdf_Font::WIDTH_NORMAL; + $this->isEmbeddable = true; + $this->isSubsettable = true; + $this->strikeThickness = $this->unitsPerEm * 0.05; + $this->strikePosition = $this->unitsPerEm * 0.225; + $this->isSerifFont = false; // the style of the font is unknown + $this->isSansSerifFont = false; + $this->isOrnamentalFont = false; + $this->isScriptFont = false; + $this->isSymbolicFont = false; + $this->isAdobeLatinSubset = false; + $this->vendorID = ''; + $this->xHeight = 0; + $this->capitalHeight = 0; + return; + } else { + /* Something else went wrong. Throw this exception higher up the chain. + */ + throw $exception; + } + } + + /* Version 0 tables are becoming rarer these days. They are only found + * in older fonts. + * + * Version 1 formally defines the Unicode character range bits and adds + * two new fields to the end of the table. + * + * Version 2 defines several additional flags to the embedding bits + * (fsType field) and five new fields to the end of the table. + * + * Versions 2 and 3 are structurally identical. There are only two + * significant differences between the two: First, in version 3, the + * average character width (xAvgCharWidth field) is calculated using all + * non-zero width glyphs in the font instead of just the Latin lower- + * case alphabetic characters; this doesn't affect us. Second, in + * version 3, the embedding bits (fsType field) have been made mutually + * exclusive; see additional discusson on this below. + * + * We can understand all four of these table versions. + */ + $tableVersion = $this->readUInt(2); + if (($tableVersion < 0) || ($tableVersion > 3)) { + throw new Zend_Pdf_Exception("Unable to read version $tableVersion table", + Zend_Pdf_Exception::DONT_UNDERSTAND_TABLE_VERSION); + } + $this->_debugLog('Version %d table', $tableVersion); + + $this->averageCharWidth = $this->readInt(2); + + /* Indicates the visual weight and aspect ratio of the characters. Used + * primarily to logically sort fonts in lists. Also used to help choose + * a more appropriate substitute font when necessary. See the WEIGHT_ + * and WIDTH_ constants defined in Zend_Pdf_Font. + */ + $this->fontWeight = $this->readUInt(2); + $this->fontWidth = $this->readUInt(2); + + /* Describes the font embedding licensing rights. We can only embed and + * subset a font when given explicit permission. + * + * NOTE: We always interpret these bits according to the rules defined + * in version 3 of this table, regardless of the actual version. This + * means we will perform our checks in order from the most-restrictive + * to the least. + */ + $embeddingFlags = $this->readUInt(2); + $this->_debugLog('Embedding flags: %d', $embeddingFlags); + if ($this->isBitSet(9, $embeddingFlags)) { + /* Only bitmaps may be embedded. We don't have the ability to strip + * outlines from fonts yet, so this means no embed. + */ + $this->isEmbeddable = false; + } else if ($this->isBitSet(1, $embeddingFlags)) { + /* Restricted license embedding. We currently don't have any way to + * enforce this, so interpret this as no embed. This may be revised + * in the future... + */ + $this->isEmbeddable = false; + } else { + /* The remainder of the bit settings grant us permission to embed + * the font. There may be additional usage rights granted or denied + * but those only affect the PDF viewer application, not our code. + */ + $this->isEmbeddable = true; + } + $this->_debugLog('Font ' . ($this->isEmbeddable ? 'may' : 'may not') . ' be embedded'); + $isSubsettable = $this->isBitSet($embeddingFlags, 8); + + /* Recommended size and offset for synthesized subscript characters. + */ + $this->subscriptXSize = $this->readInt(2); + $this->subscriptYSize = $this->readInt(2); + $this->subscriptXOffset = $this->readInt(2); + $this->subscriptYOffset = $this->readInt(2); + + /* Recommended size and offset for synthesized superscript characters. + */ + $this->superscriptXSize = $this->readInt(2); + $this->superscriptYSize = $this->readInt(2); + $this->superscriptXOffset = $this->readInt(2); + $this->superscriptYOffset = $this->readInt(2); + + /* Size and vertical offset for the strikethrough. + */ + $this->strikeThickness = $this->readInt(2); + $this->strikePosition = $this->readInt(2); + + /* Describes the class of font: serif, sans serif, script. etc. These + * values are defined here: + * http://www.microsoft.com/OpenType/OTSpec/ibmfc.htm + */ + $familyClass = ($this->readUInt(2) >> 8); // don't care about subclass + $this->_debugLog('Font family class: %d', $familyClass); + $this->isSerifFont = ((($familyClass >= 1) && ($familyClass <= 5)) || + ($familyClass == 7)); + $this->isSansSerifFont = ($familyClass == 8); + $this->isOrnamentalFont = ($familyClass == 9); + $this->isScriptFont = ($familyClass == 10); + $this->isSymbolicFont = ($familyClass == 12); + + /* Skip over the PANOSE number. The interesting values for us overlap + * with the font family class defined above. + */ + $this->skipBytes(10); + + /* The Unicode range is made up of four 4-byte unsigned long integers + * which are used as bitfields covering a 128-bit range. Each bit + * represents a Unicode code block. If the bit is set, this font at + * least partially covers the characters in that block. + */ + $unicodeRange1 = $this->readUInt(4); + $unicodeRange2 = $this->readUInt(4); + $unicodeRange3 = $this->readUInt(4); + $unicodeRange4 = $this->readUInt(4); + $this->_debugLog('Unicode ranges: 0x%x 0x%x 0x%x 0x%x', + $unicodeRange1, $unicodeRange2, $unicodeRange3, $unicodeRange4); + + /* The Unicode range is currently only used to decide if the character + * set covered by the font is a subset of the Adobe Latin set, meaning + * it only has the basic latin set. If it covers any other characters, + * even any of the extended latin characters, it is considered symbolic + * to PDF and must be described differently in the Font Descriptor. + */ + /** + * @todo Font is recognized as Adobe Latin subset font if it only contains + * Basic Latin characters (only bit 0 of Unicode range bits is set). + * Actually, other Unicode subranges like General Punctuation (bit 31) also + * fall into Adobe Latin characters. So this code has to be modified. + */ + $this->isAdobeLatinSubset = (($unicodeRange1 == 1) && ($unicodeRange2 == 0) && + ($unicodeRange3 == 0) && ($unicodeRange4 == 0)); + $this->_debugLog(($this->isAdobeLatinSubset ? 'Is' : 'Is not') . ' a subset of Adobe Latin'); + + $this->vendorID = $this->readBytes(4); + + /* Skip the font style bits. We use the values found in the 'head' table. + * Also skip the first Unicode and last Unicode character indicies. Our + * cmap implementation does not need these values. + */ + $this->skipBytes(6); + + /* Typographic ascender, descender, and line gap. These values are + * preferred to those in the 'hhea' table. + */ + $this->ascent = $this->readInt(2); + $this->descent = $this->readInt(2); + $this->lineGap = $this->readInt(2); + + /* The descent value is supposed to be negative--it's the distance + * relative to the baseline. However, some fonts improperly store a + * positive value in this field. If a positive value is found, flip the + * sign and record a warning in the debug log that we did this. + */ + if ($this->descent > 0) { + $this->_debugLog('Warning: Font should specify negative descent. Actual: %d; Using %d', + $this->descent, -$this->descent); + $this->descent = -$this->descent; + } + + /* Skip over Windows-specific ascent and descent. + */ + $this->skipBytes(4); + + /* Versions 0 and 1 tables do not contain the x or capital height + * fields. Record zero for unknown. + */ + if ($tableVersion < 2) { + $this->xHeight = 0; + $this->capitalHeight = 0; + } else { + + /* Skip over the Windows code page coverages. We are only concerned + * with Unicode coverage. + */ + $this->skipBytes(8); + + $this->xHeight = $this->readInt(2); + $this->capitalHeight = $this->readInt(2); + + /* Ignore the remaining fields in this table. They are Windows-specific. + */ + } + /** + * @todo Obtain the x and capital heights from the 'glyf' table if they + * haven't been supplied here instead of storing zero. + */ + } + + + /** + * Parses the OpenType hmtx (Horizontal Metrics) table. + * + * The hmtx table contains the horizontal metrics for every glyph contained + * within the font. These are the critical values for horizontal layout of + * text. + * + * @throws Zend_Pdf_Exception + */ + protected function _parseHmtxTable() + { + $this->_jumpToTable('hmtx'); + + if (! $this->numberHMetrics) { + throw new Zend_Pdf_Exception("hhea table must be parsed prior to calling this method", + Zend_Pdf_Exception::PARSED_OUT_OF_ORDER); + } + + /* We only understand version 0 tables. + */ + if ($this->metricDataFormat != 0) { + throw new Zend_Pdf_Exception("Unable to read format $this->metricDataFormat table.", + Zend_Pdf_Exception::DONT_UNDERSTAND_TABLE_VERSION); + } + + /* The hmtx table has no header. For each glpyh in the font, it contains + * the glyph's advance width and its left side bearing. We don't use the + * left side bearing. + */ + $glyphWidths = array(); + for ($i = 0; $i < $this->numberHMetrics; $i++) { + $glyphWidths[$i] = $this->readUInt(2); + $this->skipBytes(2); + } + /* Populate last value for the rest of array + */ + while (count($glyphWidths) < $this->numGlyphs) { + $glyphWidths[] = end($glyphWidths); + } + $this->glyphWidths = $glyphWidths; + + /* There is an optional table of left side bearings which is sometimes + * used for monospaced fonts. We don't use the left side bearing, so + * we can safely ignore it. + */ + } + + + /** + * Parses the OpenType cmap (Character to Glyph Mapping) table. + * + * The cmap table provides the maps from character codes to font glyphs. + * There are usually at least two character maps in a font: Microsoft Unicode + * and Macintosh Roman. For very complex fonts, there may also be mappings + * for the characters in the Unicode Surrogates Area, which are UCS-4 + * characters. + * + * @todo Need to rework the selection logic for picking a subtable. We should + * have an explicit list of preferences, followed by a list of those that + * are tolerable. Most specifically, since everything above this layer deals + * in Unicode, we need to be sure to only accept format 0 MacRoman tables. + * + * @throws Zend_Pdf_Exception + */ + protected function _parseCmapTable() + { + $this->_jumpToTable('cmap'); + $baseOffset = $this->_tableDirectory['cmap']['offset']; + + /* We only understand version 0 tables. + */ + $tableVersion = $this->readUInt(2); + if ($tableVersion != 0) { + throw new Zend_Pdf_Exception("Unable to read version $tableVersion table", + Zend_Pdf_Exception::DONT_UNDERSTAND_TABLE_VERSION); + } + $this->_debugLog('Version %d table', $tableVersion); + + $subtableCount = $this->readUInt(2); + $this->_debugLog('%d subtables', $subtableCount); + + /* Like the name table, there may be many different encoding subtables + * present. Ideally, we are looking for an acceptable Unicode table. + */ + $subtables = array(); + for ($subtableIndex = 0; $subtableIndex < $subtableCount; $subtableIndex++) { + + $platformID = $this->readUInt(2); + $encodingID = $this->readUInt(2); + + if (! ( (($platformID == 0) && ($encodingID == 3)) || // Unicode 2.0 or later + (($platformID == 0) && ($encodingID == 0)) || // Unicode + (($platformID == 3) && ($encodingID == 1)) || // Microsoft Unicode + (($platformID == 1) && ($encodingID == 0)) // Mac Roman + ) ) { + $this->_debugLog('Unsupported encoding: platformID: %d; encodingID: %d; skipping', + $platformID, $encodingID); + $this->skipBytes(4); + continue; + } + + $subtableOffset = $this->readUInt(4); + if ($subtableOffset < 0) { // Sanity check for 4-byte unsigned on 32-bit platform + $this->_debugLog('Offset 0x%x out of range for platformID: %d; skipping', + $subtableOffset, $platformID); + continue; + } + + $this->_debugLog('Found subtable; platformID: %d; encodingID: %d; offset: 0x%x (0x%x)', + $platformID, $encodingID, $baseOffset + $subtableOffset, $subtableOffset); + + $subtables[$platformID][$encodingID][] = $subtableOffset; + } + + /* In preferred order, find a subtable to use. + */ + $offsets = array(); + + /* Unicode 2.0 or later semantics + */ + if (isset($subtables[0][3])) { + foreach ($subtables[0][3] as $offset) { + $offsets[] = $offset; + } + } + + /* Unicode default semantics + */ + if (isset($subtables[0][0])) { + foreach ($subtables[0][0] as $offset) { + $offsets[] = $offset; + } + } + + /* Microsoft Unicode + */ + if (isset($subtables[3][1])) { + foreach ($subtables[3][1] as $offset) { + $offsets[] = $offset; + } + } + + /* Mac Roman. + */ + if (isset($subtables[1][0])) { + foreach ($subtables[1][0] as $offset) { + $offsets[] = $offset; + } + } + + $cmapType = -1; + + foreach ($offsets as $offset) { + $cmapOffset = $baseOffset + $offset; + $this->moveToOffset($cmapOffset); + $format = $this->readUInt(2); + $language = -1; + switch ($format) { + case 0x0: + $cmapLength = $this->readUInt(2); + $language = $this->readUInt(2); + if ($language != 0) { + $this->_debugLog('Type 0 cmap tables must be language-independent;' + . ' language: %d; skipping', $language); + continue; + } + break; + + case 0x4: // break intentionally omitted + case 0x6: + $cmapLength = $this->readUInt(2); + $language = $this->readUInt(2); + if ($language != 0) { + $this->_debugLog('Warning: cmap tables must be language-independent - this font' + . ' may not work properly; language: %d', $language); + } + break; + + case 0x2: // break intentionally omitted + case 0x8: // break intentionally omitted + case 0xa: // break intentionally omitted + case 0xc: + $this->_debugLog('Format: 0x%x currently unsupported; skipping', $format); + continue; + //$this->skipBytes(2); + //$cmapLength = $this->readUInt(4); + //$language = $this->readUInt(4); + //if ($language != 0) { + // $this->_debugLog('Warning: cmap tables must be language-independent - this font' + // . ' may not work properly; language: %d', $language); + //} + //break; + + default: + $this->_debugLog('Unknown subtable format: 0x%x; skipping', $format); + continue; + } + $cmapType = $format; + break; + } + if ($cmapType == -1) { + throw new Zend_Pdf_Exception('Unable to find usable cmap table', + Zend_Pdf_Exception::CANT_FIND_GOOD_CMAP); + } + + /* Now extract the subtable data and create a Zend_Pdf_FontCmap object. + */ + $this->_debugLog('Using cmap type %d; offset: 0x%x; length: %d', + $cmapType, $cmapOffset, $cmapLength); + $this->moveToOffset($cmapOffset); + $cmapData = $this->readBytes($cmapLength); + $this->cmap = Zend_Pdf_Cmap::cmapWithTypeData($cmapType, $cmapData); + } + + + /** + * Reads the scaler type from the header of the OpenType font file and + * returns it as an unsigned long integer. + * + * The scaler type defines the type of font: OpenType font files may contain + * TrueType or PostScript outlines. Throws an exception if the scaler type + * is not recognized. + * + * @return integer + * @throws Zend_Pdf_Exception + */ + protected function _readScalerType() + { + if ($this->_scalerType != 0) { + return $this->_scalerType; + } + + $this->moveToOffset(0); + + $this->_scalerType = $this->readUInt(4); + + switch ($this->_scalerType) { + case 0x00010000: // version 1.0 - Windows TrueType signature + $this->_debugLog('Windows TrueType signature'); + break; + + case 0x74727565: // 'true' - Macintosh TrueType signature + $this->_debugLog('Macintosh TrueType signature'); + break; + + case 0x4f54544f: // 'OTTO' - the CFF signature + $this->_debugLog('PostScript CFF signature'); + break; + + case 0x74797031: // 'typ1' + throw new Zend_Pdf_Exception('Unsupported font type: PostScript in sfnt wrapper', + Zend_Pdf_Exception::WRONG_FONT_TYPE); + + default: + throw new Zend_Pdf_Exception('Not an OpenType font file', + Zend_Pdf_Exception::WRONG_FONT_TYPE); + } + return $this->_scalerType; + } + + /** + * Validates a given table's existence, then sets the file pointer to the + * start of that table. + * + * @param string $tableName + * @throws Zend_Pdf_Exception + */ + protected function _jumpToTable($tableName) + { + if (empty($this->_tableDirectory[$tableName])) { // do not allow NULL or zero + throw new Zend_Pdf_Exception("Required table '$tableName' not found!", + Zend_Pdf_Exception::REQUIRED_TABLE_NOT_FOUND); + } + $this->_debugLog("Parsing $tableName table..."); + $this->moveToOffset($this->_tableDirectory[$tableName]['offset']); + } + + /** + * Reads the fixed 16.16 table version number and checks for compatibility. + * If the version is incompatible, throws an exception. If it is compatible, + * returns the version number. + * + * @param float $minVersion Minimum compatible version number. + * @param float $maxVertion Maximum compatible version number. + * @return float Table version number. + * @throws Zend_Pdf_Exception + */ + protected function _readTableVersion($minVersion, $maxVersion) + { + $tableVersion = $this->readFixed(16, 16); + if (($tableVersion < $minVersion) || ($tableVersion > $maxVersion)) { + throw new Zend_Pdf_Exception("Unable to read version $tableVersion table", + Zend_Pdf_Exception::DONT_UNDERSTAND_TABLE_VERSION); + } + $this->_debugLog('Version %.2f table', $tableVersion); + return $tableVersion; + } + + /** + * Utility method that returns ISO 639 two-letter language codes from the + * TrueType platform and language ID. Returns NULL for languages that are + * not supported. + * + * @param integer $platformID + * @param integer $encodingID + * @return string | null + */ + protected function _languageCodeForPlatform($platformID, $languageID) + { + if ($platformID == 3) { // Microsoft encoding. + /* The low-order bytes specify the language, the high-order bytes + * specify the dialect. We just care about the language. For the + * complete list, see: + * http://www.microsoft.com/globaldev/reference/lcid-all.mspx + */ + $languageID &= 0xff; + switch ($languageID) { + case 0x09: + return 'en'; + case 0x0c: + return 'fr'; + case 0x07: + return 'de'; + case 0x10: + return 'it'; + case 0x13: + return 'nl'; + case 0x1d: + return 'sv'; + case 0x0a: + return 'es'; + case 0x06: + return 'da'; + case 0x16: + return 'pt'; + case 0x14: + return 'no'; + case 0x0d: + return 'he'; + case 0x11: + return 'ja'; + case 0x01: + return 'ar'; + case 0x0b: + return 'fi'; + case 0x08: + return 'el'; + + default: + return null; + } + + } else if ($platformID == 1) { // Macintosh encoding. + switch ($languageID) { + case 0: + return 'en'; + case 1: + return 'fr'; + case 2: + return 'de'; + case 3: + return 'it'; + case 4: + return 'nl'; + case 5: + return 'sv'; + case 6: + return 'es'; + case 7: + return 'da'; + case 8: + return 'pt'; + case 9: + return 'no'; + case 10: + return 'he'; + case 11: + return 'ja'; + case 12: + return 'ar'; + case 13: + return 'fi'; + case 14: + return 'el'; + + default: + return null; + } + + } else { // Unknown encoding. + return null; + } + } + +} diff --git a/libs/Zend/Pdf/FileParser/Font/OpenType/TrueType.php b/libs/Zend/Pdf/FileParser/Font/OpenType/TrueType.php new file mode 100644 index 0000000..5e8250e --- /dev/null +++ b/libs/Zend/Pdf/FileParser/Font/OpenType/TrueType.php @@ -0,0 +1,87 @@ +_isScreened) { + return; + } + + parent::screen(); + + switch ($this->_readScalerType()) { + case 0x00010000: // version 1.0 - Windows TrueType signature + break; + + case 0x74727565: // 'true' - Macintosh TrueType signature + break; + + default: + throw new Zend_Pdf_Exception('Not a TrueType font file', + Zend_Pdf_Exception::WRONG_FONT_TYPE); + } + + $this->fontType = Zend_Pdf_Font::TYPE_TRUETYPE; + $this->_isScreened = true; + } + + /** + * Reads and parses the TrueType font data from the file on disk. + * + * @throws Zend_Pdf_Exception + */ + public function parse() + { + if ($this->_isParsed) { + return; + } + + parent::parse(); + + /* There is nothing additional to parse for TrueType fonts at this time. + */ + + $this->_isParsed = true; + } +} diff --git a/libs/Zend/Pdf/FileParser/Image.php b/libs/Zend/Pdf/FileParser/Image.php new file mode 100644 index 0000000..d4cb9fc --- /dev/null +++ b/libs/Zend/Pdf/FileParser/Image.php @@ -0,0 +1,56 @@ +imageType = Zend_Pdf_Image::TYPE_UNKNOWN; + } + +} + + diff --git a/libs/Zend/Pdf/FileParser/Image/Png.php b/libs/Zend/Pdf/FileParser/Image/Png.php new file mode 100644 index 0000000..541191f --- /dev/null +++ b/libs/Zend/Pdf/FileParser/Image/Png.php @@ -0,0 +1,324 @@ +_isParsed) { + $this->parse(); + } + return $this->_width; + } + + public function getHeight() { + if(!$this->_isParsed) { + $this->parse(); + } + return $this->_width; + } + + public function getBitDepth() { + if(!$this->_isParsed) { + $this->parse(); + } + return $this->_bits; + } + + public function getColorSpace() { + if(!$this->_isParsed) { + $this->parse(); + } + return $this->_color; + } + + public function getCompressionStrategy() { + if(!$this->_isParsed) { + $this->parse(); + } + return $this->_compression; + } + + public function getPaethFilter() { + if(!$this->_isParsed) { + $this->parse(); + } + return $this->_preFilter; + } + + public function getInterlacingMode() { + if(!$this->_isParsed) { + $this->parse(); + } + return $this->_interlacing; + } + + public function getRawImageData() { + if(!$this->_isParsed) { + $this->parse(); + } + return $this->_imageData; + } + + public function getRawPaletteData() { + if(!$this->_isParsed) { + $this->parse(); + } + return $this->_paletteData; + } + + public function getRawTransparencyData() { + if(!$this->_isParsed) { + $this->parse(); + } + return $this->_transparencyData; + } + + /* Semi-Concrete Class Implementation */ + + /** + * Verifies that the image file is in the expected format. + * + * @throws Zend_Pdf_Exception + */ + public function screen() + { + if ($this->_isScreened) { + return; + } + return $this->_checkSignature(); + } + + /** + * Reads and parses the image data from the file on disk. + * + * @throws Zend_Pdf_Exception + */ + public function parse() + { + if ($this->_isParsed) { + return; + } + + /* Screen the font file first, if it hasn't been done yet. + */ + $this->screen(); + + $this->_parseIHDRChunk(); + $this->_parseChunks(); + } + + + protected function _parseSignature() { + $this->moveToOffset(1); //Skip the first byte (%) + if('PNG' != $this->readBytes(3)) { + $this->_isPNG = false; + } else { + $this->_isPNG = true; + } + } + + protected function _checkSignature() { + if(!isset($this->_isPNG)) { + $this->_parseSignature(); + } + return $this->_isPNG; + } + + protected function _parseChunks() { + $this->moveToOffset(33); //Variable chunks start at the end of IHDR + + //Start processing chunks. If there are no more bytes to read parsing is complete. + $size = $this->getSize(); + while($size - $this->getOffset() >= 8) { + $chunkLength = $this->readUInt(4); + if($chunkLength < 0 || ($chunkLength + $this->getOffset() + 4) > $size) { + throw new Zend_Pdf_Exception("PNG Corrupt: Invalid Chunk Size In File."); + } + + $chunkType = $this->readBytes(4); + $offset = $this->getOffset(); + + //If we know how to process the chunk, do it here, else ignore the chunk and move on to the next + switch($chunkType) { + case 'IDAT': // This chunk may appear more than once. It contains the actual image data. + $this->_parseIDATChunk($offset, $chunkLength); + break; + + case 'PLTE': // This chunk contains the image palette. + $this->_parsePLTEChunk($offset, $chunkLength); + break; + + case 'tRNS': // This chunk contains non-alpha channel transparency data + $this->_parseTRNSChunk($offset, $chunkLength); + break; + + case 'IEND': + break 2; //End the loop too + + //@TODO Implement the rest of the PNG chunks. (There are many not implemented here) + } + if($offset + $chunkLength + 4 < $size) { + $this->moveToOffset($offset + $chunkLength + 4); //Skip past the data finalizer. (Don't rely on the parse to leave the offsets correct) + } + } + if(empty($this->_imageData)) { + throw new Zend_Pdf_Exception ( "This PNG is corrupt. All png must contain IDAT chunks." ); + } + } + + protected function _parseIHDRChunk() { + $this->moveToOffset(12); //IHDR must always start at offset 12 and run for 17 bytes + if(!$this->readBytes(4) == 'IHDR') { + throw new Zend_Pdf_Exception( "This PNG is corrupt. The first chunk in a PNG file must be IHDR." ); + } + $this->_width = $this->readUInt(4); + $this->_height = $this->readUInt(4); + $this->_bits = $this->readInt(1); + $this->_color = $this->readInt(1); + $this->_compression = $this->readInt(1); + $this->_preFilter = $this->readInt(1); + $this->_interlacing = $this->readInt(1); + if($this->_interlacing != Zend_Pdf_Image::PNG_INTERLACING_DISABLED) { + throw new Zend_Pdf_Exception( "Only non-interlaced images are currently supported." ); + } + } + + protected function _parseIDATChunk($chunkOffset, $chunkLength) { + $this->moveToOffset($chunkOffset); + if(!isset($this->_imageData)) { + $this->_imageData = $this->readBytes($chunkLength); + } else { + $this->_imageData .= $this->readBytes($chunkLength); + } + } + + protected function _parsePLTEChunk($chunkOffset, $chunkLength) { + $this->moveToOffset($chunkOffset); + $this->_paletteData = $this->readBytes($chunkLength); + } + + protected function _parseTRNSChunk($chunkOffset, $chunkLength) { + $this->moveToOffset($chunkOffset); + + //Processing of tRNS data varies dependending on the color depth + + switch($this->_color) { + case Zend_Pdf_Image::PNG_CHANNEL_GRAY: + $baseColor = $this->readInt(1); + $this->_transparencyData = array($baseColor, $baseColor); + break; + + case Zend_Pdf_Image::PNG_CHANNEL_RGB: + + //@TODO Fix this hack. + //This parser cheats and only uses the lsb's (and only works with < 16 bit depth images) + + /* + From the standard: + + For color type 2 (truecolor), the tRNS chunk contains a single RGB color value, stored in the format: + + Red: 2 bytes, range 0 .. (2^bitdepth)-1 + Green: 2 bytes, range 0 .. (2^bitdepth)-1 + Blue: 2 bytes, range 0 .. (2^bitdepth)-1 + + (If the image bit depth is less than 16, the least significant bits are used and the others are 0.) + Pixels of the specified color value are to be treated as transparent (equivalent to alpha value 0); + all other pixels are to be treated as fully opaque (alpha value 2bitdepth-1). + + */ + + $red = $this->readInt(1); + $this->skipBytes(1); + $green = $this->readInt(1); + $this->skipBytes(1); + $blue = $this->readInt(1); + + $this->_transparencyData = array($red, $red, $green, $green, $blue, $blue); + + break; + + case Zend_Pdf_Image::PNG_CHANNEL_INDEXED: + + //@TODO Fix this hack. + //This parser cheats too. It only masks the first color in the palette. + + /* + From the standard: + + For color type 3 (indexed color), the tRNS chunk contains a series of one-byte alpha values, corresponding to entries in the PLTE chunk: + + Alpha for palette index 0: 1 byte + Alpha for palette index 1: 1 byte + ...etc... + + Each entry indicates that pixels of the corresponding palette index must be treated as having the specified alpha value. + Alpha values have the same interpretation as in an 8-bit full alpha channel: 0 is fully transparent, 255 is fully opaque, + regardless of image bit depth. The tRNS chunk must not contain more alpha values than there are palette entries, + but tRNS can contain fewer values than there are palette entries. In this case, the alpha value for all remaining palette + entries is assumed to be 255. In the common case in which only palette index 0 need be made transparent, only a one-byte + tRNS chunk is needed. + + */ + + $tmpData = $this->readBytes($chunkLength); + if(($trnsIdx = strpos($tmpData, chr(0))) !== false) { + $this->_transparencyData = array($trnsIdx, $trnsIdx); + } + + break; + + case Zend_Pdf_Image::PNG_CHANNEL_GRAY_ALPHA: + //Fall through to the next case + case Zend_Pdf_Image::PING_CHANNEL_RGB_ALPHA: + throw new Zend_Pdf_Exception( "tRNS chunk illegal for Alpha Channel Images" ); + break; + } + } +} + + diff --git a/libs/Zend/Pdf/FileParserDataSource.php b/libs/Zend/Pdf/FileParserDataSource.php new file mode 100644 index 0000000..d3062df --- /dev/null +++ b/libs/Zend/Pdf/FileParserDataSource.php @@ -0,0 +1,205 @@ +_size to the total size in bytes of the data source. + * + * Upon return the data source can be interrogated using the primitive + * methods described here. + * + * If the data source cannot be opened for any reason (such as insufficient + * permissions, missing file, etc.), will throw an appropriate exception. + * + * @throws Zend_Pdf_Exception + */ + abstract public function __construct(); + + /** + * Object destructor. Closes the data source. + * + * May also perform cleanup tasks such as deleting temporary files. + */ + abstract public function __destruct(); + + /** + * Returns the specified number of raw bytes from the data source at the + * byte offset of the current read position. + * + * Must advance the read position by the number of bytes read by updating + * $this->_offset. + * + * Throws an exception if there is insufficient data to completely fulfill + * the request or if an error occurs. + * + * @param integer $byteCount Number of bytes to read. + * @return string + * @throws Zend_Pdf_Exception + */ + abstract public function readBytes($byteCount); + + /** + * Returns the entire contents of the data source as a string. + * + * This method may be called at any time and so must preserve the byte + * offset of the read position, both through $this->_offset and whatever + * other additional pointers (such as the seek position of a file pointer) + * that might be used. + * + * @return string + */ + abstract public function readAllBytes(); + + + /* Object Magic Methods */ + + /** + * Returns a description of the object for debugging purposes. + * + * Subclasses should override this method to provide a more specific + * description of the actual object being represented. + * + * @return string + */ + public function __toString() + { + return get_class($this); + } + + + /* Accessors */ + + /** + * Returns the byte offset of the current read position within the data + * source. + * + * @return integer + */ + public function getOffset() + { + return $this->_offset; + } + + /** + * Returns the total size in bytes of the data source. + * + * @return integer + */ + public function getSize() + { + return $this->_size; + } + + + /* Primitive Methods */ + + /** + * Moves the current read position to the specified byte offset. + * + * Throws an exception you attempt to move before the beginning or beyond + * the end of the data source. + * + * If a subclass needs to perform additional tasks (such as performing a + * fseek() on a filesystem source), it should do so after calling this + * parent method. + * + * @param integer $offset Destination byte offset. + * @throws Zend_Pdf_Exception + */ + public function moveToOffset($offset) + { + if ($this->_offset == $offset) { + return; // Not moving; do nothing. + } + if ($offset < 0) { + throw new Zend_Pdf_Exception('Attempt to move before start of data source', + Zend_Pdf_Exception::MOVE_BEFORE_START_OF_FILE); + } + if ($offset >= $this->_size) { // Offsets are zero-based. + throw new Zend_Pdf_Exception('Attempt to move beyond end of data source', + Zend_Pdf_Exception::MOVE_BEYOND_END_OF_FILE); + } + $this->_offset = $offset; + } + + /** + * Shifts the current read position within the data source by the specified + * number of bytes. + * + * You may move forward (positive numbers) or backward (negative numbers). + * Throws an exception you attempt to move before the beginning or beyond + * the end of the data source. + * + * @param integer $byteCount Number of bytes to skip. + * @throws Zend_Pdf_Exception + */ + public function skipBytes($byteCount) + { + $this->moveToOffset($this->_offset + $byteCount); + } + +} diff --git a/libs/Zend/Pdf/FileParserDataSource/File.php b/libs/Zend/Pdf/FileParserDataSource/File.php new file mode 100644 index 0000000..619bb5e --- /dev/null +++ b/libs/Zend/Pdf/FileParserDataSource/File.php @@ -0,0 +1,188 @@ +_size = @filesize($filePath)) === false) { + 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) { + throw new Zend_Pdf_Exception("Cannot open file for reading: $filePath", + Zend_Pdf_Exception::CANT_OPEN_FILE); + } + $this->_filePath = $filePath; + } + + /** + * Object destructor. + * + * Closes the file if it had been successfully opened. + */ + public function __destruct() + { + if (is_resource($this->_fileResource)) { + @fclose($this->_fileResource); + } + } + + /** + * Returns the specified number of raw bytes from the file at the byte + * offset of the current read position. + * + * Advances the read position by the number of bytes read. + * + * Throws an exception if an error was encountered while reading the file or + * if there is insufficient data to completely fulfill the request. + * + * @param integer $byteCount Number of bytes to read. + * @return string + * @throws Zend_Pdf_Exception + */ + public function readBytes($byteCount) + { + $bytes = @fread($this->_fileResource, $byteCount); + if ($bytes === false) { + throw new Zend_Pdf_Exception('Unexpected error while reading file', + Zend_Pdf_Exception::ERROR_DURING_READ); + } + if (strlen($bytes) != $byteCount) { + throw new Zend_Pdf_Exception("Insufficient data to read $byteCount bytes", + Zend_Pdf_Exception::INSUFFICIENT_DATA); + } + $this->_offset += $byteCount; + return $bytes; + } + + /** + * Returns the entire contents of the file as a string. + * + * Preserves the current file seek position. + * + * @return string + */ + public function readAllBytes() + { + return file_get_contents($this->_filePath); + } + + + /* Object Magic Methods */ + + /** + * Returns the full filesystem path of the file. + * + * @return string + */ + public function __toString() + { + return $this->_filePath; + } + + + /* Primitive Methods */ + + /** + * Seeks the file read position to the specified byte offset. + * + * Throws an exception if the file pointer cannot be moved or if it is + * moved beyond EOF (end of file). + * + * @param integer $offset Destination byte offset. + * @throws Zend_Pdf_Exception + */ + public function moveToOffset($offset) + { + if ($this->_offset == $offset) { + return; // Not moving; do nothing. + } + parent::moveToOffset($offset); + $result = @fseek($this->_fileResource, $offset, SEEK_SET); + if ($result !== 0) { + throw new Zend_Pdf_Exception('Error while setting new file position', + Zend_Pdf_Exception::CANT_SET_FILE_POSITION); + } + if (feof($this->_fileResource)) { + 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 new file mode 100644 index 0000000..1c726fa --- /dev/null +++ b/libs/Zend/Pdf/FileParserDataSource/String.php @@ -0,0 +1,126 @@ +_size = strlen($string); + $this->_string = $string; + } + + /** + * Object destructor. + */ + public function __destruct() + { + $this->_string = ''; + } + + /** + * Returns the specified number of raw bytes from the string at the byte + * offset of the current read position. + * + * Advances the read position by the number of bytes read. + * + * Throws an exception if there is insufficient data to completely fulfill + * the request. + * + * @param integer $byteCount Number of bytes to read. + * @return string + * @throws Zend_Pdf_Exception + */ + public function readBytes($byteCount) + { + if (($this->_offset + $byteCount) > $this->_size) { + throw new Zend_Pdf_Exception("Insufficient data to read $byteCount bytes", + Zend_Pdf_Exception::INSUFFICIENT_DATA); + } + $bytes = substr($this->_string, $this->_offset, $byteCount); + $this->_offset += $byteCount; + return $bytes; + } + + /** + * Returns the entire string. + * + * Preserves the current read position. + * + * @return string + */ + public function readAllBytes() + { + return $this->_string; + } + + + /* Object Magic Methods */ + + /** + * Returns a string containing the parsed string's length. + * + * @return string + */ + public function __toString() + { + return "String ($this->_size bytes)"; + } + +} diff --git a/libs/Zend/Pdf/Filter/Ascii85.php b/libs/Zend/Pdf/Filter/Ascii85.php new file mode 100644 index 0000000..a75d12d --- /dev/null +++ b/libs/Zend/Pdf/Filter/Ascii85.php @@ -0,0 +1,59 @@ +'; + } + + /** + * Decode data + * + * @param string $data + * @param array $params + * @return string + * @throws Zend_Pdf_Exception + */ + public static function decode($data, $params = null) + { + $output = ''; + $oddCode = true; + $commentMode = false; + + for ($count = 0; $count < strlen($data) && $data[$count] != '>'; $count++) { + $charCode = ord($data[$count]); + + if ($commentMode) { + if ($charCode == 0x0A || $charCode == 0x0D ) { + $commentMode = false; + } + + continue; + } + + switch ($charCode) { + //Skip white space + case 0x00: // null character + // fall through to next case + case 0x09: // Tab + // fall through to next case + case 0x0A: // Line feed + // fall through to next case + case 0x0C: // Form Feed + // fall through to next case + case 0x0D: // Carriage return + // fall through to next case + case 0x20: // Space + // Do nothing + break; + + case 0x25: // '%' + // Switch to comment mode + $commentMode = true; + break; + + default: + if ($charCode >= 0x30 /*'0'*/ && $charCode <= 0x39 /*'9'*/) { + $code = $charCode - 0x30; + } else if ($charCode >= 0x41 /*'A'*/ && $charCode <= 0x46 /*'F'*/) { + $code = $charCode - 0x37/*0x41 - 0x0A*/; + } else if ($charCode >= 0x61 /*'a'*/ && $charCode <= 0x66 /*'f'*/) { + $code = $charCode - 0x57/*0x61 - 0x0A*/; + } else { + throw new Zend_Pdf_Exception('Wrong character in a encoded stream'); + } + + if ($oddCode) { + // Odd pass. Store hex digit for next pass + // Scope of $hexCodeHigh variable is whole function + $hexCodeHigh = $code; + } else { + // Even pass. + // Add decoded character to the output + // ($hexCodeHigh is stored in previous pass) + $output .= chr($hexCodeHigh*16 + $code); + } + $oddCode = !$oddCode; + + break; + } + } + + /* Check that stream is terminated by End Of Data marker */ + if ($data[$count] != '>') { + throw new Zend_Pdf_Exception('Wrong encoded stream End Of Data marker.'); + } + + /* Last '0' character is omitted */ + if (!$oddCode) { + $output .= chr($hexCodeHigh*16); + } + + return $output; + } +} diff --git a/libs/Zend/Pdf/Filter/Compression.php b/libs/Zend/Pdf/Filter/Compression.php new file mode 100644 index 0000000..07ec5c3 --- /dev/null +++ b/libs/Zend/Pdf/Filter/Compression.php @@ -0,0 +1,380 @@ +getFontName(Zend_Pdf_Font::NAME_POSTSCRIPT, '', ''); + Zend_Pdf_Font::$_fontNames[$fontName] = $font; + $filePathKey = md5($filePath); + Zend_Pdf_Font::$_fontFilePaths[$filePathKey] = $font; + return $font; + + } else { + /* The type of font could not be determined. Give up. + */ + throw new Zend_Pdf_Exception("Cannot determine font type: $filePath", + Zend_Pdf_Exception::CANT_DETERMINE_FONT_TYPE); + } + + } + + + + /**** Internal Methods ****/ + + + /* Font Extraction Methods */ + + /** + * Attempts to extract a TrueType font from the data source. + * + * If the font parser throws an exception that suggests the data source + * simply doesn't contain a TrueType font, catches it and returns null. If + * an exception is thrown that suggests the TrueType font is corrupt or + * otherwise unusable, throws that exception. If successful, returns the + * font object. + * + * @param Zend_Pdf_FileParserDataSource $dataSource + * @param integer $embeddingOptions Options for font embedding. + * @return Zend_Pdf_Resource_Font_OpenType_TrueType May also return null if + * the data source does not appear to contain a TrueType font. + * @throws Zend_Pdf_Exception + */ + protected static function _extractTrueTypeFont($dataSource, $embeddingOptions) + { + try { + $fontParser = new Zend_Pdf_FileParser_Font_OpenType_TrueType($dataSource); + + $fontParser->parse(); + if ($fontParser->isAdobeLatinSubset) { + $font = new Zend_Pdf_Resource_Font_Simple_Parsed_TrueType($fontParser, $embeddingOptions); + } else { + /* 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); + } + } catch (Zend_Pdf_Exception $exception) { + /* The following exception codes suggest that this isn't really a + * TrueType font. If we caught such an exception, simply return + * null. For all other cases, it probably is a TrueType font but has + * a problem; throw the exception again. + */ + $fontParser = null; + switch ($exception->getCode()) { + case Zend_Pdf_Exception::WRONG_FONT_TYPE: // break intentionally omitted + case Zend_Pdf_Exception::BAD_TABLE_COUNT: // break intentionally omitted + case Zend_Pdf_Exception::BAD_MAGIC_NUMBER: + return null; + + default: + throw $exception; + } + } + return $font; + } + +} diff --git a/libs/Zend/Pdf/Image.php b/libs/Zend/Pdf/Image.php new file mode 100644 index 0000000..d6ce692 --- /dev/null +++ b/libs/Zend/Pdf/Image.php @@ -0,0 +1,244 @@ +getType() == Zend_Pdf_Element::TYPE_DICTIONARY && + $param2 instanceof Zend_Pdf_ElementFactory_Interface && + $param3 === null + ) { + $this->_pageDictionary = $param1; + $this->_objFactory = $param2; + $this->_attached = true; + $this->_safeGS = false; + + return; + + } else if ($param1 instanceof Zend_Pdf_Page && $param2 === null && $param3 === null) { + // Clone existing page. + // Let already existing content and resources to be shared between pages + // We don't give existing content modification functionality, so we don't need "deep copy" + $this->_objFactory = $param1->_objFactory; + $this->_attached = &$param1->_attached; + $this->_safeGS = false; + + $this->_pageDictionary = $this->_objFactory->newObject(new Zend_Pdf_Element_Dictionary()); + + foreach ($param1->_pageDictionary->getKeys() as $key) { + if ($key == 'Contents') { + // Clone Contents property + + $this->_pageDictionary->Contents = new Zend_Pdf_Element_Array(); + + if ($param1->_pageDictionary->Contents->getType() != Zend_Pdf_Element::TYPE_ARRAY) { + // Prepare array of content streams and add existing stream + $this->_pageDictionary->Contents->items[] = $param1->_pageDictionary->Contents; + } else { + // Clone array of the content streams + foreach ($param1->_pageDictionary->Contents->items as $srcContentStream) { + $this->_pageDictionary->Contents->items[] = $srcContentStream; + } + } + } else { + $this->_pageDictionary->$key = $param1->_pageDictionary->$key; + } + } + + return; + } 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); + $this->_attached = false; + $this->_safeGS = true; /** New page created. That's users App responsibility to track GS changes */ + + switch (strtolower($param1)) { + case 'a4': + $param1 = Zend_Pdf_Page::SIZE_A4; + break; + case 'a4-landscape': + $param1 = Zend_Pdf_Page::SIZE_A4_LANDSCAPE; + break; + case 'letter': + $param1 = Zend_Pdf_Page::SIZE_LETTER; + break; + case 'letter-landscape': + $param1 = Zend_Pdf_Page::SIZE_LETTER_LANDSCAPE; + break; + default: + // should be in "x:y" form + } + + $pageDim = explode(':', $param1); + if(count($pageDim) == 3) { + $pageWidth = $pageDim[0]; + $pageHeight = $pageDim[1]; + } else { + /** + * @todo support of user defined pagesize notations, like: + * "210x297mm", "595x842", "8.5x11in", "612x792" + */ + throw new Zend_Pdf_Exception('Wrong pagesize notation.'); + } + /** + * @todo support of pagesize recalculation to "default user space units" + */ + + } 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); + $this->_attached = false; + $this->_safeGS = true; /** New page created. That's users App responsibility to track GS changes */ + $pageWidth = $param1; + $pageHeight = $param2; + + } else { + throw new Zend_Pdf_Exception('Unrecognized method signature, wrong number of arguments or wrong argument types.'); + } + + $this->_pageDictionary = $this->_objFactory->newObject(new Zend_Pdf_Element_Dictionary()); + $this->_pageDictionary->Type = new Zend_Pdf_Element_Name('Page'); + $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(); + $this->_pageDictionary->MediaBox->items[] = new Zend_Pdf_Element_Numeric(0); + $this->_pageDictionary->MediaBox->items[] = new Zend_Pdf_Element_Numeric(0); + $this->_pageDictionary->MediaBox->items[] = new Zend_Pdf_Element_Numeric($pageWidth); + $this->_pageDictionary->MediaBox->items[] = new Zend_Pdf_Element_Numeric($pageHeight); + $this->_pageDictionary->Contents = new Zend_Pdf_Element_Array(); + } + + + /** + * Clone operator + * + * @throws Zend_Pdf_Exception + */ + public function __clone() + { + throw new Zend_Pdf_Exception('Cloning Zend_Pdf_Page object using \'clone\' keyword is not supported. Use \'new Zend_Pdf_Page($srcPage)\' syntax'); + } + + /** + * Attach resource to the page + * + * @param string $type + * @param Zend_Pdf_Resource $resource + * @return string + */ + protected function _attachResource($type, Zend_Pdf_Resource $resource) + { + // Check that Resources dictionary contains appropriate resource set + if ($this->_pageDictionary->Resources->$type === null) { + $this->_pageDictionary->Resources->touch(); + $this->_pageDictionary->Resources->$type = new Zend_Pdf_Element_Dictionary(); + } else { + $this->_pageDictionary->Resources->$type->touch(); + } + + // Check, that resource is already attached to resource set. + $resObject = $resource->getResource(); + foreach ($this->_pageDictionary->Resources->$type->getKeys() as $ResID) { + if ($this->_pageDictionary->Resources->$type->$ResID === $resObject) { + return $ResID; + } + } + + $idCounter = 1; + do { + $newResName = $type[0] . $idCounter++; + } while ($this->_pageDictionary->Resources->$type->$newResName !== null); + + $this->_pageDictionary->Resources->$type->$newResName = $resObject; + $this->_objFactory->attach($resource->getFactory()); + + return $newResName; + } + + /** + * Add procedureSet to the Page description + * + * @param string $procSetName + */ + protected function _addProcSet($procSetName) + { + // Check that Resources dictionary contains ProcSet entry + if ($this->_pageDictionary->Resources->ProcSet === null) { + $this->_pageDictionary->Resources->touch(); + $this->_pageDictionary->Resources->ProcSet = new Zend_Pdf_Element_Array(); + } else { + $this->_pageDictionary->Resources->ProcSet->touch(); + } + + foreach ($this->_pageDictionary->Resources->ProcSet->items as $procSetEntry) { + if ($procSetEntry->value == $procSetName) { + // Procset is already included into a ProcSet array + return; + } + } + + $this->_pageDictionary->Resources->ProcSet->items[] = new Zend_Pdf_Element_Name($procSetName); + } + + /** + * Retrive PDF file reference to the page + * + * @return Zend_Pdf_Element_Dictionary + */ + public function getPageDictionary() + { + return $this->_pageDictionary; + } + + /** + * Dump current drawing instructions into the content stream. + * + * @todo Don't forget to close all current graphics operations (like path drawing) + * + * @throws Zend_Pdf_Exception + */ + public function flush() + { + if ($this->_saveCount != 0) { + throw new Zend_Pdf_Exception('Saved graphics state is not restored'); + } + + if ($this->_contents == '') { + return; + } + + if ($this->_pageDictionary->Contents->getType() != Zend_Pdf_Element::TYPE_ARRAY) { + /** + * It's a stream object. + * Prepare Contents page attribute for update. + */ + $this->_pageDictionary->touch(); + + $currentPageContents = $this->_pageDictionary->Contents; + $this->_pageDictionary->Contents = new Zend_Pdf_Element_Array(); + $this->_pageDictionary->Contents->items[] = $currentPageContents; + } else { + $this->_pageDictionary->Contents->touch(); + } + + if ((!$this->_safeGS) && (count($this->_pageDictionary->Contents->items) != 0)) { + /** + * Page already has some content which is not treated as safe. + * + * Add save/restore GS operators + */ + $this->_addProcSet('PDF'); + + $newContentsArray = new Zend_Pdf_Element_Array(); + $newContentsArray->items[] = $this->_objFactory->newStreamObject(" q\n"); + foreach ($this->_pageDictionary->Contents->items as $contentStream) { + $newContentsArray->items[] = $contentStream; + } + $newContentsArray->items[] = $this->_objFactory->newStreamObject(" Q\n"); + + $this->_pageDictionary->touch(); + $this->_pageDictionary->Contents = $newContentsArray; + + $this->_safeGS = true; + } + + $this->_pageDictionary->Contents->items[] = + $this->_objFactory->newStreamObject($this->_contents); + + $this->_contents = ''; + } + + /** + * Prepare page to be rendered into PDF. + * + * @todo Don't forget to close all current graphics operations (like path drawing) + * + * @param Zend_Pdf_ElementFactory_Interface $objFactory + * @throws Zend_Pdf_Exception + */ + public function render(Zend_Pdf_ElementFactory_Interface $objFactory) + { + $this->flush(); + + if ($objFactory === $this->_objFactory) { + // Page is already attached to the document. + return; + } + + if ($this->_attached) { + throw new Zend_Pdf_Exception('Page is attached to one documen, but rendered in context of another.'); + /** + * @todo Page cloning must be implemented here instead of exception. + * PDF objects (ex. fonts) can be shared between pages. + * Thus all referenced objects, which can be modified, must be cloned recursively, + * to avoid producing wrong object references in a context of source PDF. + */ + + //... + } else { + $objFactory->attach($this->_objFactory); + } + + } + + + + /** + * Set fill color. + * + * @param Zend_Pdf_Color $color + */ + public function setFillColor(Zend_Pdf_Color $color) + { + $this->_addProcSet('PDF'); + $this->_contents .= $color->instructions(false); + } + + /** + * Set line color. + * + * @param Zend_Pdf_Color $color + */ + public function setLineColor(Zend_Pdf_Color $color) + { + $this->_addProcSet('PDF'); + $this->_contents .= $color->instructions(true); + } + + /** + * Set line width. + * + * @param float $width + */ + public function setLineWidth($width) + { + $this->_addProcSet('PDF'); + $widthObj = new Zend_Pdf_Element_Numeric($width); + $this->_contents .= $widthObj->toString() . " w\n"; + } + + /** + * Set line dashing pattern + * + * Pattern is an array of floats: array(on_length, off_length, on_length, off_length, ...) + * Phase is shift from the beginning of line. + * + * @param array $pattern + * @param array $phase + */ + public function setLineDashingPattern($pattern, $phase = 0) + { + $this->_addProcSet('PDF'); + + if ($pattern === Zend_Pdf_Page::LINE_DASHING_SOLID) { + $pattern = array(); + $phase = 0; + } + + $dashPattern = new Zend_Pdf_Element_Array(); + $phaseEleemnt = new Zend_Pdf_Element_Numeric($phase); + + foreach ($pattern as $dashItem) { + $dashElement = new Zend_Pdf_Element_Numeric($dashItem); + $dashPattern->items[] = $dashElement; + } + + $this->_contents .= $dashPattern->toString() . ' ' + . $phaseEleemnt->toString() . " d\n"; + } + + /** + * Set current font. + * + * @param Zend_Pdf_Resource_Font $font + * @param float $fontSize + */ + public function setFont(Zend_Pdf_Resource_Font $font, $fontSize) + { + $this->_addProcSet('Text'); + $fontName = $this->_attachResource('Font', $font); + + $this->_font = $font; + $this->_fontSize = $fontSize; + + $fontNameObj = new Zend_Pdf_Element_Name($fontName); + $fontSizeObj = new Zend_Pdf_Element_Numeric($fontSize); + $this->_contents .= $fontNameObj->toString() . ' ' . $fontSizeObj->toString() . " Tf\n"; + } + + /** + * Set the style to use for future drawing operations on this page + * + * @param Zend_Pdf_Style $style + */ + public function setStyle(Zend_Pdf_Style $style) + { + $this->_style = $style; + + $this->_addProcSet('Text'); + $this->_addProcSet('PDF'); + if ($style->getFont() !== null) { + $this->setFont($style->getFont(), $style->getFontSize()); + } + $this->_contents .= $style->instructions($this->_pageDictionary->Resources); + } + + /** + * Set the transparancy + * + * $alpha == 0 - transparent + * $alpha == 1 - opaque + * + * Transparency modes, supported by PDF: + * Normal (default), Multiply, Screen, Overlay, Darken, Lighten, ColorDodge, ColorBurn, HardLight, + * SoftLight, Difference, Exclusion + * + * @param float $alpha + * @param string $mode + * @throws Zend_Pdf_Exception + */ + public function setAlpha($alpha, $mode = 'Normal') + { + if (!in_array($mode, array('Normal', 'Multiply', 'Screen', 'Overlay', 'Darken', 'Lighten', 'ColorDodge', + 'ColorBurn', 'HardLight', 'SoftLight', 'Difference', 'Exclusion'))) { + throw new Zend_Pdf_Exception('Unsupported transparency mode.'); + } + if (!is_numeric($alpha) || $alpha < 0 || $alpha > 1) { + throw new Zend_Pdf_Exception('Alpha value must be numeric between 0 (transparent) and 1 (opaque).'); + } + + $this->_addProcSet('Text'); + $this->_addProcSet('PDF'); + + $resources = $this->_pageDictionary->Resources; + + // Check if Resources dictionary contains ExtGState entry + if ($resources->ExtGState === null) { + $resources->touch(); + $resources->ExtGState = new Zend_Pdf_Element_Dictionary(); + } else { + $resources->ExtGState->touch(); + } + + $idCounter = 1; + do { + $gStateName = 'GS' . $idCounter++; + } while ($resources->ExtGState->$gStateName !== null); + + + $gStateDictionary = new Zend_Pdf_Element_Dictionary(); + $gStateDictionary->Type = new Zend_Pdf_Element_Name('ExtGState'); + $gStateDictionary->BM = new Zend_Pdf_Element_Name($mode); + $gStateDictionary->CA = new Zend_Pdf_Element_Numeric($alpha); + $gStateDictionary->ca = new Zend_Pdf_Element_Numeric($alpha); + + $resources->ExtGState->$gStateName = $this->_objFactory->newObject($gStateDictionary); + + $gStateNameObj = new Zend_Pdf_Element_Name($gStateName); + $this->_contents .= $gStateNameObj->toString() . " gs\n"; + } + + + /** + * Get current font. + * + * @return Zend_Pdf_Resource_Font $font + */ + public function getFont() + { + return $this->_font; + } + + /** + * Extract resources attached to the page + * + * This method is not intended to be used in userland, but helps to optimize some document wide operations + * + * returns array of Zend_Pdf_Element_Dictionary objects + * + * @internal + * @return array + */ + public function extractResources() + { + return $this->_pageDictionary->Resources; + } + + /** + * Extract fonts attached to the page + * + * returns array of Zend_Pdf_Resource_Font_Extracted objects + * + * @return array + */ + public function extractFonts() + { + if ($this->_pageDictionary->Resources->Font === null) { + // Page doesn't have any font attached + // Return empty array + return array(); + } + + $fontResources = $this->_pageDictionary->Resources->Font; + + $fontResourcesUnique = array(); + foreach ($fontResources->getKeys() as $fontResourceName) { + $fontDictionary = $fontResources->$fontResourceName; + + if (! ($fontDictionary instanceof Zend_Pdf_Element_Reference || + $fontDictionary instanceof Zend_Pdf_Element_Object) ) { + // Font dictionary has to be an indirect object or object reference + continue; + } + + $fontResourcesUnique[$fontDictionary->toString($this->_objFactory)] = $fontDictionary; + } + + $fonts = array(); + foreach ($fontResourcesUnique as $resourceReference => $fontDictionary) { + try { + // Try to extract font + $extractedFont = new Zend_Pdf_Resource_Font_Extracted($fontDictionary); + + $fonts[$resourceReference] = $extractedFont; + } catch (Zend_Pdf_Exception $e) { + if ($e->getMessage() != 'Unsupported font type.') { + throw $e; + } + } + } + + return $fonts; + } + + /** + * Extract font attached to the page by specific font name + * + * $fontName should be specified in UTF-8 encoding + * + * @return Zend_Pdf_Resource_Font_Extracted|null + */ + public function extractFont($fontName) + { + if ($this->_pageDictionary->Resources->Font === null) { + // Page doesn't have any font attached + return null; + } + + $fontResources = $this->_pageDictionary->Resources->Font; + + foreach ($fontResources->getKeys() as $fontResourceName) { + $fontDictionary = $fontResources->$fontResourceName; + + if (! ($fontDictionary instanceof Zend_Pdf_Element_Reference || + $fontDictionary instanceof Zend_Pdf_Element_Object) ) { + // Font dictionary has to be an indirect object or object reference + continue; + } + + if ($fontDictionary->BaseFont->value != $fontName) { + continue; + } + + try { + // Try to extract font + return new Zend_Pdf_Resource_Font_Extracted($fontDictionary); + } catch (Zend_Pdf_Exception $e) { + if ($e->getMessage() != 'Unsupported font type.') { + throw $e; + } + + // Continue searhing font with specified name + } + } + + return null; + } + + /** + * Get current font size + * + * @return float $fontSize + */ + public function getFontSize() + { + return $this->_fontSize; + } + + /** + * Return the style, applied to the page. + * + * @return Zend_Pdf_Style|null + */ + public function getStyle() + { + return $this->_style; + } + + + /** + * Save the graphics state of this page. + * This takes a snapshot of the currently applied style, position, clipping area and + * any rotation/translation/scaling that has been applied. + * + * @todo check for the open paths + * @throws Zend_Pdf_Exception - if a save is performed with an open path + */ + public function saveGS() + { + $this->_saveCount++; + + $this->_addProcSet('PDF'); + $this->_contents .= " q\n"; + } + + /** + * Restore the graphics state that was saved with the last call to saveGS(). + * + * @throws Zend_Pdf_Exception - if there is no previously saved state + */ + public function restoreGS() + { + if ($this->_saveCount-- <= 0) { + throw new Zend_Pdf_Exception('Restoring graphics state which is not saved'); + } + $this->_contents .= " Q\n"; + } + + + /** + * Intersect current clipping area with a circle. + * + * @param float $x + * @param float $y + * @param float $radius + * @param float $startAngle + * @param float $endAngle + */ + public function clipCircle($x, $y, $radius, $startAngle = null, $endAngle = null) + { + $this->clipEllipse($x - $radius, $y - $radius, + $x + $radius, $y + $radius, + $startAngle, $endAngle); + } + + /** + * Intersect current clipping area with a polygon. + * + * Method signatures: + * drawEllipse($x1, $y1, $x2, $y2); + * drawEllipse($x1, $y1, $x2, $y2, $startAngle, $endAngle); + * + * @todo process special cases with $x2-$x1 == 0 or $y2-$y1 == 0 + * + * @param float $x1 + * @param float $y1 + * @param float $x2 + * @param float $y2 + * @param float $startAngle + * @param float $endAngle + */ + public function clipEllipse($x1, $y1, $x2, $y2, $startAngle = null, $endAngle = null) + { + $this->_addProcSet('PDF'); + + if ($x2 < $x1) { + $temp = $x1; + $x1 = $x2; + $x2 = $temp; + } + if ($y2 < $y1) { + $temp = $y1; + $y1 = $y2; + $y2 = $temp; + } + + $x = ($x1 + $x2)/2.; + $y = ($y1 + $y2)/2.; + + $xC = new Zend_Pdf_Element_Numeric($x); + $yC = new Zend_Pdf_Element_Numeric($y); + + if ($startAngle !== null) { + if ($startAngle != 0) { $startAngle = fmod($startAngle, M_PI*2); } + if ($endAngle != 0) { $endAngle = fmod($endAngle, M_PI*2); } + + if ($startAngle > $endAngle) { + $endAngle += M_PI*2; + } + + $clipPath = $xC->toString() . ' ' . $yC->toString() . " m\n"; + $clipSectors = (int)ceil(($endAngle - $startAngle)/M_PI_4); + $clipRadius = max($x2 - $x1, $y2 - $y1); + + for($count = 0; $count <= $clipSectors; $count++) { + $pAngle = $startAngle + ($endAngle - $startAngle)*$count/(float)$clipSectors; + + $pX = new Zend_Pdf_Element_Numeric($x + cos($pAngle)*$clipRadius); + $pY = new Zend_Pdf_Element_Numeric($y + sin($pAngle)*$clipRadius); + $clipPath .= $pX->toString() . ' ' . $pY->toString() . " l\n"; + } + + $this->_contents .= $clipPath . "h\nW\nn\n"; + } + + $xLeft = new Zend_Pdf_Element_Numeric($x1); + $xRight = new Zend_Pdf_Element_Numeric($x2); + $yUp = new Zend_Pdf_Element_Numeric($y2); + $yDown = new Zend_Pdf_Element_Numeric($y1); + + $xDelta = 2*(M_SQRT2 - 1)*($x2 - $x1)/3.; + $yDelta = 2*(M_SQRT2 - 1)*($y2 - $y1)/3.; + $xr = new Zend_Pdf_Element_Numeric($x + $xDelta); + $xl = new Zend_Pdf_Element_Numeric($x - $xDelta); + $yu = new Zend_Pdf_Element_Numeric($y + $yDelta); + $yd = new Zend_Pdf_Element_Numeric($y - $yDelta); + + $this->_contents .= $xC->toString() . ' ' . $yUp->toString() . " m\n" + . $xr->toString() . ' ' . $yUp->toString() . ' ' + . $xRight->toString() . ' ' . $yu->toString() . ' ' + . $xRight->toString() . ' ' . $yC->toString() . " c\n" + . $xRight->toString() . ' ' . $yd->toString() . ' ' + . $xr->toString() . ' ' . $yDown->toString() . ' ' + . $xC->toString() . ' ' . $yDown->toString() . " c\n" + . $xl->toString() . ' ' . $yDown->toString() . ' ' + . $xLeft->toString() . ' ' . $yd->toString() . ' ' + . $xLeft->toString() . ' ' . $yC->toString() . " c\n" + . $xLeft->toString() . ' ' . $yu->toString() . ' ' + . $xl->toString() . ' ' . $yUp->toString() . ' ' + . $xC->toString() . ' ' . $yUp->toString() . " c\n" + . "h\nW\nn\n"; + } + + + /** + * Intersect current clipping area with a polygon. + * + * @param array $x - array of float (the X co-ordinates of the vertices) + * @param array $y - array of float (the Y co-ordinates of the vertices) + * @param integer $fillMethod + */ + public function clipPolygon($x, $y, $fillMethod = Zend_Pdf_Page::FILL_METHOD_NON_ZERO_WINDING) + { + $this->_addProcSet('PDF'); + + $firstPoint = true; + foreach ($x as $id => $xVal) { + $xObj = new Zend_Pdf_Element_Numeric($xVal); + $yObj = new Zend_Pdf_Element_Numeric($y[$id]); + + if ($firstPoint) { + $path = $xObj->toString() . ' ' . $yObj->toString() . " m\n"; + $firstPoint = false; + } else { + $path .= $xObj->toString() . ' ' . $yObj->toString() . " l\n"; + } + } + + $this->_contents .= $path; + + if ($fillMethod == Zend_Pdf_Page::FILL_METHOD_NON_ZERO_WINDING) { + $this->_contents .= " h\n W\n"; + } else { + // Even-Odd fill method. + $this->_contents .= " h\n W*\n"; + } + } + + /** + * Intersect current clipping area with a rectangle. + * + * @param float $x1 + * @param float $y1 + * @param float $x2 + * @param float $y2 + */ + public function clipRectangle($x1, $y1, $x2, $y2) + { + $this->_addProcSet('PDF'); + + $x1Obj = new Zend_Pdf_Element_Numeric($x1); + $y1Obj = new Zend_Pdf_Element_Numeric($y1); + $widthObj = new Zend_Pdf_Element_Numeric($x2 - $x1); + $height2Obj = new Zend_Pdf_Element_Numeric($y2 - $y1); + + $this->_contents .= $x1Obj->toString() . ' ' . $y1Obj->toString() . ' ' + . $widthObj->toString() . ' ' . $height2Obj->toString() . " re\n" + . " W\n"; + } + + /** + * Draw a Zend_Pdf_ContentStream at the specified position on the page + * + * @param ZPdfContentStream $cs + * @param float $x1 + * @param float $y1 + * @param float $x2 + * @param float $y2 + */ + public function drawContentStream($cs, $x1, $y1, $x2, $y2) + { + } + + /** + * Draw a circle centered on x, y with a radius of radius. + * + * Method signatures: + * drawCircle($x, $y, $radius); + * drawCircle($x, $y, $radius, $fillType); + * drawCircle($x, $y, $radius, $startAngle, $endAngle); + * drawCircle($x, $y, $radius, $startAngle, $endAngle, $fillType); + * + * + * It's not a really circle, because PDF supports only cubic Bezier curves. + * But _very_ good approximation. + * It differs from a real circle on a maximum 0.00026 radiuses + * (at PI/8, 3*PI/8, 5*PI/8, 7*PI/8, 9*PI/8, 11*PI/8, 13*PI/8 and 15*PI/8 angles). + * At 0, PI/4, PI/2, 3*PI/4, PI, 5*PI/4, 3*PI/2 and 7*PI/4 it's exactly a tangent to a circle. + * + * @param float $x + * @param float $y + * @param float $radius + * @param mixed $param4 + * @param mixed $param5 + * @param mixed $param6 + */ + public function drawCircle($x, $y, $radius, $param4 = null, $param5 = null, $param6 = null) + { + $this->drawEllipse($x - $radius, $y - $radius, + $x + $radius, $y + $radius, + $param4, $param5, $param6); + } + + /** + * Draw an ellipse inside the specified rectangle. + * + * Method signatures: + * drawEllipse($x1, $y1, $x2, $y2); + * drawEllipse($x1, $y1, $x2, $y2, $fillType); + * drawEllipse($x1, $y1, $x2, $y2, $startAngle, $endAngle); + * drawEllipse($x1, $y1, $x2, $y2, $startAngle, $endAngle, $fillType); + * + * @todo process special cases with $x2-$x1 == 0 or $y2-$y1 == 0 + * + * @param float $x1 + * @param float $y1 + * @param float $x2 + * @param float $y2 + * @param mixed $param5 + * @param mixed $param6 + * @param mixed $param7 + */ + public function drawEllipse($x1, $y1, $x2, $y2, $param5 = null, $param6 = null, $param7 = null) + { + if ($param5 === null) { + // drawEllipse($x1, $y1, $x2, $y2); + $startAngle = null; + $fillType = Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE; + } else if ($param6 === null) { + // drawEllipse($x1, $y1, $x2, $y2, $fillType); + $startAngle = null; + $fillType = $param5; + } else { + // drawEllipse($x1, $y1, $x2, $y2, $startAngle, $endAngle); + // drawEllipse($x1, $y1, $x2, $y2, $startAngle, $endAngle, $fillType); + $startAngle = $param5; + $endAngle = $param6; + + if ($param7 === null) { + $fillType = Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE; + } else { + $fillType = $param7; + } + } + + $this->_addProcSet('PDF'); + + if ($x2 < $x1) { + $temp = $x1; + $x1 = $x2; + $x2 = $temp; + } + if ($y2 < $y1) { + $temp = $y1; + $y1 = $y2; + $y2 = $temp; + } + + $x = ($x1 + $x2)/2.; + $y = ($y1 + $y2)/2.; + + $xC = new Zend_Pdf_Element_Numeric($x); + $yC = new Zend_Pdf_Element_Numeric($y); + + if ($startAngle !== null) { + if ($startAngle != 0) { $startAngle = fmod($startAngle, M_PI*2); } + if ($endAngle != 0) { $endAngle = fmod($endAngle, M_PI*2); } + + if ($startAngle > $endAngle) { + $endAngle += M_PI*2; + } + + $clipPath = $xC->toString() . ' ' . $yC->toString() . " m\n"; + $clipSectors = (int)ceil(($endAngle - $startAngle)/M_PI_4); + $clipRadius = max($x2 - $x1, $y2 - $y1); + + for($count = 0; $count <= $clipSectors; $count++) { + $pAngle = $startAngle + ($endAngle - $startAngle)*$count/(float)$clipSectors; + + $pX = new Zend_Pdf_Element_Numeric($x + cos($pAngle)*$clipRadius); + $pY = new Zend_Pdf_Element_Numeric($y + sin($pAngle)*$clipRadius); + $clipPath .= $pX->toString() . ' ' . $pY->toString() . " l\n"; + } + + $this->_contents .= "q\n" . $clipPath . "h\nW\nn\n"; + } + + $xLeft = new Zend_Pdf_Element_Numeric($x1); + $xRight = new Zend_Pdf_Element_Numeric($x2); + $yUp = new Zend_Pdf_Element_Numeric($y2); + $yDown = new Zend_Pdf_Element_Numeric($y1); + + $xDelta = 2*(M_SQRT2 - 1)*($x2 - $x1)/3.; + $yDelta = 2*(M_SQRT2 - 1)*($y2 - $y1)/3.; + $xr = new Zend_Pdf_Element_Numeric($x + $xDelta); + $xl = new Zend_Pdf_Element_Numeric($x - $xDelta); + $yu = new Zend_Pdf_Element_Numeric($y + $yDelta); + $yd = new Zend_Pdf_Element_Numeric($y - $yDelta); + + $this->_contents .= $xC->toString() . ' ' . $yUp->toString() . " m\n" + . $xr->toString() . ' ' . $yUp->toString() . ' ' + . $xRight->toString() . ' ' . $yu->toString() . ' ' + . $xRight->toString() . ' ' . $yC->toString() . " c\n" + . $xRight->toString() . ' ' . $yd->toString() . ' ' + . $xr->toString() . ' ' . $yDown->toString() . ' ' + . $xC->toString() . ' ' . $yDown->toString() . " c\n" + . $xl->toString() . ' ' . $yDown->toString() . ' ' + . $xLeft->toString() . ' ' . $yd->toString() . ' ' + . $xLeft->toString() . ' ' . $yC->toString() . " c\n" + . $xLeft->toString() . ' ' . $yu->toString() . ' ' + . $xl->toString() . ' ' . $yUp->toString() . ' ' + . $xC->toString() . ' ' . $yUp->toString() . " c\n"; + + switch ($fillType) { + case Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE: + $this->_contents .= " B*\n"; + break; + case Zend_Pdf_Page::SHAPE_DRAW_FILL: + $this->_contents .= " f*\n"; + break; + case Zend_Pdf_Page::SHAPE_DRAW_STROKE: + $this->_contents .= " S\n"; + break; + } + + if ($startAngle !== null) { + $this->_contents .= "Q\n"; + } + } + + /** + * Draw an image at the specified position on the page. + * + * @param Zend_Pdf_Image $image + * @param float $x1 + * @param float $y1 + * @param float $x2 + * @param float $y2 + */ + public function drawImage(Zend_Pdf_Resource_Image $image, $x1, $y1, $x2, $y2) + { + $this->_addProcSet('PDF'); + + $imageName = $this->_attachResource('XObject', $image); + $imageNameObj = new Zend_Pdf_Element_Name($imageName); + + $x1Obj = new Zend_Pdf_Element_Numeric($x1); + $y1Obj = new Zend_Pdf_Element_Numeric($y1); + $widthObj = new Zend_Pdf_Element_Numeric($x2 - $x1); + $heightObj = new Zend_Pdf_Element_Numeric($y2 - $y1); + + $this->_contents .= "q\n" + . '1 0 0 1 ' . $x1Obj->toString() . ' ' . $y1Obj->toString() . " cm\n" + . $widthObj->toString() . ' 0 0 ' . $heightObj->toString() . " 0 0 cm\n" + . $imageNameObj->toString() . " Do\n" + . "Q\n"; + } + + /** + * Draw a LayoutBox at the specified position on the page. + * + * @param Zend_Pdf_Element_LayoutBox $box + * @param float $x + * @param float $y + */ + public function drawLayoutBox($box, $x, $y) + { + } + + /** + * Draw a line from x1,y1 to x2,y2. + * + * @param float $x1 + * @param float $y1 + * @param float $x2 + * @param float $y2 + */ + public function drawLine($x1, $y1, $x2, $y2) + { + $this->_addProcSet('PDF'); + + $x1Obj = new Zend_Pdf_Element_Numeric($x1); + $y1Obj = new Zend_Pdf_Element_Numeric($y1); + $x2Obj = new Zend_Pdf_Element_Numeric($x2); + $y2Obj = new Zend_Pdf_Element_Numeric($y2); + + $this->_contents .= $x1Obj->toString() . ' ' . $y1Obj->toString() . " m\n" + . $x2Obj->toString() . ' ' . $y2Obj->toString() . " l\n S\n"; + } + + /** + * Draw a polygon. + * + * If $fillType is Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE or + * Zend_Pdf_Page::SHAPE_DRAW_FILL, then polygon is automatically closed. + * See detailed description of these methods in a PDF documentation + * (section 4.4.2 Path painting Operators, Filling) + * + * @param array $x - array of float (the X co-ordinates of the vertices) + * @param array $y - array of float (the Y co-ordinates of the vertices) + * @param integer $fillType + * @param integer $fillMethod + */ + public function drawPolygon($x, $y, + $fillType = Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE, + $fillMethod = Zend_Pdf_Page::FILL_METHOD_NON_ZERO_WINDING) + { + $this->_addProcSet('PDF'); + + $firstPoint = true; + foreach ($x as $id => $xVal) { + $xObj = new Zend_Pdf_Element_Numeric($xVal); + $yObj = new Zend_Pdf_Element_Numeric($y[$id]); + + if ($firstPoint) { + $path = $xObj->toString() . ' ' . $yObj->toString() . " m\n"; + $firstPoint = false; + } else { + $path .= $xObj->toString() . ' ' . $yObj->toString() . " l\n"; + } + } + + $this->_contents .= $path; + + switch ($fillType) { + case Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE: + if ($fillMethod == Zend_Pdf_Page::FILL_METHOD_NON_ZERO_WINDING) { + $this->_contents .= " b\n"; + } else { + // Even-Odd fill method. + $this->_contents .= " b*\n"; + } + break; + case Zend_Pdf_Page::SHAPE_DRAW_FILL: + if ($fillMethod == Zend_Pdf_Page::FILL_METHOD_NON_ZERO_WINDING) { + $this->_contents .= " h\n f\n"; + } else { + // Even-Odd fill method. + $this->_contents .= " h\n f*\n"; + } + break; + case Zend_Pdf_Page::SHAPE_DRAW_STROKE: + $this->_contents .= " S\n"; + break; + } + } + + /** + * Draw a rectangle. + * + * Fill types: + * Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE - fill rectangle and stroke (default) + * Zend_Pdf_Page::SHAPE_DRAW_STROKE - stroke rectangle + * Zend_Pdf_Page::SHAPE_DRAW_FILL - fill rectangle + * + * @param float $x1 + * @param float $y1 + * @param float $x2 + * @param float $y2 + * @param integer $fillType + */ + public function drawRectangle($x1, $y1, $x2, $y2, $fillType = Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE) + { + $this->_addProcSet('PDF'); + + $x1Obj = new Zend_Pdf_Element_Numeric($x1); + $y1Obj = new Zend_Pdf_Element_Numeric($y1); + $widthObj = new Zend_Pdf_Element_Numeric($x2 - $x1); + $height2Obj = new Zend_Pdf_Element_Numeric($y2 - $y1); + + $this->_contents .= $x1Obj->toString() . ' ' . $y1Obj->toString() . ' ' + . $widthObj->toString() . ' ' . $height2Obj->toString() . " re\n"; + + switch ($fillType) { + case Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE: + $this->_contents .= " B*\n"; + break; + case Zend_Pdf_Page::SHAPE_DRAW_FILL: + $this->_contents .= " f*\n"; + break; + case Zend_Pdf_Page::SHAPE_DRAW_STROKE: + $this->_contents .= " S\n"; + break; + } + } + + /** + * Draw a line of text at the specified position. + * + * @param string $text + * @param float $x + * @param float $y + * @param string $charEncoding (optional) Character encoding of source text. + * Defaults to current locale. + * @throws Zend_Pdf_Exception + */ + public function drawText($text, $x, $y, $charEncoding = '') + { + if ($this->_font === null) { + throw new Zend_Pdf_Exception('Font has not been set'); + } + + $this->_addProcSet('Text'); + + $textObj = new Zend_Pdf_Element_String($this->_font->encodeString($text, $charEncoding)); + $xObj = new Zend_Pdf_Element_Numeric($x); + $yObj = new Zend_Pdf_Element_Numeric($y); + + $this->_contents .= "BT\n" + . $xObj->toString() . ' ' . $yObj->toString() . " Td\n" + . $textObj->toString() . " Tj\n" + . "ET\n"; + } + + /** + * Return the height of this page in points. + * + * @return float + */ + public function getHeight() + { + return $this->_pageDictionary->MediaBox->items[3]->value - + $this->_pageDictionary->MediaBox->items[1]->value; + } + + /** + * Return the width of this page in points. + * + * @return float + */ + public function getWidth() + { + return $this->_pageDictionary->MediaBox->items[2]->value - + $this->_pageDictionary->MediaBox->items[0]->value; + } + + /** + * Close the path by drawing a straight line back to it's beginning. + * + * @throws Zend_Pdf_Exception - if a path hasn't been started with pathMove() + */ + public function pathClose() + { + } + + /** + * Continue the open path in a straight line to the specified position. + * + * @param float $x - the X co-ordinate to move to + * @param float $y - the Y co-ordinate to move to + */ + public function pathLine($x, $y) + { + } + + /** + * Start a new path at the specified position. If a path has already been started, + * move the cursor without drawing a line. + * + * @param float $x - the X co-ordinate to move to + * @param float $y - the Y co-ordinate to move to + */ + public function pathMove($x, $y) + { + } + + /** + * Writes the raw data to the page's content stream. + * + * Be sure to consult the PDF reference to ensure your syntax is correct. No + * attempt is made to ensure the validity of the stream data. + * + * @param string $data + * @param string $procSet (optional) Name of ProcSet to add. + */ + public function rawWrite($data, $procSet = null) + { + if (! empty($procSet)) { + $this->_addProcSet($procSet); + } + $this->_contents .= $data; + } + + /** + * Rotate the page. + * + * @param float $angle + */ + public function rotate($x, $y, $angle) + { + $cos = new Zend_Pdf_Element_Numeric(cos($angle)); + $sin = new Zend_Pdf_Element_Numeric(sin($angle)); + $mSin = new Zend_Pdf_Element_Numeric(-$sin->value); + + $xObj = new Zend_Pdf_Element_Numeric($x); + $yObj = new Zend_Pdf_Element_Numeric($y); + + $mXObj = new Zend_Pdf_Element_Numeric(-$x); + $mYObj = new Zend_Pdf_Element_Numeric(-$y); + + + $this->_addProcSet('PDF'); + $this->_contents .= '1 0 0 1 ' . $xObj->toString() . ' ' . $yObj->toString() . " cm\n" + . $cos->toString() . ' ' . $sin->toString() + . ' ' . $mSin->toString() . ' ' . $cos->toString() . " 0 0 cm\n" + .'1 0 0 1 ' . $mXObj->toString() . ' ' . $mYObj->toString() . " cm\n"; + } + + +} + diff --git a/libs/Zend/Pdf/Parser.php b/libs/Zend/Pdf/Parser.php new file mode 100644 index 0000000..de60113 --- /dev/null +++ b/libs/Zend/Pdf/Parser.php @@ -0,0 +1,467 @@ +_stringParser->data); + } + + /** + * Get PDF String + * + * @return string + */ + public function getPDFString() + { + return $this->_stringParser->data; + } + + /** + * Load XReference table and referenced objects + * + * @param integer $offset + * @throws Zend_Pdf_Exception + * @return Zend_Pdf_Trailer_Keeper + */ + private function _loadXRefTable($offset) + { + $this->_stringParser->offset = $offset; + + $refTable = new Zend_Pdf_Element_Reference_Table(); + $context = new Zend_Pdf_Element_Reference_Context($this->_stringParser, $refTable); + $this->_stringParser->setContext($context); + + $nextLexeme = $this->_stringParser->readLexeme(); + if ($nextLexeme == 'xref') { + /** + * Common cross-reference table + */ + $this->_stringParser->skipWhiteSpace(); + while ( ($nextLexeme = $this->_stringParser->readLexeme()) != 'trailer' ) { + if (!ctype_digit($nextLexeme)) { + 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)) { + 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))); + } + + $this->_stringParser->skipWhiteSpace(); + while ($refCount > 0) { + $objectOffset = substr($this->_stringParser->data, $this->_stringParser->offset, 10); + if (!ctype_digit($objectOffset)) { + 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 + for ($numStart = 0; $numStart < strlen($objectOffset)-1; $numStart++) { + if ($objectOffset[$numStart] != '0') { + break; + } + } + $objectOffset = substr($objectOffset, $numStart); + $this->_stringParser->offset += 10; + + if ( !Zend_Pdf_StringParser::isWhiteSpace(ord( $this->_stringParser->data[$this->_stringParser->offset] )) ) { + 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)) { + 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 + for ($numStart = 0; $numStart < strlen($genNumber)-1; $numStart++) { + if ($genNumber[$numStart] != '0') { + break; + } + } + $genNumber = substr($genNumber, $numStart); + $this->_stringParser->offset += 5; + + if ( !Zend_Pdf_StringParser::isWhiteSpace(ord( $this->_stringParser->data[$this->_stringParser->offset] )) ) { + 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++; + + $inUseKey = $this->_stringParser->data[$this->_stringParser->offset]; + $this->_stringParser->offset++; + + switch ($inUseKey) { + case 'f': + // free entry + unset( $this->_refTable[$objNum . ' ' . $genNumber . ' R'] ); + $refTable->addReference($objNum . ' ' . $genNumber . ' R', + $objectOffset, + false); + break; + + case 'n': + // in-use entry + + $refTable->addReference($objNum . ' ' . $genNumber . ' R', + $objectOffset, + true); + } + + if ( !Zend_Pdf_StringParser::isWhiteSpace(ord( $this->_stringParser->data[$this->_stringParser->offset] )) ) { + 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] )) ) { + 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++; + + $refCount--; + $objNum++; + } + } + + $trailerDictOffset = $this->_stringParser->offset; + $trailerDict = $this->_stringParser->readElement(); + if (!$trailerDict instanceof Zend_Pdf_Element_Dictionary) { + 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) { + 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') { + 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) { + 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)); + } + + $entryField1Size = $trailerDict->W->items[0]->value; + $entryField2Size = $trailerDict->W->items[1]->value; + $entryField3Size = $trailerDict->W->items[2]->value; + + if ($entryField2Size == 0 || $entryField3Size == 0) { + 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)); + } + + $xrefStreamData = &$xrefStream->value; + + if ($trailerDict->Index !== null) { + if ($trailerDict->Index->getType() != Zend_Pdf_Element::TYPE_ARRAY) { + 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; + } else { + $sections = 1; + } + + $streamOffset = 0; + + $size = $entryField1Size + $entryField2Size + $entryField3Size; + $entries = strlen($xrefStreamData)/$size; + + for ($count = 0; $count < $sections; $count++) { + if ($trailerDict->Index !== null) { + $objNum = $trailerDict->Index->items[$count*2 ]->value; + $entries = $trailerDict->Index->items[$count*2 + 1]->value; + } else { + $objNum = 0; + $entries = $trailerDict->Size->value; + } + + for ($count2 = 0; $count2 < $entries; $count2++) { + if ($entryField1Size == 0) { + $type = 1; + } else if ($entryField1Size == 1) { // Optimyze one-byte field case + $type = ord($xrefStreamData[$streamOffset++]); + } else { + $type = Zend_Pdf_StringParser::parseIntFromStream($xrefStreamData, $streamOffset, $entryField1Size); + $streamOffset += $entryField1Size; + } + + if ($entryField2Size == 1) { // Optimyze one-byte field case + $field2 = ord($xrefStreamData[$streamOffset++]); + } else { + $field2 = Zend_Pdf_StringParser::parseIntFromStream($xrefStreamData, $streamOffset, $entryField2Size); + $streamOffset += $entryField2Size; + } + + if ($entryField3Size == 1) { // Optimyze one-byte field case + $field3 = ord($xrefStreamData[$streamOffset++]); + } else { + $field3 = Zend_Pdf_StringParser::parseIntFromStream($xrefStreamData, $streamOffset, $entryField3Size); + $streamOffset += $entryField3Size; + } + + switch ($type) { + case 0: + // Free object + $refTable->addReference($objNum . ' ' . $field3 . ' R', $field2, false); + // Debug output: + // echo "Free object - $objNum $field3 R, next free - $field2\n"; + break; + + case 1: + // In use object + $refTable->addReference($objNum . ' ' . $field3 . ' R', $field2, true); + // Debug output: + // echo "In-use object - $objNum $field3 R, offset - $field2\n"; + break; + + case 2: + // Object in an object stream + // Debug output: + // echo "Compressed object - $objNum 0 R, object stream - $field2 0 R, offset - $field3\n"; + break; + } + + $objNum++; + } + } + + // $streamOffset . ' ' . strlen($xrefStreamData) . "\n"; + // "$entries\n"; + throw new Zend_Pdf_Exception('Cross-reference streams are not supported yet.'); + } + + + $trailerObj = new Zend_Pdf_Trailer_Keeper($trailerDict, $context); + if ($trailerDict->Prev instanceof Zend_Pdf_Element_Numeric || + $trailerDict->Prev instanceof Zend_Pdf_Element_Reference ) { + $trailerObj->setPrev($this->_loadXRefTable($trailerDict->Prev->value)); + $context->getRefTable()->setParent($trailerObj->getPrev()->getRefTable()); + } + + /** + * We set '/Prev' dictionary property to the current cross-reference section offset. + * It doesn't correspond to the actual data, but is true when trailer will be used + * as a trailer for next generated PDF section. + */ + $trailerObj->Prev = new Zend_Pdf_Element_Numeric($offset); + + return $trailerObj; + } + + + /** + * Get Trailer object + * + * @return Zend_Pdf_Trailer_Keeper + */ + public function getTrailer() + { + return $this->_trailer; + } + + /** + * Object constructor + * + * Note: PHP duplicates string, which is sent by value, only of it's updated. + * Thus we don't need to care about overhead + * + * @param mixed $source + * @param Zend_Pdf_ElementFactory_Interface $factory + * @param boolean $load + * @throws Zend_Exception + */ + public function __construct($source, Zend_Pdf_ElementFactory_Interface $factory, $load) + { + if ($load) { + if (($pdfFile = @fopen($source, 'rb')) === false ) { + throw new Zend_Pdf_Exception( "Can not open '$source' file for reading." ); + } + + $byteCount = filesize($source); + + $data = fread($pdfFile, $byteCount); + $byteCount -= strlen($data); + while ( $byteCount > 0 && ($nextBlock = fread($pdfFile, $byteCount)) != false ) { + $data .= $nextBlock; + $byteCount -= strlen($nextBlock); + } + fclose($pdfFile); + + $this->_stringParser = new Zend_Pdf_StringParser($data, $factory); + } else { + $this->_stringParser = new Zend_Pdf_StringParser($source, $factory); + } + + $pdfVersionComment = $this->_stringParser->readComment(); + if (substr($pdfVersionComment, 0, 5) != '%PDF-') { + throw new Zend_Pdf_Exception('File is not a PDF.'); + } + + $pdfVersion = (float)substr($pdfVersionComment, 5); + if ($pdfVersion < 0.9 || $pdfVersion >= 1.61) { + /** + * @todo + * To support PDF versions 1.5 (Acrobat 6) and PDF version 1.7 (Acrobat 7) + * Stream compression filter must be implemented (for compressed object streams). + * Cross reference streams must be implemented + */ + throw new Zend_Pdf_Exception(sprintf('Unsupported PDF version. Zend_Pdf supports PDF 1.0-1.4. Current version - \'%f\'', $pdfVersion)); + } + + $this->_stringParser->offset = strrpos($this->_stringParser->data, '%%EOF'); + if ($this->_stringParser->offset === false || + strlen($this->_stringParser->data) - $this->_stringParser->offset > 7) { + throw new Zend_Pdf_Exception('Pdf file syntax error. End-of-fle marker expected at the end of file.'); + } + + $this->_stringParser->offset--; + /** + * Go to end of cross-reference table offset + */ + while (Zend_Pdf_StringParser::isWhiteSpace( ord($this->_stringParser->data[$this->_stringParser->offset]) )&& + ($this->_stringParser->offset > 0)) { + $this->_stringParser->offset--; + } + /** + * Go to the start of cross-reference table offset + */ + while ( (!Zend_Pdf_StringParser::isWhiteSpace( ord($this->_stringParser->data[$this->_stringParser->offset]) ))&& + ($this->_stringParser->offset > 0)) { + $this->_stringParser->offset--; + } + /** + * Go to the end of 'startxref' keyword + */ + while (Zend_Pdf_StringParser::isWhiteSpace( ord($this->_stringParser->data[$this->_stringParser->offset]) )&& + ($this->_stringParser->offset > 0)) { + $this->_stringParser->offset--; + } + /** + * Go to the white space (eol marker) before 'startxref' keyword + */ + $this->_stringParser->offset -= 9; + + $nextLexeme = $this->_stringParser->readLexeme(); + if ($nextLexeme != 'startxref') { + 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)) { + 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))); + } + + $this->_trailer = $this->_loadXRefTable($startXref); + $factory->setObjectCount($this->_trailer->Size->value); + } + + + /** + * Object destructor + */ + public function __destruct() + { + $this->_stringParser->cleanUp(); + } +} diff --git a/libs/Zend/Pdf/Parser/Stream.php b/libs/Zend/Pdf/Parser/Stream.php new file mode 100644 index 0000000..56f07ee --- /dev/null +++ b/libs/Zend/Pdf/Parser/Stream.php @@ -0,0 +1,59 @@ +_current = 0; + $this->_currentContext = null; + $this->_contextStack = array(); + $this->_elements = new Zend_Pdf_PhpArray(); + $this->_objFactory = $factory; + } +} diff --git a/libs/Zend/Pdf/PhpArray.php b/libs/Zend/Pdf/PhpArray.php new file mode 100644 index 0000000..0392f71 --- /dev/null +++ b/libs/Zend/Pdf/PhpArray.php @@ -0,0 +1,128 @@ +_items); + } else if (is_array($srcArray)) { + $this->_items = $srcArray; + } else { + throw new Exception('Array can be initialized only by other array'); + } + } + + + public function current() + { + return current($this->_items); + } + + + public function next() + { + return next($this->_items); + } + + + public function key() + { + return key($this->_items); + } + + + public function valid() { + return current($this->_items)!==false; + } + + + public function rewind() + { + reset($this->_items); + } + + + public function offsetExists($offset) + { + return array_key_exists($offset, $this->_items); + } + + + public function offsetGet($offset) + { + return $this->_items[$offset]; + } + + + public function offsetSet($offset, $value) + { + if ($offset === null) { + $this->_items[] = $value; + } else { + $this->_items[$offset] = $value; + } + } + + + public function offsetUnset($offset) + { + unset($this->_items[$offset]); + } + + + public function clear() + { + $this->_items = array(); + } + + /** + * Defined by Countable interface + * + * @return int + */ + public function count() + { + return count($this->_items); + } + +} + diff --git a/libs/Zend/Pdf/Resource.php b/libs/Zend/Pdf/Resource.php new file mode 100644 index 0000000..281bf5a --- /dev/null +++ b/libs/Zend/Pdf/Resource.php @@ -0,0 +1,108 @@ +_objectFactory = Zend_Pdf_ElementFactory::createFactory(1); + if ($resource instanceof Zend_Pdf_Element) { + $this->_resource = $this->_objectFactory->newObject($resource); + } else { + $this->_resource = $this->_objectFactory->newStreamObject($resource); + } + } + + /** + * Get resource. + * Used to reference resource in an internal PDF data structures (resource dictionaries) + * + * @internal + * @return Zend_Pdf_Element_Object + */ + public function getResource() + { + return $this->_resource; + } + + /** + * Get factory. + * + * @internal + * @return Zend_Pdf_ElementFactory_Interface + */ + public function getFactory() + { + return $this->_objectFactory; + } +} + diff --git a/libs/Zend/Pdf/Resource/Font.php b/libs/Zend/Pdf/Resource/Font.php new file mode 100644 index 0000000..550b8ef --- /dev/null +++ b/libs/Zend/Pdf/Resource/Font.php @@ -0,0 +1,524 @@ +_resource->Type = new Zend_Pdf_Element_Name('Font'); + } + + + /* Object Magic Methods */ + + /** + * Returns the full name of the font in the encoding method of the current + * locale. Transliterates any characters that cannot be naturally + * represented in that character set. + * + * @return string + */ + public function __toString() + { + return $this->getFontName(Zend_Pdf_Font::NAME_FULL, '', '//TRANSLIT'); + } + + + /* Accessors */ + + /** + * Returns the type of font. + * + * @return integer One of the TYPE_ constants defined in + * {@link Zend_Pdf_Font}. + */ + public function getFontType() + { + return $this->_fontType; + } + + /** + * Returns the specified descriptive name for the font. + * + * The font name type is usually one of the following: + *
      + *
    • {@link Zend_Pdf_Font::NAME_FULL} + *
    • {@link Zend_Pdf_Font::NAME_FAMILY} + *
    • {@link Zend_Pdf_Font::NAME_PREFERRED_FAMILY} + *
    • {@link Zend_Pdf_Font::NAME_STYLE} + *
    • {@link Zend_Pdf_Font::NAME_PREFERRED_STYLE} + *
    • {@link Zend_Pdf_Font::NAME_DESCRIPTION} + *
    • {@link Zend_Pdf_Font::NAME_SAMPLE_TEXT} + *
    • {@link Zend_Pdf_Font::NAME_ID} + *
    • {@link Zend_Pdf_Font::NAME_VERSION} + *
    • {@link Zend_Pdf_Font::NAME_POSTSCRIPT} + *
    • {@link Zend_Pdf_Font::NAME_CID_NAME} + *
    • {@link Zend_Pdf_Font::NAME_DESIGNER} + *
    • {@link Zend_Pdf_Font::NAME_DESIGNER_URL} + *
    • {@link Zend_Pdf_Font::NAME_MANUFACTURER} + *
    • {@link Zend_Pdf_Font::NAME_VENDOR_URL} + *
    • {@link Zend_Pdf_Font::NAME_COPYRIGHT} + *
    • {@link Zend_Pdf_Font::NAME_TRADEMARK} + *
    • {@link Zend_Pdf_Font::NAME_LICENSE} + *
    • {@link Zend_Pdf_Font::NAME_LICENSE_URL} + *
    + * + * Note that not all names are available for all fonts. In addition, some + * fonts may contain additional names, whose indicies are in the range + * 256 to 32767 inclusive, which are used for certain font layout features. + * + * If the preferred language translation is not available, uses the first + * available translation for the name, which is usually English. + * + * If the requested name does not exist, returns null. + * + * All names are stored internally as Unicode strings, using UTF-16BE + * encoding. You may optionally supply a different resulting character set. + * + * @param integer $nameType Type of name requested. + * @param mixed $language Preferred language (string) or array of languages + * in preferred order. Use the ISO 639 standard 2-letter language codes. + * @param string $characterSet (optional) Desired resulting character set. + * You may use any character set supported by {@link iconv()}; + * @return string + */ + public function getFontName($nameType, $language, $characterSet = null) + { + if (! isset($this->_fontNames[$nameType])) { + return null; + } + $name = null; + if (is_array($language)) { + foreach ($language as $code) { + if (isset($this->_fontNames[$nameType][$code])) { + $name = $this->_fontNames[$nameType][$code]; + break; + } + } + } else { + if (isset($this->_fontNames[$nameType][$language])) { + $name = $this->_fontNames[$nameType][$language]; + } + } + /* If the preferred language could not be found, use whatever is first. + */ + if (is_null($name)) { + $names = $this->_fontNames[$nameType]; + $name = reset($names); + } + /* Convert the character set if requested. + */ + if ((! is_null($characterSet)) && ($characterSet != 'UTF-16BE') && PHP_OS != 'AIX') { // AIX knows not this charset + $name = iconv('UTF-16BE', $characterSet, $name); + } + return $name; + } + + /** + * Returns whole set of font names. + * + * @return array + */ + public function getFontNames() + { + return $this->_fontNames; + } + + /** + * Returns true if font is bold. + * + * @return boolean + */ + public function isBold() + { + return $this->_isBold; + } + + /** + * Returns true if font is italic. + * + * @return boolean + */ + public function isItalic() + { + return $this->_isItalic; + } + + /** + * Returns true if font is monospace. + * + * @return boolean + */ + public function isMonospace() + { + return $this->_isMonospace; + } + + /** + * Returns the suggested position below the text baseline of the underline + * in glyph units. + * + * This value is usually negative. + * + * @return integer + */ + public function getUnderlinePosition() + { + return $this->_underlinePosition; + } + + /** + * Returns the suggested line thickness of the underline in glyph units. + * + * @return integer + */ + public function getUnderlineThickness() + { + return $this->_underlineThickness; + } + + /** + * Returns the suggested position above the text baseline of the + * strikethrough in glyph units. + * + * @return integer + */ + public function getStrikePosition() + { + return $this->_strikePosition; + } + + /** + * Returns the suggested line thickness of the strikethrough in glyph units. + * + * @return integer + */ + public function getStrikeThickness() + { + return $this->_strikeThickness; + } + + /** + * Returns the number of glyph units per em. + * + * Used to convert glyph space to user space. Frequently used in conjunction + * with {@link widthsForGlyphs()} to calculate the with of a run of text. + * + * @return integer + */ + public function getUnitsPerEm() + { + return $this->_unitsPerEm; + } + + /** + * Returns the typographic ascent in font glyph units. + * + * The typographic ascent is the distance from the font's baseline to the + * top of the text frame. It is frequently used to locate the initial + * baseline for a paragraph of text inside a given rectangle. + * + * @return integer + */ + public function getAscent() + { + return $this->_ascent; + } + + /** + * Returns the typographic descent in font glyph units. + * + * The typographic descent is the distance below the font's baseline to the + * bottom of the text frame. It is always negative. + * + * @return integer + */ + public function getDescent() + { + return $this->_descent; + } + + /** + * Returns the typographic line gap in font glyph units. + * + * The typographic line gap is the distance between the bottom of the text + * frame of one line to the top of the text frame of the next. It is + * typically combined with the typographical ascent and descent to determine + * the font's total line height (or leading). + * + * @return integer + */ + public function getLineGap() + { + return $this->_lineGap; + } + + /** + * Returns the suggested line height (or leading) in font glyph units. + * + * This value is determined by adding together the values of the typographic + * ascent, descent, and line gap. This value yields the suggested line + * spacing as determined by the font developer. + * + * It should be noted that this is only a guideline; layout engines will + * frequently modify this value to achieve special effects such as double- + * spacing. + * + * @return integer + */ + public function getLineHeight() + { + return $this->_ascent - $this->_descent + $this->_lineGap; + } + + + /* Information and Conversion Methods */ + + /** + * Returns an array of glyph numbers corresponding to the Unicode characters. + * + * If a particular character doesn't exist in this font, the special 'missing + * character glyph' will be substituted. + * + * See also {@link glyphNumberForCharacter()}. + * + * @param array $characterCodes Array of Unicode character codes (code points). + * @return array Array of glyph numbers. + */ + abstract public function glyphNumbersForCharacters($characterCodes); + + /** + * Returns the glyph number corresponding to the Unicode character. + * + * If a particular character doesn't exist in this font, the special 'missing + * character glyph' will be substituted. + * + * See also {@link glyphNumbersForCharacters()} which is optimized for bulk + * operations. + * + * @param integer $characterCode Unicode character code (code point). + * @return integer Glyph number. + */ + abstract public function glyphNumberForCharacter($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. + * + * Since no one font will contain glyphs for the entire Unicode character + * range, this method can be used to help locate a suitable font when the + * actual contents of the string are not known. + * + * Note that some fonts lie about the characters they support. Additionally, + * fonts don't usually contain glyphs for control characters such as tabs + * and line breaks, so it is rare that you will get back a full 1.0 score. + * The resulting value should be considered informational only. + * + * @param string $string + * @param string $charEncoding (optional) Character encoding of source text. + * If omitted, uses 'current locale'. + * @return float + */ + abstract public function getCoveredPercentage($string, $charEncoding = ''); + + /** + * Returns the widths of the glyphs. + * + * The widths are expressed in the font's glyph space. You are responsible + * for converting to user space as necessary. See {@link unitsPerEm()}. + * + * See also {@link widthForGlyph()}. + * + * @param array $glyphNumbers Array of glyph numbers. + * @return array Array of glyph widths (integers). + * @throws Zend_Pdf_Exception + */ + abstract public function widthsForGlyphs($glyphNumbers); + + /** + * Returns the width of the glyph. + * + * Like {@link widthsForGlyphs()} but used for one glyph at a time. + * + * @param integer $glyphNumber + * @return integer + * @throws Zend_Pdf_Exception + */ + abstract public function widthForGlyph($glyphNumber); + + /** + * Convert string to the font encoding. + * + * The method is used to prepare string for text drawing operators + * + * @param string $string + * @param string $charEncoding Character encoding of source text. + * @return string + */ + abstract public function encodeString($string, $charEncoding); + + /** + * Convert string from the font encoding. + * + * The method is used to convert strings retrieved from existing content streams + * + * @param string $string + * @param string $charEncoding Character encoding of resulting text. + * @return string + */ + abstract public function decodeString($string, $charEncoding); + + + + /**** Internal Methods ****/ + + + /** + * If the font's glyph space is not 1000 units per em, converts the value. + * + * @internal + * @param integer $value + * @return integer + */ + public function toEmSpace($value) + { + if ($this->_unitsPerEm == 1000) { + return $value; + } + return ceil(($value / $this->_unitsPerEm) * 1000); // always round up + } +} + diff --git a/libs/Zend/Pdf/Resource/Font/CidFont.php b/libs/Zend/Pdf/Resource/Font/CidFont.php new file mode 100644 index 0000000..06e775b --- /dev/null +++ b/libs/Zend/Pdf/Resource/Font/CidFont.php @@ -0,0 +1,482 @@ +parse(); + + + /* Object properties */ + + $this->_fontNames = $fontParser->names; + + $this->_isBold = $fontParser->isBold; + $this->_isItalic = $fontParser->isItalic; + $this->_isMonospaced = $fontParser->isMonospaced; + + $this->_underlinePosition = $fontParser->underlinePosition; + $this->_underlineThickness = $fontParser->underlineThickness; + $this->_strikePosition = $fontParser->strikePosition; + $this->_strikeThickness = $fontParser->strikeThickness; + + $this->_unitsPerEm = $fontParser->unitsPerEm; + + $this->_ascent = $fontParser->ascent; + $this->_descent = $fontParser->descent; + $this->_lineGap = $fontParser->lineGap; + + + $this->_cmap = $fontParser->cmap; + + + /* Resource dictionary */ + + $baseFont = $this->getFontName(Zend_Pdf_Font::NAME_POSTSCRIPT, 'en', 'UTF-8'); + $this->_resource->BaseFont = new Zend_Pdf_Element_Name($baseFont); + + + /** + * Prepare widths array. + */ + /* Constract characters widths array using font CMap and glyphs widths array */ + $glyphWidths = $fontParser->glyphWidths; + $charGlyphs = $this->_cmap->getCoveredCharactersGlyphs(); + $charWidths = array(); + foreach ($charGlyphs as $charCode => $glyph) { + $charWidths[$charCode] = $glyphWidths[$glyph]; + } + $this->_charWidths = $charWidths; + $this->_missingCharWidth = $glyphWidths[0]; + + /* Width array optimization. Step1: extract default value */ + $widthFrequencies = array_count_values($charWidths); + $defaultWidth = null; + $defaultWidthFrequency = -1; + foreach ($widthFrequencies as $width => $frequency) { + if ($frequency > $defaultWidthFrequency) { + $defaultWidth = $width; + $defaultWidthFrequency = $frequency; + } + } + + // 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); + + /* Width array optimization. Step2: Compact character codes sequences */ + $lastCharCode = -1; + $widthsSequences = array(); + foreach ($charWidths as $charCode => $width) { + if ($lastCharCode == -1) { + $charCodesSequense = array(); + $sequenceStartCode = $charCode; + } else if ($charCode != $lastCharCode + 1) { + // New chracters sequence detected + $widthsSequences[$sequenceStartCode] = $charCodesSequense; + $charCodesSequense = array(); + $sequenceStartCode = $charCode; + } + $charCodesSequense[] = $width; + $lastCharCode = $charCode; + } + // 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) { + /* Width array optimization. Step3: Compact widths sequences */ + $pdfWidths = array(); + $lastWidth = -1; + $widthsInSequence = 0; + foreach ($widthsSequence as $width) { + if ($lastWidth != $width) { + // New width is detected + if ($widthsInSequence != 0) { + // 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 + + // Reset widths sequence + $startCode = $startCode + $widthsInSequence; + $widthsInSequence = 0; + } + + // Collect new width + $pdfWidths[] = new Zend_Pdf_Element_Numeric($this->toEmSpace($width)); + + $lastWidth = $width; + } else { + // Width is equal to previous + if (count($pdfWidths) != 0) { + // 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 + if (count($pdfWidths) != 0) { + // Save it as 'c_1st [w1 w2 ... wn]'. + $pdfCharsWidths[] = new Zend_Pdf_Element_Numeric($startCode); // First character code + $pdfCharsWidths[] = new Zend_Pdf_Element_Array($pdfWidths); // Widths array + + // Reset widths collection + $startCode += count($pdfWidths); + $pdfWidths = array(); + } + + $widthsInSequence = 2; + } else { + // Continue widths sequence + $widthsInSequence++; + } + } + } + + // Check if we have widths collection or widths sequence to wite it down + if (count($pdfWidths) != 0) { + // We have some widths collected + // Save it as 'c_1st [w1 w2 ... wn]'. + $pdfCharsWidths[] = new Zend_Pdf_Element_Numeric($startCode); // First character code + $pdfCharsWidths[] = new Zend_Pdf_Element_Array($pdfWidths); // Widths array + } else if ($widthsInSequence != 0){ + // We have 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 + } + } + + /* Create the Zend_Pdf_Element_Array object and add it to the font's + * object factory and resource dictionary. + */ + $widthsArrayElement = new Zend_Pdf_Element_Array($pdfCharsWidths); + $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'); + $cidSystemInfo->Ordering = new Zend_Pdf_Element_String('UCS'); + $cidSystemInfo->Supplement = new Zend_Pdf_Element_Numeric(0); + $cidSystemInfoObject = $this->_objectFactory->newObject($cidSystemInfo); + $this->_resource->CIDSystemInfo = $cidSystemInfoObject; + } + + + + /** + * Returns an array of glyph numbers corresponding to the Unicode characters. + * + * If a particular character doesn't exist in this font, the special 'missing + * character glyph' will be substituted. + * + * See also {@link glyphNumberForCharacter()}. + * + * @param array $characterCodes Array of Unicode character codes (code points). + * @return array Array of glyph numbers. + */ + 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 + * it cannot be used as the operand of the Tf operator. + * + * Throw an exception. + */ + throw new Zend_Pdf_Exception('CIDFont PDF objects could not be used as the operand of the text drawing operators'); + } + + /** + * Returns the glyph number corresponding to the Unicode character. + * + * If a particular character doesn't exist in this font, the special 'missing + * character glyph' will be substituted. + * + * See also {@link glyphNumbersForCharacters()} which is optimized for bulk + * operations. + * + * @param integer $characterCode Unicode character code (code point). + * @return integer Glyph number. + */ + 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 + * it cannot be used as the operand of the Tf operator. + * + * Throw an exception. + */ + throw new Zend_Pdf_Exception('CIDFont PDF objects could not be used as the operand of the text drawing operators'); + } + + + /** + * 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. + * + * Since no one font will contain glyphs for the entire Unicode character + * range, this method can be used to help locate a suitable font when the + * actual contents of the string are not known. + * + * Note that some fonts lie about the characters they support. Additionally, + * fonts don't usually contain glyphs for control characters such as tabs + * and line breaks, so it is rare that you will get back a full 1.0 score. + * The resulting value should be considered informational only. + * + * @param string $string + * @param string $charEncoding (optional) Character encoding of source text. + * If omitted, uses 'current locale'. + * @return float + */ + public function getCoveredPercentage($string, $charEncoding = '') + { + /* Convert the string to UTF-16BE encoding so we can match the string's + * character codes to those found in the cmap. + */ + if ($charEncoding != 'UTF-16BE') { + $string = iconv($charEncoding, 'UTF-16BE', $string); + } + + $charCount = iconv_strlen($string, 'UTF-16BE'); + if ($charCount == 0) { + return 0; + } + + /* Calculate the score by doing a lookup for each character. + */ + $score = 0; + $maxIndex = strlen($string); + for ($i = 0; $i < $maxIndex; $i++) { + /** + * @todo Properly handle characters encoded as surrogate pairs. + */ + $charCode = (ord($string[$i]) << 8) | ord($string[++$i]); + /* This could probably be optimized a bit with a binary search... + */ + if (isset($this->_charWidths[$charCode])) { + $score++; + } + } + return $score / $charCount; + } + + /** + * Returns the widths of the Chars. + * + * The widths are expressed in the font's glyph space. You are responsible + * for converting to user space as necessary. See {@link unitsPerEm()}. + * + * See also {@link widthForChar()}. + * + * @param array &$glyphNumbers Array of glyph numbers. + * @return array Array of glyph widths (integers). + */ + public function widthsForChars($charCodes) + { + $widths = array(); + foreach ($charCodes as $key => $charCode) { + if (!isset($this->_charWidths[$charCode])) { + $widths[$key] = $this->_missingCharWidth; + } else { + $widths[$key] = $this->_charWidths[$charCode]; + } + } + return $widths; + } + + /** + * Returns the width of the character. + * + * Like {@link widthsForChars()} but used for one char at a time. + * + * @param integer $charCode + * @return integer + */ + public function widthForChar($charCode) + { + if (!isset($this->_charWidths[$charCode])) { + return $this->_missingCharWidth; + } + return $this->_charWidths[$charCode]; + } + + /** + * Returns the widths of the glyphs. + * + * @param array &$glyphNumbers Array of glyph numbers. + * @return array Array of glyph widths (integers). + * @throws Zend_Pdf_Exception + */ + 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 + * it cannot be used as the operand of the Tf operator. + * + * Throw an exception. + */ + throw new Zend_Pdf_Exception('CIDFont PDF objects could not be used as the operand of the text drawing operators'); + } + + /** + * Returns the width of the glyph. + * + * Like {@link widthsForGlyphs()} but used for one glyph at a time. + * + * @param integer $glyphNumber + * @return integer + * @throws Zend_Pdf_Exception + */ + 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 + * it cannot be used as the operand of the Tf operator. + * + * Throw an exception. + */ + throw new Zend_Pdf_Exception('CIDFont PDF objects could not be used as the operand of the text drawing operators'); + } + + /** + * Convert string to the font encoding. + * + * @param string $string + * @param string $charEncoding Character encoding of source text. + * @return string + * @throws Zend_Pdf_Exception + * */ + 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 + * it cannot be used as the operand of the Tf operator. + * + * Throw an exception. + */ + throw new Zend_Pdf_Exception('CIDFont PDF objects could not be used as the operand of the text drawing operators'); + } + + /** + * Convert string from the font encoding. + * + * @param string $string + * @param string $charEncoding Character encoding of resulting text. + * @return string + * @throws Zend_Pdf_Exception + */ + 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 + * it cannot be used as the operand of the Tf operator. + * + * Throw an exception. + */ + 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 new file mode 100644 index 0000000..0283843 --- /dev/null +++ b/libs/Zend/Pdf/Resource/Font/CidFont/TrueType.php @@ -0,0 +1,81 @@ +_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); + + /* Prepare CIDToGIDMap */ + // Initialize 128K string of null characters (65536 2 byte integers) + $cidToGidMapData = str_repeat("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 8192); + // Fill the index + $charGlyphs = $this->_cmap->getCoveredCharactersGlyphs(); + foreach ($charGlyphs as $charCode => $glyph) { + $cidToGidMapData[$charCode*2 ] = chr($glyph >> 8); + $cidToGidMapData[$charCode*2 + 1] = chr($glyph & 0xFF); + } + // Store CIDToGIDMap within compressed stream object + $cidToGidMap = $this->_objectFactory->newStreamObject($cidToGidMapData); + $cidToGidMap->dictionary->Filter = new Zend_Pdf_Element_Name('FlateDecode'); + $this->_resource->CIDToGIDMap = $cidToGidMap; + } + +} diff --git a/libs/Zend/Pdf/Resource/Font/Extracted.php b/libs/Zend/Pdf/Resource/Font/Extracted.php new file mode 100644 index 0000000..67d1119 --- /dev/null +++ b/libs/Zend/Pdf/Resource/Font/Extracted.php @@ -0,0 +1,261 @@ +_objectFactory = $fontDictionary->getFactory(); + $this->_resource = $fontDictionary; + + if ($fontDictionary->Encoding !== null) { + $this->_encoding = $fontDictionary->Encoding->value; + } + + switch ($fontDictionary->Subtype->value) { + case 'Type0': + // Composite type 0 font + if ($fontDictionary->DescendantFonts->items->count() != 1) { + // Multiple descendant fonts are not supported + throw new Zend_Pdf_Exception('Unsupported font type.'); + } + + $descFontsArrayItems = $fontDictionary->DescendantFonts->items; + $descFontsArrayItems->rewind(); + + $descendantFont = $descFontsArrayItems->current(); + $fontDescriptor = $descendantFont->FontDescriptor; + break; + + case 'Type1': + if ($fontDictionary->FontDescriptor === null) { + // That's one of the standard fonts + $standardFont = Zend_Pdf_Font::fontWithName($fontDictionary->BaseFont->value); + + $this->_fontNames = $standardFont->getFontNames(); + $this->_isBold = $standardFont->isBold(); + $this->_isItalic = $standardFont->isItalic(); + $this->_isMonospace = $standardFont->isMonospace(); + $this->_underlinePosition = $standardFont->getUnderlinePosition(); + $this->_underlineThickness = $standardFont->getUnderlineThickness(); + $this->_strikePosition = $standardFont->getStrikePosition(); + $this->_strikeThickness = $standardFont->getStrikeThickness(); + $this->_unitsPerEm = $standardFont->getUnitsPerEm(); + $this->_ascent = $standardFont->getAscent(); + $this->_descent = $standardFont->getDescent(); + $this->_lineGap = $standardFont->getLineGap(); + + return; + } + + $fontDescriptor = $fontDictionary->FontDescriptor; + break; + + case 'TrueType': + $fontDescriptor = $fontDictionary->FontDescriptor; + break; + + default: + throw new Zend_Pdf_Exception('Unsupported font type.'); + } + + $this->_fontNames[Zend_Pdf_Font::NAME_POSTSCRIPT]['en'] = iconv('UTF-8', 'UTF-16BE', $fontDictionary->BaseFont->value); + + $this->_isBold = false; // this property is actually not used anywhere + $this->_isItalic = ( ($fontDescriptor->Flags->value & (1 << 6)) != 0 ); // Bit-7 is set + $this->_isMonospace = ( ($fontDescriptor->Flags->value & (1 << 0)) != 0 ); // Bit-1 is set + $this->_underlinePosition = null; // Can't be extracted + $this->_underlineThickness = null; // Can't be extracted + $this->_strikePosition = null; // Can't be extracted + $this->_strikeThickness = null; // Can't be extracted + $this->_unitsPerEm = null; // Can't be extracted + $this->_ascent = $fontDescriptor->Ascent->value; + $this->_descent = $fontDescriptor->Descent->value; + $this->_lineGap = null; // Can't be extracted + } + + /** + * Returns an array of glyph numbers corresponding to the Unicode characters. + * + * If a particular character doesn't exist in this font, the special 'missing + * character glyph' will be substituted. + * + * See also {@link glyphNumberForCharacter()}. + * + * @param array $characterCodes Array of Unicode character codes (code points). + * @return array Array of glyph numbers. + */ + public function glyphNumbersForCharacters($characterCodes) + { + throw new Zend_Pdf_Exception('Operation is not supported for extracted fonts'); + } + + /** + * Returns the glyph number corresponding to the Unicode character. + * + * If a particular character doesn't exist in this font, the special 'missing + * character glyph' will be substituted. + * + * See also {@link glyphNumbersForCharacters()} which is optimized for bulk + * operations. + * + * @param integer $characterCode Unicode character code (code point). + * @return integer Glyph number. + */ + public function glyphNumberForCharacter($characterCode) + { + throw new Zend_Pdf_Exception('Operation is not supported for extracted fonts'); + } + + /** + * 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. + * + * Since no one font will contain glyphs for the entire Unicode character + * range, this method can be used to help locate a suitable font when the + * actual contents of the string are not known. + * + * Note that some fonts lie about the characters they support. Additionally, + * fonts don't usually contain glyphs for control characters such as tabs + * and line breaks, so it is rare that you will get back a full 1.0 score. + * The resulting value should be considered informational only. + * + * @param string $string + * @param string $charEncoding (optional) Character encoding of source text. + * If omitted, uses 'current locale'. + * @return float + */ + public function getCoveredPercentage($string, $charEncoding = '') + { + throw new Zend_Pdf_Exception('Operation is not supported for extracted fonts'); + } + + /** + * Returns the widths of the glyphs. + * + * The widths are expressed in the font's glyph space. You are responsible + * for converting to user space as necessary. See {@link unitsPerEm()}. + * + * See also {@link widthForGlyph()}. + * + * @param array $glyphNumbers Array of glyph numbers. + * @return array Array of glyph widths (integers). + * @throws Zend_Pdf_Exception + */ + public function widthsForGlyphs($glyphNumbers) + { + throw new Zend_Pdf_Exception('Operation is not supported for extracted fonts'); + } + + /** + * Returns the width of the glyph. + * + * Like {@link widthsForGlyphs()} but used for one glyph at a time. + * + * @param integer $glyphNumber + * @return integer + * @throws Zend_Pdf_Exception + */ + public function widthForGlyph($glyphNumber) + { + throw new Zend_Pdf_Exception('Operation is not supported for extracted fonts'); + } + + /** + * Convert string to the font encoding. + * + * The method is used to prepare string for text drawing operators + * + * @param string $string + * @param string $charEncoding Character encoding of source text. + * @return string + */ + public function encodeString($string, $charEncoding) + { + if ($this->_encoding == 'Identity-H') { + return iconv($charEncoding, 'UTF-16BE', $string); + } + + if ($this->_encoding == 'WinAnsiEncoding') { + return iconv($charEncoding, 'CP1252//IGNORE', $string); + } + + throw new Zend_Pdf_Exception('Fonf encoding is not supported'); + } + + /** + * Convert string from the font encoding. + * + * The method is used to convert strings retrieved from existing content streams + * + * @param string $string + * @param string $charEncoding Character encoding of resulting text. + * @return string + */ + public function decodeString($string, $charEncoding) + { + if ($this->_encoding == 'Identity-H') { + return iconv('UTF-16BE', $charEncoding, $string); + } + + if ($this->_encoding == 'WinAnsiEncoding') { + return iconv('CP1252', $charEncoding, $string); + } + + 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 new file mode 100644 index 0000000..9d0e5a0 --- /dev/null +++ b/libs/Zend/Pdf/Resource/Font/FontDescriptor.php @@ -0,0 +1,199 @@ +Type = new Zend_Pdf_Element_Name('FontDescriptor'); + $fontDescriptor->FontName = new Zend_Pdf_Element_Name($font->getResource()->BaseFont->value); + + /* The font flags value is a bitfield that describes the stylistic + * attributes of the font. We will set as many of the bits as can be + * determined from the font parser. + */ + $flags = 0; + if ($fontParser->isMonospaced) { // bit 1: FixedPitch + $flags |= 1 << 0; + } + if ($fontParser->isSerifFont) { // bit 2: Serif + $flags |= 1 << 1; + } + if (! $fontParser->isAdobeLatinSubset) { // bit 3: Symbolic + $flags |= 1 << 2; + } + if ($fontParser->isScriptFont) { // bit 4: Script + $flags |= 1 << 3; + } + if ($fontParser->isAdobeLatinSubset) { // bit 6: Nonsymbolic + $flags |= 1 << 5; + } + if ($fontParser->isItalic) { // bit 7: Italic + $flags |= 1 << 6; + } + // bits 17-19: AllCap, SmallCap, ForceBold; not available + $fontDescriptor->Flags = new Zend_Pdf_Element_Numeric($flags); + + $fontBBox = array(new Zend_Pdf_Element_Numeric($font->toEmSpace($fontParser->xMin)), + new Zend_Pdf_Element_Numeric($font->toEmSpace($fontParser->yMin)), + new Zend_Pdf_Element_Numeric($font->toEmSpace($fontParser->xMax)), + new Zend_Pdf_Element_Numeric($font->toEmSpace($fontParser->yMax))); + $fontDescriptor->FontBBox = new Zend_Pdf_Element_Array($fontBBox); + + $fontDescriptor->ItalicAngle = new Zend_Pdf_Element_Numeric($fontParser->italicAngle); + + $fontDescriptor->Ascent = new Zend_Pdf_Element_Numeric($font->toEmSpace($fontParser->ascent)); + $fontDescriptor->Descent = new Zend_Pdf_Element_Numeric($font->toEmSpace($fontParser->descent)); + + $fontDescriptor->CapHeight = new Zend_Pdf_Element_Numeric($fontParser->capitalHeight); + /** + * The vertical stem width is not yet extracted from the OpenType font + * file. For now, record zero which is interpreted as 'unknown'. + * @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 + * is embedded within the PDF document. + * + * Note that it is not requried that fonts be embedded within the PDF + * document 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. + * + * There are several guidelines for font embedding: + * + * First, the developer might specifically request not to embed the font. + */ + if (!($embeddingOptions & Zend_Pdf_Font::EMBED_DONT_EMBED)) { + + /* Second, the font author may have set copyright bits that prohibit + * the font program from being embedded. Yes this is controversial, + * but it's the rules: + * http://partners.adobe.com/public/developer/en/acrobat/sdk/FontPolicies.pdf + * + * To keep the developer in the loop, and to prevent surprising bug + * reports of "your PDF doesn't have the right fonts," throw an + * exception if the font cannot be embedded. + */ + if (! $fontParser->isEmbeddable) { + /* This exception may be suppressed if the developer decides that + * it's not a big deal that the font program can't be embedded. + */ + if (!($embeddingOptions & Zend_Pdf_Font::EMBED_SUPPRESS_EMBED_EXCEPTION)) { + $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.'; + throw new Zend_Pdf_Exception($message, Zend_Pdf_Exception::FONT_CANT_BE_EMBEDDED); + } + + } else { + /* Otherwise, the default behavior is to embed all custom fonts. + */ + /* This section will change soon to a stream object data + * provider model so that we don't have to keep a copy of the + * entire font in memory. + * + * We also cannot build font subsetting until the data provider + * model is in place. + */ + $fontFile = $fontParser->getDataSource()->readAllBytes(); + $fontFileObject = $font->getFactory()->newStreamObject($fontFile); + $fontFileObject->dictionary->Length1 = new Zend_Pdf_Element_Numeric(strlen($fontFile)); + if (!($embeddingOptions & Zend_Pdf_Font::EMBED_DONT_COMPRESS)) { + /* Compress the font file using Flate. This generally cuts file + * sizes by about half! + */ + $fontFileObject->dictionary->Filter = new Zend_Pdf_Element_Name('FlateDecode'); + } + if ($fontParser instanceof Zend_Pdf_FileParser_Font_OpenType_Type1 /* not implemented now */) { + $fontDescriptor->FontFile = $fontFileObject; + } else if ($fontParser instanceof Zend_Pdf_FileParser_Font_OpenType_TrueType) { + $fontDescriptor->FontFile2 = $fontFileObject; + } else { + $fontDescriptor->FontFile3 = $fontFileObject; + } + } + } + + return $fontDescriptor; + } +} diff --git a/libs/Zend/Pdf/Resource/Font/Simple.php b/libs/Zend/Pdf/Resource/Font/Simple.php new file mode 100644 index 0000000..bec3038 --- /dev/null +++ b/libs/Zend/Pdf/Resource/Font/Simple.php @@ -0,0 +1,281 @@ +_resource->Encoding = new Zend_Pdf_Element_Name('WinAnsiEncoding'); + } + + /** + * Returns an array of glyph numbers corresponding to the Unicode characters. + * + * If a particular character doesn't exist in this font, the special 'missing + * character glyph' will be substituted. + * + * See also {@link glyphNumberForCharacter()}. + * + * @param array $characterCodes Array of Unicode character codes (code points). + * @return array Array of glyph numbers. + */ + public function glyphNumbersForCharacters($characterCodes) + { + return $this->_cmap->glyphNumbersForCharacters($characterCodes); + } + + /** + * Returns the glyph number corresponding to the Unicode character. + * + * If a particular character doesn't exist in this font, the special 'missing + * character glyph' will be substituted. + * + * See also {@link glyphNumbersForCharacters()} which is optimized for bulk + * operations. + * + * @param integer $characterCode Unicode character code (code point). + * @return integer Glyph number. + */ + public function glyphNumberForCharacter($characterCode) + { + return $this->_cmap->glyphNumberForCharacter($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. + * + * Since no one font will contain glyphs for the entire Unicode character + * range, this method can be used to help locate a suitable font when the + * actual contents of the string are not known. + * + * Note that some fonts lie about the characters they support. Additionally, + * fonts don't usually contain glyphs for control characters such as tabs + * and line breaks, so it is rare that you will get back a full 1.0 score. + * The resulting value should be considered informational only. + * + * @param string $string + * @param string $charEncoding (optional) Character encoding of source text. + * If omitted, uses 'current locale'. + * @return float + */ + public function getCoveredPercentage($string, $charEncoding = '') + { + /* Convert the string to UTF-16BE encoding so we can match the string's + * character codes to those found in the cmap. + */ + if ($charEncoding != 'UTF-16BE') { + if (PHP_OS != 'AIX') { // AIX doesnt know what UTF-16BE is + $string = iconv($charEncoding, 'UTF-16BE', $string); + } + } + + $charCount = (PHP_OS != 'AIX') ? iconv_strlen($string, 'UTF-16BE') : strlen($string); + if ($charCount == 0) { + return 0; + } + + /* Fetch the covered character code list from the font's cmap. + */ + $coveredCharacters = $this->_cmap->getCoveredCharacters(); + + /* Calculate the score by doing a lookup for each character. + */ + $score = 0; + $maxIndex = strlen($string); + for ($i = 0; $i < $maxIndex; $i++) { + /** + * @todo Properly handle characters encoded as surrogate pairs. + */ + $charCode = (ord($string[$i]) << 8) | ord($string[++$i]); + /* This could probably be optimized a bit with a binary search... + */ + if (in_array($charCode, $coveredCharacters)) { + $score++; + } + } + return $score / $charCount; + } + + /** + * Returns the widths of the glyphs. + * + * The widths are expressed in the font's glyph space. You are responsible + * for converting to user space as necessary. See {@link unitsPerEm()}. + * + * See also {@link widthForGlyph()}. + * + * @param array &$glyphNumbers Array of glyph numbers. + * @return array Array of glyph widths (integers). + */ + public function widthsForGlyphs($glyphNumbers) + { + $widths = array(); + foreach ($glyphNumbers as $key => $glyphNumber) { + if (!isset($this->_glyphWidths[$glyphNumber])) { + $widths[$key] = $this->_missingGlyphWidth; + } else { + $widths[$key] = $this->_glyphWidths[$glyphNumber]; + } + } + return $widths; + } + + /** + * Returns the width of the glyph. + * + * Like {@link widthsForGlyphs()} but used for one glyph at a time. + * + * @param integer $glyphNumber + * @return integer + */ + public function widthForGlyph($glyphNumber) + { + if (!isset($this->_glyphWidths[$glyphNumber])) { + return $this->_missingGlyphWidth; + } + return $this->_glyphWidths[$glyphNumber]; + } + + /** + * Convert string to the font encoding. + * + * The method is used to prepare string for text drawing operators + * + * @param string $string + * @param string $charEncoding Character encoding of source text. + * @return string + */ + public function encodeString($string, $charEncoding) + { + if (PHP_OS == 'AIX') { + return $string; // returning here b/c AIX doesnt know what CP1252 is + } + + return iconv($charEncoding, 'CP1252//IGNORE', $string); + } + + /** + * Convert string from the font encoding. + * + * The method is used to convert strings retrieved from existing content streams + * + * @param string $string + * @param string $charEncoding Character encoding of resulting text. + * @return string + */ + public function decodeString($string, $charEncoding) + { + return iconv('CP1252', $charEncoding, $string); + } +} diff --git a/libs/Zend/Pdf/Resource/Font/Simple/Parsed.php b/libs/Zend/Pdf/Resource/Font/Simple/Parsed.php new file mode 100644 index 0000000..8de4c36 --- /dev/null +++ b/libs/Zend/Pdf/Resource/Font/Simple/Parsed.php @@ -0,0 +1,101 @@ +parse(); + + /* Object properties */ + + $this->_fontNames = $fontParser->names; + + $this->_isBold = $fontParser->isBold; + $this->_isItalic = $fontParser->isItalic; + $this->_isMonospaced = $fontParser->isMonospaced; + + $this->_underlinePosition = $fontParser->underlinePosition; + $this->_underlineThickness = $fontParser->underlineThickness; + $this->_strikePosition = $fontParser->strikePosition; + $this->_strikeThickness = $fontParser->strikeThickness; + + $this->_unitsPerEm = $fontParser->unitsPerEm; + + $this->_ascent = $fontParser->ascent; + $this->_descent = $fontParser->descent; + $this->_lineGap = $fontParser->lineGap; + + $this->_glyphWidths = $fontParser->glyphWidths; + $this->_missingGlyphWidth = $this->_glyphWidths[0]; + + + $this->_cmap = $fontParser->cmap; + + + /* Resource dictionary */ + + $baseFont = $this->getFontName(Zend_Pdf_Font::NAME_POSTSCRIPT, 'en', 'UTF-8'); + $this->_resource->BaseFont = new Zend_Pdf_Element_Name($baseFont); + + $this->_resource->FirstChar = new Zend_Pdf_Element_Numeric(0); + $this->_resource->LastChar = new Zend_Pdf_Element_Numeric(count($this->_glyphWidths) - 1); + + /* Now convert the scalar glyph widths to Zend_Pdf_Element_Numeric objects. + */ + $pdfWidths = array(); + foreach ($this->_glyphWidths as $width) { + $pdfWidths[] = new Zend_Pdf_Element_Numeric($this->toEmSpace($width)); + } + /* Create the Zend_Pdf_Element_Array object and add it to the font's + * object factory and resource dictionary. + */ + $widthsArrayElement = new Zend_Pdf_Element_Array($pdfWidths); + $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 new file mode 100644 index 0000000..fecf9f8 --- /dev/null +++ b/libs/Zend/Pdf/Resource/Font/Simple/Parsed/TrueType.php @@ -0,0 +1,62 @@ +_fontType = Zend_Pdf_Font::TYPE_TRUETYPE; + + $this->_resource->Subtype = new Zend_Pdf_Element_Name('TrueType'); + + $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/Simple/Standard.php b/libs/Zend/Pdf/Resource/Font/Simple/Standard.php new file mode 100644 index 0000000..c7f1cf8 --- /dev/null +++ b/libs/Zend/Pdf/Resource/Font/Simple/Standard.php @@ -0,0 +1,77 @@ + + *
  • Courier - {@link Zend_Pdf_Resource_Font_Simple_Standard_Courier} + *
  • Courier-Bold - {@link Zend_Pdf_Resource_Font_Simple_Standard_CourierBold} + *
  • Courier-Oblique - {@link Zend_Pdf_Resource_Font_Simple_Standard_CourierOblique} + *
  • Courier-BoldOblique - {@link Zend_Pdf_Resource_Font_Simple_Standard_CourierBoldOblique} + *
  • Helvetica - {@link Zend_Pdf_Resource_Font_Simple_Standard_Helvetica} + *
  • Helvetica-Bold - {@link Zend_Pdf_Resource_Font_Simple_Standard_HelveticaBold} + *
  • Helvetica-Oblique - {@link Zend_Pdf_Resource_Font_Simple_Standard_HelveticaOblique} + *
  • Helvetica-BoldOblique - {@link Zend_Pdf_Resource_Font_Simple_Standard_HelveticaBoldOblique} + *
  • Symbol - {@link Zend_Pdf_Resource_Font_Simple_Standard_Symbol} + *
  • Times - {@link Zend_Pdf_Resource_Font_Simple_Standard_Times} + *
  • Times-Bold - {@link Zend_Pdf_Resource_Font_Simple_Standard_TimesBold} + *
  • Times-Italic - {@link Zend_Pdf_Resource_Font_Simple_Standard_TimesItalic} + *
  • Times-BoldItalic - {@link Zend_Pdf_Resource_Font_Simple_Standard_TimesBoldItalic} + *
  • ZapfDingbats - {@link Zend_Pdf_Resource_Font_Simple_Standard_ZapfDingbats} + * + * + * Font objects should be normally be obtained from the factory methods + * {@link Zend_Pdf_Font::fontWithName} and {@link Zend_Pdf_Font::fontWithPath}. + * + * @package Zend_Pdf + * @subpackage Fonts + * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ +abstract class Zend_Pdf_Resource_Font_Simple_Standard extends Zend_Pdf_Resource_Font_Simple +{ + /**** Public Interface ****/ + + + /* Object Lifecycle */ + + /** + * Object constructor + */ + public function __construct() + { + $this->_fontType = Zend_Pdf_Font::TYPE_STANDARD; + + 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 new file mode 100644 index 0000000..85c958d --- /dev/null +++ b/libs/Zend/Pdf/Resource/Font/Simple/Standard/Courier.php @@ -0,0 +1,289 @@ +_fontNames[Zend_Pdf_Font::NAME_COPYRIGHT]['en'] = + "\x00\x43\x00\x6f\x00\x70\x00\x79\x00\x72\x00\x69\x00\x67\x00\x68\x00" + . "\x74\x00\x20\x00\x28\x00\x63\x00\x29\x00\x20\x00\x31\x00\x39\x00" + . "\x38\x00\x39\x00\x2c\x00\x20\x00\x31\x00\x39\x00\x39\x00\x30\x00" + . "\x2c\x00\x20\x00\x31\x00\x39\x00\x39\x00\x31\x00\x2c\x00\x20\x00" + . "\x31\x00\x39\x00\x39\x00\x32\x00\x2c\x00\x20\x00\x31\x00\x39\x00" + . "\x39\x00\x33\x00\x2c\x00\x20\x00\x31\x00\x39\x00\x39\x00\x37\x00" + . "\x20\x00\x41\x00\x64\x00\x6f\x00\x62\x00\x65\x00\x20\x00\x53\x00" + . "\x79\x00\x73\x00\x74\x00\x65\x00\x6d\x00\x73\x00\x20\x00\x49\x00" + . "\x6e\x00\x63\x00\x6f\x00\x72\x00\x70\x00\x6f\x00\x72\x00\x61\x00" + . "\x74\x00\x65\x00\x64\x00\x2e\x00\x20\x00\x20\x00\x41\x00\x6c\x00" + . "\x6c\x00\x20\x00\x52\x00\x69\x00\x67\x00\x68\x00\x74\x00\x73\x00" + . "\x20\x00\x52\x00\x65\x00\x73\x00\x65\x00\x72\x00\x76\x00\x65\x00" + . "\x64\x00\x2e"; + $this->_fontNames[Zend_Pdf_Font::NAME_FAMILY]['en'] = + "\x00\x43\x00\x6f\x00\x75\x00\x72\x00\x69\x00\x65\x00\x72"; + $this->_fontNames[Zend_Pdf_Font::NAME_STYLE]['en'] = + "\x00\x4d\x00\x65\x00\x64\x00\x69\x00\x75\x00\x6d"; + $this->_fontNames[Zend_Pdf_Font::NAME_ID]['en'] = + "\x00\x34\x00\x33\x00\x30\x00\x35\x00\x30"; + $this->_fontNames[Zend_Pdf_Font::NAME_FULL]['en'] = + "\x00\x43\x00\x6f\x00\x75\x00\x72\x00\x69\x00\x65\x00\x72\x00\x20\x00" + . "\x4d\x00\x65\x00\x64\x00\x69\x00\x75\x00\x6d"; + $this->_fontNames[Zend_Pdf_Font::NAME_VERSION]['en'] = + "\x00\x30\x00\x30\x00\x33\x00\x2e\x00\x30\x00\x30\x00\x30"; + $this->_fontNames[Zend_Pdf_Font::NAME_POSTSCRIPT]['en'] = + "\x00\x43\x00\x6f\x00\x75\x00\x72\x00\x69\x00\x65\x00\x72"; + + $this->_isBold = false; + $this->_isItalic = false; + $this->_isMonospaced = true; + + $this->_underlinePosition = -100; + $this->_underlineThickness = 50; + $this->_strikePosition = 225; + $this->_strikeThickness = 50; + + $this->_unitsPerEm = 1000; + + $this->_ascent = 629; + $this->_descent = -157; + $this->_lineGap = 414; + + /* The glyph numbers assigned here are synthetic; they do not match the + * actual glyph numbers used by the font. This is not a big deal though + * since this data never makes it to the PDF file. It is only used + * internally for layout calculations. + */ + $this->_glyphWidths = array( + 0x00 => 0x01f4, 0x01 => 0x0258, 0x02 => 0x0258, 0x03 => 0x0258, + 0x04 => 0x0258, 0x05 => 0x0258, 0x06 => 0x0258, 0x07 => 0x0258, + 0x08 => 0x0258, 0x09 => 0x0258, 0x0a => 0x0258, 0x0b => 0x0258, + 0x0c => 0x0258, 0x0d => 0x0258, 0x0e => 0x0258, 0x0f => 0x0258, + 0x10 => 0x0258, 0x11 => 0x0258, 0x12 => 0x0258, 0x13 => 0x0258, + 0x14 => 0x0258, 0x15 => 0x0258, 0x16 => 0x0258, 0x17 => 0x0258, + 0x18 => 0x0258, 0x19 => 0x0258, 0x1a => 0x0258, 0x1b => 0x0258, + 0x1c => 0x0258, 0x1d => 0x0258, 0x1e => 0x0258, 0x1f => 0x0258, + 0x20 => 0x0258, 0x21 => 0x0258, 0x22 => 0x0258, 0x23 => 0x0258, + 0x24 => 0x0258, 0x25 => 0x0258, 0x26 => 0x0258, 0x27 => 0x0258, + 0x28 => 0x0258, 0x29 => 0x0258, 0x2a => 0x0258, 0x2b => 0x0258, + 0x2c => 0x0258, 0x2d => 0x0258, 0x2e => 0x0258, 0x2f => 0x0258, + 0x30 => 0x0258, 0x31 => 0x0258, 0x32 => 0x0258, 0x33 => 0x0258, + 0x34 => 0x0258, 0x35 => 0x0258, 0x36 => 0x0258, 0x37 => 0x0258, + 0x38 => 0x0258, 0x39 => 0x0258, 0x3a => 0x0258, 0x3b => 0x0258, + 0x3c => 0x0258, 0x3d => 0x0258, 0x3e => 0x0258, 0x3f => 0x0258, + 0x40 => 0x0258, 0x41 => 0x0258, 0x42 => 0x0258, 0x43 => 0x0258, + 0x44 => 0x0258, 0x45 => 0x0258, 0x46 => 0x0258, 0x47 => 0x0258, + 0x48 => 0x0258, 0x49 => 0x0258, 0x4a => 0x0258, 0x4b => 0x0258, + 0x4c => 0x0258, 0x4d => 0x0258, 0x4e => 0x0258, 0x4f => 0x0258, + 0x50 => 0x0258, 0x51 => 0x0258, 0x52 => 0x0258, 0x53 => 0x0258, + 0x54 => 0x0258, 0x55 => 0x0258, 0x56 => 0x0258, 0x57 => 0x0258, + 0x58 => 0x0258, 0x59 => 0x0258, 0x5a => 0x0258, 0x5b => 0x0258, + 0x5c => 0x0258, 0x5d => 0x0258, 0x5e => 0x0258, 0x5f => 0x0258, + 0x60 => 0x0258, 0x61 => 0x0258, 0x62 => 0x0258, 0x63 => 0x0258, + 0x64 => 0x0258, 0x65 => 0x0258, 0x66 => 0x0258, 0x67 => 0x0258, + 0x68 => 0x0258, 0x69 => 0x0258, 0x6a => 0x0258, 0x6b => 0x0258, + 0x6c => 0x0258, 0x6d => 0x0258, 0x6e => 0x0258, 0x6f => 0x0258, + 0x70 => 0x0258, 0x71 => 0x0258, 0x72 => 0x0258, 0x73 => 0x0258, + 0x74 => 0x0258, 0x75 => 0x0258, 0x76 => 0x0258, 0x77 => 0x0258, + 0x78 => 0x0258, 0x79 => 0x0258, 0x7a => 0x0258, 0x7b => 0x0258, + 0x7c => 0x0258, 0x7d => 0x0258, 0x7e => 0x0258, 0x7f => 0x0258, + 0x80 => 0x0258, 0x81 => 0x0258, 0x82 => 0x0258, 0x83 => 0x0258, + 0x84 => 0x0258, 0x85 => 0x0258, 0x86 => 0x0258, 0x87 => 0x0258, + 0x88 => 0x0258, 0x89 => 0x0258, 0x8a => 0x0258, 0x8b => 0x0258, + 0x8c => 0x0258, 0x8d => 0x0258, 0x8e => 0x0258, 0x8f => 0x0258, + 0x90 => 0x0258, 0x91 => 0x0258, 0x92 => 0x0258, 0x93 => 0x0258, + 0x94 => 0x0258, 0x95 => 0x0258, 0x96 => 0x0258, 0x97 => 0x0258, + 0x98 => 0x0258, 0x99 => 0x0258, 0x9a => 0x0258, 0x9b => 0x0258, + 0x9c => 0x0258, 0x9d => 0x0258, 0x9e => 0x0258, 0x9f => 0x0258, + 0xa0 => 0x0258, 0xa1 => 0x0258, 0xa2 => 0x0258, 0xa3 => 0x0258, + 0xa4 => 0x0258, 0xa5 => 0x0258, 0xa6 => 0x0258, 0xa7 => 0x0258, + 0xa8 => 0x0258, 0xa9 => 0x0258, 0xaa => 0x0258, 0xab => 0x0258, + 0xac => 0x0258, 0xad => 0x0258, 0xae => 0x0258, 0xaf => 0x0258, + 0xb0 => 0x0258, 0xb1 => 0x0258, 0xb2 => 0x0258, 0xb3 => 0x0258, + 0xb4 => 0x0258, 0xb5 => 0x0258, 0xb6 => 0x0258, 0xb7 => 0x0258, + 0xb8 => 0x0258, 0xb9 => 0x0258, 0xba => 0x0258, 0xbb => 0x0258, + 0xbc => 0x0258, 0xbd => 0x0258, 0xbe => 0x0258, 0xbf => 0x0258, + 0xc0 => 0x0258, 0xc1 => 0x0258, 0xc2 => 0x0258, 0xc3 => 0x0258, + 0xc4 => 0x0258, 0xc5 => 0x0258, 0xc6 => 0x0258, 0xc7 => 0x0258, + 0xc8 => 0x0258, 0xc9 => 0x0258, 0xca => 0x0258, 0xcb => 0x0258, + 0xcc => 0x0258, 0xcd => 0x0258, 0xce => 0x0258, 0xcf => 0x0258, + 0xd0 => 0x0258, 0xd1 => 0x0258, 0xd2 => 0x0258, 0xd3 => 0x0258, + 0xd4 => 0x0258, 0xd5 => 0x0258, 0xd6 => 0x0258, 0xd7 => 0x0258, + 0xd8 => 0x0258, 0xd9 => 0x0258, 0xda => 0x0258, 0xdb => 0x0258, + 0xdc => 0x0258, 0xdd => 0x0258, 0xde => 0x0258, 0xdf => 0x0258, + 0xe0 => 0x0258, 0xe1 => 0x0258, 0xe2 => 0x0258, 0xe3 => 0x0258, + 0xe4 => 0x0258, 0xe5 => 0x0258, 0xe6 => 0x0258, 0xe7 => 0x0258, + 0xe8 => 0x0258, 0xe9 => 0x0258, 0xea => 0x0258, 0xeb => 0x0258, + 0xec => 0x0258, 0xed => 0x0258, 0xee => 0x0258, 0xef => 0x0258, + 0xf0 => 0x0258, 0xf1 => 0x0258, 0xf2 => 0x0258, 0xf3 => 0x0258, + 0xf4 => 0x0258, 0xf5 => 0x0258, 0xf6 => 0x0258, 0xf7 => 0x0258, + 0xf8 => 0x0258, 0xf9 => 0x0258, 0xfa => 0x0258, 0xfb => 0x0258, + 0xfc => 0x0258, 0xfd => 0x0258, 0xfe => 0x0258, 0xff => 0x0258, + 0x0100 => 0x0258, 0x0101 => 0x0258, 0x0102 => 0x0258, 0x0103 => 0x0258, + 0x0104 => 0x0258, 0x0105 => 0x0258, 0x0106 => 0x0258, 0x0107 => 0x0258, + 0x0108 => 0x0258, 0x0109 => 0x0258, 0x010a => 0x0258, 0x010b => 0x0258, + 0x010c => 0x0258, 0x010d => 0x0258, 0x010e => 0x0258, 0x010f => 0x0258, + 0x0110 => 0x0258, 0x0111 => 0x0258, 0x0112 => 0x0258, 0x0113 => 0x0258, + 0x0114 => 0x0258, 0x0115 => 0x0258, 0x0116 => 0x0258, 0x0117 => 0x0258, + 0x0118 => 0x0258, 0x0119 => 0x0258, 0x011a => 0x0258, 0x011b => 0x0258, + 0x011c => 0x0258, 0x011d => 0x0258, 0x011e => 0x0258, 0x011f => 0x0258, + 0x0120 => 0x0258, 0x0121 => 0x0258, 0x0122 => 0x0258, 0x0123 => 0x0258, + 0x0124 => 0x0258, 0x0125 => 0x0258, 0x0126 => 0x0258, 0x0127 => 0x0258, + 0x0128 => 0x0258, 0x0129 => 0x0258, 0x012a => 0x0258, 0x012b => 0x0258, + 0x012c => 0x0258, 0x012d => 0x0258, 0x012e => 0x0258, 0x012f => 0x0258, + 0x0130 => 0x0258, 0x0131 => 0x0258, 0x0132 => 0x0258, 0x0133 => 0x0258, + 0x0134 => 0x0258, 0x0135 => 0x0258, 0x0136 => 0x0258, 0x0137 => 0x0258, + 0x0138 => 0x0258, 0x0139 => 0x0258, 0x013a => 0x0258, 0x013b => 0x0258, + ); + + /* The cmap table is similarly synthesized. + */ + $cmapData = array( + 0x20 => 0x01, 0x21 => 0x02, 0x22 => 0x03, 0x23 => 0x04, + 0x24 => 0x05, 0x25 => 0x06, 0x26 => 0x07, 0x2019 => 0x08, + 0x28 => 0x09, 0x29 => 0x0a, 0x2a => 0x0b, 0x2b => 0x0c, + 0x2c => 0x0d, 0x2d => 0x0e, 0x2e => 0x0f, 0x2f => 0x10, + 0x30 => 0x11, 0x31 => 0x12, 0x32 => 0x13, 0x33 => 0x14, + 0x34 => 0x15, 0x35 => 0x16, 0x36 => 0x17, 0x37 => 0x18, + 0x38 => 0x19, 0x39 => 0x1a, 0x3a => 0x1b, 0x3b => 0x1c, + 0x3c => 0x1d, 0x3d => 0x1e, 0x3e => 0x1f, 0x3f => 0x20, + 0x40 => 0x21, 0x41 => 0x22, 0x42 => 0x23, 0x43 => 0x24, + 0x44 => 0x25, 0x45 => 0x26, 0x46 => 0x27, 0x47 => 0x28, + 0x48 => 0x29, 0x49 => 0x2a, 0x4a => 0x2b, 0x4b => 0x2c, + 0x4c => 0x2d, 0x4d => 0x2e, 0x4e => 0x2f, 0x4f => 0x30, + 0x50 => 0x31, 0x51 => 0x32, 0x52 => 0x33, 0x53 => 0x34, + 0x54 => 0x35, 0x55 => 0x36, 0x56 => 0x37, 0x57 => 0x38, + 0x58 => 0x39, 0x59 => 0x3a, 0x5a => 0x3b, 0x5b => 0x3c, + 0x5c => 0x3d, 0x5d => 0x3e, 0x5e => 0x3f, 0x5f => 0x40, + 0x2018 => 0x41, 0x61 => 0x42, 0x62 => 0x43, 0x63 => 0x44, + 0x64 => 0x45, 0x65 => 0x46, 0x66 => 0x47, 0x67 => 0x48, + 0x68 => 0x49, 0x69 => 0x4a, 0x6a => 0x4b, 0x6b => 0x4c, + 0x6c => 0x4d, 0x6d => 0x4e, 0x6e => 0x4f, 0x6f => 0x50, + 0x70 => 0x51, 0x71 => 0x52, 0x72 => 0x53, 0x73 => 0x54, + 0x74 => 0x55, 0x75 => 0x56, 0x76 => 0x57, 0x77 => 0x58, + 0x78 => 0x59, 0x79 => 0x5a, 0x7a => 0x5b, 0x7b => 0x5c, + 0x7c => 0x5d, 0x7d => 0x5e, 0x7e => 0x5f, 0xa1 => 0x60, + 0xa2 => 0x61, 0xa3 => 0x62, 0x2044 => 0x63, 0xa5 => 0x64, + 0x0192 => 0x65, 0xa7 => 0x66, 0xa4 => 0x67, 0x27 => 0x68, + 0x201c => 0x69, 0xab => 0x6a, 0x2039 => 0x6b, 0x203a => 0x6c, + 0xfb01 => 0x6d, 0xfb02 => 0x6e, 0x2013 => 0x6f, 0x2020 => 0x70, + 0x2021 => 0x71, 0xb7 => 0x72, 0xb6 => 0x73, 0x2022 => 0x74, + 0x201a => 0x75, 0x201e => 0x76, 0x201d => 0x77, 0xbb => 0x78, + 0x2026 => 0x79, 0x2030 => 0x7a, 0xbf => 0x7b, 0x60 => 0x7c, + 0xb4 => 0x7d, 0x02c6 => 0x7e, 0x02dc => 0x7f, 0xaf => 0x80, + 0x02d8 => 0x81, 0x02d9 => 0x82, 0xa8 => 0x83, 0x02da => 0x84, + 0xb8 => 0x85, 0x02dd => 0x86, 0x02db => 0x87, 0x02c7 => 0x88, + 0x2014 => 0x89, 0xc6 => 0x8a, 0xaa => 0x8b, 0x0141 => 0x8c, + 0xd8 => 0x8d, 0x0152 => 0x8e, 0xba => 0x8f, 0xe6 => 0x90, + 0x0131 => 0x91, 0x0142 => 0x92, 0xf8 => 0x93, 0x0153 => 0x94, + 0xdf => 0x95, 0xcf => 0x96, 0xe9 => 0x97, 0x0103 => 0x98, + 0x0171 => 0x99, 0x011b => 0x9a, 0x0178 => 0x9b, 0xf7 => 0x9c, + 0xdd => 0x9d, 0xc2 => 0x9e, 0xe1 => 0x9f, 0xdb => 0xa0, + 0xfd => 0xa1, 0x0219 => 0xa2, 0xea => 0xa3, 0x016e => 0xa4, + 0xdc => 0xa5, 0x0105 => 0xa6, 0xda => 0xa7, 0x0173 => 0xa8, + 0xcb => 0xa9, 0x0110 => 0xaa, 0xf6c3 => 0xab, 0xa9 => 0xac, + 0x0112 => 0xad, 0x010d => 0xae, 0xe5 => 0xaf, 0x0145 => 0xb0, + 0x013a => 0xb1, 0xe0 => 0xb2, 0x0162 => 0xb3, 0x0106 => 0xb4, + 0xe3 => 0xb5, 0x0116 => 0xb6, 0x0161 => 0xb7, 0x015f => 0xb8, + 0xed => 0xb9, 0x25ca => 0xba, 0x0158 => 0xbb, 0x0122 => 0xbc, + 0xfb => 0xbd, 0xe2 => 0xbe, 0x0100 => 0xbf, 0x0159 => 0xc0, + 0xe7 => 0xc1, 0x017b => 0xc2, 0xde => 0xc3, 0x014c => 0xc4, + 0x0154 => 0xc5, 0x015a => 0xc6, 0x010f => 0xc7, 0x016a => 0xc8, + 0x016f => 0xc9, 0xb3 => 0xca, 0xd2 => 0xcb, 0xc0 => 0xcc, + 0x0102 => 0xcd, 0xd7 => 0xce, 0xfa => 0xcf, 0x0164 => 0xd0, + 0x2202 => 0xd1, 0xff => 0xd2, 0x0143 => 0xd3, 0xee => 0xd4, + 0xca => 0xd5, 0xe4 => 0xd6, 0xeb => 0xd7, 0x0107 => 0xd8, + 0x0144 => 0xd9, 0x016b => 0xda, 0x0147 => 0xdb, 0xcd => 0xdc, + 0xb1 => 0xdd, 0xa6 => 0xde, 0xae => 0xdf, 0x011e => 0xe0, + 0x0130 => 0xe1, 0x2211 => 0xe2, 0xc8 => 0xe3, 0x0155 => 0xe4, + 0x014d => 0xe5, 0x0179 => 0xe6, 0x017d => 0xe7, 0x2265 => 0xe8, + 0xd0 => 0xe9, 0xc7 => 0xea, 0x013c => 0xeb, 0x0165 => 0xec, + 0x0119 => 0xed, 0x0172 => 0xee, 0xc1 => 0xef, 0xc4 => 0xf0, + 0xe8 => 0xf1, 0x017a => 0xf2, 0x012f => 0xf3, 0xd3 => 0xf4, + 0xf3 => 0xf5, 0x0101 => 0xf6, 0x015b => 0xf7, 0xef => 0xf8, + 0xd4 => 0xf9, 0xd9 => 0xfa, 0x2206 => 0xfb, 0xfe => 0xfc, + 0xb2 => 0xfd, 0xd6 => 0xfe, 0xb5 => 0xff, 0xec => 0x0100, + 0x0151 => 0x0101, 0x0118 => 0x0102, 0x0111 => 0x0103, 0xbe => 0x0104, + 0x015e => 0x0105, 0x013e => 0x0106, 0x0136 => 0x0107, 0x0139 => 0x0108, + 0x2122 => 0x0109, 0x0117 => 0x010a, 0xcc => 0x010b, 0x012a => 0x010c, + 0x013d => 0x010d, 0xbd => 0x010e, 0x2264 => 0x010f, 0xf4 => 0x0110, + 0xf1 => 0x0111, 0x0170 => 0x0112, 0xc9 => 0x0113, 0x0113 => 0x0114, + 0x011f => 0x0115, 0xbc => 0x0116, 0x0160 => 0x0117, 0x0218 => 0x0118, + 0x0150 => 0x0119, 0xb0 => 0x011a, 0xf2 => 0x011b, 0x010c => 0x011c, + 0xf9 => 0x011d, 0x221a => 0x011e, 0x010e => 0x011f, 0x0157 => 0x0120, + 0xd1 => 0x0121, 0xf5 => 0x0122, 0x0156 => 0x0123, 0x013b => 0x0124, + 0xc3 => 0x0125, 0x0104 => 0x0126, 0xc5 => 0x0127, 0xd5 => 0x0128, + 0x017c => 0x0129, 0x011a => 0x012a, 0x012e => 0x012b, 0x0137 => 0x012c, + 0x2212 => 0x012d, 0xce => 0x012e, 0x0148 => 0x012f, 0x0163 => 0x0130, + 0xac => 0x0131, 0xf6 => 0x0132, 0xfc => 0x0133, 0x2260 => 0x0134, + 0x0123 => 0x0135, 0xf0 => 0x0136, 0x017e => 0x0137, 0x0146 => 0x0138, + 0xb9 => 0x0139, 0x012b => 0x013a, 0x20ac => 0x013b); + $this->_cmap = Zend_Pdf_Cmap::cmapWithTypeData( + Zend_Pdf_Cmap::TYPE_BYTE_ENCODING_STATIC, $cmapData); + + + /* Resource dictionary */ + + /* The resource dictionary for the standard fonts is sparse because PDF + * viewers already have all of the metrics data. We only need to provide + * the font name and encoding method. + */ + $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 new file mode 100644 index 0000000..9f13b02 --- /dev/null +++ b/libs/Zend/Pdf/Resource/Font/Simple/Standard/CourierBold.php @@ -0,0 +1,290 @@ +_fontNames[Zend_Pdf_Font::NAME_COPYRIGHT]['en'] = + "\x00\x43\x00\x6f\x00\x70\x00\x79\x00\x72\x00\x69\x00\x67\x00\x68\x00" + . "\x74\x00\x20\x00\x28\x00\x63\x00\x29\x00\x20\x00\x31\x00\x39\x00" + . "\x38\x00\x39\x00\x2c\x00\x20\x00\x31\x00\x39\x00\x39\x00\x30\x00" + . "\x2c\x00\x20\x00\x31\x00\x39\x00\x39\x00\x31\x00\x2c\x00\x20\x00" + . "\x31\x00\x39\x00\x39\x00\x33\x00\x2c\x00\x20\x00\x31\x00\x39\x00" + . "\x39\x00\x37\x00\x20\x00\x41\x00\x64\x00\x6f\x00\x62\x00\x65\x00" + . "\x20\x00\x53\x00\x79\x00\x73\x00\x74\x00\x65\x00\x6d\x00\x73\x00" + . "\x20\x00\x49\x00\x6e\x00\x63\x00\x6f\x00\x72\x00\x70\x00\x6f\x00" + . "\x72\x00\x61\x00\x74\x00\x65\x00\x64\x00\x2e\x00\x20\x00\x20\x00" + . "\x41\x00\x6c\x00\x6c\x00\x20\x00\x52\x00\x69\x00\x67\x00\x68\x00" + . "\x74\x00\x73\x00\x20\x00\x52\x00\x65\x00\x73\x00\x65\x00\x72\x00" + . "\x76\x00\x65\x00\x64\x00\x2e"; + $this->_fontNames[Zend_Pdf_Font::NAME_FAMILY]['en'] = + "\x00\x43\x00\x6f\x00\x75\x00\x72\x00\x69\x00\x65\x00\x72"; + $this->_fontNames[Zend_Pdf_Font::NAME_STYLE]['en'] = + "\x00\x42\x00\x6f\x00\x6c\x00\x64"; + $this->_fontNames[Zend_Pdf_Font::NAME_ID]['en'] = + "\x00\x34\x00\x33\x00\x30\x00\x34\x00\x38"; + $this->_fontNames[Zend_Pdf_Font::NAME_FULL]['en'] = + "\x00\x43\x00\x6f\x00\x75\x00\x72\x00\x69\x00\x65\x00\x72\x00\x2d\x00" + . "\x42\x00\x6f\x00\x6c\x00\x64\x00\x20\x00\x42\x00\x6f\x00\x6c\x00" + . "\x64"; + $this->_fontNames[Zend_Pdf_Font::NAME_VERSION]['en'] = + "\x00\x30\x00\x30\x00\x33\x00\x2e\x00\x30\x00\x30\x00\x30"; + $this->_fontNames[Zend_Pdf_Font::NAME_POSTSCRIPT]['en'] = + "\x00\x43\x00\x6f\x00\x75\x00\x72\x00\x69\x00\x65\x00\x72\x00\x2d\x00" + . "\x42\x00\x6f\x00\x6c\x00\x64"; + + $this->_isBold = true; + $this->_isItalic = false; + $this->_isMonospaced = true; + + $this->_underlinePosition = -100; + $this->_underlineThickness = 50; + $this->_strikePosition = 225; + $this->_strikeThickness = 50; + + $this->_unitsPerEm = 1000; + + $this->_ascent = 629; + $this->_descent = -157; + $this->_lineGap = 414; + + /* The glyph numbers assigned here are synthetic; they do not match the + * actual glyph numbers used by the font. This is not a big deal though + * since this data never makes it to the PDF file. It is only used + * internally for layout calculations. + */ + $this->_glyphWidths = array( + 0x00 => 0x01f4, 0x01 => 0x0258, 0x02 => 0x0258, 0x03 => 0x0258, + 0x04 => 0x0258, 0x05 => 0x0258, 0x06 => 0x0258, 0x07 => 0x0258, + 0x08 => 0x0258, 0x09 => 0x0258, 0x0a => 0x0258, 0x0b => 0x0258, + 0x0c => 0x0258, 0x0d => 0x0258, 0x0e => 0x0258, 0x0f => 0x0258, + 0x10 => 0x0258, 0x11 => 0x0258, 0x12 => 0x0258, 0x13 => 0x0258, + 0x14 => 0x0258, 0x15 => 0x0258, 0x16 => 0x0258, 0x17 => 0x0258, + 0x18 => 0x0258, 0x19 => 0x0258, 0x1a => 0x0258, 0x1b => 0x0258, + 0x1c => 0x0258, 0x1d => 0x0258, 0x1e => 0x0258, 0x1f => 0x0258, + 0x20 => 0x0258, 0x21 => 0x0258, 0x22 => 0x0258, 0x23 => 0x0258, + 0x24 => 0x0258, 0x25 => 0x0258, 0x26 => 0x0258, 0x27 => 0x0258, + 0x28 => 0x0258, 0x29 => 0x0258, 0x2a => 0x0258, 0x2b => 0x0258, + 0x2c => 0x0258, 0x2d => 0x0258, 0x2e => 0x0258, 0x2f => 0x0258, + 0x30 => 0x0258, 0x31 => 0x0258, 0x32 => 0x0258, 0x33 => 0x0258, + 0x34 => 0x0258, 0x35 => 0x0258, 0x36 => 0x0258, 0x37 => 0x0258, + 0x38 => 0x0258, 0x39 => 0x0258, 0x3a => 0x0258, 0x3b => 0x0258, + 0x3c => 0x0258, 0x3d => 0x0258, 0x3e => 0x0258, 0x3f => 0x0258, + 0x40 => 0x0258, 0x41 => 0x0258, 0x42 => 0x0258, 0x43 => 0x0258, + 0x44 => 0x0258, 0x45 => 0x0258, 0x46 => 0x0258, 0x47 => 0x0258, + 0x48 => 0x0258, 0x49 => 0x0258, 0x4a => 0x0258, 0x4b => 0x0258, + 0x4c => 0x0258, 0x4d => 0x0258, 0x4e => 0x0258, 0x4f => 0x0258, + 0x50 => 0x0258, 0x51 => 0x0258, 0x52 => 0x0258, 0x53 => 0x0258, + 0x54 => 0x0258, 0x55 => 0x0258, 0x56 => 0x0258, 0x57 => 0x0258, + 0x58 => 0x0258, 0x59 => 0x0258, 0x5a => 0x0258, 0x5b => 0x0258, + 0x5c => 0x0258, 0x5d => 0x0258, 0x5e => 0x0258, 0x5f => 0x0258, + 0x60 => 0x0258, 0x61 => 0x0258, 0x62 => 0x0258, 0x63 => 0x0258, + 0x64 => 0x0258, 0x65 => 0x0258, 0x66 => 0x0258, 0x67 => 0x0258, + 0x68 => 0x0258, 0x69 => 0x0258, 0x6a => 0x0258, 0x6b => 0x0258, + 0x6c => 0x0258, 0x6d => 0x0258, 0x6e => 0x0258, 0x6f => 0x0258, + 0x70 => 0x0258, 0x71 => 0x0258, 0x72 => 0x0258, 0x73 => 0x0258, + 0x74 => 0x0258, 0x75 => 0x0258, 0x76 => 0x0258, 0x77 => 0x0258, + 0x78 => 0x0258, 0x79 => 0x0258, 0x7a => 0x0258, 0x7b => 0x0258, + 0x7c => 0x0258, 0x7d => 0x0258, 0x7e => 0x0258, 0x7f => 0x0258, + 0x80 => 0x0258, 0x81 => 0x0258, 0x82 => 0x0258, 0x83 => 0x0258, + 0x84 => 0x0258, 0x85 => 0x0258, 0x86 => 0x0258, 0x87 => 0x0258, + 0x88 => 0x0258, 0x89 => 0x0258, 0x8a => 0x0258, 0x8b => 0x0258, + 0x8c => 0x0258, 0x8d => 0x0258, 0x8e => 0x0258, 0x8f => 0x0258, + 0x90 => 0x0258, 0x91 => 0x0258, 0x92 => 0x0258, 0x93 => 0x0258, + 0x94 => 0x0258, 0x95 => 0x0258, 0x96 => 0x0258, 0x97 => 0x0258, + 0x98 => 0x0258, 0x99 => 0x0258, 0x9a => 0x0258, 0x9b => 0x0258, + 0x9c => 0x0258, 0x9d => 0x0258, 0x9e => 0x0258, 0x9f => 0x0258, + 0xa0 => 0x0258, 0xa1 => 0x0258, 0xa2 => 0x0258, 0xa3 => 0x0258, + 0xa4 => 0x0258, 0xa5 => 0x0258, 0xa6 => 0x0258, 0xa7 => 0x0258, + 0xa8 => 0x0258, 0xa9 => 0x0258, 0xaa => 0x0258, 0xab => 0x0258, + 0xac => 0x0258, 0xad => 0x0258, 0xae => 0x0258, 0xaf => 0x0258, + 0xb0 => 0x0258, 0xb1 => 0x0258, 0xb2 => 0x0258, 0xb3 => 0x0258, + 0xb4 => 0x0258, 0xb5 => 0x0258, 0xb6 => 0x0258, 0xb7 => 0x0258, + 0xb8 => 0x0258, 0xb9 => 0x0258, 0xba => 0x0258, 0xbb => 0x0258, + 0xbc => 0x0258, 0xbd => 0x0258, 0xbe => 0x0258, 0xbf => 0x0258, + 0xc0 => 0x0258, 0xc1 => 0x0258, 0xc2 => 0x0258, 0xc3 => 0x0258, + 0xc4 => 0x0258, 0xc5 => 0x0258, 0xc6 => 0x0258, 0xc7 => 0x0258, + 0xc8 => 0x0258, 0xc9 => 0x0258, 0xca => 0x0258, 0xcb => 0x0258, + 0xcc => 0x0258, 0xcd => 0x0258, 0xce => 0x0258, 0xcf => 0x0258, + 0xd0 => 0x0258, 0xd1 => 0x0258, 0xd2 => 0x0258, 0xd3 => 0x0258, + 0xd4 => 0x0258, 0xd5 => 0x0258, 0xd6 => 0x0258, 0xd7 => 0x0258, + 0xd8 => 0x0258, 0xd9 => 0x0258, 0xda => 0x0258, 0xdb => 0x0258, + 0xdc => 0x0258, 0xdd => 0x0258, 0xde => 0x0258, 0xdf => 0x0258, + 0xe0 => 0x0258, 0xe1 => 0x0258, 0xe2 => 0x0258, 0xe3 => 0x0258, + 0xe4 => 0x0258, 0xe5 => 0x0258, 0xe6 => 0x0258, 0xe7 => 0x0258, + 0xe8 => 0x0258, 0xe9 => 0x0258, 0xea => 0x0258, 0xeb => 0x0258, + 0xec => 0x0258, 0xed => 0x0258, 0xee => 0x0258, 0xef => 0x0258, + 0xf0 => 0x0258, 0xf1 => 0x0258, 0xf2 => 0x0258, 0xf3 => 0x0258, + 0xf4 => 0x0258, 0xf5 => 0x0258, 0xf6 => 0x0258, 0xf7 => 0x0258, + 0xf8 => 0x0258, 0xf9 => 0x0258, 0xfa => 0x0258, 0xfb => 0x0258, + 0xfc => 0x0258, 0xfd => 0x0258, 0xfe => 0x0258, 0xff => 0x0258, + 0x0100 => 0x0258, 0x0101 => 0x0258, 0x0102 => 0x0258, 0x0103 => 0x0258, + 0x0104 => 0x0258, 0x0105 => 0x0258, 0x0106 => 0x0258, 0x0107 => 0x0258, + 0x0108 => 0x0258, 0x0109 => 0x0258, 0x010a => 0x0258, 0x010b => 0x0258, + 0x010c => 0x0258, 0x010d => 0x0258, 0x010e => 0x0258, 0x010f => 0x0258, + 0x0110 => 0x0258, 0x0111 => 0x0258, 0x0112 => 0x0258, 0x0113 => 0x0258, + 0x0114 => 0x0258, 0x0115 => 0x0258, 0x0116 => 0x0258, 0x0117 => 0x0258, + 0x0118 => 0x0258, 0x0119 => 0x0258, 0x011a => 0x0258, 0x011b => 0x0258, + 0x011c => 0x0258, 0x011d => 0x0258, 0x011e => 0x0258, 0x011f => 0x0258, + 0x0120 => 0x0258, 0x0121 => 0x0258, 0x0122 => 0x0258, 0x0123 => 0x0258, + 0x0124 => 0x0258, 0x0125 => 0x0258, 0x0126 => 0x0258, 0x0127 => 0x0258, + 0x0128 => 0x0258, 0x0129 => 0x0258, 0x012a => 0x0258, 0x012b => 0x0258, + 0x012c => 0x0258, 0x012d => 0x0258, 0x012e => 0x0258, 0x012f => 0x0258, + 0x0130 => 0x0258, 0x0131 => 0x0258, 0x0132 => 0x0258, 0x0133 => 0x0258, + 0x0134 => 0x0258, 0x0135 => 0x0258, 0x0136 => 0x0258, 0x0137 => 0x0258, + 0x0138 => 0x0258, 0x0139 => 0x0258, 0x013a => 0x0258, 0x013b => 0x0258, + ); + + /* The cmap table is similarly synthesized. + */ + $cmapData = array( + 0x20 => 0x01, 0x21 => 0x02, 0x22 => 0x03, 0x23 => 0x04, + 0x24 => 0x05, 0x25 => 0x06, 0x26 => 0x07, 0x2019 => 0x08, + 0x28 => 0x09, 0x29 => 0x0a, 0x2a => 0x0b, 0x2b => 0x0c, + 0x2c => 0x0d, 0x2d => 0x0e, 0x2e => 0x0f, 0x2f => 0x10, + 0x30 => 0x11, 0x31 => 0x12, 0x32 => 0x13, 0x33 => 0x14, + 0x34 => 0x15, 0x35 => 0x16, 0x36 => 0x17, 0x37 => 0x18, + 0x38 => 0x19, 0x39 => 0x1a, 0x3a => 0x1b, 0x3b => 0x1c, + 0x3c => 0x1d, 0x3d => 0x1e, 0x3e => 0x1f, 0x3f => 0x20, + 0x40 => 0x21, 0x41 => 0x22, 0x42 => 0x23, 0x43 => 0x24, + 0x44 => 0x25, 0x45 => 0x26, 0x46 => 0x27, 0x47 => 0x28, + 0x48 => 0x29, 0x49 => 0x2a, 0x4a => 0x2b, 0x4b => 0x2c, + 0x4c => 0x2d, 0x4d => 0x2e, 0x4e => 0x2f, 0x4f => 0x30, + 0x50 => 0x31, 0x51 => 0x32, 0x52 => 0x33, 0x53 => 0x34, + 0x54 => 0x35, 0x55 => 0x36, 0x56 => 0x37, 0x57 => 0x38, + 0x58 => 0x39, 0x59 => 0x3a, 0x5a => 0x3b, 0x5b => 0x3c, + 0x5c => 0x3d, 0x5d => 0x3e, 0x5e => 0x3f, 0x5f => 0x40, + 0x2018 => 0x41, 0x61 => 0x42, 0x62 => 0x43, 0x63 => 0x44, + 0x64 => 0x45, 0x65 => 0x46, 0x66 => 0x47, 0x67 => 0x48, + 0x68 => 0x49, 0x69 => 0x4a, 0x6a => 0x4b, 0x6b => 0x4c, + 0x6c => 0x4d, 0x6d => 0x4e, 0x6e => 0x4f, 0x6f => 0x50, + 0x70 => 0x51, 0x71 => 0x52, 0x72 => 0x53, 0x73 => 0x54, + 0x74 => 0x55, 0x75 => 0x56, 0x76 => 0x57, 0x77 => 0x58, + 0x78 => 0x59, 0x79 => 0x5a, 0x7a => 0x5b, 0x7b => 0x5c, + 0x7c => 0x5d, 0x7d => 0x5e, 0x7e => 0x5f, 0xa1 => 0x60, + 0xa2 => 0x61, 0xa3 => 0x62, 0x2044 => 0x63, 0xa5 => 0x64, + 0x0192 => 0x65, 0xa7 => 0x66, 0xa4 => 0x67, 0x27 => 0x68, + 0x201c => 0x69, 0xab => 0x6a, 0x2039 => 0x6b, 0x203a => 0x6c, + 0xfb01 => 0x6d, 0xfb02 => 0x6e, 0x2013 => 0x6f, 0x2020 => 0x70, + 0x2021 => 0x71, 0xb7 => 0x72, 0xb6 => 0x73, 0x2022 => 0x74, + 0x201a => 0x75, 0x201e => 0x76, 0x201d => 0x77, 0xbb => 0x78, + 0x2026 => 0x79, 0x2030 => 0x7a, 0xbf => 0x7b, 0x60 => 0x7c, + 0xb4 => 0x7d, 0x02c6 => 0x7e, 0x02dc => 0x7f, 0xaf => 0x80, + 0x02d8 => 0x81, 0x02d9 => 0x82, 0xa8 => 0x83, 0x02da => 0x84, + 0xb8 => 0x85, 0x02dd => 0x86, 0x02db => 0x87, 0x02c7 => 0x88, + 0x2014 => 0x89, 0xc6 => 0x8a, 0xaa => 0x8b, 0x0141 => 0x8c, + 0xd8 => 0x8d, 0x0152 => 0x8e, 0xba => 0x8f, 0xe6 => 0x90, + 0x0131 => 0x91, 0x0142 => 0x92, 0xf8 => 0x93, 0x0153 => 0x94, + 0xdf => 0x95, 0xcf => 0x96, 0xe9 => 0x97, 0x0103 => 0x98, + 0x0171 => 0x99, 0x011b => 0x9a, 0x0178 => 0x9b, 0xf7 => 0x9c, + 0xdd => 0x9d, 0xc2 => 0x9e, 0xe1 => 0x9f, 0xdb => 0xa0, + 0xfd => 0xa1, 0x0219 => 0xa2, 0xea => 0xa3, 0x016e => 0xa4, + 0xdc => 0xa5, 0x0105 => 0xa6, 0xda => 0xa7, 0x0173 => 0xa8, + 0xcb => 0xa9, 0x0110 => 0xaa, 0xf6c3 => 0xab, 0xa9 => 0xac, + 0x0112 => 0xad, 0x010d => 0xae, 0xe5 => 0xaf, 0x0145 => 0xb0, + 0x013a => 0xb1, 0xe0 => 0xb2, 0x0162 => 0xb3, 0x0106 => 0xb4, + 0xe3 => 0xb5, 0x0116 => 0xb6, 0x0161 => 0xb7, 0x015f => 0xb8, + 0xed => 0xb9, 0x25ca => 0xba, 0x0158 => 0xbb, 0x0122 => 0xbc, + 0xfb => 0xbd, 0xe2 => 0xbe, 0x0100 => 0xbf, 0x0159 => 0xc0, + 0xe7 => 0xc1, 0x017b => 0xc2, 0xde => 0xc3, 0x014c => 0xc4, + 0x0154 => 0xc5, 0x015a => 0xc6, 0x010f => 0xc7, 0x016a => 0xc8, + 0x016f => 0xc9, 0xb3 => 0xca, 0xd2 => 0xcb, 0xc0 => 0xcc, + 0x0102 => 0xcd, 0xd7 => 0xce, 0xfa => 0xcf, 0x0164 => 0xd0, + 0x2202 => 0xd1, 0xff => 0xd2, 0x0143 => 0xd3, 0xee => 0xd4, + 0xca => 0xd5, 0xe4 => 0xd6, 0xeb => 0xd7, 0x0107 => 0xd8, + 0x0144 => 0xd9, 0x016b => 0xda, 0x0147 => 0xdb, 0xcd => 0xdc, + 0xb1 => 0xdd, 0xa6 => 0xde, 0xae => 0xdf, 0x011e => 0xe0, + 0x0130 => 0xe1, 0x2211 => 0xe2, 0xc8 => 0xe3, 0x0155 => 0xe4, + 0x014d => 0xe5, 0x0179 => 0xe6, 0x017d => 0xe7, 0x2265 => 0xe8, + 0xd0 => 0xe9, 0xc7 => 0xea, 0x013c => 0xeb, 0x0165 => 0xec, + 0x0119 => 0xed, 0x0172 => 0xee, 0xc1 => 0xef, 0xc4 => 0xf0, + 0xe8 => 0xf1, 0x017a => 0xf2, 0x012f => 0xf3, 0xd3 => 0xf4, + 0xf3 => 0xf5, 0x0101 => 0xf6, 0x015b => 0xf7, 0xef => 0xf8, + 0xd4 => 0xf9, 0xd9 => 0xfa, 0x2206 => 0xfb, 0xfe => 0xfc, + 0xb2 => 0xfd, 0xd6 => 0xfe, 0xb5 => 0xff, 0xec => 0x0100, + 0x0151 => 0x0101, 0x0118 => 0x0102, 0x0111 => 0x0103, 0xbe => 0x0104, + 0x015e => 0x0105, 0x013e => 0x0106, 0x0136 => 0x0107, 0x0139 => 0x0108, + 0x2122 => 0x0109, 0x0117 => 0x010a, 0xcc => 0x010b, 0x012a => 0x010c, + 0x013d => 0x010d, 0xbd => 0x010e, 0x2264 => 0x010f, 0xf4 => 0x0110, + 0xf1 => 0x0111, 0x0170 => 0x0112, 0xc9 => 0x0113, 0x0113 => 0x0114, + 0x011f => 0x0115, 0xbc => 0x0116, 0x0160 => 0x0117, 0x0218 => 0x0118, + 0x0150 => 0x0119, 0xb0 => 0x011a, 0xf2 => 0x011b, 0x010c => 0x011c, + 0xf9 => 0x011d, 0x221a => 0x011e, 0x010e => 0x011f, 0x0157 => 0x0120, + 0xd1 => 0x0121, 0xf5 => 0x0122, 0x0156 => 0x0123, 0x013b => 0x0124, + 0xc3 => 0x0125, 0x0104 => 0x0126, 0xc5 => 0x0127, 0xd5 => 0x0128, + 0x017c => 0x0129, 0x011a => 0x012a, 0x012e => 0x012b, 0x0137 => 0x012c, + 0x2212 => 0x012d, 0xce => 0x012e, 0x0148 => 0x012f, 0x0163 => 0x0130, + 0xac => 0x0131, 0xf6 => 0x0132, 0xfc => 0x0133, 0x2260 => 0x0134, + 0x0123 => 0x0135, 0xf0 => 0x0136, 0x017e => 0x0137, 0x0146 => 0x0138, + 0xb9 => 0x0139, 0x012b => 0x013a, 0x20ac => 0x013b); + $this->_cmap = Zend_Pdf_Cmap::cmapWithTypeData( + Zend_Pdf_Cmap::TYPE_BYTE_ENCODING_STATIC, $cmapData); + + + /* Resource dictionary */ + + /* The resource dictionary for the standard fonts is sparse because PDF + * viewers already have all of the metrics data. We only need to provide + * the font name and encoding method. + */ + $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 new file mode 100644 index 0000000..d984295 --- /dev/null +++ b/libs/Zend/Pdf/Resource/Font/Simple/Standard/CourierBoldOblique.php @@ -0,0 +1,291 @@ +_fontNames[Zend_Pdf_Font::NAME_COPYRIGHT]['en'] = + "\x00\x43\x00\x6f\x00\x70\x00\x79\x00\x72\x00\x69\x00\x67\x00\x68\x00" + . "\x74\x00\x20\x00\x28\x00\x63\x00\x29\x00\x20\x00\x31\x00\x39\x00" + . "\x38\x00\x39\x00\x2c\x00\x20\x00\x31\x00\x39\x00\x39\x00\x30\x00" + . "\x2c\x00\x20\x00\x31\x00\x39\x00\x39\x00\x31\x00\x2c\x00\x20\x00" + . "\x31\x00\x39\x00\x39\x00\x33\x00\x2c\x00\x20\x00\x31\x00\x39\x00" + . "\x39\x00\x37\x00\x20\x00\x41\x00\x64\x00\x6f\x00\x62\x00\x65\x00" + . "\x20\x00\x53\x00\x79\x00\x73\x00\x74\x00\x65\x00\x6d\x00\x73\x00" + . "\x20\x00\x49\x00\x6e\x00\x63\x00\x6f\x00\x72\x00\x70\x00\x6f\x00" + . "\x72\x00\x61\x00\x74\x00\x65\x00\x64\x00\x2e\x00\x20\x00\x20\x00" + . "\x41\x00\x6c\x00\x6c\x00\x20\x00\x52\x00\x69\x00\x67\x00\x68\x00" + . "\x74\x00\x73\x00\x20\x00\x52\x00\x65\x00\x73\x00\x65\x00\x72\x00" + . "\x76\x00\x65\x00\x64\x00\x2e"; + $this->_fontNames[Zend_Pdf_Font::NAME_FAMILY]['en'] = + "\x00\x43\x00\x6f\x00\x75\x00\x72\x00\x69\x00\x65\x00\x72"; + $this->_fontNames[Zend_Pdf_Font::NAME_STYLE]['en'] = + "\x00\x42\x00\x6f\x00\x6c\x00\x64"; + $this->_fontNames[Zend_Pdf_Font::NAME_ID]['en'] = + "\x00\x34\x00\x33\x00\x30\x00\x34\x00\x39"; + $this->_fontNames[Zend_Pdf_Font::NAME_FULL]['en'] = + "\x00\x43\x00\x6f\x00\x75\x00\x72\x00\x69\x00\x65\x00\x72\x00\x2d\x00" + . "\x42\x00\x6f\x00\x6c\x00\x64\x00\x4f\x00\x62\x00\x6c\x00\x69\x00" + . "\x71\x00\x75\x00\x65\x00\x20\x00\x42\x00\x6f\x00\x6c\x00\x64"; + $this->_fontNames[Zend_Pdf_Font::NAME_VERSION]['en'] = + "\x00\x30\x00\x30\x00\x33\x00\x2e\x00\x30\x00\x30\x00\x30"; + $this->_fontNames[Zend_Pdf_Font::NAME_POSTSCRIPT]['en'] = + "\x00\x43\x00\x6f\x00\x75\x00\x72\x00\x69\x00\x65\x00\x72\x00\x2d\x00" + . "\x42\x00\x6f\x00\x6c\x00\x64\x00\x4f\x00\x62\x00\x6c\x00\x69\x00" + . "\x71\x00\x75\x00\x65"; + + $this->_isBold = true; + $this->_isItalic = true; + $this->_isMonospaced = true; + + $this->_underlinePosition = -100; + $this->_underlineThickness = 50; + $this->_strikePosition = 225; + $this->_strikeThickness = 50; + + $this->_unitsPerEm = 1000; + + $this->_ascent = 629; + $this->_descent = -157; + $this->_lineGap = 414; + + /* The glyph numbers assigned here are synthetic; they do not match the + * actual glyph numbers used by the font. This is not a big deal though + * since this data never makes it to the PDF file. It is only used + * internally for layout calculations. + */ + $this->_glyphWidths = array( + 0x00 => 0x01f4, 0x01 => 0x0258, 0x02 => 0x0258, 0x03 => 0x0258, + 0x04 => 0x0258, 0x05 => 0x0258, 0x06 => 0x0258, 0x07 => 0x0258, + 0x08 => 0x0258, 0x09 => 0x0258, 0x0a => 0x0258, 0x0b => 0x0258, + 0x0c => 0x0258, 0x0d => 0x0258, 0x0e => 0x0258, 0x0f => 0x0258, + 0x10 => 0x0258, 0x11 => 0x0258, 0x12 => 0x0258, 0x13 => 0x0258, + 0x14 => 0x0258, 0x15 => 0x0258, 0x16 => 0x0258, 0x17 => 0x0258, + 0x18 => 0x0258, 0x19 => 0x0258, 0x1a => 0x0258, 0x1b => 0x0258, + 0x1c => 0x0258, 0x1d => 0x0258, 0x1e => 0x0258, 0x1f => 0x0258, + 0x20 => 0x0258, 0x21 => 0x0258, 0x22 => 0x0258, 0x23 => 0x0258, + 0x24 => 0x0258, 0x25 => 0x0258, 0x26 => 0x0258, 0x27 => 0x0258, + 0x28 => 0x0258, 0x29 => 0x0258, 0x2a => 0x0258, 0x2b => 0x0258, + 0x2c => 0x0258, 0x2d => 0x0258, 0x2e => 0x0258, 0x2f => 0x0258, + 0x30 => 0x0258, 0x31 => 0x0258, 0x32 => 0x0258, 0x33 => 0x0258, + 0x34 => 0x0258, 0x35 => 0x0258, 0x36 => 0x0258, 0x37 => 0x0258, + 0x38 => 0x0258, 0x39 => 0x0258, 0x3a => 0x0258, 0x3b => 0x0258, + 0x3c => 0x0258, 0x3d => 0x0258, 0x3e => 0x0258, 0x3f => 0x0258, + 0x40 => 0x0258, 0x41 => 0x0258, 0x42 => 0x0258, 0x43 => 0x0258, + 0x44 => 0x0258, 0x45 => 0x0258, 0x46 => 0x0258, 0x47 => 0x0258, + 0x48 => 0x0258, 0x49 => 0x0258, 0x4a => 0x0258, 0x4b => 0x0258, + 0x4c => 0x0258, 0x4d => 0x0258, 0x4e => 0x0258, 0x4f => 0x0258, + 0x50 => 0x0258, 0x51 => 0x0258, 0x52 => 0x0258, 0x53 => 0x0258, + 0x54 => 0x0258, 0x55 => 0x0258, 0x56 => 0x0258, 0x57 => 0x0258, + 0x58 => 0x0258, 0x59 => 0x0258, 0x5a => 0x0258, 0x5b => 0x0258, + 0x5c => 0x0258, 0x5d => 0x0258, 0x5e => 0x0258, 0x5f => 0x0258, + 0x60 => 0x0258, 0x61 => 0x0258, 0x62 => 0x0258, 0x63 => 0x0258, + 0x64 => 0x0258, 0x65 => 0x0258, 0x66 => 0x0258, 0x67 => 0x0258, + 0x68 => 0x0258, 0x69 => 0x0258, 0x6a => 0x0258, 0x6b => 0x0258, + 0x6c => 0x0258, 0x6d => 0x0258, 0x6e => 0x0258, 0x6f => 0x0258, + 0x70 => 0x0258, 0x71 => 0x0258, 0x72 => 0x0258, 0x73 => 0x0258, + 0x74 => 0x0258, 0x75 => 0x0258, 0x76 => 0x0258, 0x77 => 0x0258, + 0x78 => 0x0258, 0x79 => 0x0258, 0x7a => 0x0258, 0x7b => 0x0258, + 0x7c => 0x0258, 0x7d => 0x0258, 0x7e => 0x0258, 0x7f => 0x0258, + 0x80 => 0x0258, 0x81 => 0x0258, 0x82 => 0x0258, 0x83 => 0x0258, + 0x84 => 0x0258, 0x85 => 0x0258, 0x86 => 0x0258, 0x87 => 0x0258, + 0x88 => 0x0258, 0x89 => 0x0258, 0x8a => 0x0258, 0x8b => 0x0258, + 0x8c => 0x0258, 0x8d => 0x0258, 0x8e => 0x0258, 0x8f => 0x0258, + 0x90 => 0x0258, 0x91 => 0x0258, 0x92 => 0x0258, 0x93 => 0x0258, + 0x94 => 0x0258, 0x95 => 0x0258, 0x96 => 0x0258, 0x97 => 0x0258, + 0x98 => 0x0258, 0x99 => 0x0258, 0x9a => 0x0258, 0x9b => 0x0258, + 0x9c => 0x0258, 0x9d => 0x0258, 0x9e => 0x0258, 0x9f => 0x0258, + 0xa0 => 0x0258, 0xa1 => 0x0258, 0xa2 => 0x0258, 0xa3 => 0x0258, + 0xa4 => 0x0258, 0xa5 => 0x0258, 0xa6 => 0x0258, 0xa7 => 0x0258, + 0xa8 => 0x0258, 0xa9 => 0x0258, 0xaa => 0x0258, 0xab => 0x0258, + 0xac => 0x0258, 0xad => 0x0258, 0xae => 0x0258, 0xaf => 0x0258, + 0xb0 => 0x0258, 0xb1 => 0x0258, 0xb2 => 0x0258, 0xb3 => 0x0258, + 0xb4 => 0x0258, 0xb5 => 0x0258, 0xb6 => 0x0258, 0xb7 => 0x0258, + 0xb8 => 0x0258, 0xb9 => 0x0258, 0xba => 0x0258, 0xbb => 0x0258, + 0xbc => 0x0258, 0xbd => 0x0258, 0xbe => 0x0258, 0xbf => 0x0258, + 0xc0 => 0x0258, 0xc1 => 0x0258, 0xc2 => 0x0258, 0xc3 => 0x0258, + 0xc4 => 0x0258, 0xc5 => 0x0258, 0xc6 => 0x0258, 0xc7 => 0x0258, + 0xc8 => 0x0258, 0xc9 => 0x0258, 0xca => 0x0258, 0xcb => 0x0258, + 0xcc => 0x0258, 0xcd => 0x0258, 0xce => 0x0258, 0xcf => 0x0258, + 0xd0 => 0x0258, 0xd1 => 0x0258, 0xd2 => 0x0258, 0xd3 => 0x0258, + 0xd4 => 0x0258, 0xd5 => 0x0258, 0xd6 => 0x0258, 0xd7 => 0x0258, + 0xd8 => 0x0258, 0xd9 => 0x0258, 0xda => 0x0258, 0xdb => 0x0258, + 0xdc => 0x0258, 0xdd => 0x0258, 0xde => 0x0258, 0xdf => 0x0258, + 0xe0 => 0x0258, 0xe1 => 0x0258, 0xe2 => 0x0258, 0xe3 => 0x0258, + 0xe4 => 0x0258, 0xe5 => 0x0258, 0xe6 => 0x0258, 0xe7 => 0x0258, + 0xe8 => 0x0258, 0xe9 => 0x0258, 0xea => 0x0258, 0xeb => 0x0258, + 0xec => 0x0258, 0xed => 0x0258, 0xee => 0x0258, 0xef => 0x0258, + 0xf0 => 0x0258, 0xf1 => 0x0258, 0xf2 => 0x0258, 0xf3 => 0x0258, + 0xf4 => 0x0258, 0xf5 => 0x0258, 0xf6 => 0x0258, 0xf7 => 0x0258, + 0xf8 => 0x0258, 0xf9 => 0x0258, 0xfa => 0x0258, 0xfb => 0x0258, + 0xfc => 0x0258, 0xfd => 0x0258, 0xfe => 0x0258, 0xff => 0x0258, + 0x0100 => 0x0258, 0x0101 => 0x0258, 0x0102 => 0x0258, 0x0103 => 0x0258, + 0x0104 => 0x0258, 0x0105 => 0x0258, 0x0106 => 0x0258, 0x0107 => 0x0258, + 0x0108 => 0x0258, 0x0109 => 0x0258, 0x010a => 0x0258, 0x010b => 0x0258, + 0x010c => 0x0258, 0x010d => 0x0258, 0x010e => 0x0258, 0x010f => 0x0258, + 0x0110 => 0x0258, 0x0111 => 0x0258, 0x0112 => 0x0258, 0x0113 => 0x0258, + 0x0114 => 0x0258, 0x0115 => 0x0258, 0x0116 => 0x0258, 0x0117 => 0x0258, + 0x0118 => 0x0258, 0x0119 => 0x0258, 0x011a => 0x0258, 0x011b => 0x0258, + 0x011c => 0x0258, 0x011d => 0x0258, 0x011e => 0x0258, 0x011f => 0x0258, + 0x0120 => 0x0258, 0x0121 => 0x0258, 0x0122 => 0x0258, 0x0123 => 0x0258, + 0x0124 => 0x0258, 0x0125 => 0x0258, 0x0126 => 0x0258, 0x0127 => 0x0258, + 0x0128 => 0x0258, 0x0129 => 0x0258, 0x012a => 0x0258, 0x012b => 0x0258, + 0x012c => 0x0258, 0x012d => 0x0258, 0x012e => 0x0258, 0x012f => 0x0258, + 0x0130 => 0x0258, 0x0131 => 0x0258, 0x0132 => 0x0258, 0x0133 => 0x0258, + 0x0134 => 0x0258, 0x0135 => 0x0258, 0x0136 => 0x0258, 0x0137 => 0x0258, + 0x0138 => 0x0258, 0x0139 => 0x0258, 0x013a => 0x0258, 0x013b => 0x0258, + ); + + /* The cmap table is similarly synthesized. + */ + $cmapData = array( + 0x20 => 0x01, 0x21 => 0x02, 0x22 => 0x03, 0x23 => 0x04, + 0x24 => 0x05, 0x25 => 0x06, 0x26 => 0x07, 0x2019 => 0x08, + 0x28 => 0x09, 0x29 => 0x0a, 0x2a => 0x0b, 0x2b => 0x0c, + 0x2c => 0x0d, 0x2d => 0x0e, 0x2e => 0x0f, 0x2f => 0x10, + 0x30 => 0x11, 0x31 => 0x12, 0x32 => 0x13, 0x33 => 0x14, + 0x34 => 0x15, 0x35 => 0x16, 0x36 => 0x17, 0x37 => 0x18, + 0x38 => 0x19, 0x39 => 0x1a, 0x3a => 0x1b, 0x3b => 0x1c, + 0x3c => 0x1d, 0x3d => 0x1e, 0x3e => 0x1f, 0x3f => 0x20, + 0x40 => 0x21, 0x41 => 0x22, 0x42 => 0x23, 0x43 => 0x24, + 0x44 => 0x25, 0x45 => 0x26, 0x46 => 0x27, 0x47 => 0x28, + 0x48 => 0x29, 0x49 => 0x2a, 0x4a => 0x2b, 0x4b => 0x2c, + 0x4c => 0x2d, 0x4d => 0x2e, 0x4e => 0x2f, 0x4f => 0x30, + 0x50 => 0x31, 0x51 => 0x32, 0x52 => 0x33, 0x53 => 0x34, + 0x54 => 0x35, 0x55 => 0x36, 0x56 => 0x37, 0x57 => 0x38, + 0x58 => 0x39, 0x59 => 0x3a, 0x5a => 0x3b, 0x5b => 0x3c, + 0x5c => 0x3d, 0x5d => 0x3e, 0x5e => 0x3f, 0x5f => 0x40, + 0x2018 => 0x41, 0x61 => 0x42, 0x62 => 0x43, 0x63 => 0x44, + 0x64 => 0x45, 0x65 => 0x46, 0x66 => 0x47, 0x67 => 0x48, + 0x68 => 0x49, 0x69 => 0x4a, 0x6a => 0x4b, 0x6b => 0x4c, + 0x6c => 0x4d, 0x6d => 0x4e, 0x6e => 0x4f, 0x6f => 0x50, + 0x70 => 0x51, 0x71 => 0x52, 0x72 => 0x53, 0x73 => 0x54, + 0x74 => 0x55, 0x75 => 0x56, 0x76 => 0x57, 0x77 => 0x58, + 0x78 => 0x59, 0x79 => 0x5a, 0x7a => 0x5b, 0x7b => 0x5c, + 0x7c => 0x5d, 0x7d => 0x5e, 0x7e => 0x5f, 0xa1 => 0x60, + 0xa2 => 0x61, 0xa3 => 0x62, 0x2044 => 0x63, 0xa5 => 0x64, + 0x0192 => 0x65, 0xa7 => 0x66, 0xa4 => 0x67, 0x27 => 0x68, + 0x201c => 0x69, 0xab => 0x6a, 0x2039 => 0x6b, 0x203a => 0x6c, + 0xfb01 => 0x6d, 0xfb02 => 0x6e, 0x2013 => 0x6f, 0x2020 => 0x70, + 0x2021 => 0x71, 0xb7 => 0x72, 0xb6 => 0x73, 0x2022 => 0x74, + 0x201a => 0x75, 0x201e => 0x76, 0x201d => 0x77, 0xbb => 0x78, + 0x2026 => 0x79, 0x2030 => 0x7a, 0xbf => 0x7b, 0x60 => 0x7c, + 0xb4 => 0x7d, 0x02c6 => 0x7e, 0x02dc => 0x7f, 0xaf => 0x80, + 0x02d8 => 0x81, 0x02d9 => 0x82, 0xa8 => 0x83, 0x02da => 0x84, + 0xb8 => 0x85, 0x02dd => 0x86, 0x02db => 0x87, 0x02c7 => 0x88, + 0x2014 => 0x89, 0xc6 => 0x8a, 0xaa => 0x8b, 0x0141 => 0x8c, + 0xd8 => 0x8d, 0x0152 => 0x8e, 0xba => 0x8f, 0xe6 => 0x90, + 0x0131 => 0x91, 0x0142 => 0x92, 0xf8 => 0x93, 0x0153 => 0x94, + 0xdf => 0x95, 0xcf => 0x96, 0xe9 => 0x97, 0x0103 => 0x98, + 0x0171 => 0x99, 0x011b => 0x9a, 0x0178 => 0x9b, 0xf7 => 0x9c, + 0xdd => 0x9d, 0xc2 => 0x9e, 0xe1 => 0x9f, 0xdb => 0xa0, + 0xfd => 0xa1, 0x0219 => 0xa2, 0xea => 0xa3, 0x016e => 0xa4, + 0xdc => 0xa5, 0x0105 => 0xa6, 0xda => 0xa7, 0x0173 => 0xa8, + 0xcb => 0xa9, 0x0110 => 0xaa, 0xf6c3 => 0xab, 0xa9 => 0xac, + 0x0112 => 0xad, 0x010d => 0xae, 0xe5 => 0xaf, 0x0145 => 0xb0, + 0x013a => 0xb1, 0xe0 => 0xb2, 0x0162 => 0xb3, 0x0106 => 0xb4, + 0xe3 => 0xb5, 0x0116 => 0xb6, 0x0161 => 0xb7, 0x015f => 0xb8, + 0xed => 0xb9, 0x25ca => 0xba, 0x0158 => 0xbb, 0x0122 => 0xbc, + 0xfb => 0xbd, 0xe2 => 0xbe, 0x0100 => 0xbf, 0x0159 => 0xc0, + 0xe7 => 0xc1, 0x017b => 0xc2, 0xde => 0xc3, 0x014c => 0xc4, + 0x0154 => 0xc5, 0x015a => 0xc6, 0x010f => 0xc7, 0x016a => 0xc8, + 0x016f => 0xc9, 0xb3 => 0xca, 0xd2 => 0xcb, 0xc0 => 0xcc, + 0x0102 => 0xcd, 0xd7 => 0xce, 0xfa => 0xcf, 0x0164 => 0xd0, + 0x2202 => 0xd1, 0xff => 0xd2, 0x0143 => 0xd3, 0xee => 0xd4, + 0xca => 0xd5, 0xe4 => 0xd6, 0xeb => 0xd7, 0x0107 => 0xd8, + 0x0144 => 0xd9, 0x016b => 0xda, 0x0147 => 0xdb, 0xcd => 0xdc, + 0xb1 => 0xdd, 0xa6 => 0xde, 0xae => 0xdf, 0x011e => 0xe0, + 0x0130 => 0xe1, 0x2211 => 0xe2, 0xc8 => 0xe3, 0x0155 => 0xe4, + 0x014d => 0xe5, 0x0179 => 0xe6, 0x017d => 0xe7, 0x2265 => 0xe8, + 0xd0 => 0xe9, 0xc7 => 0xea, 0x013c => 0xeb, 0x0165 => 0xec, + 0x0119 => 0xed, 0x0172 => 0xee, 0xc1 => 0xef, 0xc4 => 0xf0, + 0xe8 => 0xf1, 0x017a => 0xf2, 0x012f => 0xf3, 0xd3 => 0xf4, + 0xf3 => 0xf5, 0x0101 => 0xf6, 0x015b => 0xf7, 0xef => 0xf8, + 0xd4 => 0xf9, 0xd9 => 0xfa, 0x2206 => 0xfb, 0xfe => 0xfc, + 0xb2 => 0xfd, 0xd6 => 0xfe, 0xb5 => 0xff, 0xec => 0x0100, + 0x0151 => 0x0101, 0x0118 => 0x0102, 0x0111 => 0x0103, 0xbe => 0x0104, + 0x015e => 0x0105, 0x013e => 0x0106, 0x0136 => 0x0107, 0x0139 => 0x0108, + 0x2122 => 0x0109, 0x0117 => 0x010a, 0xcc => 0x010b, 0x012a => 0x010c, + 0x013d => 0x010d, 0xbd => 0x010e, 0x2264 => 0x010f, 0xf4 => 0x0110, + 0xf1 => 0x0111, 0x0170 => 0x0112, 0xc9 => 0x0113, 0x0113 => 0x0114, + 0x011f => 0x0115, 0xbc => 0x0116, 0x0160 => 0x0117, 0x0218 => 0x0118, + 0x0150 => 0x0119, 0xb0 => 0x011a, 0xf2 => 0x011b, 0x010c => 0x011c, + 0xf9 => 0x011d, 0x221a => 0x011e, 0x010e => 0x011f, 0x0157 => 0x0120, + 0xd1 => 0x0121, 0xf5 => 0x0122, 0x0156 => 0x0123, 0x013b => 0x0124, + 0xc3 => 0x0125, 0x0104 => 0x0126, 0xc5 => 0x0127, 0xd5 => 0x0128, + 0x017c => 0x0129, 0x011a => 0x012a, 0x012e => 0x012b, 0x0137 => 0x012c, + 0x2212 => 0x012d, 0xce => 0x012e, 0x0148 => 0x012f, 0x0163 => 0x0130, + 0xac => 0x0131, 0xf6 => 0x0132, 0xfc => 0x0133, 0x2260 => 0x0134, + 0x0123 => 0x0135, 0xf0 => 0x0136, 0x017e => 0x0137, 0x0146 => 0x0138, + 0xb9 => 0x0139, 0x012b => 0x013a, 0x20ac => 0x013b); + $this->_cmap = Zend_Pdf_Cmap::cmapWithTypeData( + Zend_Pdf_Cmap::TYPE_BYTE_ENCODING_STATIC, $cmapData); + + + /* Resource dictionary */ + + /* The resource dictionary for the standard fonts is sparse because PDF + * viewers already have all of the metrics data. We only need to provide + * the font name and encoding method. + */ + $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 new file mode 100644 index 0000000..e6bd56e --- /dev/null +++ b/libs/Zend/Pdf/Resource/Font/Simple/Standard/CourierOblique.php @@ -0,0 +1,291 @@ +_fontNames[Zend_Pdf_Font::NAME_COPYRIGHT]['en'] = + "\x00\x43\x00\x6f\x00\x70\x00\x79\x00\x72\x00\x69\x00\x67\x00\x68\x00" + . "\x74\x00\x20\x00\x28\x00\x63\x00\x29\x00\x20\x00\x31\x00\x39\x00" + . "\x38\x00\x39\x00\x2c\x00\x20\x00\x31\x00\x39\x00\x39\x00\x30\x00" + . "\x2c\x00\x20\x00\x31\x00\x39\x00\x39\x00\x31\x00\x2c\x00\x20\x00" + . "\x31\x00\x39\x00\x39\x00\x32\x00\x2c\x00\x20\x00\x31\x00\x39\x00" + . "\x39\x00\x33\x00\x2c\x00\x20\x00\x31\x00\x39\x00\x39\x00\x37\x00" + . "\x20\x00\x41\x00\x64\x00\x6f\x00\x62\x00\x65\x00\x20\x00\x53\x00" + . "\x79\x00\x73\x00\x74\x00\x65\x00\x6d\x00\x73\x00\x20\x00\x49\x00" + . "\x6e\x00\x63\x00\x6f\x00\x72\x00\x70\x00\x6f\x00\x72\x00\x61\x00" + . "\x74\x00\x65\x00\x64\x00\x2e\x00\x20\x00\x20\x00\x41\x00\x6c\x00" + . "\x6c\x00\x20\x00\x52\x00\x69\x00\x67\x00\x68\x00\x74\x00\x73\x00" + . "\x20\x00\x52\x00\x65\x00\x73\x00\x65\x00\x72\x00\x76\x00\x65\x00" + . "\x64\x00\x2e"; + $this->_fontNames[Zend_Pdf_Font::NAME_FAMILY]['en'] = + "\x00\x43\x00\x6f\x00\x75\x00\x72\x00\x69\x00\x65\x00\x72"; + $this->_fontNames[Zend_Pdf_Font::NAME_STYLE]['en'] = + "\x00\x4d\x00\x65\x00\x64\x00\x69\x00\x75\x00\x6d"; + $this->_fontNames[Zend_Pdf_Font::NAME_ID]['en'] = + "\x00\x34\x00\x33\x00\x30\x00\x35\x00\x31"; + $this->_fontNames[Zend_Pdf_Font::NAME_FULL]['en'] = + "\x00\x43\x00\x6f\x00\x75\x00\x72\x00\x69\x00\x65\x00\x72\x00\x2d\x00" + . "\x4f\x00\x62\x00\x6c\x00\x69\x00\x71\x00\x75\x00\x65\x00\x20\x00" + . "\x4d\x00\x65\x00\x64\x00\x69\x00\x75\x00\x6d"; + $this->_fontNames[Zend_Pdf_Font::NAME_VERSION]['en'] = + "\x00\x30\x00\x30\x00\x33\x00\x2e\x00\x30\x00\x30\x00\x30"; + $this->_fontNames[Zend_Pdf_Font::NAME_POSTSCRIPT]['en'] = + "\x00\x43\x00\x6f\x00\x75\x00\x72\x00\x69\x00\x65\x00\x72\x00\x2d\x00" + . "\x4f\x00\x62\x00\x6c\x00\x69\x00\x71\x00\x75\x00\x65"; + + $this->_isBold = false; + $this->_isItalic = true; + $this->_isMonospaced = true; + + $this->_underlinePosition = -100; + $this->_underlineThickness = 50; + $this->_strikePosition = 225; + $this->_strikeThickness = 50; + + $this->_unitsPerEm = 1000; + + $this->_ascent = 629; + $this->_descent = -157; + $this->_lineGap = 414; + + /* The glyph numbers assigned here are synthetic; they do not match the + * actual glyph numbers used by the font. This is not a big deal though + * since this data never makes it to the PDF file. It is only used + * internally for layout calculations. + */ + $this->_glyphWidths = array( + 0x00 => 0x01f4, 0x01 => 0x0258, 0x02 => 0x0258, 0x03 => 0x0258, + 0x04 => 0x0258, 0x05 => 0x0258, 0x06 => 0x0258, 0x07 => 0x0258, + 0x08 => 0x0258, 0x09 => 0x0258, 0x0a => 0x0258, 0x0b => 0x0258, + 0x0c => 0x0258, 0x0d => 0x0258, 0x0e => 0x0258, 0x0f => 0x0258, + 0x10 => 0x0258, 0x11 => 0x0258, 0x12 => 0x0258, 0x13 => 0x0258, + 0x14 => 0x0258, 0x15 => 0x0258, 0x16 => 0x0258, 0x17 => 0x0258, + 0x18 => 0x0258, 0x19 => 0x0258, 0x1a => 0x0258, 0x1b => 0x0258, + 0x1c => 0x0258, 0x1d => 0x0258, 0x1e => 0x0258, 0x1f => 0x0258, + 0x20 => 0x0258, 0x21 => 0x0258, 0x22 => 0x0258, 0x23 => 0x0258, + 0x24 => 0x0258, 0x25 => 0x0258, 0x26 => 0x0258, 0x27 => 0x0258, + 0x28 => 0x0258, 0x29 => 0x0258, 0x2a => 0x0258, 0x2b => 0x0258, + 0x2c => 0x0258, 0x2d => 0x0258, 0x2e => 0x0258, 0x2f => 0x0258, + 0x30 => 0x0258, 0x31 => 0x0258, 0x32 => 0x0258, 0x33 => 0x0258, + 0x34 => 0x0258, 0x35 => 0x0258, 0x36 => 0x0258, 0x37 => 0x0258, + 0x38 => 0x0258, 0x39 => 0x0258, 0x3a => 0x0258, 0x3b => 0x0258, + 0x3c => 0x0258, 0x3d => 0x0258, 0x3e => 0x0258, 0x3f => 0x0258, + 0x40 => 0x0258, 0x41 => 0x0258, 0x42 => 0x0258, 0x43 => 0x0258, + 0x44 => 0x0258, 0x45 => 0x0258, 0x46 => 0x0258, 0x47 => 0x0258, + 0x48 => 0x0258, 0x49 => 0x0258, 0x4a => 0x0258, 0x4b => 0x0258, + 0x4c => 0x0258, 0x4d => 0x0258, 0x4e => 0x0258, 0x4f => 0x0258, + 0x50 => 0x0258, 0x51 => 0x0258, 0x52 => 0x0258, 0x53 => 0x0258, + 0x54 => 0x0258, 0x55 => 0x0258, 0x56 => 0x0258, 0x57 => 0x0258, + 0x58 => 0x0258, 0x59 => 0x0258, 0x5a => 0x0258, 0x5b => 0x0258, + 0x5c => 0x0258, 0x5d => 0x0258, 0x5e => 0x0258, 0x5f => 0x0258, + 0x60 => 0x0258, 0x61 => 0x0258, 0x62 => 0x0258, 0x63 => 0x0258, + 0x64 => 0x0258, 0x65 => 0x0258, 0x66 => 0x0258, 0x67 => 0x0258, + 0x68 => 0x0258, 0x69 => 0x0258, 0x6a => 0x0258, 0x6b => 0x0258, + 0x6c => 0x0258, 0x6d => 0x0258, 0x6e => 0x0258, 0x6f => 0x0258, + 0x70 => 0x0258, 0x71 => 0x0258, 0x72 => 0x0258, 0x73 => 0x0258, + 0x74 => 0x0258, 0x75 => 0x0258, 0x76 => 0x0258, 0x77 => 0x0258, + 0x78 => 0x0258, 0x79 => 0x0258, 0x7a => 0x0258, 0x7b => 0x0258, + 0x7c => 0x0258, 0x7d => 0x0258, 0x7e => 0x0258, 0x7f => 0x0258, + 0x80 => 0x0258, 0x81 => 0x0258, 0x82 => 0x0258, 0x83 => 0x0258, + 0x84 => 0x0258, 0x85 => 0x0258, 0x86 => 0x0258, 0x87 => 0x0258, + 0x88 => 0x0258, 0x89 => 0x0258, 0x8a => 0x0258, 0x8b => 0x0258, + 0x8c => 0x0258, 0x8d => 0x0258, 0x8e => 0x0258, 0x8f => 0x0258, + 0x90 => 0x0258, 0x91 => 0x0258, 0x92 => 0x0258, 0x93 => 0x0258, + 0x94 => 0x0258, 0x95 => 0x0258, 0x96 => 0x0258, 0x97 => 0x0258, + 0x98 => 0x0258, 0x99 => 0x0258, 0x9a => 0x0258, 0x9b => 0x0258, + 0x9c => 0x0258, 0x9d => 0x0258, 0x9e => 0x0258, 0x9f => 0x0258, + 0xa0 => 0x0258, 0xa1 => 0x0258, 0xa2 => 0x0258, 0xa3 => 0x0258, + 0xa4 => 0x0258, 0xa5 => 0x0258, 0xa6 => 0x0258, 0xa7 => 0x0258, + 0xa8 => 0x0258, 0xa9 => 0x0258, 0xaa => 0x0258, 0xab => 0x0258, + 0xac => 0x0258, 0xad => 0x0258, 0xae => 0x0258, 0xaf => 0x0258, + 0xb0 => 0x0258, 0xb1 => 0x0258, 0xb2 => 0x0258, 0xb3 => 0x0258, + 0xb4 => 0x0258, 0xb5 => 0x0258, 0xb6 => 0x0258, 0xb7 => 0x0258, + 0xb8 => 0x0258, 0xb9 => 0x0258, 0xba => 0x0258, 0xbb => 0x0258, + 0xbc => 0x0258, 0xbd => 0x0258, 0xbe => 0x0258, 0xbf => 0x0258, + 0xc0 => 0x0258, 0xc1 => 0x0258, 0xc2 => 0x0258, 0xc3 => 0x0258, + 0xc4 => 0x0258, 0xc5 => 0x0258, 0xc6 => 0x0258, 0xc7 => 0x0258, + 0xc8 => 0x0258, 0xc9 => 0x0258, 0xca => 0x0258, 0xcb => 0x0258, + 0xcc => 0x0258, 0xcd => 0x0258, 0xce => 0x0258, 0xcf => 0x0258, + 0xd0 => 0x0258, 0xd1 => 0x0258, 0xd2 => 0x0258, 0xd3 => 0x0258, + 0xd4 => 0x0258, 0xd5 => 0x0258, 0xd6 => 0x0258, 0xd7 => 0x0258, + 0xd8 => 0x0258, 0xd9 => 0x0258, 0xda => 0x0258, 0xdb => 0x0258, + 0xdc => 0x0258, 0xdd => 0x0258, 0xde => 0x0258, 0xdf => 0x0258, + 0xe0 => 0x0258, 0xe1 => 0x0258, 0xe2 => 0x0258, 0xe3 => 0x0258, + 0xe4 => 0x0258, 0xe5 => 0x0258, 0xe6 => 0x0258, 0xe7 => 0x0258, + 0xe8 => 0x0258, 0xe9 => 0x0258, 0xea => 0x0258, 0xeb => 0x0258, + 0xec => 0x0258, 0xed => 0x0258, 0xee => 0x0258, 0xef => 0x0258, + 0xf0 => 0x0258, 0xf1 => 0x0258, 0xf2 => 0x0258, 0xf3 => 0x0258, + 0xf4 => 0x0258, 0xf5 => 0x0258, 0xf6 => 0x0258, 0xf7 => 0x0258, + 0xf8 => 0x0258, 0xf9 => 0x0258, 0xfa => 0x0258, 0xfb => 0x0258, + 0xfc => 0x0258, 0xfd => 0x0258, 0xfe => 0x0258, 0xff => 0x0258, + 0x0100 => 0x0258, 0x0101 => 0x0258, 0x0102 => 0x0258, 0x0103 => 0x0258, + 0x0104 => 0x0258, 0x0105 => 0x0258, 0x0106 => 0x0258, 0x0107 => 0x0258, + 0x0108 => 0x0258, 0x0109 => 0x0258, 0x010a => 0x0258, 0x010b => 0x0258, + 0x010c => 0x0258, 0x010d => 0x0258, 0x010e => 0x0258, 0x010f => 0x0258, + 0x0110 => 0x0258, 0x0111 => 0x0258, 0x0112 => 0x0258, 0x0113 => 0x0258, + 0x0114 => 0x0258, 0x0115 => 0x0258, 0x0116 => 0x0258, 0x0117 => 0x0258, + 0x0118 => 0x0258, 0x0119 => 0x0258, 0x011a => 0x0258, 0x011b => 0x0258, + 0x011c => 0x0258, 0x011d => 0x0258, 0x011e => 0x0258, 0x011f => 0x0258, + 0x0120 => 0x0258, 0x0121 => 0x0258, 0x0122 => 0x0258, 0x0123 => 0x0258, + 0x0124 => 0x0258, 0x0125 => 0x0258, 0x0126 => 0x0258, 0x0127 => 0x0258, + 0x0128 => 0x0258, 0x0129 => 0x0258, 0x012a => 0x0258, 0x012b => 0x0258, + 0x012c => 0x0258, 0x012d => 0x0258, 0x012e => 0x0258, 0x012f => 0x0258, + 0x0130 => 0x0258, 0x0131 => 0x0258, 0x0132 => 0x0258, 0x0133 => 0x0258, + 0x0134 => 0x0258, 0x0135 => 0x0258, 0x0136 => 0x0258, 0x0137 => 0x0258, + 0x0138 => 0x0258, 0x0139 => 0x0258, 0x013a => 0x0258, 0x013b => 0x0258, + ); + + /* The cmap table is similarly synthesized. + */ + $cmapData = array( + 0x20 => 0x01, 0x21 => 0x02, 0x22 => 0x03, 0x23 => 0x04, + 0x24 => 0x05, 0x25 => 0x06, 0x26 => 0x07, 0x2019 => 0x08, + 0x28 => 0x09, 0x29 => 0x0a, 0x2a => 0x0b, 0x2b => 0x0c, + 0x2c => 0x0d, 0x2d => 0x0e, 0x2e => 0x0f, 0x2f => 0x10, + 0x30 => 0x11, 0x31 => 0x12, 0x32 => 0x13, 0x33 => 0x14, + 0x34 => 0x15, 0x35 => 0x16, 0x36 => 0x17, 0x37 => 0x18, + 0x38 => 0x19, 0x39 => 0x1a, 0x3a => 0x1b, 0x3b => 0x1c, + 0x3c => 0x1d, 0x3d => 0x1e, 0x3e => 0x1f, 0x3f => 0x20, + 0x40 => 0x21, 0x41 => 0x22, 0x42 => 0x23, 0x43 => 0x24, + 0x44 => 0x25, 0x45 => 0x26, 0x46 => 0x27, 0x47 => 0x28, + 0x48 => 0x29, 0x49 => 0x2a, 0x4a => 0x2b, 0x4b => 0x2c, + 0x4c => 0x2d, 0x4d => 0x2e, 0x4e => 0x2f, 0x4f => 0x30, + 0x50 => 0x31, 0x51 => 0x32, 0x52 => 0x33, 0x53 => 0x34, + 0x54 => 0x35, 0x55 => 0x36, 0x56 => 0x37, 0x57 => 0x38, + 0x58 => 0x39, 0x59 => 0x3a, 0x5a => 0x3b, 0x5b => 0x3c, + 0x5c => 0x3d, 0x5d => 0x3e, 0x5e => 0x3f, 0x5f => 0x40, + 0x2018 => 0x41, 0x61 => 0x42, 0x62 => 0x43, 0x63 => 0x44, + 0x64 => 0x45, 0x65 => 0x46, 0x66 => 0x47, 0x67 => 0x48, + 0x68 => 0x49, 0x69 => 0x4a, 0x6a => 0x4b, 0x6b => 0x4c, + 0x6c => 0x4d, 0x6d => 0x4e, 0x6e => 0x4f, 0x6f => 0x50, + 0x70 => 0x51, 0x71 => 0x52, 0x72 => 0x53, 0x73 => 0x54, + 0x74 => 0x55, 0x75 => 0x56, 0x76 => 0x57, 0x77 => 0x58, + 0x78 => 0x59, 0x79 => 0x5a, 0x7a => 0x5b, 0x7b => 0x5c, + 0x7c => 0x5d, 0x7d => 0x5e, 0x7e => 0x5f, 0xa1 => 0x60, + 0xa2 => 0x61, 0xa3 => 0x62, 0x2044 => 0x63, 0xa5 => 0x64, + 0x0192 => 0x65, 0xa7 => 0x66, 0xa4 => 0x67, 0x27 => 0x68, + 0x201c => 0x69, 0xab => 0x6a, 0x2039 => 0x6b, 0x203a => 0x6c, + 0xfb01 => 0x6d, 0xfb02 => 0x6e, 0x2013 => 0x6f, 0x2020 => 0x70, + 0x2021 => 0x71, 0xb7 => 0x72, 0xb6 => 0x73, 0x2022 => 0x74, + 0x201a => 0x75, 0x201e => 0x76, 0x201d => 0x77, 0xbb => 0x78, + 0x2026 => 0x79, 0x2030 => 0x7a, 0xbf => 0x7b, 0x60 => 0x7c, + 0xb4 => 0x7d, 0x02c6 => 0x7e, 0x02dc => 0x7f, 0xaf => 0x80, + 0x02d8 => 0x81, 0x02d9 => 0x82, 0xa8 => 0x83, 0x02da => 0x84, + 0xb8 => 0x85, 0x02dd => 0x86, 0x02db => 0x87, 0x02c7 => 0x88, + 0x2014 => 0x89, 0xc6 => 0x8a, 0xaa => 0x8b, 0x0141 => 0x8c, + 0xd8 => 0x8d, 0x0152 => 0x8e, 0xba => 0x8f, 0xe6 => 0x90, + 0x0131 => 0x91, 0x0142 => 0x92, 0xf8 => 0x93, 0x0153 => 0x94, + 0xdf => 0x95, 0xcf => 0x96, 0xe9 => 0x97, 0x0103 => 0x98, + 0x0171 => 0x99, 0x011b => 0x9a, 0x0178 => 0x9b, 0xf7 => 0x9c, + 0xdd => 0x9d, 0xc2 => 0x9e, 0xe1 => 0x9f, 0xdb => 0xa0, + 0xfd => 0xa1, 0x0219 => 0xa2, 0xea => 0xa3, 0x016e => 0xa4, + 0xdc => 0xa5, 0x0105 => 0xa6, 0xda => 0xa7, 0x0173 => 0xa8, + 0xcb => 0xa9, 0x0110 => 0xaa, 0xf6c3 => 0xab, 0xa9 => 0xac, + 0x0112 => 0xad, 0x010d => 0xae, 0xe5 => 0xaf, 0x0145 => 0xb0, + 0x013a => 0xb1, 0xe0 => 0xb2, 0x0162 => 0xb3, 0x0106 => 0xb4, + 0xe3 => 0xb5, 0x0116 => 0xb6, 0x0161 => 0xb7, 0x015f => 0xb8, + 0xed => 0xb9, 0x25ca => 0xba, 0x0158 => 0xbb, 0x0122 => 0xbc, + 0xfb => 0xbd, 0xe2 => 0xbe, 0x0100 => 0xbf, 0x0159 => 0xc0, + 0xe7 => 0xc1, 0x017b => 0xc2, 0xde => 0xc3, 0x014c => 0xc4, + 0x0154 => 0xc5, 0x015a => 0xc6, 0x010f => 0xc7, 0x016a => 0xc8, + 0x016f => 0xc9, 0xb3 => 0xca, 0xd2 => 0xcb, 0xc0 => 0xcc, + 0x0102 => 0xcd, 0xd7 => 0xce, 0xfa => 0xcf, 0x0164 => 0xd0, + 0x2202 => 0xd1, 0xff => 0xd2, 0x0143 => 0xd3, 0xee => 0xd4, + 0xca => 0xd5, 0xe4 => 0xd6, 0xeb => 0xd7, 0x0107 => 0xd8, + 0x0144 => 0xd9, 0x016b => 0xda, 0x0147 => 0xdb, 0xcd => 0xdc, + 0xb1 => 0xdd, 0xa6 => 0xde, 0xae => 0xdf, 0x011e => 0xe0, + 0x0130 => 0xe1, 0x2211 => 0xe2, 0xc8 => 0xe3, 0x0155 => 0xe4, + 0x014d => 0xe5, 0x0179 => 0xe6, 0x017d => 0xe7, 0x2265 => 0xe8, + 0xd0 => 0xe9, 0xc7 => 0xea, 0x013c => 0xeb, 0x0165 => 0xec, + 0x0119 => 0xed, 0x0172 => 0xee, 0xc1 => 0xef, 0xc4 => 0xf0, + 0xe8 => 0xf1, 0x017a => 0xf2, 0x012f => 0xf3, 0xd3 => 0xf4, + 0xf3 => 0xf5, 0x0101 => 0xf6, 0x015b => 0xf7, 0xef => 0xf8, + 0xd4 => 0xf9, 0xd9 => 0xfa, 0x2206 => 0xfb, 0xfe => 0xfc, + 0xb2 => 0xfd, 0xd6 => 0xfe, 0xb5 => 0xff, 0xec => 0x0100, + 0x0151 => 0x0101, 0x0118 => 0x0102, 0x0111 => 0x0103, 0xbe => 0x0104, + 0x015e => 0x0105, 0x013e => 0x0106, 0x0136 => 0x0107, 0x0139 => 0x0108, + 0x2122 => 0x0109, 0x0117 => 0x010a, 0xcc => 0x010b, 0x012a => 0x010c, + 0x013d => 0x010d, 0xbd => 0x010e, 0x2264 => 0x010f, 0xf4 => 0x0110, + 0xf1 => 0x0111, 0x0170 => 0x0112, 0xc9 => 0x0113, 0x0113 => 0x0114, + 0x011f => 0x0115, 0xbc => 0x0116, 0x0160 => 0x0117, 0x0218 => 0x0118, + 0x0150 => 0x0119, 0xb0 => 0x011a, 0xf2 => 0x011b, 0x010c => 0x011c, + 0xf9 => 0x011d, 0x221a => 0x011e, 0x010e => 0x011f, 0x0157 => 0x0120, + 0xd1 => 0x0121, 0xf5 => 0x0122, 0x0156 => 0x0123, 0x013b => 0x0124, + 0xc3 => 0x0125, 0x0104 => 0x0126, 0xc5 => 0x0127, 0xd5 => 0x0128, + 0x017c => 0x0129, 0x011a => 0x012a, 0x012e => 0x012b, 0x0137 => 0x012c, + 0x2212 => 0x012d, 0xce => 0x012e, 0x0148 => 0x012f, 0x0163 => 0x0130, + 0xac => 0x0131, 0xf6 => 0x0132, 0xfc => 0x0133, 0x2260 => 0x0134, + 0x0123 => 0x0135, 0xf0 => 0x0136, 0x017e => 0x0137, 0x0146 => 0x0138, + 0xb9 => 0x0139, 0x012b => 0x013a, 0x20ac => 0x013b); + $this->_cmap = Zend_Pdf_Cmap::cmapWithTypeData( + Zend_Pdf_Cmap::TYPE_BYTE_ENCODING_STATIC, $cmapData); + + + /* Resource dictionary */ + + /* The resource dictionary for the standard fonts is sparse because PDF + * viewers already have all of the metrics data. We only need to provide + * the font name and encoding method. + */ + $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 new file mode 100644 index 0000000..f67e4ff --- /dev/null +++ b/libs/Zend/Pdf/Resource/Font/Simple/Standard/Helvetica.php @@ -0,0 +1,299 @@ +_fontNames[Zend_Pdf_Font::NAME_COPYRIGHT]['en'] = + "\x00\x43\x00\x6f\x00\x70\x00\x79\x00\x72\x00\x69\x00\x67\x00\x68\x00" + . "\x74\x00\x20\x00\x28\x00\x63\x00\x29\x00\x20\x00\x31\x00\x39\x00" + . "\x38\x00\x35\x00\x2c\x00\x20\x00\x31\x00\x39\x00\x38\x00\x37\x00" + . "\x2c\x00\x20\x00\x31\x00\x39\x00\x38\x00\x39\x00\x2c\x00\x20\x00" + . "\x31\x00\x39\x00\x39\x00\x30\x00\x2c\x00\x20\x00\x31\x00\x39\x00" + . "\x39\x00\x37\x00\x20\x00\x41\x00\x64\x00\x6f\x00\x62\x00\x65\x00" + . "\x20\x00\x53\x00\x79\x00\x73\x00\x74\x00\x65\x00\x6d\x00\x73\x00" + . "\x20\x00\x49\x00\x6e\x00\x63\x00\x6f\x00\x72\x00\x70\x00\x6f\x00" + . "\x72\x00\x61\x00\x74\x00\x65\x00\x64\x00\x2e\x00\x20\x00\x20\x00" + . "\x41\x00\x6c\x00\x6c\x00\x20\x00\x52\x00\x69\x00\x67\x00\x68\x00" + . "\x74\x00\x73\x00\x20\x00\x52\x00\x65\x00\x73\x00\x65\x00\x72\x00" + . "\x76\x00\x65\x00\x64\x00\x2e\x00\x48\x00\x65\x00\x6c\x00\x76\x00" + . "\x65\x00\x74\x00\x69\x00\x63\x00\x61\x00\x20\x00\x69\x00\x73\x00" + . "\x20\x00\x61\x00\x20\x00\x74\x00\x72\x00\x61\x00\x64\x00\x65\x00" + . "\x6d\x00\x61\x00\x72\x00\x6b\x00\x20\x00\x6f\x00\x66\x00\x20\x00" + . "\x4c\x00\x69\x00\x6e\x00\x6f\x00\x74\x00\x79\x00\x70\x00\x65\x00" + . "\x2d\x00\x48\x00\x65\x00\x6c\x00\x6c\x00\x20\x00\x41\x00\x47\x00" + . "\x20\x00\x61\x00\x6e\x00\x64\x00\x2f\x00\x6f\x00\x72\x00\x20\x00" + . "\x69\x00\x74\x00\x73\x00\x20\x00\x73\x00\x75\x00\x62\x00\x73\x00" + . "\x69\x00\x64\x00\x69\x00\x61\x00\x72\x00\x69\x00\x65\x00\x73\x00" + . "\x2e"; + $this->_fontNames[Zend_Pdf_Font::NAME_FAMILY]['en'] = + "\x00\x48\x00\x65\x00\x6c\x00\x76\x00\x65\x00\x74\x00\x69\x00\x63\x00" + . "\x61"; + $this->_fontNames[Zend_Pdf_Font::NAME_STYLE]['en'] = + "\x00\x4d\x00\x65\x00\x64\x00\x69\x00\x75\x00\x6d"; + $this->_fontNames[Zend_Pdf_Font::NAME_ID]['en'] = + "\x00\x34\x00\x33\x00\x30\x00\x35\x00\x34"; + $this->_fontNames[Zend_Pdf_Font::NAME_FULL]['en'] = + "\x00\x48\x00\x65\x00\x6c\x00\x76\x00\x65\x00\x74\x00\x69\x00\x63\x00" + . "\x61\x00\x20\x00\x4d\x00\x65\x00\x64\x00\x69\x00\x75\x00\x6d"; + $this->_fontNames[Zend_Pdf_Font::NAME_VERSION]['en'] = + "\x00\x30\x00\x30\x00\x32\x00\x2e\x00\x30\x00\x30\x00\x30"; + $this->_fontNames[Zend_Pdf_Font::NAME_POSTSCRIPT]['en'] = + "\x00\x48\x00\x65\x00\x6c\x00\x76\x00\x65\x00\x74\x00\x69\x00\x63\x00" + . "\x61"; + + $this->_isBold = false; + $this->_isItalic = false; + $this->_isMonospaced = false; + + $this->_underlinePosition = -100; + $this->_underlineThickness = 50; + $this->_strikePosition = 225; + $this->_strikeThickness = 50; + + $this->_unitsPerEm = 1000; + + $this->_ascent = 718; + $this->_descent = -207; + $this->_lineGap = 275; + + /* The glyph numbers assigned here are synthetic; they do not match the + * actual glyph numbers used by the font. This is not a big deal though + * since this data never makes it to the PDF file. It is only used + * internally for layout calculations. + */ + $this->_glyphWidths = array( + 0x00 => 0x01f4, 0x01 => 0x0116, 0x02 => 0x0116, 0x03 => 0x0163, + 0x04 => 0x022c, 0x05 => 0x022c, 0x06 => 0x0379, 0x07 => 0x029b, + 0x08 => 0xde, 0x09 => 0x014d, 0x0a => 0x014d, 0x0b => 0x0185, + 0x0c => 0x0248, 0x0d => 0x0116, 0x0e => 0x014d, 0x0f => 0x0116, + 0x10 => 0x0116, 0x11 => 0x022c, 0x12 => 0x022c, 0x13 => 0x022c, + 0x14 => 0x022c, 0x15 => 0x022c, 0x16 => 0x022c, 0x17 => 0x022c, + 0x18 => 0x022c, 0x19 => 0x022c, 0x1a => 0x022c, 0x1b => 0x0116, + 0x1c => 0x0116, 0x1d => 0x0248, 0x1e => 0x0248, 0x1f => 0x0248, + 0x20 => 0x022c, 0x21 => 0x03f7, 0x22 => 0x029b, 0x23 => 0x029b, + 0x24 => 0x02d2, 0x25 => 0x02d2, 0x26 => 0x029b, 0x27 => 0x0263, + 0x28 => 0x030a, 0x29 => 0x02d2, 0x2a => 0x0116, 0x2b => 0x01f4, + 0x2c => 0x029b, 0x2d => 0x022c, 0x2e => 0x0341, 0x2f => 0x02d2, + 0x30 => 0x030a, 0x31 => 0x029b, 0x32 => 0x030a, 0x33 => 0x02d2, + 0x34 => 0x029b, 0x35 => 0x0263, 0x36 => 0x02d2, 0x37 => 0x029b, + 0x38 => 0x03b0, 0x39 => 0x029b, 0x3a => 0x029b, 0x3b => 0x0263, + 0x3c => 0x0116, 0x3d => 0x0116, 0x3e => 0x0116, 0x3f => 0x01d5, + 0x40 => 0x022c, 0x41 => 0xde, 0x42 => 0x022c, 0x43 => 0x022c, + 0x44 => 0x01f4, 0x45 => 0x022c, 0x46 => 0x022c, 0x47 => 0x0116, + 0x48 => 0x022c, 0x49 => 0x022c, 0x4a => 0xde, 0x4b => 0xde, + 0x4c => 0x01f4, 0x4d => 0xde, 0x4e => 0x0341, 0x4f => 0x022c, + 0x50 => 0x022c, 0x51 => 0x022c, 0x52 => 0x022c, 0x53 => 0x014d, + 0x54 => 0x01f4, 0x55 => 0x0116, 0x56 => 0x022c, 0x57 => 0x01f4, + 0x58 => 0x02d2, 0x59 => 0x01f4, 0x5a => 0x01f4, 0x5b => 0x01f4, + 0x5c => 0x014e, 0x5d => 0x0104, 0x5e => 0x014e, 0x5f => 0x0248, + 0x60 => 0x014d, 0x61 => 0x022c, 0x62 => 0x022c, 0x63 => 0xa7, + 0x64 => 0x022c, 0x65 => 0x022c, 0x66 => 0x022c, 0x67 => 0x022c, + 0x68 => 0xbf, 0x69 => 0x014d, 0x6a => 0x022c, 0x6b => 0x014d, + 0x6c => 0x014d, 0x6d => 0x01f4, 0x6e => 0x01f4, 0x6f => 0x022c, + 0x70 => 0x022c, 0x71 => 0x022c, 0x72 => 0x0116, 0x73 => 0x0219, + 0x74 => 0x015e, 0x75 => 0xde, 0x76 => 0x014d, 0x77 => 0x014d, + 0x78 => 0x022c, 0x79 => 0x03e8, 0x7a => 0x03e8, 0x7b => 0x0263, + 0x7c => 0x014d, 0x7d => 0x014d, 0x7e => 0x014d, 0x7f => 0x014d, + 0x80 => 0x014d, 0x81 => 0x014d, 0x82 => 0x014d, 0x83 => 0x014d, + 0x84 => 0x014d, 0x85 => 0x014d, 0x86 => 0x014d, 0x87 => 0x014d, + 0x88 => 0x014d, 0x89 => 0x03e8, 0x8a => 0x03e8, 0x8b => 0x0172, + 0x8c => 0x022c, 0x8d => 0x030a, 0x8e => 0x03e8, 0x8f => 0x016d, + 0x90 => 0x0379, 0x91 => 0x0116, 0x92 => 0xde, 0x93 => 0x0263, + 0x94 => 0x03b0, 0x95 => 0x0263, 0x96 => 0x0116, 0x97 => 0x022c, + 0x98 => 0x022c, 0x99 => 0x022c, 0x9a => 0x022c, 0x9b => 0x029b, + 0x9c => 0x0248, 0x9d => 0x029b, 0x9e => 0x029b, 0x9f => 0x022c, + 0xa0 => 0x02d2, 0xa1 => 0x01f4, 0xa2 => 0x01f4, 0xa3 => 0x022c, + 0xa4 => 0x02d2, 0xa5 => 0x02d2, 0xa6 => 0x022c, 0xa7 => 0x02d2, + 0xa8 => 0x022c, 0xa9 => 0x029b, 0xaa => 0x02d2, 0xab => 0xfa, + 0xac => 0x02e1, 0xad => 0x029b, 0xae => 0x01f4, 0xaf => 0x022c, + 0xb0 => 0x02d2, 0xb1 => 0xde, 0xb2 => 0x022c, 0xb3 => 0x0263, + 0xb4 => 0x02d2, 0xb5 => 0x022c, 0xb6 => 0x029b, 0xb7 => 0x01f4, + 0xb8 => 0x01f4, 0xb9 => 0x0116, 0xba => 0x01d7, 0xbb => 0x02d2, + 0xbc => 0x030a, 0xbd => 0x022c, 0xbe => 0x022c, 0xbf => 0x029b, + 0xc0 => 0x014d, 0xc1 => 0x01f4, 0xc2 => 0x0263, 0xc3 => 0x029b, + 0xc4 => 0x030a, 0xc5 => 0x02d2, 0xc6 => 0x029b, 0xc7 => 0x0283, + 0xc8 => 0x02d2, 0xc9 => 0x022c, 0xca => 0x014d, 0xcb => 0x030a, + 0xcc => 0x029b, 0xcd => 0x029b, 0xce => 0x0248, 0xcf => 0x022c, + 0xd0 => 0x0263, 0xd1 => 0x01dc, 0xd2 => 0x01f4, 0xd3 => 0x02d2, + 0xd4 => 0x0116, 0xd5 => 0x029b, 0xd6 => 0x022c, 0xd7 => 0x022c, + 0xd8 => 0x01f4, 0xd9 => 0x022c, 0xda => 0x022c, 0xdb => 0x02d2, + 0xdc => 0x0116, 0xdd => 0x0248, 0xde => 0x0104, 0xdf => 0x02e1, + 0xe0 => 0x030a, 0xe1 => 0x0116, 0xe2 => 0x0258, 0xe3 => 0x029b, + 0xe4 => 0x014d, 0xe5 => 0x022c, 0xe6 => 0x0263, 0xe7 => 0x0263, + 0xe8 => 0x0225, 0xe9 => 0x02d2, 0xea => 0x02d2, 0xeb => 0xde, + 0xec => 0x013d, 0xed => 0x022c, 0xee => 0x02d2, 0xef => 0x029b, + 0xf0 => 0x029b, 0xf1 => 0x022c, 0xf2 => 0x01f4, 0xf3 => 0xde, + 0xf4 => 0x030a, 0xf5 => 0x022c, 0xf6 => 0x022c, 0xf7 => 0x01f4, + 0xf8 => 0x0116, 0xf9 => 0x030a, 0xfa => 0x02d2, 0xfb => 0x0264, + 0xfc => 0x022c, 0xfd => 0x014d, 0xfe => 0x030a, 0xff => 0x022c, + 0x0100 => 0x0116, 0x0101 => 0x022c, 0x0102 => 0x029b, 0x0103 => 0x022c, + 0x0104 => 0x0342, 0x0105 => 0x029b, 0x0106 => 0x012b, 0x0107 => 0x029b, + 0x0108 => 0x022c, 0x0109 => 0x03e8, 0x010a => 0x022c, 0x010b => 0x0116, + 0x010c => 0x0116, 0x010d => 0x022c, 0x010e => 0x0342, 0x010f => 0x0225, + 0x0110 => 0x022c, 0x0111 => 0x022c, 0x0112 => 0x02d2, 0x0113 => 0x029b, + 0x0114 => 0x022c, 0x0115 => 0x022c, 0x0116 => 0x0342, 0x0117 => 0x029b, + 0x0118 => 0x029b, 0x0119 => 0x030a, 0x011a => 0x0190, 0x011b => 0x022c, + 0x011c => 0x02d2, 0x011d => 0x022c, 0x011e => 0x01c5, 0x011f => 0x02d2, + 0x0120 => 0x014d, 0x0121 => 0x02d2, 0x0122 => 0x022c, 0x0123 => 0x02d2, + 0x0124 => 0x022c, 0x0125 => 0x029b, 0x0126 => 0x029b, 0x0127 => 0x029b, + 0x0128 => 0x030a, 0x0129 => 0x01f4, 0x012a => 0x029b, 0x012b => 0x0116, + 0x012c => 0x01f4, 0x012d => 0x0248, 0x012e => 0x0116, 0x012f => 0x022c, + 0x0130 => 0x0116, 0x0131 => 0x0248, 0x0132 => 0x022c, 0x0133 => 0x022c, + 0x0134 => 0x0225, 0x0135 => 0x022c, 0x0136 => 0x022c, 0x0137 => 0x01f4, + 0x0138 => 0x022c, 0x0139 => 0x014d, 0x013a => 0x0116, 0x013b => 0x022c, + ); + + /* The cmap table is similarly synthesized. + */ + $cmapData = array( + 0x20 => 0x01, 0x21 => 0x02, 0x22 => 0x03, 0x23 => 0x04, + 0x24 => 0x05, 0x25 => 0x06, 0x26 => 0x07, 0x2019 => 0x08, + 0x28 => 0x09, 0x29 => 0x0a, 0x2a => 0x0b, 0x2b => 0x0c, + 0x2c => 0x0d, 0x2d => 0x0e, 0x2e => 0x0f, 0x2f => 0x10, + 0x30 => 0x11, 0x31 => 0x12, 0x32 => 0x13, 0x33 => 0x14, + 0x34 => 0x15, 0x35 => 0x16, 0x36 => 0x17, 0x37 => 0x18, + 0x38 => 0x19, 0x39 => 0x1a, 0x3a => 0x1b, 0x3b => 0x1c, + 0x3c => 0x1d, 0x3d => 0x1e, 0x3e => 0x1f, 0x3f => 0x20, + 0x40 => 0x21, 0x41 => 0x22, 0x42 => 0x23, 0x43 => 0x24, + 0x44 => 0x25, 0x45 => 0x26, 0x46 => 0x27, 0x47 => 0x28, + 0x48 => 0x29, 0x49 => 0x2a, 0x4a => 0x2b, 0x4b => 0x2c, + 0x4c => 0x2d, 0x4d => 0x2e, 0x4e => 0x2f, 0x4f => 0x30, + 0x50 => 0x31, 0x51 => 0x32, 0x52 => 0x33, 0x53 => 0x34, + 0x54 => 0x35, 0x55 => 0x36, 0x56 => 0x37, 0x57 => 0x38, + 0x58 => 0x39, 0x59 => 0x3a, 0x5a => 0x3b, 0x5b => 0x3c, + 0x5c => 0x3d, 0x5d => 0x3e, 0x5e => 0x3f, 0x5f => 0x40, + 0x2018 => 0x41, 0x61 => 0x42, 0x62 => 0x43, 0x63 => 0x44, + 0x64 => 0x45, 0x65 => 0x46, 0x66 => 0x47, 0x67 => 0x48, + 0x68 => 0x49, 0x69 => 0x4a, 0x6a => 0x4b, 0x6b => 0x4c, + 0x6c => 0x4d, 0x6d => 0x4e, 0x6e => 0x4f, 0x6f => 0x50, + 0x70 => 0x51, 0x71 => 0x52, 0x72 => 0x53, 0x73 => 0x54, + 0x74 => 0x55, 0x75 => 0x56, 0x76 => 0x57, 0x77 => 0x58, + 0x78 => 0x59, 0x79 => 0x5a, 0x7a => 0x5b, 0x7b => 0x5c, + 0x7c => 0x5d, 0x7d => 0x5e, 0x7e => 0x5f, 0xa1 => 0x60, + 0xa2 => 0x61, 0xa3 => 0x62, 0x2044 => 0x63, 0xa5 => 0x64, + 0x0192 => 0x65, 0xa7 => 0x66, 0xa4 => 0x67, 0x27 => 0x68, + 0x201c => 0x69, 0xab => 0x6a, 0x2039 => 0x6b, 0x203a => 0x6c, + 0xfb01 => 0x6d, 0xfb02 => 0x6e, 0x2013 => 0x6f, 0x2020 => 0x70, + 0x2021 => 0x71, 0xb7 => 0x72, 0xb6 => 0x73, 0x2022 => 0x74, + 0x201a => 0x75, 0x201e => 0x76, 0x201d => 0x77, 0xbb => 0x78, + 0x2026 => 0x79, 0x2030 => 0x7a, 0xbf => 0x7b, 0x60 => 0x7c, + 0xb4 => 0x7d, 0x02c6 => 0x7e, 0x02dc => 0x7f, 0xaf => 0x80, + 0x02d8 => 0x81, 0x02d9 => 0x82, 0xa8 => 0x83, 0x02da => 0x84, + 0xb8 => 0x85, 0x02dd => 0x86, 0x02db => 0x87, 0x02c7 => 0x88, + 0x2014 => 0x89, 0xc6 => 0x8a, 0xaa => 0x8b, 0x0141 => 0x8c, + 0xd8 => 0x8d, 0x0152 => 0x8e, 0xba => 0x8f, 0xe6 => 0x90, + 0x0131 => 0x91, 0x0142 => 0x92, 0xf8 => 0x93, 0x0153 => 0x94, + 0xdf => 0x95, 0xcf => 0x96, 0xe9 => 0x97, 0x0103 => 0x98, + 0x0171 => 0x99, 0x011b => 0x9a, 0x0178 => 0x9b, 0xf7 => 0x9c, + 0xdd => 0x9d, 0xc2 => 0x9e, 0xe1 => 0x9f, 0xdb => 0xa0, + 0xfd => 0xa1, 0x0219 => 0xa2, 0xea => 0xa3, 0x016e => 0xa4, + 0xdc => 0xa5, 0x0105 => 0xa6, 0xda => 0xa7, 0x0173 => 0xa8, + 0xcb => 0xa9, 0x0110 => 0xaa, 0xf6c3 => 0xab, 0xa9 => 0xac, + 0x0112 => 0xad, 0x010d => 0xae, 0xe5 => 0xaf, 0x0145 => 0xb0, + 0x013a => 0xb1, 0xe0 => 0xb2, 0x0162 => 0xb3, 0x0106 => 0xb4, + 0xe3 => 0xb5, 0x0116 => 0xb6, 0x0161 => 0xb7, 0x015f => 0xb8, + 0xed => 0xb9, 0x25ca => 0xba, 0x0158 => 0xbb, 0x0122 => 0xbc, + 0xfb => 0xbd, 0xe2 => 0xbe, 0x0100 => 0xbf, 0x0159 => 0xc0, + 0xe7 => 0xc1, 0x017b => 0xc2, 0xde => 0xc3, 0x014c => 0xc4, + 0x0154 => 0xc5, 0x015a => 0xc6, 0x010f => 0xc7, 0x016a => 0xc8, + 0x016f => 0xc9, 0xb3 => 0xca, 0xd2 => 0xcb, 0xc0 => 0xcc, + 0x0102 => 0xcd, 0xd7 => 0xce, 0xfa => 0xcf, 0x0164 => 0xd0, + 0x2202 => 0xd1, 0xff => 0xd2, 0x0143 => 0xd3, 0xee => 0xd4, + 0xca => 0xd5, 0xe4 => 0xd6, 0xeb => 0xd7, 0x0107 => 0xd8, + 0x0144 => 0xd9, 0x016b => 0xda, 0x0147 => 0xdb, 0xcd => 0xdc, + 0xb1 => 0xdd, 0xa6 => 0xde, 0xae => 0xdf, 0x011e => 0xe0, + 0x0130 => 0xe1, 0x2211 => 0xe2, 0xc8 => 0xe3, 0x0155 => 0xe4, + 0x014d => 0xe5, 0x0179 => 0xe6, 0x017d => 0xe7, 0x2265 => 0xe8, + 0xd0 => 0xe9, 0xc7 => 0xea, 0x013c => 0xeb, 0x0165 => 0xec, + 0x0119 => 0xed, 0x0172 => 0xee, 0xc1 => 0xef, 0xc4 => 0xf0, + 0xe8 => 0xf1, 0x017a => 0xf2, 0x012f => 0xf3, 0xd3 => 0xf4, + 0xf3 => 0xf5, 0x0101 => 0xf6, 0x015b => 0xf7, 0xef => 0xf8, + 0xd4 => 0xf9, 0xd9 => 0xfa, 0x2206 => 0xfb, 0xfe => 0xfc, + 0xb2 => 0xfd, 0xd6 => 0xfe, 0xb5 => 0xff, 0xec => 0x0100, + 0x0151 => 0x0101, 0x0118 => 0x0102, 0x0111 => 0x0103, 0xbe => 0x0104, + 0x015e => 0x0105, 0x013e => 0x0106, 0x0136 => 0x0107, 0x0139 => 0x0108, + 0x2122 => 0x0109, 0x0117 => 0x010a, 0xcc => 0x010b, 0x012a => 0x010c, + 0x013d => 0x010d, 0xbd => 0x010e, 0x2264 => 0x010f, 0xf4 => 0x0110, + 0xf1 => 0x0111, 0x0170 => 0x0112, 0xc9 => 0x0113, 0x0113 => 0x0114, + 0x011f => 0x0115, 0xbc => 0x0116, 0x0160 => 0x0117, 0x0218 => 0x0118, + 0x0150 => 0x0119, 0xb0 => 0x011a, 0xf2 => 0x011b, 0x010c => 0x011c, + 0xf9 => 0x011d, 0x221a => 0x011e, 0x010e => 0x011f, 0x0157 => 0x0120, + 0xd1 => 0x0121, 0xf5 => 0x0122, 0x0156 => 0x0123, 0x013b => 0x0124, + 0xc3 => 0x0125, 0x0104 => 0x0126, 0xc5 => 0x0127, 0xd5 => 0x0128, + 0x017c => 0x0129, 0x011a => 0x012a, 0x012e => 0x012b, 0x0137 => 0x012c, + 0x2212 => 0x012d, 0xce => 0x012e, 0x0148 => 0x012f, 0x0163 => 0x0130, + 0xac => 0x0131, 0xf6 => 0x0132, 0xfc => 0x0133, 0x2260 => 0x0134, + 0x0123 => 0x0135, 0xf0 => 0x0136, 0x017e => 0x0137, 0x0146 => 0x0138, + 0xb9 => 0x0139, 0x012b => 0x013a, 0x20ac => 0x013b); + $this->_cmap = Zend_Pdf_Cmap::cmapWithTypeData( + Zend_Pdf_Cmap::TYPE_BYTE_ENCODING_STATIC, $cmapData); + + + /* Resource dictionary */ + + /* The resource dictionary for the standard fonts is sparse because PDF + * viewers already have all of the metrics data. We only need to provide + * the font name and encoding method. + */ + $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 new file mode 100644 index 0000000..6f8f1ca --- /dev/null +++ b/libs/Zend/Pdf/Resource/Font/Simple/Standard/HelveticaBold.php @@ -0,0 +1,300 @@ +_fontNames[Zend_Pdf_Font::NAME_COPYRIGHT]['en'] = + "\x00\x43\x00\x6f\x00\x70\x00\x79\x00\x72\x00\x69\x00\x67\x00\x68\x00" + . "\x74\x00\x20\x00\x28\x00\x63\x00\x29\x00\x20\x00\x31\x00\x39\x00" + . "\x38\x00\x35\x00\x2c\x00\x20\x00\x31\x00\x39\x00\x38\x00\x37\x00" + . "\x2c\x00\x20\x00\x31\x00\x39\x00\x38\x00\x39\x00\x2c\x00\x20\x00" + . "\x31\x00\x39\x00\x39\x00\x30\x00\x2c\x00\x20\x00\x31\x00\x39\x00" + . "\x39\x00\x37\x00\x20\x00\x41\x00\x64\x00\x6f\x00\x62\x00\x65\x00" + . "\x20\x00\x53\x00\x79\x00\x73\x00\x74\x00\x65\x00\x6d\x00\x73\x00" + . "\x20\x00\x49\x00\x6e\x00\x63\x00\x6f\x00\x72\x00\x70\x00\x6f\x00" + . "\x72\x00\x61\x00\x74\x00\x65\x00\x64\x00\x2e\x00\x20\x00\x20\x00" + . "\x41\x00\x6c\x00\x6c\x00\x20\x00\x52\x00\x69\x00\x67\x00\x68\x00" + . "\x74\x00\x73\x00\x20\x00\x52\x00\x65\x00\x73\x00\x65\x00\x72\x00" + . "\x76\x00\x65\x00\x64\x00\x2e\x00\x48\x00\x65\x00\x6c\x00\x76\x00" + . "\x65\x00\x74\x00\x69\x00\x63\x00\x61\x00\x20\x00\x69\x00\x73\x00" + . "\x20\x00\x61\x00\x20\x00\x74\x00\x72\x00\x61\x00\x64\x00\x65\x00" + . "\x6d\x00\x61\x00\x72\x00\x6b\x00\x20\x00\x6f\x00\x66\x00\x20\x00" + . "\x4c\x00\x69\x00\x6e\x00\x6f\x00\x74\x00\x79\x00\x70\x00\x65\x00" + . "\x2d\x00\x48\x00\x65\x00\x6c\x00\x6c\x00\x20\x00\x41\x00\x47\x00" + . "\x20\x00\x61\x00\x6e\x00\x64\x00\x2f\x00\x6f\x00\x72\x00\x20\x00" + . "\x69\x00\x74\x00\x73\x00\x20\x00\x73\x00\x75\x00\x62\x00\x73\x00" + . "\x69\x00\x64\x00\x69\x00\x61\x00\x72\x00\x69\x00\x65\x00\x73\x00" + . "\x2e"; + $this->_fontNames[Zend_Pdf_Font::NAME_FAMILY]['en'] = + "\x00\x48\x00\x65\x00\x6c\x00\x76\x00\x65\x00\x74\x00\x69\x00\x63\x00" + . "\x61"; + $this->_fontNames[Zend_Pdf_Font::NAME_STYLE]['en'] = + "\x00\x42\x00\x6f\x00\x6c\x00\x64"; + $this->_fontNames[Zend_Pdf_Font::NAME_ID]['en'] = + "\x00\x34\x00\x33\x00\x30\x00\x35\x00\x32"; + $this->_fontNames[Zend_Pdf_Font::NAME_FULL]['en'] = + "\x00\x48\x00\x65\x00\x6c\x00\x76\x00\x65\x00\x74\x00\x69\x00\x63\x00" + . "\x61\x00\x2d\x00\x42\x00\x6f\x00\x6c\x00\x64\x00\x20\x00\x42\x00" + . "\x6f\x00\x6c\x00\x64"; + $this->_fontNames[Zend_Pdf_Font::NAME_VERSION]['en'] = + "\x00\x30\x00\x30\x00\x32\x00\x2e\x00\x30\x00\x30\x00\x30"; + $this->_fontNames[Zend_Pdf_Font::NAME_POSTSCRIPT]['en'] = + "\x00\x48\x00\x65\x00\x6c\x00\x76\x00\x65\x00\x74\x00\x69\x00\x63\x00" + . "\x61\x00\x2d\x00\x42\x00\x6f\x00\x6c\x00\x64"; + + $this->_isBold = true; + $this->_isItalic = false; + $this->_isMonospaced = false; + + $this->_underlinePosition = -100; + $this->_underlineThickness = 50; + $this->_strikePosition = 225; + $this->_strikeThickness = 50; + + $this->_unitsPerEm = 1000; + + $this->_ascent = 718; + $this->_descent = -207; + $this->_lineGap = 275; + + /* The glyph numbers assigned here are synthetic; they do not match the + * actual glyph numbers used by the font. This is not a big deal though + * since this data never makes it to the PDF file. It is only used + * internally for layout calculations. + */ + $this->_glyphWidths = array( + 0x00 => 0x01f4, 0x01 => 0x0116, 0x02 => 0x014d, 0x03 => 0x01da, + 0x04 => 0x022c, 0x05 => 0x022c, 0x06 => 0x0379, 0x07 => 0x02d2, + 0x08 => 0x0116, 0x09 => 0x014d, 0x0a => 0x014d, 0x0b => 0x0185, + 0x0c => 0x0248, 0x0d => 0x0116, 0x0e => 0x014d, 0x0f => 0x0116, + 0x10 => 0x0116, 0x11 => 0x022c, 0x12 => 0x022c, 0x13 => 0x022c, + 0x14 => 0x022c, 0x15 => 0x022c, 0x16 => 0x022c, 0x17 => 0x022c, + 0x18 => 0x022c, 0x19 => 0x022c, 0x1a => 0x022c, 0x1b => 0x014d, + 0x1c => 0x014d, 0x1d => 0x0248, 0x1e => 0x0248, 0x1f => 0x0248, + 0x20 => 0x0263, 0x21 => 0x03cf, 0x22 => 0x02d2, 0x23 => 0x02d2, + 0x24 => 0x02d2, 0x25 => 0x02d2, 0x26 => 0x029b, 0x27 => 0x0263, + 0x28 => 0x030a, 0x29 => 0x02d2, 0x2a => 0x0116, 0x2b => 0x022c, + 0x2c => 0x02d2, 0x2d => 0x0263, 0x2e => 0x0341, 0x2f => 0x02d2, + 0x30 => 0x030a, 0x31 => 0x029b, 0x32 => 0x030a, 0x33 => 0x02d2, + 0x34 => 0x029b, 0x35 => 0x0263, 0x36 => 0x02d2, 0x37 => 0x029b, + 0x38 => 0x03b0, 0x39 => 0x029b, 0x3a => 0x029b, 0x3b => 0x0263, + 0x3c => 0x014d, 0x3d => 0x0116, 0x3e => 0x014d, 0x3f => 0x0248, + 0x40 => 0x022c, 0x41 => 0x0116, 0x42 => 0x022c, 0x43 => 0x0263, + 0x44 => 0x022c, 0x45 => 0x0263, 0x46 => 0x022c, 0x47 => 0x014d, + 0x48 => 0x0263, 0x49 => 0x0263, 0x4a => 0x0116, 0x4b => 0x0116, + 0x4c => 0x022c, 0x4d => 0x0116, 0x4e => 0x0379, 0x4f => 0x0263, + 0x50 => 0x0263, 0x51 => 0x0263, 0x52 => 0x0263, 0x53 => 0x0185, + 0x54 => 0x022c, 0x55 => 0x014d, 0x56 => 0x0263, 0x57 => 0x022c, + 0x58 => 0x030a, 0x59 => 0x022c, 0x5a => 0x022c, 0x5b => 0x01f4, + 0x5c => 0x0185, 0x5d => 0x0118, 0x5e => 0x0185, 0x5f => 0x0248, + 0x60 => 0x014d, 0x61 => 0x022c, 0x62 => 0x022c, 0x63 => 0xa7, + 0x64 => 0x022c, 0x65 => 0x022c, 0x66 => 0x022c, 0x67 => 0x022c, + 0x68 => 0xee, 0x69 => 0x01f4, 0x6a => 0x022c, 0x6b => 0x014d, + 0x6c => 0x014d, 0x6d => 0x0263, 0x6e => 0x0263, 0x6f => 0x022c, + 0x70 => 0x022c, 0x71 => 0x022c, 0x72 => 0x0116, 0x73 => 0x022c, + 0x74 => 0x015e, 0x75 => 0x0116, 0x76 => 0x01f4, 0x77 => 0x01f4, + 0x78 => 0x022c, 0x79 => 0x03e8, 0x7a => 0x03e8, 0x7b => 0x0263, + 0x7c => 0x014d, 0x7d => 0x014d, 0x7e => 0x014d, 0x7f => 0x014d, + 0x80 => 0x014d, 0x81 => 0x014d, 0x82 => 0x014d, 0x83 => 0x014d, + 0x84 => 0x014d, 0x85 => 0x014d, 0x86 => 0x014d, 0x87 => 0x014d, + 0x88 => 0x014d, 0x89 => 0x03e8, 0x8a => 0x03e8, 0x8b => 0x0172, + 0x8c => 0x0263, 0x8d => 0x030a, 0x8e => 0x03e8, 0x8f => 0x016d, + 0x90 => 0x0379, 0x91 => 0x0116, 0x92 => 0x0116, 0x93 => 0x0263, + 0x94 => 0x03b0, 0x95 => 0x0263, 0x96 => 0x0116, 0x97 => 0x022c, + 0x98 => 0x022c, 0x99 => 0x0263, 0x9a => 0x022c, 0x9b => 0x029b, + 0x9c => 0x0248, 0x9d => 0x029b, 0x9e => 0x02d2, 0x9f => 0x022c, + 0xa0 => 0x02d2, 0xa1 => 0x022c, 0xa2 => 0x022c, 0xa3 => 0x022c, + 0xa4 => 0x02d2, 0xa5 => 0x02d2, 0xa6 => 0x022c, 0xa7 => 0x02d2, + 0xa8 => 0x0263, 0xa9 => 0x029b, 0xaa => 0x02d2, 0xab => 0xfa, + 0xac => 0x02e1, 0xad => 0x029b, 0xae => 0x022c, 0xaf => 0x022c, + 0xb0 => 0x02d2, 0xb1 => 0x0116, 0xb2 => 0x022c, 0xb3 => 0x0263, + 0xb4 => 0x02d2, 0xb5 => 0x022c, 0xb6 => 0x029b, 0xb7 => 0x022c, + 0xb8 => 0x022c, 0xb9 => 0x0116, 0xba => 0x01ee, 0xbb => 0x02d2, + 0xbc => 0x030a, 0xbd => 0x0263, 0xbe => 0x022c, 0xbf => 0x02d2, + 0xc0 => 0x0185, 0xc1 => 0x022c, 0xc2 => 0x0263, 0xc3 => 0x029b, + 0xc4 => 0x030a, 0xc5 => 0x02d2, 0xc6 => 0x029b, 0xc7 => 0x02e7, + 0xc8 => 0x02d2, 0xc9 => 0x0263, 0xca => 0x014d, 0xcb => 0x030a, + 0xcc => 0x02d2, 0xcd => 0x02d2, 0xce => 0x0248, 0xcf => 0x0263, + 0xd0 => 0x0263, 0xd1 => 0x01ee, 0xd2 => 0x022c, 0xd3 => 0x02d2, + 0xd4 => 0x0116, 0xd5 => 0x029b, 0xd6 => 0x022c, 0xd7 => 0x022c, + 0xd8 => 0x022c, 0xd9 => 0x0263, 0xda => 0x0263, 0xdb => 0x02d2, + 0xdc => 0x0116, 0xdd => 0x0248, 0xde => 0x0118, 0xdf => 0x02e1, + 0xe0 => 0x030a, 0xe1 => 0x0116, 0xe2 => 0x0258, 0xe3 => 0x029b, + 0xe4 => 0x0185, 0xe5 => 0x0263, 0xe6 => 0x0263, 0xe7 => 0x0263, + 0xe8 => 0x0225, 0xe9 => 0x02d2, 0xea => 0x02d2, 0xeb => 0x0116, + 0xec => 0x0185, 0xed => 0x022c, 0xee => 0x02d2, 0xef => 0x02d2, + 0xf0 => 0x02d2, 0xf1 => 0x022c, 0xf2 => 0x01f4, 0xf3 => 0x0116, + 0xf4 => 0x030a, 0xf5 => 0x0263, 0xf6 => 0x022c, 0xf7 => 0x022c, + 0xf8 => 0x0116, 0xf9 => 0x030a, 0xfa => 0x02d2, 0xfb => 0x0264, + 0xfc => 0x0263, 0xfd => 0x014d, 0xfe => 0x030a, 0xff => 0x0263, + 0x0100 => 0x0116, 0x0101 => 0x0263, 0x0102 => 0x029b, 0x0103 => 0x0263, + 0x0104 => 0x0342, 0x0105 => 0x029b, 0x0106 => 0x0190, 0x0107 => 0x02d2, + 0x0108 => 0x0263, 0x0109 => 0x03e8, 0x010a => 0x022c, 0x010b => 0x0116, + 0x010c => 0x0116, 0x010d => 0x0263, 0x010e => 0x0342, 0x010f => 0x0225, + 0x0110 => 0x0263, 0x0111 => 0x0263, 0x0112 => 0x02d2, 0x0113 => 0x029b, + 0x0114 => 0x022c, 0x0115 => 0x0263, 0x0116 => 0x0342, 0x0117 => 0x029b, + 0x0118 => 0x029b, 0x0119 => 0x030a, 0x011a => 0x0190, 0x011b => 0x0263, + 0x011c => 0x02d2, 0x011d => 0x0263, 0x011e => 0x0225, 0x011f => 0x02d2, + 0x0120 => 0x0185, 0x0121 => 0x02d2, 0x0122 => 0x0263, 0x0123 => 0x02d2, + 0x0124 => 0x0263, 0x0125 => 0x02d2, 0x0126 => 0x02d2, 0x0127 => 0x02d2, + 0x0128 => 0x030a, 0x0129 => 0x01f4, 0x012a => 0x029b, 0x012b => 0x0116, + 0x012c => 0x022c, 0x012d => 0x0248, 0x012e => 0x0116, 0x012f => 0x0263, + 0x0130 => 0x014d, 0x0131 => 0x0248, 0x0132 => 0x0263, 0x0133 => 0x0263, + 0x0134 => 0x0225, 0x0135 => 0x0263, 0x0136 => 0x0263, 0x0137 => 0x01f4, + 0x0138 => 0x0263, 0x0139 => 0x014d, 0x013a => 0x0116, 0x013b => 0x022c, + ); + + /* The cmap table is similarly synthesized. + */ + $cmapData = array( + 0x20 => 0x01, 0x21 => 0x02, 0x22 => 0x03, 0x23 => 0x04, + 0x24 => 0x05, 0x25 => 0x06, 0x26 => 0x07, 0x2019 => 0x08, + 0x28 => 0x09, 0x29 => 0x0a, 0x2a => 0x0b, 0x2b => 0x0c, + 0x2c => 0x0d, 0x2d => 0x0e, 0x2e => 0x0f, 0x2f => 0x10, + 0x30 => 0x11, 0x31 => 0x12, 0x32 => 0x13, 0x33 => 0x14, + 0x34 => 0x15, 0x35 => 0x16, 0x36 => 0x17, 0x37 => 0x18, + 0x38 => 0x19, 0x39 => 0x1a, 0x3a => 0x1b, 0x3b => 0x1c, + 0x3c => 0x1d, 0x3d => 0x1e, 0x3e => 0x1f, 0x3f => 0x20, + 0x40 => 0x21, 0x41 => 0x22, 0x42 => 0x23, 0x43 => 0x24, + 0x44 => 0x25, 0x45 => 0x26, 0x46 => 0x27, 0x47 => 0x28, + 0x48 => 0x29, 0x49 => 0x2a, 0x4a => 0x2b, 0x4b => 0x2c, + 0x4c => 0x2d, 0x4d => 0x2e, 0x4e => 0x2f, 0x4f => 0x30, + 0x50 => 0x31, 0x51 => 0x32, 0x52 => 0x33, 0x53 => 0x34, + 0x54 => 0x35, 0x55 => 0x36, 0x56 => 0x37, 0x57 => 0x38, + 0x58 => 0x39, 0x59 => 0x3a, 0x5a => 0x3b, 0x5b => 0x3c, + 0x5c => 0x3d, 0x5d => 0x3e, 0x5e => 0x3f, 0x5f => 0x40, + 0x2018 => 0x41, 0x61 => 0x42, 0x62 => 0x43, 0x63 => 0x44, + 0x64 => 0x45, 0x65 => 0x46, 0x66 => 0x47, 0x67 => 0x48, + 0x68 => 0x49, 0x69 => 0x4a, 0x6a => 0x4b, 0x6b => 0x4c, + 0x6c => 0x4d, 0x6d => 0x4e, 0x6e => 0x4f, 0x6f => 0x50, + 0x70 => 0x51, 0x71 => 0x52, 0x72 => 0x53, 0x73 => 0x54, + 0x74 => 0x55, 0x75 => 0x56, 0x76 => 0x57, 0x77 => 0x58, + 0x78 => 0x59, 0x79 => 0x5a, 0x7a => 0x5b, 0x7b => 0x5c, + 0x7c => 0x5d, 0x7d => 0x5e, 0x7e => 0x5f, 0xa1 => 0x60, + 0xa2 => 0x61, 0xa3 => 0x62, 0x2044 => 0x63, 0xa5 => 0x64, + 0x0192 => 0x65, 0xa7 => 0x66, 0xa4 => 0x67, 0x27 => 0x68, + 0x201c => 0x69, 0xab => 0x6a, 0x2039 => 0x6b, 0x203a => 0x6c, + 0xfb01 => 0x6d, 0xfb02 => 0x6e, 0x2013 => 0x6f, 0x2020 => 0x70, + 0x2021 => 0x71, 0xb7 => 0x72, 0xb6 => 0x73, 0x2022 => 0x74, + 0x201a => 0x75, 0x201e => 0x76, 0x201d => 0x77, 0xbb => 0x78, + 0x2026 => 0x79, 0x2030 => 0x7a, 0xbf => 0x7b, 0x60 => 0x7c, + 0xb4 => 0x7d, 0x02c6 => 0x7e, 0x02dc => 0x7f, 0xaf => 0x80, + 0x02d8 => 0x81, 0x02d9 => 0x82, 0xa8 => 0x83, 0x02da => 0x84, + 0xb8 => 0x85, 0x02dd => 0x86, 0x02db => 0x87, 0x02c7 => 0x88, + 0x2014 => 0x89, 0xc6 => 0x8a, 0xaa => 0x8b, 0x0141 => 0x8c, + 0xd8 => 0x8d, 0x0152 => 0x8e, 0xba => 0x8f, 0xe6 => 0x90, + 0x0131 => 0x91, 0x0142 => 0x92, 0xf8 => 0x93, 0x0153 => 0x94, + 0xdf => 0x95, 0xcf => 0x96, 0xe9 => 0x97, 0x0103 => 0x98, + 0x0171 => 0x99, 0x011b => 0x9a, 0x0178 => 0x9b, 0xf7 => 0x9c, + 0xdd => 0x9d, 0xc2 => 0x9e, 0xe1 => 0x9f, 0xdb => 0xa0, + 0xfd => 0xa1, 0x0219 => 0xa2, 0xea => 0xa3, 0x016e => 0xa4, + 0xdc => 0xa5, 0x0105 => 0xa6, 0xda => 0xa7, 0x0173 => 0xa8, + 0xcb => 0xa9, 0x0110 => 0xaa, 0xf6c3 => 0xab, 0xa9 => 0xac, + 0x0112 => 0xad, 0x010d => 0xae, 0xe5 => 0xaf, 0x0145 => 0xb0, + 0x013a => 0xb1, 0xe0 => 0xb2, 0x0162 => 0xb3, 0x0106 => 0xb4, + 0xe3 => 0xb5, 0x0116 => 0xb6, 0x0161 => 0xb7, 0x015f => 0xb8, + 0xed => 0xb9, 0x25ca => 0xba, 0x0158 => 0xbb, 0x0122 => 0xbc, + 0xfb => 0xbd, 0xe2 => 0xbe, 0x0100 => 0xbf, 0x0159 => 0xc0, + 0xe7 => 0xc1, 0x017b => 0xc2, 0xde => 0xc3, 0x014c => 0xc4, + 0x0154 => 0xc5, 0x015a => 0xc6, 0x010f => 0xc7, 0x016a => 0xc8, + 0x016f => 0xc9, 0xb3 => 0xca, 0xd2 => 0xcb, 0xc0 => 0xcc, + 0x0102 => 0xcd, 0xd7 => 0xce, 0xfa => 0xcf, 0x0164 => 0xd0, + 0x2202 => 0xd1, 0xff => 0xd2, 0x0143 => 0xd3, 0xee => 0xd4, + 0xca => 0xd5, 0xe4 => 0xd6, 0xeb => 0xd7, 0x0107 => 0xd8, + 0x0144 => 0xd9, 0x016b => 0xda, 0x0147 => 0xdb, 0xcd => 0xdc, + 0xb1 => 0xdd, 0xa6 => 0xde, 0xae => 0xdf, 0x011e => 0xe0, + 0x0130 => 0xe1, 0x2211 => 0xe2, 0xc8 => 0xe3, 0x0155 => 0xe4, + 0x014d => 0xe5, 0x0179 => 0xe6, 0x017d => 0xe7, 0x2265 => 0xe8, + 0xd0 => 0xe9, 0xc7 => 0xea, 0x013c => 0xeb, 0x0165 => 0xec, + 0x0119 => 0xed, 0x0172 => 0xee, 0xc1 => 0xef, 0xc4 => 0xf0, + 0xe8 => 0xf1, 0x017a => 0xf2, 0x012f => 0xf3, 0xd3 => 0xf4, + 0xf3 => 0xf5, 0x0101 => 0xf6, 0x015b => 0xf7, 0xef => 0xf8, + 0xd4 => 0xf9, 0xd9 => 0xfa, 0x2206 => 0xfb, 0xfe => 0xfc, + 0xb2 => 0xfd, 0xd6 => 0xfe, 0xb5 => 0xff, 0xec => 0x0100, + 0x0151 => 0x0101, 0x0118 => 0x0102, 0x0111 => 0x0103, 0xbe => 0x0104, + 0x015e => 0x0105, 0x013e => 0x0106, 0x0136 => 0x0107, 0x0139 => 0x0108, + 0x2122 => 0x0109, 0x0117 => 0x010a, 0xcc => 0x010b, 0x012a => 0x010c, + 0x013d => 0x010d, 0xbd => 0x010e, 0x2264 => 0x010f, 0xf4 => 0x0110, + 0xf1 => 0x0111, 0x0170 => 0x0112, 0xc9 => 0x0113, 0x0113 => 0x0114, + 0x011f => 0x0115, 0xbc => 0x0116, 0x0160 => 0x0117, 0x0218 => 0x0118, + 0x0150 => 0x0119, 0xb0 => 0x011a, 0xf2 => 0x011b, 0x010c => 0x011c, + 0xf9 => 0x011d, 0x221a => 0x011e, 0x010e => 0x011f, 0x0157 => 0x0120, + 0xd1 => 0x0121, 0xf5 => 0x0122, 0x0156 => 0x0123, 0x013b => 0x0124, + 0xc3 => 0x0125, 0x0104 => 0x0126, 0xc5 => 0x0127, 0xd5 => 0x0128, + 0x017c => 0x0129, 0x011a => 0x012a, 0x012e => 0x012b, 0x0137 => 0x012c, + 0x2212 => 0x012d, 0xce => 0x012e, 0x0148 => 0x012f, 0x0163 => 0x0130, + 0xac => 0x0131, 0xf6 => 0x0132, 0xfc => 0x0133, 0x2260 => 0x0134, + 0x0123 => 0x0135, 0xf0 => 0x0136, 0x017e => 0x0137, 0x0146 => 0x0138, + 0xb9 => 0x0139, 0x012b => 0x013a, 0x20ac => 0x013b); + $this->_cmap = Zend_Pdf_Cmap::cmapWithTypeData( + Zend_Pdf_Cmap::TYPE_BYTE_ENCODING_STATIC, $cmapData); + + + /* Resource dictionary */ + + /* The resource dictionary for the standard fonts is sparse because PDF + * viewers already have all of the metrics data. We only need to provide + * the font name and encoding method. + */ + $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 new file mode 100644 index 0000000..b7398cd --- /dev/null +++ b/libs/Zend/Pdf/Resource/Font/Simple/Standard/HelveticaBoldOblique.php @@ -0,0 +1,302 @@ +_fontNames[Zend_Pdf_Font::NAME_COPYRIGHT]['en'] = + "\x00\x43\x00\x6f\x00\x70\x00\x79\x00\x72\x00\x69\x00\x67\x00\x68\x00" + . "\x74\x00\x20\x00\x28\x00\x63\x00\x29\x00\x20\x00\x31\x00\x39\x00" + . "\x38\x00\x35\x00\x2c\x00\x20\x00\x31\x00\x39\x00\x38\x00\x37\x00" + . "\x2c\x00\x20\x00\x31\x00\x39\x00\x38\x00\x39\x00\x2c\x00\x20\x00" + . "\x31\x00\x39\x00\x39\x00\x30\x00\x2c\x00\x20\x00\x31\x00\x39\x00" + . "\x39\x00\x37\x00\x20\x00\x41\x00\x64\x00\x6f\x00\x62\x00\x65\x00" + . "\x20\x00\x53\x00\x79\x00\x73\x00\x74\x00\x65\x00\x6d\x00\x73\x00" + . "\x20\x00\x49\x00\x6e\x00\x63\x00\x6f\x00\x72\x00\x70\x00\x6f\x00" + . "\x72\x00\x61\x00\x74\x00\x65\x00\x64\x00\x2e\x00\x20\x00\x20\x00" + . "\x41\x00\x6c\x00\x6c\x00\x20\x00\x52\x00\x69\x00\x67\x00\x68\x00" + . "\x74\x00\x73\x00\x20\x00\x52\x00\x65\x00\x73\x00\x65\x00\x72\x00" + . "\x76\x00\x65\x00\x64\x00\x2e\x00\x48\x00\x65\x00\x6c\x00\x76\x00" + . "\x65\x00\x74\x00\x69\x00\x63\x00\x61\x00\x20\x00\x69\x00\x73\x00" + . "\x20\x00\x61\x00\x20\x00\x74\x00\x72\x00\x61\x00\x64\x00\x65\x00" + . "\x6d\x00\x61\x00\x72\x00\x6b\x00\x20\x00\x6f\x00\x66\x00\x20\x00" + . "\x4c\x00\x69\x00\x6e\x00\x6f\x00\x74\x00\x79\x00\x70\x00\x65\x00" + . "\x2d\x00\x48\x00\x65\x00\x6c\x00\x6c\x00\x20\x00\x41\x00\x47\x00" + . "\x20\x00\x61\x00\x6e\x00\x64\x00\x2f\x00\x6f\x00\x72\x00\x20\x00" + . "\x69\x00\x74\x00\x73\x00\x20\x00\x73\x00\x75\x00\x62\x00\x73\x00" + . "\x69\x00\x64\x00\x69\x00\x61\x00\x72\x00\x69\x00\x65\x00\x73\x00" + . "\x2e"; + $this->_fontNames[Zend_Pdf_Font::NAME_FAMILY]['en'] = + "\x00\x48\x00\x65\x00\x6c\x00\x76\x00\x65\x00\x74\x00\x69\x00\x63\x00" + . "\x61"; + $this->_fontNames[Zend_Pdf_Font::NAME_STYLE]['en'] = + "\x00\x42\x00\x6f\x00\x6c\x00\x64"; + $this->_fontNames[Zend_Pdf_Font::NAME_ID]['en'] = + "\x00\x34\x00\x33\x00\x30\x00\x35\x00\x33"; + $this->_fontNames[Zend_Pdf_Font::NAME_FULL]['en'] = + "\x00\x48\x00\x65\x00\x6c\x00\x76\x00\x65\x00\x74\x00\x69\x00\x63\x00" + . "\x61\x00\x2d\x00\x42\x00\x6f\x00\x6c\x00\x64\x00\x4f\x00\x62\x00" + . "\x6c\x00\x69\x00\x71\x00\x75\x00\x65\x00\x20\x00\x42\x00\x6f\x00" + . "\x6c\x00\x64"; + $this->_fontNames[Zend_Pdf_Font::NAME_VERSION]['en'] = + "\x00\x30\x00\x30\x00\x32\x00\x2e\x00\x30\x00\x30\x00\x30"; + $this->_fontNames[Zend_Pdf_Font::NAME_POSTSCRIPT]['en'] = + "\x00\x48\x00\x65\x00\x6c\x00\x76\x00\x65\x00\x74\x00\x69\x00\x63\x00" + . "\x61\x00\x2d\x00\x42\x00\x6f\x00\x6c\x00\x64\x00\x4f\x00\x62\x00" + . "\x6c\x00\x69\x00\x71\x00\x75\x00\x65"; + + $this->_isBold = true; + $this->_isItalic = true; + $this->_isMonospaced = false; + + $this->_underlinePosition = -100; + $this->_underlineThickness = 50; + $this->_strikePosition = 225; + $this->_strikeThickness = 50; + + $this->_unitsPerEm = 1000; + + $this->_ascent = 718; + $this->_descent = -207; + $this->_lineGap = 275; + + /* The glyph numbers assigned here are synthetic; they do not match the + * actual glyph numbers used by the font. This is not a big deal though + * since this data never makes it to the PDF file. It is only used + * internally for layout calculations. + */ + $this->_glyphWidths = array( + 0x00 => 0x01f4, 0x01 => 0x0116, 0x02 => 0x014d, 0x03 => 0x01da, + 0x04 => 0x022c, 0x05 => 0x022c, 0x06 => 0x0379, 0x07 => 0x02d2, + 0x08 => 0x0116, 0x09 => 0x014d, 0x0a => 0x014d, 0x0b => 0x0185, + 0x0c => 0x0248, 0x0d => 0x0116, 0x0e => 0x014d, 0x0f => 0x0116, + 0x10 => 0x0116, 0x11 => 0x022c, 0x12 => 0x022c, 0x13 => 0x022c, + 0x14 => 0x022c, 0x15 => 0x022c, 0x16 => 0x022c, 0x17 => 0x022c, + 0x18 => 0x022c, 0x19 => 0x022c, 0x1a => 0x022c, 0x1b => 0x014d, + 0x1c => 0x014d, 0x1d => 0x0248, 0x1e => 0x0248, 0x1f => 0x0248, + 0x20 => 0x0263, 0x21 => 0x03cf, 0x22 => 0x02d2, 0x23 => 0x02d2, + 0x24 => 0x02d2, 0x25 => 0x02d2, 0x26 => 0x029b, 0x27 => 0x0263, + 0x28 => 0x030a, 0x29 => 0x02d2, 0x2a => 0x0116, 0x2b => 0x022c, + 0x2c => 0x02d2, 0x2d => 0x0263, 0x2e => 0x0341, 0x2f => 0x02d2, + 0x30 => 0x030a, 0x31 => 0x029b, 0x32 => 0x030a, 0x33 => 0x02d2, + 0x34 => 0x029b, 0x35 => 0x0263, 0x36 => 0x02d2, 0x37 => 0x029b, + 0x38 => 0x03b0, 0x39 => 0x029b, 0x3a => 0x029b, 0x3b => 0x0263, + 0x3c => 0x014d, 0x3d => 0x0116, 0x3e => 0x014d, 0x3f => 0x0248, + 0x40 => 0x022c, 0x41 => 0x0116, 0x42 => 0x022c, 0x43 => 0x0263, + 0x44 => 0x022c, 0x45 => 0x0263, 0x46 => 0x022c, 0x47 => 0x014d, + 0x48 => 0x0263, 0x49 => 0x0263, 0x4a => 0x0116, 0x4b => 0x0116, + 0x4c => 0x022c, 0x4d => 0x0116, 0x4e => 0x0379, 0x4f => 0x0263, + 0x50 => 0x0263, 0x51 => 0x0263, 0x52 => 0x0263, 0x53 => 0x0185, + 0x54 => 0x022c, 0x55 => 0x014d, 0x56 => 0x0263, 0x57 => 0x022c, + 0x58 => 0x030a, 0x59 => 0x022c, 0x5a => 0x022c, 0x5b => 0x01f4, + 0x5c => 0x0185, 0x5d => 0x0118, 0x5e => 0x0185, 0x5f => 0x0248, + 0x60 => 0x014d, 0x61 => 0x022c, 0x62 => 0x022c, 0x63 => 0xa7, + 0x64 => 0x022c, 0x65 => 0x022c, 0x66 => 0x022c, 0x67 => 0x022c, + 0x68 => 0xee, 0x69 => 0x01f4, 0x6a => 0x022c, 0x6b => 0x014d, + 0x6c => 0x014d, 0x6d => 0x0263, 0x6e => 0x0263, 0x6f => 0x022c, + 0x70 => 0x022c, 0x71 => 0x022c, 0x72 => 0x0116, 0x73 => 0x022c, + 0x74 => 0x015e, 0x75 => 0x0116, 0x76 => 0x01f4, 0x77 => 0x01f4, + 0x78 => 0x022c, 0x79 => 0x03e8, 0x7a => 0x03e8, 0x7b => 0x0263, + 0x7c => 0x014d, 0x7d => 0x014d, 0x7e => 0x014d, 0x7f => 0x014d, + 0x80 => 0x014d, 0x81 => 0x014d, 0x82 => 0x014d, 0x83 => 0x014d, + 0x84 => 0x014d, 0x85 => 0x014d, 0x86 => 0x014d, 0x87 => 0x014d, + 0x88 => 0x014d, 0x89 => 0x03e8, 0x8a => 0x03e8, 0x8b => 0x0172, + 0x8c => 0x0263, 0x8d => 0x030a, 0x8e => 0x03e8, 0x8f => 0x016d, + 0x90 => 0x0379, 0x91 => 0x0116, 0x92 => 0x0116, 0x93 => 0x0263, + 0x94 => 0x03b0, 0x95 => 0x0263, 0x96 => 0x0116, 0x97 => 0x022c, + 0x98 => 0x022c, 0x99 => 0x0263, 0x9a => 0x022c, 0x9b => 0x029b, + 0x9c => 0x0248, 0x9d => 0x029b, 0x9e => 0x02d2, 0x9f => 0x022c, + 0xa0 => 0x02d2, 0xa1 => 0x022c, 0xa2 => 0x022c, 0xa3 => 0x022c, + 0xa4 => 0x02d2, 0xa5 => 0x02d2, 0xa6 => 0x022c, 0xa7 => 0x02d2, + 0xa8 => 0x0263, 0xa9 => 0x029b, 0xaa => 0x02d2, 0xab => 0xfa, + 0xac => 0x02e1, 0xad => 0x029b, 0xae => 0x022c, 0xaf => 0x022c, + 0xb0 => 0x02d2, 0xb1 => 0x0116, 0xb2 => 0x022c, 0xb3 => 0x0263, + 0xb4 => 0x02d2, 0xb5 => 0x022c, 0xb6 => 0x029b, 0xb7 => 0x022c, + 0xb8 => 0x022c, 0xb9 => 0x0116, 0xba => 0x01ee, 0xbb => 0x02d2, + 0xbc => 0x030a, 0xbd => 0x0263, 0xbe => 0x022c, 0xbf => 0x02d2, + 0xc0 => 0x0185, 0xc1 => 0x022c, 0xc2 => 0x0263, 0xc3 => 0x029b, + 0xc4 => 0x030a, 0xc5 => 0x02d2, 0xc6 => 0x029b, 0xc7 => 0x02e7, + 0xc8 => 0x02d2, 0xc9 => 0x0263, 0xca => 0x014d, 0xcb => 0x030a, + 0xcc => 0x02d2, 0xcd => 0x02d2, 0xce => 0x0248, 0xcf => 0x0263, + 0xd0 => 0x0263, 0xd1 => 0x01ee, 0xd2 => 0x022c, 0xd3 => 0x02d2, + 0xd4 => 0x0116, 0xd5 => 0x029b, 0xd6 => 0x022c, 0xd7 => 0x022c, + 0xd8 => 0x022c, 0xd9 => 0x0263, 0xda => 0x0263, 0xdb => 0x02d2, + 0xdc => 0x0116, 0xdd => 0x0248, 0xde => 0x0118, 0xdf => 0x02e1, + 0xe0 => 0x030a, 0xe1 => 0x0116, 0xe2 => 0x0258, 0xe3 => 0x029b, + 0xe4 => 0x0185, 0xe5 => 0x0263, 0xe6 => 0x0263, 0xe7 => 0x0263, + 0xe8 => 0x0225, 0xe9 => 0x02d2, 0xea => 0x02d2, 0xeb => 0x0116, + 0xec => 0x0185, 0xed => 0x022c, 0xee => 0x02d2, 0xef => 0x02d2, + 0xf0 => 0x02d2, 0xf1 => 0x022c, 0xf2 => 0x01f4, 0xf3 => 0x0116, + 0xf4 => 0x030a, 0xf5 => 0x0263, 0xf6 => 0x022c, 0xf7 => 0x022c, + 0xf8 => 0x0116, 0xf9 => 0x030a, 0xfa => 0x02d2, 0xfb => 0x0264, + 0xfc => 0x0263, 0xfd => 0x014d, 0xfe => 0x030a, 0xff => 0x0263, + 0x0100 => 0x0116, 0x0101 => 0x0263, 0x0102 => 0x029b, 0x0103 => 0x0263, + 0x0104 => 0x0342, 0x0105 => 0x029b, 0x0106 => 0x0190, 0x0107 => 0x02d2, + 0x0108 => 0x0263, 0x0109 => 0x03e8, 0x010a => 0x022c, 0x010b => 0x0116, + 0x010c => 0x0116, 0x010d => 0x0263, 0x010e => 0x0342, 0x010f => 0x0225, + 0x0110 => 0x0263, 0x0111 => 0x0263, 0x0112 => 0x02d2, 0x0113 => 0x029b, + 0x0114 => 0x022c, 0x0115 => 0x0263, 0x0116 => 0x0342, 0x0117 => 0x029b, + 0x0118 => 0x029b, 0x0119 => 0x030a, 0x011a => 0x0190, 0x011b => 0x0263, + 0x011c => 0x02d2, 0x011d => 0x0263, 0x011e => 0x0225, 0x011f => 0x02d2, + 0x0120 => 0x0185, 0x0121 => 0x02d2, 0x0122 => 0x0263, 0x0123 => 0x02d2, + 0x0124 => 0x0263, 0x0125 => 0x02d2, 0x0126 => 0x02d2, 0x0127 => 0x02d2, + 0x0128 => 0x030a, 0x0129 => 0x01f4, 0x012a => 0x029b, 0x012b => 0x0116, + 0x012c => 0x022c, 0x012d => 0x0248, 0x012e => 0x0116, 0x012f => 0x0263, + 0x0130 => 0x014d, 0x0131 => 0x0248, 0x0132 => 0x0263, 0x0133 => 0x0263, + 0x0134 => 0x0225, 0x0135 => 0x0263, 0x0136 => 0x0263, 0x0137 => 0x01f4, + 0x0138 => 0x0263, 0x0139 => 0x014d, 0x013a => 0x0116, 0x013b => 0x022c, + ); + + /* The cmap table is similarly synthesized. + */ + $cmapData = array( + 0x20 => 0x01, 0x21 => 0x02, 0x22 => 0x03, 0x23 => 0x04, + 0x24 => 0x05, 0x25 => 0x06, 0x26 => 0x07, 0x2019 => 0x08, + 0x28 => 0x09, 0x29 => 0x0a, 0x2a => 0x0b, 0x2b => 0x0c, + 0x2c => 0x0d, 0x2d => 0x0e, 0x2e => 0x0f, 0x2f => 0x10, + 0x30 => 0x11, 0x31 => 0x12, 0x32 => 0x13, 0x33 => 0x14, + 0x34 => 0x15, 0x35 => 0x16, 0x36 => 0x17, 0x37 => 0x18, + 0x38 => 0x19, 0x39 => 0x1a, 0x3a => 0x1b, 0x3b => 0x1c, + 0x3c => 0x1d, 0x3d => 0x1e, 0x3e => 0x1f, 0x3f => 0x20, + 0x40 => 0x21, 0x41 => 0x22, 0x42 => 0x23, 0x43 => 0x24, + 0x44 => 0x25, 0x45 => 0x26, 0x46 => 0x27, 0x47 => 0x28, + 0x48 => 0x29, 0x49 => 0x2a, 0x4a => 0x2b, 0x4b => 0x2c, + 0x4c => 0x2d, 0x4d => 0x2e, 0x4e => 0x2f, 0x4f => 0x30, + 0x50 => 0x31, 0x51 => 0x32, 0x52 => 0x33, 0x53 => 0x34, + 0x54 => 0x35, 0x55 => 0x36, 0x56 => 0x37, 0x57 => 0x38, + 0x58 => 0x39, 0x59 => 0x3a, 0x5a => 0x3b, 0x5b => 0x3c, + 0x5c => 0x3d, 0x5d => 0x3e, 0x5e => 0x3f, 0x5f => 0x40, + 0x2018 => 0x41, 0x61 => 0x42, 0x62 => 0x43, 0x63 => 0x44, + 0x64 => 0x45, 0x65 => 0x46, 0x66 => 0x47, 0x67 => 0x48, + 0x68 => 0x49, 0x69 => 0x4a, 0x6a => 0x4b, 0x6b => 0x4c, + 0x6c => 0x4d, 0x6d => 0x4e, 0x6e => 0x4f, 0x6f => 0x50, + 0x70 => 0x51, 0x71 => 0x52, 0x72 => 0x53, 0x73 => 0x54, + 0x74 => 0x55, 0x75 => 0x56, 0x76 => 0x57, 0x77 => 0x58, + 0x78 => 0x59, 0x79 => 0x5a, 0x7a => 0x5b, 0x7b => 0x5c, + 0x7c => 0x5d, 0x7d => 0x5e, 0x7e => 0x5f, 0xa1 => 0x60, + 0xa2 => 0x61, 0xa3 => 0x62, 0x2044 => 0x63, 0xa5 => 0x64, + 0x0192 => 0x65, 0xa7 => 0x66, 0xa4 => 0x67, 0x27 => 0x68, + 0x201c => 0x69, 0xab => 0x6a, 0x2039 => 0x6b, 0x203a => 0x6c, + 0xfb01 => 0x6d, 0xfb02 => 0x6e, 0x2013 => 0x6f, 0x2020 => 0x70, + 0x2021 => 0x71, 0xb7 => 0x72, 0xb6 => 0x73, 0x2022 => 0x74, + 0x201a => 0x75, 0x201e => 0x76, 0x201d => 0x77, 0xbb => 0x78, + 0x2026 => 0x79, 0x2030 => 0x7a, 0xbf => 0x7b, 0x60 => 0x7c, + 0xb4 => 0x7d, 0x02c6 => 0x7e, 0x02dc => 0x7f, 0xaf => 0x80, + 0x02d8 => 0x81, 0x02d9 => 0x82, 0xa8 => 0x83, 0x02da => 0x84, + 0xb8 => 0x85, 0x02dd => 0x86, 0x02db => 0x87, 0x02c7 => 0x88, + 0x2014 => 0x89, 0xc6 => 0x8a, 0xaa => 0x8b, 0x0141 => 0x8c, + 0xd8 => 0x8d, 0x0152 => 0x8e, 0xba => 0x8f, 0xe6 => 0x90, + 0x0131 => 0x91, 0x0142 => 0x92, 0xf8 => 0x93, 0x0153 => 0x94, + 0xdf => 0x95, 0xcf => 0x96, 0xe9 => 0x97, 0x0103 => 0x98, + 0x0171 => 0x99, 0x011b => 0x9a, 0x0178 => 0x9b, 0xf7 => 0x9c, + 0xdd => 0x9d, 0xc2 => 0x9e, 0xe1 => 0x9f, 0xdb => 0xa0, + 0xfd => 0xa1, 0x0219 => 0xa2, 0xea => 0xa3, 0x016e => 0xa4, + 0xdc => 0xa5, 0x0105 => 0xa6, 0xda => 0xa7, 0x0173 => 0xa8, + 0xcb => 0xa9, 0x0110 => 0xaa, 0xf6c3 => 0xab, 0xa9 => 0xac, + 0x0112 => 0xad, 0x010d => 0xae, 0xe5 => 0xaf, 0x0145 => 0xb0, + 0x013a => 0xb1, 0xe0 => 0xb2, 0x0162 => 0xb3, 0x0106 => 0xb4, + 0xe3 => 0xb5, 0x0116 => 0xb6, 0x0161 => 0xb7, 0x015f => 0xb8, + 0xed => 0xb9, 0x25ca => 0xba, 0x0158 => 0xbb, 0x0122 => 0xbc, + 0xfb => 0xbd, 0xe2 => 0xbe, 0x0100 => 0xbf, 0x0159 => 0xc0, + 0xe7 => 0xc1, 0x017b => 0xc2, 0xde => 0xc3, 0x014c => 0xc4, + 0x0154 => 0xc5, 0x015a => 0xc6, 0x010f => 0xc7, 0x016a => 0xc8, + 0x016f => 0xc9, 0xb3 => 0xca, 0xd2 => 0xcb, 0xc0 => 0xcc, + 0x0102 => 0xcd, 0xd7 => 0xce, 0xfa => 0xcf, 0x0164 => 0xd0, + 0x2202 => 0xd1, 0xff => 0xd2, 0x0143 => 0xd3, 0xee => 0xd4, + 0xca => 0xd5, 0xe4 => 0xd6, 0xeb => 0xd7, 0x0107 => 0xd8, + 0x0144 => 0xd9, 0x016b => 0xda, 0x0147 => 0xdb, 0xcd => 0xdc, + 0xb1 => 0xdd, 0xa6 => 0xde, 0xae => 0xdf, 0x011e => 0xe0, + 0x0130 => 0xe1, 0x2211 => 0xe2, 0xc8 => 0xe3, 0x0155 => 0xe4, + 0x014d => 0xe5, 0x0179 => 0xe6, 0x017d => 0xe7, 0x2265 => 0xe8, + 0xd0 => 0xe9, 0xc7 => 0xea, 0x013c => 0xeb, 0x0165 => 0xec, + 0x0119 => 0xed, 0x0172 => 0xee, 0xc1 => 0xef, 0xc4 => 0xf0, + 0xe8 => 0xf1, 0x017a => 0xf2, 0x012f => 0xf3, 0xd3 => 0xf4, + 0xf3 => 0xf5, 0x0101 => 0xf6, 0x015b => 0xf7, 0xef => 0xf8, + 0xd4 => 0xf9, 0xd9 => 0xfa, 0x2206 => 0xfb, 0xfe => 0xfc, + 0xb2 => 0xfd, 0xd6 => 0xfe, 0xb5 => 0xff, 0xec => 0x0100, + 0x0151 => 0x0101, 0x0118 => 0x0102, 0x0111 => 0x0103, 0xbe => 0x0104, + 0x015e => 0x0105, 0x013e => 0x0106, 0x0136 => 0x0107, 0x0139 => 0x0108, + 0x2122 => 0x0109, 0x0117 => 0x010a, 0xcc => 0x010b, 0x012a => 0x010c, + 0x013d => 0x010d, 0xbd => 0x010e, 0x2264 => 0x010f, 0xf4 => 0x0110, + 0xf1 => 0x0111, 0x0170 => 0x0112, 0xc9 => 0x0113, 0x0113 => 0x0114, + 0x011f => 0x0115, 0xbc => 0x0116, 0x0160 => 0x0117, 0x0218 => 0x0118, + 0x0150 => 0x0119, 0xb0 => 0x011a, 0xf2 => 0x011b, 0x010c => 0x011c, + 0xf9 => 0x011d, 0x221a => 0x011e, 0x010e => 0x011f, 0x0157 => 0x0120, + 0xd1 => 0x0121, 0xf5 => 0x0122, 0x0156 => 0x0123, 0x013b => 0x0124, + 0xc3 => 0x0125, 0x0104 => 0x0126, 0xc5 => 0x0127, 0xd5 => 0x0128, + 0x017c => 0x0129, 0x011a => 0x012a, 0x012e => 0x012b, 0x0137 => 0x012c, + 0x2212 => 0x012d, 0xce => 0x012e, 0x0148 => 0x012f, 0x0163 => 0x0130, + 0xac => 0x0131, 0xf6 => 0x0132, 0xfc => 0x0133, 0x2260 => 0x0134, + 0x0123 => 0x0135, 0xf0 => 0x0136, 0x017e => 0x0137, 0x0146 => 0x0138, + 0xb9 => 0x0139, 0x012b => 0x013a, 0x20ac => 0x013b); + $this->_cmap = Zend_Pdf_Cmap::cmapWithTypeData( + Zend_Pdf_Cmap::TYPE_BYTE_ENCODING_STATIC, $cmapData); + + + /* Resource dictionary */ + + /* The resource dictionary for the standard fonts is sparse because PDF + * viewers already have all of the metrics data. We only need to provide + * the font name and encoding method. + */ + $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 new file mode 100644 index 0000000..b35daf8 --- /dev/null +++ b/libs/Zend/Pdf/Resource/Font/Simple/Standard/HelveticaOblique.php @@ -0,0 +1,301 @@ +_fontNames[Zend_Pdf_Font::NAME_COPYRIGHT]['en'] = + "\x00\x43\x00\x6f\x00\x70\x00\x79\x00\x72\x00\x69\x00\x67\x00\x68\x00" + . "\x74\x00\x20\x00\x28\x00\x63\x00\x29\x00\x20\x00\x31\x00\x39\x00" + . "\x38\x00\x35\x00\x2c\x00\x20\x00\x31\x00\x39\x00\x38\x00\x37\x00" + . "\x2c\x00\x20\x00\x31\x00\x39\x00\x38\x00\x39\x00\x2c\x00\x20\x00" + . "\x31\x00\x39\x00\x39\x00\x30\x00\x2c\x00\x20\x00\x31\x00\x39\x00" + . "\x39\x00\x37\x00\x20\x00\x41\x00\x64\x00\x6f\x00\x62\x00\x65\x00" + . "\x20\x00\x53\x00\x79\x00\x73\x00\x74\x00\x65\x00\x6d\x00\x73\x00" + . "\x20\x00\x49\x00\x6e\x00\x63\x00\x6f\x00\x72\x00\x70\x00\x6f\x00" + . "\x72\x00\x61\x00\x74\x00\x65\x00\x64\x00\x2e\x00\x20\x00\x20\x00" + . "\x41\x00\x6c\x00\x6c\x00\x20\x00\x52\x00\x69\x00\x67\x00\x68\x00" + . "\x74\x00\x73\x00\x20\x00\x52\x00\x65\x00\x73\x00\x65\x00\x72\x00" + . "\x76\x00\x65\x00\x64\x00\x2e\x00\x48\x00\x65\x00\x6c\x00\x76\x00" + . "\x65\x00\x74\x00\x69\x00\x63\x00\x61\x00\x20\x00\x69\x00\x73\x00" + . "\x20\x00\x61\x00\x20\x00\x74\x00\x72\x00\x61\x00\x64\x00\x65\x00" + . "\x6d\x00\x61\x00\x72\x00\x6b\x00\x20\x00\x6f\x00\x66\x00\x20\x00" + . "\x4c\x00\x69\x00\x6e\x00\x6f\x00\x74\x00\x79\x00\x70\x00\x65\x00" + . "\x2d\x00\x48\x00\x65\x00\x6c\x00\x6c\x00\x20\x00\x41\x00\x47\x00" + . "\x20\x00\x61\x00\x6e\x00\x64\x00\x2f\x00\x6f\x00\x72\x00\x20\x00" + . "\x69\x00\x74\x00\x73\x00\x20\x00\x73\x00\x75\x00\x62\x00\x73\x00" + . "\x69\x00\x64\x00\x69\x00\x61\x00\x72\x00\x69\x00\x65\x00\x73\x00" + . "\x2e"; + $this->_fontNames[Zend_Pdf_Font::NAME_FAMILY]['en'] = + "\x00\x48\x00\x65\x00\x6c\x00\x76\x00\x65\x00\x74\x00\x69\x00\x63\x00" + . "\x61"; + $this->_fontNames[Zend_Pdf_Font::NAME_STYLE]['en'] = + "\x00\x4d\x00\x65\x00\x64\x00\x69\x00\x75\x00\x6d"; + $this->_fontNames[Zend_Pdf_Font::NAME_ID]['en'] = + "\x00\x34\x00\x33\x00\x30\x00\x35\x00\x35"; + $this->_fontNames[Zend_Pdf_Font::NAME_FULL]['en'] = + "\x00\x48\x00\x65\x00\x6c\x00\x76\x00\x65\x00\x74\x00\x69\x00\x63\x00" + . "\x61\x00\x2d\x00\x4f\x00\x62\x00\x6c\x00\x69\x00\x71\x00\x75\x00" + . "\x65\x00\x20\x00\x4d\x00\x65\x00\x64\x00\x69\x00\x75\x00\x6d"; + $this->_fontNames[Zend_Pdf_Font::NAME_VERSION]['en'] = + "\x00\x30\x00\x30\x00\x32\x00\x2e\x00\x30\x00\x30\x00\x30"; + $this->_fontNames[Zend_Pdf_Font::NAME_POSTSCRIPT]['en'] = + "\x00\x48\x00\x65\x00\x6c\x00\x76\x00\x65\x00\x74\x00\x69\x00\x63\x00" + . "\x61\x00\x2d\x00\x4f\x00\x62\x00\x6c\x00\x69\x00\x71\x00\x75\x00" + . "\x65"; + + $this->_isBold = false; + $this->_isItalic = true; + $this->_isMonospaced = false; + + $this->_underlinePosition = -100; + $this->_underlineThickness = 50; + $this->_strikePosition = 225; + $this->_strikeThickness = 50; + + $this->_unitsPerEm = 1000; + + $this->_ascent = 718; + $this->_descent = -207; + $this->_lineGap = 275; + + /* The glyph numbers assigned here are synthetic; they do not match the + * actual glyph numbers used by the font. This is not a big deal though + * since this data never makes it to the PDF file. It is only used + * internally for layout calculations. + */ + $this->_glyphWidths = array( + 0x00 => 0x01f4, 0x01 => 0x0116, 0x02 => 0x0116, 0x03 => 0x0163, + 0x04 => 0x022c, 0x05 => 0x022c, 0x06 => 0x0379, 0x07 => 0x029b, + 0x08 => 0xde, 0x09 => 0x014d, 0x0a => 0x014d, 0x0b => 0x0185, + 0x0c => 0x0248, 0x0d => 0x0116, 0x0e => 0x014d, 0x0f => 0x0116, + 0x10 => 0x0116, 0x11 => 0x022c, 0x12 => 0x022c, 0x13 => 0x022c, + 0x14 => 0x022c, 0x15 => 0x022c, 0x16 => 0x022c, 0x17 => 0x022c, + 0x18 => 0x022c, 0x19 => 0x022c, 0x1a => 0x022c, 0x1b => 0x0116, + 0x1c => 0x0116, 0x1d => 0x0248, 0x1e => 0x0248, 0x1f => 0x0248, + 0x20 => 0x022c, 0x21 => 0x03f7, 0x22 => 0x029b, 0x23 => 0x029b, + 0x24 => 0x02d2, 0x25 => 0x02d2, 0x26 => 0x029b, 0x27 => 0x0263, + 0x28 => 0x030a, 0x29 => 0x02d2, 0x2a => 0x0116, 0x2b => 0x01f4, + 0x2c => 0x029b, 0x2d => 0x022c, 0x2e => 0x0341, 0x2f => 0x02d2, + 0x30 => 0x030a, 0x31 => 0x029b, 0x32 => 0x030a, 0x33 => 0x02d2, + 0x34 => 0x029b, 0x35 => 0x0263, 0x36 => 0x02d2, 0x37 => 0x029b, + 0x38 => 0x03b0, 0x39 => 0x029b, 0x3a => 0x029b, 0x3b => 0x0263, + 0x3c => 0x0116, 0x3d => 0x0116, 0x3e => 0x0116, 0x3f => 0x01d5, + 0x40 => 0x022c, 0x41 => 0xde, 0x42 => 0x022c, 0x43 => 0x022c, + 0x44 => 0x01f4, 0x45 => 0x022c, 0x46 => 0x022c, 0x47 => 0x0116, + 0x48 => 0x022c, 0x49 => 0x022c, 0x4a => 0xde, 0x4b => 0xde, + 0x4c => 0x01f4, 0x4d => 0xde, 0x4e => 0x0341, 0x4f => 0x022c, + 0x50 => 0x022c, 0x51 => 0x022c, 0x52 => 0x022c, 0x53 => 0x014d, + 0x54 => 0x01f4, 0x55 => 0x0116, 0x56 => 0x022c, 0x57 => 0x01f4, + 0x58 => 0x02d2, 0x59 => 0x01f4, 0x5a => 0x01f4, 0x5b => 0x01f4, + 0x5c => 0x014e, 0x5d => 0x0104, 0x5e => 0x014e, 0x5f => 0x0248, + 0x60 => 0x014d, 0x61 => 0x022c, 0x62 => 0x022c, 0x63 => 0xa7, + 0x64 => 0x022c, 0x65 => 0x022c, 0x66 => 0x022c, 0x67 => 0x022c, + 0x68 => 0xbf, 0x69 => 0x014d, 0x6a => 0x022c, 0x6b => 0x014d, + 0x6c => 0x014d, 0x6d => 0x01f4, 0x6e => 0x01f4, 0x6f => 0x022c, + 0x70 => 0x022c, 0x71 => 0x022c, 0x72 => 0x0116, 0x73 => 0x0219, + 0x74 => 0x015e, 0x75 => 0xde, 0x76 => 0x014d, 0x77 => 0x014d, + 0x78 => 0x022c, 0x79 => 0x03e8, 0x7a => 0x03e8, 0x7b => 0x0263, + 0x7c => 0x014d, 0x7d => 0x014d, 0x7e => 0x014d, 0x7f => 0x014d, + 0x80 => 0x014d, 0x81 => 0x014d, 0x82 => 0x014d, 0x83 => 0x014d, + 0x84 => 0x014d, 0x85 => 0x014d, 0x86 => 0x014d, 0x87 => 0x014d, + 0x88 => 0x014d, 0x89 => 0x03e8, 0x8a => 0x03e8, 0x8b => 0x0172, + 0x8c => 0x022c, 0x8d => 0x030a, 0x8e => 0x03e8, 0x8f => 0x016d, + 0x90 => 0x0379, 0x91 => 0x0116, 0x92 => 0xde, 0x93 => 0x0263, + 0x94 => 0x03b0, 0x95 => 0x0263, 0x96 => 0x0116, 0x97 => 0x022c, + 0x98 => 0x022c, 0x99 => 0x022c, 0x9a => 0x022c, 0x9b => 0x029b, + 0x9c => 0x0248, 0x9d => 0x029b, 0x9e => 0x029b, 0x9f => 0x022c, + 0xa0 => 0x02d2, 0xa1 => 0x01f4, 0xa2 => 0x01f4, 0xa3 => 0x022c, + 0xa4 => 0x02d2, 0xa5 => 0x02d2, 0xa6 => 0x022c, 0xa7 => 0x02d2, + 0xa8 => 0x022c, 0xa9 => 0x029b, 0xaa => 0x02d2, 0xab => 0xfa, + 0xac => 0x02e1, 0xad => 0x029b, 0xae => 0x01f4, 0xaf => 0x022c, + 0xb0 => 0x02d2, 0xb1 => 0xde, 0xb2 => 0x022c, 0xb3 => 0x0263, + 0xb4 => 0x02d2, 0xb5 => 0x022c, 0xb6 => 0x029b, 0xb7 => 0x01f4, + 0xb8 => 0x01f4, 0xb9 => 0x0116, 0xba => 0x01d7, 0xbb => 0x02d2, + 0xbc => 0x030a, 0xbd => 0x022c, 0xbe => 0x022c, 0xbf => 0x029b, + 0xc0 => 0x014d, 0xc1 => 0x01f4, 0xc2 => 0x0263, 0xc3 => 0x029b, + 0xc4 => 0x030a, 0xc5 => 0x02d2, 0xc6 => 0x029b, 0xc7 => 0x0283, + 0xc8 => 0x02d2, 0xc9 => 0x022c, 0xca => 0x014d, 0xcb => 0x030a, + 0xcc => 0x029b, 0xcd => 0x029b, 0xce => 0x0248, 0xcf => 0x022c, + 0xd0 => 0x0263, 0xd1 => 0x01dc, 0xd2 => 0x01f4, 0xd3 => 0x02d2, + 0xd4 => 0x0116, 0xd5 => 0x029b, 0xd6 => 0x022c, 0xd7 => 0x022c, + 0xd8 => 0x01f4, 0xd9 => 0x022c, 0xda => 0x022c, 0xdb => 0x02d2, + 0xdc => 0x0116, 0xdd => 0x0248, 0xde => 0x0104, 0xdf => 0x02e1, + 0xe0 => 0x030a, 0xe1 => 0x0116, 0xe2 => 0x0258, 0xe3 => 0x029b, + 0xe4 => 0x014d, 0xe5 => 0x022c, 0xe6 => 0x0263, 0xe7 => 0x0263, + 0xe8 => 0x0225, 0xe9 => 0x02d2, 0xea => 0x02d2, 0xeb => 0xde, + 0xec => 0x013d, 0xed => 0x022c, 0xee => 0x02d2, 0xef => 0x029b, + 0xf0 => 0x029b, 0xf1 => 0x022c, 0xf2 => 0x01f4, 0xf3 => 0xde, + 0xf4 => 0x030a, 0xf5 => 0x022c, 0xf6 => 0x022c, 0xf7 => 0x01f4, + 0xf8 => 0x0116, 0xf9 => 0x030a, 0xfa => 0x02d2, 0xfb => 0x0264, + 0xfc => 0x022c, 0xfd => 0x014d, 0xfe => 0x030a, 0xff => 0x022c, + 0x0100 => 0x0116, 0x0101 => 0x022c, 0x0102 => 0x029b, 0x0103 => 0x022c, + 0x0104 => 0x0342, 0x0105 => 0x029b, 0x0106 => 0x012b, 0x0107 => 0x029b, + 0x0108 => 0x022c, 0x0109 => 0x03e8, 0x010a => 0x022c, 0x010b => 0x0116, + 0x010c => 0x0116, 0x010d => 0x022c, 0x010e => 0x0342, 0x010f => 0x0225, + 0x0110 => 0x022c, 0x0111 => 0x022c, 0x0112 => 0x02d2, 0x0113 => 0x029b, + 0x0114 => 0x022c, 0x0115 => 0x022c, 0x0116 => 0x0342, 0x0117 => 0x029b, + 0x0118 => 0x029b, 0x0119 => 0x030a, 0x011a => 0x0190, 0x011b => 0x022c, + 0x011c => 0x02d2, 0x011d => 0x022c, 0x011e => 0x01c5, 0x011f => 0x02d2, + 0x0120 => 0x014d, 0x0121 => 0x02d2, 0x0122 => 0x022c, 0x0123 => 0x02d2, + 0x0124 => 0x022c, 0x0125 => 0x029b, 0x0126 => 0x029b, 0x0127 => 0x029b, + 0x0128 => 0x030a, 0x0129 => 0x01f4, 0x012a => 0x029b, 0x012b => 0x0116, + 0x012c => 0x01f4, 0x012d => 0x0248, 0x012e => 0x0116, 0x012f => 0x022c, + 0x0130 => 0x0116, 0x0131 => 0x0248, 0x0132 => 0x022c, 0x0133 => 0x022c, + 0x0134 => 0x0225, 0x0135 => 0x022c, 0x0136 => 0x022c, 0x0137 => 0x01f4, + 0x0138 => 0x022c, 0x0139 => 0x014d, 0x013a => 0x0116, 0x013b => 0x022c, + ); + + /* The cmap table is similarly synthesized. + */ + $cmapData = array( + 0x20 => 0x01, 0x21 => 0x02, 0x22 => 0x03, 0x23 => 0x04, + 0x24 => 0x05, 0x25 => 0x06, 0x26 => 0x07, 0x2019 => 0x08, + 0x28 => 0x09, 0x29 => 0x0a, 0x2a => 0x0b, 0x2b => 0x0c, + 0x2c => 0x0d, 0x2d => 0x0e, 0x2e => 0x0f, 0x2f => 0x10, + 0x30 => 0x11, 0x31 => 0x12, 0x32 => 0x13, 0x33 => 0x14, + 0x34 => 0x15, 0x35 => 0x16, 0x36 => 0x17, 0x37 => 0x18, + 0x38 => 0x19, 0x39 => 0x1a, 0x3a => 0x1b, 0x3b => 0x1c, + 0x3c => 0x1d, 0x3d => 0x1e, 0x3e => 0x1f, 0x3f => 0x20, + 0x40 => 0x21, 0x41 => 0x22, 0x42 => 0x23, 0x43 => 0x24, + 0x44 => 0x25, 0x45 => 0x26, 0x46 => 0x27, 0x47 => 0x28, + 0x48 => 0x29, 0x49 => 0x2a, 0x4a => 0x2b, 0x4b => 0x2c, + 0x4c => 0x2d, 0x4d => 0x2e, 0x4e => 0x2f, 0x4f => 0x30, + 0x50 => 0x31, 0x51 => 0x32, 0x52 => 0x33, 0x53 => 0x34, + 0x54 => 0x35, 0x55 => 0x36, 0x56 => 0x37, 0x57 => 0x38, + 0x58 => 0x39, 0x59 => 0x3a, 0x5a => 0x3b, 0x5b => 0x3c, + 0x5c => 0x3d, 0x5d => 0x3e, 0x5e => 0x3f, 0x5f => 0x40, + 0x2018 => 0x41, 0x61 => 0x42, 0x62 => 0x43, 0x63 => 0x44, + 0x64 => 0x45, 0x65 => 0x46, 0x66 => 0x47, 0x67 => 0x48, + 0x68 => 0x49, 0x69 => 0x4a, 0x6a => 0x4b, 0x6b => 0x4c, + 0x6c => 0x4d, 0x6d => 0x4e, 0x6e => 0x4f, 0x6f => 0x50, + 0x70 => 0x51, 0x71 => 0x52, 0x72 => 0x53, 0x73 => 0x54, + 0x74 => 0x55, 0x75 => 0x56, 0x76 => 0x57, 0x77 => 0x58, + 0x78 => 0x59, 0x79 => 0x5a, 0x7a => 0x5b, 0x7b => 0x5c, + 0x7c => 0x5d, 0x7d => 0x5e, 0x7e => 0x5f, 0xa1 => 0x60, + 0xa2 => 0x61, 0xa3 => 0x62, 0x2044 => 0x63, 0xa5 => 0x64, + 0x0192 => 0x65, 0xa7 => 0x66, 0xa4 => 0x67, 0x27 => 0x68, + 0x201c => 0x69, 0xab => 0x6a, 0x2039 => 0x6b, 0x203a => 0x6c, + 0xfb01 => 0x6d, 0xfb02 => 0x6e, 0x2013 => 0x6f, 0x2020 => 0x70, + 0x2021 => 0x71, 0xb7 => 0x72, 0xb6 => 0x73, 0x2022 => 0x74, + 0x201a => 0x75, 0x201e => 0x76, 0x201d => 0x77, 0xbb => 0x78, + 0x2026 => 0x79, 0x2030 => 0x7a, 0xbf => 0x7b, 0x60 => 0x7c, + 0xb4 => 0x7d, 0x02c6 => 0x7e, 0x02dc => 0x7f, 0xaf => 0x80, + 0x02d8 => 0x81, 0x02d9 => 0x82, 0xa8 => 0x83, 0x02da => 0x84, + 0xb8 => 0x85, 0x02dd => 0x86, 0x02db => 0x87, 0x02c7 => 0x88, + 0x2014 => 0x89, 0xc6 => 0x8a, 0xaa => 0x8b, 0x0141 => 0x8c, + 0xd8 => 0x8d, 0x0152 => 0x8e, 0xba => 0x8f, 0xe6 => 0x90, + 0x0131 => 0x91, 0x0142 => 0x92, 0xf8 => 0x93, 0x0153 => 0x94, + 0xdf => 0x95, 0xcf => 0x96, 0xe9 => 0x97, 0x0103 => 0x98, + 0x0171 => 0x99, 0x011b => 0x9a, 0x0178 => 0x9b, 0xf7 => 0x9c, + 0xdd => 0x9d, 0xc2 => 0x9e, 0xe1 => 0x9f, 0xdb => 0xa0, + 0xfd => 0xa1, 0x0219 => 0xa2, 0xea => 0xa3, 0x016e => 0xa4, + 0xdc => 0xa5, 0x0105 => 0xa6, 0xda => 0xa7, 0x0173 => 0xa8, + 0xcb => 0xa9, 0x0110 => 0xaa, 0xf6c3 => 0xab, 0xa9 => 0xac, + 0x0112 => 0xad, 0x010d => 0xae, 0xe5 => 0xaf, 0x0145 => 0xb0, + 0x013a => 0xb1, 0xe0 => 0xb2, 0x0162 => 0xb3, 0x0106 => 0xb4, + 0xe3 => 0xb5, 0x0116 => 0xb6, 0x0161 => 0xb7, 0x015f => 0xb8, + 0xed => 0xb9, 0x25ca => 0xba, 0x0158 => 0xbb, 0x0122 => 0xbc, + 0xfb => 0xbd, 0xe2 => 0xbe, 0x0100 => 0xbf, 0x0159 => 0xc0, + 0xe7 => 0xc1, 0x017b => 0xc2, 0xde => 0xc3, 0x014c => 0xc4, + 0x0154 => 0xc5, 0x015a => 0xc6, 0x010f => 0xc7, 0x016a => 0xc8, + 0x016f => 0xc9, 0xb3 => 0xca, 0xd2 => 0xcb, 0xc0 => 0xcc, + 0x0102 => 0xcd, 0xd7 => 0xce, 0xfa => 0xcf, 0x0164 => 0xd0, + 0x2202 => 0xd1, 0xff => 0xd2, 0x0143 => 0xd3, 0xee => 0xd4, + 0xca => 0xd5, 0xe4 => 0xd6, 0xeb => 0xd7, 0x0107 => 0xd8, + 0x0144 => 0xd9, 0x016b => 0xda, 0x0147 => 0xdb, 0xcd => 0xdc, + 0xb1 => 0xdd, 0xa6 => 0xde, 0xae => 0xdf, 0x011e => 0xe0, + 0x0130 => 0xe1, 0x2211 => 0xe2, 0xc8 => 0xe3, 0x0155 => 0xe4, + 0x014d => 0xe5, 0x0179 => 0xe6, 0x017d => 0xe7, 0x2265 => 0xe8, + 0xd0 => 0xe9, 0xc7 => 0xea, 0x013c => 0xeb, 0x0165 => 0xec, + 0x0119 => 0xed, 0x0172 => 0xee, 0xc1 => 0xef, 0xc4 => 0xf0, + 0xe8 => 0xf1, 0x017a => 0xf2, 0x012f => 0xf3, 0xd3 => 0xf4, + 0xf3 => 0xf5, 0x0101 => 0xf6, 0x015b => 0xf7, 0xef => 0xf8, + 0xd4 => 0xf9, 0xd9 => 0xfa, 0x2206 => 0xfb, 0xfe => 0xfc, + 0xb2 => 0xfd, 0xd6 => 0xfe, 0xb5 => 0xff, 0xec => 0x0100, + 0x0151 => 0x0101, 0x0118 => 0x0102, 0x0111 => 0x0103, 0xbe => 0x0104, + 0x015e => 0x0105, 0x013e => 0x0106, 0x0136 => 0x0107, 0x0139 => 0x0108, + 0x2122 => 0x0109, 0x0117 => 0x010a, 0xcc => 0x010b, 0x012a => 0x010c, + 0x013d => 0x010d, 0xbd => 0x010e, 0x2264 => 0x010f, 0xf4 => 0x0110, + 0xf1 => 0x0111, 0x0170 => 0x0112, 0xc9 => 0x0113, 0x0113 => 0x0114, + 0x011f => 0x0115, 0xbc => 0x0116, 0x0160 => 0x0117, 0x0218 => 0x0118, + 0x0150 => 0x0119, 0xb0 => 0x011a, 0xf2 => 0x011b, 0x010c => 0x011c, + 0xf9 => 0x011d, 0x221a => 0x011e, 0x010e => 0x011f, 0x0157 => 0x0120, + 0xd1 => 0x0121, 0xf5 => 0x0122, 0x0156 => 0x0123, 0x013b => 0x0124, + 0xc3 => 0x0125, 0x0104 => 0x0126, 0xc5 => 0x0127, 0xd5 => 0x0128, + 0x017c => 0x0129, 0x011a => 0x012a, 0x012e => 0x012b, 0x0137 => 0x012c, + 0x2212 => 0x012d, 0xce => 0x012e, 0x0148 => 0x012f, 0x0163 => 0x0130, + 0xac => 0x0131, 0xf6 => 0x0132, 0xfc => 0x0133, 0x2260 => 0x0134, + 0x0123 => 0x0135, 0xf0 => 0x0136, 0x017e => 0x0137, 0x0146 => 0x0138, + 0xb9 => 0x0139, 0x012b => 0x013a, 0x20ac => 0x013b); + $this->_cmap = Zend_Pdf_Cmap::cmapWithTypeData( + Zend_Pdf_Cmap::TYPE_BYTE_ENCODING_STATIC, $cmapData); + + + /* Resource dictionary */ + + /* The resource dictionary for the standard fonts is sparse because PDF + * viewers already have all of the metrics data. We only need to provide + * the font name and encoding method. + */ + $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 new file mode 100644 index 0000000..c7ce81c --- /dev/null +++ b/libs/Zend/Pdf/Resource/Font/Simple/Standard/Symbol.php @@ -0,0 +1,459 @@ + "\x20", 0x21 => "\x21", 0x2200 => "\x22", 0x23 => "\x23", + 0x2203 => "\x24", 0x25 => "\x25", 0x26 => "\x26", 0x220b => "\x27", + 0x28 => "\x28", 0x29 => "\x29", 0x2217 => "\x2a", 0x2b => "\x2b", + 0x2c => "\x2c", 0x2212 => "\x2d", 0x2e => "\x2e", 0x2f => "\x2f", + 0x30 => "\x30", 0x31 => "\x31", 0x32 => "\x32", 0x33 => "\x33", + 0x34 => "\x34", 0x35 => "\x35", 0x36 => "\x36", 0x37 => "\x37", + 0x38 => "\x38", 0x39 => "\x39", 0x3a => "\x3a", 0x3b => "\x3b", + 0x3c => "\x3c", 0x3d => "\x3d", 0x3e => "\x3e", 0x3f => "\x3f", + 0x2245 => "\x40", 0x0391 => "\x41", 0x0392 => "\x42", 0x03a7 => "\x43", + 0x2206 => "\x44", 0x0395 => "\x45", 0x03a6 => "\x46", 0x0393 => "\x47", + 0x0397 => "\x48", 0x0399 => "\x49", 0x03d1 => "\x4a", 0x039a => "\x4b", + 0x039b => "\x4c", 0x039c => "\x4d", 0x039d => "\x4e", 0x039f => "\x4f", + 0x03a0 => "\x50", 0x0398 => "\x51", 0x03a1 => "\x52", 0x03a3 => "\x53", + 0x03a4 => "\x54", 0x03a5 => "\x55", 0x03c2 => "\x56", 0x2126 => "\x57", + 0x039e => "\x58", 0x03a8 => "\x59", 0x0396 => "\x5a", 0x5b => "\x5b", + 0x2234 => "\x5c", 0x5d => "\x5d", 0x22a5 => "\x5e", 0x5f => "\x5f", + 0xf8e5 => "\x60", 0x03b1 => "\x61", 0x03b2 => "\x62", 0x03c7 => "\x63", + 0x03b4 => "\x64", 0x03b5 => "\x65", 0x03c6 => "\x66", 0x03b3 => "\x67", + 0x03b7 => "\x68", 0x03b9 => "\x69", 0x03d5 => "\x6a", 0x03ba => "\x6b", + 0x03bb => "\x6c", 0xb5 => "\x6d", 0x03bd => "\x6e", 0x03bf => "\x6f", + 0x03c0 => "\x70", 0x03b8 => "\x71", 0x03c1 => "\x72", 0x03c3 => "\x73", + 0x03c4 => "\x74", 0x03c5 => "\x75", 0x03d6 => "\x76", 0x03c9 => "\x77", + 0x03be => "\x78", 0x03c8 => "\x79", 0x03b6 => "\x7a", 0x7b => "\x7b", + 0x7c => "\x7c", 0x7d => "\x7d", 0x223c => "\x7e", 0x20ac => "\xa0", + 0x03d2 => "\xa1", 0x2032 => "\xa2", 0x2264 => "\xa3", 0x2044 => "\xa4", + 0x221e => "\xa5", 0x0192 => "\xa6", 0x2663 => "\xa7", 0x2666 => "\xa8", + 0x2665 => "\xa9", 0x2660 => "\xaa", 0x2194 => "\xab", 0x2190 => "\xac", + 0x2191 => "\xad", 0x2192 => "\xae", 0x2193 => "\xaf", 0xb0 => "\xb0", + 0xb1 => "\xb1", 0x2033 => "\xb2", 0x2265 => "\xb3", 0xd7 => "\xb4", + 0x221d => "\xb5", 0x2202 => "\xb6", 0x2022 => "\xb7", 0xf7 => "\xb8", + 0x2260 => "\xb9", 0x2261 => "\xba", 0x2248 => "\xbb", 0x2026 => "\xbc", + 0xf8e6 => "\xbd", 0xf8e7 => "\xbe", 0x21b5 => "\xbf", 0x2135 => "\xc0", + 0x2111 => "\xc1", 0x211c => "\xc2", 0x2118 => "\xc3", 0x2297 => "\xc4", + 0x2295 => "\xc5", 0x2205 => "\xc6", 0x2229 => "\xc7", 0x222a => "\xc8", + 0x2283 => "\xc9", 0x2287 => "\xca", 0x2284 => "\xcb", 0x2282 => "\xcc", + 0x2286 => "\xcd", 0x2208 => "\xce", 0x2209 => "\xcf", 0x2220 => "\xd0", + 0x2207 => "\xd1", 0xf6da => "\xd2", 0xf6d9 => "\xd3", 0xf6db => "\xd4", + 0x220f => "\xd5", 0x221a => "\xd6", 0x22c5 => "\xd7", 0xac => "\xd8", + 0x2227 => "\xd9", 0x2228 => "\xda", 0x21d4 => "\xdb", 0x21d0 => "\xdc", + 0x21d1 => "\xdd", 0x21d2 => "\xde", 0x21d3 => "\xdf", 0x25ca => "\xe0", + 0x2329 => "\xe1", 0xf8e8 => "\xe2", 0xf8e9 => "\xe3", 0xf8ea => "\xe4", + 0x2211 => "\xe5", 0xf8eb => "\xe6", 0xf8ec => "\xe7", 0xf8ed => "\xe8", + 0xf8ee => "\xe9", 0xf8ef => "\xea", 0xf8f0 => "\xeb", 0xf8f1 => "\xec", + 0xf8f2 => "\xed", 0xf8f3 => "\xee", 0xf8f4 => "\xef", 0x232a => "\xf1", + 0x222b => "\xf2", 0x2320 => "\xf3", 0xf8f5 => "\xf4", 0x2321 => "\xf5", + 0xf8f6 => "\xf6", 0xf8f7 => "\xf7", 0xf8f8 => "\xf8", 0xf8f9 => "\xf9", + 0xf8fa => "\xfa", 0xf8fb => "\xfb", 0xf8fc => "\xfc", 0xf8fd => "\xfd", + 0xf8fe => "\xfe"); + + /** + * Array for conversion from special font encoding to local encoding. + * See {@link decodeString()}. + * @var array + */ + protected $_fromFontEncoding = array( + 0x20 => "\x00\x20", 0x21 => "\x00\x21", 0x22 => "\x22\x00", + 0x23 => "\x00\x23", 0x24 => "\x22\x03", 0x25 => "\x00\x25", + 0x26 => "\x00\x26", 0x27 => "\x22\x0b", 0x28 => "\x00\x28", + 0x29 => "\x00\x29", 0x2a => "\x22\x17", 0x2b => "\x00\x2b", + 0x2c => "\x00\x2c", 0x2d => "\x22\x12", 0x2e => "\x00\x2e", + 0x2f => "\x00\x2f", 0x30 => "\x00\x30", 0x31 => "\x00\x31", + 0x32 => "\x00\x32", 0x33 => "\x00\x33", 0x34 => "\x00\x34", + 0x35 => "\x00\x35", 0x36 => "\x00\x36", 0x37 => "\x00\x37", + 0x38 => "\x00\x38", 0x39 => "\x00\x39", 0x3a => "\x00\x3a", + 0x3b => "\x00\x3b", 0x3c => "\x00\x3c", 0x3d => "\x00\x3d", + 0x3e => "\x00\x3e", 0x3f => "\x00\x3f", 0x40 => "\x22\x45", + 0x41 => "\x03\x91", 0x42 => "\x03\x92", 0x43 => "\x03\xa7", + 0x44 => "\x22\x06", 0x45 => "\x03\x95", 0x46 => "\x03\xa6", + 0x47 => "\x03\x93", 0x48 => "\x03\x97", 0x49 => "\x03\x99", + 0x4a => "\x03\xd1", 0x4b => "\x03\x9a", 0x4c => "\x03\x9b", + 0x4d => "\x03\x9c", 0x4e => "\x03\x9d", 0x4f => "\x03\x9f", + 0x50 => "\x03\xa0", 0x51 => "\x03\x98", 0x52 => "\x03\xa1", + 0x53 => "\x03\xa3", 0x54 => "\x03\xa4", 0x55 => "\x03\xa5", + 0x56 => "\x03\xc2", 0x57 => "\x21\x26", 0x58 => "\x03\x9e", + 0x59 => "\x03\xa8", 0x5a => "\x03\x96", 0x5b => "\x00\x5b", + 0x5c => "\x22\x34", 0x5d => "\x00\x5d", 0x5e => "\x22\xa5", + 0x5f => "\x00\x5f", 0x60 => "\xf8\xe5", 0x61 => "\x03\xb1", + 0x62 => "\x03\xb2", 0x63 => "\x03\xc7", 0x64 => "\x03\xb4", + 0x65 => "\x03\xb5", 0x66 => "\x03\xc6", 0x67 => "\x03\xb3", + 0x68 => "\x03\xb7", 0x69 => "\x03\xb9", 0x6a => "\x03\xd5", + 0x6b => "\x03\xba", 0x6c => "\x03\xbb", 0x6d => "\x00\xb5", + 0x6e => "\x03\xbd", 0x6f => "\x03\xbf", 0x70 => "\x03\xc0", + 0x71 => "\x03\xb8", 0x72 => "\x03\xc1", 0x73 => "\x03\xc3", + 0x74 => "\x03\xc4", 0x75 => "\x03\xc5", 0x76 => "\x03\xd6", + 0x77 => "\x03\xc9", 0x78 => "\x03\xbe", 0x79 => "\x03\xc8", + 0x7a => "\x03\xb6", 0x7b => "\x00\x7b", 0x7c => "\x00\x7c", + 0x7d => "\x00\x7d", 0x7e => "\x22\x3c", 0xa0 => "\x20\xac", + 0xa1 => "\x03\xd2", 0xa2 => "\x20\x32", 0xa3 => "\x22\x64", + 0xa4 => "\x20\x44", 0xa5 => "\x22\x1e", 0xa6 => "\x01\x92", + 0xa7 => "\x26\x63", 0xa8 => "\x26\x66", 0xa9 => "\x26\x65", + 0xaa => "\x26\x60", 0xab => "\x21\x94", 0xac => "\x21\x90", + 0xad => "\x21\x91", 0xae => "\x21\x92", 0xaf => "\x21\x93", + 0xb0 => "\x00\xb0", 0xb1 => "\x00\xb1", 0xb2 => "\x20\x33", + 0xb3 => "\x22\x65", 0xb4 => "\x00\xd7", 0xb5 => "\x22\x1d", + 0xb6 => "\x22\x02", 0xb7 => "\x20\x22", 0xb8 => "\x00\xf7", + 0xb9 => "\x22\x60", 0xba => "\x22\x61", 0xbb => "\x22\x48", + 0xbc => "\x20\x26", 0xbd => "\xf8\xe6", 0xbe => "\xf8\xe7", + 0xbf => "\x21\xb5", 0xc0 => "\x21\x35", 0xc1 => "\x21\x11", + 0xc2 => "\x21\x1c", 0xc3 => "\x21\x18", 0xc4 => "\x22\x97", + 0xc5 => "\x22\x95", 0xc6 => "\x22\x05", 0xc7 => "\x22\x29", + 0xc8 => "\x22\x2a", 0xc9 => "\x22\x83", 0xca => "\x22\x87", + 0xcb => "\x22\x84", 0xcc => "\x22\x82", 0xcd => "\x22\x86", + 0xce => "\x22\x08", 0xcf => "\x22\x09", 0xd0 => "\x22\x20", + 0xd1 => "\x22\x07", 0xd2 => "\xf6\xda", 0xd3 => "\xf6\xd9", + 0xd4 => "\xf6\xdb", 0xd5 => "\x22\x0f", 0xd6 => "\x22\x1a", + 0xd7 => "\x22\xc5", 0xd8 => "\x00\xac", 0xd9 => "\x22\x27", + 0xda => "\x22\x28", 0xdb => "\x21\xd4", 0xdc => "\x21\xd0", + 0xdd => "\x21\xd1", 0xde => "\x21\xd2", 0xdf => "\x21\xd3", + 0xe0 => "\x25\xca", 0xe1 => "\x23\x29", 0xe2 => "\xf8\xe8", + 0xe3 => "\xf8\xe9", 0xe4 => "\xf8\xea", 0xe5 => "\x22\x11", + 0xe6 => "\xf8\xeb", 0xe7 => "\xf8\xec", 0xe8 => "\xf8\xed", + 0xe9 => "\xf8\xee", 0xea => "\xf8\xef", 0xeb => "\xf8\xf0", + 0xec => "\xf8\xf1", 0xed => "\xf8\xf2", 0xee => "\xf8\xf3", + 0xef => "\xf8\xf4", 0xf1 => "\x23\x2a", 0xf2 => "\x22\x2b", + 0xf3 => "\x23\x20", 0xf4 => "\xf8\xf5", 0xf5 => "\x23\x21", + 0xf6 => "\xf8\xf6", 0xf7 => "\xf8\xf7", 0xf8 => "\xf8\xf8", + 0xf9 => "\xf8\xf9", 0xfa => "\xf8\xfa", 0xfb => "\xf8\xfb", + 0xfc => "\xf8\xfc", 0xfd => "\xf8\xfd", 0xfe => "\xf8\xfe", + ); + + + + /**** Public Interface ****/ + + + /* Object Lifecycle */ + + /** + * Object constructor + */ + public function __construct() + { + parent::__construct(); + + + /* Object properties */ + + /* The font names are stored internally as Unicode UTF-16BE-encoded + * strings. Since this information is static, save unnecessary trips + * through iconv() and just use pre-encoded hexidecimal strings. + */ + $this->_fontNames[Zend_Pdf_Font::NAME_COPYRIGHT]['en'] = + "\x00\x43\x00\x6f\x00\x70\x00\x79\x00\x72\x00\x69\x00\x67\x00\x68\x00" + . "\x74\x00\x20\x00\x28\x00\x63\x00\x29\x00\x20\x00\x31\x00\x39\x00" + . "\x38\x00\x35\x00\x2c\x00\x20\x00\x31\x00\x39\x00\x38\x00\x37\x00" + . "\x2c\x00\x20\x00\x31\x00\x39\x00\x38\x00\x39\x00\x2c\x00\x20\x00" + . "\x31\x00\x39\x00\x39\x00\x30\x00\x2c\x00\x20\x00\x31\x00\x39\x00" + . "\x39\x00\x37\x00\x20\x00\x41\x00\x64\x00\x6f\x00\x62\x00\x65\x00" + . "\x20\x00\x53\x00\x79\x00\x73\x00\x74\x00\x65\x00\x6d\x00\x73\x00" + . "\x20\x00\x49\x00\x6e\x00\x63\x00\x6f\x00\x72\x00\x70\x00\x6f\x00" + . "\x72\x00\x61\x00\x74\x00\x65\x00\x64\x00\x2e\x00\x20\x00\x41\x00" + . "\x6c\x00\x6c\x00\x20\x00\x72\x00\x69\x00\x67\x00\x68\x00\x74\x00" + . "\x73\x00\x20\x00\x72\x00\x65\x00\x73\x00\x65\x00\x72\x00\x76\x00" + . "\x65\x00\x64\x00\x2e"; + $this->_fontNames[Zend_Pdf_Font::NAME_FAMILY]['en'] = + "\x00\x53\x00\x79\x00\x6d\x00\x62\x00\x6f\x00\x6c"; + $this->_fontNames[Zend_Pdf_Font::NAME_STYLE]['en'] = + "\x00\x4d\x00\x65\x00\x64\x00\x69\x00\x75\x00\x6d"; + $this->_fontNames[Zend_Pdf_Font::NAME_ID]['en'] = + "\x00\x34\x00\x33\x00\x30\x00\x36\x00\x34"; + $this->_fontNames[Zend_Pdf_Font::NAME_FULL]['en'] = + "\x00\x53\x00\x79\x00\x6d\x00\x62\x00\x6f\x00\x6c\x00\x20\x00\x4d\x00" + . "\x65\x00\x64\x00\x69\x00\x75\x00\x6d"; + $this->_fontNames[Zend_Pdf_Font::NAME_VERSION]['en'] = + "\x00\x30\x00\x30\x00\x31\x00\x2e\x00\x30\x00\x30\x00\x38"; + $this->_fontNames[Zend_Pdf_Font::NAME_POSTSCRIPT]['en'] = + "\x00\x53\x00\x79\x00\x6d\x00\x62\x00\x6f\x00\x6c"; + + $this->_isBold = false; + $this->_isItalic = false; + $this->_isMonospaced = false; + + $this->_underlinePosition = -100; + $this->_underlineThickness = 50; + $this->_strikePosition = 225; + $this->_strikeThickness = 50; + + $this->_unitsPerEm = 1000; + + $this->_ascent = 1000; + $this->_descent = 0; + $this->_lineGap = 200; + + /* The glyph numbers assigned here are synthetic; they do not match the + * actual glyph numbers used by the font. This is not a big deal though + * since this data never makes it to the PDF file. It is only used + * internally for layout calculations. + */ + $this->_glyphWidths = array( + 0x00 => 0x01f4, 0x01 => 0xfa, 0x02 => 0x014d, 0x03 => 0x02c9, + 0x04 => 0x01f4, 0x05 => 0x0225, 0x06 => 0x0341, 0x07 => 0x030a, + 0x08 => 0x01b7, 0x09 => 0x014d, 0x0a => 0x014d, 0x0b => 0x01f4, + 0x0c => 0x0225, 0x0d => 0xfa, 0x0e => 0x0225, 0x0f => 0xfa, + 0x10 => 0x0116, 0x11 => 0x01f4, 0x12 => 0x01f4, 0x13 => 0x01f4, + 0x14 => 0x01f4, 0x15 => 0x01f4, 0x16 => 0x01f4, 0x17 => 0x01f4, + 0x18 => 0x01f4, 0x19 => 0x01f4, 0x1a => 0x01f4, 0x1b => 0x0116, + 0x1c => 0x0116, 0x1d => 0x0225, 0x1e => 0x0225, 0x1f => 0x0225, + 0x20 => 0x01bc, 0x21 => 0x0225, 0x22 => 0x02d2, 0x23 => 0x029b, + 0x24 => 0x02d2, 0x25 => 0x0264, 0x26 => 0x0263, 0x27 => 0x02fb, + 0x28 => 0x025b, 0x29 => 0x02d2, 0x2a => 0x014d, 0x2b => 0x0277, + 0x2c => 0x02d2, 0x2d => 0x02ae, 0x2e => 0x0379, 0x2f => 0x02d2, + 0x30 => 0x02d2, 0x31 => 0x0300, 0x32 => 0x02e5, 0x33 => 0x022c, + 0x34 => 0x0250, 0x35 => 0x0263, 0x36 => 0x02b2, 0x37 => 0x01b7, + 0x38 => 0x0300, 0x39 => 0x0285, 0x3a => 0x031b, 0x3b => 0x0263, + 0x3c => 0x014d, 0x3d => 0x035f, 0x3e => 0x014d, 0x3f => 0x0292, + 0x40 => 0x01f4, 0x41 => 0x01f4, 0x42 => 0x0277, 0x43 => 0x0225, + 0x44 => 0x0225, 0x45 => 0x01ee, 0x46 => 0x01b7, 0x47 => 0x0209, + 0x48 => 0x019b, 0x49 => 0x025b, 0x4a => 0x0149, 0x4b => 0x025b, + 0x4c => 0x0225, 0x4d => 0x0225, 0x4e => 0x0240, 0x4f => 0x0209, + 0x50 => 0x0225, 0x51 => 0x0225, 0x52 => 0x0209, 0x53 => 0x0225, + 0x54 => 0x025b, 0x55 => 0x01b7, 0x56 => 0x0240, 0x57 => 0x02c9, + 0x58 => 0x02ae, 0x59 => 0x01ed, 0x5a => 0x02ae, 0x5b => 0x01ee, + 0x5c => 0x01e0, 0x5d => 0xc8, 0x5e => 0x01e0, 0x5f => 0x0225, + 0x60 => 0x02ee, 0x61 => 0x026c, 0x62 => 0xf7, 0x63 => 0x0225, + 0x64 => 0xa7, 0x65 => 0x02c9, 0x66 => 0x01f4, 0x67 => 0x02f1, + 0x68 => 0x02f1, 0x69 => 0x02f1, 0x6a => 0x02f1, 0x6b => 0x0412, + 0x6c => 0x03db, 0x6d => 0x025b, 0x6e => 0x03db, 0x6f => 0x025b, + 0x70 => 0x0190, 0x71 => 0x0225, 0x72 => 0x019b, 0x73 => 0x0225, + 0x74 => 0x0225, 0x75 => 0x02c9, 0x76 => 0x01ee, 0x77 => 0x01cc, + 0x78 => 0x0225, 0x79 => 0x0225, 0x7a => 0x0225, 0x7b => 0x0225, + 0x7c => 0x03e8, 0x7d => 0x025b, 0x7e => 0x03e8, 0x7f => 0x0292, + 0x80 => 0x0337, 0x81 => 0x02ae, 0x82 => 0x031b, 0x83 => 0x03db, + 0x84 => 0x0300, 0x85 => 0x0300, 0x86 => 0x0337, 0x87 => 0x0300, + 0x88 => 0x0300, 0x89 => 0x02c9, 0x8a => 0x02c9, 0x8b => 0x02c9, + 0x8c => 0x02c9, 0x8d => 0x02c9, 0x8e => 0x02c9, 0x8f => 0x02c9, + 0x90 => 0x0300, 0x91 => 0x02c9, 0x92 => 0x0316, 0x93 => 0x0316, + 0x94 => 0x037a, 0x95 => 0x0337, 0x96 => 0x0225, 0x97 => 0xfa, + 0x98 => 0x02c9, 0x99 => 0x025b, 0x9a => 0x025b, 0x9b => 0x0412, + 0x9c => 0x03db, 0x9d => 0x025b, 0x9e => 0x03db, 0x9f => 0x025b, + 0xa0 => 0x01ee, 0xa1 => 0x0149, 0xa2 => 0x0316, 0xa3 => 0x0316, + 0xa4 => 0x0312, 0xa5 => 0x02c9, 0xa6 => 0x0180, 0xa7 => 0x0180, + 0xa8 => 0x0180, 0xa9 => 0x0180, 0xaa => 0x0180, 0xab => 0x0180, + 0xac => 0x01ee, 0xad => 0x01ee, 0xae => 0x01ee, 0xaf => 0x01ee, + 0xb0 => 0x0149, 0xb1 => 0x0112, 0xb2 => 0x02ae, 0xb3 => 0x02ae, + 0xb4 => 0x02ae, 0xb5 => 0x0180, 0xb6 => 0x0180, 0xb7 => 0x0180, + 0xb8 => 0x0180, 0xb9 => 0x0180, 0xba => 0x0180, 0xbb => 0x01ee, + 0xbc => 0x01ee, 0xbd => 0x01ee, 0xbe => 0x0316); + + /* The cmap table is similarly synthesized. + */ + $cmapData = array( + 0x20 => 0x01, 0x21 => 0x02, 0x2200 => 0x03, 0x23 => 0x04, + 0x2203 => 0x05, 0x25 => 0x06, 0x26 => 0x07, 0x220b => 0x08, + 0x28 => 0x09, 0x29 => 0x0a, 0x2217 => 0x0b, 0x2b => 0x0c, + 0x2c => 0x0d, 0x2212 => 0x0e, 0x2e => 0x0f, 0x2f => 0x10, + 0x30 => 0x11, 0x31 => 0x12, 0x32 => 0x13, 0x33 => 0x14, + 0x34 => 0x15, 0x35 => 0x16, 0x36 => 0x17, 0x37 => 0x18, + 0x38 => 0x19, 0x39 => 0x1a, 0x3a => 0x1b, 0x3b => 0x1c, + 0x3c => 0x1d, 0x3d => 0x1e, 0x3e => 0x1f, 0x3f => 0x20, + 0x2245 => 0x21, 0x0391 => 0x22, 0x0392 => 0x23, 0x03a7 => 0x24, + 0x2206 => 0x25, 0x0395 => 0x26, 0x03a6 => 0x27, 0x0393 => 0x28, + 0x0397 => 0x29, 0x0399 => 0x2a, 0x03d1 => 0x2b, 0x039a => 0x2c, + 0x039b => 0x2d, 0x039c => 0x2e, 0x039d => 0x2f, 0x039f => 0x30, + 0x03a0 => 0x31, 0x0398 => 0x32, 0x03a1 => 0x33, 0x03a3 => 0x34, + 0x03a4 => 0x35, 0x03a5 => 0x36, 0x03c2 => 0x37, 0x2126 => 0x38, + 0x039e => 0x39, 0x03a8 => 0x3a, 0x0396 => 0x3b, 0x5b => 0x3c, + 0x2234 => 0x3d, 0x5d => 0x3e, 0x22a5 => 0x3f, 0x5f => 0x40, + 0xf8e5 => 0x41, 0x03b1 => 0x42, 0x03b2 => 0x43, 0x03c7 => 0x44, + 0x03b4 => 0x45, 0x03b5 => 0x46, 0x03c6 => 0x47, 0x03b3 => 0x48, + 0x03b7 => 0x49, 0x03b9 => 0x4a, 0x03d5 => 0x4b, 0x03ba => 0x4c, + 0x03bb => 0x4d, 0xb5 => 0x4e, 0x03bd => 0x4f, 0x03bf => 0x50, + 0x03c0 => 0x51, 0x03b8 => 0x52, 0x03c1 => 0x53, 0x03c3 => 0x54, + 0x03c4 => 0x55, 0x03c5 => 0x56, 0x03d6 => 0x57, 0x03c9 => 0x58, + 0x03be => 0x59, 0x03c8 => 0x5a, 0x03b6 => 0x5b, 0x7b => 0x5c, + 0x7c => 0x5d, 0x7d => 0x5e, 0x223c => 0x5f, 0x20ac => 0x60, + 0x03d2 => 0x61, 0x2032 => 0x62, 0x2264 => 0x63, 0x2044 => 0x64, + 0x221e => 0x65, 0x0192 => 0x66, 0x2663 => 0x67, 0x2666 => 0x68, + 0x2665 => 0x69, 0x2660 => 0x6a, 0x2194 => 0x6b, 0x2190 => 0x6c, + 0x2191 => 0x6d, 0x2192 => 0x6e, 0x2193 => 0x6f, 0xb0 => 0x70, + 0xb1 => 0x71, 0x2033 => 0x72, 0x2265 => 0x73, 0xd7 => 0x74, + 0x221d => 0x75, 0x2202 => 0x76, 0x2022 => 0x77, 0xf7 => 0x78, + 0x2260 => 0x79, 0x2261 => 0x7a, 0x2248 => 0x7b, 0x2026 => 0x7c, + 0xf8e6 => 0x7d, 0xf8e7 => 0x7e, 0x21b5 => 0x7f, 0x2135 => 0x80, + 0x2111 => 0x81, 0x211c => 0x82, 0x2118 => 0x83, 0x2297 => 0x84, + 0x2295 => 0x85, 0x2205 => 0x86, 0x2229 => 0x87, 0x222a => 0x88, + 0x2283 => 0x89, 0x2287 => 0x8a, 0x2284 => 0x8b, 0x2282 => 0x8c, + 0x2286 => 0x8d, 0x2208 => 0x8e, 0x2209 => 0x8f, 0x2220 => 0x90, + 0x2207 => 0x91, 0xf6da => 0x92, 0xf6d9 => 0x93, 0xf6db => 0x94, + 0x220f => 0x95, 0x221a => 0x96, 0x22c5 => 0x97, 0xac => 0x98, + 0x2227 => 0x99, 0x2228 => 0x9a, 0x21d4 => 0x9b, 0x21d0 => 0x9c, + 0x21d1 => 0x9d, 0x21d2 => 0x9e, 0x21d3 => 0x9f, 0x25ca => 0xa0, + 0x2329 => 0xa1, 0xf8e8 => 0xa2, 0xf8e9 => 0xa3, 0xf8ea => 0xa4, + 0x2211 => 0xa5, 0xf8eb => 0xa6, 0xf8ec => 0xa7, 0xf8ed => 0xa8, + 0xf8ee => 0xa9, 0xf8ef => 0xaa, 0xf8f0 => 0xab, 0xf8f1 => 0xac, + 0xf8f2 => 0xad, 0xf8f3 => 0xae, 0xf8f4 => 0xaf, 0x232a => 0xb0, + 0x222b => 0xb1, 0x2320 => 0xb2, 0xf8f5 => 0xb3, 0x2321 => 0xb4, + 0xf8f6 => 0xb5, 0xf8f7 => 0xb6, 0xf8f8 => 0xb7, 0xf8f9 => 0xb8, + 0xf8fa => 0xb9, 0xf8fb => 0xba, 0xf8fc => 0xbb, 0xf8fd => 0xbc, + 0xf8fe => 0xbd, 0xf8ff => 0xbe); + $this->_cmap = Zend_Pdf_Cmap::cmapWithTypeData( + Zend_Pdf_Cmap::TYPE_BYTE_ENCODING_STATIC, $cmapData); + + + /* Resource dictionary */ + + /* The resource dictionary for the standard fonts is sparse because PDF + * viewers already have all of the metrics data. We only need to provide + * the font name and encoding method. + */ + $this->_resource->BaseFont = new Zend_Pdf_Element_Name('Symbol'); + + /* This font has a built-in custom character encoding method. Don't + * override with WinAnsi like the other built-in fonts or else it will + * not work as expected. + */ + $this->_resource->Encoding = null; + } + + + /* Information and Conversion Methods */ + + /** + * Convert string encoding from local encoding to font encoding. Overridden + * to defeat the conversion behavior for this ornamental font. + * + * @param string $string + * @param string $charEncoding Character encoding of source text. + * @return string + */ + public function encodeString($string, $charEncoding) + { + /* This isn't the optimal time to perform this conversion, but it must + * live here until the remainder of the layout code is completed. This, + * and the $charEncoding parameter, will go away soon... + */ + if ($charEncoding != 'UTF-16BE') { + $string = iconv($charEncoding, 'UTF-16BE', $string); + } + /** + * @todo Properly handle characters encoded as surrogate pairs. + */ + $encodedString = ''; + for ($i = 0; $i < strlen($string); $i++) { + $characterCode = (ord($string[$i++]) << 8) | ord($string[$i]); + if (isset($this->_toFontEncoding[$characterCode])) { + $encodedString .= $this->_toFontEncoding[$characterCode]; + } else { + /* For now, mimic the behavior in Zend_Pdf_Font::encodeString() + * where unknown characters are removed completely. This is not + * perfect, but we should be consistent. In a future revision, + * we will use the well-known substitution character 0x1a + * (Control-Z). + */ + } + } + return $encodedString; + } + + /** + * Convert string encoding from font encoding to local encoding. Overridden + * to defeat the conversion behavior for this ornamental font. + * + * @param string $string + * @param string $charEncoding Character encoding of resulting text. + * @return string + */ + public function decodeString($string, $charEncoding) + { + $decodedString = ''; + for ($i = 0; $i < strlen($string); $i++) { + $characterCode = ord($string[$i]); + if (isset($this->_fromFontEncoding[$characterCode])) { + $decodedString .= $this->_fromFontEncoding[$characterCode]; + } else { + /* For now, mimic the behavior in Zend_Pdf_Font::encodeString() + * where unknown characters are removed completely. This is not + * perfect, but we should be consistent. In a future revision, + * we will use the Unicode substitution character (U+FFFD). + */ + } + } + if ($charEncoding != 'UTF-16BE') { + $decodedString = iconv('UTF-16BE', $charEncoding, $decodedString); + } + return $decodedString; + } + + /** + * Converts a Latin-encoded string that fakes the font's internal encoding + * to the proper Unicode characters, in UTF-16BE encoding. + * + * Used to maintain backwards compatibility with the 20 year-old legacy + * method of using this font, which is still employed by recent versions of + * some popular word processors. + * + * Note that using this method adds overhead due to the additional + * character conversion. Don't use this for new code; it is more efficient + * to use the appropriate Unicode characters directly. + * + * @param string $string + * @param string $charEncoding (optional) Character encoding of source + * string. Defaults to current locale. + * @return string + */ + public function toUnicode($string, $charEncoding = '') + { + /* When using these faked strings, the closest match to the font's + * internal encoding is ISO-8859-1. + */ + if ($charEncoding != 'ISO-8859-1') { + $string = iconv($charEncoding, 'ISO-8859-1', $string); + } + 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 new file mode 100644 index 0000000..550b481 --- /dev/null +++ b/libs/Zend/Pdf/Resource/Font/Simple/Standard/TimesBold.php @@ -0,0 +1,298 @@ +_fontNames[Zend_Pdf_Font::NAME_COPYRIGHT]['en'] = + "\x00\x43\x00\x6f\x00\x70\x00\x79\x00\x72\x00\x69\x00\x67\x00\x68\x00" + . "\x74\x00\x20\x00\x28\x00\x63\x00\x29\x00\x20\x00\x31\x00\x39\x00" + . "\x38\x00\x35\x00\x2c\x00\x20\x00\x31\x00\x39\x00\x38\x00\x37\x00" + . "\x2c\x00\x20\x00\x31\x00\x39\x00\x38\x00\x39\x00\x2c\x00\x20\x00" + . "\x31\x00\x39\x00\x39\x00\x30\x00\x2c\x00\x20\x00\x31\x00\x39\x00" + . "\x39\x00\x33\x00\x2c\x00\x20\x00\x31\x00\x39\x00\x39\x00\x37\x00" + . "\x20\x00\x41\x00\x64\x00\x6f\x00\x62\x00\x65\x00\x20\x00\x53\x00" + . "\x79\x00\x73\x00\x74\x00\x65\x00\x6d\x00\x73\x00\x20\x00\x49\x00" + . "\x6e\x00\x63\x00\x6f\x00\x72\x00\x70\x00\x6f\x00\x72\x00\x61\x00" + . "\x74\x00\x65\x00\x64\x00\x2e\x00\x20\x00\x20\x00\x41\x00\x6c\x00" + . "\x6c\x00\x20\x00\x52\x00\x69\x00\x67\x00\x68\x00\x74\x00\x73\x00" + . "\x20\x00\x52\x00\x65\x00\x73\x00\x65\x00\x72\x00\x76\x00\x65\x00" + . "\x64\x00\x2e\x00\x54\x00\x69\x00\x6d\x00\x65\x00\x73\x00\x20\x00" + . "\x69\x00\x73\x00\x20\x00\x61\x00\x20\x00\x74\x00\x72\x00\x61\x00" + . "\x64\x00\x65\x00\x6d\x00\x61\x00\x72\x00\x6b\x00\x20\x00\x6f\x00" + . "\x66\x00\x20\x00\x4c\x00\x69\x00\x6e\x00\x6f\x00\x74\x00\x79\x00" + . "\x70\x00\x65\x00\x2d\x00\x48\x00\x65\x00\x6c\x00\x6c\x00\x20\x00" + . "\x41\x00\x47\x00\x20\x00\x61\x00\x6e\x00\x64\x00\x2f\x00\x6f\x00" + . "\x72\x00\x20\x00\x69\x00\x74\x00\x73\x00\x20\x00\x73\x00\x75\x00" + . "\x62\x00\x73\x00\x69\x00\x64\x00\x69\x00\x61\x00\x72\x00\x69\x00" + . "\x65\x00\x73\x00\x2e"; + $this->_fontNames[Zend_Pdf_Font::NAME_FAMILY]['en'] = + "\x00\x54\x00\x69\x00\x6d\x00\x65\x00\x73"; + $this->_fontNames[Zend_Pdf_Font::NAME_STYLE]['en'] = + "\x00\x42\x00\x6f\x00\x6c\x00\x64"; + $this->_fontNames[Zend_Pdf_Font::NAME_ID]['en'] = + "\x00\x34\x00\x33\x00\x30\x00\x36\x00\x35"; + $this->_fontNames[Zend_Pdf_Font::NAME_FULL]['en'] = + "\x00\x54\x00\x69\x00\x6d\x00\x65\x00\x73\x00\x2d\x00\x42\x00\x6f\x00" + . "\x6c\x00\x64\x00\x20\x00\x42\x00\x6f\x00\x6c\x00\x64"; + $this->_fontNames[Zend_Pdf_Font::NAME_VERSION]['en'] = + "\x00\x30\x00\x30\x00\x32\x00\x2e\x00\x30\x00\x30\x00\x30"; + $this->_fontNames[Zend_Pdf_Font::NAME_POSTSCRIPT]['en'] = + "\x00\x54\x00\x69\x00\x6d\x00\x65\x00\x73\x00\x2d\x00\x42\x00\x6f\x00" + . "\x6c\x00\x64"; + + $this->_isBold = true; + $this->_isItalic = false; + $this->_isMonospaced = false; + + $this->_underlinePosition = -100; + $this->_underlineThickness = 50; + $this->_strikePosition = 225; + $this->_strikeThickness = 50; + + $this->_unitsPerEm = 1000; + + $this->_ascent = 683; + $this->_descent = -217; + $this->_lineGap = 300; + + /* The glyph numbers assigned here are synthetic; they do not match the + * actual glyph numbers used by the font. This is not a big deal though + * since this data never makes it to the PDF file. It is only used + * internally for layout calculations. + */ + $this->_glyphWidths = array( + 0x00 => 0x01f4, 0x01 => 0xfa, 0x02 => 0x014d, 0x03 => 0x022b, + 0x04 => 0x01f4, 0x05 => 0x01f4, 0x06 => 0x03e8, 0x07 => 0x0341, + 0x08 => 0x014d, 0x09 => 0x014d, 0x0a => 0x014d, 0x0b => 0x01f4, + 0x0c => 0x023a, 0x0d => 0xfa, 0x0e => 0x014d, 0x0f => 0xfa, + 0x10 => 0x0116, 0x11 => 0x01f4, 0x12 => 0x01f4, 0x13 => 0x01f4, + 0x14 => 0x01f4, 0x15 => 0x01f4, 0x16 => 0x01f4, 0x17 => 0x01f4, + 0x18 => 0x01f4, 0x19 => 0x01f4, 0x1a => 0x01f4, 0x1b => 0x014d, + 0x1c => 0x014d, 0x1d => 0x023a, 0x1e => 0x023a, 0x1f => 0x023a, + 0x20 => 0x01f4, 0x21 => 0x03a2, 0x22 => 0x02d2, 0x23 => 0x029b, + 0x24 => 0x02d2, 0x25 => 0x02d2, 0x26 => 0x029b, 0x27 => 0x0263, + 0x28 => 0x030a, 0x29 => 0x030a, 0x2a => 0x0185, 0x2b => 0x01f4, + 0x2c => 0x030a, 0x2d => 0x029b, 0x2e => 0x03b0, 0x2f => 0x02d2, + 0x30 => 0x030a, 0x31 => 0x0263, 0x32 => 0x030a, 0x33 => 0x02d2, + 0x34 => 0x022c, 0x35 => 0x029b, 0x36 => 0x02d2, 0x37 => 0x02d2, + 0x38 => 0x03e8, 0x39 => 0x02d2, 0x3a => 0x02d2, 0x3b => 0x029b, + 0x3c => 0x014d, 0x3d => 0x0116, 0x3e => 0x014d, 0x3f => 0x0245, + 0x40 => 0x01f4, 0x41 => 0x014d, 0x42 => 0x01f4, 0x43 => 0x022c, + 0x44 => 0x01bc, 0x45 => 0x022c, 0x46 => 0x01bc, 0x47 => 0x014d, + 0x48 => 0x01f4, 0x49 => 0x022c, 0x4a => 0x0116, 0x4b => 0x014d, + 0x4c => 0x022c, 0x4d => 0x0116, 0x4e => 0x0341, 0x4f => 0x022c, + 0x50 => 0x01f4, 0x51 => 0x022c, 0x52 => 0x022c, 0x53 => 0x01bc, + 0x54 => 0x0185, 0x55 => 0x014d, 0x56 => 0x022c, 0x57 => 0x01f4, + 0x58 => 0x02d2, 0x59 => 0x01f4, 0x5a => 0x01f4, 0x5b => 0x01bc, + 0x5c => 0x018a, 0x5d => 0xdc, 0x5e => 0x018a, 0x5f => 0x0208, + 0x60 => 0x014d, 0x61 => 0x01f4, 0x62 => 0x01f4, 0x63 => 0xa7, + 0x64 => 0x01f4, 0x65 => 0x01f4, 0x66 => 0x01f4, 0x67 => 0x01f4, + 0x68 => 0x0116, 0x69 => 0x01f4, 0x6a => 0x01f4, 0x6b => 0x014d, + 0x6c => 0x014d, 0x6d => 0x022c, 0x6e => 0x022c, 0x6f => 0x01f4, + 0x70 => 0x01f4, 0x71 => 0x01f4, 0x72 => 0xfa, 0x73 => 0x021c, + 0x74 => 0x015e, 0x75 => 0x014d, 0x76 => 0x01f4, 0x77 => 0x01f4, + 0x78 => 0x01f4, 0x79 => 0x03e8, 0x7a => 0x03e8, 0x7b => 0x01f4, + 0x7c => 0x014d, 0x7d => 0x014d, 0x7e => 0x014d, 0x7f => 0x014d, + 0x80 => 0x014d, 0x81 => 0x014d, 0x82 => 0x014d, 0x83 => 0x014d, + 0x84 => 0x014d, 0x85 => 0x014d, 0x86 => 0x014d, 0x87 => 0x014d, + 0x88 => 0x014d, 0x89 => 0x03e8, 0x8a => 0x03e8, 0x8b => 0x012c, + 0x8c => 0x029b, 0x8d => 0x030a, 0x8e => 0x03e8, 0x8f => 0x014a, + 0x90 => 0x02d2, 0x91 => 0x0116, 0x92 => 0x0116, 0x93 => 0x01f4, + 0x94 => 0x02d2, 0x95 => 0x022c, 0x96 => 0x0185, 0x97 => 0x01bc, + 0x98 => 0x01f4, 0x99 => 0x022c, 0x9a => 0x01bc, 0x9b => 0x02d2, + 0x9c => 0x023a, 0x9d => 0x02d2, 0x9e => 0x02d2, 0x9f => 0x01f4, + 0xa0 => 0x02d2, 0xa1 => 0x01f4, 0xa2 => 0x0185, 0xa3 => 0x01bc, + 0xa4 => 0x02d2, 0xa5 => 0x02d2, 0xa6 => 0x01f4, 0xa7 => 0x02d2, + 0xa8 => 0x022c, 0xa9 => 0x029b, 0xaa => 0x02d2, 0xab => 0xfa, + 0xac => 0x02eb, 0xad => 0x029b, 0xae => 0x01bc, 0xaf => 0x01f4, + 0xb0 => 0x02d2, 0xb1 => 0x0116, 0xb2 => 0x01f4, 0xb3 => 0x029b, + 0xb4 => 0x02d2, 0xb5 => 0x01f4, 0xb6 => 0x029b, 0xb7 => 0x0185, + 0xb8 => 0x0185, 0xb9 => 0x0116, 0xba => 0x01ee, 0xbb => 0x02d2, + 0xbc => 0x030a, 0xbd => 0x022c, 0xbe => 0x01f4, 0xbf => 0x02d2, + 0xc0 => 0x01bc, 0xc1 => 0x01bc, 0xc2 => 0x029b, 0xc3 => 0x0263, + 0xc4 => 0x030a, 0xc5 => 0x02d2, 0xc6 => 0x022c, 0xc7 => 0x02a0, + 0xc8 => 0x02d2, 0xc9 => 0x022c, 0xca => 0x012c, 0xcb => 0x030a, + 0xcc => 0x02d2, 0xcd => 0x02d2, 0xce => 0x023a, 0xcf => 0x022c, + 0xd0 => 0x029b, 0xd1 => 0x01ee, 0xd2 => 0x01f4, 0xd3 => 0x02d2, + 0xd4 => 0x0116, 0xd5 => 0x029b, 0xd6 => 0x01f4, 0xd7 => 0x01bc, + 0xd8 => 0x01bc, 0xd9 => 0x022c, 0xda => 0x022c, 0xdb => 0x02d2, + 0xdc => 0x0185, 0xdd => 0x023a, 0xde => 0xdc, 0xdf => 0x02eb, + 0xe0 => 0x030a, 0xe1 => 0x0185, 0xe2 => 0x0258, 0xe3 => 0x029b, + 0xe4 => 0x01bc, 0xe5 => 0x01f4, 0xe6 => 0x029b, 0xe7 => 0x029b, + 0xe8 => 0x0225, 0xe9 => 0x02d2, 0xea => 0x02d2, 0xeb => 0x0116, + 0xec => 0x01a0, 0xed => 0x01bc, 0xee => 0x02d2, 0xef => 0x02d2, + 0xf0 => 0x02d2, 0xf1 => 0x01bc, 0xf2 => 0x01bc, 0xf3 => 0x0116, + 0xf4 => 0x030a, 0xf5 => 0x01f4, 0xf6 => 0x01f4, 0xf7 => 0x0185, + 0xf8 => 0x0116, 0xf9 => 0x030a, 0xfa => 0x02d2, 0xfb => 0x0264, + 0xfc => 0x022c, 0xfd => 0x012c, 0xfe => 0x030a, 0xff => 0x022c, + 0x0100 => 0x0116, 0x0101 => 0x01f4, 0x0102 => 0x029b, 0x0103 => 0x022c, + 0x0104 => 0x02ee, 0x0105 => 0x022c, 0x0106 => 0x018a, 0x0107 => 0x030a, + 0x0108 => 0x029b, 0x0109 => 0x03e8, 0x010a => 0x01bc, 0x010b => 0x0185, + 0x010c => 0x0185, 0x010d => 0x029b, 0x010e => 0x02ee, 0x010f => 0x0225, + 0x0110 => 0x01f4, 0x0111 => 0x022c, 0x0112 => 0x02d2, 0x0113 => 0x029b, + 0x0114 => 0x01bc, 0x0115 => 0x01f4, 0x0116 => 0x02ee, 0x0117 => 0x022c, + 0x0118 => 0x022c, 0x0119 => 0x030a, 0x011a => 0x0190, 0x011b => 0x01f4, + 0x011c => 0x02d2, 0x011d => 0x022c, 0x011e => 0x0225, 0x011f => 0x02d2, + 0x0120 => 0x01bc, 0x0121 => 0x02d2, 0x0122 => 0x01f4, 0x0123 => 0x02d2, + 0x0124 => 0x029b, 0x0125 => 0x02d2, 0x0126 => 0x02d2, 0x0127 => 0x02d2, + 0x0128 => 0x030a, 0x0129 => 0x01bc, 0x012a => 0x029b, 0x012b => 0x0185, + 0x012c => 0x022c, 0x012d => 0x023a, 0x012e => 0x0185, 0x012f => 0x022c, + 0x0130 => 0x014d, 0x0131 => 0x023a, 0x0132 => 0x01f4, 0x0133 => 0x022c, + 0x0134 => 0x0225, 0x0135 => 0x01f4, 0x0136 => 0x01f4, 0x0137 => 0x01bc, + 0x0138 => 0x022c, 0x0139 => 0x012c, 0x013a => 0x0116, 0x013b => 0x01f4, + ); + + /* The cmap table is similarly synthesized. + */ + $cmapData = array( + 0x20 => 0x01, 0x21 => 0x02, 0x22 => 0x03, 0x23 => 0x04, + 0x24 => 0x05, 0x25 => 0x06, 0x26 => 0x07, 0x2019 => 0x08, + 0x28 => 0x09, 0x29 => 0x0a, 0x2a => 0x0b, 0x2b => 0x0c, + 0x2c => 0x0d, 0x2d => 0x0e, 0x2e => 0x0f, 0x2f => 0x10, + 0x30 => 0x11, 0x31 => 0x12, 0x32 => 0x13, 0x33 => 0x14, + 0x34 => 0x15, 0x35 => 0x16, 0x36 => 0x17, 0x37 => 0x18, + 0x38 => 0x19, 0x39 => 0x1a, 0x3a => 0x1b, 0x3b => 0x1c, + 0x3c => 0x1d, 0x3d => 0x1e, 0x3e => 0x1f, 0x3f => 0x20, + 0x40 => 0x21, 0x41 => 0x22, 0x42 => 0x23, 0x43 => 0x24, + 0x44 => 0x25, 0x45 => 0x26, 0x46 => 0x27, 0x47 => 0x28, + 0x48 => 0x29, 0x49 => 0x2a, 0x4a => 0x2b, 0x4b => 0x2c, + 0x4c => 0x2d, 0x4d => 0x2e, 0x4e => 0x2f, 0x4f => 0x30, + 0x50 => 0x31, 0x51 => 0x32, 0x52 => 0x33, 0x53 => 0x34, + 0x54 => 0x35, 0x55 => 0x36, 0x56 => 0x37, 0x57 => 0x38, + 0x58 => 0x39, 0x59 => 0x3a, 0x5a => 0x3b, 0x5b => 0x3c, + 0x5c => 0x3d, 0x5d => 0x3e, 0x5e => 0x3f, 0x5f => 0x40, + 0x2018 => 0x41, 0x61 => 0x42, 0x62 => 0x43, 0x63 => 0x44, + 0x64 => 0x45, 0x65 => 0x46, 0x66 => 0x47, 0x67 => 0x48, + 0x68 => 0x49, 0x69 => 0x4a, 0x6a => 0x4b, 0x6b => 0x4c, + 0x6c => 0x4d, 0x6d => 0x4e, 0x6e => 0x4f, 0x6f => 0x50, + 0x70 => 0x51, 0x71 => 0x52, 0x72 => 0x53, 0x73 => 0x54, + 0x74 => 0x55, 0x75 => 0x56, 0x76 => 0x57, 0x77 => 0x58, + 0x78 => 0x59, 0x79 => 0x5a, 0x7a => 0x5b, 0x7b => 0x5c, + 0x7c => 0x5d, 0x7d => 0x5e, 0x7e => 0x5f, 0xa1 => 0x60, + 0xa2 => 0x61, 0xa3 => 0x62, 0x2044 => 0x63, 0xa5 => 0x64, + 0x0192 => 0x65, 0xa7 => 0x66, 0xa4 => 0x67, 0x27 => 0x68, + 0x201c => 0x69, 0xab => 0x6a, 0x2039 => 0x6b, 0x203a => 0x6c, + 0xfb01 => 0x6d, 0xfb02 => 0x6e, 0x2013 => 0x6f, 0x2020 => 0x70, + 0x2021 => 0x71, 0xb7 => 0x72, 0xb6 => 0x73, 0x2022 => 0x74, + 0x201a => 0x75, 0x201e => 0x76, 0x201d => 0x77, 0xbb => 0x78, + 0x2026 => 0x79, 0x2030 => 0x7a, 0xbf => 0x7b, 0x60 => 0x7c, + 0xb4 => 0x7d, 0x02c6 => 0x7e, 0x02dc => 0x7f, 0xaf => 0x80, + 0x02d8 => 0x81, 0x02d9 => 0x82, 0xa8 => 0x83, 0x02da => 0x84, + 0xb8 => 0x85, 0x02dd => 0x86, 0x02db => 0x87, 0x02c7 => 0x88, + 0x2014 => 0x89, 0xc6 => 0x8a, 0xaa => 0x8b, 0x0141 => 0x8c, + 0xd8 => 0x8d, 0x0152 => 0x8e, 0xba => 0x8f, 0xe6 => 0x90, + 0x0131 => 0x91, 0x0142 => 0x92, 0xf8 => 0x93, 0x0153 => 0x94, + 0xdf => 0x95, 0xcf => 0x96, 0xe9 => 0x97, 0x0103 => 0x98, + 0x0171 => 0x99, 0x011b => 0x9a, 0x0178 => 0x9b, 0xf7 => 0x9c, + 0xdd => 0x9d, 0xc2 => 0x9e, 0xe1 => 0x9f, 0xdb => 0xa0, + 0xfd => 0xa1, 0x0219 => 0xa2, 0xea => 0xa3, 0x016e => 0xa4, + 0xdc => 0xa5, 0x0105 => 0xa6, 0xda => 0xa7, 0x0173 => 0xa8, + 0xcb => 0xa9, 0x0110 => 0xaa, 0xf6c3 => 0xab, 0xa9 => 0xac, + 0x0112 => 0xad, 0x010d => 0xae, 0xe5 => 0xaf, 0x0145 => 0xb0, + 0x013a => 0xb1, 0xe0 => 0xb2, 0x0162 => 0xb3, 0x0106 => 0xb4, + 0xe3 => 0xb5, 0x0116 => 0xb6, 0x0161 => 0xb7, 0x015f => 0xb8, + 0xed => 0xb9, 0x25ca => 0xba, 0x0158 => 0xbb, 0x0122 => 0xbc, + 0xfb => 0xbd, 0xe2 => 0xbe, 0x0100 => 0xbf, 0x0159 => 0xc0, + 0xe7 => 0xc1, 0x017b => 0xc2, 0xde => 0xc3, 0x014c => 0xc4, + 0x0154 => 0xc5, 0x015a => 0xc6, 0x010f => 0xc7, 0x016a => 0xc8, + 0x016f => 0xc9, 0xb3 => 0xca, 0xd2 => 0xcb, 0xc0 => 0xcc, + 0x0102 => 0xcd, 0xd7 => 0xce, 0xfa => 0xcf, 0x0164 => 0xd0, + 0x2202 => 0xd1, 0xff => 0xd2, 0x0143 => 0xd3, 0xee => 0xd4, + 0xca => 0xd5, 0xe4 => 0xd6, 0xeb => 0xd7, 0x0107 => 0xd8, + 0x0144 => 0xd9, 0x016b => 0xda, 0x0147 => 0xdb, 0xcd => 0xdc, + 0xb1 => 0xdd, 0xa6 => 0xde, 0xae => 0xdf, 0x011e => 0xe0, + 0x0130 => 0xe1, 0x2211 => 0xe2, 0xc8 => 0xe3, 0x0155 => 0xe4, + 0x014d => 0xe5, 0x0179 => 0xe6, 0x017d => 0xe7, 0x2265 => 0xe8, + 0xd0 => 0xe9, 0xc7 => 0xea, 0x013c => 0xeb, 0x0165 => 0xec, + 0x0119 => 0xed, 0x0172 => 0xee, 0xc1 => 0xef, 0xc4 => 0xf0, + 0xe8 => 0xf1, 0x017a => 0xf2, 0x012f => 0xf3, 0xd3 => 0xf4, + 0xf3 => 0xf5, 0x0101 => 0xf6, 0x015b => 0xf7, 0xef => 0xf8, + 0xd4 => 0xf9, 0xd9 => 0xfa, 0x2206 => 0xfb, 0xfe => 0xfc, + 0xb2 => 0xfd, 0xd6 => 0xfe, 0xb5 => 0xff, 0xec => 0x0100, + 0x0151 => 0x0101, 0x0118 => 0x0102, 0x0111 => 0x0103, 0xbe => 0x0104, + 0x015e => 0x0105, 0x013e => 0x0106, 0x0136 => 0x0107, 0x0139 => 0x0108, + 0x2122 => 0x0109, 0x0117 => 0x010a, 0xcc => 0x010b, 0x012a => 0x010c, + 0x013d => 0x010d, 0xbd => 0x010e, 0x2264 => 0x010f, 0xf4 => 0x0110, + 0xf1 => 0x0111, 0x0170 => 0x0112, 0xc9 => 0x0113, 0x0113 => 0x0114, + 0x011f => 0x0115, 0xbc => 0x0116, 0x0160 => 0x0117, 0x0218 => 0x0118, + 0x0150 => 0x0119, 0xb0 => 0x011a, 0xf2 => 0x011b, 0x010c => 0x011c, + 0xf9 => 0x011d, 0x221a => 0x011e, 0x010e => 0x011f, 0x0157 => 0x0120, + 0xd1 => 0x0121, 0xf5 => 0x0122, 0x0156 => 0x0123, 0x013b => 0x0124, + 0xc3 => 0x0125, 0x0104 => 0x0126, 0xc5 => 0x0127, 0xd5 => 0x0128, + 0x017c => 0x0129, 0x011a => 0x012a, 0x012e => 0x012b, 0x0137 => 0x012c, + 0x2212 => 0x012d, 0xce => 0x012e, 0x0148 => 0x012f, 0x0163 => 0x0130, + 0xac => 0x0131, 0xf6 => 0x0132, 0xfc => 0x0133, 0x2260 => 0x0134, + 0x0123 => 0x0135, 0xf0 => 0x0136, 0x017e => 0x0137, 0x0146 => 0x0138, + 0xb9 => 0x0139, 0x012b => 0x013a, 0x20ac => 0x013b); + $this->_cmap = Zend_Pdf_Cmap::cmapWithTypeData( + Zend_Pdf_Cmap::TYPE_BYTE_ENCODING_STATIC, $cmapData); + + + /* Resource dictionary */ + + /* The resource dictionary for the standard fonts is sparse because PDF + * viewers already have all of the metrics data. We only need to provide + * the font name and encoding method. + */ + $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 new file mode 100644 index 0000000..17b6bef --- /dev/null +++ b/libs/Zend/Pdf/Resource/Font/Simple/Standard/TimesBoldItalic.php @@ -0,0 +1,299 @@ +_fontNames[Zend_Pdf_Font::NAME_COPYRIGHT]['en'] = + "\x00\x43\x00\x6f\x00\x70\x00\x79\x00\x72\x00\x69\x00\x67\x00\x68\x00" + . "\x74\x00\x20\x00\x28\x00\x63\x00\x29\x00\x20\x00\x31\x00\x39\x00" + . "\x38\x00\x35\x00\x2c\x00\x20\x00\x31\x00\x39\x00\x38\x00\x37\x00" + . "\x2c\x00\x20\x00\x31\x00\x39\x00\x38\x00\x39\x00\x2c\x00\x20\x00" + . "\x31\x00\x39\x00\x39\x00\x30\x00\x2c\x00\x20\x00\x31\x00\x39\x00" + . "\x39\x00\x33\x00\x2c\x00\x20\x00\x31\x00\x39\x00\x39\x00\x37\x00" + . "\x20\x00\x41\x00\x64\x00\x6f\x00\x62\x00\x65\x00\x20\x00\x53\x00" + . "\x79\x00\x73\x00\x74\x00\x65\x00\x6d\x00\x73\x00\x20\x00\x49\x00" + . "\x6e\x00\x63\x00\x6f\x00\x72\x00\x70\x00\x6f\x00\x72\x00\x61\x00" + . "\x74\x00\x65\x00\x64\x00\x2e\x00\x20\x00\x20\x00\x41\x00\x6c\x00" + . "\x6c\x00\x20\x00\x52\x00\x69\x00\x67\x00\x68\x00\x74\x00\x73\x00" + . "\x20\x00\x52\x00\x65\x00\x73\x00\x65\x00\x72\x00\x76\x00\x65\x00" + . "\x64\x00\x2e\x00\x54\x00\x69\x00\x6d\x00\x65\x00\x73\x00\x20\x00" + . "\x69\x00\x73\x00\x20\x00\x61\x00\x20\x00\x74\x00\x72\x00\x61\x00" + . "\x64\x00\x65\x00\x6d\x00\x61\x00\x72\x00\x6b\x00\x20\x00\x6f\x00" + . "\x66\x00\x20\x00\x4c\x00\x69\x00\x6e\x00\x6f\x00\x74\x00\x79\x00" + . "\x70\x00\x65\x00\x2d\x00\x48\x00\x65\x00\x6c\x00\x6c\x00\x20\x00" + . "\x41\x00\x47\x00\x20\x00\x61\x00\x6e\x00\x64\x00\x2f\x00\x6f\x00" + . "\x72\x00\x20\x00\x69\x00\x74\x00\x73\x00\x20\x00\x73\x00\x75\x00" + . "\x62\x00\x73\x00\x69\x00\x64\x00\x69\x00\x61\x00\x72\x00\x69\x00" + . "\x65\x00\x73\x00\x2e"; + $this->_fontNames[Zend_Pdf_Font::NAME_FAMILY]['en'] = + "\x00\x54\x00\x69\x00\x6d\x00\x65\x00\x73"; + $this->_fontNames[Zend_Pdf_Font::NAME_STYLE]['en'] = + "\x00\x42\x00\x6f\x00\x6c\x00\x64"; + $this->_fontNames[Zend_Pdf_Font::NAME_ID]['en'] = + "\x00\x34\x00\x33\x00\x30\x00\x36\x00\x36"; + $this->_fontNames[Zend_Pdf_Font::NAME_FULL]['en'] = + "\x00\x54\x00\x69\x00\x6d\x00\x65\x00\x73\x00\x2d\x00\x42\x00\x6f\x00" + . "\x6c\x00\x64\x00\x49\x00\x74\x00\x61\x00\x6c\x00\x69\x00\x63\x00" + . "\x20\x00\x42\x00\x6f\x00\x6c\x00\x64"; + $this->_fontNames[Zend_Pdf_Font::NAME_VERSION]['en'] = + "\x00\x30\x00\x30\x00\x32\x00\x2e\x00\x30\x00\x30\x00\x30"; + $this->_fontNames[Zend_Pdf_Font::NAME_POSTSCRIPT]['en'] = + "\x00\x54\x00\x69\x00\x6d\x00\x65\x00\x73\x00\x2d\x00\x42\x00\x6f\x00" + . "\x6c\x00\x64\x00\x49\x00\x74\x00\x61\x00\x6c\x00\x69\x00\x63"; + + $this->_isBold = true; + $this->_isItalic = true; + $this->_isMonospaced = false; + + $this->_underlinePosition = -100; + $this->_underlineThickness = 50; + $this->_strikePosition = 225; + $this->_strikeThickness = 50; + + $this->_unitsPerEm = 1000; + + $this->_ascent = 683; + $this->_descent = -217; + $this->_lineGap = 300; + + /* The glyph numbers assigned here are synthetic; they do not match the + * actual glyph numbers used by the font. This is not a big deal though + * since this data never makes it to the PDF file. It is only used + * internally for layout calculations. + */ + $this->_glyphWidths = array( + 0x00 => 0x01f4, 0x01 => 0xfa, 0x02 => 0x0185, 0x03 => 0x022b, + 0x04 => 0x01f4, 0x05 => 0x01f4, 0x06 => 0x0341, 0x07 => 0x030a, + 0x08 => 0x014d, 0x09 => 0x014d, 0x0a => 0x014d, 0x0b => 0x01f4, + 0x0c => 0x023a, 0x0d => 0xfa, 0x0e => 0x014d, 0x0f => 0xfa, + 0x10 => 0x0116, 0x11 => 0x01f4, 0x12 => 0x01f4, 0x13 => 0x01f4, + 0x14 => 0x01f4, 0x15 => 0x01f4, 0x16 => 0x01f4, 0x17 => 0x01f4, + 0x18 => 0x01f4, 0x19 => 0x01f4, 0x1a => 0x01f4, 0x1b => 0x014d, + 0x1c => 0x014d, 0x1d => 0x023a, 0x1e => 0x023a, 0x1f => 0x023a, + 0x20 => 0x01f4, 0x21 => 0x0340, 0x22 => 0x029b, 0x23 => 0x029b, + 0x24 => 0x029b, 0x25 => 0x02d2, 0x26 => 0x029b, 0x27 => 0x029b, + 0x28 => 0x02d2, 0x29 => 0x030a, 0x2a => 0x0185, 0x2b => 0x01f4, + 0x2c => 0x029b, 0x2d => 0x0263, 0x2e => 0x0379, 0x2f => 0x02d2, + 0x30 => 0x02d2, 0x31 => 0x0263, 0x32 => 0x02d2, 0x33 => 0x029b, + 0x34 => 0x022c, 0x35 => 0x0263, 0x36 => 0x02d2, 0x37 => 0x029b, + 0x38 => 0x0379, 0x39 => 0x029b, 0x3a => 0x0263, 0x3b => 0x0263, + 0x3c => 0x014d, 0x3d => 0x0116, 0x3e => 0x014d, 0x3f => 0x023a, + 0x40 => 0x01f4, 0x41 => 0x014d, 0x42 => 0x01f4, 0x43 => 0x01f4, + 0x44 => 0x01bc, 0x45 => 0x01f4, 0x46 => 0x01bc, 0x47 => 0x014d, + 0x48 => 0x01f4, 0x49 => 0x022c, 0x4a => 0x0116, 0x4b => 0x0116, + 0x4c => 0x01f4, 0x4d => 0x0116, 0x4e => 0x030a, 0x4f => 0x022c, + 0x50 => 0x01f4, 0x51 => 0x01f4, 0x52 => 0x01f4, 0x53 => 0x0185, + 0x54 => 0x0185, 0x55 => 0x0116, 0x56 => 0x022c, 0x57 => 0x01bc, + 0x58 => 0x029b, 0x59 => 0x01f4, 0x5a => 0x01bc, 0x5b => 0x0185, + 0x5c => 0x015c, 0x5d => 0xdc, 0x5e => 0x015c, 0x5f => 0x023a, + 0x60 => 0x0185, 0x61 => 0x01f4, 0x62 => 0x01f4, 0x63 => 0xa7, + 0x64 => 0x01f4, 0x65 => 0x01f4, 0x66 => 0x01f4, 0x67 => 0x01f4, + 0x68 => 0x0116, 0x69 => 0x01f4, 0x6a => 0x01f4, 0x6b => 0x014d, + 0x6c => 0x014d, 0x6d => 0x022c, 0x6e => 0x022c, 0x6f => 0x01f4, + 0x70 => 0x01f4, 0x71 => 0x01f4, 0x72 => 0xfa, 0x73 => 0x01f4, + 0x74 => 0x015e, 0x75 => 0x014d, 0x76 => 0x01f4, 0x77 => 0x01f4, + 0x78 => 0x01f4, 0x79 => 0x03e8, 0x7a => 0x03e8, 0x7b => 0x01f4, + 0x7c => 0x014d, 0x7d => 0x014d, 0x7e => 0x014d, 0x7f => 0x014d, + 0x80 => 0x014d, 0x81 => 0x014d, 0x82 => 0x014d, 0x83 => 0x014d, + 0x84 => 0x014d, 0x85 => 0x014d, 0x86 => 0x014d, 0x87 => 0x014d, + 0x88 => 0x014d, 0x89 => 0x03e8, 0x8a => 0x03b0, 0x8b => 0x010a, + 0x8c => 0x0263, 0x8d => 0x02d2, 0x8e => 0x03b0, 0x8f => 0x012c, + 0x90 => 0x02d2, 0x91 => 0x0116, 0x92 => 0x0116, 0x93 => 0x01f4, + 0x94 => 0x02d2, 0x95 => 0x01f4, 0x96 => 0x0185, 0x97 => 0x01bc, + 0x98 => 0x01f4, 0x99 => 0x022c, 0x9a => 0x01bc, 0x9b => 0x0263, + 0x9c => 0x023a, 0x9d => 0x0263, 0x9e => 0x029b, 0x9f => 0x01f4, + 0xa0 => 0x02d2, 0xa1 => 0x01bc, 0xa2 => 0x0185, 0xa3 => 0x01bc, + 0xa4 => 0x02d2, 0xa5 => 0x02d2, 0xa6 => 0x01f4, 0xa7 => 0x02d2, + 0xa8 => 0x022c, 0xa9 => 0x029b, 0xaa => 0x02d2, 0xab => 0xfa, + 0xac => 0x02eb, 0xad => 0x029b, 0xae => 0x01bc, 0xaf => 0x01f4, + 0xb0 => 0x02d2, 0xb1 => 0x0116, 0xb2 => 0x01f4, 0xb3 => 0x0263, + 0xb4 => 0x029b, 0xb5 => 0x01f4, 0xb6 => 0x029b, 0xb7 => 0x0185, + 0xb8 => 0x0185, 0xb9 => 0x0116, 0xba => 0x01ee, 0xbb => 0x029b, + 0xbc => 0x02d2, 0xbd => 0x022c, 0xbe => 0x01f4, 0xbf => 0x029b, + 0xc0 => 0x0185, 0xc1 => 0x01bc, 0xc2 => 0x0263, 0xc3 => 0x0263, + 0xc4 => 0x02d2, 0xc5 => 0x029b, 0xc6 => 0x022c, 0xc7 => 0x0260, + 0xc8 => 0x02d2, 0xc9 => 0x022c, 0xca => 0x012c, 0xcb => 0x02d2, + 0xcc => 0x029b, 0xcd => 0x029b, 0xce => 0x023a, 0xcf => 0x022c, + 0xd0 => 0x0263, 0xd1 => 0x01ee, 0xd2 => 0x01bc, 0xd3 => 0x02d2, + 0xd4 => 0x0116, 0xd5 => 0x029b, 0xd6 => 0x01f4, 0xd7 => 0x01bc, + 0xd8 => 0x01bc, 0xd9 => 0x022c, 0xda => 0x022c, 0xdb => 0x02d2, + 0xdc => 0x0185, 0xdd => 0x023a, 0xde => 0xdc, 0xdf => 0x02eb, + 0xe0 => 0x02d2, 0xe1 => 0x0185, 0xe2 => 0x0258, 0xe3 => 0x029b, + 0xe4 => 0x0185, 0xe5 => 0x01f4, 0xe6 => 0x0263, 0xe7 => 0x0263, + 0xe8 => 0x0225, 0xe9 => 0x02d2, 0xea => 0x029b, 0xeb => 0x0116, + 0xec => 0x016e, 0xed => 0x01bc, 0xee => 0x02d2, 0xef => 0x029b, + 0xf0 => 0x029b, 0xf1 => 0x01bc, 0xf2 => 0x0185, 0xf3 => 0x0116, + 0xf4 => 0x02d2, 0xf5 => 0x01f4, 0xf6 => 0x01f4, 0xf7 => 0x0185, + 0xf8 => 0x0116, 0xf9 => 0x02d2, 0xfa => 0x02d2, 0xfb => 0x0264, + 0xfc => 0x01f4, 0xfd => 0x012c, 0xfe => 0x02d2, 0xff => 0x0240, + 0x0100 => 0x0116, 0x0101 => 0x01f4, 0x0102 => 0x029b, 0x0103 => 0x01f4, + 0x0104 => 0x02ee, 0x0105 => 0x022c, 0x0106 => 0x017e, 0x0107 => 0x029b, + 0x0108 => 0x0263, 0x0109 => 0x03e8, 0x010a => 0x01bc, 0x010b => 0x0185, + 0x010c => 0x0185, 0x010d => 0x0263, 0x010e => 0x02ee, 0x010f => 0x0225, + 0x0110 => 0x01f4, 0x0111 => 0x022c, 0x0112 => 0x02d2, 0x0113 => 0x029b, + 0x0114 => 0x01bc, 0x0115 => 0x01f4, 0x0116 => 0x02ee, 0x0117 => 0x022c, + 0x0118 => 0x022c, 0x0119 => 0x02d2, 0x011a => 0x0190, 0x011b => 0x01f4, + 0x011c => 0x029b, 0x011d => 0x022c, 0x011e => 0x0225, 0x011f => 0x02d2, + 0x0120 => 0x0185, 0x0121 => 0x02d2, 0x0122 => 0x01f4, 0x0123 => 0x029b, + 0x0124 => 0x0263, 0x0125 => 0x029b, 0x0126 => 0x029b, 0x0127 => 0x029b, + 0x0128 => 0x02d2, 0x0129 => 0x0185, 0x012a => 0x029b, 0x012b => 0x0185, + 0x012c => 0x01f4, 0x012d => 0x025e, 0x012e => 0x0185, 0x012f => 0x022c, + 0x0130 => 0x0116, 0x0131 => 0x025e, 0x0132 => 0x01f4, 0x0133 => 0x022c, + 0x0134 => 0x0225, 0x0135 => 0x01f4, 0x0136 => 0x01f4, 0x0137 => 0x0185, + 0x0138 => 0x022c, 0x0139 => 0x012c, 0x013a => 0x0116, 0x013b => 0x01f4, + ); + + /* The cmap table is similarly synthesized. + */ + $cmapData = array( + 0x20 => 0x01, 0x21 => 0x02, 0x22 => 0x03, 0x23 => 0x04, + 0x24 => 0x05, 0x25 => 0x06, 0x26 => 0x07, 0x2019 => 0x08, + 0x28 => 0x09, 0x29 => 0x0a, 0x2a => 0x0b, 0x2b => 0x0c, + 0x2c => 0x0d, 0x2d => 0x0e, 0x2e => 0x0f, 0x2f => 0x10, + 0x30 => 0x11, 0x31 => 0x12, 0x32 => 0x13, 0x33 => 0x14, + 0x34 => 0x15, 0x35 => 0x16, 0x36 => 0x17, 0x37 => 0x18, + 0x38 => 0x19, 0x39 => 0x1a, 0x3a => 0x1b, 0x3b => 0x1c, + 0x3c => 0x1d, 0x3d => 0x1e, 0x3e => 0x1f, 0x3f => 0x20, + 0x40 => 0x21, 0x41 => 0x22, 0x42 => 0x23, 0x43 => 0x24, + 0x44 => 0x25, 0x45 => 0x26, 0x46 => 0x27, 0x47 => 0x28, + 0x48 => 0x29, 0x49 => 0x2a, 0x4a => 0x2b, 0x4b => 0x2c, + 0x4c => 0x2d, 0x4d => 0x2e, 0x4e => 0x2f, 0x4f => 0x30, + 0x50 => 0x31, 0x51 => 0x32, 0x52 => 0x33, 0x53 => 0x34, + 0x54 => 0x35, 0x55 => 0x36, 0x56 => 0x37, 0x57 => 0x38, + 0x58 => 0x39, 0x59 => 0x3a, 0x5a => 0x3b, 0x5b => 0x3c, + 0x5c => 0x3d, 0x5d => 0x3e, 0x5e => 0x3f, 0x5f => 0x40, + 0x2018 => 0x41, 0x61 => 0x42, 0x62 => 0x43, 0x63 => 0x44, + 0x64 => 0x45, 0x65 => 0x46, 0x66 => 0x47, 0x67 => 0x48, + 0x68 => 0x49, 0x69 => 0x4a, 0x6a => 0x4b, 0x6b => 0x4c, + 0x6c => 0x4d, 0x6d => 0x4e, 0x6e => 0x4f, 0x6f => 0x50, + 0x70 => 0x51, 0x71 => 0x52, 0x72 => 0x53, 0x73 => 0x54, + 0x74 => 0x55, 0x75 => 0x56, 0x76 => 0x57, 0x77 => 0x58, + 0x78 => 0x59, 0x79 => 0x5a, 0x7a => 0x5b, 0x7b => 0x5c, + 0x7c => 0x5d, 0x7d => 0x5e, 0x7e => 0x5f, 0xa1 => 0x60, + 0xa2 => 0x61, 0xa3 => 0x62, 0x2044 => 0x63, 0xa5 => 0x64, + 0x0192 => 0x65, 0xa7 => 0x66, 0xa4 => 0x67, 0x27 => 0x68, + 0x201c => 0x69, 0xab => 0x6a, 0x2039 => 0x6b, 0x203a => 0x6c, + 0xfb01 => 0x6d, 0xfb02 => 0x6e, 0x2013 => 0x6f, 0x2020 => 0x70, + 0x2021 => 0x71, 0xb7 => 0x72, 0xb6 => 0x73, 0x2022 => 0x74, + 0x201a => 0x75, 0x201e => 0x76, 0x201d => 0x77, 0xbb => 0x78, + 0x2026 => 0x79, 0x2030 => 0x7a, 0xbf => 0x7b, 0x60 => 0x7c, + 0xb4 => 0x7d, 0x02c6 => 0x7e, 0x02dc => 0x7f, 0xaf => 0x80, + 0x02d8 => 0x81, 0x02d9 => 0x82, 0xa8 => 0x83, 0x02da => 0x84, + 0xb8 => 0x85, 0x02dd => 0x86, 0x02db => 0x87, 0x02c7 => 0x88, + 0x2014 => 0x89, 0xc6 => 0x8a, 0xaa => 0x8b, 0x0141 => 0x8c, + 0xd8 => 0x8d, 0x0152 => 0x8e, 0xba => 0x8f, 0xe6 => 0x90, + 0x0131 => 0x91, 0x0142 => 0x92, 0xf8 => 0x93, 0x0153 => 0x94, + 0xdf => 0x95, 0xcf => 0x96, 0xe9 => 0x97, 0x0103 => 0x98, + 0x0171 => 0x99, 0x011b => 0x9a, 0x0178 => 0x9b, 0xf7 => 0x9c, + 0xdd => 0x9d, 0xc2 => 0x9e, 0xe1 => 0x9f, 0xdb => 0xa0, + 0xfd => 0xa1, 0x0219 => 0xa2, 0xea => 0xa3, 0x016e => 0xa4, + 0xdc => 0xa5, 0x0105 => 0xa6, 0xda => 0xa7, 0x0173 => 0xa8, + 0xcb => 0xa9, 0x0110 => 0xaa, 0xf6c3 => 0xab, 0xa9 => 0xac, + 0x0112 => 0xad, 0x010d => 0xae, 0xe5 => 0xaf, 0x0145 => 0xb0, + 0x013a => 0xb1, 0xe0 => 0xb2, 0x0162 => 0xb3, 0x0106 => 0xb4, + 0xe3 => 0xb5, 0x0116 => 0xb6, 0x0161 => 0xb7, 0x015f => 0xb8, + 0xed => 0xb9, 0x25ca => 0xba, 0x0158 => 0xbb, 0x0122 => 0xbc, + 0xfb => 0xbd, 0xe2 => 0xbe, 0x0100 => 0xbf, 0x0159 => 0xc0, + 0xe7 => 0xc1, 0x017b => 0xc2, 0xde => 0xc3, 0x014c => 0xc4, + 0x0154 => 0xc5, 0x015a => 0xc6, 0x010f => 0xc7, 0x016a => 0xc8, + 0x016f => 0xc9, 0xb3 => 0xca, 0xd2 => 0xcb, 0xc0 => 0xcc, + 0x0102 => 0xcd, 0xd7 => 0xce, 0xfa => 0xcf, 0x0164 => 0xd0, + 0x2202 => 0xd1, 0xff => 0xd2, 0x0143 => 0xd3, 0xee => 0xd4, + 0xca => 0xd5, 0xe4 => 0xd6, 0xeb => 0xd7, 0x0107 => 0xd8, + 0x0144 => 0xd9, 0x016b => 0xda, 0x0147 => 0xdb, 0xcd => 0xdc, + 0xb1 => 0xdd, 0xa6 => 0xde, 0xae => 0xdf, 0x011e => 0xe0, + 0x0130 => 0xe1, 0x2211 => 0xe2, 0xc8 => 0xe3, 0x0155 => 0xe4, + 0x014d => 0xe5, 0x0179 => 0xe6, 0x017d => 0xe7, 0x2265 => 0xe8, + 0xd0 => 0xe9, 0xc7 => 0xea, 0x013c => 0xeb, 0x0165 => 0xec, + 0x0119 => 0xed, 0x0172 => 0xee, 0xc1 => 0xef, 0xc4 => 0xf0, + 0xe8 => 0xf1, 0x017a => 0xf2, 0x012f => 0xf3, 0xd3 => 0xf4, + 0xf3 => 0xf5, 0x0101 => 0xf6, 0x015b => 0xf7, 0xef => 0xf8, + 0xd4 => 0xf9, 0xd9 => 0xfa, 0x2206 => 0xfb, 0xfe => 0xfc, + 0xb2 => 0xfd, 0xd6 => 0xfe, 0xb5 => 0xff, 0xec => 0x0100, + 0x0151 => 0x0101, 0x0118 => 0x0102, 0x0111 => 0x0103, 0xbe => 0x0104, + 0x015e => 0x0105, 0x013e => 0x0106, 0x0136 => 0x0107, 0x0139 => 0x0108, + 0x2122 => 0x0109, 0x0117 => 0x010a, 0xcc => 0x010b, 0x012a => 0x010c, + 0x013d => 0x010d, 0xbd => 0x010e, 0x2264 => 0x010f, 0xf4 => 0x0110, + 0xf1 => 0x0111, 0x0170 => 0x0112, 0xc9 => 0x0113, 0x0113 => 0x0114, + 0x011f => 0x0115, 0xbc => 0x0116, 0x0160 => 0x0117, 0x0218 => 0x0118, + 0x0150 => 0x0119, 0xb0 => 0x011a, 0xf2 => 0x011b, 0x010c => 0x011c, + 0xf9 => 0x011d, 0x221a => 0x011e, 0x010e => 0x011f, 0x0157 => 0x0120, + 0xd1 => 0x0121, 0xf5 => 0x0122, 0x0156 => 0x0123, 0x013b => 0x0124, + 0xc3 => 0x0125, 0x0104 => 0x0126, 0xc5 => 0x0127, 0xd5 => 0x0128, + 0x017c => 0x0129, 0x011a => 0x012a, 0x012e => 0x012b, 0x0137 => 0x012c, + 0x2212 => 0x012d, 0xce => 0x012e, 0x0148 => 0x012f, 0x0163 => 0x0130, + 0xac => 0x0131, 0xf6 => 0x0132, 0xfc => 0x0133, 0x2260 => 0x0134, + 0x0123 => 0x0135, 0xf0 => 0x0136, 0x017e => 0x0137, 0x0146 => 0x0138, + 0xb9 => 0x0139, 0x012b => 0x013a, 0x20ac => 0x013b); + $this->_cmap = Zend_Pdf_Cmap::cmapWithTypeData( + Zend_Pdf_Cmap::TYPE_BYTE_ENCODING_STATIC, $cmapData); + + + /* Resource dictionary */ + + /* The resource dictionary for the standard fonts is sparse because PDF + * viewers already have all of the metrics data. We only need to provide + * the font name and encoding method. + */ + $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 new file mode 100644 index 0000000..ed2b9e6 --- /dev/null +++ b/libs/Zend/Pdf/Resource/Font/Simple/Standard/TimesItalic.php @@ -0,0 +1,299 @@ +_fontNames[Zend_Pdf_Font::NAME_COPYRIGHT]['en'] = + "\x00\x43\x00\x6f\x00\x70\x00\x79\x00\x72\x00\x69\x00\x67\x00\x68\x00" + . "\x74\x00\x20\x00\x28\x00\x63\x00\x29\x00\x20\x00\x31\x00\x39\x00" + . "\x38\x00\x35\x00\x2c\x00\x20\x00\x31\x00\x39\x00\x38\x00\x37\x00" + . "\x2c\x00\x20\x00\x31\x00\x39\x00\x38\x00\x39\x00\x2c\x00\x20\x00" + . "\x31\x00\x39\x00\x39\x00\x30\x00\x2c\x00\x20\x00\x31\x00\x39\x00" + . "\x39\x00\x33\x00\x2c\x00\x20\x00\x31\x00\x39\x00\x39\x00\x37\x00" + . "\x20\x00\x41\x00\x64\x00\x6f\x00\x62\x00\x65\x00\x20\x00\x53\x00" + . "\x79\x00\x73\x00\x74\x00\x65\x00\x6d\x00\x73\x00\x20\x00\x49\x00" + . "\x6e\x00\x63\x00\x6f\x00\x72\x00\x70\x00\x6f\x00\x72\x00\x61\x00" + . "\x74\x00\x65\x00\x64\x00\x2e\x00\x20\x00\x20\x00\x41\x00\x6c\x00" + . "\x6c\x00\x20\x00\x52\x00\x69\x00\x67\x00\x68\x00\x74\x00\x73\x00" + . "\x20\x00\x52\x00\x65\x00\x73\x00\x65\x00\x72\x00\x76\x00\x65\x00" + . "\x64\x00\x2e\x00\x54\x00\x69\x00\x6d\x00\x65\x00\x73\x00\x20\x00" + . "\x69\x00\x73\x00\x20\x00\x61\x00\x20\x00\x74\x00\x72\x00\x61\x00" + . "\x64\x00\x65\x00\x6d\x00\x61\x00\x72\x00\x6b\x00\x20\x00\x6f\x00" + . "\x66\x00\x20\x00\x4c\x00\x69\x00\x6e\x00\x6f\x00\x74\x00\x79\x00" + . "\x70\x00\x65\x00\x2d\x00\x48\x00\x65\x00\x6c\x00\x6c\x00\x20\x00" + . "\x41\x00\x47\x00\x20\x00\x61\x00\x6e\x00\x64\x00\x2f\x00\x6f\x00" + . "\x72\x00\x20\x00\x69\x00\x74\x00\x73\x00\x20\x00\x73\x00\x75\x00" + . "\x62\x00\x73\x00\x69\x00\x64\x00\x69\x00\x61\x00\x72\x00\x69\x00" + . "\x65\x00\x73\x00\x2e"; + $this->_fontNames[Zend_Pdf_Font::NAME_FAMILY]['en'] = + "\x00\x54\x00\x69\x00\x6d\x00\x65\x00\x73"; + $this->_fontNames[Zend_Pdf_Font::NAME_STYLE]['en'] = + "\x00\x4d\x00\x65\x00\x64\x00\x69\x00\x75\x00\x6d"; + $this->_fontNames[Zend_Pdf_Font::NAME_ID]['en'] = + "\x00\x34\x00\x33\x00\x30\x00\x36\x00\x37"; + $this->_fontNames[Zend_Pdf_Font::NAME_FULL]['en'] = + "\x00\x54\x00\x69\x00\x6d\x00\x65\x00\x73\x00\x2d\x00\x49\x00\x74\x00" + . "\x61\x00\x6c\x00\x69\x00\x63\x00\x20\x00\x4d\x00\x65\x00\x64\x00" + . "\x69\x00\x75\x00\x6d"; + $this->_fontNames[Zend_Pdf_Font::NAME_VERSION]['en'] = + "\x00\x30\x00\x30\x00\x32\x00\x2e\x00\x30\x00\x30\x00\x30"; + $this->_fontNames[Zend_Pdf_Font::NAME_POSTSCRIPT]['en'] = + "\x00\x54\x00\x69\x00\x6d\x00\x65\x00\x73\x00\x2d\x00\x49\x00\x74\x00" + . "\x61\x00\x6c\x00\x69\x00\x63"; + + $this->_isBold = false; + $this->_isItalic = true; + $this->_isMonospaced = false; + + $this->_underlinePosition = -100; + $this->_underlineThickness = 50; + $this->_strikePosition = 225; + $this->_strikeThickness = 50; + + $this->_unitsPerEm = 1000; + + $this->_ascent = 683; + $this->_descent = -217; + $this->_lineGap = 300; + + /* The glyph numbers assigned here are synthetic; they do not match the + * actual glyph numbers used by the font. This is not a big deal though + * since this data never makes it to the PDF file. It is only used + * internally for layout calculations. + */ + $this->_glyphWidths = array( + 0x00 => 0x01f4, 0x01 => 0xfa, 0x02 => 0x014d, 0x03 => 0x01a4, + 0x04 => 0x01f4, 0x05 => 0x01f4, 0x06 => 0x0341, 0x07 => 0x030a, + 0x08 => 0x014d, 0x09 => 0x014d, 0x0a => 0x014d, 0x0b => 0x01f4, + 0x0c => 0x02a3, 0x0d => 0xfa, 0x0e => 0x014d, 0x0f => 0xfa, + 0x10 => 0x0116, 0x11 => 0x01f4, 0x12 => 0x01f4, 0x13 => 0x01f4, + 0x14 => 0x01f4, 0x15 => 0x01f4, 0x16 => 0x01f4, 0x17 => 0x01f4, + 0x18 => 0x01f4, 0x19 => 0x01f4, 0x1a => 0x01f4, 0x1b => 0x014d, + 0x1c => 0x014d, 0x1d => 0x02a3, 0x1e => 0x02a3, 0x1f => 0x02a3, + 0x20 => 0x01f4, 0x21 => 0x0398, 0x22 => 0x0263, 0x23 => 0x0263, + 0x24 => 0x029b, 0x25 => 0x02d2, 0x26 => 0x0263, 0x27 => 0x0263, + 0x28 => 0x02d2, 0x29 => 0x02d2, 0x2a => 0x014d, 0x2b => 0x01bc, + 0x2c => 0x029b, 0x2d => 0x022c, 0x2e => 0x0341, 0x2f => 0x029b, + 0x30 => 0x02d2, 0x31 => 0x0263, 0x32 => 0x02d2, 0x33 => 0x0263, + 0x34 => 0x01f4, 0x35 => 0x022c, 0x36 => 0x02d2, 0x37 => 0x0263, + 0x38 => 0x0341, 0x39 => 0x0263, 0x3a => 0x022c, 0x3b => 0x022c, + 0x3c => 0x0185, 0x3d => 0x0116, 0x3e => 0x0185, 0x3f => 0x01a6, + 0x40 => 0x01f4, 0x41 => 0x014d, 0x42 => 0x01f4, 0x43 => 0x01f4, + 0x44 => 0x01bc, 0x45 => 0x01f4, 0x46 => 0x01bc, 0x47 => 0x0116, + 0x48 => 0x01f4, 0x49 => 0x01f4, 0x4a => 0x0116, 0x4b => 0x0116, + 0x4c => 0x01bc, 0x4d => 0x0116, 0x4e => 0x02d2, 0x4f => 0x01f4, + 0x50 => 0x01f4, 0x51 => 0x01f4, 0x52 => 0x01f4, 0x53 => 0x0185, + 0x54 => 0x0185, 0x55 => 0x0116, 0x56 => 0x01f4, 0x57 => 0x01bc, + 0x58 => 0x029b, 0x59 => 0x01bc, 0x5a => 0x01bc, 0x5b => 0x0185, + 0x5c => 0x0190, 0x5d => 0x0113, 0x5e => 0x0190, 0x5f => 0x021d, + 0x60 => 0x0185, 0x61 => 0x01f4, 0x62 => 0x01f4, 0x63 => 0xa7, + 0x64 => 0x01f4, 0x65 => 0x01f4, 0x66 => 0x01f4, 0x67 => 0x01f4, + 0x68 => 0xd6, 0x69 => 0x022c, 0x6a => 0x01f4, 0x6b => 0x014d, + 0x6c => 0x014d, 0x6d => 0x01f4, 0x6e => 0x01f4, 0x6f => 0x01f4, + 0x70 => 0x01f4, 0x71 => 0x01f4, 0x72 => 0xfa, 0x73 => 0x020b, + 0x74 => 0x015e, 0x75 => 0x014d, 0x76 => 0x022c, 0x77 => 0x022c, + 0x78 => 0x01f4, 0x79 => 0x0379, 0x7a => 0x03e8, 0x7b => 0x01f4, + 0x7c => 0x014d, 0x7d => 0x014d, 0x7e => 0x014d, 0x7f => 0x014d, + 0x80 => 0x014d, 0x81 => 0x014d, 0x82 => 0x014d, 0x83 => 0x014d, + 0x84 => 0x014d, 0x85 => 0x014d, 0x86 => 0x014d, 0x87 => 0x014d, + 0x88 => 0x014d, 0x89 => 0x0379, 0x8a => 0x0379, 0x8b => 0x0114, + 0x8c => 0x022c, 0x8d => 0x02d2, 0x8e => 0x03b0, 0x8f => 0x0136, + 0x90 => 0x029b, 0x91 => 0x0116, 0x92 => 0x0116, 0x93 => 0x01f4, + 0x94 => 0x029b, 0x95 => 0x01f4, 0x96 => 0x014d, 0x97 => 0x01bc, + 0x98 => 0x01f4, 0x99 => 0x01f4, 0x9a => 0x01bc, 0x9b => 0x022c, + 0x9c => 0x02a3, 0x9d => 0x022c, 0x9e => 0x0263, 0x9f => 0x01f4, + 0xa0 => 0x02d2, 0xa1 => 0x01bc, 0xa2 => 0x0185, 0xa3 => 0x01bc, + 0xa4 => 0x02d2, 0xa5 => 0x02d2, 0xa6 => 0x01f4, 0xa7 => 0x02d2, + 0xa8 => 0x01f4, 0xa9 => 0x0263, 0xaa => 0x02d2, 0xab => 0xfa, + 0xac => 0x02f8, 0xad => 0x0263, 0xae => 0x01bc, 0xaf => 0x01f4, + 0xb0 => 0x029b, 0xb1 => 0x0116, 0xb2 => 0x01f4, 0xb3 => 0x022c, + 0xb4 => 0x029b, 0xb5 => 0x01f4, 0xb6 => 0x0263, 0xb7 => 0x0185, + 0xb8 => 0x0185, 0xb9 => 0x0116, 0xba => 0x01d7, 0xbb => 0x0263, + 0xbc => 0x02d2, 0xbd => 0x01f4, 0xbe => 0x01f4, 0xbf => 0x0263, + 0xc0 => 0x0185, 0xc1 => 0x01bc, 0xc2 => 0x022c, 0xc3 => 0x0263, + 0xc4 => 0x02d2, 0xc5 => 0x0263, 0xc6 => 0x01f4, 0xc7 => 0x0220, + 0xc8 => 0x02d2, 0xc9 => 0x01f4, 0xca => 0x012c, 0xcb => 0x02d2, + 0xcc => 0x0263, 0xcd => 0x0263, 0xce => 0x02a3, 0xcf => 0x01f4, + 0xd0 => 0x022c, 0xd1 => 0x01dc, 0xd2 => 0x01bc, 0xd3 => 0x029b, + 0xd4 => 0x0116, 0xd5 => 0x0263, 0xd6 => 0x01f4, 0xd7 => 0x01bc, + 0xd8 => 0x01bc, 0xd9 => 0x01f4, 0xda => 0x01f4, 0xdb => 0x029b, + 0xdc => 0x014d, 0xdd => 0x02a3, 0xde => 0x0113, 0xdf => 0x02f8, + 0xe0 => 0x02d2, 0xe1 => 0x014d, 0xe2 => 0x0258, 0xe3 => 0x0263, + 0xe4 => 0x0185, 0xe5 => 0x01f4, 0xe6 => 0x022c, 0xe7 => 0x022c, + 0xe8 => 0x0225, 0xe9 => 0x02d2, 0xea => 0x029b, 0xeb => 0x0116, + 0xec => 0x012c, 0xed => 0x01bc, 0xee => 0x02d2, 0xef => 0x0263, + 0xf0 => 0x0263, 0xf1 => 0x01bc, 0xf2 => 0x0185, 0xf3 => 0x0116, + 0xf4 => 0x02d2, 0xf5 => 0x01f4, 0xf6 => 0x01f4, 0xf7 => 0x0185, + 0xf8 => 0x0116, 0xf9 => 0x02d2, 0xfa => 0x02d2, 0xfb => 0x0264, + 0xfc => 0x01f4, 0xfd => 0x012c, 0xfe => 0x02d2, 0xff => 0x01f4, + 0x0100 => 0x0116, 0x0101 => 0x01f4, 0x0102 => 0x0263, 0x0103 => 0x01f4, + 0x0104 => 0x02ee, 0x0105 => 0x01f4, 0x0106 => 0x012c, 0x0107 => 0x029b, + 0x0108 => 0x022c, 0x0109 => 0x03d4, 0x010a => 0x01bc, 0x010b => 0x014d, + 0x010c => 0x014d, 0x010d => 0x0263, 0x010e => 0x02ee, 0x010f => 0x0225, + 0x0110 => 0x01f4, 0x0111 => 0x01f4, 0x0112 => 0x02d2, 0x0113 => 0x0263, + 0x0114 => 0x01bc, 0x0115 => 0x01f4, 0x0116 => 0x02ee, 0x0117 => 0x01f4, + 0x0118 => 0x01f4, 0x0119 => 0x02d2, 0x011a => 0x0190, 0x011b => 0x01f4, + 0x011c => 0x029b, 0x011d => 0x01f4, 0x011e => 0x01c5, 0x011f => 0x02d2, + 0x0120 => 0x0185, 0x0121 => 0x029b, 0x0122 => 0x01f4, 0x0123 => 0x0263, + 0x0124 => 0x022c, 0x0125 => 0x0263, 0x0126 => 0x0263, 0x0127 => 0x0263, + 0x0128 => 0x02d2, 0x0129 => 0x0185, 0x012a => 0x0263, 0x012b => 0x014d, + 0x012c => 0x01bc, 0x012d => 0x02a3, 0x012e => 0x014d, 0x012f => 0x01f4, + 0x0130 => 0x0116, 0x0131 => 0x02a3, 0x0132 => 0x01f4, 0x0133 => 0x01f4, + 0x0134 => 0x0225, 0x0135 => 0x01f4, 0x0136 => 0x01f4, 0x0137 => 0x0185, + 0x0138 => 0x01f4, 0x0139 => 0x012c, 0x013a => 0x0116, 0x013b => 0x01f4, + ); + + /* The cmap table is similarly synthesized. + */ + $cmapData = array( + 0x20 => 0x01, 0x21 => 0x02, 0x22 => 0x03, 0x23 => 0x04, + 0x24 => 0x05, 0x25 => 0x06, 0x26 => 0x07, 0x2019 => 0x08, + 0x28 => 0x09, 0x29 => 0x0a, 0x2a => 0x0b, 0x2b => 0x0c, + 0x2c => 0x0d, 0x2d => 0x0e, 0x2e => 0x0f, 0x2f => 0x10, + 0x30 => 0x11, 0x31 => 0x12, 0x32 => 0x13, 0x33 => 0x14, + 0x34 => 0x15, 0x35 => 0x16, 0x36 => 0x17, 0x37 => 0x18, + 0x38 => 0x19, 0x39 => 0x1a, 0x3a => 0x1b, 0x3b => 0x1c, + 0x3c => 0x1d, 0x3d => 0x1e, 0x3e => 0x1f, 0x3f => 0x20, + 0x40 => 0x21, 0x41 => 0x22, 0x42 => 0x23, 0x43 => 0x24, + 0x44 => 0x25, 0x45 => 0x26, 0x46 => 0x27, 0x47 => 0x28, + 0x48 => 0x29, 0x49 => 0x2a, 0x4a => 0x2b, 0x4b => 0x2c, + 0x4c => 0x2d, 0x4d => 0x2e, 0x4e => 0x2f, 0x4f => 0x30, + 0x50 => 0x31, 0x51 => 0x32, 0x52 => 0x33, 0x53 => 0x34, + 0x54 => 0x35, 0x55 => 0x36, 0x56 => 0x37, 0x57 => 0x38, + 0x58 => 0x39, 0x59 => 0x3a, 0x5a => 0x3b, 0x5b => 0x3c, + 0x5c => 0x3d, 0x5d => 0x3e, 0x5e => 0x3f, 0x5f => 0x40, + 0x2018 => 0x41, 0x61 => 0x42, 0x62 => 0x43, 0x63 => 0x44, + 0x64 => 0x45, 0x65 => 0x46, 0x66 => 0x47, 0x67 => 0x48, + 0x68 => 0x49, 0x69 => 0x4a, 0x6a => 0x4b, 0x6b => 0x4c, + 0x6c => 0x4d, 0x6d => 0x4e, 0x6e => 0x4f, 0x6f => 0x50, + 0x70 => 0x51, 0x71 => 0x52, 0x72 => 0x53, 0x73 => 0x54, + 0x74 => 0x55, 0x75 => 0x56, 0x76 => 0x57, 0x77 => 0x58, + 0x78 => 0x59, 0x79 => 0x5a, 0x7a => 0x5b, 0x7b => 0x5c, + 0x7c => 0x5d, 0x7d => 0x5e, 0x7e => 0x5f, 0xa1 => 0x60, + 0xa2 => 0x61, 0xa3 => 0x62, 0x2044 => 0x63, 0xa5 => 0x64, + 0x0192 => 0x65, 0xa7 => 0x66, 0xa4 => 0x67, 0x27 => 0x68, + 0x201c => 0x69, 0xab => 0x6a, 0x2039 => 0x6b, 0x203a => 0x6c, + 0xfb01 => 0x6d, 0xfb02 => 0x6e, 0x2013 => 0x6f, 0x2020 => 0x70, + 0x2021 => 0x71, 0xb7 => 0x72, 0xb6 => 0x73, 0x2022 => 0x74, + 0x201a => 0x75, 0x201e => 0x76, 0x201d => 0x77, 0xbb => 0x78, + 0x2026 => 0x79, 0x2030 => 0x7a, 0xbf => 0x7b, 0x60 => 0x7c, + 0xb4 => 0x7d, 0x02c6 => 0x7e, 0x02dc => 0x7f, 0xaf => 0x80, + 0x02d8 => 0x81, 0x02d9 => 0x82, 0xa8 => 0x83, 0x02da => 0x84, + 0xb8 => 0x85, 0x02dd => 0x86, 0x02db => 0x87, 0x02c7 => 0x88, + 0x2014 => 0x89, 0xc6 => 0x8a, 0xaa => 0x8b, 0x0141 => 0x8c, + 0xd8 => 0x8d, 0x0152 => 0x8e, 0xba => 0x8f, 0xe6 => 0x90, + 0x0131 => 0x91, 0x0142 => 0x92, 0xf8 => 0x93, 0x0153 => 0x94, + 0xdf => 0x95, 0xcf => 0x96, 0xe9 => 0x97, 0x0103 => 0x98, + 0x0171 => 0x99, 0x011b => 0x9a, 0x0178 => 0x9b, 0xf7 => 0x9c, + 0xdd => 0x9d, 0xc2 => 0x9e, 0xe1 => 0x9f, 0xdb => 0xa0, + 0xfd => 0xa1, 0x0219 => 0xa2, 0xea => 0xa3, 0x016e => 0xa4, + 0xdc => 0xa5, 0x0105 => 0xa6, 0xda => 0xa7, 0x0173 => 0xa8, + 0xcb => 0xa9, 0x0110 => 0xaa, 0xf6c3 => 0xab, 0xa9 => 0xac, + 0x0112 => 0xad, 0x010d => 0xae, 0xe5 => 0xaf, 0x0145 => 0xb0, + 0x013a => 0xb1, 0xe0 => 0xb2, 0x0162 => 0xb3, 0x0106 => 0xb4, + 0xe3 => 0xb5, 0x0116 => 0xb6, 0x0161 => 0xb7, 0x015f => 0xb8, + 0xed => 0xb9, 0x25ca => 0xba, 0x0158 => 0xbb, 0x0122 => 0xbc, + 0xfb => 0xbd, 0xe2 => 0xbe, 0x0100 => 0xbf, 0x0159 => 0xc0, + 0xe7 => 0xc1, 0x017b => 0xc2, 0xde => 0xc3, 0x014c => 0xc4, + 0x0154 => 0xc5, 0x015a => 0xc6, 0x010f => 0xc7, 0x016a => 0xc8, + 0x016f => 0xc9, 0xb3 => 0xca, 0xd2 => 0xcb, 0xc0 => 0xcc, + 0x0102 => 0xcd, 0xd7 => 0xce, 0xfa => 0xcf, 0x0164 => 0xd0, + 0x2202 => 0xd1, 0xff => 0xd2, 0x0143 => 0xd3, 0xee => 0xd4, + 0xca => 0xd5, 0xe4 => 0xd6, 0xeb => 0xd7, 0x0107 => 0xd8, + 0x0144 => 0xd9, 0x016b => 0xda, 0x0147 => 0xdb, 0xcd => 0xdc, + 0xb1 => 0xdd, 0xa6 => 0xde, 0xae => 0xdf, 0x011e => 0xe0, + 0x0130 => 0xe1, 0x2211 => 0xe2, 0xc8 => 0xe3, 0x0155 => 0xe4, + 0x014d => 0xe5, 0x0179 => 0xe6, 0x017d => 0xe7, 0x2265 => 0xe8, + 0xd0 => 0xe9, 0xc7 => 0xea, 0x013c => 0xeb, 0x0165 => 0xec, + 0x0119 => 0xed, 0x0172 => 0xee, 0xc1 => 0xef, 0xc4 => 0xf0, + 0xe8 => 0xf1, 0x017a => 0xf2, 0x012f => 0xf3, 0xd3 => 0xf4, + 0xf3 => 0xf5, 0x0101 => 0xf6, 0x015b => 0xf7, 0xef => 0xf8, + 0xd4 => 0xf9, 0xd9 => 0xfa, 0x2206 => 0xfb, 0xfe => 0xfc, + 0xb2 => 0xfd, 0xd6 => 0xfe, 0xb5 => 0xff, 0xec => 0x0100, + 0x0151 => 0x0101, 0x0118 => 0x0102, 0x0111 => 0x0103, 0xbe => 0x0104, + 0x015e => 0x0105, 0x013e => 0x0106, 0x0136 => 0x0107, 0x0139 => 0x0108, + 0x2122 => 0x0109, 0x0117 => 0x010a, 0xcc => 0x010b, 0x012a => 0x010c, + 0x013d => 0x010d, 0xbd => 0x010e, 0x2264 => 0x010f, 0xf4 => 0x0110, + 0xf1 => 0x0111, 0x0170 => 0x0112, 0xc9 => 0x0113, 0x0113 => 0x0114, + 0x011f => 0x0115, 0xbc => 0x0116, 0x0160 => 0x0117, 0x0218 => 0x0118, + 0x0150 => 0x0119, 0xb0 => 0x011a, 0xf2 => 0x011b, 0x010c => 0x011c, + 0xf9 => 0x011d, 0x221a => 0x011e, 0x010e => 0x011f, 0x0157 => 0x0120, + 0xd1 => 0x0121, 0xf5 => 0x0122, 0x0156 => 0x0123, 0x013b => 0x0124, + 0xc3 => 0x0125, 0x0104 => 0x0126, 0xc5 => 0x0127, 0xd5 => 0x0128, + 0x017c => 0x0129, 0x011a => 0x012a, 0x012e => 0x012b, 0x0137 => 0x012c, + 0x2212 => 0x012d, 0xce => 0x012e, 0x0148 => 0x012f, 0x0163 => 0x0130, + 0xac => 0x0131, 0xf6 => 0x0132, 0xfc => 0x0133, 0x2260 => 0x0134, + 0x0123 => 0x0135, 0xf0 => 0x0136, 0x017e => 0x0137, 0x0146 => 0x0138, + 0xb9 => 0x0139, 0x012b => 0x013a, 0x20ac => 0x013b); + $this->_cmap = Zend_Pdf_Cmap::cmapWithTypeData( + Zend_Pdf_Cmap::TYPE_BYTE_ENCODING_STATIC, $cmapData); + + + /* Resource dictionary */ + + /* The resource dictionary for the standard fonts is sparse because PDF + * viewers already have all of the metrics data. We only need to provide + * the font name and encoding method. + */ + $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 new file mode 100644 index 0000000..f0eea23 --- /dev/null +++ b/libs/Zend/Pdf/Resource/Font/Simple/Standard/TimesRoman.php @@ -0,0 +1,299 @@ +_fontNames[Zend_Pdf_Font::NAME_COPYRIGHT]['en'] = + "\x00\x43\x00\x6f\x00\x70\x00\x79\x00\x72\x00\x69\x00\x67\x00\x68\x00" + . "\x74\x00\x20\x00\x28\x00\x63\x00\x29\x00\x20\x00\x31\x00\x39\x00" + . "\x38\x00\x35\x00\x2c\x00\x20\x00\x31\x00\x39\x00\x38\x00\x37\x00" + . "\x2c\x00\x20\x00\x31\x00\x39\x00\x38\x00\x39\x00\x2c\x00\x20\x00" + . "\x31\x00\x39\x00\x39\x00\x30\x00\x2c\x00\x20\x00\x31\x00\x39\x00" + . "\x39\x00\x33\x00\x2c\x00\x20\x00\x31\x00\x39\x00\x39\x00\x37\x00" + . "\x20\x00\x41\x00\x64\x00\x6f\x00\x62\x00\x65\x00\x20\x00\x53\x00" + . "\x79\x00\x73\x00\x74\x00\x65\x00\x6d\x00\x73\x00\x20\x00\x49\x00" + . "\x6e\x00\x63\x00\x6f\x00\x72\x00\x70\x00\x6f\x00\x72\x00\x61\x00" + . "\x74\x00\x65\x00\x64\x00\x2e\x00\x20\x00\x20\x00\x41\x00\x6c\x00" + . "\x6c\x00\x20\x00\x52\x00\x69\x00\x67\x00\x68\x00\x74\x00\x73\x00" + . "\x20\x00\x52\x00\x65\x00\x73\x00\x65\x00\x72\x00\x76\x00\x65\x00" + . "\x64\x00\x2e\x00\x54\x00\x69\x00\x6d\x00\x65\x00\x73\x00\x20\x00" + . "\x69\x00\x73\x00\x20\x00\x61\x00\x20\x00\x74\x00\x72\x00\x61\x00" + . "\x64\x00\x65\x00\x6d\x00\x61\x00\x72\x00\x6b\x00\x20\x00\x6f\x00" + . "\x66\x00\x20\x00\x4c\x00\x69\x00\x6e\x00\x6f\x00\x74\x00\x79\x00" + . "\x70\x00\x65\x00\x2d\x00\x48\x00\x65\x00\x6c\x00\x6c\x00\x20\x00" + . "\x41\x00\x47\x00\x20\x00\x61\x00\x6e\x00\x64\x00\x2f\x00\x6f\x00" + . "\x72\x00\x20\x00\x69\x00\x74\x00\x73\x00\x20\x00\x73\x00\x75\x00" + . "\x62\x00\x73\x00\x69\x00\x64\x00\x69\x00\x61\x00\x72\x00\x69\x00" + . "\x65\x00\x73\x00\x2e"; + $this->_fontNames[Zend_Pdf_Font::NAME_FAMILY]['en'] = + "\x00\x54\x00\x69\x00\x6d\x00\x65\x00\x73"; + $this->_fontNames[Zend_Pdf_Font::NAME_STYLE]['en'] = + "\x00\x52\x00\x6f\x00\x6d\x00\x61\x00\x6e"; + $this->_fontNames[Zend_Pdf_Font::NAME_ID]['en'] = + "\x00\x34\x00\x33\x00\x30\x00\x36\x00\x38"; + $this->_fontNames[Zend_Pdf_Font::NAME_FULL]['en'] = + "\x00\x54\x00\x69\x00\x6d\x00\x65\x00\x73\x00\x2d\x00\x52\x00\x6f\x00" + . "\x6d\x00\x61\x00\x6e\x00\x20\x00\x52\x00\x6f\x00\x6d\x00\x61\x00" + . "\x6e"; + $this->_fontNames[Zend_Pdf_Font::NAME_VERSION]['en'] = + "\x00\x30\x00\x30\x00\x32\x00\x2e\x00\x30\x00\x30\x00\x30"; + $this->_fontNames[Zend_Pdf_Font::NAME_POSTSCRIPT]['en'] = + "\x00\x54\x00\x69\x00\x6d\x00\x65\x00\x73\x00\x2d\x00\x52\x00\x6f\x00" + . "\x6d\x00\x61\x00\x6e"; + + $this->_isBold = false; + $this->_isItalic = false; + $this->_isMonospaced = false; + + $this->_underlinePosition = -100; + $this->_underlineThickness = 50; + $this->_strikePosition = 225; + $this->_strikeThickness = 50; + + $this->_unitsPerEm = 1000; + + $this->_ascent = 683; + $this->_descent = -217; + $this->_lineGap = 300; + + /* The glyph numbers assigned here are synthetic; they do not match the + * actual glyph numbers used by the font. This is not a big deal though + * since this data never makes it to the PDF file. It is only used + * internally for layout calculations. + */ + $this->_glyphWidths = array( + 0x00 => 0x01f4, 0x01 => 0xfa, 0x02 => 0x014d, 0x03 => 0x0198, + 0x04 => 0x01f4, 0x05 => 0x01f4, 0x06 => 0x0341, 0x07 => 0x030a, + 0x08 => 0x014d, 0x09 => 0x014d, 0x0a => 0x014d, 0x0b => 0x01f4, + 0x0c => 0x0234, 0x0d => 0xfa, 0x0e => 0x014d, 0x0f => 0xfa, + 0x10 => 0x0116, 0x11 => 0x01f4, 0x12 => 0x01f4, 0x13 => 0x01f4, + 0x14 => 0x01f4, 0x15 => 0x01f4, 0x16 => 0x01f4, 0x17 => 0x01f4, + 0x18 => 0x01f4, 0x19 => 0x01f4, 0x1a => 0x01f4, 0x1b => 0x0116, + 0x1c => 0x0116, 0x1d => 0x0234, 0x1e => 0x0234, 0x1f => 0x0234, + 0x20 => 0x01bc, 0x21 => 0x0399, 0x22 => 0x02d2, 0x23 => 0x029b, + 0x24 => 0x029b, 0x25 => 0x02d2, 0x26 => 0x0263, 0x27 => 0x022c, + 0x28 => 0x02d2, 0x29 => 0x02d2, 0x2a => 0x014d, 0x2b => 0x0185, + 0x2c => 0x02d2, 0x2d => 0x0263, 0x2e => 0x0379, 0x2f => 0x02d2, + 0x30 => 0x02d2, 0x31 => 0x022c, 0x32 => 0x02d2, 0x33 => 0x029b, + 0x34 => 0x022c, 0x35 => 0x0263, 0x36 => 0x02d2, 0x37 => 0x02d2, + 0x38 => 0x03b0, 0x39 => 0x02d2, 0x3a => 0x02d2, 0x3b => 0x0263, + 0x3c => 0x014d, 0x3d => 0x0116, 0x3e => 0x014d, 0x3f => 0x01d5, + 0x40 => 0x01f4, 0x41 => 0x014d, 0x42 => 0x01bc, 0x43 => 0x01f4, + 0x44 => 0x01bc, 0x45 => 0x01f4, 0x46 => 0x01bc, 0x47 => 0x014d, + 0x48 => 0x01f4, 0x49 => 0x01f4, 0x4a => 0x0116, 0x4b => 0x0116, + 0x4c => 0x01f4, 0x4d => 0x0116, 0x4e => 0x030a, 0x4f => 0x01f4, + 0x50 => 0x01f4, 0x51 => 0x01f4, 0x52 => 0x01f4, 0x53 => 0x014d, + 0x54 => 0x0185, 0x55 => 0x0116, 0x56 => 0x01f4, 0x57 => 0x01f4, + 0x58 => 0x02d2, 0x59 => 0x01f4, 0x5a => 0x01f4, 0x5b => 0x01bc, + 0x5c => 0x01e0, 0x5d => 0xc8, 0x5e => 0x01e0, 0x5f => 0x021d, + 0x60 => 0x014d, 0x61 => 0x01f4, 0x62 => 0x01f4, 0x63 => 0xa7, + 0x64 => 0x01f4, 0x65 => 0x01f4, 0x66 => 0x01f4, 0x67 => 0x01f4, + 0x68 => 0xb4, 0x69 => 0x01bc, 0x6a => 0x01f4, 0x6b => 0x014d, + 0x6c => 0x014d, 0x6d => 0x022c, 0x6e => 0x022c, 0x6f => 0x01f4, + 0x70 => 0x01f4, 0x71 => 0x01f4, 0x72 => 0xfa, 0x73 => 0x01c5, + 0x74 => 0x015e, 0x75 => 0x014d, 0x76 => 0x01bc, 0x77 => 0x01bc, + 0x78 => 0x01f4, 0x79 => 0x03e8, 0x7a => 0x03e8, 0x7b => 0x01bc, + 0x7c => 0x014d, 0x7d => 0x014d, 0x7e => 0x014d, 0x7f => 0x014d, + 0x80 => 0x014d, 0x81 => 0x014d, 0x82 => 0x014d, 0x83 => 0x014d, + 0x84 => 0x014d, 0x85 => 0x014d, 0x86 => 0x014d, 0x87 => 0x014d, + 0x88 => 0x014d, 0x89 => 0x03e8, 0x8a => 0x0379, 0x8b => 0x0114, + 0x8c => 0x0263, 0x8d => 0x02d2, 0x8e => 0x0379, 0x8f => 0x0136, + 0x90 => 0x029b, 0x91 => 0x0116, 0x92 => 0x0116, 0x93 => 0x01f4, + 0x94 => 0x02d2, 0x95 => 0x01f4, 0x96 => 0x014d, 0x97 => 0x01bc, + 0x98 => 0x01bc, 0x99 => 0x01f4, 0x9a => 0x01bc, 0x9b => 0x02d2, + 0x9c => 0x0234, 0x9d => 0x02d2, 0x9e => 0x02d2, 0x9f => 0x01bc, + 0xa0 => 0x02d2, 0xa1 => 0x01f4, 0xa2 => 0x0185, 0xa3 => 0x01bc, + 0xa4 => 0x02d2, 0xa5 => 0x02d2, 0xa6 => 0x01bc, 0xa7 => 0x02d2, + 0xa8 => 0x01f4, 0xa9 => 0x0263, 0xaa => 0x02d2, 0xab => 0xfa, + 0xac => 0x02f8, 0xad => 0x0263, 0xae => 0x01bc, 0xaf => 0x01bc, + 0xb0 => 0x02d2, 0xb1 => 0x0116, 0xb2 => 0x01bc, 0xb3 => 0x0263, + 0xb4 => 0x029b, 0xb5 => 0x01bc, 0xb6 => 0x0263, 0xb7 => 0x0185, + 0xb8 => 0x0185, 0xb9 => 0x0116, 0xba => 0x01d7, 0xbb => 0x029b, + 0xbc => 0x02d2, 0xbd => 0x01f4, 0xbe => 0x01bc, 0xbf => 0x02d2, + 0xc0 => 0x014d, 0xc1 => 0x01bc, 0xc2 => 0x0263, 0xc3 => 0x022c, + 0xc4 => 0x02d2, 0xc5 => 0x029b, 0xc6 => 0x022c, 0xc7 => 0x024c, + 0xc8 => 0x02d2, 0xc9 => 0x01f4, 0xca => 0x012c, 0xcb => 0x02d2, + 0xcc => 0x02d2, 0xcd => 0x02d2, 0xce => 0x0234, 0xcf => 0x01f4, + 0xd0 => 0x0263, 0xd1 => 0x01dc, 0xd2 => 0x01f4, 0xd3 => 0x02d2, + 0xd4 => 0x0116, 0xd5 => 0x0263, 0xd6 => 0x01bc, 0xd7 => 0x01bc, + 0xd8 => 0x01bc, 0xd9 => 0x01f4, 0xda => 0x01f4, 0xdb => 0x02d2, + 0xdc => 0x014d, 0xdd => 0x0234, 0xde => 0xc8, 0xdf => 0x02f8, + 0xe0 => 0x02d2, 0xe1 => 0x014d, 0xe2 => 0x0258, 0xe3 => 0x0263, + 0xe4 => 0x014d, 0xe5 => 0x01f4, 0xe6 => 0x0263, 0xe7 => 0x0263, + 0xe8 => 0x0225, 0xe9 => 0x02d2, 0xea => 0x029b, 0xeb => 0x0116, + 0xec => 0x0146, 0xed => 0x01bc, 0xee => 0x02d2, 0xef => 0x02d2, + 0xf0 => 0x02d2, 0xf1 => 0x01bc, 0xf2 => 0x01bc, 0xf3 => 0x0116, + 0xf4 => 0x02d2, 0xf5 => 0x01f4, 0xf6 => 0x01bc, 0xf7 => 0x0185, + 0xf8 => 0x0116, 0xf9 => 0x02d2, 0xfa => 0x02d2, 0xfb => 0x0264, + 0xfc => 0x01f4, 0xfd => 0x012c, 0xfe => 0x02d2, 0xff => 0x01f4, + 0x0100 => 0x0116, 0x0101 => 0x01f4, 0x0102 => 0x0263, 0x0103 => 0x01f4, + 0x0104 => 0x02ee, 0x0105 => 0x022c, 0x0106 => 0x0158, 0x0107 => 0x02d2, + 0x0108 => 0x0263, 0x0109 => 0x03d4, 0x010a => 0x01bc, 0x010b => 0x014d, + 0x010c => 0x014d, 0x010d => 0x0263, 0x010e => 0x02ee, 0x010f => 0x0225, + 0x0110 => 0x01f4, 0x0111 => 0x01f4, 0x0112 => 0x02d2, 0x0113 => 0x0263, + 0x0114 => 0x01bc, 0x0115 => 0x01f4, 0x0116 => 0x02ee, 0x0117 => 0x022c, + 0x0118 => 0x022c, 0x0119 => 0x02d2, 0x011a => 0x0190, 0x011b => 0x01f4, + 0x011c => 0x029b, 0x011d => 0x01f4, 0x011e => 0x01c5, 0x011f => 0x02d2, + 0x0120 => 0x014d, 0x0121 => 0x02d2, 0x0122 => 0x01f4, 0x0123 => 0x029b, + 0x0124 => 0x0263, 0x0125 => 0x02d2, 0x0126 => 0x02d2, 0x0127 => 0x02d2, + 0x0128 => 0x02d2, 0x0129 => 0x01bc, 0x012a => 0x0263, 0x012b => 0x014d, + 0x012c => 0x01f4, 0x012d => 0x0234, 0x012e => 0x014d, 0x012f => 0x01f4, + 0x0130 => 0x0116, 0x0131 => 0x0234, 0x0132 => 0x01f4, 0x0133 => 0x01f4, + 0x0134 => 0x0225, 0x0135 => 0x01f4, 0x0136 => 0x01f4, 0x0137 => 0x01bc, + 0x0138 => 0x01f4, 0x0139 => 0x012c, 0x013a => 0x0116, 0x013b => 0x01f4, + ); + + /* The cmap table is similarly synthesized. + */ + $cmapData = array( + 0x20 => 0x01, 0x21 => 0x02, 0x22 => 0x03, 0x23 => 0x04, + 0x24 => 0x05, 0x25 => 0x06, 0x26 => 0x07, 0x2019 => 0x08, + 0x28 => 0x09, 0x29 => 0x0a, 0x2a => 0x0b, 0x2b => 0x0c, + 0x2c => 0x0d, 0x2d => 0x0e, 0x2e => 0x0f, 0x2f => 0x10, + 0x30 => 0x11, 0x31 => 0x12, 0x32 => 0x13, 0x33 => 0x14, + 0x34 => 0x15, 0x35 => 0x16, 0x36 => 0x17, 0x37 => 0x18, + 0x38 => 0x19, 0x39 => 0x1a, 0x3a => 0x1b, 0x3b => 0x1c, + 0x3c => 0x1d, 0x3d => 0x1e, 0x3e => 0x1f, 0x3f => 0x20, + 0x40 => 0x21, 0x41 => 0x22, 0x42 => 0x23, 0x43 => 0x24, + 0x44 => 0x25, 0x45 => 0x26, 0x46 => 0x27, 0x47 => 0x28, + 0x48 => 0x29, 0x49 => 0x2a, 0x4a => 0x2b, 0x4b => 0x2c, + 0x4c => 0x2d, 0x4d => 0x2e, 0x4e => 0x2f, 0x4f => 0x30, + 0x50 => 0x31, 0x51 => 0x32, 0x52 => 0x33, 0x53 => 0x34, + 0x54 => 0x35, 0x55 => 0x36, 0x56 => 0x37, 0x57 => 0x38, + 0x58 => 0x39, 0x59 => 0x3a, 0x5a => 0x3b, 0x5b => 0x3c, + 0x5c => 0x3d, 0x5d => 0x3e, 0x5e => 0x3f, 0x5f => 0x40, + 0x2018 => 0x41, 0x61 => 0x42, 0x62 => 0x43, 0x63 => 0x44, + 0x64 => 0x45, 0x65 => 0x46, 0x66 => 0x47, 0x67 => 0x48, + 0x68 => 0x49, 0x69 => 0x4a, 0x6a => 0x4b, 0x6b => 0x4c, + 0x6c => 0x4d, 0x6d => 0x4e, 0x6e => 0x4f, 0x6f => 0x50, + 0x70 => 0x51, 0x71 => 0x52, 0x72 => 0x53, 0x73 => 0x54, + 0x74 => 0x55, 0x75 => 0x56, 0x76 => 0x57, 0x77 => 0x58, + 0x78 => 0x59, 0x79 => 0x5a, 0x7a => 0x5b, 0x7b => 0x5c, + 0x7c => 0x5d, 0x7d => 0x5e, 0x7e => 0x5f, 0xa1 => 0x60, + 0xa2 => 0x61, 0xa3 => 0x62, 0x2044 => 0x63, 0xa5 => 0x64, + 0x0192 => 0x65, 0xa7 => 0x66, 0xa4 => 0x67, 0x27 => 0x68, + 0x201c => 0x69, 0xab => 0x6a, 0x2039 => 0x6b, 0x203a => 0x6c, + 0xfb01 => 0x6d, 0xfb02 => 0x6e, 0x2013 => 0x6f, 0x2020 => 0x70, + 0x2021 => 0x71, 0xb7 => 0x72, 0xb6 => 0x73, 0x2022 => 0x74, + 0x201a => 0x75, 0x201e => 0x76, 0x201d => 0x77, 0xbb => 0x78, + 0x2026 => 0x79, 0x2030 => 0x7a, 0xbf => 0x7b, 0x60 => 0x7c, + 0xb4 => 0x7d, 0x02c6 => 0x7e, 0x02dc => 0x7f, 0xaf => 0x80, + 0x02d8 => 0x81, 0x02d9 => 0x82, 0xa8 => 0x83, 0x02da => 0x84, + 0xb8 => 0x85, 0x02dd => 0x86, 0x02db => 0x87, 0x02c7 => 0x88, + 0x2014 => 0x89, 0xc6 => 0x8a, 0xaa => 0x8b, 0x0141 => 0x8c, + 0xd8 => 0x8d, 0x0152 => 0x8e, 0xba => 0x8f, 0xe6 => 0x90, + 0x0131 => 0x91, 0x0142 => 0x92, 0xf8 => 0x93, 0x0153 => 0x94, + 0xdf => 0x95, 0xcf => 0x96, 0xe9 => 0x97, 0x0103 => 0x98, + 0x0171 => 0x99, 0x011b => 0x9a, 0x0178 => 0x9b, 0xf7 => 0x9c, + 0xdd => 0x9d, 0xc2 => 0x9e, 0xe1 => 0x9f, 0xdb => 0xa0, + 0xfd => 0xa1, 0x0219 => 0xa2, 0xea => 0xa3, 0x016e => 0xa4, + 0xdc => 0xa5, 0x0105 => 0xa6, 0xda => 0xa7, 0x0173 => 0xa8, + 0xcb => 0xa9, 0x0110 => 0xaa, 0xf6c3 => 0xab, 0xa9 => 0xac, + 0x0112 => 0xad, 0x010d => 0xae, 0xe5 => 0xaf, 0x0145 => 0xb0, + 0x013a => 0xb1, 0xe0 => 0xb2, 0x0162 => 0xb3, 0x0106 => 0xb4, + 0xe3 => 0xb5, 0x0116 => 0xb6, 0x0161 => 0xb7, 0x015f => 0xb8, + 0xed => 0xb9, 0x25ca => 0xba, 0x0158 => 0xbb, 0x0122 => 0xbc, + 0xfb => 0xbd, 0xe2 => 0xbe, 0x0100 => 0xbf, 0x0159 => 0xc0, + 0xe7 => 0xc1, 0x017b => 0xc2, 0xde => 0xc3, 0x014c => 0xc4, + 0x0154 => 0xc5, 0x015a => 0xc6, 0x010f => 0xc7, 0x016a => 0xc8, + 0x016f => 0xc9, 0xb3 => 0xca, 0xd2 => 0xcb, 0xc0 => 0xcc, + 0x0102 => 0xcd, 0xd7 => 0xce, 0xfa => 0xcf, 0x0164 => 0xd0, + 0x2202 => 0xd1, 0xff => 0xd2, 0x0143 => 0xd3, 0xee => 0xd4, + 0xca => 0xd5, 0xe4 => 0xd6, 0xeb => 0xd7, 0x0107 => 0xd8, + 0x0144 => 0xd9, 0x016b => 0xda, 0x0147 => 0xdb, 0xcd => 0xdc, + 0xb1 => 0xdd, 0xa6 => 0xde, 0xae => 0xdf, 0x011e => 0xe0, + 0x0130 => 0xe1, 0x2211 => 0xe2, 0xc8 => 0xe3, 0x0155 => 0xe4, + 0x014d => 0xe5, 0x0179 => 0xe6, 0x017d => 0xe7, 0x2265 => 0xe8, + 0xd0 => 0xe9, 0xc7 => 0xea, 0x013c => 0xeb, 0x0165 => 0xec, + 0x0119 => 0xed, 0x0172 => 0xee, 0xc1 => 0xef, 0xc4 => 0xf0, + 0xe8 => 0xf1, 0x017a => 0xf2, 0x012f => 0xf3, 0xd3 => 0xf4, + 0xf3 => 0xf5, 0x0101 => 0xf6, 0x015b => 0xf7, 0xef => 0xf8, + 0xd4 => 0xf9, 0xd9 => 0xfa, 0x2206 => 0xfb, 0xfe => 0xfc, + 0xb2 => 0xfd, 0xd6 => 0xfe, 0xb5 => 0xff, 0xec => 0x0100, + 0x0151 => 0x0101, 0x0118 => 0x0102, 0x0111 => 0x0103, 0xbe => 0x0104, + 0x015e => 0x0105, 0x013e => 0x0106, 0x0136 => 0x0107, 0x0139 => 0x0108, + 0x2122 => 0x0109, 0x0117 => 0x010a, 0xcc => 0x010b, 0x012a => 0x010c, + 0x013d => 0x010d, 0xbd => 0x010e, 0x2264 => 0x010f, 0xf4 => 0x0110, + 0xf1 => 0x0111, 0x0170 => 0x0112, 0xc9 => 0x0113, 0x0113 => 0x0114, + 0x011f => 0x0115, 0xbc => 0x0116, 0x0160 => 0x0117, 0x0218 => 0x0118, + 0x0150 => 0x0119, 0xb0 => 0x011a, 0xf2 => 0x011b, 0x010c => 0x011c, + 0xf9 => 0x011d, 0x221a => 0x011e, 0x010e => 0x011f, 0x0157 => 0x0120, + 0xd1 => 0x0121, 0xf5 => 0x0122, 0x0156 => 0x0123, 0x013b => 0x0124, + 0xc3 => 0x0125, 0x0104 => 0x0126, 0xc5 => 0x0127, 0xd5 => 0x0128, + 0x017c => 0x0129, 0x011a => 0x012a, 0x012e => 0x012b, 0x0137 => 0x012c, + 0x2212 => 0x012d, 0xce => 0x012e, 0x0148 => 0x012f, 0x0163 => 0x0130, + 0xac => 0x0131, 0xf6 => 0x0132, 0xfc => 0x0133, 0x2260 => 0x0134, + 0x0123 => 0x0135, 0xf0 => 0x0136, 0x017e => 0x0137, 0x0146 => 0x0138, + 0xb9 => 0x0139, 0x012b => 0x013a, 0x20ac => 0x013b); + $this->_cmap = Zend_Pdf_Cmap::cmapWithTypeData( + Zend_Pdf_Cmap::TYPE_BYTE_ENCODING_STATIC, $cmapData); + + + /* Resource dictionary */ + + /* The resource dictionary for the standard fonts is sparse because PDF + * viewers already have all of the metrics data. We only need to provide + * the font name and encoding method. + */ + $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 new file mode 100644 index 0000000..2015b15 --- /dev/null +++ b/libs/Zend/Pdf/Resource/Font/Simple/Standard/ZapfDingbats.php @@ -0,0 +1,485 @@ + "\x20", 0x2701 => "\x21", 0x2702 => "\x22", 0x2703 => "\x23", + 0x2704 => "\x24", 0x260e => "\x25", 0x2706 => "\x26", 0x2707 => "\x27", + 0x2708 => "\x28", 0x2709 => "\x29", 0x261b => "\x2a", 0x261e => "\x2b", + 0x270c => "\x2c", 0x270d => "\x2d", 0x270e => "\x2e", 0x270f => "\x2f", + 0x2710 => "\x30", 0x2711 => "\x31", 0x2712 => "\x32", 0x2713 => "\x33", + 0x2714 => "\x34", 0x2715 => "\x35", 0x2716 => "\x36", 0x2717 => "\x37", + 0x2718 => "\x38", 0x2719 => "\x39", 0x271a => "\x3a", 0x271b => "\x3b", + 0x271c => "\x3c", 0x271d => "\x3d", 0x271e => "\x3e", 0x271f => "\x3f", + 0x2720 => "\x40", 0x2721 => "\x41", 0x2722 => "\x42", 0x2723 => "\x43", + 0x2724 => "\x44", 0x2725 => "\x45", 0x2726 => "\x46", 0x2727 => "\x47", + 0x2605 => "\x48", 0x2729 => "\x49", 0x272a => "\x4a", 0x272b => "\x4b", + 0x272c => "\x4c", 0x272d => "\x4d", 0x272e => "\x4e", 0x272f => "\x4f", + 0x2730 => "\x50", 0x2731 => "\x51", 0x2732 => "\x52", 0x2733 => "\x53", + 0x2734 => "\x54", 0x2735 => "\x55", 0x2736 => "\x56", 0x2737 => "\x57", + 0x2738 => "\x58", 0x2739 => "\x59", 0x273a => "\x5a", 0x273b => "\x5b", + 0x273c => "\x5c", 0x273d => "\x5d", 0x273e => "\x5e", 0x273f => "\x5f", + 0x2740 => "\x60", 0x2741 => "\x61", 0x2742 => "\x62", 0x2743 => "\x63", + 0x2744 => "\x64", 0x2745 => "\x65", 0x2746 => "\x66", 0x2747 => "\x67", + 0x2748 => "\x68", 0x2749 => "\x69", 0x274a => "\x6a", 0x274b => "\x6b", + 0x25cf => "\x6c", 0x274d => "\x6d", 0x25a0 => "\x6e", 0x274f => "\x6f", + 0x2750 => "\x70", 0x2751 => "\x71", 0x2752 => "\x72", 0x25b2 => "\x73", + 0x25bc => "\x74", 0x25c6 => "\x75", 0x2756 => "\x76", 0x25d7 => "\x77", + 0x2758 => "\x78", 0x2759 => "\x79", 0x275a => "\x7a", 0x275b => "\x7b", + 0x275c => "\x7c", 0x275d => "\x7d", 0x275e => "\x7e", 0x2768 => "\x80", + 0x2769 => "\x81", 0x276a => "\x82", 0x276b => "\x83", 0x276c => "\x84", + 0x276d => "\x85", 0x276e => "\x86", 0x276f => "\x87", 0x2770 => "\x88", + 0x2771 => "\x89", 0x2772 => "\x8a", 0x2773 => "\x8b", 0x2774 => "\x8c", + 0x2775 => "\x8d", 0x2761 => "\xa1", 0x2762 => "\xa2", 0x2763 => "\xa3", + 0x2764 => "\xa4", 0x2765 => "\xa5", 0x2766 => "\xa6", 0x2767 => "\xa7", + 0x2663 => "\xa8", 0x2666 => "\xa9", 0x2665 => "\xaa", 0x2660 => "\xab", + 0x2460 => "\xac", 0x2461 => "\xad", 0x2462 => "\xae", 0x2463 => "\xaf", + 0x2464 => "\xb0", 0x2465 => "\xb1", 0x2466 => "\xb2", 0x2467 => "\xb3", + 0x2468 => "\xb4", 0x2469 => "\xb5", 0x2776 => "\xb6", 0x2777 => "\xb7", + 0x2778 => "\xb8", 0x2779 => "\xb9", 0x277a => "\xba", 0x277b => "\xbb", + 0x277c => "\xbc", 0x277d => "\xbd", 0x277e => "\xbe", 0x277f => "\xbf", + 0x2780 => "\xc0", 0x2781 => "\xc1", 0x2782 => "\xc2", 0x2783 => "\xc3", + 0x2784 => "\xc4", 0x2785 => "\xc5", 0x2786 => "\xc6", 0x2787 => "\xc7", + 0x2788 => "\xc8", 0x2789 => "\xc9", 0x278a => "\xca", 0x278b => "\xcb", + 0x278c => "\xcc", 0x278d => "\xcd", 0x278e => "\xce", 0x278f => "\xcf", + 0x2790 => "\xd0", 0x2791 => "\xd1", 0x2792 => "\xd2", 0x2793 => "\xd3", + 0x2794 => "\xd4", 0x2192 => "\xd5", 0x2194 => "\xd6", 0x2195 => "\xd7", + 0x2798 => "\xd8", 0x2799 => "\xd9", 0x279a => "\xda", 0x279b => "\xdb", + 0x279c => "\xdc", 0x279d => "\xdd", 0x279e => "\xde", 0x279f => "\xdf", + 0x27a0 => "\xe0", 0x27a1 => "\xe1", 0x27a2 => "\xe2", 0x27a3 => "\xe3", + 0x27a4 => "\xe4", 0x27a5 => "\xe5", 0x27a6 => "\xe6", 0x27a7 => "\xe7", + 0x27a8 => "\xe8", 0x27a9 => "\xe9", 0x27aa => "\xea", 0x27ab => "\xeb", + 0x27ac => "\xec", 0x27ad => "\xed", 0x27ae => "\xee", 0x27af => "\xef", + 0x27b1 => "\xf1", 0x27b2 => "\xf2", 0x27b3 => "\xf3", 0x27b4 => "\xf4", + 0x27b5 => "\xf5", 0x27b6 => "\xf6", 0x27b7 => "\xf7", 0x27b8 => "\xf8", + 0x27b9 => "\xf9", 0x27ba => "\xfa", 0x27bb => "\xfb", 0x27bc => "\xfc", + 0x27bd => "\xfd", 0x27be => "\xfe"); + + /** + * Array for conversion from special font encoding to local encoding. + * See {@link decodeString()}. + * @var array + */ + protected $_fromFontEncoding = array( + 0x20 => "\x00\x20", 0x21 => "\x27\x01", 0x22 => "\x27\x02", + 0x23 => "\x27\x03", 0x24 => "\x27\x04", 0x25 => "\x26\x0e", + 0x26 => "\x27\x06", 0x27 => "\x27\x07", 0x28 => "\x27\x08", + 0x29 => "\x27\x09", 0x2a => "\x26\x1b", 0x2b => "\x26\x1e", + 0x2c => "\x27\x0c", 0x2d => "\x27\x0d", 0x2e => "\x27\x0e", + 0x2f => "\x27\x0f", 0x30 => "\x27\x10", 0x31 => "\x27\x11", + 0x32 => "\x27\x12", 0x33 => "\x27\x13", 0x34 => "\x27\x14", + 0x35 => "\x27\x15", 0x36 => "\x27\x16", 0x37 => "\x27\x17", + 0x38 => "\x27\x18", 0x39 => "\x27\x19", 0x3a => "\x27\x1a", + 0x3b => "\x27\x1b", 0x3c => "\x27\x1c", 0x3d => "\x27\x1d", + 0x3e => "\x27\x1e", 0x3f => "\x27\x1f", 0x40 => "\x27\x20", + 0x41 => "\x27\x21", 0x42 => "\x27\x22", 0x43 => "\x27\x23", + 0x44 => "\x27\x24", 0x45 => "\x27\x25", 0x46 => "\x27\x26", + 0x47 => "\x27\x27", 0x48 => "\x26\x05", 0x49 => "\x27\x29", + 0x4a => "\x27\x2a", 0x4b => "\x27\x2b", 0x4c => "\x27\x2c", + 0x4d => "\x27\x2d", 0x4e => "\x27\x2e", 0x4f => "\x27\x2f", + 0x50 => "\x27\x30", 0x51 => "\x27\x31", 0x52 => "\x27\x32", + 0x53 => "\x27\x33", 0x54 => "\x27\x34", 0x55 => "\x27\x35", + 0x56 => "\x27\x36", 0x57 => "\x27\x37", 0x58 => "\x27\x38", + 0x59 => "\x27\x39", 0x5a => "\x27\x3a", 0x5b => "\x27\x3b", + 0x5c => "\x27\x3c", 0x5d => "\x27\x3d", 0x5e => "\x27\x3e", + 0x5f => "\x27\x3f", 0x60 => "\x27\x40", 0x61 => "\x27\x41", + 0x62 => "\x27\x42", 0x63 => "\x27\x43", 0x64 => "\x27\x44", + 0x65 => "\x27\x45", 0x66 => "\x27\x46", 0x67 => "\x27\x47", + 0x68 => "\x27\x48", 0x69 => "\x27\x49", 0x6a => "\x27\x4a", + 0x6b => "\x27\x4b", 0x6c => "\x25\xcf", 0x6d => "\x27\x4d", + 0x6e => "\x25\xa0", 0x6f => "\x27\x4f", 0x70 => "\x27\x50", + 0x71 => "\x27\x51", 0x72 => "\x27\x52", 0x73 => "\x25\xb2", + 0x74 => "\x25\xbc", 0x75 => "\x25\xc6", 0x76 => "\x27\x56", + 0x77 => "\x25\xd7", 0x78 => "\x27\x58", 0x79 => "\x27\x59", + 0x7a => "\x27\x5a", 0x7b => "\x27\x5b", 0x7c => "\x27\x5c", + 0x7d => "\x27\x5d", 0x7e => "\x27\x5e", 0x80 => "\x27\x68", + 0x81 => "\x27\x69", 0x82 => "\x27\x6a", 0x83 => "\x27\x6b", + 0x84 => "\x27\x6c", 0x85 => "\x27\x6d", 0x86 => "\x27\x6e", + 0x87 => "\x27\x6f", 0x88 => "\x27\x70", 0x89 => "\x27\x71", + 0x8a => "\x27\x72", 0x8b => "\x27\x73", 0x8c => "\x27\x74", + 0x8d => "\x27\x75", 0xa1 => "\x27\x61", 0xa2 => "\x27\x62", + 0xa3 => "\x27\x63", 0xa4 => "\x27\x64", 0xa5 => "\x27\x65", + 0xa6 => "\x27\x66", 0xa7 => "\x27\x67", 0xa8 => "\x26\x63", + 0xa9 => "\x26\x66", 0xaa => "\x26\x65", 0xab => "\x26\x60", + 0xac => "\x24\x60", 0xad => "\x24\x61", 0xae => "\x24\x62", + 0xaf => "\x24\x63", 0xb0 => "\x24\x64", 0xb1 => "\x24\x65", + 0xb2 => "\x24\x66", 0xb3 => "\x24\x67", 0xb4 => "\x24\x68", + 0xb5 => "\x24\x69", 0xb6 => "\x27\x76", 0xb7 => "\x27\x77", + 0xb8 => "\x27\x78", 0xb9 => "\x27\x79", 0xba => "\x27\x7a", + 0xbb => "\x27\x7b", 0xbc => "\x27\x7c", 0xbd => "\x27\x7d", + 0xbe => "\x27\x7e", 0xbf => "\x27\x7f", 0xc0 => "\x27\x80", + 0xc1 => "\x27\x81", 0xc2 => "\x27\x82", 0xc3 => "\x27\x83", + 0xc4 => "\x27\x84", 0xc5 => "\x27\x85", 0xc6 => "\x27\x86", + 0xc7 => "\x27\x87", 0xc8 => "\x27\x88", 0xc9 => "\x27\x89", + 0xca => "\x27\x8a", 0xcb => "\x27\x8b", 0xcc => "\x27\x8c", + 0xcd => "\x27\x8d", 0xce => "\x27\x8e", 0xcf => "\x27\x8f", + 0xd0 => "\x27\x90", 0xd1 => "\x27\x91", 0xd2 => "\x27\x92", + 0xd3 => "\x27\x93", 0xd4 => "\x27\x94", 0xd5 => "\x21\x92", + 0xd6 => "\x21\x94", 0xd7 => "\x21\x95", 0xd8 => "\x27\x98", + 0xd9 => "\x27\x99", 0xda => "\x27\x9a", 0xdb => "\x27\x9b", + 0xdc => "\x27\x9c", 0xdd => "\x27\x9d", 0xde => "\x27\x9e", + 0xdf => "\x27\x9f", 0xe0 => "\x27\xa0", 0xe1 => "\x27\xa1", + 0xe2 => "\x27\xa2", 0xe3 => "\x27\xa3", 0xe4 => "\x27\xa4", + 0xe5 => "\x27\xa5", 0xe6 => "\x27\xa6", 0xe7 => "\x27\xa7", + 0xe8 => "\x27\xa8", 0xe9 => "\x27\xa9", 0xea => "\x27\xaa", + 0xeb => "\x27\xab", 0xec => "\x27\xac", 0xed => "\x27\xad", + 0xee => "\x27\xae", 0xef => "\x27\xaf", 0xf1 => "\x27\xb1", + 0xf2 => "\x27\xb2", 0xf3 => "\x27\xb3", 0xf4 => "\x27\xb4", + 0xf5 => "\x27\xb5", 0xf6 => "\x27\xb6", 0xf7 => "\x27\xb7", + 0xf8 => "\x27\xb8", 0xf9 => "\x27\xb9", 0xfa => "\x27\xba", + 0xfb => "\x27\xbb", 0xfc => "\x27\xbc", 0xfd => "\x27\xbd", + 0xfe => "\x27\xbe"); + + + + /**** Public Interface ****/ + + + /* Object Lifecycle */ + + /** + * Object constructor + */ + public function __construct() + { + parent::__construct(); + + + /* Object properties */ + + /* The font names are stored internally as Unicode UTF-16BE-encoded + * strings. Since this information is static, save unnecessary trips + * through iconv() and just use pre-encoded hexidecimal strings. + */ + $this->_fontNames[Zend_Pdf_Font::NAME_COPYRIGHT]['en'] = + "\x00\x43\x00\x6f\x00\x70\x00\x79\x00\x72\x00\x69\x00\x67\x00\x68\x00" + . "\x74\x00\x20\x00\x28\x00\x63\x00\x29\x00\x20\x00\x31\x00\x39\x00" + . "\x38\x00\x35\x00\x2c\x00\x20\x00\x31\x00\x39\x00\x38\x00\x37\x00" + . "\x2c\x00\x20\x00\x31\x00\x39\x00\x38\x00\x38\x00\x2c\x00\x20\x00" + . "\x31\x00\x39\x00\x38\x00\x39\x00\x2c\x00\x20\x00\x31\x00\x39\x00" + . "\x39\x00\x37\x00\x20\x00\x41\x00\x64\x00\x6f\x00\x62\x00\x65\x00" + . "\x20\x00\x53\x00\x79\x00\x73\x00\x74\x00\x65\x00\x6d\x00\x73\x00" + . "\x20\x00\x49\x00\x6e\x00\x63\x00\x6f\x00\x72\x00\x70\x00\x6f\x00" + . "\x72\x00\x61\x00\x74\x00\x65\x00\x64\x00\x2e\x00\x20\x00\x41\x00" + . "\x6c\x00\x6c\x00\x20\x00\x52\x00\x69\x00\x67\x00\x68\x00\x74\x00" + . "\x73\x00\x20\x00\x52\x00\x65\x00\x73\x00\x65\x00\x72\x00\x76\x00" + . "\x65\x00\x64\x00\x2e\x00\x49\x00\x54\x00\x43\x00\x20\x00\x5a\x00" + . "\x61\x00\x70\x00\x66\x00\x20\x00\x44\x00\x69\x00\x6e\x00\x67\x00" + . "\x62\x00\x61\x00\x74\x00\x73\x00\x20\x00\x69\x00\x73\x00\x20\x00" + . "\x61\x00\x20\x00\x72\x00\x65\x00\x67\x00\x69\x00\x73\x00\x74\x00" + . "\x65\x00\x72\x00\x65\x00\x64\x00\x20\x00\x74\x00\x72\x00\x61\x00" + . "\x64\x00\x65\x00\x6d\x00\x61\x00\x72\x00\x6b\x00\x20\x00\x6f\x00" + . "\x66\x00\x20\x00\x49\x00\x6e\x00\x74\x00\x65\x00\x72\x00\x6e\x00" + . "\x61\x00\x74\x00\x69\x00\x6f\x00\x6e\x00\x61\x00\x6c\x00\x20\x00" + . "\x54\x00\x79\x00\x70\x00\x65\x00\x66\x00\x61\x00\x63\x00\x65\x00" + . "\x20\x00\x43\x00\x6f\x00\x72\x00\x70\x00\x6f\x00\x72\x00\x61\x00" + . "\x74\x00\x69\x00\x6f\x00\x6e\x00\x2e"; + $this->_fontNames[Zend_Pdf_Font::NAME_FAMILY]['en'] = + "\x00\x5a\x00\x61\x00\x70\x00\x66\x00\x44\x00\x69\x00\x6e\x00\x67\x00" + . "\x62\x00\x61\x00\x74\x00\x73"; + $this->_fontNames[Zend_Pdf_Font::NAME_STYLE]['en'] = + "\x00\x4d\x00\x65\x00\x64\x00\x69\x00\x75\x00\x6d"; + $this->_fontNames[Zend_Pdf_Font::NAME_ID]['en'] = + "\x00\x34\x00\x33\x00\x30\x00\x38\x00\x32"; + $this->_fontNames[Zend_Pdf_Font::NAME_FULL]['en'] = + "\x00\x5a\x00\x61\x00\x70\x00\x66\x00\x44\x00\x69\x00\x6e\x00\x67\x00" + . "\x62\x00\x61\x00\x74\x00\x73\x00\x20\x00\x4d\x00\x65\x00\x64\x00" + . "\x69\x00\x75\x00\x6d"; + $this->_fontNames[Zend_Pdf_Font::NAME_VERSION]['en'] = + "\x00\x30\x00\x30\x00\x32\x00\x2e\x00\x30\x00\x30\x00\x30"; + $this->_fontNames[Zend_Pdf_Font::NAME_POSTSCRIPT]['en'] = + "\x00\x5a\x00\x61\x00\x70\x00\x66\x00\x44\x00\x69\x00\x6e\x00\x67\x00" + . "\x62\x00\x61\x00\x74\x00\x73"; + + $this->_isBold = false; + $this->_isItalic = false; + $this->_isMonospaced = false; + + $this->_underlinePosition = -100; + $this->_underlineThickness = 50; + $this->_strikePosition = 225; + $this->_strikeThickness = 50; + + $this->_unitsPerEm = 1000; + + $this->_ascent = 1000; + $this->_descent = 0; + $this->_lineGap = 200; + + /* The glyph numbers assigned here are synthetic; they do not match the + * actual glyph numbers used by the font. This is not a big deal though + * since this data never makes it to the PDF file. It is only used + * internally for layout calculations. + */ + $this->_glyphWidths = array( + 0x00 => 0x01f4, 0x01 => 0x0116, 0x02 => 0x03ce, 0x03 => 0x03c1, + 0x04 => 0x03ce, 0x05 => 0x03d4, 0x06 => 0x02cf, 0x07 => 0x0315, + 0x08 => 0x0316, 0x09 => 0x0317, 0x0a => 0x02b2, 0x0b => 0x03c0, + 0x0c => 0x03ab, 0x0d => 0x0225, 0x0e => 0x0357, 0x0f => 0x038f, + 0x10 => 0x03a5, 0x11 => 0x038f, 0x12 => 0x03b1, 0x13 => 0x03ce, + 0x14 => 0x02f3, 0x15 => 0x034e, 0x16 => 0x02fa, 0x17 => 0x02f9, + 0x18 => 0x023b, 0x19 => 0x02a5, 0x1a => 0x02fb, 0x1b => 0x02f8, + 0x1c => 0x02f7, 0x1d => 0x02f2, 0x1e => 0x01ee, 0x1f => 0x0228, + 0x20 => 0x0219, 0x21 => 0x0241, 0x22 => 0x02b4, 0x23 => 0x0312, + 0x24 => 0x0314, 0x25 => 0x0314, 0x26 => 0x0316, 0x27 => 0x0319, + 0x28 => 0x031a, 0x29 => 0x0330, 0x2a => 0x0337, 0x2b => 0x0315, + 0x2c => 0x0349, 0x2d => 0x0337, 0x2e => 0x0341, 0x2f => 0x0330, + 0x30 => 0x033f, 0x31 => 0x039b, 0x32 => 0x02e8, 0x33 => 0x02d3, + 0x34 => 0x02ed, 0x35 => 0x0316, 0x36 => 0x0318, 0x37 => 0x02b7, + 0x38 => 0x0308, 0x39 => 0x0300, 0x3a => 0x0318, 0x3b => 0x02f7, + 0x3c => 0x02c3, 0x3d => 0x02c4, 0x3e => 0x02aa, 0x3f => 0x02bd, + 0x40 => 0x033a, 0x41 => 0x032f, 0x42 => 0x0315, 0x43 => 0x0315, + 0x44 => 0x02c3, 0x45 => 0x02af, 0x46 => 0x02b8, 0x47 => 0x02b1, + 0x48 => 0x0312, 0x49 => 0x0313, 0x4a => 0x02c9, 0x4b => 0x0317, + 0x4c => 0x0311, 0x4d => 0x0317, 0x4e => 0x0369, 0x4f => 0x02f9, + 0x50 => 0x02fa, 0x51 => 0x02fa, 0x52 => 0x02f7, 0x53 => 0x02f7, + 0x54 => 0x037c, 0x55 => 0x037c, 0x56 => 0x0314, 0x57 => 0x0310, + 0x58 => 0x01b6, 0x59 => 0x8a, 0x5a => 0x0115, 0x5b => 0x019f, + 0x5c => 0x0188, 0x5d => 0x0188, 0x5e => 0x029c, 0x5f => 0x029c, + 0x60 => 0x0186, 0x61 => 0x0186, 0x62 => 0x013d, 0x63 => 0x013d, + 0x64 => 0x0114, 0x65 => 0x0114, 0x66 => 0x01fd, 0x67 => 0x01fd, + 0x68 => 0x019a, 0x69 => 0x019a, 0x6a => 0xea, 0x6b => 0xea, + 0x6c => 0x014e, 0x6d => 0x014e, 0x6e => 0x02dc, 0x6f => 0x0220, + 0x70 => 0x0220, 0x71 => 0x038e, 0x72 => 0x029b, 0x73 => 0x02f8, + 0x74 => 0x02f8, 0x75 => 0x0308, 0x76 => 0x0253, 0x77 => 0x02b6, + 0x78 => 0x0272, 0x79 => 0x0314, 0x7a => 0x0314, 0x7b => 0x0314, + 0x7c => 0x0314, 0x7d => 0x0314, 0x7e => 0x0314, 0x7f => 0x0314, + 0x80 => 0x0314, 0x81 => 0x0314, 0x82 => 0x0314, 0x83 => 0x0314, + 0x84 => 0x0314, 0x85 => 0x0314, 0x86 => 0x0314, 0x87 => 0x0314, + 0x88 => 0x0314, 0x89 => 0x0314, 0x8a => 0x0314, 0x8b => 0x0314, + 0x8c => 0x0314, 0x8d => 0x0314, 0x8e => 0x0314, 0x8f => 0x0314, + 0x90 => 0x0314, 0x91 => 0x0314, 0x92 => 0x0314, 0x93 => 0x0314, + 0x94 => 0x0314, 0x95 => 0x0314, 0x96 => 0x0314, 0x97 => 0x0314, + 0x98 => 0x0314, 0x99 => 0x0314, 0x9a => 0x0314, 0x9b => 0x0314, + 0x9c => 0x0314, 0x9d => 0x0314, 0x9e => 0x0314, 0x9f => 0x0314, + 0xa0 => 0x0314, 0xa1 => 0x037e, 0xa2 => 0x0346, 0xa3 => 0x03f8, + 0xa4 => 0x01ca, 0xa5 => 0x02ec, 0xa6 => 0x039c, 0xa7 => 0x02ec, + 0xa8 => 0x0396, 0xa9 => 0x039f, 0xaa => 0x03a0, 0xab => 0x03a0, + 0xac => 0x0342, 0xad => 0x0369, 0xae => 0x033c, 0xaf => 0x039c, + 0xb0 => 0x039c, 0xb1 => 0x0395, 0xb2 => 0x03a2, 0xb3 => 0x03a3, + 0xb4 => 0x01cf, 0xb5 => 0x0373, 0xb6 => 0x0344, 0xb7 => 0x0344, + 0xb8 => 0x0363, 0xb9 => 0x0363, 0xba => 0x02b8, 0xbb => 0x02b8, + 0xbc => 0x036a, 0xbd => 0x036a, 0xbe => 0x02f8, 0xbf => 0x03b2, + 0xc0 => 0x0303, 0xc1 => 0x0361, 0xc2 => 0x0303, 0xc3 => 0x0378, + 0xc4 => 0x03c7, 0xc5 => 0x0378, 0xc6 => 0x033f, 0xc7 => 0x0369, + 0xc8 => 0x039f, 0xc9 => 0x03ca, 0xca => 0x0396); + + /* The cmap table is similarly synthesized. + */ + $cmapData = array( + 0x20 => 0x01, 0x2701 => 0x02, 0x2702 => 0x03, 0x2703 => 0x04, + 0x2704 => 0x05, 0x260e => 0x06, 0x2706 => 0x07, 0x2707 => 0x08, + 0x2708 => 0x09, 0x2709 => 0x0a, 0x261b => 0x0b, 0x261e => 0x0c, + 0x270c => 0x0d, 0x270d => 0x0e, 0x270e => 0x0f, 0x270f => 0x10, + 0x2710 => 0x11, 0x2711 => 0x12, 0x2712 => 0x13, 0x2713 => 0x14, + 0x2714 => 0x15, 0x2715 => 0x16, 0x2716 => 0x17, 0x2717 => 0x18, + 0x2718 => 0x19, 0x2719 => 0x1a, 0x271a => 0x1b, 0x271b => 0x1c, + 0x271c => 0x1d, 0x271d => 0x1e, 0x271e => 0x1f, 0x271f => 0x20, + 0x2720 => 0x21, 0x2721 => 0x22, 0x2722 => 0x23, 0x2723 => 0x24, + 0x2724 => 0x25, 0x2725 => 0x26, 0x2726 => 0x27, 0x2727 => 0x28, + 0x2605 => 0x29, 0x2729 => 0x2a, 0x272a => 0x2b, 0x272b => 0x2c, + 0x272c => 0x2d, 0x272d => 0x2e, 0x272e => 0x2f, 0x272f => 0x30, + 0x2730 => 0x31, 0x2731 => 0x32, 0x2732 => 0x33, 0x2733 => 0x34, + 0x2734 => 0x35, 0x2735 => 0x36, 0x2736 => 0x37, 0x2737 => 0x38, + 0x2738 => 0x39, 0x2739 => 0x3a, 0x273a => 0x3b, 0x273b => 0x3c, + 0x273c => 0x3d, 0x273d => 0x3e, 0x273e => 0x3f, 0x273f => 0x40, + 0x2740 => 0x41, 0x2741 => 0x42, 0x2742 => 0x43, 0x2743 => 0x44, + 0x2744 => 0x45, 0x2745 => 0x46, 0x2746 => 0x47, 0x2747 => 0x48, + 0x2748 => 0x49, 0x2749 => 0x4a, 0x274a => 0x4b, 0x274b => 0x4c, + 0x25cf => 0x4d, 0x274d => 0x4e, 0x25a0 => 0x4f, 0x274f => 0x50, + 0x2750 => 0x51, 0x2751 => 0x52, 0x2752 => 0x53, 0x25b2 => 0x54, + 0x25bc => 0x55, 0x25c6 => 0x56, 0x2756 => 0x57, 0x25d7 => 0x58, + 0x2758 => 0x59, 0x2759 => 0x5a, 0x275a => 0x5b, 0x275b => 0x5c, + 0x275c => 0x5d, 0x275d => 0x5e, 0x275e => 0x5f, 0x2768 => 0x60, + 0x2769 => 0x61, 0x276a => 0x62, 0x276b => 0x63, 0x276c => 0x64, + 0x276d => 0x65, 0x276e => 0x66, 0x276f => 0x67, 0x2770 => 0x68, + 0x2771 => 0x69, 0x2772 => 0x6a, 0x2773 => 0x6b, 0x2774 => 0x6c, + 0x2775 => 0x6d, 0x2761 => 0x6e, 0x2762 => 0x6f, 0x2763 => 0x70, + 0x2764 => 0x71, 0x2765 => 0x72, 0x2766 => 0x73, 0x2767 => 0x74, + 0x2663 => 0x75, 0x2666 => 0x76, 0x2665 => 0x77, 0x2660 => 0x78, + 0x2460 => 0x79, 0x2461 => 0x7a, 0x2462 => 0x7b, 0x2463 => 0x7c, + 0x2464 => 0x7d, 0x2465 => 0x7e, 0x2466 => 0x7f, 0x2467 => 0x80, + 0x2468 => 0x81, 0x2469 => 0x82, 0x2776 => 0x83, 0x2777 => 0x84, + 0x2778 => 0x85, 0x2779 => 0x86, 0x277a => 0x87, 0x277b => 0x88, + 0x277c => 0x89, 0x277d => 0x8a, 0x277e => 0x8b, 0x277f => 0x8c, + 0x2780 => 0x8d, 0x2781 => 0x8e, 0x2782 => 0x8f, 0x2783 => 0x90, + 0x2784 => 0x91, 0x2785 => 0x92, 0x2786 => 0x93, 0x2787 => 0x94, + 0x2788 => 0x95, 0x2789 => 0x96, 0x278a => 0x97, 0x278b => 0x98, + 0x278c => 0x99, 0x278d => 0x9a, 0x278e => 0x9b, 0x278f => 0x9c, + 0x2790 => 0x9d, 0x2791 => 0x9e, 0x2792 => 0x9f, 0x2793 => 0xa0, + 0x2794 => 0xa1, 0x2192 => 0xa2, 0x2194 => 0xa3, 0x2195 => 0xa4, + 0x2798 => 0xa5, 0x2799 => 0xa6, 0x279a => 0xa7, 0x279b => 0xa8, + 0x279c => 0xa9, 0x279d => 0xaa, 0x279e => 0xab, 0x279f => 0xac, + 0x27a0 => 0xad, 0x27a1 => 0xae, 0x27a2 => 0xaf, 0x27a3 => 0xb0, + 0x27a4 => 0xb1, 0x27a5 => 0xb2, 0x27a6 => 0xb3, 0x27a7 => 0xb4, + 0x27a8 => 0xb5, 0x27a9 => 0xb6, 0x27aa => 0xb7, 0x27ab => 0xb8, + 0x27ac => 0xb9, 0x27ad => 0xba, 0x27ae => 0xbb, 0x27af => 0xbc, + 0x27b1 => 0xbd, 0x27b2 => 0xbe, 0x27b3 => 0xbf, 0x27b4 => 0xc0, + 0x27b5 => 0xc1, 0x27b6 => 0xc2, 0x27b7 => 0xc3, 0x27b8 => 0xc4, + 0x27b9 => 0xc5, 0x27ba => 0xc6, 0x27bb => 0xc7, 0x27bc => 0xc8, + 0x27bd => 0xc9, 0x27be => 0xca); + $this->_cmap = Zend_Pdf_Cmap::cmapWithTypeData( + Zend_Pdf_Cmap::TYPE_BYTE_ENCODING_STATIC, $cmapData); + + + /* Resource dictionary */ + + /* The resource dictionary for the standard fonts is sparse because PDF + * viewers already have all of the metrics data. We only need to provide + * the font name and encoding method. + */ + $this->_resource->BaseFont = new Zend_Pdf_Element_Name('ZapfDingbats'); + + /* This font has a built-in custom character encoding method. Don't + * override with WinAnsi like the other built-in fonts or else it will + * not work as expected. + */ + $this->_resource->Encoding = null; + } + + + /* Information and Conversion Methods */ + + /** + * Convert string encoding from local encoding to font encoding. Overridden + * to defeat the conversion behavior for this ornamental font. + * + * @param string $string + * @param string $charEncoding Character encoding of source text. + * @return string + */ + public function encodeString($string, $charEncoding) + { + /* This isn't the optimal time to perform this conversion, but it must + * live here until the remainder of the layout code is completed. This, + * and the $charEncoding parameter, will go away soon... + */ + if ($charEncoding != 'UTF-16BE') { + $string = iconv($charEncoding, 'UTF-16BE', $string); + } + /** + * @todo Properly handle characters encoded as surrogate pairs. + */ + $encodedString = ''; + for ($i = 0; $i < strlen($string); $i++) { + $characterCode = (ord($string[$i++]) << 8) | ord($string[$i]); + if (isset($this->_toFontEncoding[$characterCode])) { + $encodedString .= $this->_toFontEncoding[$characterCode]; + } else { + /* For now, mimic the behavior in Zend_Pdf_Font::encodeString() + * where unknown characters are removed completely. This is not + * perfect, but we should be consistent. In a future revision, + * we will use the well-known substitution character 0x1a + * (Control-Z). + */ + } + } + return $encodedString; + } + + /** + * Convert string encoding from font encoding to local encoding. Overridden + * to defeat the conversion behavior for this ornamental font. + * + * @param string $string + * @param string $charEncoding Character encoding of resulting text. + * @return string + */ + public function decodeString($string, $charEncoding) + { + $decodedString = ''; + for ($i = 0; $i < strlen($string); $i++) { + $characterCode = ord($string[$i]); + if (isset($this->_fromFontEncoding[$characterCode])) { + $decodedString .= $this->_fromFontEncoding[$characterCode]; + } else { + /* For now, mimic the behavior in Zend_Pdf_Font::encodeString() + * where unknown characters are removed completely. This is not + * perfect, but we should be consistent. In a future revision, + * we will use the Unicode substitution character (U+FFFD). + */ + } + } + if ($charEncoding != 'UTF-16BE') { + $decodedString = iconv('UTF-16BE', $charEncoding, $decodedString); + } + return $decodedString; + } + + /** + * Converts a Latin-encoded string that fakes the font's internal encoding + * to the proper Unicode characters, in UTF-16BE encoding. + * + * Used to maintain backwards compatibility with the 20 year-old legacy + * method of using this font, which is still employed by recent versions of + * some popular word processors. + * + * Note that using this method adds overhead due to the additional + * character conversion. Don't use this for new code; it is more efficient + * to use the appropriate Unicode characters directly. + * + * @param string $string + * @param string $charEncoding (optional) Character encoding of source + * string. Defaults to current locale. + * @return string + */ + public function toUnicode($string, $charEncoding = '') + { + /* When using these faked strings, the closest match to the font's + * internal encoding is ISO-8859-1. + */ + if ($charEncoding != 'ISO-8859-1') { + $string = iconv($charEncoding, 'ISO-8859-1', $string); + } + return $this->decodeString($string, 'UTF-16BE'); + } + +} diff --git a/libs/Zend/Pdf/Resource/Font/Type0.php b/libs/Zend/Pdf/Resource/Font/Type0.php new file mode 100644 index 0000000..c320f82 --- /dev/null +++ b/libs/Zend/Pdf/Resource/Font/Type0.php @@ -0,0 +1,256 @@ +> def' . "\n" + . '/CMapName /Adobe-Identity-UCS def ' . "\n" + . '/CMapType 2 def ' . "\n" + . '1 begincodespacerange' . "\n" + . '<0000> ' . "\n" + . 'endcodespacerange ' . "\n" + . '1 beginbfrange ' . "\n" + . '<0000> <0000> ' . "\n" + . 'endbfrange ' . "\n" + . 'endcmap ' . "\n" + . 'CMapName currentdict /CMap defineresource pop ' . "\n" + . 'end ' + . 'end '; + } + + /** + * Object constructor + * + */ + 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; + + + $this->_fontNames = $descendantFont->getFontNames(); + + $this->_isBold = $descendantFont->isBold(); + $this->_isItalic = $descendantFont->isItalic(); + $this->_isMonospaced = $descendantFont->isMonospace(); + + $this->_underlinePosition = $descendantFont->getUnderlinePosition(); + $this->_underlineThickness = $descendantFont->getUnderlineThickness(); + $this->_strikePosition = $descendantFont->getStrikePosition(); + $this->_strikeThickness = $descendantFont->getStrikeThickness(); + + $this->_unitsPerEm = $descendantFont->getUnitsPerEm(); + + $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 + * + * See also {@link glyphNumberForCharacter()}. + * + * @param array $characterCodes Array of Unicode character codes (code points). + * @return array Array of glyph numbers. + */ + public function glyphNumbersForCharacters($characterCodes) + { + return $characterCodes; + } + + /** + * 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 + * + * @param integer $characterCode Unicode character code (code point). + * @return integer Glyph number. + */ + public function glyphNumberForCharacter($characterCode) + { + 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. + * + * Since no one font will contain glyphs for the entire Unicode character + * range, this method can be used to help locate a suitable font when the + * actual contents of the string are not known. + * + * Note that some fonts lie about the characters they support. Additionally, + * fonts don't usually contain glyphs for control characters such as tabs + * and line breaks, so it is rare that you will get back a full 1.0 score. + * The resulting value should be considered informational only. + * + * @param string $string + * @param string $charEncoding (optional) Character encoding of source text. + * If omitted, uses 'current locale'. + * @return float + */ + public function getCoveredPercentage($string, $charEncoding = '') + { + return $this->_descendantFont->getCoveredPercentage($string, $charEncoding); + } + + /** + * Returns the widths of the glyphs. + * + * The widths are expressed in the font's glyph space. You are responsible + * for converting to user space as necessary. See {@link unitsPerEm()}. + * + * Throws an exception if the glyph number is out of range. + * + * See also {@link widthForGlyph()}. + * + * @param array &$glyphNumbers Array of glyph numbers. + * @return array Array of glyph widths (integers). + * @throws Zend_Pdf_Exception + */ + public function widthsForGlyphs($glyphNumbers) + { + return $this->_descendantFont->widthsForChars($glyphNumbers); + } + + /** + * Returns the width of the glyph. + * + * Like {@link widthsForGlyphs()} but used for one glyph at a time. + * + * @param integer $glyphNumber + * @return integer + * @throws Zend_Pdf_Exception + */ + public function widthForGlyph($glyphNumber) + { + return $this->_descendantFont->widthForChar($glyphNumber); + } + + /** + * Convert string to the font encoding. + * + * The method is used to prepare string for text drawing operators + * + * @param string $string + * @param string $charEncoding Character encoding of source text. + * @return string + */ + public function encodeString($string, $charEncoding) + { + return iconv($charEncoding, 'UTF-16BE', $string); + } + + /** + * Convert string from the font encoding. + * + * The method is used to convert strings retrieved from existing content streams + * + * @param string $string + * @param string $charEncoding Character encoding of resulting text. + * @return string + */ + public function decodeString($string, $charEncoding) + { + return iconv('UTF-16BE', $charEncoding, $string); + } +} diff --git a/libs/Zend/Pdf/Resource/Image.php b/libs/Zend/Pdf/Resource/Image.php new file mode 100644 index 0000000..3c1aaa7 --- /dev/null +++ b/libs/Zend/Pdf/Resource/Image.php @@ -0,0 +1,78 @@ +_resource->dictionary->Type = new Zend_Pdf_Element_Name('XObject'); + $this->_resource->dictionary->Subtype = new Zend_Pdf_Element_Name('Image'); + } + /** + * get the height in pixels of the image + * + * @return integer + */ + abstract public function getPixelHeight(); + + /** + * get the width in pixels of the image + * + * @return integer + */ + abstract public function getPixelWidth(); + + /** + * gets an associative array of information about an image + * + * @return array + */ + abstract public function getProperties(); +} + diff --git a/libs/Zend/Pdf/Resource/Image/Jpeg.php b/libs/Zend/Pdf/Resource/Image/Jpeg.php new file mode 100644 index 0000000..9e822df --- /dev/null +++ b/libs/Zend/Pdf/Resource/Image/Jpeg.php @@ -0,0 +1,138 @@ +_resource->dictionary; + $imageDictionary->Width = new Zend_Pdf_Element_Numeric($imageInfo[0]); + $imageDictionary->Height = new Zend_Pdf_Element_Numeric($imageInfo[1]); + $imageDictionary->ColorSpace = new Zend_Pdf_Element_Name($colorSpace); + $imageDictionary->BitsPerComponent = new Zend_Pdf_Element_Numeric($imageInfo['bits']); + if ($imageInfo[2] == IMAGETYPE_JPEG) { + $imageDictionary->Filter = new Zend_Pdf_Element_Name('DCTDecode'); + } else if ($imageInfo[2] == IMAGETYPE_JPEG2000){ + $imageDictionary->Filter = new Zend_Pdf_Element_Name('JPXDecode'); + } + + if (($imageFile = @fopen($imageFileName, 'rb')) === false ) { + throw new Zend_Pdf_Exception( "Can not open '$imageFileName' file for reading." ); + } + $byteCount = filesize($imageFileName); + $this->_resource->value = ''; + while ( $byteCount > 0 && ($nextBlock = fread($imageFile, $byteCount)) != false ) { + $this->_resource->value .= $nextBlock; + $byteCount -= strlen($nextBlock); + } + fclose($imageFile); + $this->_resource->skipFilters(); + + $this->_width = $imageInfo[0]; + $this->_height = $imageInfo[1]; + $this->_imageProperties = array(); + $this->_imageProperties['bitDepth'] = $imageInfo['bits']; + $this->_imageProperties['jpegImageType'] = $imageInfo[2]; + $this->_imageProperties['jpegColorType'] = $imageInfo['channels']; + } + + /** + * Image width + */ + public function getPixelWidth() { + return $this->_width; + } + + /** + * Image height + */ + public function getPixelHeight() { + return $this->_height; + } + + /** + * Image properties + */ + public function getProperties() { + return $this->_imageProperties; + } +} + diff --git a/libs/Zend/Pdf/Resource/Image/Png.php b/libs/Zend/Pdf/Resource/Image/Png.php new file mode 100644 index 0000000..f229a85 --- /dev/null +++ b/libs/Zend/Pdf/Resource/Image/Png.php @@ -0,0 +1,359 @@ +_width = $width; + $this->_height = $height; + $this->_imageProperties = array(); + $this->_imageProperties['bitDepth'] = $bits; + $this->_imageProperties['pngColorType'] = $color; + $this->_imageProperties['pngFilterType'] = $prefilter; + $this->_imageProperties['pngCompressionType'] = $compression; + $this->_imageProperties['pngInterlacingType'] = $interlacing; + + fseek($imageFile, 4, SEEK_CUR); //4 Byte Ending Sequence + $imageData = ''; + + /* + * The following loop processes PNG chunks. 4 Byte Longs are packed first give the chunk length + * followed by the chunk signature, a four byte code. IDAT and IEND are manditory in any PNG. + */ + while(($chunkLengthBytes = fread($imageFile, 4)) !== false) { + $chunkLengthtmp = unpack('Ni', $chunkLengthBytes); + $chunkLength = $chunkLengthtmp['i']; + $chunkType = fread($imageFile, 4); + switch($chunkType) { + case 'IDAT': //Image Data + /* + * Reads the actual image data from the PNG file. Since we know at this point that the compression + * strategy is the default strategy, we also know that this data is Zip compressed. We will either copy + * the data directly to the PDF and provide the correct FlateDecode predictor, or decompress the data + * decode the filters and output the data as a raw pixel map. + */ + $imageData .= fread($imageFile, $chunkLength); + fseek($imageFile, 4, SEEK_CUR); + break; + + case 'PLTE': //Palette + $paletteData = fread($imageFile, $chunkLength); + fseek($imageFile, 4, SEEK_CUR); + break; + + case 'tRNS': //Basic (non-alpha channel) transparency. + $trnsData = fread($imageFile, $chunkLength); + 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)); + 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)); + 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)); + } + break; + + case Zend_Pdf_Resource_Image_Png::PNG_CHANNEL_GRAY_ALPHA: + // Fall through to the next case + + case Zend_Pdf_Resource_Image_Png::PNG_CHANNEL_RGB_ALPHA: + throw new Zend_Pdf_Exception( "tRNS chunk illegal for Alpha Channel Images" ); + break; + } + fseek($imageFile, 4, SEEK_CUR); //4 Byte Ending Sequence + break; + + case 'IEND'; + break 2; //End the loop too + + default: + fseek($imageFile, $chunkLength + 4, SEEK_CUR); //Skip the section + break; + } + } + fclose($imageFile); + + $compressed = true; + $imageDataTmp = ''; + $smaskData = ''; + switch ($color) { + case Zend_Pdf_Resource_Image_Png::PNG_CHANNEL_RGB: + $colorSpace = new Zend_Pdf_Element_Name('DeviceRGB'); + break; + + case Zend_Pdf_Resource_Image_Png::PNG_CHANNEL_GRAY: + $colorSpace = new Zend_Pdf_Element_Name('DeviceGray'); + break; + + case Zend_Pdf_Resource_Image_Png::PNG_CHANNEL_INDEXED: + if(empty($paletteData)) { + throw new Zend_Pdf_Exception( "PNG Corruption: No palette data read for indexed type PNG." ); + } + $colorSpace = new Zend_Pdf_Element_Array(); + $colorSpace->items[] = new Zend_Pdf_Element_Name('Indexed'); + $colorSpace->items[] = new Zend_Pdf_Element_Name('DeviceRGB'); + $colorSpace->items[] = new Zend_Pdf_Element_Numeric((strlen($paletteData)/3-1)); + $paletteObject = $this->_objectFactory->newObject(new Zend_Pdf_Element_String_Binary($paletteData)); + $colorSpace->items[] = $paletteObject; + break; + + case Zend_Pdf_Resource_Image_Png::PNG_CHANNEL_GRAY_ALPHA: + /* + * To decode PNG's with alpha data we must create two images from one. One image will contain the Gray data + * the other will contain the Gray transparency overlay data. The former will become the object data and the latter + * will become the Shadow Mask (SMask). + */ + if($bits > 8) { + throw new Zend_Pdf_Exception("Alpha PNGs with bit depth > 8 are not yet supported"); + } + + $colorSpace = new Zend_Pdf_Element_Name('DeviceGray'); + + $decodingObjFactory = Zend_Pdf_ElementFactory::createFactory(1); + $decodingStream = $decodingObjFactory->newStreamObject($imageData); + $decodingStream->dictionary->Filter = new Zend_Pdf_Element_Name('FlateDecode'); + $decodingStream->dictionary->DecodeParms = new Zend_Pdf_Element_Dictionary(); + $decodingStream->dictionary->DecodeParms->Predictor = new Zend_Pdf_Element_Numeric(15); + $decodingStream->dictionary->DecodeParms->Columns = new Zend_Pdf_Element_Numeric($width); + $decodingStream->dictionary->DecodeParms->Colors = new Zend_Pdf_Element_Numeric(2); //GreyAlpha + $decodingStream->dictionary->DecodeParms->BitsPerComponent = new Zend_Pdf_Element_Numeric($bits); + $decodingStream->skipFilters(); + + $pngDataRawDecoded = $decodingStream->value; + + //Iterate every pixel and copy out gray data and alpha channel (this will be slow) + for($pixel = 0, $pixelcount = ($width * $height); $pixel < $pixelcount; $pixel++) { + $imageDataTmp .= $pngDataRawDecoded[($pixel*2)]; + $smaskData .= $pngDataRawDecoded[($pixel*2)+1]; + } + $compressed = false; + $imageData = $imageDataTmp; //Overwrite image data with the gray channel without alpha + break; + + case Zend_Pdf_Resource_Image_Png::PNG_CHANNEL_RGB_ALPHA: + /* + * To decode PNG's with alpha data we must create two images from one. One image will contain the RGB data + * the other will contain the Gray transparency overlay data. The former will become the object data and the latter + * will become the Shadow Mask (SMask). + */ + if($bits > 8) { + throw new Zend_Pdf_Exception("Alpha PNGs with bit depth > 8 are not yet supported"); + } + + $colorSpace = new Zend_Pdf_Element_Name('DeviceRGB'); + + $decodingObjFactory = Zend_Pdf_ElementFactory::createFactory(1); + $decodingStream = $decodingObjFactory->newStreamObject($imageData); + $decodingStream->dictionary->Filter = new Zend_Pdf_Element_Name('FlateDecode'); + $decodingStream->dictionary->DecodeParms = new Zend_Pdf_Element_Dictionary(); + $decodingStream->dictionary->DecodeParms->Predictor = new Zend_Pdf_Element_Numeric(15); + $decodingStream->dictionary->DecodeParms->Columns = new Zend_Pdf_Element_Numeric($width); + $decodingStream->dictionary->DecodeParms->Colors = new Zend_Pdf_Element_Numeric(4); //RGBA + $decodingStream->dictionary->DecodeParms->BitsPerComponent = new Zend_Pdf_Element_Numeric($bits); + $decodingStream->skipFilters(); + + $pngDataRawDecoded = $decodingStream->value; + + //Iterate every pixel and copy out rgb data and alpha channel (this will be slow) + for($pixel = 0, $pixelcount = ($width * $height); $pixel < $pixelcount; $pixel++) { + $imageDataTmp .= $pngDataRawDecoded[($pixel*4)+0] . $pngDataRawDecoded[($pixel*4)+1] . $pngDataRawDecoded[($pixel*4)+2]; + $smaskData .= $pngDataRawDecoded[($pixel*4)+3]; + } + + $compressed = false; + $imageData = $imageDataTmp; //Overwrite image data with the RGB channel without alpha + break; + + default: + throw new Zend_Pdf_Exception( "PNG Corruption: Invalid color space." ); + } + + if(empty($imageData)) { + throw new Zend_Pdf_Exception( "Corrupt PNG Image. Mandatory IDAT chunk not found." ); + } + + $imageDictionary = $this->_resource->dictionary; + if(!empty($smaskData)) { + /* + * 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->BitsPerComponent = new Zend_Pdf_Element_Numeric($bits); + $imageDictionary->SMask = $smaskStream; + + // Encode stream with FlateDecode filter + $smaskStreamDecodeParms = array(); + $smaskStreamDecodeParms['Predictor'] = new Zend_Pdf_Element_Numeric(15); + $smaskStreamDecodeParms['Columns'] = new Zend_Pdf_Element_Numeric($width); + $smaskStreamDecodeParms['Colors'] = new Zend_Pdf_Element_Numeric(1); + $smaskStreamDecodeParms['BitsPerComponent'] = new Zend_Pdf_Element_Numeric(8); + $smaskStream->dictionary->DecodeParms = new Zend_Pdf_Element_Dictionary($smaskStreamDecodeParms); + $smaskStream->dictionary->Filter = new Zend_Pdf_Element_Name('FlateDecode'); + } + + if(!empty($transparencyData)) { + //This is experimental and not properly tested. + $imageDictionary->Mask = new Zend_Pdf_Element_Array($transparencyData); + } + + $imageDictionary->Width = new Zend_Pdf_Element_Numeric($width); + $imageDictionary->Height = new Zend_Pdf_Element_Numeric($height); + $imageDictionary->ColorSpace = $colorSpace; + $imageDictionary->BitsPerComponent = new Zend_Pdf_Element_Numeric($bits); + $imageDictionary->Filter = new Zend_Pdf_Element_Name('FlateDecode'); + + $decodeParms = array(); + $decodeParms['Predictor'] = new Zend_Pdf_Element_Numeric(15); // Optimal prediction + $decodeParms['Columns'] = new Zend_Pdf_Element_Numeric($width); + $decodeParms['Colors'] = new Zend_Pdf_Element_Numeric((($color==Zend_Pdf_Resource_Image_Png::PNG_CHANNEL_RGB || $color==Zend_Pdf_Resource_Image_Png::PNG_CHANNEL_RGB_ALPHA)?(3):(1))); + $decodeParms['BitsPerComponent'] = new Zend_Pdf_Element_Numeric($bits); + $imageDictionary->DecodeParms = new Zend_Pdf_Element_Dictionary($decodeParms); + + //Include only the image IDAT section data. + $this->_resource->value = $imageData; + + //Skip double compression + if ($compressed) { + $this->_resource->skipFilters(); + } + } + + /** + * Image width + */ + public function getPixelWidth() { + return $this->_width; + } + + /** + * Image height + */ + public function getPixelHeight() { + return $this->_height; + } + + /** + * Image properties + */ + public function getProperties() { + return $this->_imageProperties; + } +} diff --git a/libs/Zend/Pdf/Resource/Image/Tiff.php b/libs/Zend/Pdf/Resource/Image/Tiff.php new file mode 100644 index 0000000..315b4c1 --- /dev/null +++ b/libs/Zend/Pdf/Resource/Image/Tiff.php @@ -0,0 +1,431 @@ +_endianType)) { + throw new Zend_Pdf_Exception("The unpackBytes function can only be used after the endianness of the file is known"); + } + switch($type) { + case Zend_Pdf_Resource_Image_Tiff::UNPACK_TYPE_BYTE: + $format = 'C'; + $unpacked = unpack($format, $bytes); + return $unpacked[1]; + break; + case Zend_Pdf_Resource_Image_Tiff::UNPACK_TYPE_SHORT: + $format = ($this->_endianType == Zend_Pdf_Resource_Image_Tiff::TIFF_ENDIAN_LITTLE)?'v':'n'; + $unpacked = unpack($format, $bytes); + return $unpacked[1]; + break; + case Zend_Pdf_Resource_Image_Tiff::UNPACK_TYPE_LONG: + $format = ($this->_endianType == Zend_Pdf_Resource_Image_Tiff::TIFF_ENDIAN_LITTLE)?'V':'N'; + $unpacked = unpack($format, $bytes); + return $unpacked[1]; + break; + case Zend_Pdf_Resource_Image_Tiff::UNPACK_TYPE_RATIONAL: + $format = ($this->_endianType == Zend_Pdf_Resource_Image_Tiff::TIFF_ENDIAN_LITTLE)?'V2':'N2'; + $unpacked = unpack($format, $bytes); + return ($unpacked[1]/$unpacked[2]); + break; + } + } + + /** + * Object constructor + * + * @param string $imageFileName + * @throws Zend_Pdf_Exception + */ + public function __construct($imageFileName) + { + if (($imageFile = @fopen($imageFileName, 'rb')) === false ) { + throw new Zend_Pdf_Exception( "Can not open '$imageFileName' file for reading." ); + } + + $byteOrderIndicator = fread($imageFile, 2); + if($byteOrderIndicator == 'II') { + $this->_endianType = Zend_Pdf_Resource_Image_Tiff::TIFF_ENDIAN_LITTLE; + } else if($byteOrderIndicator == 'MM') { + $this->_endianType = Zend_Pdf_Resource_Image_Tiff::TIFF_ENDIAN_BIG; + } else { + throw new Zend_Pdf_Exception( "Not a tiff file or Tiff corrupt. No byte order indication found" ); + } + + $version = $this->unpackBytes(Zend_Pdf_Resource_Image_Tiff::UNPACK_TYPE_SHORT, fread($imageFile, 2)); + + if($version != 42) { + throw new Zend_Pdf_Exception( "Not a tiff file or Tiff corrupt. Incorrect version number." ); + } + $ifdOffset = $this->unpackBytes(Zend_Pdf_Resource_Image_Tiff::UNPACK_TYPE_LONG, fread($imageFile, 4)); + + $fileStats = fstat($imageFile); + $this->_fileSize = $fileStats['size']; + + /* + * Tiff files are stored as a series of Image File Directories (IFD) each direcctory + * has a specific number of entries each 12 bytes in length. At the end of the directories + * is four bytes pointing to the offset of the next IFD. + */ + + while($ifdOffset > 0) { + if(fseek($imageFile, $ifdOffset, SEEK_SET) == -1 || $ifdOffset+2 >= $this->_fileSize) { + throw new Zend_Pdf_Exception("Could not seek to the image file directory as indexed by the file. Likely cause is TIFF corruption. Offset: ". $ifdOffset); + } + + $numDirEntries = $this->unpackBytes(Zend_Pdf_Resource_Image_Tiff::UNPACK_TYPE_SHORT, fread($imageFile, 2)); + + /* + * Since we now know how many entries are in this (IFD) we can extract the data. + * The format of a TIFF directory entry is: + * + * 2 bytes (short) tag code; See TIFF_TAG constants at the top for supported values. (There are many more in the spec) + * 2 bytes (short) field type + * 4 bytes (long) number of values, or value count. + * 4 bytes (mixed) data if the data will fit into 4 bytes or an offset if the data is too large. + */ + for($dirEntryIdx = 1; $dirEntryIdx <= $numDirEntries; $dirEntryIdx++) { + $tag = $this->unpackBytes(Zend_Pdf_Resource_Image_Tiff::UNPACK_TYPE_SHORT, fread($imageFile, 2)); + $fieldType = $this->unpackBytes(Zend_Pdf_Resource_Image_Tiff::UNPACK_TYPE_SHORT, fread($imageFile, 2)); + $valueCount = $this->unpackBytes(Zend_Pdf_Resource_Image_Tiff::UNPACK_TYPE_LONG, fread($imageFile, 4)); + + switch($fieldType) { + case Zend_Pdf_Resource_Image_Tiff::TIFF_FIELD_TYPE_BYTE: + $fieldLength = $valueCount; + break; + case Zend_Pdf_Resource_Image_Tiff::TIFF_FIELD_TYPE_ASCII: + $fieldLength = $valueCount; + break; + case Zend_Pdf_Resource_Image_Tiff::TIFF_FIELD_TYPE_SHORT: + $fieldLength = $valueCount * 2; + break; + case Zend_Pdf_Resource_Image_Tiff::TIFF_FIELD_TYPE_LONG: + $fieldLength = $valueCount * 4; + break; + case Zend_Pdf_Resource_Image_Tiff::TIFF_FIELD_TYPE_RATIONAL: + $fieldLength = $valueCount * 8; + break; + default: + $fieldLength = $valueCount; + } + + $offsetBytes = fread($imageFile, 4); + + if($fieldLength <= 4) { + switch($fieldType) { + case Zend_Pdf_Resource_Image_Tiff::TIFF_FIELD_TYPE_BYTE: + $value = $this->unpackBytes(Zend_Pdf_Resource_Image_Tiff::UNPACK_TYPE_BYTE, $offsetBytes); + break; + case Zend_Pdf_Resource_Image_Tiff::TIFF_FIELD_TYPE_ASCII: + //Fall through to next case + case Zend_Pdf_Resource_Image_Tiff::TIFF_FIELD_TYPE_LONG: + $value = $this->unpackBytes(Zend_Pdf_Resource_Image_Tiff::UNPACK_TYPE_LONG, $offsetBytes); + break; + case Zend_Pdf_Resource_Image_Tiff::TIFF_FIELD_TYPE_SHORT: + //Fall through to next case + default: + $value = $this->unpackBytes(Zend_Pdf_Resource_Image_Tiff::UNPACK_TYPE_SHORT, $offsetBytes); + } + } else { + $refOffset = $this->unpackBytes(Zend_Pdf_Resource_Image_Tiff::UNPACK_TYPE_LONG, $offsetBytes); + } + /* + * Linear tag processing is probably not the best way to do this. I've processed the tags according to the + * Tiff 6 specification and make some assumptions about when tags will be < 4 bytes and fit into $value and when + * they will be > 4 bytes and require seek/extraction of the offset. Same goes for extracting arrays of data, like + * the data offsets and length. This should be fixed in the future. + */ + switch($tag) { + case Zend_Pdf_Resource_Image_Tiff::TIFF_TAG_IMAGE_WIDTH: + $this->_width = $value; + break; + case Zend_Pdf_Resource_Image_Tiff::TIFF_TAG_IMAGE_LENGTH: + $this->_height = $value; + break; + case Zend_Pdf_Resource_Image_Tiff::TIFF_TAG_BITS_PER_SAMPLE: + if($valueCount>1) { + $fp = ftell($imageFile); + fseek($imageFile, $refOffset, SEEK_SET); + $this->_bitsPerSample = $this->unpackBytes(Zend_Pdf_Resource_Image_Tiff::UNPACK_TYPE_SHORT, fread($imageFile, 2)); + fseek($imageFile, $fp, SEEK_SET); + } else { + $this->_bitsPerSample = $value; + } + break; + case Zend_Pdf_Resource_Image_Tiff::TIFF_TAG_COMPRESSION: + $this->_compression = $value; + switch($value) { + case Zend_Pdf_Resource_Image_Tiff::TIFF_COMPRESSION_UNCOMPRESSED: + $this->_filter = 'None'; + break; + case Zend_Pdf_Resource_Image_Tiff::TIFF_COMPRESSION_CCITT1D: + //Fall through to next case + case Zend_Pdf_Resource_Image_Tiff::TIFF_COMPRESSION_GROUP_3_FAX: + //Fall through to next case + case Zend_Pdf_Resource_Image_Tiff::TIFF_COMPRESSION_GROUP_4_FAX: + $this->_filter = 'CCITTFaxDecode'; + throw new Zend_Pdf_Exception("CCITTFaxDecode Compression Mode Not Currently Supported"); + break; + case Zend_Pdf_Resource_Image_Tiff::TIFF_COMPRESSION_LZW: + $this->_filter = 'LZWDecode'; + throw new Zend_Pdf_Exception("LZWDecode Compression Mode Not Currently Supported"); + break; + case Zend_Pdf_Resource_Image_Tiff::TIFF_COMPRESSION_JPEG: + $this->_filter = 'DCTDecode'; //Should work, doesnt... + throw new Zend_Pdf_Exception("JPEG Compression Mode Not Currently Supported"); + break; + case Zend_Pdf_Resource_Image_Tiff::TIFF_COMPRESSION_FLATE: + //fall through to next case + case Zend_Pdf_Resource_Image_Tiff::TIFF_COMPRESSION_FLATE_OBSOLETE_CODE: + $this->_filter = 'FlateDecode'; + throw new Zend_Pdf_Exception("ZIP/Flate Compression Mode Not Currently Supported"); + break; + case Zend_Pdf_Resource_Image_Tiff::TIFF_COMPRESSION_PACKBITS: + $this->_filter = 'RunLengthDecode'; + break; + } + break; + case Zend_Pdf_Resource_Image_Tiff::TIFF_TAG_PHOTOMETRIC_INTERPRETATION: + $this->_colorCode = $value; + $this->_whiteIsZero = false; + $this->_blackIsZero = false; + switch($value) { + case Zend_Pdf_Resource_Image_Tiff::TIFF_PHOTOMETRIC_INTERPRETATION_WHITE_IS_ZERO: + $this->_whiteIsZero = true; + $this->_colorSpace = 'DeviceGray'; + break; + case Zend_Pdf_Resource_Image_Tiff::TIFF_PHOTOMETRIC_INTERPRETATION_BLACK_IS_ZERO: + $this->_blackIsZero = true; + $this->_colorSpace = 'DeviceGray'; + break; + case Zend_Pdf_Resource_Image_Tiff::TIFF_PHOTOMETRIC_INTERPRETATION_YCBCR: + //fall through to next case + case Zend_Pdf_Resource_Image_Tiff::TIFF_PHOTOMETRIC_INTERPRETATION_RGB: + $this->_colorSpace = 'DeviceRGB'; + break; + case Zend_Pdf_Resource_Image_Tiff::TIFF_PHOTOMETRIC_INTERPRETATION_RGB_INDEXED: + $this->_colorSpace = 'Indexed'; + break; + case Zend_Pdf_Resource_Image_Tiff::TIFF_PHOTOMETRIC_INTERPRETATION_CMYK: + $this->_colorSpace = 'DeviceCMYK'; + break; + case Zend_Pdf_Resource_Image_Tiff::TIFF_PHOTOMETRIC_INTERPRETATION_CIELAB: + $this->_colorSpace = 'Lab'; + break; + default: + throw new Zend_Pdf_Exception('TIFF: Unknown or Unsupported Color Type: '. $value); + } + break; + case Zend_Pdf_Resource_Image_Tiff::TIFF_TAG_STRIP_OFFSETS: + if($valueCount>1) { + $format = ($this->_endianType == Zend_Pdf_Resource_Image_Tiff::TIFF_ENDIAN_LITTLE)?'V*':'N*'; + $fp = ftell($imageFile); + fseek($imageFile, $refOffset, SEEK_SET); + $stripOffsetsBytes = fread($imageFile, $fieldLength); + $this->_imageDataOffset = unpack($format, $stripOffsetsBytes); + fseek($imageFile, $fp, SEEK_SET); + } else { + $this->_imageDataOffset = $value; + } + break; + case Zend_Pdf_Resource_Image_Tiff::TIFF_TAG_STRIP_BYTE_COUNTS: + if($valueCount>1) { + $format = ($this->_endianType == Zend_Pdf_Resource_Image_Tiff::TIFF_ENDIAN_LITTLE)?'V*':'N*'; + $fp = ftell($imageFile); + fseek($imageFile, $refOffset, SEEK_SET); + $stripByteCountsBytes = fread($imageFile, $fieldLength); + $this->_imageDataLength = unpack($format, $stripByteCountsBytes); + fseek($imageFile, $fp, SEEK_SET); + } else { + $this->_imageDataLength = $value; + } + break; + default: + //For debugging. It should be harmless to ignore unknown tags, though there is some good info in them. + //echo "Unknown tag detected: ". $tag . " value: ". $value; + } + } + $ifdOffset = $this->unpackBytes(Zend_Pdf_Resource_Image_Tiff::UNPACK_TYPE_LONG, fread($imageFile, 4)); + } + + if(!isset($this->_imageDataOffset) || !isset($this->_imageDataLength)) { + throw new Zend_Pdf_Exception("TIFF: The image processed did not contain image data as expected."); + } + + $imageDataBytes = ''; + if(is_array($this->_imageDataOffset)) { + if(!is_array($this->_imageDataLength)) { + throw new Zend_Pdf_Exception("TIFF: The image contained multiple data offsets but not multiple data lengths. Tiff may be corrupt."); + } + foreach($this->_imageDataOffset as $idx => $offset) { + fseek($imageFile, $this->_imageDataOffset[$idx], SEEK_SET); + $imageDataBytes .= fread($imageFile, $this->_imageDataLength[$idx]); + } + } else { + fseek($imageFile, $this->_imageDataOffset, SEEK_SET); + $imageDataBytes = fread($imageFile, $this->_imageDataLength); + } + if($imageDataBytes === '') { + throw new Zend_Pdf_Exception("TIFF: No data. Image Corruption"); + } + + fclose($imageFile); + + parent::__construct(); + + $imageDictionary = $this->_resource->dictionary; + if(!isset($this->_width) || !isset($this->_width)) { + throw new Zend_Pdf_Exception("Problem reading tiff file. Tiff is probably corrupt."); + } + + $this->_imageProperties = array(); + $this->_imageProperties['bitDepth'] = $this->_bitsPerSample; + $this->_imageProperties['fileSize'] = $this->_fileSize; + $this->_imageProperties['TIFFendianType'] = $this->_endianType; + $this->_imageProperties['TIFFcompressionType'] = $this->_compression; + $this->_imageProperties['TIFFwhiteIsZero'] = $this->_whiteIsZero; + $this->_imageProperties['TIFFblackIsZero'] = $this->_blackIsZero; + $this->_imageProperties['TIFFcolorCode'] = $this->_colorCode; + $this->_imageProperties['TIFFimageDataOffset'] = $this->_imageDataOffset; + $this->_imageProperties['TIFFimageDataLength'] = $this->_imageDataLength; + $this->_imageProperties['PDFfilter'] = $this->_filter; + $this->_imageProperties['PDFcolorSpace'] = $this->_colorSpace; + + $imageDictionary->Width = new Zend_Pdf_Element_Numeric($this->_width); + if($this->_whiteIsZero === true) { + $imageDictionary->Decode = new Zend_Pdf_Element_Array(array(new Zend_Pdf_Element_Numeric(1), new Zend_Pdf_Element_Numeric(0))); + } + $imageDictionary->Height = new Zend_Pdf_Element_Numeric($this->_height); + $imageDictionary->ColorSpace = new Zend_Pdf_Element_Name($this->_colorSpace); + $imageDictionary->BitsPerComponent = new Zend_Pdf_Element_Numeric($this->_bitsPerSample); + if(isset($this->_filter) && $this->_filter != 'None') { + $imageDictionary->Filter = new Zend_Pdf_Element_Name($this->_filter); + } + + $this->_resource->value = $imageDataBytes; + $this->_resource->skipFilters(); + } + /** + * Image width (defined in Zend_Pdf_Resource_Image_Interface) + */ + public function getPixelWidth() { + return $this->_width; + } + + /** + * Image height (defined in Zend_Pdf_Resource_Image_Interface) + */ + public function getPixelHeight() { + return $this->_height; + } + + /** + * Image properties (defined in Zend_Pdf_Resource_Image_Interface) + */ + public function getProperties() { + return $this->_imageProperties; + } +} + diff --git a/libs/Zend/Pdf/Resource/ImageFactory.php b/libs/Zend/Pdf/Resource/ImageFactory.php new file mode 100644 index 0000000..89bc708 --- /dev/null +++ b/libs/Zend/Pdf/Resource/ImageFactory.php @@ -0,0 +1,68 @@ +_context = null; + $this->_elements = array(); + $this->_objFactory = null; + } + + /** + * Character with code $chCode is white space + * + * @param integer $chCode + * @return boolean + */ + public static function isWhiteSpace($chCode) + { + if ($chCode == 0x00 || // null character + $chCode == 0x09 || // Tab + $chCode == 0x0A || // Line feed + $chCode == 0x0C || // Form Feed + $chCode == 0x0D || // Carriage return + $chCode == 0x20 // Space + ) { + return true; + } else { + return false; + } + } + + + /** + * Character with code $chCode is a delimiter character + * + * @param integer $chCode + * @return boolean + */ + public static function isDelimiter($chCode ) + { + if ($chCode == 0x28 || // '(' + $chCode == 0x29 || // ')' + $chCode == 0x3C || // '<' + $chCode == 0x3E || // '>' + $chCode == 0x5B || // '[' + $chCode == 0x5D || // ']' + $chCode == 0x7B || // '{' + $chCode == 0x7D || // '}' + $chCode == 0x2F || // '/' + $chCode == 0x25 // '%' + ) { + return true; + } else { + return false; + } + } + + + /** + * Skip white space + * + * @param boolean $skipComment + */ + 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; + } + } + } + + + /** + * Skip comment + */ + public function skipComment() + { + while ($this->offset < strlen($this->data)) + { + if (ord($this->data[$this->offset]) != 0x0A || // Line feed + ord($this->data[$this->offset]) != 0x0d // Carriage return + ) { + $this->offset++; + } else { + return; + } + } + } + + + /** + * Read comment line + * + * @return string + */ + public function readComment() + { + $this->skipWhiteSpace(false); + + /** Check if it's a comment line */ + if ($this->data[$this->offset] != '%') { + return ''; + } + + for ($start = $this->offset; + $this->offset < strlen($this->data); + $this->offset++) { + if (ord($this->data[$this->offset]) == 0x0A || // Line feed + ord($this->data[$this->offset]) == 0x0d // Carriage return + ) { + break; + } + } + + return substr($this->data, $start, $this->offset-$start); + } + + + /** + * Returns next lexeme from a pdf stream + * + * @return string + */ + public function readLexeme() + { + $this->skipWhiteSpace(); + + if ($this->offset >= strlen($this->data)) { + return ''; + } + + $start = $this->offset; + + 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]; + } + } else { + while ( ($this->offset < strlen($this->data)) && + (!self::isDelimiter( ord($this->data[$this->offset]) )) && + (!self::isWhiteSpace( ord($this->data[$this->offset]) )) ) { + $this->offset++; + } + + return substr($this->data, $start, $this->offset - $start); + } + } + + + /** + * Read elemental object from a PDF stream + * + * @return Zend_Pdf_Element + * @throws Zend_Pdf_Exception + */ + public function readElement($nextLexeme = null) + { + if ($nextLexeme === null) { + $nextLexeme = $this->readLexeme(); + } + + /** + * Note: readElement() method is a public method and could be invoked from other classes. + * If readElement() is used not by Zend_Pdf_StringParser::getObject() method, then we should not care + * about _elements member management. + */ + switch ($nextLexeme) { + case '(': + return ($this->_elements[] = $this->_readString()); + + case '<': + return ($this->_elements[] = $this->_readBinaryString()); + + case '/': + return ($this->_elements[] = new Zend_Pdf_Element_Name( + Zend_Pdf_Element_Name::unescape( $this->readLexeme() ) + )); + + case '[': + return ($this->_elements[] = $this->_readArray()); + + case '<<': + return ($this->_elements[] = $this->_readDictionary()); + + case ')': + // fall through to next case + case '>': + // fall through to next case + case ']': + // fall through to next case + case '>>': + // fall through to next case + case '{': + // fall through to next case + case '}': + throw new Zend_Pdf_Exception(sprintf('PDF file syntax error. Offset - 0x%X.', + $this->offset)); + + default: + if (strcasecmp($nextLexeme, 'true') == 0) { + return ($this->_elements[] = new Zend_Pdf_Element_Boolean(true)); + } else if (strcasecmp($nextLexeme, 'false') == 0) { + return ($this->_elements[] = new Zend_Pdf_Element_Boolean(false)); + } else if (strcasecmp($nextLexeme, 'null') == 0) { + return ($this->_elements[] = new Zend_Pdf_Element_Null()); + } + + $ref = $this->_readReference($nextLexeme); + if ($ref !== null) { + return ($this->_elements[] = $ref); + } + + return ($this->_elements[] = $this->_readNumeric($nextLexeme)); + } + } + + + /** + * Read string PDF object + * Also reads trailing ')' from a pdf stream + * + * @return Zend_Pdf_Element_String + * @throws Zend_Pdf_Exception + */ + private function _readString() + { + $start = $this->offset; + $openedBrackets = 1; + + while ($this->offset < strlen($this->data)) { + switch (ord( $this->data[$this->offset] )) { + case 0x28: // '(' - opened bracket in the string, needs balanced pair. + $openedBrackets++; + break; + + case 0x29: // ')' - pair to the opened bracket + $openedBrackets--; + break; + + case 0x5C: // '\\' - escape sequence, skip next char from a check + $this->offset++; + } + + $this->offset++; + if ($openedBrackets == 0) { + break; // end of string + } + } + if ($openedBrackets != 0) { + 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) )); + } + + + /** + * Read binary string PDF object + * Also reads trailing '>' from a pdf stream + * + * @return Zend_Pdf_Element_String_Binary + * @throws Zend_Pdf_Exception + */ + private function _readBinaryString() + { + $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)); + } + } + throw new Zend_Pdf_Exception(sprintf('PDF file syntax error. Unexpected end of file while binary string reading. Offset - 0x%X. \'>\' expected.', $start)); + } + + + /** + * Read array PDF object + * Also reads trailing ']' from a pdf stream + * + * @return Zend_Pdf_Element_Array + * @throws Zend_Pdf_Exception + */ + private function _readArray() + { + $elements = array(); + + while ( strlen($nextLexeme = $this->readLexeme()) != 0 ) { + if ($nextLexeme != ']') { + $elements[] = $this->readElement($nextLexeme); + } else { + return new Zend_Pdf_Element_Array($elements); + } + } + + throw new Zend_Pdf_Exception(sprintf('PDF file syntax error. Unexpected end of file while array reading. Offset - 0x%X. \']\' expected.', $this->offset)); + } + + + /** + * Read dictionary PDF object + * Also reads trailing '>>' from a pdf stream + * + * @return Zend_Pdf_Element_Dictionary + * @throws Zend_Pdf_Exception + */ + private function _readDictionary() + { + $dictionary = new Zend_Pdf_Element_Dictionary(); + + while ( strlen($nextLexeme = $this->readLexeme()) != 0 ) { + if ($nextLexeme != '>>') { + $nameStart = $this->offset - strlen($nextLexeme); + + $name = $this->readElement($nextLexeme); + $value = $this->readElement(); + + if (!$name instanceof Zend_Pdf_Element_Name) { + throw new Zend_Pdf_Exception(sprintf('PDF file syntax error. Name object expected while dictionary reading. Offset - 0x%X.', $nameStart)); + } + + $dictionary->add($name, $value); + } else { + return $dictionary; + } + } + + throw new Zend_Pdf_Exception(sprintf('PDF file syntax error. Unexpected end of file while dictionary reading. Offset - 0x%X. \'>>\' expected.', $this->offset)); + } + + + /** + * Read reference PDF object + * + * @param string $nextLexeme + * @return Zend_Pdf_Element_Reference + */ + private function _readReference($nextLexeme = null) + { + $start = $this->offset; + + if ($nextLexeme === null) { + $objNum = $this->readLexeme(); + } else { + $objNum = $nextLexeme; + } + if (!ctype_digit($objNum)) { // it's not a reference + $this->offset = $start; + return null; + } + + $genNum = $this->readLexeme(); + if (!ctype_digit($genNum)) { // it's not a reference + $this->offset = $start; + return null; + } + + $rMark = $this->readLexeme(); + if ($rMark != 'R') { // it's not a reference + $this->offset = $start; + return null; + } + + $ref = new Zend_Pdf_Element_Reference((int)$objNum, (int)$genNum, $this->_context, $this->_objFactory->resolve()); + + return $ref; + } + + + /** + * Read numeric PDF object + * + * @param string $nextLexeme + * @return Zend_Pdf_Element_Numeric + */ + private function _readNumeric($nextLexeme = null) + { + if ($nextLexeme === null) { + $nextLexeme = $this->readLexeme(); + } + + return new Zend_Pdf_Element_Numeric($nextLexeme); + } + + + /** + * Read inderect object from a PDF stream + * + * @param integer $offset + * @param Zend_Pdf_Element_Reference_Context $context + * @return Zend_Pdf_Element_Object + */ + public function getObject($offset, Zend_Pdf_Element_Reference_Context $context) + { + if ($offset === null ) { + return new Zend_Pdf_Element_Null(); + } + + // Save current offset to make getObject() reentrant + $offsetSave = $this->offset; + + $this->offset = $offset; + $this->_context = $context; + $this->_elements = array(); + + $objNum = $this->readLexeme(); + if (!ctype_digit($objNum)) { + 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)) { + 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') { + throw new Zend_Pdf_Exception(sprintf('PDF file syntax error. Offset - 0x%X. \'obj\' keyword expected.', $this->offset - strlen($objKeyword))); + } + + $objValue = $this->readElement(); + + $nextLexeme = $this->readLexeme(); + + if( $nextLexeme == 'endobj' ) { + /** + * Object is not generated by factory (thus it's not marked as modified object). + * But factory is assigned to the obect. + */ + $obj = new Zend_Pdf_Element_Object($objValue, (int)$objNum, (int)$genNum, $this->_objFactory->resolve()); + + foreach ($this->_elements as $element) { + $element->setParentObject($obj); + } + + // Restore offset value + $this->offset = $offsetSave; + + return $obj; + } + + /** + * It's a stream object + */ + if ($nextLexeme != 'stream') { + 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) { + 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))); + } + + /** + * References are automatically dereferenced at this moment. + */ + $streamLength = $objValue->Length->value; + + /** + * 'stream' keyword must be followed by either cr-lf sequence or lf character only. + * This restriction gives the possibility to recognize all cases exactly + */ + if ($this->data[$this->offset] == "\r" && + $this->data[$this->offset + 1] == "\n" ) { + $this->offset += 2; + } else if ($this->data[$this->offset] == "\n" ) { + $this->offset++; + } else { + 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))); + } + + $dataOffset = $this->offset; + + $this->offset += $streamLength; + + $nextLexeme = $this->readLexeme(); + if ($nextLexeme != 'endstream') { + 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') { + throw new Zend_Pdf_Exception(sprintf('PDF file syntax error. Offset - 0x%X. \'endobj\' keyword expected.', $this->offset - strlen($nextLexeme))); + } + + $obj = new Zend_Pdf_Element_Object_Stream(substr($this->data, + $dataOffset, + $streamLength), + (int)$objNum, + (int)$genNum, + $this->_objFactory->resolve(), + $objValue); + + foreach ($this->_elements as $element) { + $element->setParentObject($obj); + } + + // Restore offset value + $this->offset = $offsetSave; + + return $obj; + } + + + /** + * Get length of source string + * + * @return integer + */ + public function getLength() + { + return strlen($this->data); + } + + /** + * Get source string + * + * @return string + */ + public function getString() + { + return $this->data; + } + + + /** + * Parse integer value from a binary stream + * + * @param string $stream + * @param integer $offset + * @param integer $size + * @return integer + */ + public static function parseIntFromStream($stream, $offset, $size) + { + $value = 0; + for ($count = 0; $count < $size; $count++) { + $value *= 256; + $value += ord($stream[$offset + $count]); + } + + return $value; + } + + + + /** + * Set current context + * + * @param Zend_Pdf_Element_Reference_Context $context + */ + public function setContext(Zend_Pdf_Element_Reference_Context $context) + { + $this->_context = $context; + } + + /** + * Object constructor + * + * Note: PHP duplicates string, which is sent by value, only of it's updated. + * Thus we don't need to care about overhead + * + * @param string $pdfString + * @param Zend_Pdf_ElementFactory_Interface $factory + */ + public function __construct($source, Zend_Pdf_ElementFactory_Interface $factory) + { + $this->data = $source; + $this->_objFactory = $factory; + } +} diff --git a/libs/Zend/Pdf/Style.php b/libs/Zend/Pdf/Style.php new file mode 100644 index 0000000..bf899f1 --- /dev/null +++ b/libs/Zend/Pdf/Style.php @@ -0,0 +1,302 @@ +_fillColor = $anotherStyle->_fillColor; + $this->_color = $anotherStyle->_color; + $this->_lineWidth = $anotherStyle->_lineWidth; + $this->_lineDashingPattern = $anotherStyle->_lineDashingPattern; + $this->_lineDashingPhase = $anotherStyle->_lineDashingPhase; + $this->_font = $anotherStyle->_font; + $this->_fontSize = $anotherStyle->_fontSize; + } + } + + + /** + * Set fill color. + * + * @param Zend_Pdf_Color $color + */ + public function setFillColor(Zend_Pdf_Color $color) + { + $this->_fillColor = $color; + } + + /** + * Set line color. + * + * @param Zend_Pdf_Color $color + */ + public function setLineColor(Zend_Pdf_Color $color) + { + $this->_color = $color; + } + + /** + * Set line width. + * + * @param float $width + */ + public function setLineWidth($width) + { + $this->_lineWidth = new Zend_Pdf_Element_Numeric($width); + } + + + /** + * Set line dashing pattern + * + * @param array $pattern + * @param float $phase + */ + public function setLineDashingPattern($pattern, $phase = 0) + { + if ($pattern === Zend_Pdf_Page::LINE_DASHING_SOLID) { + $pattern = array(); + $phase = 0; + } + + $this->_lineDashingPattern = $pattern; + $this->_lineDashingPhase = new Zend_Pdf_Element_Numeric($phase); + } + + + /** + * Set current font. + * + * @param Zend_Pdf_Resource_Font $font + * @param float $fontSize + */ + public function setFont(Zend_Pdf_Resource_Font $font, $fontSize) + { + $this->_font = $font; + $this->_fontSize = $fontSize; + } + + /** + * Modify current font size + * + * @param float $fontSize + */ + public function setFontSize($fontSize) + { + $this->_fontSize = $fontSize; + } + + /** + * Get fill color. + * + * @return Zend_Pdf_Color|null + */ + public function getFillColor() + { + return $this->_fillColor; + } + + /** + * Get line color. + * + * @return Zend_Pdf_Color|null + */ + public function getLineColor() + { + return $this->_color; + } + + /** + * Get line width. + * + * @return float + */ + public function getLineWidth() + { + $this->_lineWidth->value; + } + + /** + * Get line dashing pattern + * + * @return array + */ + public function getLineDashingPattern() + { + return $this->_lineDashingPattern; + } + + + /** + * Get current font. + * + * @return Zend_Pdf_Resource_Font $font + */ + public function getFont() + { + return $this->_font; + } + + /** + * Get current font size + * + * @return float $fontSize + */ + public function getFontSize() + { + return $this->_fontSize; + } + + /** + * Get line dashing phase + * + * @return float + */ + public function getLineDashingPhase() + { + return $this->_lineDashingPhase->value; + } + + + /** + * Dump style to a string, which can be directly inserted into content stream + * + * @return string + */ + public function instructions() + { + $instructions = ''; + + if ($this->_fillColor !== null) { + $instructions .= $this->_fillColor->instructions(false); + } + + if ($this->_color !== null) { + $instructions .= $this->_color->instructions(true); + } + + if ($this->_lineWidth !== null) { + $instructions .= $this->_lineWidth->toString() . " w\n"; + } + + if ($this->_lineDashingPattern !== null) { + $dashPattern = new Zend_Pdf_Element_Array(); + + foreach ($this->_lineDashingPattern as $dashItem) { + $dashElement = new Zend_Pdf_Element_Numeric($dashItem); + $dashPattern->items[] = $dashElement; + } + + $instructions .= $dashPattern->toString() . ' ' + . $this->_lineDashingPhase->toString() . " d\n"; + } + + return $instructions; + } + +} + diff --git a/libs/Zend/Pdf/Trailer.php b/libs/Zend/Pdf/Trailer.php new file mode 100644 index 0000000..77480fd --- /dev/null +++ b/libs/Zend/Pdf/Trailer.php @@ -0,0 +1,127 @@ +_dict = $dict; + + foreach ($this->_dict->getKeys() as $dictKey) { + $this->_checkDictKey($dictKey); + } + } + + /** + * Get handler + * + * @param string $property + * @return mixed + */ + public function __get($property) + { + return $this->_dict->$property; + } + + /** + * Set handler + * + * @param string $property + * @param mixed $value + */ + public function __set($property, $value) + { + $this->_checkDictKey($property); + $this->_dict->$property = $value; + } + + /** + * Return string trailer representation + * + * @return string + */ + public function toString() + { + return "trailer\n" . $this->_dict->toString() . "\n"; + } + + + /** + * Get length of source PDF + * + * @return string + */ + abstract public function getPDFLength(); + + /** + * Get PDF String + * + * @return string + */ + abstract public function getPDFString(); + + /** + * Get header of free objects list + * Returns object number of last free object + * + * @return integer + */ + abstract public function getLastFreeObject(); +} diff --git a/libs/Zend/Pdf/Trailer/Generator.php b/libs/Zend/Pdf/Trailer/Generator.php new file mode 100644 index 0000000..ead7d35 --- /dev/null +++ b/libs/Zend/Pdf/Trailer/Generator.php @@ -0,0 +1,74 @@ +_context = $context; + $this->_prev = $prev; + } + + /** + * Setter for $this->_prev + * + * @param Zend_Pdf_Trailer_Keeper $prev + */ + public function setPrev(Zend_Pdf_Trailer_Keeper $prev) + { + $this->_prev = $prev; + } + + /** + * Getter for $this->_prev + * + * @return Zend_Pdf_Trailer + */ + public function getPrev() + { + return $this->_prev; + } + + /** + * Get length of source PDF + * + * @return string + */ + public function getPDFLength() + { + return $this->_context->getParser()->getLength(); + } + + /** + * Get PDF String + * + * @return string + */ + public function getPDFString() + { + return $this->_context->getParser()->getString(); + } + + /** + * Get reference table, which corresponds to the trailer. + * Proxy to the $_context member methad call + * + * @return Zend_Pdf_Element_Reference_Context + */ + public function getRefTable() + { + return $this->_context->getRefTable(); + } + + /** + * Get header of free objects list + * Returns object number of last free object + * + * @throws Zend_Pdf_Exception + * @return integer + */ + public function getLastFreeObject() + { + try { + $this->_context->getRefTable()->getNextFree('0 65535 R'); + } catch (Zend_Pdf_Exception $e) { + if ($e->getMessage() == 'Object not found.') { + /** + * Here is work around for some wrong generated PDFs. + * We have not found reference to the header of free object list, + * thus we treat it as there are no free objects. + */ + return 0; + } + + throw $e; + } + } +} diff --git a/libs/Zend/Pdf/UpdateInfoContainer.php b/libs/Zend/Pdf/UpdateInfoContainer.php new file mode 100644 index 0000000..4a9b509 --- /dev/null +++ b/libs/Zend/Pdf/UpdateInfoContainer.php @@ -0,0 +1,137 @@ +_objNum = $objNum; + $this->_genNum = $genNum; + $this->_isFree = $isFree; + + if ($dump !== null) { + if (strlen($dump) > 1024) { + $this->_dump = Zend_Pdf::getMemoryManager()->create($dump); + } else { + $this->_dump = $dump; + } + } + } + + + /** + * Get object number + * + * @return integer + */ + public function getObjNum() + { + return $this->_objNum; + } + + /** + * Get generation number + * + * @return integer + */ + public function getGenNum() + { + return $this->_genNum; + } + + /** + * Check, that object is free + * + * @return boolean + */ + public function isFree() + { + return $this->_isFree; + } + + /** + * Get string representation of the object + * + * @return string + */ + public function getObjectDump() + { + if ($this->_dump === null) { + return ''; + } + + if (is_string($this->_dump)) { + return $this->_dump; + } + + return $this->_dump->getRef(); + } +} + diff --git a/libs/Zend/ProgressBar.php b/libs/Zend/ProgressBar.php new file mode 100644 index 0000000..1ff8ddd --- /dev/null +++ b/libs/Zend/ProgressBar.php @@ -0,0 +1,205 @@ + $max) { + require_once 'Zend/ProgressBar/Exception.php'; + throw new Zend_ProgressBar_Exception('$max must be greater than $min'); + } + + $this->_min = (float) $min; + $this->_max = (float) $max; + $this->_current = (float) $min; + + // See if we have to open a session namespace + if ($persistenceNamespace !== null) { + require_once 'Zend/Session/Namespace.php'; + + $this->_persistenceNamespace = new Zend_Session_Namespace($persistenceNamespace); + } + + // Set adapter + $this->_adapter = $adapter; + + // Track the start time + $this->_startTime = time(); + + // See If a persistenceNamespace exists and handle accordingly + if ($this->_persistenceNamespace !== null) { + if (isset($this->_persistenceNamespace->isSet)) { + $this->_startTime = $this->_persistenceNamespace->startTime; + $this->_current = $this->_persistenceNamespace->current; + $this->_statusText = $this->_persistenceNamespace->statusText; + } else { + $this->_persistenceNamespace->isSet = true; + $this->_persistenceNamespace->startTime = $this->_startTime; + $this->_persistenceNamespace->current = $this->_current; + $this->_persistenceNamespace->statusText = $this->_statusText; + } + } else { + $this->update(); + } + } + + /** + * Get the current adapter + * + * @return Zend_ProgressBar_Adapter + */ + public function getAdapter() + { + return $this->_adapter; + } + + /** + * Update the progressbar + * + * @param float $value + * @param string $text + * @return void + */ + public function update($value = null, $text = null) + { + // Update value if given + if ($value !== null) { + $this->_current = min($this->_max, max($this->_min, $value)); + } + + // Update text if given + if ($text !== null) { + $this->_statusText = $text; + } + + // See if we have to update a namespace + if ($this->_persistenceNamespace !== null) { + $this->_persistenceNamespace->current = $this->_current; + $this->_persistenceNamespace->statusText = $this->_statusText; + } + + // Calculate percent + $percent = (float) ($this->_current - $this->_min) / ($this->_max - $this->_min); + + // Calculate ETA + $timeTaken = time() - $this->_startTime; + + if ($percent === .0) { + $timeRemaining = null; + } else { + $timeRemaining = round(((1 / $percent) * $timeTaken) - $timeTaken); + } + + // Poll the adapter + $this->_adapter->notify($this->_current, $this->_max, $percent, $timeTaken, $timeRemaining, $this->_statusText); + } + + /** + * Update the progressbar to the next value + * + * @param string $text + * @return void + */ + public function next($diff = 1, $text = null) + { + $this->update(max($this->_min, min($this->_max, $this->_current + $diff)), $text); + } + + /** + * Call the adapters finish() behaviour + * + * @return void + */ + public function finish() + { + if ($this->_persistenceNamespace !== null) { + unset($this->_persistenceNamespace->isSet); + } + + $this->_adapter->finish(); + } +} diff --git a/libs/Zend/ProgressBar/Adapter.php b/libs/Zend/ProgressBar/Adapter.php new file mode 100644 index 0000000..2adc6ca --- /dev/null +++ b/libs/Zend/ProgressBar/Adapter.php @@ -0,0 +1,113 @@ +setOptions($options); + } elseif ($options instanceof Zend_Config) { + $this->setConfig($options); + } + } + + /** + * Set options via a Zend_Config instance + * + * @param Zend_Config $config + * @return Zend_ProgressBar_Adapter + */ + public function setConfig(Zend_Config $config) + { + $this->setOptions($config->toArray()); + + return $this; + } + + /** + * Set options via an array + * + * @param array $options + * @return Zend_ProgressBar_Adapter + */ + public function setOptions(array $options) + { + foreach ($options as $key => $value) { + if (in_array(strtolower($key), $this->_skipOptions)) { + continue; + } + + $method = 'set' . ucfirst($key); + if (method_exists($this, $method)) { + $this->$method($value); + } + } + + return $this; + } + + /** + * Notify the adapter about an update + * + * @param float $current Current progress value + * @param float $max Max progress value + * @param flaot $percent Current percent value + * @param integer $timeTaken Taken time in seconds + * @param integer $timeRemaining Remaining time in seconds + * @param string $text Status text + * @return void + */ + abstract public function notify($current, $max, $percent, $timeTaken, $timeRemaining, $text); + + /** + * Called when the progress is explicitly finished + * + * @return void + */ + abstract public function finish(); +} diff --git a/libs/Zend/ProgressBar/Adapter/Console.php b/libs/Zend/ProgressBar/Adapter/Console.php new file mode 100644 index 0000000..e9acaa9 --- /dev/null +++ b/libs/Zend/ProgressBar/Adapter/Console.php @@ -0,0 +1,481 @@ +_stdout = fopen('php://stdout', 'w'); + } + + // Call parent constructor with options + parent::__construct($options); + + // Check if a width was set, else use auto width + if ($this->_width === null) { + $this->setWidth(); + } + } + + /** + * Close local stdout, when open + */ + public function __destruct() + { + if ($this->_stdout !== null) { + fclose($this->_stdout); + } + } + + /** + * Set the width of the progressbar + * + * @param integer $width + * @return Zend_ProgressBar_Adapter_Console + */ + public function setWidth($width = null) + { + if ($width === null || !is_integer($width)) { + if (substr(PHP_OS, 0, 3) === 'WIN') { + // We have to default to 79 on windows, because the windows + // terminal always has a fixed width of 80 characters and the + // cursor is counted to the line, else windows would line break + // after every update. + $this->_width = 79; + } else { + // Set the default width of 80 + $this->_width = 80; + + // Try to determine the width through stty + if (preg_match('#\d+ (\d+)#', @shell_exec('stty size'), $match) === 1) { + $this->_width = (int) $match[1]; + } else if (preg_match('#columns = (\d+);#', @shell_exec('stty'), $match) === 1) { + $this->_width = (int) $match[1]; + } + } + } else { + $this->_width = (int) $width; + } + + $this->_calculateBarWidth(); + + return $this; + } + + /** + * Set the elements to display with the progressbar + * + * @param array $elements + * @throws Zend_ProgressBar_Adapter_Exception When an invalid element is foudn in the array + * @return Zend_ProgressBar_Adapter_Console + */ + public function setElements(array $elements) + { + $allowedElements = array(self::ELEMENT_PERCENT, + self::ELEMENT_BAR, + self::ELEMENT_ETA, + self::ELEMENT_TEXT); + + if (count(array_diff($elements, $allowedElements)) > 0) { + require_once 'Zend/ProgressBar/Adapter/Exception.php'; + throw new Zend_ProgressBar_Adapter_Exception('Invalid element found in $elements array'); + } + + $this->_elements = $elements; + + $this->_calculateBarWidth(); + + return $this; + } + + /** + * Set the left-hand character for the bar + * + * @param string $char + * @throws Zend_ProgressBar_Adapter_Exception When character is empty + * @return Zend_ProgressBar_Adapter_Console + */ + public function setBarLeftChar($char) + { + if (empty($char)) { + require_once 'Zend/ProgressBar/Adapter/Exception.php'; + throw new Zend_ProgressBar_Adapter_Exception('Character may not be empty'); + } + + $this->_barLeftChar = (string) $char; + + return $this; + } + + /** + * Set the right-hand character for the bar + * + * @param string $char + * @throws Zend_ProgressBar_Adapter_Exception When character is empty + * @return Zend_ProgressBar_Adapter_Console + */ + public function setBarRightChar($char) + { + if (empty($char)) { + require_once 'Zend/ProgressBar/Adapter/Exception.php'; + throw new Zend_ProgressBar_Adapter_Exception('Character may not be empty'); + } + + $this->_barRightChar = (string) $char; + + return $this; + } + + /** + * Set the indicator character for the bar + * + * @param string $char + * @return Zend_ProgressBar_Adapter_Console + */ + public function setBarIndicatorChar($char) + { + $this->_barIndicatorChar = (string) $char; + + return $this; + } + + /** + * Set the width of the text element + * + * @param integer $width + * @return Zend_ProgressBar_Adapter_Console + */ + public function setTextWidth($width) + { + $this->_textWidth = (int) $width; + + $this->_calculateBarWidth(); + + return $this; + } + + /** + * Set the finish action + * + * @param string $action + * @throws Zend_ProgressBar_Adapter_Exception When an invalid action is specified + * @return Zend_ProgressBar_Adapter_Console + */ + public function setFinishAction($action) + { + $allowedActions = array(self::FINISH_ACTION_CLEAR_LINE, + self::FINISH_ACTION_EOL, + self::FINISH_ACTION_NONE); + + if (!in_array($action, $allowedActions)) { + require_once 'Zend/ProgressBar/Adapter/Exception.php'; + throw new Zend_ProgressBar_Adapter_Exception('Invalid finish action specified'); + } + + $this->_finishAction = $action; + + return $this; + } + + /** + * Defined by Zend_ProgressBar_Adapter_Interface + * + * @param float $current Current progress value + * @param float $max Max progress value + * @param flaot $percent Current percent value + * @param integer $timeTaken Taken time in seconds + * @param integer $timeRemaining Remaining time in seconds + * @param string $text Status text + * @return void + */ + public function notify($current, $max, $percent, $timeTaken, $timeRemaining, $text) + { + // See if we must clear the line + if ($this->_outputStarted) { + $data = str_repeat("\x08", $this->_width); + } else { + $data = ''; + $this->_outputStarted = true; + } + + // Build all elements + $renderedElements = array(); + + foreach ($this->_elements as $element) { + switch ($element) { + case self::ELEMENT_BAR: + $visualWidth = $this->_barWidth - 2; + $bar = '['; + + $indicatorWidth = strlen($this->_barIndicatorChar); + + $doneWidth = min($visualWidth - $indicatorWidth, round($visualWidth * $percent)); + if ($doneWidth > 0) { + $bar .= substr(str_repeat($this->_barLeftChar, ceil($doneWidth / strlen($this->_barLeftChar))), 0, $doneWidth); + } + + $bar .= $this->_barIndicatorChar; + + $leftWidth = $visualWidth - $doneWidth - $indicatorWidth; + if ($leftWidth > 0) { + $bar .= substr(str_repeat($this->_barRightChar, ceil($leftWidth / strlen($this->_barRightChar))), 0, $leftWidth); + } + + $bar .= ']'; + + $renderedElements[] = $bar; + break; + + case self::ELEMENT_PERCENT: + $renderedElements[] = str_pad(round($percent * 100), 3, ' ', STR_PAD_LEFT) . '%'; + break; + + case self::ELEMENT_ETA: + // In the first 5 seconds we don't get accurate results, + // this skipping technique is found in many progressbar + // implementations. + if ($timeTaken < 5) { + $renderedElements[] = str_repeat(' ', 12); + break; + } + + if ($timeRemaining === null || $timeRemaining > 86400) { + $etaFormatted = '??:??:??'; + } else { + $hours = floor($timeRemaining / 3600); + $minutes = floor(($timeRemaining % 3600) / 60); + $seconds = ($timeRemaining % 3600 % 60); + + $etaFormatted = sprintf('%02d:%02d:%02d', $hours, $minutes, $seconds); + } + + $renderedElements[] = 'ETA ' . $etaFormatted; + break; + + case self::ELEMENT_TEXT: + $renderedElements[] = str_pad(substr($text, 0, $this->_textWidth), $this->_textWidth, ' '); + break; + } + } + + $data .= implode(' ', $renderedElements); + + // Output line data + $this->_outputData($data); + } + + /** + * Defined by Zend_ProgressBar_Adapter_Interface + * + * @return void + */ + public function finish() + { + switch ($this->_finishAction) { + case self::FINISH_ACTION_EOL: + $this->_outputData(PHP_EOL); + break; + + case self::FINISH_ACTION_CLEAR_LINE: + if ($this->_outputStarted) { + $data = str_repeat("\x08", $this->_width) + . str_repeat(' ', $this->_width) + . str_repeat("\x08", $this->_width); + + $this->_outputData($data); + } + break; + + case self::FINISH_ACTION_NONE: + break; + } + } + + /** + * Calculate the bar width when other elements changed + * + * @return void + */ + protected function _calculateBarWidth() + { + if (in_array(self::ELEMENT_BAR, $this->_elements)) { + $barWidth = $this->_width; + + if (in_array(self::ELEMENT_PERCENT, $this->_elements)) { + $barWidth -= 4; + } + + if (in_array(self::ELEMENT_ETA, $this->_elements)) { + $barWidth -= 12; + } + + if (in_array(self::ELEMENT_TEXT, $this->_elements)) { + $barWidth -= $this->_textWidth; + } + + $this->_barWidth = $barWidth - (count($this->_elements) - 1); + } + } + + /** + * Outputs given data to STDOUT. + * + * This split-off is required for unit-testing. + * + * @param string $data + * @return void + */ + protected function _outputData($data) + { + if ($this->_stdout !== null) { + fwrite($this->_stdout, $data); + } else { + fwrite(STDOUT, $data); + } + } +} \ No newline at end of file diff --git a/libs/Zend/ProgressBar/Adapter/Exception.php b/libs/Zend/ProgressBar/Adapter/Exception.php new file mode 100644 index 0000000..54f9513 --- /dev/null +++ b/libs/Zend/ProgressBar/Adapter/Exception.php @@ -0,0 +1,38 @@ +_exitAfterSend = $exitAfterSend; + } + + /** + * Defined by Zend_ProgressBar_Adapter_Interface + * + * @param float $current Current progress value + * @param float $max Max progress value + * @param flaot $percent Current percent value + * @param integer $timeTaken Taken time in seconds + * @param integer $timeRemaining Remaining time in seconds + * @param string $text Status text + * @return void + */ + public function notify($current, $max, $percent, $timeTaken, $timeRemaining, $text) + { + $arguments = array( + 'current' => $current, + 'max' => $max, + 'percent' => ($percent * 100), + 'timeTaken' => $timeTaken, + 'timeRemaining' => $timeRemaining, + 'text' => $text, + 'finished' => false + ); + + $data = Zend_Json::encode($arguments); + + // Output the data + $this->_outputData($data); + } + + /** + * Defined by Zend_ProgressBar_Adapter_Interface + * + * @return void + */ + public function finish() + { + $data = Zend_Json::encode(array('finished' => true)); + + $this->_outputData($data); + } + + /** + * Outputs given data the user agent. + * + * This split-off is required for unit-testing. + * + * @param string $data + * @return void + */ + protected function _outputData($data) + { + echo $data; + + if ($this->_exitAfterSend) { + exit; + } + } +} diff --git a/libs/Zend/ProgressBar/Adapter/JsPush.php b/libs/Zend/ProgressBar/Adapter/JsPush.php new file mode 100644 index 0000000..12f75ce --- /dev/null +++ b/libs/Zend/ProgressBar/Adapter/JsPush.php @@ -0,0 +1,148 @@ +_updateMethodName = $methodName; + + return $this; + } + + /** + * Set the finish method name + * + * @param string $methodName + * @return Zend_ProgressBar_Adapter_JsPush + */ + public function setFinishMethodName($methodName) + { + $this->_finishMethodName = $methodName; + + return $this; + } + + /** + * Defined by Zend_ProgressBar_Adapter_Interface + * + * @param float $current Current progress value + * @param float $max Max progress value + * @param flaot $percent Current percent value + * @param integer $timeTaken Taken time in seconds + * @param integer $timeRemaining Remaining time in seconds + * @param string $text Status text + * @return void + */ + public function notify($current, $max, $percent, $timeTaken, $timeRemaining, $text) + { + $arguments = array( + 'current' => $current, + 'max' => $max, + 'percent' => ($percent * 100), + 'timeTaken' => $timeTaken, + 'timeRemaining' => $timeRemaining, + 'text' => $text + ); + + $data = ''; + + // Output the data + $this->_outputData($data); + } + + /** + * Defined by Zend_ProgressBar_Adapter_Interface + * + * @return void + */ + public function finish() + { + if ($this->_finishMethodName === null) { + return; + } + + $data = ''; + + $this->_outputData($data); + } + + /** + * Outputs given data the user agent. + * + * This split-off is required for unit-testing. + * + * @param string $data + * @return void + */ + protected function _outputData($data) + { + // 1024 padding is required for Safari, while 256 padding is required + // for Internet Explorer. The
    is required so Safari actually + // executes the +SCRIPT; + } + + $return = $reCaptchaOptions; + $return .= << + +HTML; + $return .= << + {$htmlBreak} + + +HTML; + + return $return; + } + + /** + * Post a solution to the verify server + * + * @param string $challengeField + * @param string $responseField + * @return Zend_Http_Response + * @throws Zend_Service_ReCaptcha_Exception + */ + protected function _post($challengeField, $responseField) + { + if ($this->_privateKey === null) { + /** @see Zend_Service_ReCaptcha_Exception */ + require_once 'Zend/Service/ReCaptcha/Exception.php'; + + throw new Zend_Service_ReCaptcha_Exception('Missing private key'); + } + + if ($this->_ip === null) { + /** @see Zend_Service_ReCaptcha_Exception */ + require_once 'Zend/Service/ReCaptcha/Exception.php'; + + throw new Zend_Service_ReCaptcha_Exception('Missing ip address'); + } + + if (empty($challengeField)) { + /** @see Zend_Service_ReCaptcha_Exception */ + require_once 'Zend/Service/ReCaptcha/Exception.php'; + throw new Zend_Service_ReCaptcha_Exception('Missing challenge field'); + } + + if (empty($responseField)) { + /** @see Zend_Service_ReCaptcha_Exception */ + require_once 'Zend/Service/ReCaptcha/Exception.php'; + + throw new Zend_Service_ReCaptcha_Exception('Missing response field'); + } + + /* Fetch an instance of the http client */ + $httpClient = self::getHttpClient(); + + $postParams = array('privatekey' => $this->_privateKey, + 'remoteip' => $this->_ip, + 'challenge' => $challengeField, + 'response' => $responseField); + + /* Make the POST and return the response */ + return $httpClient->setUri(self::VERIFY_SERVER) + ->setParameterPost($postParams) + ->request(Zend_Http_Client::POST); + } + + /** + * Verify the user input + * + * This method calls up the post method and returns a + * Zend_Service_ReCaptcha_Response object. + * + * @param string $challengeField + * @param string $responseField + * @return Zend_Service_ReCaptcha_Response + */ + public function verify($challengeField, $responseField) + { + $response = $this->_post($challengeField, $responseField); + + return new Zend_Service_ReCaptcha_Response(null, null, $response); + } +} diff --git a/libs/Zend/Service/ReCaptcha/Exception.php b/libs/Zend/Service/ReCaptcha/Exception.php new file mode 100644 index 0000000..8d54c32 --- /dev/null +++ b/libs/Zend/Service/ReCaptcha/Exception.php @@ -0,0 +1,36 @@ +_requireMcrypt(); + + /* If options is a Zend_Config object we want to convert it to an array so we can merge it with the default options */ + if ($options instanceof Zend_Config) { + $options = $options->toArray(); + } + + /* Merge if needed */ + if (is_array($options)) { + $options = array_merge($this->getDefaultOptions(), $options); + } else { + $options = $this->getDefaultOptions(); + } + + parent::__construct($publicKey, $privateKey, null, $options); + + if ($email !== null) { + $this->setEmail($email); + } + } + + /** + * See if the mcrypt extension is available + * + * @throws Zend_Service_ReCaptcha_MailHide_Exception + */ + protected function _requireMcrypt() + { + if (!extension_loaded('mcrypt')) { + /** @see Zend_Service_ReCaptcha_MailHide_Exception */ + require_once 'Zend/Service/ReCaptcha/MailHide/Exception.php'; + + throw new Zend_Service_ReCaptcha_MailHide_Exception('Use of the Zend_Service_ReCaptcha_MailHide component requires the mcrypt extension to be enabled in PHP'); + } + } + + /** + * Serialize as string + * + * When the instance is used as a string it will display the email address. Since we can't + * throw exceptions within this method we will trigger a user warning instead. + * + * @return string + */ + public function __toString() + { + try { + $return = $this->getHtml(); + } catch (Exception $e) { + $return = ''; + trigger_error($e->getMessage(), E_USER_WARNING); + } + + return $return; + } + + /** + * Get the default set of parameters + * + * @return array + */ + public function getDefaultOptions() + { + return array( + 'linkTitle' => 'Reveal this e-mail address', + 'linkHiddenText' => '...', + 'popupWidth' => 500, + 'popupHeight' => 300, + ); + } + + /** + * Override the setPrivateKey method + * + * Override the parent method to store a binary representation of the private key as well. + * + * @param string $privateKey + * @return Zend_Service_ReCaptcha_MailHide + */ + public function setPrivateKey($privateKey) + { + parent::setPrivateKey($privateKey); + + /* Pack the private key into a binary string */ + $this->_privateKeyPacked = pack('H*', $this->_privateKey); + + return $this; + } + + /** + * Set the email property + * + * This method will set the email property along with the local and domain parts + * + * @param string $email + * @return Zend_Service_ReCaptcha_MailHide + */ + public function setEmail($email) + { + $this->_email = $email; + + $emailParts = explode('@', $email, 2); + + /* Decide on how much of the local part we want to reveal */ + if (strlen($emailParts[0]) <= 4) { + $emailParts[0] = substr($emailParts[0], 0, 1); + } else if (strlen($emailParts[0]) <= 6) { + $emailParts[0] = substr($emailParts[0], 0, 3); + } else { + $emailParts[0] = substr($emailParts[0], 0, 4); + } + + $this->_emailLocalPart = $emailParts[0]; + $this->_emailDomainPart = $emailParts[1]; + + return $this; + } + + /** + * Get the email property + * + * @return string + */ + public function getEmail() + { + return $this->_email; + } + + /** + * Get the local part of the email address + * + * @return string + */ + public function getEmailLocalPart() + { + return $this->_emailLocalPart; + } + + /** + * Get the domain part of the email address + * + * @return string + */ + public function getEmailDomainPart() + { + return $this->_emailDomainPart; + } + + /** + * Get the HTML code needed for the mail hide + * + * @param string $email + * @return string + * @throws Zend_Service_ReCaptcha_MailHide_Exception + */ + public function getHtml($email = null) + { + if ($email !== null) { + $this->setEmail($email); + } else if ($this->_email === null) { + /** @see Zend_Service_ReCaptcha_MailHide_Exception */ + require_once 'Zend/Service/ReCaptcha/MailHide/Exception.php'; + + throw new Zend_Service_ReCaptcha_MailHide_Exception('Missing email address'); + } + + if ($this->_publicKey === null) { + /** @see Zend_Service_ReCaptcha_MailHide_Exception */ + require_once 'Zend/Service/ReCaptcha/MailHide/Exception.php'; + + throw new Zend_Service_ReCaptcha_MailHide_Exception('Missing public key'); + } + + if ($this->_privateKey === null) { + /** @see Zend_Service_ReCaptcha_MailHide_Exception */ + require_once 'Zend/Service/ReCaptcha/MailHide/Exception.php'; + + throw new Zend_Service_ReCaptcha_MailHide_Exception('Missing private key'); + } + + /* Generate the url */ + $url = $this->_getUrl(); + + /* Genrate the HTML used to represent the email address */ + $html = htmlentities($this->_emailLocalPart) . '' . $this->_options['linkHiddenText'] . '@' . htmlentities($this->_emailDomainPart); + + return $html; + } + + /** + * Get the url used on the "hidden" part of the email address + * + * @return string + */ + protected function _getUrl() + { + /* Figure out how much we need to pad the email */ + $numPad = self::ENCRYPTION_BLOCK_SIZE - (strlen($this->_email) % self::ENCRYPTION_BLOCK_SIZE); + + /* Pad the email */ + $emailPadded = str_pad($this->_email, strlen($this->_email) + $numPad, chr($numPad)); + + /* Encrypt the email */ + $emailEncrypted = mcrypt_encrypt(self::ENCRYPTION_CIPHER, $this->_privateKeyPacked, $emailPadded, self::ENCRYPTION_MODE, self::ENCRYPTION_IV); + + /* Return the url */ + return self::MAILHIDE_SERVER . '?k=' . $this->_publicKey . '&c=' . strtr(base64_encode($emailEncrypted), '+/', '-_'); + } +} \ No newline at end of file diff --git a/libs/Zend/Service/ReCaptcha/MailHide/Exception.php b/libs/Zend/Service/ReCaptcha/MailHide/Exception.php new file mode 100644 index 0000000..51f9c80 --- /dev/null +++ b/libs/Zend/Service/ReCaptcha/MailHide/Exception.php @@ -0,0 +1,36 @@ +setStatus($status); + } + + if ($errorCode !== null) { + $this->setErrorCode($errorCode); + } + + if ($httpResponse !== null) { + $this->setFromHttpResponse($httpResponse); + } + } + + /** + * Set the status + * + * @param string $status + * @return Zend_Service_ReCaptcha_Response + */ + public function setStatus($status) + { + if ($status === 'true') { + $this->_status = true; + } else { + $this->_status = false; + } + + return $this; + } + + /** + * Get the status + * + * @return boolean + */ + public function getStatus() + { + return $this->_status; + } + + /** + * Alias for getStatus() + * + * @return boolean + */ + public function isValid() + { + return $this->getStatus(); + } + + /** + * Set the error code + * + * @param string $errorCode + * @return Zend_Service_ReCaptcha_Response + */ + public function setErrorCode($errorCode) + { + $this->_errorCode = $errorCode; + + return $this; + } + + /** + * Get the error code + * + * @return string + */ + public function getErrorCode() + { + return $this->_errorCode; + } + + /** + * Populate this instance based on a Zend_Http_Response object + * + * @param Zend_Http_Response $response + * @return Zend_Service_ReCaptcha_Response + */ + public function setFromHttpResponse(Zend_Http_Response $response) + { + $body = $response->getBody(); + + $parts = explode("\n", $body, 2); + + if (count($parts) !== 2) { + $status = 'false'; + $errorCode = ''; + } else { + list($status, $errorCode) = $parts; + } + + $this->setStatus($status); + $this->setErrorCode($errorCode); + + return $this; + } +} \ No newline at end of file diff --git a/libs/Zend/Service/Simpy.php b/libs/Zend/Service/Simpy.php new file mode 100644 index 0000000..0f0eb3d --- /dev/null +++ b/libs/Zend/Service/Simpy.php @@ -0,0 +1,421 @@ +_rest = new Zend_Rest_Client($this->_baseUri); + $this->_rest->getHttpClient() + ->setAuth($username, $password); + } + + /** + * Sends a request to the REST API service and does initial processing + * on the response. + * + * @param string $op Name of the operation for the request + * @param string|array $query Query data for the request (optional) + * @throws Zend_Service_Exception + * @return DOMDocument Parsed XML response + */ + protected function _makeRequest($op, $query = null) + { + if ($query != null) { + $query = array_diff($query, array_filter($query, 'is_null')); + } + + $response = $this->_rest->restGet('/simpy/api/rest/' . $op . '.do', $query); + + if ($response->isSuccessful()) { + $doc = new DOMDocument(); + $doc->loadXML($response->getBody()); + $xpath = new DOMXPath($doc); + $list = $xpath->query('/status/code'); + + if ($list->length > 0) { + $code = $list->item(0)->nodeValue; + + if ($code != 0) { + $list = $xpath->query('/status/message'); + $message = $list->item(0)->nodeValue; + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception($message, $code); + } + } + + return $doc; + } + + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception('HTTP ' . $response->getStatus()); + } + + /** + * Returns a list of all tags and their counts, ordered by count in + * decreasing order + * + * @param int $limit Limits the number of tags returned (optional) + * @link http://www.simpy.com/doc/api/rest/GetTags + * @throws Zend_Service_Exception + * @return Zend_Service_Simpy_TagSet + */ + public function getTags($limit = null) + { + $query = array( + 'limit' => $limit + ); + + $doc = $this->_makeRequest('GetTags', $query); + + /** + * @see Zend_Service_Simpy_TagSet + */ + require_once 'Zend/Service/Simpy/TagSet.php'; + return new Zend_Service_Simpy_TagSet($doc); + } + + /** + * Removes a tag. + * + * @param string $tag Tag to be removed + * @link http://www.simpy.com/doc/api/rest/RemoveTag + * @return Zend_Service_Simpy Provides a fluent interface + */ + public function removeTag($tag) + { + $query = array( + 'tag' => $tag + ); + + $this->_makeRequest('RemoveTag', $query); + + return $this; + } + + /** + * Renames a tag. + * + * @param string $fromTag Tag to be renamed + * @param string $toTag New tag name + * @link http://www.simpy.com/doc/api/rest/RenameTag + * @return Zend_Service_Simpy Provides a fluent interface + */ + public function renameTag($fromTag, $toTag) + { + $query = array( + 'fromTag' => $fromTag, + 'toTag' => $toTag + ); + + $this->_makeRequest('RenameTag', $query); + + return $this; + } + + /** + * Merges two tags into a new tag. + * + * @param string $fromTag1 First tag to merge. + * @param string $fromTag2 Second tag to merge. + * @param string $toTag Tag to merge the two tags into. + * @link http://www.simpy.com/doc/api/rest/MergeTags + * @return Zend_Service_Simpy Provides a fluent interface + */ + public function mergeTags($fromTag1, $fromTag2, $toTag) + { + $query = array( + 'fromTag1' => $fromTag1, + 'fromTag2' => $fromTag2, + 'toTag' => $toTag + ); + + $this->_makeRequest('MergeTags', $query); + + return $this; + } + + /** + * Splits a single tag into two separate tags. + * + * @param string $tag Tag to split + * @param string $toTag1 First tag to split into + * @param string $toTag2 Second tag to split into + * @link http://www.simpy.com/doc/api/rest/SplitTag + * @return Zend_Service_Simpy Provides a fluent interface + */ + public function splitTag($tag, $toTag1, $toTag2) + { + $query = array( + 'tag' => $tag, + 'toTag1' => $toTag1, + 'toTag2' => $toTag2 + ); + + $this->_makeRequest('SplitTag', $query); + + return $this; + } + + /** + * Performs a query on existing links and returns the results or returns all + * links if no particular query is specified (which should be used sparingly + * to prevent overloading Simpy servers) + * + * @param Zend_Service_Simpy_LinkQuery $q Query object to use (optional) + * @return Zend_Service_Simpy_LinkSet + */ + public function getLinks(Zend_Service_Simpy_LinkQuery $q = null) + { + if ($q != null) { + $query = array( + 'q' => $q->getQueryString(), + 'limit' => $q->getLimit(), + 'date' => $q->getDate(), + 'afterDate' => $q->getAfterDate(), + 'beforeDate' => $q->getBeforeDate() + ); + + $doc = $this->_makeRequest('GetLinks', $query); + } else { + $doc = $this->_makeRequest('GetLinks'); + } + + /** + * @see Zend_Service_Simpy_LinkSet + */ + require_once 'Zend/Service/Simpy/LinkSet.php'; + return new Zend_Service_Simpy_LinkSet($doc); + } + + /** + * Saves a given link. + * + * @param string $title Title of the page to save + * @param string $href URL of the page to save + * @param int $accessType ACCESSTYPE_PUBLIC or ACCESSTYPE_PRIVATE + * @param mixed $tags String containing a comma-separated list of + * tags or array of strings containing tags + * (optional) + * @param string $urlNickname Alternative custom title (optional) + * @param string $note Free text note (optional) + * @link Zend_Service_Simpy::ACCESSTYPE_PUBLIC + * @link Zend_Service_Simpy::ACCESSTYPE_PRIVATE + * @link http://www.simpy.com/doc/api/rest/SaveLink + * @return Zend_Service_Simpy Provides a fluent interface + */ + public function saveLink($title, $href, $accessType, $tags = null, $urlNickname = null, $note = null) + { + if (is_array($tags)) { + $tags = implode(',', $tags); + } + + $query = array( + 'title' => $title, + 'href' => $href, + 'accessType' => $accessType, + 'tags' => $tags, + 'urlNickname' => $urlNickname, + 'note' => $note + ); + + $this->_makeRequest('SaveLink', $query); + + return $this; + } + + /** + * Deletes a given link. + * + * @param string $href URL of the bookmark to delete + * @link http://www.simpy.com/doc/api/rest/DeleteLink + * @return Zend_Service_Simpy Provides a fluent interface + */ + public function deleteLink($href) + { + $query = array( + 'href' => $href + ); + + $this->_makeRequest('DeleteLink', $query); + + return $this; + } + + /** + * Return a list of watchlists and their meta-data, including the number + * of new links added to each watchlist since last login. + * + * @link http://www.simpy.com/doc/api/rest/GetWatchlists + * @return Zend_Service_Simpy_WatchlistSet + */ + public function getWatchlists() + { + $doc = $this->_makeRequest('GetWatchlists'); + + /** + * @see Zend_Service_Simpy_WatchlistSet + */ + require_once 'Zend/Service/Simpy/WatchlistSet.php'; + return new Zend_Service_Simpy_WatchlistSet($doc); + } + + /** + * Returns the meta-data for a given watchlist. + * + * @param int $watchlistId ID of the watchlist to retrieve + * @link http://www.simpy.com/doc/api/rest/GetWatchlist + * @return Zend_Service_Simpy_Watchlist + */ + public function getWatchlist($watchlistId) + { + $query = array( + 'watchlistId' => $watchlistId + ); + + $doc = $this->_makeRequest('GetWatchlist', $query); + + /** + * @see Zend_Service_Simpy_Watchlist + */ + require_once 'Zend/Service/Simpy/Watchlist.php'; + return new Zend_Service_Simpy_Watchlist($doc->documentElement); + } + + /** + * Returns all notes in reverse chronological order by add date or by + * rank. + * + * @param string $q Query string formatted using Simpy search syntax + * and search fields (optional) + * @param int $limit Limits the number notes returned (optional) + * @link http://www.simpy.com/doc/api/rest/GetNotes + * @link http://www.simpy.com/simpy/FAQ.do#searchSyntax + * @link http://www.simpy.com/simpy/FAQ.do#searchFieldsLinks + * @return Zend_Service_Simpy_NoteSet + */ + public function getNotes($q = null, $limit = null) + { + $query = array( + 'q' => $q, + 'limit' => $limit + ); + + $doc = $this->_makeRequest('GetNotes', $query); + + /** + * @see Zend_Service_Simpy_NoteSet + */ + require_once 'Zend/Service/Simpy/NoteSet.php'; + return new Zend_Service_Simpy_NoteSet($doc); + } + + /** + * Saves a note. + * + * @param string $title Title of the note + * @param mixed $tags String containing a comma-separated list of + * tags or array of strings containing tags + * (optional) + * @param string $description Free-text note (optional) + * @param int $noteId Unique identifier for an existing note to + * update (optional) + * @link http://www.simpy.com/doc/api/rest/SaveNote + * @return Zend_Service_Simpy Provides a fluent interface + */ + public function saveNote($title, $tags = null, $description = null, $noteId = null) + { + if (is_array($tags)) { + $tags = implode(',', $tags); + } + + $query = array( + 'title' => $title, + 'tags' => $tags, + 'description' => $description, + 'noteId' => $noteId + ); + + $this->_makeRequest('SaveNote', $query); + + return $this; + } + + /** + * Deletes a given note. + * + * @param int $noteId ID of the note to delete + * @link http://www.simpy.com/doc/api/rest/DeleteNote + * @return Zend_Service_Simpy Provides a fluent interface + */ + public function deleteNote($noteId) + { + $query = array( + 'noteId' => $noteId + ); + + $this->_makeRequest('DeleteNote', $query); + + return $this; + } +} diff --git a/libs/Zend/Service/Simpy/Link.php b/libs/Zend/Service/Simpy/Link.php new file mode 100644 index 0000000..10efa91 --- /dev/null +++ b/libs/Zend/Service/Simpy/Link.php @@ -0,0 +1,215 @@ + node from a parsed response from + * a GetLinks operation + * @return void + */ + public function __construct($node) + { + $this->_accessType = $node->attributes->getNamedItem('accessType')->nodeValue; + + $doc = new DOMDocument(); + $doc->appendChild($doc->importNode($node, true)); + $xpath = new DOMXPath($doc); + + $this->_url = $xpath->evaluate('/link/url')->item(0)->nodeValue; + $this->_modDate = $xpath->evaluate('/link/modDate')->item(0)->nodeValue; + $this->_addDate = $xpath->evaluate('/link/addDate')->item(0)->nodeValue; + $this->_title = $xpath->evaluate('/link/title')->item(0)->nodeValue; + $this->_nickname = $xpath->evaluate('/link/nickname')->item(0)->nodeValue; + $this->_note = $xpath->evaluate('/link/note')->item(0)->nodeValue; + + $list = $xpath->query('/link/tags/tag'); + $this->_tags = array(); + + for ($x = 0; $x < $list->length; $x++) { + $this->_tags[$x] = $list->item($x)->nodeValue; + } + } + + /** + * Returns the access type assigned to the link + * + * @see ACCESSTYPE_PRIVATE + * @see ACCESSTYPE_PUBLIC + * @return string + */ + public function getAccessType() + { + return $this->_accessType; + } + + /** + * Returns the URL of the link + * + * @return string + */ + public function getUrl() + { + return $this->_url; + } + + /** + * Returns the date of the last modification made to the link + * + * @return string + */ + public function getModDate() + { + return $this->_modDate; + } + + /** + * Returns the date the link was added + * + * @return string + */ + public function getAddDate() + { + return $this->_addDate; + } + + /** + * Returns the title assigned to the link + * + * @return string + */ + public function getTitle() + { + return $this->_title; + } + + /** + * Returns the nickname assigned to the link + * + * @return string + */ + public function getNickname() + { + return $this->_nickname; + } + + /** + * Returns the tags assigned to the link + * + * @return array + */ + public function getTags() + { + return $this->_tags; + } + + /** + * Returns the note assigned to the link + * + * @return string + */ + public function getNote() + { + return $this->_note; + } +} diff --git a/libs/Zend/Service/Simpy/LinkQuery.php b/libs/Zend/Service/Simpy/LinkQuery.php new file mode 100644 index 0000000..7ed01cc --- /dev/null +++ b/libs/Zend/Service/Simpy/LinkQuery.php @@ -0,0 +1,200 @@ +_query = $query; + + return $this; + } + + /** + * Returns the query string set for this query + * + * @return string + */ + public function getQueryString() + { + return $this->_query; + } + + /** + * Sets the maximum number of search results to return + * + * @param int $limit + * @return Zend_Service_Simpy_LinkQuery Provides a fluent interface + */ + public function setLimit($limit) + { + $this->_limit = intval($limit); + + if ($this->_limit == 0) { + $this->_limit = null; + } + + return $this; + } + + /** + * Returns the maximum number of search results to return + * + * @return int + */ + public function getLimit() + { + return $this->_limit; + } + + /** + * Sets the date on which search results must have been added, which will + * override any existing values set using setAfterDate() and setBeforeDate() + * + * @param string $date + * @see setAfterDate() + * @see setBeforeDate() + * @return Zend_Service_Simpy_LinkQuery Provides a fluent interface + */ + public function setDate($date) + { + $this->_date = $date; + $this->_afterDate = null; + $this->_beforeDate = null; + + return $this; + } + + /** + * Returns the date on which search results must have been added + * + * @return string + */ + public function getDate() + { + return $this->_date; + } + + /** + * Sets the date after which search results must have been added, which will + * override any existing values set using setDate() + * + * @param string $date + * @see setDate() + * @return Zend_Service_Simpy_LinkQuery Provides a fluent interface + */ + public function setAfterDate($date) + { + $this->_afterDate = $date; + $this->_date = null; + + return $this; + } + + /** + * Returns the date after which search results must have been added + * + * @return string + */ + public function getAfterDate() + { + return $this->_afterDate; + } + + /** + * Sets the date before which search results must have been added, which + * will override any existing values set using setDate() + * + * @param string $date + * @see setDate() + * @return Zend_Service_Simpy_LinkQuery Provides a fluent interface + */ + public function setBeforeDate($date) + { + $this->_beforeDate = $date; + $this->_date = null; + + return $this; + } + + /** + * Returns the date before which search results must have been added + * + * @return string + */ + public function getBeforeDate() + { + return $this->_beforeDate; + } +} diff --git a/libs/Zend/Service/Simpy/LinkSet.php b/libs/Zend/Service/Simpy/LinkSet.php new file mode 100644 index 0000000..6625284 --- /dev/null +++ b/libs/Zend/Service/Simpy/LinkSet.php @@ -0,0 +1,83 @@ +query('//links/link'); + $this->_links = array(); + + for ($x = 0; $x < $list->length; $x++) { + $this->_links[$x] = new Zend_Service_Simpy_Link($list->item($x)); + } + } + + /** + * Returns an iterator for the link set + * + * @return ArrayIterator + */ + public function getIterator() + { + return new ArrayIterator($this->_links); + } + + /** + * Returns the number of links in the set + * + * @return int + */ + public function getLength() + { + return count($this->_links); + } +} diff --git a/libs/Zend/Service/Simpy/Note.php b/libs/Zend/Service/Simpy/Note.php new file mode 100644 index 0000000..2981f0f --- /dev/null +++ b/libs/Zend/Service/Simpy/Note.php @@ -0,0 +1,215 @@ + node from a parsed response from + * a GetLinks operation + * @return void + */ + public function __construct($node) + { + $this->_accessType = $node->attributes->getNamedItem('accessType')->nodeValue; + + $doc = new DOMDocument(); + $doc->appendChild($doc->importNode($node, true)); + $xpath = new DOMXPath($doc); + + $this->_uri = $xpath->evaluate('/note/uri')->item(0)->nodeValue; + $this->_id = substr($this->_uri, strrpos($this->_uri, '=') + 1); + $this->_modDate = trim($xpath->evaluate('/note/modDate')->item(0)->nodeValue); + $this->_addDate = trim($xpath->evaluate('/note/addDate')->item(0)->nodeValue); + $this->_title = $xpath->evaluate('/note/title')->item(0)->nodeValue; + $this->_description = $xpath->evaluate('/note/description')->item(0)->nodeValue; + + $list = $xpath->query('/note/tags/tag'); + $this->_tags = array(); + + for ($x = 0; $x < $list->length; $x++) { + $this->_tags[$x] = $list->item($x)->nodeValue; + } + } + + /** + * Returns the access type assigned to the note + * + * @see ACCESSTYPE_PRIVATE + * @see ACCESSTYPE_PUBLIC + * @return string + */ + public function getAccessType() + { + return $this->_accessType; + } + + /** + * Returns the ID of the note + * + * @return int + */ + public function getId() + { + return $this->_id; + } + + /** + * Returns the URI of the note + * + * @return string + */ + public function getUri() + { + return $this->_uri; + } + + /** + * Returns the date of the last modification made to the note + * + * @return string + */ + public function getModDate() + { + return $this->_modDate; + } + + /** + * Returns the date the note was added + * + * @return string + */ + public function getAddDate() + { + return $this->_addDate; + } + + /** + * Returns the title assigned to the note + * + * @return string + */ + public function getTitle() + { + return $this->_title; + } + + /** + * Returns the tags assigned to the note + * + * @return array + */ + public function getTags() + { + return $this->_tags; + } + + /** + * Returns the description assigned to the note + * + * @return string + */ + public function getDescription() + { + return $this->_description; + } +} diff --git a/libs/Zend/Service/Simpy/NoteSet.php b/libs/Zend/Service/Simpy/NoteSet.php new file mode 100644 index 0000000..78681f1 --- /dev/null +++ b/libs/Zend/Service/Simpy/NoteSet.php @@ -0,0 +1,83 @@ +query('//notes/note'); + $this->_notes = array(); + + for ($x = 0; $x < $list->length; $x++) { + $this->_notes[$x] = new Zend_Service_Simpy_Note($list->item($x)); + } + } + + /** + * Returns an iterator for the note set + * + * @return ArrayIterator + */ + public function getIterator() + { + return new ArrayIterator($this->_notes); + } + + /** + * Returns the number of notes in the set + * + * @return int + */ + public function getLength() + { + return count($this->_notes); + } +} diff --git a/libs/Zend/Service/Simpy/Tag.php b/libs/Zend/Service/Simpy/Tag.php new file mode 100644 index 0000000..51e6b84 --- /dev/null +++ b/libs/Zend/Service/Simpy/Tag.php @@ -0,0 +1,81 @@ + node from a parsed response from + * a GetTags operation + * @return void + */ + public function __construct($node) + { + $map =& $node->attributes; + $this->_tag = $map->getNamedItem('name')->nodeValue; + $this->_count = $map->getNamedItem('count')->nodeValue; + } + + /** + * Returns the name of the tag + * + * @return string + */ + public function getTag() + { + return $this->_tag; + } + + /** + * Returns the number of links with the tag + * + * @return int + */ + public function getCount() + { + return $this->_count; + } +} diff --git a/libs/Zend/Service/Simpy/TagSet.php b/libs/Zend/Service/Simpy/TagSet.php new file mode 100644 index 0000000..819d9ee --- /dev/null +++ b/libs/Zend/Service/Simpy/TagSet.php @@ -0,0 +1,83 @@ +query('//tags/tag'); + $this->_tags = array(); + + for ($x = 0; $x < $list->length; $x++) { + $this->_tags[$x] = new Zend_Service_Simpy_Tag($list->item($x)); + } + } + + /** + * Returns an iterator for the tag set + * + * @return ArrayIterator + */ + public function getIterator() + { + return new ArrayIterator($this->_tags); + } + + /** + * Returns the number of tags in the set + * + * @return int + */ + public function getLength() + { + return count($this->_tags); + } +} diff --git a/libs/Zend/Service/Simpy/Watchlist.php b/libs/Zend/Service/Simpy/Watchlist.php new file mode 100644 index 0000000..8b3e7cc --- /dev/null +++ b/libs/Zend/Service/Simpy/Watchlist.php @@ -0,0 +1,191 @@ + node from a parsed + * response from a GetWatchlists or GetWatchlist + * operation + * @return void + */ + public function __construct($node) + { + $map =& $node->attributes; + + $this->_id = $map->getNamedItem('id')->nodeValue; + $this->_name = $map->getNamedItem('name')->nodeValue; + $this->_description = $map->getNamedItem('description')->nodeValue; + $this->_addDate = $map->getNamedItem('addDate')->nodeValue; + $this->_newLinks = $map->getNamedItem('newLinks')->nodeValue; + + $this->_users = array(); + $this->_filters = new Zend_Service_Simpy_WatchlistFilterSet(); + + $childNode = $node->firstChild; + while (is_null($childNode) == false) { + if ($childNode->nodeName == 'user') { + $this->_users[] = $childNode->attributes->getNamedItem('username')->nodeValue; + } elseif ($childNode->nodeName == 'filter') { + $filter = new Zend_Service_Simpy_WatchlistFilter($childNode); + $this->_filters->add($filter); + } + $childNode = $childNode->nextSibling; + } + } + + /** + * Returns the identifier for the watchlist + * + * @return int + */ + public function getId() + { + return $this->_id; + } + + /** + * Returns the name of the watchlist + * + * @return string + */ + public function getName() + { + return $this->_name; + } + + /** + * Returns the description of the watchlist + * + * @return string + */ + public function getDescription() + { + return $this->_description; + } + + /** + * Returns a timestamp for when the watchlist was added + * + * @return string + */ + public function getAddDate() + { + return $this->_addDate; + } + + /** + * Returns the number of new links in the watchlist + * + * @return int + */ + public function getNewLinks() + { + return $this->_newLinks; + } + + /** + * Returns a list of usernames for users included in the watchlist + * + * @return array + */ + public function getUsers() + { + return $this->_users; + } + + /** + * Returns a list of filters included in the watchlist + * + * @return Zend_Service_Simpy_WatchlistFilterSet + */ + public function getFilters() + { + return $this->_filters; + } +} diff --git a/libs/Zend/Service/Simpy/WatchlistFilter.php b/libs/Zend/Service/Simpy/WatchlistFilter.php new file mode 100644 index 0000000..0a10970 --- /dev/null +++ b/libs/Zend/Service/Simpy/WatchlistFilter.php @@ -0,0 +1,81 @@ + node from a parsed response from + * a GetWatchlists or GetWatchlist operation + * @return void + */ + public function __construct($node) + { + $map =& $node->attributes; + $this->_name = $map->getNamedItem('name')->nodeValue; + $this->_query = $map->getNamedItem('query')->nodeValue; + } + + /** + * Returns the name of the filter + * + * @return string + */ + public function getName() + { + return $this->_name; + } + + /** + * Returns the query for the filter + * + * @return string + */ + public function getQuery() + { + return $this->_query; + } +} diff --git a/libs/Zend/Service/Simpy/WatchlistFilterSet.php b/libs/Zend/Service/Simpy/WatchlistFilterSet.php new file mode 100644 index 0000000..a2bb26c --- /dev/null +++ b/libs/Zend/Service/Simpy/WatchlistFilterSet.php @@ -0,0 +1,77 @@ +_filters[] = $filter; + } + + /** + * Returns an iterator for the watchlist filter set + * + * @return ArrayIterator + */ + public function getIterator() + { + return new ArrayIterator($this->_filters); + } + + /** + * Returns the number of filters in the set + * + * @return int + */ + public function getLength() + { + return count($this->_filters); + } +} diff --git a/libs/Zend/Service/Simpy/WatchlistSet.php b/libs/Zend/Service/Simpy/WatchlistSet.php new file mode 100644 index 0000000..a0c88c3 --- /dev/null +++ b/libs/Zend/Service/Simpy/WatchlistSet.php @@ -0,0 +1,82 @@ +query('//watchlists/watchlist'); + + for ($x = 0; $x < $list->length; $x++) { + $this->_watchlists[$x] = new Zend_Service_Simpy_Watchlist($list->item($x)); + } + } + + /** + * Returns an iterator for the watchlist set + * + * @return ArrayIterator + */ + public function getIterator() + { + return new ArrayIterator($this->_watchlists); + } + + /** + * Returns the number of watchlists in the set + * + * @return int + */ + public function getLength() + { + return count($this->_watchlists); + } +} diff --git a/libs/Zend/Service/SlideShare.php b/libs/Zend/Service/SlideShare.php new file mode 100644 index 0000000..cdcbd26 --- /dev/null +++ b/libs/Zend/Service/SlideShare.php @@ -0,0 +1,609 @@ +_httpclient = $client; + return $this; + } + + /** + * Returns the instance of the Zend_Http_Client which will be used. Creates an instance + * of Zend_Http_Client if no previous client was set. + * + * @return Zend_Http_Client The HTTP client which will be used + */ + public function getHttpClient() + { + + if(!($this->_httpclient instanceof Zend_Http_Client)) { + $client = new Zend_Http_Client(); + $client->setConfig(array('maxredirects' => 2, + 'timeout' => 5)); + + $this->setHttpClient($client); + } + + $this->_httpclient->resetParameters(); + return $this->_httpclient; + } + + /** + * Sets the Zend_Cache object to use to cache the results of API queries + * + * @param Zend_Cache_Core $cacheobject The Zend_Cache object used + * @return Zend_Service_SlideShare + */ + public function setCacheObject(Zend_Cache_Core $cacheobject) + { + $this->_cacheobject = $cacheobject; + return $this; + } + + /** + * Gets the Zend_Cache object which will be used to cache API queries. If no cache object + * was previously set the the default will be used (Filesystem caching in /tmp with a life + * time of 43200 seconds) + * + * @return Zend_Cache_Core The object used in caching + */ + public function getCacheObject() + { + + if(!($this->_cacheobject instanceof Zend_Cache_Core)) { + $cache = Zend_Cache::factory('Core', 'File', array('lifetime' => 43200, + 'automatic_serialization' => true), + array('cache_dir' => '/tmp')); + + $this->setCacheObject($cache); + } + + return $this->_cacheobject; + } + + /** + * Returns the user name used for API calls + * + * @return string The username + */ + public function getUserName() + { + return $this->_username; + } + + /** + * Sets the user name to use for API calls + * + * @param string $un The username to use + * @return Zend_Service_SlideShare + */ + public function setUserName($un) + { + $this->_username = $un; + return $this; + } + + /** + * Gets the password to use in API calls + * + * @return string the password to use in API calls + */ + public function getPassword() + { + return $this->_password; + } + + /** + * Sets the password to use in API calls + * + * @param string $pw The password to use + * @return Zend_Service_SlideShare + */ + public function setPassword($pw) + { + $this->_password = (string)$pw; + return $this; + } + + /** + * Gets the API key to be used in making API calls + * + * @return string the API Key + */ + public function getApiKey() + { + return $this->_apiKey; + } + + /** + * Sets the API key to be used in making API calls + * + * @param string $key The API key to use + * @return Zend_Service_SlideShare + */ + public function setApiKey($key) + { + $this->_apiKey = (string)$key; + return $this; + } + + /** + * Gets the shared secret used in making API calls + * + * @return string the Shared secret + */ + public function getSharedSecret() + { + return $this->_sharedSecret; + } + + /** + * Sets the shared secret used in making API calls + * + * @param string $secret the shared secret + * @return Zend_Service_SlideShare + */ + public function setSharedSecret($secret) + { + $this->_sharedSecret = (string)$secret; + return $this; + } + + /** + * The Constructor + * + * @param string $apikey The API key + * @param string $sharedSecret The shared secret + * @param string $username The username + * @param string $password The password + */ + public function __construct($apikey, $sharedSecret, $username = null, $password = null) + { + $this->setApiKey($apikey) + ->setSharedSecret($sharedSecret) + ->setUserName($username) + ->setPassword($password); + + $this->_httpclient = new Zend_Http_Client(); + } + + /** + * Uploads the specified Slide show the the server + * + * @param Zend_Service_SlideShare_SlideShow $ss The slide show object representing the slide show to upload + * @param boolean $make_src_public Determines if the the slide show's source file is public or not upon upload + * @return Zend_Service_SlideShare_SlideShow The passed Slide show object, with the new assigned ID provided + */ + public function uploadSlideShow(Zend_Service_SlideShare_SlideShow $ss, $make_src_public = true) + { + + $timestamp = time(); + + $params = array('api_key' => $this->getApiKey(), + 'ts' => $timestamp, + 'hash' => sha1($this->getSharedSecret().$timestamp), + 'username' => $this->getUserName(), + 'password' => $this->getPassword(), + 'slideshow_title' => $ss->getTitle()); + + $description = $ss->getDescription(); + $tags = $ss->getTags(); + + $filename = $ss->getFilename(); + + if(!file_exists($filename) || !is_readable($filename)) { + throw new Zend_Service_SlideShare_Exception("Specified Slideshow for upload not found or unreadable"); + } + + if(!empty($description)) { + $params['slideshow_description'] = $description; + } else { + $params['slideshow_description'] = ""; + } + + if(!empty($tags)) { + $tmp = array(); + foreach($tags as $tag) { + $tmp[] = "\"$tag\""; + } + $params['slideshow_tags'] = implode(' ', $tmp); + } else { + $params['slideshow_tags'] = ""; + } + + + $client = $this->getHttpClient(); + $client->setUri(self::SERVICE_UPLOAD_URI); + $client->setParameterPost($params); + $client->setFileUpload($filename, "slideshow_srcfile"); + + try { + $response = $client->request('POST'); + } catch(Zend_Http_Client_Exception $e) { + throw new Zend_Service_SlideShare_Exception("Service Request Failed: {$e->getMessage()}"); + } + + $sxe = simplexml_load_string($response->getBody()); + + if($sxe->getName() == "SlideShareServiceError") { + $message = (string)$sxe->Message[0]; + list($code, $error_str) = explode(':', $message); + throw new Zend_Service_SlideShare_Exception(trim($error_str), $code); + } + + if(!$sxe->getName() == "SlideShowUploaded") { + throw new Zend_Service_SlideShare_Exception("Unknown XML Respons Received"); + } + + $ss->setId((int)(string)$sxe->SlideShowID); + + return $ss; + } + + /** + * Retrieves a slide show's information based on slide show ID + * + * @param int $ss_id The slide show ID + * @return Zend_Service_SlideShare_SlideShow the Slideshow object + */ + public function getSlideShow($ss_id) + { + $timestamp = time(); + + $params = array('api_key' => $this->getApiKey(), + 'ts' => $timestamp, + 'hash' => sha1($this->getSharedSecret().$timestamp), + 'slideshow_id' => $ss_id); + + $cache = $this->getCacheObject(); + + $cache_key = md5("__zendslideshare_cache_$ss_id"); + + if(!$retval = $cache->load($cache_key)) { + $client = $this->getHttpClient(); + + $client->setUri(self::SERVICE_GET_SHOW_URI); + $client->setParameterPost($params); + + try { + $response = $client->request('POST'); + } catch(Zend_Http_Client_Exception $e) { + throw new Zend_Service_SlideShare_Exception("Service Request Failed: {$e->getMessage()}"); + } + + $sxe = simplexml_load_string($response->getBody()); + + if($sxe->getName() == "SlideShareServiceError") { + $message = (string)$sxe->Message[0]; + list($code, $error_str) = explode(':', $message); + throw new Zend_Service_SlideShare_Exception(trim($error_str), $code); + } + + if(!$sxe->getName() == 'Slideshows') { + throw new Zend_Service_SlideShare_Exception('Unknown XML Repsonse Received'); + } + + $retval = $this->_slideShowNodeToObject(clone $sxe->Slideshow[0]); + + $cache->save($retval, $cache_key); + } + + return $retval; + } + + /** + * Retrieves an array of slide shows for a given username + * + * @param string $username The username to retrieve slide shows from + * @param int $offset The offset of the list to start retrieving from + * @param int $limit The maximum number of slide shows to retrieve + * @return array An array of Zend_Service_SlideShare_SlideShow objects + */ + public function getSlideShowsByUsername($username, $offset = null, $limit = null) + { + return $this->_getSlideShowsByType('username_for', $username, $offset, $limit); + } + + /** + * Retrieves an array of slide shows based on tag + * + * @param string $tag The tag to retrieve slide shows with + * @param int $offset The offset of the list to start retrieving from + * @param int $limit The maximum number of slide shows to retrieve + * @return array An array of Zend_Service_SlideShare_SlideShow objects + */ + public function getSlideShowsByTag($tag, $offset = null, $limit = null) + { + + if(is_array($tag)) { + $tmp = array(); + foreach($tag as $t) { + $tmp[] = "\"$t\""; + } + + $tag = implode(" ", $tmp); + } + + return $this->_getSlideShowsByType('tag', $tag, $offset, $limit); + } + + /** + * Retrieves an array of slide shows based on group name + * + * @param string $group The group name to retrieve slide shows for + * @param int $offset The offset of the list to start retrieving from + * @param int $limit The maximum number of slide shows to retrieve + * @return array An array of Zend_Service_SlideShare_SlideShow objects + */ + public function getSlideShowsByGroup($group, $offset = null, $limit = null) + { + return $this->_getSlideShowsByType('group_name', $group, $offset, $limit); + } + + /** + * Retrieves Zend_Service_SlideShare_SlideShow object arrays based on the type of + * list desired + * + * @param string $key The type of slide show object to retrieve + * @param string $value The specific search query for the slide show type to look up + * @param int $offset The offset of the list to start retrieving from + * @param int $limit The maximum number of slide shows to retrieve + * @return array An array of Zend_Service_SlideShare_SlideShow objects + */ + protected function _getSlideShowsByType($key, $value, $offset = null, $limit = null) + { + + $key = strtolower($key); + + switch($key) { + case 'username_for': + $responseTag = 'User'; + $queryUri = self::SERVICE_GET_SHOW_BY_USER_URI; + break; + case 'group_name': + $responseTag = 'Group'; + $queryUri = self::SERVICE_GET_SHOW_BY_GROUP_URI; + break; + case 'tag': + $responseTag = 'Tag'; + $queryUri = self::SERVICE_GET_SHOW_BY_TAG_URI; + break; + default: + throw new Zend_Service_SlideShare_Exception("Invalid SlideShare Query"); + } + + $timestamp = time(); + + $params = array('api_key' => $this->getApiKey(), + 'ts' => $timestamp, + 'hash' => sha1($this->getSharedSecret().$timestamp), + $key => $value); + + if(!is_null($offset)) { + $params['offset'] = (int)$offset; + } + + if(!is_null($limit)) { + $params['limit'] = (int)$limit; + } + + $cache = $this->getCacheObject(); + + $cache_key = md5($key.$value.$offset.$limit); + + if(!$retval = $cache->load($cache_key)) { + + $client = $this->getHttpClient(); + + $client->setUri($queryUri); + $client->setParameterPost($params); + + try { + $response = $client->request('POST'); + } catch(Zend_Http_Client_Exception $e) { + throw new Zend_Service_SlideShare_Exception("Service Request Failed: {$e->getMessage()}"); + } + + $sxe = simplexml_load_string($response->getBody()); + + if($sxe->getName() == "SlideShareServiceError") { + $message = (string)$sxe->Message[0]; + list($code, $error_str) = explode(':', $message); + throw new Zend_Service_SlideShare_Exception(trim($error_str), $code); + } + + if(!$sxe->getName() == $responseTag) { + throw new Zend_Service_SlideShare_Exception('Unknown or Invalid XML Repsonse Received'); + } + + $retval = array(); + + foreach($sxe->children() as $node) { + if($node->getName() == 'Slideshow') { + $retval[] = $this->_slideShowNodeToObject($node); + } + } + + $cache->save($retval, $cache_key); + } + + return $retval; + } + + /** + * Converts a SimpleXMLElement object representing a response from the service + * into a Zend_Service_SlideShare_SlideShow object + * + * @param SimpleXMLElement $node The input XML from the slideshare.net service + * @return Zend_Service_SlideShare_SlideShow The resulting object + */ + protected function _slideShowNodeToObject(SimpleXMLElement $node) + { + + if($node->getName() == 'Slideshow') { + + $ss = new Zend_Service_SlideShare_SlideShow(); + + $ss->setId((string)$node->ID); + $ss->setDescription((string)$node->Description); + $ss->setEmbedCode((string)$node->EmbedCode); + $ss->setNumViews((string)$node->Views); + $ss->setPermaLink((string)$node->Permalink); + $ss->setStatus((string)$node->Status); + $ss->setStatusDescription((string)$node->StatusDescription); + + foreach(explode(",", (string)$node->Tags) as $tag) { + + if(!in_array($tag, $ss->getTags())) { + $ss->addTag($tag); + } + } + + $ss->setThumbnailUrl((string)$node->Thumbnail); + $ss->setTitle((string)$node->Title); + $ss->setLocation((string)$node->Location); + $ss->setTranscript((string)$node->Transcript); + + return $ss; + + } + + throw new Zend_Service_SlideShare_Exception("Was not provided the expected XML Node for processing"); + } +} \ No newline at end of file diff --git a/libs/Zend/Service/SlideShare/Exception.php b/libs/Zend/Service/SlideShare/Exception.php new file mode 100644 index 0000000..b0a31e3 --- /dev/null +++ b/libs/Zend/Service/SlideShare/Exception.php @@ -0,0 +1,38 @@ +_location; + } + + /** + * Sets the location of the slide show + * + * @param string $loc The location to use + * @return Zend_Service_SlideShare_SlideShow + */ + public function setLocation($loc) + { + $this->_location = (string)$loc; + return $this; + } + + /** + * Gets the transcript for this slide show + * + * @return string the Transcript + */ + public function getTranscript() + { + return $this->_transcript; + } + + /** + * Sets the transcript for this slide show + * + * @param string $t The transcript + * @return Zend_Service_SlideShare_SlideShow + */ + public function setTranscript($t) + { + $this->_transcript = (string)$t; + return $this; + } + + /** + * Adds a tag to the slide show + * + * @param string $tag The tag to add + * @return Zend_Service_SlideShare_SlideShow + */ + public function addTag($tag) + { + $this->_tags[] = (string)$tag; + return $this; + } + + /** + * Sets the tags for the slide show + * + * @param array $tags An array of tags to set + * @return Zend_Service_SlideShare_SlideShow + */ + public function setTags(Array $tags) + { + $this->_tags = $tags; + return $this; + } + + /** + * Gets all of the tags associated with the slide show + * + * @return array An array of tags for the slide show + */ + public function getTags() + { + return $this->_tags; + } + + /** + * Sets the filename on the local filesystem of the slide show + * (for uploading a new slide show) + * + * @param string $file The full path & filename to the slide show + * @return Zend_Service_SlideShare_SlideShow + */ + public function setFilename($file) + { + $this->_slideShowFilename = (string)$file; + return $this; + } + + /** + * Retrieves the filename on the local filesystem of the slide show + * which will be uploaded + * + * @return string The full path & filename to the slide show + */ + public function getFilename() + { + return $this->_slideShowFilename; + } + + /** + * Sets the ID for the slide show + * + * @param int $id The slide show ID + * @return Zend_Service_SlideShare_SlideShow + */ + public function setId($id) + { + $this->_slideShowId = (string)$id; + return $this; + } + + /** + * Gets the ID for the slide show + * + * @return int The slide show ID + */ + public function getId() + { + return $this->_slideShowId; + } + + /** + * Sets the HTML embed code for the slide show + * + * @param string $code The HTML embed code + * @return Zend_Service_SlideShare_SlideShow + */ + public function setEmbedCode($code) + { + $this->_embedCode = (string)$code; + return $this; + } + + /** + * Retrieves the HTML embed code for the slide show + * + * @return string the HTML embed code + */ + public function getEmbedCode() + { + return $this->_embedCode; + } + + /** + * Sets the Thumbnail URI for the slide show + * + * @param string $url The URI for the thumbnail image + * @return Zend_Service_SlideShare_SlideShow + */ + public function setThumbnailUrl($url) + { + $this->_thumbnailUrl = (string) $url; + return $this; + } + + /** + * Retrieves the Thumbnail URi for the slide show + * + * @return string The URI for the thumbnail image + */ + public function getThumbnailUrl() + { + return $this->_thumbnailUrl; + } + + /** + * Sets the title for the Slide show + * + * @param string $title The slide show title + * @return Zend_Service_SlideShare_SlideShow + */ + public function setTitle($title) + { + $this->_title = (string)$title; + return $this; + } + + /** + * Retrieves the Slide show title + * + * @return string the Slide show title + */ + public function getTitle() + { + return $this->_title; + } + + /** + * Sets the description for the Slide show + * + * @param strign $desc The description of the slide show + * @return Zend_Service_SlideShare_SlideShow + */ + public function setDescription($desc) + { + $this->_description = (string)$desc; + return $this; + } + + /** + * Gets the description of the slide show + * + * @return string The slide show description + */ + public function getDescription() + { + return $this->_description; + } + + /** + * Sets the numeric status of the slide show on the server + * + * @param int $status The numeric status on the server + * @return Zend_Service_SlideShare_SlideShow + */ + public function setStatus($status) + { + $this->_status = (int)$status; + return $this; + } + + /** + * Gets the numeric status of the slide show on the server + * + * @return int A Zend_Service_SlideShare_SlideShow Status constant + */ + public function getStatus() + { + return $this->_status; + } + + /** + * Sets the textual description of the status of the slide show on the server + * + * @param string $desc The textual description of the status of the slide show + * @return Zend_Service_SlideShare_SlideShow + */ + public function setStatusDescription($desc) + { + $this->_statusDescription = (string)$desc; + return $this; + } + + /** + * Gets the textual description of the status of the slide show on the server + * + * @return string the textual description of the service + */ + public function getStatusDescription() + { + return $this->_statusDescription; + } + + /** + * Sets the permanent link of the slide show + * + * @param string $url The permanent URL for the slide show + * @return Zend_Service_SlideShare_SlideShow + */ + public function setPermaLink($url) + { + $this->_permalink = (string)$url; + return $this; + } + + /** + * Gets the permanent link of the slide show + * + * @return string the permanent URL for the slide show + */ + public function getPermaLink() + { + return $this->_permalink; + } + + /** + * Sets the number of views the slide show has received + * + * @param int $views The number of views + * @return Zend_Service_SlideShare_SlideShow + */ + public function setNumViews($views) + { + $this->_numViews = (int)$views; + return $this; + } + + /** + * Gets the number of views the slide show has received + * + * @return int The number of views + */ + public function getNumViews() + { + return $this->_numViews; + } +} \ No newline at end of file diff --git a/libs/Zend/Service/StrikeIron.php b/libs/Zend/Service/StrikeIron.php new file mode 100644 index 0000000..bf22567 --- /dev/null +++ b/libs/Zend/Service/StrikeIron.php @@ -0,0 +1,95 @@ +_options = $options; + } + + /** + * Factory method to return a preconfigured Zend_Service_StrikeIron_* + * instance. + * + * @param null|string $options Service options + * @return object Zend_Service_StrikeIron_* instance + * @throws Zend_Service_StrikeIron_Exception + */ + public function getService($options = array()) + { + $class = isset($options['class']) ? $options['class'] : 'Base'; + unset($options['class']); + + if (strpos($class, '_') === false) { + $class = "Zend_Service_StrikeIron_{$class}"; + } + + try { + @Zend_Loader::loadClass($class); + if (!class_exists($class, false)) { + throw new Exception('Class file not found'); + } + } catch (Exception $e) { + $msg = "Service '$class' could not be loaded: " . $e->getMessage(); + /** + * @see Zend_Service_StrikeIron_Exception + */ + require_once 'Zend/Service/StrikeIron/Exception.php'; + throw new Zend_Service_StrikeIron_Exception($msg, $e->getCode()); + } + + // instantiate and return the service + $service = new $class(array_merge($this->_options, $options)); + return $service; + } + +} diff --git a/libs/Zend/Service/StrikeIron/Base.php b/libs/Zend/Service/StrikeIron/Base.php new file mode 100644 index 0000000..1a3a84a --- /dev/null +++ b/libs/Zend/Service/StrikeIron/Base.php @@ -0,0 +1,274 @@ + null, + 'password' => null, + 'client' => null, + 'options' => null, + 'headers' => null, + 'wsdl' => null); + + /** + * Output headers returned by the last call to SOAPClient->__soapCall() + * @param array + */ + protected $_outputHeaders = array(); + + /** + * Class constructor + * + * @param array $options Key/value pair options + * @throws Zend_Service_StrikeIron_Exception + */ + public function __construct($options = array()) + { + if (!extension_loaded('soap')) { + /** + * @see Zend_Service_StrikeIron_Exception + */ + require_once 'Zend/Service/StrikeIron/Exception.php'; + throw new Zend_Service_StrikeIron_Exception('SOAP extension is not enabled'); + } + + $this->_options = array_merge($this->_options, $options); + + $this->_initSoapHeaders(); + $this->_initSoapClient(); + } + + /** + * Proxy method calls to the SOAPClient instance, transforming method + * calls and responses for convenience. + * + * @param string $method Method name + * @param array $params Parameters for method + * @return mixed Result + * @throws Zend_Service_StrikeIron_Exception + */ + public function __call($method, $params) + { + // prepare method name and parameters for soap call + list($method, $params) = $this->_transformCall($method, $params); + $params = isset($params[0]) ? array($params[0]) : array(); + + // make soap call, capturing the result and output headers + try { + $result = $this->_options['client']->__soapCall($method, + $params, + $this->_options['options'], + $this->_options['headers'], + $this->_outputHeaders); + } catch (Exception $e) { + $message = get_class($e) . ': ' . $e->getMessage(); + /** + * @see Zend_Service_StrikeIron_Exception + */ + require_once 'Zend/Service/StrikeIron/Exception.php'; + throw new Zend_Service_StrikeIron_Exception($message, $e->getCode()); + } + + // transform/decorate the result and return it + $result = $this->_transformResult($result, $method, $params); + return $result; + } + + /** + * Initialize the SOAPClient instance + * + * @return void + */ + protected function _initSoapClient() + { + if (! isset($this->_options['options'])) { + $this->_options['options'] = array(); + } + + if (! isset($this->_options['client'])) { + $this->_options['client'] = new SoapClient($this->_options['wsdl'], + $this->_options['options']); + } + } + + /** + * Initialize the headers to pass to SOAPClient->__soapCall() + * + * @return void + * @throws Zend_Service_StrikeIron_Exception + */ + protected function _initSoapHeaders() + { + // validate headers and check if LicenseInfo was given + $foundLicenseInfo = false; + if (isset($this->_options['headers'])) { + if (! is_array($this->_options['headers'])) { + $this->_options['headers'] = array($this->_options['headers']); + } + + foreach ($this->_options['headers'] as $header) { + if (! $header instanceof SoapHeader) { + /** + * @see Zend_Service_StrikeIron_Exception + */ + require_once 'Zend/Service/StrikeIron/Exception.php'; + throw new Zend_Service_StrikeIron_Exception('Header must be instance of SoapHeader'); + } else if ($header->name == 'LicenseInfo') { + $foundLicenseInfo = true; + break; + } + } + } else { + $this->_options['headers'] = array(); + } + + // add default LicenseInfo header if a custom one was not supplied + if (! $foundLicenseInfo) { + $this->_options['headers'][] = new SoapHeader('http://ws.strikeiron.com', + 'LicenseInfo', + array('RegisteredUser' => array('UserID' => $this->_options['username'], + 'Password' => $this->_options['password']))); + } + } + + /** + * Transform a method name or method parameters before sending them + * to the remote service. This can be useful for inflection or other + * transforms to give the method call a more PHP-like interface. + * + * @see __call() + * @param string $method Method name called from PHP + * @param mixed $param Parameters passed from PHP + * @return array [$method, $params] for SOAPClient->__soapCall() + */ + protected function _transformCall($method, $params) + { + return array(ucfirst($method), $params); + } + + /** + * Transform the result returned from a method before returning + * it to the PHP caller. This can be useful for transforming + * the SOAPClient returned result to be more PHP-like. + * + * The $method name and $params passed to the method are provided to + * allow decisions to be made about how to transform the result based + * on what was originally called. + * + * @see __call() + * @param $result Raw result returned from SOAPClient_>__soapCall() + * @param $method Method name that was passed to SOAPClient->__soapCall() + * @param $params Method parameters that were passed to SOAPClient->__soapCall() + * @return mixed Transformed result + */ + protected function _transformResult($result, $method, $params) + { + $resultObjectName = "{$method}Result"; + if (isset($result->$resultObjectName)) { + $result = $result->$resultObjectName; + } + if (is_object($result)) { + $result = new Zend_Service_StrikeIron_Decorator($result, $resultObjectName); + } + return $result; + } + + /** + * Get the WSDL URL for this service. + * + * @return string + */ + public function getWsdl() + { + return $this->_options['wsdl']; + } + + /** + * Get the SOAP Client instance for this service. + */ + public function getSoapClient() + { + return $this->_options['client']; + } + + /** + * Get the StrikeIron output headers returned with the last method response. + * + * @return array + */ + public function getLastOutputHeaders() + { + return $this->_outputHeaders; + } + + /** + * Get the StrikeIron subscription information for this service. + * If any service method was recently called, the subscription info + * should have been returned in the SOAP headers so it is cached + * and returned from the cache. Otherwise, the getRemainingHits() + * method is called as a dummy to get the subscription info headers. + * + * @param boolean $now Force a call to getRemainingHits instead of cache? + * @param string $queryMethod Method that will cause SubscriptionInfo header to be sent + * @return Zend_Service_StrikeIron_Decorator Decorated subscription info + * @throws Zend_Service_StrikeIron_Exception + */ + public function getSubscriptionInfo($now = false, $queryMethod = 'GetRemainingHits') + { + if ($now || empty($this->_outputHeaders['SubscriptionInfo'])) { + $this->$queryMethod(); + } + + // capture subscription info if returned in output headers + if (isset($this->_outputHeaders['SubscriptionInfo'])) { + $info = (object)$this->_outputHeaders['SubscriptionInfo']; + $subscriptionInfo = new Zend_Service_StrikeIron_Decorator($info, 'SubscriptionInfo'); + } else { + $msg = 'No SubscriptionInfo header found in last output headers'; + /** + * @see Zend_Service_StrikeIron_Exception + */ + require_once 'Zend/Service/StrikeIron/Exception.php'; + throw new Zend_Service_StrikeIron_Exception($msg); + } + + return $subscriptionInfo; + } +} diff --git a/libs/Zend/Service/StrikeIron/Decorator.php b/libs/Zend/Service/StrikeIron/Decorator.php new file mode 100644 index 0000000..6ff6cfd --- /dev/null +++ b/libs/Zend/Service/StrikeIron/Decorator.php @@ -0,0 +1,143 @@ +_object = $object; + $this->_name = $name; + } + + /** + * Proxy property access to the decorated object, inflecting + * the property name and decorating any child objects returned. + * If the property is not found in the decorated object, return + * NULL as a convenience feature to avoid notices. + * + * @param string $property Property name to retrieve + * @return mixed Value of property or NULL + */ + public function __get($property) + { + $result = null; + + if (! isset($this->_object->$property)) { + $property = $this->_inflect($property); + } + + if (isset($this->_object->$property)) { + $result = $this->_object->$property; + $result = $this->_decorate($result); + } + return $result; + } + + /** + * Proxy method calls to the decorated object. This will only + * be used when the SOAPClient returns a custom PHP object via + * its classmap option so no inflection is done. + * + * @param string $method Name of method called + * @param array $args Arguments for method + */ + public function __call($method, $args) + { + return call_user_func_array(array($this->_object, $method), $args); + } + + /** + * Inflect a property name from PHP-style to the result object's + * style. The default implementation here only inflects the case + * of the first letter, e.g. from "fooBar" to "FooBar". + * + * @param string $property Property name to inflect + * @return string Inflected property name + */ + protected function _inflect($property) + { + return ucfirst($property); + } + + /** + * Decorate a value returned by the result object. The default + * implementation here only decorates child objects. + * + * @param mixed $result Value to decorate + * @return mixed Decorated result + */ + protected function _decorate($result) + { + if (is_object($result)) { + $result = new self($result); + } + return $result; + } + + /** + * Return the object being decorated + * + * @return object + */ + public function getDecoratedObject() + { + return $this->_object; + } + + /** + * Return the name of the object being decorated + * + * @return null|string + */ + public function getDecoratedObjectName() + { + return $this->_name; + } +} diff --git a/libs/Zend/Service/StrikeIron/Exception.php b/libs/Zend/Service/StrikeIron/Exception.php new file mode 100644 index 0000000..58f9e48 --- /dev/null +++ b/libs/Zend/Service/StrikeIron/Exception.php @@ -0,0 +1,34 @@ + null, + 'password' => null, + 'client' => null, + 'options' => null, + 'headers' => null, + 'wsdl' => 'http://ws.strikeiron.com/zf1.StrikeIron/taxdatabasic4?WSDL'); +} diff --git a/libs/Zend/Service/StrikeIron/USAddressVerification.php b/libs/Zend/Service/StrikeIron/USAddressVerification.php new file mode 100644 index 0000000..0cdc57c --- /dev/null +++ b/libs/Zend/Service/StrikeIron/USAddressVerification.php @@ -0,0 +1,45 @@ + null, + 'password' => null, + 'client' => null, + 'options' => null, + 'headers' => null, + 'wsdl' => 'http://ws.strikeiron.com/zf1.StrikeIron/USAddressVerification4_0?WSDL'); +} diff --git a/libs/Zend/Service/StrikeIron/ZipCodeInfo.php b/libs/Zend/Service/StrikeIron/ZipCodeInfo.php new file mode 100644 index 0000000..0de9200 --- /dev/null +++ b/libs/Zend/Service/StrikeIron/ZipCodeInfo.php @@ -0,0 +1,45 @@ + null, + 'password' => null, + 'client' => null, + 'options' => null, + 'headers' => null, + 'wsdl' => 'http://sdpws.strikeiron.com/zf1.StrikeIron/sdpZIPCodeInfo?WSDL'); +} diff --git a/libs/Zend/Service/Technorati.php b/libs/Zend/Service/Technorati.php new file mode 100644 index 0000000..94bd5a9 --- /dev/null +++ b/libs/Zend/Service/Technorati.php @@ -0,0 +1,1028 @@ +_apiKey = $apiKey; + } + + + /** + * Cosmos query lets you see what blogs are linking to a given URL. + * + * On the Technorati site, you can enter a URL in the searchbox and + * it will return a list of blogs linking to it. + * The API version allows more features and gives you a way + * to use the cosmos on your own site. + * + * Query options include: + * + * 'type' => (link|weblog) + * optional - A value of link returns the freshest links referencing your target URL. + * A value of weblog returns the last set of unique weblogs referencing your target URL. + * 'limit' => (int) + * optional - adjust the size of your result from the default value of 20 + * to between 1 and 100 results. + * 'start' => (int) + * optional - adjust the range of your result set. + * Set this number to larger than zero and you will receive + * the portion of Technorati's total result set ranging from start to start+limit. + * The default start value is 1. + * 'current' => (true|false) + * optional - the default setting of true + * Technorati returns links that are currently on a weblog's homepage. + * Set this parameter to false if you would like to receive all links + * to the given URL regardless of their current placement on the source blog. + * Internally the value is converted in (yes|no). + * 'claim' => (true|false) + * optional - the default setting of FALSE returns no user information + * about each weblog included in the result set when available. + * Set this parameter to FALSE to include Technorati member data + * in the result set when a weblog in your result set + * has been successfully claimed by a member of Technorati. + * Internally the value is converted in (int). + * 'highlight' => (true|false) + * optional - the default setting of TRUE + * highlights the citation of the given URL within the weblog excerpt. + * Set this parameter to FALSE to apply no special markup to the blog excerpt. + * Internally the value is converted in (int). + * + * @param string $url the URL you are searching for. Prefixes http:// and www. are optional. + * @param array $options additional parameters to refine your query + * @return Zend_Service_Technorati_CosmosResultSet + * @throws Zend_Service_Technorati_Exception + * @link http://technorati.com/developers/api/cosmos.html Technorati API: Cosmos Query reference + */ + public function cosmos($url, $options = null) + { + static $defaultOptions = array( 'type' => 'link', + 'start' => 1, + 'limit' => 20, + 'current' => 'yes', + 'format' => 'xml', + 'claim' => 0, + 'highlight' => 1, + ); + + $options['url'] = $url; + + $options = $this->_prepareOptions($options, $defaultOptions); + $this->_validateCosmos($options); + $response = $this->_makeRequest(self::API_PATH_COSMOS, $options); + $dom = $this->_convertResponseAndCheckContent($response); + + /** + * @see Zend_Service_Technorati_CosmosResultSet + */ + require_once 'Zend/Service/Technorati/CosmosResultSet.php'; + return new Zend_Service_Technorati_CosmosResultSet($dom, $options); + } + + /** + * Search lets you see what blogs contain a given search string. + * + * Query options include: + * + * 'language' => (string) + * optional - a ISO 639-1 two character language code + * to retrieve results specific to that language. + * This feature is currently beta and may not work for all languages. + * 'authority' => (n|a1|a4|a7) + * optional - filter results to those from blogs with at least + * the Technorati Authority specified. + * Technorati calculates a blog's authority by how many people link to it. + * Filtering by authority is a good way to refine your search results. + * There are four settings: + * - n => Any authority: All results. + * - a1 => A little authority: Results from blogs with at least one link. + * - a4 => Some authority: Results from blogs with a handful of links. + * - a7 => A lot of authority: Results from blogs with hundreds of links. + * 'limit' => (int) + * optional - adjust the size of your result from the default value of 20 + * to between 1 and 100 results. + * 'start' => (int) + * optional - adjust the range of your result set. + * Set this number to larger than zero and you will receive + * the portion of Technorati's total result set ranging from start to start+limit. + * The default start value is 1. + * 'claim' => (true|false) + * optional - the default setting of FALSE returns no user information + * about each weblog included in the result set when available. + * Set this parameter to FALSE to include Technorati member data + * in the result set when a weblog in your result set + * has been successfully claimed by a member of Technorati. + * Internally the value is converted in (int). + * + * @param string $query the words you are searching for. + * @param array $options additional parameters to refine your query + * @return Zend_Service_Technorati_SearchResultSet + * @throws Zend_Service_Technorati_Exception + * @link http://technorati.com/developers/api/search.html Technorati API: Search Query reference + */ + public function search($query, $options = null) + { + static $defaultOptions = array( 'start' => 1, + 'limit' => 20, + 'format' => 'xml', + 'claim' => 0); + + $options['query'] = $query; + + $options = $this->_prepareOptions($options, $defaultOptions); + $this->_validateSearch($options); + $response = $this->_makeRequest(self::API_PATH_SEARCH, $options); + $dom = $this->_convertResponseAndCheckContent($response); + + /** + * @see Zend_Service_Technorati_SearchResultSet + */ + require_once 'Zend/Service/Technorati/SearchResultSet.php'; + return new Zend_Service_Technorati_SearchResultSet($dom, $options); + } + + /** + * Tag lets you see what posts are associated with a given tag. + * + * Query options include: + * + * 'limit' => (int) + * optional - adjust the size of your result from the default value of 20 + * to between 1 and 100 results. + * 'start' => (int) + * optional - adjust the range of your result set. + * Set this number to larger than zero and you will receive + * the portion of Technorati's total result set ranging from start to start+limit. + * The default start value is 1. + * 'excerptsize' => (int) + * optional - number of word characters to include in the post excerpts. + * By default 100 word characters are returned. + * 'topexcerptsize' => (int) + * optional - number of word characters to include in the first post excerpt. + * By default 150 word characters are returned. + * + * @param string $tag the tag term you are searching posts for. + * @param array $options additional parameters to refine your query + * @return Zend_Service_Technorati_TagResultSet + * @throws Zend_Service_Technorati_Exception + * @link http://technorati.com/developers/api/tag.html Technorati API: Tag Query reference + */ + public function tag($tag, $options = null) + { + static $defaultOptions = array( 'start' => 1, + 'limit' => 20, + 'format' => 'xml', + 'excerptsize' => 100, + 'topexcerptsize' => 150); + + $options['tag'] = $tag; + + $options = $this->_prepareOptions($options, $defaultOptions); + $this->_validateTag($options); + $response = $this->_makeRequest(self::API_PATH_TAG, $options); + $dom = $this->_convertResponseAndCheckContent($response); + + /** + * @see Zend_Service_Technorati_TagResultSet + */ + require_once 'Zend/Service/Technorati/TagResultSet.php'; + return new Zend_Service_Technorati_TagResultSet($dom, $options); + } + + /** + * TopTags provides daily counts of posts containing the queried keyword. + * + * Query options include: + * + * 'days' => (int) + * optional - Used to specify the number of days in the past + * to request daily count data for. + * Can be any integer between 1 and 180, default is 180 + * + * @param string $q the keyword query + * @param array $options additional parameters to refine your query + * @return Zend_Service_Technorati_DailyCountsResultSet + * @throws Zend_Service_Technorati_Exception + * @link http://technorati.com/developers/api/dailycounts.html Technorati API: DailyCounts Query reference + */ + public function dailyCounts($query, $options = null) + { + static $defaultOptions = array( 'days' => 180, + 'format' => 'xml' + ); + + $options['q'] = $query; + + $options = $this->_prepareOptions($options, $defaultOptions); + $this->_validateDailyCounts($options); + $response = $this->_makeRequest(self::API_PATH_DAILYCOUNTS, $options); + $dom = $this->_convertResponseAndCheckContent($response); + + /** + * @see Zend_Service_Technorati_DailyCountsResultSet + */ + require_once 'Zend/Service/Technorati/DailyCountsResultSet.php'; + return new Zend_Service_Technorati_DailyCountsResultSet($dom); + } + + /** + * TopTags provides information on top tags indexed by Technorati. + * + * Query options include: + * + * 'limit' => (int) + * optional - adjust the size of your result from the default value of 20 + * to between 1 and 100 results. + * 'start' => (int) + * optional - adjust the range of your result set. + * Set this number to larger than zero and you will receive + * the portion of Technorati's total result set ranging from start to start+limit. + * The default start value is 1. + * + * @param array $options additional parameters to refine your query + * @return Zend_Service_Technorati_TagsResultSet + * @throws Zend_Service_Technorati_Exception + * @link http://technorati.com/developers/api/toptags.html Technorati API: TopTags Query reference + */ + public function topTags($options = null) + { + static $defaultOptions = array( 'start' => 1, + 'limit' => 20, + 'format' => 'xml' + ); + + $options = $this->_prepareOptions($options, $defaultOptions); + $this->_validateTopTags($options); + $response = $this->_makeRequest(self::API_PATH_TOPTAGS, $options); + $dom = $this->_convertResponseAndCheckContent($response); + + /** + * @see Zend_Service_Technorati_TagsResultSet + */ + require_once 'Zend/Service/Technorati/TagsResultSet.php'; + return new Zend_Service_Technorati_TagsResultSet($dom); + } + + /** + * BlogInfo provides information on what blog, if any, is associated with a given URL. + * + * @param string $url the URL you are searching for. Prefixes http:// and www. are optional. + * The URL must be recognized by Technorati as a blog. + * @param array $options additional parameters to refine your query + * @return Zend_Service_Technorati_BlogInfoResult + * @throws Zend_Service_Technorati_Exception + * @link http://technorati.com/developers/api/bloginfo.html Technorati API: BlogInfo Query reference + */ + public function blogInfo($url, $options = null) + { + static $defaultOptions = array( 'format' => 'xml' + ); + + $options['url'] = $url; + + $options = $this->_prepareOptions($options, $defaultOptions); + $this->_validateBlogInfo($options); + $response = $this->_makeRequest(self::API_PATH_BLOGINFO, $options); + $dom = $this->_convertResponseAndCheckContent($response); + + /** + * @see Zend_Service_Technorati_BlogInfoResult + */ + require_once 'Zend/Service/Technorati/BlogInfoResult.php'; + return new Zend_Service_Technorati_BlogInfoResult($dom); + } + + /** + * BlogPostTags provides information on the top tags used by a specific blog. + * + * Query options include: + * + * 'limit' => (int) + * optional - adjust the size of your result from the default value of 20 + * to between 1 and 100 results. + * 'start' => (int) + * optional - adjust the range of your result set. + * Set this number to larger than zero and you will receive + * the portion of Technorati's total result set ranging from start to start+limit. + * The default start value is 1. + * Note. This property is not documented. + * + * @param string $url the URL you are searching for. Prefixes http:// and www. are optional. + * The URL must be recognized by Technorati as a blog. + * @param array $options additional parameters to refine your query + * @return Zend_Service_Technorati_TagsResultSet + * @throws Zend_Service_Technorati_Exception + * @link http://technorati.com/developers/api/blogposttags.html Technorati API: BlogPostTags Query reference + */ + public function blogPostTags($url, $options = null) + { + static $defaultOptions = array( 'start' => 1, + 'limit' => 20, + 'format' => 'xml' + ); + + $options['url'] = $url; + + $options = $this->_prepareOptions($options, $defaultOptions); + $this->_validateBlogPostTags($options); + $response = $this->_makeRequest(self::API_PATH_BLOGPOSTTAGS, $options); + $dom = $this->_convertResponseAndCheckContent($response); + + /** + * @see Zend_Service_Technorati_TagsResultSet + */ + require_once 'Zend/Service/Technorati/TagsResultSet.php'; + return new Zend_Service_Technorati_TagsResultSet($dom); + } + + /** + * GetInfo query tells you things that Technorati knows about a member. + * + * The returned info is broken up into two sections: + * The first part describes some information that the user wants + * to allow people to know about him- or herself. + * The second part of the document is a listing of the weblogs + * that the user has successfully claimed and the information + * that Technorati knows about these weblogs. + * + * @param string $username the Technorati user name you are searching for + * @param array $options additional parameters to refine your query + * @return Zend_Service_Technorati_GetInfoResult + * @throws Zend_Service_Technorati_Exception + * @link http://technorati.com/developers/api/getinfo.html Technorati API: GetInfo reference + */ + public function getInfo($username, $options = null) + { + static $defaultOptions = array('format' => 'xml'); + + $options['username'] = $username; + + $options = $this->_prepareOptions($options, $defaultOptions); + $this->_validateGetInfo($options); + $response = $this->_makeRequest(self::API_PATH_GETINFO, $options); + $dom = $this->_convertResponseAndCheckContent($response); + + /** + * @see Zend_Service_Technorati_GetInfoResult + */ + require_once 'Zend/Service/Technorati/GetInfoResult.php'; + return new Zend_Service_Technorati_GetInfoResult($dom); + } + + /** + * KeyInfo query provides information on daily usage of an API key. + * Key Info Queries do not count against a key's daily query limit. + * + * A day is defined as 00:00-23:59 Pacific time. + * + * @return Zend_Service_Technorati_KeyInfoResult + * @throws Zend_Service_Technorati_Exception + * @link http://developers.technorati.com/wiki/KeyInfo Technorati API: Key Info reference + */ + public function keyInfo() + { + static $defaultOptions = array(); + + $options = $this->_prepareOptions(array(), $defaultOptions); + // you don't need to validate this request + // because key is the only mandatory element + // and it's already set in #_prepareOptions + $response = $this->_makeRequest(self::API_PATH_KEYINFO, $options); + $dom = $this->_convertResponseAndCheckContent($response); + + /** + * @see Zend_Service_Technorati_KeyInfoResult + */ + require_once 'Zend/Service/Technorati/KeyInfoResult.php'; + return new Zend_Service_Technorati_KeyInfoResult($dom, $this->_apiKey); + } + + + /** + * Returns Technorati API key. + * + * @return string Technorati API key + */ + public function getApiKey() + { + return $this->_apiKey; + } + + /** + * Returns a reference to the REST client object in use. + * + * If the reference hasn't being inizialized yet, + * then a new Zend_Rest_Client instance is created. + * + * @return Zend_Rest_Client + */ + public function getRestClient() + { + if (is_null($this->_restClient)) { + /** + * @see Zend_Rest_Client + */ + require_once 'Zend/Rest/Client.php'; + $this->_restClient = new Zend_Rest_Client(self::API_URI_BASE); + } + + return $this->_restClient; + } + + /** + * Sets Technorati API key. + * + * Be aware that this function doesn't validate the key. + * The key is validated as soon as the first API request is sent. + * If the key is invalid, the API request method will throw + * a Zend_Service_Technorati_Exception exception with Invalid Key message. + * + * @param string $key Technorati API Key + * @return void + * @link http://technorati.com/developers/apikey.html How to get your Technorati API Key + */ + public function setApiKey($key) + { + $this->_apiKey = $key; + return $this; + } + + + /** + * Validates Cosmos query options. + * + * @param array $options + * @return void + * @throws Zend_Service_Technorati_Exception + * @access protected + */ + protected function _validateCosmos(array $options) + { + static $validOptions = array('key', 'url', + 'type', 'limit', 'start', 'current', 'claim', 'highlight', 'format'); + + // Validate keys in the $options array + $this->_compareOptions($options, $validOptions); + // Validate url (required) + $this->_validateOptionUrl($options); + // Validate limit (optional) + $this->_validateOptionLimit($options); + // Validate start (optional) + $this->_validateOptionStart($options); + // Validate format (optional) + $this->_validateOptionFormat($options); + // Validate type (optional) + $this->_validateInArrayOption('type', $options, array('link', 'weblog')); + // Validate claim (optional) + $this->_validateOptionClaim($options); + // Validate highlight (optional) + $this->_validateIntegerOption('highlight', $options); + // Validate current (optional) + if (isset($options['current'])) { + $tmp = (int) $options['current']; + $options['current'] = $tmp ? 'yes' : 'no'; + } + + } + + /** + * Validates Search query options. + * + * @param array $options + * @return void + * @throws Zend_Service_Technorati_Exception + * @access protected + */ + protected function _validateSearch(array $options) + { + static $validOptions = array('key', 'query', + 'language', 'authority', 'limit', 'start', 'claim', 'format'); + + // Validate keys in the $options array + $this->_compareOptions($options, $validOptions); + // Validate query (required) + $this->_validateMandatoryOption('query', $options); + // Validate authority (optional) + $this->_validateInArrayOption('authority', $options, array('n', 'a1', 'a4', 'a7')); + // Validate limit (optional) + $this->_validateOptionLimit($options); + // Validate start (optional) + $this->_validateOptionStart($options); + // Validate claim (optional) + $this->_validateOptionClaim($options); + // Validate format (optional) + $this->_validateOptionFormat($options); + } + + /** + * Validates Tag query options. + * + * @param array $options + * @return void + * @throws Zend_Service_Technorati_Exception + * @access protected + */ + protected function _validateTag(array $options) + { + static $validOptions = array('key', 'tag', + 'limit', 'start', 'excerptsize', 'topexcerptsize', 'format'); + + // Validate keys in the $options array + $this->_compareOptions($options, $validOptions); + // Validate query (required) + $this->_validateMandatoryOption('tag', $options); + // Validate limit (optional) + $this->_validateOptionLimit($options); + // Validate start (optional) + $this->_validateOptionStart($options); + // Validate excerptsize (optional) + $this->_validateIntegerOption('excerptsize', $options); + // Validate excerptsize (optional) + $this->_validateIntegerOption('topexcerptsize', $options); + // Validate format (optional) + $this->_validateOptionFormat($options); + } + + + /** + * Validates DailyCounts query options. + * + * @param array $options + * @return void + * @throws Zend_Service_Technorati_Exception + * @access protected + */ + protected function _validateDailyCounts(array $options) + { + static $validOptions = array('key', 'q', + 'days', 'format'); + + // Validate keys in the $options array + $this->_compareOptions($options, $validOptions); + // Validate q (required) + $this->_validateMandatoryOption('q', $options); + // Validate format (optional) + $this->_validateOptionFormat($options); + // Validate days (optional) + if (isset($options['days'])) { + $options['days'] = (int) $options['days']; + if ($options['days'] < self::PARAM_DAYS_MIN_VALUE || + $options['days'] > self::PARAM_DAYS_MAX_VALUE) { + /** + * @see Zend_Service_Technorati_Exception + */ + require_once 'Zend/Service/Technorati/Exception.php'; + throw new Zend_Service_Technorati_Exception( + "Invalid value '" . $options['days'] . "' for 'days' option"); + } + } + } + + /** + * Validates GetInfo query options. + * + * @param array $options + * @return void + * @throws Zend_Service_Technorati_Exception + * @access protected + */ + protected function _validateGetInfo(array $options) + { + static $validOptions = array('key', 'username', + 'format'); + + // Validate keys in the $options array + $this->_compareOptions($options, $validOptions); + // Validate username (required) + $this->_validateMandatoryOption('username', $options); + // Validate format (optional) + $this->_validateOptionFormat($options); + } + + /** + * Validates TopTags query options. + * + * @param array $options + * @return void + * @throws Zend_Service_Technorati_Exception + * @access protected + */ + protected function _validateTopTags(array $options) + { + static $validOptions = array('key', + 'limit', 'start', 'format'); + + // Validate keys in the $options array + $this->_compareOptions($options, $validOptions); + // Validate limit (optional) + $this->_validateOptionLimit($options); + // Validate start (optional) + $this->_validateOptionStart($options); + // Validate format (optional) + $this->_validateOptionFormat($options); + } + + /** + * Validates BlogInfo query options. + * + * @param array $options + * @return void + * @throws Zend_Service_Technorati_Exception + * @access protected + */ + protected function _validateBlogInfo(array $options) + { + static $validOptions = array('key', 'url', + 'format'); + + // Validate keys in the $options array + $this->_compareOptions($options, $validOptions); + // Validate url (required) + $this->_validateOptionUrl($options); + // Validate format (optional) + $this->_validateOptionFormat($options); + } + + /** + * Validates TopTags query options. + * + * @param array $options + * @return void + * @throws Zend_Service_Technorati_Exception + * @access protected + */ + protected function _validateBlogPostTags(array $options) + { + static $validOptions = array('key', 'url', + 'limit', 'start', 'format'); + + // Validate keys in the $options array + $this->_compareOptions($options, $validOptions); + // Validate url (required) + $this->_validateOptionUrl($options); + // Validate limit (optional) + $this->_validateOptionLimit($options); + // Validate start (optional) + $this->_validateOptionStart($options); + // Validate format (optional) + $this->_validateOptionFormat($options); + } + + /** + * Checks whether an option is in a given array. + * + * @param string $name option name + * @param array $options + * @param array $array array of valid options + * @return void + * @throws Zend_Service_Technorati_Exception + * @access protected + */ + protected function _validateInArrayOption($name, $options, array $array) + { + if (isset($options[$name]) && !in_array($options[$name], $array)) { + /** + * @see Zend_Service_Technorati_Exception + */ + require_once 'Zend/Service/Technorati/Exception.php'; + throw new Zend_Service_Technorati_Exception( + "Invalid value '{$options[$name]}' for '$name' option"); + } + } + + /** + * Checks whether mandatory $name option exists and it's valid. + * + * @param array $options + * @return void + * @throws Zend_Service_Technorati_Exception + * @access protected + */ + protected function _validateMandatoryOption($name, $options) + { + if (!isset($options[$name]) || !trim($options[$name])) { + /** + * @see Zend_Service_Technorati_Exception + */ + require_once 'Zend/Service/Technorati/Exception.php'; + throw new Zend_Service_Technorati_Exception( + "Empty value for '$name' option"); + } + } + + /** + * Checks whether $name option is a valid integer and casts it. + * + * @param array $options + * @return void + * @access protected + */ + protected function _validateIntegerOption($name, $options) + { + if (isset($options[$name])) { + $options[$name] = (int) $options[$name]; + } + } + + /** + * Makes and HTTP GET request to given $path with $options. + * HTTP Response is first validated, then returned. + * + * @param string $path + * @param array $options + * @return Zend_Http_Response + * @throws Zend_Service_Technorati_Exception on failure + * @access protected + */ + protected function _makeRequest($path, $options = array()) + { + $restClient = $this->getRestClient(); + $restClient->getHttpClient()->resetParameters(); + $response = $restClient->restGet($path, $options); + self::_checkResponse($response); + return $response; + } + + /** + * Checks whether 'claim' option value is valid. + * + * @param array $options + * @return void + * @access protected + */ + protected function _validateOptionClaim(array $options) + { + $this->_validateIntegerOption('claim', $options); + } + + /** + * Checks whether 'format' option value is valid. + * Be aware that Zend_Service_Technorati supports only XML as format value. + * + * @param array $options + * @return void + * @throws Zend_Service_Technorati_Exception if 'format' value != XML + * @access protected + */ + protected function _validateOptionFormat(array $options) + { + if (isset($options['format']) && $options['format'] != 'xml') { + /** + * @see Zend_Service_Technorati_Exception + */ + require_once 'Zend/Service/Technorati/Exception.php'; + throw new Zend_Service_Technorati_Exception( + "Invalid value '" . $options['format'] . "' for 'format' option. " . + "Zend_Service_Technorati supports only 'xml'"); + } + } + + /** + * Checks whether 'limit' option value is valid. + * Value must be an integer greater than PARAM_LIMIT_MIN_VALUE + * and lower than PARAM_LIMIT_MAX_VALUE. + * + * @param array $options + * @return void + * @throws Zend_Service_Technorati_Exception if 'limit' value is invalid + * @access protected + */ + protected function _validateOptionLimit(array $options) + { + if (!isset($options['limit'])) return; + + $options['limit'] = (int) $options['limit']; + if ($options['limit'] < self::PARAM_LIMIT_MIN_VALUE || + $options['limit'] > self::PARAM_LIMIT_MAX_VALUE) { + /** + * @see Zend_Service_Technorati_Exception + */ + require_once 'Zend/Service/Technorati/Exception.php'; + throw new Zend_Service_Technorati_Exception( + "Invalid value '" . $options['limit'] . "' for 'limit' option"); + } + } + + /** + * Checks whether 'start' option value is valid. + * Value must be an integer greater than 0. + * + * @param array $options + * @return void + * @throws Zend_Service_Technorati_Exception if 'start' value is invalid + * @access protected + */ + protected function _validateOptionStart(array $options) + { + if (!isset($options['start'])) return; + + $options['start'] = (int) $options['start']; + if ($options['start'] < self::PARAM_START_MIN_VALUE) { + /** + * @see Zend_Service_Technorati_Exception + */ + require_once 'Zend/Service/Technorati/Exception.php'; + throw new Zend_Service_Technorati_Exception( + "Invalid value '" . $options['start'] . "' for 'start' option"); + } + } + + /** + * Checks whether 'url' option value exists and is valid. + * 'url' must be a valid HTTP(s) URL. + * + * @param array $options + * @return void + * @throws Zend_Service_Technorati_Exception if 'url' value is invalid + * @access protected + * @todo support for Zend_Uri_Http + */ + protected function _validateOptionUrl(array $options) + { + $this->_validateMandatoryOption('url', $options); + } + + /** + * Checks XML response content for errors. + * + * @param DomDocument $dom the XML response as a DOM document + * @return void + * @throws Zend_Service_Technorati_Exception + * @link http://technorati.com/developers/api/error.html Technorati API: Error response + * @access protected + */ + protected static function _checkErrors(DomDocument $dom) + { + $xpath = new DOMXPath($dom); + + $result = $xpath->query("/tapi/document/result/error"); + if ($result->length >= 1) { + $error = $result->item(0)->nodeValue; + /** + * @see Zend_Service_Technorati_Exception + */ + require_once 'Zend/Service/Technorati/Exception.php'; + throw new Zend_Service_Technorati_Exception($error); + } + } + + /** + * Converts $response body to a DOM object and checks it. + * + * @param Zend_Http_Response $response + * @return DOMDocument + * @throws Zend_Service_Technorati_Exception if response content contains an error message + * @access protected + */ + protected function _convertResponseAndCheckContent(Zend_Http_Response $response) + { + $dom = new DOMDocument(); + $dom->loadXML($response->getBody()); + self::_checkErrors($dom); + return $dom; + } + + /** + * Checks ReST response for errors. + * + * @param Zend_Http_Response $response the ReST response + * @return void + * @throws Zend_Service_Technorati_Exception + * @access protected + */ + protected static function _checkResponse(Zend_Http_Response $response) + { + if ($response->isError()) { + /** + * @see Zend_Service_Technorati_Exception + */ + require_once 'Zend/Service/Technorati/Exception.php'; + throw new Zend_Service_Technorati_Exception(sprintf( + 'Invalid response status code (HTTP/%s %s %s)', + $response->getVersion(), $response->getStatus(), $response->getMessage())); + } + } + + /** + * Checks whether user given options are valid. + * + * @param array $options user options + * @param array $validOptions valid options + * @return void + * @throws Zend_Service_Technorati_Exception + * @access protected + */ + protected function _compareOptions(array $options, array $validOptions) + { + $difference = array_diff(array_keys($options), $validOptions); + if ($difference) { + /** + * @see Zend_Service_Technorati_Exception + */ + require_once 'Zend/Service/Technorati/Exception.php'; + throw new Zend_Service_Technorati_Exception( + "The following parameters are invalid: '" . + implode("', '", $difference) . "'"); + } + } + + /** + * Prepares options for the request + * + * @param array $options user options + * @param array $defaultOptions default options + * @return array Merged array of user and default/required options. + * @access protected + */ + protected function _prepareOptions($options, array $defaultOptions) + { + $options = (array) $options; // force cast to convert null to array() + $options['key'] = $this->_apiKey; + $options = array_merge($defaultOptions, $options); + return $options; + } +} diff --git a/libs/Zend/Service/Technorati/Author.php b/libs/Zend/Service/Technorati/Author.php new file mode 100644 index 0000000..e6d5b46 --- /dev/null +++ b/libs/Zend/Service/Technorati/Author.php @@ -0,0 +1,242 @@ +ownerDocument); + + $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() { + return $this->_firstName; + } + + /** + * Returns Author last name. + * + * @return string Author last name + */ + public function getLastName() { + return $this->_lastName; + } + + /** + * Returns Technorati account username. + * + * @return string Technorati account username + */ + public function getUsername() { + return $this->_username; + } + + /** + * Returns Technorati account description. + * + * @return string Technorati account description + */ + public function getDescription() { + return $this->_description; + } + + /** + * Returns Technorati account biography. + * + * @return string Technorati account biography + */ + public function getBio() { + return $this->_bio; + } + + /** + * Returns Technorati account thumbnail picture. + * + * @return null|Zend_Uri_Http Technorati account thumbnail picture + */ + public function getThumbnailPicture() { + return $this->_thumbnailPicture; + } + + + /** + * Sets author first name. + * + * @param string $input first Name input value + * @return Zend_Service_Technorati_Author $this instance + */ + public function setFirstName($input) { + $this->_firstName = (string) $input; + return $this; + } + + /** + * Sets author last name. + * + * @param string $input last Name input value + * @return Zend_Service_Technorati_Author $this instance + */ + public function setLastName($input) { + $this->_lastName = (string) $input; + return $this; + } + + /** + * Sets Technorati account username. + * + * @param string $input username input value + * @return Zend_Service_Technorati_Author $this instance + */ + public function setUsername($input) { + $this->_username = (string) $input; + return $this; + } + + /** + * Sets Technorati account biography. + * + * @param string $input biography input value + * @return Zend_Service_Technorati_Author $this instance + */ + public function setBio($input) { + $this->_bio = (string) $input; + return $this; + } + + /** + * Sets Technorati account description. + * + * @param string $input description input value + * @return Zend_Service_Technorati_Author $this instance + */ + public function setDescription($input) { + $this->_description = (string) $input; + return $this; + } + + /** + * 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 + * (via Zend_Service_Technorati_Utils::normalizeUriHttp) + */ + public function setThumbnailPicture($input) { + $this->_thumbnailPicture = Zend_Service_Technorati_Utils::normalizeUriHttp($input); + return $this; + } + +} diff --git a/libs/Zend/Service/Technorati/BlogInfoResult.php b/libs/Zend/Service/Technorati/BlogInfoResult.php new file mode 100644 index 0000000..c1faf7f --- /dev/null +++ b/libs/Zend/Service/Technorati/BlogInfoResult.php @@ -0,0 +1,161 @@ +query('//result/weblog'); + if ($result->length == 1) { + $this->_weblog = new Zend_Service_Technorati_Weblog($result->item(0)); + } else { + // follow the same behavior of blogPostTags + // and raise an Exception if the URL is not a valid weblog + /** + * @see Zend_Service_Technorati_Exception + */ + require_once 'Zend/Service/Technorati/Exception.php'; + 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 + // 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) { + if ($this->getWeblog() instanceof Zend_Service_Technorati_Weblog) { + $this->_url = $this->getWeblog()->getUrl(); + } + } + } + + $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() + { + return (int) $this->_inboundBlogs; + } + + /** + * Returns number of incoming links to this blog. + * + * @return integer the number of inbound links + */ + public function getInboundLinks() + { + return (int) $this->_inboundLinks; + } + +} diff --git a/libs/Zend/Service/Technorati/CosmosResult.php b/libs/Zend/Service/Technorati/CosmosResult.php new file mode 100644 index 0000000..8c27d12 --- /dev/null +++ b/libs/Zend/Service/Technorati/CosmosResult.php @@ -0,0 +1,152 @@ +_fields = array( '_nearestPermalink' => 'nearestpermalink', + '_excerpt' => 'excerpt', + '_linkCreated' => 'linkcreated', + '_linkUrl' => 'linkurl'); + parent::__construct($dom); + + // 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); + $this->_linkCreated = Zend_Service_Technorati_Utils::normalizeDate($this->_linkCreated); + } + + /** + * Returns the weblog object that links queried URL. + * + * @return Zend_Service_Technorati_Weblog + */ + public function getWeblog() { + return $this->_weblog; + } + + /** + * Returns the nearest permalink tracked for queried URL. + * + * @return Zend_Uri_Http + */ + public function getNearestPermalink() { + return $this->_nearestPermalink; + } + + /** + * 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 new file mode 100644 index 0000000..f139c8f --- /dev/null +++ b/libs/Zend/Service/Technorati/CosmosResultSet.php @@ -0,0 +1,176 @@ +_xpath->query('/tapi/document/result/inboundlinks/text()'); + if ($result->length == 1) $this->_inboundLinks = (int) $result->item(0)->data; + + $result = $this->_xpath->query('/tapi/document/result/inboundblogs/text()'); + if ($result->length == 1) $this->_inboundBlogs = (int) $result->item(0)->data; + + $result = $this->_xpath->query('/tapi/document/result/weblog'); + if ($result->length == 1) { + /** + * @see Zend_Service_Technorati_Weblog + */ + require_once 'Zend/Service/Technorati/Weblog.php'; + $this->_weblog = new Zend_Service_Technorati_Weblog($result->item(0)); + } + + $result = $this->_xpath->query('/tapi/document/result/url/text()'); + if ($result->length == 1) { + try { + // 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) { + if ($this->getWeblog() instanceof Zend_Service_Technorati_Weblog) { + $this->_url = $this->getWeblog()->getUrl(); + } + } + } + + $this->_totalResultsReturned = (int) $this->_xpath->evaluate("count(/tapi/document/item)"); + + // total number of results depends on query type + // for now check only getInboundLinks() and getInboundBlogs() value + if ((int) $this->getInboundLinks() > 0) { + $this->_totalResultsAvailable = $this->getInboundLinks(); + } elseif ((int) $this->getInboundBlogs() > 0) { + $this->_totalResultsAvailable = $this->getInboundBlogs(); + } else { + $this->_totalResultsAvailable = 0; + } + } + + + /** + * 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() + { + return $this->_inboundBlogs; + } + + /** + * Returns number of incoming links to this blog. + * + * @return integer the number of inbound links + */ + public function getInboundLinks() + { + return $this->_inboundLinks; + } + + /** + * Implements Zend_Service_Technorati_ResultSet::current(). + * + * @return Zend_Service_Technorati_CosmosResult current result + */ + public function current() + { + /** + * @see Zend_Service_Technorati_CosmosResult + */ + require_once 'Zend/Service/Technorati/CosmosResult.php'; + return new Zend_Service_Technorati_CosmosResult($this->_results->item($this->_currentIndex)); + } +} diff --git a/libs/Zend/Service/Technorati/DailyCountsResult.php b/libs/Zend/Service/Technorati/DailyCountsResult.php new file mode 100644 index 0000000..2d3e581 --- /dev/null +++ b/libs/Zend/Service/Technorati/DailyCountsResult.php @@ -0,0 +1,93 @@ +_fields = array( '_date' => 'date', + '_count' => 'count'); + parent::__construct($dom); + + // filter fields + $this->_date = new Zend_Date(strtotime($this->_date)); + $this->_count = (int) $this->_count; + } + + /** + * 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() { + return $this->_count; + } +} diff --git a/libs/Zend/Service/Technorati/DailyCountsResultSet.php b/libs/Zend/Service/Technorati/DailyCountsResultSet.php new file mode 100644 index 0000000..99d06b2 --- /dev/null +++ b/libs/Zend/Service/Technorati/DailyCountsResultSet.php @@ -0,0 +1,125 @@ +_xpath->query('/tapi/document/result/days/text()'); + if ($result->length == 1) $this->_days = (int) $result->item(0)->data; + + $result = $this->_xpath->query('/tapi/document/result/searchurl/text()'); + if ($result->length == 1) { + $this->_searchUrl = Zend_Service_Technorati_Utils::normalizeUriHttp($result->item(0)->data); + } + + $this->_totalResultsReturned = (int) $this->_xpath->evaluate("count(/tapi/document/items/item)"); + $this->_totalResultsAvailable = (int) $this->getDays(); + } + + + /** + * Returns the search URL for given query. + * + * @return Zend_Uri_Http + */ + public function getSearchUrl() { + return $this->_searchUrl; + } + + /** + * Returns the number of days for which counts provided. + * + * @return int + */ + public function getDays() { + return $this->_days; + } + + /** + * Implements Zend_Service_Technorati_ResultSet::current(). + * + * @return Zend_Service_Technorati_DailyCountsResult current result + */ + public function current() + { + /** + * @see Zend_Service_Technorati_DailyCountsResult + */ + require_once 'Zend/Service/Technorati/DailyCountsResult.php'; + return new Zend_Service_Technorati_DailyCountsResult($this->_results->item($this->_currentIndex)); + } +} diff --git a/libs/Zend/Service/Technorati/Exception.php b/libs/Zend/Service/Technorati/Exception.php new file mode 100644 index 0000000..6e3d368 --- /dev/null +++ b/libs/Zend/Service/Technorati/Exception.php @@ -0,0 +1,39 @@ +query('//result'); + if ($result->length == 1) { + $this->_author = new Zend_Service_Technorati_Author($result->item(0)); + } + + /** + * @see Zend_Service_Technorati_Weblog + */ + require_once 'Zend/Service/Technorati/Weblog.php'; + + $result = $xpath->query('//item/weblog'); + if ($result->length >= 1) { + foreach ($result as $weblog) { + $this->_weblogs[] = new Zend_Service_Technorati_Weblog($weblog); + } + } + } + + + /** + * Returns the author associated with queried username. + * + * @return Zend_Service_Technorati_Author + */ + public function getAuthor() { + return $this->_author; + } + + /** + * Returns the collection of weblogs authored by queried username. + * + * @return array of Zend_Service_Technorati_Weblog + */ + public function getWeblogs() { + return $this->_weblogs; + } + +} diff --git a/libs/Zend/Service/Technorati/KeyInfoResult.php b/libs/Zend/Service/Technorati/KeyInfoResult.php new file mode 100644 index 0000000..9b15bc9 --- /dev/null +++ b/libs/Zend/Service/Technorati/KeyInfoResult.php @@ -0,0 +1,118 @@ +_dom = $dom; + // $this->_xpath = new DOMXPath($dom); + $xpath = new DOMXPath($dom); + + $this->_apiQueries = (int) $xpath->query('/tapi/document/result/apiqueries/text()')->item(0)->data; + $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 + */ + public function setApiKey($apiKey) { + $this->_apiKey = $apiKey; + return $this; + } +} diff --git a/libs/Zend/Service/Technorati/Result.php b/libs/Zend/Service/Technorati/Result.php new file mode 100644 index 0000000..4d60d29 --- /dev/null +++ b/libs/Zend/Service/Technorati/Result.php @@ -0,0 +1,121 @@ + 'xmlfieldtag' + * + * @var array + * @access protected + */ + protected $_fields; + + /** + * The ReST fragment for this result object + * + * @var DomElement + * @access protected + */ + protected $_dom; + + /** + * Object for $this->_dom + * + * @var DOMXpath + * @access protected + */ + protected $_xpath; + + + /** + * Constructs a new object from DOM Element. + * Properties are automatically fetched from XML + * according to array of $_fields to be read. + * + * @param DomElement $result the ReST fragment for this object + */ + public function __construct(DomElement $dom) + { + $this->_xpath = new DOMXPath($dom->ownerDocument); + $this->_dom = $dom; + + // default fields for all search results + $fields = array(); + + // merge with child's object fields + $this->_fields = array_merge($this->_fields, $fields); + + // add results to appropriate fields + foreach($this->_fields as $phpName => $xmlName) { + $query = "./$xmlName/text()"; + $node = $this->_xpath->query($query, $this->_dom); + if ($node->length == 1) { + $this->{$phpName} = (string) $node->item(0)->data; + } + } + } + + /** + * Parses weblog node and sets weblog object. + * + * @return void + */ + protected function _parseWeblog() + { + // weblog object field + $result = $this->_xpath->query('./weblog', $this->_dom); + if ($result->length == 1) { + /** + * @see Zend_Service_Technorati_Weblog + */ + require_once 'Zend/Service/Technorati/Weblog.php'; + $this->_weblog = new Zend_Service_Technorati_Weblog($result->item(0)); + } else { + $this->_weblog = null; + } + } + + /** + * Returns the document fragment for this object as XML string. + * + * @return string the document fragment for this object + * converted into XML format + */ + public function getXml() + { + return $this->_dom->ownerDocument->saveXML($this->_dom); + } +} diff --git a/libs/Zend/Service/Technorati/ResultSet.php b/libs/Zend/Service/Technorati/ResultSet.php new file mode 100644 index 0000000..6f3335d --- /dev/null +++ b/libs/Zend/Service/Technorati/ResultSet.php @@ -0,0 +1,290 @@ +_dom + * + * @var DOMXpath + * @access protected + */ + protected $_xpath; + + /** + * XML string representation for $this->_dom + * + * @var string + * @access protected + */ + protected $_xml; + + /** + * Current Item + * + * @var int + * @access protected + */ + protected $_currentIndex = 0; + + + /** + * Parses the search response and retrieves the results for iteration. + * + * @param DomDocument $dom the ReST fragment for this object + * @param array $options query options as associative array + */ + public function __construct(DomDocument $dom, $options = array()) + { + $this->_init($dom, $options); + + // Technorati loves to make developer's life really hard + // I must read query options in order to normalize a single way + // to display start and limit. + // The value is printed out in XML using many different tag names, + // too hard to get it from XML + + // Additionally, the following tags should be always available + // according to API documentation but... this is not the truth! + // - querytime + // - limit + // - start (sometimes rankingstart) + + // query tag is only available for some requests, the same for url. + // For now ignore them. + + //$start = isset($options['start']) ? $options['start'] : 1; + //$limit = isset($options['limit']) ? $options['limit'] : 20; + //$this->_firstResultPosition = $start; + } + + /** + * Initializes this object from a DomDocument response. + * + * Because __construct and __wakeup shares some common executions, + * it's useful to group them in a single initialization method. + * This method is called once each time a new instance is created + * or a serialized object is unserialized. + * + * @param DomDocument $dom the ReST fragment for this object + * @param array $options query options as associative array + * * @return void + */ + protected function _init(DomDocument $dom, $options = array()) + { + $this->_dom = $dom; + $this->_xpath = new DOMXPath($dom); + + $this->_results = $this->_xpath->query("//item"); + } + + /** + * Number of results returned. + * + * @return int total number of results returned + */ + public function totalResults() + { + return (int) $this->_totalResultsReturned; + } + + + /** + * Number of available results. + * + * @return int total number of available results + */ + public function totalResultsAvailable() + { + return (int) $this->_totalResultsAvailable; + } + + /** + * Implements SeekableIterator::current(). + * + * @return void + * @throws Zend_Service_Exception + * @abstract + */ + // abstract public function current(); + + /** + * Implements SeekableIterator::key(). + * + * @return int + */ + public function key() + { + return $this->_currentIndex; + } + + /** + * Implements SeekableIterator::next(). + * + * @return void + */ + public function next() + { + $this->_currentIndex += 1; + } + + /** + * Implements SeekableIterator::rewind(). + * + * @return bool + */ + public function rewind() + { + $this->_currentIndex = 0; + return true; + } + + /** + * Implement SeekableIterator::seek(). + * + * @param int $index + * @return void + * @throws OutOfBoundsException + */ + public function seek($index) + { + $indexInt = (int) $index; + if ($indexInt >= 0 && $indexInt < $this->_results->length) { + $this->_currentIndex = $indexInt; + } else { + throw new OutOfBoundsException("Illegal index '$index'"); + } + } + + /** + * Implement SeekableIterator::valid(). + * + * @return boolean + */ + public function valid() + { + return null !== $this->_results && $this->_currentIndex < $this->_results->length; + } + + /** + * Returns the response document as XML string. + * + * @return string the response document converted into XML format + */ + public function getXml() + { + return $this->_dom->saveXML(); + } + + /** + * Overwrites standard __sleep method to make this object serializable. + * + * DomDocument and DOMXpath objects cannot be serialized. + * This method converts them back to an XML string. + * + * @return void + */ + public function __sleep() { + $this->_xml = $this->getXml(); + $vars = array_keys(get_object_vars($this)); + return array_diff($vars, array('_dom', '_xpath')); + } + + /** + * Overwrites standard __wakeup method to make this object unserializable. + * + * Restores object status before serialization. + * Converts XML string into a DomDocument object and creates a valid + * DOMXpath instance for given DocDocument. + * + * @return void + */ + public function __wakeup() { + $dom = new DOMDocument(); + $dom->loadXml($this->_xml); + $this->_init($dom); + $this->_xml = null; // reset XML content + } +} diff --git a/libs/Zend/Service/Technorati/SearchResult.php b/libs/Zend/Service/Technorati/SearchResult.php new file mode 100644 index 0000000..249e16b --- /dev/null +++ b/libs/Zend/Service/Technorati/SearchResult.php @@ -0,0 +1,150 @@ +_fields = array( '_permalink' => 'permalink', + '_excerpt' => 'excerpt', + '_created' => 'created', + '_title' => 'title'); + parent::__construct($dom); + + // weblog object field + $this->_parseWeblog(); + + // filter fields + $this->_permalink = Zend_Service_Technorati_Utils::normalizeUriHttp($this->_permalink); + $this->_created = Zend_Service_Technorati_Utils::normalizeDate($this->_created); + } + + /** + * 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 new file mode 100644 index 0000000..6c00f54 --- /dev/null +++ b/libs/Zend/Service/Technorati/SearchResultSet.php @@ -0,0 +1,79 @@ +_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; + } + + /** + * Implements Zend_Service_Technorati_ResultSet::current(). + * + * @return Zend_Service_Technorati_SearchResult current result + */ + public function current() + { + /** + * @see Zend_Service_Technorati_SearchResult + */ + require_once 'Zend/Service/Technorati/SearchResult.php'; + return new Zend_Service_Technorati_SearchResult($this->_results->item($this->_currentIndex)); + } +} diff --git a/libs/Zend/Service/Technorati/TagResult.php b/libs/Zend/Service/Technorati/TagResult.php new file mode 100644 index 0000000..3dfe14b --- /dev/null +++ b/libs/Zend/Service/Technorati/TagResult.php @@ -0,0 +1,171 @@ +_fields = array( '_permalink' => 'permalink', + '_excerpt' => 'excerpt', + '_created' => 'created', + '_updated' => 'postupdate', + '_title' => 'title'); + parent::__construct($dom); + + // weblog object field + $this->_parseWeblog(); + + // filter fields + $this->_permalink = Zend_Service_Technorati_Utils::normalizeUriHttp($this->_permalink); + $this->_created = Zend_Service_Technorati_Utils::normalizeDate($this->_created); + $this->_updated = Zend_Service_Technorati_Utils::normalizeDate($this->_updated); + } + + /** + * 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 new file mode 100644 index 0000000..fbcba61 --- /dev/null +++ b/libs/Zend/Service/Technorati/TagResultSet.php @@ -0,0 +1,110 @@ +_xpath->query('/tapi/document/result/postsmatched/text()'); + if ($result->length == 1) $this->_postsMatched = (int) $result->item(0)->data; + + $result = $this->_xpath->query('/tapi/document/result/blogsmatched/text()'); + if ($result->length == 1) $this->_blogsMatched = (int) $result->item(0)->data; + + $this->_totalResultsReturned = (int) $this->_xpath->evaluate("count(/tapi/document/item)"); + /** @todo Validate the following assertion */ + $this->_totalResultsAvailable = (int) $this->getPostsMatched(); + } + + + /** + * Returns the number of posts that match the tag. + * + * @return int + */ + public function getPostsMatched() { + return $this->_postsMatched; + } + + /** + * Returns the number of blogs that match the tag. + * + * @return int + */ + public function getBlogsMatched() { + return $this->_blogsMatched; + } + + /** + * Implements Zend_Service_Technorati_ResultSet::current(). + * + * @return Zend_Service_Technorati_TagResult current result + */ + public function current() + { + /** + * @see Zend_Service_Technorati_TagResult + */ + require_once 'Zend/Service/Technorati/TagResult.php'; + return new Zend_Service_Technorati_TagResult($this->_results->item($this->_currentIndex)); + } +} diff --git a/libs/Zend/Service/Technorati/TagsResult.php b/libs/Zend/Service/Technorati/TagsResult.php new file mode 100644 index 0000000..505404b --- /dev/null +++ b/libs/Zend/Service/Technorati/TagsResult.php @@ -0,0 +1,93 @@ +_fields = array( '_tag' => 'tag', + '_posts' => 'posts'); + parent::__construct($dom); + + // filter fields + $this->_tag = (string) $this->_tag; + $this->_posts = (int) $this->_posts; + } + + /** + * Returns the tag name. + * + * @return string + */ + public function getTag() { + return $this->_tag; + } + + /** + * Returns the number of posts. + * + * @return int + */ + public function getPosts() { + return $this->_posts; + } +} diff --git a/libs/Zend/Service/Technorati/TagsResultSet.php b/libs/Zend/Service/Technorati/TagsResultSet.php new file mode 100644 index 0000000..4f1dc16 --- /dev/null +++ b/libs/Zend/Service/Technorati/TagsResultSet.php @@ -0,0 +1,67 @@ +_totalResultsReturned = (int) $this->_xpath->evaluate("count(/tapi/document/item)"); + $this->_totalResultsAvailable = (int) $this->_totalResultsReturned; + } + + /** + * Implements Zend_Service_Technorati_ResultSet::current(). + * + * @return Zend_Service_Technorati_TagsResult current result + */ + public function current() + { + /** + * @see Zend_Service_Technorati_TagsResult + */ + require_once 'Zend/Service/Technorati/TagsResult.php'; + return new Zend_Service_Technorati_TagsResult($this->_results->item($this->_currentIndex)); + } +} diff --git a/libs/Zend/Service/Technorati/Utils.php b/libs/Zend/Service/Technorati/Utils.php new file mode 100644 index 0000000..93bb3d8 --- /dev/null +++ b/libs/Zend/Service/Technorati/Utils.php @@ -0,0 +1,136 @@ +getMessage()); + } + } + + // allow inly Zend_Uri_Http objects or child classes + if (!($uri instanceof Zend_Uri_Http)) { + /** + * @see Zend_Service_Technorati_Exception + */ + 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. + * + * @param mixed|Zend_Date $input + * @return null|Zend_Date + * @throws Zend_Service_Technorati_Exception + * @static + */ + public static function normalizeDate($input) + { + /** + * @see Zend_Date + */ + require_once 'Zend/Date.php'; + /** + * @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) { + return new Zend_Date($input); + } else { + /** + * @see Zend_Service_Technorati_Exception + */ + require_once 'Zend/Service/Technorati/Exception.php'; + throw new Zend_Service_Technorati_Exception("'$input' is not a valid Date/Time"); + } + } + + /** + * @todo public static function xpathQueryAndSet() {} + */ + + /** + * @todo public static function xpathQueryAndSetIf() {} + */ + + /** + * @todo public static function xpathQueryAndSetUnless() {} + */ +} diff --git a/libs/Zend/Service/Technorati/Weblog.php b/libs/Zend/Service/Technorati/Weblog.php new file mode 100644 index 0000000..75354ff --- /dev/null +++ b/libs/Zend/Service/Technorati/Weblog.php @@ -0,0 +1,486 @@ +ownerDocument); + + $result = $xpath->query('./name/text()', $dom); + if ($result->length == 1) $this->setName($result->item(0)->data); + + $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); + + /* The following elements need more attention */ + + $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) { + $this->_authors[] = new Zend_Service_Technorati_Author($author); + } + } + + /** + * 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); + + $result = $xpath->query('./lat/text()', $dom); + if ($result->length == 1) $this->setLat($result->item(0)->data); + + $result = $xpath->query('./lon/text()', $dom); + if ($result->length == 1) $this->setLon($result->item(0)->data); + + $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() + { + return $this->_name; + } + + /** + * Returns weblog URL. + * + * @return null|Zend_Uri_Http object representing weblog base URL + */ + public function getUrl() + { + return $this->_url; + } + + /** + * Returns number of unique blogs linking this blog. + * + * @return integer the number of inbound blogs + */ + public function getInboundBlogs() + { + return $this->_inboundBlogs; + } + + /** + * Returns number of incoming links to this blog. + * + * @return integer the number of inbound links + */ + 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() + { + 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() + { + return $this->_atomUrl; + } + + /** + * Returns UNIX timestamp of the last weblog update. + * + * @return integer UNIX timestamp of the last weblog update + */ + public function getLastUpdate() + { + return $this->_lastUpdate; + } + + /** + * Returns weblog rank value. + * + * Note. This property is not documented. + * + * @return integer weblog rank value + */ + 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() + { + 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() + { + return (bool) $this->_hasPhoto; + } + + /** + * Returns the array of weblog authors. + * + * @return array of Zend_Service_Technorati_Author authors + */ + public function getAuthors() + { + return (array) $this->_authors; + } + + + /** + * Sets weblog name. + * + * @param string $name + * @return Zend_Service_Technorati_Weblog $this instance + */ + public function setName($name) + { + $this->_name = (string) $name; + return $this; + } + + /** + * 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) + { + $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) + { + $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) + { + $this->_inboundLinks = (int) $number; + return $this; + } + + /** + * 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) + { + $this->_rssUrl = Zend_Service_Technorati_Utils::normalizeUriHttp($url); + return $this; + } + + /** + * 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) + { + $this->_atomUrl = Zend_Service_Technorati_Utils::normalizeUriHttp($url); + return $this; + } + + /** + * Sets weblog Last Update timestamp. + * + * $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) + { + $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) + { + $this->_rank = (int) $rank; + return $this; + } + + /** + * Sets weblog latitude coordinate. + * + * @param float $coordinate + * @return Zend_Service_Technorati_Weblog $this instance + */ + 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) + { + $this->_lon = (float) $coordinate; + return $this; + } + + /** + * Sets hasPhoto property. + * + * @param bool $hasPhoto + * @return Zend_Service_Technorati_Weblog $this instance + */ + public function setHasPhoto($hasPhoto) + { + $this->_hasPhoto = (bool) $hasPhoto; + return $this; + } + +} diff --git a/libs/Zend/Service/Twitter.php b/libs/Zend/Service/Twitter.php new file mode 100755 index 0000000..629b423 --- /dev/null +++ b/libs/Zend/Service/Twitter.php @@ -0,0 +1,762 @@ +setUsername($username); + $this->setPassword($password); + $this->setUri('http://twitter.com'); + + $client = self::getHttpClient(); + $client->setHeaders('Accept-Charset', 'ISO-8859-1,utf-8'); + } + + /** + * Retrieve username + * + * @return string + */ + public function getUsername() + { + return $this->_username; + } + + /** + * Set username + * + * @param string $value + * @return Zend_Service_Twitter + */ + public function setUsername($value) + { + $this->_username = $value; + $this->_authInitialized = false; + return $this; + } + + /** + * Retrieve password + * + * @return string + */ + public function getPassword() + { + return $this->_password; + } + + /** + * Set password + * + * @param string $value + * @return Zend_Service_Twitter + */ + public function setPassword($value) + { + $this->_password = $value; + $this->_authInitialized = false; + return $this; + } + + /** + * Proxy service methods + * + * @param string $type + * @return Zend_Service_Twitter + * @throws Zend_Service_Twitter_Exception if method is not in method types list + */ + public function __get($type) + { + if (!in_array($type, $this->_methodTypes)) { + include_once 'Zend/Service/Twitter/Exception.php'; + throw new Zend_Service_Twitter_Exception('Invalid method type "' . $type . '"'); + } + + $this->_methodType = $type; + return $this; + } + + /** + * Method overloading + * + * @param string $method + * @param array $params + * @return mixed + * @throws Zend_Service_Twitter_Exception if unable to find method + */ + public function __call($method, $params) + { + if (empty($this->_methodType)) { + 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'; + throw new Zend_Service_Twitter_Exception('Invalid method "' . $test . '"'); + } + + return call_user_func_array(array($this, $test), $params); + } + + /** + * Initialize HTTP authentication + * + * @return void + */ + protected function _init() + { + $client = self::getHttpClient(); + + $client->resetParameters(); + + if (null == $this->_cookieJar) { + $client->setCookieJar(); + $this->_cookieJar = $client->getCookieJar(); + } else { + $client->setCookieJar($this->_cookieJar); + } + + if (!$this->_authInitialized) { + $client->setAuth($this->getUsername(), $this->getPassword()); + $this->_authInitialized = true; + } + } + + /** + * Set date header + * + * @param int|string $value + * @return void + */ + protected function _setDate($value) + { + if (is_int($value)) { + $date = date($this->_dateFormat, $value); + } else { + $date = date($this->_dateFormat, strtotime($value)); + } + self::getHttpClient()->setHeaders('If-Modified-Since', $date); + } + + /** + * Public Timeline status + * + * @return Zend_Rest_Client_Result + */ + public function statusPublicTimeline() + { + $this->_init(); + $path = '/statuses/public_timeline.xml'; + $response = $this->restGet($path); + return new Zend_Rest_Client_Result($response->getBody()); + } + + /** + * Friend Timeline Status + * + * $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 + * - page: return page X of results + * + * @param array $params + * @return void + */ + public function statusFriendsTimeline(array $params = array()) + { + $this->_init(); + $path = '/statuses/friends_timeline'; + foreach ($params as $key => $value) { + switch (strtolower($key)) { + case 'since': + $this->_setDate($value); + break; + case 'page': + $this->page = (int) $value; + break; + default: + break; + } + } + $path .= '.xml'; + $response = $this->restGet($path); + return new Zend_Rest_Client_Result($response->getBody()); + } + + /** + * User Timeline status + * + * $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 + * - page: return page X of results + * - count: how many statuses to return + * + * @return Zend_Rest_Client_Result + */ + public function statusUserTimeline(array $params = array()) + { + $this->_init(); + $path = '/statuses/user_timeline'; + $_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; + case 'count': + $count = (int) $value; + if (0 >= $count) { + $count = 1; + } elseif (200 < $count) { + $count = 200; + } + $_params['count'] = $count; + break; + default: + break; + } + } + $path .= '.xml'; + $response = $this->restGet($path, $_params); + return new Zend_Rest_Client_Result($response->getBody()); + } + + /** + * Show a single status + * + * @param int $id Id of status to show + * @return Zend_Rest_Client_Result + */ + public function statusShow($id) + { + $this->_init(); + $path = '/statuses/show/' . $id . '.xml'; + $response = $this->restGet($path); + return new Zend_Rest_Client_Result($response->getBody()); + } + + /** + * Update user's current status + * + * @param string $status + * @param int $in_reply_to_status_id + * @return Zend_Rest_Client_Result + * @throws Zend_Service_Twitter_Exception if message is too short or too long + */ + public function statusUpdate($status, $in_reply_to_status_id = null) + { + $this->_init(); + $path = '/statuses/update.xml'; + $len = strlen($status); + if ($len > 140) { + include_once 'Zend/Service/Twitter/Exception.php'; + throw new Zend_Service_Twitter_Exception('Status must be no more than 140 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; + } + + //$this->status = $status; + $response = $this->restPost($path, $data); + return new Zend_Rest_Client_Result($response->getBody()); + } + + /** + * 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 + * + * @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; + break; + case 'page': + $_params['page'] = (int) $value; + break; + default: + break; + } + } + + $response = $this->restGet($path, $_params); + return new Zend_Rest_Client_Result($response->getBody()); + } + + /** + * Destroy a status message + * + * @param int $id ID of status to destroy + * @return Zend_Rest_Client_Result + */ + public function statusDestroy($id) + { + $this->_init(); + $path = '/statuses/destroy/' . (int) $id . '.xml'; + + $response = $this->restPost($path); + return new Zend_Rest_Client_Result($response->getBody()); + } + + /** + * User friends + * + * @param int|string $id Id or username of user for whom to fetch friends + * @return Zend_Rest_Client_Result + */ + public function userFriends(array $params = array()) + { + $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'; + foreach ($params as $key => $value) { + switch (strtolower($key)) { + case 'since': + $this->_setDate($value); + break; + case 'since_id': + $this->since_id = (int) $value; + break; + case 'page': + $this->page = (int) $value; + break; + default: + break; + } + } + $response = $this->restGet($path); + 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'; + foreach ($params as $key => $value) { + switch (strtolower($key)) { + case 'since': + $this->_setDate($value); + break; + case 'since_id': + $this->since_id = (int) $value; + break; + case 'page': + $this->page = (int) $value; + break; + default: + break; + } + } + $response = $this->restGet($path); + 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 = strlen($text); + 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(); + $response = $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'; + foreach ($params as $key => $value) { + switch (strtolower($key)) { + case 'id': + $path .= '/' . $value; + break; + case 'page': + $this->page = (int) $value; + break; + default: + break; + } + } + $path .= '.xml'; + $response = $this->restGet($path); + return new Zend_Rest_Client_Result($response->getBody()); + } + + /** + * Mark a status as a favorite + * + * @param int $id Status ID you want to mark as a favorite + * @return Zend_Rest_Client_Result + */ + public function favoriteCreate($id) + { + $this->_init(); + $path = '/favorites/create/' . (int) $id . '.xml'; + + $response = $this->restPost($path); + return new Zend_Rest_Client_Result($response->getBody()); + } + + /** + * Remove a favorite + * + * @param int $id Status ID you want to de-list as a favorite + * @return Zend_Rest_Client_Result + */ + public function favoriteDestroy($id) + { + $this->_init(); + $path = '/favorites/destroy/' . (int) $id . '.xml'; + + $response = $this->restPost($path); + return new Zend_Rest_Client_Result($response->getBody()); + } +} diff --git a/libs/Zend/Service/Twitter/Exception.php b/libs/Zend/Service/Twitter/Exception.php new file mode 100755 index 0000000..be0108b --- /dev/null +++ b/libs/Zend/Service/Twitter/Exception.php @@ -0,0 +1,32 @@ +setResponseType($responseType); + $this->_uri = Zend_Uri_Http::fromString("http://search.twitter.com"); + + $this->setHeaders('Accept-Charset', 'ISO-8859-1,utf-8'); + } + + /** + * set responseType + * + * @param string $responseType + * @throws Zend_Service_Twitter_Exception + * @return Zend_Service_Twitter_Search + */ + public function setResponseType($responseType = 'json') + { + if(!in_array($responseType, $this->_responseTypes, TRUE)) { + throw new Zend_Service_Twitter_Exception('Invalid Response Type'); + } + $this->_responseType = $responseType; + return $this; + } + + /** + * Retrieve responseType + * + * @return string + */ + public function getResponseType() + { + return $this->_responseType; + } + + /** + * Get the current twitter trends. Currnetly only supports json as the return. + * + * @return array + */ + public function trends() + { + $this->_uri->setPath('/trends.json'); + $this->setUri($this->_uri); + $response = $this->request(); + + return Zend_Json::decode($response->getBody()); + } + + public function search($query, array $params = array()) + { + + $this->_uri->setPath('/search.' . $this->_responseType); + $this->_uri->setQuery(null); + + $_query = array(); + + $_query['q'] = $query; + + foreach($params as $key=>$param) { + switch($key) { + case 'geocode': + case 'lang': + $_query[$key] = $param; + break; + case 'rpp': + $_query[$key] = (intval($param) > 100) ? 100 : intval($param); + break; + case 'since_id': + case 'page': + $_query[$key] = intval($param); + break; + case 'show_user': + $_query[$key] = 'true'; + } + } + + $this->_uri->setQuery($_query); + + $this->setUri($this->_uri); + $response = $this->request(); + + switch($this->_responseType) { + case 'json': + return Zend_Json::decode($response->getBody()); + break; + case 'atom': + return Zend_Feed::importString($response->getBody()); + break; + } + + return ; + } +} diff --git a/libs/Zend/Service/Yahoo.php b/libs/Zend/Service/Yahoo.php new file mode 100644 index 0000000..0fc88a9 --- /dev/null +++ b/libs/Zend/Service/Yahoo.php @@ -0,0 +1,947 @@ +appId = (string) $appId; + /** + * @see Zend_Rest_Client + */ + require_once 'Zend/Rest/Client.php'; + $this->_rest = new Zend_Rest_Client('http://search.yahooapis.com'); + } + + + /** + * Retrieve Inlink Data from siteexplorer.yahoo.com. A basic query + * consists simply of a URL. Additional options that can be + * specified consist of: + * 'results' => int How many results to return, max is 100 + * 'start' => int The start offset for search results + * 'entire_site' => bool Data for the whole site or a single page + * 'omit_inlinks' => (none|domain|subdomain) Filter inlinks from these sources + * + * @param string $query the query being run + * @param array $options any optional parameters + * @return Zend_Service_Yahoo_ResultSet The return set + * @throws Zend_Service_Exception + */ + public function inlinkDataSearch($query, array $options = array()) + { + static $defaultOptions = array('results' => '50', + 'start' => 1); + + $options = $this->_prepareOptions($query, $options, $defaultOptions); + $this->_validateInlinkDataSearch($options); + + $this->_rest->getHttpClient()->resetParameters(); + $this->_rest->setUri('http://search.yahooapis.com'); + $response = $this->_rest->restGet('/SiteExplorerService/V1/inlinkData', $options); + + if ($response->isError()) { + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception('An error occurred sending request. Status code: ' . + $response->getStatus()); + } + + $dom = new DOMDocument(); + $dom->loadXML($response->getBody()); + + self::_checkErrors($dom); + + /** + * @see Zend_Service_Yahoo_InlinkDataResultSet + */ + require_once 'Zend/Service/Yahoo/InlinkDataResultSet.php'; + return new Zend_Service_Yahoo_InlinkDataResultSet($dom); + } + + + /** + * Perform a search of images. The most basic query consists simply + * of a plain text search, but you can also specify the type of + * image, the format, color, etc. + * + * The specific options are: + * 'type' => (all|any|phrase) How to parse the query terms + * 'results' => int How many results to return, max is 50 + * 'start' => int The start offset for search results + * 'format' => (any|bmp|gif|jpeg|png) The type of images to search for + * 'coloration' => (any|color|bw) The coloration of images to search for + * 'adult_ok' => bool Flag to allow 'adult' images. + * + * @param string $query the query to be run + * @param array $options an optional array of query options + * @return Zend_Service_Yahoo_ImageResultSet the search results + * @throws Zend_Service_Exception + */ + public function imageSearch($query, array $options = array()) + { + static $defaultOptions = array('type' => 'all', + 'results' => 10, + 'start' => 1, + 'format' => 'any', + 'coloration' => 'any'); + + $options = $this->_prepareOptions($query, $options, $defaultOptions); + + $this->_validateImageSearch($options); + + $this->_rest->getHttpClient()->resetParameters(); + $this->_rest->setUri('http://search.yahooapis.com'); + $response = $this->_rest->restGet('/ImageSearchService/V1/imageSearch', $options); + + if ($response->isError()) { + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception('An error occurred sending request. Status code: ' . + $response->getStatus()); + } + + $dom = new DOMDocument(); + $dom->loadXML($response->getBody()); + + self::_checkErrors($dom); + + /** + * @see Zend_Service_YahooImageResultSet + */ + require_once 'Zend/Service/Yahoo/ImageResultSet.php'; + return new Zend_Service_Yahoo_ImageResultSet($dom); + } + + + /** + * Perform a search on local.yahoo.com. The basic search + * consists of a query and some fragment of location information; + * for example zipcode, latitude/longitude, or street address. + * + * Query options include: + * 'results' => int How many results to return, max is 50 + * 'start' => int The start offset for search results + * 'sort' => (relevance|title|distance|rating) How to order your results + * + * 'radius' => float The radius (in miles) in which to search + * + * 'longitude' => float The longitude of the location to search around + * 'latitude' => float The latitude of the location to search around + * + * 'zip' => string The zipcode to search around + * + * 'street' => string The street address to search around + * 'city' => string The city for address search + * 'state' => string The state for address search + * 'location' => string An adhoc location string to search around + * + * @param string $query The query string you want to run + * @param array $options The search options, including location + * @return Zend_Service_Yahoo_LocalResultSet The results + * @throws Zend_Service_Exception + */ + public function localSearch($query, array $options = array()) + { + static $defaultOptions = array('results' => 10, + 'start' => 1, + 'sort' => 'distance', + 'radius' => 5); + + $options = $this->_prepareOptions($query, $options, $defaultOptions); + + $this->_validateLocalSearch($options); + + $this->_rest->getHttpClient()->resetParameters(); + $this->_rest->setUri('http://local.yahooapis.com'); + $response = $this->_rest->restGet('/LocalSearchService/V1/localSearch', $options); + + if ($response->isError()) { + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception('An error occurred sending request. Status code: ' . + $response->getStatus()); + } + + $dom = new DOMDocument(); + $dom->loadXML($response->getBody()); + + self::_checkErrors($dom); + + /** + * @see Zend_Service_Yahoo_LocalResultSet + */ + require_once 'Zend/Service/Yahoo/LocalResultSet.php'; + return new Zend_Service_Yahoo_LocalResultSet($dom); + } + + + /** + * Execute a search on news.yahoo.com. This method minimally takes a + * text query to search on. + * + * Query options coonsist of: + * + * 'results' => int How many results to return, max is 50 + * 'start' => int The start offset for search results + * 'sort' => (rank|date) How to order your results + * 'language' => lang The target document language to match + * 'type' => (all|any|phrase) How the query should be parsed + * 'site' => string A site to which your search should be restricted + * + * @param string $query The query to run + * @param array $options The array of optional parameters + * @return Zend_Service_Yahoo_NewsResultSet The query return set + * @throws Zend_Service_Exception + */ + public function newsSearch($query, array $options = array()) + { + static $defaultOptions = array('type' => 'all', + 'start' => 1, + 'sort' => 'rank'); + + $options = $this->_prepareOptions($query, $options, $defaultOptions); + + $this->_validateNewsSearch($options); + + $this->_rest->getHttpClient()->resetParameters(); + $this->_rest->setUri('http://search.yahooapis.com'); + $response = $this->_rest->restGet('/NewsSearchService/V1/newsSearch', $options); + + if ($response->isError()) { + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception('An error occurred sending request. Status code: ' . + $response->getStatus()); + } + + $dom = new DOMDocument(); + $dom->loadXML($response->getBody()); + + self::_checkErrors($dom); + + /** + * @see Zend_Service_Yahoo_NewsResultSet + */ + require_once 'Zend/Service/Yahoo/NewsResultSet.php'; + return new Zend_Service_Yahoo_NewsResultSet($dom); + } + + + /** + * Retrieve Page Data from siteexplorer.yahoo.com. A basic query + * consists simply of a URL. Additional options that can be + * specified consist of: + * 'results' => int How many results to return, max is 100 + * 'start' => int The start offset for search results + * 'domain_only' => bool Data for just the given domain or all sub-domains also + * + * @param string $query the query being run + * @param array $options any optional parameters + * @return Zend_Service_Yahoo_ResultSet The return set + * @throws Zend_Service_Exception + */ + public function pageDataSearch($query, array $options = array()) + { + static $defaultOptions = array('results' => '50', + 'start' => 1); + + $options = $this->_prepareOptions($query, $options, $defaultOptions); + $this->_validatePageDataSearch($options); + + $this->_rest->getHttpClient()->resetParameters(); + $this->_rest->setUri('http://search.yahooapis.com'); + $response = $this->_rest->restGet('/SiteExplorerService/V1/pageData', $options); + + if ($response->isError()) { + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception('An error occurred sending request. Status code: ' . + $response->getStatus()); + } + + $dom = new DOMDocument(); + $dom->loadXML($response->getBody()); + + self::_checkErrors($dom); + + /** + * @see Zend_Service_Yahoo_PageDataResultSet + */ + require_once 'Zend/Service/Yahoo/PageDataResultSet.php'; + return new Zend_Service_Yahoo_PageDataResultSet($dom); + } + + + /** + * Perform a search of videos. The most basic query consists simply + * of a plain text search, but you can also specify the format of + * video. + * + * The specific options are: + * 'type' => (all|any|phrase) How to parse the query terms + * 'results' => int How many results to return, max is 50 + * 'start' => int The start offset for search results + * 'format' => (any|avi|flash|mpeg|msmedia|quicktime|realmedia) The type of videos to search for + * 'adult_ok' => bool Flag to allow 'adult' videos. + * + * @param string $query the query to be run + * @param array $options an optional array of query options + * @return Zend_Service_Yahoo_VideoResultSet the search results + * @throws Zend_Service_Exception + */ + public function videoSearch($query, array $options = array()) + { + static $defaultOptions = array('type' => 'all', + 'results' => 10, + 'start' => 1, + 'format' => 'any'); + + $options = $this->_prepareOptions($query, $options, $defaultOptions); + + $this->_validateVideoSearch($options); + + $this->_rest->getHttpClient()->resetParameters(); + $this->_rest->setUri('http://search.yahooapis.com'); + $response = $this->_rest->restGet('/VideoSearchService/V1/videoSearch', $options); + + if ($response->isError()) { + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception('An error occurred sending request. Status code: ' . + $response->getStatus()); + } + + $dom = new DOMDocument(); + $dom->loadXML($response->getBody()); + + self::_checkErrors($dom); + + /** + * @see Zend_Service_YahooVideoResultSet + */ + require_once 'Zend/Service/Yahoo/VideoResultSet.php'; + return new Zend_Service_Yahoo_VideoResultSet($dom); + } + + + /** + * Perform a web content search on search.yahoo.com. A basic query + * consists simply of a text query. Additional options that can be + * specified consist of: + * 'results' => int How many results to return, max is 50 + * 'start' => int The start offset for search results + * 'language' => lang The target document language to match + * 'type' => (all|any|phrase) How the query should be parsed + * 'site' => string A site to which your search should be restricted + * 'format' => (any|html|msword|pdf|ppt|rss|txt|xls) + * 'adult_ok' => bool permit 'adult' content in the search results + * 'similar_ok' => bool permit similar results in the result set + * 'country' => string The country code for the content searched + * 'license' => (any|cc_any|cc_commercial|cc_modifiable) The license of content being searched + * + * @param string $query the query being run + * @param array $options any optional parameters + * @return Zend_Service_Yahoo_WebResultSet The return set + * @throws Zend_Service_Exception + */ + public function webSearch($query, array $options = array()) + { + static $defaultOptions = array('type' => 'all', + 'start' => 1, + 'license' => 'any', + 'results' => 10, + 'format' => 'any'); + + $options = $this->_prepareOptions($query, $options, $defaultOptions); + $this->_validateWebSearch($options); + + $this->_rest->getHttpClient()->resetParameters(); + $this->_rest->setUri('http://search.yahooapis.com'); + $response = $this->_rest->restGet('/WebSearchService/V1/webSearch', $options); + + if ($response->isError()) { + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception('An error occurred sending request. Status code: ' . + $response->getStatus()); + } + + $dom = new DOMDocument(); + $dom->loadXML($response->getBody()); + + self::_checkErrors($dom); + + /** + * @see Zend_Service_Yahoo_WebResultSet + */ + require_once 'Zend/Service/Yahoo/WebResultSet.php'; + return new Zend_Service_Yahoo_WebResultSet($dom); + } + + + /** + * Returns a reference to the REST client + * + * @return Zend_Rest_Client + */ + public function getRestClient() + { + return $this->_rest; + } + + + /** + * Validate Inlink Data Search Options + * + * @param array $options + * @return void + * @throws Zend_Service_Exception + */ + protected function _validateInlinkDataSearch(array $options) + { + $validOptions = array('appid', 'query', 'results', 'start', 'entire_site', 'omit_inlinks'); + + $this->_compareOptions($options, $validOptions); + + /** + * @see Zend_Validate_Between + */ + require_once 'Zend/Validate/Between.php'; + $between = new Zend_Validate_Between(1, 100, true); + + if (isset($options['results']) && !$between->setMin(1)->setMax(100)->isValid($options['results'])) { + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception("Invalid value for option 'results': {$options['results']}"); + } + + if (isset($options['start']) && !$between->setMin(1)->setMax(1000)->isValid($options['start'])) { + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception("Invalid value for option 'start': {$options['start']}"); + } + + if (isset($options['omit_inlinks'])) { + $this->_validateInArray('omit_inlinks', $options['omit_inlinks'], array('none', 'domain', 'subdomain')); + } + } + + + /** + * Validate Image Search Options + * + * @param array $options + * @return void + * @throws Zend_Service_Exception + */ + protected function _validateImageSearch(array $options) + { + $validOptions = array('appid', 'query', 'type', 'results', 'start', 'format', 'coloration', 'adult_ok'); + + $this->_compareOptions($options, $validOptions); + + if (isset($options['type'])) { + switch($options['type']) { + case 'all': + case 'any': + case 'phrase': + break; + default: + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception("Invalid value for option 'type': '{$options['type']}'"); + } + } + + /** + * @see Zend_Validate_Between + */ + require_once 'Zend/Validate/Between.php'; + $between = new Zend_Validate_Between(1, 50, true); + + if (isset($options['results']) && !$between->setMin(1)->setMax(50)->isValid($options['results'])) { + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception("Invalid value for option 'results': {$options['results']}"); + } + + if (isset($options['start']) && !$between->setMin(1)->setMax(1000)->isValid($options['start'])) { + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception("Invalid value for option 'start': {$options['start']}"); + } + + if (isset($options['format'])) { + switch ($options['format']) { + case 'any': + case 'bmp': + case 'gif': + case 'jpeg': + case 'png': + break; + default: + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception("Invalid value for option 'format': {$options['format']}"); + } + } + + if (isset($options['coloration'])) { + switch ($options['coloration']) { + case 'any': + case 'color': + case 'bw': + break; + default: + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception("Invalid value for option 'coloration': " + . "{$options['coloration']}"); + } + } + } + + + /** + * Validate Local Search Options + * + * @param array $options + * @return void + * @throws Zend_Service_Exception + */ + protected function _validateLocalSearch(array $options) + { + $validOptions = array('appid', 'query', 'results', 'start', 'sort', 'radius', 'street', + 'city', 'state', 'zip', 'location', 'latitude', 'longitude'); + + $this->_compareOptions($options, $validOptions); + + /** + * @see Zend_Validate_Between + */ + require_once 'Zend/Validate/Between.php'; + $between = new Zend_Validate_Between(1, 20, true); + + if (isset($options['results']) && !$between->setMin(1)->setMax(20)->isValid($options['results'])) { + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception("Invalid value for option 'results': {$options['results']}"); + } + + if (isset($options['start']) && !$between->setMin(1)->setMax(1000)->isValid($options['start'])) { + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception("Invalid value for option 'start': {$options['start']}"); + } + + if (isset($options['longitude']) && !$between->setMin(-90)->setMax(90)->isValid($options['longitude'])) { + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception("Invalid value for option 'longitude': {$options['longitude']}"); + } + + if (isset($options['latitude']) && !$between->setMin(-180)->setMax(180)->isValid($options['latitude'])) { + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception("Invalid value for option 'latitude': {$options['latitude']}"); + } + + if (isset($options['zip']) && !preg_match('/(^\d{5}$)|(^\d{5}-\d{4}$)/', $options['zip'])) { + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception("Invalid value for option 'zip': {$options['zip']}"); + } + + $hasLocation = false; + $locationFields = array('street', 'city', 'state', 'zip', 'location'); + foreach ($locationFields as $field) { + if (isset($options[$field]) && $options[$field] != '') { + $hasLocation = true; + break; + } + } + + if (!$hasLocation && (!isset($options['latitude']) || !isset($options['longitude']))) { + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception('Location data are required but missing'); + } + + if (!in_array($options['sort'], array('relevance', 'title', 'distance', 'rating'))) { + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception("Invalid value for option 'sort': {$options['sort']}"); + } + } + + + /** + * Validate News Search Options + * + * @param array $options + * @return void + * @throws Zend_Service_Exception + */ + protected function _validateNewsSearch(array $options) + { + $validOptions = array('appid', 'query', 'results', 'start', 'sort', 'language', 'type', 'site'); + + $this->_compareOptions($options, $validOptions); + + /** + * @see Zend_Validate_Between + */ + require_once 'Zend/Validate/Between.php'; + $between = new Zend_Validate_Between(1, 50, true); + + if (isset($options['results']) && !$between->setMin(1)->setMax(50)->isValid($options['results'])) { + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception("Invalid value for option 'results': {$options['results']}"); + } + + if (isset($options['start']) && !$between->setMin(1)->setMax(1000)->isValid($options['start'])) { + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception("Invalid value for option 'start': {$options['start']}"); + } + + if (isset($options['language'])) { + $this->_validateLanguage($options['language']); + } + + $this->_validateInArray('sort', $options['sort'], array('rank', 'date')); + $this->_validateInArray('type', $options['type'], array('all', 'any', 'phrase')); + } + + + /** + * Validate Page Data Search Options + * + * @param array $options + * @return void + * @throws Zend_Service_Exception + */ + protected function _validatePageDataSearch(array $options) + { + $validOptions = array('appid', 'query', 'results', 'start', 'domain_only'); + + $this->_compareOptions($options, $validOptions); + + /** + * @see Zend_Validate_Between + */ + require_once 'Zend/Validate/Between.php'; + $between = new Zend_Validate_Between(1, 100, true); + + if (isset($options['results']) && !$between->setMin(1)->setMax(100)->isValid($options['results'])) { + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception("Invalid value for option 'results': {$options['results']}"); + } + + if (isset($options['start']) && !$between->setMin(1)->setMax(1000)->isValid($options['start'])) { + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception("Invalid value for option 'start': {$options['start']}"); + } + } + + + /** + * Validate Video Search Options + * + * @param array $options + * @return void + * @throws Zend_Service_Exception + */ + protected function _validateVideoSearch(array $options) + { + $validOptions = array('appid', 'query', 'type', 'results', 'start', 'format', 'adult_ok'); + + $this->_compareOptions($options, $validOptions); + + if (isset($options['type'])) { + $this->_validateInArray('type', $options['type'], array('all', 'any', 'phrase')); + } + + /** + * @see Zend_Validate_Between + */ + require_once 'Zend/Validate/Between.php'; + $between = new Zend_Validate_Between(1, 50, true); + + if (isset($options['results']) && !$between->setMin(1)->setMax(50)->isValid($options['results'])) { + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception("Invalid value for option 'results': {$options['results']}"); + } + + if (isset($options['start']) && !$between->setMin(1)->setMax(1000)->isValid($options['start'])) { + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception("Invalid value for option 'start': {$options['start']}"); + } + + if (isset($options['format'])) { + $this->_validateInArray('format', $options['format'], array('any', 'avi', 'flash', 'mpeg', 'msmedia', 'quicktime', 'realmedia')); + } + } + + + /** + * Validate Web Search Options + * + * @param array $options + * @return void + * @throws Zend_Service_Exception + */ + protected function _validateWebSearch(array $options) + { + $validOptions = array('appid', 'query', 'results', 'start', 'language', 'type', 'format', 'adult_ok', + 'similar_ok', 'country', 'site', 'subscription', 'license'); + + $this->_compareOptions($options, $validOptions); + + /** + * @see Zend_Validate_Between + */ + require_once 'Zend/Validate/Between.php'; + $between = new Zend_Validate_Between(1, 100, true); + + if (isset($options['results']) && !$between->setMin(1)->setMax(100)->isValid($options['results'])) { + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception("Invalid value for option 'results': {$options['results']}"); + } + + if (isset($options['start']) && !$between->setMin(1)->setMax(1000)->isValid($options['start'])) { + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception("Invalid value for option 'start': {$options['start']}"); + } + + if (isset($options['language'])) { + $this->_validateLanguage($options['language']); + } + + $this->_validateInArray('type', $options['type'], array('all', 'any', 'phrase')); + $this->_validateInArray('format', $options['format'], array('any', 'html', 'msword', 'pdf', 'ppt', 'rss', + 'txt', 'xls')); + $this->_validateInArray('license', $options['license'], array('any', 'cc_any', 'cc_commercial', + 'cc_modifiable')); + } + + + /** + * Prepare options for sending to Yahoo! + * + * @param string $query Search Query + * @param array $options User specified options + * @param array $defaultOptions Required/Default options + * @return array + */ + protected function _prepareOptions($query, array $options, array $defaultOptions = array()) + { + $options['appid'] = $this->appId; + $options['query'] = (string) $query; + + return array_merge($defaultOptions, $options); + } + + + /** + * Throws an exception if the chosen language is not supported + * + * @param string $lang Language code + * @return void + * @throws Zend_Service_Exception + */ + protected function _validateLanguage($lang) + { + $languages = array('ar', 'bg', 'ca', 'szh', 'tzh', 'hr', 'cs', 'da', 'nl', 'en', 'et', 'fi', 'fr', 'de', 'el', + 'he', 'hu', 'is', 'id', 'it', 'ja', 'ko', 'lv', 'lt', 'no', 'fa', 'pl', 'pt', 'ro', 'ru', 'sk', 'sr', 'sl', + 'es', 'sv', 'th', 'tr' + ); + if (!in_array($lang, $languages)) { + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception("The selected language '$lang' is not supported"); + } + } + + + /** + * Utility function to check for a difference between two arrays. + * + * @param array $options User specified options + * @param array $validOptions Valid options + * @return void + * @throws Zend_Service_Exception if difference is found (e.g., unsupported query option) + */ + protected function _compareOptions(array $options, array $validOptions) + { + $difference = array_diff(array_keys($options), $validOptions); + if ($difference) { + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception('The following parameters are invalid: ' . join(', ', $difference)); + } + } + + + /** + * Check that a named value is in the given array + * + * @param string $name Name associated with the value + * @param mixed $value Value + * @param array $array Array in which to check for the value + * @return void + * @throws Zend_Service_Exception + */ + protected function _validateInArray($name, $value, array $array) + { + if (!in_array($value, $array)) { + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception("Invalid value for option '$name': $value"); + } + } + + + /** + * Check if response is an error + * + * @param DOMDocument $dom DOM Object representing the result XML + * @return void + * @throws Zend_Service_Exception Thrown when the result from Yahoo! is an error + */ + protected static function _checkErrors(DOMDocument $dom) + { + $xpath = new DOMXPath($dom); + $xpath->registerNamespace('yapi', 'urn:yahoo:api'); + + if ($xpath->query('//yapi:Error')->length >= 1) { + $message = $xpath->query('//yapi:Error/yapi:Message/text()')->item(0)->data; + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception($message); + } + } +} diff --git a/libs/Zend/Service/Yahoo/Image.php b/libs/Zend/Service/Yahoo/Image.php new file mode 100644 index 0000000..49d71f4 --- /dev/null +++ b/libs/Zend/Service/Yahoo/Image.php @@ -0,0 +1,71 @@ +ownerDocument); + $xpath->registerNamespace('yh', $namespace); + $this->Url = Zend_Uri::factory($xpath->query('./yh:Url/text()', $dom)->item(0)->data); + $this->Height = (int) $xpath->query('./yh:Height/text()', $dom)->item(0)->data; + $this->Width = (int) $xpath->query('./yh:Width/text()', $dom)->item(0)->data; + } +} diff --git a/libs/Zend/Service/Yahoo/ImageResult.php b/libs/Zend/Service/Yahoo/ImageResult.php new file mode 100644 index 0000000..1a1b58b --- /dev/null +++ b/libs/Zend/Service/Yahoo/ImageResult.php @@ -0,0 +1,111 @@ +_fields = array('Summary', 'RefererUrl', 'FileSize', 'FileFormat', 'Height', 'Width', 'Thumbnail'); + + parent::__construct($result); + + $this->_setThumbnail(); + } +} diff --git a/libs/Zend/Service/Yahoo/ImageResultSet.php b/libs/Zend/Service/Yahoo/ImageResultSet.php new file mode 100644 index 0000000..f30920c --- /dev/null +++ b/libs/Zend/Service/Yahoo/ImageResultSet.php @@ -0,0 +1,63 @@ +_results->item($this->_currentIndex)); + } +} diff --git a/libs/Zend/Service/Yahoo/InlinkDataResult.php b/libs/Zend/Service/Yahoo/InlinkDataResult.php new file mode 100644 index 0000000..9b7cfce --- /dev/null +++ b/libs/Zend/Service/Yahoo/InlinkDataResult.php @@ -0,0 +1,58 @@ +_fields = array(); + parent::__construct($result); + } +} diff --git a/libs/Zend/Service/Yahoo/InlinkDataResultSet.php b/libs/Zend/Service/Yahoo/InlinkDataResultSet.php new file mode 100644 index 0000000..d9a704c --- /dev/null +++ b/libs/Zend/Service/Yahoo/InlinkDataResultSet.php @@ -0,0 +1,62 @@ +_results->item($this->_currentIndex)); + } +} diff --git a/libs/Zend/Service/Yahoo/LocalResult.php b/libs/Zend/Service/Yahoo/LocalResult.php new file mode 100644 index 0000000..1e1ed6c --- /dev/null +++ b/libs/Zend/Service/Yahoo/LocalResult.php @@ -0,0 +1,124 @@ +_fields = array('Address','City', 'City', 'State', 'Phone', 'Rating', 'Distance', 'MapUrl', + 'BusinessUrl', 'BusinessClickUrl'); + + parent::__construct($result); + } +} diff --git a/libs/Zend/Service/Yahoo/LocalResultSet.php b/libs/Zend/Service/Yahoo/LocalResultSet.php new file mode 100644 index 0000000..133ef7f --- /dev/null +++ b/libs/Zend/Service/Yahoo/LocalResultSet.php @@ -0,0 +1,84 @@ +resultSetMapURL = $this->_xpath->query('//yh:ResultSetMapUrl/text()')->item(0)->data; + } + + + /** + * Overrides Zend_Service_Yahoo_ResultSet::current() + * + * @return Zend_Service_Yahoo_LocalResult + */ + public function current() + { + return new Zend_Service_Yahoo_LocalResult($this->_results->item($this->_currentIndex)); + } +} diff --git a/libs/Zend/Service/Yahoo/NewsResult.php b/libs/Zend/Service/Yahoo/NewsResult.php new file mode 100644 index 0000000..37f363c --- /dev/null +++ b/libs/Zend/Service/Yahoo/NewsResult.php @@ -0,0 +1,112 @@ +_fields = array('Summary', 'NewsSource', 'NewsSourceUrl', 'Language', 'PublishDate', + 'ModificationDate', 'Thumbnail'); + + parent::__construct($result); + + $this->_setThumbnail(); + } +} diff --git a/libs/Zend/Service/Yahoo/NewsResultSet.php b/libs/Zend/Service/Yahoo/NewsResultSet.php new file mode 100644 index 0000000..040f14b --- /dev/null +++ b/libs/Zend/Service/Yahoo/NewsResultSet.php @@ -0,0 +1,63 @@ +_results->item($this->_currentIndex)); + } +} diff --git a/libs/Zend/Service/Yahoo/PageDataResult.php b/libs/Zend/Service/Yahoo/PageDataResult.php new file mode 100644 index 0000000..4eabdee --- /dev/null +++ b/libs/Zend/Service/Yahoo/PageDataResult.php @@ -0,0 +1,58 @@ +_fields = array(); + parent::__construct($result); + } +} diff --git a/libs/Zend/Service/Yahoo/PageDataResultSet.php b/libs/Zend/Service/Yahoo/PageDataResultSet.php new file mode 100644 index 0000000..be96d1e --- /dev/null +++ b/libs/Zend/Service/Yahoo/PageDataResultSet.php @@ -0,0 +1,62 @@ +_results->item($this->_currentIndex)); + } +} diff --git a/libs/Zend/Service/Yahoo/Result.php b/libs/Zend/Service/Yahoo/Result.php new file mode 100644 index 0000000..77ae2ba --- /dev/null +++ b/libs/Zend/Service/Yahoo/Result.php @@ -0,0 +1,126 @@ +_fields = array_merge($this->_fields, $fields); + + $this->_xpath = new DOMXPath($result->ownerDocument); + $this->_xpath->registerNamespace('yh', $this->_namespace); + + // add search results to appropriate fields + + foreach ($this->_fields as $f) { + $query = "./yh:$f/text()"; + $node = $this->_xpath->query($query, $result); + if ($node->length == 1) { + $this->{$f} = $node->item(0)->data; + } + } + + $this->_result = $result; + } + + + /** + * Sets the Thumbnail property + * + * @return void + */ + protected function _setThumbnail() + { + $node = $this->_xpath->query('./yh:Thumbnail', $this->_result); + if ($node->length == 1) { + /** + * @see Zend_Service_Yahoo_Image + */ + require_once 'Zend/Service/Yahoo/Image.php'; + $this->Thumbnail = new Zend_Service_Yahoo_Image($node->item(0), $this->_namespace); + } else { + $this->Thumbnail = null; + } + } +} diff --git a/libs/Zend/Service/Yahoo/ResultSet.php b/libs/Zend/Service/Yahoo/ResultSet.php new file mode 100644 index 0000000..0b15447 --- /dev/null +++ b/libs/Zend/Service/Yahoo/ResultSet.php @@ -0,0 +1,195 @@ +_dom + * + * @var DOMXPath + */ + protected $_xpath; + + /** + * Current Index for SeekableIterator + * + * @var int + */ + protected $_currentIndex = 0; + + + /** + * Parse the search response and retrieve the results for iteration + * + * @param DOMDocument $dom the REST fragment for this object + * @return void + */ + public function __construct(DOMDocument $dom) + { + $this->totalResultsAvailable = (int) $dom->documentElement->getAttribute('totalResultsAvailable'); + $this->totalResultsReturned = (int) $dom->documentElement->getAttribute('totalResultsReturned'); + $this->firstResultPosition = (int) $dom->documentElement->getAttribute('firstResultPosition'); + + $this->_dom = $dom; + $this->_xpath = new DOMXPath($dom); + + $this->_xpath->registerNamespace('yh', $this->_namespace); + + $this->_results = $this->_xpath->query('//yh:Result'); + } + + + /** + * Total Number of results returned + * + * @return int Total number of results returned + */ + public function totalResults() + { + return $this->totalResultsReturned; + } + + + /** + * Implement SeekableIterator::current() + * + * Must be implemented by child classes + * + * @throws Zend_Service_Exception + * @return Zend_Service_Yahoo_Result + */ + public function current() + { + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception('Zend_Service_Yahoo_ResultSet::current() must be implemented by child ' + . 'classes'); + } + + + /** + * Implement SeekableIterator::key() + * + * @return int + */ + public function key() + { + return $this->_currentIndex; + } + + + /** + * Implement SeekableIterator::next() + * + * @return void + */ + public function next() + { + $this->_currentIndex += 1; + } + + + /** + * Implement SeekableIterator::rewind() + * + * @return void + */ + public function rewind() + { + $this->_currentIndex = 0; + } + + + /** + * Implement SeekableIterator::seek() + * + * @param int $index + * @return void + * @throws OutOfBoundsException + */ + public function seek($index) + { + $indexInt = (int) $index; + if ($indexInt >= 0 && $indexInt < $this->_results->length) { + $this->_currentIndex = $indexInt; + } else { + throw new OutOfBoundsException("Illegal index '$index'"); + } + } + + + /** + * Implement SeekableIterator::valid() + * + * @return boolean + */ + public function valid() + { + return $this->_currentIndex < $this->_results->length; + } +} diff --git a/libs/Zend/Service/Yahoo/VideoResult.php b/libs/Zend/Service/Yahoo/VideoResult.php new file mode 100644 index 0000000..edaff20 --- /dev/null +++ b/libs/Zend/Service/Yahoo/VideoResult.php @@ -0,0 +1,132 @@ +_fields = array('Summary', 'RefererUrl', 'FileSize', 'FileFormat', 'Height', 'Width', 'Duration', 'Channels', 'Streaming', 'Thumbnail'); + + parent::__construct($result); + + $this->_setThumbnail(); + } +} diff --git a/libs/Zend/Service/Yahoo/VideoResultSet.php b/libs/Zend/Service/Yahoo/VideoResultSet.php new file mode 100644 index 0000000..045e0bf --- /dev/null +++ b/libs/Zend/Service/Yahoo/VideoResultSet.php @@ -0,0 +1,63 @@ +_results->item($this->_currentIndex)); + } +} diff --git a/libs/Zend/Service/Yahoo/WebResult.php b/libs/Zend/Service/Yahoo/WebResult.php new file mode 100644 index 0000000..f3a97fa --- /dev/null +++ b/libs/Zend/Service/Yahoo/WebResult.php @@ -0,0 +1,100 @@ +_fields = array('Summary', 'MimeType', 'ModificationDate'); + parent::__construct($result); + + $this->_xpath = new DOMXPath($result->ownerDocument); + $this->_xpath->registerNamespace('yh', $this->_namespace); + + $this->CacheUrl = $this->_xpath->query('./yh:Cache/yh:Url/text()', $result)->item(0)->data; + $this->CacheSize = (int) $this->_xpath->query('./yh:Cache/yh:Size/text()', $result)->item(0)->data; + } +} diff --git a/libs/Zend/Service/Yahoo/WebResultSet.php b/libs/Zend/Service/Yahoo/WebResultSet.php new file mode 100644 index 0000000..ffe556e --- /dev/null +++ b/libs/Zend/Service/Yahoo/WebResultSet.php @@ -0,0 +1,63 @@ +_results->item($this->_currentIndex)); + } +} diff --git a/libs/Zend/Session.php b/libs/Zend/Session.php new file mode 100644 index 0000000..7da37e8 --- /dev/null +++ b/libs/Zend/Session.php @@ -0,0 +1,832 @@ +0 - already called session_regenerate_id() + * + * @var int + */ + private static $_regenerateIdState = 0; + + /** + * Private list of php's ini values for ext/session + * null values will default to the php.ini value, otherwise + * the value below will overwrite the default ini value, unless + * the user has set an option explicity with setOptions() + * + * @var array + */ + private static $_defaultOptions = array( + 'save_path' => null, + 'name' => null, /* this should be set to a unique value for each application */ + 'save_handler' => null, + //'auto_start' => null, /* intentionally excluded (see manual) */ + 'gc_probability' => null, + 'gc_divisor' => null, + 'gc_maxlifetime' => null, + 'serialize_handler' => null, + 'cookie_lifetime' => null, + 'cookie_path' => null, + 'cookie_domain' => null, + 'cookie_secure' => null, + 'cookie_httponly' => null, + 'use_cookies' => null, + 'use_only_cookies' => 'on', + 'referer_check' => null, + 'entropy_file' => null, + 'entropy_length' => null, + 'cache_limiter' => null, + 'cache_expire' => null, + 'use_trans_sid' => null, + 'bug_compat_42' => null, + 'bug_compat_warn' => null, + 'hash_function' => null, + 'hash_bits_per_character' => null + ); + + /** + * List of options pertaining to Zend_Session that can be set by developers + * using Zend_Session::setOptions(). This list intentionally duplicates + * the individual declaration of static "class" variables by the same names. + * + * @var array + */ + private static $_localOptions = array( + 'strict' => '_strict', + 'remember_me_seconds' => '_rememberMeSeconds' + ); + + /** + * Whether or not write close has been performed. + * + * @var bool + */ + private static $_writeClosed = false; + + /** + * Whether or not session id cookie has been deleted + * + * @var bool + */ + private static $_sessionCookieDeleted = false; + + /** + * Whether or not session has been destroyed via session_destroy() + * + * @var bool + */ + private static $_destroyed = false; + + /** + * Whether or not session must be initiated before usage + * + * @var bool + */ + private static $_strict = false; + + /** + * Default number of seconds the session will be remembered for when asked to be remembered + * + * @var int + */ + private static $_rememberMeSeconds = 1209600; // 2 weeks + + /** + * Whether the default options listed in Zend_Session::$_localOptions have been set + * + * @var bool + */ + private static $_defaultOptionsSet = false; + + /** + * A reference to the set session save handler + * + * @var Zend_Session_SaveHandler_Interface + */ + private static $_saveHandler = null; + + + /** + * Constructor overriding - make sure that a developer cannot instantiate + */ + protected function __construct() + { + } + + + /** + * setOptions - set both the class specified + * + * @param array $userOptions - pass-by-keyword style array of
  • '; + protected $_htmlElementSeparator = '
  • '; + /**#@-*/ + + /** + * Render form errors + * + * @param string|array $errors Error(s) to render + * @param array $options + * @return string + */ + public function formErrors($errors, array $options = null) + { + $escape = true; + if (isset($options['escape'])) { + $escape = (bool) $options['escape']; + unset($options['escape']); + } + + if (empty($options['class'])) { + $options['class'] = 'errors'; + } + + $start = $this->getElementStart(); + if (strstr($start, '%s')) { + $attribs = $this->_htmlAttribs($options); + $start = sprintf($start, $attribs); + } + + if ($escape) { + foreach ($errors as $key => $error) { + $errors[$key] = $this->view->escape($error); + } + } + + $html = $start + . implode($this->getElementSeparator(), (array) $errors) + . $this->getElementEnd(); + + return $html; + } + + /** + * Set end string for displaying errors + * + * @param string $string + * @return Zend_View_Helper_FormErrors + */ + public function setElementEnd($string) + { + $this->_htmlElementEnd = (string) $string; + return $this; + } + + /** + * Retrieve end string for displaying errors + * + * @return string + */ + public function getElementEnd() + { + return $this->_htmlElementEnd; + } + + /** + * Set separator string for displaying errors + * + * @param string $string + * @return Zend_View_Helper_FormErrors + */ + public function setElementSeparator($string) + { + $this->_htmlElementSeparator = (string) $string; + return $this; + } + + /** + * Retrieve separator string for displaying errors + * + * @return string + */ + public function getElementSeparator() + { + return $this->_htmlElementSeparator; + } + + /** + * Set start string for displaying errors + * + * @param string $string + * @return Zend_View_Helper_FormErrors + */ + public function setElementStart($string) + { + $this->_htmlElementStart = (string) $string; + return $this; + } + + /** + * Retrieve start string for displaying errors + * + * @return string + */ + public function getElementStart() + { + return $this->_htmlElementStart; + } + +} diff --git a/libs/Zend/View/Helper/FormFile.php b/libs/Zend/View/Helper/FormFile.php new file mode 100644 index 0000000..5a9014b --- /dev/null +++ b/libs/Zend/View/Helper/FormFile.php @@ -0,0 +1,80 @@ +_getInfo($name, null, $attribs); + extract($info); // name, id, value, attribs, options, listsep, disable + + // is it disabled? + $disabled = ''; + if ($disable) { + $disabled = ' disabled="disabled"'; + } + + // XHTML or HTML end tag? + $endTag = ' />'; + if (($this->view instanceof Zend_View_Abstract) && !$this->view->doctype()->isXhtml()) { + $endTag= '>'; + } + + // build the element + $xhtml = '_htmlAttribs($attribs) + . $endTag; + + return $xhtml; + } +} diff --git a/libs/Zend/View/Helper/FormHidden.php b/libs/Zend/View/Helper/FormHidden.php new file mode 100644 index 0000000..8beee00 --- /dev/null +++ b/libs/Zend/View/Helper/FormHidden.php @@ -0,0 +1,65 @@ +_getInfo($name, $value, $attribs); + extract($info); // name, value, attribs, options, listsep, disable + if (isset($id)) { + if (isset($attribs) && is_array($attribs)) { + $attribs['id'] = $id; + } else { + $attribs = array('id' => $id); + } + } + return $this->_hidden($name, $value, $attribs); + } +} diff --git a/libs/Zend/View/Helper/FormImage.php b/libs/Zend/View/Helper/FormImage.php new file mode 100644 index 0000000..723c222 --- /dev/null +++ b/libs/Zend/View/Helper/FormImage.php @@ -0,0 +1,100 @@ +_getInfo($name, $value, $attribs); + extract($info); // name, value, attribs, options, listsep, disable + + // Determine if we should use the value or the src attribute + if (isset($attribs['src'])) { + $src = ' src="' . $this->view->escape($attribs['src']) . '"'; + unset($attribs['src']); + } else { + $src = ' src="' . $this->view->escape($value) . '"'; + unset($value); + } + + // Do we have a value? + if (isset($value) && !empty($value)) { + $value = ' value="' . $this->view->escape($value) . '"'; + } else { + $value = ''; + } + + // Disabled? + $disabled = ''; + if ($disable) { + $disabled = ' disabled="disabled"'; + } + + // XHTML or HTML end tag? + $endTag = ' />'; + if (($this->view instanceof Zend_View_Abstract) && !$this->view->doctype()->isXhtml()) { + $endTag= '>'; + } + + // build the element + $xhtml = '_htmlAttribs($attribs) + . $endTag; + + return $xhtml; + } +} diff --git a/libs/Zend/View/Helper/FormLabel.php b/libs/Zend/View/Helper/FormLabel.php new file mode 100644 index 0000000..3366391 --- /dev/null +++ b/libs/Zend/View/Helper/FormLabel.php @@ -0,0 +1,64 @@ +_getInfo($name, $value, $attribs); + extract($info); // name, value, attribs, options, listsep, disable, escape + + // build the element + if ($disable) { + // disabled; do nothing + } else { + $value = ($escape) ? $this->view->escape($value) : $value; + + // enabled; display label + $xhtml = '_htmlAttribs($attribs) + . '>' . $value . ''; + } + + return $xhtml; + } +} diff --git a/libs/Zend/View/Helper/FormMultiCheckbox.php b/libs/Zend/View/Helper/FormMultiCheckbox.php new file mode 100644 index 0000000..811b496 --- /dev/null +++ b/libs/Zend/View/Helper/FormMultiCheckbox.php @@ -0,0 +1,73 @@ +\n") + { + return $this->formRadio($name, $value, $attribs, $options, $listsep); + } +} diff --git a/libs/Zend/View/Helper/FormNote.php b/libs/Zend/View/Helper/FormNote.php new file mode 100644 index 0000000..78be8db --- /dev/null +++ b/libs/Zend/View/Helper/FormNote.php @@ -0,0 +1,60 @@ +_getInfo($name, $value); + extract($info); // name, value, attribs, options, listsep, disable + return $value; + } +} diff --git a/libs/Zend/View/Helper/FormPassword.php b/libs/Zend/View/Helper/FormPassword.php new file mode 100644 index 0000000..20c441c --- /dev/null +++ b/libs/Zend/View/Helper/FormPassword.php @@ -0,0 +1,94 @@ +_getInfo($name, $value, $attribs); + extract($info); // name, value, attribs, options, listsep, disable + + // is it disabled? + $disabled = ''; + if ($disable) { + // disabled + $disabled = ' disabled="disabled"'; + } + + // determine the XHTML value + $valueString = ' value=""'; + if (array_key_exists('renderPassword', $attribs)) { + if ($attribs['renderPassword']) { + $valueString = ' value="' . $this->view->escape($value) . '"'; + } + unset($attribs['renderPassword']); + } + + // XHTML or HTML end tag? + $endTag = ' />'; + if (($this->view instanceof Zend_View_Abstract) && !$this->view->doctype()->isXhtml()) { + $endTag= '>'; + } + + // render the element + $xhtml = '_htmlAttribs($attribs) + . $endTag; + + return $xhtml; + } + +} diff --git a/libs/Zend/View/Helper/FormRadio.php b/libs/Zend/View/Helper/FormRadio.php new file mode 100644 index 0000000..28a4d46 --- /dev/null +++ b/libs/Zend/View/Helper/FormRadio.php @@ -0,0 +1,182 @@ +\n") + { + + $info = $this->_getInfo($name, $value, $attribs, $options, $listsep); + extract($info); // name, value, attribs, options, listsep, disable + + // retrieve attributes for labels (prefixed with 'label_' or 'label') + $label_attribs = array('style' => 'white-space: nowrap;'); + foreach ($attribs as $key => $val) { + $tmp = false; + $keyLen = strlen($key); + if ((6 < $keyLen) && (substr($key, 0, 6) == 'label_')) { + $tmp = substr($key, 6); + } elseif ((5 < $keyLen) && (substr($key, 0, 5) == 'label')) { + $tmp = substr($key, 5); + } + + if ($tmp) { + // make sure first char is lowercase + $tmp[0] = strtolower($tmp[0]); + $label_attribs[$tmp] = $val; + unset($attribs[$key]); + } + } + + $labelPlacement = 'append'; + foreach ($label_attribs as $key => $val) { + switch (strtolower($key)) { + case 'placement': + unset($label_attribs[$key]); + $val = strtolower($val); + if (in_array($val, array('prepend', 'append'))) { + $labelPlacement = $val; + } + break; + } + } + + // the radio button values and labels + $options = (array) $options; + + // build the element + $xhtml = ''; + $list = array(); + + // should the name affect an array collection? + $name = $this->view->escape($name); + if ($this->_isArray && ('[]' != substr($name, -2))) { + $name .= '[]'; + } + + // ensure value is an array to allow matching multiple times + $value = (array) $value; + + // XHTML or HTML end tag? + $endTag = ' />'; + if (($this->view instanceof Zend_View_Abstract) && !$this->view->doctype()->isXhtml()) { + $endTag= '>'; + } + + // add radio buttons to the list. + require_once 'Zend/Filter/Alnum.php'; + $filter = new Zend_Filter_Alnum(); + foreach ($options as $opt_value => $opt_label) { + + // Should the label be escaped? + if ($escape) { + $opt_label = $this->view->escape($opt_label); + } + + // is it disabled? + $disabled = ''; + if (true === $disable) { + $disabled = ' disabled="disabled"'; + } elseif (is_array($disable) && in_array($opt_value, $disable)) { + $disabled = ' disabled="disabled"'; + } + + // is it checked? + $checked = ''; + if (in_array($opt_value, $value)) { + $checked = ' checked="checked"'; + } + + // generate ID + $optId = $id . '-' . $filter->filter($opt_value); + + // Wrap the radios in labels + $radio = '_htmlAttribs($label_attribs) . '>' + . (('prepend' == $labelPlacement) ? $opt_label : '') + . '_htmlAttribs($attribs) + . $endTag + . (('append' == $labelPlacement) ? $opt_label : '') + . ''; + + // add to the array of radio buttons + $list[] = $radio; + } + + // done! + $xhtml .= implode($listsep, $list); + + return $xhtml; + } +} diff --git a/libs/Zend/View/Helper/FormReset.php b/libs/Zend/View/Helper/FormReset.php new file mode 100644 index 0000000..dddba92 --- /dev/null +++ b/libs/Zend/View/Helper/FormReset.php @@ -0,0 +1,87 @@ +_getInfo($name, $value, $attribs); + extract($info); // name, value, attribs, options, listsep, disable + + // check if disabled + $disabled = ''; + if ($disable) { + $disabled = ' disabled="disabled"'; + } + + // get closing tag + $endTag = '>'; + if ($this->view->doctype()->isXhtml()) { + $endTag = ' />'; + } + + // Render button + $xhtml = 'view->escape($value) . '"'; + } + + // add attributes, close, and return + $xhtml .= $this->_htmlAttribs($attribs) . $endTag; + return $xhtml; + } +} diff --git a/libs/Zend/View/Helper/FormSelect.php b/libs/Zend/View/Helper/FormSelect.php new file mode 100644 index 0000000..45eafd1 --- /dev/null +++ b/libs/Zend/View/Helper/FormSelect.php @@ -0,0 +1,173 @@ +\n") + { + $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 + // options; also ensure it's a string for comparison purposes. + $value = array_map('strval', (array) $value); + + // check if element may have multiple values + $multiple = ''; + + if (substr($name, -2) == '[]') { + // multiple implied by the name + $multiple = ' multiple="multiple"'; + } + + if (isset($attribs['multiple'])) { + // Attribute set + if ($attribs['multiple']) { + // True attribute; set multiple attribute + $multiple = ' multiple="multiple"'; + + // Make sure name indicates multiple values are allowed + if (!empty($multiple) && (substr($name, -2) != '[]')) { + $name .= '[]'; + } + } else { + // False attribute; ensure attribute not set + $multiple = ''; + } + unset($attribs['multiple']); + } + + // now start building the XHTML. + $disabled = ''; + if (true === $disable) { + $disabled = ' disabled="disabled"'; + } + + // Build the surrounding select element first. + $xhtml = '_htmlAttribs($attribs) + . ">\n "; + + // build the list of options + $list = array(); + foreach ((array) $options as $opt_value => $opt_label) { + if (is_array($opt_label)) { + $opt_disable = ''; + if (is_array($disable) && in_array($opt_value, $disable)) { + $opt_disable = ' disabled="disabled"'; + } + $list[] = ''; + foreach ($opt_label as $val => $lab) { + $list[] = $this->_build($val, $lab, $value, $disable); + } + $list[] = ''; + } else { + $list[] = $this->_build($opt_value, $opt_label, $value, $disable); + } + } + + // add the options to the xhtml and close the select + $xhtml .= implode("\n ", $list) . "\n"; + + return $xhtml; + } + + /** + * Builds the actual "; + + return $opt; + } + +} diff --git a/libs/Zend/View/Helper/FormSubmit.php b/libs/Zend/View/Helper/FormSubmit.php new file mode 100644 index 0000000..5589c27 --- /dev/null +++ b/libs/Zend/View/Helper/FormSubmit.php @@ -0,0 +1,83 @@ +_getInfo($name, $value, $attribs); + extract($info); // name, value, attribs, options, listsep, disable + + // check if disabled + $disabled = ''; + if ($disable) { + $disabled = ' disabled="disabled"'; + } + + // XHTML or HTML end tag? + $endTag = ' />'; + if (($this->view instanceof Zend_View_Abstract) && !$this->view->doctype()->isXhtml()) { + $endTag= '>'; + } + + // Render the button. + $xhtml = '_htmlAttribs($attribs) + . $endTag; + + return $xhtml; + } +} diff --git a/libs/Zend/View/Helper/FormText.php b/libs/Zend/View/Helper/FormText.php new file mode 100644 index 0000000..9bd646e --- /dev/null +++ b/libs/Zend/View/Helper/FormText.php @@ -0,0 +1,83 @@ +_getInfo($name, $value, $attribs); + extract($info); // name, value, attribs, options, listsep, disable + + // build the element + $disabled = ''; + if ($disable) { + // disabled + $disabled = ' disabled="disabled"'; + } + + // XHTML or HTML end tag? + $endTag = ' />'; + if (($this->view instanceof Zend_View_Abstract) && !$this->view->doctype()->isXhtml()) { + $endTag= '>'; + } + + $xhtml = '_htmlAttribs($attribs) + . $endTag; + + return $xhtml; + } +} diff --git a/libs/Zend/View/Helper/FormTextarea.php b/libs/Zend/View/Helper/FormTextarea.php new file mode 100644 index 0000000..38af1ec --- /dev/null +++ b/libs/Zend/View/Helper/FormTextarea.php @@ -0,0 +1,103 @@ +_getInfo($name, $value, $attribs); + extract($info); // name, value, attribs, options, listsep, disable + + // is it disabled? + $disabled = ''; + if ($disable) { + // disabled. + $disabled = ' disabled="disabled"'; + } + + // Make sure that there are 'rows' and 'cols' values + // as required by the spec. noted by Orjan Persson. + if (empty($attribs['rows'])) { + $attribs['rows'] = (int) $this->rows; + } + if (empty($attribs['cols'])) { + $attribs['cols'] = (int) $this->cols; + } + + // build the element + $xhtml = ''; + + return $xhtml; + } +} diff --git a/libs/Zend/View/Helper/HeadLink.php b/libs/Zend/View/Helper/HeadLink.php new file mode 100644 index 0000000..f9446bb --- /dev/null +++ b/libs/Zend/View/Helper/HeadLink.php @@ -0,0 +1,396 @@ +setSeparator(PHP_EOL); + } + + /** + * headLink() - View Helper Method + * + * Returns current object instance. Optionally, allows passing array of + * values to build link. + * + * @return Zend_View_Helper_HeadLink + */ + public function headLink(array $attributes = null, $placement = Zend_View_Helper_Placeholder_Container_Abstract::APPEND) + { + if (null !== $attributes) { + $item = $this->createData($attributes); + switch ($placement) { + case Zend_View_Helper_Placeholder_Container_Abstract::SET: + $this->set($item); + break; + case Zend_View_Helper_Placeholder_Container_Abstract::PREPEND: + $this->prepend($item); + break; + case Zend_View_Helper_Placeholder_Container_Abstract::APPEND: + default: + $this->append($item); + break; + } + } + return $this; + } + + /** + * Overload method access + * + * Creates the following virtual methods: + * - appendStylesheet($href, $media, $conditionalStylesheet) + * - offsetSetStylesheet($index, $href, $media, $conditionalStylesheet) + * - prependStylesheet($href, $media, $conditionalStylesheet) + * - setStylesheet($href, $media, $conditionalStylesheet) + * - appendAlternate($href, $type, $title) + * - offsetSetAlternate($index, $href, $type, $title) + * - prependAlternate($href, $type, $title) + * - setAlternate($href, $type, $title) + * + * Items that may be added in the future: + * - Navigation? need to find docs on this + * - public function appendStart() + * - public function appendContents() + * - public function appendPrev() + * - public function appendNext() + * - public function appendIndex() + * - public function appendEnd() + * - public function appendGlossary() + * - public function appendAppendix() + * - public function appendHelp() + * - public function appendBookmark() + * - Other? + * - public function appendCopyright() + * - public function appendChapter() + * - public function appendSection() + * - public function appendSubsection() + * + * @param mixed $method + * @param mixed $args + * @return void + */ + public function __call($method, $args) + { + if (preg_match('/^(?Pset|(ap|pre)pend|offsetSet)(?PStylesheet|Alternate)$/', $method, $matches)) { + $argc = count($args); + $action = $matches['action']; + $type = $matches['type']; + $index = null; + + if ('offsetSet' == $action) { + if (0 < $argc) { + $index = array_shift($args); + --$argc; + } + } + + if (1 > $argc) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception(sprintf('%s requires at least one argument', $method)); + } + + if (is_array($args[0])) { + $item = $this->createData($args[0]); + } else { + $dataMethod = 'createData' . $type; + $item = $this->$dataMethod($args); + } + + if ($item) { + if ('offsetSet' == $action) { + $this->offsetSet($index, $item); + } else { + $this->$action($item); + } + } + + return $this; + } + + return parent::__call($method, $args); + } + + /** + * Check if value is valid + * + * @param mixed $value + * @return boolean + */ + protected function _isValid($value) + { + if (!$value instanceof stdClass) { + return false; + } + + $vars = get_object_vars($value); + $keys = array_keys($vars); + $intersection = array_intersect($this->_itemKeys, $keys); + if (empty($intersection)) { + return false; + } + + return true; + } + + /** + * append() + * + * @param array $value + * @return void + */ + public function append($value) + { + if (!$this->_isValid($value)) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception('append() expects a data token; please use one of the custom append*() methods'); + } + + return $this->getContainer()->append($value); + } + + /** + * offsetSet() + * + * @param string|int $index + * @param array $value + * @return void + */ + public function offsetSet($index, $value) + { + if (!$this->_isValid($value)) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception('offsetSet() expects a data token; please use one of the custom offsetSet*() methods'); + } + + return $this->getContainer()->offsetSet($index, $value); + } + + /** + * prepend() + * + * @param array $value + * @return Zend_Layout_ViewHelper_HeadLink + */ + public function prepend($value) + { + if (!$this->_isValid($value)) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception('prepend() expects a data token; please use one of the custom prepend*() methods'); + } + + return $this->getContainer()->prepend($value); + } + + /** + * set() + * + * @param array $value + * @return Zend_Layout_ViewHelper_HeadLink + */ + public function set($value) + { + if (!$this->_isValid($value)) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception('set() expects a data token; please use one of the custom set*() methods'); + } + + return $this->getContainer()->set($value); + } + + + /** + * Create HTML link element from data item + * + * @param stdClass $item + * @return string + */ + public function itemToString(stdClass $item) + { + $attributes = (array) $item; + $link = '_itemKeys as $itemKey) { + if (isset($attributes[$itemKey])) { + $link .= sprintf('%s="%s" ', $itemKey, ($this->_autoEscape) ? $this->_escape($attributes[$itemKey]) : $attributes[$itemKey]); + } + } + + if ($this->view instanceof Zend_View_Abstract) { + $link .= ($this->view->doctype()->isXhtml()) ? '/>' : '>'; + } else { + $link .= '/>'; + } + + if (($link == '') || ($link == '')) { + return ''; + } + + if (isset($attributes['conditionalStylesheet']) + && (false !== $attributes['conditionalStylesheet'])) + { + $link = ''; + } + + return $link; + } + + /** + * Render link elements as string + * + * @param string|int $indent + * @return string + */ + public function toString($indent = null) + { + $indent = (null !== $indent) + ? $this->getWhitespace($indent) + : $this->getIndent(); + + $items = array(); + foreach ($this as $item) { + $items[] = $this->itemToString($item); + } + + return $indent . implode($this->_escape($this->getSeparator()) . $indent, $items); + } + + /** + * Create data item for stack + * + * @param array $attributes + * @return stdClass + */ + public function createData(array $attributes) + { + $data = (object) $attributes; + return $data; + } + + /** + * Create item for stylesheet link item + * + * @param array $args + * @return stdClass|false Returns fals if stylesheet is a duplicate + */ + public function createDataStylesheet(array $args) + { + $rel = 'stylesheet'; + $type = 'text/css'; + $media = 'screen'; + $conditionalStylesheet = false; + $href = array_shift($args); + + if ($this->_isDuplicateStylesheet($href)) { + return false; + } + + if (0 < count($args)) { + $media = array_shift($args); + $media = (string) $media; + } + if (0 < count($args)) { + $conditionalStylesheet = array_shift($args); + if (false !== $conditionalStylesheet) { + $conditionalStylesheet = (string) $conditionalStylesheet; + } + } + + $attributes = compact('rel', 'type', 'href', 'media', 'conditionalStylesheet'); + return $this->createData($attributes); + } + + /** + * Is the linked stylesheet a duplicate? + * + * @param string $uri + * @return bool + */ + protected function _isDuplicateStylesheet($uri) + { + foreach ($this->getContainer() as $item) { + if (($item->rel == 'stylesheet') && ($item->href == $uri)) { + return true; + } + } + return false; + } + + /** + * Create item for alternate link item + * + * @param array $args + * @return stdClass + */ + public function createDataAlternate(array $args) + { + if (3 > count($args)) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception(sprintf('Alternate tags require 3 arguments; %s provided', count($args))); + } + + $rel = 'alternate'; + $href = array_shift($args); + $type = array_shift($args); + $title = array_shift($args); + + $href = (string) $href; + $type = (string) $type; + $title = (string) $title; + + $attributes = compact('rel', 'href', 'type', 'title'); + return $this->createData($attributes); + } +} diff --git a/libs/Zend/View/Helper/HeadMeta.php b/libs/Zend/View/Helper/HeadMeta.php new file mode 100644 index 0000000..5c7cc2f --- /dev/null +++ b/libs/Zend/View/Helper/HeadMeta.php @@ -0,0 +1,359 @@ +setSeparator(PHP_EOL); + } + + /** + * Retrieve object instance; optionally add meta tag + * + * @param string $content + * @param string $keyValue + * @param string $keyType + * @param array $modifiers + * @param string $placement + * @return Zend_View_Helper_HeadMeta + */ + public function headMeta($content = null, $keyValue = null, $keyType = 'name', $modifiers = array(), $placement = Zend_View_Helper_Placeholder_Container_Abstract::APPEND) + { + if ((null !== $content) && (null !== $keyValue)) { + $item = $this->createData($keyType, $keyValue, $content, $modifiers); + $action = strtolower($placement); + switch ($action) { + case 'append': + case 'prepend': + case 'set': + $this->$action($item); + break; + default: + $this->append($item); + break; + } + } + + return $this; + } + + protected function _normalizeType($type) + { + switch ($type) { + case 'Name': + return 'name'; + case 'HttpEquiv': + return 'http-equiv'; + default: + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception(sprintf('Invalid type "%s" passed to _normalizeType', $type)); + } + } + + /** + * Overload method access + * + * Allows the following 'virtual' methods: + * - appendName($keyValue, $content, $modifiers = array()) + * - offsetGetName($index, $keyValue, $content, $modifers = array()) + * - prependName($keyValue, $content, $modifiers = array()) + * - setName($keyValue, $content, $modifiers = array()) + * - appendHttpEquiv($keyValue, $content, $modifiers = array()) + * - offsetGetHttpEquiv($index, $keyValue, $content, $modifers = array()) + * - prependHttpEquiv($keyValue, $content, $modifiers = array()) + * - setHttpEquiv($keyValue, $content, $modifiers = array()) + * + * @param string $method + * @param array $args + * @return Zend_View_Helper_HeadMeta + */ + public function __call($method, $args) + { + if (preg_match('/^(?Pset|(pre|ap)pend|offsetSet)(?PName|HttpEquiv)$/', $method, $matches)) { + $action = $matches['action']; + $type = $this->_normalizeType($matches['type']); + $argc = count($args); + $index = null; + + if ('offsetSet' == $action) { + if (0 < $argc) { + $index = array_shift($args); + --$argc; + } + } + + if (2 > $argc) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception('Too few arguments provided; requires key value, and content'); + } + + if (3 > $argc) { + $args[] = array(); + } + + $item = $this->createData($type, $args[0], $args[1], $args[2]); + + if ('offsetSet' == $action) { + return $this->offsetSet($index, $item); + } + + if ($action == 'set') { + //var_dump($this->getContainer()); + } + + $this->$action($item); + return $this; + } + + return parent::__call($method, $args); + } + + /** + * Determine if item is valid + * + * @param mixed $item + * @return boolean + */ + protected function _isValid($item) + { + if ((!$item instanceof stdClass) + || !isset($item->type) + || !isset($item->content) + || !isset($item->modifiers)) + { + return false; + } + + return true; + } + + /** + * Append + * + * @param string $value + * @return void + * @throws Zend_View_Exception + */ + public function append($value) + { + if (!$this->_isValid($value)) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception('Invalid value passed to append; please use appendMeta()'); + } + + return $this->getContainer()->append($value); + } + + /** + * OffsetSet + * + * @param string|int $index + * @param string $value + * @return void + * @throws Zend_View_Exception + */ + public function offsetSet($index, $value) + { + if (!$this->_isValid($value)) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception('Invalid value passed to offsetSet; please use offsetSetMeta()'); + } + + return $this->getContainer()->offsetSet($index, $value); + } + + /** + * OffsetUnset + * + * @param string|int $index + * @return void + * @throws Zend_View_Exception + */ + public function offsetUnset($index) + { + if (!in_array($index, $this->getContainer()->getKeys())) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception('Invalid index passed to offsetUnset.'); + } + + return $this->getContainer()->offsetUnset($index); + } + + /** + * Prepend + * + * @param string $value + * @return void + * @throws Zend_View_Exception + */ + public function prepend($value) + { + if (!$this->_isValid($value)) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception('Invalid value passed to prepend; please use prependMeta()'); + } + + return $this->getContainer()->prepend($value); + } + + /** + * Set + * + * @param string $value + * @return void + * @throws Zend_View_Exception + */ + public function set($value) + { + if (!$this->_isValid($value)) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception('Invalid value passed to set; please use setMeta()'); + } + + $container = $this->getContainer(); + foreach ($container->getArrayCopy() as $index => $item) { + if ($item->type == $value->type && $item->{$item->type} == $value->{$value->type}) { + $this->offsetUnset($index); + } + } + + return $this->append($value); + } + + /** + * Build meta HTML string + * + * @param string $type + * @param string $typeValue + * @param string $content + * @param array $modifiers + * @return string + */ + public function itemToString(stdClass $item) + { + if (!in_array($item->type, $this->_typeKeys)) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception(sprintf('Invalid type "%s" provided for meta', $item->type)); + } + $type = $item->type; + + $modifiersString = ''; + foreach ($item->modifiers as $key => $value) { + if (!in_array($key, $this->_modifierKeys)) { + continue; + } + $modifiersString .= $key . '="' . $this->_escape($value) . '" '; + } + + if ($this->view instanceof Zend_View_Abstract) { + $tpl = ($this->view->doctype()->isXhtml()) + ? '' + : ''; + } else { + $tpl = ''; + } + + $meta = sprintf( + $tpl, + $type, + $this->_escape($item->$type), + $this->_escape($item->content), + $modifiersString + ); + return $meta; + } + + /** + * Render placeholder as string + * + * @param string|int $indent + * @return string + */ + public function toString($indent = null) + { + $indent = (null !== $indent) + ? $this->getWhitespace($indent) + : $this->getIndent(); + + $items = array(); + foreach ($this as $item) { + $items[] = $this->itemToString($item); + } + return $indent . implode($this->_escape($this->getSeparator()) . $indent, $items); + } + + /** + * Create data item for inserting into stack + * + * @param string $type + * @param string $typeValue + * @param string $content + * @param array $modifiers + * @return stdClass + */ + public function createData($type, $typeValue, $content, array $modifiers) + { + $data = new stdClass; + $data->type = $type; + $data->$type = $typeValue; + $data->content = $content; + $data->modifiers = $modifiers; + return $data; + } +} diff --git a/libs/Zend/View/Helper/HeadScript.php b/libs/Zend/View/Helper/HeadScript.php new file mode 100644 index 0000000..032112b --- /dev/null +++ b/libs/Zend/View/Helper/HeadScript.php @@ -0,0 +1,470 @@ +setSeparator(PHP_EOL); + } + + /** + * Return headScript object + * + * Returns headScript helper object; optionally, allows specifying a script + * or script file to include. + * + * @param string $mode Script or file + * @param string $spec Script/url + * @param string $placement Append, prepend, or set + * @param array $attrs Array of script attributes + * @param string $type Script type and/or array of script attributes + * @return Zend_View_Helper_HeadScript + */ + public function headScript($mode = Zend_View_Helper_HeadScript::FILE, $spec = null, $placement = 'APPEND', array $attrs = array(), $type = 'text/javascript') + { + if ((null !== $spec) && is_string($spec)) { + $action = ucfirst(strtolower($mode)); + $placement = strtolower($placement); + switch ($placement) { + case 'set': + case 'prepend': + case 'append': + $action = $placement . $action; + break; + default: + $action = 'append' . $action; + break; + } + $this->$action($spec, $type, $attrs); + } + + return $this; + } + + /** + * Start capture action + * + * @param mixed $captureType + * @param string $typeOrAttrs + * @return void + */ + public function captureStart($captureType = Zend_View_Helper_Placeholder_Container_Abstract::APPEND, $type = 'text/javascript', $attrs = array()) + { + if ($this->_captureLock) { + require_once 'Zend/View/Helper/Placeholder/Container/Exception.php'; + throw new Zend_View_Helper_Placeholder_Container_Exception('Cannot nest headScript captures'); + } + + $this->_captureLock = true; + $this->_captureType = $captureType; + $this->_captureScriptType = $type; + $this->_captureScriptAttrs = $attrs; + ob_start(); + } + + /** + * End capture action and store + * + * @return void + */ + public function captureEnd() + { + $content = ob_get_clean(); + $type = $this->_captureScriptType; + $attrs = $this->_captureScriptAttrs; + $this->_captureScriptType = null; + $this->_captureScriptAttrs = null; + $this->_captureLock = false; + + switch ($this->_captureType) { + case Zend_View_Helper_Placeholder_Container_Abstract::SET: + case Zend_View_Helper_Placeholder_Container_Abstract::PREPEND: + case Zend_View_Helper_Placeholder_Container_Abstract::APPEND: + $action = strtolower($this->_captureType) . 'Script'; + break; + default: + $action = 'appendScript'; + break; + } + $this->$action($content, $type, $attrs); + } + + /** + * Overload method access + * + * Allows the following method calls: + * - appendFile($src, $type = 'text/javascript', $attrs = array()) + * - offsetSetFile($index, $src, $type = 'text/javascript', $attrs = array()) + * - prependFile($src, $type = 'text/javascript', $attrs = array()) + * - setFile($src, $type = 'text/javascript', $attrs = array()) + * - appendScript($script, $type = 'text/javascript', $attrs = array()) + * - offsetSetScript($index, $src, $type = 'text/javascript', $attrs = array()) + * - prependScript($script, $type = 'text/javascript', $attrs = array()) + * - setScript($script, $type = 'text/javascript', $attrs = array()) + * + * @param string $method + * @param array $args + * @return Zend_View_Helper_HeadScript + * @throws Zend_View_Exception if too few arguments or invalid method + */ + public function __call($method, $args) + { + if (preg_match('/^(?Pset|(ap|pre)pend|offsetSet)(?PFile|Script)$/', $method, $matches)) { + if (1 > count($args)) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception(sprintf('Method "%s" requires at least one argument', $method)); + } + + $action = $matches['action']; + $mode = strtolower($matches['mode']); + $type = 'text/javascript'; + $attrs = array(); + + if ('offsetSet' == $action) { + $index = array_shift($args); + if (1 > count($args)) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception(sprintf('Method "%s" requires at least two arguments, an index and source', $method)); + } + } + + $content = $args[0]; + + if (isset($args[1])) { + $type = (string) $args[1]; + } + if (isset($args[2])) { + $attrs = (array) $args[2]; + } + + switch ($mode) { + case 'script': + $item = $this->createData($type, $attrs, $content); + if ('offsetSet' == $action) { + $this->offsetSet($index, $item); + } else { + $this->$action($item); + } + break; + case 'file': + default: + if (!$this->_isDuplicate($content)) { + $attrs['src'] = $content; + $item = $this->createData($type, $attrs); + if ('offsetSet' == $action) { + $this->offsetSet($index, $item); + } else { + $this->$action($item); + } + } + break; + } + + return $this; + } + + return parent::__call($method, $args); + } + + /** + * Is the file specified a duplicate? + * + * @param string $file + * @return bool + */ + protected function _isDuplicate($file) + { + foreach ($this->getContainer() as $item) { + if (($item->source === null) + && array_key_exists('src', $item->attributes) + && ($file == $item->attributes['src'])) + { + return true; + } + } + return false; + } + + /** + * Is the script provided valid? + * + * @param mixed $value + * @param string $method + * @return bool + */ + protected function _isValid($value) + { + if ((!$value instanceof stdClass) + || !isset($value->type) + || (!isset($value->source) && !isset($value->attributes))) + { + return false; + } + + return true; + } + + /** + * Override append + * + * @param string $value + * @return void + */ + public function append($value) + { + if (!$this->_isValid($value)) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception('Invalid argument passed to append(); please use one of the helper methods, appendScript() or appendFile()'); + } + + return $this->getContainer()->append($value); + } + + /** + * Override prepend + * + * @param string $value + * @return void + */ + public function prepend($value) + { + if (!$this->_isValid($value)) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception('Invalid argument passed to prepend(); please use one of the helper methods, prependScript() or prependFile()'); + } + + return $this->getContainer()->prepend($value); + } + + /** + * Override set + * + * @param string $value + * @return void + */ + public function set($value) + { + if (!$this->_isValid($value)) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception('Invalid argument passed to set(); please use one of the helper methods, setScript() or setFile()'); + } + + return $this->getContainer()->set($value); + } + + /** + * Override offsetSet + * + * @param string|int $index + * @param mixed $value + * @return void + */ + public function offsetSet($index, $value) + { + if (!$this->_isValid($value)) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception('Invalid argument passed to offsetSet(); please use one of the helper methods, offsetSetScript() or offsetSetFile()'); + } + + $this->_isValid($value); + return $this->getContainer()->offsetSet($index, $value); + } + + /** + * Set flag indicating if arbitrary attributes are allowed + * + * @param bool $flag + * @return Zend_View_Helper_HeadScript + */ + public function setAllowArbitraryAttributes($flag) + { + $this->_arbitraryAttributes = (bool) $flag; + return $this; + } + + /** + * Are arbitrary attributes allowed? + * + * @return bool + */ + public function arbitraryAttributesAllowed() + { + return $this->_arbitraryAttributes; + } + + /** + * Create script HTML + * + * @param string $type + * @param array $attributes + * @param string $content + * @param string|int $indent + * @return string + */ + public function itemToString($item, $indent, $escapeStart, $escapeEnd) + { + $attrString = ''; + if (!empty($item->attributes)) { + foreach ($item->attributes as $key => $value) { + if (!$this->arbitraryAttributesAllowed() + && !in_array($key, $this->_optionalAttributes)) + { + continue; + } + if ('defer' == $key) { + $value = 'defer'; + } + $attrString .= sprintf(' %s="%s"', $key, ($this->_autoEscape) ? $this->_escape($value) : $value); + } + } + + $type = ($this->_autoEscape) ? $this->_escape($item->type) : $item->type; + $html = $indent . ''; + + return $html; + } + + /** + * Retrieve string representation + * + * @param string|int $indent + * @return string + */ + public function toString($indent = null) + { + $indent = (null !== $indent) + ? $this->getWhitespace($indent) + : $this->getIndent(); + + if ($this->view) { + $useCdata = $this->view->doctype()->isXhtml() ? true : false; + } else { + $useCdata = $this->useCdata ? true : false; + } + $escapeStart = ($useCdata) ? '//' : '//-->'; + + $items = array(); + foreach ($this as $item) { + if (!$this->_isValid($item)) { + continue; + } + + $items[] = $this->itemToString($item, $indent, $escapeStart, $escapeEnd); + } + + $return = implode($this->getSeparator(), $items); + return $return; + } + + /** + * Create data item containing all necessary components of script + * + * @param string $type + * @param array $attributes + * @param string $content + * @return stdClass + */ + public function createData($type, array $attributes, $content = null) + { + $data = new stdClass(); + $data->type = $type; + $data->attributes = $attributes; + $data->source = $content; + return $data; + } +} diff --git a/libs/Zend/View/Helper/HeadStyle.php b/libs/Zend/View/Helper/HeadStyle.php new file mode 100644 index 0000000..c7321ac --- /dev/null +++ b/libs/Zend/View/Helper/HeadStyle.php @@ -0,0 +1,377 @@ +setSeparator(PHP_EOL); + } + + /** + * Return headStyle object + * + * Returns headStyle helper object; optionally, allows specifying + * + * @param string $content Stylesheet contents + * @param string $placement Append, prepend, or set + * @param string|array $attributes Optional attributes to utilize + * @return Zend_View_Helper_HeadStyle + */ + public function headStyle($content = null, $placement = 'APPEND', $attributes = array()) + { + if ((null !== $content) && is_string($content)) { + switch (strtoupper($placement)) { + case 'SET': + $action = 'setStyle'; + break; + case 'PREPEND': + $action = 'prependStyle'; + break; + case 'APPEND': + default: + $action = 'appendStyle'; + break; + } + $this->$action($content, $attributes); + } + + return $this; + } + + /** + * Overload method calls + * + * Allows the following method calls: + * - appendStyle($content, $attributes = array()) + * - offsetSetStyle($index, $content, $attributes = array()) + * - prependStyle($content, $attributes = array()) + * - setStyle($content, $attributes = array()) + * + * @param string $method + * @param array $args + * @return void + * @throws Zend_View_Exception When no $content provided or invalid method + */ + public function __call($method, $args) + { + if (preg_match('/^(?Pset|(ap|pre)pend|offsetSet)(Style)$/', $method, $matches)) { + $index = null; + $argc = count($args); + $action = $matches['action']; + + if ('offsetSet' == $action) { + if (0 < $argc) { + $index = array_shift($args); + --$argc; + } + } + + if (1 > $argc) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception(sprintf('Method "%s" requires minimally content for the stylesheet', $method)); + } + + $content = $args[0]; + $attrs = array(); + if (isset($args[1])) { + $attrs = (array) $args[1]; + } + + $item = $this->createData($content, $attrs); + + if ('offsetSet' == $action) { + $this->offsetSet($index, $item); + } else { + $this->$action($item); + } + + return $this; + } + + return parent::__call($method, $args); + } + + /** + * Determine if a value is a valid style tag + * + * @param mixed $value + * @param string $method + * @return boolean + */ + protected function _isValid($value) + { + if ((!$value instanceof stdClass) + || !isset($value->content) + || !isset($value->attributes)) + { + return false; + } + + return true; + } + + /** + * Override append to enforce style creation + * + * @param mixed $value + * @return void + */ + public function append($value) + { + if (!$this->_isValid($value)) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception('Invalid value passed to append; please use appendStyle()'); + } + + return $this->getContainer()->append($value); + } + + /** + * Override offsetSet to enforce style creation + * + * @param string|int $index + * @param mixed $value + * @return void + */ + public function offsetSet($index, $value) + { + if (!$this->_isValid($value)) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception('Invalid value passed to offsetSet; please use offsetSetStyle()'); + } + + return $this->getContainer()->offsetSet($index, $value); + } + + /** + * Override prepend to enforce style creation + * + * @param mixed $value + * @return void + */ + public function prepend($value) + { + if (!$this->_isValid($value)) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception('Invalid value passed to prepend; please use prependStyle()'); + } + + return $this->getContainer()->prepend($value); + } + + /** + * Override set to enforce style creation + * + * @param mixed $value + * @return void + */ + public function set($value) + { + if (!$this->_isValid($value)) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception('Invalid value passed to set; please use setStyle()'); + } + + return $this->getContainer()->set($value); + } + + /** + * Start capture action + * + * @param mixed $captureType + * @param string $typeOrAttrs + * @return void + */ + public function captureStart($type = Zend_View_Helper_Placeholder_Container_Abstract::APPEND, $attrs = null) + { + if ($this->_captureLock) { + require_once 'Zend/View/Helper/Placeholder/Container/Exception.php'; + throw new Zend_View_Helper_Placeholder_Container_Exception('Cannot nest headStyle captures'); + } + + $this->_captureLock = true; + $this->_captureAttrs = $attrs; + $this->_captureType = $type; + ob_start(); + } + + /** + * End capture action and store + * + * @return void + */ + public function captureEnd() + { + $content = ob_get_clean(); + $attrs = $this->_captureAttrs; + $this->_captureAttrs = null; + $this->_captureLock = false; + + switch ($this->_captureType) { + case Zend_View_Helper_Placeholder_Container_Abstract::SET: + $this->setStyle($content, $attrs); + break; + case Zend_View_Helper_Placeholder_Container_Abstract::PREPEND: + $this->prependStyle($content, $attrs); + break; + case Zend_View_Helper_Placeholder_Container_Abstract::APPEND: + default: + $this->appendStyle($content, $attrs); + break; + } + } + + /** + * Convert content and attributes into valid style tag + * + * @param stdClass $item Item to render + * @param string $indent Indentation to use + * @return string + */ + public function itemToString(stdClass $item, $indent) + { + $attrString = ''; + if (!empty($item->attributes)) { + foreach ($item->attributes as $key => $value) { + if (!in_array($key, $this->_optionalAttributes)) { + continue; + } + if ('media' == $key) { + if (!in_array($value, $this->_mediaTypes)) { + continue; + } + } + $attrString .= sprintf(' %s="%s"', $key, htmlspecialchars($value)); + } + } + + $html = ''; + + return $html; + } + + /** + * Create string representation of placeholder + * + * @param string|int $indent + * @return string + */ + public function toString($indent = null) + { + $indent = (null !== $indent) + ? $this->getWhitespace($indent) + : $this->getIndent(); + + $items = array(); + foreach ($this as $item) { + if (!$this->_isValid($item)) { + continue; + } + $items[] = $this->itemToString($item, $indent); + } + + $return = $indent . implode($this->getSeparator() . $indent, $items); + $return = preg_replace("/(\r\n?|\n)/", '$1' . $indent, $return); + return $return; + } + + /** + * Create data item for use in stack + * + * @param string $content + * @param array $attributes + * @return stdClass + */ + public function createData($content, array $attributes) + { + if (!isset($attributes['media'])) { + $attributes['media'] = 'screen'; + } + + $data = new stdClass(); + $data->content = $content; + $data->attributes = $attributes; + + return $data; + } +} diff --git a/libs/Zend/View/Helper/HeadTitle.php b/libs/Zend/View/Helper/HeadTitle.php new file mode 100644 index 0000000..959bad7 --- /dev/null +++ b/libs/Zend/View/Helper/HeadTitle.php @@ -0,0 +1,177 @@ +set($title); + } elseif ($setType == Zend_View_Helper_Placeholder_Container_Abstract::PREPEND) { + $this->prepend($title); + } else { + $this->append($title); + } + } + + return $this; + } + + /** + * Sets a translation Adapter for translation + * + * @param Zend_Translate|Zend_Translate_Adapter $translate + * @return Zend_View_Helper_HeadTitle + */ + public function setTranslator($translate) + { + if ($translate instanceof Zend_Translate_Adapter) { + $this->_translator = $translate; + } elseif ($translate instanceof Zend_Translate) { + $this->_translator = $translate->getAdapter(); + } else { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception("You must set an instance of Zend_Translate or Zend_Translate_Adapter"); + } + return $this; + } + + /* + * Retrieve translation object + * + * If none is currently registered, attempts to pull it from the registry + * using the key 'Zend_Translate'. + * + * @return Zend_Translate_Adapter|null + */ + public function getTranslator() + { + if (null === $this->_translator) { + require_once 'Zend/Registry.php'; + if (Zend_Registry::isRegistered('Zend_Translate')) { + $this->setTranslator(Zend_Registry::get('Zend_Translate')); + } + } + return $this->_translator; + } + + /** + * Enables translation + * + * @return Zend_View_Helper_HeadTitle + */ + public function enableTranslation() + { + $this->_translate = true; + return $this; + } + + /** + * Disables translation + * + * @return Zend_View_Helper_HeadTitle + */ + public function disableTranslation() + { + $this->_translate = false; + return $this; + } + + /** + * Turn helper into string + * + * @param string|null $indent + * @param string|null $locale + * @return string + */ + public function toString($indent = null, $locale = null) + { + $indent = (null !== $indent) + ? $this->getWhitespace($indent) + : $this->getIndent(); + + $items = array(); + + if($this->_translate && $translator = $this->getTranslator()) { + foreach ($this as $item) { + $items[] = $translator->translate($item, $locale); + } + } else { + foreach ($this as $item) { + $items[] = $item; + } + } + + $separator = $this->getSeparator(); + $output = ''; + if(($prefix = $this->getPrefix())) { + $output .= $prefix; + } + $output .= implode($separator, $items); + if(($postfix = $this->getPostfix())) { + $output .= $postfix; + } + + $output = ($this->_autoEscape) ? $this->_escape($output) : $output; + + return $indent . '' . $output . ''; + } +} diff --git a/libs/Zend/View/Helper/HtmlElement.php b/libs/Zend/View/Helper/HtmlElement.php new file mode 100644 index 0000000..d96a0c7 --- /dev/null +++ b/libs/Zend/View/Helper/HtmlElement.php @@ -0,0 +1,141 @@ +_closingBracket) { + if ($this->_isXhtml()) { + $this->_closingBracket = ' />'; + } else { + $this->_closingBracket = '>'; + } + } + + return $this->_closingBracket; + } + + /** + * Is doctype XHTML? + * + * @return boolean + */ + protected function _isXhtml() + { + $doctype = $this->view->doctype(); + return $doctype->isXhtml(); + } + + /** + * Converts an associative array to a string of tag attributes. + * + * @access public + * + * @param array $attribs From this array, each key-value pair is + * converted to an attribute name and value. + * + * @return string The XHTML for the attributes. + */ + protected function _htmlAttribs($attribs) + { + $xhtml = ''; + foreach ((array) $attribs as $key => $val) { + $key = $this->view->escape($key); + + if (('on' == substr($key, 0, 2)) || ('constraints' == $key)) { + // Don't escape event attributes; _do_ substitute double quotes with singles + if (!is_scalar($val)) { + // non-scalar data should be cast to JSON first + require_once 'Zend/Json.php'; + $val = Zend_Json::encode($val); + } + $val = preg_replace('/"([^"]*)":/', '$1:', $val); + } else { + if (is_array($val)) { + $val = implode(' ', $val); + } + $val = $this->view->escape($val); + } + + if ('id' == $key) { + $val = $this->_normalizeId($val); + } + + if (strpos($val, '"') !== false) { + $xhtml .= " $key='$val'"; + } else { + $xhtml .= " $key=\"$val\""; + } + + } + return $xhtml; + } + + /** + * Normalize an ID + * + * @param string $value + * @return string + */ + protected function _normalizeId($value) + { + if (strstr($value, '[')) { + if ('[]' == substr($value, -2)) { + $value = substr($value, 0, strlen($value) - 2); + } + $value = trim($value, ']'); + $value = str_replace('][', '-', $value); + $value = str_replace('[', '-', $value); + } + return $value; + } +} diff --git a/libs/Zend/View/Helper/HtmlFlash.php b/libs/Zend/View/Helper/HtmlFlash.php new file mode 100644 index 0000000..5fd41ba --- /dev/null +++ b/libs/Zend/View/Helper/HtmlFlash.php @@ -0,0 +1,60 @@ + $data, + 'quality' => 'high'), $params); + + return $this->htmlObject($data, self::TYPE, $attribs, $params, $content); + } +} diff --git a/libs/Zend/View/Helper/HtmlList.php b/libs/Zend/View/Helper/HtmlList.php new file mode 100644 index 0000000..b4ee4ad --- /dev/null +++ b/libs/Zend/View/Helper/HtmlList.php @@ -0,0 +1,86 @@ +view->escape($item); + } + $list .= '
  • ' . $item . '
  • '; + } else { + if (5 < strlen($list)) { + $list = substr($list, 0, strlen($list) - 5) . $this->htmlList($item, $ordered, $attribs, $escape) . ''; + } else { + $list .= '
  • ' . $this->htmlList($item, $ordered, $attribs, $escape) . '
  • '; + } + } + } + + if ($attribs) { + $attribs = $this->_htmlAttribs($attribs); + } else { + $attribs = ''; + } + + $tag = 'ul'; + if ($ordered) { + $tag = 'ol'; + } + + return '<' . $tag . $attribs . '>' . $list . ''; + } +} diff --git a/libs/Zend/View/Helper/HtmlObject.php b/libs/Zend/View/Helper/HtmlObject.php new file mode 100644 index 0000000..31977cd --- /dev/null +++ b/libs/Zend/View/Helper/HtmlObject.php @@ -0,0 +1,80 @@ + $data, + 'type' => $type), $attribs); + + // Params + $paramHtml = array(); + $closingBracket = $this->getClosingBracket(); + + foreach ($params as $param => $options) { + if (is_string($options)) { + $options = array('value' => $options); + } + + $options = array_merge(array('name' => $param), $options); + + $paramHtml[] = '_htmlAttribs($options) . $closingBracket; + } + + // Content + if (is_array($content)) { + $content = implode(self::EOL, $content); + } + + // Object header + $xhtml = '_htmlAttribs($attribs) . '>' . self::EOL + . implode(self::EOL, $paramHtml) . self::EOL + . ($content ? $content . self::EOL : '') + . ''; + + return $xhtml; + } +} diff --git a/libs/Zend/View/Helper/HtmlPage.php b/libs/Zend/View/Helper/HtmlPage.php new file mode 100644 index 0000000..fa5fe5c --- /dev/null +++ b/libs/Zend/View/Helper/HtmlPage.php @@ -0,0 +1,75 @@ + self::ATTRIB_CLASSID); + + /** + * Output a html object tag + * + * @param string $data The html url + * @param array $attribs Attribs for the object tag + * @param array $params Params for in the object tag + * @param string $content Alternative content + * @return string + */ + public function htmlPage($data, array $attribs = array(), array $params = array(), $content = null) + { + // Attrs + $attribs = array_merge($this->_attribs, $attribs); + + // Params + $params = array_merge(array('data' => $data), $params); + + return $this->htmlObject($data, self::TYPE, $attribs, $params, $content); + } +} diff --git a/libs/Zend/View/Helper/HtmlQuicktime.php b/libs/Zend/View/Helper/HtmlQuicktime.php new file mode 100644 index 0000000..06a1e82 --- /dev/null +++ b/libs/Zend/View/Helper/HtmlQuicktime.php @@ -0,0 +1,82 @@ + self::ATTRIB_CLASSID, + 'codebase' => self::ATTRIB_CODEBASE); + + /** + * Output a quicktime movie object tag + * + * @param string $data The quicktime file + * @param array $attribs Attribs for the object tag + * @param array $params Params for in the object tag + * @param string $content Alternative content + * @return string + */ + public function htmlQuicktime($data, array $attribs = array(), array $params = array(), $content = null) + { + // Attrs + $attribs = array_merge($this->_attribs, $attribs); + + // Params + $params = array_merge(array('src' => $data), $params); + + return $this->htmlObject($data, self::TYPE, $attribs, $params, $content); + } +} diff --git a/libs/Zend/View/Helper/InlineScript.php b/libs/Zend/View/Helper/InlineScript.php new file mode 100644 index 0000000..99a1b3b --- /dev/null +++ b/libs/Zend/View/Helper/InlineScript.php @@ -0,0 +1,60 @@ +headScript($mode, $spec, $placement, $attrs, $type); + } +} diff --git a/libs/Zend/View/Helper/Interface.php b/libs/Zend/View/Helper/Interface.php new file mode 100644 index 0000000..58e9652 --- /dev/null +++ b/libs/Zend/View/Helper/Interface.php @@ -0,0 +1,46 @@ +disableLayout(); + } + } + + $response = Zend_Controller_Front::getInstance()->getResponse(); + $response->setHeader('Content-Type', 'application/json'); + return $data; + } +} diff --git a/libs/Zend/View/Helper/Layout.php b/libs/Zend/View/Helper/Layout.php new file mode 100644 index 0000000..2243b76 --- /dev/null +++ b/libs/Zend/View/Helper/Layout.php @@ -0,0 +1,81 @@ +_layout) { + require_once 'Zend/Layout.php'; + $this->_layout = Zend_Layout::getMvcInstance(); + if (null === $this->_layout) { + // Implicitly creates layout object + $this->_layout = new Zend_Layout(); + } + } + + return $this->_layout; + } + + /** + * Set layout object + * + * @param Zend_Layout $layout + * @return Zend_Layout_Controller_Action_Helper_Layout + */ + public function setLayout(Zend_Layout $layout) + { + $this->_layout = $layout; + return $this; + } + + /** + * Return layout object + * + * Usage: $this->layout()->setLayout('alternate'); + * + * @return Zend_Layout + */ + public function layout() + { + return $this->getLayout(); + } +} diff --git a/libs/Zend/View/Helper/PaginationControl.php b/libs/Zend/View/Helper/PaginationControl.php new file mode 100644 index 0000000..2a606a7 --- /dev/null +++ b/libs/Zend/View/Helper/PaginationControl.php @@ -0,0 +1,141 @@ +view = $view; + return $this; + } + + /** + * Sets the default view partial. + * + * @param string $partial View partial + */ + public static function setDefaultViewPartial($partial) + { + self::$_defaultViewPartial = $partial; + } + + /** + * Gets the default view partial + * + * @return string + */ + public static function getDefaultViewPartial() + { + return self::$_defaultViewPartial; + } + + /** + * 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, + * the defaults will be used (if set). + * + * @param Zend_Paginator (Optional) $paginator + * @param string $scrollingStyle (Optional) Scrolling style + * @param string $partial (Optional) View partial + * @param array|string $params (Optional) params to pass to the partial + * @return string + * @throws Zend_View_Exception + */ + public function paginationControl(Zend_Paginator $paginator = null, $scrollingStyle = null, $partial = null, $params = null) + { + if ($paginator === null) { + if (isset($this->view->paginator) and $this->view->paginator !== null and $this->view->paginator instanceof Zend_Paginator) { + $paginator = $this->view->paginator; + } else { + /** + * @see Zend_View_Exception + */ + require_once 'Zend/View/Exception.php'; + + throw new Zend_View_Exception('No paginator instance provided or incorrect type'); + } + } + + if ($partial === null) { + if (self::$_defaultViewPartial === null) { + /** + * @see Zend_View_Exception + */ + require_once 'Zend/View/Exception.php'; + + 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); + } + + if (is_array($partial)) { + if (count($partial) != 2) { + /** + * @see Zend_View_Exception + */ + require_once 'Zend/View/Exception.php'; + + throw new Zend_View_Exception('A view partial supplied as an array must contain two values: the filename and its module'); + } + + 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/Partial.php b/libs/Zend/View/Helper/Partial.php new file mode 100644 index 0000000..43917de --- /dev/null +++ b/libs/Zend/View/Helper/Partial.php @@ -0,0 +1,147 @@ +cloneView(); + if (isset($this->partialCounter)) { + $view->partialCounter = $this->partialCounter; + } + if ((null !== $module) && is_string($module)) { + require_once 'Zend/Controller/Front.php'; + $moduleDir = Zend_Controller_Front::getInstance()->getControllerDirectory($module); + if (null === $moduleDir) { + require_once 'Zend/View/Helper/Partial/Exception.php'; + throw new Zend_View_Helper_Partial_Exception('Cannot render partial; module does not exist'); + } + $viewsDir = dirname($moduleDir) . '/views'; + $view->addBasePath($viewsDir); + } elseif ((null == $model) && (null !== $module) + && (is_array($module) || is_object($module))) + { + $model = $module; + } + + if (!empty($model)) { + if (is_array($model)) { + $view->assign($model); + } elseif (is_object($model)) { + if (null !== ($objectKey = $this->getObjectKey())) { + $view->assign($objectKey, $model); + } elseif (method_exists($model, 'toArray')) { + $view->assign($model->toArray()); + } else { + $view->assign(get_object_vars($model)); + } + } + } + + return $view->render($name); + } + + /** + * Clone the current View + * + * @return Zend_View_Interface + */ + public function cloneView() + { + $view = clone $this->view; + $view->clearVars(); + return $view; + } + + /** + * Set object key + * + * @param string $key + * @return Zend_View_Helper_Partial + */ + public function setObjectKey($key) + { + if (null === $key) { + $this->_objectKey = null; + } else { + $this->_objectKey = (string) $key; + } + + return $this; + } + + /** + * Retrieve object key + * + * The objectKey is the variable to which an object in the iterator will be + * assigned. + * + * @return null|string + */ + public function getObjectKey() + { + return $this->_objectKey; + } +} diff --git a/libs/Zend/View/Helper/Partial/Exception.php b/libs/Zend/View/Helper/Partial/Exception.php new file mode 100644 index 0000000..0be94d9 --- /dev/null +++ b/libs/Zend/View/Helper/Partial/Exception.php @@ -0,0 +1,39 @@ +toArray(); + } + + $content = ''; + foreach ($model as $item) { + // increment the counter variable + $this->partialCounter++; + + $content .= $this->partial($name, $module, $item); + } + + return $content; + } +} diff --git a/libs/Zend/View/Helper/Placeholder.php b/libs/Zend/View/Helper/Placeholder.php new file mode 100644 index 0000000..3bd7ed9 --- /dev/null +++ b/libs/Zend/View/Helper/Placeholder.php @@ -0,0 +1,86 @@ +_registry = Zend_View_Helper_Placeholder_Registry::getRegistry(); + } + + + /** + * Placeholder helper + * + * @param string $name + * @return Zend_View_Helper_Placeholder_Container_Abstract + */ + public function placeholder($name) + { + $name = (string) $name; + return $this->_registry->getContainer($name); + } + + /** + * Retrieve the registry + * + * @return Zend_View_Helper_Placeholder_Registry + */ + public function getRegistry() + { + return $this->_registry; + } +} diff --git a/libs/Zend/View/Helper/Placeholder/Container.php b/libs/Zend/View/Helper/Placeholder/Container.php new file mode 100644 index 0000000..7584445 --- /dev/null +++ b/libs/Zend/View/Helper/Placeholder/Container.php @@ -0,0 +1,35 @@ +exchangeArray(array($value)); + } + + /** + * Prepend a value to the top of the container + * + * @param mixed $value + * @return void + */ + public function prepend($value) + { + $values = $this->getArrayCopy(); + array_unshift($values, $value); + $this->exchangeArray($values); + } + + /** + * Retrieve container value + * + * If single element registered, returns that element; otherwise, + * serializes to array. + * + * @return mixed + */ + public function getValue() + { + if (1 == count($this)) { + $keys = $this->getKeys(); + $key = array_shift($keys); + return $this[$key]; + } + + return $this->getArrayCopy(); + } + + /** + * Set prefix for __toString() serialization + * + * @param string $prefix + * @return Zend_View_Helper_Placeholder_Container + */ + public function setPrefix($prefix) + { + $this->_prefix = (string) $prefix; + return $this; + } + + /** + * Retrieve prefix + * + * @return string + */ + public function getPrefix() + { + return $this->_prefix; + } + + /** + * Set postfix for __toString() serialization + * + * @param string $postfix + * @return Zend_View_Helper_Placeholder_Container + */ + public function setPostfix($postfix) + { + $this->_postfix = (string) $postfix; + return $this; + } + + /** + * Retrieve postfix + * + * @return string + */ + public function getPostfix() + { + return $this->_postfix; + } + + /** + * Set separator for __toString() serialization + * + * Used to implode elements in container + * + * @param string $separator + * @return Zend_View_Helper_Placeholder_Container + */ + public function setSeparator($separator) + { + $this->_separator = (string) $separator; + return $this; + } + + /** + * Retrieve separator + * + * @return string + */ + public function getSeparator() + { + return $this->_separator; + } + + /** + * Set the indentation string for __toString() serialization, + * optionally, if a number is passed, it will be the number of spaces + * + * @param string|int $indent + * @return Zend_View_Helper_Placeholder_Container_Abstract + */ + public function setIndent($indent) + { + $this->_indent = $this->getWhitespace($indent); + return $this; + } + + /** + * Retrieve indentation + * + * @return string + */ + public function getIndent() + { + return $this->_indent; + } + + /** + * Retrieve whitespace representation of $indent + * + * @param int|string $indent + * @return string + */ + public function getWhitespace($indent) + { + if (is_int($indent)) { + $indent = str_repeat(' ', $indent); + } + + return (string) $indent; + } + + /** + * Start capturing content to push into placeholder + * + * @param int $type How to capture content into placeholder; append, prepend, or set + * @return void + * @throws Zend_View_Helper_Placeholder_Exception if nested captures detected + */ + public function captureStart($type = Zend_View_Helper_Placeholder_Container_Abstract::APPEND, $key = null) + { + if ($this->_captureLock) { + require_once 'Zend/View/Helper/Placeholder/Container/Exception.php'; + throw new Zend_View_Helper_Placeholder_Container_Exception('Cannot nest placeholder captures for the same placeholder'); + } + + $this->_captureLock = true; + $this->_captureType = $type; + if ((null !== $key) && is_scalar($key)) { + $this->_captureKey = (string) $key; + } + ob_start(); + } + + /** + * End content capture + * + * @return void + */ + public function captureEnd() + { + $data = ob_get_clean(); + $key = null; + $this->_captureLock = false; + if (null !== $this->_captureKey) { + $key = $this->_captureKey; + } + switch ($this->_captureType) { + case self::SET: + if (null !== $key) { + $this[$key] = $data; + } else { + $this->exchangeArray(array($data)); + } + break; + case self::PREPEND: + if (null !== $key) { + $array = array($key => $data); + $values = $this->getArrayCopy(); + $final = $array + $values; + $this->exchangeArray($final); + } else { + $this->prepend($data); + } + break; + case self::APPEND: + default: + if (null !== $key) { + if (empty($this[$key])) { + $this[$key] = $data; + } else { + $this[$key] .= $data; + } + } else { + $this[$this->nextIndex()] = $data; + } + break; + } + } + + /** + * Get keys + * + * @return array + */ + public function getKeys() + { + $array = $this->getArrayCopy(); + return array_keys($array); + } + + /** + * Next Index + * + * as defined by the PHP manual + * @return int + */ + public function nextIndex() + { + $keys = $this->getKeys(); + if (0 == count($keys)) { + return 0; + } + + return $nextIndex = max($keys) + 1; + } + + /** + * Render the placeholder + * + * @return string + */ + public function toString($indent = null) + { + $indent = ($indent !== null) + ? $this->getWhitespace($indent) + : $this->getIndent(); + + $items = $this->getArrayCopy(); + $return = $indent + . $this->getPrefix() + . implode($this->getSeparator(), $items) + . $this->getPostfix(); + $return = preg_replace("/(\r\n?|\n)/", '$1' . $indent, $return); + return $return; + } + + /** + * Serialize object to string + * + * @return string + */ + public function __toString() + { + return $this->toString(); + } +} diff --git a/libs/Zend/View/Helper/Placeholder/Container/Exception.php b/libs/Zend/View/Helper/Placeholder/Container/Exception.php new file mode 100644 index 0000000..0e1b39e --- /dev/null +++ b/libs/Zend/View/Helper/Placeholder/Container/Exception.php @@ -0,0 +1,39 @@ +setRegistry(Zend_View_Helper_Placeholder_Registry::getRegistry()); + $registry = $this->getRegistry(); + $this->setContainer($this->getRegistry()->getContainer($this->_regKey)); + } + + /** + * Retrieve registry + * + * @return Zend_View_Helper_Placeholder_Registry + */ + public function getRegistry() + { + return $this->_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) + { + $this->_registry = $registry; + return $this; + } + + /** + * 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 + */ + public function setAutoEscape($autoEscape = true) + { + $this->_autoEscape = ($autoEscape) ? true : false; + return $this; + } + + /** + * Return whether autoEscaping is enabled or disabled + * + * return bool + */ + public function getAutoEscape() + { + return $this->_autoEscape; + } + + /** + * Escape a string + * + * @param string $string + * @return string + */ + protected function _escape($string) + { + if ($this->view instanceof Zend_View_Interface) { + return $this->view->escape($string); + } + + return htmlentities((string) $string, null, 'UTF-8'); + } + + /** + * Set container on which to operate + * + * @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) + { + $this->_container = $container; + return $this; + } + + /** + * Retrieve placeholder container + * + * @return Zend_View_Helper_Placeholder_Container_Abstract + */ + public function getContainer() + { + return $this->_container; + } + + /** + * Overloading: set property value + * + * @param string $key + * @param mixed $value + * @return void + */ + public function __set($key, $value) + { + $container = $this->getContainer(); + $container[$key] = $value; + } + + /** + * Overloading: retrieve property + * + * @param string $key + * @return mixed + */ + public function __get($key) + { + $container = $this->getContainer(); + if (isset($container[$key])) { + return $container[$key]; + } + + return null; + } + + /** + * Overloading: check if property is set + * + * @param string $key + * @return bool + */ + public function __isset($key) + { + $container = $this->getContainer(); + return isset($container[$key]); + } + + /** + * Overloading: unset property + * + * @param string $key + * @return void + */ + public function __unset($key) + { + $container = $this->getContainer(); + if (isset($container[$key])) { + unset($container[$key]); + } + } + + /** + * Overload + * + * Proxy to container methods + * + * @param string $method + * @param array $args + * @return mixed + */ + public function __call($method, $args) + { + $container = $this->getContainer(); + if (method_exists($container, $method)) { + $return = call_user_func_array(array($container, $method), $args); + if ($return === $container) { + // If the container is returned, we really want the current object + return $this; + } + return $return; + } + + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception('Method "' . $method . '" does not exist'); + } + + /** + * String representation + * + * @return string + */ + public function toString() + { + return $this->getContainer()->toString(); + } + + /** + * Cast to string representation + * + * @return string + */ + public function __toString() + { + return $this->toString(); + } + + /** + * Countable + * + * @return int + */ + public function count() + { + $container = $this->getContainer(); + return count($container); + } + + /** + * ArrayAccess: offsetExists + * + * @param string|int $offset + * @return bool + */ + public function offsetExists($offset) + { + return $this->getContainer()->offsetExists($offset); + } + + /** + * ArrayAccess: offsetGet + * + * @param string|int $offset + * @return mixed + */ + public function offsetGet($offset) + { + return $this->getContainer()->offsetGet($offset); + } + + /** + * ArrayAccess: offsetSet + * + * @param string|int $offset + * @param mixed $value + * @return void + */ + public function offsetSet($offset, $value) + { + return $this->getContainer()->offsetSet($offset, $value); + } + + /** + * ArrayAccess: offsetUnset + * + * @param string|int $offset + * @return void + */ + public function offsetUnset($offset) + { + return $this->getContainer()->offsetUnset($offset); + } + + /** + * IteratorAggregate: get Iterator + * + * @return Iterator + */ + public function getIterator() + { + return $this->getContainer()->getIterator(); + } +} diff --git a/libs/Zend/View/Helper/Placeholder/Registry.php b/libs/Zend/View/Helper/Placeholder/Registry.php new file mode 100644 index 0000000..bc74f2f --- /dev/null +++ b/libs/Zend/View/Helper/Placeholder/Registry.php @@ -0,0 +1,183 @@ +_items[$key] = new $this->_containerClass(array()); + return $this->_items[$key]; + } + + /** + * Retrieve a placeholder container + * + * @param string $key + * @return Zend_View_Helper_Placeholder_Container_Abstract + */ + public function getContainer($key) + { + $key = (string) $key; + if (isset($this->_items[$key])) { + return $this->_items[$key]; + } + + $container = $this->createContainer($key); + + return $container; + } + + /** + * Does a particular container exist? + * + * @param string $key + * @return bool + */ + public function containerExists($key) + { + $key = (string) $key; + $return = array_key_exists($key, $this->_items); + return $return; + } + + /** + * Set the container for an item in the registry + * + * @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) + { + $key = (string) $key; + $this->_items[$key] = $container; + return $this; + } + + /** + * Delete a container + * + * @param string $key + * @return bool + */ + public function deleteContainer($key) + { + $key = (string) $key; + if (isset($this->_items[$key])) { + unset($this->_items[$key]); + return true; + } + + return false; + } + + /** + * Set the container class to use + * + * @param string $name + * @return Zend_View_Helper_Placeholder_Registry + */ + public function setContainerClass($name) + { + require_once 'Zend/Loader.php'; + Zend_Loader::loadClass($name); + + $reflection = new ReflectionClass($name); + if (!$reflection->isSubclassOf(new ReflectionClass('Zend_View_Helper_Placeholder_Container_Abstract'))) { + require_once 'Zend/View/Helper/Placeholder/Registry/Exception.php'; + throw new Zend_View_Helper_Placeholder_Registry_Exception('Invalid Container class specified'); + } + + $this->_containerClass = $name; + return $this; + } + + /** + * Retrieve the container class + * + * @return string + */ + public function getContainerClass() + { + return $this->_containerClass; + } +} diff --git a/libs/Zend/View/Helper/Placeholder/Registry/Exception.php b/libs/Zend/View/Helper/Placeholder/Registry/Exception.php new file mode 100644 index 0000000..7a1b882 --- /dev/null +++ b/libs/Zend/View/Helper/Placeholder/Registry/Exception.php @@ -0,0 +1,39 @@ +view->placeholder($placeholder)->captureStart(); + echo $this->view->render($script); + $this->view->placeholder($placeholder)->captureEnd(); + } +} diff --git a/libs/Zend/View/Helper/Translate.php b/libs/Zend/View/Helper/Translate.php new file mode 100644 index 0000000..e07d3d8 --- /dev/null +++ b/libs/Zend/View/Helper/Translate.php @@ -0,0 +1,178 @@ +setTranslator($translate); + } + } + + /** + * Translate a message + * You can give multiple params or an array of params. + * If you want to output another locale just set it as last single parameter + * Example 1: translate('%1\$s + %2\$s', $value1, $value2, $locale); + * Example 2: translate('%1\$s + %2\$s', array($value1, $value2), $locale); + * + * @param string $messageid Id of the message to be translated + * @return string Translated message + */ + public function translate($messageid = null) + { + if ($messageid === null) { + return $this; + } + + $translate = $this->getTranslator(); + if ($translate === null) { + return $messageid; + } + + $options = func_get_args(); + array_shift($options); + + $count = count($options); + $locale = null; + if ($count > 0) { + if (Zend_Locale::isLocale($options[($count - 1)], null, false) !== false) { + $locale = array_pop($options); + } + } + + if ((count($options) === 1) and (is_array($options[0]) === true)) { + $options = $options[0]; + } + + $message = $translate->translate($messageid, $locale); + if ($count === 0) { + return $message; + } + + return vsprintf($message, $options); + } + + /** + * Sets a translation Adapter for translation + * + * @param Zend_Translate|Zend_Translate_Adapter $translate Instance of Zend_Translate + * @throws Zend_View_Exception When no or a false instance was set + * @return Zend_View_Helper_Translate + */ + public function setTranslator($translate) + { + if ($translate instanceof Zend_Translate_Adapter) { + $this->_translator = $translate; + } else if ($translate instanceof Zend_Translate) { + $this->_translator = $translate->getAdapter(); + } else { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception('You must set an instance of Zend_Translate or Zend_Translate_Adapter'); + } + + return $this; + } + + /** + * Retrieve translation object + * + * If none is currently registered, attempts to pull it from the registry + * using the key 'Zend_Translate'. + * + * @return Zend_Translate_Adapter|null + */ + public function getTranslator() + { + if ($this->_translator === null) { + require_once 'Zend/Registry.php'; + if (Zend_Registry::isRegistered('Zend_Translate') === true) { + $this->setTranslator(Zend_Registry::get('Zend_Translate')); + } + } + + return $this->_translator; + } + + /** + * Set's an new locale for all further translations + * + * @param string|Zend_Locale $locale New locale to set + * @throws Zend_View_Exception When no Zend_Translate instance was set + * @return Zend_View_Helper_Translate + */ + public function setLocale($locale = null) + { + $translate = $this->getTranslator(); + if ($translate === null) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception('You must set an instance of Zend_Translate or Zend_Translate_Adapter'); + } + + $translate->setLocale($locale); + return $this; + } + + /** + * Returns the set locale for translations + * + * @throws Zend_View_Exception When no Zend_Translate instance was set + * @return string|Zend_Locale + */ + public function getLocale() + { + $translate = $this->getTranslator(); + if ($translate === null) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception('You must set an instance of Zend_Translate or Zend_Translate_Adapter'); + } + + return $translate->getLocale(); + } +} diff --git a/libs/Zend/View/Helper/Url.php b/libs/Zend/View/Helper/Url.php new file mode 100644 index 0000000..a616096 --- /dev/null +++ b/libs/Zend/View/Helper/Url.php @@ -0,0 +1,51 @@ +getRouter(); + return $router->assemble($urlOptions, $name, $reset, $encode); + } +} diff --git a/libs/Zend/View/Interface.php b/libs/Zend/View/Interface.php new file mode 100644 index 0000000..8ea6f43 --- /dev/null +++ b/libs/Zend/View/Interface.php @@ -0,0 +1,136 @@ + value pairs to set en + * masse. + * + * @see __set() + * @param string|array $spec The assignment strategy to use (key or array of key + * => value pairs) + * @param mixed $value (Optional) If assigning a named variable, use this + * as the value. + * @return void + */ + public function assign($spec, $value = null); + + /** + * Clear all assigned variables + * + * Clears all variables assigned to Zend_View either via {@link assign()} or + * property overloading ({@link __get()}/{@link __set()}). + * + * @return void + */ + public function clearVars(); + + /** + * Processes a view script and returns the output. + * + * @param string $name The script script name to process. + * @return string The script output. + */ + public function render($name); +} diff --git a/libs/Zend/View/Stream.php b/libs/Zend/View/Stream.php new file mode 100644 index 0000000..0cf71d7 --- /dev/null +++ b/libs/Zend/View/Stream.php @@ -0,0 +1,182 @@ +_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 + */ + if ($this->_data === false) { + $this->_stat = stat($path); + return false; + } + + /** + * 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 + * requested again, which will make include() happy. + */ + $this->_stat = stat($path); + + return true; + } + + /** + * Included so that __FILE__ returns the appropriate info + * + * @return array + */ + public function url_stat() + { + return $this->_stat; + } + + /** + * Reads from the stream. + */ + 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() + { + return $this->_pos; + } + + + /** + * Tells if we are at the end of the stream. + */ + public function stream_eof() + { + return $this->_pos >= strlen($this->_data); + } + + + /** + * Stream statistics. + */ + public function stream_stat() + { + return $this->_stat; + } + + + /** + * Seek to a specific point in the stream. + */ + public function stream_seek($offset, $whence) + { + switch ($whence) { + case SEEK_SET: + if ($offset < strlen($this->_data) && $offset >= 0) { + $this->_pos = $offset; + return true; + } else { + return false; + } + break; + + case SEEK_CUR: + if ($offset >= 0) { + $this->_pos += $offset; + return true; + } else { + return false; + } + break; + + case SEEK_END: + if (strlen($this->_data) + $offset >= 0) { + $this->_pos = strlen($this->_data) + $offset; + return true; + } else { + return false; + } + break; + + default: + return false; + } + } +} diff --git a/libs/Zend/Wildfire/Channel/HttpHeaders.php b/libs/Zend/Wildfire/Channel/HttpHeaders.php new file mode 100644 index 0000000..671a86c --- /dev/null +++ b/libs/Zend/Wildfire/Channel/HttpHeaders.php @@ -0,0 +1,289 @@ +_protocols[$uri])) { + $this->_protocols[$uri] = $this->_initProtocol($uri); + } + + $this->_registerControllerPlugin(); + + return $this->_protocols[$uri]; + } + + /** + * Initialize a new protocol + * + * @param string $uri The URI for the protocol to be initialized + * @return object Returns the new initialized protocol instance + * @throws Zend_Wildfire_Exception + */ + protected function _initProtocol($uri) + { + switch ($uri) { + case Zend_Wildfire_Protocol_JsonStream::PROTOCOL_URI; + return new Zend_Wildfire_Protocol_JsonStream(); + } + throw new Zend_Wildfire_Exception('Tyring to initialize unknown protocol for URI "'.$uri.'".'); + } + + + /** + * Flush all data from all protocols and send all data to response headers. + * + * @return boolean Returns TRUE if data was flushed + */ + public function flush() + { + if (!$this->_protocols || !$this->isReady()) { + return false; + } + + foreach ( $this->_protocols as $protocol ) { + + $payload = $protocol->getPayload($this); + + if ($payload) { + foreach( $payload as $message ) { + + $this->getResponse()->setHeader(self::$_headerPrefix.$message[0], + $message[1], true); + } + } + } + return true; + } + + /** + * Set the index of the plugin in the controller dispatch loop plugin stack + * + * @param integer $index The index of the plugin in the stack + * @return integer The previous index. + */ + public static function setControllerPluginStackIndex($index) + { + $previous = self::$_controllerPluginStackIndex; + self::$_controllerPluginStackIndex = $index; + return $previous; + } + + /** + * Register this object as a controller plugin. + * + * @return void + */ + protected function _registerControllerPlugin() + { + $controller = Zend_Controller_Front::getInstance(); + if (!$controller->hasPlugin(get_class($this))) { + $controller->registerPlugin($this, self::$_controllerPluginStackIndex); + } + } + + + /* + * Zend_Wildfire_Channel_Interface + */ + + /** + * Determine if channel is ready. + * + * @return boolean Returns TRUE if channel is ready. + */ + public function isReady() + { + return ($this->getResponse()->canSendHeaders() && + preg_match_all('/\s?FirePHP\/([\.|\d]*)\s?/si', + $this->getRequest()->getHeader('User-Agent'),$m)); + } + + + /* + * Zend_Controller_Plugin_Abstract + */ + + /** + * Flush messages to headers as late as possible but before headers have been sent. + * + * @return void + */ + public function dispatchLoopShutdown() + { + $this->flush(); + } + + /** + * Get the request object + * + * @return Zend_Controller_Request_Abstract + * @throws Zend_Wildfire_Exception + */ + public function getRequest() + { + if (!$this->_request) { + $controller = Zend_Controller_Front::getInstance(); + $this->setRequest($controller->getRequest()); + } + if (!$this->_request) { + throw new Zend_Wildfire_Exception('Request objects not initialized.'); + } + return $this->_request; + } + + /** + * Get the response object + * + * @return Zend_Controller_Response_Abstract + * @throws Zend_Wildfire_Exception + */ + public function getResponse() + { + if (!$this->_response) { + $response = Zend_Controller_Front::getInstance()->getResponse(); + if ($response) { + $this->setResponse($response); + } + } + if (!$this->_response) { + throw new Zend_Wildfire_Exception('Response objects not initialized.'); + } + return $this->_response; + } +} diff --git a/libs/Zend/Wildfire/Channel/Interface.php b/libs/Zend/Wildfire/Channel/Interface.php new file mode 100644 index 0000000..ea5284c --- /dev/null +++ b/libs/Zend/Wildfire/Channel/Interface.php @@ -0,0 +1,37 @@ +_channel = Zend_Wildfire_Channel_HttpHeaders::getInstance(); + $this->_channel->getProtocol(self::PROTOCOL_URI)->registerPlugin($this); + } + + /** + * Get or create singleton instance + * + * @param $skipCreate boolean True if an instance should not be created + * @return Zend_Wildfire_Plugin_FirePhp + */ + public static function getInstance($skipCreate=false) + { + if (self::$_instance===null && $skipCreate!==true) { + return self::init(); + } + return self::$_instance; + } + + /** + * Destroys the singleton instance + * + * Primarily used for testing. + * + * @return void + */ + public static function destroyInstance() + { + self::$_instance = null; + } + + /** + * Enable or disable sending of messages to user-agent. + * If disabled all headers to be sent will be removed. + * + * @param boolean $enabled Set to TRUE to enable sending of messages. + * @return boolean The previous value. + */ + public function setEnabled($enabled) + { + $previous = $this->_enabled; + $this->_enabled = $enabled; + if (!$this->_enabled) { + $this->_messages = array(); + $this->_channel->getProtocol(self::PROTOCOL_URI)->clearMessages($this); + } + return $previous; + } + + /** + * Determine if logging to user-agent is enabled. + * + * @return boolean Returns TRUE if logging is enabled. + */ + public function getEnabled() + { + return $this->_enabled; + } + + /** + * Starts a group in the Firebug Console + * + * @param string $title The title of the group + * @return TRUE if the group instruction was added to the response headers or buffered. + */ + public static function group($title) + { + return self::send(null, $title, self::GROUP_START); + } + + /** + * Ends a group in the Firebug Console + * + * @return TRUE if the group instruction was added to the response headers or buffered. + */ + public static function groupEnd() + { + return self::send(null, null, self::GROUP_END); + } + + /** + * Logs variables to the Firebug Console + * via HTTP response headers and the FirePHP Firefox Extension. + * + * @param mixed $var The variable to log. + * @param string $label OPTIONAL Label to prepend to the log event. + * @param string $style OPTIONAL Style of the log event. + * @return boolean Returns TRUE if the variable was added to the response headers or buffered. + * @throws Zend_Wildfire_Exception + */ + public static function send($var, $label=null, $style=null) + { + if (self::$_instance===null) { + self::getInstance(); + } + + if (!self::$_instance->_enabled) { + return false; + } + + if ($var instanceof Zend_Wildfire_Plugin_FirePhp_Message) { + + if ($var->getBuffered()) { + if (!in_array($var, self::$_instance->_messages)) { + self::$_instance->_messages[] = $var; + } + return true; + } + + if ($var->getDestroy()) { + return false; + } + + $style = $var->getStyle(); + $label = $var->getLabel(); + $var = $var->getMessage(); + } + + if (!self::$_instance->_channel->isReady()) { + return false; + } + + if ($var instanceof Exception) { + + $var = array('Class'=>get_class($var), + 'Message'=>$var->getMessage(), + 'File'=>$var->getFile(), + 'Line'=>$var->getLine(), + 'Type'=>'throw', + 'Trace'=>$var->getTrace()); + + $style = self::EXCEPTION; + + } else + if ($style==self::TRACE) { + + $trace = debug_backtrace(); + if(!$trace) return false; + + for ( $i=0 ; $i$trace[$i]['class'], + 'Type'=>$trace[$i]['type'], + 'Function'=>$trace[$i]['function'], + 'Message'=>(isset($trace[$i]['args'][0]))?$trace[$i]['args'][0]:'', + 'File'=>(isset($trace[$i]['file']))?$trace[$i]['file']:'', + 'Line'=>(isset($trace[$i]['line']))?$trace[$i]['line']:'', + 'Args'=>$trace[$i]['args'], + 'Trace'=>array_splice($trace,$i+1)); + } else { + if ($style===null) { + $style = self::LOG; + } + } + + switch ($style) { + case self::LOG: + case self::INFO: + case self::WARN: + case self::ERROR: + case self::EXCEPTION: + case self::TRACE: + case self::TABLE: + case self::DUMP: + case self::GROUP_START: + case self::GROUP_END: + break; + default: + throw new Zend_Wildfire_Exception('Log style "'.$style.'" not recognized!'); + break; + } + + if ($style == self::DUMP) { + + return self::$_instance->_recordMessage(self::STRUCTURE_URI_DUMP, + array('key'=>$label, + 'data'=>$var)); + + } else { + + $meta = array('Type'=>$style); + + if ($label!=null) { + $meta['Label'] = $label; + } + + return self::$_instance->_recordMessage(self::STRUCTURE_URI_FIREBUGCONSOLE, + array('data'=>$var, + 'meta'=>$meta)); + } + } + + + /** + * Record a message with the given data in the given structure + * + * @param string $structure The structure to be used for the data + * @param array $data The data to be recorded + * @return boolean Returns TRUE if message was recorded + * @throws Zend_Wildfire_Exception + */ + protected function _recordMessage($structure, $data) + { + switch($structure) { + + case self::STRUCTURE_URI_DUMP: + + if (!isset($data['key'])) { + throw new Zend_Wildfire_Exception('You must supply a key.'); + } + if (!array_key_exists('data',$data)) { + throw new Zend_Wildfire_Exception('You must supply data.'); + } + + return $this->_channel->getProtocol(self::PROTOCOL_URI)-> + recordMessage($this, + $structure, + array($data['key']=>$this->_encodeObject($data['data']))); + + case self::STRUCTURE_URI_FIREBUGCONSOLE: + + if (!isset($data['meta']) || + !is_array($data['meta']) || + !array_key_exists('Type',$data['meta'])) { + + throw new Zend_Wildfire_Exception('You must supply a "Type" in the meta information.'); + } + if (!array_key_exists('data',$data)) { + throw new Zend_Wildfire_Exception('You must supply data.'); + } + + return $this->_channel->getProtocol(self::PROTOCOL_URI)-> + recordMessage($this, + $structure, + array($data['meta'], + $this->_encodeObject($data['data']))); + + default: + throw new Zend_Wildfire_Exception('Structure of name "'.$structure.'" is not recognized.'); + break; + } + return false; + } + + /** + * Encode an object by generating an array containing all object members. + * + * All private and protected members are included. Some meta info about + * the object class is added. + * + * @param mixed $object The object/array/value to be encoded + * @return array The encoded object + */ + protected function _encodeObject($object, $depth = 1) + { + $return = array(); + + if (is_resource($object)) { + + return '** '.(string)$object.' **'; + + } else + if (is_object($object)) { + + if ($depth > $this->_maxObjectDepth) { + return '** Max Depth **'; + } + + foreach ($this->_objectStack as $refVal) { + if ($refVal === $object) { + return '** Recursion ('.get_class($object).') **'; + } + } + array_push($this->_objectStack, $object); + + $return['__className'] = $class = get_class($object); + + $reflectionClass = new ReflectionClass($class); + $properties = array(); + foreach ( $reflectionClass->getProperties() as $property) { + $properties[$property->getName()] = $property; + } + + $members = (array)$object; + + foreach ($properties as $raw_name => $property) { + + $name = $raw_name; + if ($property->isStatic()) { + $name = 'static:'.$name; + } + if ($property->isPublic()) { + $name = 'public:'.$name; + } else + if ($property->isPrivate()) { + $name = 'private:'.$name; + $raw_name = "\0".$class."\0".$raw_name; + } else + if ($property->isProtected()) { + $name = 'protected:'.$name; + $raw_name = "\0".'*'."\0".$raw_name; + } + + if (array_key_exists($raw_name,$members) + && !$property->isStatic()) { + + $return[$name] = $this->_encodeObject($members[$raw_name], $depth + 1); + + } else { + if (method_exists($property,'setAccessible')) { + $property->setAccessible(true); + $return[$name] = $this->_encodeObject($property->getValue($object), $depth + 1); + } else + if ($property->isPublic()) { + $return[$name] = $this->_encodeObject($property->getValue($object), $depth + 1); + } else { + $return[$name] = '** Need PHP 5.3 to get value **'; + } + } + } + + // Include all members that are not defined in the class + // but exist in the object + foreach($members as $name => $value) { + if ($name{0} == "\0") { + $parts = explode("\0", $name); + $name = $parts[2]; + } + if (!isset($properties[$name])) { + $name = 'undeclared:'.$name; + $return[$name] = $this->_encodeObject($value, $depth + 1); + } + } + + array_pop($this->_objectStack); + + } elseif (is_array($object)) { + + if ($depth > $this->_maxArrayDepth) { + return '** Max Depth **'; + } + + foreach ($object as $key => $val) { + + // Encoding the $GLOBALS PHP array causes an infinite loop + // if the recursion is not reset here as it contains + // a reference to itself. This is the only way I have come up + // with to stop infinite recursion in this case. + if ($key=='GLOBALS' + && is_array($val) + && array_key_exists('GLOBALS',$val)) { + + $val['GLOBALS'] = '** Recursion (GLOBALS) **'; + } + $return[$key] = $this->_encodeObject($val, $depth + 1); + } + } else { + return $object; + } + return $return; + } + + + /* + * Zend_Wildfire_Plugin_Interface + */ + + /** + * Get the unique indentifier for this plugin. + * + * @return string Returns the URI of the plugin. + */ + public function getUri() + { + return self::PLUGIN_URI; + } + + /** + * Flush any buffered data. + * + * @param string $protocolUri The URI of the protocol that should be flushed to + * @return void + */ + public function flushMessages($protocolUri) + { + if(!$this->_messages || $protocolUri!=self::PROTOCOL_URI) { + return; + } + + foreach( $this->_messages as $message ) { + if (!$message->getDestroy()) { + $this->send($message->getMessage(), $message->getLabel(), $message->getStyle()); + } + } + + $this->_messages = array(); + } +} diff --git a/libs/Zend/Wildfire/Plugin/FirePhp/Message.php b/libs/Zend/Wildfire/Plugin/FirePhp/Message.php new file mode 100644 index 0000000..cdb80a5 --- /dev/null +++ b/libs/Zend/Wildfire/Plugin/FirePhp/Message.php @@ -0,0 +1,195 @@ +_style = $style; + $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 + */ + public function setLabel($label) + { + $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 + */ + public function setBuffered($buffered) + { + $previous = $this->_buffered; + $this->_buffered = $buffered; + return $previous; + } + + /** + * Determine if buffering is enabled or disabled + * + * @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 + */ + public function setDestroy($destroy) + { + $previous = $this->_destroy; + $this->_destroy = $destroy; + return $previous; + } + + /** + * Determine if message should be destroyed + * + * @return boolean Returns TRUE if message should be destroyed, FALSE otherwise. + */ + public function getDestroy() + { + return $this->_destroy; + } + + /** + * Set the style of the message + * + * @return void + */ + public function setStyle($style) + { + $this->_style = $style; + } + + /** + * Get the style of the message + * + * @return string The style of the message + */ + public function getStyle() + { + return $this->_style; + } + + /** + * Set the actual message to be sent in its final format. + * + * @return void + */ + public function setMessage($message) + { + $this->_message = $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; + } +} + diff --git a/libs/Zend/Wildfire/Plugin/FirePhp/TableMessage.php b/libs/Zend/Wildfire/Plugin/FirePhp/TableMessage.php new file mode 100644 index 0000000..8a5bf85 --- /dev/null +++ b/libs/Zend/Wildfire/Plugin/FirePhp/TableMessage.php @@ -0,0 +1,98 @@ +setLabel($label); + } + + /** + * Set the table header + * + * @param array $header The header columns + * @return void + */ + public function setHeader($header) + { + $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 + */ + public function addRow($row) + { + $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() + { + $table = $this->_rows; + array_unshift($table,$this->_header); + return $table; + } + +} + diff --git a/libs/Zend/Wildfire/Plugin/Interface.php b/libs/Zend/Wildfire/Plugin/Interface.php new file mode 100644 index 0000000..1f20d64 --- /dev/null +++ b/libs/Zend/Wildfire/Plugin/Interface.php @@ -0,0 +1,47 @@ +_plugins)) { + return false; + } + $this->_plugins[] = $plugin; + return true; + } + + /** + * Record a message with the given data in the given structure + * + * @param Zend_Wildfire_Plugin_Interface $plugin The plugin recording the message + * @param string $structure The structure to be used for the data + * @param array $data The data to be recorded + * @return boolean Returns TRUE if message was recorded + */ + public function recordMessage(Zend_Wildfire_Plugin_Interface $plugin, $structure, $data) + { + if(!isset($this->_messages[$structure])) { + $this->_messages[$structure] = array(); + } + + $uri = $plugin->getUri(); + + if(!isset($this->_messages[$structure][$uri])) { + $this->_messages[$structure][$uri] = array(); + } + + $this->_messages[$structure][$uri][] = $this->_encode($data); + return true; + } + + /** + * Remove all qued messages + * + * @param Zend_Wildfire_Plugin_Interface $plugin The plugin for which to clear messages + * @return boolean Returns TRUE if messages were present + */ + public function clearMessages(Zend_Wildfire_Plugin_Interface $plugin) + { + $uri = $plugin->getUri(); + + $present = false; + foreach ($this->_messages as $structure => $messages) { + + if(!isset($this->_messages[$structure][$uri])) { + continue; + } + + $present = true; + + unset($this->_messages[$structure][$uri]); + + if (!$this->_messages[$structure]) { + unset($this->_messages[$structure]); + } + } + return $present; + } + + /** + * Get all qued messages + * + * @return mixed Returns qued messages or FALSE if no messages are qued + */ + public function getMessages() + { + if (!$this->_messages) { + return false; + } + return $this->_messages; + } + + /** + * Use the JSON encoding scheme for the value specified + * + * @param mixed $value The value to be encoded + * @return string The encoded value + */ + protected function _encode($value) + { + return Zend_Json::encode($value, true, array('silenceCyclicalExceptions'=>true)); + } + + /** + * Retrieves all formatted data ready to be sent by the channel. + * + * @param Zend_Wildfire_Channel_Interface $channel The instance of the channel that will be transmitting the data + * @return mixed Returns the data to be sent by the channel. + * @throws Zend_Wildfire_Exception + */ + public function getPayload(Zend_Wildfire_Channel_Interface $channel) + { + if (!$channel instanceof Zend_Wildfire_Channel_HttpHeaders) { + throw new Zend_Wildfire_Exception('The '.get_class($channel).' channel is not supported by the '.get_class($this).' protocol.'); + } + + if ($this->_plugins) { + foreach ($this->_plugins as $plugin) { + $plugin->flushMessages(self::PROTOCOL_URI); + } + } + + if (!$this->_messages) { + return false; + } + + $protocol_index = 1; + $structure_index = 1; + $plugin_index = 1; + $message_index = 1; + + $payload = array(); + + $payload[] = array('Protocol-'.$protocol_index, self::PROTOCOL_URI); + + foreach ($this->_messages as $structure_uri => $plugin_messages ) { + + $payload[] = array($protocol_index.'-Structure-'.$structure_index, $structure_uri); + + foreach ($plugin_messages as $plugin_uri => $messages ) { + + $payload[] = array($protocol_index.'-Plugin-'.$plugin_index, $plugin_uri); + + foreach ($messages as $message) { + + $parts = explode("\n",chunk_split($message, 5000, "\n")); + + for ($i=0 ; $i2) { + $msg = (($i==0)?strlen($message):'') + . '|' . $part . '|' + . (($i 99999) { + throw new Zend_Wildfire_Exception('Maximum number (99,999) of messages reached!'); + } + } + } + } + $plugin_index++; + } + $structure_index++; + } + + return $payload; + } + +} + diff --git a/libs/Zend/XmlRpc/Client.php b/libs/Zend/XmlRpc/Client.php new file mode 100644 index 0000000..f859fa8 --- /dev/null +++ b/libs/Zend/XmlRpc/Client.php @@ -0,0 +1,355 @@ +_httpClient = new Zend_Http_Client(); + } else { + $this->_httpClient = $httpClient; + } + + $this->_introspector = new Zend_XmlRpc_Client_ServerIntrospection($this); + $this->_serverAddress = $server; + } + + + /** + * Sets the HTTP client object to use for connecting the XML-RPC server. + * + * @param Zend_Http_Client $httpClient + * @return Zend_Http_Client + */ + public function setHttpClient(Zend_Http_Client $httpClient) + { + return $this->_httpClient = $httpClient; + } + + + /** + * Gets the HTTP client object. + * + * @return Zend_Http_Client + */ + public function getHttpClient() + { + return $this->_httpClient; + } + + + /** + * Sets the object used to introspect remote servers + * + * @param Zend_XmlRpc_Client_ServerIntrospection + * @return Zend_XmlRpc_Client_ServerIntrospection + */ + public function setIntrospector(Zend_XmlRpc_Client_ServerIntrospection $introspector) + { + return $this->_introspector = $introspector; + } + + + /** + * Gets the introspection object. + * + * @return Zend_XmlRpc_Client_ServerIntrospection + */ + public function getIntrospector() + { + return $this->_introspector; + } + + + /** + * The request of the last method call + * + * @return Zend_XmlRpc_Request + */ + public function getLastRequest() + { + return $this->_lastRequest; + } + + + /** + * The response received from the last method call + * + * @return Zend_XmlRpc_Response + */ + public function getLastResponse() + { + return $this->_lastResponse; + } + + + /** + * Returns a proxy object for more convenient method calls + * + * @param $namespace Namespace to proxy or empty string for none + * @return Zend_XmlRpc_Client_ServerProxy + */ + public function getProxy($namespace = '') + { + if (empty($this->_proxyCache[$namespace])) { + $proxy = new Zend_XmlRpc_Client_ServerProxy($this, $namespace); + $this->_proxyCache[$namespace] = $proxy; + } + return $this->_proxyCache[$namespace]; + } + + /** + * Set skip system lookup flag + * + * @param bool $flag + * @return Zend_XmlRpc_Client + */ + public function setSkipSystemLookup($flag = true) + { + $this->_skipSystemLookup = (bool) $flag; + return $this; + } + + /** + * Skip system lookup when determining if parameter should be array or struct? + * + * @return bool + */ + public function skipSystemLookup() + { + return $this->_skipSystemLookup; + } + + /** + * Perform an XML-RPC request and return a response. + * + * @param Zend_XmlRpc_Request $request + * @param null|Zend_XmlRpc_Response $response + * @return void + */ + public function doRequest($request, $response = null) + { + $this->_lastRequest = $request; + + iconv_set_encoding('input_encoding', 'UTF-8'); + iconv_set_encoding('output_encoding', 'UTF-8'); + iconv_set_encoding('internal_encoding', 'UTF-8'); + + $http = $this->getHttpClient(); + if($http->getUri() === null) { + $http->setUri($this->_serverAddress); + } + + $http->setHeaders(array( + 'Content-Type: text/xml; charset=utf-8', + 'User-Agent: Zend_XmlRpc_Client', + 'Accept: text/xml', + )); + + $xml = $this->_lastRequest->__toString(); + $http->setRawData($xml); + $httpResponse = $http->request(Zend_Http_Client::POST); + + if (! $httpResponse->isSuccessful()) { + throw new Zend_XmlRpc_Client_HttpException( + $httpResponse->getMessage(), + $httpResponse->getStatus()); + } + + if ($response === null) { + $response = new Zend_XmlRpc_Response(); + } + $this->_lastResponse = $response; + $this->_lastResponse->loadXml($httpResponse->getBody()); + } + + /** + * Send an XML-RPC request to the service (for a specific method) + * + * @param string $method Name of the method we want to call + * @param array $params Array of parameters for the method + * @throws Zend_Http_Client_FaultException + */ + public function call($method, $params=array()) + { + if (!$this->skipSystemLookup() && ('system.' != substr($method, 0, 7))) { + // Ensure empty array/struct params are cast correctly + // If system.* methods are not available, bypass. (ZF-2978) + $success = true; + try { + $signatures = $this->getIntrospector()->getMethodSignature($method); + } catch (Zend_XmlRpc_Exception $e) { + $success = false; + } + if ($success) { + foreach ($params as $key => $param) { + if (is_array($param) && empty($param)) { + $type = 'array'; + foreach ($signatures as $signature) { + if (!is_array($signature)) { + continue; + } + if (array_key_exists($key + 1, $signature)) { + $type = $signature[$key + 1]; + $type = (in_array($type, array('array', 'struct'))) ? $type : 'array'; + break; + } + } + $params[$key] = array( + 'type' => $type, + 'value' => $param + ); + } + } + } + } + + $request = new Zend_XmlRpc_Request($method, $params); + + $this->doRequest($request); + + if ($this->_lastResponse->isFault()) { + $fault = $this->_lastResponse->getFault(); + throw new Zend_XmlRpc_Client_FaultException($fault->getMessage(), + $fault->getCode()); + } + + return $this->_lastResponse->getReturnValue(); + } +} diff --git a/libs/Zend/XmlRpc/Client/Exception.php b/libs/Zend/XmlRpc/Client/Exception.php new file mode 100644 index 0000000..266fe4d --- /dev/null +++ b/libs/Zend/XmlRpc/Client/Exception.php @@ -0,0 +1,39 @@ +_system = $client->getProxy('system'); + } + + /** + * Returns the signature for each method on the server, + * autodetecting whether system.multicall() is supported and + * using it if so. + * + * @return array + */ + public function getSignatureForEachMethod() + { + $methods = $this->listMethods(); + + try { + $signatures = $this->getSignatureForEachMethodByMulticall($methods); + } catch (Zend_XmlRpc_Client_FaultException $e) { + // degrade to looping + } + + if (empty($signatures)) { + $signatures = $this->getSignatureForEachMethodByLooping($methods); + } + + return $signatures; + } + + /** + * Attempt to get the method signatures in one request via system.multicall(). + * This is a boxcar feature of XML-RPC and is found on fewer servers. However, + * can significantly improve performance if present. + * + * @param array $methods + * @return array array(array(return, param, param, param...)) + */ + public function getSignatureForEachMethodByMulticall($methods = null) + { + if ($methods === null) { + $methods = $this->listMethods(); + } + + $multicallParams = array(); + foreach ($methods as $method) { + $multicallParams[] = array('methodName' => 'system.methodSignature', + 'params' => array($method)); + } + + $serverSignatures = $this->_system->multicall($multicallParams); + + if (! is_array($serverSignatures)) { + $type = gettype($serverSignatures); + $error = "Multicall return is malformed. Expected array, got $type"; + throw new Zend_XmlRpc_Client_IntrospectException($error); + } + + if (count($serverSignatures) != count($methods)) { + $error = 'Bad number of signatures received from multicall'; + throw new Zend_XmlRpc_Client_IntrospectException($error); + } + + // Create a new signatures array with the methods name as keys and the signature as value + $signatures = array(); + foreach ($serverSignatures as $i => $signature) { + $signatures[$methods[$i]] = $signature; + } + + return $signatures; + } + + /** + * Get the method signatures for every method by + * successively calling system.methodSignature + * + * @param array $methods + * @return array + */ + public function getSignatureForEachMethodByLooping($methods = null) + { + if ($methods === null) { + $methods = $this->listMethods(); + } + + $signatures = array(); + foreach ($methods as $method) { + $signatures[$method] = $this->getMethodSignature($method); + } + + return $signatures; + } + + /** + * Call system.methodSignature() for the given method + * + * @param array $method + * @return array array(array(return, param, param, param...)) + */ + public function getMethodSignature($method) + { + $signature = $this->_system->methodSignature($method); + return $signature; + } + + /** + * Call system.listMethods() + * + * @param array $method + * @return array array(method, method, method...) + */ + public function listMethods() + { + return $this->_system->listMethods(); + } + +} diff --git a/libs/Zend/XmlRpc/Client/ServerProxy.php b/libs/Zend/XmlRpc/Client/ServerProxy.php new file mode 100644 index 0000000..521c1aa --- /dev/null +++ b/libs/Zend/XmlRpc/Client/ServerProxy.php @@ -0,0 +1,94 @@ +foo->bar->baz()". + * + * @category Zend + * @package Zend_XmlRpc + * @subpackage Client + * @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_XmlRpc_Client_ServerProxy +{ + /** + * @var Zend_XmlRpc_Client + */ + private $_client = null; + + /** + * @var string + */ + private $_namespace = ''; + + + /** + * @var array of Zend_XmlRpc_Client_ServerProxy + */ + private $_cache = array(); + + + /** + * Class constructor + * + * @param string $namespace + * @param Zend_XmlRpc_Client $client + */ + public function __construct($client, $namespace = '') + { + $this->_namespace = $namespace; + $this->_client = $client; + } + + + /** + * Get the next successive namespace + * + * @param string $name + * @return Zend_XmlRpc_Client_ServerProxy + */ + public function __get($namespace) + { + $namespace = ltrim("$this->_namespace.$namespace", '.'); + if (!isset($this->_cache[$namespace])) { + $this->_cache[$namespace] = new $this($this->_client, $namespace); + } + return $this->_cache[$namespace]; + } + + + /** + * Call a method in this namespace. + * + * @param string $methodN + * @param array $args + * @return mixed + */ + public function __call($method, $args) + { + $method = ltrim("$this->_namespace.$method", '.'); + return $this->_client->call($method, $args); + } +} diff --git a/libs/Zend/XmlRpc/Exception.php b/libs/Zend/XmlRpc/Exception.php new file mode 100644 index 0000000..48031f5 --- /dev/null +++ b/libs/Zend/XmlRpc/Exception.php @@ -0,0 +1,36 @@ + messages + * @var array + */ + protected $_internal = array( + 404 => 'Unknown Error', + + // 610 - 619 reflection errors + 610 => 'Invalid method class', + 611 => 'Unable to attach function or callback; not callable', + 612 => 'Unable to load array; not an array', + 613 => 'One or more method records are corrupt or otherwise unusable', + + // 620 - 629 dispatch errors + 620 => 'Method does not exist', + 621 => 'Error instantiating class to invoke method', + 622 => 'Method missing implementation', + 623 => 'Calling parameters do not match signature', + + // 630 - 639 request errors + 630 => 'Unable to read request', + 631 => 'Failed to parse request', + 632 => 'Invalid request, no method passed; request must contain a \'methodName\' tag', + 633 => 'Param must contain a value', + 634 => 'Invalid method name', + 635 => 'Invalid XML provided to request', + 636 => 'Error creating xmlrpc value', + + // 640 - 649 system.* errors + 640 => 'Method does not exist', + + // 650 - 659 response errors + 650 => 'Invalid XML provided for response', + 651 => 'Failed to parse response', + 652 => 'Invalid response', + 653 => 'Invalid XMLRPC value in response', + ); + + /** + * Constructor + * + * @return Zend_XmlRpc_Fault + */ + public function __construct($code = 404, $message = '') + { + $this->setCode($code); + $code = $this->getCode(); + + if (empty($message) && isset($this->_internal[$code])) { + $message = $this->_internal[$code]; + } elseif (empty($message)) { + $message = 'Unknown error'; + } + $this->setMessage($message); + } + + /** + * Set the fault code + * + * @param int $code + * @return Zend_XmlRpc_Fault + */ + public function setCode($code) + { + $this->_code = (int) $code; + return $this; + } + + /** + * Return fault code + * + * @return int + */ + public function getCode() + { + return $this->_code; + } + + /** + * Retrieve fault message + * + * @param string + * @return Zend_XmlRpc_Fault + */ + public function setMessage($message) + { + $this->_message = (string) $message; + return $this; + } + + /** + * Retrieve fault message + * + * @return string + */ + public function getMessage() + { + return $this->_message; + } + + /** + * Set encoding to use in fault response + * + * @param string $encoding + * @return Zend_XmlRpc_Fault + */ + public function setEncoding($encoding) + { + $this->_encoding = $encoding; + return $this; + } + + /** + * Retrieve current fault encoding + * + * @return string + */ + public function getEncoding() + { + return $this->_encoding; + } + + /** + * Load an XMLRPC fault from XML + * + * @param string $fault + * @return boolean Returns true if successfully loaded fault response, false + * if response was not a fault response + * @throws Zend_XmlRpc_Exception if no or faulty XML provided, or if fault + * response does not contain either code or message + */ + public function loadXml($fault) + { + if (!is_string($fault)) { + throw new Zend_XmlRpc_Exception('Invalid XML provided to fault'); + } + + try { + $xml = @new SimpleXMLElement($fault); + } catch (Exception $e) { + // Not valid XML + throw new Zend_XmlRpc_Exception('Failed to parse XML fault: ' . $e->getMessage(), 500); + } + + // Check for fault + if (!$xml->fault) { + // Not a fault + return false; + } + + if (!$xml->fault->value->struct) { + // not a proper fault + throw new Zend_XmlRpc_Exception('Invalid fault structure', 500); + } + + $structXml = $xml->fault->value->asXML(); + $structXml = preg_replace('/<\?xml version=.*?\?>/i', '', $structXml); + $struct = Zend_XmlRpc_Value::getXmlRpcValue(trim($structXml), Zend_XmlRpc_Value::XML_STRING); + $struct = $struct->getValue(); + + if (isset($struct['faultCode'])) { + $code = $struct['faultCode']; + } + if (isset($struct['faultString'])) { + $message = $struct['faultString']; + } + + if (empty($code) && empty($message)) { + throw new Zend_XmlRpc_Exception('Fault code and string required'); + } + + if (empty($code)) { + $code = '404'; + } + + if (empty($message)) { + if (isset($this->_internal[$code])) { + $message = $this->_internal[$code]; + } else { + $message = 'Unknown Error'; + } + } + + $this->setCode($code); + $this->setMessage($message); + + return true; + } + + /** + * Determine if an XML response is an XMLRPC fault + * + * @param string $xml + * @return boolean + */ + public static function isFault($xml) + { + $fault = new self(); + try { + $isFault = $fault->loadXml($xml); + } catch (Zend_XmlRpc_Exception $e) { + $isFault = false; + } + + return $isFault; + } + + /** + * Serialize fault to XML + * + * @return string + */ + public function saveXML() + { + // Create fault value + $faultStruct = array( + 'faultCode' => $this->getCode(), + 'faultString' => $this->getMessage() + ); + $value = Zend_XmlRpc_Value::getXmlRpcValue($faultStruct); + $valueDOM = new DOMDocument('1.0', $this->getEncoding()); + $valueDOM->loadXML($value->saveXML()); + + // Build response XML + $dom = new DOMDocument('1.0', $this->getEncoding()); + $r = $dom->appendChild($dom->createElement('methodResponse')); + $f = $r->appendChild($dom->createElement('fault')); + $f->appendChild($dom->importNode($valueDOM->documentElement, 1)); + + return $dom->saveXML(); + } + + /** + * Return XML fault response + * + * @return string + */ + public function __toString() + { + return $this->saveXML(); + } +} diff --git a/libs/Zend/XmlRpc/Request.php b/libs/Zend/XmlRpc/Request.php new file mode 100644 index 0000000..6e08acf --- /dev/null +++ b/libs/Zend/XmlRpc/Request.php @@ -0,0 +1,443 @@ +setMethod($method); + } + + if ($params !== null) { + $this->setParams($params); + } + } + + + /** + * Set encoding to use in request + * + * @param string $encoding + * @return Zend_XmlRpc_Request + */ + public function setEncoding($encoding) + { + $this->_encoding = $encoding; + return $this; + } + + /** + * Retrieve current request encoding + * + * @return string + */ + public function getEncoding() + { + return $this->_encoding; + } + + /** + * Set method to call + * + * @param string $method + * @return boolean Returns true on success, false if method name is invalid + */ + public function setMethod($method) + { + if (!is_string($method) || !preg_match('/^[a-z0-9_.:\/]+$/i', $method)) { + $this->_fault = new Zend_XmlRpc_Fault(634, 'Invalid method name ("' . $method . '")'); + $this->_fault->setEncoding($this->getEncoding()); + return false; + } + + $this->_method = $method; + return true; + } + + /** + * Retrieve call method + * + * @return string + */ + public function getMethod() + { + return $this->_method; + } + + /** + * Add a parameter to the parameter stack + * + * Adds a parameter to the parameter stack, associating it with the type + * $type if provided + * + * @param mixed $value + * @param string $type Optional; type hinting + * @return void + */ + public function addParam($value, $type = null) + { + $this->_params[] = $value; + if (null === $type) { + // Detect type if not provided explicitly + if ($value instanceof Zend_XmlRpc_Value) { + $type = $value->getType(); + } else { + $xmlRpcValue = Zend_XmlRpc_Value::getXmlRpcValue($value); + $type = $xmlRpcValue->getType(); + } + } + $this->_types[] = $type; + $this->_xmlRpcParams[] = array('value' => $value, 'type' => $type); + } + + /** + * Set the parameters array + * + * If called with a single, array value, that array is used to set the + * parameters stack. If called with multiple values or a single non-array + * value, the arguments are used to set the parameters stack. + * + * Best is to call with array of the format, in order to allow type hinting + * when creating the XMLRPC values for each parameter: + * + * $array = array( + * array( + * 'value' => $value, + * 'type' => $type + * )[, ... ] + * ); + * + * + * @access public + * @return void + */ + public function setParams() + { + $argc = func_num_args(); + $argv = func_get_args(); + if (0 == $argc) { + return; + } + + if ((1 == $argc) && is_array($argv[0])) { + $params = array(); + $types = array(); + $wellFormed = true; + foreach ($argv[0] as $arg) { + if (!is_array($arg) || !isset($arg['value'])) { + $wellFormed = false; + break; + } + $params[] = $arg['value']; + + if (!isset($arg['type'])) { + $xmlRpcValue = Zend_XmlRpc_Value::getXmlRpcValue($arg['value']); + $arg['type'] = $xmlRpcValue->getType(); + } + $types[] = $arg['type']; + } + if ($wellFormed) { + $this->_xmlRpcParams = $argv[0]; + $this->_params = $params; + $this->_types = $types; + } else { + $this->_params = $argv[0]; + $this->_types = array(); + $xmlRpcParams = array(); + foreach ($argv[0] as $arg) { + if ($arg instanceof Zend_XmlRpc_Value) { + $type = $arg->getType(); + } else { + $xmlRpcValue = Zend_XmlRpc_Value::getXmlRpcValue($arg); + $type = $xmlRpcValue->getType(); + } + $xmlRpcParams[] = array('value' => $arg, 'type' => $type); + $this->_types[] = $type; + } + $this->_xmlRpcParams = $xmlRpcParams; + } + return; + } + + $this->_params = $argv; + $this->_types = array(); + $xmlRpcParams = array(); + foreach ($argv as $arg) { + if ($arg instanceof Zend_XmlRpc_Value) { + $type = $arg->getType(); + } else { + $xmlRpcValue = Zend_XmlRpc_Value::getXmlRpcValue($arg); + $type = $xmlRpcValue->getType(); + } + $xmlRpcParams[] = array('value' => $arg, 'type' => $type); + $this->_types[] = $type; + } + $this->_xmlRpcParams = $xmlRpcParams; + } + + /** + * Retrieve the array of parameters + * + * @return array + */ + public function getParams() + { + return $this->_params; + } + + /** + * Return parameter types + * + * @return array + */ + public function getTypes() + { + return $this->_types; + } + + /** + * Load XML and parse into request components + * + * @param string $request + * @return boolean True on success, false if an error occurred. + */ + public function loadXml($request) + { + if (!is_string($request)) { + $this->_fault = new Zend_XmlRpc_Fault(635); + $this->_fault->setEncoding($this->getEncoding()); + return false; + } + + try { + $xml = @new SimpleXMLElement($request); + } catch (Exception $e) { + // Not valid XML + $this->_fault = new Zend_XmlRpc_Fault(631); + $this->_fault->setEncoding($this->getEncoding()); + return false; + } + + // Check for method name + if (empty($xml->methodName)) { + // Missing method name + $this->_fault = new Zend_XmlRpc_Fault(632); + $this->_fault->setEncoding($this->getEncoding()); + return false; + } + + $this->_method = (string) $xml->methodName; + + // Check for parameters + if (!empty($xml->params)) { + $types = array(); + $argv = array(); + foreach ($xml->params->children() as $param) { + if (! $param->value instanceof SimpleXMLElement) { + $this->_fault = new Zend_XmlRpc_Fault(633); + $this->_fault->setEncoding($this->getEncoding()); + return false; + } + + try { + $param = Zend_XmlRpc_Value::getXmlRpcValue($param->value, Zend_XmlRpc_Value::XML_STRING); + $types[] = $param->getType(); + $argv[] = $param->getValue(); + } catch (Exception $e) { + $this->_fault = new Zend_XmlRpc_Fault(636); + $this->_fault->setEncoding($this->getEncoding()); + return false; + } + } + + $this->_types = $types; + $this->_params = $argv; + } + + $this->_xml = $request; + + return true; + } + + /** + * Does the current request contain errors and should it return a fault + * response? + * + * @return boolean + */ + public function isFault() + { + return $this->_fault instanceof Zend_XmlRpc_Fault; + } + + /** + * Retrieve the fault response, if any + * + * @return null|Zend_XmlRpc_Fault + */ + public function getFault() + { + return $this->_fault; + } + + /** + * Retrieve method parameters as XMLRPC values + * + * @return array + */ + protected function _getXmlRpcParams() + { + $params = array(); + if (is_array($this->_xmlRpcParams)) { + foreach ($this->_xmlRpcParams as $param) { + $value = $param['value']; + $type = isset($param['type']) ? $param['type'] : Zend_XmlRpc_Value::AUTO_DETECT_TYPE; + + if (!$value instanceof Zend_XmlRpc_Value) { + $value = Zend_XmlRpc_Value::getXmlRpcValue($value, $type); + } + $params[] = $value; + } + } + + return $params; + } + + /** + * Create XML request + * + * @return string + */ + public function saveXML() + { + $args = $this->_getXmlRpcParams(); + $method = $this->getMethod(); + + $dom = new DOMDocument('1.0', $this->getEncoding()); + $mCall = $dom->appendChild($dom->createElement('methodCall')); + $mName = $mCall->appendChild($dom->createElement('methodName', $method)); + + if (is_array($args) && count($args)) { + $params = $mCall->appendChild($dom->createElement('params')); + + foreach ($args as $arg) { + /* @var $arg Zend_XmlRpc_Value */ + $argDOM = new DOMDocument('1.0', $this->getEncoding()); + $argDOM->loadXML($arg->saveXML()); + + $param = $params->appendChild($dom->createElement('param')); + $param->appendChild($dom->importNode($argDOM->documentElement, 1)); + } + } + + return $dom->saveXML(); + } + + /** + * Return XML request + * + * @return string + */ + public function __toString() + { + return $this->saveXML(); + } +} diff --git a/libs/Zend/XmlRpc/Request/Http.php b/libs/Zend/XmlRpc/Request/Http.php new file mode 100644 index 0000000..a7b2be5 --- /dev/null +++ b/libs/Zend/XmlRpc/Request/Http.php @@ -0,0 +1,129 @@ +_fault = new Zend_XmlRpc_Server_Exception(630); + return; + } + + $xml = ''; + while (!feof($fh)) { + $xml .= fgets($fh); + } + fclose($fh); + + $this->_xml = $xml; + + $this->loadXml($xml); + } + + /** + * Retrieve the raw XML request + * + * @return string + */ + public function getRawRequest() + { + return $this->_xml; + } + + /** + * Get headers + * + * Gets all headers as key => value pairs and returns them. + * + * @return array + */ + public function getHeaders() + { + if (null === $this->_headers) { + $this->_headers = array(); + foreach ($_SERVER as $key => $value) { + if ('HTTP_' == substr($key, 0, 5)) { + $header = str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($key, 5))))); + $this->_headers[$header] = $value; + } + } + } + + return $this->_headers; + } + + /** + * Retrieve the full HTTP request, including headers and XML + * + * @return string + */ + public function getFullRequest() + { + $request = ''; + foreach ($this->getHeaders() as $key => $value) { + $request .= $key . ': ' . $value . "\n"; + } + + $request .= $this->_xml; + + return $request; + } +} diff --git a/libs/Zend/XmlRpc/Request/Stdin.php b/libs/Zend/XmlRpc/Request/Stdin.php new file mode 100644 index 0000000..ab29ecf --- /dev/null +++ b/libs/Zend/XmlRpc/Request/Stdin.php @@ -0,0 +1,84 @@ +_fault = new Zend_XmlRpc_Server_Exception(630); + return; + } + + $xml = ''; + while (!feof($fh)) { + $xml .= fgets($fh); + } + fclose($fh); + + $this->_xml = $xml; + + $this->loadXml($xml); + } + + /** + * Retrieve the raw XML request + * + * @return string + */ + public function getRawRequest() + { + return $this->_xml; + } +} diff --git a/libs/Zend/XmlRpc/Response.php b/libs/Zend/XmlRpc/Response.php new file mode 100644 index 0000000..df9284e --- /dev/null +++ b/libs/Zend/XmlRpc/Response.php @@ -0,0 +1,249 @@ +setReturnValue($return, $type); + } + + /** + * Set encoding to use in response + * + * @param string $encoding + * @return Zend_XmlRpc_Response + */ + public function setEncoding($encoding) + { + $this->_encoding = $encoding; + return $this; + } + + /** + * Retrieve current response encoding + * + * @return string + */ + public function getEncoding() + { + return $this->_encoding; + } + + /** + * Set the return value + * + * Sets the return value, with optional type hinting if provided. + * + * @param mixed $value + * @param string $type + * @return void + */ + public function setReturnValue($value, $type = null) + { + $this->_return = $value; + $this->_type = (string) $type; + } + + /** + * Retrieve the return value + * + * @return mixed + */ + public function getReturnValue() + { + return $this->_return; + } + + /** + * Retrieve the XMLRPC value for the return value + * + * @return Zend_XmlRpc_Value + */ + protected function _getXmlRpcReturn() + { + return Zend_XmlRpc_Value::getXmlRpcValue($this->_return); + } + + /** + * Is the response a fault response? + * + * @return boolean + */ + public function isFault() + { + return $this->_fault instanceof Zend_XmlRpc_Fault; + } + + /** + * Returns the fault, if any. + * + * @return null|Zend_XmlRpc_Fault + */ + public function getFault() + { + return $this->_fault; + } + + /** + * Load a response from an XML response + * + * Attempts to load a response from an XMLRPC response, autodetecting if it + * is a fault response. + * + * @param string $response + * @return boolean True if a valid XMLRPC response, false if a fault + * response or invalid input + */ + public function loadXml($response) + { + if (!is_string($response)) { + $this->_fault = new Zend_XmlRpc_Fault(650); + $this->_fault->setEncoding($this->getEncoding()); + return false; + } + + try { + $xml = @new SimpleXMLElement($response); + } catch (Exception $e) { + // Not valid XML + $this->_fault = new Zend_XmlRpc_Fault(651); + $this->_fault->setEncoding($this->getEncoding()); + return false; + } + + if (!empty($xml->fault)) { + // fault response + $this->_fault = new Zend_XmlRpc_Fault(); + $this->_fault->setEncoding($this->getEncoding()); + $this->_fault->loadXml($response); + return false; + } + + if (empty($xml->params)) { + // Invalid response + $this->_fault = new Zend_XmlRpc_Fault(652); + $this->_fault->setEncoding($this->getEncoding()); + return false; + } + + try { + if (!isset($xml->params) || !isset($xml->params->param) || !isset($xml->params->param->value)) { + throw new Zend_XmlRpc_Value_Exception('Missing XML-RPC value in XML'); + } + $valueXml = $xml->params->param->value->asXML(); + $valueXml = preg_replace('/<\?xml version=.*?\?>/i', '', $valueXml); + $value = Zend_XmlRpc_Value::getXmlRpcValue(trim($valueXml), Zend_XmlRpc_Value::XML_STRING); + } catch (Zend_XmlRpc_Value_Exception $e) { + $this->_fault = new Zend_XmlRpc_Fault(653); + $this->_fault->setEncoding($this->getEncoding()); + return false; + } + + $this->setReturnValue($value->getValue()); + return true; + } + + /** + * Return response as XML + * + * @return string + */ + public function saveXML() + { + $value = $this->_getXmlRpcReturn(); + $valueDOM = new DOMDocument('1.0', $this->getEncoding()); + $valueDOM->loadXML($value->saveXML()); + + $dom = new DOMDocument('1.0', $this->getEncoding()); + $response = $dom->appendChild($dom->createElement('methodResponse')); + $params = $response->appendChild($dom->createElement('params')); + $param = $params->appendChild($dom->createElement('param')); + + $param->appendChild($dom->importNode($valueDOM->documentElement, true)); + + return $dom->saveXML(); + } + + /** + * Return XML response + * + * @return string + */ + public function __toString() + { + return $this->saveXML(); + } +} diff --git a/libs/Zend/XmlRpc/Response/Http.php b/libs/Zend/XmlRpc/Response/Http.php new file mode 100644 index 0000000..43bc521 --- /dev/null +++ b/libs/Zend/XmlRpc/Response/Http.php @@ -0,0 +1,51 @@ +getEncoding())); + } + + return parent::__toString(); + } +} diff --git a/libs/Zend/XmlRpc/Server.php b/libs/Zend/XmlRpc/Server.php new file mode 100644 index 0000000..bcb4cba --- /dev/null +++ b/libs/Zend/XmlRpc/Server.php @@ -0,0 +1,581 @@ + + * require_once 'Zend/XmlRpc/Server.php'; + * require_once 'Zend/XmlRpc/Server/Cache.php'; + * require_once 'Zend/XmlRpc/Server/Fault.php'; + * require_once 'My/Exception.php'; + * require_once 'My/Fault/Observer.php'; + * + * // Instantiate server + * $server = new Zend_XmlRpc_Server(); + * + * // Allow some exceptions to report as fault responses: + * Zend_XmlRpc_Server_Fault::attachFaultException('My_Exception'); + * Zend_XmlRpc_Server_Fault::attachObserver('My_Fault_Observer'); + * + * // Get or build dispatch table: + * if (!Zend_XmlRpc_Server_Cache::get($filename, $server)) { + * require_once 'Some/Service/Class.php'; + * require_once 'Another/Service/Class.php'; + * + * // Attach Some_Service_Class in 'some' namespace + * $server->setClass('Some_Service_Class', 'some'); + * + * // Attach Another_Service_Class in 'another' namespace + * $server->setClass('Another_Service_Class', 'another'); + * + * // Create dispatch table cache file + * Zend_XmlRpc_Server_Cache::save($filename, $server); + * } + * + * $response = $server->handle(); + * echo $response; + * + * + * @category Zend + * @package Zend_XmlRpc + * @subpackage Server + * @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_XmlRpc_Server extends Zend_Server_Abstract +{ + /** + * Character encoding + * @var string + */ + protected $_encoding = 'UTF-8'; + + /** + * Request processed + * @var null|Zend_XmlRpc_Request + */ + protected $_request = null; + + /** + * Class to use for responses; defaults to {@link Zend_XmlRpc_Response_Http} + * @var string + */ + protected $_responseClass = 'Zend_XmlRpc_Response_Http'; + + /** + * Dispatch table of name => method pairs + * @var Zend_XmlRpc_Server_ServerDefinition + */ + protected $_table; + + /** + * PHP types => XML-RPC types + * @var array + */ + protected $_typeMap = array( + 'i4' => 'i4', + 'int' => 'int', + 'integer' => 'int', + 'double' => 'double', + 'float' => 'double', + 'real' => 'double', + 'boolean' => 'boolean', + 'bool' => 'boolean', + 'true' => 'boolean', + 'false' => 'boolean', + 'string' => 'string', + 'str' => 'string', + 'base64' => 'base64', + 'dateTime.iso8601' => 'dateTime.iso8601', + 'date' => 'dateTime.iso8601', + 'time' => 'dateTime.iso8601', + 'time' => 'dateTime.iso8601', + 'array' => 'array', + 'struct' => 'struct', + 'null' => 'nil', + 'nil' => 'nil', + 'void' => 'void', + 'mixed' => 'struct' + ); + + /** + * Constructor + * + * Creates system.* methods. + * + * @return void + */ + public function __construct() + { + $this->_table = new Zend_Server_Definition(); + $this->_registerSystemMethods(); + } + + /** + * Proxy calls to system object + * + * @param string $method + * @param array $params + * @return mixed + * @throws Zend_XmlRpc_Server_Exception + */ + public function __call($method, $params) + { + $system = $this->getSystem(); + if (!method_exists($system, $method)) { + throw new Zend_XmlRpc_Server_Exception('Unknown instance method called on server: ' . $method); + } + return call_user_func_array(array($system, $method), $params); + } + + /** + * Attach a callback as an XMLRPC method + * + * Attaches a callback as an XMLRPC method, prefixing the XMLRPC method name + * with $namespace, if provided. Reflection is done on the callback's + * docblock to create the methodHelp for the XMLRPC method. + * + * Additional arguments to pass to the function at dispatch may be passed; + * any arguments following the namespace will be aggregated and passed at + * dispatch time. + * + * @param string|array $function Valid callback + * @param string $namespace Optional namespace prefix + * @return void + * @throws Zend_XmlRpc_Server_Exception + */ + public function addFunction($function, $namespace = '') + { + if (!is_string($function) && !is_array($function)) { + throw new Zend_XmlRpc_Server_Exception('Unable to attach function; invalid', 611); + } + + $argv = null; + if (2 < func_num_args()) { + $argv = func_get_args(); + $argv = array_slice($argv, 2); + } + + $function = (array) $function; + foreach ($function as $func) { + if (!is_string($func) || !function_exists($func)) { + throw new Zend_XmlRpc_Server_Exception('Unable to attach function; invalid', 611); + } + $reflection = Zend_Server_Reflection::reflectFunction($func, $argv, $namespace); + $this->_buildSignature($reflection); + } + } + + /** + * Attach class methods as XMLRPC method handlers + * + * $class may be either a class name or an object. Reflection is done on the + * class or object to determine the available public methods, and each is + * attached to the server as an available method; if a $namespace has been + * provided, that namespace is used to prefix the XMLRPC method names. + * + * Any additional arguments beyond $namespace will be passed to a method at + * invocation. + * + * @param string|object $class + * @param string $namespace Optional + * @param mixed $argv Optional arguments to pass to methods + * @return void + * @throws Zend_XmlRpc_Server_Exception on invalid input + */ + public function setClass($class, $namespace = '', $argv = null) + { + if (is_string($class) && !class_exists($class)) { + if (!class_exists($class)) { + throw new Zend_XmlRpc_Server_Exception('Invalid method class', 610); + } + } + + $argv = null; + if (3 < func_num_args()) { + $argv = func_get_args(); + $argv = array_slice($argv, 3); + } + + $dispatchable = Zend_Server_Reflection::reflectClass($class, $argv, $namespace); + foreach ($dispatchable->getMethods() as $reflection) { + $this->_buildSignature($reflection, $class); + } + } + + /** + * Raise an xmlrpc server fault + * + * @param string|Exception $fault + * @param int $code + * @return Zend_XmlRpc_Server_Fault + */ + public function fault($fault = null, $code = 404) + { + if (!$fault instanceof Exception) { + $fault = (string) $fault; + if (empty($fault)) { + $fault = 'Unknown error'; + } + $fault = new Zend_XmlRpc_Server_Exception($fault, $code); + } + + return Zend_XmlRpc_Server_Fault::getInstance($fault); + } + + /** + * Handle an xmlrpc call + * + * @param Zend_XmlRpc_Request $request Optional + * @return Zend_XmlRpc_Response|Zend_XmlRpc_Fault + */ + public function handle($request = false) + { + // Get request + if ((!$request || !$request instanceof Zend_XmlRpc_Request) + && (null === ($request = $this->getRequest())) + ) { + require_once 'Zend/XmlRpc/Request/Http.php'; + $request = new Zend_XmlRpc_Request_Http(); + $request->setEncoding($this->getEncoding()); + } + + $this->setRequest($request); + + if ($request->isFault()) { + $response = $request->getFault(); + } else { + try { + $response = $this->_handle($request); + } catch (Exception $e) { + $response = $this->fault($e); + } + } + + // Set output encoding + $response->setEncoding($this->getEncoding()); + + return $response; + } + + /** + * Load methods as returned from {@link getFunctions} + * + * Typically, you will not use this method; it will be called using the + * results pulled from {@link Zend_XmlRpc_Server_Cache::get()}. + * + * @param array|Zend_Server_Definition $definition + * @return void + * @throws Zend_XmlRpc_Server_Exception on invalid input + */ + public function loadFunctions($definition) + { + if (!is_array($definition) && (!$definition instanceof Zend_Server_Definition)) { + if (is_object($definition)) { + $type = get_class($definition); + } else { + $type = gettype($definition); + } + throw new Zend_XmlRpc_Server_Exception('Unable to load server definition; must be an array or Zend_Server_Definition, received ' . $type, 612); + } + + $this->_table->clearMethods(); + $this->_registerSystemMethods(); + + if ($definition instanceof Zend_Server_Definition) { + $definition = $definition->getMethods(); + } + + foreach ($definition as $key => $method) { + if ('system.' == substr($key, 0, 7)) { + continue; + } + $this->_table->addMethod($method, $key); + } + } + + /** + * Set encoding + * + * @param string $encoding + * @return Zend_XmlRpc_Server + */ + public function setEncoding($encoding) + { + $this->_encoding = $encoding; + return $this; + } + + /** + * Retrieve current encoding + * + * @return string + */ + public function getEncoding() + { + return $this->_encoding; + } + + /** + * Do nothing; persistence is handled via {@link Zend_XmlRpc_Server_Cache} + * + * @param mixed $mode + * @return void + */ + public function setPersistence($mode) + { + } + + /** + * Set the request object + * + * @param string|Zend_XmlRpc_Request $request + * @return Zend_XmlRpc_Server + * @throws Zend_XmlRpc_Server_Exception on invalid request class or object + */ + public function setRequest($request) + { + if (is_string($request) && class_exists($request)) { + $request = new $request(); + if (!$request instanceof Zend_XmlRpc_Request) { + throw new Zend_XmlRpc_Server_Exception('Invalid request class'); + } + $request->setEncoding($this->getEncoding()); + } elseif (!$request instanceof Zend_XmlRpc_Request) { + throw new Zend_XmlRpc_Server_Exception('Invalid request object'); + } + + $this->_request = $request; + return $this; + } + + /** + * Return currently registered request object + * + * @return null|Zend_XmlRpc_Request + */ + public function getRequest() + { + return $this->_request; + } + + /** + * Set the class to use for the response + * + * @param string $class + * @return boolean True if class was set, false if not + */ + public function setResponseClass($class) + { + if (class_exists($class)) { + $reflection = new ReflectionClass($class); + if ($reflection->isSubclassOf(new ReflectionClass('Zend_XmlRpc_Response'))) { + $this->_responseClass = $class; + return true; + } + } + + return false; + } + + /** + * Retrieve current response class + * + * @return string + */ + public function getResponseClass() + { + return $this->_responseClass; + } + + /** + * Retrieve dispatch table + * + * @return array + */ + public function getDispatchTable() + { + return $this->_table; + } + + /** + * Returns a list of registered methods + * + * Returns an array of dispatchables (Zend_Server_Reflection_Function, + * _Method, and _Class items). + * + * @return array + */ + public function getFunctions() + { + return $this->_table->toArray(); + } + + /** + * Retrieve system object + * + * @return Zend_XmlRpc_Server_System + */ + public function getSystem() + { + return $this->_system; + } + + /** + * Map PHP type to XML-RPC type + * + * @param string $type + * @return string + */ + protected function _fixType($type) + { + if (isset($this->_typeMap[$type])) { + return $this->_typeMap[$type]; + } + return 'void'; + } + + /** + * Handle an xmlrpc call (actual work) + * + * @param Zend_XmlRpc_Request $request + * @return Zend_XmlRpc_Response + * @throws Zend_XmlRpcServer_Exception|Exception + * Zend_XmlRpcServer_Exceptions are thrown for internal errors; otherwise, + * any other exception may be thrown by the callback + */ + protected function _handle(Zend_XmlRpc_Request $request) + { + $method = $request->getMethod(); + + // Check for valid method + if (!$this->_table->hasMethod($method)) { + throw new Zend_XmlRpc_Server_Exception('Method "' . $method . '" does not exist', 620); + } + + $info = $this->_table->getMethod($method); + $params = $request->getParams(); + $argv = $info->getInvokeArguments(); + if (0 < count($argv)) { + $params = array_merge($params, $argv); + } + + // Check calling parameters against signatures + $matched = false; + $sigCalled = $request->getTypes(); + + $sigLength = count($sigCalled); + $paramsLen = count($params); + if ($sigLength < $paramsLen) { + for ($i = $sigLength; $i < $paramsLen; ++$i) { + $xmlRpcValue = Zend_XmlRpc_Value::getXmlRpcValue($params[$i]); + $sigCalled[] = $xmlRpcValue->getType(); + } + } + + $signatures = $info->getPrototypes(); + foreach ($signatures as $signature) { + $sigParams = $signature->getParameters(); + if ($sigCalled === $sigParams) { + $matched = true; + break; + } + } + if (!$matched) { + throw new Zend_XmlRpc_Server_Exception('Calling parameters do not match signature', 623); + } + + $return = $this->_dispatch($info, $params); + $responseClass = $this->getResponseClass(); + return new $responseClass($return); + } + + /** + * Register system methods with the server + * + * @return void + */ + protected function _registerSystemMethods() + { + $system = new Zend_XmlRpc_Server_System($this); + $this->_system = $system; + $this->setClass($system, 'system'); + } +} diff --git a/libs/Zend/XmlRpc/Server/Cache.php b/libs/Zend/XmlRpc/Server/Cache.php new file mode 100644 index 0000000..308b89e --- /dev/null +++ b/libs/Zend/XmlRpc/Server/Cache.php @@ -0,0 +1,46 @@ + true); + + /** + * @var array Array of fault observers + */ + protected static $_observers = array(); + + /** + * Constructor + * + * @param Exception $e + * @return Zend_XmlRpc_Server_Fault + */ + public function __construct(Exception $e) + { + $this->_exception = $e; + $code = 404; + $message = 'Unknown error'; + $exceptionClass = get_class($e); + + foreach (array_keys(self::$_faultExceptionClasses) as $class) { + if ($e instanceof $class) { + $code = $e->getCode(); + $message = $e->getMessage(); + break; + } + } + + parent::__construct($code, $message); + + // Notify exception observers, if present + if (!empty(self::$_observers)) { + foreach (array_keys(self::$_observers) as $observer) { + call_user_func(array($observer, 'observe'), $this); + } + } + } + + /** + * Return Zend_XmlRpc_Server_Fault instance + * + * @param Exception $e + * @return Zend_XmlRpc_Server_Fault + */ + public static function getInstance(Exception $e) + { + return new self($e); + } + + /** + * Attach valid exceptions that can be used to define xmlrpc faults + * + * @param string|array $classes Class name or array of class names + * @return void + */ + public static function attachFaultException($classes) + { + if (!is_array($classes)) { + $classes = (array) $classes; + } + + foreach ($classes as $class) { + if (is_string($class) && class_exists($class)) { + self::$_faultExceptionClasses[$class] = true; + } + } + } + + /** + * Detach fault exception classes + * + * @param string|array $classes Class name or array of class names + * @return void + */ + public static function detachFaultException($classes) + { + if (!is_array($classes)) { + $classes = (array) $classes; + } + + foreach ($classes as $class) { + if (is_string($class) && isset(self::$_faultExceptionClasses[$class])) { + unset(self::$_faultExceptionClasses[$class]); + } + } + } + + /** + * Attach an observer class + * + * Allows observation of xmlrpc server faults, thus allowing logging or mail + * notification of fault responses on the xmlrpc server. + * + * Expects a valid class name; that class must have a public static method + * 'observe' that accepts an exception as its sole argument. + * + * @param string $class + * @return boolean + */ + public static function attachObserver($class) + { + if (!is_string($class) + || !class_exists($class) + || !is_callable(array($class, 'observe'))) + { + return false; + } + + if (!isset(self::$_observers[$class])) { + self::$_observers[$class] = true; + } + + return true; + } + + /** + * Detach an observer + * + * @param string $class + * @return boolean + */ + public static function detachObserver($class) + { + if (!isset(self::$_observers[$class])) { + return false; + } + + unset(self::$_observers[$class]); + return true; + } + + /** + * Retrieve the exception + * + * @access public + * @return Exception + */ + public function getException() + { + return $this->_exception; + } +} diff --git a/libs/Zend/XmlRpc/Server/System.php b/libs/Zend/XmlRpc/Server/System.php new file mode 100644 index 0000000..b1e7cb9 --- /dev/null +++ b/libs/Zend/XmlRpc/Server/System.php @@ -0,0 +1,149 @@ +_server = $server; + } + + /** + * List all available XMLRPC methods + * + * Returns an array of methods. + * + * @return array + */ + public function listMethods() + { + $table = $this->_server->getDispatchTable()->getMethods(); + return array_keys($table); + } + + /** + * Display help message for an XMLRPC method + * + * @param string $method + * @return string + */ + public function methodHelp($method) + { + $table = $this->_server->getDispatchTable(); + if (!$table->hasMethod($method)) { + throw new Zend_Server_Exception('Method "' . $method . '"does not exist', 640); + } + + return $table->getMethod($method)->getMethodHelp(); + } + + /** + * Return a method signature + * + * @param string $method + * @return array + */ + public function methodSignature($method) + { + $table = $this->_server->getDispatchTable(); + if (!$table->hasMethod($method)) { + throw new Zend_Server_Exception('Method "' . $method . '"does not exist', 640); + } + $method = $table->getMethod($method)->toArray(); + return $method['prototypes']; + } + + /** + * Multicall - boxcar feature of XML-RPC for calling multiple methods + * in a single request. + * + * Expects a an array of structs representing method calls, each element + * having the keys: + * - methodName + * - params + * + * Returns an array of responses, one for each method called, with the value + * returned by the method. If an error occurs for a given method, returns a + * struct with a fault response. + * + * @see http://www.xmlrpc.com/discuss/msgReader$1208 + * @param array $methods + * @return array + */ + public function multicall($methods) + { + $responses = array(); + foreach ($methods as $method) { + $fault = false; + if (!is_array($method)) { + $fault = $this->_server->fault('system.multicall expects each method to be a struct', 601); + } elseif (!isset($method['methodName'])) { + $fault = $this->_server->fault('Missing methodName: ' . var_export($methods, 1), 602); + } elseif (!isset($method['params'])) { + $fault = $this->_server->fault('Missing params', 603); + } elseif (!is_array($method['params'])) { + $fault = $this->_server->fault('Params must be an array', 604); + } else { + if ('system.multicall' == $method['methodName']) { + // don't allow recursive calls to multicall + $fault = $this->_server->fault('Recursive system.multicall forbidden', 605); + } + } + + if (!$fault) { + try { + $request = new Zend_XmlRpc_Request(); + $request->setMethod($method['methodName']); + $request->setParams($method['params']); + $response = $this->_server->handle($request); + $responses[] = $response->getReturnValue(); + } catch (Exception $e) { + $fault = $this->_server->fault($e); + } + } + + if ($fault) { + $responses[] = array( + 'faultCode' => $fault->getCode(), + 'faultString' => $fault->getMessage() + ); + } + } + + return $responses; + } +} diff --git a/libs/Zend/XmlRpc/Value.php b/libs/Zend/XmlRpc/Value.php new file mode 100644 index 0000000..4439732 --- /dev/null +++ b/libs/Zend/XmlRpc/Value.php @@ -0,0 +1,401 @@ +_type; + } + + + /** + * Return the value of this object, convert the XML-RPC native value into a PHP variable + * + * @return mixed + */ + abstract public function getValue(); + + + /** + * Return the XML code that represent a native MXL-RPC value + * + * @return string + */ + abstract public function saveXML(); + + /** + * Return DOMElement representation of object + * + * @return DOMElement + */ + public function getAsDOM() + { + if (!$this->_as_dom) { + $doc = new DOMDocument('1.0'); + $doc->loadXML($this->saveXML()); + $this->_as_dom = $doc->documentElement; + } + + return $this->_as_dom; + } + + protected function _stripXmlDeclaration(DOMDocument $dom) + { + return preg_replace('/<\?xml version="1.0"( encoding="[^\"]*")?\?>\n/u', '', $dom->saveXML()); + } + + /** + * Creates a Zend_XmlRpc_Value* object, representing a native XML-RPC value + * A XmlRpcValue object can be created in 3 ways: + * 1. Autodetecting the native type out of a PHP variable + * (if $type is not set or equal to Zend_XmlRpc_Value::AUTO_DETECT_TYPE) + * 2. By specifing the native type ($type is one of the Zend_XmlRpc_Value::XMLRPC_TYPE_* constants) + * 3. From a XML string ($type is set to Zend_XmlRpc_Value::XML_STRING) + * + * By default the value type is autodetected according to it's PHP type + * + * @param mixed $value + * @param Zend_XmlRpc_Value::constant $type + * + * @return Zend_XmlRpc_Value + * @static + */ + public static function getXmlRpcValue($value, $type = self::AUTO_DETECT_TYPE) + { + switch ($type) { + case self::AUTO_DETECT_TYPE: + // Auto detect the XML-RPC native type from the PHP type of $value + return self::_phpVarToNativeXmlRpc($value); + + case self::XML_STRING: + // Parse the XML string given in $value and get the XML-RPC value in it + return self::_xmlStringToNativeXmlRpc($value); + + case self::XMLRPC_TYPE_I4: + // fall through to the next case + case self::XMLRPC_TYPE_INTEGER: + return new Zend_XmlRpc_Value_Integer($value); + + case self::XMLRPC_TYPE_DOUBLE: + return new Zend_XmlRpc_Value_Double($value); + + case self::XMLRPC_TYPE_BOOLEAN: + return new Zend_XmlRpc_Value_Boolean($value); + + case self::XMLRPC_TYPE_STRING: + return new Zend_XmlRpc_Value_String($value); + + case self::XMLRPC_TYPE_BASE64: + return new Zend_XmlRpc_Value_Base64($value); + + case self::XMLRPC_TYPE_NIL: + return new Zend_XmlRpc_Value_Nil(); + + case self::XMLRPC_TYPE_DATETIME: + return new Zend_XmlRpc_Value_DateTime($value); + + case self::XMLRPC_TYPE_ARRAY: + return new Zend_XmlRpc_Value_Array($value); + + case self::XMLRPC_TYPE_STRUCT: + return new Zend_XmlRpc_Value_Struct($value); + + default: + throw new Zend_XmlRpc_Value_Exception('Given type is not a '. __CLASS__ .' constant'); + } + } + + + /** + * Transform a PHP native variable into a XML-RPC native value + * + * @param mixed $value The PHP variable for convertion + * + * @return Zend_XmlRpc_Value + * @static + */ + private static function _phpVarToNativeXmlRpc($value) + { + switch (gettype($value)) { + case 'object': + // Check to see if it's an XmlRpc value + if ($value instanceof Zend_XmlRpc_Value) { + return $value; + } + + // Otherwise, we convert the object into a struct + $value = get_object_vars($value); + // Break intentionally omitted + case 'array': + // Default native type for a PHP array (a simple numeric array) is 'array' + $obj = 'Zend_XmlRpc_Value_Array'; + + // Determine if this is an associative array + if (!empty($value) && is_array($value) && (array_keys($value) !== range(0, count($value) - 1))) { + $obj = 'Zend_XmlRpc_Value_Struct'; + } + return new $obj($value); + + case 'integer': + return new Zend_XmlRpc_Value_Integer($value); + + case 'double': + return new Zend_XmlRpc_Value_Double($value); + + case 'boolean': + return new Zend_XmlRpc_Value_Boolean($value); + + case 'NULL': + case 'null': + return new Zend_XmlRpc_Value_Nil(); + + case 'string': + // Fall through to the next case + default: + // If type isn't identified (or identified as string), it treated as string + return new Zend_XmlRpc_Value_String($value); + } + } + + + /** + * Transform an XML string into a XML-RPC native value + * + * @param string|SimpleXMLElement $simple_xml A SimpleXMLElement object represent the XML string + * It can be also a valid XML string for convertion + * + * @return Zend_XmlRpc_Value + * @static + */ + private static function _xmlStringToNativeXmlRpc($simple_xml) + { + if (!$simple_xml instanceof SimpleXMLElement) { + try { + $simple_xml = @new SimpleXMLElement($simple_xml); + } catch (Exception $e) { + // The given string is not a valid XML + throw new Zend_XmlRpc_Value_Exception('Failed to create XML-RPC value from XML string: '.$e->getMessage(),$e->getCode()); + } + } + + // Get the key (tag name) and value from the simple xml object and convert the value to an XML-RPC native value + list($type, $value) = each($simple_xml); + if (!$type) { // If no type was specified, the default is string + $type = self::XMLRPC_TYPE_STRING; + } + + switch ($type) { + // All valid and known XML-RPC native values + case self::XMLRPC_TYPE_I4: + // Fall through to the next case + case self::XMLRPC_TYPE_INTEGER: + $xmlrpc_val = new Zend_XmlRpc_Value_Integer($value); + break; + case self::XMLRPC_TYPE_DOUBLE: + $xmlrpc_val = new Zend_XmlRpc_Value_Double($value); + break; + case self::XMLRPC_TYPE_BOOLEAN: + $xmlrpc_val = new Zend_XmlRpc_Value_Boolean($value); + break; + case self::XMLRPC_TYPE_STRING: + $xmlrpc_val = new Zend_XmlRpc_Value_String($value); + break; + case self::XMLRPC_TYPE_DATETIME: // The value should already be in a iso8601 format + $xmlrpc_val = new Zend_XmlRpc_Value_DateTime($value); + break; + case self::XMLRPC_TYPE_BASE64: // The value should already be base64 encoded + $xmlrpc_val = 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(); + break; + case self::XMLRPC_TYPE_ARRAY: + // If the XML is valid, $value must be an SimpleXML element and contain the tag + if (!$value instanceof SimpleXMLElement) { + throw new Zend_XmlRpc_Value_Exception('XML string is invalid for XML-RPC native '. self::XMLRPC_TYPE_ARRAY .' type'); + } + + // PHP 5.2.4 introduced a regression in how empty($xml->value) + // returns; need to look for the item specifically + $data = null; + foreach ($value->children() as $key => $value) { + if ('data' == $key) { + $data = $value; + break; + } + } + + if (null === $data) { + throw new Zend_XmlRpc_Value_Exception('Invalid XML for XML-RPC native '. self::XMLRPC_TYPE_ARRAY .' type: ARRAY tag must contain DATA tag'); + } + $values = array(); + // Parse all the elements of the array from the XML string + // (simple xml element) to Zend_XmlRpc_Value objects + foreach ($data->value as $element) { + $values[] = self::_xmlStringToNativeXmlRpc($element); + } + $xmlrpc_val = new Zend_XmlRpc_Value_Array($values); + break; + case self::XMLRPC_TYPE_STRUCT: + // If the XML is valid, $value must be an SimpleXML + if ((!$value instanceof SimpleXMLElement)) { + throw new Zend_XmlRpc_Value_Exception('XML string is invalid for XML-RPC native '. self::XMLRPC_TYPE_STRUCT .' type'); + } + $values = array(); + // Parse all the memebers of the struct from the XML string + // (simple xml element) to Zend_XmlRpc_Value objects + foreach ($value->member as $member) { + // @todo? If a member doesn't have a tag, we don't add it to the struct + // Maybe we want to throw an exception here ? + if ((!$member->value instanceof SimpleXMLElement) || empty($member->value)) { + continue; + //throw new Zend_XmlRpc_Value_Exception('Member of the '. self::XMLRPC_TYPE_STRUCT .' XML-RPC native type must contain a VALUE tag'); + } + $values[(string)$member->name] = self::_xmlStringToNativeXmlRpc($member->value); + } + $xmlrpc_val = new Zend_XmlRpc_Value_Struct($values); + break; + default: + 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($simple_xml->asXML()); + + return $xmlrpc_val; + } + + + private function _setXML($xml) + { + $this->_as_xml = $xml; + } + +} + + diff --git a/libs/Zend/XmlRpc/Value/Array.php b/libs/Zend/XmlRpc/Value/Array.php new file mode 100644 index 0000000..f7e6a0d --- /dev/null +++ b/libs/Zend/XmlRpc/Value/Array.php @@ -0,0 +1,78 @@ +_type = self::XMLRPC_TYPE_ARRAY; + parent::__construct($value); + } + + + /** + * Return the XML code that represent an array native MXL-RPC value + * + * @return string + */ + public function saveXML() + { + if (!$this->_as_xml) { // The XML code was not calculated yet + $dom = new DOMDocument('1.0'); + $value = $dom->appendChild($dom->createElement('value')); + $array = $value->appendChild($dom->createElement('array')); + $data = $array->appendChild($dom->createElement('data')); + + if (is_array($this->_value)) { + foreach ($this->_value as $val) { + /* @var $val Zend_XmlRpc_Value */ + $data->appendChild($dom->importNode($val->getAsDOM(), true)); + } + } + + $this->_as_dom = $value; + $this->_as_xml = $this->_stripXmlDeclaration($dom); + } + + return $this->_as_xml; + } +} + diff --git a/libs/Zend/XmlRpc/Value/Base64.php b/libs/Zend/XmlRpc/Value/Base64.php new file mode 100644 index 0000000..89b69b8 --- /dev/null +++ b/libs/Zend/XmlRpc/Value/Base64.php @@ -0,0 +1,89 @@ +_type = self::XMLRPC_TYPE_BASE64; + + $value = (string)$value; // Make sure this value is string + if (!$already_encoded) { + $value = base64_encode($value); // We encode it in base64 + } + $this->_value = $value; + } + + /** + * Return the value of this object, convert the XML-RPC native base64 value into a PHP string + * We return this value decoded (a normal string) + * + * @return string + */ + public function getValue() + { + return base64_decode($this->_value); + } + + /** + * Return the XML code representing the base64-encoded value + * + * @return string + */ + public function saveXML() + { + if (! $this->_as_xml) { // The XML was not generated yet + $dom = new DOMDocument('1.0', 'UTF-8'); + $value = $dom->appendChild($dom->createElement('value')); + $type = $value->appendChild($dom->createElement($this->_type)); + $type->appendChild($dom->createTextNode($this->_value)); + + $this->_as_dom = $value; + $this->_as_xml = $this->_stripXmlDeclaration($dom); + } + + return $this->_as_xml; + } +} + diff --git a/libs/Zend/XmlRpc/Value/Boolean.php b/libs/Zend/XmlRpc/Value/Boolean.php new file mode 100644 index 0000000..709cfba --- /dev/null +++ b/libs/Zend/XmlRpc/Value/Boolean.php @@ -0,0 +1,84 @@ +_type = self::XMLRPC_TYPE_BOOLEAN; + // Make sure the value is boolean and then convert it into a integer + // The double convertion is because a bug in the ZendOptimizer in PHP version 5.0.4 + $this->_value = (int)(bool)$value; + } + + /** + * Return the value of this object, convert the XML-RPC native boolean value into a PHP boolean + * + * @return bool + */ + public function getValue() + { + return (bool)$this->_value; + } + + /** + * Return the XML-RPC serialization of the boolean value + * + * @return string + */ + public function saveXML() + { + if (! $this->_as_xml) { // The XML was not generated yet + $dom = new DOMDocument('1.0', 'UTF-8'); + $value = $dom->appendChild($dom->createElement('value')); + $type = $value->appendChild($dom->createElement($this->_type)); + $type->appendChild($dom->createTextNode($this->_value)); + + $this->_as_dom = $value; + $this->_as_xml = $this->_stripXmlDeclaration($dom); + } + + return $this->_as_xml; + } +} + diff --git a/libs/Zend/XmlRpc/Value/Collection.php b/libs/Zend/XmlRpc/Value/Collection.php new file mode 100644 index 0000000..0eb621a --- /dev/null +++ b/libs/Zend/XmlRpc/Value/Collection.php @@ -0,0 +1,79 @@ + $value) { + // If the elements of the given array are not Zend_XmlRpc_Value objects, + // we need to convert them as such (using auto-detection from PHP value) + if (!$value instanceof parent) { + $value = self::getXmlRpcValue($value, self::AUTO_DETECT_TYPE); + } + $this->_value[$key] = $value; + } + } + + + /** + * Return the value of this object, convert the XML-RPC native collection values into a PHP array + * + * @return arary + */ + public function getValue() + { + $values = (array)$this->_value; + foreach ($values as $key => $value) { + /* @var $value Zend_XmlRpc_Value */ + + if (!$value instanceof parent) { + throw new Zend_XmlRpc_Value_Exception('Values of '. get_class($this) .' type must be Zend_XmlRpc_Value objects'); + } + $values[$key] = $value->getValue(); + } + return $values; + } + +} + diff --git a/libs/Zend/XmlRpc/Value/DateTime.php b/libs/Zend/XmlRpc/Value/DateTime.php new file mode 100644 index 0000000..181a0ce --- /dev/null +++ b/libs/Zend/XmlRpc/Value/DateTime.php @@ -0,0 +1,81 @@ +_type = self::XMLRPC_TYPE_DATETIME; + + // If the value is not numeric, we try to convert it to a timestamp (using the strtotime function) + if (is_numeric($value)) { // The value is numeric, we make sure it is an integer + $value = (int)$value; + } else { + $value = strtotime($value); + if ($value === false || $value == -1) { // cannot convert the value to a timestamp + throw new Zend_XmlRpc_Value_Exception('Cannot convert given value \''. $value .'\' to a timestamp'); + } + } + $value = date('c', $value); // Convert the timestamp to iso8601 format + + // Strip out TZ information and dashes + $value = preg_replace('/(\+|-)\d{2}:\d{2}$/', '', $value); + $value = str_replace('-', '', $value); + + $this->_value = $value; + } + + /** + * Return the value of this object as iso8601 dateTime value + * + * @return int As a Unix timestamp + */ + public function getValue() + { + return $this->_value; + } + +} + diff --git a/libs/Zend/XmlRpc/Value/Double.php b/libs/Zend/XmlRpc/Value/Double.php new file mode 100644 index 0000000..74c3f1f --- /dev/null +++ b/libs/Zend/XmlRpc/Value/Double.php @@ -0,0 +1,62 @@ +_type = self::XMLRPC_TYPE_DOUBLE; + $this->_value = sprintf('%f',(float)$value); // Make sure this value is float (double) and without the scientific notation + } + + /** + * Return the value of this object, convert the XML-RPC native double value into a PHP float + * + * @return float + */ + public function getValue() + { + return (float)$this->_value; + } + +} + diff --git a/libs/Zend/XmlRpc/Value/Exception.php b/libs/Zend/XmlRpc/Value/Exception.php new file mode 100644 index 0000000..963b10a --- /dev/null +++ b/libs/Zend/XmlRpc/Value/Exception.php @@ -0,0 +1,39 @@ +_type = self::XMLRPC_TYPE_INTEGER; + $this->_value = (int)$value; // Make sure this value is integer + } + + /** + * Return the value of this object, convert the XML-RPC native integer value into a PHP integer + * + * @return int + */ + public function getValue() + { + return $this->_value; + } + +} + diff --git a/libs/Zend/XmlRpc/Value/Nil.php b/libs/Zend/XmlRpc/Value/Nil.php new file mode 100644 index 0000000..79d39af --- /dev/null +++ b/libs/Zend/XmlRpc/Value/Nil.php @@ -0,0 +1,79 @@ +_type = self::XMLRPC_TYPE_NIL; + $this->_value = null; + } + + /** + * Return the value of this object, convert the XML-RPC native nill value into a PHP NULL + * + * @return null + */ + public function getValue() + { + return null; + } + + /** + * Return the XML code representing the nil + * + * @return string + */ + public function saveXML() + { + if (! $this->_as_xml) { // The XML was not generated yet + $dom = new DOMDocument('1.0', 'UTF-8'); + $value = $dom->appendChild($dom->createElement('value')); + $type = $value->appendChild($dom->createElement($this->_type)); + + $this->_as_dom = $value; + $this->_as_xml = $this->_stripXmlDeclaration($dom); + } + + return $this->_as_xml; + } +} + diff --git a/libs/Zend/XmlRpc/Value/Scalar.php b/libs/Zend/XmlRpc/Value/Scalar.php new file mode 100644 index 0000000..8f8ae71 --- /dev/null +++ b/libs/Zend/XmlRpc/Value/Scalar.php @@ -0,0 +1,60 @@ +_as_xml) { // The XML code was not calculated yet + $dom = new DOMDocument('1.0'); + $value = $dom->appendChild($dom->createElement('value')); + $type = $value->appendChild($dom->createElement($this->_type)); + $type->appendChild($dom->createTextNode($this->getValue())); + + $this->_as_dom = $value; + $this->_as_xml = $this->_stripXmlDeclaration($dom); + } + + return $this->_as_xml; + } +} + diff --git a/libs/Zend/XmlRpc/Value/String.php b/libs/Zend/XmlRpc/Value/String.php new file mode 100644 index 0000000..94e7750 --- /dev/null +++ b/libs/Zend/XmlRpc/Value/String.php @@ -0,0 +1,74 @@ +_type = self::XMLRPC_TYPE_STRING; + + // Make sure this value is string and all XML characters are encoded + $this->_value = $this->_xml_entities($value); + } + + /** + * Return the value of this object, convert the XML-RPC native string value into a PHP string + * Decode all encoded risky XML entities back to normal characters + * + * @return string + */ + public function getValue() + { + return html_entity_decode($this->_value, ENT_QUOTES, 'UTF-8'); + } + + /** + * Make sure a string will be safe for XML, convert risky characters to HTML entities + * + * @param string $str + * @return string + */ + private function _xml_entities($str) + { + return htmlentities($str, ENT_QUOTES, 'UTF-8'); + } + +} + diff --git a/libs/Zend/XmlRpc/Value/Struct.php b/libs/Zend/XmlRpc/Value/Struct.php new file mode 100644 index 0000000..86272e6 --- /dev/null +++ b/libs/Zend/XmlRpc/Value/Struct.php @@ -0,0 +1,79 @@ +_type = self::XMLRPC_TYPE_STRUCT; + parent::__construct($value); + } + + + /** + * Return the XML code that represent struct native MXL-RPC value + * + * @return string + */ + public function saveXML() + { + if (!$this->_as_xml) { // The XML code was not calculated yet + $dom = new DOMDocument('1.0'); + $value = $dom->appendChild($dom->createElement('value')); + $struct = $value->appendChild($dom->createElement('struct')); + + if (is_array($this->_value)) { + foreach ($this->_value as $name => $val) { + /* @var $val Zend_XmlRpc_Value */ + $member = $struct->appendChild($dom->createElement('member')); + $member->appendChild($dom->createElement('name', $name)); + $member->appendChild($dom->importNode($val->getAsDOM(), 1)); + } + } + + $this->_as_dom = $value; + $this->_as_xml = $this->_stripXmlDeclaration($dom); + } + + return $this->_as_xml; + } +} + diff --git a/libs/jpgraph/CHANGELOG-2.3.3.txt b/libs/jpgraph/CHANGELOG-2.3.3.txt new file mode 100644 index 0000000..8b6cd99 --- /dev/null +++ b/libs/jpgraph/CHANGELOG-2.3.3.txt @@ -0,0 +1,77 @@ +**************************************************************** +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 new file mode 100644 index 0000000..66986cb --- /dev/null +++ b/libs/jpgraph/QPL.txt @@ -0,0 +1,119 @@ +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 new file mode 100644 index 0000000..3bdae3e --- /dev/null +++ b/libs/jpgraph/README @@ -0,0 +1,152 @@ +README FOR JPGRAPH +================== + +This package contains JpGraph, an Object Oriented PHP5 Graph Plotting library. + +The library is Copyright (C) 2001-2008 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 +* -------------------------------------------------------------------- + +* -------------------------------------------------------------------- +* 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 +Note: Earlier versions might work but is unsupported. + +Recommended: +* PHP 5.1.2 +* PHP Builtin GD library + +Installation +------------ +0. Make sure that the PHP version is compatible with the stated requirements + and that the PHP installation has support for the GD library. + Please run phpinfo() to check if GD library + is supported in the installation. + If the GD library doesn't seem to be installed + please consult the PHP manual under section "Image" for + instructions on where to find this library. Please refer to + the manual section "Verifying your PHP installation" + +1. Unzip and copy the files to a directory of your choice where Your + httpd sever can access them. + For a global site installation you should copy the files to + somewhere in the PHP search path. + +2. Check that the default directory paths in jpg-config.inc + for cache directory and TTF directory suits your installation. + Note1: The default directories are different depending on if + the library is running on Windows or UNIX. + Note2: Apache/PHP must have write permission to your cache + directory if you enable the cache feature. By default the cache + is disabled. + +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. + + +Documentation +------------- +The installation includes HTML documentation and reference guide for the +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 + + + diff --git a/libs/jpgraph/VERSION b/libs/jpgraph/VERSION new file mode 100644 index 0000000..d423229 --- /dev/null +++ b/libs/jpgraph/VERSION @@ -0,0 +1 @@ +Revision: r1006, Exported: 2008-06-15 10:16 diff --git a/libs/jpgraph/gd_image.inc.php b/libs/jpgraph/gd_image.inc.php new file mode 100644 index 0000000..f8b4b01 --- /dev/null +++ b/libs/jpgraph/gd_image.inc.php @@ -0,0 +1,1619 @@ +CreateImgCanvas($aWidth,$aHeight); + 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; + } + + // 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.') + } + } + + 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( 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."); + } + } + + 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; + } + + function CreateImgCanvas($aWidth=0,$aHeight=0) { + + $old = array($this->img,$this->width,$this->height); + + $aWidth = round($aWidth); + $aHeight = round($aHeight); + + $this->width=$aWidth; + $this->height=$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); + + 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); + } + + 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); + } + + 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); + } + } + + static function GetWidth($aImg=null) { + if( $aImg === null ) + $aImg = $this->img; + return imagesx($aImg); + } + + static function GetHeight($aImg=null) { + 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; + } + + function SetCanvasH($aHdl) { + $this->img = $aHdl; + $this->rgb->img = $aHdl; + } + + function SetCanvasColor($aColor) { + $this->canvascolor = $aColor ; + } + + function SetAlphaBlending($aFlg=true) { + 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); + } + + + //--------------- + // 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 + + // 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])); + + 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 $m*$w; + } + } + else { + $bbox = $this->GetTTFBBox($txt,$angle); + return $bbox[1]-$bbox[5]; + } + } + + // Estimate font height + function GetFontHeight($angle=0) { + $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); + } + + // Get actual width of text in absolute pixels + function GetTextWidth($txt,$angle=0) { + + $tmp = 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; + } + } + + 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) { + + 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) ; + } + + $height += 2*$ymarg; + $width += 2*$xmarg; + + 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( $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); + + $this->SetAngle($olda); + + return $bb; + } + + // Set text alignment + function SetTextAlign($halign,$valign="bottom") { + $this->text_halign=$halign; + $this->text_valign=$valign; + } + + + function _StrokeBuiltinFont($x,$y,$txt,$dir=0,$paragraph_align="left",&$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( 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(); + + } + $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); + } + + 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; + } + + function GetBBoxTTF($aTxt,$aAngle=0) { + // Normalize the bounding box to become a minimum + // enscribing rectangle + + $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( $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; + } + + function GetBBoxWidth($aTxt,$aAngle=0) { + $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 ; + + // Remember the anchor point before adjustment + if( $debug ) { + $ox=$x; + $oy=$y; + } + + if( !ereg("\n",$txt) || ($dir>0 && ereg("\n",$txt)) ) { + // Format a single line + + $txt = $this->AddTxtCR($txt); + + $bbox=$this->GetBBoxTTF($txt,$dir); + + // Align x,y ot lower left corner of bbox + $x -= $bbox[0]; + $y -= $bbox[1]; + + // 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; + + 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=@ImageTTFBBox($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(); + } + } + else { + // Format a text paragraph + $fh=$this->GetFontHeight(); + + // Line margin is 25% of font height + $linemargin=round($fh*$ConstLineSpacing); + $fh += $linemargin; + $w=$this->GetTextWidth($txt); + + $y -= $linemargin/2; + $tmp = 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); + + // 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; + } + + 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."); + } + } + + function SetTransparent($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; + } + + 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()."); + } + } + + 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]; + } + + + function SetLineWeight($weight) { + imagesetthickness($this->img,$weight); + $this->line_weight = $weight; + } + + function SetStartPoint($x,$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); + } + + 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); + } + } + + function FilledCakeSlice($cx,$cy,$w,$h,$s,$e) { + $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(); + } + } + } + + function Ellipse($xc,$yc,$w,$h) { + $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); + } + + function FilledCircle($xc,$yc,$r) { + 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); + } + + // 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; + } + + // Same as Line but take the line_style into account + function StyleLine($x1,$y1,$x2,$y2,$aStyle='') { + if( $this->line_weight <= 0 ) + return; + + 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 + + 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; + } + } + + function DashedLine($x1,$y1,$x2,$y2,$dash_length=1,$dash_space=4) { + + 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. + } + + + $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; + + $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; + } + + function Polygon($p,$closed=FALSE,$fast=FALSE) { + + 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]); + } + } + + 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); + } + + function Rectangle($xl,$yu,$xr,$yl) { + $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)); + } + + 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); + } + } + } + + 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 + // 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); + } + } + + function FilledRoundedRectangle($xt,$yt,$xr,$yl,$r=5) { + 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); + + // 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) { + + 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); + + // 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); + + // 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); + } + + 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(); + } + + function StyleLineTo($x,$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; + } + + function Point($x,$y) { + imagesetpixel($this->img,round($x),round($y),$this->current_color); + } + + function Fill($x,$y) { + 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); + } + + 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; + + // 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; + } + + // 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."); + + } + } + } + + // Clear resource tide up by image + function Destroy() { + 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"); + } + } +} // CLASS + +//=================================================== +// CLASS RotImage +// Description: Exactly as Image but draws the image at +// a specified angle around a specified rotation point. +//=================================================== +class RotImage extends Image { + public $a=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 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); + } + + function SetTranslation($dx,$dy) { + $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 ; + } + + function SetAngle($a) { + $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); + } + + function 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); + } + + 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); + } + + 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(); + } + + 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); + } + } + + 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); + + } + + 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; + } + + 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); + } + + 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); + } + + function 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)); + } + + 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); + } + + function FilledPolygon($pnts) { + parent::FilledPolygon($this->ArrRotate($pnts)); + } + + function Point($x,$y) { + 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); + } +} + +//=================================================== +// CLASS ImgStreamCache +// Description: Handle caching of graphs to files +//=================================================== +class ImgStreamCache { + private $cache_dir, $img=null, $timeout=0; // Infinite timeout + //--------------- + // CONSTRUCTOR + function ImgStreamCache($aImg, $aCacheDir=CACHE_DIR) { + $this->img = $aImg; + $this->cache_dir = $aCacheDir; + } + +//--------------- +// 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; + } + + // 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 stroke the image to an arbitrary file + if( _FORCE_IMGTOFILE ) { + $aStrokeFileName = _FORCE_IMGDIR.GenImgName(); + } + + 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( $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; + } + 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; + } + } + + // 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; + } + + //--------------- + // 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; + } +} // CLASS Cache + + +?> diff --git a/libs/jpgraph/imgdata_balls.inc.php b/libs/jpgraph/imgdata_balls.inc.php new file mode 100644 index 0000000..9fe9fea --- /dev/null +++ b/libs/jpgraph/imgdata_balls.inc.php @@ -0,0 +1,1061 @@ + 'imgdata_large', + 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'); + private $index_1 = array('blue'=>9,'lightblue'=>1,'brown'=>6,'darkgreen'=>7, + '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'); + + + 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); + + private $maxidx_2 = 14 ; + + + private $colors_3 = array('bluegreen','cyan','darkgray','greengray', + '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); + 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); + } + + function ImgData_Balls() { + +//========================================================== +// 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_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_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_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_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: 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_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_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_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_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_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_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_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_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_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_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_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_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_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_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==' ; + } +} + +?> \ No newline at end of file diff --git a/libs/jpgraph/imgdata_bevels.inc.php b/libs/jpgraph/imgdata_bevels.inc.php new file mode 100644 index 0000000..47645e2 --- /dev/null +++ b/libs/jpgraph/imgdata_bevels.inc.php @@ -0,0 +1,104 @@ + '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'. + '==' ; + +//========================================================== +// 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_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==' ; + + } +} + + +?> \ No newline at end of file diff --git a/libs/jpgraph/imgdata_diamonds.inc.php b/libs/jpgraph/imgdata_diamonds.inc.php new file mode 100644 index 0000000..ef1322b --- /dev/null +++ b/libs/jpgraph/imgdata_diamonds.inc.php @@ -0,0 +1,177 @@ +'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 $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=' ; + +//========================================================== +// 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_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_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_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'. + '==' ; + } +} + +?> \ No newline at end of file diff --git a/libs/jpgraph/imgdata_pushpins.inc.php b/libs/jpgraph/imgdata_pushpins.inc.php new file mode 100644 index 0000000..909dd5b --- /dev/null +++ b/libs/jpgraph/imgdata_pushpins.inc.php @@ -0,0 +1,517 @@ + 'imgdata_small', + 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() { + + // 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_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_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: 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_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_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' ; + } +} + +?> \ No newline at end of file diff --git a/libs/jpgraph/imgdata_squares.inc.php b/libs/jpgraph/imgdata_squares.inc.php new file mode 100644 index 0000000..3c0a977 --- /dev/null +++ b/libs/jpgraph/imgdata_squares.inc.php @@ -0,0 +1,150 @@ +'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 $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_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_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_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_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' ; + } +} + +?> \ No newline at end of file diff --git a/libs/jpgraph/imgdata_stars.inc.php b/libs/jpgraph/imgdata_stars.inc.php new file mode 100644 index 0000000..43728c4 --- /dev/null +++ b/libs/jpgraph/imgdata_stars.inc.php @@ -0,0 +1,144 @@ + '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 $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==' ; + +//========================================================== +// 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_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_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==' ; + } +} + +?> \ No newline at end of file diff --git a/libs/jpgraph/jpg-config.inc.php b/libs/jpgraph/jpg-config.inc.php new file mode 100644 index 0000000..dbf2726 --- /dev/null +++ b/libs/jpgraph/jpg-config.inc.php @@ -0,0 +1,227 @@ + diff --git a/libs/jpgraph/jpgraph.php b/libs/jpgraph/jpgraph.php new file mode 100644 index 0000000..9626fac --- /dev/null +++ b/libs/jpgraph/jpgraph.php @@ -0,0 +1,6391 @@ +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', ''); +} + +if (!defined('TTF_DIR')) { + if (strstr( PHP_OS, 'WIN') ) { + $sroot = getenv('SystemRoot'); + if( empty($sroot) ) { + $t = new ErrMsgText(); + $msg = $t->Get(12,$file,$lineno); + die($msg); + } + else { + DEFINE('TTF_DIR', $sroot.'/fonts/'); + } + } else { + DEFINE('TTF_DIR','/usr/X11R6/lib/X11/fonts/truetype/'); + } +} + +if (!defined('MBTTF_DIR')) { + DEFINE('MBTTF_DIR','/usr/share/fonts/ja/TrueType/'); +} + +//------------------------------------------------------------------ +// Constants which are used as parameters for the method calls +//------------------------------------------------------------------ + + +// 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 + if ($minorC > $minorR) return true; + if ($minorC < $minorR) return false; + // and same minor + if ($editC >= $editR) return true; + return true; +} + +// +// Make sure PHP version is high enough +// +if( !CheckPHPVersion(MIN_PHPVERSION) ) { + JpGraphError::RaiseL(13,PHP_VERSION,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)"); +} + +// +// Setup PHP error handler +// +function _phpErrorHandler($errno,$errmsg,$filename, $linenum, $vars) { + // Respect current error level + if( $errno & error_reporting() ) { + JpGraphError::RaiseL(25003,basename($filename),$linenum,$errmsg); + } +} + +if( INSTALL_PHP_ERR_HANDLER ) { + set_error_handler("_phpErrorHandler"); +} + +// +//Check if there were any warnings, perhaps some wrong includes by the +//user +// +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"; + 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."); + $fname = basename($_SERVER['PHP_SELF']); + if( !empty($_SERVER['QUERY_STRING']) ) { + $q = @$_SERVER['QUERY_STRING']; + $fname .= '_'.preg_replace("/\W/", "_", $q).'.'.$img_format; + } + else { + $fname = substr($fname,0,strlen($fname)-4).'.'.$img_format; + } + return $fname; +} + + +//=================================================== +// CLASS JpgTimer +// Description: General timing utility class to handle +// time measurement of generating graphs. Multiple +// timers can be started. +//=================================================== +class JpgTimer { + private $start, $idx; +//--------------- +// CONSTRUCTOR + function JpgTimer() { + $this->idx=0; + } + +//--------------- +// PUBLIC METHODS + + // Push a new timer start on stack + function Push() { + 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]; + } +} // 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'); + } + +//--------------- +// PUBLIC METHODS + function Set($aLocale) { + 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 + + 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; + } + + 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]; + } + + function GetShortDay() { + return $this->iShortDay[$this->iLocale]; + } + + function GetShortMonth() { + return $this->iShortMonth[$this->iLocale]; + } + + function GetShortMonthName($aNbr) { + return $this->iShortMonth[$this->iLocale][$aNbr]; + } + + function GetLongMonthName($aNbr) { + return $this->iMonthName[$this->iLocale][$aNbr]; + } + + function GetMonth() { + return $this->iMonthName[$this->iLocale]; + } +} + +$gDateLocale = new DateLocale(); +$gJpgDateLocale = new DateLocale(); + +//======================================================= +// CLASS Footer +// Description: Encapsulates the footer line in the Graph +//======================================================= +class Footer { + public $iLeftMargin = 3, $iRightMargin = 3, $iBottomMargin = 3 ; + public $left,$center,$right; + + 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 SetMargin($aLeft=3,$aRight=3,$aBottom=3) { + $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); + + $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); + } +} + + +//=================================================== +// CLASS Graph +// 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 $ynplots=array(); + 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 $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 $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 $background_image_bright=0,$background_image_contr=0,$background_image_sat=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 $iAxisStyle = AXSTYLE_SIMPLE; + public $iCSIMdisplay=false,$iHasStroked = false; + public $footer; + public $csimcachename = '', $csimcachetimeout = 0, $iCSIMImgAlt=''; + public $iDoClipping = false; + public $y2orderback=true; + public $tabtitle; + public $bkg_gradtype=-1,$bkg_gradstyle=BGRAD_MARGIN; + 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 ; + public $titlebkg_fillstyle=TITLEBKG_FILLSTYLE_SOLID; + public $titlebkg_scolor1='black',$titlebkg_scolor2='white'; + public $framebevel = false, $framebeveldepth = 2 ; + public $framebevelborder = false, $framebevelbordercolor='black'; + public $framebevelcolor1='white@0.4', $framebevelcolor2='black@0.4'; + public $background_image_mix=100; + public $background_cflag = ''; + 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; + public $legend; + protected $iYAxisDeltaPos=50; + protected $iIconDepth=DEPTH_BACK; + protected $iAxisLblBgType = 0, + $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 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'); + } + + // 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); + + $this->cache = new ImgStreamCache($this->img); + $this->cache->SetTimeOut($aTimeOut); + + $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->SetMargin(2); + $this->subtitle->SetAlign('center'); + + $this->subsubtitle = new Text(); + $this->subsubtitle->ParagraphAlign('center'); + $this->subsubtitle->SetMargin(2); + $this->subsubtitle->SetAlign('center'); + + $this->legend = new Legend(); + $this->footer = new Footer(); + + // Window doesn't like '?' in the file name so replace it with an '_' + $aCachedName = str_replace("?","_",$aCachedName); + + // 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 + + $this->tabtitle = new GraphTabTitle(); + } +//--------------- +// PUBLIC METHODS + + // 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; + } + + // Set Image format and optional quality + function SetImgFormat($aFormat,$aQuality=75) { + $this->img->SetImgFormat($aFormat,$aQuality); + } + + // Should the grid be in front or back of the plot? + function SetGridDepth($aDepth) { + $this->grid_depth=$aDepth; + } + + function SetIconDepth($aDepth) { + $this->iIconDepth=$aDepth; + } + + // Specify graph angle 0-360 degrees. + function SetAngle($aAngle) { + $this->img->SetAngle($aAngle); + } + + function SetAlphaBlending($aFlg=true) { + $this->img->SetAlphaBlending($aFlg); + } + + // Shortcut to image margin + function SetMargin($lm,$rm,$tm,$bm) { + $this->img->SetMargin($lm,$rm,$tm,$bm); + } + + function SetY2OrderBack($aBack=true) { + $this->y2orderback = $aBack; + } + + // 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 ; + + $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 ; + } + + // 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( $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; + } + + function AddTable($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 ; + } + } + + // 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( 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; + } + + // 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( 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; + } + + // 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; + } + } + + // 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( $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; + } + } + + // 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( $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; + } + + // 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; + } + + // 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; + } + + + // Specify a background image + 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'); + } + + $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; + } + + function SetBackgroundImageMix($aMix) { + $this->background_image_mix = $aMix ; + } + + // 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; + } + + // Specify color for the plotarea (not the margins) + function SetColor($aColor) { + $this->plotarea_color=$aColor; + } + + // Specify color for the margins (all areas outside the plotarea) + function SetMarginColor($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; + } + + 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->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; + } + + // 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; + + 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)"); + + $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); + } + + // Set the delta position (in pixels) between the multiple Y-axis + function SetYDeltaDist($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); + } + + // Specify density of ticks when autoscaling 'normal', 'dense', 'sparse', 'verysparse' + // 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"); + } + } + + + // Get a string of all image map areas + function GetCSIMareas() { + if( !$this->iHasStroked ) + $this->Stroke(_CSIM_SPECIALFILE); + + $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->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->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->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->iTables); + for( $i=0; $i < $n; ++$i ) { + $csim .= $this->iTables[$i]->GetCSIMareas(); + } + + return $csim; + } + + // Get a complete .. tag for the final image map + function GetHTMLImageMap($aMapName) { + $im = "\n"; + $im .= $this->GetCSIMareas(); + $im .= ""; + return $im; + } + + function CheckCSIMCache($aCacheName,$aTimeOut=60) { + global $_SERVER; + + if( $aCacheName=='auto' ) + $aCacheName=basename($_SERVER['PHP_SELF']); + + $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; + + $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'; + + // 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); + } + } + + // 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; + } + + 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( $aScriptName=='auto' ) + $aScriptName=basename($_SERVER['PHP_SELF']); + + $urlarg = $this->GetURLArguments(); + + 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 + + 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); + + // Write the image file + $this->Stroke(CSIMCACHE_DIR.$baseimg); + + // Construct wrapper HTML and write to file and send it back to browser + + // 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($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); + echo "\"".$this-iCSIMImgAlt."\" />\n"; + } + } + else { + $this->Stroke(); + } + } + + 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; + } + + 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; + } + + 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); + } + + 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); + } + + 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 ) ; + + + $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; + } + + 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); + } + } + } + + // Stroke the graph + // $aStrokeFileName If != "" the image will be written to this file and NOT + // streamed back to the browser + 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().'); + } + + // 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); + } + + // 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; + + // 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); + } + } + + // 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.
    "); + + //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; + } + } + } + + 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; + } + } + + } + } + } + + //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); + } + + } + + // 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" ) { + + //$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( !$_csim ) { + $this->StrokePlotArea(); + if( $this->iIconDepth == DEPTH_BACK ) { + $this->StrokeIcons(); + } + } + $this->StrokeAxis(false); + + // 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->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); + } + + + 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(); + } + + // Stroke yn-axis + $n = count($this->ynaxis); + for( $i=0; $i < $n; ++$i ) { + $this->ynaxis[$i]->Stroke($this->xscale); + } + + $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); + } + } + + if( $this->iDoClipping ) { + $oldimage = $this->img->CloneCanvasH(); + } + + 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->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); + } + } + + $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->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); + } + } + } + + 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; + } + +//--------------- +// 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; + } + + $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 == 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(); + } + } + + 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); + + // 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); + + 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); + } + + // 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 + + if( $aImgFormat == '' ) + $imgtag = $ext; + else + $imgtag = $aImgFormat; + + $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; + } + + // 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; + } + + 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); + } + } + + 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 ; + } + + $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); + + } + 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); + } + + // Private + // Draw a frame around the image + function StrokeFrame() { + 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); + } + } + + function FillMarginArea() { + $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->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(); + } + + // 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 ; + + 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); + } + } + + 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); + } + } + } + + function SetTitleBackgroundFillStyle($aStyle,$aColor1='black',$aColor2='white') { + $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 ; + } + + + function StrokeTitles() { + + $margin=3; + + 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 - 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->doshadow ) { + $x2 -= $this->shadow_width ; + } + + $indent=0; + if( $this->titlebackground_framestyle == TITLEBKG_FRAME_BEVEL ) { + $ind = $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(); + + $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); + } + } + } + + // 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); + + // ... 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); + } + } + + 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); + } + } + } + + 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]); + } + } + } + } + + // Text scale offset in world coordinates + function SetTextScaleOff($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; + } + + // 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 ; + } + + // 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 ; + } + + // 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) ); + + $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).'); + } + + 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 + +//=================================================== +// CLASS LineProperty +// 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; + + } + } +} + + +//=================================================== +// CLASS Text +// Description: Arbitrary text object that can be added to the graph +//=================================================== +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 SetColor($aTxtColor,$aFillColor='lightyellow',$aBorderColor='black') { + $this->color = $aTxtColor; + $this->fillcolor = $aFillColor; + $this->bordercolor = $aBorderColor; + } + + function SetFillColor($aFillColor) { + $this->fillcolor = $aFillColor; + } + + function SetTabAlign($aAlign) { + $this->align = $aAlign; + } + + function SetWidth($aWidth) { + $this->width = $aWidth ; + } + + function Set($t) { + $this->t = $t; + $this->hide = false; + } + + function SetCorner($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; + + $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 ; + + // 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; + } + + $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'); + } + +} + +//=================================================== +// CLASS SuperScriptText +// Description: Format a superscript text +//=================================================== +class SuperScriptText extends Text { + 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 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; + } + + 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; + } + + // 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; + } + + // 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; + } + + // 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; + } + + 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; + } + + 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; + } + + $sx += $this->iSuperMargin; + $sy += $this->iVertOverlap; + + // 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; + } + + $aImg->SetTextAlign('left','bottom'); + $aImg->SetFont($sff,$sfs,$sfz); + $aImg->PushColor($this->color); + $aImg->StrokeText($sx,$sy,$this->iSuper,$this->iSDir,'left'); + $aImg->PopColor(); + } +} + + +//=================================================== +// CLASS Grid +// Description: responsible for drawing grid lines in graph +//=================================================== +class Grid { + protected $img; + protected $scale; + protected $grid_color='#DDDDDD',$grid_mincolor='#DDDDDD'; + protected $type="solid"; + protected $show=false, $showMinor=false,$weight=1; + protected $fill=false,$fillcolor=array('#EFEFEF','#BBCCFF'); +//--------------- +// CONSTRUCTOR + function Grid($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; + } + + function SetWeight($aWeight) { + $this->weight=$aWeight; + } + + // Specify if grid should be dashed, dotted or solid + function SetLineStyle($aType) { + $this->type = $aType; + } + + // Decide if both major and minor grid should be displayed + function Show($aShowMajor=true,$aShowMinor=false) { + $this->show=$aShowMajor; + $this->showMinor=$aShowMinor; + } + + function SetFill($aFlg=true,$aColor1='lightgray',$aColor2='lightblue') { + $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); + } + } + +//-------------- +// Private methods + // Draw the grid + function DoStroke($aTicksPos) { + 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); + } + } + + $this->img->SetColor($this->grid_color); + $this->img->SetLineWeight($this->weight); + + // 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; + } + + 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; + + 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); + } + } + + $this->img->SetColor($this->grid_color); + $this->img->SetLineWeight($this->weight); + + // 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; + } +} // Class + +//=================================================== +// CLASS Axis +// Description: Defines X and Y axis. Notes that at the +// 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. +//=================================================== +class AxisPrototype { + public $scale=null; + public $img=null; + public $hide=false,$hide_labels=false; + public $title=null; + public $font_family=FF_FONT1,$font_style=FS_NORMAL,$font_size=12,$label_angle=0; + public $tick_step=1; + public $pos = false; + public $ticks_label = array(); + + protected $weight=1; + protected $color=array(0,0,0),$label_color=array(0,0,0); + protected $ticks_label_colors=null; + protected $show_first_label=true,$show_last_label=true; + protected $label_step=1; // Used by a text axis to specify what multiple of major steps + // should be labeled. + protected $labelPos=0; // Which side of the axis should the labels be? + protected $title_adjust,$title_margin,$title_side=SIDE_LEFT; + protected $tick_label_margin=7; + protected $label_halign = '',$label_valign = '', $label_para_align='left'; + 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; + } + } +//--------------- +// PUBLIC METHODS + + function 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); + } + + 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; + } + + function HideLastTickLabel($aShow=false) { + $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); + } + + // Manually specify major tick positions and optional labels + function SetMajTickPositions($aMajPos,$aLabels=NULL) { + $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); + } + + // Hide zero label + function HideZeroLabel($aFlag=true) { + $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; + } + + // Hide the axis + function Hide($aHide=true) { + $this->hide=$aHide; + } + + // Hide the actual axis-line, but still print the labels + function HideLine($aHide=true) { + $this->hide_line = $aHide; + } + + function HideLabels($aHide=true) { + $this->hide_labels = $aHide; + } + + + // Weight of axis + function SetWeight($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; + } + + // 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); + } + + function SetTickSide($aDir) { + $this->scale->ticks->SetSide($aDir); + } + + // 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; + } + + 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."); + } + + // Specify that every $step of the ticks should be displayed starting + // at $start + function SetTextTickInterval($aStep,$aStart=0) { + $this->scale->ticks->SetTextLabelStart($aStart); + $this->tick_step=$aStep; + } + + // 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; + } + + // 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; + } + + // Set the font + function SetFont($aFamily,$aStyle=FS_NORMAL,$aSize=10) { + $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; + } + + // 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; + } + + // Specify the angle for the tick labels + function SetLabelAngle($aAngle) { + $this->label_angle = $aAngle; + } + +} // Class + + +//=================================================== +// CLASS Axis +// Description: Defines X and Y axis. Notes that at the +// 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. +//=================================================== +class Axis extends AxisPrototype { + + function Axis($img,$aScale,$color=array(0,0,0)) { + parent::Axis($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'; + } + + 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 + // 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; + + // 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]; + + // 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; + } + } + +} + + +//=================================================== +// CLASS Ticks +// Description: Abstract base class for drawing linear and logarithmic +// tick marks on axis +//=================================================== +class Ticks { + public $label_formatstr=''; // C-style format string to use for labels + public $label_formfunc=''; + 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 $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 $weight=1; + protected $label_usedateformat=FALSE; + +//--------------- +// CONSTRUCTOR + function Ticks($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; + } + + function SetLabelDateFormat($aFormatString) { + $this->label_dateformatstr=$aFormatString; + } + + function SetFormatCallback($aCallbackFuncName) { + $this->label_formfunc = $aCallbackFuncName; + } + + // Don't display the first zero label + function SupressZeroLabel($aFlag=true) { + $this->supress_zerolabel=$aFlag; + } + + // Don't display minor tick marks + function SupressMinorTickMarks($aHide=true) { + $this->supress_minor_tickmarks=$aHide; + } + + // Don't display major tick marks + function SupressTickMarks($aHide=true) { + $this->supress_tickmarks=$aHide; + } + + // Hide the first tick mark + function SupressFirst($aHide=true) { + $this->supress_first=$aHide; + } + + // Hide the last tick mark + function SupressLast($aHide=true) { + $this->supress_last=$aHide; + } + + // Size (in pixels) of minor tick marks + function GetMinTickAbsSize() { + return $this->minor_abs_size; + } + + // Size (in pixels) of major tick marks + function GetMajTickAbsSize() { + return $this->major_abs_size; + } + + function SetSize($aMajSize,$aMinSize=3) { + $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; + } + + function SetSide($aSide) { + $this->direction=$aSide; + } + + // Which side of the axis should the ticks be on + function SetDirection($aSide=SIDE_RIGHT) { + $this->direction=$aSide; + } + + // Set colors for major and minor tick marks + 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 SetWeight($aWeight) { + $this->weight=$aWeight; + } + +} // Class + +//=================================================== +// CLASS LinearTicks +// Description: Draw linear ticks on axis +//=================================================== +class LinearTicks extends Ticks { + public $minor_step=1, $major_step=2; + public $xlabel_offset=0,$xtick_offset=0; + private $label_offset=0; // What offset should the displayed label have + // i.e should we display 0,1,2 or 1,2,3,4 or 2,3,4 etc + private $text_label_start=0; + 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; + } + +//--------------- +// PUBLIC METHODS + + + // Return major step size in world coordinates + function GetMajor() { + return $this->major_step; + } + + // Return minor step size in world coordinates + function GetMinor() { + 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; + } + + function SetMajTickPositions($aMajPos,$aLabels=NULL) { + $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; + } + + // 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(); + + // 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]; + + // 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; + } + + // 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; + } + } + + function _doAutoTickPos($aScale) { + $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( $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; + + // 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; + } + + + 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( $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; + + $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; + } + + // Stroke ticks on either X or Y axis + function _StrokeTicks($aImg,$aScale,$aPos) { + $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(); + } + } + } + + // 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' ); + } + +//--------------- +// 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 + // 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 + } + + // Which tick label should we start with? + function SetTextLabelStart($aTextLabelOff) { + $this->text_label_start=$aTextLabelOff; + } + +} // Class + +//=================================================== +// CLASS LinearScale +// Description: Handle linear scaling between screen and world +//=================================================== +class LinearScale { + public $textscale=false; // Just a flag to let the Plot class find out if + // we are a textscale or not. This is a cludge since + // this information is available in Graph::axtype but + // we don't have access to the graph object in the Plots + // stroke method. So we let graph store the status here + // when the linear scale is created. A real cludge... + public $type; // is this x or y scale ? + public $ticks=null; // Store ticks + public $text_scale_off = 0; + public $scale_abs=array(0,0); + public $scale_factor; // Scale factor between world and screen + public $off; // Offset between image edge and plot area + public $scale=array(0,0); + 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 $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(); + } + +//--------------- +// 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; + } + + // 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; + } + + // 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; + } + + // If the user manually specifies a scale should the ticks + // still be set automatically? + function SetAutoTicks($aFlag=true) { + $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; + } + + // Get the minimum value in the scale + function GetMinVal() { + return $this->scale[0]; + } + + // get maximum value for scale + function GetMaxVal() { + return $this->scale[1]; + } + + // 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); + } + + // 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; + } + } + + // 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; + } + } + + // Restrict autoscaling to only use integers + function SetIntScale($aIntScale=true) { + $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.'); + } + } + + 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.'); + } + } + + if( abs($min-$max ) == 0 ) { + ++$max; + --$min; + } + + $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( 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; + } + + $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); + } + + // 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 + + // 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); + } + + // 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 + 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."); + + } + + // 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] + // 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)); + + // 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; + } + + $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)); + + //$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 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; + + $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 + } +} // 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 +// Description: Used to print data values at data points +//=================================================== +class DisplayValue { + public $margin=5; + public $show=false; + 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 $iHideZero=false; + + 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; + } + + function ApplyFont($aImg) { + $aImg->SetFont($this->ff,$this->fs,$this->fsize); + } + + function SetMargin($aMargin) { + $this->margin = $aMargin; + } + + function SetAngle($aAngle) { + $this->angle = $aAngle; + } + + function SetAlign($aHAlign,$aVAlign='') { + $this->halign = $aHAlign; + $this->valign = $aVAlign; + } + + function SetFormat($aFormat,$aNegFormat="") { + $this->format= $aFormat; + $this->negformat= $aNegFormat; + } + + function SetFormatCallback($aFunc) { + $this->iFormCallback = $aFunc; + } + + function HideZero($aFlag=true) { + $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( is_numeric($aVal) && $aVal==0 && $this->iHideZero ) { + 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; + + $y = $y-sign($aVal)*$this->margin; + + $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); + + $txt->SetOrientation($this->angle); + if( $aVal > 0 ) + $txt->SetColor($this->color); + else + $txt->SetColor($this->negcolor); + $txt->Stroke($img); + } + } +} + +//=================================================== +// CLASS Plot +// Description: Abstract base class for all concrete plot classes +//=================================================== +class Plot { + public $numpoints=0; + public $value; + public $legend=''; + public $coords=array(); + 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 $legendcsimtarget='',$legendcsimwintarget=''; + public $legendcsimalt=''; + 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 + + // 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"); + } + + function HideLegend($f=true) { + $this->hidelegend = $f; + } + + function DoLegend($graph) { + if( !$this->hidelegend ) + $this->Legend($graph); + } + + function StrokeDataValue($img,$aVal,$x,$y) { + $this->value->Stroke($img,$aVal,$x,$y); + } + + // Set href targets for CSIM + function SetCSIMTargets($aTargets,$aAlts='',$aWinTargets='') { + $this->csimtargets=$aTargets; + $this->csimwintargets=$aWinTargets; + $this->csimalts=$aAlts; + } + + // Get all created areas + function GetCSIMareas() { + 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; + } + + // 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); + } + + // Get maximum value in plot + function Max() { + 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); + } + + function SetColor($aColor) { + $this->color=$aColor; + } + + function SetLegend($aLegend,$aCSIM='',$aCSIMAlt='',$aCSIMWinTarget='') { + $this->legend = $aLegend; + $this->legendcsimtarget = $aCSIM; + $this->legendcsimwintarget = $aCSIMWinTarget; + $this->legendcsimalt = $aCSIMAlt; + } + + function SetWeight($aWeight) { + $this->weight=$aWeight; + } + + function SetLineWeight($aWeight=1) { + $this->line_weight=$aWeight; + } + + function SetCenter($aCenter=true) { + $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; + } + + // 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); + } + +} // 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'; + +//--------------- +// 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 + + 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 + } + + 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 new file mode 100644 index 0000000..a73081a --- /dev/null +++ b/libs/jpgraph/jpgraph_antispam-digits.php @@ -0,0 +1,205 @@ +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' ; + +//========================================================== +// 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=' ; + +//========================================================== +// 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==' ; + +//========================================================== +// 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==' ; + +//========================================================== +// 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 Rand($aLen) { + $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; + } + } + + $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 new file mode 100644 index 0000000..d83aed9 --- /dev/null +++ b/libs/jpgraph/jpgraph_antispam.php @@ -0,0 +1,615 @@ +chars['j'][0]= 658 ; +$this->chars['j'][1]= +'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'. +'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. +'MjIyMjIyMjL/wAARCAAeABUDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAUGBAf/xAAsEAACAQMDAwMBCQAAAAAAAAAB'. +'AgMEBREAEjEGIUEUUXGBBxMVIiNSYWKC/8QAFgEBAQEAAAAAAAAAAAAAAAAAAwEC/8QAGhEAAwADAQAAAAAAAAAAAAAAAAECERIh'. +'Mv/aAAwDAQACEQMRAD8A6veK2st8zRWSyV1dUBfvHaGVI4hknsS7AFv4AyM57ayWbqeS+11xtT2etttwo4YqhEqnQs5bcAfyk4AZ'. +'SOeD441TKRTyingUBG4/ah8j684+dSFzh/BvtaslejMUu9DPQTDnLx4lQ/ONw1TGBm0jdRWqguEMghEisWilgDmNs4Ze+MEEEH40'. +'aUVFTa7JeLjRXu4GjhmnNbSfqFQVlA3rkckOjH/Q99Glmkl0C/Q06pvsvT9vttXHDF6T1KrWbs5gRgQJM+FDlQxPhjpF1XcVq+qe'. +'jEoKiOecXBqh2TDDYIXLKuP6549xk8auI6aJqV45oknWdNswkAIkGMYIxjGO2NR1F0LZY5qkWqkS1xrM0M8lMSJpY+TGrnJiQ577'. +'cEgeNHhi7D3qC3UN69M8tIakRhgrh9o748+eNGtcCiKjjpkQKlMTEg3ZwoxtHHtgfTRpYXArvp//2Q==' ; + +//========================================================== +// lf-small.jpg +//========================================================== +$this->chars['f'][0]= 633 ; +$this->chars['f'][1]= +'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'. +'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. +'MjIyMjIyMjL/wAARCAAeABcDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAQFBgcC/8QAKxAAAgEDAwMCBQUAAAAAAAAA'. +'AQIDBBEhAAUGEjFBEyIHFFFhoRUzYnGS/8QAFQEBAQAAAAAAAAAAAAAAAAAAAQP/xAAaEQACAwEBAAAAAAAAAAAAAAAAAQIRMRIh'. +'/9oADAMBAAIRAxEAPwDcnmLoIkiSYsouC3tA++O2lU9WkqVjJ+YdhZLsQI/4/YfQm50kZP0vbmaCSU0SRNIH6sghb9INs3t38dvp'. +'akUuz8x5DwdN5peS1jV1dSipSiVUigIcdQjQ26lIB/c6r3F86SZpE/zCFJaqsihQNhRgdj3Jyfxo0jDSbXHt9Oph9RAoV3qJGltY'. +'HDOxyb/nRpV0D3RXle21m48XraOk3IUSemUaV4g4Zc9ShcDtgff+tQfwvjq34Dtku7buamFqeJKemCCMxKFsEJU+/FrX8d76sEHG'. +'aNItzr4usVNdG3S0rmRYAVwEUmyjyQLZ11x7aF4zs9DQOyzml29I2cLa/pixIHi99DFCtU9dFuLIaijo9qiYPmR2mZmB9thgAHOD'. +'4+mjUrURyrUNMZFEkkIOFuFAbsP9d/OjVIQ6Vh4tP//Z' ; + +//========================================================== +// lb-small.jpg +//========================================================== +$this->chars['b'][0]= 645 ; +$this->chars['b'][1]= +'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'. +'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. +'MjIyMjIyMjL/wAARCAAeABUDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAYCAwUH/8QAKxAAAQMDAwMDAwUAAAAAAAAA'. +'AQIDBAAFEQYSIRMxUSJBYQcVI2JxgqHw/8QAFQEBAQAAAAAAAAAAAAAAAAAAAQL/xAAYEQEBAQEBAAAAAAAAAAAAAAAAATERYf/a'. +'AAwDAQACEQMRAD8A6H95mxNYwLXcX+pCuilSLXJ6YSplaUELjqxwe4IJ5PIPamJ2V0bPcS7+NxCX1cHggAnIP+xSd9RyzHh2m7FQ'. +'Q1CvMNQWTjCt+HFD+PB/Y1fI1PL1HFFt0zaGblFdJQ9cJjpZiqPJUlBAKnPcEpGB5NNRKdrOl1NlgiQol4R2w4Sc5VtGf7opZteo'. +'LhdorjUSM5FnQnlR50NeHQysYxtVxlJHIPgjtRRD3xkaghs6juumdHz4+Y7RVPnt59K2mk7W+fcKWsZ7djTXMkW+xMP3GRJjwIEN'. +'HTG/CWx5wPY8AADx2NYk3SL9wukvUjGobnBkORksIbjdMANozgEqSo8qJPGO/wAVO36IsjUmBIfZfuM7epZk3F9UhSSk5O0K9Kcq'. +'8AcU3UzFuhUSBFud6nRXoz96mqmJZWg7m2dqUNhWBwdqQSP1UU5c/FFCn//Z' ; + +//========================================================== +// d6-small.jpg +//========================================================== +$this->chars['6'][0]= 645 ; +$this->chars['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' ; + +//========================================================== +// lx-small.jpg +//========================================================== +$this->chars['x'][0]= 650 ; +$this->chars['x'][1]= +'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'. +'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. +'MjIyMjIyMjL/wAARCAAeABMDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAUHBgj/xAApEAABAwMDAwQCAwAAAAAAAAAB'. +'AgMEBQYRACFBBxIxFCJRgRNxkcHw/8QAFQEBAQAAAAAAAAAAAAAAAAAAAAH/xAAWEQEBAQAAAAAAAAAAAAAAAAAAEQH/2gAMAwEA'. +'AhEDEQA/AH9t3pKvO14UykVARa/HfAlxlDKXR24V2p3z7RlPwdtMep91uWdRGHWELjuTFFtLvcC4SNznnH+21O7ttiodOq1BvC0E'. +'p9I0lSX2kgqCSklK+5PKCMAng6zV2XRO6u3lSIURtbDRShltlZHa0tW7q/0MeTwnjxq1Jiw2xc9xTLbhSVU5iaXUFfqFFILgJOCd'. +'9Gt3SXabR6REpkL8yo0RpLCFNx1qBCRjOQMHxo0pEr6o3um2LVYpMEpTVqg25lHn08dfcB9kEgfZ1LIFDuawqZRb7aQlLTzqglsg'. +'9wQdveOEqBIB425xqhQuk8qo9UKlPrlRblw2ZBeCSVKW6CcoSrI2AGOT41SKzT4dYtmdS5bIXDZhNoWgbZJ94x8AYT/GkM03oNUc'. +'uKgwqtTZDTMOU0FttqRkoHggnPkEEHRrkJ6t1SlSHYUOc6zHaWrsbQrATk5/vRqK/9k=' ; + +//========================================================== +// d2-small.jpg +//========================================================== +$this->chars['2'][0]= 606 ; +$this->chars['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' ; + +//========================================================== +// lm-small.jpg +//========================================================== +$this->chars['m'][0]= 649 ; +$this->chars['m'][1]= +'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'. +'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. +'MjIyMjIyMjL/wAARCAAeABcDASIAAhEBAxEB/8QAGgAAAgMBAQAAAAAAAAAAAAAAAAcDBAUCBv/EAC0QAAICAQMCBAMJAAAAAAAA'. +'AAECAwQRAAUSBiETMVFhB2KhFSIyQVJxgZHB/8QAFgEBAQEAAAAAAAAAAAAAAAAAAgED/8QAGREBAQEAAwAAAAAAAAAAAAAAAQAR'. +'EiEx/9oADAMBAAIRAxEAPwB0MI2lIdgI0Cly3kFXLEn2zx1FDdp7rbpbjUtRWKio3hyxOGQllJzkegX66rQ2qW87Zuk9S5FNVmru'. +'iywyBhjDKTkeXfSr+GRfYtq2KAO32b1BGxAZu0dyJ2DKPTxY1wPddVszycUq2Golq8jRWbcnJWwCVGMjz+VQP50atxMtm2ZUOY4l'. +'4qfUnBP0x/Z0amy4jJm10Tt2yddWasFmfaRfdrlG3UcgArnxKzJ+Fu4DqCMkcgNem2DoWav8PLfTm+FPEkuSNTnqueS5bnHIv6CG'. +'LNjJwM99bm67NB1Ht89KSxNXnr2hNDbiUc47K4KyD2GQMfmMjUnS+7vuIktTqPCaaWCqAMMojPFyw8hyYMQBnAwNJHYGXPTsW9VN'. +'jg2zf50W9zk524GAEihuz+xbIOD82jW5TkjtRPZkTkJ+4VgDhQfuj/f3OjUxl1f/2Q==' ; + +//========================================================== +// lt-small.jpg +//========================================================== +$this->chars['t'][0]= 648 ; +$this->chars['t'][1]= +'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'. +'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. +'MjIyMjIyMjL/wAARCAAeABcDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAQDBQYH/8QAJxAAAQMDAgYDAQEAAAAAAAAA'. +'AQIDBAUGEQASEyExQVFhIjJxFSP/xAAWAQEBAQAAAAAAAAAAAAAAAAABAAP/xAAZEQADAQEBAAAAAAAAAAAAAAAAAREhMUH/2gAM'. +'AwEAAhEDEQA/AO4BLEiEy7uG4IGxxs5IOOx76wd2XYidSp1HoD70240gcNNPbDyI6wQQpaz8E9MczkdhqtbsKYLieDk6WLKmZmmL'. +'Hk7AHVkbkLI+RQc7uRxgkfr1tx2rGu6VbToLVKkhU+kbugGf9WfaknCk5ycaX0zmaa+3JkqvW/CmzojsB9xoF6OoFK0r6HOcEDI0'. +'aefTuKX5ScMdC14HYq8n12zo1DEUcKTGg1Z+hyBwoPBVIiA/VQyOIgedhUCB4WMfXSV3UufVLcTUIqVf26K6mXDbPVRRzKT54iMg'. +'+zjtq6mtsyJjclxpKlUhSXEbkgkqWnBx4+J5e/zU0pZemPvJJQzEPDfQOrwwFY9AZ5eeYPLV6FwhoFYZuigxpkJeIjqAeIoAk9wA'. +'D46EnuD+6Nc1smDNrTlRkxqtMo1vzKhIdYgU9YDqVpISrLhHxSSd21I0aYyqP//Z' ; + +//========================================================== +// li-small.jpg +//========================================================== +$this->chars['i'][0]= 639 ; +$this->chars['i'][1]= +'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'. +'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. +'MjIyMjIyMjL/wAARCAAeABYDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAABwAGBP/EACcQAAEEAQMEAgIDAAAAAAAAAAEC'. +'AwQRBQAGEiExQVEHExSBFWFx/8QAFgEBAQEAAAAAAAAAAAAAAAAAAgMB/8QAGBEBAQEBAQAAAAAAAAAAAAAAAAECMRH/2gAMAwEA'. +'AhEDEQA/AE7c+5M9BeRG29t1WUfKFFYW+GvrI7WD3B9g140YD5T36rcErDjbUR6dCBdejsKUpxITXI2FUrooCh70yvxzHyIlMvuK'. +'eVSH7IKEpJoKqu/ahddLryR/aMiO187bsmrWShhp1AZS2XHHrWhNJrzdf7f7GiVcHk3sptmHkJcJ2DIftS2FrKlJPXudWuLGYeQp'. +'t2fmEIckqIZaaKuSGG0lQ4gduRoFRHQ9AOgs2lOJbk9aSUlpjGvAWeSVH2VKq/2dFPw3IjyJe8s281ct3I9UoHJXGiQkD2STrSZ7'. +'Yf8AOl7JTdw5eOCz0jw3+LbYCfA9nz71msb8KMxoTGTw+5srjsipAdDqFBQBIuiOl6KrdYyJMyTCshlw2G3Fr/HiNqNNAqJJUoGl'. +'KND+h47km1bZwsvCbYYjycxIyK1qDv2yEi0hQviK8atKDcy9j//Z' ; + + +//========================================================== +// lp-small.jpg +//========================================================== +$this->chars['p'][0]= 700 ; +$this->chars['p'][1]= +'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'. +'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. +'MjIyMjIyMjL/wAARCAAeABcDASIAAhEBAxEB/8QAGgAAAQUBAAAAAAAAAAAAAAAAAAECBAUGB//EAC8QAAEDAwMCBAMJAAAAAAAA'. +'AAECAwQFESEABhIiMRMVUWEHFEEWIzIzcYGRocH/xAAWAQEBAQAAAAAAAAAAAAAAAAADAgH/xAAcEQACAgIDAAAAAAAAAAAAAAAA'. +'AQIxAxESIUH/2gAMAwEAAhEDEQA/AOh703xG21DMeOyqoVNDjSzERiwU6Ep5qtZNycA97HTF13d33KWtmlt9xwkLl1NkXVxIuQgK'. +'wLj+hqBvel0qmbR8GnR22nJNZiLeeKr8nDIT1OLJucX+uPbWom7iocRpafOac5MX1ALltp/Cbi+cJH++utdh+WVNL3PNdNYpdWgx'. +'Y0qmLZSrwJJcQoOJ5XKlJFu4HbJOjVbt+V5nu7eopNRivqcdhK+bFnWwA1Y2AOcgjvj9dGlxy0g5y0xd+hNXoG24C4obizq3HZUh'. +'YHqtRHD06bG/8a0MbbG1mqekxaBSGmgkrcdcitlLfrckZIz7DUatbeFak0tyRLUwzT5vmiGm0cufEkFBJItfkD+59tKmiO12atFa'. +'eQukO3ejUxgENqTcfnE5WbkHiOnJ76N2IqI1DibabptS+zkZhtp90F2Y0S026EkAFK/qL46cXv65NVZDfxHmVCK4DE2/RX/lRFbA'. +'C5LwAyq2EtpHZI7mxPYDRqoctdESimz/2Q==' ; + +//========================================================== +// le-small.jpg +//========================================================== +$this->chars['e'][0]= 700 ; +$this->chars['e'][1]= +'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'. +'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. +'MjIyMjIyMjL/wAARCAAeABgDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAYEBQcB/8QAKhAAAQMCBAUEAwEAAAAAAAAA'. +'AgEDBAURAAYSIQciMTJBE0JRYRQVFoH/xAAXAQEBAQEAAAAAAAAAAAAAAAAAAgED/8QAGREAAwEBAQAAAAAAAAAAAAAAAAERAjFB'. +'/9oADAMBAAIRAxEAPwDTszvhEYCoS80BTm2bCjQRwdAzVe2yopkpJtpRUVfjEIc4V2oMerByg5Ji30oMyS3GeMunK0upfnu09MdJ'. +'p2scTmWnnGfx6HThktgLfKj7xEOqyr7QBbL41LhBzpxbcOru0LKDLdSnOHoaltNqSC4qWL0x9xbJYum69caczSaHmGmTmpDUYn4l'. +'UiqjkynzAVtwV23Ud+X4Ibpa2DCPkjhfUaRO/p8yzpb+YHhUmhbev6ZEll1lvqK3jt2XrbBgp6HVwsK3THpfEubGSoOUyFMpbJmL'. +'Deh6SgOGKti57EuY6l62JMWdJy7k3hg1LkOozEbVm7suQSkTiKtkEfP1pH664Za/QItccgI4bseTHdNxiXHLQ8yVl7V32XyioqL5'. +'TGc1ng6eYs0idczXUZscBBABWgEhEtfKNuUezwPnBhEuj8X2M21z9BR6NUX211Kk/UKKAjuhkPhL7XVf8vtgw7UPJlEyrDWFSYLb'. +'LBNF6qrzG6t0spEu6+fpL7YMXhUndp//2Q==' ; + +//========================================================== +// la-small.jpg +//========================================================== +$this->chars['a'][0]= 730 ; +$this->chars['a'][1]= +'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'. +'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. +'MjIyMjIyMjL/wAARCAAeABoDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAABgMEBwX/xAAvEAABAwIFAQcCBwAAAAAAAAAB'. +'AgMEBREAEiExQQYHFBUiUXGBE2EyQkNSgpHh/8QAFwEBAQEBAAAAAAAAAAAAAAAAAAMBAv/EABkRAAMBAQEAAAAAAAAAAAAAAAAB'. +'IQIRMf/aAAwDAQACEQMRAD8AfdQ1pxjqZMSn0mRUZRYDaklJCE3OawO2ttTxY4hl07qFMVs1Ku02kpPnRGhsAqz8W9T9wDjozq6o'. +'Q1lDrcZLGVcmUoZg0obpufxK3Ftt9ccqB1GgBcmLSqtVEqOZcr6ARm/kbXHt7DEtc7WTJKTJqEWvRKfLqL9QplSjuPtGVYOJKBrm'. +'t+U+n94WGStZzNypmRWqckUKTbixy6jAfxPxHtCgKqFNlU5huK6pLMndSlegG4J45N8aKmTMKQRBsCNMzwB+RbHWHGEAZlPZX2hx'. +'qZIC34ygZoYUbB50JSkFXFhZR9BrpheR4fIbQ6gvurJ7q02bIQTuAOAN8x40HAxRr3TrNRpBmSHVt1KMlTyJTCsqkKAPlSf28W+c'. +'UGaD1c9HSR1HFUh9tJU45EBcAtcC9+P9wqbg8IAto9o81yputrVGpiUkgHKkqUTZI32+cKm1z1tIUgPBBAKQ4UBQH3uL3xmXSXep'. +'HVDtXStE5K5jlPU7PF3Q41+okJFkjgC+3OuNSYiSzHaLtRcW4UDMpLYSCbakDW3thhum5p//2Q==' ; + +//========================================================== +// d9-small.jpg +//========================================================== +$this->chars['9'][0]= 680 ; +$this->chars['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->chars['5'][0]= 632 ; +$this->chars['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->chars['1'][0]= 646 ; +$this->chars['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==' ; + +//========================================================== +// ll-small.jpg +//========================================================== +$this->chars['l'][0]= 626 ; +$this->chars['l'][1]= +'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'. +'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. +'MjIyMjIyMjL/wAARCAAeABcDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAYEBQf/xAArEAACAQIFAwIGAwAAAAAAAAAB'. +'AgMEEQAFBhIhFEFREzEHFSIyYcFxgZH/xAAXAQEAAwAAAAAAAAAAAAAAAAACAAED/8QAGhEAAwEAAwAAAAAAAAAAAAAAAAECMREh'. +'Qf/aAAwDAQACEQMRAD8A15Zfm1VURj1Fp5AqLKv3OARcL4W5Nzx+MLWjdRz5hqXU6TSb6OCr6WghiQbrJ91gOTy1yT5xZ55myZFk'. +'Gb5ozX6Ondm28XYqpQDwu7jEH4c5S2UaDy4xxrLmlUDWzk8XaQ3O49hbj+RiB85HNg8Ee3aqwIqhDuux7G/HHbvzgxEqaWOvy09R'. +'O0o3hjdQoUji20g+fY3wYSM6pJ4Ylr7V+Zz5PSaezHTlTRNWzxySSxt6q1MSkH6AOT2Fu3Aw7RfF/T9DEkLUeawuF2mKSgdWQj2/'. +'q3+fnDZDlqRZzQGaOGcpTOaeR1u8R+ncN3gj94so2jNWHeMNNKzorEX2qp9v3imNPoRE1zpjUtZ09HJmYq5lury0benZeTww23t3'. +'Ivgw+T0yRRyyxIqNfkLcA8jt7YMKcBWn/9k=' ; + + +//========================================================== +// ls-small.jpg +//========================================================== +$this->chars['s'][0]= 701 ; +$this->chars['s'][1]= +'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'. +'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. +'MjIyMjIyMjL/wAARCAAeABQDASIAAhEBAxEB/8QAGgAAAgMBAQAAAAAAAAAAAAAAAAMCBAUGB//EACwQAAEEAQIFAgUFAAAAAAAA'. +'AAECAwQFEQAGEhMUITEiYQcjQVFxFRZCUoH/xAAWAQEBAQAAAAAAAAAAAAAAAAADAgH/xAAZEQADAQEBAAAAAAAAAAAAAAAAAQIR'. +'EiH/2gAMAwEAAhEDEQA/APWZMhmFXSJU+SGmWFiQtAWMJQAnJUr8Z+w/OuQk71uZnMsqnbjy9s8st9UMCQ6kZJdZaIHEkZ/JHceN'. +'N3HtizuY1JLrG48yLBSC9UTFKQiY4nACir+wAOOMEe2rm2bTbzlqtE1MyBuZAPybpw85KSfDRJ4Cg+Pl/wC61hJeGjV31VuuKqwr'. +'LGU+whZZK+Rw+oYJAyj3GjS4dZFpZVkqPLktdfMXNcaU2kBC1BIITkdx6c599GlnvPAa3TL2vNvU76n0063acr3YSLCEjpUpUQtW'. +'Dhf14SMEnOc57aZ8Tegm7dbrEQGZt1PeTDgc1PEW3FeXAvyAkZVkeMDOm2G3f3O7Cl/qEuqkQg4lp6CRxraWfUlRUD24kZA741Ko'. +'2k1HvlT3ri2sLOCgtsyJz6XEtBwZPAgJAGQMHUNPWKqWItsqh0UCFVyLeKhyLHQ2TMdHNVj+RKlAnJyfto1FW2ahgjrq6LYTFjjf'. +'lymUOLdWfJyoHA+gA7AAAaNPE3ysJdLT/9k=' ; + +//========================================================== +// lh-small.jpg +//========================================================== +$this->chars['h'][0]= 677 ; +$this->chars['h'][1]= +'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'. +'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. +'MjIyMjIyMjL/wAARCAAeABUDASIAAhEBAxEB/8QAGgAAAQUBAAAAAAAAAAAAAAAAAAIDBAUGB//EACwQAAIBAwMCBQIHAAAAAAAA'. +'AAECAwQFEQAGEiExExQiQVEVggcyU2GRocH/xAAXAQADAQAAAAAAAAAAAAAAAAAAAwQB/8QAGhEBAQEAAwEAAAAAAAAAAAAAAQAC'. +'AyEyMf/aAAwDAQACEQMRAD8A6DZb95q9bmpK6ieOCzNHJTxmE+NMhQ5fr1fLq3Ejvkak2e7ipiFsqb3R0m4qkPPJRiRXenU9VjKE'. +'5JVcA9R7nWc3/BUbfoKTdO3VRXhpjbZ2D8Rwk6RyZH6chB+46m7i2hDYtgA2ePlV2VkuKysoLzzRnlIScZJZeeevvjtrX7LK2rp7'. +'tTwwJ9WjhILDrTKnIdMEDl2+P80aVdJZb1QW+vgqENLPH4sBCDLIwUgnOf4GjVvDnLgUk79T81voqjb8NnuUx8pVRCiEaYUSuynl'. +'jHU9mOfnOoOx6hqz8PrbNdfEkMUXg1LSM3rKOUywJ7YAJ1ZTWmSpvdvlaVTDSUzJAhH5ZJBgv0x2RSAPlz21WXqoet3ba9nuW8n4'. +'Jr6qTPqnUNxSM/f6mPvxA9zqJnExTbR+h0nkhVu1uE8j0UBRQ9PGxBKFjnkAScdsDp10a0lc7z0tI7Y5YYN+5GAf7GjVXF4Icj3f'. +'/9k=' ; + + +//========================================================== +// ld-small.jpg +//========================================================== +$this->chars['d'][0]= 681 ; +$this->chars['d'][1]= +'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'. +'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. +'MjIyMjIyMjL/wAARCAAeABcDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAQFBgH/xAAsEAABAwMEAAQFBQAAAAAAAAAB'. +'AgMEBQYRABIhMQcTI0EUMlFhkRgicaGx/8QAFgEBAQEAAAAAAAAAAAAAAAAAAgEA/8QAGBEBAQEBAQAAAAAAAAAAAAAAAAECETH/'. +'2gAMAwEAAhEDEQA/ALUhp6h3W/X63UlypbhCY0WMjLqGzwDtPCfv/WtealNpVInuVBBqCogcdbU36YUkAkJWVHG8YPXBxxzxqPcN'. +'YtWyWnIlUeW05VEOAvrCnnSkftK1H5lKJPHsMDoDUWq+KdrSbIqsalVsImiEtLUZ2MU71bcYJWkhZ/36ayLHhi/IXZVOmzKqp5uU'. +'688hTyjuGVEFJKvoQesD86NL2jGZp1EoLDSmk+ZAQ8d7oPzp3YGesFWMfxo1YGvSzLsT9QExVX8phTlMaFOExAJIBGQjJwCcL+/e'. +'rd+W7GuO0Kw05CQ6+ww69Gfdb2kFIKk7DgEkjgnr86rXRa9HuyP8LV4SH0sIBbWFFDiFEgDaocgdkjo8ccay0qw7ut5nyrcviQqC'. +'slsRKo0HwlODkBRzxj2AGoXTtpzIdQ8MbffUChz4NCPRaClAo9Mn6c7T3o13wytmo0K05VIqkiPJbizFiMWs4CTgnIIHOST796NL'. +'Ia1JX//Z' ; + +//========================================================== +// d8-small.jpg +//========================================================== +$this->chars['8'][0]= 694 ; +$this->chars['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==' ; + +//========================================================== +// lz-small.jpg +//========================================================== +$this->chars['z'][0]= 690 ; +$this->chars['z'][1]= +'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'. +'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. +'MjIyMjIyMjL/wAARCAAeABYDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAABgAHA//EACsQAAEDAwQBAwIHAAAAAAAAAAEC'. +'AwQFESEABhIxBxMiQVFxCCM0UmGRof/EABYBAQEBAAAAAAAAAAAAAAAAAAECAP/EABgRAAMBAQAAAAAAAAAAAAAAAAABEVEC/9oA'. +'DAMBAAIRAxEAPwBTWfLu1KXXZDbM4uewNvLajlwhaCbBAwDe5uehYd3xm6t6bi3jvulwqc7KgxXZZeYQLNLeF73WRg4HEdgfzrSa'. +'P45pNEkznITDc9ypLShtyWhJDJyXC2qxJHZvjoZOjyVv1v8AESt6FFS4ijxvTLbawEApSccrYHJf0+OtJMQ2rNXk7GZMufJgJjTH'. +'Un9M4qzxT7hyCiThIyRnPXWrRvyLElVBUF6vlhl0lwRYCFKcQhAtyWpVhyWTx+w++rUvp4EWjOvbniUOnVatcS43BYDbJSPZyIBw'. +'ejclIx+3Wa+J63T6DQanuGszI0eZVJJV60p0Jum5GEi6le7l0PjvSjyRsaTvJqI1BqhhR46ksuMrQVJcUSEoUbHNr/7o7C8L7eiz'. +'4lLlyJk2cEqW+6V+m0AE9ISLnsj5+O9UhsFK92bZZqb9SRu9p2c4A0OCEqDbYAJSlJwAVZv3fBvbFrg/462btlhuS1RG5nL8pYkq'. +'KrnsKH06I/rVrQKkf//Z' ; + +//========================================================== +// d4-small.jpg +//========================================================== +$this->chars['4'][0]= 643 ; +$this->chars['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==' ; + +//========================================================== +// lv-small.jpg +//========================================================== +$this->chars['v'][0]= 648 ; +$this->chars['v'][1]= +'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'. +'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. +'MjIyMjIyMjL/wAARCAAeABQDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAQDBQYH/8QAKBAAAQQBAwMEAgMAAAAAAAAA'. +'AQIDBBEFAAYhEzFBEhQiYQdRFTKB/8QAFgEBAQEAAAAAAAAAAAAAAAAAAAEC/8QAFxEBAQEBAAAAAAAAAAAAAAAAAAERIf/aAAwD'. +'AQACEQMRAD8A6Ngt1SZ4yrYgrecgTFsFJA9aGwAUrUaF2D2Avjzq6CIjiBPkB9bwQVIkIYIDae/wq+P9N+dY4SGMf+Txlev7KBmY'. +'PoadKRy4zxSgRxaTwO/x09u7KPYnasmHjlsyFZZXt4K23ezjvBpNGgLUrvXfVZyLLbWambiwEbKvvxYAkeotNlIJW2FEJWb7WBda'. +'NSQI0fHYyJjkrjKRDZQwnpQ1vgBIr+w8+a+9GocZr8iKkuY1eXhsKH8U8iZE9BHz6ZHUc48UfSPqzqH3kfeO9kTTDQYGGietpTaO'. +'shyW6AocpHNIrv8AvWzk9BUSdPdYS4BcRlomkhIV6KP0VE39V+tU2wdlRMHtZUB8NuTQ+51X27+Kr46ZPIAFV540D8zeLsJ5LMHa'. +'ubmMBCVJdjx0pRyLoWR4I8aNIQ8BvZMNtMTeUcsptKfc4tC1gAkCyFC+K0aJtf/Z' ; + +//========================================================== +// lk-small.jpg +//========================================================== +$this->chars['k'][0]= 680 ; +$this->chars['k'][1]= +'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'. +'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. +'MjIyMjIyMjL/wAARCAAeABUDASIAAhEBAxEB/8QAGQAAAwEBAQAAAAAAAAAAAAAAAAUGBAMH/8QALhAAAQMDAwIEBAcAAAAAAAAA'. +'AQIDBAUREgAGITFBEyIyYQcVUYEUIzNicZHx/8QAFgEBAQEAAAAAAAAAAAAAAAAAAwEE/8QAGxEAAwACAwAAAAAAAAAAAAAAAAEC'. +'AxESMeH/2gAMAwEAAhEDEQA/APVK/V36dU6NSJDTT8esPLiqfK8S2cCoeTkKvZQ6jm2ldSqKqbu+OgMOvSX3m4UBrLnDlbqiefKl'. +'Nzz2x1m+IwNP27CkJQ7JkR6rCkMJbP5jp8S2CPfkgD6H+dJ6Ca0nerr+64rTNSqMYrg+C9mmOwhVpDfsuxSbi97DmybaoZeQ5jTl'. +'PEp18JTIfeW3kq3ly4H26aNZqvTWZsjFcZTsVtSg0G8Rio+vr2vb7g6NLPRnuXy8F+8kl+obUh4KXJdqSJJQnohlkZqJPYBXh3P+'. +'a4b5Hyp6k1bO7sOotPyXkj9NlwFl0ewstJA9ifrqkVSmET4csoS7UTHXFQ+6SQlskKUMb/tH9ddLVUmS7DqdBqD7U6OsqfS46jzl'. +'hQ5bXb1K9Scuybdxo2OTu92dwSZkWn0Sb8viQWyn8Qq5D6ifSLd0BIv7q0arTBRSKPToMZbi2GWylsvLK148Wue/XRrRjxOpT2R2'. +'k9aP/9k=' ; + +//========================================================== +// lr-small.jpg +//========================================================== +$this->chars['r'][0]= 681 ; +$this->chars['r'][1]= +'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'. +'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. +'MjIyMjIyMjL/wAARCAAeABYDASIAAhEBAxEB/8QAGgAAAgIDAAAAAAAAAAAAAAAAAAYCBQMEB//EAC4QAAICAQIFAgMJAQAAAAAA'. +'AAECAwQRBQYAEiExQQdRFGFxEyIyM0JSYoGC8P/EABYBAQEBAAAAAAAAAAAAAAAAAAEAAv/EABcRAQEBAQAAAAAAAAAAAAAAAAAB'. +'EUH/2gAMAwEAAhEDEQA/AOs0ZdETU54Gt1INSmlPJEsyo7J+jlXPUYBPY9c+eE/dO9tY0a7ren6BVrW7VJTZtW5kZkjXkBSIKveQ'. +'gHp0AAJ4w+q2hVdT2Md0h46+saS4mr3EUK0gWTAB+vQj2PboeL/ZVOqmhaZVjkFmxdC6tctt3tM2G5/7bAx4C4+qxiWwd3prWzKe'. +'r3IBAth5OYxozKsgc8y4GTgnJB9uncdTi6tXq2140rRVM13JMEMAVAg7sMdBjJB/18uDgRO9R2Oo6FX2vShkFzURFUq1whIj+8DI'. +'7EdAFjXv7MeNb0kuStsFEmIaajZaos2fy2Q4VGH7SGxn+Rzw9yMLOm/FzRhZazmOTkP4grYyD3B8j2PTyeFfZ+z7G3BeSS8lmprl'. +'2K2qcnK0Z5S8gPjrgAY8cNEWmq7u23pEos6/Zji+Kd0rLLGWwseA3joeZj/w4OET1g0vlmrWV+ydFnkUxSgsvM4V+YYIwfHz6cHB'. +'ZeKZ1//Z' ; + +//========================================================== +// lg-small.jpg +//========================================================== +$this->chars['g'][0]= 655 ; +$this->chars['g'][1]= +'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'. +'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. +'MjIyMjIyMjL/wAARCAAeABQDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAQCBQYH/8QAJxAAAQQBAwQCAgMAAAAAAAAA'. +'AQIDBBEFAAYhBxIxQRNhcYEiQlH/xAAYAQACAwAAAAAAAAAAAAAAAAACAwABBP/EABkRAAMBAQEAAAAAAAAAAAAAAAABAhEhIv/a'. +'AAwDAQACEQMRAD8AayO4t6bq3hmMHtxyLi4OKeKH5jyASiiQCCQeTRNAeB61FrBb+jTGpLO+BMW24EFMhkhpQru8m7B/H70x09Yi'. +'q3nv/vLfwpnJ7UNkqSRbngf2ofWkpXV7brymC2malLfagurjW0aHk89xPJ9cX9aprURHWbYEaMHHEBfwpv8AnXPk+/8AdGqGJOxO'. +'4YbOSxK4y4boIStUWysgkEmxY54r60aOI8oTV9MHtjJwunPUbO46WWo0HLlD8KY4goboFVoquOVEVwLT963WdnxYfT6ZJyz0JvHm'. +'KvtaSkW4tYNVSqKiTwB+fw5n9sY/cuOXCzDDcluyW3Ckd7V+0n0eNZTH9DdouFalHIOJBUhtDki0pNV3UALo81ehG6IdKjPZ6d47'. +'4ywltanVJvuJI+RQs/sHRqy2r003JhsImEc/CUyhxRZBjKV2oJ8eRXNmufPnRo1WIz3DdNn/2Q==' ; + +//========================================================== +// lc-small.jpg +//========================================================== +$this->chars['c'][0]= 629 ; +$this->chars['c'][1]= +'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'. +'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. +'MjIyMjIyMjL/wAARCAAeABcDASIAAhEBAxEB/8QAGQAAAwEBAQAAAAAAAAAAAAAAAAUGBwID/8QALRAAAgICAQIEBAYDAAAAAAAA'. +'AQIDBAURACExBhIiQRMVUWEHMkJScYFykaH/xAAWAQEBAQAAAAAAAAAAAAAAAAABAgP/xAAXEQEBAQEAAAAAAAAAAAAAAAAAATER'. +'/9oADAMBAAIRAxEAPwDcoGkmiT4Q8kWvzuPU38D2/v8A1zwrCFayq1qTaFk2H7aJHt05MeMvENzC4upDWkjW9kJXiricAJCigvJN'. +'IB1IVQT5frrv24twPgunk6a288crbklUSJNNdnSTZ2STHHqOP/Eb17njdZtAoqwEvrEiGVyG117/AG6HhyV8H1sljMldoxXTksGC'. +'zV7M0oaWGQOVeGQ92I6EMR22D11w4LmEPjaOL51iL8ssc9Z69zHtZkYCGGeQK0ez2UEoU39wCeX1S/LLiEt+mPSbMLxsGVv2kEjR'. +'305xkaEV/GTULMUT1LD/AAGh8gIZS2jv+vpybb8NMIb0dVLWYWgiiU0vmMphOj6V0TvQI3rfsON1E6dYjGtisa0F1mAWR2NhG0WZ'. +'3Ls3TqNs5Hc9h23w49NWL9K+Q/VD5T/zhwPH/9k=' ; + +//========================================================== +// d7-small.jpg +//========================================================== +$this->chars['7'][0]= 658 ; +$this->chars['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==' ; + +//========================================================== +// ly-small.jpg +//========================================================== +$this->chars['y'][0]= 672 ; +$this->chars['y'][1]= +'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'. +'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. +'MjIyMjIyMjL/wAARCAAeABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAQGBQf/xAArEAABAwMEAQIFBQAAAAAAAAAB'. +'AgMEBREhAAYSEzEHIhQkQVGxQmFxgaH/xAAWAQEBAQAAAAAAAAAAAAAAAAADAQL/xAAeEQEAAgEEAwAAAAAAAAAAAAABABECAxIh'. +'MUGR8P/aAAwDAQACEQMRAD8Ar3tys07dVHohemz5dWQ7fk91MsA3IIRY8rkKFySceTqw3JVV0KhyKw+0C1CQp9aUOFSiAk4AIAvn'. +'76xtz0ioVvbcJ6msx2JtOfZmw1PKI5LQcJNh7UqBKcn6+NRfqPu6s1fYc6GxSJsRfWDUVSGA22ygEckJWSexRNgOP0udXzDKOJ0I'. +'yo62mHm25Sy80l1Z4lSgpQvZRGLgWwPGjTjbchyLH+Ejx22EtJSgO8kki3kADA/nOjWjGzv73CyQZjUWNVp7bNSrj7qJDqflqUlQ'. +'DMds24l3HvcNr3Pi9gME6T9WWVsemdYWswwC2lPta4m5WMA3OdUExCmozUJD6g84ntMjrHIFBTdQz5yLDx/WDNytpwW6nAkViqVe'. +'uvmXdlme6n4dCwlRBKEgA2tj99QG7Ilncp5QqpU31PMsJ6x7A32f6SPxo0hPVCD45oVyKf0MtgeT97/nRrO7UOCFla3tn//Z' ; + +//========================================================== +// d3-small.jpg +//========================================================== +$this->chars['3'][0]= 662 ; +$this->chars['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=' ; + +//========================================================== +// ln-small.jpg +//========================================================== +$this->chars['n'][0]= 643 ; +$this->chars['n'][1]= +'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'. +'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. +'MjIyMjIyMjL/wAARCAAeABQDASIAAhEBAxEB/8QAGwAAAgEFAAAAAAAAAAAAAAAAAAYCAQMEBQf/xAAtEAACAQMCBAUCBwAAAAAA'. +'AAABAgMEBREAIQYSE0EHIjFRcWGRIzIzQoGCwf/EABYBAQEBAAAAAAAAAAAAAAAAAAMEAP/EABkRAQEBAQEBAAAAAAAAAAAAAAEA'. +'AhEhUf/aAAwDAQACEQMRAD8A6FR3p7v4oV9rlkMQsjL00RyOss0KkFxnDcrc2PbI1NOJKyTjW+W5OmKeA0UEJx5meRZS2/8AUfbS'. +'LVGS1+K16vCzfiR3GmoqqXGyxz06hWPsFlVMfOmq1iNvE69KjBYo3oJMZ3GKeYYPxg/fW+xzZX1FLQyxwSTcpWNceu4G3+aNSmpY'. +'qmQzzwh2k8yhv2r2H23/AJ0aoy+EWh7I1ntacR3PxDtEzhjWy0wkkIwYmanU5GO6sNh7rrU8AVdTceNbhDXxNHUQvS0tZ3DzwxVA'. +'fB7hj59/XJ08cPWaKj4gvlwSQiG7dCboqvLy9NOmQT9SM7ayJrBa6K5V91hjlWorp4JGUOAglRSiMMDb82/vgaBGTpVvtNUVtyJg'. +'5+WNAh5ZCu/r2+dGrgq0pi0DhmlRsSSAfqMd+b6ZyNu3po1Rk1yNBe3/2Q==' ; + +//========================================================== +// lu-small.jpg +//========================================================== +$this->chars['u'][0]= 671 ; +$this->chars['u'][1]= +'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'. +'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. +'MjIyMjIyMjL/wAARCAAeABcDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAYDBAUH/8QAJRAAAQQBAwQDAQEAAAAAAAAA'. +'AQIDBBEFAAYhBxMxYRJBURSB/8QAFgEBAQEAAAAAAAAAAAAAAAAAAQAD/8QAGhEBAQEAAwEAAAAAAAAAAAAAAQARITFBAv/aAAwD'. +'AQACEQMRAD8A6dLkQmJzu3WVtHIqjf0duKFNuBr5UTQ45F1R8/XI1PMmsYoJyjhS9iI7BKHeKjkXZVXqhyLHP+rrHeR1pZlx1W1M'. +'wTiW0ukkrS28nn5fV2SPPFfurHUKQhzYG7pLYKEfyBhaSOS7dG/YCki/uvWn3LPDOJrwa4kyEzOYeakqkpC3Hk0bNePQHgDRpchY'. +'leIZwzUWauKtuPctTSUlCAUmrBHIKuAPV/ujQsmHdm7hya43UbbD3ZVElOQJsdTS6IQaQUqBHCk8E2Pocgam6oYwObHy0Zm0oi45'. +'T1KBPdpV2f0pom/1Ws7cmPazu98Ltvcq3VzRHfehz8a4pirFEKRZo8eQT+eCdWYfS/b+WYnxpbuVcDRMdHcyTqg2fiAfiLoi+Rf+'. +'jT7Xc74HtOYnHyUOh8yWUvKeHhy0CiPVUAPoDRrm+OeznTva6lzsyMjCYbbaiNJjJSWElagD5tRpNUSALFeNGoOCH7Bv/9k=' ; + +//========================================================== +// lw-small.jpg +//========================================================== +$this->chars['w'][0]= 673 ; +$this->chars['w'][1]= +'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'. +'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. +'MjIyMjIyMjL/wAARCAAeABcDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAYDBAX/xAAtEAACAQMDAgMHBQAAAAAAAAAB'. +'AgMEBREABhIhMRMUQRUiIzJRYZEWNIGx0f/EABYBAQEBAAAAAAAAAAAAAAAAAAABA//EABoRAAICAwAAAAAAAAAAAAAAAAABERIh'. +'MVH/2gAMAwEAAhEDEQA/AHXbV13ZLu6t2/uaa1JijWopVp4XUTKSAXRyc+6ehBGeoPbTSlwpql0K3GneqpZViqUhI5JzGMEZJGeh'. +'GlXfaFILDf7FQzXC426rDLTojs8sLqVkXBGcfKf40twWbdWzZY75R0s90ul3jPtKjVMJDNn4DDp8iEhW+wJ1WZG2KWt3Lv26U1tv'. +'92o7PaYkgYUbqVepYlmUBlIwqnB++O2jTDt/bBtth9jcpvEWNGqalZQryTlmeR8jPct6+mNGmRC4a1U13htzVFItB5nA/cyOUVfp'. +'7oz/ALqitJulYJKuqvFsppHALLFb3cp9FBaXr+O51bq0q6i38KK5PDVAAxSzU6SIpz3Kjjn8jUFoS7uFmut1gq17xLFQ+DxOccj8'. +'Rsn+tVpiyJnqv09YfOXu5AycgZZQEhBZjgDBOOgwO/po0sttWHdNzqLruioa4UwmdaC3kYp4IwSvJlBHKQ4OSe3po0qxM6P/2Q==' ; + +//========================================================== +// lq-small.jpg +//========================================================== +$this->chars['q'][0]= 671 ; +$this->chars['q'][1]= +'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'. +'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. +'MjIyMjIyMjL/wAARCAAeABQDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAcDBAUG/8QAKRAAAQQBBAICAQQDAAAAAAAA'. +'AQIDBBEFAAYSIQcxIlETCBQVgSNBYf/EABUBAQEAAAAAAAAAAAAAAAAAAAAB/8QAFhEBAQEAAAAAAAAAAAAAAAAAAAER/9oADAMB'. +'AAIRAxEAPwDT3H5Qz+O3LN2vtrF/y86NYLzzVlAABJITQPv2a/17vXMboz3lDEYWPuafNx7CFrS03+2jpK2bs0CUkUa7pRvrUu63'. +'sr438yv7pLEo4XIK5Kcji0uJUkckm+uQUOVH6GsnyJv7A5vaJwuFdkONLmolgONFH4vioKRXYqyCADXvRMh0yspmZ4jyIEtDTK47'. +'aiA0lQUopBJBI/7X9aNT7amRo228e3a31iO3yUzCcdSPiKAIFdCho0TIswZ7GQlO/hlRxBooih1YXzAoKUkX0LPEBX110dJ7zbuv'. +'AORpO04cIpmxH23FSEIRwKuNnsdk0o31702XhFMKbuRUZJWP8LTQ6HBCuIB+iVWSR2BXuqK93/hDlvGzEphmG3Ml5JpDi1I7TzNA'. +'BYFlPafY+/7LBiv1CYDH4iFDOGySlMR22lFP4wCUpANfL11o1r4bxXlWMNEaE/bqlIbCFl/ANPK5Do/M0VDr2Rf3o0TX/9k=' ; + + + + } +} + +class AntiSpam { + + private $iData=''; + private $iDD=null; + + function AntiSpam($aData='') { + $this->iData = $aData; + $this->iDD = new HandDigits(); + } + + function Set($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; + } + + function Stroke() { + + $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; + } + } + + $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; + } + + 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 new file mode 100644 index 0000000..bcf6fdd --- /dev/null +++ b/libs/jpgraph/jpgraph_bar.php @@ -0,0 +1,1009 @@ +Plot($datay,$datax); + ++$this->numpoints; + } + +//--------------- +// 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; + } + + // DEPRECATED use SetYBase instead + function SetYMin($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; + } + + 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); + } + } + } + + // Gets called before any axis are stroked + function 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); + + // 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])); + } + } + } + + function Min() { + $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; + } + + // 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; + } + + // Specify width in absolute pixels. If specified this + // overrides SetWidth() + function SetAbsWidth($aWidth) { + $this->abswidth=$aWidth; + } + + function SetAlign($aAlign) { + $this->align=$aAlign; + } + + function SetNoFill() { + $this->grad = false; + $this->fill_color=false; + $this->fill=false; + } + + function SetFillColor($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; + } + + function SetValuePos($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; + } + } + + 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()'); + } + } + + 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]); + + // 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( $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) { + + // 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; + + if( $exist_x ) $x=$this->coords[1][$i]; + else $x=$i; + + $x=$xscale->Translate($x); + +// 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]; + + if( !empty($val) && !is_numeric($val) ) { + JpGraphError::Raise('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::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( $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; + 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]."\" "; + } + + $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 + +//=================================================== +// CLASS GroupBarPlot +// Description: Produce grouped bar plots +//=================================================== +class GroupBarPlot extends BarPlot { + private $plots, $nbrplots=0; +//--------------- +// 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; + } + +//--------------- +// 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); + } + } + + 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 + +//=================================================== +// CLASS AccBarPlot +// Description: Produce accumulated bar plots +//=================================================== +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(); + } + +//--------------- +// 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); + } + } + + 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); + + // 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); + } + + // 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); + + 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->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); + + 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 + + // 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::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); + } + + 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( $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); + } + + // 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 + + 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]."\" "; + } + + $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; + + // 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 + +/* EOF */ +?> diff --git a/libs/jpgraph/jpgraph_canvas.php b/libs/jpgraph/jpgraph_canvas.php new file mode 100644 index 0000000..fbd9473 --- /dev/null +++ b/libs/jpgraph/jpgraph_canvas.php @@ -0,0 +1,95 @@ +Graph($aWidth,$aHeight,$aCachedName,$timeout,$inline); + } + +//--------------- +// PUBLIC METHODS + + function InitFrame() { + $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 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( !$_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); + } + + + // 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 + +/* EOF */ +?> \ No newline at end of file diff --git a/libs/jpgraph/jpgraph_canvtools.php b/libs/jpgraph/jpgraph_canvtools.php new file mode 100644 index 0000000..5f8a4dc --- /dev/null +++ b/libs/jpgraph/jpgraph_canvtools.php @@ -0,0 +1,515 @@ +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; + } + + 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); + } + + function TranslateX($x) { + $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; + } + +} + + +//=================================================== +// CLASS Shape +// Description: Methods to draw shapes on canvas +//=================================================== +class Shape { + private $img,$scale; + + function Shape($aGraph,$scale) { + $this->img = $aGraph->img; + $this->img->SetColor('black'); + $this->scale = $scale; + } + + function 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); + } + + 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); + } + + 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); + } + + + // Draw a bezier curve with defining points in the $aPnts array + // using $aSteps steps. + // 0=x0, 1=y0 + // 2=x1, 3=y1 + // 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; + + // 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]); + } + + 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); + } + + 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); + } + + 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); + } + + 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); + } + + 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); + } + + 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); + } + + 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); + } + + function 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); + } + + // 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); + + // 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); + + // 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); + + // Left line + $this->img->Line($xt,$yt+$ih+$r,$xt,$yl-$r); + + // 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); + + // 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); + + if( $aFillColor != '' ) { + $bc = $this->img->current_color_name; + $this->img->PushColor($aFillColor); + $this->img->FillToBorder($xr-$r,$yl-$r,$bc); + $this->img->PopColor(); + } + + break; + + case 1: // Upper right + + // 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, 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); + + // 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); + + // Right line + $this->img->Line($xr,$yt+$ih+$r,$xr,$yl-$r); + + // 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); + + // 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); + + if( $aFillColor != '' ) { + $bc = $this->img->current_color_name; + $this->img->PushColor($aFillColor); + $this->img->FillToBorder($xt+$r,$yl-$r,$bc); + $this->img->PopColor(); + } + + break; + + 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); + + // 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); + + // 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); + + // 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); + + // 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); + + if( $aFillColor != '' ) { + $bc = $this->img->current_color_name; + $this->img->PushColor($aFillColor); + $this->img->FillToBorder($xt+$r,$yt+$r,$bc); + $this->img->PopColor(); + } + + break; + + 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); + + // 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); + + // 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); + + // 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); + + // 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 +// rounded, possible filled, rectangle. +//=================================================== +class CanvasRectangleText { + private $ix,$iy,$iw,$ih,$ir=4; + private $iTxt,$iColor='black',$iFillColor='',$iFontColor='black'; + private $iParaAlign='center'; + 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 SetShadow($aColor='gray',$aWidth=3) { + $this->iShadowColor = $aColor; + $this->iShadowWidth = $aWidth; + } + + function SetFont($FontFam,$aFontStyle,$aFontSize=12) { + $this->iTxt->SetFont($FontFam,$aFontStyle,$aFontSize); + } + + function SetTxt($aTxt) { + $this->iTxt->Set($aTxt); + } + + function ParagraphAlign($aParaAlign) { + $this->iParaAlign = $aParaAlign; + } + + function SetFillColor($aFillColor) { + $this->iFillColor = $aFillColor; + } + + function SetAutoMargin($aMargin) { + $this->iAutoBoxMargin=$aMargin; + } + + function SetColor($aColor) { + $this->iColor = $aColor; + } + + function SetFontColor($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; + } + + function Pos($xl=0,$yt=0,$w=0,$h=0) { + $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; + } + + function SetCornerRadius($aRad=5) { + $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( $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->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->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->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); + + } + +} + + +?> \ No newline at end of file diff --git a/libs/jpgraph/jpgraph_date.php b/libs/jpgraph/jpgraph_date.php new file mode 100644 index 0000000..c771573 --- /dev/null +++ b/libs/jpgraph/jpgraph_date.php @@ -0,0 +1,499 @@ +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. +//------------------------------------------------------------------------------------------ + + 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); + + } + +//------------------------------------------------------------------------------------------ +// 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); + } + +//------------------------------------------------------------------------------------------ +// 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); + } + +//------------------------------------------------------------------------------------------ +// 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); + } + +//------------------------------------------------------------------------------------------ +// 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); + } + +//------------------------------------------------------------------------------------------ +// 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); + } + +//------------------------------------------------------------------------------------------ +// 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) ), + + /* 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 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 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 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 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 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)), + ); + + $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); + } + + function AdjustForDST($aFlg=true) { + $this->ticks->AdjustForDST($aFlg); + } + + + function SetDateAlign($aStartAlign,$aEndAlign=false) { + 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; + } + + + 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'); + } + + 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); + } +} + + +?> diff --git a/libs/jpgraph/jpgraph_errhandler.inc.php b/libs/jpgraph/jpgraph_errhandler.inc.php new file mode 100644 index 0000000..3c00cb4 --- /dev/null +++ b/libs/jpgraph/jpgraph_errhandler.inc.php @@ -0,0 +1,278 @@ +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; + } +} + +// +// 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; + } + public static function Raise($aMsg,$aHalt=true){ + self::$__jpg_err->Raise($aMsg,$aHalt); + } + public static function SetErrLocale($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); + } +} + +// +// First of all set up a default error handler +// + +//============================================================= +// The default trivial text error handler. +//============================================================= +class JpGraphErrObject { + + protected $iTitle = "JpGraph Error"; + protected $iDest = false; + + + function JpGraphErrObject() { + // Empty. Reserved for future use + } + + function SetTitle($aTitle) { + $this->iTitle = $aTitle; + } + + 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(); + } +} + +//============================================================== +// An image based error handler +//============================================================== +class JpGraphErrObjectImg extends JpGraphErrObject { + + 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==' ; + + if( function_exists("imagetypes") ) + $supported = imagetypes(); + else + $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); + } + + $aMsg = wordwrap($aMsg,55); + $lines = substr_count($aMsg,"\n"); + + // 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); + + $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); + + // 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); + + // "White shadow" + $img->SetColor("white"); + + // Left window edge + $img->Line(2,2,2,$h-5); + $img->Line(2,2,$w-6,2); + + // "Gray button shadow" + $img->SetColor("darkgray"); + + // 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 = 100; + $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-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(); + } +} + + +// Install the default error handler +if( USE_IMAGE_ERROR_HANDLER ) { + JpGraphError::Install("JpGraphErrObjectImg"); +} +else { + JpGraphError::Install("JpGraphErrObject"); +} + + +?> diff --git a/libs/jpgraph/jpgraph_error.php b/libs/jpgraph/jpgraph_error.php new file mode 100644 index 0000000..40b27c2 --- /dev/null +++ b/libs/jpgraph/jpgraph_error.php @@ -0,0 +1,156 @@ +Plot($datay,$datax); + $this->numpoints /= 2; + } +//--------------- +// 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(); + } + + // Method description + function Stroke($img,$xscale,$yscale) { + $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; + + 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; + } + + $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 + + +//=================================================== +// CLASS ErrorLinePlot +// Description: Combine a line and error plot +// THIS IS A DEPRECATED PLOT TYPE JUST KEPT FOR +// BACKWARD COMPATIBILITY +//=================================================== +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); + } + +//--------------- +// PUBLIC METHODS + function 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); + } +} // Class + + +//=================================================== +// CLASS LineErrorPlot +// Description: Combine a line and error plot +//=================================================== +class LineErrorPlot extends ErrorPlot { + public $line=null; +//--------------- +// 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); + } + +//--------------- +// PUBLIC METHODS + function 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); + } +} // Class + + +/* EOF */ +?> \ No newline at end of file diff --git a/libs/jpgraph/jpgraph_flags.php b/libs/jpgraph/jpgraph_flags.php new file mode 100644 index 0000000..a15bae4 --- /dev/null +++ b/libs/jpgraph/jpgraph_flags.php @@ -0,0 +1,376 @@ + 'afgh', + 'Republic of Angola' => 'agla', + 'Republic of Albania' => 'alba', + 'Alderney' => 'alde', + 'Democratic and Popular Republic of Algeria' => 'alge', + 'Territory of American Samoa' => 'amsa', + 'Principality of Andorra' => 'andr', + 'British Overseas Territory of Anguilla' => 'angu', + 'Antarctica' => 'anta', + 'Argentine Republic' => 'arge', + 'League of Arab States' => 'arle', + 'Republic of Armenia' => 'arme', + 'Aruba' => 'arub', + 'Commonwealth of Australia' => 'astl', + 'Republic of Austria' => 'aust', + 'Azerbaijani Republic' => 'azer', + 'Bangladesh' => 'bngl', + 'British Antarctic Territory' => 'bant', + 'Kingdom of Belgium' => 'belg', + 'British Overseas Territory of Bermuda' => 'berm', + 'Commonwealth of the Bahamas' => 'bhms', + 'Kingdom of Bahrain' => 'bhrn', + 'Republic of Belarus' => 'blru', + 'Republic of Bolivia' => 'blva', + 'Belize' => 'blze', + 'Republic of Benin' => 'bnin', + 'Republic of Botswana' => 'bots', + 'Federative Republic of Brazil' => 'braz', + 'Barbados' => 'brbd', + 'British Indian Ocean Territory' => 'brin', + 'Brunei Darussalam' => 'brun', + 'Republic of Burkina' => 'bufa', + 'Republic of Bulgaria' => 'bulg', + 'Republic of Burundi' => 'buru', + 'Overseas Territory of the British Virgin Islands' => 'bvis', + 'Central African Republic' => 'cafr', + 'Kingdom of Cambodia' => 'camb', + 'Republic of Cameroon' => 'came', + 'Dominion of Canada' => 'cana', + 'Caribbean Community' => 'cari', + 'Republic of Cape Verde' => 'cave', + 'Republic of Chad' => 'chad', + 'Republic of Chile' => 'chil', + 'Peoples Republic of China' => 'chin', + 'Territory of Christmas Island' => 'chms', + 'Commonwealth of Independent States' => 'cins', + 'Cook Islands' => 'ckis', + 'Republic of Colombia' => 'clmb', + 'Territory of Cocos Islands' => 'cois', + 'Commonwealth' => 'comn', + 'Union of the Comoros' => 'como', + 'Republic of the Congo' => 'cong', + 'Republic of Costa Rica' => 'corc', + 'Republic of Croatia' => 'croa', + 'Republic of Cuba' => 'cuba', + 'British Overseas Territory of the Cayman Islands' => 'cyis', + 'Republic of Cyprus' => 'cypr', + 'The Czech Republic' => 'czec', + 'Kingdom of Denmark' => 'denm', + 'Republic of Djibouti' => 'djib', + 'Commonwealth of Dominica' => 'domn', + 'Dominican Republic' => 'dore', + 'Republic of Ecuador' => 'ecua', + 'Arab Republic of Egypt' => 'egyp', + 'Republic of El Salvador' => 'elsa', + 'England' => 'engl', + 'Republic of Equatorial Guinea' => 'eqgu', + 'State of Eritrea' => 'erit', + 'Republic of Estonia' => 'estn', + 'Ethiopia' => 'ethp', + 'European Union' => 'euun', + 'British Overseas Territory of the Falkland Islands' => 'fais', + 'International Federation of Vexillological Associations' => 'fiav', + 'Republic of Fiji' => 'fiji', + 'Republic of Finland' => 'finl', + 'Territory of French Polynesia' => 'fpol', + 'French Republic' => 'fran', + 'Overseas Department of French Guiana' => 'frgu', + 'Gabonese Republic' => 'gabn', + 'Republic of the Gambia' => 'gamb', + 'Republic of Georgia' => 'geor', + 'Federal Republic of Germany' => 'germ', + 'Republic of Ghana' => 'ghan', + 'Gibraltar' => 'gibr', + 'Hellenic Republic' => 'grec', + 'State of Grenada' => 'gren', + 'Overseas Department of Guadeloupe' => 'guad', + 'Territory of Guam' => 'guam', + 'Republic of Guatemala' => 'guat', + 'The Bailiwick of Guernsey' => 'guer', + 'Republic of Guinea' => 'guin', + 'Republic of Haiti' => 'hait', + 'Hong Kong Special Administrative Region' => 'hokn', + 'Republic of Honduras' => 'hond', + 'Republic of Hungary' => 'hung', + 'Republic of Iceland' => 'icel', + 'International Committee of the Red Cross' => 'icrc', + 'Republic of India' => 'inda', + 'Republic of Indonesia' => 'indn', + 'Republic of Iraq' => 'iraq', + 'Republic of Ireland' => 'irel', + 'Organization of the Islamic Conference' => 'isco', + 'Isle of Man' => 'isma', + 'State of Israel' => 'isra', + 'Italian Republic' => 'ital', + 'Jamaica' => 'jama', + 'Japan' => 'japa', + 'The Bailiwick of Jersey' => 'jers', + 'Hashemite Kingdom of Jordan' => 'jord', + 'Republic of Kazakhstan' => 'kazk', + 'Republic of Kenya' => 'keny', + 'Republic of Kiribati' => 'kirb', + 'State of Kuwait' => 'kuwa', + 'Kyrgyz Republic' => 'kyrg', + 'Republic of Latvia' => 'latv', + 'Lebanese Republic' => 'leba', + 'Kingdom of Lesotho' => 'lest', + 'Republic of Liberia' => 'libe', + 'Principality of Liechtenstein' => 'liec', + 'Republic of Lithuania' => 'lith', + 'Grand Duchy of Luxembourg' => 'luxe', + 'Macao Special Administrative Region' => 'maca', + 'Republic of Macedonia' => 'mace', + 'Republic of Madagascar' => 'mada', + 'Republic of the Marshall Islands' => 'mais', + 'Republic of Mali' => 'mali', + 'Federation of Malaysia' => 'mals', + 'Republic of Malta' => 'malt', + 'Republic of Malawi' => 'malw', + 'Overseas Department of Martinique' => 'mart', + 'Islamic Republic of Mauritania' => 'maur', + 'Territorial Collectivity of Mayotte' => 'mayt', + 'United Mexican States' => 'mexc', + 'Federated States of Micronesia' => 'micr', + 'Midway Islands' => 'miis', + 'Republic of Moldova' => 'mold', + 'Principality of Monaco' => 'mona', + 'Republic of Mongolia' => 'mong', + 'British Overseas Territory of Montserrat' => 'mont', + 'Kingdom of Morocco' => 'morc', + 'Republic of Mozambique' => 'moza', + 'Republic of Mauritius' => 'mrts', + 'Union of Myanmar' => 'myan', + 'Republic of Namibia' => 'namb', + 'North Atlantic Treaty Organization' => 'nato', + 'Republic of Nauru' => 'naur', + 'Turkish Republic of Northern Cyprus' => 'ncyp', + 'Netherlands Antilles' => 'nean', + 'Kingdom of Nepal' => 'nepa', + 'Kingdom of the Netherlands' => 'neth', + 'Territory of Norfolk Island' => 'nfis', + 'Federal Republic of Nigeria' => 'ngra', + 'Republic of Nicaragua' => 'nica', + 'Republic of Niger' => 'nigr', + 'Niue' => 'niue', + 'Commonwealth of the Northern Mariana Islands' => 'nmar', + 'Province of Northern Ireland' => 'noir', + 'Nordic Council' => 'nord', + 'Kingdom of Norway' => 'norw', + 'Territory of New Caledonia and Dependencies' => 'nwca', + 'New Zealand' => 'nwze', + 'Organization of American States' => 'oast', + 'Organization of African Unity' => 'oaun', + 'International Olympic Committee' => 'olym', + 'Sultanate of Oman' => 'oman', + 'Islamic Republic of Pakistan' => 'paks', + 'Republic of Palau' => 'pala', + 'Independent State of Papua New Guinea' => 'pang', + 'Republic of Paraguay' => 'para', + 'Republic of Peru' => 'peru', + 'Republic of the Philippines' => 'phil', + 'British Overseas Territory of the Pitcairn Islands' => 'piis', + 'Republic of Poland' => 'pola', + 'Republic of Portugal' => 'port', + 'Commonwealth of Puerto Rico' => 'purc', + 'State of Qatar' => 'qata', + 'Russian Federation' => 'russ', + 'Romania' => 'rmna', + 'Republic of Rwanda' => 'rwan', + 'Kingdom of Saudi Arabia' => 'saar', + 'Republic of San Marino' => 'sama', + 'Nordic Sami Conference' => 'sami', + 'Sark' => 'sark', + 'Scotland' => 'scot', + 'Principality of Seborga' => 'sebo', + 'Republic of Serbia' => 'serb', + 'Republic of Sierra Leone' => 'sile', + 'Republic of Singapore' => 'sing', + 'Republic of Korea' => 'skor', + 'Republic of Slovenia' => 'slva', + 'Somali Republic' => 'smla', + 'Republic of Somaliland' => 'smld', + 'Republic of South Africa' => 'soaf', + 'Solomon Islands' => 'sois', + 'Kingdom of Spain' => 'span', + 'Secretariat of the Pacific Community' => 'spco', + 'Democratic Socialist Republic of Sri Lanka' => 'srla', + 'Saint Lucia' => 'stlu', + 'Republic of the Sudan' => 'suda', + 'Republic of Suriname' => 'surn', + 'Slovak Republic' => 'svka', + 'Kingdom of Sweden' => 'swdn', + 'Swiss Confederation' => 'swit', + 'Syrian Arab Republic' => 'syra', + 'Kingdom of Swaziland' => 'szld', + 'Republic of China' => 'taiw', + 'Taiwan' => 'taiw', + 'Republic of Tajikistan' => 'tajk', + 'United Republic of Tanzania' => 'tanz', + 'Kingdom of Thailand' => 'thal', + 'Autonomous Region of Tibet' => 'tibe', + 'Turkmenistan' => 'tkst', + 'Togolese Republic' => 'togo', + 'Tokelau' => 'toke', + 'Kingdom of Tonga' => 'tong', + 'Tristan da Cunha' => 'trdc', + 'Tromelin' => 'tris', + 'Republic of Tunisia' => 'tuns', + 'Republic of Turkey' => 'turk', + 'Tuvalu' => 'tuva', + 'United Arab Emirates' => 'uaem', + 'Republic of Uganda' => 'ugan', + 'Ukraine' => 'ukrn', + 'United Kingdom of Great Britain' => 'unkg', + 'United Nations' => 'unna', + 'United States of America' => 'unst', + 'Oriental Republic of Uruguay' => 'urgy', + 'Virgin Islands of the United States' => 'usvs', + 'Republic of Uzbekistan' => 'uzbk', + 'State of the Vatican City' => 'vacy', + 'Republic of Vanuatu' => 'vant', + 'Bolivarian Republic of Venezuela' => 'venz', + 'Republic of Yemen' => 'yemn', + 'Democratic Republic of Congo' => 'zare', + 'Republic of Zimbabwe' => 'zbwe' ) ; + + + private $iFlagCount = -1; + private $iFlagSetMap = array( + 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); + } + + function GetNum() { + return $this->iFlagCount; + } + + function GetImgByName($aName,&$outFullName) { + $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."); + } + } + + 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.'); + } + } + + function GetIdxByName($aName,&$outFullName) { + + 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\"."); + } + } +} + + + + +?> \ No newline at end of file diff --git a/libs/jpgraph/jpgraph_gantt.php b/libs/jpgraph/jpgraph_gantt.php new file mode 100644 index 0000000..69fc0d1 --- /dev/null +++ b/libs/jpgraph/jpgraph_gantt.php @@ -0,0 +1,3803 @@ +vgrid = new LineProperty(); + } + + function Hide($aF=true) { + $this->iShow=!$aF; + } + + function Show($aF=true) { + $this->iShow=$aF; + } + + // Specify font + function SetFont($aFFamily,$aFStyle=FS_NORMAL,$aFSize=10) { + $this->iFFamily = $aFFamily; + $this->iFStyle = $aFStyle; + $this->iFSize = $aFSize; + } + + function SetStyle($aStyle) { + $this->iStyle = $aStyle; + } + + function SetColumnMargin($aLeft,$aRight) { + $this->iLeftColMargin = $aLeft; + $this->iRightColMargin = $aRight; + } + + function SetFontColor($aFontColor) { + $this->iFontColor = $aFontColor; + } + + function SetColor($aColor) { + $this->iColor = $aColor; + } + + function SetBackgroundColor($aColor) { + $this->iBackgroundColor = $aColor; + } + + function SetColTitles($aTitles,$aWidth=null) { + $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]); + } + } + } + } + + 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=''; + 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]; + } + } + + // Adjust headers left, right or centered + function SetHeaderAlign($aAlign) { + $this->iHeaderAlign=$aAlign; + } + + function Stroke($aImg,$aXLeft,$aYTop,$aXRight,$aYBottom,$aUseTextHeight=false) { + + 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); + + if( $n == 0 ) + return; + + $x = $aXLeft; + $h = $this->iHeight; + $yTop = $aUseTextHeight ? $aYBottom-$h-$this->iTopColMargin-$this->iBottomColMargin : $aYTop ; + + if( $h < 0 ) { + JpGraphError::RaiseL(6001); +//('Internal error. Height for ActivityTitles is < 0'); + } + + $aImg->SetLineWeight(1); + // Set background color + $aImg->SetColor($this->iBackgroundColor); + $aImg->FilledRectangle($aXLeft,$yTop,$aXRight,$aYBottom-1); + + 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->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); + } + } +} + + +//=================================================== +// CLASS GanttGraph +// Description: Main class to handle gantt graphs +//=================================================== +class GanttGraph extends Graph { + 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 $iSimpleFont = FF_FONT1,$iSimpleFontSize=11; + private $iSimpleStyle=GANTT_RDIAG,$iSimpleColor='yellow',$iSimpleBkgColor='red'; + private $iSimpleProgressBkgColor='gray',$iSimpleProgressColor='darkgreen'; + private $iSimpleProgressStyle=GANTT_SOLID; +//--------------- +// CONSTRUCTOR + // Create a new gantt graph + function GanttGraph($aWidth=0,$aHeight=0,$aCachedName="",$aTimeOut=0,$aInline=true) { + + // 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); + + // Default margins + $this->img->SetMargin(15,17,25,15); + + $this->hgrid = new HorizontalGridLine(); + + $this->scale->ShowHeaders(GANTT_HWEEK|GANTT_HDAY); + $this->SetBox(); + } + +//--------------- +// PUBLIC METHODS + + // + + function SetSimpleFont($aFont,$aSize) { + $this->iSimpleFont = $aFont; + $this->iSimpleFontSize = $aSize; + } + + function SetSimpleStyle($aBand,$aColor,$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); + } + } + + // 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; + + 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 what headers should be shown + function ShowHeaders($aFlg) { + $this->scale->ShowHeaders($aFlg); + } + + // Specify the fraction of the font height that should be added + // as vertical margin + function SetLabelVMarginFactor($aVal) { + $this->iLabelVMarginFactor = $aVal; + } + + // Synonym to the method above + function SetVMarginFactor($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; + } + } + } + + // 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."); + } + + // 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); + } + + // 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; + } + + // 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; + } + + 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; + } + + // 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; + } + + // 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]'); + } + + $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); + } + + // Create a new auto sized canvas if the user hasn't specified a size + // The size is determined by what scale the user has choosen and hence + // the minimum width needed to display the headers. Some margins are + // 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; + + // 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 : + $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; + } + + // 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 ; + } + + // 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( $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 ; + } + + // 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->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 + + // 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)); + + // Add the width of the vertivcal divider line + $titlewidth += $this->scale->divider->iWeight*2; + + + // 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 + // column. This is used when we autosize the columns where we need + // 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; + } + + // Stroke the gantt chart + 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); + + // Should we autoscale dates? + + if( !$this->scale->IsRangeSet() ) { + list($min,$max) = $this->GetBarMinMax(); + $this->scale->SetRange($min,$max); + } + + $this->scale->AdjustStartEndDay(); + + // 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))); + + $this->scale->SetLabelWidth($maxwidth+$this->scale->divider->iWeight);//*(1+$this->iLabelHMarginFactor)); + + if( !$_csim ) { + $this->StrokePlotArea(); + if( $this->iIconDepth == DEPTH_BACK ) { + $this->StrokeIcons(); + } + } + + $this->scale->Stroke(); + + 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++; + } + + // Stroke Grid line + $this->hgrid->Stroke($this->img,$this->scale); + + $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); + } + + $this->StrokeTitles(); + + if( !$_csim ) { + $this->StrokeConstrains(); + $this->footer->Stroke($this->img); + + + 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); + } + } + } + + function StrokeConstrains() { + $n = count($this->iObj); + + // 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; + + $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; + + // 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); + } + } + } + } + } + + function GetCSIMAreas() { + if( !$this->iHasStroked ) + $this->Stroke(_CSIM_SPECIALFILE); + + $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; + } +} + +//=================================================== +// 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); + +class PredefIcons { + private $iBuiltinIcon = null, $iLen = -1 ; + + function GetLen() { + 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])); + } + + 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=' ; + + //========================================================== + // 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' ; + + //========================================================== + // 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=' ; + + //========================================================== + // 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=' ; + + //========================================================== + // 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==' ; + + //========================================================== + // 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' ; + + //========================================================== + // 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' ; + + //========================================================== + // 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); + } +} + +//=================================================== +// Global cache for builtin images +//=================================================== +$_gPredefIcons = new PredefIcons(); + +//=================================================== +// CLASS IconImage +// Description: Holds properties for an icon image +//=================================================== +class IconImage { + private $iGDImage=null; + private $iWidth,$iHeight; + 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 GetWidth() { + return round($this->iScale*$this->iWidth); + } + + function GetHeight() { + return round($this->iScale*$this->iHeight); + } + + function SetAlign($aX='left',$aY='center') { + + $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->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); + } +} + + +//=================================================== +// CLASS TextProperty +// Description: Holds properties for a text +//=================================================== +class TextProperty { + public $iShow=true; + public $csimtarget='',$csimwintarget='',$csimalt=''; + private $iFFamily=FF_FONT1,$iFStyle=FS_NORMAL,$iFSize=10; + private $iColor="black"; + private $iText=""; + private $iHAlign="left",$iVAlign="bottom"; + +//--------------- +// CONSTRUCTOR + function TextProperty($aTxt='') { + $this->iText = $aTxt; + } + +//--------------- +// PUBLIC METHODS + function Set($aTxt) { + $this->iText = $aTxt; + } + + function SetCSIMTarget($aTarget,$aAltText='',$aWinTarget='') { + if( is_string($aTarget) ) + $aTarget = array($aTarget); + $this->csimtarget=$aTarget; + + if( is_string($aWinTarget) ) + $aWinTarget = array($aWinTarget); + $this->csimwintarget=$aWinTarget; + + if( is_string($aAltText) ) + $aAltText = array($aAltText); + $this->csimalt=$aAltText; + + } + + function SetCSIMAlt($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; + } + + 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 + // 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); + } + } + + // 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)); + } + } + + // Get total height of text + function GetHeight($aImg) { + $aImg->SetFont($this->iFFamily,$this->iFStyle,$this->iFSize); + return $aImg->GetFontHeight(); + } + + // Unhide/hide the text + function Show($aShow=true) { + $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]); + } + } + } + } +} + +//=================================================== +// CLASS HeaderProperty +// Description: Data encapsulating class to hold property +// for each type of the scale headers +//=================================================== +class HeaderProperty { + public $grid; + public $iShowLabels=true,$iShowGrid=true; + public $iTitleVertMargin=3,$iFFamily=FF_FONT0,$iFStyle=FS_NORMAL,$iFSize=8; + public $iStyle=0; + public $iFrameColor="black",$iFrameWeight=1; + public $iBackgroundColor="white"; + public $iWeekendBackgroundColor="lightgray",$iSundayTextColor="red"; // these are only used with day scale + public $iTextColor="black"; + public $iLabelFormStr="%d"; + public $iIntervall = 1; + +//--------------- +// CONSTRUCTOR + function HeaderProperty() { + $this->grid = new LineProperty(); + } + +//--------------- +// PUBLIC METHODS + function Show($aShow=true) { + $this->iShowLabels = $aShow; + } + + function SetIntervall($aInt) { + $this->iIntervall = $aInt; + } + + function GetIntervall() { + return $this->iIntervall ; + } + + function SetFont($aFFamily,$aFStyle=FS_NORMAL,$aFSize=10) { + $this->iFFamily = $aFFamily; + $this->iFStyle = $aFStyle; + $this->iFSize = $aFSize; + } + + function SetFontColor($aColor) { + $this->iTextColor = $aColor; + } + + function GetFontHeight($aImg) { + $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(); + } + + function GetStrWidth($aImg,$aStr) { + $aImg->SetFont($this->iFFamily,$this->iFStyle,$this->iFSize); + return $aImg->GetTextWidth($aStr); + } + + function SetStyle($aStyle) { + $this->iStyle = $aStyle; + } + + function SetBackgroundColor($aColor) { + $this->iBackgroundColor=$aColor; + } + + function SetFrameWeight($aWeight) { + $this->iFrameWeight=$aWeight; + } + + function SetFrameColor($aColor) { + $this->iFrameColor=$aColor; + } + + // Only used by day scale + function SetWeekendColor($aColor) { + $this->iWeekendBackgroundColor=$aColor; + } + + // Only used by day scale + function SetSundayFontColor($aColor) { + $this->iSundayTextColor=$aColor; + } + + function SetTitleVertMargin($aMargin) { + $this->iTitleVertMargin=$aMargin; + } + + function SetLabelFormatString($aStr) { + $this->iLabelFormStr=$aStr; + } + + function SetFormatString($aStr) { + $this->SetLabelFormatString($aStr); + } + + +} + +//=================================================== +// CLASS GanttScale +// Description: Responsible for calculating and showing +// the scale in a gantt chart. This includes providing methods for +// converting dates to position in the chart as well as stroking the +// date headers (days, week, etc). +//=================================================== +class GanttScale { + public $minute,$hour,$day,$week,$month,$year; + public $divider,$dividerh,$tableTitle; + public $iStartDate=-1,$iEndDate=-1; + // Number of gantt bar position (n.b not necessariliy the same as the number of bars) + // we could have on bar in position 1, and one bar in position 5 then there are two + // bars but the number of bar positions is 5 + public $actinfo; + public $iTopPlotMargin=10,$iBottomPlotMargin=15; + public $iVertLines=-1; + public $iVertHeaderSize=-1; + // The width of the labels (defaults to the widest of all labels) + private $iLabelWidth; + // Out image to stroke the scale to + 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(); + + $this->minute = new HeaderProperty(); + $this->minute->SetIntervall(15); + $this->minute->SetLabelFormatString('i'); + $this->minute->SetFont(FF_FONT0); + $this->minute->grid->SetColor("gray"); + + $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->day = new HeaderProperty(); + $this->day->grid->SetColor("gray"); + $this->day->SetLabelFormatString('l'); + + $this->week = new HeaderProperty(); + $this->week->SetLabelFormatString("w%d"); + $this->week->SetFont(FF_FONT1); + + $this->month = new HeaderProperty(); + $this->month->SetFont(FF_FONT1,FS_BOLD); + + $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 + // 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); + + // 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; + } + + // Have a range been specified? + function IsRangeSet() { + return $this->iStartDate!=-1 && $this->iEndDate!=-1; + } + + // Should the layout be from top or even? + function SetVertLayout($aLayout) { + $this->iVertLayout = $aLayout; + } + + // Which locale should be used? + function SetDateLocale($aLocale) { + $this->iDateLocale->Set($aLocale); + } + + // Number of days we are showing + function GetNumberOfDays() { + 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; + } + + // 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; + } + + // 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); + } + + // Do we show min scale? + function IsDisplayMinute() { + return $this->minute->iShowLabels; + } + + // Do we show day scale? + function IsDisplayHour() { + return $this->hour->iShowLabels; + } + + + // Do we show day scale? + function IsDisplayDay() { + return $this->day->iShowLabels; + } + + // Do we show week scale? + function IsDisplayWeek() { + return $this->week->iShowLabels; + } + + // Do we show month scale? + function IsDisplayMonth() { + return $this->month->iShowLabels; + } + + // Do we show year scale? + function IsDisplayYear() { + return $this->year->iShowLabels; + } + + // Specify spacing (in percent of bar height) between activity bars + function SetVertSpacing($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); + } + + + // Adjust the start and end date so they fit to beginning/ending + // of the week taking the specified week start day into account. + function AdjustStartEndDay() { + + 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; + } + } + + // Specify background for the table title area (upper left corner of the table) + function SetTableTitleBackground($aColor) { + $this->iTableHeaderBackgroundColor = $aColor; + } + +/////////////////////////////////////// +// 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; + } + + // Get width (in pixels) for a single day + function GetDayWidth() { + return ($this->GetPlotWidth()-$this->iLabelWidth+1)/$this->GetNumberOfDays(); + } + + // Get width (in pixels) for a single hour + function GetHourWidth() { + return $this->GetDayWidth() / 24 ; + } + + function GetMinuteWidth() { + return $this->GetHourWidth() / 60 ; + } + + // Nuber of days in a year + function GetNumDaysInYear($aYear) { + 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; + } + + // 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; + } + + // Get current year + function GetYear($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]; + } + + // Get day in month + function GetMonthDayNbr($aDate) { + return 0+strftime("%d",$aDate); + } + + // Get day in year + function GetYearDayNbr($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;; + } + + // 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); + } + } + + // 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)."); + } + + + // 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; + } + + // 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); + + $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.'); + } + + + $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(); + + } + + 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); + + // 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; + } + + // 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); + + $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); + } + + $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; + } + + + // 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); + + $x = $xt; + $img->SetTextAlign("center"); + $day = date('w',$this->iStartDate); + $datestamp = $this->iStartDate; + + $doback = !($this->hour->iShowLabels || $this->minute->iShowLabels); + + 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); + } + + $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( $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; + } + + 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; + } + + // 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); + + $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( $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; + } + + // 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; + + 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); + + + // 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'; + } + + $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 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); + + // 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; + } +} + + +//=================================================== +// CLASS GanttConstraint +// Just a structure to store all the values for a constraint +//=================================================== +class GanttConstraint { + public $iConstrainRow; + public $iConstrainType; + public $iConstrainColor; + 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; + } +} + + +//=================================================== +// CLASS GanttPlotObject +// The common signature for a Gantt object +//=================================================== +class GanttPlotObject { + public $title,$caption; + public $csimarea='',$csimtarget='',$csimwintarget='',$csimalt=''; + 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(); + } + + function GetCSIMArea() { + 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"); + } + + $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"); + } + $this->csimalt=$aAlt; + } + + function SetConstrain($aRow,$aType,$aColor='black',$aArrowSize=ARROW_S2,$aArrowType=ARROWT_SOLID) { + $this->constraints[] = new GanttConstraint($aRow, $aType, $aColor, $aArrowSize, $aArrowType); + } + + function SetConstrainPos($xt,$yt,$xb,$yb) { + $this->iConstrainPos = array($xt,$yt,$xb,$yb); + } + + /* + function GetConstrain() { + return array($this->iConstrainRow,$this->iConstrainType); + } + */ + + function GetMinDate() { + return $this->iStart; + } + + function GetMaxDate() { + return $this->iStart; + } + + function SetCaptionMargin($aMarg) { + $this->iCaptionMargin=$aMarg; + } + + function GetAbsHeight($aImg) { + return 0; + } + + function GetLineNbr() { + return $this->iVPos; + } + + function SetLabelLeftMargin($aOff) { + $this->iLabelLeftMargin=$aOff; + } + + function StrokeActInfo($aImg,$aScale,$aYPos) { + $cols=array(); + $aScale->actinfo->GetColStart($aImg,$cols,true); + $this->title->Stroke($aImg,$cols,$aYPos); + } +} + +//=================================================== +// CLASS Progress +// 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; + + function Set($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 SetFillColor($aColor) { + $this->iFillColor = $aColor; + } + + function SetHeight($aHeight) { + $this->iHeight = $aHeight; + } +} + +DEFINE('GANTT_HGRID1',0); +DEFINE('GANTT_HGRID2',1); + +//=================================================== +// CLASS HorizontalGridLine +// Responsible for drawinf horizontal gridlines and filled alternatibg rows +//=================================================== +class HorizontalGridLine { + private $iGraph=NULL; + private $iRowColor1 = '', $iRowColor2 = ''; + private $iShow=false; + 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 Show($aShow=true) { + $this->iShow = $aShow; + } + + function SetRowFillColor($aColor1,$aColor2='') { + $this->iRowColor1 = $aColor1; + $this->iRowColor2 = $aColor2; + } + + function SetStart($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->iStart === 0 ) { + $xt = $aImg->left_margin-1; + } + else { + $xt = round($aScale->TranslateDate($aScale->iStartDate))+1; + } + + $xb = $aImg->width-$aImg->right_margin; + + $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); + } +} + + +//=================================================== +// CLASS GanttBar +// Responsible for formatting individual gantt bars +//=================================================== +class GanttBar extends GanttPlotObject { + public $progress; + public $leftMark,$rightMark; + private $iEnd; + private $iHeightFactor=0.5; + 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(); + } + +//--------------- +// PUBLIC METHODS + function SetShadow($aShadow=true,$aColor="gray") { + $this->iShadow=$aShadow; + $this->iShadowColor=$aColor; + } + + function GetMaxDate() { + return $this->iEnd; + } + + function SetHeight($aHeight) { + $this->iHeightFactor = $aHeight; + } + + function SetColor($aColor) { + $this->iFrameColor = $aColor; + } + + function SetFillColor($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; + } + + 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); + + // 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); + + + $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); + + // 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"; + } + } + } + + // Check if the bar is totally outside the current scale range + if( $en < $aScale->iStartDate || $st > $aScale->iEndDate ) + return; + + + // 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 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); + } + } +} + +//=================================================== +// CLASS MileStone +// Responsible for formatting individual milestones +//=================================================== +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; + } + +//--------------- +// PUBLIC METHODS + + function GetAbsHeight($aImg) { + 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); + + $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); + + $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"; + } + } + } + + 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(); + } +} + + +//=================================================== +// CLASS GanttVLine +// Responsible for formatting individual milestones +//=================================================== + +class TextPropertyBelow extends TextProperty { + function TextPropertyBelow($aTxt='') { + parent::TextProperty($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); + } +} + +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); + } + +//--------------- +// PUBLIC METHODS + + 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; + } + + function SetTitleMargin($aMarg) { + $this->title_margin = $aMarg; + } + + 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); + } +} + +//=================================================== +// CLASS LinkArrow +// 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)); + 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 SetColor($aColor) { + $this->iColor = $aColor; + } + + function SetSize($aSize) { + $this->iSize = $aSize; + } + + function SetType($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; + } + } +} + +//=================================================== +// CLASS GanttLink +// Handles the drawing of a link line between 2 points +//=================================================== + +class GanttLink { + private $ix1,$ix2,$iy1,$iy2; + private $iPathType=2,$iPathExtend=15; + 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 SetPos($x1,$y1,$x2,$y2) { + $this->ix1 = $x1; + $this->ix2 = $x2; + $this->iy1 = $y1; + $this->iy2 = $y2; + } + + function SetPath($aPath) { + $this->iPathType = $aPath; + } + + function SetColor($aColor) { + $this->iColor = $aColor; + } + + function SetArrow($aSize,$aType=ARROWT_SOLID) { + $this->iArrowSize = $aSize; + $this->iArrowType = $aType; + } + + function SetWeight($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 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); + } +} + +// +?> diff --git a/libs/jpgraph/jpgraph_gb2312.php b/libs/jpgraph/jpgraph_gb2312.php new file mode 100644 index 0000000..352ef53 --- /dev/null +++ b/libs/jpgraph/jpgraph_gb2312.php @@ -0,0 +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 ); + + 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; + } + +} // END Class + +?> diff --git a/libs/jpgraph/jpgraph_gradient.php b/libs/jpgraph/jpgraph_gradient.php new file mode 100644 index 0000000..40a0d42 --- /dev/null +++ b/libs/jpgraph/jpgraph_gradient.php @@ -0,0 +1,423 @@ +img = $img; + } + + + function SetNumColors($aNum) { + $this->numcolors=$aNum; + } +//--------------- +// 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? + 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; + + 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_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_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_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; + + case GRAD_LEFT_REFLECTION: + $steps1 = ceil(0.3*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_color2 = array(min(255,$from_color[0]+$m), + min(255,$from_color[1]+$m), min(255,$from_color[2]+$m)); + + $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; + + case GRAD_RIGHT_REFLECTION: + $steps1 = ceil(0.7*abs($xr-$xl)); + $delta = $xr>=$xl ? 1 : -1; + + $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; + } + + $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)); + + $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_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; + + 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); + + 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; + } + + 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 + // with a gradient. Can be used for filled line plots. + // Please note that this is NOT a generic gradient polygon fill + // 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++]; + } + + $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 + // 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; + } + } +} // Class + +?> diff --git a/libs/jpgraph/jpgraph_iconplot.php b/libs/jpgraph/jpgraph_iconplot.php new file mode 100644 index 0000000..6bdf7c0 --- /dev/null +++ b/libs/jpgraph/jpgraph_iconplot.php @@ -0,0 +1,190 @@ +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; + } + + function SetPos($aX,$aY) { + $this->iX=$aX; + $this->iY=$aY; + } + + function CreateFromString($aStr) { + $this->iImgString = $aStr; + } + + function SetScalePos($aX,$aY) { + $this->iScalePosX = $aX; + $this->iScalePosY = $aY; + } + + function SetScale($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 ; + } + + 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; + } + + function PreStrokeAdjust($aGraph) { + // Nothing to do ... + } + + function DoLegend($aGraph) { + // Nothing to do ... + } + + function Max() { + return array(false,false); + } + + + // The next four function are framework function tht gets called + // from Gantt and is not menaiungfull in the context of Icons but + // they must be implemented to avoid errors. + function GetMaxDate() { return false; } + function GetMinDate() { return false; } + function GetLineNbr() { return 0; } + function GetAbsHeight() {return 0; } + + + function Min() { + return array(false,false); + } + + function StrokeMargin(&$aImg) { + return true; + } + + function Stroke($aImg,$axscale,$ayscale) { + $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))); + } + } + + function GetWidthHeight() { + $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); + } + + 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)); + } + + 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( $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 new file mode 100644 index 0000000..f324b51 --- /dev/null +++ b/libs/jpgraph/jpgraph_imgtrans.php @@ -0,0 +1,223 @@ +gdImg = $aGdImg; + } + + // -------------------------------------------------------------------- + // _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."); + } + + $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); + + if( $aBorder ) { + $colidx = $crgb->Allocate($aBorder); + imagerectangle($newgdh,0,0,$ww-1,$hh-1,$colidx); + } + + $mid = round($w * $aHorizonPos); + + $last=$h; + for($y=0; $y < $h; ++$y) { + + $yp = $h-$y-1; + $yt = floor($yp * $aHorizon / ($aSkewDist + $yp)); + + if( !$aQuality ) { + if( $last <= $yt ) continue ; + $last = $yt; + } + + 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; + } + + 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)); + } + + imagesetpixel($newgdh,$xt,$syt,$colidx); + } + + $set[$yt] = true; + } + + return $newgdh; + } + + // -------------------------------------------------------------------- + // _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); + + // 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); + + if( $aBorder ) { + $colidx = $crgb->Allocate($aBorder); + imagerectangle($newgdh,0,0,$ww-1,$hh-1,$colidx); + } + + $mid = round($h * $aHorizonPos); + + $last = -1; + for($x=0; $x < $w-1; ++$x) { + $xt = floor($x * $aHorizon / ($aSkewDist + $x)); + if( !$aQuality ) { + if( $last >= $xt ) continue ; + $last = $xt; + } + + for($y=0; $y < $h; ++$y) { + $yp = $h-$y-1; + $yt = ($yp-$mid) * $aSkewDist / ($aSkewDist + $x); + + 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 ; + + 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); + } + + $set[$xt] = true; + } + + return $newgdh; + } + + // -------------------------------------------------------------------- + // Skew image for the apperance of a 3D effect + // 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 + // convergence and perspective line. + // + // The function returns the GD handle of the transformed image + // leaving the original image untouched. + // + // Parameters: + // * $aGdImg, GD handle to the image to be transformed + // * $aHorizon, Distance to the horizon + // * $aSkewDist, Distance from the horizon point of convergence + // 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 + // 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, + // false = keep the image the same size as the original image + // * $aFillColor, Background fill color in the image + // * $aHiQuality, true=performa some interpolation that improves + // 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 + // 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); + } + + 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); + + } + +} + + +?> \ No newline at end of file diff --git a/libs/jpgraph/jpgraph_led.php b/libs/jpgraph/jpgraph_led.php new file mode 100644 index 0000000..7fa3ba8 --- /dev/null +++ b/libs/jpgraph/jpgraph_led.php @@ -0,0 +1,316 @@ + '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 +DEFINE('LEDC_RED', 0); +DEFINE('LEDC_GREEN', 1); +DEFINE('LEDC_BLUE', 2); +DEFINE('LEDC_YELLOW', 3); +DEFINE('LEDC_GRAY', 4); +DEFINE('LEDC_CHOCOLATE', 5); +DEFINE('LEDC_PERU', 6); +DEFINE('LEDC_GOLDENROD', 7); +DEFINE('LEDC_KHAKI', 8); +DEFINE('LEDC_OLIVE', 9); +DEFINE('LEDC_LIMEGREEN', 10); +DEFINE('LEDC_FORESTGREEN', 11); +DEFINE('LEDC_TEAL', 12); +DEFINE('LEDC_STEELBLUE', 13); +DEFINE('LEDC_NAVY', 14); +DEFINE('LEDC_INVERTGRAY', 15); +// ! It correlate with two-dimensional array $iColorSchema + +//======================================================================== +// CLASS DigitalLED74 +// Description: +// Construct a number as an image that looks like LED numbers in a +// 7x4 digital matrix +//======================================================================== +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 + ), + + $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) + ), + + $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; + } + + 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 StrokeNumber($aValStr, $aColor = 0) { + if($aColor < 0 || $aColor >= sizeof($this->iColorSchema)) + $aColor = 0; + + if(($n = strlen($aValStr)) == 0) { + $aValStr = ' '; + $n = 1; + } + + 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); + } + + $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); + } + + $number_img->Headers(); + $number_img->Stream(); + } +} +?> diff --git a/libs/jpgraph/jpgraph_line.php b/libs/jpgraph/jpgraph_line.php new file mode 100644 index 0000000..26eb622 --- /dev/null +++ b/libs/jpgraph/jpgraph_line.php @@ -0,0 +1,632 @@ +Plot($datay,$datax); + $this->mark = new PlotMark() ; + } +//--------------- +// PUBLIC METHODS + + // Set style, filled or open + function SetFilled($aFlag=true) { + JpGraphError::RaiseL(10001);//('LinePlot::SetFilled() is deprecated. Use SetFillColor()'); + } + + function SetBarCenter($aFlag=true) { + $this->barcenter=$aFlag; + } + + function SetStyle($aStyle) { + $this->line_style=$aStyle; + } + + function SetStepStyle($aFlag=true) { + $this->step_style = $aFlag; + } + + function SetColor($aColor) { + parent::SetColor($aColor); + } + + function SetFillFromYMin($f=true) { + $this->fillFromMin = $f ; + } + + function SetFillColor($aColor,$aFilled=true) { + $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; + } + + 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); + } + } + } + + 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); + } + + // 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(); + } + } + + function SetFastStroke($aFlg=true) { + $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; + + $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); + } + + 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; + + 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; + + // Bail out if no data points + if( $startpoint == $numpoints ) + 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; + + $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); + + $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); + + $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'; + + 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; + + $this->StrokeDataValue($img,$this->coords[0][$pnts],$xt,$yt); + + ++$pnts; + } + + 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); + } + } + + if(!empty($this->filledAreas)) { + + $minY = $yscale->Translate($yscale->GetMinVal()); + $factor = ($this->step_style ? 4 : 2); + + 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; + + $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); + + $areaCoords = array(); + } + } + + 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: +//=================================================== +class AccLinePlot extends Plot { + protected $plots=null,$nbrplots=0; + private $iStartEndZero=true; +//--------------- +// CONSTRUCTOR + function AccLinePlot($plots) { + $this->plots = $plots; + $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) + } + } + + for($i=0; $i < $this->nbrplots; ++$i ) { + $this->LineInterpolate($this->plots[$i]->coords[0]); + } + } + +//--------------- +// PUBLIC METHODS + function Legend($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); + } + + 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); + } + + // 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(); + } + + } + + function SetInterpolateMode($aIntMode) { + $this->iStartEndZero=$aIntMode; + } + + // Replace all '-' with an interpolated value. We use straightforward + // linear interpolation. If the data starts with one or several '-' they + // 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; + } + } + + 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 + // it wouldn't be possible to create an acc line 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; + } + } +} // Class + + +/* EOF */ +?> diff --git a/libs/jpgraph/jpgraph_log.php b/libs/jpgraph/jpgraph_log.php new file mode 100644 index 0000000..381a0ee --- /dev/null +++ b/libs/jpgraph/jpgraph_log.php @@ -0,0 +1,283 @@ +LinearScale($min,$max,$type); + $this->ticks = new LogTicks(); + $this->name = 'log'; + } + +//---------------- +// 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); + } + + // Relative translate (don't include offset) usefull when we just want + // 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); + } + + // 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); + } + + function GetMaxVal() { + 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)); + } + + $this->Update($img,$smin,$smax); + } +//--------------- +// PRIVATE METHODS +} // Class + +//=================================================== +// CLASS LogTicks +// Description: +//=================================================== +class LogTicks extends Ticks{ + private $label_logtype=LOGLABELS_MAGNITUDE; + private $ticklabels_pos = array(); +//--------------- +// CONSTRUCTOR + function LogTicks() { + } +//--------------- +// PUBLIC METHODS + function IsSpecified() { + return true; + } + + function SetLabelLogType($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; + } + + 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.'); + } + + function SetXLabelOffset($dummy) { + // For log scales we dont care about XLabel offset + } + + // Draw ticks on image "img" using scale "scale". The axis absolute + // position in the image is specified in pos, i.e. for an x-axis + // 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); + } + + $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_mgraph.php b/libs/jpgraph/jpgraph_mgraph.php new file mode 100644 index 0000000..d701371 --- /dev/null +++ b/libs/jpgraph/jpgraph_mgraph.php @@ -0,0 +1,387 @@ +iWidth = $aWidth; + $this->iHeight = $aHeight; + } + + // Specify background fill color for the combined graph + function SetFillColor($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; + } + + // Specify a background image blend + function SetBackgroundImageMix($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; + + 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; + } + + // 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); + } + + $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; + + $bkgimg = $this->_loadBkgImage(); + // Background width & Heoght + $bw = imagesx($bkgimg); + $bh = imagesy($bkgimg); + // Canvas width and height + $cw = imagesx($this->img); + $ch = imagesy($this->img); + + 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); + } + + function _imageCp($aSrcImg,$x,$y,$fx,$fy,$w,$h,$mix=100) { + imagecopymerge($this->img,$aSrcImg,$x,$y,$fx,$fy,$w,$h,$mix); + } + + 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."); + } + } + } + + 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); + } + + 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); + } + + 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); + } + + 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); + } + + function SetMargin($lm,$rm,$tm,$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"); + } + + 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"); + } + } + + // 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."); + } + + 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; + + // User specified width,height overrides + if( $this->iWidth !== NULL ) $w = $this->iWidth; + if( $this->iHeight!== NULL ) $h = $this->iHeight; + + $this->_imageCreate($w,$h); + $this->iRGB = new RGB($this->img); + + $this->_setcolor($this->iFillColor); + $this->_filledRectangle(0,0,$w-1,$h-1); + + $this->_strokeBackgroundImage(); + + if( $this->iDoFrame ) { + $this->_setColor($this->iFrameColor); + $this->iLineWeight=$this->iFrameWeight; + $this->_rectangle(0,0,$w-1,$h-1); + } + + // 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]); + } + + // Output image + if( $aFileName == _IMG_HANDLER ) { + return $this->img; + } + else { + $this->Headers(); + $this->Stream($aFileName); + } + } +} + +?> diff --git a/libs/jpgraph/jpgraph_pie.php b/libs/jpgraph/jpgraph_pie.php new file mode 100644 index 0000000..0a9c57d --- /dev/null +++ b/libs/jpgraph/jpgraph_pie.php @@ -0,0 +1,1439 @@ + 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 + protected $pie_border=true,$pie_interior_border=true; + public $value; + protected $ishadowcolor='',$ishadowdrop=4; + protected $ilabelposadj=1; + protected $legendcsimtargets = array(),$legendcsimwintargets = array(); + protected $legendcsimalts = array(); + protected $adjusted_data = array(); + public $guideline = null; + 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(); + } + +//--------------- +// PUBLIC METHODS + function SetCenter($x,$y=0.5) { + $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; + } + + // Adjuste the distance between labels and labels and pie + function SetGuideLinesAdjust($aVFactor,$aRFactor=0.8) { + $this->iGuideVFactor=$aVFactor; + $this->iGuideLineRFactor=$aRFactor; + } + + function SetColor($aColor) { + $this->color = $aColor; + } + + function SetSliceColors($aColors) { + $this->setslicecolors = $aColors; + } + + function SetShadow($aColor='darkgray',$aDropWidth=4) { + $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); + } + + function GetCSIMareas() { + return $this->csimareas; + } + + 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; + + $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; + } + + //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; + + // 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"; + } + } + + + function SetTheme($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; + } + + function ExplodeAll($radius=20) { + $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; + } + + 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; + } + + // Set text labels for slices + function SetLabels($aLabels,$aLblPosAdj="auto") { + $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; + } + + // Deprecated. + function SetValueType($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; + } + + // 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); + + 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]; + + // 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!"); + + // 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]); + } + + 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; + } + + + 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 + + // 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; + + 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); + } + + // 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->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); + + if( $this->explode_all ) + for($i=0; $i < $n; ++$i) + $this->explode_radius[$i]=$this->explode_r; + + // 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; + + if( $d < 0.00001 ) continue; + + $la = 2*M_PI - (abs($angle2-$angle1)/2.0+$angle1); + + $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; + + $_sa = round($angle1*180/M_PI); + $_ea = round($angle2*180/M_PI); + + // 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); + } + } + } + + //-------------------------------------------------------------------------------- + // This is the main loop to draw each cake slice + //-------------------------------------------------------------------------------- + + // Set up the accumulated sum, start angle for first slice and border color + $accsum=0; + $angle2 = $this->startangle; + $img->SetColor($this->color); + + // 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) { + + // $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); + } + else + $this->la[$i] = 2*M_PI - (abs($angle2-$angle1)/2.0+$angle1); + + $_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
    "; + + // 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]; + + // 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 : ""; + + // 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; + + // If we are not just drawing the labels then draw this cake slice + if( $aaoption !== 2 ) { + + + $_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)
    "; + + + // 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 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); + } + + } + +//--------------- +// PRIVATE METHODS + + function NormAngle($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; + } + + function StrokeGuideLabels($img,$xc,$yc,$radius) { + $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 + + // 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( 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"; + } + } + } + */ + + //----------------------------------------------------------------------- + // Step 2 of the algorithm is use the clusters and draw the labels + // and guidelines + //----------------------------------------------------------------------- + + // 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); + + // Number of clusters found + $nc = count($clusters); + + // Walk through all the clusters + for($i=0; $i < $nc; ++$i) { + + // Start angle and number of slices in this cluster + $csize = $clusters[$i][1]; + $a = $this->la[$clusters[$i][0]]; + $q = $this->Quadrant($a); + + // 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; + } + + // 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; + + // 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); + + // 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)); + + // 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; + } + } + + } + 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]); + } + } + } + + // Position the labels of each slice + function StrokeLabel($label,$img,$xc,$yc,$a,$r) { + + // 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 ) { + + $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->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); + + 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 +// filled circle in the center +//=================================================== +class PiePlotC extends PiePlot { + 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 SetMid($aTitle,$aColor='white',$aSize=0.5) { + $this->midtitle->Set($aTitle); + + $this->imidsize = $aSize ; + $this->imidcolor = $aColor ; + } + + function SetMidTitle($aTitle) { + $this->midtitle->Set($aTitle); + } + + function SetMidSize($aSize) { + $this->imidsize = $aSize ; + } + + function SetMidColor($aColor) { + $this->imidcolor = $aColor ; + } + + function SetMidCSIM($aTarget,$aAlt='',$aWinTarget='') { + $this->middlecsimtarget = $aTarget; + $this->middlecsimwintarget = $aWinTarget; + $this->middlecsimalt = $aAlt; + } + + 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; + + $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; + } + + // 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; + + // 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; + } + + 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; + } + + // 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"; + + // Straight line to outer circle + $xp = floor($radius*cos($sa)+$xc); + $yp = floor($yc-$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"; + + // 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; + + $xc = round($this->posx*$img->width); + $yc = round($this->posy*$img->height); + + $radius = floor($this->radius * min($img->width,$img->height)) ; + + + 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)); + } + + $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( !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); + } + + } + + 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"; + } + + function StrokeLabel($label,$img,$xc,$yc,$a,$r) { + + if( $this->ilabelposadj === 'auto' ) + $this->ilabelposadj = (1-$this->imidsize)/2+$this->imidsize; + + parent::StrokeLabel($label,$img,$xc,$yc,$a,$r); + + } + +} + + +//=================================================== +// CLASS PieGraph +// Description: +//=================================================== +class PieGraph extends Graph { + 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)); + } + +//--------------- +// PUBLIC METHODS + function Add($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; + } + } + } + + function SetAntiAliasing($aFlg=true) { + $this->pieaa = $aFlg; + } + + function SetColor($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]); + + } + } + } + } + + // 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); + + // 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; + + $n = count($this->plots); + + 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; + + $this->img->CreateImgCanvas(2*$w,2*$h); + + $this->img->SetColor( $this->margin_color ); + $this->img->FilledRectangle(0,0,2*$w-1,2*$h-1); + + // 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->StrokeIcons(); + + 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->plots[$i]->Stroke($this->img,1); + + if( $this->plots[$i]->posx > 1 ) + $this->plots[$i]->posx /= 2 ; + if( $this->plots[$i]->posy > 1 ) + $this->plots[$i]->posy /= 2 ; + } + + $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)); + + $this->img->img = $oldimg ; + $this->img->width = $w ; + $this->img->height = $h ; + + for($i=0; $i < $n; ++$i) { + $this->plots[$i]->Stroke($this->img,2); // Stroke labels + $this->plots[$i]->Legend($this); + } + + } + else { + + if( !$_csim ) { + if( $this->background_image != "" ) { + $this->StrokeFrameBackground(); + } + else { + $this->StrokeFrame(); + } + } + + $this->StrokeIcons(); + + for($i=0; $i < $n; ++$i) { + $this->plots[$i]->Stroke($this->img); + $this->plots[$i]->Legend($this); + } + } + + $this->legend->Stroke($this->img); + $this->footer->Stroke($this->img); + $this->StrokeTitles(); + + if( !$_csim ) { + + // Stroke texts + if( $this->texts != null ) { + $n = count($this->texts); + for($i=0; $i < $n; ++$i ) { + $this->texts[$i]->Stroke($this->img); + } + } + + 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); + } + } + } +} // Class + +/* EOF */ +?> diff --git a/libs/jpgraph/jpgraph_pie3d.php b/libs/jpgraph/jpgraph_pie3d.php new file mode 100644 index 0000000..8b6c1f4 --- /dev/null +++ b/libs/jpgraph/jpgraph_pie3d.php @@ -0,0 +1,923 @@ +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 + + // Set label arrays + function SetLegends($aLegend) { + $this->legends = array_reverse(array_slice($aLegend,0,count($this->data))); + } + + function SetSliceColors($aColors) { + $this->setslicecolors = $aColors; + } + + function Legend($aGraph) { + 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; + } + + // 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.'); + } + + // 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; + } + + 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; + + //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"; + + //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( !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; + } + + + // Distance from the pie to the labels + function SetLabelMargin($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; + } + + // Set color of hint line to label for each slice + function SetLabelHintColor($c) { + $this->labelhintcolor=$c; + } + + function SetHeight($aHeight) { + $this->iThickness = $aHeight; + } + + +// 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; + + if( $a == 360 ) $a=0; + return $a; + } + + + +// 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(); + + // 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[] is the points for the overall slice and + // pt[] is the points for the top pie + + // Angular step when approximating the arc with a polygon train. + $step = 0.05; + + 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; + } + + $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=$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; + } + + $pt[] = $xc+$w; + $pt[] = $yc; + + $p[] = $xc+$w; + $p[] = $z+$yc; + $p[] = $xc+$w; + $p[] = $yc; + $p[] = $xc; + $p[] = $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; + + } + 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; + } + + $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*$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); + + 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; + } + + $p[] = $xc-$w; + $p[] = $z+$yc; + $p[] = $xc-$w; + $p[] = $yc; + $p[] = $xc; + $p[] = $yc; + + $pt[] = $xc-$w; + $pt[] = $z+$yc; + $pt[] = $xc-$w; + $pt[] = $yc; + + for( $a=M_PI-$step; $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 >= 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 = 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); + } + + $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; + } + +// Draw a 3D Pie + function Pie3D($aaoption,$img,$data,$colors,$xc,$yc,$d,$angle,$z, + $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); + + + 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; + + 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)); + + 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; + + $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) ) { + + 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 <= 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); + + // 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"); + } + + // 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->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 + + // Position the labels of each slice + function StrokeLabels($label,$img,$a,$xp,$yp,$z) { + $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); + + + // 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 new file mode 100644 index 0000000..5c6fc29 --- /dev/null +++ b/libs/jpgraph/jpgraph_plotband.php @@ -0,0 +1,635 @@ +x=$aX; + $this->y=$aY; + $this->w=$aWidth; + $this->h=$aHeight; + $this->xe=$aX+$aWidth-1; + $this->ye=$aY+$aHeight-1; + } +} + +//===================================================================== +// Class RectPattern +// Base class for pattern hierarchi that is used to display patterned +// bands on the graph. Any subclass that doesn't override Stroke() +// must at least implement method DoPattern($aImg) which is responsible +// for drawing the pattern onto the graph. +//===================================================================== +class RectPattern { + protected $color; + protected $weight; + protected $rect=null; + protected $doframe=true; + 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 SetBackground($aBackgroundColor) { + $this->iBackgroundColor=$aBackgroundColor; + } + + function SetPos($aRect) { + $this->rect = $aRect; + } + + function ShowFrame($aShow=true) { + $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; + + } + + function Stroke($aImg) { + 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); + } + + $aImg->SetColor($this->color); + $aImg->SetLineWeight($this->weight); + + // 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); + } + +} + + +//===================================================================== +// Class RectPatternSolid +// Implements a solid band +//===================================================================== +class RectPatternSolid extends RectPattern { + + function RectPatternSolid($aColor="black",$aWeight=1) { + parent::RectPattern($aColor,$aWeight); + } + + function DoPattern($aImg) { + $aImg->SetColor($this->color); + $aImg->FilledRectangle($this->rect->x,$this->rect->y, + $this->rect->xe,$this->rect->ye); + } +} + +//===================================================================== +// Class RectPatternHor +// Implements horizontal line pattern +//===================================================================== +class RectPatternHor extends RectPattern { + + function RectPatternHor($aColor="black",$aWeight=1,$aLineSpacing=7) { + parent::RectPattern($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; + } + } +} + +//===================================================================== +// Class RectPatternVert +// Implements vertical line pattern +//===================================================================== +class RectPatternVert extends RectPattern { + + function RectPatternVert($aColor="black",$aWeight=1,$aLineSpacing=7) { + parent::RectPattern($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; + } + } +} + + +//===================================================================== +// Class RectPatternRDiag +// Implements right diagonal pattern +//===================================================================== +class RectPatternRDiag extends RectPattern { + + function RectPatternRDiag($aColor="black",$aWeight=1,$aLineSpacing=12) { + parent::RectPattern($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); + + 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; + } + + 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 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); + + 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; + } + } +} + +//===================================================================== +// Class RectPattern3DPlane +// Implements "3D" plane pattern +//===================================================================== +class RectPattern3DPlane extends RectPattern { + private $alpha=50; // Parameter that specifies the distance + // to "simulated" horizon in pixel from the + // 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 SetHorizon($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; + + // 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 + + // 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; + } + } +} + +//===================================================================== +// Class RectPatternCross +// Vert/Hor crosses +//===================================================================== +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 SetOrder($aDepth) { + $this->vert->SetOrder($aDepth); + $this->hor->SetOrder($aDepth); + } + + function SetPos($aRect) { + parent::SetPos($aRect); + $this->vert->SetPos($aRect); + $this->hor->SetPos($aRect); + } + + function SetDensity($aDens) { + $this->vert->SetDensity($aDens); + $this->hor->SetDensity($aDens); + } + + function DoPattern($aImg) { + $this->vert->DoPattern($aImg); + $this->hor->DoPattern($aImg); + } +} + +//===================================================================== +// Class RectPatternDiagCross +// Vert/Hor crosses +//===================================================================== + +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 SetOrder($aDepth) { + $this->left->SetOrder($aDepth); + $this->right->SetOrder($aDepth); + } + + function SetPos($aRect) { + parent::SetPos($aRect); + $this->left->SetPos($aRect); + $this->right->SetPos($aRect); + } + + function SetDensity($aDens) { + $this->left->SetDensity($aDens); + $this->right->SetDensity($aDens); + } + + function DoPattern($aImg) { + $this->left->DoPattern($aImg); + $this->right->DoPattern($aImg); + } + +} + +//===================================================================== +// Class RectPatternFactory +// Factory class for rectangular pattern +//===================================================================== +class RectPatternFactory { + function RectPatternFactory() { + // 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; + } +} + + +//===================================================================== +// Class PlotBand +// Factory class which is used by the client. +// It is responsible for factoring the corresponding pattern +// concrete class. +//===================================================================== +class PlotBand { + public $depth; // Determine if band should be over or under the plots + 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; + } + + // Set position. aRect contains absolute image coordinates + function SetPos($aRect) { + assert( $this->prect != null ) ; + $this->prect->SetPos($aRect); + } + + function ShowFrame($aFlag=true) { + $this->prect->ShowFrame($aFlag); + } + + // Set z-order. In front of pplot or in the back + function SetOrder($aDepth) { + $this->depth=$aDepth; + } + + function SetDensity($aDens) { + $this->prect->SetDensity($aDens); + } + + function GetDir() { + return $this->dir; + } + + function GetMin() { + return $this->min; + } + + function GetMax() { + return $this->max; + } + + function PreStrokeAdjust($aGraph) { + // 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(); + + // 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()); + + $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(); + + // 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()); + + $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_plotmark.inc.php b/libs/jpgraph/jpgraph_plotmark.inc.php new file mode 100644 index 0000000..c8a381a --- /dev/null +++ b/libs/jpgraph/jpgraph_plotmark.inc.php @@ -0,0 +1,497 @@ +title = new Text(); + $this->title->Hide(); + $this->csimareas = ''; + $this->type=-1; + } +//--------------- +// 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; + } + + function SetCallback($aFunc) { + $this->iFormatCallback = $aFunc; + } + + function SetCallbackYX($aFunc) { + $this->iFormatCallback2 = $aFunc; + } + + function GetType() { + return $this->type; + } + + function SetColor($aColor) { + $this->color=$aColor; + } + + function SetFillColor($aFillColor) { + $this->fill_color = $aFillColor; + } + + function SetWeight($aWeight) { + $this->weight = $aWeight; + } + + // Synonym for SetWidth() + function SetSize($aWidth) { + $this->width=$aWidth; + } + + function SetWidth($aWidth) { + $this->width=$aWidth; + } + + function SetDefaultWidth() { + switch( $this->type ) { + case MARK_CIRCLE: + case MARK_FILLEDCIRCLE: + $this->width=4; + break; + default: + $this->width=7; + } + } + + function GetWidth() { + return $this->width; + } + + function Hide($aHide=true) { + $this->show = !$aHide; + } + + function Show($aShow=true) { + $this->show = $aShow; + } + + function SetCSIMAltVal($aY,$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=""; + 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 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->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( $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; + } + + 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; + + 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_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_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_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 ); + + // 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."\" "; + } + + 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; + } + + $weight = $this->weight; + $dx=round($width/2,0); + $dy=round($width/2,0); + $pts=0; + + 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 + + + +//======================================================================== +// CLASS ImgData +// 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 $anchor_x=0.5, $anchor_y=0.5 ; // Where is the center of the image + // 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])); + } + function GetAnchor() { + 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, +); +// 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); + } +} + +?> \ No newline at end of file diff --git a/libs/jpgraph/jpgraph_polar.php b/libs/jpgraph/jpgraph_polar.php new file mode 100644 index 0000000..d0398fb --- /dev/null +++ b/libs/jpgraph/jpgraph_polar.php @@ -0,0 +1,841 @@ +numpoints = $n/2; + $this->coord = $aData; + $this->mark = new PlotMark(); + } + + function SetWeight($aWeight) { + $this->iLineWeight = $aWeight; + } + + function SetColor($aColor){ + $this->iColor = $aColor; + } + + function SetFillColor($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; + } + // Set href targets for CSIM + function SetCSIMTargets($aTargets,$aAlts=null) { + $this->csimtargets=$aTargets; + $this->csimalts=$aAlts; + } + + // Get all created areas + function GetCSIMareas() { + return $this->csimareas; + } + + function SetLegend($aLegend,$aCSIM="",$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); + } + } + } + + 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; + } + + if( $this->iFillColor != '' ) { + $img->SetColor($this->iFillColor); + $img->FilledPolygon($p); + } + $img->SetLineWeight($this->iLineWeight); + $img->SetColor($this->iColor); + $img->Polygon($p,$this->iFillColor!=''); + } +} + +//-------------------------------------------------------------------------- +// class PolarAxis +//-------------------------------------------------------------------------- +class PolarAxis extends Axis { + private $angle_step=15,$angle_color='lightgray',$angle_label_color='black'; + private $angle_fontfam=FF_FONT1,$angle_fontstyle=FS_NORMAL,$angle_fontsize=10; + private $angle_fontcolor = 'navy'; + private $gridminor_color='lightgray',$gridmajor_color='lightgray'; + private $show_minor_grid = false, $show_major_grid = true ; + private $show_angle_mark=true, $show_angle_grid=true, $show_angle_label=true; + private $angle_tick_len=3, $angle_tick_len2=3, $angle_tick_color='black'; + private $show_angle_tick=true; + private $radius_tick_color='black'; + + function PolarAxis($img,$aScale) { + parent::Axis($img,$aScale); + } + + function ShowAngleDegreeMark($aFlg=true) { + $this->show_angle_mark = $aFlg; + } + + function SetAngleStep($aStep) { + $this->angle_step=$aStep; + } + + function HideTicks($aFlg=true,$aAngleFlg=true) { + parent::HideTicks($aFlg,$aFlg); + $this->show_angle_tick = !$aAngleFlg; + } + + function ShowAngleLabel($aFlg=true) { + $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 ; + } + + function SetAngleFont($aFontFam,$aFontStyle=FS_NORMAL,$aFontSize=10) { + $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; + } + + function SetGridColor($aMajorColor,$aMinorColor='',$aAngleColor='') { + if( $aMinorColor == '' ) + $aMinorColor = $aMajorColor; + if( $aAngleColor == '' ) + $aAngleColor = $aMajorColor; + + $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; + } + + // Private methods + function StrokeGrid($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 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; + + $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; + + $tl = $this->angle_tick_len ; // Outer len + $tl2 = $this->angle_tick_len2 ; // Interior len + + $this->img->SetColor($this->angle_tick_color); + $rot90 = $this->img->a == 90 ; + + 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; + } + } + } + + 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.')'); + } + + + 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 + // + $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; + } + + // 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; + } + } + + $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); + } +} + +class PolarScale extends LinearScale { + private $graph; + + function PolarScale($aMax=0,$graph) { + parent::LinearScale(0,$aMax,'x'); + $this->graph = $graph; + } + + function _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; + + $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); + + } + + 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; + + $x = cos( $aAngle/180 * M_PI ) * $aRad; + $y = sin( $aAngle/180 * M_PI ) * $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); + } +} + +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'); + } + + function SetDensity($aDense) { + $this->SetTickDensity(TICKD_NORMAL,$aDense); + } + + 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.'); + } + + 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"'); + } + + $this->axis = new PolarAxis($this->img,$this->scale); + $this->SetMargin(40,40,50,40); + } + + function SetType($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); + } + + // 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; + } + + 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); + + // 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; + + //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( $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 ) { + $this->axis->Stroke($pos); + $this->axis->StrokeAngleLabels($pos,$this->iType); + } + + if( !$_csim ) { + $this->StrokePlotBox(); + $this->footer->Stroke($this->img); + + // 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); + } + } + } +} + + + +?> diff --git a/libs/jpgraph/jpgraph_radar.php b/libs/jpgraph/jpgraph_radar.php new file mode 100644 index 0000000..b03df39 --- /dev/null +++ b/libs/jpgraph/jpgraph_radar.php @@ -0,0 +1,732 @@ +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; + + $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 { + + private $minor_step=1, $major_step=2; + private $xlabel_offset=0,$xtick_offset=0; + +//--------------- +// CONSTRUCTOR + function RadarLinearTicks() { + // Empty + } + +//--------------- +// PUBLIC METHODS + + + // Return major step size in world coordinates + function GetMajor() { + return $this->major_step; + } + + // Return minor step size in world coordinates + function GetMinor() { + 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; + } + + 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 + + // 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)); + + 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 +// Description: Implements axis for the radar graph +//=================================================== +class RadarAxis extends AxisPrototype { + public $title=null; + 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); + } +//--------------- +// PUBLIC METHODS + function SetTickLabels($aLabelArray,$aLabelColorArray=null) { + $this->ticks_label = $aLabelArray; + $this->ticks_label_colors = $aLabelColorArray; + } + + + // 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 + 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); + } +//--------------- +// 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)); + + // 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; + + 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 + + +//=================================================== +// CLASS RadarGrid +// Description: Draws grid for the radar graph +//=================================================== +class RadarGrid { //extends Grid { + private $type='solid'; + private $grid_color='#DDDDDD'; + private $show=false, $weight=1; + +//------------ +// CONSTRUCTOR + function RadarGrid() { + } + +// PUBLIC METHODS + function SetColor($aMajColor) { + $this->grid_color = $aMajColor; + } + + function SetWeight($aWeight) { + $this->weight=$aWeight; + } + + // Specify if grid should be dashed, dotted or solid + function SetLineStyle($aType) { + $this->type = $aType; + } + + // Decide if both major and minor grid should be displayed + function Show($aShowMajor=true) { + $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(); + } + } +} // Class + + +//=================================================== +// CLASS RadarPlot +// Description: Plot a radarplot +//=================================================== +class RadarPlot { + public $mark=null; + public $legend=""; + 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(); + } + +//--------------- +// PUBLIC METHODS + function Min() { + return Min($this->data); + } + + function Max() { + return Max($this->data); + } + + function SetLegend($legend) { + $this->legend=$legend; + } + + function SetLineStyle($aStyle) { + $this->linestyle=$aStyle; + } + + function SetLineWeight($w) { + $this->weight=$w; + } + + function SetFillColor($aColor) { + $this->fill_color = $aColor; + $this->fill = true; + } + + function SetFill($f=true) { + $this->fill = $f; + } + + function SetColor($aColor,$aFillColor=false) { + $this->color = $aColor; + if( $aFillColor ) { + $this->SetFillColor($aFillColor); + $this->fill = true; + } + } + + function GetCSIMareas() { + JpGraphError::RaiseL(18001); +//("Client side image maps not supported for RadarPlots."); + } + + 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]); + } + } + + } + +//--------------- +// PRIVATE METHODS + function GetCount() { + 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); + } + +} // Class + +//=================================================== +// CLASS RadarGraph +// Description: Main container for a radar graph +//=================================================== +class RadarGraph extends Graph { + public $grid,$axis=null; + private $posx,$posy; + 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 HideTickMarks($aFlag=true) { + $this->axis->scale->ticks->SupressTickMarks($aFlag); + } + + function ShowMinorTickmarks($aFlag=true) { + $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(); + } + + 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; + } + + function SetPlotSize($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"); + } + } + + function SetPos($px,$py=0.5) { + $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; + } + + function SetColor($c) { + $this->SetMarginColor($c); + } + + function SetTitles($title) { + $this->axis_title = $title; + } + + function Add($splot) { + $this->plots[]=$splot; + } + + 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); + } + + // 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); + } + + // 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( $this->background_image != "" ) { + $this->StrokeFrameBackground(); + } + else { + $this->StrokeFrame(); + } + $astep=2*M_PI/$nbrpnts; + + // Prepare legends + for($i=0; $i < $n; ++$i) + $this->plots[$i]->Legend($this); + $this->legend->Stroke($this->img); + $this->footer->Stroke($this->img); + + 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); + } + + // 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); + } + } +} // Class + +/* EOF */ +?> diff --git a/libs/jpgraph/jpgraph_regstat.php b/libs/jpgraph/jpgraph_regstat.php new file mode 100644 index 0000000..e94b4f1 --- /dev/null +++ b/libs/jpgraph/jpgraph_regstat.php @@ -0,0 +1,202 @@ +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'); + } + + // 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; + } + + // 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); + } + + // Return a single interpolated Y-value from an x value + function Interpolate($xpoint) { + + $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; + } + + // 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.'); + } + + + $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; + } +} + +//------------------------------------------------------------------------ +// CLASS Bezier +// 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/ + */ + 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 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); + } + + function GetPoint($mu) { + $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); + + 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); + } +} + +// EOF +?> diff --git a/libs/jpgraph/jpgraph_scatter.php b/libs/jpgraph/jpgraph_scatter.php new file mode 100644 index 0000000..3b25cb5 --- /dev/null +++ b/libs/jpgraph/jpgraph_scatter.php @@ -0,0 +1,231 @@ +iSize = $aSize; + $this->iArrowSize = $aArrowSize; + } + + function SetColor($aColor) { + $this->iColor = $aColor; + } + + function Stroke($aImg,$x,$y,$a) { + // 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); + + $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); + + $aImg->SetColor($this->iColor); + $aImg->Polygon($c); + $aImg->FilledPolygon($ca); + + $aImg->SetCenter($old_origin[0],$old_origin[1]); + $aImg->SetAngle($old_a); + } +} + +//=================================================== +// CLASS FieldPlot +// Description: Render a field plot +//=================================================== +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); + + $this->arrow = new FieldArrow(); + } + + function SetCallback($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; + + 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); + } + + $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); + } + } + + // 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); + } + } +} + +//=================================================== +// CLASS ScatterPlot +// Description: Render X and Y plots +//=================================================== +class ScatterPlot extends Plot { + public $mark = ''; + 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); + } + +//--------------- +// PUBLIC METHODS + function SetImpuls($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 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 ) { + + // 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->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); + } + + $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); + } + } +} // Class +/* EOF */ +?> \ No newline at end of file diff --git a/libs/jpgraph/jpgraph_stock.php b/libs/jpgraph/jpgraph_stock.php new file mode 100644 index 0000000..6afe3bb --- /dev/null +++ b/libs/jpgraph/jpgraph_stock.php @@ -0,0 +1,183 @@ +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; + } +//--------------- +// PUBLIC METHODS + + function SetColor($aColor,$aColor1='white',$aColor2='darkred',$aColor3='darkred') { + $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; + } + + function HideEndLines($aHide=true) { + $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); + } + + // 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; + + if( $exist_x ) + $xs=$this->coords[1][0]; + else + $xs=0; + + $ts = $this->iTupleSize; + $this->csimareas = ''; + for( $i=0; $i<$n; ++$i) { + + //If value is NULL, then don't draw a bar at all + if ($this->coords[0][$i] === null) continue; + + 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]); + + $dx = floor($this->iWidth/2); + $xl = $xt - $dx; + $xr = $xt + $dx; + + 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); + + 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 + function ModBox($img,$xscale,$yscale,$i,$xl,$xr,$neg) {} + +} // Class + +//=================================================== +// CLASS BoxPlot +//=================================================== +class BoxPlot extends StockPlot { + private $iPColor='black',$iNColor='white'; + function BoxPlot($datay,$datax=false) { + $this->iTupleSize=5; + parent::StockPlot($datay,$datax); + } + + function SetMedianColor($aPos,$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); + } +} + +/* EOF */ +?> \ No newline at end of file diff --git a/libs/jpgraph/jpgraph_ttf.inc.php b/libs/jpgraph/jpgraph_ttf.inc.php new file mode 100644 index 0000000..02050ee --- /dev/null +++ b/libs/jpgraph/jpgraph_ttf.inc.php @@ -0,0 +1,339 @@ +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; + } + + // 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; + } + + // 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; + } + + // 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; + } + + public static function heb_iso2uni($isoline) { + $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); + } +} + +//============================================================= +// CLASS TTF +// Description: Handle TTF font names and mapping and loading of +// font files +//============================================================= +class TTF { + private $font_files,$style_names; + +//--------------- +// CONSTRUCTOR + function TTF() { + + // 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 =>'' ) , + + /* 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 =>'' ), + + /* 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 =>'' ), + + /* Hebrew fonts */ + 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_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 =>'' ), + ); + } + +//--------------- +// 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]; + + 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 ($family >= FF_MINCHO && $family <= FF_PGOTHIC) { + $f = MBTTF_DIR.$f; + } else { + $f = TTF_DIR.$f; + } + + 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; + } +} // Class + + + +?> diff --git a/libs/jpgraph/jpgraph_utils.inc.php b/libs/jpgraph/jpgraph_utils.inc.php new file mode 100644 index 0000000..af76d3a --- /dev/null +++ b/libs/jpgraph/jpgraph_utils.inc.php @@ -0,0 +1,526 @@ +iFunc = $aFunc; + $this->iXFunc = $aXFunc; + } + + function E($aXMin,$aXMax,$aSteps=50) { + $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); + } +} + +//============================================================================= +// 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 */ + +); + + $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 ''; + } +} + + +//============================================================================= +// 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 + + +class DateScaleUtils { + public $iMin=0, $iMax=0; + + private $starthour,$startmonth, $startday, $startyear; + private $endmonth, $endyear, $endday; + private $tickPositions=array(),$minTickPositions=array(); + private $iUseWeeks = true; + + function UseWeekFormat($aFlg) { + $this->iUseWeeks = $aFlg; + } + + function doYearly($aType,$aMinor=false) { + $i=0; $j=0; + $m = $this->startmonth; + $y = $this->startyear; + + if( $this->startday == 1 ) { + $this->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; + } + } + + function doDaily($aType,$aMinor=false) { + $m = $this->startmonth; + $y = $this->startyear; + $d = $this->startday; + $h = $this->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; + } + } + + 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); + } + + 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; + } + } + + function doMonthly($aType,$aMinor=false) { + $monthcount=0; + $m = $this->startmonth; + $y = $this->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; + + // 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); + + break; + case DSUTILS_MONTH2: + if( $aMinor ) { + // Set minor tick at start of each month + $this->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; + } + + // 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); + } + + return array($this->tickPositions,$this->minTickPositions); + } + + function GetTicks($aData,$aType=1,$aMinor=false,$aEndPoints=false) { + $n = count($aData); + return $this->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; + + if( $this->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'))); + + $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); + } + } + } + } + } + + 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; + + 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]; + } + + // put a label at the very right data pos + if( $aEndPoints ) { + $tickPositions[$i] = $aData[$n-1]; + } + + return array($this->tickPositions,$this->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 + // 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. + // + // 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); + + // 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; + } +} + +?> \ No newline at end of file diff --git a/libs/jpgraph/lang/de.inc.php b/libs/jpgraph/lang/de.inc.php new file mode 100644 index 0000000..04725f7 --- /dev/null +++ b/libs/jpgraph/lang/de.inc.php @@ -0,0 +1,500 @@ +,) +$_jpg_messages = array( + +/* +** Headers wurden bereits gesendet - Fehler. Dies wird als HTML formatiert, weil es direkt als text zurueckgesendet wird +*/ +10 => array('
    JpGraph Fehler: +HTTP header wurden bereits gesendet.
    Fehler in der Datei %s in der Zeile %d.
    Erklrung:
    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 wrden und daher nur Mist dargestellt wrde).

    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 Zeilenumbrchen, 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 fr CACHE_DIR angegeben. Bitte gib einen Pfad CACHE_DIR in der Datei jpg-config.inc an.',0), +12 => array('Es wurde kein Pfad fr 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), + +/* +** jpgraph_bar +*/ + +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 fr ein Balkendiagramm (barplot) mssen numerisch sein. Du hast den Wert nr [%d] == %s angegeben.',2), +2005 => array('Du hast einen leeren Vektor fr die Schattierungsfarben im Balkendiagramm (barplot) angegeben.',0), +2006 => array('Unbekannte Position fr 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 fr die Schattierungsfarben im Balkendiagramm (barplot) angegeben.',0), +2014 => array('Die Anzahl der Datenpunkte jeder Datenreihe in AccBarPlot muss gleich sein.',0), + + +/* +** jpgraph_date +*/ + +3001 => array('Es ist nur mglich, entweder SetDateAlign() oder SetTimeAlign() zu benutzen, nicht beides!',0), + +/* +** jpgraph_error +*/ + +4002 => array('Fehler bei den Eingabedaten von LineErrorPlot. Die Anzahl der Datenpunkte mus ein Mehrfaches von drei sein!',0), + +/* +** jpgraph_flags +*/ + +5001 => array('Unbekannte Flaggen-Gre (%d).',1), +5002 => array('Der Flaggen-Index %s existiert nicht.',1), +5003 => array('Es wurde eine ungltige Ordnungszahl (%d) fr 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), + + +/* +** jpgraph_gantt +*/ + +6001 => array('Interner Fehler. Die Hhe fr ActivityTitles ist < 0.',0), +6002 => array('Es drfen keine negativen Werte fr die Gantt-Diagramm-Dimensionen angegeben werden. Verwende 0, wenn die Dimensionen automatisch ermittelt werden sollen.',0), +6003 => array('Ungltiges Format fr 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('Ungltiges Format fr 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 Aktivitten mit Termin. [GetBarMinMax() start >= n]',0), +6007 => array('Plausibilttsprfung fr die automatische Gantt-Diagramm-Gre schlug fehl. Entweder die Breite (=%d) oder die Hhe (=%d) ist grer als MAX_GANTTIMG_SIZE. Dies kann mglicherweise durch einen falschen Wert bei einer Aktivitt hervorgerufen worden sein.',2), +6008 => array('Du hast eine Bedingung angegeben von Reihe=%d bis Reihe=%d, die keine Aktivitt hat.',2), +6009 => array('Unbekannter Bedingungstyp von Reihe=%d bis Reihe=%d',2), +6010 => array('Ungltiger Icon-Index fr das eingebaute Gantt-Icon [%d]',1), +6011 => array('Argument fr IconImage muss entweder ein String oder ein Integer sein.',0), +6012 => array('Unbekannter Typ bei der Gantt-Objekt-Title-Definition.',0), +6015 => array('Ungltige vertikale Position %d',1), +6016 => array('Der eingegebene Datums-String (%s) fr eine Gantt-Aktivitt kann nicht interpretiert werden. Versichere Dich, dass es ein gltiger Datumsstring ist, z.B. 2005-04-23 13:30',1), +6017 => array('Unbekannter Datumstyp in GanttScale (%s).',1), +6018 => array('Intervall fr 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) fr die Minuten ist zu klein, um angezeigt zu werden. Bitte benutze die automatische Grenermittlung oder vergrere die Breite des Diagramms.',1), +6020 => array('Das Intervall fr 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 fr 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 Hhe (%d) fr GanttBar ist nicht im zulssigen Bereich.',1), +6029 => array('Der Offset fr die vertikale Linie muss im Bereich [0,1] sein.',0), +6030 => array('Unbekannte Pfeilrichtung fr eine Verbindung.',0), +6031 => array('Unbekannter Pfeiltyp fr eine Verbindung.',0), +6032 => array('Interner Fehler: Unbekannter Pfadtyp (=%d) fr eine Verbindung.',1), + +/* +** jpgraph_gradient +*/ + +7001 => array('Unbekannter Gradiententyp (=%d).',1), + +/* +** jpgraph_iconplot +*/ + +8001 => array('Der Mix-Wert fr das Icon muss zwischen 0 und 100 sein.',0), +8002 => array('Die Ankerposition fr Icons muss entweder "top", "bottom", "left", "right" oder "center" sein.',0), +8003 => array('Es ist nicht mglich, gleichzeitig ein Bild und eine Landesflagge fr dasselbe Icon zu definieren',0), +8004 => array('Wenn Du Landesflaggen benutzen willst, musst Du die Datei "jpgraph_flags.php" hinzufgen (per include).',0), + +/* +** jpgraph_imgtrans +*/ + +9001 => array('Der Wert fr die Bildtransformation ist auerhalb des zulssigen 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 fr 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 knnen nicht fr logarithmische Achsen verwendet werden.',0), +11003 => array('Deine Daten enthalten nicht-numerische Werte.',0), +11004 => array('Skalierungsfehler fr die logarithmische Achse. Es gibt ein Problem mit den Daten der Achse. Der grte Wert muss grer sein als Null. Es ist mathematisch nicht mglich, einen Wert gleich Null in der Skala zu haben.',0), +11005 => array('Das Tick-Intervall fr die logarithmische Achse ist nicht definiert. Lsche 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 Qualitt der Truetype-Schriften sehr schlecht, wenn man Truetype-Schriften mit Truecolor-Bildern verwendet.",0), +12002 => array('Ungltiger Dateiname fr MGraph::SetBackgroundImage() : %s. Die Datei muss eine gltige Dateierweiterung haben (jpg,gif,png), wenn die automatische Typerkennung verwendet wird.',1), +12003 => array('Unbekannte Dateierweiterung (%s) in MGraph::SetBackgroundImage() fr Dateiname: %s',2), +12004 => array('Das Bildformat des Hintergrundbildes (%s) wird von Deiner System-Konfiguration nicht untersttzt. ',1), +12005 => array('Das Hintergrundbild kann nicht gelesen werden: %s',1), +12006 => array('Es wurden ungltige Gren fr Breite oder Hhe beim Erstellen des Bildes angegeben, (Breite=%d, Hhe=%d)',2), +12007 => array('Das Argument fr MGraph::Add() ist nicht gltig fr GD.',0), +12008 => array('Deine PHP- (und GD-lib-) Installation scheint keine bekannten Bildformate zu untersttzen.',0), +12009 => array('Deine PHP-Installation untersttzt das gewhlte Bildformat nicht: %s',1), +12010 => array('Es konnte kein Bild als Datei %s erzeugt werden. berprfe, ob Du die entsprechenden Schreibrechte im aktuellen Verzeichnis hast.',1), +12011 => array('Es konnte kein Truecolor-Bild erzeugt werden. berprfe, ob Du wirklich die GD2-Bibliothek installiert hast.',0), +12012 => array('Es konnte kein Bild erzeugt werden. berprfe, ob Du wirklich die GD2-Bibliothek installiert hast.',0), + +/* +** jpgraph_pie3d +*/ + +14001 => array('Pie3D::ShowBorder(). Missbilligte Funktion. Benutze Pie3D::SetEdge(), um die Ecken der Tortenstcke 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('Tortenstck-Startwinkel muss zwischen 0 und 360 Grad sein.',0), +14005 => array('Pie3D Interner Fehler: Versuch, zweimal zu umhllen bei der Suche nach dem Startindex.',0,), +14006 => array('Pie3D Interner Fehler: Z-Sortier-Algorithmus fr 3D-Tortendiagramme funktioniert nicht einwandfrei (2). Versuch, zweimal zu umhllen beim Erstellen des Bildes.',0), +14007 => array('Die Breite fr das 3D-Tortendiagramm ist 0. Gib eine Breite > 0 an.',0), + +/* +** jpgraph_pie +*/ + +15001 => array('PiePLot::SetTheme() Unbekannter Stil: %s',1), +15002 => array('Argument fr PiePlot::ExplodeSlice() muss ein Integer-Wert sein',0), +15003 => array('Argument fr PiePlot::Explode() muss ein Vektor mit Integer-Werten sein.',0), +15004 => array('Tortenstck-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 fr Tortendiagramm muss entweder als Bruch [0, 0.5] der Bildgre 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 fr Tortendiagramme muss entweder 0 or 1 sein (nicht %d).',1), +15009 => array('Ungltiges Tortendiagramm. Die Summe aller Daten ist Null.',0), +15010 => array('Die Summe aller Daten ist Null.',0), +15011 => array('Um Bildtransformationen benutzen zu knnen, muss die Datei jpgraph_imgtrans.php eingefgt werden (per include).',0), + +/* +** jpgraph_plotband +*/ + +16001 => array('Die Dichte fr das Pattern muss zwischen 1 und 100 sein. (Du hast %f eingegeben)',1), +16002 => array('Es wurde keine Position fr das Pattern angegeben.',0), +16003 => array('Unbekannte Pattern-Definition (%d)',0), +16004 => array('Der Mindeswert fr das PlotBand ist grer als der Maximalwert. Bitte korrigiere dies!',0), + + +/* +** jpgraph_polar +*/ + +17001 => array('PolarPlots mssen eine gerade Anzahl von Datenpunkten haben. Jeder Datenpunkt ist ein Tupel (Winkel, Radius).',0), +17002 => array('Unbekannte Ausrichtung fr X-Achsen-Titel. (%s)',1), +//17003 => array('Set90AndMargin() wird fr PolarGraph nicht untersttzt.',0), +17004 => array('Unbekannter Achsentyp fr PolarGraph. Er muss entweder \'lin\' oder \'log\' sein.',0), + +/* +** jpgraph_radar +*/ + +18001 => array('ClientSideImageMaps werden fr RadarPlots nicht untersttzt.',0), +18002 => array('RadarGraph::SupressTickMarks() sollte nicht mehr verwendet werden. Benutze stattdessen HideTickMarks().',0), +18003 => array('Ungltiger Achsentyp fr RadarPlot (%s). Er muss entweder \'lin\' oder \'log\' sein.',1), +18004 => array('Die RadarPlot-Gre muss zwischen 0.1 und 1 sein. (Dein Wert=%f)',1), +18005 => array('RadarPlot: nicht untersttzte 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), + +/* +** jpgraph_regstat +*/ + +19001 => array('Spline: Anzahl der X- und Y-Koordinaten muss gleich sein.',0), +19002 => array('Ungltige Dateneingabe fr 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 mssen die gleiche Anzahl von X und Y Datenpunkten haben.',0), +20002 => array('Bei Fieldplots muss ein Winkel fr jeden X und Y Datenpunkt angegeben werden.',0), +20003 => array('Scatterplots mssen die gleiche Anzahl von X- und Y-Datenpunkten haben.',0), + +/* +** jpgraph_stock +*/ + +21001 => array('Die Anzahl der Datenwerte fr Stock-Charts mssen 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 fr den Marker "%s"',1), +23003 => array('Ein Dateiname muss angegeben werden, wenn Du den Marker-Typ auf MARK_IMG setzt.',0), + +/* +** jpgraph_utils +*/ + +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), + +/* +** jpgraph +*/ + +25001 => array('Diese PHP-Installation ist nicht mit der GD-Bibliothek kompiliert. Bitte kompiliere PHP mit GD-Untersttzung neu, damit JpGraph funktioniert. (Weder die Funktion imagetypes() noch imagecreatefromstring() existiert!)',0), +25002 => array('Diese PHP-Installation scheint nicht die bentigte GD-Bibliothek zu untersttzen. 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 bentigt die iconv() Funktion in Deiner PHP-Konfiguration. Dies wird nicht defaultmig in PHP kompiliert (bentigt "--width-iconv" bei der Konfiguration).',0), +25007 => array('Du versuchst das lokale (%s) zu verwenden, was von Deiner PHP-Installation nicht untersttzt wird. Hinweis: Benutze \'\', um das defaultmige Lokale fr diese geographische Region festzulegen.',1), +25008 => array('Die Bild-Breite und Hhe in Graph::Graph() mssen 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 hinzuzufgen.',0), +25011 => array('Graph::AddY2() Du hast versucht, einen leeren Plot zum Graph hinzuzufgen.',0), +25012 => array('Graph::AddYN() Du hast versucht, einen leeren Plot zum Graph hinzuzufgen.',0), +25013 => array('Es knnen nur Standard-Plots zu multiplen Y-Achsen hinzugefgt werden',0), +25014 => array('Graph::AddText() Du hast versucht, einen leeren Text zum Graph hinzuzufgen.',0), +25015 => array('Graph::AddLine() Du hast versucht, eine leere Linie zum Graph hinzuzufgen.',0), +25016 => array('Graph::AddBand() Du hast versucht, ein leeres Band zum Graph hinzuzufgen.',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 Qualitt der Schrift sehr schlecht, wenn Truetype-Schrift in Truecolor-Bildern verwendet werden.',0), +25018 => array('Falscher Dateiname fr Graph::SetBackgroundImage() : "%s" muss eine gltige Dateinamenerweiterung (jpg,gif,png) haben, wenn die automatische Dateityperkennung verwenndet werden soll.',1), +25019 => array('Unbekannte Dateinamenerweiterung (%s) in Graph::SetBackgroundImage() fr Dateiname: "%s"',2), + +25020 => array('Graph::SetScale(): Dar Maximalwert muss grer sein als der Mindestwert.',0), +25021 => array('Unbekannte Achsendefinition fr die Y-Achse. (%s)',1), +25022 => array('Unbekannte Achsendefinition fr die X-Achse. (%s)',1), +25023 => array('Nicht untersttzter Y2-Achsentyp: "%s" muss einer von (lin,log,int) sein.',1), +25024 => array('Nicht untersttzter X-Achsentyp: "%s" muss einer von (lin,log,int) sein.',1), +25025 => array('Nicht untersttzte Tick-Dichte: %d',1), +25026 => array('Nicht untersttzter Typ der nicht angegebenen Y-Achse. Du hast entweder: 1. einen Y-Achsentyp fr 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. berprfe die Rechte.',1), +25029 => array('Kann nicht in das CSIM "%s" schreiben. berprfe die Schreibrechte und den freien Speicherplatz.',1), + +25030 => array('Fehlender Skriptname fr 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 fr 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 fr Diagramme mit 0 oder 90 Grad Rotation untersttzt. Bitte verndere 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 untersttzt. ',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 mglich, sowohl ein Hintergrundbild als auch eine Hintergrund-Landesflagge anzugeben.',0), +25041 => array('Um Landesflaggen als Hintergrund benutzen zu knnen, muss die Datei "jpgraph_flags.php" eingefgt 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 unmglich ist, einen gltigen min/max Wert fr die Y-Achse zu ermitteln (nur Null-Werte).',0), +25045 => array('Die Schriftfamilien FF_HANDWRT und FF_BOOK sind wegen Copyright-Problemen nicht mehr verfgbar. Diese Schriften knnen 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 verfgbar fr Schriftfamilie %s',2), +25048 => array('Unbekannte Schriftstildefinition [%s].',1), +25049 => array('Schriftdatei "%s" ist nicht lesbar oder existiert nicht.',1), + +25050 => array('Erstes Argument fr Text::Text() muss ein String sein.',0), +25051 => array('Ungltige Richtung angegeben fr Text.',0), +25052 => array('PANIK: Interner Fehler in SuperScript::Stroke(). Unbekannte vertikale Ausrichtung fr Text.',0), +25053 => array('PANIK: Interner Fehler in SuperScript::Stroke(). Unbekannte horizontale Ausrichtung fr 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), +25057 => array('SetTextTicks() sollte nicht mehr verwendet werden. Benutze stattdessen SetTextTickInterval().',0), +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 fr X-Achsentitel (%s).',1), +25061 => array('Unbekannte Ausrichtung angegeben fr Y-Achsentitel (%s).',1), +25062 => array('Label unter einem Winkel werden fr die Y-Achse nicht untersttzt.',0), +25063 => array('Ticks::SetPrecision() sollte nicht mehr verwendet werden. Benutze stattdessen Ticks::SetLabelFormat() (oder Ticks::SetFormatCallback()).',0), +25064 => array('Kleinere oder grere Schrittgre ist 0. berprfe, ob Du flschlicherweise 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 fge den Code an, der den Fehler verursacht hat.',0), +25065 => array('Tick-Positionen mssen 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 fr den Tickabstand.',0), +25068 => array('Ein Plot hat eine ungltige 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 Bildflche 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 grer sein als 0',0), + +25070 => array('Deine Daten enthalten nicht-numerische Werte.',0), +25071 => array('Du hast mit SetAutoMin() einen Mindestwert angegeben, der grer ist als der Maximalwert fr die Achse. Dies ist nicht mglich.',0), +25072 => array('Du hast mit SetAutoMax() einen Maximalwert angegeben, der kleiner ist als der Minimalwert der Achse. Dies ist nicht mglich.',0), +25073 => array('Interner Fehler. Der Integer-Skalierungs-Algorithmus-Vergleich ist auerhalb der Grenzen (r=%f).',1), +25074 => array('Interner Fehler. Der Skalierungsbereich ist negativ (%f) [fr %s Achse]. Dieses Problem knnte verursacht werden durch den Versuch, \'ungltige\' 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 knnen nicht gesetzt werden, weil min==max.',0), +25077 => array('Einstellfaktor fr die Farbe muss grer sein als 0',0), +25078 => array('Unbekannte Farbe: %s',1), +25079 => array('Unbekannte Farbdefinition: %s, Gre=%d',2), + +25080 => array('Der Alpha-Parameter fr Farben muss zwischen 0.0 und 1.0 liegen.',0), +25081 => array('Das ausgewhlte Grafikformat wird entweder nicht untersttzt oder ist unbekannt [%s]',1), +25082 => array('Es wurden ungltige Gren fr Breite und Hhe beim Erstellen des Bildes definiert (Breite=%d, Hhe=%d).',2), +25083 => array('Es wurde eine ungltige Gre beim Kopieren des Bildes angegeben. Die Gre fr das kopierte Bild wurde auf 1 Pixel oder weniger gesetzt.',0), +25084 => array('Fehler beim Erstellen eines temporren GD-Canvas. Mglicherweise liegt ein Arbeitsspeicherproblem vor.',0), +25085 => array('Ein Bild kann nicht aus dem angegebenen String erzeugt werden. Er ist entweder in einem nicht untersttzen Format oder er represntiert ein kaputtes Bild.',0), +25086 => array('Du scheinst nur GD 1.x installiert zu haben. Um Alphablending zu aktivieren, ist GD 2.x oder hher notwendig. Bitte installiere GD 2.x oder versichere Dich, dass die Konstante USE_GD2 richtig gesetzt ist. Standardmig 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-Untersttzung konfiguriert. PHP muss mit TTF-Untersttzung neu kompiliert und installiert werden.',0), +25088 => array('Die GD-Schriftuntersttzung wurde falsch konfiguriert. Der Aufruf von imagefontwidth() ist fehlerhaft.',0), +25089 => array('Die GD-Schriftuntersttzung 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 untesttzt 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). Mglicherweise 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 knnen keine weiteren Farben zugewiesen werden. Dem Bild wurde bereits die grtmgliche 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 fr Helligkeit und Kontrast sind auerhalb des zulssigen 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('Ungltiges numerisches Argument fr SetLineStyle(): (%d)',1), +25102 => array('Ungltiges String-Argument fr SetLineStyle(): %s',1), +25103 => array('Ungltiges Argument fr SetLineStyle %s',1), +25104 => array('Unbekannter Linientyp: %s',1), +25105 => array('Es wurden NULL-Daten fr ein geflltes Polygon angegeben. Sorge dafr, dass keine NULL-Daten angegeben werden.',0), +25106 => array('Image::FillToBorder : es knnen keine weiteren Farben zugewiesen werden.',0), +25107 => array('In Datei "%s" kann nicht geschrieben werden. berprfe die aktuellen Schreibrechte.',1), +25108 => array('Das Bild kann nicht gestreamt werden. Mglicherweise 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 untersttzen. Sorge zunchst dafr, dass GD als PHP-Modul kompiliert ist. Wenn Du auerdem 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 untersttzt das gewhlte Grafikformat nicht: %s',1), +25111 => array('Das gecachete Bild %s kann nicht gelscht 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 gelscht 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 fr die Datei hat, wenn Du das Cache-System in JPGraph verwenden willst.',1), +25115 => array('Berechtigung fr gecachetes Bild %s kann nicht gesetzt werden. Problem mit den Rechten?',1), +25116 => array('Datei kann nicht aus dem Cache %s geffnet werden',1), +25117 => array('Gecachetes Bild %s kann nicht zum Lesen geffnet werden.',1), +25118 => array('Verzeichnis %s kann nicht angelegt werden. Versichere Dich, dass PHP die Schreibrechte in diesem Verzeichnis hat.',1), +25119 => array('Rechte fr Datei %s knnen nicht gesetzt werden. Problem mit den Rechten?',1), + +25120 => array('Die Position fr die Legende muss als Prozentwert im Bereich 0-1 angegeben werden.',0), +25121 => array('Eine leerer Datenvektor wurde fr 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 aufwrts beinhalten. Der angegebene Y-Vektor beginnt mit leeren Werten (NULL).',0), +25125 => array('Ungltige Richtung fr statische Linie.',0), +25126 => array('Es kann kein TrueColor-Bild erzeugt werden. berprfe, 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), +/* +**--------------------------------------------------------------------------------------------- +** Pro-version strings +**--------------------------------------------------------------------------------------------- +*/ + +/* +** jpgraph_table +*/ + +27001 => array('GTextTable: Ungltiges Argument fr Set(). Das Array-Argument muss 2-- dimensional sein.',0), +27002 => array('GTextTable: Ungltiges Argument fr Set()',0), +27003 => array('GTextTable: Falsche Anzahl von Argumenten fr GTextTable::SetColor()',0), +27004 => array('GTextTable: Angegebener Zellenbereich, der verschmolzen werden soll, ist ungltig.',0), +27005 => array('GTextTable: Bereits verschmolzene Zellen im Bereich (%d,%d) bis (%d,%d) knnen nicht ein weiteres Mal verschmolzen werden.',4), +27006 => array('GTextTable: Spalten-Argument = %d liegt auerhalb der festgelegten Tabellengre.',1), +27007 => array('GTextTable: Zeilen-Argument = %d liegt auerhalb der festgelegten Tabellengre.',1), +27008 => array('GTextTable: Spalten- und Zeilengre mssen 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 ungltiges Argument festgeleget %s',1), +27013 => array('GTextTable: Das Argument fr 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), + +/* +** 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 fr eine Skala. Bitte vergrere das Bild.',0), +22004 => array('Die Etikettendefinition fr Windrosenrichtungen mssen 16 Werte haben (eine fr jede Kompassrichtung).',0), +22005 => array('Der Linientyp fr radiale Linien muss einer von ("solid","dotted","dashed","longdashed") sein.',0), +22006 => array('Es wurde ein ungltiger Windrosentyp angegeben.',0), +22007 => array('Es wurden zu wenig Werte fr 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 fr die Windrose enthlt eine nicht aktivierte Richtung.',0), +22013 => array('Du hast dasselbe Look&Feel fr die gleiche Kompassrichtung zweimal engegeben, einmal mit Text und einmal mit einem Index (Index=%d)',1), +22014 => array('Der Index fr 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 fr dieselbe Kompassrichtung zweimal Daten angegeben, einmal mit Text und einmal mit einem Index (Index=%d)',1), +22019 => array('Der Index fr eine Richtung muss zwischen 0 und 15 sein. Winkel drfen nicht fr einen regelmigen Windplot angegeben werden, sondern entweder ein Index oder eine Kompassrichtung.',0), +22020 => array('Der Windrosenplot ist zu gro fr die angegebene Bildgre. Benutze entweder WindrosePlot::SetSize(), um den Plot kleiner zu machen oder vergrere das Bild im ursprnglichen Aufruf von WindroseGraph().',0), +22021 => array('It is only possible to add Text, IconPlot or WindrosePlot to a Windrose Graph',0), + +/* +** jpgraph_odometer +*/ + +13001 => array('Unbekannter Nadeltypstil (%d).',1), +13002 => array('Ein Wert fr das Odometer (%f) ist auerhalb des angegebenen Bereichs [%f,%f]',3), + +/* +** jpgraph_barcode +*/ + +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 mglich 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 fr CODE 128. Es wurde versucht, CTRL in CHARSET != A zu kodieren.',0), +1007 => array('Interner Kodierfehler fr CODE 128. Es wurde versucht, DEL in CHARSET != B zu kodieren.',0), +1008 => array('Interner Kodierfehler fr CODE 128. Es wurde versucht, kleine Buchstaben in CHARSET != B zu kodieren.',0), +1009 => array('Kodieren mittels CODE 93 wird noch nicht untersttzt.',0), +1010 => array('Kodieren mittels POSTNET wird noch nicht untersttzt.',0), +1011 => array('Nicht untrsttztes Barcode-Backend fr den Typ %s',1), + +/* +** PDF417 +*/ + +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: Ungltiges Format fr Eingabedaten, um sie mit PDF417 zu kodieren.',0), +26004 => array('PDF417: die eigebenen Daten knnen 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 geffnet werden.',1), +26006 => array('PDF417: Interner Fehler. Die Eingabedatendatei fr PDF417-Cluster %d ist fehlerhaft.',1), +26007 => array('PDF417: Interner Fehler. GetPattern: Ungltiger Code-Wert %d (Zeile %d)',2), +26008 => array('PDF417: Interner Fehler. Modus wurde nicht in der Modusliste!! Modus %d',1), +26009 => array('PDF417: Kodierfehler: Ungltiges 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 mglich.',0), +26012 => array('PDF417: Interner Fehler. Es wurden fr 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 Kodewrtern eingegeben.',0), +26015 => array('PDF417: Interner Fehler. Ein Eintrag 0 in die Statusbertragungstabellen ist nicht NULL. Eintrag 1 = (%s)',1), +26016 => array('PDF417: Interner Fehler: Nichtregistrierter Statusbertragungsmodus beim Dekodieren.',0), + + +); + +?> diff --git a/libs/jpgraph/lang/en.inc.php b/libs/jpgraph/lang/en.inc.php new file mode 100644 index 0000000..e61080e --- /dev/null +++ b/libs/jpgraph/lang/en.inc.php @@ -0,0 +1,500 @@ +,) +$_jpg_messages = array( + +/* +** Headers already sent error. This is formatted as HTML different since this will be sent back directly as text +*/ +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), + +/* +** Setup errors +*/ +11 => array('No path specified for CACHE_DIR. Please specify CACHE_DIR manually in jpg-config.inc',0), +12 => array('No path specified for TTF_DIR and path can not be determined automatically. Please specify TTF_DIR manually (in jpg-config.inc).',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), + + +/* +** jpgraph_bar +*/ + +2001 => array('Number of colors is not the same as the number of patterns in BarPlot::SetPattern()',0), +2002 => array('Unknown pattern specified in call to BarPlot::SetPattern()',0), +2003 => array('Number of X and Y points are not equal. Number of X-points: %d Number of Y-points: %d',2), +2004 => array('All values for a barplot must be numeric. You have specified value nr [%d] == %s',2), +2005 => array('You have specified an empty array for shadow colors in the bar plot.',0), +2006 => array('Unknown position for values on bars : %s',1), +2007 => array('Cannot create GroupBarPlot from empty plot array.',0), +2008 => array('Group bar plot element nbr %d is undefined or empty.',0), +2009 => array('One of the objects submitted to GroupBar is not a BarPlot. Make sure that you create the GroupBar plot from an array of BarPlot or AccBarPlot objects. (Class = %s)',1), +2010 => array('Cannot create AccBarPlot from empty plot array.',0), +2011 => array('Acc bar plot element nbr %d is undefined or empty.',1), +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), + + +/* +** jpgraph_date +*/ + +3001 => array('It is only possible to use either SetDateAlign() or SetTimeAlign() but not both',0), + +/* +** jpgraph_error +*/ + +4002 => array('Error in input data to LineErrorPlot. Number of data points must be a multiple of 3',0), + +/* +** jpgraph_flags +*/ + +5001 => array('Unknown flag size (%d).',1), +5002 => array('Flag index %s does not exist.',1), +5003 => array('Invalid ordinal number (%d) specified for flag index.',1), +5004 => array('The (partial) country name %s does not have a corresponding flag image. The flag may still exist but under another name, e.g. instead of "usa" try "united states".',1), + + +/* +** jpgraph_gantt +*/ + +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), +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), +6008 => array('You have specified a constrain from row=%d to row=%d which does not have any activity',2), +6009 => array('Unknown constrain type specified from row=%d to row=%d',2), +6010 => array('Illegal icon index for Gantt builtin icon [%d]',1), +6011 => array('Argument to IconImage must be string or integer',0), +6012 => array('Unknown type in Gantt object title specification',0), +6015 => array('Illegal vertical position %d',1), +6016 => array('Date string (%s) specified for Gantt activity can not be interpretated. Please make sure it is a valid time string, e.g. 2005-04-23 13:30',1), +6017 => array('Unknown date format in GanttScale (%s).',1), +6018 => array('Interval for minutes must divide the hour evenly, e.g. 1,5,10,12,15,20,30 etc You have specified an interval of %d minutes.',1), +6019 => array('The available width (%d) for minutes are to small for this scale to be displayed. Please use auto-sizing or increase the width of the graph.',1), +6020 => array('Interval for hours must divide the day evenly, e.g. 0:30, 1:00, 1:30, 4:00 etc. You have specified an interval of %d',1), +6021 => array('Unknown formatting style for week.',0), +6022 => array('Gantt scale has not been specified.',0), +6023 => array('If you display both hour and minutes the hour interval must be 1 (Otherwise it doesn\'t make sense to display minutes).',0), +6024 => array('CSIM Target must be specified as a string. Start of target is: %d',1), +6025 => array('CSIM Alt text must be specified as a string. Start of alt text is: %d',1), +6027 => array('Progress value must in range [0, 1]',0), +6028 => array('Specified height (%d) for gantt bar is out of range.',1), +6029 => array('Offset for vertical line must be in range [0,1]',0), +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), + +/* +** jpgraph_gradient +*/ + +7001 => array('Unknown gradient style (=%d).',1), + +/* +** jpgraph_iconplot +*/ + +8001 => array('Mix value for icon must be between 0 and 100.',0), +8002 => array('Anchor position for icons must be one of "top", "bottom", "left", "right" or "center"',0), +8003 => array('It is not possible to specify both an image file and a country flag for the same icon.',0), +8004 => array('In order to use Country flags as icons you must include the "jpgraph_flags.php" file.',0), + +/* +** jpgraph_imgtrans +*/ + +9001 => array('Value for image transformation out of bounds. Vanishing point on horizon must be specified as a value between 0 and 1.',0), + +/* +** jpgraph_lineplot +*/ + +10001 => array('LinePlot::SetFilled() is deprecated. Use SetFillColor()',0), +10002 => array('Plot too complicated for fast line Stroke. Use standard Stroke()',0), +10003 => array('Each plot in an accumulated lineplot must have the same number of data points.',0), + +/* +** jpgraph_log +*/ + +11001 => array('Your data contains non-numeric values.',0), +11002 => array('Negative data values can not be used in a log scale.',0), +11003 => array('Your data contains non-numeric values.',0), +11004 => array('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.',0), +11005 => array('Specifying tick interval for a logarithmic scale is undefined. Remove any calls to SetTextLabelStart() or SetTextTickInterval() on the logarithmic scale.',0), + +/* +** jpgraph_mgraph +*/ + +12001 => 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), +12002 => array('Incorrect file name for MGraph::SetBackgroundImage() : %s Must have a valid image extension (jpg,gif,png) when using auto detection of image type',1), +12003 => array('Unknown file extension (%s) in MGraph::SetBackgroundImage() for filename: %s',2), +12004 => array('The image format of your background image (%s) is not supported in your system configuration. ',1), +12005 => array('Can\'t read background image: %s',1), +12006 => array('Illegal sizes specified for width or height when creating an image, (width=%d, height=%d)',2), +12007 => array('Argument to MGraph::Add() is not a valid GD image handle.',0), +12008 => array('Your PHP (and GD-lib) installation does not appear to support any known graphic formats.',0), +12009 => array('Your PHP installation does not support the chosen graphic format: %s',1), +12010 => array('Can\'t create or stream image to file %s Check that PHP has enough permission to write a file to the current directory.',1), +12011 => array('Can\'t create truecolor image. Check that you really have GD2 library installed.',0), +12012 => array('Can\'t create image. Check that you really have GD2 library installed.',0), + +/* +** jpgraph_pie3d +*/ + +14001 => array('Pie3D::ShowBorder() . Deprecated function. Use Pie3D::SetEdge() to control the edges around slices.',0), +14002 => array('PiePlot3D::SetAngle() 3D Pie projection angle must be between 5 and 85 degrees.',0), +14003 => array('Internal assertion failed. Pie3D::Pie3DSlice',0), +14004 => array('Slice start angle must be between 0 and 360 degrees.',0), +14005 => array('Pie3D Internal error: Trying to wrap twice when looking for start index',0,), +14006 => array('Pie3D Internal Error: Z-Sorting algorithm for 3D Pies is not working properly (2). Trying to wrap twice while stroking.',0), +14007 => array('Width for 3D Pie is 0. Specify a size > 0',0), + +/* +** jpgraph_pie +*/ + +15001 => array('PiePLot::SetTheme() Unknown theme: %s',1), +15002 => array('Argument to PiePlot::ExplodeSlice() must be an integer',0), +15003 => array('Argument to PiePlot::Explode() must be an array with integer distances.',0), +15004 => array('Slice start angle must be between 0 and 360 degrees.',0), +15005 => array('PiePlot::SetFont() is deprecated. Use PiePlot->value->SetFont() instead.',0), +15006 => array('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]',0), +15007 => array('PiePlot::SetFontColor() is deprecated. Use PiePlot->value->SetColor() instead.',0), +15008 => array('PiePlot::SetLabelType() Type for pie plots must be 0 or 1 (not %d).',1), +15009 => array('Illegal pie plot. Sum of all data is zero for Pie Plot',0), +15010 => array('Sum of all data is 0 for Pie.',0), +15011 => array('In order to use image transformation you must include the file jpgraph_imgtrans.php in your script.',0), + +/* +** jpgraph_plotband +*/ + +16001 => array('Density for pattern must be between 1 and 100. (You tried %f)',1), +16002 => array('No positions specified for pattern.',0), +16003 => array('Unknown pattern specification (%d)',0), +16004 => array('Min value for plotband is larger than specified max value. Please correct.',0), + + +/* +** jpgraph_polar +*/ + +17001 => array('Polar plots must have an even number of data point. Each data point is a tuple (angle,radius).',0), +17002 => array('Unknown alignment specified for X-axis title. (%s)',1), +//17003 => array('Set90AndMargin() is not supported for polar graphs.',0), +17004 => array('Unknown scale type for polar graph. Must be "lin" or "log"',0), + +/* +** jpgraph_radar +*/ + +18001 => array('Client side image maps not supported for RadarPlots.',0), +18002 => array('RadarGraph::SupressTickMarks() is deprecated. Use HideTickMarks() instead.',0), +18003 => array('Illegal scale for radarplot (%s). Must be \'lin\' or \'log\'',1), +18004 => array('Radar Plot size must be between 0.1 and 1. (Your value=%f)',1), +18005 => array('RadarPlot Unsupported Tick density: %d',1), +18006 => array('Minimum data %f (Radar plots should only be used when all data points > 0)',1), +18007 => array('Number of titles does not match number of points in plot.',0), +18008 => array('Each radar plot must have the same number of data points.',0), + +/* +** jpgraph_regstat +*/ + +19001 => array('Spline: Number of X and Y coordinates must be the same',0), +19002 => array('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.',0), +19003 => array('Bezier: Number of X and Y coordinates must be the same',0), + +/* +** jpgraph_scatter +*/ + +20001 => array('Fieldplots must have equal number of X and Y points.',0), +20002 => array('Fieldplots must have an angle specified for each X and Y points.',0), +20003 => array('Scatterplot must have equal number of X and Y points.',0), + +/* +** jpgraph_stock +*/ + +21001 => array('Data values for Stock charts must contain an even multiple of %d data points.',1), + +/* +** jpgraph_plotmark +*/ + +23001 => array('This marker "%s" does not exist in color with index: %d',2), +23002 => array('Mark color index too large for marker "%s"',1), +23003 => array('A filename must be specified if you set the mark type to MARK_IMG.',0), + +/* +** jpgraph_utils +*/ + +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), +/* +** jpgraph +*/ + +25001 => array('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)',0), +25002 => array('Your PHP installation does not seem to have the required GD library. Please see the PHP documentation on how to install and enable the GD library.',0), +25003 => array('General PHP error : At %s:%d : %s',3), +25004 => array('General PHP error : %s ',1), +25005 => array('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.',0), +25006 => array('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).',0), +25007 => array('You are trying to use the locale (%s) which your PHP installation does not support. Hint: Use \'\' to indicate the default locale for this geographic region.',1), +25008 => array('Image width/height argument in Graph::Graph() must be numeric',0), +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), +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), +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), +25019 => array('Unknown file extension (%s) in Graph::SetBackgroundImage() for filename: "%s"',2), + +25020 => array('Graph::SetScale(): Specified Max value must be larger than the specified Min value.',0), +25021 => array('Unknown scale specification for Y-scale. (%s)',1), +25022 => array('Unknown scale specification for X-scale. (%s)',1), +25023 => array('Unsupported Y2 axis type: "%s" Must be one of (lin,log,int)',1), +25024 => array('Unsupported Y axis type: "%s" Must be one of (lin,log,int)',1), +25025 => array('Unsupported Tick density: %d',1), +25026 => array('Can\'t draw unspecified Y-scale. You have either: 1. Specified an Y axis for auto scaling but have not supplied any plots. 2. Specified a scale manually but have forgot to specify the tick steps',0), +25027 => array('Can\'t open cached CSIM "%s" for reading.',1), +25028 => array('Apache/PHP does not have permission to write to the CSIM cache directory (%s). Check permissions.',1), +25029 => array('Can\'t write CSIM "%s" for writing. Check free space and permissions.',1), + +25030 => array('Missing script name in call to StrokeCSIM(). You must specify the name of the actual image script as the first parameter to StrokeCSIM().',0), +25031 => array('You must specify what scale to use with a call to Graph::SetScale().',0), +25032 => array('No plots for Y-axis nbr:%d',1), +25033 => array('',0), +25034 => array('Can\'t draw unspecified X-scale. No plots specified.',0), +25035 => array('You have enabled clipping. Clipping is only supported for graphs at 0 or 90 degrees rotation. Please adjust you current angle (=%d degrees) or disable clipping.',1), +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), + +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), +25042 => array('Unknown background image layout',0), +25043 => array('Unknown title background style.',0), +25044 => array('Cannot use auto scaling since it is impossible to determine a valid min/max value of the Y-axis (only null values).',0), +25045 => array('Font families FF_HANDWRT and FF_BOOK are no longer available due to copyright problem with these fonts. Fonts can no longer be distributed with JpGraph. Please download fonts from http://corefonts.sourceforge.net/',0), +25046 => array('Specified TTF font family (id=%d) 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/',1), +25047 => array('Style %s is not available for font family %s',2), +25048 => array('Unknown font style specification [%s].',1), +25049 => array('Font file "%s" is not readable or does not exist.',1), + +25050 => array('First argument to Text::Text() must be a string.',0), +25051 => array('Invalid direction specified for text.',0), +25052 => array('PANIC: Internal error in SuperScript::Stroke(). Unknown vertical alignment for text',0), +25053 => array('PANIC: Internal error in SuperScript::Stroke(). Unknown horizontal alignment for text',0), +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), +25058 => array('Text label interval must be specified >= 1.',0), +25059 => array('SetLabelPos() is deprecated. Use Axis::SetLabelSide() instead.',0), + +25060 => array('Unknown alignment specified for X-axis title. (%s)',1), +25061 => array('Unknown alignment specified for Y-axis title. (%s)',1), +25062 => array('Labels at an angle are not supported on Y-axis',0), +25063 => array('Ticks::SetPrecision() is deprecated. Use Ticks::SetLabelFormat() (or Ticks::SetFormatCallback()) instead',0), +25064 => array('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',0), +25065 => array('Tick positions must be specified as an array()',0), +25066 => array('When manually specifying tick positions and labels the number of labels must be the same as the number of specified ticks.',0), +25067 => array('Your manually specified scale and ticks is not correct. The scale seems to be too small to hold any of the specified tick marks.',0), +25068 => array('A plot has an illegal scale. This could for example be that you are trying to use text auto scaling 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\')',0), +25069 => array('Grace must be larger then 0',0), +25070 => array('Either X or Y data arrays contains non-numeric values. Check that the data is really specified as numeric data and not as strings. It is an error to specify data for example as \'-2345.2\' (using quotes).',0), +25071 => array('You have specified a min value with SetAutoMin() which is larger than the maximum value used for the scale. This is not possible.',0), +25072 => array('You have specified a max value with SetAutoMax() which is smaller than the minimum value used for the scale. This is not possible.',0), +25073 => array('Internal error. Integer scale algorithm comparison out of bound (r=%f)',1), +25074 => array('Internal error. The scale range is negative (%f) [for %s scale] 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 auto scaling to fail.',2), +25075 => array('Can\'t automatically determine ticks since min==max.',0), +25077 => array('Adjustment factor for color must be > 0',0), +25078 => array('Unknown color: %s',1), +25079 => array('Unknown color specification: %s, size=%d',2), + +25080 => array('Alpha parameter for color must be between 0.0 and 1.0',0), +25081 => array('Selected graphic format is either not supported or unknown [%s]',1), +25082 => array('Illegal sizes specified for width or height when creating an image, (width=%d, height=%d)',2), +25083 => array('Illegal image size when copying image. Size for copied to image is 1 pixel or less.',0), +25084 => array('Failed to create temporary GD canvas. Possible Out of memory problem.',0), +25085 => array('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.',0), +25086 => array('You only seem to have GD 1.x installed. To enable Alphablending requires GD 2.x or higher. Please install GD or make sure the constant USE_GD2 is specified correctly to reflect your installation. By default it tries to auto detect what version of GD you have installed. On some very rare occasions it may falsely detect GD2 where only GD1 is installed. You must then set USE_GD2 to false.',0), +25087 => array('This PHP build has not been configured with TTF support. You need to recompile your PHP installation with FreeType support.',0), +25088 => array('You have a misconfigured GD font support. The call to imagefontwidth() fails.',0), +25089 => array('You have a misconfigured GD font support. The call to imagefontheight() fails.',0), + +25090 => array('Unknown direction specified in call to StrokeBoxedText() [%s]',1), +25091 => array('Internal font does not support drawing text at arbitrary angle. Use TTF fonts instead.',0), +25092 => array('There is either a configuration problem with TrueType or a problem reading font file "%s" 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 upgrading to at least FreeType 2.1.13 and recompile GD with the correct setup so it can find the new FT library.',1), +25093 => array('Can not read font file "%s" 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.',1), +25094 => array('Direction for text most be given as an angle between 0 and 90.',0), +25095 => array('Unknown font font family specification. ',0), +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), + +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), +25102 => array('Illegal string argument to SetLineStyle(): %s',1), +25103 => array('Illegal argument to SetLineStyle %s',1), +25104 => array('Unknown line style: %s',1), +25105 => array('NULL data specified for a filled polygon. Check that your data is not NULL.',0), +25106 => array('Image::FillToBorder : Can not allocate more colors',0), +25107 => array('Can\'t write to file "%s". Check that the process running PHP has enough permission.',1), +25108 => array('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.',0), +25109 => array('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.',0), + +25110 => array('Your PHP installation does not support the chosen graphic format: %s',1), +25111 => array('Can\'t delete cached image %s. Permission problem?',1), +25112 => array('Cached imagefile (%s) has file date in the future.',1), +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), +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), + +25120 => array('Position for legend must be given as percentage in range 0-1',0), +25121 => array('Empty input data array specified for plot. Must have at least one data point.',0), +25122 => array('Stroke() must be implemented by concrete subclass to class Plot',0), +25123 => array('You can\'t use a text X-scale with specified X-coords. Use a "int" or "lin" scale instead.',0), +25124 => array('The input data array must have consecutive values from position 0 and forward. The given y-array starts with empty values (NULL)',0), +25125 => array('Illegal direction for static line',0), +25126 => array('Can\'t create truecolor image. Check that the GD2 library is properly setup with PHP.',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), + + +/* +**--------------------------------------------------------------------------------------------- +** Pro-version strings +**--------------------------------------------------------------------------------------------- +*/ + +/* +** jpgraph_table +*/ + +27001 => array('GTextTable: Invalid argument to Set(). Array argument must be 2 dimensional',0), +27002 => array('GTextTable: Invalid argument to Set()',0), +27003 => array('GTextTable: Wrong number of arguments to GTextTable::SetColor()',0), +27004 => array('GTextTable: Specified cell range to be merged is not valid.',0), +27005 => array('GTextTable: Cannot merge already merged cells in the range: (%d,%d) to (%d,%d)',4), +27006 => array('GTextTable: Column argument = %d is outside specified table size.',1), +27007 => array('GTextTable: Row argument = %d is outside specified table size.',1), +27008 => array('GTextTable: Column and row size arrays must match the dimensions of the table',0), +27009 => array('GTextTable: Number of table columns or rows are 0. Make sure Init() or Set() is called.',0), +27010 => array('GTextTable: No alignment specified in call to SetAlign()',0), +27011 => array('GTextTable: Unknown alignment specified in SetAlign(). Horizontal=%s, Vertical=%s',2), +27012 => array('GTextTable: Internal error. Invalid alignment specified =%s',1), +27013 => array('GTextTable: Argument to FormatNumber() must be a string.',0), +27014 => array('GTextTable: Table is not initilaized with either a call to Set() or Init()',0), +27015 => array('GTextTable: Cell image constrain type must be TIMG_WIDTH or TIMG_HEIGHT',0), + +/* +** jpgraph_windrose +*/ + +22001 => array('Total percentage for all windrose legs in a windrose plot can not exceed 100%% !\n(Current max is: %d)',1), +22002 => array('Graph is too small to have a scale. Please make the graph larger.',0), +22004 => array('Label specification for windrose directions must have 16 values (one for each compass direction).',0), +22005 => array('Line style for radial lines must be on of ("solid","dotted","dashed","longdashed") ',0), +22006 => array('Illegal windrose type specified.',0), +22007 => array('To few values for the range legend.',0), +22008 => array('Internal error: Trying to plot free Windrose even though type is not a free windrose',0), +22009 => array('You have specified the same direction twice, once with an angle and once with a compass direction (%f degrees)',0), +22010 => array('Direction must either be a numeric value or one of the 16 compass directions',0), +22011 => array('Windrose index must be numeric or direction label. You have specified index=%d',1), +22012 => array('Windrose radial axis specification contains a direction which is not enabled.',0), +22013 => array('You have specified the look&feel for the same compass direction twice, once with text and once with index (Index=%d)',1), +22014 => array('Index for compass direction must be between 0 and 15.',0), +22015 => array('You have specified an undefined Windrose plot type.',0), +22016 => array('Windrose leg index must be numeric or direction label.',0), +22017 => array('Windrose data contains a direction which is not enabled. Please adjust what labels are displayed.',0), +22018 => array('You have specified data for the same compass direction twice, once with text and once with index (Index=%d)',1), +22019 => array('Index for direction must be between 0 and 15. You can\'t specify angles for a Regular Windplot, only index and compass directions.',0), +22020 => array('Windrose plot is too large to fit the specified Graph size. Please use WindrosePlot::SetSize() to make the plot smaller or increase the size of the Graph in the initial WindroseGraph() call.',0), +22021 => array('It is only possible to add Text, IconPlot or WindrosePlot to a Windrose Graph',0), +/* +** jpgraph_odometer +*/ + +13001 => array('Unknown needle style (%d).',1), +13002 => array('Value for odometer (%f) is outside specified scale [%f,%f]',3), + +/* +** jpgraph_barcode +*/ + +1001 => array('Unknown encoder specification: %s',1), +1002 => array('Data validation failed. Can\'t encode [%s] using encoding "%s"',2), +1003 => array('Internal encoding error. Trying to encode %s is not possible in Code 128',1), +1004 => array('Internal barcode error. Unknown UPC-E encoding type: %s',1), +1005 => array('Internal error. Can\'t encode character tuple (%s, %s) in Code-128 charset C',2), +1006 => array('Internal encoding error for CODE 128. Trying to encode control character in CHARSET != A',0), +1007 => array('Internal encoding error for CODE 128. Trying to encode DEL in CHARSET != B',0), +1008 => array('Internal encoding error for CODE 128. Trying to encode small letters in CHARSET != B',0), +1009 => array('Encoding using CODE 93 is not yet supported.',0), +1010 => array('Encoding using POSTNET is not yet supported.',0), +1011 => array('Non supported barcode backend for type %s',1), + +/* +** PDF417 +*/ + +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), +26004 => array('PDF417: Can\'t encode given data with error level %d and %d columns since it results in too many symbols or more than 90 rows.',2), +26005 => array('PDF417: Can\'t open file "%s" for writing',1), +26006 => array('PDF417: Internal error. Data files for PDF417 cluster %d is corrupted.',1), +26007 => array('PDF417: Internal error. GetPattern: Illegal Code Value = %d (row=%d)',2), +26008 => array('PDF417: Internal error. Mode not found in mode list!! mode=%d',1), +26009 => array('PDF417: Encode error: Illegal character. Can\'t encode character with ASCII code=%d',1), +26010 => array('PDF417: Internal error: No input data in decode.',0), +26011 => array('PDF417: Encoding error. Can\'t use numeric encoding on non-numeric data.',0), +26012 => array('PDF417: Internal error. No input data to decode for Binary compressor.',0), +26013 => array('PDF417: Internal error. Checksum error. Coefficient tables corrupted.',0), +26014 => array('PDF417: Internal error. No data to calculate codewords on.',0), +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), + + +); + +?> diff --git a/libs/jpgraph/lang/prod.inc.php b/libs/jpgraph/lang/prod.inc.php new file mode 100644 index 0000000..f04e30d --- /dev/null +++ b/libs/jpgraph/lang/prod.inc.php @@ -0,0 +1,357 @@ +,) +$_jpg_messages = array( + +/* +** Headers already sent error. This is formatted as HTML different since this will be sent back directly as text +*/ +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), + + +11 => array(DEFAULT_ERROR_MESSAGE.'11',0), +12 => array(DEFAULT_ERROR_MESSAGE.'12',0), +13 => array(DEFAULT_ERROR_MESSAGE.'13',0), +2001 => array(DEFAULT_ERROR_MESSAGE.'2001',0), +2002 => array(DEFAULT_ERROR_MESSAGE.'2002',0), +2003 => array(DEFAULT_ERROR_MESSAGE.'2003',0), +2004 => array(DEFAULT_ERROR_MESSAGE.'2004',0), +2005 => array(DEFAULT_ERROR_MESSAGE.'2005',0), +2006 => array(DEFAULT_ERROR_MESSAGE.'2006',0), +2007 => array(DEFAULT_ERROR_MESSAGE.'2007',0), +2008 => array(DEFAULT_ERROR_MESSAGE.'2008',0), +2009 => array(DEFAULT_ERROR_MESSAGE.'2009',0), +2010 => array(DEFAULT_ERROR_MESSAGE.'2010',0), +2011 => array(DEFAULT_ERROR_MESSAGE.'2011',0), +2012 => array(DEFAULT_ERROR_MESSAGE.'2012',0), +2013 => array(DEFAULT_ERROR_MESSAGE.'2013',0), +2014 => array(DEFAULT_ERROR_MESSAGE.'2014',0), +3001 => array(DEFAULT_ERROR_MESSAGE.'3001',0), +4002 => array(DEFAULT_ERROR_MESSAGE.'4002',0), +5001 => array(DEFAULT_ERROR_MESSAGE.'5001',0), +5002 => array(DEFAULT_ERROR_MESSAGE.'5002',0), +5003 => array(DEFAULT_ERROR_MESSAGE.'5003',0), +5004 => array(DEFAULT_ERROR_MESSAGE.'5004',0), +6001 => array(DEFAULT_ERROR_MESSAGE.'6001',0), +6002 => array(DEFAULT_ERROR_MESSAGE.'6002',0), +6003 => array(DEFAULT_ERROR_MESSAGE.'6003',0), +6004 => array(DEFAULT_ERROR_MESSAGE.'6004',0), +6005 => array(DEFAULT_ERROR_MESSAGE.'6005',0), +6006 => array(DEFAULT_ERROR_MESSAGE.'6006',0), +6007 => array(DEFAULT_ERROR_MESSAGE.'6007',0), +6008 => array(DEFAULT_ERROR_MESSAGE.'6008',0), +6009 => array(DEFAULT_ERROR_MESSAGE.'6009',0), +6010 => array(DEFAULT_ERROR_MESSAGE.'6010',0), +6011 => array(DEFAULT_ERROR_MESSAGE.'6011',0), +6012 => array(DEFAULT_ERROR_MESSAGE.'6012',0), +6015 => array(DEFAULT_ERROR_MESSAGE.'6015',0), +6016 => array(DEFAULT_ERROR_MESSAGE.'6016',0), +6017 => array(DEFAULT_ERROR_MESSAGE.'6017',0), +6018 => array(DEFAULT_ERROR_MESSAGE.'6018',0), +6019 => array(DEFAULT_ERROR_MESSAGE.'6019',0), +6020 => array(DEFAULT_ERROR_MESSAGE.'6020',0), +6021 => array(DEFAULT_ERROR_MESSAGE.'6021',0), +6022 => array(DEFAULT_ERROR_MESSAGE.'6022',0), +6023 => array(DEFAULT_ERROR_MESSAGE.'6023',0), +6024 => array(DEFAULT_ERROR_MESSAGE.'6024',0), +6025 => array(DEFAULT_ERROR_MESSAGE.'6025',0), +6027 => array(DEFAULT_ERROR_MESSAGE.'6027',0), +6028 => array(DEFAULT_ERROR_MESSAGE.'6028',0), +6029 => array(DEFAULT_ERROR_MESSAGE.'6029',0), +6030 => array(DEFAULT_ERROR_MESSAGE.'6030',0), +6031 => array(DEFAULT_ERROR_MESSAGE.'6031',0), +6032 => array(DEFAULT_ERROR_MESSAGE.'6032',0), +7001 => array(DEFAULT_ERROR_MESSAGE.'7001',0), +8001 => array(DEFAULT_ERROR_MESSAGE.'8001',0), +8002 => array(DEFAULT_ERROR_MESSAGE.'8002',0), +8003 => array(DEFAULT_ERROR_MESSAGE.'8003',0), +8004 => array(DEFAULT_ERROR_MESSAGE.'8004',0), +9001 => array(DEFAULT_ERROR_MESSAGE.'9001',0), +10001 => array(DEFAULT_ERROR_MESSAGE.'10001',0), +10002 => array(DEFAULT_ERROR_MESSAGE.'10002',0), +10003 => array(DEFAULT_ERROR_MESSAGE.'10003',0), +11001 => array(DEFAULT_ERROR_MESSAGE.'11001',0), +11002 => array(DEFAULT_ERROR_MESSAGE.'11002',0), +11003 => array(DEFAULT_ERROR_MESSAGE.'11003',0), +11004 => array(DEFAULT_ERROR_MESSAGE.'11004',0), +11005 => array(DEFAULT_ERROR_MESSAGE.'11005',0), +12001 => array(DEFAULT_ERROR_MESSAGE.'12001',0), +12002 => array(DEFAULT_ERROR_MESSAGE.'12002',0), +12003 => array(DEFAULT_ERROR_MESSAGE.'12003',0), +12004 => array(DEFAULT_ERROR_MESSAGE.'12004',0), +12005 => array(DEFAULT_ERROR_MESSAGE.'12005',0), +12006 => array(DEFAULT_ERROR_MESSAGE.'12006',0), +12007 => array(DEFAULT_ERROR_MESSAGE.'12007',0), +12008 => array(DEFAULT_ERROR_MESSAGE.'12008',0), +12009 => array(DEFAULT_ERROR_MESSAGE.'12009',0), +12010 => array(DEFAULT_ERROR_MESSAGE.'12010',0), +12011 => array(DEFAULT_ERROR_MESSAGE.'12011',0), +12012 => array(DEFAULT_ERROR_MESSAGE.'12012',0), +14001 => array(DEFAULT_ERROR_MESSAGE.'14001',0), +14002 => array(DEFAULT_ERROR_MESSAGE.'14002',0), +14003 => array(DEFAULT_ERROR_MESSAGE.'14003',0), +14004 => array(DEFAULT_ERROR_MESSAGE.'14004',0), +14005 => array(DEFAULT_ERROR_MESSAGE.'14005',0), +14006 => array(DEFAULT_ERROR_MESSAGE.'14006',0), +14007 => array(DEFAULT_ERROR_MESSAGE.'14007',0), +15001 => array(DEFAULT_ERROR_MESSAGE.'15001',0), +15002 => array(DEFAULT_ERROR_MESSAGE.'15002',0), +15003 => array(DEFAULT_ERROR_MESSAGE.'15003',0), +15004 => array(DEFAULT_ERROR_MESSAGE.'15004',0), +15005 => array(DEFAULT_ERROR_MESSAGE.'15005',0), +15006 => array(DEFAULT_ERROR_MESSAGE.'15006',0), +15007 => array(DEFAULT_ERROR_MESSAGE.'15007',0), +15008 => array(DEFAULT_ERROR_MESSAGE.'15008',0), +15009 => array(DEFAULT_ERROR_MESSAGE.'15009',0), +15010 => array(DEFAULT_ERROR_MESSAGE.'15010',0), +15011 => array(DEFAULT_ERROR_MESSAGE.'15011',0), +16001 => array(DEFAULT_ERROR_MESSAGE.'16001',0), +16002 => array(DEFAULT_ERROR_MESSAGE.'16002',0), +16003 => array(DEFAULT_ERROR_MESSAGE.'16003',0), +16004 => array(DEFAULT_ERROR_MESSAGE.'16004',0), +17001 => array(DEFAULT_ERROR_MESSAGE.'17001',0), +17002 => array(DEFAULT_ERROR_MESSAGE.'17002',0), +17004 => array(DEFAULT_ERROR_MESSAGE.'17004',0), +18001 => array(DEFAULT_ERROR_MESSAGE.'18001',0), +18002 => array(DEFAULT_ERROR_MESSAGE.'18002',0), +18003 => array(DEFAULT_ERROR_MESSAGE.'18003',0), +18004 => array(DEFAULT_ERROR_MESSAGE.'18004',0), +18005 => array(DEFAULT_ERROR_MESSAGE.'18005',0), +18006 => array(DEFAULT_ERROR_MESSAGE.'18006',0), +18007 => array(DEFAULT_ERROR_MESSAGE.'18007',0), +18008 => array(DEFAULT_ERROR_MESSAGE.'18008',0), +19001 => array(DEFAULT_ERROR_MESSAGE.'19001',0), +19002 => array(DEFAULT_ERROR_MESSAGE.'19002',0), +19003 => array(DEFAULT_ERROR_MESSAGE.'19003',0), +20001 => array(DEFAULT_ERROR_MESSAGE.'20001',0), +20002 => array(DEFAULT_ERROR_MESSAGE.'20002',0), +20003 => array(DEFAULT_ERROR_MESSAGE.'20003',0), +21001 => array(DEFAULT_ERROR_MESSAGE.'21001',0), +23001 => array(DEFAULT_ERROR_MESSAGE.'23001',0), +23002 => array(DEFAULT_ERROR_MESSAGE.'23002',0), +23003 => array(DEFAULT_ERROR_MESSAGE.'23003',0), +24001 => array(DEFAULT_ERROR_MESSAGE.'24001',0), +24002 => array(DEFAULT_ERROR_MESSAGE.'24002',0), +24003 => array(DEFAULT_ERROR_MESSAGE.'24003',0), +25001 => array(DEFAULT_ERROR_MESSAGE.'25001',0), +25002 => array(DEFAULT_ERROR_MESSAGE.'25002',0), +25003 => array(DEFAULT_ERROR_MESSAGE.'25003',0), +25004 => array(DEFAULT_ERROR_MESSAGE.'25004',0), +25005 => array(DEFAULT_ERROR_MESSAGE.'25005',0), +25006 => array(DEFAULT_ERROR_MESSAGE.'25006',0), +25007 => array(DEFAULT_ERROR_MESSAGE.'25007',0), +25008 => array(DEFAULT_ERROR_MESSAGE.'25008',0), +25009 => array(DEFAULT_ERROR_MESSAGE.'25009',0), +25010 => array(DEFAULT_ERROR_MESSAGE.'25010',0), +25011 => array(DEFAULT_ERROR_MESSAGE.'25011',0), +25012 => array(DEFAULT_ERROR_MESSAGE.'25012',0), +25013 => array(DEFAULT_ERROR_MESSAGE.'25013',0), +25014 => array(DEFAULT_ERROR_MESSAGE.'25014',0), +25015 => array(DEFAULT_ERROR_MESSAGE.'25015',0), +25016 => array(DEFAULT_ERROR_MESSAGE.'25016',0), +25017 => array(DEFAULT_ERROR_MESSAGE.'25017',0), +25018 => array(DEFAULT_ERROR_MESSAGE.'25018',0), +25019 => array(DEFAULT_ERROR_MESSAGE.'25019',0), +25020 => array(DEFAULT_ERROR_MESSAGE.'25020',0), +25021 => array(DEFAULT_ERROR_MESSAGE.'25021',0), +25022 => array(DEFAULT_ERROR_MESSAGE.'25022',0), +25023 => array(DEFAULT_ERROR_MESSAGE.'25023',0), +25024 => array(DEFAULT_ERROR_MESSAGE.'25024',0), +25025 => array(DEFAULT_ERROR_MESSAGE.'25025',0), +25026 => array(DEFAULT_ERROR_MESSAGE.'25026',0), +25027 => array(DEFAULT_ERROR_MESSAGE.'25027',0), +25028 => array(DEFAULT_ERROR_MESSAGE.'25028',0), +25029 => array(DEFAULT_ERROR_MESSAGE.'25029',0), +25030 => array(DEFAULT_ERROR_MESSAGE.'25030',0), +25031 => array(DEFAULT_ERROR_MESSAGE.'25031',0), +25032 => array(DEFAULT_ERROR_MESSAGE.'25032',0), +25033 => array(DEFAULT_ERROR_MESSAGE.'25033',0), +25034 => array(DEFAULT_ERROR_MESSAGE.'25034',0), +25035 => array(DEFAULT_ERROR_MESSAGE.'25035',0), +25036 => array(DEFAULT_ERROR_MESSAGE.'25036',0), +25037 => array(DEFAULT_ERROR_MESSAGE.'25037',0), +25038 => array(DEFAULT_ERROR_MESSAGE.'25038',0), +25039 => array(DEFAULT_ERROR_MESSAGE.'25039',0), +25040 => array(DEFAULT_ERROR_MESSAGE.'25040',0), +25041 => array(DEFAULT_ERROR_MESSAGE.'25041',0), +25042 => array(DEFAULT_ERROR_MESSAGE.'25042',0), +25043 => array(DEFAULT_ERROR_MESSAGE.'25043',0), +25044 => array(DEFAULT_ERROR_MESSAGE.'25044',0), +25045 => array(DEFAULT_ERROR_MESSAGE.'25045',0), +25046 => array(DEFAULT_ERROR_MESSAGE.'25046',0), +25047 => array(DEFAULT_ERROR_MESSAGE.'25047',0), +25048 => array(DEFAULT_ERROR_MESSAGE.'25048',0), +25049 => array(DEFAULT_ERROR_MESSAGE.'25049',0), +25050 => array(DEFAULT_ERROR_MESSAGE.'25050',0), +25051 => array(DEFAULT_ERROR_MESSAGE.'25051',0), +25052 => array(DEFAULT_ERROR_MESSAGE.'25052',0), +25053 => array(DEFAULT_ERROR_MESSAGE.'25053',0), +25054 => array(DEFAULT_ERROR_MESSAGE.'25054',0), +25055 => array(DEFAULT_ERROR_MESSAGE.'25055',0), +25056 => array(DEFAULT_ERROR_MESSAGE.'25056',0), +25057 => array(DEFAULT_ERROR_MESSAGE.'25057',0), +25058 => array(DEFAULT_ERROR_MESSAGE.'25058',0), +25059 => array(DEFAULT_ERROR_MESSAGE.'25059',0), +25060 => array(DEFAULT_ERROR_MESSAGE.'25060',0), +25061 => array(DEFAULT_ERROR_MESSAGE.'25061',0), +25062 => array(DEFAULT_ERROR_MESSAGE.'25062',0), +25063 => array(DEFAULT_ERROR_MESSAGE.'25063',0), +25064 => array(DEFAULT_ERROR_MESSAGE.'25064',0), +25065 => array(DEFAULT_ERROR_MESSAGE.'25065',0), +25066 => array(DEFAULT_ERROR_MESSAGE.'25066',0), +25067 => array(DEFAULT_ERROR_MESSAGE.'25067',0), +25068 => array(DEFAULT_ERROR_MESSAGE.'25068',0), +25069 => array(DEFAULT_ERROR_MESSAGE.'25069',0), +25070 => array(DEFAULT_ERROR_MESSAGE.'25070',0), +25071 => array(DEFAULT_ERROR_MESSAGE.'25071',0), +25072 => array(DEFAULT_ERROR_MESSAGE.'25072',0), +25073 => array(DEFAULT_ERROR_MESSAGE.'25073',0), +25074 => array(DEFAULT_ERROR_MESSAGE.'25074',0), +25075 => array(DEFAULT_ERROR_MESSAGE.'25075',0), +25077 => array(DEFAULT_ERROR_MESSAGE.'25077',0), +25078 => array(DEFAULT_ERROR_MESSAGE.'25078',0), +25079 => array(DEFAULT_ERROR_MESSAGE.'25079',0), +25080 => array(DEFAULT_ERROR_MESSAGE.'25080',0), +25081 => array(DEFAULT_ERROR_MESSAGE.'25081',0), +25082 => array(DEFAULT_ERROR_MESSAGE.'25082',0), +25083 => array(DEFAULT_ERROR_MESSAGE.'25083',0), +25084 => array(DEFAULT_ERROR_MESSAGE.'25084',0), +25085 => array(DEFAULT_ERROR_MESSAGE.'25085',0), +25086 => array(DEFAULT_ERROR_MESSAGE.'25086',0), +25087 => array(DEFAULT_ERROR_MESSAGE.'25087',0), +25088 => array(DEFAULT_ERROR_MESSAGE.'25088',0), +25089 => array(DEFAULT_ERROR_MESSAGE.'25089',0), +25090 => array(DEFAULT_ERROR_MESSAGE.'25090',0), +25091 => array(DEFAULT_ERROR_MESSAGE.'25091',0), +25092 => array(DEFAULT_ERROR_MESSAGE.'25092',0), +25093 => array(DEFAULT_ERROR_MESSAGE.'25093',0), +25094 => array(DEFAULT_ERROR_MESSAGE.'25094',0), +25095 => array(DEFAULT_ERROR_MESSAGE.'25095',0), +25096 => array(DEFAULT_ERROR_MESSAGE.'25096',0), +25097 => array(DEFAULT_ERROR_MESSAGE.'25097',0), +25098 => array(DEFAULT_ERROR_MESSAGE.'25098',0), +25099 => array(DEFAULT_ERROR_MESSAGE.'25099',0), +25100 => array(DEFAULT_ERROR_MESSAGE.'25100',0), +25101 => array(DEFAULT_ERROR_MESSAGE.'25101',0), +25102 => array(DEFAULT_ERROR_MESSAGE.'25102',0), +25103 => array(DEFAULT_ERROR_MESSAGE.'25103',0), +25104 => array(DEFAULT_ERROR_MESSAGE.'25104',0), +25105 => array(DEFAULT_ERROR_MESSAGE.'25105',0), +25106 => array(DEFAULT_ERROR_MESSAGE.'25106',0), +25107 => array(DEFAULT_ERROR_MESSAGE.'25107',0), +25108 => array(DEFAULT_ERROR_MESSAGE.'25108',0), +25109 => array(DEFAULT_ERROR_MESSAGE.'25109',0), +25110 => array(DEFAULT_ERROR_MESSAGE.'25110',0), +25111 => array(DEFAULT_ERROR_MESSAGE.'25111',0), +25112 => array(DEFAULT_ERROR_MESSAGE.'25112',0), +25113 => array(DEFAULT_ERROR_MESSAGE.'25113',0), +25114 => array(DEFAULT_ERROR_MESSAGE.'25114',0), +25115 => array(DEFAULT_ERROR_MESSAGE.'25115',0), +25116 => array(DEFAULT_ERROR_MESSAGE.'25116',0), +25117 => array(DEFAULT_ERROR_MESSAGE.'25117',0), +25118 => array(DEFAULT_ERROR_MESSAGE.'25118',0), +25119 => array(DEFAULT_ERROR_MESSAGE.'25119',0), +25120 => array(DEFAULT_ERROR_MESSAGE.'25120',0), +25121 => array(DEFAULT_ERROR_MESSAGE.'25121',0), +25122 => array(DEFAULT_ERROR_MESSAGE.'25122',0), +25123 => array(DEFAULT_ERROR_MESSAGE.'25123',0), +25124 => array(DEFAULT_ERROR_MESSAGE.'25124',0), +25125 => array(DEFAULT_ERROR_MESSAGE.'25125',0), +25126 => array(DEFAULT_ERROR_MESSAGE.'25126',0), +25127 => array(DEFAULT_ERROR_MESSAGE.'25127',0), +25128 => array(DEFAULT_ERROR_MESSAGE.'25128',0), +25129 => array(DEFAULT_ERROR_MESSAGE.'25129',0), +24003 => array(DEFAULT_ERROR_MESSAGE.'24003',0), +24004 => array(DEFAULT_ERROR_MESSAGE.'24004',0), +24005 => array(DEFAULT_ERROR_MESSAGE.'24005',0), +24006 => array(DEFAULT_ERROR_MESSAGE.'24006',0), +24007 => array(DEFAULT_ERROR_MESSAGE.'24007',0), +24008 => array(DEFAULT_ERROR_MESSAGE.'24008',0), +24009 => array(DEFAULT_ERROR_MESSAGE.'24009',0), +24010 => array(DEFAULT_ERROR_MESSAGE.'24010',0), +24011 => array(DEFAULT_ERROR_MESSAGE.'24011',0), +24012 => array(DEFAULT_ERROR_MESSAGE.'24012',0), +24013 => array(DEFAULT_ERROR_MESSAGE.'24013',0), +24014 => array(DEFAULT_ERROR_MESSAGE.'24014',0), +24015 => array(DEFAULT_ERROR_MESSAGE.'24015',0), +22001 => array(DEFAULT_ERROR_MESSAGE.'22001',0), +22002 => array(DEFAULT_ERROR_MESSAGE.'22002',0), +22004 => array(DEFAULT_ERROR_MESSAGE.'22004',0), +22005 => array(DEFAULT_ERROR_MESSAGE.'22005',0), +22006 => array(DEFAULT_ERROR_MESSAGE.'22006',0), +22007 => array(DEFAULT_ERROR_MESSAGE.'22007',0), +22008 => array(DEFAULT_ERROR_MESSAGE.'22008',0), +22009 => array(DEFAULT_ERROR_MESSAGE.'22009',0), +22010 => array(DEFAULT_ERROR_MESSAGE.'22010',0), +22011 => array(DEFAULT_ERROR_MESSAGE.'22011',0), +22012 => array(DEFAULT_ERROR_MESSAGE.'22012',0), +22013 => array(DEFAULT_ERROR_MESSAGE.'22013',0), +22014 => array(DEFAULT_ERROR_MESSAGE.'22014',0), +22015 => array(DEFAULT_ERROR_MESSAGE.'22015',0), +22016 => array(DEFAULT_ERROR_MESSAGE.'22016',0), +22017 => array(DEFAULT_ERROR_MESSAGE.'22017',0), +22018 => array(DEFAULT_ERROR_MESSAGE.'22018',0), +22019 => array(DEFAULT_ERROR_MESSAGE.'22019',0), +22020 => array(DEFAULT_ERROR_MESSAGE.'22020',0), +13001 => array(DEFAULT_ERROR_MESSAGE.'13001',0), +13002 => array(DEFAULT_ERROR_MESSAGE.'13002',0), +1001 => array(DEFAULT_ERROR_MESSAGE.'1001',0), +1002 => array(DEFAULT_ERROR_MESSAGE.'1002',0), +1003 => array(DEFAULT_ERROR_MESSAGE.'1003',0), +1004 => array(DEFAULT_ERROR_MESSAGE.'1004',0), +1005 => array(DEFAULT_ERROR_MESSAGE.'1005',0), +1006 => array(DEFAULT_ERROR_MESSAGE.'1006',0), +1007 => array(DEFAULT_ERROR_MESSAGE.'1007',0), +1008 => array(DEFAULT_ERROR_MESSAGE.'1008',0), +1009 => array(DEFAULT_ERROR_MESSAGE.'1009',0), +1010 => array(DEFAULT_ERROR_MESSAGE.'1010',0), +1011 => array(DEFAULT_ERROR_MESSAGE.'1011',0), +26001 => array(DEFAULT_ERROR_MESSAGE.'26001',0), +26002 => array(DEFAULT_ERROR_MESSAGE.'26002',0), +26003 => array(DEFAULT_ERROR_MESSAGE.'26003',0), +26004 => array(DEFAULT_ERROR_MESSAGE.'26004',0), +26005 => array(DEFAULT_ERROR_MESSAGE.'26005',0), +26006 => array(DEFAULT_ERROR_MESSAGE.'26006',0), +26007 => array(DEFAULT_ERROR_MESSAGE.'26007',0), +26008 => array(DEFAULT_ERROR_MESSAGE.'26008',0), +26009 => array(DEFAULT_ERROR_MESSAGE.'26009',0), +26010 => array(DEFAULT_ERROR_MESSAGE.'26010',0), +26011 => array(DEFAULT_ERROR_MESSAGE.'26011',0), +26012 => array(DEFAULT_ERROR_MESSAGE.'26012',0), +26013 => array(DEFAULT_ERROR_MESSAGE.'26013',0), +26014 => array(DEFAULT_ERROR_MESSAGE.'26014',0), +26015 => array(DEFAULT_ERROR_MESSAGE.'26015',0), +26016 => array(DEFAULT_ERROR_MESSAGE.'26016',0), + +27001 => array(DEFAULT_ERROR_MESSAGE.'27001',0), +27002 => array(DEFAULT_ERROR_MESSAGE.'27002',0), +27003 => array(DEFAULT_ERROR_MESSAGE.'27003',0), +27004 => array(DEFAULT_ERROR_MESSAGE.'27004',0), +27005 => array(DEFAULT_ERROR_MESSAGE.'27005',0), +27006 => array(DEFAULT_ERROR_MESSAGE.'27006',0), +27007 => array(DEFAULT_ERROR_MESSAGE.'27007',0), +27008 => array(DEFAULT_ERROR_MESSAGE.'27008',0), +27009 => array(DEFAULT_ERROR_MESSAGE.'27009',0), +27010 => array(DEFAULT_ERROR_MESSAGE.'27010',0), +27011 => array(DEFAULT_ERROR_MESSAGE.'27011',0), +27012 => array(DEFAULT_ERROR_MESSAGE.'27012',0), +27013 => array(DEFAULT_ERROR_MESSAGE.'27013',0), +27014 => array(DEFAULT_ERROR_MESSAGE.'27014',0), +27015 => array(DEFAULT_ERROR_MESSAGE.'27015',0), +); + +?> diff --git a/modules/default/controllers/AboutController.php b/modules/default/controllers/AboutController.php new file mode 100644 index 0000000..ee7d70a --- /dev/null +++ b/modules/default/controllers/AboutController.php @@ -0,0 +1,36 @@ +view->getScriptPath('about'); + + $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("$scriptsDir/index-".$localeElements[0].".phtml")) { + $view = 'index-'.$localeElements[0]; + } else { + $view = 'index-en'; + } + + $this->render($view); + } +} diff --git a/modules/default/controllers/ErrorController.php b/modules/default/controllers/ErrorController.php new file mode 100755 index 0000000..6703c32 --- /dev/null +++ b/modules/default/controllers/ErrorController.php @@ -0,0 +1,14 @@ +user->role != User::ROLE_ADMIN && $this->underMaintenance) { + return $this->_redirectForMaintenance(); + } + } + + public function indexAction() + { + $appSession = Zend_Registry::get('appSession'); + if (isset($appSession->feedbackForm)) { + $form = $appSession->feedbackForm; + unset($appSession->feedbackForm); + } else { + $form = new FeedbackForm(null, $this->view->base); + } + $this->view->form = $form; + } + + public function sendAction() + { + $form = new FeedbackForm(null, $this->view->base); + $formData = $this->_request->getPost(); + $form->populate($formData); + + if (!$form->isValid($formData)) { + $appSession = Zend_Registry::get('appSession'); + $appSession->feedbackForm = $form; + return $this->_forward('index', null, null); + } + + $mail = self::getMail( + $form->getValue('name'), + $form->getValue('email'), + $form->getValue('feedback') + ); + + try { + $mail->send(); + $this->_helper->FlashMessenger->addMessage('Thank you for your interest. Your message has been routed.'); + } catch (Zend_Mail_Protocol_Exception $e) { + $this->_helper->FlashMessenger->addMessage('Sorry, the feedback couldn\'t be delivered. Please try again later.'); + if ($this->_config->logging->level == Zend_Log::DEBUG) { + $this->_helper->FlashMessenger->addMessage($e->getMessage()); + } + } + + $this->_redirect(''); + } + + /** + * @return Zend_Mail + * @throws Zend_Mail_Protocol_Exception + */ + public static function getMail($name, $email, $feedback) + { + // can't use $this-_config 'cause it's a static function + $configEmail = Zend_Registry::get('config')->email; + + switch (strtolower($configEmail->transport)) { + case 'smtp': + Zend_Mail::setDefaultTransport( + new Zend_Mail_Transport_Smtp( + $configEmail->host, + $configEmail->toArray() + ) + ); + break; + case 'mock': + Zend_Mail::setDefaultTransport(new Zend_Mail_Transport_Mock()); + break; + default: + Zend_Mail::setDefaultTransport(new Zend_Mail_Transport_Sendmail()); + } + + $mail = new Zend_Mail(); + $mail->setBodyText(<<setFrom('support@community-id.org'); + $mail->addTo($configEmail->supportemail); + $mail->setSubject('Community-ID feedback form'); + + return $mail; + } +} diff --git a/modules/default/controllers/HistoryController.php b/modules/default/controllers/HistoryController.php new file mode 100755 index 0000000..39dd875 --- /dev/null +++ b/modules/default/controllers/HistoryController.php @@ -0,0 +1,64 @@ +_helper->actionStack('index', 'login', 'users'); + } + + public function listAction() + { + $this->_helper->viewRenderer->setNeverRender(true); + + $histories = new Histories(); + $historiesRows = $histories->get( + $this->user, + $this->_getParam('startIndex'), + $this->_getParam('results') + ); + + $jsonObj = new StdClass(); + $jsonObj->recordsReturned = count($historiesRows); + $jsonObj->totalRecords = $histories->getNumHistories($this->user); + $jsonObj->startIndex = $this->_getParam('startIndex'); + $jsonObj->sort = null; + $jsonObj->dir = 'asc'; + $jsonObj->records = array(); + + foreach ($historiesRows as $history) { + $jsonObjSite = new StdClass(); + $jsonObjSite->id = $history->id; + $jsonObjSite->date = $history->date; + $jsonObjSite->site = $history->site; + $jsonObjSite->ip = $history->ip; + $jsonObjSite->result = $history->result; + + $jsonObj->records[] = $jsonObjSite; + } + + echo Zend_Json::encode($jsonObj); + } + + public function clearAction() + { + $this->_helper->viewRenderer->setNeverRender(true); + + $histories = new Histories(); + $histories->clear($this->user); + + $json = new StdClass(); + $json->code = 200; + + echo Zend_Json::encode($json); + } +} diff --git a/modules/default/controllers/IdentityController.php b/modules/default/controllers/IdentityController.php new file mode 100644 index 0000000..e7ff598 --- /dev/null +++ b/modules/default/controllers/IdentityController.php @@ -0,0 +1,58 @@ +getRequest()->getRequestUri()); + } + + public function idAction() + { + $currentUrl = Zend_OpenId::selfURL(); + + if ($this->_config->subdomain->enabled) { + $protocol = $this->_getProtocol(); + preg_match('#(.*)\.'.$this->_config->subdomain->hostname.'#', $currentUrl, $matches); + + $this->view->headLink()->headLink(array( + 'rel' => 'openid.server', + 'href' => "$protocol://" + . ($this->_config->subdomain->use_www? 'www.' : '') + . $this->_config->subdomain->hostname + . '/openid/provider' + )); + $this->view->headLink()->headLink(array( + 'rel' => 'openid2.provider', + 'href' => "$protocol://" + . ($this->_config->subdomain->use_www? 'www.' : '') + . $this->_config->subdomain->hostname + . '/openid/provider' + )); + } else { + preg_match('#(.*)/identity/#', $currentUrl, $matches); + + $this->view->headLink()->headLink(array( + 'rel' => 'openid.server', + 'href' => $matches[1] . '/openid/provider', + )); + $this->view->headLink()->headLink(array( + 'rel' => 'openid2.provider', + 'href' => $matches[1] . '/openid/provider', + )); + } + + $this->view->idUrl = $currentUrl; + } +} diff --git a/modules/default/controllers/IndexController.php b/modules/default/controllers/IndexController.php new file mode 100644 index 0000000..4a77a6a --- /dev/null +++ b/modules/default/controllers/IndexController.php @@ -0,0 +1,87 @@ +view->getScriptPaths(); + + $locale = Zend_Registry::get('Zend_Locale'); + // render() changes _ to - + $locale = str_replace('_', '-', $locale); + $localeElements = explode('-', $locale); + + $view = false; + foreach ($scriptsDir as $scriptDir) { + if (file_exists($scriptDir."index/subheader-$locale.phtml")) { + $view = "subheader-$locale"; + break; + } else if (count($localeElements == 2) + && file_exists($scriptDir."index/subheader-".$localeElements[0].".phtml")) { + $view = 'subheader-'.$localeElements[0]; + break; + } + } + if (!$view) { + $view = 'subheader-en'; + } + + $this->getResponse()->insert('subHeader', $this->view->render("index/$view.phtml")); + + $this->_helper->actionStack('index', 'login', 'users'); + + try { + $feed = Zend_Feed::import($this->_config->news_feed->url); + } catch (Zend_Exception $e) { + // feed import failed + $obj = new StdClass(); + $obj->link = array('href' => ''); + $obj->title = $this->view->translate('Could not retrieve news items'); + $obj->updated = ''; + $obj->content = ''; + $feed = array($obj); + } + + $this->view->news = array(); + $i = 0; + foreach ($feed as $item) { + if ($i++ >= $this->_config->news_feed->num_items) { + break; + } + + if (strlen($item->content) > self::NEWS_CONTENT_MAX_LENGTH) { + $item->content = substr($item->content, 0, self::NEWS_CONTENT_MAX_LENGTH) + . '...
    ' . $this->view->translate('Read More') . ''; + } + $this->view->news[] = $item; + } + + $view = false; + foreach ($scriptsDir as $scriptDir) { + if (file_exists($scriptDir."index/index-$locale.phtml")) { + $view = "index-$locale"; + break; + } else if (count($localeElements == 2) + && file_exists($scriptDir."index/index-".$localeElements[0].".phtml")) { + $view = 'index-'.$localeElements[0]; + break; + } + } + if (!$view) { + $view = 'index-en'; + } + + $this->render($view); + } +} diff --git a/modules/default/controllers/LearnmoreController.php b/modules/default/controllers/LearnmoreController.php new file mode 100644 index 0000000..6b1f2a3 --- /dev/null +++ b/modules/default/controllers/LearnmoreController.php @@ -0,0 +1,37 @@ +view->getScriptPath('learnmore'); + + $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("$scriptsDir/index-".$localeElements[0].".phtml")) { + $view = 'index-'.$localeElements[0]; + } else { + $view = 'index-en'; + } + + $this->render($view); + } +} + diff --git a/modules/default/controllers/MaintenancemodeController.php b/modules/default/controllers/MaintenancemodeController.php new file mode 100644 index 0000000..d535a54 --- /dev/null +++ b/modules/default/controllers/MaintenancemodeController.php @@ -0,0 +1,35 @@ +_settings = new Settings(); + } + + public function enableAction() + { + $this->_settings->set(Settings::MAINTENANCE_MODE, 1); + + $this->_redirect(''); + } + + public function disableAction() + { + $this->_settings->set(Settings::MAINTENANCE_MODE, 0); + + $this->_redirect(''); + } +} diff --git a/modules/default/controllers/MessageusersController.php b/modules/default/controllers/MessageusersController.php new file mode 100644 index 0000000..607b634 --- /dev/null +++ b/modules/default/controllers/MessageusersController.php @@ -0,0 +1,130 @@ +messageUsersForm)) { + $this->view->messageUsersForm = $appSession->messageUsersForm; + unset($appSession->messageUsersForm); + } else { + $this->view->messageUsersForm = new MessageUsersForm(); + } + + $this->_helper->actionStack('index', 'login', 'users'); + } + + public function sendAction() + { + $form = new MessageUsersForm(); + $formData = $this->_request->getPost(); + + $form->populate($formData); + if (!$form->isValid($formData)) { + return $this->_redirectFaultyForm($form); + } + + $cc = $form->getValue('cc'); + $ccArr = array(); + if (trim($cc) != '') { + $validator = new Zend_Validate_EmailAddress(); + $ccArr = explode(',', $cc); + for ($i = 0; $i < count($ccArr); $i++) { + $ccArr[$i] = trim($ccArr[$i]); + if (!$validator->isValid($ccArr[$i])) { + foreach ($validator->getMessages() as $messageId => $message) { + $form->cc->addError($this->view->translate('CC field must be a comma-separated list of valid E-mails')); + return $this->_redirectFaultyForm($form); + } + } + } + } + + $mail = self::getMail( + $form->getValue('subject'), + $this->_getParam('messageType'), + $this->_getParam('messageType') == 'plain'? + $form->getValue('bodyPlain') + : $form->getValue('bodyHTML') + ); + + $mail->setSubject($form->getValue('subject')); + if ($this->_getParam('messageType') == 'plain') { + $mail->setBodyText($form->getValue('bodyPlain')); + } else { + $mail->setBodyHtml($form->getValue('bodyHTML')); + } + + $users = new Users(); + foreach ($users->getUsers() as $user) { + $mail->addTo($user->email); + } + + foreach ($ccArr as $cc) { + $mail->addCC($cc); + } + + try { + $mail->send(); + $this->_helper->FlashMessenger->addMessage('Message has been sent'); + } catch (Zend_Mail_Protocol_Exception $e) { + $this->_helper->FlashMessenger->addMessage('There was an error trying to send the message'); + if ($this->_config->logging->level == Zend_Log::DEBUG) { + $this->_helper->FlashMessenger->addMessage($e->getMessage()); + + return $this->_redirectFaultyForm($form); + } + } + + $this->_redirect(''); + } + + private function _redirectFaultyForm(Zend_Form $form) + { + $appSession = Zend_Registry::get('appSession'); + $appSession->messageUsersForm = $form; + + return $this->_forward('index'); + } + + /** + * @return Zend_Mail + * @throws Zend_Mail_Protocol_Exception + */ + public static function getMail() + { + // can't use $this->_config 'cause we're in a static function + $configEmail = Zend_Registry::get('config')->email; + switch (strtolower($configEmail->transport)) { + case 'smtp': + Zend_Mail::setDefaultTransport( + new Zend_Mail_Transport_Smtp( + $configEmail->host, + $configEmail->toArray() + ) + ); + break; + case 'mock': + Zend_Mail::setDefaultTransport(new Zend_Mail_Transport_Mock()); + break; + default: + Zend_Mail::setDefaultTransport(new Zend_Mail_Transport_Sendmail()); + } + + $mail = new Zend_Mail('UTF-8'); + $mail->setFrom('support@community-id.org'); + + return $mail; + } +} + diff --git a/modules/default/controllers/OpenidController.php b/modules/default/controllers/OpenidController.php new file mode 100644 index 0000000..11d74ea --- /dev/null +++ b/modules/default/controllers/OpenidController.php @@ -0,0 +1,178 @@ +_proceed(); + } else { + Zend_OpenId::$exitOnRedirect = false; + + $this->_helper->layout->disableLayout(); + $this->_helper->viewRenderer->setNeverRender(true); + + $server = $this->_getOpenIdProvider(); + $response = new Zend_Controller_Response_Http(); + $ret = $server->handle(null, new Zend_OpenId_Extension_Sreg(), $response); + Zend_Registry::get('logger')->log("RET: ".print_r($ret, true), Zend_Log::DEBUG); + Zend_Registry::get('logger')->log("RESPONSE: ".print_r($response->getHeaders(), true), Zend_Log::DEBUG); + if (is_string($ret)) { + echo $ret; + } else if ($ret !== true) { + header('HTTP/1.0 403 Forbidden'); + Zend_Registry::get('logger')->log("OpenIdController::providerAction: FORBIDDEN", Zend_Log::DEBUG); + echo 'Forbidden'; + } elseif ($ret === true + // Zend_OpenId is messy and can change the type of the response I initially sent >:| + && is_a($response, 'Zend_Controller_Response_Http')) + + { + $headers = $response->getHeaders(); + if (isset($headers[0]['name']) && $headers[0]['name'] == 'Location' + // redirection to the Trust page is not logged + && strpos($headers[0]['value'], '/openid/trust') === false + && strpos($headers[0]['value'], '/openid/login') === false) + { + if (strpos($headers[0]['value'], 'openid.mode=cancel') !== false) { + $this->_saveHistory($server, History::DENIED); + } else { + $this->_saveHistory($server, History::AUTHORIZED); + } + } + } + } + } + + public function loginAction() + { + $appSession = Zend_Registry::get('appSession'); + if (isset($appSession->openidLoginForm)) { + $this->view->form = $appSession->openidLoginForm; + unset($appSession->openidLoginForm); + } else { + $this->view->form = new OpenidLoginForm(); + } + $this->view->form->openIdIdentity->setValue(htmlspecialchars($_GET['openid_identity'])); + + $this->view->queryString = $_SERVER['QUERY_STRING']; + } + + public function authenticateAction() + { + $form = new OpenidLoginForm(); + $formData = $this->_request->getPost(); + $form->populate($formData); + + if (!$form->isValid($formData)) { + $appSession = Zend_Registry::get('appSession'); + $appSession->openidLoginForm = $form; + return $this->_forward('login', null, null); + } + + $server = $this->_getOpenIdProvider(); + $server->login($form->getValue('openIdIdentity'), $form->getValue('password')); + + // needed for unit tests + $this->_helper->layout->disableLayout(); + $this->_helper->viewRenderer->setNeverRender(true); + + Zend_OpenId::redirect($this->view->base . '/openid/provider', $_GET); + } + + public function trustAction() + { + $server = $this->_getOpenIdProvider(); + $this->view->siteRoot = $server->getSiteRoot($_GET); + $this->view->identityUrl = $server->getLoggedInUser($_GET); + $this->view->queryString = $_SERVER['QUERY_STRING']; + + $sreg = new Zend_OpenId_Extension_Sreg(); + $sreg->parseRequest($_GET); + + $this->view->fields = array(); + $this->view->policyUrl = false; + + $props = $sreg->getProperties(); + if (is_array($props) && count($props) > 0) { + $personalInfoForm = new PersonalInfoForm(null, $this->user, $props); + $this->view->fields = $personalInfoForm->getElements(); + + $policy = $sreg->getPolicyUrl(); + if (!empty($policy)) { + $this->view->policyUrl = $policy; + } + } + } + + private function _proceed() + { + // needed for unit tests + $this->_helper->layout->disableLayout(); + $this->_helper->viewRenderer->setNeverRender(true); + + $server = $this->_getOpenIdProvider(); + + $sreg = new Zend_OpenId_Extension_Sreg(); + $sreg->parseRequest($_GET); + $props = $sreg->getProperties(); + + $personalInfoForm = new PersonalInfoForm(null, $this->user, $props); + $formData = $this->_request->getPost(); + $personalInfoForm->populate($formData); + + // not planning on validating stuff here yet, but I call this + // for the date element to be filled properly + $personalInfoForm->isValid($formData); + + $sreg->parseResponse($personalInfoForm->getValues()); + if (isset($_POST['allow'])) { + if (isset($_POST['forever'])) { + $server->allowSite($server->getSiteRoot($_GET), $sreg); + } + unset($_GET['openid_action']); + + $this->_saveHistory($server, History::AUTHORIZED); + + $server->respondToConsumer($_GET, $sreg); + } else if (isset($_POST['deny'])) { + if (isset($_POST['forever'])) { + $server->denySite($server->getSiteRoot($_GET)); + } + + $this->_saveHistory($server, History::DENIED); + + Zend_OpenId::redirect($_GET['openid_return_to'], array('openid.mode'=>'cancel')); + } + } + private function _saveHistory(Zend_OpenId_Provider $server, $result) + { + $histories = new Histories(); + $history = $histories->createRow(); + $history->user_id = $this->user->id; + $history->date = date('Y-m-d H:i:s'); + $history->site = $server->getSiteRoot($_GET); + $history->ip = $_SERVER['REMOTE_ADDR']; + $history->result = $result; + $history->save(); + } + + private function _getOpenIdProvider() + { + $server = new Zend_OpenId_Provider($this->view->base . '/openid/login', + $this->view->base . '/openid/trust', + new OpenIdUser(), + new Monkeys_OpenId_Provider_Storage_Database()); + + return $server; + } +} diff --git a/modules/default/controllers/PrivacyController.php b/modules/default/controllers/PrivacyController.php new file mode 100644 index 0000000..3a2f64c --- /dev/null +++ b/modules/default/controllers/PrivacyController.php @@ -0,0 +1,32 @@ +view->privacyPolicy = nl2br(file_get_contents($file)); + } +} diff --git a/modules/default/controllers/SitesController.php b/modules/default/controllers/SitesController.php new file mode 100644 index 0000000..362fc21 --- /dev/null +++ b/modules/default/controllers/SitesController.php @@ -0,0 +1,121 @@ +_helper->actionStack('index', 'login', 'users'); + } + + public function listAction() + { + $this->_helper->viewRenderer->setNeverRender(true); + + $fields = new Fields(); + $sites = new Sites(); + $sitesRows = $sites->get( + $this->user, + $this->_getParam('startIndex'), + $this->_getParam('results') + ); + + $jsonObj = new StdClass(); + $jsonObj->recordsReturned = count($sitesRows); + $jsonObj->totalRecords = $sites->getNumSites($this->user); + $jsonObj->startIndex = $this->_getParam('startIndex'); + $jsonObj->sort = null; + $jsonObj->dir = 'asc'; + $jsonObj->records = array(); + + foreach ($sitesRows as $site) { + $jsonObjSite = new StdClass(); + $jsonObjSite->id = $site->id; + $jsonObjSite->site = $site->site; + + $trusted = unserialize($site->trusted); + $jsonObjSite->trusted = (is_bool($trusted) && $trusted) || is_array($trusted); + + if (is_array($trusted) + && isset($trusted['Zend_OpenId_Extension_Sreg']) + && count($trusted['Zend_OpenId_Extension_Sreg']) > 0) + { + $translatedTrusted = array(); + foreach ($trusted['Zend_OpenId_Extension_Sreg'] as $identifier => $value) { + $translatedTrusted[$this->view->translate($fields->getFieldName($identifier))] = $value; + } + $jsonObjSite->infoExchanged = $translatedTrusted; + } else { + $jsonObjSite->infoExchanged = false; + } + + $jsonObj->records[] = $jsonObjSite; + } + + echo Zend_Json::encode($jsonObj); + } + + public function denyAction() + { + $this->_helper->viewRenderer->setNeverRender(true); + + $sites = new Sites(); + $site = $sites->getRowInstance($this->_getParam('id')); + if ($site->user_id != $this->user->id) { + throw new Monkeys_AccessDeniedException(); + } + + $site->trusted = serialize(false); + $site->save(); + + $json = new StdClass(); + $json->code = 200; + + echo Zend_Json::encode($json); + } + + public function allowAction() + { + $this->_helper->viewRenderer->setNeverRender(true); + + $sites = new Sites(); + $site = $sites->getRowInstance($this->_getParam('id')); + if ($site->user_id != $this->user->id) { + throw new Monkeys_AccessDeniedException(); + } + + $site->trusted = serialize(true); + $site->save(); + + $json = new StdClass(); + $json->code = 200; + + echo Zend_Json::encode($json); + } + + public function deleteAction() + { + $this->_helper->viewRenderer->setNeverRender(true); + + $sites = new Sites(); + $site = $sites->getRowInstance($this->_getParam('id')); + if ($site->user_id != $this->user->id) { + throw new Monkeys_AccessDeniedException(); + } + + $site->delete(); + + $json = new StdClass(); + $json->code = 200; + + echo Zend_Json::encode($json); + } +} diff --git a/modules/default/forms/ErrorMessages.php b/modules/default/forms/ErrorMessages.php new file mode 100644 index 0000000..4018e32 --- /dev/null +++ b/modules/default/forms/ErrorMessages.php @@ -0,0 +1,25 @@ +_baseWebDir = $baseWebDir; + parent::__construct($options); + } + + public function init() + { + $name = new Monkeys_Form_Element_Text('name'); + translate('Enter your name'); + $name->setLabel('Enter your name') + ->setRequired(true); + + $email = new Monkeys_Form_Element_Text('email'); + translate('Enter your E-mail'); + $email->setLabel('Enter your E-mail') + ->addFilter('StringToLower') + ->setRequired(true) + ->addValidator('EmailAddress'); + + $feedback = new Monkeys_Form_Element_Textarea('feedback'); + translate('Enter your questions or comments'); + $feedback->setLabel('Enter your questions or comments') + ->setRequired(true) + ->setAttrib('cols', 60) + ->setAttrib('rows', 4); + + // ZF has some bugs when using mutators here, so I have to use the config array + translate('Please enter the text below'); + $captcha = new Monkeys_Form_Element_Captcha('captcha', array( + 'label' => 'Please enter the text below', + 'captcha' => array( + 'captcha' => 'Image', + 'sessionClass' => get_class(Zend_Registry::get('appSession')), + 'font' => APP_DIR . '/libs/Monkeys/fonts/Verdana.ttf', + 'imgDir' => APP_DIR . '/webdir/captchas', + 'imgUrl' => $this->_baseWebDir . '/captchas', + 'wordLen' => 4, + 'fontSize' => 30, + 'timeout' => 300, + ) + )); + + $this->addElements(array($name, $email, $feedback, $captcha)); + } +} diff --git a/modules/default/forms/MessageUsersForm.php b/modules/default/forms/MessageUsersForm.php new file mode 100644 index 0000000..ea2fc9b --- /dev/null +++ b/modules/default/forms/MessageUsersForm.php @@ -0,0 +1,34 @@ +setLabel('Subject:') + ->setRequired(true); + + $cc = new Zend_Form_Element_Text('cc'); + translate('CC:'); + $cc->setLabel('CC:'); + + $bodyPlain = new Zend_Form_Element_Textarea('bodyPlain'); + translate('Body:'); + $bodyPlain->setLabel('Body:'); + + $bodyHTML = new Zend_Form_Element_Textarea('bodyHTML'); + $bodyHTML->setLabel('Body:'); + + $this->addElements(array($subject, $cc, $bodyPlain, $bodyHTML)); + } +} diff --git a/modules/default/forms/OpenidLoginForm.php b/modules/default/forms/OpenidLoginForm.php new file mode 100644 index 0000000..fc7b2c3 --- /dev/null +++ b/modules/default/forms/OpenidLoginForm.php @@ -0,0 +1,28 @@ +setLabel('Username') + ->setRequired(true); + + $password = new Zend_Form_Element_Password('password'); + translate('Password'); + $password->setLabel('Password') + ->setRequired(true); + + $this->addElements(array($openIdIdentity, $password)); + } +} diff --git a/modules/default/models/Association.php b/modules/default/models/Association.php new file mode 100644 index 0000000..fa6bf89 --- /dev/null +++ b/modules/default/models/Association.php @@ -0,0 +1,15 @@ +select() + ->where('handle=?', $handle); + + return $this->fetchRow($select); + } +} diff --git a/modules/default/models/Field.php b/modules/default/models/Field.php new file mode 100644 index 0000000..6f1a993 --- /dev/null +++ b/modules/default/models/Field.php @@ -0,0 +1,68 @@ +id; + + switch ($this->type) { + case self::TYPE_TEXT: + $el = new Monkeys_Form_Element_Text($varname); + break; + case self::TYPE_DATE: + $el = new Monkeys_Form_Element_Date($varname); + $el->addValidator('date') + ->setShowEmptyValues(true) + ->setStartEndYear(1900, date('Y') - 7) + ->setReverseYears(true); + break; + case self::TYPE_GENDER: + translate('Male'); + translate('Female'); + $el = new Monkeys_Form_Element_Radio($varname); + $el->setSeparator('  ') + ->addMultiOption('M', 'Male') + ->addMultiOption('F', 'Female'); + break; + case self::TYPE_COUNTRY: + $el = new Monkeys_Form_Element_Country($varname); + break; + case self::TYPE_LANGUAGE: + $el = new Monkeys_Form_Element_Language($varname); + break; + case self::TYPE_TIMEZONE: + $el = new Monkeys_Form_Element_Timezone($varname); + break; + case self::TYPE_EMAIL: + $el = new Monkeys_Form_Element_Text($varname); + $el->addValidator('EmailAddress'); + break; + default: + throw new Exception('Unknown field type: ' . $this->type); + break; + } + $el->setLabel($this->name); + $el->setValue($this->value); + + return $el; + } +} diff --git a/modules/default/models/Fields.php b/modules/default/models/Fields.php new file mode 100644 index 0000000..f0df667 --- /dev/null +++ b/modules/default/models/Fields.php @@ -0,0 +1,55 @@ +id; + $select = $this->select() + ->setIntegrityCheck(false) + ->from('fields') + ->joinLeft('fields_values', "fields_values.field_id=fields.id AND fields_values.user_id=".$user->id); + + return $this->fetchAll($select); + } + + public function getFieldName($fieldIdentifier) + { + if (!$this->_fieldsNames) { + foreach ($this->fetchAll($this->select()) as $field) { + $this->_fieldsNames[$field->openid] = $field->name; + } + } + + return $this->_fieldsNames[$fieldIdentifier]; + } + + private function _translationPlaceholders() + { + translate('Nickname'); + translate('E-mail'); + translate('Full Name'); + translate('Date of Birth'); + translate('Gender'); + translate('Postal Code'); + translate('Country'); + translate('Language'); + translate('Time Zone'); + } +} diff --git a/modules/default/models/FieldsValue.php b/modules/default/models/FieldsValue.php new file mode 100644 index 0000000..7874701 --- /dev/null +++ b/modules/default/models/FieldsValue.php @@ -0,0 +1,15 @@ +getAdapter()->quoteInto('user_id=?', $user->id); + $this->delete($where); + } +} diff --git a/modules/default/models/Histories.php b/modules/default/models/Histories.php new file mode 100755 index 0000000..43774b6 --- /dev/null +++ b/modules/default/models/Histories.php @@ -0,0 +1,51 @@ +select() + ->where('user_id=?', $user->id); + + if ($startIndex !== false && $results !== false) { + $select = $select->limit($results, $startIndex); + } + + return $this->fetchAll($select); + } + + public function getNumHistories(User $user) + { + $sites = $this->get($user, false, false); + + return count($sites); + } + + public function clear(User $user) + { + $where = $this->getAdapter()->quoteInto('user_id=?', $user->id); + $this->delete($where); + } + + public function clearOldEntries() + { + $days = Zend_Registry::get('config')->environment->keep_history_days; + + $where = $this->getAdapter()->quoteInto('date < ?', date('Y-m-d', time() - $days * 86400)); + $this->delete($where); + } +} diff --git a/modules/default/models/History.php b/modules/default/models/History.php new file mode 100755 index 0000000..d4b3f7c --- /dev/null +++ b/modules/default/models/History.php @@ -0,0 +1,17 @@ +select() + ->where('name=?', $name); + + $row = $this->fetchRow($select); + + return $row->value; + } + + public function set($name, $value) + { + $this->update(array('value' => $value), $this->getAdapter()->quoteInto('name=?', $name)); + } + + public function isMaintenanceMode() + { + return $this->get(self::MAINTENANCE_MODE); + } +} diff --git a/modules/default/models/Site.php b/modules/default/models/Site.php new file mode 100644 index 0000000..7f26b25 --- /dev/null +++ b/modules/default/models/Site.php @@ -0,0 +1,15 @@ +getAdapter()->quoteInto('user_id=?',$user->id); + $where2 = $this->getAdapter()->quoteInto('site=?', $site); + $this->delete("$where1 AND $where2"); + } + + public function get(User $user, $startIndex, $results) + { + $select = $this->select() + ->where('user_id=?', $user->id); + + if ($startIndex !== false && $results !== false) { + $select = $select->limit($results, $startIndex); + } + + return $this->fetchAll($select); + } + + public function getNumSites(User $user) + { + $sites = $this->get($user, false, false); + + return count($sites); + } + + public function getTrusted(User $user) + { + $select = $this->select() + ->where('user_id=?', $user->id); + + return $this->fetchAll($select); + } +} diff --git a/modules/default/views/scripts/about/index-de.phtml b/modules/default/views/scripts/about/index-de.phtml new file mode 100644 index 0000000..81ef206 --- /dev/null +++ b/modules/default/views/scripts/about/index-de.phtml @@ -0,0 +1,22 @@ +

    + Community-ID ist ein Service, zur Verfügung gestellt mit freundlicher Unterstützung von Keyboard Monkeys Ltd., Community as a Service ™. +

    + +

    + Keyboard Monkeys Ltd. konzentriert sich auf Open-Source-Lösungen und Produkte zur Bildung von Communities über das Internet. Wie bieten auch Consulting so wie ein breites Spektrum an Unterstützung für Open-Source-Technologien aber speziell bieten wir Community-basierte Lösungen und Produkte. +

    + +

    + Weitere Produkte oder Services welche wir zur Zeit anbieten oder welche sich in der Planung befinden: +

      +
    • + Sciret - Enterprise Knowledge Base System +
    • +
    • + TextRoller - Blogging Platform +
    • +
    • + Community Solutions - Open Source Project Collaboration (Zur Zeit unter interner Entwicklung) +
    • +
    +

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

    + Community-ID is a service brought to you by Keyboard Monkeys Ltd., Community as a Service ™. +

    + +

    + Keyboard Monkeys Ltd. focuses on providing open source solutions and products aimed at empowering communities accross the Internet. We also do private consulting, providing a wide range of support for open source technologies, but specially we are offering community based solutions and products. +

    + +

    + These are other services and products currently offered, or under planning: +

      +
    • + 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/about/index-es.phtml b/modules/default/views/scripts/about/index-es.phtml new file mode 100644 index 0000000..9044766 --- /dev/null +++ b/modules/default/views/scripts/about/index-es.phtml @@ -0,0 +1,22 @@ +

    + Community-ID es un servicio traído a ustedes por Keyboard Monkeys Ltd., Community as a Service ™. +

    + +

    + Keyboard Monkeys Ltd. está enfocada en proveer productos y soluciones Open Source dirijidas a la potenciación de comunidades a través de Internet. También hacemos consultoría privada, proporcionando un amplio rango de soporte a tecnologías Open Source, pero especialmente ofreciendo productos y soluciones basados en comunidades. +

    + +

    + Estos son otros productos y servicio actualmente ofrecidos, o en desarrollo: +

      +
    • + Sciret - Sistema Empresarial de Base de Conocimientos +
    • +
    • + TextRoller - Plataforma de Blogging +
    • +
    • + Community Solutions - Open Source Project Collaboration (actualmente bajo desarrollo) +
    • +
    +

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

    + Community-ID is a service brought to you by Keyboard Monkeys Ltd., Community as a Service ™. +

    + +

    + Keyboard Monkeys Ltd. focuses on providing open source solutions and products aimed at empowering communities accross the Internet. We also do private consulting, providing a wide range of support for open source technologies, but specially we are offering community based solutions and products. +

    + +

    + These are other services and products currently offered, or under planning: +

      +
    • + 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 new file mode 100755 index 0000000..511707b --- /dev/null +++ b/modules/default/views/scripts/error/error.phtml @@ -0,0 +1,18 @@ + + + + + Error + + +

    An error occurred

    + message ?> + trace): ?> +
    +Stack Trace:
    +trace ?>
    +    
    + + + + diff --git a/modules/default/views/scripts/feedback/index.phtml b/modules/default/views/scripts/feedback/index.phtml new file mode 100644 index 0000000..b261dec --- /dev/null +++ b/modules/default/views/scripts/feedback/index.phtml @@ -0,0 +1,11 @@ +

    translate('In order to serve you better, we have provided the form below for your questions and comments') ?>

    +
    + form->name ?> + form->email ?> + form->feedback ?> + form->captcha ?> + + +
    diff --git a/modules/default/views/scripts/history/index.phtml b/modules/default/views/scripts/history/index.phtml new file mode 100755 index 0000000..c7c677b --- /dev/null +++ b/modules/default/views/scripts/history/index.phtml @@ -0,0 +1,25 @@ + +
    +
    +
    + + +
    diff --git a/modules/default/views/scripts/identity/id.phtml b/modules/default/views/scripts/identity/id.phtml new file mode 100644 index 0000000..1738a26 --- /dev/null +++ b/modules/default/views/scripts/identity/id.phtml @@ -0,0 +1,4 @@ +
    + This is the identity page for the Community-ID user identified with: +

    idUrl ?>

    +
    diff --git a/modules/default/views/scripts/index/index-de.phtml b/modules/default/views/scripts/index/index-de.phtml new file mode 100644 index 0000000..78a2445 --- /dev/null +++ b/modules/default/views/scripts/index/index-de.phtml @@ -0,0 +1,40 @@ +
    +

    + Community ID: Freie OpenID Authentifizierung
    + 100% basierend auf Open Source Technologie +

    +
    +
    +

    + Von beginn an wurde Community-ID entwickelt mit Sicherheit als wichtigem Ziel. Jede Komponente in unserem Technologie-Stack wurde ausgewählt nachdem die Sicherheits Historie begutachtet wurde und am wichtigsten, alles was verwendet wurde ist Open Source. +

    +

    + Das heißt, die ganze Welt kann sehen was wir machen. Es ist eine erwiesene Tatsache das Sicherheit durch Verschleiern nicht funktioniert und wenn Sie ein Produkt auswählen wo der darunterliegende Mechanismus als Geheimnis behandelt wird setzen Sie ihre Daten (und hiermit sich selbst) einer großen Gefahr aus. +

    +

    + Auf was warten Sie noch?
    + Vereinfachen Sie Ihr Leben und verringern das Risiko.

    + ERÖFFNEN SIE JETZT EIN KONTO +

    +
    +
    +
    +

    Letzte News

    +
      + news as $item): ?> +
    • +
      + title ?> +
      +
      + content ?> +
      +
    • + +
      +
    +
    +
    +
    +
    +
    diff --git a/modules/default/views/scripts/index/index-en.phtml b/modules/default/views/scripts/index/index-en.phtml new file mode 100644 index 0000000..b99e5d8 --- /dev/null +++ b/modules/default/views/scripts/index/index-en.phtml @@ -0,0 +1,40 @@ +
    +

    + Community ID: Free OpenID Authentication
    + Backed 100% with Open Source Technologies +

    +
    +
    +

    + Since its inception Community-ID has been built with security as the foremost concern. Every element in our technology stack has been chosen looking at its security record, and most importantly, everything is Open Source. +

    +

    + This means we're open to scrutiny by the entire world. It is already a proven fact that security by obscurity doesn't work, and when you use a product or service whose underlying mechanism is kept as a secret, you're putting your data (and therefore yourself) into great risk. +

    +

    + What are you waiting for?
    + Simplify your life and reduce your risk exposure.

    + OPEN AN ACCOUNT NOW +

    +
    +
    +
    +

    Latest News

    +
      + news as $item): ?> +
    • +
      + title ?> +
      +
      + content ?> +
      +
    • + +
      +
    +
    +
    +
    +
    +
    diff --git a/modules/default/views/scripts/index/index-es.phtml b/modules/default/views/scripts/index/index-es.phtml new file mode 100644 index 0000000..1ace0d9 --- /dev/null +++ b/modules/default/views/scripts/index/index-es.phtml @@ -0,0 +1,40 @@ +
    +

    + Community ID: Autenticación OpenID gratis
    + Respaldada al 100% con Tecnologías Open Source +

    +
    +
    +

    + Desde su inicio Community-ID has sido construída con la seguridad como su fundamento más importante. Cada elemento en nuestra pila de tecnologías ha sido escogida de acuerdo a su historial de seguridad. Y lo más importante: todo es Open Source. +

    +

    + Esto significa que estamos abiertos al escrutinio del mundo entero. Es ya un hecho provado que la seguridad por obscuridad no funciona, y cuando usted usa un producto o servicio cuyo mecanismo subyacente es guardado como un secreto, está poniendo sus datos (y por ende a usted mismo) bajo un gran riesgo. +

    +

    + ¿Qué está esperando?
    + Simplifique su vida y reduzca su exposición al riesgo.

    + ABRA UNA CUENTA AHORA +

    +
    +
    +
    +

    Ultimas Noticias

    +
      + news as $item): ?> +
    • +
      + title ?> +
      +
      + content ?> +
      +
    • + +
      +
    +
    +
    +
    +
    +
    diff --git a/modules/default/views/scripts/index/subheader-de.phtml b/modules/default/views/scripts/index/subheader-de.phtml new file mode 100755 index 0000000..1dbdd5f --- /dev/null +++ b/modules/default/views/scripts/index/subheader-de.phtml @@ -0,0 +1 @@ + diff --git a/modules/default/views/scripts/index/subheader-en.phtml b/modules/default/views/scripts/index/subheader-en.phtml new file mode 100755 index 0000000..1dbdd5f --- /dev/null +++ b/modules/default/views/scripts/index/subheader-en.phtml @@ -0,0 +1 @@ + diff --git a/modules/default/views/scripts/index/subheader-es.phtml b/modules/default/views/scripts/index/subheader-es.phtml new file mode 100755 index 0000000..1dbdd5f --- /dev/null +++ b/modules/default/views/scripts/index/subheader-es.phtml @@ -0,0 +1 @@ + diff --git a/modules/default/views/scripts/messageusers/index.phtml b/modules/default/views/scripts/messageusers/index.phtml new file mode 100644 index 0000000..154f639 --- /dev/null +++ b/modules/default/views/scripts/messageusers/index.phtml @@ -0,0 +1,54 @@ + +translate('This message will be sent to all registered Community-ID users') ?> +
    + +
    + messageUsersForm->subject ?> + messageUsersForm->cc ?> +
    +
    + + +
    + +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + diff --git a/modules/default/views/scripts/openid/login.phtml b/modules/default/views/scripts/openid/login.phtml new file mode 100644 index 0000000..d5079c8 --- /dev/null +++ b/modules/default/views/scripts/openid/login.phtml @@ -0,0 +1,10 @@ +
    +
    + form->openIdIdentity ?> + form->password ?> + + +
    +
    diff --git a/modules/default/views/scripts/openid/trust.phtml b/modules/default/views/scripts/openid/trust.phtml new file mode 100644 index 0000000..939d109 --- /dev/null +++ b/modules/default/views/scripts/openid/trust.phtml @@ -0,0 +1,35 @@ +
    +
    + translate('A site identifying as %s has asked for confirmation that %s is your identity URL.', '' . $this->siteRoot . '', '' . $this->identityUrl . '') ?> +
    +
    + + fields): ?> +
    + 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.''); ?>

    + + +
    + translate('Forever') ?> +
    +
    + + + +
    +
    +
    diff --git a/modules/default/views/scripts/privacy/index.phtml b/modules/default/views/scripts/privacy/index.phtml new file mode 100644 index 0000000..004ed0e --- /dev/null +++ b/modules/default/views/scripts/privacy/index.phtml @@ -0,0 +1,4 @@ +

    translate('Privacy Policy') ?>

    +
    + privacyPolicy ?> +
    diff --git a/modules/default/views/scripts/sites/index.phtml b/modules/default/views/scripts/sites/index.phtml new file mode 100644 index 0000000..9b7a674 --- /dev/null +++ b/modules/default/views/scripts/sites/index.phtml @@ -0,0 +1,35 @@ + +
    +
    +
    +
    translate('Information Exchanged') ?>
    +
    + translate('Information exchanged with:') ?>
    + +
    +
    + + +
    +
    +
    diff --git a/modules/install/controllers/CompleteController.php b/modules/install/controllers/CompleteController.php new file mode 100644 index 0000000..4d904da --- /dev/null +++ b/modules/install/controllers/CompleteController.php @@ -0,0 +1,19 @@ +_getErrors()) { + return $this->_forward('index', 'permissions', null, array('errors' => $errors)); + } + + $appSession = Zend_Registry::get('appSession'); + if (isset($appSession->installForm)) { + $this->view->form = $appSession->installForm; + unset($appSession->installForm); + } else { + $this->view->form = new InstallForm(); + } + } + + public function saveAction() + { + $form = new InstallForm(); + $formData = $this->_request->getPost(); + + $form->populate($formData); + if (!$form->isValid($formData)) { + return $this->_forwardFormError($form); + } + + if (!$this->_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.'); + 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.'); + return $this->_forwardFormError($form); + } + + $this->_importDb(); + + if (!$this->_writeConfig($form)) { + throw new Exception('Couldn\'t write to config file file ' . APP_DIR . DIRECTORY_SEPARATOR . 'config.php'); + } + + $this->_forward('index', 'complete'); + } + + private function _connectToDbEngine(InstallForm $form) + { + $this->_config->database->params->host = $form->getValue('hostname'); + $this->_config->database->params->username = $form->getValue('dbusername'); + $this->_config->database->params->password = $form->getValue('dbpassword'); + + // setting dbname to null makes Zend_Db::getConnection() try to connect to the db engine + // without attempting to connect to the dbname + $this->_config->database->params->dbname = null; + + return Setup::setDatabase(); + } + + private function _createDbIfMissing(InstallForm $form) + { + $this->_config->database->params->host = $form->getValue('hostname'); + $this->_config->database->params->username = $form->getValue('dbusername'); + $this->_config->database->params->password = $form->getValue('dbpassword'); + + $this->_config->database->params->dbname = $form->getValue('dbname'); + + if (!Setup::setDatabase()) { + try { + $this->_config->database->params->dbname = null; + Setup::setDatabase(); + + // binding doesn't work here for some reason + Zend_Registry::get('db')->getConnection()->query("CREATE DATABASE `" . $form->getValue('dbname') . "`"); + $this->_config->database->params->dbname = $form->getValue('dbname'); + Setup::setDatabase(); + } catch (PDOException $e) { // when using PDO, it throws this exception, not Zend's + return false; + } + } + + return true; + } + + private function _writeConfig(InstallForm $form) + { + $this->_config->environment->installed = true; + $this->_config->email->supportemail = $form->getValue('supportemail'); + + $configTemplate = file_get_contents(APP_DIR . DIRECTORY_SEPARATOR . 'config.template.php'); + $replace = array( + '{environment.installed}' => $this->_config->environment->installed? 'true' : 'false', + '{environment.session_name}' => $this->_config->environment->session_name, + '{environment.production}' => $this->_config->environment->production? 'true' : 'false', + '{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.registrations_enabled}' => $this->_config->environment->registrations_enabled? 'true' : 'false', + '{environment.locale}' => $this->_config->environment->locale, + '{environment.template}' => $this->_config->environment->template, + '{news_feed.url}' => $this->_config->news_feed->url, + '{news_feed.num_items}' => $this->_config->news_feed->num_items, + '{logging.location}' => $this->_config->logging->location, + '{logging.level}' => $this->_config->logging->level, + '{subdomain.enabled}' => $this->_config->subdomain->enabled? 'true' : 'false', + '{subdomain.hostname}' => $this->_config->subdomain->hostname, + '{subdomain.use_www}' => $this->_config->subdomain->use_www? 'true' : 'false', + '{SSL.enable_mixed_mode}' => $this->_config->SSL->enable_mixed_mode? 'true' : 'false', + '{database.adapter}' => $this->_config->database->adapter, + '{database.params.host}' => $this->_config->database->params->host, + '{database.params.dbname}' => $this->_config->database->params->dbname, + '{database.params.username}' => $this->_config->database->params->username, + '{database.params.password}' => $this->_config->database->params->password, + '{email.supportemail}' => $this->_config->email->supportemail, + '{email.adminemail}' => $this->_config->email->adminemail, + '{email.transport}' => $this->_config->email->transport, + '{email.host}' => $this->_config->email->host, + '{email.auth}' => $this->_config->email->auth, + '{email.username}' => $this->_config->email->username, + '{email.password}' => $this->_config->email->password, + ); + $configTemplate = str_replace(array_keys($replace), array_values($replace), $configTemplate); + + return @file_put_contents(APP_DIR . DIRECTORY_SEPARATOR . 'config.php', $configTemplate); + } + + private function _importDb() + { + $this->_runSqlFILE('final.sql'); + } + + function _runSqlFile($fileName) { + $fp = fopen(APP_DIR . DIRECTORY_SEPARATOR . "/setup/$fileName", 'r'); + $query = ''; + $db = Zend_Registry::get('db'); + while (!feof($fp)) { + $line = trim(fgets($fp)); + + // skip SQL comments + if (substr($line, 0, 2) == '--') { + continue; + } + + $query .= $line; + if ((substr($line, -1, 1) == ';' || feof($fp)) && $query != '') { + // I had to resort to a direct call because regexes inside the Zend Framework are segfaulting with the long queries in sampleData.sql + //$this->db->query($query); + $db->getConnection()->query($query); + + $query = ''; + } + } + fclose($fp); + } + + private function _forwardFormError(InstallForm $form) + { + $appSession = Zend_Registry::get('appSession'); + $appSession->installForm = $form; + $this->_redirect('/install/credentials'); + return; + } + + private function _getErrors() + { + $errors = array(); + $webServerUser = $this->_getProcessUser(); + + if (!is_writable(APP_DIR) && !is_writable(APP_DIR . '/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); + } + if (!is_writable(WEB_DIR . '/captchas')) { + $errors[] = $this->view->translate('The directory "captchas" under the web directory for Community-ID must be writable by the web server user (%s)', $webServerUser); + } + + return $errors; + } + + private function _getProcessUser() + { + if (!function_exists('posix_getpwuid')) { + // we're on windows + return getenv('USERNAME'); + } + + $processUser = posix_getpwuid(posix_geteuid()); + + return $processUser['name']; + } +} diff --git a/modules/install/controllers/IndexController.php b/modules/install/controllers/IndexController.php new file mode 100644 index 0000000..ad9f82f --- /dev/null +++ b/modules/install/controllers/IndexController.php @@ -0,0 +1,19 @@ +view->errors = $this->_getParam('errors'); + } +} diff --git a/modules/install/forms/InstallForm.php b/modules/install/forms/InstallForm.php new file mode 100644 index 0000000..81a29f3 --- /dev/null +++ b/modules/install/forms/InstallForm.php @@ -0,0 +1,44 @@ +setLabel('Hostname:') + ->setDescription('usually localhost') + ->setRequired(true) + ->setValue('localhost'); + + $dbname = new Zend_Form_Element_Text('dbname'); + $dbname->setLabel('Database name:') + ->setRequired(true) + ->setValue(Zend_Registry::get('config')->database->params->dbname); + + $dbusername = new Zend_Form_Element_Text('dbusername'); + $dbusername->setLabel('Database username:') + ->setRequired(true); + + $dbpassword = new Zend_Form_Element_Password('dbpassword'); + $dbpassword->setLabel('Database password:'); + + $supportemail = new Zend_Form_Element_Text('supportemail'); + $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') + ->addValidator('EmailAddress') + ->setRequired(true); + + $this->addElements(array($hostname, $dbname, $dbusername, $dbpassword, $supportemail)); + } +} diff --git a/modules/install/views/scripts/complete/index.phtml b/modules/install/views/scripts/complete/index.phtml new file mode 100644 index 0000000..8cc6de8 --- /dev/null +++ b/modules/install/views/scripts/complete/index.phtml @@ -0,0 +1,20 @@ +

    + translate('The installation was performed successfully') ?> +

    +
    +
    + You can login as the administrator with the username "admin" and the password "admin"
    + Please note that this user is only meant for administrative tasks, and cannot have an OpenID credential. +
    +
    + +
    + +
    diff --git a/modules/install/views/scripts/credentials/index.phtml b/modules/install/views/scripts/credentials/index.phtml new file mode 100644 index 0000000..7f1fc32 --- /dev/null +++ b/modules/install/views/scripts/credentials/index.phtml @@ -0,0 +1,16 @@ +

    + translate('Database and E-mail information') ?> +

    +
    +
    + form->hostname ?> + form->dbname ?> + form->dbusername ?> + form->dbpassword ?> + form->supportemail ?> +
    + + +
    diff --git a/modules/install/views/scripts/index/index.phtml b/modules/install/views/scripts/index/index.phtml new file mode 100644 index 0000000..6e97e30 --- /dev/null +++ b/modules/install/views/scripts/index/index.phtml @@ -0,0 +1,14 @@ +

    + translate('This Community-ID instance hasn\'t been installed yet') ?> +

    +
    + + +
    diff --git a/modules/install/views/scripts/permissions/index.phtml b/modules/install/views/scripts/permissions/index.phtml new file mode 100644 index 0000000..b2766bb --- /dev/null +++ b/modules/install/views/scripts/permissions/index.phtml @@ -0,0 +1,19 @@ +

    + translate('Please correct the following problems before proceeding:') ?> +

    +
      + errors as $error): ?> +
    • + +
    +
    + + +
    diff --git a/modules/stats/controllers/AuthorizationsController.php b/modules/stats/controllers/AuthorizationsController.php new file mode 100644 index 0000000..1b7cec4 --- /dev/null +++ b/modules/stats/controllers/AuthorizationsController.php @@ -0,0 +1,106 @@ +view->weekSelected = ''; + $this->view->yearSelected = ''; + + switch ($this->_getParam('type')) { + case 'year': + $this->view->yearSelected = 'selected="true"'; + $this->view->type = 'year'; + break; + default: + $this->view->weekSelected = 'selected="true"'; + $this->view->type = 'week'; + } + + $this->view->rand = rand(0, 1000); + } + + public function graphAction() + { + 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); + $graph->SetScale("textlin"); + $graph->img->SetMargin(0,30,20,40); + $graph->yaxis->scale->SetGrace(20); + $graph->yaxis->HideLabels(); + $graph->yaxis->HideTicks(); + $graph->ygrid->SetFill(true,'#EFEFEF@0.5','#BBCCFF@0.5'); + + $labelsy = array(); + $datay = array(); + + switch ($this->_getParam('type')) { + case 'year': + $this->_populateYearData($labelsy, $datay); + break; + default: + $this->_populateWeekData($labelsy, $datay); + } + + $graph->xaxis->SetTickLabels($labelsy); + $bplot = new BarPlot($datay); + + $bplot->SetFillGradient("navy","lightsteelblue",GRAD_WIDE_MIDVER); + $bplot->value->Show(); + $bplot->value->SetFormat('%d'); + $graph->Add($bplot); + + $graph->Stroke(); + } + + private function _populateWeekData(&$labelsy, &$datay) + { + $stats = new Stats(); + $authorizations = $stats->getNumAuthorizationsDays(strtotime('-1 week'), time()); + + for ($i = -7; $i < 0; $i++) { + $time = strtotime("$i days"); + $date = date('Y-m-d', $time); + $labelsy[] = Stats::$weekDays[date('w', $time)]; + if (isset($authorizations[$date])) { + $datay[] = $authorizations[$date]['entry']; + } else { + $datay[] = 0; + } + } + } + + private function _populateYearData(&$labelsy, &$datay) + { + $stats = new Stats(); + $firstDayOfMonth = date('Y-' . date('m') . '-01'); + $authorizations = $stats->getNumAuthorizationsYear(strtotime('-11 months', strtotime($firstDayOfMonth)), time()); + + for ($i = -11; $i <= 0; $i++) { + $time = strtotime("$i months"); + $monthNumber = date('n', $time); + $labelsy[] = Stats::$months[$monthNumber]; + if (isset($authorizations[$monthNumber])) { + $datay[] = $authorizations[$monthNumber]['entry']; + } else { + $datay[] = 0; + } + } + } +} diff --git a/modules/stats/controllers/IndexController.php b/modules/stats/controllers/IndexController.php new file mode 100644 index 0000000..8bfea0a --- /dev/null +++ b/modules/stats/controllers/IndexController.php @@ -0,0 +1,19 @@ +view->weekSelected = ''; + $this->view->yearSelected = ''; + + switch ($this->_getParam('type')) { + case 'month': + $this->view->monthSelected = 'selected="true"'; + $this->view->type = 'month'; + break; + case 'year': + $this->view->yearSelected = 'selected="true"'; + $this->view->type = 'year'; + break; + default: + $this->view->weekSelected = 'selected="true"'; + $this->view->type = 'week'; + } + + $this->view->rand = rand(0, 1000); + } + + public function graphAction() + { + 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->SetMarginColor('white'); + $graph->SetFrame(false); + $graph->SetScale("textlin"); + $graph->img->SetMargin(0,30,20,40); + $graph->yaxis->scale->SetGrace(20); + $graph->yaxis->HideLabels(); + $graph->yaxis->HideTicks(); + $graph->ygrid->SetFill(true,'#EFEFEF@0.5','#BBCCFF@0.5'); + + $labelsy = array(); + $datay = array(); + + switch ($this->_getParam('type')) { + case 'month': + $this->_populateMonthData($labelsy, $datay); + break; + case 'year': + $this->_populateYearData($labelsy, $datay); + break; + default: + $this->_populateWeekData($labelsy, $datay); + } + + $graph->xaxis->SetTickLabels($labelsy); + $bplot = new BarPlot($datay); + + $bplot->SetFillGradient("navy","lightsteelblue",GRAD_WIDE_MIDVER); + $bplot->value->Show(); + $bplot->value->SetFormat('%d'); + $graph->Add($bplot); + + $graph->Stroke(); + } + + private function _populateWeekData(&$labelsy, &$datay) + { + $stats = new Stats(); + $registeredUsers = $stats->getNumRegisteredUsersDays(strtotime('-1 week'), time()); + + for ($i = -7; $i < 0; $i++) { + $time = strtotime("$i days"); + $date = date('Y-m-d', $time); + $labelsy[] = Stats::$weekDays[date('w', $time)]; + if (isset($registeredUsers[$date])) { + $datay[] = $registeredUsers[$date]['users']; + } else { + $datay[] = 0; + } + } + } + + private function _populateMonthData(&$labelsy, &$datay) + { + $stats = new Stats(); + $registeredUsers = $stats->getNumRegisteredUsersDays(strtotime('-30 days'), strtotime('-1 week')); + + for ($i = -30; $i < -7; $i++) { + $time = strtotime("$i days"); + $date = date('Y-m-d', $time); + $labelsy[] = date('j', $time); + if (isset($registeredUsers[$date])) { + $datay[] = $registeredUsers[$date]['users']; + } else { + $datay[] = 0; + } + } + } + + private function _populateYearData(&$labelsy, &$datay) + { + $stats = new Stats(); + $firstDayOfMonth = date('Y-' . date('m') . '-01'); + $registeredUsers = $stats->getNumRegisteredUsersYear(strtotime('-11 months', strtotime($firstDayOfMonth)), time()); + + for ($i = -11; $i <= 0; $i++) { + $time = strtotime("$i months"); + $monthNumber = date('n', $time); + $labelsy[] = Stats::$months[$monthNumber]; + if (isset($registeredUsers[$monthNumber])) { + $datay[] = $registeredUsers[$monthNumber]['users']; + } else { + $datay[] = 0; + } + } + } +} diff --git a/modules/stats/controllers/SitesController.php b/modules/stats/controllers/SitesController.php new file mode 100644 index 0000000..44f29f6 --- /dev/null +++ b/modules/stats/controllers/SitesController.php @@ -0,0 +1,168 @@ +view->weekSelected = ''; + $this->view->yearSelected = ''; + + switch ($this->_getParam('type')) { + case 'year': + $this->view->yearSelected = 'selected="true"'; + $this->view->type = 'year'; + break; + default: + $this->view->weekSelected = 'selected="true"'; + $this->view->type = 'week'; + } + + $this->view->rand = rand(0, 1000); + } + + public function graphAction() + { + 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->yaxis->HideLabels(); + $graph->yaxis->HideTicks(); + $graph->yaxis->scale->SetGrace(20); + $graph->y2axis->SetColor("black","red"); + $graph->ygrid->SetFill(true,'#EFEFEF@0.5','#BBCCFF@0.5'); + + $labelsy = array(); + $datay = array(); + $datay2 = array(); + + switch ($this->_getParam('type')) { + case 'year': + $this->_populateYearData($labelsy, $datay, $datay2); + break; + default: + $this->_populateWeekData($labelsy, $datay, $datay2); + } + + $graph->xaxis->SetTickLabels($labelsy); + + $bplot = new BarPlot($datay); + $bplot->setLegend(utf8_decode($this->view->translate('Trusted sites'))); + $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'))); + + $graph->Add($bplot); + $graph->AddY2($p1); + + $graph->legend->SetLayout(LEGEND_HOR); + $graph->legend->Pos(0.5,0.99,"center","bottom"); + + $graph->Stroke(); + } + + private function _populateWeekData(&$labelsy, &$datay, &$datay2) + { + $stats = new Stats(); + $initialTrustedSites = $stats->getNumTrustedSites(strtotime('-1 week')); + $initialRegisteredUsers = $stats->getNumRegisteredUsers(strtotime('-1 week')); + + $sites = $stats->getNumTrustedSitesDays(strtotime('-1 week'), time()); + $numUsers = $stats->getNumRegisteredUsersDays(strtotime('-1 week'), time()); + + for ($i = -7; $i < 0; $i++) { + $time = strtotime("$i days"); + $date = date('Y-m-d', $time); + $labelsy[] = Stats::$weekDays[date('w', $time)]; + + if (isset($sites[$date])) { + $sitesPeriod = $sites[$date]['site']; + } else { + $sitesPeriod = 0; + } + + if (isset($numUsers[$date])) { + $usersPeriod = $numUsers[$date]['users']; + } else { + $usersPeriod = 0; + } + + if ($i > -7) { + $datay[] = $datay[$i + 6] + $sitesPeriod; + $datay2[] = $datay2[$i + 6] + $usersPeriod; + } else { + $datay[] = $initialTrustedSites + $sitesPeriod; + $datay2[] = $initialRegisteredUsers + $usersPeriod; + } + } + + for ($i = 0; $i < count($datay2); $i++) { + $datay2[$i] = round($datay[$i] / $datay2[$i], 2); + } + } + + private function _populateYearData(&$labelsy, &$datay, &$datay2) + { + $stats = new Stats(); + $initialTrustedSites = $stats->getNumTrustedSites(strtotime('-1 week')); + $initialRegisteredUsers = $stats->getNumRegisteredUsers(strtotime('-1 week')); + + $firstDayOfMonth = date('Y-' . date('m') . '-01'); + + $sites = $stats->getNumTrustedSitesYear(strtotime('-11 months', strtotime($firstDayOfMonth)), time()); + $numUsers = $stats->getNumRegisteredUsersYear(strtotime('-1 week'), time()); + + for ($i = -11; $i <= 0; $i++) { + $time = strtotime("$i months"); + $monthNumber = date('n', $time); + $labelsy[] = Stats::$months[$monthNumber]; + + if (isset($sites[$monthNumber])) { + $sitesPeriod = $sites[$monthNumber]['site']; + } else { + $sitesPeriod = 0; + } + + if (isset($numUsers[$monthNumber])) { + $usersPeriod = $numUsers[$monthNumber]['users']; + } else { + $usersPeriod = 0; + } + + if ($i > -11) { + $datay[] = $datay[$i + 10] + $sitesPeriod; + $datay2[] = $datay2[$i + 10] + $usersPeriod; + } else { + $datay[] = $initialTrustedSites + $sitesPeriod; + $datay2[] = $initialRegisteredUsers + $usersPeriod; + } + } + + for ($i = 0; $i < count($datay2); $i++) { + $datay2[$i] = round($datay[$i] / $datay2[$i], 2); + } + } +} + diff --git a/modules/stats/controllers/TopController.php b/modules/stats/controllers/TopController.php new file mode 100644 index 0000000..a15d663 --- /dev/null +++ b/modules/stats/controllers/TopController.php @@ -0,0 +1,19 @@ +view->sites = $stats->getTopTenSites(); + } +} diff --git a/modules/stats/models/Stats.php b/modules/stats/models/Stats.php new file mode 100644 index 0000000..0bbda10 --- /dev/null +++ b/modules/stats/models/Stats.php @@ -0,0 +1,161 @@ + 'J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'); + + public function __construct() + { + $this->_db = Zend_Registry::get('db'); + } + + /** + * @return Array + */ + public function getNumRegisteredUsersDays($unixDateStart, $unixDateEnd) + { + $select = $this->_db->select()->from('users', array('registration_date' => 'registration_date', 'users' => 'COUNT(registration_date)')) + ->where('registration_date >= ?', strftime('%Y-%m-%d', $unixDateStart)) + ->where('registration_date < ?', strftime('%Y-%m-%d', $unixDateEnd)) + ->group('registration_date') + ->order('registration_date'); + + return $this->_db->fetchAssoc($select); + } + + /** + * @return Array + */ + public function getNumRegisteredUsersYear($unixDateStart, $unixDateEnd) + { + $select = $this->_db->select()->from('users', array('registration_date' => 'MONTH(registration_date)', 'users' => 'COUNT(MONTH(registration_date))')) + ->where('registration_date >= ?', strftime('%Y-%m-%d', $unixDateStart)) + ->where('registration_date <= ?', strftime('%Y-%m-%d', $unixDateEnd)) + ->group('MONTH(registration_date)') + ->order('registration_date'); + + return $this->_db->fetchAssoc($select); + } + + /** + * @return int + */ + public function getNumRegisteredUsers($unixDate) + { + $select = $this->_db->select()->from('users') + ->where('registration_date < ?', strftime('%Y-%m-%d', $unixDate)); + + + $statement = $this->_db->prepare($select); + $statement->execute(); + + return $statement->rowCount(); + } + + /** + * @return Array + */ + public function getAllTestUsersIds() + { + $select = $this->_db->select()->from('users', 'id'); + + return $this->_db->fetchAll($select); + } + + /** + * @return Array + */ + public function getNumAuthorizationsDays($unixDateStart, $unixDateEnd) + { + $select = $this->_db->select()->from('history', array('date' => 'DATE(date)', 'entry' => 'COUNT(DATE(date))')) + ->where('date>= ?', strftime('%Y-%m-%d', $unixDateStart)) + ->where('date< ?', strftime('%Y-%m-%d', $unixDateEnd)) + ->group('DATE(date)') + ->order('date'); + + return $this->_db->fetchAssoc($select); + } + + /** + * @return Array + */ + public function getNumAuthorizationsYear($unixDateStart, $unixDateEnd) + { + $select = $this->_db->select()->from('history', array('date' => 'MONTH(date)', 'entry' => 'COUNT(MONTH(date))')) + ->where('date>= ?', strftime('%Y-%m-%d', $unixDateStart)) + ->where('date<= ?', strftime('%Y-%m-%d', $unixDateEnd)) + ->group('MONTH(date)') + ->order('date'); + + return $this->_db->fetchAssoc($select); + } + + /** + * @return int + */ + public function getNumTrustedSites($unixDate) + { + $select = $this->_db->select()->from('sites') + ->where('creation_date < ?', strftime('%Y-%m-%d', $unixDate)); + + + $statement = $this->_db->prepare($select); + $statement->execute(); + + return $statement->rowCount(); + } + + /** + * @return Array + */ + public function getNumTrustedSitesDays($unixDateStart, $unixDateEnd) + { + $select = $this->_db->select()->from('sites', array('creation_date' => 'creation_date', 'site' => 'COUNT(creation_date)')) + ->where('creation_date>= ?', strftime('%Y-%m-%d', $unixDateStart)) + ->where('creation_date< ?', strftime('%Y-%m-%d', $unixDateEnd)) + ->group('creation_date') + ->order('creation_date'); + + return $this->_db->fetchAssoc($select); + } + + /** + * @return Array + */ + public function getNumTrustedSitesYear($unixDateStart, $unixDateEnd) + { + $select = $this->_db->select()->from('sites', array('creation_date' => 'MONTH(creation_date)', 'site' => 'COUNT(MONTH(creation_date))')) + ->where('creation_date>= ?', strftime('%Y-%m-%d', $unixDateStart)) + ->where('creation_date<= ?', strftime('%Y-%m-%d', $unixDateEnd)) + ->group('MONTH(creation_date)') + ->order('creation_date'); + + return $this->_db->fetchAssoc($select); + } + + /** + * @return Array + */ + public function getTopTenSites() + { + $select = $this->_db->select()->from('sites', array('num' => 'COUNT(site)', 'site' => 'site')) + ->group('site') + ->order('num DESC') + ->limit(10); + + return $this->_db->fetchAll($select); + } +} diff --git a/modules/stats/views/scripts/authorizations/index.phtml b/modules/stats/views/scripts/authorizations/index.phtml new file mode 100644 index 0000000..ae55dba --- /dev/null +++ b/modules/stats/views/scripts/authorizations/index.phtml @@ -0,0 +1,10 @@ +

    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 new file mode 100644 index 0000000..b8d3e5d --- /dev/null +++ b/modules/stats/views/scripts/index/index.phtml @@ -0,0 +1,24 @@ + + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    diff --git a/modules/stats/views/scripts/registrations/index.phtml b/modules/stats/views/scripts/registrations/index.phtml new file mode 100644 index 0000000..9785dca --- /dev/null +++ b/modules/stats/views/scripts/registrations/index.phtml @@ -0,0 +1,10 @@ +

    translate('Registrations per day') ?>

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

    translate('Trusted Sites') ?>

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

    translate('Top 10 Trusted Sites') ?>

    + + sites as $num => $siteInfo): ?> + + + + + + +
    (translate('%s users', $siteInfo['num']) ?>)
    diff --git a/modules/users/controllers/LoginController.php b/modules/users/controllers/LoginController.php new file mode 100755 index 0000000..8940772 --- /dev/null +++ b/modules/users/controllers/LoginController.php @@ -0,0 +1,89 @@ +view->maintenanceEnabled = $settings->isMaintenanceMode(); + + $appSession = Zend_Registry::get('appSession'); + if (isset($appSession->loginForm)) { + $this->view->loginForm = $appSession->loginForm; + unset($appSession->loginForm); + } else { + $this->view->loginForm = new LoginForm(); + } + + if ($this->_config->SSL->enable_mixed_mode) { + $this->view->loginTargetBase = 'https://' . $_SERVER['HTTP_HOST'] . $this->view->base; + } else { + $this->view->loginTargetBase = $this->view->base; + } + + $this->_helper->viewRenderer->setResponseSegment('sidebar'); + } + + public function authenticateAction() + { + $auth = Zend_Auth::getInstance(); + + $form = new LoginForm(); + $formData = $this->_request->getPost(); + $form->populate($formData); + $appSession = Zend_Registry::get('appSession'); + + if (!$form->isValid($formData)) { + $appSession->loginForm = $form; + $this->_redirectToNormalConnection(''); + } + + $db = Zend_Db::factory($this->_config->database); + $authAdapter = new Zend_Auth_Adapter_DbTable($db, 'users', 'username', 'password', 'MD5(CONCAT(openid, ?))'); + $authAdapter->setIdentity($this->_request->getPost('username')); + $authAdapter->setCredential($this->_request->getPost('password')); + + $result = $auth->authenticate($authAdapter); + + if ($result->isValid()) { + $users = new Users(); + $user = $users->getUser($result->getIdentity()); + + // $user might not exist when the openid validation passed, but there's no + // user in the system with that openid identity + if (!$user) { + Zend_Auth::getInstance()->clearIdentity(); + $this->_helper->FlashMessenger->addMessage('Invalid credentials'); + } else { + $auth->getStorage()->write($user); + + if ($user->role != User::ROLE_ADMIN && $this->underMaintenance) { + Zend_Auth::getInstance()->clearIdentity(); + + return $this->_redirectForMaintenance(true); + } + } + } else { + $this->_helper->FlashMessenger->addMessage('Invalid credentials'); + $appSession->loginForm = $form; + } + + $this->_redirectToNormalConnection(''); + } + + public function logoutAction() + { + Zend_Auth::getInstance()->clearIdentity(); + + $this->_redirect(''); + } +} diff --git a/modules/users/controllers/ManageusersController.php b/modules/users/controllers/ManageusersController.php new file mode 100644 index 0000000..3171208 --- /dev/null +++ b/modules/users/controllers/ManageusersController.php @@ -0,0 +1,33 @@ +_helper->actionStack('index', 'login', 'users'); + } + + public function deleteAction() + { + $this->_helper->layout->disableLayout(); + $this->_helper->viewRenderer->setNeverRender(true); + + $this->targetUser->delete(); + echo $this->view->translate('User has been deleted successfully'); + } + + public function deleteunconfirmedAction() + { + $users = new Users(); + $users->deleteUnconfirmed(); + } +} diff --git a/modules/users/controllers/PersonalinfoController.php b/modules/users/controllers/PersonalinfoController.php new file mode 100644 index 0000000..220a2d7 --- /dev/null +++ b/modules/users/controllers/PersonalinfoController.php @@ -0,0 +1,72 @@ +_helper->actionStack('index', 'login', 'users'); + } + + public function showAction() + { + $fields = new Fields(); + $this->view->fields = $fields->getValues($this->user); + } + + public function editAction() + { + $appSession = Zend_Registry::get('appSession'); + if (isset($appSession->personalInfoForm)) { + $this->view->fields = $appSession->personalInfoForm->getElements(); + unset($appSession->personalInfoForm); + } else { + $personalInfoForm = new PersonalInfoForm(null, $this->user); + $this->view->fields = $personalInfoForm->getElements(); + } + } + + public function saveAction() + { + $form = new PersonalInfoForm(null, $this->user); + $formData = $this->_request->getPost(); + + $form->populate($formData); + if (!$form->isValid($formData)) { + $appSession = Zend_Registry::get('appSession'); + $appSession->personalInfoForm = $form; + $this->_forward('edit'); + return; + } + + $fieldsValues = new FieldsValues(); + $fieldsValues->deleteForUser($this->user); + + foreach ($form->getValues() as $fieldName => $fieldValue) { + if (!$fieldValue) { + continue; + } + + $fieldsValue = $fieldsValues->createRow(); + $fieldsValue->user_id = $this->user->id; + + list(, $fieldId) = explode('_', $fieldName); + $fieldsValue->field_id = $fieldId; + + $fieldsValue->value = $fieldValue; + + $fieldsValue->save(); + } + + + $this->_forward('show'); + } +} diff --git a/modules/users/controllers/ProfileController.php b/modules/users/controllers/ProfileController.php new file mode 100755 index 0000000..fb6121b --- /dev/null +++ b/modules/users/controllers/ProfileController.php @@ -0,0 +1,22 @@ +targetUser->id && $this->user->role != User::ROLE_ADMIN) { + throw new Monkeys_AccessDeniedException(); + } + + $this->_helper->actionStack('index', 'login', 'users'); + } +} diff --git a/modules/users/controllers/ProfilegeneralController.php b/modules/users/controllers/ProfilegeneralController.php new file mode 100644 index 0000000..90466a8 --- /dev/null +++ b/modules/users/controllers/ProfilegeneralController.php @@ -0,0 +1,307 @@ +user->role != User::ROLE_ADMIN + && $this->targetUser->id != $this->user->id) + { + throw new Monkeys_AccessDeniedException(); + } + } + + public function accountinfoAction() + { + } + + 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 != User::ROLE_ADMIN)) + { + throw new Monkeys_AccessDeniedException(); + } + + $appSession = Zend_Registry::get('appSession'); + if (isset($appSession->accountInfoForm)) { + $this->view->accountInfoForm = $appSession->accountInfoForm; + unset($appSession->accountInfoForm); + } else { + $this->view->accountInfoForm = new AccountInfoForm(null, $this->targetUser); + $this->view->accountInfoForm->populate(array( + 'username' => $this->targetUser->username, + 'firstname' => $this->targetUser->firstname, + 'lastname' => $this->targetUser->lastname, + 'email' => $this->targetUser->email, + )); + } + } + + 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 + throw new Monkeys_AccessDeniedException(); + } + + $form = new AccountInfoForm(null, $this->targetUser); + $formData = $this->_request->getPost(); + + $form->populate($formData); + if (!$form->isValid($formData)) { + return $this->_redirectInvalidForm($form); + } + + $existingUsernameOrEmail = false; + $newUsername = $form->getValue('username'); + if (($isNewUser && $this->_usernameAlreadyExists($newUsername)) + || (!$isNewUser && ($this->targetUser->username != $newUsername) + && $this->_usernameAlreadyExists($newUsername))) + { + $form->username->addError($this->view->translate('This username is already in use')); + $existingUsernameOrEmail = true; + } + + $newEmail = $form->getValue('email'); + if (($isNewUser && $this->_emailAlreadyExists($newEmail)) + || (!$isNewUser && ($this->targetUser->email != $newEmail) + && $this->_emailAlreadyExists($newEmail))) + { + $form->email->addError($this->view->translate('This E-mail is already in use')); + $existingUsernameOrEmail = true; + } + + if ($existingUsernameOrEmail) { + return $this->_redirectInvalidForm($form); + } + + $this->targetUser->username = $newUsername; + $this->targetUser->firstname = $form->getValue('firstname'); + $this->targetUser->lastname = $form->getValue('lastname'); + $this->targetUser->email = $newEmail; + if ($isNewUser) { + $this->targetUser->accepted_eula = 1; + $this->targetUser->registration_date = date('Y-m-d'); + $this->targetUser->openid = $this->_generateOpenId($this->targetUser->username); + $this->targetUser->role = User::ROLE_REGISTERED; + $this->targetUser->setClearPassword($form->getValue('password1')); + } + $this->targetUser->save(); + + /** + * When the form is submitted through a YUI request using a file, an iframe is used, + * so the framework doesn't detected it as ajax, so we have to manually ensure the + * layout is not shown. + */ + $this->_helper->layout->disableLayout(); + $this->_forward('accountinfo', null , null, array('userid' => $this->targetUser->id)); + } + + private function _usernameAlreadyExists($username) + { + $users = $this->_getUsers(); + return $users->getUser($username); + } + + private function _emailAlreadyExists($email) + { + $users = $this->_getUsers(); + return $users->getUserWithEmail($email); + } + + private function _redirectInvalidForm(Zend_Form $form) + { + $appSession = Zend_Registry::get('appSession'); + $appSession->accountInfoForm = $form; + + /** + * When the form is submitted through a YUI request using a file, an iframe is used, + * so the framework doesn't detected it as ajax, so we have to manually ensure the + * layout is not shown. + */ + $this->_helper->layout->disableLayout(); + $this->_forward('editaccountinfo', null , null, array('userid' => $this->targetUser->id)); + return; + } + + /** + * Only the users themselves can change their passwords + */ + public function changepasswordAction() + { + if ($this->targetUser->id != $this->user->id) + { + throw new Monkeys_AccessDeniedException(); + } + + $appSession = Zend_Registry::get('appSession'); + if (isset($appSession->changePasswordForm)) { + $this->view->changePasswordForm = $appSession->changePasswordForm; + unset($appSession->changePasswordForm); + } else { + $this->view->changePasswordForm = new ChangePasswordForm(); + } + } + + public function savepasswordAction() + { + if ($this->targetUser->id != $this->user->id) + { + throw new Monkeys_AccessDeniedException(); + } + + $form = new ChangePasswordForm(); + $formData = $this->_request->getPost(); + $form->populate($formData); + if (!$form->isValid($formData)) { + $appSession = Zend_Registry::get('appSession'); + $appSession->changePasswordForm = $form; + return $this->_forward('changepassword', null , null, array('userid' => $this->targetUser->id)); + } + + $this->targetUser->setClearPassword($form->getValue('password1')); + $this->targetUser->save(); + + return $this->_forward('accountinfo', null , null, array('userid' => $this->targetUser->id)); + } + + public function confirmdeleteAction() + { + $this->_helper->actionStack('index', 'login', 'users'); + } + + public function deleteAction() + { + $mail = self::getMail(); + $mail->setFrom('support@community-id.org'); + $mail->addTo($this->_config->email->supportemail); + $mail->setSubject('Community-ID user deletion'); + + $userFullname = $this->user->getFullName(); + + $reasonsChecked = array(); + if ($this->_getParam('reason_test')) { + $reasonsChecked[] = 'This was just a test account'; + } + if ($this->_getParam('reason_foundbetter')) { + $reasonsChecked[] = 'I found a better service'; + } + if ($this->_getParam('reason_lackedfeatures')) { + $reasonsChecked[] = 'Service lacked some key features I needed'; + } + if ($this->_getParam('reason_none')) { + $reasonsChecked[] = 'No particular reason'; + } + + if ($reasonsChecked) { + $reasonsChecked = implode("\r\n", $reasonsChecked); + } else { + $reasonsChecked = 'None (no checkbox was ticked).'; + } + + $comment = $this->_getParam('reason_comments'); + + $body = <<setBodyText($body); + try { + $mail->send(); + } catch (Zend_Mail_Protocol_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'); + } + } + + $users = $this->_getUsers(); + $users->deleteUser($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 + */ + public static function getMail() + { + // can't use $this->_config 'cause it's a static function + $configEmail = Zend_Registry::get('config')->email; + + switch (strtolower($configEmail->transport)) { + case 'smtp': + Zend_Mail::setDefaultTransport( + new Zend_Mail_Transport_Smtp( + $configEmail->host, + $configEmail->toArray() + ) + ); + break; + case 'mock': + Zend_Mail::setDefaultTransport(new Zend_Mail_Transport_Mock()); + break; + default: + Zend_Mail::setDefaultTransport(new Zend_Mail_Transport_Sendmail()); + } + + $mail = new Zend_Mail(); + + return $mail; + } + + private function _getUsers() + { + if (!isset($this->_users)) { + $this->_users = new Users(); + } + + return $this->_users; + } +} diff --git a/modules/users/controllers/RecoverpasswordController.php b/modules/users/controllers/RecoverpasswordController.php new file mode 100755 index 0000000..613e77b --- /dev/null +++ b/modules/users/controllers/RecoverpasswordController.php @@ -0,0 +1,141 @@ +user->role != User::ROLE_ADMIN && $this->underMaintenance) { + return $this->_redirectForMaintenance(); + } + } + + public function indexAction() + { + $appSession = Zend_Registry::get('appSession'); + if (isset($appSession->recoverPasswordForm)) { + $this->view->form = $appSession->recoverPasswordForm; + unset($appSession->recoverPasswordForm); + } else { + $this->view->form = new RecoverPasswordForm(); + } + + $this->_helper->actionStack('index', 'login', 'users'); + } + + public function sendAction() + { + $form = new RecoverPasswordForm(); + $formData = $this->_request->getPost(); + + $form->populate($formData); + if (!$form->isValid($formData)) { + $appSession = Zend_Registry::get('appSession'); + $appSession->recoverPasswordForm = $form; + return $this->_forward('index'); + } + + $users = new Users(); + $user = $users->getUserWithEmail($form->getValue('email')); + if (!$user) { + $form->email->addError($this->view->translate('This E-mail is not registered in the system')); + $appSession = Zend_Registry::get('appSession'); + $appSession->recoverPasswordForm = $form; + return $this->_forward('index'); + } + + $user->token = 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"; + } + + $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']; + preg_match('#(.*)/users/recoverpassword#', $URI, $matches); + $emailTemplate = str_replace('{passwordResetURL}', + $matches[1] . '/users/recoverpassword/reset?token=' . $user->token, + $emailTemplate); + + $this->_sendMail($user->email, $this->view->translate('Community-ID password reset'), $emailTemplate); + + $this->_helper->FlashMessenger->addMessage($this->view->translate('Password reset E-mail has been sent')); + $this->_redirect(''); + } + + public function resetAction() + { + $users = new Users(); + $user = $users->getUserWithToken($this->_getParam('token')); + if (!$user) { + $this->_helper->FlashMessenger->addMessage('Wrong Token'); + $this->_redirect(''); + return; + } + + $newPassword = $user->generateRandomPassword(); + $user->setClearPassword($newPassword); + + // reset token + $user->token = User::generateToken(); + + $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"; + } + + $emailTemplate = file_get_contents($file); + $emailTemplate = str_replace('{userName}', $user->getFullName(), $emailTemplate); + $emailTemplate = str_replace('{password}', $newPassword, $emailTemplate); + + $this->_sendMail($user->email, $this->view->translate('Community-ID password reset'), $emailTemplate); + + $this->_helper->FlashMessenger->addMessage($this->view->translate('You\'ll receive your new password via E-mail')); + $this->_redirect(''); + } + + private function _sendMail($to, $subject, $body) + { + if (strtolower($this->_config->email->transport) == 'smtp') { + Zend_Mail::setDefaultTransport(new Zend_Mail_Transport_Smtp($this->_config->email->host, $this->_config->email->toArray())); + } else { + Zend_Mail::setDefaultTransport(new Zend_Mail_Transport_Sendmail()); + } + $mail = new Zend_Mail('utf-8'); + $mail->setBodyText($body); + $mail->setFrom($this->_config->email->supportemail); + $mail->addTo($to); + $mail->setSubject($subject); + $mail->send(); + } +} diff --git a/modules/users/controllers/RegisterController.php b/modules/users/controllers/RegisterController.php new file mode 100755 index 0000000..520e03a --- /dev/null +++ b/modules/users/controllers/RegisterController.php @@ -0,0 +1,227 @@ +user->role != User::ROLE_ADMIN && $this->underMaintenance) { + return $this->_redirectForMaintenance(); + } + + if (!$this->_config->environment->registrations_enabled) { + $this->_helper->FlashMessenger->addMessage($this->view->translate( + 'Sorry, registrations are currently disabled' + )); + return $this->_redirect(''); + } + } + + public function indexAction() + { + $appSession = Zend_Registry::get('appSession'); + if (isset($appSession->registerForm)) { + $form = $appSession->registerForm; + unset($appSession->registerForm); + } else { + $form = new RegisterForm(null, $this->view->base); + } + $this->view->form = $form; + } + + public function saveAction() + { + $form = new RegisterForm(null, $this->view->base); + $formData = $this->_request->getPost(); + $form->populate($formData); + + if (!$form->isValid($formData)) { + $appSession = Zend_Registry::get('appSession'); + $appSession->registerForm = $form; + return $this->_forward('index', null, null); + } + + $users = new Users(); + + if ($users->getUser($form->getValue('username'))) { + $form->username->addError($this->view->translate('This username is already in use')); + $appSession = Zend_Registry::get('appSession'); + $appSession->registerForm = $form; + return $this->_forward('index', null, null); + } + + if ($users->getUserWithEmail($form->getValue('email'))) { + $form->email->addError($this->view->translate('This E-mail is already in use')); + $appSession = Zend_Registry::get('appSession'); + $appSession->registerForm = $form; + return $this->_forward('index', null, null); + } + + $user = $users->createRow(); + + $user->firstname = $form->getValue('firstname'); + $user->lastname = $form->getValue('lastname'); + $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; + } else { + $openid = $matches[1] . '/identity/' . $user->username; + } + + 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 = User::ROLE_GUEST; + $registrationToken = User::generateToken(); + $user->token = $registrationToken; + $user->accepted_eula = 0; + $user->registration_date = date('Y-m-d'); + $user->save(); + + $mail = $this->getMail($user); + try { + $mail->send(); + $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')); + if ($this->_config->logging->level == Zend_Log::DEBUG) { + $this->_helper->FlashMessenger->addMessage($e->getMessage()); + } + } + + $this->_redirect(''); + } + + public function eulaAction() + { + $users = new Users(); + if ($this->_request->getParam('token') == '' + || !($user = $users->getUserWithToken($this->_request->getParam('token')))) { + $this->_helper->FlashMessenger->addMessage('Invalid token'); + $this->_redirect(''); + } + + $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"; + } + + $this->view->eula = file_get_contents($file); + } + + public function declineeulaAction() + { + $users = new Users(); + if (!($user = $users->getUserWithToken($this->_request->getParam('token'))) || $this->_request->getParam('token') == '') { + Zend_Registry::get('logger')->log('invalid token', Zend_Log::DEBUG); + $this->_helper->FlashMessenger->addMessage('Invalid token'); + $this->_redirect(''); + } + + $user->delete(); + $this->_helper->FlashMessenger->addMessage('Your account has been deleted'); + $this->_redirect(''); + } + + public function accepteulaAction() + { + $users = new Users(); + if (!($user = $users->getUserWithToken($this->_request->getParam('token'))) || $this->_request->getParam('token') == '') { + $this->_helper->FlashMessenger->addMessage('Invalid token'); + $this->_redirect(''); + } + + $user->role = User::ROLE_REGISTERED; + $user->accepted_eula = 1; + $user->registration_date = date('Y-m-d'); + $user->token = ''; + $user->save(); + + $auth = Zend_Auth::getInstance(); + $auth->getStorage()->write($user); + + $this->_redirect('/users/profile'); + } + + /** + * @return Zend_Mail + * @throws Zend_Mail_Protocol_Exception + */ + public function getMail(User $user) + { + $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"; + } + + $emailTemplate = file_get_contents($file); + $emailTemplate = str_replace('{userName}', $user->getFullName(), $emailTemplate); + + $currentUrl = Zend_OpenId::selfURL(); + preg_match('#(.*)/register/save#', $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 + $configEmail = Zend_Registry::get('config')->email; + + switch (strtolower($configEmail->transport)) { + case 'smtp': + Zend_Mail::setDefaultTransport( + new Zend_Mail_Transport_Smtp( + $configEmail->host, + $configEmail->toArray() + ) + ); + break; + case 'mock': + Zend_Mail::setDefaultTransport(new Zend_Mail_Transport_Mock()); + break; + default: + Zend_Mail::setDefaultTransport(new Zend_Mail_Transport_Sendmail()); + } + + $mail = new Zend_Mail(); + $mail->setBodyText($emailTemplate); + $mail->setFrom('support@community-id.org'); + $mail->addTo($user->email); + $mail->setSubject($this->view->translate('Community-ID registration confirmation')); + + return $mail; + } +} diff --git a/modules/users/controllers/UserslistController.php b/modules/users/controllers/UserslistController.php new file mode 100755 index 0000000..518c563 --- /dev/null +++ b/modules/users/controllers/UserslistController.php @@ -0,0 +1,67 @@ +_helper->viewRenderer->setNeverRender(true); + + $users = new Users(); + + switch($this->_getParam('filter')) { + case 'confirmed': + $where = "accepted_eula=1 AND role != '".User::ROLE_ADMIN."'"; + break; + case 'unconfirmed': + $where = "accepted_eula=0 AND role != '".User::ROLE_ADMIN."'"; + break; + default: + $where = false; + break; + } + + $usersRows = $users->getUsers( + $this->_getParam('startIndex'), + $this->_getParam('results'), + $this->_getParam('sort', 'registration'), + $this->_getParam('dir', Users::DIR_DESC), + $where); + + $jsonObj = new StdClass(); + $jsonObj->recordsReturned = count($usersRows); + $jsonObj->totalRecords = $users->getNumUsers($where); + $jsonObj->totalUnconfirmedUsers = $users->getNumUnconfirmedUsers(); + $jsonObj->startIndex = $_GET['startIndex']; + $jsonObj->sort = $this->_getParam('sort'); + $jsonObj->dir = $this->_getParam('dir'); + $jsonObj->records = array(); + + foreach ($usersRows as $user) { + if ($user->role == User::ROLE_ADMIN) { + $status = $this->view->translate('admin'); + } else if ($user->accepted_eula) { + $status = $this->view->translate('confirmed'); + } else { + $status = $this->view->translate('unconfirmed'); + } + $jsonObjUser = new StdClass(); + $jsonObjUser->id = $user->id; + $jsonObjUser->name = $user->getFullName(); + $jsonObjUser->registration = $user->registration_date; + $jsonObjUser->role = $user->role; + $jsonObjUser->status = $status; + $jsonObj->records[] = $jsonObjUser; + } + + echo Zend_Json::encode($jsonObj); + } +} diff --git a/modules/users/forms/AccountInfoForm.php b/modules/users/forms/AccountInfoForm.php new file mode 100644 index 0000000..b5af82a --- /dev/null +++ b/modules/users/forms/AccountInfoForm.php @@ -0,0 +1,63 @@ +_targetUser = $user; + parent::__construct($options); + } + + public function init() + { + $username = new Monkeys_Form_Element_Text('username'); + translate('Username'); + $username->setLabel('Username'); + + $firstname = new Monkeys_Form_Element_Text('firstname'); + translate('First Name'); + $firstname->setLabel('First Name') + ->setRequired(true); + + $lastname = new Monkeys_Form_Element_Text('lastname'); + translate('Last Name'); + $lastname->setLabel('Last Name') + ->setRequired(true); + + $email = new Monkeys_Form_Element_Text('email'); + translate('E-mail'); + $email->setLabel('E-mail') + ->addFilter('StringToLower') + ->setRequired(true) + ->addValidator('EmailAddress'); + + $this->addElements(array($username, $firstname, $lastname, $email)); + + if (!$this->_targetUser->id) { + $password1 = new Monkeys_Form_Element_Password('password1'); + translate('Enter password'); + $password1->setLabel('Enter password') + ->setRequired(true) + ->addValidator(new Monkeys_Validate_PasswordConfirmation()); + + $password2 = new Monkeys_Form_Element_Password('password2'); + translate('Enter password again'); + $password2->setLabel('Enter password again') + ->setRequired(true); + + $this->addElements(array($password1, $password2)); + } + } +} diff --git a/modules/users/forms/ChangePasswordForm.php b/modules/users/forms/ChangePasswordForm.php new file mode 100644 index 0000000..55a3764 --- /dev/null +++ b/modules/users/forms/ChangePasswordForm.php @@ -0,0 +1,30 @@ +setLabel('Enter password') + ->setRequired(true) + ->addValidator(new Monkeys_Validate_PasswordConfirmation()); + + $password2 = new Monkeys_Form_Element_Password('password2'); + translate('Enter password again'); + $password2->setLabel('Enter password again') + ->setRequired(true); + + $this->addElements(array($password1, $password2)); + } +} diff --git a/modules/users/forms/LoginForm.php b/modules/users/forms/LoginForm.php new file mode 100755 index 0000000..079581c --- /dev/null +++ b/modules/users/forms/LoginForm.php @@ -0,0 +1,22 @@ +setLabel('USERNAME') + ->setRequired(true); + + $password = new Zend_Form_Element_Password('password'); + translate('PASSWORD'); + $password->setLabel('PASSWORD') + ->setRequired(true); + + $rememberme = new Zend_Form_Element_Checkbox('rememberme'); + $rememberme->setLabel('Remember me'); + + $this->addElements(array($username, $password, $rememberme)); + } +} diff --git a/modules/users/forms/PersonalInfoForm.php b/modules/users/forms/PersonalInfoForm.php new file mode 100644 index 0000000..c743234 --- /dev/null +++ b/modules/users/forms/PersonalInfoForm.php @@ -0,0 +1,65 @@ +_sregProps = $sregProps; + + $fields = new Fields(); + $fieldsArr = $fields->getValues($user); + for ($i = 0; $i < count($fieldsArr); $i++) { + $this->_formElements[$fieldsArr[$i]->openid] = array( + 'field' => $fieldsArr[$i], + 'element' => $fieldsArr[$i]->getFormElement(), + ); + } + + parent::__construct($options); + } + + public function init() + { + if ($this->_sregProps) { + foreach ($this->_sregProps as $fieldName => $mandatory) { + if (isset($this->_formElements[$fieldName])) { + $element = $this->_formElements[$fieldName]['element']; + if ($mandatory) { + // override label + $element->setLabel($this->_formElements[$fieldName]['field']->name); + $element->setRequired(true); + } + } else { + $element = new Monkeys_Form_Element_Text("openid.sreg.$fieldName"); + $element->setLabel($fieldName); + if ($mandatory) { + $element->setRequired(true); + } + } + + // user openid standard notation for the field names, instead of + // our field IDs. + $element->setName('openid_sreg_' . $fieldName); + + $this->addElement($element); + } + } else { + foreach ($this->_formElements as $formElement) { + $this->addElement($formElement['element']); + } + } + } +} diff --git a/modules/users/forms/RecoverPasswordForm.php b/modules/users/forms/RecoverPasswordForm.php new file mode 100644 index 0000000..44e5dad --- /dev/null +++ b/modules/users/forms/RecoverPasswordForm.php @@ -0,0 +1,25 @@ +setLabel('') + ->addFilter('StringToLower') + ->setRequired(true) + ->addValidator('EmailAddress'); + + $this->addElement($email); + } +} diff --git a/modules/users/forms/RegisterForm.php b/modules/users/forms/RegisterForm.php new file mode 100755 index 0000000..64db739 --- /dev/null +++ b/modules/users/forms/RegisterForm.php @@ -0,0 +1,76 @@ +_baseWebDir = $baseWebDir; + parent::__construct($options); + } + + public function init() + { + $firstName = new Monkeys_Form_Element_Text('firstname'); + translate('First Name'); + $firstName->setLabel('First Name') + ->setRequired(true); + + $lastName = new Monkeys_Form_Element_Text('lastname'); + translate('Last Name'); + $lastName->setLabel('Last Name') + ->setRequired(true); + + $email = new Monkeys_Form_Element_Text('email'); + translate('E-mail'); + $email->setLabel('E-mail') + ->addFilter('StringToLower') + ->setRequired(true) + ->addValidator('EmailAddress'); + + $username = new Monkeys_Form_Element_Text('username'); + translate('Username'); + $username->setLabel('Username') + ->setRequired(true); + + $password1 = new Monkeys_Form_Element_Password('password1'); + translate('Enter desired password'); + $password1->setLabel('Enter desired password') + ->setRequired(true) + ->addValidator(new Monkeys_Validate_PasswordConfirmation()); + + $password2 = new Monkeys_Form_Element_Password('password2'); + translate('Enter password again'); + $password2->setLabel('Enter password again') + ->setRequired(true); + + // ZF has some bugs when using mutators here, so I have to use the config array + translate('Please enter the text below'); + $captcha = new Monkeys_Form_Element_Captcha('captcha', array( + 'label' => 'Please enter the text below', + 'captcha' => array( + 'captcha' => 'Image', + 'sessionClass' => get_class(Zend_Registry::get('appSession')), + 'font' => APP_DIR . '/libs/Monkeys/fonts/Verdana.ttf', + 'imgDir' => WEB_DIR. '/captchas', + 'imgUrl' => $this->_baseWebDir . '/captchas', + 'wordLen' => 4, + 'fontSize' => 30, + 'timeout' => 300, + ) + )); + + $this->addElements(array($firstName, $lastName, $email, $username, $password1, $password2, $captcha)); + } +} diff --git a/modules/users/models/OpenIdUser.php b/modules/users/models/OpenIdUser.php new file mode 100644 index 0000000..737ea5b --- /dev/null +++ b/modules/users/models/OpenIdUser.php @@ -0,0 +1,53 @@ +_auth = Zend_Auth::getInstance(); + } + + public function setLoggedInUser($id) + { + + $users = new Users(); + $this->_user = $users->getuserWithOpenId($id); + $this->_auth->getStorage()->write($this->_user); + } + + public function getLoggedInUser() + { + $users = new Users(); + if ($this->_auth->hasIdentity()) { + $user = $this->_auth->getStorage()->read(); + $user->init(); + + // reactivate row as live data + $user->setTable($users); + + return $user->openid; + } + + return false; + } + + public function delLoggedInUser() + { + $this->_auth->clearIdentity(); + + return true; + } +} diff --git a/modules/users/models/User.php b/modules/users/models/User.php new file mode 100755 index 0000000..9ae36f2 --- /dev/null +++ b/modules/users/models/User.php @@ -0,0 +1,59 @@ +firstname . ' ' . $this->lastname; + } + + public function generateRandomPassword() + { + return substr(md5($this->getFullName() . time()), 0, 6); + } + + /** + * Password is stored using md5($this->openid.$password) because + * that's what's used in Zend_OpenId + */ + public function setClearPassword($password) + { + $this->password = md5($this->openid.$password); + $this->password_changed = date('Y-m-d'); + } + + public function isAllowed($resource, $privilege) + { + $acl = Zend_Registry::get('acl'); + return $acl->isAllowed($this->role, $resource, $privilege); + } + + public static function generateToken() + { + $token = ''; + for ($i = 0; $i < 50; $i++) { + $token .= chr(rand(48, 122)); + } + + return md5($token.time()); + } +} diff --git a/modules/users/models/Users.php b/modules/users/models/Users.php new file mode 100755 index 0000000..99b49c0 --- /dev/null +++ b/modules/users/models/Users.php @@ -0,0 +1,347 @@ + array('firstname', 'lastname'), + 'registration' => array('registration_date', 'firstname', 'lastname'), + 'status' => array('accepted_eula', 'registration_date', 'firstname', 'lastname'), + ); + + public function createRow() + { + return parent::createRow(array( + 'openid' => '', + 'password_changed' => '0000-00-00', + 'role' => User::ROLE_GUEST, + 'passwordreset_token' => '', + )); + } + + public function getUsers($startIndex = false, $results = false, $sort = false, $dir = false, $where = false) + { + $select = $this->select(); + + if ($startIndex !== false && $results !== false) { + $select = $select->limit($results, $startIndex); + } + + if ($sort && isset($this->_sortFields[$sort])) { + $dir = ($dir == self::DIR_ASC? 'ASC' : 'DESC'); + $sortSql = array(); + foreach ($this->_sortFields[$sort] as $field) { + $sortSql[] = "$field $dir"; + } + + $select = $select->order($sortSql); + } + + if ($where) { + $select = $select->where($where); + } + + return $this->fetchAll($select); + } + + public function getNumUsers($where = false) + { + $users = $this->getUsers(false, false, false, false, $where); + + return count($users); + } + + public function getNumUnconfirmedUsers() + { + $users = $this->getUsers(false, false, false, false, "accepted_eula=0 AND role != '".User::ROLE_ADMIN."'"); + + return count($users); + } + + public function getUserWithToken($token) + { + $select = $this->select() + ->where('token=?', $token); + + return $this->fetchRow($select); + } + + public function getUserWithEmail($email) + { + $select = $this->select() + ->where('email=?', $email); + + return $this->fetchRow($select); + } + + public function getUserWithOpenId($openid) + { + $select = $this->select() + ->where('openid=?', $openid); + + return $this->fetchRow($select); + } + + public function getUser($identity) + { + $select = $this->select()->where('username=?', $identity); + + return $this->fetchRow($select); + } + + public function deleteUser(User $user) + { + $where = $this->getAdapter()->quoteInto('id=?', $user->id); + $this->delete($where); + } + + public function deleteTestEntries() + { + $this->delete('test=1'); + } + + public function deleteUnconfirmed() + { + $this->delete("accepted_eula=0 AND role = '".User::ROLE_GUEST."'"); + } + + protected $_metadata = array( + 'id' => + array ( + 'SCHEMA_NAME' => NULL, + 'TABLE_NAME' => 'users', + 'COLUMN_NAME' => 'id', + 'COLUMN_POSITION' => 1, + 'DATA_TYPE' => 'int', + 'DEFAULT' => NULL, + 'NULLABLE' => false, + 'LENGTH' => NULL, + 'SCALE' => NULL, + 'PRECISION' => NULL, + 'UNSIGNED' => NULL, + 'PRIMARY' => true, + 'PRIMARY_POSITION' => 1, + 'IDENTITY' => true, + ), + 'test' => + array ( + 'SCHEMA_NAME' => NULL, + 'TABLE_NAME' => 'users', + 'COLUMN_NAME' => 'test', + 'COLUMN_POSITION' => 2, + 'DATA_TYPE' => 'tinyint', + 'DEFAULT' => '0', + 'NULLABLE' => false, + 'LENGTH' => NULL, + 'SCALE' => NULL, + 'PRECISION' => NULL, + 'UNSIGNED' => NULL, + 'PRIMARY' => false, + 'PRIMARY_POSITION' => NULL, + 'IDENTITY' => false, + ), + 'username' => + array ( + 'SCHEMA_NAME' => NULL, + 'TABLE_NAME' => 'users', + 'COLUMN_NAME' => 'username', + 'COLUMN_POSITION' => 3, + 'DATA_TYPE' => 'varchar', + 'DEFAULT' => NULL, + 'NULLABLE' => false, + 'LENGTH' => '50', + 'SCALE' => NULL, + 'PRECISION' => NULL, + 'UNSIGNED' => NULL, + 'PRIMARY' => false, + 'PRIMARY_POSITION' => NULL, + 'IDENTITY' => false, + ), + 'openid' => + array ( + 'SCHEMA_NAME' => NULL, + 'TABLE_NAME' => 'users', + 'COLUMN_NAME' => 'openid', + 'COLUMN_POSITION' => 4, + 'DATA_TYPE' => 'varchar', + 'DEFAULT' => NULL, + 'NULLABLE' => false, + 'LENGTH' => '100', + 'SCALE' => NULL, + 'PRECISION' => NULL, + 'UNSIGNED' => NULL, + 'PRIMARY' => false, + 'PRIMARY_POSITION' => NULL, + 'IDENTITY' => false, + ), + 'accepted_eula' => + array ( + 'SCHEMA_NAME' => NULL, + 'TABLE_NAME' => 'users', + 'COLUMN_NAME' => 'accepted_eula', + 'COLUMN_POSITION' => 5, + 'DATA_TYPE' => 'tinyint', + 'DEFAULT' => '0', + 'NULLABLE' => false, + 'LENGTH' => NULL, + 'SCALE' => NULL, + 'PRECISION' => NULL, + 'UNSIGNED' => NULL, + 'PRIMARY' => false, + 'PRIMARY_POSITION' => NULL, + 'IDENTITY' => false, + ), + 'registration_date' => + array ( + 'SCHEMA_NAME' => NULL, + 'TABLE_NAME' => 'users', + 'COLUMN_NAME' => 'registration_date', + 'COLUMN_POSITION' => 6, + 'DATA_TYPE' => 'date', + 'DEFAULT' => NULL, + 'NULLABLE' => false, + 'LENGTH' => NULL, + 'SCALE' => NULL, + 'PRECISION' => NULL, + 'UNSIGNED' => NULL, + 'PRIMARY' => false, + 'PRIMARY_POSITION' => NULL, + 'IDENTITY' => false, + ), + 'password' => + array ( + 'SCHEMA_NAME' => NULL, + 'TABLE_NAME' => 'users', + 'COLUMN_NAME' => 'password', + 'COLUMN_POSITION' => 7, + 'DATA_TYPE' => 'char', + 'DEFAULT' => NULL, + 'NULLABLE' => false, + 'LENGTH' => '40', + 'SCALE' => NULL, + 'PRECISION' => NULL, + 'UNSIGNED' => NULL, + 'PRIMARY' => false, + 'PRIMARY_POSITION' => NULL, + 'IDENTITY' => false, + ), + 'password_changed' => + array ( + 'SCHEMA_NAME' => NULL, + 'TABLE_NAME' => 'users', + 'COLUMN_NAME' => 'password_changed', + 'COLUMN_POSITION' => 8, + 'DATA_TYPE' => 'date', + 'DEFAULT' => NULL, + 'NULLABLE' => false, + 'LENGTH' => NULL, + 'SCALE' => NULL, + 'PRECISION' => NULL, + 'UNSIGNED' => NULL, + 'PRIMARY' => false, + 'PRIMARY_POSITION' => NULL, + 'IDENTITY' => false, + ), + 'firstname' => + array ( + 'SCHEMA_NAME' => NULL, + 'TABLE_NAME' => 'users', + 'COLUMN_NAME' => 'firstname', + '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, + ), + 'lastname' => + array ( + 'SCHEMA_NAME' => NULL, + 'TABLE_NAME' => 'users', + 'COLUMN_NAME' => 'lastname', + 'COLUMN_POSITION' => 10, + 'DATA_TYPE' => 'varchar', + 'DEFAULT' => NULL, + 'NULLABLE' => false, + 'LENGTH' => '50', + 'SCALE' => NULL, + 'PRECISION' => NULL, + 'UNSIGNED' => NULL, + 'PRIMARY' => false, + 'PRIMARY_POSITION' => NULL, + 'IDENTITY' => false, + ), + 'email' => + array ( + 'SCHEMA_NAME' => NULL, + 'TABLE_NAME' => 'users', + 'COLUMN_NAME' => 'email', + 'COLUMN_POSITION' => 11, + 'DATA_TYPE' => 'varchar', + 'DEFAULT' => NULL, + 'NULLABLE' => false, + 'LENGTH' => '50', + 'SCALE' => NULL, + 'PRECISION' => NULL, + 'UNSIGNED' => NULL, + 'PRIMARY' => false, + 'PRIMARY_POSITION' => NULL, + 'IDENTITY' => false, + ), + 'role' => + array ( + 'SCHEMA_NAME' => NULL, + 'TABLE_NAME' => 'users', + 'COLUMN_NAME' => 'role', + 'COLUMN_POSITION' => 12, + 'DATA_TYPE' => 'varchar', + 'DEFAULT' => NULL, + 'NULLABLE' => false, + 'LENGTH' => '50', + 'SCALE' => NULL, + 'PRECISION' => NULL, + 'UNSIGNED' => NULL, + 'PRIMARY' => false, + 'PRIMARY_POSITION' => NULL, + 'IDENTITY' => false, + ), + 'token' => + array ( + 'SCHEMA_NAME' => NULL, + 'TABLE_NAME' => 'users', + 'COLUMN_NAME' => 'token', + 'COLUMN_POSITION' => 13, + 'DATA_TYPE' => 'char', + 'DEFAULT' => NULL, + 'NULLABLE' => false, + 'LENGTH' => '32', + 'SCALE' => NULL, + 'PRECISION' => NULL, + 'UNSIGNED' => NULL, + 'PRIMARY' => false, + 'PRIMARY_POSITION' => NULL, + 'IDENTITY' => false, + ), + ); +} diff --git a/modules/users/views/scripts/login/index.phtml b/modules/users/views/scripts/login/index.phtml new file mode 100755 index 0000000..c45988a --- /dev/null +++ b/modules/users/views/scripts/login/index.phtml @@ -0,0 +1,79 @@ +user->role != User::ROLE_GUEST ): ?> +

    + translate('Hello, %s', Zend_Filter::get($this->user->username, 'HtmlEntities')) ?> +

    + + user->role == User::ROLE_ADMIN): ?> +
    +

    translate('Admin options') ?>

    + + + + underMaintenance): ?> +
    + translate('User access is currently disabled for system maintenance.
    Please try again later') ?> +
    + +
    +
    + loginForm->username ?> + loginForm->password ?> +
    +
    + + + +
    +
    + + +
    +

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

    +
    +
    +
    +

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

    +

      +
    + diff --git a/modules/users/views/scripts/manageusers/index.phtml b/modules/users/views/scripts/manageusers/index.phtml new file mode 100644 index 0000000..9dfb4f2 --- /dev/null +++ b/modules/users/views/scripts/manageusers/index.phtml @@ -0,0 +1,53 @@ + + +
    +
    +user->role == User::ROLE_ADMIN): ?> +
    + translate('Total users:') ?>
    + translate('Total confirmed users:') ?>
    + translate('Total unconfirmed users:') ?>
    +
    +
    + + + + + +
    + diff --git a/modules/users/views/scripts/personalinfo/edit.phtml b/modules/users/views/scripts/personalinfo/edit.phtml new file mode 100644 index 0000000..3ec2d17 --- /dev/null +++ b/modules/users/views/scripts/personalinfo/edit.phtml @@ -0,0 +1,60 @@ + +
    + fields as $field): ?> + +
    + + + +
    diff --git a/modules/users/views/scripts/personalinfo/index.phtml b/modules/users/views/scripts/personalinfo/index.phtml new file mode 100644 index 0000000..91139d2 --- /dev/null +++ b/modules/users/views/scripts/personalinfo/index.phtml @@ -0,0 +1,28 @@ + +
    +
    +
    +

    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)) ?> +
    +
    +
    diff --git a/modules/users/views/scripts/personalinfo/show.phtml b/modules/users/views/scripts/personalinfo/show.phtml new file mode 100644 index 0000000..24a4882 --- /dev/null +++ b/modules/users/views/scripts/personalinfo/show.phtml @@ -0,0 +1,12 @@ +
    + 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 new file mode 100755 index 0000000..3cd70f9 --- /dev/null +++ b/modules/users/views/scripts/profile/index.phtml @@ -0,0 +1,44 @@ + + +
    +
    +

    translate('Account info') ?>

    + targetUser->id == $this->user->id): ?> + + +
    +
    + targetUser->id) { + echo $this->action('accountinfo', 'profilegeneral', 'users', array('userid' => $this->targetUser->id)); + } else { + // user id == 0 means we're entering info for a new user + echo $this->action('editaccountinfo', 'profilegeneral', 'users', array('userid' => $this->targetUser->id)); + } ?> +
    + targetUser->id && $this->targetUser->id == $this->user->id): ?> + + +
    diff --git a/modules/users/views/scripts/profilegeneral/accountinfo.phtml b/modules/users/views/scripts/profilegeneral/accountinfo.phtml new file mode 100644 index 0000000..8ff960a --- /dev/null +++ b/modules/users/views/scripts/profilegeneral/accountinfo.phtml @@ -0,0 +1,34 @@ +
    +
    +
    + translate('Username') ?>: +
    +
    + targetUser->username ?> +
    +
    +
    +
    + translate('Name') ?>: +
    +
    + targetUser->getfullName() ?> +
    +
    +
    +
    + translate('E-mail') ?>: +
    +
    + targetUser->email ?> +
    +
    +
    +
    + translate('OpenID') ?>: +
    +
    + targetUser->openid ?> +
    +
    +
    diff --git a/modules/users/views/scripts/profilegeneral/changepassword.phtml b/modules/users/views/scripts/profilegeneral/changepassword.phtml new file mode 100644 index 0000000..bd9660c --- /dev/null +++ b/modules/users/views/scripts/profilegeneral/changepassword.phtml @@ -0,0 +1,56 @@ + +
    + changePasswordForm->password1 ?> + changePasswordForm->password2 ?> +
    +
     
    +
    + + + +
    +
    +
    diff --git a/modules/users/views/scripts/profilegeneral/confirmdelete.phtml b/modules/users/views/scripts/profilegeneral/confirmdelete.phtml new file mode 100755 index 0000000..148b27c --- /dev/null +++ b/modules/users/views/scripts/profilegeneral/confirmdelete.phtml @@ -0,0 +1,37 @@ +
    +

    + translate('Why do you want to delete your Community-ID account?') ?>
    + translate('Please check all that apply:') ?> +

    +
      +
    • + translate('This was just a test account') ?> +
    • +
    • + translate('I found a better service') ?> +
    • +
    • + translate('Service lacked some key features I needed') ?> +
    • +
    • + translate('No particular reason') ?> +
    • +
    + +
    + + + +
    diff --git a/modules/users/views/scripts/profilegeneral/editaccountinfo.phtml b/modules/users/views/scripts/profilegeneral/editaccountinfo.phtml new file mode 100644 index 0000000..1b3b4d0 --- /dev/null +++ b/modules/users/views/scripts/profilegeneral/editaccountinfo.phtml @@ -0,0 +1,35 @@ +
    + accountInfoForm->username ?> + accountInfoForm->firstname ?> + accountInfoForm->lastname ?> + accountInfoForm->email ?> + targetUser->id) { + echo $this->accountInfoForm->password1; + echo $this->accountInfoForm->password2; + } ?> +
    +
     
    +
    + + + +
    +
    +
    diff --git a/modules/users/views/scripts/recoverpassword/index.phtml b/modules/users/views/scripts/recoverpassword/index.phtml new file mode 100755 index 0000000..f29fe05 --- /dev/null +++ b/modules/users/views/scripts/recoverpassword/index.phtml @@ -0,0 +1,8 @@ +translate('Please enter your E-mail below to receive a link to reset your password') ?> +
    + form->email ?> + + +
    diff --git a/modules/users/views/scripts/register/eula.phtml b/modules/users/views/scripts/register/eula.phtml new file mode 100755 index 0000000..1e753be --- /dev/null +++ b/modules/users/views/scripts/register/eula.phtml @@ -0,0 +1,30 @@ +

    translate('Please read the following EULA in order to continue') ?>

    +
    + +
    + +
    +
    +      + + +
    +
    diff --git a/modules/users/views/scripts/register/index.phtml b/modules/users/views/scripts/register/index.phtml new file mode 100755 index 0000000..5d58cb8 --- /dev/null +++ b/modules/users/views/scripts/register/index.phtml @@ -0,0 +1,14 @@ +

    translate('Registration Form') ?>

    +
    + form->firstname ?> + form->lastname ?> + form->email ?> + form->username ?> + form->password1 ?> + form->password2 ?> + form->captcha ?> + + +
    diff --git a/resources/de/eula.txt b/resources/de/eula.txt new file mode 100755 index 0000000..728b414 --- /dev/null +++ b/resources/de/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/de/passwordreset2_mail.txt b/resources/de/passwordreset2_mail.txt new file mode 100644 index 0000000..84946c7 --- /dev/null +++ b/resources/de/passwordreset2_mail.txt @@ -0,0 +1,8 @@ +Sehr geehrte(r) {userName}, + +Ihr neues Passwort ist: {password} + +Wir empfehlen Ihnen sich nochmals anzumelden, und ihr Passwort zu ändern. + +Vielen Dank, +Das Community-ID Team diff --git a/resources/de/passwordreset_mail.txt b/resources/de/passwordreset_mail.txt new file mode 100755 index 0000000..ed1a69d --- /dev/null +++ b/resources/de/passwordreset_mail.txt @@ -0,0 +1,14 @@ +Sehr geehrte(r) {userName}, + + +Eine Passwort-Reset Anfrage wurde von der folgenden IP beantragt: {IP} + +Bitte klicken Sie auf den folgenden Link um Ihr Passwort zurückzusetzen: + +{passwordResetURL} + +Falls Sie nicht veranlasst haben Ihr Passwort zurückzusetzen, ignorieren Sie +diese Nachricht. + +Vielen Dank, +Das Community-ID Team diff --git a/resources/de/privacy.txt b/resources/de/privacy.txt new file mode 100644 index 0000000..df7f75a --- /dev/null +++ b/resources/de/privacy.txt @@ -0,0 +1,15 @@ +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 new file mode 100755 index 0000000..086bf0f --- /dev/null +++ b/resources/de/registration_mail.txt @@ -0,0 +1,12 @@ +Sehr geehrte(r) {userName}, + +Vielen Dank fur die Registrierung mit community-id.org + +Um mit der Registrierung fortzufahren klicken Sie bitte auf den folgenden +Link: + +{registrationURL} + + +Vielen Dank, +Das Community-ID Team diff --git a/resources/en/eula.txt b/resources/en/eula.txt new file mode 100755 index 0000000..728b414 --- /dev/null +++ b/resources/en/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/en/passwordreset2_mail.txt b/resources/en/passwordreset2_mail.txt new file mode 100644 index 0000000..e9ff51b --- /dev/null +++ b/resources/en/passwordreset2_mail.txt @@ -0,0 +1,8 @@ +Dear {userName}, + +Your new password is: {password} + +We recommend that you please log back in, and change it. + +Thanks, +The Community-ID Team diff --git a/resources/en/passwordreset_mail.txt b/resources/en/passwordreset_mail.txt new file mode 100755 index 0000000..63b6608 --- /dev/null +++ b/resources/en/passwordreset_mail.txt @@ -0,0 +1,13 @@ +Dear {userName}, + +A password reset request was requested from the following IP: {IP} + +Click on the following link to reset your password: + +{passwordResetURL} + +If you didn't ask for this reset, then you can ignore this message. + + +Thanks, +The Community-ID Team diff --git a/resources/en/privacy.txt b/resources/en/privacy.txt new file mode 100644 index 0000000..16a85c9 --- /dev/null +++ b/resources/en/privacy.txt @@ -0,0 +1,13 @@ +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 new file mode 100755 index 0000000..d891ff0 --- /dev/null +++ b/resources/en/registration_mail.txt @@ -0,0 +1,11 @@ +Dear {userName}, + +Thank you for registering with the community-id.org + +To continue with the registration process, please click on the following link: + +{registrationURL} + + +Thanks, +The Community-ID Team diff --git a/resources/es/eula.txt b/resources/es/eula.txt new file mode 100755 index 0000000..d057a53 --- /dev/null +++ b/resources/es/eula.txt @@ -0,0 +1,30 @@ +EL SERVICIO +Para poder usar el servicio de Community-ID.org debe estar de acuerdo y poder cumplir con estos términos de servicio (cada punto individual y colectivamente referido como el "Servicio"). + +EL ACUERDO +Este es un acuerdo legal ("Acuerdo") entre usted y Community-ID.org. Por favor lea el Acuerdo comlpeto con detenimiento antes de usar el servicio de Community-ID.org. Al usar este Servicio, usted manifiesta estar de acuerdo con los términos y condiciones de este Acuerdo (los "Términos") durante su uso del Servicio. + +CONDUCTA +Como condición de uso del Servicio, usted garantiza a Community-ID.org que no usará el Servicio para ningún fin no legal o prohibido por estos términos, condiciones y avisos. El Servicio está proveído a individuos solamente, para uso personal solamente. Cualquier uso comercial no autorizado del Servicio, o la reventa del Servicio, está expresamente prohibido. LOS USUARIOS MANIFIESTAN SU ACUERDO EN NO USAR ESTE SERVICIO PARA HACER SPAM. LOS USUARIOS MANIFIESTAN SU ACUERDO EN NO REPRESENTAR FRAUDULENTAMENTE A UN INDIVIDUO O ENTIDAD CORPORATIVA EN EL SERVICIO. Usted manifiesta su acuerdo en seguir todas las leyes y regulaciones aplicables locales, estatales, nacionales e internacionales, y usted es el único responsable por todo acto u omisión que suceda, uncluído el contenido de sus transmisiones en el uso del Servicio. A modo de ejemplo, pero no limitado a, usted esta de acuerdo con: + * No usar el Servicio en conexión con encuestas, concursos, esquemas de pirámide, cadenas de correo, correo basura o cualquier otro tipo de mensaje duplicativo o no solicitado (comercial o de otro tipo). + * No difamar, abusar, acosar, acechar, amenazar o cualquier otra actitud que viole los derechos legales de los demás. + * No publicar, distribuir or diseminar cualquier material o información inapropiado, profano, difamatorio, ilegal, obsceno o indecente. + * No publicitar u ofertar bienes o servicios que no sea para propósito personal. + * No recolectar información sobre los demás. + * No usar una identidad false con el propósito de engañar a los demás. + * No crear cuentas para terceros, cobrando o no, sin importar si el tercero dio o no su permiso. + * No interferir o tratar de perturbar la red conectada al Servicio o violar las regulaciones, políticas o procedimientos de uso de dicha red. + + +EXCENSION DE RESPONSABILIDAD +Community-ID.org no garantiza que el Servicio sea ininterrumpido o libre de errores. Community-ID.org no garantiza que el uso o resultados del uso del Servicio sean correctos, exactos o fiables. Usted está de acuerdo en que Community-ID.org no se hará responsable por accesos no autorizados o alteraciones en la transmisión de datos a través del Servicio. Usted está de acuerdo en que Community-ID.org no es responsable por cualquier amenaza, difamación, obscenidad, o conducta ofensiva o ilegal de cualquier tercero o la infracción de los derechos de un tercero, incluidos los derechos de propiedad intelectual. +Usted está de acuerdo en que Community-ID.org no es responsable por ningún contenido enviado usando el Servicio. Community-ID.org Y/O SUS RESPECTIVOS PROVEEDORS NO SE HACEN RESPONSABLES POR LA IDONEIDAD, FIABILIDAD, PRONTITUD, Y EXACTITUD DEL SERVICIO PARA CUALQUIER FIN. EL SERVICIO ES PROVEIDO "TAL CUAL" SIN NINGUNA GARANTIA DE NINGUN TIPO. COMMUNITY-ID.ORG Y/O SUS RESPECTIVOS PROVEEDORES RENUNCIAN A DAR CUALQUIER GARANTIA O CONDICION CON RESPECTO AL SERVICIO, INCLUYENDO TODAS LAS GARANTIAS Y CONDITIONES IMPLICADAS DE COMERCIALIZACION, IDONEIDAD PARA UN PROPOSITO PARTICULAR, TITULO Y NO INFRACCION. BAJO NINGUNA CIRCUNSTANCION DEBE COMMUNITY-ID.ORG Y/O SUS PROVEEDORES SER RESPONSABLIZADOS POR NINGUN DAÑO DIRECTO, INDERECTO, PUNITIVO, INCIDENTAL O DE CUALQUIER TIPO, INCLUYENDO SIN LIMITACION, DAÑOS POR PERDIDA DE USO, DATOS O BENEFICIOS, CONECTADOS CON EL USO O IDONEIDAD DEL SERVICIO. + +RESOLUCION DE CONFLICTOS +En el caso de reclamaciones por conflictos, Community-ID.org, bajo ninguna obligación por ley, permitirá que las partes en conflicto resuelvan su conflicto, y actuará bajo el resultado mutuamente acordado. + +INDEMNIZACION +Usted manifiesta su acuerdo en eximir a Community-ID.org, su matriz, subsidiarios, afiliados, oficiales y empleados, de cualquier reclamación, demanda o indemnización, incluyendo costos de abogados, presentados por cualquier parte como consecuencia de su uso o conducta en el Servicio. + +MODIFICACION DE LOS TERMINOS DE SERVICIO +Community-ID.org se reserva el derecho de cambiar los Términos de Servicio o políticas relativas al uso del servicio en cualquier momento y notificarle publicando una versión actualizada de los términos de servicio en el sitio Web. Usted se hace responsable por revisar regularmente estos términos de servicio. El uso continuado del servicio después de dichos cambios constituye su consentimiento a dichos cambios. diff --git a/resources/es/passwordreset2_mail.txt b/resources/es/passwordreset2_mail.txt new file mode 100644 index 0000000..82977f0 --- /dev/null +++ b/resources/es/passwordreset2_mail.txt @@ -0,0 +1,8 @@ +Apreciado {userName}, + +Su nueva contraseña es: {password} + +Le recomendamos que por favor ingrese de nuevo, y la cambie. + +Gracias, +El Equipo de Community-ID diff --git a/resources/es/passwordreset_mail.txt b/resources/es/passwordreset_mail.txt new file mode 100755 index 0000000..f85ab61 --- /dev/null +++ b/resources/es/passwordreset_mail.txt @@ -0,0 +1,13 @@ +Apreciado {userName}, + +Se ha pedido un restablecimiento de su contraseña desde la siguiente IP: {IP} + +Haga click en el siguiente enlace para restablecer la contraseña: + +{passwordResetURL} + +Si usted no ha hecho este pedido, puede ignorar este mensaje. + + +Gracias +El Equipo de Community-ID diff --git a/resources/es/privacy.txt b/resources/es/privacy.txt new file mode 100644 index 0000000..8990d6e --- /dev/null +++ b/resources/es/privacy.txt @@ -0,0 +1,14 @@ +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 new file mode 100755 index 0000000..02c593a --- /dev/null +++ b/resources/es/registration_mail.txt @@ -0,0 +1,11 @@ +Apreciado {userName}, + +Gracias por registrarse en community-id.org + +Para continuar con el proceso de registro, por favor haga click en el siguiente enlace: + +{registrationURL} + + +Gracias, +El Equipo de Community-ID diff --git a/resources/nl/eula.txt b/resources/nl/eula.txt new file mode 100755 index 0000000..728b414 --- /dev/null +++ b/resources/nl/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/nl/privacy.txt b/resources/nl/privacy.txt new file mode 100644 index 0000000..38e3387 --- /dev/null +++ b/resources/nl/privacy.txt @@ -0,0 +1,15 @@ +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 new file mode 100755 index 0000000..728b414 --- /dev/null +++ b/resources/pl/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/pl/privacy.txt b/resources/pl/privacy.txt new file mode 100644 index 0000000..38e3387 --- /dev/null +++ b/resources/pl/privacy.txt @@ -0,0 +1,15 @@ +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/scripts/clear_logs.php b/scripts/clear_logs.php new file mode 100644 index 0000000..2a26a3d --- /dev/null +++ b/scripts/clear_logs.php @@ -0,0 +1,33 @@ +clearOldEntries(); + +?> diff --git a/setup/final.sql b/setup/final.sql new file mode 100644 index 0000000..db6866c --- /dev/null +++ b/setup/final.sql @@ -0,0 +1,97 @@ +CREATE TABLE `users` ( + `id` int(11) NOT NULL auto_increment, + `test` tinyint(4) NOT NULL default '0', + `username` varchar(50) NOT NULL, + `openid` varchar(100) NOT NULL, + `accepted_eula` tinyint(4) NOT NULL default '0', + `registration_date` date NOT NULL, + `password` char(40) NOT NULL, + `password_changed` date NOT NULL, + `firstname` varchar(50) NOT NULL, + `lastname` varchar(50) NOT NULL, + `email` varchar(50) NOT NULL, + `role` varchar(50) NOT NULL, + `token` char(32) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB; + +INSERT INTO `users` (`id`, `test`, `username`, `accepted_eula`, `registration_date`, `password`, `password_changed`, `firstname`, `lastname`, `email`, `role`, `token`) VALUES +(1, 0, 'admin', 1, '', '21232f297a57a5a743894a0e4a801fc3', '2008-10-28', 'Admin', 'User', 'whateva@mailinator.com', 'admin', ''); + + +CREATE TABLE `associations` ( + `handle` varchar(32) NOT NULL, + `macfunc` varchar(6) NOT NULL, + `secret` blob NOT NULL, + `expires` int(11) NOT NULL, + PRIMARY KEY (`handle`) +) ENGINE=MyISAM; + + +CREATE TABLE IF NOT EXISTS `sites` ( + `id` int(11) NOT NULL auto_increment, + `user_id` int(11) NOT NULL, + `site` varchar(100) NOT NULL, + `creation_date` date NOT NULL, + `trusted` text NOT NULL, + PRIMARY KEY (`id`), + KEY `user_id` (`user_id`) +) ENGINE=InnoDB; + +ALTER TABLE `sites` + ADD CONSTRAINT `sites_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE; + + +CREATE TABLE `history` ( + `id` int(11) NOT NULL auto_increment, + `user_id` int(11) NOT NULL default '0', + `date` datetime NOT NULL default '0000-00-00 00:00:00', + `site` varchar(100) NOT NULL default '', + `ip` varchar(32) NOT NULL default '', + `result` tinyint(4) NOT NULL default '0', + PRIMARY KEY (`id`), + KEY `user_id` (`user_id`) +) ENGINE=InnoDB; + +ALTER TABLE `history` + ADD CONSTRAINT `history_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE; + + +CREATE TABLE `fields` ( + `id` int(11) NOT NULL auto_increment, + `name` varchar(100) NOT NULL, + `openid` varchar(12) NOT NULL, + `type` tinyint(4) NOT NULL default '1', + PRIMARY KEY (`id`) +) ENGINE=InnoDB ; + + +CREATE TABLE `fields_values` ( + `user_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`) +) ENGINE=InnoDB; + +ALTER TABLE `fields_values` + 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; + +INSERT INTO `fields` (`id`, `name`, `openid`, `type`) VALUES(1, 'Nickname', 'nickname', 1); +INSERT INTO `fields` (`id`, `name`, `openid`, `type`) VALUES(2, 'E-mail', 'email', 7); +INSERT INTO `fields` (`id`, `name`, `openid`, `type`) VALUES(3, 'Full Name', 'fullname', 1); +INSERT INTO `fields` (`id`, `name`, `openid`, `type`) VALUES(4, 'Date of Birth', 'dob', 2); +INSERT INTO `fields` (`id`, `name`, `openid`, `type`) VALUES(5, 'Gender', 'gender', 3); +INSERT INTO `fields` (`id`, `name`, `openid`, `type`) VALUES(6, 'Postal Code', 'postcode', 1); +INSERT INTO `fields` (`id`, `name`, `openid`, `type`) VALUES(7, 'Country', 'country', 4); +INSERT INTO `fields` (`id`, `name`, `openid`, `type`) VALUES(8, 'Language', 'language', 5); +INSERT INTO `fields` (`id`, `name`, `openid`, `type`) VALUES(9, 'Time Zone', 'timezone', 6); + +CREATE TABLE `settings` ( + `name` VARCHAR( 255 ) NOT NULL , + `value` VARCHAR( 255 ) NOT NULL , + PRIMARY KEY ( `name` ) + ) ENGINE = MYISAM ; + +INSERT INTO `settings` (`name`, `value`) VALUES ('maintenance_mode', '0'); diff --git a/tests/AllTests.php b/tests/AllTests.php new file mode 100644 index 0000000..4ea90bd --- /dev/null +++ b/tests/AllTests.php @@ -0,0 +1,39 @@ +setName('Community-ID'); + $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 new file mode 100644 index 0000000..e236c33 --- /dev/null +++ b/tests/CaptchaImageTestSessionContainer.php @@ -0,0 +1,56 @@ +$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 new file mode 100644 index 0000000..c94b157 --- /dev/null +++ b/tests/TestHarness.php @@ -0,0 +1,55 @@ +logging->level = Zend_Log::DEBUG; + Setup::setLogger(true); + + Setup::logRequest(); + Setup::setDatabase(); + Setup::setSession(); + Setup::setAcl(); + Setup::setI18N(); + Setup::setLayout(); + Setup::setFrontController(); + Setup::$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 new file mode 100644 index 0000000..b824c17 --- /dev/null +++ b/tests/TestRequest.php @@ -0,0 +1,21 @@ +setBaseUrl('/communityid'); + } +} diff --git a/tests/Zend_Mail_Transport_Mock.php b/tests/Zend_Mail_Transport_Mock.php new file mode 100755 index 0000000..d86b255 --- /dev/null +++ b/tests/Zend_Mail_Transport_Mock.php @@ -0,0 +1,34 @@ +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 new file mode 100644 index 0000000..b186c49 --- /dev/null +++ b/tests/modules/default/controllers/FeedbackControllerTests.php @@ -0,0 +1,146 @@ +returnResponse(true); + $this->_response = new Zend_Controller_Response_Http(); + Setup::$front->setResponse($this->_response); + } + + public function testIndexAction() + { + Setup::$front->setRequest(new TestRequest('/feedback')); + Setup::dispatch(); + + $this->assertContains('
    _response->getBody()); + } + + /** + * @dataProvider provideBadFormInput + */ + public function testSendWithEmptyFieldsAction($name, $email, $feedback) + { + $_POST = array( + 'name' => $name, + 'email' => $email, + 'feedback' => $feedback, + ); + + Setup::$front->setRequest(new TestRequest('/feedback/send')); + Setup::dispatch(); + + $this->assertContains('Value is empty, but a non-empty value is required', $this->_response->getBody()); + } + + public function testSendWithBadEmailAction() + { + $_POST = array( + 'name' => 'john doe', + 'email' => 'john.doe.mailinator.com', + 'feedback' => 'whateva', + ); + + Setup::$front->setRequest(new TestRequest('/feedback/send')); + Setup::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', + ); + + Setup::$front->setRequest(new TestRequest('/feedback/send')); + Setup::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); + Setup::$front->setRequest(new TestRequest('/feedback/send')); + Setup::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], + ) + ); + + Setup::$front->setRequest(new TestRequest('/feedback/send')); + + Setup::$mockLogger->events = array(); + try { + Setup::dispatch(); + } catch (Zend_Controller_Response_Exception $e) { + // I still don't know how to avoid the "headers already sent" problem here... + } + $lastLog = array_pop(Setup::$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 new file mode 100755 index 0000000..6197775 --- /dev/null +++ b/tests/modules/default/controllers/HistoryControllerTests.php @@ -0,0 +1,80 @@ +returnResponse(true); + $this->_response = new Zend_Controller_Response_Http(); + Setup::$front->setResponse($this->_response); + + $users = new Users(); + $user = $users->createRow(); + $user->id = 23; + $user->role = User::ROLE_ADMIN; + $user->username = 'testuser'; + Zend_Registry::set('user', $user); + } + + /** + * @expectedException Monkeys_AccessDeniedException + */ + public function testIndexGuestUserAction() + { + Zend_Registry::get('user')->role = User::ROLE_GUEST; + + Setup::$front->setRequest(new TestRequest('/history')); + Setup::dispatch(); + } + + public function testIndexAction() + { + Setup::$front->setRequest(new TestRequest('/history')); + Setup::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'); + Setup::$front->setRequest($request); + Setup::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'); + Setup::$front->setRequest($request); + Setup::dispatch(); + + $this->assertRegExp( + '{"code":200}', + $this->_response->getBody() + ); + } +} diff --git a/tests/modules/default/controllers/IdentityControllerTests.php b/tests/modules/default/controllers/IdentityControllerTests.php new file mode 100755 index 0000000..a8aa4a5 --- /dev/null +++ b/tests/modules/default/controllers/IdentityControllerTests.php @@ -0,0 +1,50 @@ +returnResponse(true); + $this->_response = new Zend_Controller_Response_Http(); + Setup::$front->setResponse($this->_response); + + // guest user + $users = new Users(); + $user = $users->createRow(); + Zend_Registry::set('user', $user); + } + + /** + * @expectedException Monkeys_BadUrlException + */ + public function testIndexNoIdentityAction() + { + Setup::$front->setRequest(new TestRequest('/identity')); + Setup::dispatch(); + } + + public function testIdAction() + { + Setup::$front->setRequest(new TestRequest('/identity/whateva')); + $_SERVER['SCRIPT_URI'] = 'http://localhost/communityid/identity/whateva'; + Setup::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 new file mode 100644 index 0000000..052b764 --- /dev/null +++ b/tests/modules/default/controllers/MessageusersControllerTests.php @@ -0,0 +1,139 @@ +returnResponse(true); + $this->_response = new Zend_Controller_Response_Http(); + Setup::$front->setResponse($this->_response); + + $users = new Users(); + $user = $users->createRow(); + $user->id = 23; + $user->role = User::ROLE_ADMIN; + $user->username = 'testadmin'; + Zend_Registry::set('user', $user); + + } + + /** + * @expectedException Monkeys_AccessDeniedException + */ + public function testIndexGuestUserAction() + { + Zend_Registry::get('user')->role = User::ROLE_GUEST; + + Setup::$front->setRequest(new TestRequest('/messageusers')); + Setup::dispatch(); + } + + /** + * @expectedException Monkeys_AccessDeniedException + */ + public function testIndexRegisteredUserAction() + { + Zend_Registry::get('user')->role = User::ROLE_REGISTERED; + + Setup::$front->setRequest(new TestRequest('/messageusers')); + Setup::dispatch(); + } + + public function testIndexAction() + { + Setup::$front->setRequest(new TestRequest('/messageusers')); + Setup::dispatch(); + + $this->assertContains('
    ', $this->_response->getBody()); + } + + public function testSaveActionWithEmptySubject() + { + $_POST = array( + 'messageType' => 'rich', + 'subject' => '', + 'cc' => '', + 'bodyPlain' => '', + 'bodyHTML' => 'Hello world', + ); + + Setup::$front->setRequest(new TestRequest('/messageusers/send')); + Setup::dispatch(); + + $this->assertContains('Value is empty, but a non-empty value is required', $this->_response->getBody()); + } + + public function testSaveActionWithBadCC() + { + $_POST = array( + 'messageType' => 'rich', + 'subject' => 'whateva', + 'cc' => 'asdfdf', + 'bodyPlain' => '', + 'bodyHTML' => 'Hello world', + ); + + Setup::$front->setRequest(new TestRequest('/messageusers/send')); + Setup::dispatch(); + + $this->assertContains('CC field must be a comma-separated list of valid E-mails', $this->_response->getBody()); + } + + /** + * @expectedException Monkeys_AccessDeniedException + */ + public function testSaveGuestUser() + { + Zend_Registry::get('user')->role = User::ROLE_GUEST; + + Setup::$front->setRequest(new TestRequest('/messageusers/send')); + Setup::dispatch(); + } + + /** + * @expectedException Monkeys_AccessDeniedException + */ + public function testSaveRegisteredUser() + { + Zend_Registry::get('user')->role = User::ROLE_REGISTERED; + + Setup::$front->setRequest(new TestRequest('/messageusers/send')); + Setup::dispatch(); + } + + public function testSaveSuccessfull() + { + $_POST = array( + 'messageType' => 'rich', + 'subject' => 'whateva', + 'cc' => 'one@mailinator.com, two@mailinator.com', + 'bodyPlain' => '', + 'bodyHTML' => 'Hello world', + ); + + Setup::$front->setRequest(new TestRequest('/messageusers/send')); + Setup::$mockLogger->events = array(); + try { + Setup::dispatch(); + } catch (Zend_Controller_Response_Exception $e) { + // I still don't know how to avoid the "headers already sent" problem here... + } + + $lastLog = array_pop(Setup::$mockLogger->events); + $this->assertEquals("redirected to ''", $lastLog['message']); + } +} diff --git a/tests/modules/default/controllers/OpenidControllerTests.php b/tests/modules/default/controllers/OpenidControllerTests.php new file mode 100755 index 0000000..5546991 --- /dev/null +++ b/tests/modules/default/controllers/OpenidControllerTests.php @@ -0,0 +1,403 @@ +_tempDir = APP_DIR . '/tests/temp'; + } + + public function setUp() + { + TestHarness::setUp(); + + Setup::$front->returnResponse(true); + $this->_response = new Zend_Controller_Response_Http(); + Setup::$front->setResponse($this->_response); + + $users = new Users(); + $this->_user = $users->createRow(); + $this->_user->test = 1; + $this->_user->username = 'testuser'; + $this->_user->role = User::ROLE_REGISTERED; + $this->_user->openid = 'http://localhost/communityid/identity/'.$this->_user->username; + $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); + } + + /** + * @expectedException Monkeys_BadUrlException + */ + public function testIndexAction() + { + Setup::$front->setRequest(new TestRequest('/openid')); + Setup::dispatch(); + } + + public function testProviderAssociateAction() + { + $_POST = 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=', + ); + + // needed by Zend_OpenId_Provider + $_SERVER["REQUEST_METHOD"] = 'POST'; + + Setup::$front->setRequest(new TestRequest('/openid/provider')); + Setup::dispatch(); + + $this->assertEquals( + preg_match( + "% + ns:http://specs\.openid\.net/auth/2\.0\\x0A + assoc_type:HMAC-SHA256\\x0A + session_type:DH-SHA256\\x0A + dh_server_public:.*\\x0A + enc_mac_key:.*\\x0A + assoc_handle:([a-f0-9]+)\\x0A + expires_in:3600\\x0A + %x", + $this->_response->getBody(), + $matches + ), + 1 + ); + self::$assocHandle = $matches[1]; + } + + public function testProviderCheckidSetupAction() + { + // needed by Zend_OpenId_Provider + $_SERVER["REQUEST_METHOD"] = 'GET'; + + Zend_OpenId::$exitOnRedirect = false; + + Setup::$front->setRequest(new TestRequest('/openid/provider?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%2Eexample%2Ecom&openid.realm=http%3A%2F%2Fwww%2Eexample%2Ecom')); + Setup::dispatch(); + + $this->assertEquals( + preg_match( + '# + window\.location=\'http://.*/communityid/openid/login\? + 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 + \'; + #x', + $this->_response->getBody() + ), + 1 + ); + } + + public function testLoginAction() + { + $_SERVER['QUERY_STRING'] = sprintf(self::CHECKID_QUERY, self::$assocHandle); + + Setup::$front->setRequest(new TestRequest('/openid/login?' . $_SERVER['QUERY_STRING'])); + Setup::dispatch(); + + $this->assertContains('
    ', $this->_response->getBody()); + } + + public function testAuthenticateEmptyUsernameAction() + { + $_SERVER['QUERY_STRING'] = sprintf(self::CHECKID_QUERY, self::$assocHandle); + + $_POST = array( + 'openIdIdentity' => '', + 'password' => 'whateva', + ); + + Setup::$front->setRequest(new TestRequest('/openid/authenticate?' . $_SERVER['QUERY_STRING'])); + Setup::dispatch(); + + $this->assertContains('Value is empty, but a non-empty value is required', $this->_response->getBody()); + } + + public function testAuthenticateBadUsernameAction() + { + $_SERVER['QUERY_STRING'] = sprintf(self::CHECKID_QUERY, self::$assocHandle); + + $_POST = array( + 'openIdIdentity' => 'whateva', + 'password' => 'whatevaagain', + ); + + Zend_OpenId::$exitOnRedirect = false; + + Setup::$front->setRequest(new TestRequest('/openid/authenticate?' . $_SERVER['QUERY_STRING'])); + Setup::dispatch(); + + $this->assertEquals( + preg_match( + '# + window\.location=\'http://.*/communityid/openid/provider\? + 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 + \'; + #x', + $this->_response->getBody() + ), + 1 + ); + } + + public function testAuthenticateBadPasswordAction() + { + $_SERVER['QUERY_STRING'] = sprintf(self::CHECKID_QUERY, self::$assocHandle); + + $_POST = array( + 'openIdIdentity' => $this->_user->openid, + 'password' => 'whateva', + ); + + Zend_OpenId::$exitOnRedirect = false; + + Setup::$front->setRequest(new TestRequest('/openid/authenticate?' . $_SERVER['QUERY_STRING'])); + Setup::dispatch(); + + $this->assertEquals( + preg_match( + '# + window\.location=\'http://.*/communityid/openid/provider\? + 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 + \'; + #x', + $this->_response->getBody() + ), + 1 + ); + } + + public function testAuthenticateSuccessfulAction() + { + $_SERVER['QUERY_STRING'] = sprintf(self::CHECKID_QUERY, self::$assocHandle); + + $_POST = array( + 'openIdIdentity' => $this->_user->openid, + 'password' => 'm', + ); + + Zend_OpenId::$exitOnRedirect = false; + + Setup::$front->setRequest(new TestRequest('/openid/authenticate?' . $_SERVER['QUERY_STRING'])); + Setup::dispatch(); + + $this->assertEquals( + preg_match( + '# + window\.location=\'http://.*/communityid/openid/provider\? + 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 + \'; + #x', + $this->_response->getBody() + ), + 1 + ); + } + + public function testTrustAction1() + { + $openIdUser = new OpenIdUser(); + $openIdUser->setLoggedInUser($this->_user->openid); + + $_SERVER['QUERY_STRING'] = sprintf(self::CHECKID_QUERY, self::$assocHandle); + + // needed by Zend_OpenId_Provider + $_SERVER["REQUEST_METHOD"] = 'GET'; + + Zend_OpenId::$exitOnRedirect = false; + + Setup::$front->setRequest(new TestRequest('/openid/provider?' . $_SERVER['QUERY_STRING'])); + Setup::dispatch(); + + $this->assertEquals( + preg_match( + '# + window\.location=\'http://.*/communityid/openid/trust\? + 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 + \'; + #x', + $this->_response->getBody() + ), + 1 + ); + } + + public function testTrustAction2() + { + $openIdUser = new OpenIdUser(); + $openIdUser->setLoggedInUser($this->_user->openid); + + $_SERVER['QUERY_STRING'] = sprintf(self::CHECKID_QUERY, self::$assocHandle); + + Setup::$front->setRequest(new TestRequest('/openid/trust?' . $_SERVER['QUERY_STRING'])); + Setup::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 testProviderProceedAction() + { + $openIdUser = new OpenIdUser(); + $openIdUser->setLoggedInUser($this->_user->openid); + + $_SERVER['QUERY_STRING'] = sprintf(self::CHECKID_QUERY, self::$assocHandle); + + // required for logging + $_SERVER['REMOTE_ADDR'] = '127.0.0.1'; + + Zend_OpenId::$exitOnRedirect = false; + + $_POST = array( + 'action' => 'proceed', + 'allow' => 'Allow', + ); + Setup::$front->setRequest(new TestRequest('/openid/provider?' . $_SERVER['QUERY_STRING'])); + Setup::dispatch(); + + $this->assertEquals( + preg_match( + '# + window\.location=\'http://www.example.com\? + openid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0 + &openid.assoc_handle='.self::$assocHandle.' + &openid.return_to=http%3A%2F%2Fwww.example.com + &openid.claimed_id=http%3A%2F%2Flocalhost%2Fcommunityid%2Fidentity%2Ftestuser + &openid.identity=http%3A%2F%2Flocalhost%2Fcommunityid%2Fidentity%2Ftestuser + &openid.op_endpoint=http%3A%2F%2F.* + &openid.response_nonce='.gmdate('Y-m-d\T').'.* + &openid.mode=id_res + &openid.signed=ns%2Cassoc_handle%2Creturn_to%2Cclaimed_id%2Cidentity%2Cop_endpoint%2Cresponse_nonce%2Cmode%2Csigned + &openid.sig=.* + \'; + #x', + $this->_response->getBody() + ), + 1 + ); + } + + public function testAlreadyTrustedWithSreg() + { + $sregData = array( + 'nickname' => 'nicktest', + 'email' => 'test_x@mailinator.com', + 'fullname' => 'Michael Jordan', + ); + $sreg = new Zend_OpenId_Extension_Sreg($sregData); + $storage = new Monkeys_OpenId_Provider_Storage_Database(); + $storage->addSite($this->_user->openid, 'http://www.example.com', array('Zend_OpenId_Extension_Sreg' => $sregData)); + $openIdUser = new OpenIdUser(); + $openIdUser->setLoggedInUser($this->_user->openid); + + $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['QUERY_STRING'] = sprintf($queryString, self::$assocHandle); + + // required for logging + $_SERVER['REMOTE_ADDR'] = '127.0.0.1'; + + // needed by Zend_OpenId_Provider + $_SERVER["REQUEST_METHOD"] = 'GET'; + + Zend_OpenId::$exitOnRedirect = false; + + Setup::$front->setRequest(new TestRequest('/openid/provider?' . $_SERVER['QUERY_STRING'])); + Setup::dispatch(); + + $this->assertEquals( + preg_match( + '# + window\.location=\'http://www.example.com\? + openid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0 + &openid.assoc_handle='.self::$assocHandle.' + &openid.return_to=http%3A%2F%2Fwww.example.com + &openid.claimed_id=http%3A%2F%2Flocalhost%2Fcommunityid%2Fidentity%2Ftestuser + &openid.identity=http%3A%2F%2Flocalhost%2Fcommunityid%2Fidentity%2Ftestuser + &openid.op_endpoint=http%3A%2F%2F.* + &openid.response_nonce='.gmdate('Y-m-d\T').'.* + &openid.mode=id_res + &openid.ns.sreg=http%3A%2F%2Fopenid.net%2Fextensions%2Fsreg%2F1.1 + &openid.sreg.nickname=nicktest + &openid.sreg.email=test_x%40mailinator.com + &openid.sreg.fullname=Michael\+Jordan + &openid.signed=ns%2Cassoc_handle%2Creturn_to%2Cclaimed_id%2Cidentity%2Cop_endpoint%2Cresponse_nonce%2Cmode%2Cns.sreg%2Csreg.nickname%2Csreg.email%2Csreg.fullname%2Csigned + &openid.sig=.* + \'; + #x', + $this->_response->getBody() + ), + 1 + ); + } + + public function tearDown() + { + $users = new Users(); + $this->_user->delete(); + } +} diff --git a/tests/modules/users/controllers/ProfilegeneralControllerTests.php b/tests/modules/users/controllers/ProfilegeneralControllerTests.php new file mode 100644 index 0000000..f6e0fa5 --- /dev/null +++ b/tests/modules/users/controllers/ProfilegeneralControllerTests.php @@ -0,0 +1,52 @@ +returnResponse(true); + $this->_response = new Zend_Controller_Response_Http(); + Setup::$front->setResponse($this->_response); + } + + public function testChangepasswordAction() + { + $users = new Users(); + $user = $users->createRow(); + $user->id = 23; + $user->role = User::ROLE_REGISTERED; + Zend_Registry::set('user', $user); + + $targetUser = $users->createRow(); + $targetUser->id = 24; + Zend_Registry::set('targetUser', $targetUser); + + Setup::$front->setRequest(new TestRequest('/users/profilegeneral/changepassword')); + try { + Setup::dispatch(); + $this->fail(); + } catch (Exception $e) { + $this->assertType('Monkeys_AccessDeniedException', $e); + } + + $targetUser = clone $user; + Zend_Registry::set('targetUser', $targetUser); + Setup::dispatch(); + $this->assertContains('_response->getBody()); + } +} diff --git a/tests/modules/users/controllers/RegisterControllerTests.php b/tests/modules/users/controllers/RegisterControllerTests.php new file mode 100644 index 0000000..6d6fb07 --- /dev/null +++ b/tests/modules/users/controllers/RegisterControllerTests.php @@ -0,0 +1,311 @@ +returnResponse(true); + $this->_response = new Zend_Controller_Response_Http(); + Setup::$front->setResponse($this->_response); + } + + public function testIndexAction() + { + Setup::$front->setRequest(new TestRequest('/users/register')); + Setup::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, + ); + + Setup::$front->setRequest(new TestRequest('/users/register/save')); + Setup::dispatch(); + + $this->assertContains('Value is empty, but a non-empty value is required', $this->_response->getBody()); + } + + public function testSaveActionWithBadEmail() + { + $_POST = array( + 'firstname' => 'john', + 'lastname' => 'smith', + 'email' => 'john.mailinator.com', + 'username' => 'johns34', + 'password1' => 'johns', + 'password2' => 'johns', + ); + + Setup::$front->setRequest(new TestRequest('/users/register/save')); + Setup::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', + ); + + Setup::$front->setRequest(new TestRequest('/users/register/save')); + Setup::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', + ); + + Setup::$front->setRequest(new TestRequest('/users/register/save')); + Setup::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); + Setup::$front->setRequest(new TestRequest('/users/register')); + Setup::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'; + Setup::$front->setRequest(new TestRequest('/users/register/save')); + + Setup::$mockLogger->events = array(); + try { + Setup::dispatch(); + } catch (Zend_Controller_Response_Exception $e) { + // I still don't know how to avoid the "headers already sent" problem here... + } + $lastLog = array_pop(Setup::$mockLogger->events); + $this->assertEquals("redirected to ''", $lastLog['message']); + + $users = new Users(); + $user = $users->getUserWithEmail($email); + $this->assertType('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(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'; + + require_once APP_DIR . '/modules/users/controllers/RegisterController.php'; + $mail = Users_RegisterController::getMail($user); + $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); + } + + public function testEulaBadTokenAction() + { + $_GET = array('token' => 'asdfsdf'); + Setup::$front->setRequest(new TestRequest('/users/register/eula')); + try { + Setup::dispatch(); + } catch (Zend_Controller_Response_Exception $e) { + } + $lastLog = array_pop(Setup::$mockLogger->events); + $this->assertEquals("redirected to ''", $lastLog['message']); + } + + public function testEulaAction() + { + $user = $this->_getUser(); + $user->save(); + $_GET = array('token' => $user->token); + Setup::$front->setRequest(new TestRequest('/users/register/eula')); + Setup::dispatch(); + $fp = fopen(dirname(__FILE__) . '/../../../../resources/eula.txt', 'r'); + $firstLine = fgets($fp); + $this->assertContains($firstLine, $this->_response->getBody()); + $user->delete(); + } + + public function testDeclineeulaBadTokenAction() + { + $_GET = array('token' => 'asdfsdf'); + Setup::$front->setRequest(new TestRequest('/users/register/declineeula')); + try { + Setup::dispatch(); + } catch (Zend_Controller_Response_Exception $e) { + } + $lastLog = array_pop(Setup::$mockLogger->events); + $this->assertEquals("redirected to ''", $lastLog['message']); + $lastLog = array_pop(Setup::$mockLogger->events); + $this->assertEquals("invalid token", $lastLog['message']); + } + + public function testDeclineeulaAction() + { + $user = $this->_getUser(); + $user->save(); + $token = $user->token; + + $_GET = array('token' => $user->token); + Setup::$front->setRequest(new TestRequest('/users/register/declineeula')); + try { + Setup::dispatch(); + } catch (Zend_Controller_Response_Exception $e) { + } + $lastLog = array_pop(Setup::$mockLogger->events); + $this->assertEquals("redirected to ''", $lastLog['message']); + + $users = new Users(); + $user = $users->getUserWithToken($token); + $this->assertNull($user); + } + + public function testAccepteulaBadTokenAction() + { + $_GET = array('token' => 'asdfsdf'); + Setup::$front->setRequest(new TestRequest('/users/register/accepteula')); + try { + Setup::dispatch(); + } catch (Zend_Controller_Response_Exception $e) { + } + $lastLog = array_pop(Setup::$mockLogger->events); + $this->assertEquals("redirected to ''", $lastLog['message']); + } + + public function testAccepteulaAction() + { + $user = $this->_getUser(); + $user->save(); + $token = $user->token; + + $_GET = array('token' => $user->token); + + Setup::$front->setRequest(new TestRequest('/users/register/accepteula')); + try { + Setup::dispatch(); + } catch (Zend_Controller_Response_Exception $e) { + } + $lastLog = array_pop(Setup::$mockLogger->events); + $this->assertEquals("redirected to '/users/profile'", $lastLog['message']); + + $user->delete(); + } + + 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(); + $user = $users->createRow(); + $user->firstname = 'john'; + $user->lastname = 'smith'; + $user->token = User::generateToken(); + $user->email = 'john@mailinator.com'; + + return $user; + } +} diff --git a/tests/modules/users/models/UsersTests.php b/tests/modules/users/models/UsersTests.php new file mode 100644 index 0000000..08a289d --- /dev/null +++ b/tests/modules/users/models/UsersTests.php @@ -0,0 +1,57 @@ +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 = User::ROLE_REGISTERED; + $user->token = ''; + $user->save(); + + $user = $users->getUserWithEmail('usertest@mailinator.com'); + $this->assertType('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(User::ROLE_REGISTERED, $user->role); + $this->assertEquals('', $user->token); + + $user->delete(); + + $user = $users->getUserWithEmail('thisshouldntexist'); + $this->assertNull($user); + } +} diff --git a/utilities/deleteTestUsers.php b/utilities/deleteTestUsers.php new file mode 100644 index 0000000..d46c50a --- /dev/null +++ b/utilities/deleteTestUsers.php @@ -0,0 +1,26 @@ +deleteTestEntries(); diff --git a/utilities/generateRandomHistory.php b/utilities/generateRandomHistory.php new file mode 100644 index 0000000..592fa08 --- /dev/null +++ b/utilities/generateRandomHistory.php @@ -0,0 +1,65 @@ +_words = file(dirname(__FILE__).'/../libs/Monkeys/tests/words.txt'); + $this->_numWords= count($this->_words); + } + + public function generate() + { + $histories = new Histories(); + + $stats = new 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 = History::AUTHORIZED; + $history->save(); + } + } +} + +$generate = new GenerateRandomHistory(); +$generate->generate(); diff --git a/utilities/generateRandomTrustedSites.php b/utilities/generateRandomTrustedSites.php new file mode 100644 index 0000000..3251cea --- /dev/null +++ b/utilities/generateRandomTrustedSites.php @@ -0,0 +1,64 @@ +_words = file(dirname(__FILE__).'/../libs/Monkeys/tests/words.txt'); + $this->_numWords= count($this->_words); + } + + public function generate() + { + $sites = new Sites(); + + $stats = new 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 new file mode 100755 index 0000000..e3097ad --- /dev/null +++ b/utilities/generateRandomUsers.php @@ -0,0 +1,66 @@ +_names = file(dirname(__FILE__).'/../libs/Monkeys/tests/names.txt'); + $this->_numNames = count($this->_names); + } + + public function generate() + { + $users = new Users(); + for ($i = 0; $i < NUM_USERS ; $i++) { + $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 = 1; + $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 = 'registered'; + $user->token = ''; + $user->save(); + } + } +} + +$generate = new GenerateRandomUsers(); +$generate->generate(); diff --git a/utilities/lighttpd_mod_rewrite.txt b/utilities/lighttpd_mod_rewrite.txt new file mode 100644 index 0000000..d9cf9db --- /dev/null +++ b/utilities/lighttpd_mod_rewrite.txt @@ -0,0 +1,12 @@ +If using Lighttpd as your web server, add the following to Lighttpd's main config file: + +url.rewrite-once = ( + "(.*\.(js|ico|gif|jpg|png|css|html|php))(\?v=.*)?$" => "$1", + ".*\?(.*)$" => "/index.php?$1", + "" => "/index.php" +) + +Note: The "php" part in the first rule is to be able to load the javascript language file, which is actually a php file. + +Make sure you have mod_rewrite enabled by putting the following somewhere above the previous block: +server.modules += ("mod_rewrite") diff --git a/views/layouts/layout.phtml b/views/layouts/layout.phtml new file mode 100644 index 0000000..02cf272 --- /dev/null +++ b/views/layouts/layout.phtml @@ -0,0 +1,87 @@ +doctype(Zend_View_Helper_Doctype::XHTML1_STRICT); ?> + + + + headTitle('Community ID'); ?> + + + + + headLink() ?> + headStyle() ?> + + + + + + + + headScript() ?> + + + +
    +
    + + layout()->subHeader ?> +
    +
    +
    +
    + messages): ?> +
    + ', $this->messages) ?> +
    + + underMaintenance && $this->user->role != User::ROLE_GUEST): ?> +
    + translate('Maintenance mode is enabled: user access is restricted') ?> +
    + + + layout()->content ?> +
    +
    + numCols == 2): ?> + + +
    +
    + +
    +
    + + + + + diff --git a/webdir/.htaccess b/webdir/.htaccess new file mode 100755 index 0000000..05db65b --- /dev/null +++ b/webdir/.htaccess @@ -0,0 +1,6 @@ +RewriteEngine on +RewriteCond %{REQUEST_FILENAME} -s [OR] +RewriteCond %{REQUEST_FILENAME} -l [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^.*$ - [NC,L] +RewriteRule ^.*$ index.php [NC,L] diff --git a/webdir/favicon.ico b/webdir/favicon.ico new file mode 100755 index 0000000..67b1d77 Binary files /dev/null and b/webdir/favicon.ico differ diff --git a/webdir/images/bg_content.jpg b/webdir/images/bg_content.jpg new file mode 100644 index 0000000..e4f146e Binary files /dev/null and b/webdir/images/bg_content.jpg differ diff --git a/webdir/images/bg_foot.jpg b/webdir/images/bg_foot.jpg new file mode 100644 index 0000000..b2126bb Binary files /dev/null and b/webdir/images/bg_foot.jpg differ diff --git a/webdir/images/bg_panel.gif b/webdir/images/bg_panel.gif new file mode 100644 index 0000000..1365280 Binary files /dev/null and b/webdir/images/bg_panel.gif differ diff --git a/webdir/images/bg_panel.png b/webdir/images/bg_panel.png new file mode 100644 index 0000000..4aeea9f Binary files /dev/null and b/webdir/images/bg_panel.png differ diff --git a/webdir/images/bg_panel_title.gif b/webdir/images/bg_panel_title.gif new file mode 100644 index 0000000..a1cb832 Binary files /dev/null and b/webdir/images/bg_panel_title.gif differ diff --git a/webdir/images/bg_title_article.gif b/webdir/images/bg_title_article.gif new file mode 100644 index 0000000..c8d3c26 Binary files /dev/null and b/webdir/images/bg_title_article.gif differ diff --git a/webdir/images/bg_title_article_span.gif b/webdir/images/bg_title_article_span.gif new file mode 100644 index 0000000..bdd98db Binary files /dev/null and b/webdir/images/bg_title_article_span.gif differ diff --git a/webdir/images/button_register_a.png b/webdir/images/button_register_a.png new file mode 100644 index 0000000..eef7bd4 Binary files /dev/null and b/webdir/images/button_register_a.png differ diff --git a/webdir/images/button_register_span.png b/webdir/images/button_register_span.png new file mode 100644 index 0000000..bfc21a9 Binary files /dev/null and b/webdir/images/button_register_span.png differ diff --git a/webdir/images/content_background.png b/webdir/images/content_background.png new file mode 100755 index 0000000..0902b13 Binary files /dev/null and b/webdir/images/content_background.png differ diff --git a/webdir/images/footer_background.png b/webdir/images/footer_background.png new file mode 100755 index 0000000..1c6cdfe Binary files /dev/null and b/webdir/images/footer_background.png differ diff --git a/webdir/images/h2.png b/webdir/images/h2.png new file mode 100755 index 0000000..5591cda Binary files /dev/null and b/webdir/images/h2.png differ diff --git a/webdir/images/header_background.png b/webdir/images/header_background.png new file mode 100755 index 0000000..eb5cf96 Binary files /dev/null and b/webdir/images/header_background.png differ diff --git a/webdir/images/logo.gif b/webdir/images/logo.gif new file mode 100755 index 0000000..f8b0b3c Binary files /dev/null and b/webdir/images/logo.gif differ diff --git a/webdir/images/openid_small_logo.png b/webdir/images/openid_small_logo.png new file mode 100644 index 0000000..2829b00 Binary files /dev/null and b/webdir/images/openid_small_logo.png differ diff --git a/webdir/images/progress.gif b/webdir/images/progress.gif new file mode 100644 index 0000000..b713e27 Binary files /dev/null and b/webdir/images/progress.gif differ diff --git a/webdir/images/sidebar_border_left.png b/webdir/images/sidebar_border_left.png new file mode 100755 index 0000000..61e1007 Binary files /dev/null and b/webdir/images/sidebar_border_left.png differ diff --git a/webdir/images/topnav_background.png b/webdir/images/topnav_background.png new file mode 100755 index 0000000..5b93d1c Binary files /dev/null and b/webdir/images/topnav_background.png differ diff --git a/webdir/images/topnav_background_hover.png b/webdir/images/topnav_background_hover.png new file mode 100755 index 0000000..8486ba5 Binary files /dev/null and b/webdir/images/topnav_background_hover.png differ diff --git a/webdir/index.php b/webdir/index.php new file mode 100755 index 0000000..08598ce --- /dev/null +++ b/webdir/index.php @@ -0,0 +1,17 @@ +" + COMMID.lang["deny"] + ""); + } else { + links.push("" + COMMID.lang["allow"] + ""); + } + + if (oRecord.getData("infoExchanged")) { + links.push("" + COMMID.lang["view info exchanged"] + ""); + } + + links.push("" + COMMID.lang["delete"] + ""); + + elCell.innerHTML = links.join(" | "); + }; + + var myColumnDefs = [ + {key: "site", label: COMMID.lang["Site"]}, + {key: "operations", label: "", formatter: formatOperationsColumn} + ]; + + return { + init: function() { + myDataSourceURL = COMMID.baseDir + "/sites/list?"; + + fieldsDialog = new YAHOO.widget.Dialog( + "fieldsDialog", + { + width : "30em", + effect : { + effect : YAHOO.widget.ContainerEffect.FADE, + duration : 0.25 + }, + fixedcenter : false, + modal : true, + visible : false, + draggable : true + } + ); + fieldsDialog.render(); + }, + + initTable: function() { + myDataSource = new YAHOO.util.DataSource(myDataSourceURL); + myDataSource.responseType = YAHOO.util.DataSource.TYPE_JSON; + myDataSource.responseSchema = { + resultsList: "records", + fields: ["id", "site", "trusted", "infoExchanged"], + metaFields : { + totalRecords: 'totalRecords' + } + }; + + myPaginator = new YAHOO.widget.Paginator({ + alwaysVisible : false, + containers : ['paging'], + pageLinks : 5, + rowsPerPage : 15, + rowsPerPageOptions : [15,30,60], + template : "{CurrentPageReport} {PreviousPageLink} {PageLinks} {NextPageLink} {RowsPerPageDropdown}", + pageReportTemplate : "({currentPage} " + COMMID.lang["of"] + " {totalPages})", + nextPageLinkLabel : COMMID.lang["next"] + " >", + previousPageLinkLabel : "< " + COMMID.lang["prev"] + }); + + myTableConfig = { + initialRequest : 'startIndex=0&results=15', + generateRequest : buildQueryString, + paginator : myPaginator + }; + COMMID.utils.addDatatableTranslations(myTableConfig); + + myDataTable = new YAHOO.widget.DataTable("dt", myColumnDefs, myDataSource, myTableConfig); + }, + + showInfo: function(recordId) { + var oRecord = myDataTable.getRecord(recordId); + var infoExchanged = oRecord.getData("infoExchanged"); + + $("fieldsDialogSite").innerHTML = oRecord.getData("site"); + + var fields = new Array(); + for (var fieldName in infoExchanged) { + fields.push("
    " + fieldName + ":
    \n" + +"
    " + infoExchanged[fieldName] + "
    "); + } + $("fieldsDialogDl").innerHTML = fields.join("\n"); + $("fieldsDialog").style.display = "block"; + fieldsDialog.show(); + }, + + closeDialog: function() { + fieldsDialog.hide(); + }, + + deny: function(recordId) { + var oRecord = myDataTable.getRecord(recordId); + var site = oRecord.getData("site"); + if (!confirm(COMMID.lang["Are you sure you wish to deny trust to this site?"] + "\n\n" + site)) { + return; + } + + YAHOO.util.Connect.asyncRequest( + "POST", + COMMID.baseDir + "/sites/deny", + { + success : function (responseObj) { + try { + var r = YAHOO.lang.JSON.parse(responseObj.responseText); + if (r.code == 200) { + alert(COMMID.lang["Trust the following site has been denied:"] + "\n\n" + site); + this.initTable(); + } + } catch (e) { + alert(COMMID.lang["ERROR. The server returned:"] + "\n\n" + responseObj.responseText); + } + }, + failure : COMMID.utils.asyncFailed, + scope : this + }, + "id=" + oRecord.getData("id") + ); + }, + + allow: function(recordId) { + var oRecord = myDataTable.getRecord(recordId); + var site = oRecord.getData("site"); + if (!confirm(COMMID.lang["Are you sure you wish to allow access to this site?"] + "\n\n" + site)) { + return; + } + + YAHOO.util.Connect.asyncRequest( + "POST", + COMMID.baseDir + "/sites/allow", + { + success : function (responseObj) { + try { + var r = YAHOO.lang.JSON.parse(responseObj.responseText); + if (r.code == 200) { + alert(COMMID.lang["Trust to the following site has been granted:"] + "\n\n" + site); + this.initTable(); + } + } catch (e) { + alert(COMMID.lang["ERROR. The server returned:"] + "\n\n" + responseObj.responseText); + } + }, + failure : COMMID.utils.asyncFailed, + scope : this + }, + "id=" + oRecord.getData("id") + ); + }, + + deleteSite: function(recordId) { + var oRecord = myDataTable.getRecord(recordId); + var site = oRecord.getData("site"); + if (!confirm(COMMID.lang["Are you sure you wish to delete your relationship with this site?"] + "\n\n" + site)) { + return; + } + + YAHOO.util.Connect.asyncRequest( + "POST", + COMMID.baseDir + "/sites/delete", + { + success : function (responseObj) { + try { + var r = YAHOO.lang.JSON.parse(responseObj.responseText); + if (r.code == 200) { + alert(COMMID.lang["Your relationship with the following site has been deleted:"] + "\n\n" + site); + this.initTable(); + } + } catch (e) { + alert(COMMID.lang["ERROR. The server returned:"] + "\n\n" + responseObj.responseText); + } + }, + failure : COMMID.utils.asyncFailed, + scope : this + }, + "id=" + oRecord.getData("id") + ); + } + }; +}(); + +COMMID.historyList = function() { + var myDataSource; + var myDataSourceURL; + var myDataTable; + var myPaginator; + var myTableConfig; + + var buildQueryString = function (state,dt) { + return "startIndex=" + state.pagination.recordOffset + + "&results=" + state.pagination.rowsPerPage; + }; + + var formatResultsColumn = function(elCell, oRecord, oColumn, oData) { + switch(oRecord.getData("result")) { + case 0: + elCell.innerHTML = COMMID.lang["Denied"]; + break; + case 1: + elCell.innerHTML = COMMID.lang["Authorized"]; + break; + } + }; + + var myColumnDefs = [ + {key: "date", label: COMMID.lang["Date"]}, + {key: "site", label: COMMID.lang["Site"]}, + {key: "ip", label: COMMID.lang["IP"]}, + {key: "result", label: COMMID.lang["Result"], formatter: formatResultsColumn} + ]; + + return { + init: function() { + myDataSourceURL = COMMID.baseDir + "/history/list?"; + myDataSource = new YAHOO.util.DataSource(myDataSourceURL); + myDataSource.responseType = YAHOO.util.DataSource.TYPE_JSON; + myDataSource.responseSchema = { + resultsList: "records", + fields: ["id", "date", "site", "ip", "result"], + metaFields : { + totalRecords: 'totalRecords' + } + }; + + myPaginator = new YAHOO.widget.Paginator({ + alwaysVisible : false, + containers : ['paging'], + pageLinks : 5, + rowsPerPage : 15, + rowsPerPageOptions : [15,30,60], + template : "{CurrentPageReport} {PreviousPageLink} {PageLinks} {NextPageLink} {RowsPerPageDropdown}", + pageReportTemplate : "({currentPage} " + COMMID.lang["of"] + " {totalPages})", + nextPageLinkLabel : COMMID.lang["next"] + " >", + previousPageLinkLabel : "< " + COMMID.lang["prev"] + }); + + myTableConfig = { + initialRequest : 'startIndex=0&results=15', + generateRequest : buildQueryString, + paginator : myPaginator + }; + COMMID.utils.addDatatableTranslations(myTableConfig); + + myDataTable = new YAHOO.widget.DataTable("dt", myColumnDefs, myDataSource, myTableConfig); + myDataTable.subscribe('renderEvent', this.showClearHistoryBtn, this, true); + }, + + showClearHistoryBtn: function() { + if (myDataTable.getRecordSet().getLength() > 0) { + $("clearHistory").style.display = "block"; + } else { + $("clearHistory").style.display = "none"; + } + }, + + clearEntries: function() { + if (!confirm(COMMID.lang["Are you sure you wish to delete all the History Log?"])) { + return; + } + + YAHOO.util.Connect.asyncRequest( + "POST", + "history/clear", + { + success : function(responseObj) { + try { + var r = YAHOO.lang.JSON.parse(responseObj.responseText); + if (r.code == 200) { + alert(COMMID.lang["The history log has been cleared"]); + this.init(); + } + } catch (e) { + alert(COMMID.lang["ERROR. The server returned:"] + "\n\n" + responseObj.responseText); + } + }, + failure : COMMID.utils.asyncFailed, + scope : this + } + ); + } + }; +}(); + + +COMMID.usersList = function() { + var myDataSource; + var myDataSourceURL; + var myDataTable; + var myPaginator; + var myTableConfig; + + var buildQueryString = function (state,dt) { + var request = ""; + if (state.sortedBy) { + request += "sort=" + state.sortedBy.key + "&dir=" + + (state.sortedBy.dir === YAHOO.widget.DataTable.CLASS_ASC? 0 : 1) + "&"; + } + + request += "startIndex=" + state.pagination.recordOffset + + "&results=" + state.pagination.rowsPerPage; + + return request; + }; + + var formatOperationsColumn = function(elCell, oRecord, oColumn, oData) { + var links = new Array(); + + links.push("" + + COMMID.lang["profile"] + ""); + + if (COMMID.userRole == "admin" && COMMID.userId != oRecord.getData("id")) { + links.push("" + COMMID.lang["delete"] + ""); + } + + if (links.length > 0) { + elCell.innerHTML = links.join(" | "); + } else { + elCell.innerHTML = ""; + } + }; + + var formatNameColumn = function(elCell, oRecord, oColumn, oData) { + if (oRecord.getData("role") == "admin") { + elCell.innerHTML = "" + oRecord.getData("name") + ""; + } else { + elCell.innerHTML = oRecord.getData("name"); + } + }; + + var formatStatusColumn = function(elCell, oRecord, oColumn, oData) { + if (oRecord.getData("role") == "admin") { + elCell.innerHTML = "" + oRecord.getData("status") + ""; + } else { + elCell.innerHTML = oRecord.getData("status"); + } + }; + + var handleDataReturnPayload = function(oRequest, oResponse, oPayload) { + oPayload.totalRecords = oResponse.meta.totalRecords; + $("totalUsers").innerHTML = oResponse.meta.totalRecords; + $("totalUnconfirmedUsers").innerHTML = oResponse.meta.totalUnconfirmedUsers; + $("totalConfirmedUsers").innerHTML = oResponse.meta.totalRecords - oResponse.meta.totalUnconfirmedUsers; + return oPayload; + }; + + var deleteUserCompleted = function(oRecord, responseObj) { + alert(responseObj.responseText); + myDataTable.deleteRow(oRecord); + }; + + var deleteUnconfirmedCompleted = function(responseObj) { + this.init("all"); + }; + + return { + init: function(filter) { + myDataSourceURL = COMMID.baseDir + "/users/userslist?filter=" + filter + "&"; + myDataSource = new YAHOO.util.DataSource(myDataSourceURL); + myDataSource.responseType = YAHOO.util.DataSource.TYPE_JSON; + myDataSource.responseSchema = { + resultsList: "records", + fields: ["id", "name", "registration", "status", "role"], + metaFields : { + totalRecords : 'totalRecords', + totalUnconfirmedUsers : 'totalUnconfirmedUsers' + } + }; + + myPaginator = new YAHOO.widget.Paginator({ + alwaysVisible : false, + containers : ['paging'], + pageLinks : 5, + rowsPerPage : 15, + rowsPerPageOptions : [15,30,60], + template : "{CurrentPageReport} {PreviousPageLink} {PageLinks} {NextPageLink} {RowsPerPageDropdown}", + pageReportTemplate : "({currentPage} " + COMMID.lang["of"] + " {totalPages})", + nextPageLinkLabel : COMMID.lang["next"] + " >", + previousPageLinkLabel : "< " + COMMID.lang["prev"] + }); + + myTableConfig = { + initialRequest : 'startIndex=0&results=15', + generateRequest : buildQueryString, + dynamicData : true, + paginator : myPaginator + }; + COMMID.utils.addDatatableTranslations(myTableConfig); + + var myColumnDefs = [ + {key: "name", label: COMMID.lang["Name"], sortable: true, formatter: formatNameColumn}, + {key: "registration", label: COMMID.lang["Registration"], formatter: 'date', sortable: true}, + {key: "status", label: COMMID.lang["Status"], sortable: true, hidden: (filter != 'all'), formatter: formatStatusColumn}, + {key: "operations", label: "", formatter: formatOperationsColumn} + ]; + + myDataTable = new YAHOO.widget.DataTable("dt", myColumnDefs, myDataSource, myTableConfig); + myDataTable.handleDataReturnPayload = handleDataReturnPayload; + + switch (filter) { + case 'all': + $("links_topright_all").className = "disabledLink"; + $("links_topright_confirmed").className = "enabledLink"; + $("links_topright_unconfirmed").className = "enabledLink"; + $("deleteUnconfirmedSpan").style.display = "none"; + break; + case 'confirmed': + $("links_topright_all").className = "enabledLink"; + $("links_topright_confirmed").className = "disabledLink"; + $("links_topright_unconfirmed").className = "enabledLink"; + $("deleteUnconfirmedSpan").style.display = "none"; + break; + case 'unconfirmed': + $("links_topright_all").className = "enabledLink"; + $("links_topright_confirmed").className = "enabledLink"; + $("links_topright_unconfirmed").className = "disabledLink"; + $("deleteUnconfirmedSpan").style.display = "inline"; + break; + } + }, + + deleteUser: function(recordId) { + var oRecord = myDataTable.getRecord(recordId); + if (confirm(COMMID.lang["Are you sure you wish to delete the user"] + " " + oRecord.getData("name") + "?")) { + var transaction = YAHOO.util.Connect.asyncRequest( + "POST", + COMMID.baseDir + "/users/manageusers/delete", + { + success: function (responseObj) {deleteUserCompleted(oRecord, responseObj);}, + failure: function() {alert(COMMID.lang['operation failed'])} + }, + "userid=" + oRecord.getData("id")); + } + }, + + deleteUnconfirmed: function() { + if (!confirm(COMMID.lang["Are you sure you wish to delete all the unconfirmed accounts?"])) { + return; + } + + YAHOO.util.Connect.asyncRequest( + "POST", + COMMID.baseDir + "/users/manageusers/deleteunconfirmed", + { + success : deleteUnconfirmedCompleted, + failure : function() {alert(COMMID.lang['operation failed'])}, + scope : this + }, + null); + } + }; +}(); + + +COMMID.editAccountInfo = function() { + + return { + save: function() { + YAHOO.util.Connect.setForm("accountInfoForm", true); + YAHOO.util.Connect.asyncRequest( + 'POST', + 'profilegeneral/saveaccountinfo?userid=' + COMMID.targetUserId, + { + upload: function (responseObj) {COMMID.utils.replaceContent(responseObj, "accountInfo")} + }, + null + ); + }, + + cancel: function() { + var transaction = YAHOO.util.Connect.asyncRequest( + 'GET', + 'profilegeneral/accountinfo?userid=' + COMMID.targetUserId, + { + success: function (responseObj) {COMMID.utils.replaceContent(responseObj, "accountInfo")}, + failure: COMMID.utils.asyncFailed + } + ); + } + }; +}(); + +COMMID.stats = function() { + return { + loadReport: function(report, div, params) { + if (params) { + params = "?" + params; + } else { + params = ""; + } + + YAHOO.util.Connect.asyncRequest( + "GET", + "stats/" + report + params, + { + success: function (responseObj) { + COMMID.utils.replaceContent(responseObj, div) + }, + failure: COMMID.utils.asyncFailed + }); + } + } +}(); diff --git a/webdir/javascript/language.php b/webdir/javascript/language.php new file mode 100644 index 0000000..db1f1fb --- /dev/null +++ b/webdir/javascript/language.php @@ -0,0 +1,65 @@ + + +YAHOO.namespace("commid"); +COMMID = YAHOO.commid; + +// WARNING: DO NOT PUT A COMMA AFTER THE LAST ELEMENT (breaks IE) + +COMMID.lang = { + "Name": "translate('Name') ?>", + "Registration": "translate('Registration') ?>", + "Status": "translate('Status') ?>", + "profile": "translate('profile') ?>", + "delete": "translate('delete') ?>", + "Site": "translate('Site') ?>", + "view info exchanged": "translate('view info exchanged') ?>", + "deny": "translate('deny') ?>", + "allow": "translate('allow') ?>", + "Are you sure you wish to send this message to ALL users?": "translate('Are you sure you wish to send this message to ALL users?') ?>", + "Are you sure you wish to deny trust to this site?": "translate('Are you sure you wish to deny trust to this site?') ?>", + "operation failed": "translate('operation failed') ?>", + "Trust to the following site has been granted:": "translate('Trust to the following site has been granted:') ?>", + "Trust the following site has been denied:": "translate('Trust the following site has been denied:') ?>", + "ERROR. The server returned:": "translate('ERROR. The server returned:') ?>", + "Your relationship with the following site has been deleted:": "translate('Your relationship with the following site has been deleted:') ?>", + "The history log has been cleared": "translate('The history log has been cleared') ?>", + "Are you sure you wish to allow access to this site?": "translate('Are you sure you wish to allow access to this site?') ?>", + "Are you sure you wish to delete your relationship with this site?": "translate('Are you sure you wish to delete your relationship with this site?') ?>", + "Are you sure you wish to delete all the History Log?": "translate('Are you sure you wish to delete all the History Log?') ?>", + "Are you sure you wish to delete the user": "translate('Are you sure you wish to delete the user') ?>", + "Are you sure you wish to delete all the unconfirmed accounts?": "translate('Are you sure you wish to delete all the unconfirmed accounts?') ?>", + "Date": "translate('Date') ?>", + "Result": "translate('Result') ?>", + "No records found.": "translate('No records found.') ?>", + "Loading...": "translate('Loading...') ?>", + "Data error.": "translate('Data error.') ?>", + "Click to sort ascending": "translate('Click to sort ascending') ?>", + "Click to sort descending": "translate('Click to sort descending') ?>", + "Authorized": "translate('Authorized') ?>", + "Denied": "translate('Denied') ?>", + "of": "translate('of') ?>", + "next": "translate('next') ?>", + "prev": "translate('prev') ?>", + "IP": "translate('IP') ?>" +} diff --git a/webdir/javascript/tools-min.js b/webdir/javascript/tools-min.js new file mode 100644 index 0000000..03dabf5 --- /dev/null +++ b/webdir/javascript/tools-min.js @@ -0,0 +1,105 @@ +/* +* Copyright (c) 2007, Dav Glass . +* Code licensed under the BSD License: +* http://blog.davglass.com/license.txt +* All rights reserved. +*/ +YAHOO.Tools=function(){keyStr="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";regExs={quotes:/\x22/g,startspace:/^\s+/g,endspace:/\s+$/g,striptags:/<\/?[^>]+>/gi,hasbr:/
    /i,rbr:/
    /gi,rbr2://gi,rendp:/<\/p>/gi,rp:/

    /gi,base64:/[^A-Za-z0-9\+\/\=]/g,syntaxCheck:/^("(\\.|[^"\\\n\r])*?"|[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t])+?$/} +jsonCodes={'\b':'\\b','\t':'\\t','\n':'\\n','\f':'\\f','\r':'\\r','"':'\\"','\\':'\\\\'} +return{version:'1.0'}}();YAHOO.Tools.getHeight=function(elm){var elm=$(elm);var h=$D.getStyle(elm,'height');if(h=='auto'){elm.style.zoom=1;h=elm.clientHeight+'px';} +return h;} +YAHOO.Tools.getCenter=function(elm){var elm=$(elm);var cX=Math.round(($D.getViewportWidth()-parseInt($D.getStyle(elm,'width')))/2);var cY=Math.round(($D.getViewportHeight()-parseInt(this.getHeight(elm)))/2);return[cX,cY];} +YAHOO.Tools.makeTextObject=function(txt){return document.createTextNode(txt);} +YAHOO.Tools.makeChildren=function(arr,elm){var elm=$(elm);for(var i in arr){_val=arr[i];if(typeof _val=='string'){_val=this.makeTxtObject(_val);} +elm.appendChild(_val);}} +YAHOO.Tools.styleToCamel=function(str){var _tmp=str.split('-');var _new_style=_tmp[0];for(var i=1;i<_tmp.length;i++){_new_style+=_tmp[i].substring(0,1).toUpperCase()+_tmp[i].substring(1,_tmp[i].length);} +return _new_style;} +YAHOO.Tools.removeQuotes=function(str){var checkText=new String(str);return String(checkText.replace(regExs.quotes,''));} +YAHOO.Tools.trim=function(str){return str.replace(regExs.startspace,'').replace(regExs.endspace,'');} +YAHOO.Tools.stripTags=function(str){return str.replace(regExs.striptags,'');} +YAHOO.Tools.hasBRs=function(str){return str.match(regExs.hasbr)||str.match(regExs.hasp);} +YAHOO.Tools.convertBRs2NLs=function(str){return str.replace(regExs.rbr,"\n").replace(regExs.rbr2,"\n").replace(regExs.rendp,"\n").replace(regExs.rp,"");} +YAHOO.Tools.stringRepeat=function(str,repeat){return new Array(repeat+1).join(str);} +YAHOO.Tools.stringReverse=function(str){var new_str='';for(i=0;i2)?argv[2]:null;var path=(argc>3)?argv[3]:'/';var domain=(argc>4)?argv[4]:null;var secure=(argc>5)?argv[5]:false;document.cookie=name+"="+escape(value)+ +((expires==null)?"":("; expires="+expires.toGMTString()))+ +((path==null)?"":("; path="+path))+ +((domain==null)?"":("; domain="+domain))+ +((secure==true)?"; secure":"");} +YAHOO.Tools.getCookie=function(name){var dc=document.cookie;var prefix=name+'=';var begin=dc.indexOf('; '+prefix);if(begin==-1){begin=dc.indexOf(prefix);if(begin!=0)return null;}else{begin+=2;} +var end=document.cookie.indexOf(';',begin);if(end==-1){end=dc.length;} +return unescape(dc.substring(begin+prefix.length,end));} +YAHOO.Tools.deleteCookie=function(name,path,domain){if(getCookie(name)){document.cookie=name+'='+((path)?'; path='+path:'')+((domain)?'; domain='+domain:'')+'; expires=Thu, 01-Jan-70 00:00:01 GMT';}} +YAHOO.Tools.getBrowserEngine=function(){var opera=((window.opera&&window.opera.version)?true:false);var safari=((navigator.vendor&&navigator.vendor.indexOf('Apple')!=-1)?true:false);var gecko=((document.getElementById&&!document.all&&!opera&&!safari)?true:false);var msie=((window.ActiveXObject)?true:false);var version=false;if(msie){if(typeof document.body.style.maxHeight!="undefined"){version='7';}else{version='6';}} +if(opera){var tmp_version=window.opera.version().split('.');version=tmp_version[0]+'.'+tmp_version[1];} +if(gecko){if(navigator.registerContentHandler){version='2';}else{version='1.5';} +if((navigator.vendorSub)&&!version){version=navigator.vendorSub;}} +if(safari){try{if(console){if((window.onmousewheel!=='undefined')&&(window.onmousewheel===null)){version='2';}else{version='1.3';}}}catch(e){version='1.2';}} +var browsers={ua:navigator.userAgent,opera:opera,safari:safari,gecko:gecko,msie:msie,version:version} +return browsers;} +YAHOO.Tools.getBrowserAgent=function(){var ua=navigator.userAgent.toLowerCase();var opera=((ua.indexOf('opera')!=-1)?true:false);var safari=((ua.indexOf('safari')!=-1)?true:false);var firefox=((ua.indexOf('firefox')!=-1)?true:false);var msie=((ua.indexOf('msie')!=-1)?true:false);var mac=((ua.indexOf('mac')!=-1)?true:false);var unix=((ua.indexOf('x11')!=-1)?true:false);var win=((mac||unix)?false:true);var version=false;var mozilla=false;if(!firefox&&!safari&&(ua.indexOf('gecko')!=-1)){mozilla=true;var _tmp=ua.split('/');version=_tmp[_tmp.length-1].split(' ')[0];} +if(firefox){var _tmp=ua.split('/');version=_tmp[_tmp.length-1].split(' ')[0];} +if(msie){version=ua.substring((ua.indexOf('msie ')+5)).split(';')[0];} +if(safari){version=this.getBrowserEngine().version;} +if(opera){version=ua.substring((ua.indexOf('opera/')+6)).split(' ')[0];} +var browsers={ua:navigator.userAgent,opera:opera,safari:safari,firefox:firefox,mozilla:mozilla,msie:msie,mac:mac,win:win,unix:unix,version:version} +return browsers;} +YAHOO.Tools.checkFlash=function(){var br=this.getBrowserEngine();if(br.msie){try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");var versionStr=axo.GetVariable("$version");var tempArray=versionStr.split(" ");var tempString=tempArray[1];var versionArray=tempString.split(",");var flash=versionArray[0];}catch(e){}}else{var flashObj=null;var tokens,len,curr_tok;if(navigator.mimeTypes&&navigator.mimeTypes['application/x-shockwave-flash']){flashObj=navigator.mimeTypes['application/x-shockwave-flash'].enabledPlugin;} +if(flashObj==null){flash=false;}else{tokens=navigator.plugins['Shockwave Flash'].description.split(' ');len=tokens.length;while(len--){curr_tok=tokens[len];if(!isNaN(parseInt(curr_tok))){hasVersion=curr_tok;flash=hasVersion;break;}}}} +return flash;} +YAHOO.Tools.setAttr=function(attrsObj,elm){if(typeof elm=='string'){elm=$(elm);} +for(var i in attrsObj){switch(i.toLowerCase()){case'listener':if(attrsObj[i]instanceof Array){var ev=attrsObj[i][0];var func=attrsObj[i][1];var base=attrsObj[i][2];var scope=attrsObj[i][3];$E.addListener(elm,ev,func,base,scope);} +break;case'classname':case'class':elm.className=attrsObj[i];break;case'style':YAHOO.Tools.setStyleString(elm,attrsObj[i]);break;default:elm.setAttribute(i,attrsObj[i]);break;}}} +YAHOO.Tools.create=function(tagName){tagName=tagName.toLowerCase();elm=document.createElement(tagName);var txt=false;var attrsObj=false;if(!elm){return false;} +for(var i=1;i=0;i--){if(arr[i]===val){return true;}}} +return false;} +YAHOO.Tools.checkBoolean=function(str){return((typeof str=='boolean')?true:false);} +YAHOO.Tools.checkNumber=function(str){return((isNaN(str))?false:true);} +YAHOO.Tools.PixelToEm=function(size){var data={};var sSize=(size/13);data.other=(Math.round(sSize*100)/100);data.msie=(Math.round((sSize*0.9759)*100)/100);return data;} +YAHOO.Tools.PixelToEmStyle=function(size,prop){var data='';var prop=((prop)?prop.toLowerCase():'width');var sSize=(size/13);data+=prop+':'+(Math.round(sSize*100)/100)+'em;';data+='*'+prop+':'+(Math.round((sSize*0.9759)*100)/100)+'em;';if((prop=='width')||(prop=='height')){data+='min-'+prop+':'+size+'px;';} +return data;} +YAHOO.Tools.base64Encode=function(str){var data="";var chr1,chr2,chr3,enc1,enc2,enc3,enc4;var i=0;do{chr1=str.charCodeAt(i++);chr2=str.charCodeAt(i++);chr3=str.charCodeAt(i++);enc1=chr1>>2;enc2=((chr1&3)<<4)|(chr2>>4);enc3=((chr2&15)<<2)|(chr3>>6);enc4=chr3&63;if(isNaN(chr2)){enc3=enc4=64;}else if(isNaN(chr3)){enc4=64;} +data=data+keyStr.charAt(enc1)+keyStr.charAt(enc2)+keyStr.charAt(enc3)+keyStr.charAt(enc4);}while(i>4);chr2=((enc2&15)<<4)|(enc3>>2);chr3=((enc3&3)<<6)|enc4;data=data+String.fromCharCode(chr1);if(enc3!=64){data=data+String.fromCharCode(chr2);} +if(enc4!=64){data=data+String.fromCharCode(chr3);}}while(i=0){return YAHOO.Tools.fixJSONDate(v);}else{return v;}} +return walk('',j);}else{return j;}}}catch(e){console.log(e);} +throw new SyntaxError("parseJSON");} +YAHOO.tools=YAHOO.Tools;YAHOO.TOOLS=YAHOO.Tools;YAHOO.util.Dom.create=YAHOO.Tools.create;$A=YAHOO.util.Anim;$E=YAHOO.util.Event;$D=YAHOO.util.Dom;$T=YAHOO.Tools;$=YAHOO.util.Dom.get;$$=YAHOO.util.Dom.getElementsByClassName; diff --git a/webdir/javascript/yui/animation/README b/webdir/javascript/yui/animation/README new file mode 100644 index 0000000..1139944 --- /dev/null +++ b/webdir/javascript/yui/animation/README @@ -0,0 +1,71 @@ +Animation Release Notes + +*** version 2.6.0 *** +* ColorAnim updated to use getAncestorBy + +*** version 2.5.2 *** +* no change + +*** version 2.5.1 *** +* no change + +*** version 2.5.0 *** +* replace toString overrides with static NAME property + +*** version 2.4.0 *** +* calling stop() on an non-animated Anim no longer fires onComplete + +*** version 2.3.1 *** +* no change + +*** version 2.3.0 *** + +* duration of zero now executes 1 frame animation +* added setEl() method to enable reuse +* fixed stop() for multiple animations + +*** version 2.3.0 *** +* duration of zero now executes 1 frame animation +* added setEl() method to enable reuse +* fixed stop() for multiple animations + +*** version 2.2.2 *** +* no change + +*** version 2.2.1 *** +* no change + +*** version 2.2.0 *** +* Fixed AnimMgr.stop() when called without tween + +*** version 0.12.2 *** +* raised AnimMgr.fps to 1000 + +*** version 0.12.1 *** +* minified version no longer strips line breaks + +*** version 0.12.0 *** +* added boolean finish argument to Anim.stop() + +*** version 0.11.3 *** +* no changes + +*** version 0.11.1 *** +* changed "prototype" shorthand to "proto" (workaround firefox < 1.5 scoping +bug) + +*** version 0.11.0 *** +* ColorAnim subclass added +* Motion and Scroll now inherit from ColorAnim +* getDefaultUnit method added +* defaultUnit and defaultUnits deprecated +* getDefault and setDefault methods deprecated + +*** version 0.10.0 *** +* Scroll now handles relative ("by") animation correctly +* Now converts "auto" values of "from" to appropriate initial values + +*** version 0.9.0 *** +* Initial release + + diff --git a/webdir/javascript/yui/animation/animation-debug.js b/webdir/javascript/yui/animation/animation-debug.js new file mode 100644 index 0000000..c85005d --- /dev/null +++ b/webdir/javascript/yui/animation/animation-debug.js @@ -0,0 +1,1385 @@ +/* +Copyright (c) 2008, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.6.0 +*/ +(function() { + +var Y = YAHOO.util; + +/* +Copyright (c) 2006, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +*/ + +/** + * The animation module provides allows effects to be added to HTMLElements. + * @module animation + * @requires yahoo, event, dom + */ + +/** + * + * Base animation class that provides the interface for building animated effects. + *

    Usage: var myAnim = new YAHOO.util.Anim(el, { width: { from: 10, to: 100 } }, 1, YAHOO.util.Easing.easeOut);

    + * @class Anim + * @namespace YAHOO.util + * @requires YAHOO.util.AnimMgr + * @requires YAHOO.util.Easing + * @requires YAHOO.util.Dom + * @requires YAHOO.util.Event + * @requires YAHOO.util.CustomEvent + * @constructor + * @param {String | HTMLElement} el Reference to the element that will be animated + * @param {Object} attributes The attribute(s) to be animated. + * Each attribute is an object with at minimum a "to" or "by" member defined. + * Additional optional members are "from" (defaults to current value), "units" (defaults to "px"). + * All attribute names use camelCase. + * @param {Number} duration (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based + * @param {Function} method (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method) + */ + +var Anim = function(el, attributes, duration, method) { + if (!el) { + YAHOO.log('element required to create Anim instance', 'error', 'Anim'); + } + this.init(el, attributes, duration, method); +}; + +Anim.NAME = 'Anim'; + +Anim.prototype = { + /** + * Provides a readable name for the Anim instance. + * @method toString + * @return {String} + */ + toString: function() { + var el = this.getEl() || {}; + var id = el.id || el.tagName; + return (this.constructor.NAME + ': ' + id); + }, + + patterns: { // cached for performance + noNegatives: /width|height|opacity|padding/i, // keep at zero or above + offsetAttribute: /^((width|height)|(top|left))$/, // use offsetValue as default + defaultUnit: /width|height|top$|bottom$|left$|right$/i, // use 'px' by default + offsetUnit: /\d+(em|%|en|ex|pt|in|cm|mm|pc)$/i // IE may return these, so convert these to offset + }, + + /** + * Returns the value computed by the animation's "method". + * @method doMethod + * @param {String} attr The name of the attribute. + * @param {Number} start The value this attribute should start from for this animation. + * @param {Number} end The value this attribute should end at for this animation. + * @return {Number} The Value to be applied to the attribute. + */ + doMethod: function(attr, start, end) { + return this.method(this.currentFrame, start, end - start, this.totalFrames); + }, + + /** + * Applies a value to an attribute. + * @method setAttribute + * @param {String} attr The name of the attribute. + * @param {Number} val The value to be applied to the attribute. + * @param {String} unit The unit ('px', '%', etc.) of the value. + */ + setAttribute: function(attr, val, unit) { + if ( this.patterns.noNegatives.test(attr) ) { + val = (val > 0) ? val : 0; + } + + Y.Dom.setStyle(this.getEl(), attr, val + unit); + }, + + /** + * Returns current value of the attribute. + * @method getAttribute + * @param {String} attr The name of the attribute. + * @return {Number} val The current value of the attribute. + */ + getAttribute: function(attr) { + var el = this.getEl(); + var val = Y.Dom.getStyle(el, attr); + + if (val !== 'auto' && !this.patterns.offsetUnit.test(val)) { + return parseFloat(val); + } + + var a = this.patterns.offsetAttribute.exec(attr) || []; + var pos = !!( a[3] ); // top or left + var box = !!( a[2] ); // width or height + + // use offsets for width/height and abs pos top/left + if ( box || (Y.Dom.getStyle(el, 'position') == 'absolute' && pos) ) { + val = el['offset' + a[0].charAt(0).toUpperCase() + a[0].substr(1)]; + } else { // default to zero for other 'auto' + val = 0; + } + + return val; + }, + + /** + * Returns the unit to use when none is supplied. + * @method getDefaultUnit + * @param {attr} attr The name of the attribute. + * @return {String} The default unit to be used. + */ + getDefaultUnit: function(attr) { + if ( this.patterns.defaultUnit.test(attr) ) { + return 'px'; + } + + return ''; + }, + + /** + * Sets the actual values to be used during the animation. Should only be needed for subclass use. + * @method setRuntimeAttribute + * @param {Object} attr The attribute object + * @private + */ + setRuntimeAttribute: function(attr) { + var start; + var end; + var attributes = this.attributes; + + this.runtimeAttributes[attr] = {}; + + var isset = function(prop) { + return (typeof prop !== 'undefined'); + }; + + if ( !isset(attributes[attr]['to']) && !isset(attributes[attr]['by']) ) { + return false; // note return; nothing to animate to + } + + start = ( isset(attributes[attr]['from']) ) ? attributes[attr]['from'] : this.getAttribute(attr); + + // To beats by, per SMIL 2.1 spec + if ( isset(attributes[attr]['to']) ) { + end = attributes[attr]['to']; + } else if ( isset(attributes[attr]['by']) ) { + if (start.constructor == Array) { + end = []; + for (var i = 0, len = start.length; i < len; ++i) { + end[i] = start[i] + attributes[attr]['by'][i] * 1; // times 1 to cast "by" + } + } else { + end = start + attributes[attr]['by'] * 1; + } + } + + this.runtimeAttributes[attr].start = start; + this.runtimeAttributes[attr].end = end; + + // set units if needed + this.runtimeAttributes[attr].unit = ( isset(attributes[attr].unit) ) ? + attributes[attr]['unit'] : this.getDefaultUnit(attr); + return true; + }, + + /** + * Constructor for Anim instance. + * @method init + * @param {String | HTMLElement} el Reference to the element that will be animated + * @param {Object} attributes The attribute(s) to be animated. + * Each attribute is an object with at minimum a "to" or "by" member defined. + * Additional optional members are "from" (defaults to current value), "units" (defaults to "px"). + * All attribute names use camelCase. + * @param {Number} duration (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based + * @param {Function} method (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method) + */ + init: function(el, attributes, duration, method) { + /** + * Whether or not the animation is running. + * @property isAnimated + * @private + * @type Boolean + */ + var isAnimated = false; + + /** + * A Date object that is created when the animation begins. + * @property startTime + * @private + * @type Date + */ + var startTime = null; + + /** + * The number of frames this animation was able to execute. + * @property actualFrames + * @private + * @type Int + */ + var actualFrames = 0; + + /** + * The element to be animated. + * @property el + * @private + * @type HTMLElement + */ + el = Y.Dom.get(el); + + /** + * The collection of attributes to be animated. + * Each attribute must have at least a "to" or "by" defined in order to animate. + * If "to" is supplied, the animation will end with the attribute at that value. + * If "by" is supplied, the animation will end at that value plus its starting value. + * If both are supplied, "to" is used, and "by" is ignored. + * Optional additional member include "from" (the value the attribute should start animating from, defaults to current value), and "unit" (the units to apply to the values). + * @property attributes + * @type Object + */ + this.attributes = attributes || {}; + + /** + * The length of the animation. Defaults to "1" (second). + * @property duration + * @type Number + */ + this.duration = !YAHOO.lang.isUndefined(duration) ? duration : 1; + + /** + * The method that will provide values to the attribute(s) during the animation. + * Defaults to "YAHOO.util.Easing.easeNone". + * @property method + * @type Function + */ + this.method = method || Y.Easing.easeNone; + + /** + * Whether or not the duration should be treated as seconds. + * Defaults to true. + * @property useSeconds + * @type Boolean + */ + this.useSeconds = true; // default to seconds + + /** + * The location of the current animation on the timeline. + * In time-based animations, this is used by AnimMgr to ensure the animation finishes on time. + * @property currentFrame + * @type Int + */ + this.currentFrame = 0; + + /** + * The total number of frames to be executed. + * In time-based animations, this is used by AnimMgr to ensure the animation finishes on time. + * @property totalFrames + * @type Int + */ + this.totalFrames = Y.AnimMgr.fps; + + /** + * Changes the animated element + * @method setEl + */ + this.setEl = function(element) { + el = Y.Dom.get(element); + }; + + /** + * Returns a reference to the animated element. + * @method getEl + * @return {HTMLElement} + */ + this.getEl = function() { return el; }; + + /** + * Checks whether the element is currently animated. + * @method isAnimated + * @return {Boolean} current value of isAnimated. + */ + this.isAnimated = function() { + return isAnimated; + }; + + /** + * Returns the animation start time. + * @method getStartTime + * @return {Date} current value of startTime. + */ + this.getStartTime = function() { + return startTime; + }; + + this.runtimeAttributes = {}; + + var logger = {}; + logger.log = function() {YAHOO.log.apply(window, arguments)}; + + logger.log('creating new instance of ' + this); + + /** + * Starts the animation by registering it with the animation manager. + * @method animate + */ + this.animate = function() { + if ( this.isAnimated() ) { + return false; + } + + this.currentFrame = 0; + + this.totalFrames = ( this.useSeconds ) ? Math.ceil(Y.AnimMgr.fps * this.duration) : this.duration; + + if (this.duration === 0 && this.useSeconds) { // jump to last frame if zero second duration + this.totalFrames = 1; + } + Y.AnimMgr.registerElement(this); + return true; + }; + + /** + * Stops the animation. Normally called by AnimMgr when animation completes. + * @method stop + * @param {Boolean} finish (optional) If true, animation will jump to final frame. + */ + this.stop = function(finish) { + if (!this.isAnimated()) { // nothing to stop + return false; + } + + if (finish) { + this.currentFrame = this.totalFrames; + this._onTween.fire(); + } + Y.AnimMgr.stop(this); + }; + + var onStart = function() { + this.onStart.fire(); + + this.runtimeAttributes = {}; + for (var attr in this.attributes) { + this.setRuntimeAttribute(attr); + } + + isAnimated = true; + actualFrames = 0; + startTime = new Date(); + }; + + /** + * Feeds the starting and ending values for each animated attribute to doMethod once per frame, then applies the resulting value to the attribute(s). + * @private + */ + + var onTween = function() { + var data = { + duration: new Date() - this.getStartTime(), + currentFrame: this.currentFrame + }; + + data.toString = function() { + return ( + 'duration: ' + data.duration + + ', currentFrame: ' + data.currentFrame + ); + }; + + this.onTween.fire(data); + + var runtimeAttributes = this.runtimeAttributes; + + for (var attr in runtimeAttributes) { + this.setAttribute(attr, this.doMethod(attr, runtimeAttributes[attr].start, runtimeAttributes[attr].end), runtimeAttributes[attr].unit); + } + + actualFrames += 1; + }; + + var onComplete = function() { + var actual_duration = (new Date() - startTime) / 1000 ; + + var data = { + duration: actual_duration, + frames: actualFrames, + fps: actualFrames / actual_duration + }; + + data.toString = function() { + return ( + 'duration: ' + data.duration + + ', frames: ' + data.frames + + ', fps: ' + data.fps + ); + }; + + isAnimated = false; + actualFrames = 0; + this.onComplete.fire(data); + }; + + /** + * Custom event that fires after onStart, useful in subclassing + * @private + */ + this._onStart = new Y.CustomEvent('_start', this, true); + + /** + * Custom event that fires when animation begins + * Listen via subscribe method (e.g. myAnim.onStart.subscribe(someFunction) + * @event onStart + */ + this.onStart = new Y.CustomEvent('start', this); + + /** + * Custom event that fires between each frame + * Listen via subscribe method (e.g. myAnim.onTween.subscribe(someFunction) + * @event onTween + */ + this.onTween = new Y.CustomEvent('tween', this); + + /** + * Custom event that fires after onTween + * @private + */ + this._onTween = new Y.CustomEvent('_tween', this, true); + + /** + * Custom event that fires when animation ends + * Listen via subscribe method (e.g. myAnim.onComplete.subscribe(someFunction) + * @event onComplete + */ + this.onComplete = new Y.CustomEvent('complete', this); + /** + * Custom event that fires after onComplete + * @private + */ + this._onComplete = new Y.CustomEvent('_complete', this, true); + + this._onStart.subscribe(onStart); + this._onTween.subscribe(onTween); + this._onComplete.subscribe(onComplete); + } +}; + + Y.Anim = Anim; +})(); +/** + * Handles animation queueing and threading. + * Used by Anim and subclasses. + * @class AnimMgr + * @namespace YAHOO.util + */ +YAHOO.util.AnimMgr = new function() { + /** + * Reference to the animation Interval. + * @property thread + * @private + * @type Int + */ + var thread = null; + + /** + * The current queue of registered animation objects. + * @property queue + * @private + * @type Array + */ + var queue = []; + + /** + * The number of active animations. + * @property tweenCount + * @private + * @type Int + */ + var tweenCount = 0; + + /** + * Base frame rate (frames per second). + * Arbitrarily high for better x-browser calibration (slower browsers drop more frames). + * @property fps + * @type Int + * + */ + this.fps = 1000; + + /** + * Interval delay in milliseconds, defaults to fastest possible. + * @property delay + * @type Int + * + */ + this.delay = 1; + + /** + * Adds an animation instance to the animation queue. + * All animation instances must be registered in order to animate. + * @method registerElement + * @param {object} tween The Anim instance to be be registered + */ + this.registerElement = function(tween) { + queue[queue.length] = tween; + tweenCount += 1; + tween._onStart.fire(); + this.start(); + }; + + /** + * removes an animation instance from the animation queue. + * All animation instances must be registered in order to animate. + * @method unRegister + * @param {object} tween The Anim instance to be be registered + * @param {Int} index The index of the Anim instance + * @private + */ + this.unRegister = function(tween, index) { + index = index || getIndex(tween); + if (!tween.isAnimated() || index == -1) { + return false; + } + + tween._onComplete.fire(); + queue.splice(index, 1); + + tweenCount -= 1; + if (tweenCount <= 0) { + this.stop(); + } + + return true; + }; + + /** + * Starts the animation thread. + * Only one thread can run at a time. + * @method start + */ + this.start = function() { + if (thread === null) { + thread = setInterval(this.run, this.delay); + } + }; + + /** + * Stops the animation thread or a specific animation instance. + * @method stop + * @param {object} tween A specific Anim instance to stop (optional) + * If no instance given, Manager stops thread and all animations. + */ + this.stop = function(tween) { + if (!tween) { + clearInterval(thread); + + for (var i = 0, len = queue.length; i < len; ++i) { + this.unRegister(queue[0], 0); + } + + queue = []; + thread = null; + tweenCount = 0; + } + else { + this.unRegister(tween); + } + }; + + /** + * Called per Interval to handle each animation frame. + * @method run + */ + this.run = function() { + for (var i = 0, len = queue.length; i < len; ++i) { + var tween = queue[i]; + if ( !tween || !tween.isAnimated() ) { continue; } + + if (tween.currentFrame < tween.totalFrames || tween.totalFrames === null) + { + tween.currentFrame += 1; + + if (tween.useSeconds) { + correctFrame(tween); + } + tween._onTween.fire(); + } + else { YAHOO.util.AnimMgr.stop(tween, i); } + } + }; + + var getIndex = function(anim) { + for (var i = 0, len = queue.length; i < len; ++i) { + if (queue[i] == anim) { + return i; // note return; + } + } + return -1; + }; + + /** + * On the fly frame correction to keep animation on time. + * @method correctFrame + * @private + * @param {Object} tween The Anim instance being corrected. + */ + var correctFrame = function(tween) { + var frames = tween.totalFrames; + var frame = tween.currentFrame; + var expected = (tween.currentFrame * tween.duration * 1000 / tween.totalFrames); + var elapsed = (new Date() - tween.getStartTime()); + var tweak = 0; + + if (elapsed < tween.duration * 1000) { // check if falling behind + tweak = Math.round((elapsed / expected - 1) * tween.currentFrame); + } else { // went over duration, so jump to end + tweak = frames - (frame + 1); + } + if (tweak > 0 && isFinite(tweak)) { // adjust if needed + if (tween.currentFrame + tweak >= frames) {// dont go past last frame + tweak = frames - (frame + 1); + } + + tween.currentFrame += tweak; + } + }; +}; +/** + * Used to calculate Bezier splines for any number of control points. + * @class Bezier + * @namespace YAHOO.util + * + */ +YAHOO.util.Bezier = new function() { + /** + * Get the current position of the animated element based on t. + * Each point is an array of "x" and "y" values (0 = x, 1 = y) + * At least 2 points are required (start and end). + * First point is start. Last point is end. + * Additional control points are optional. + * @method getPosition + * @param {Array} points An array containing Bezier points + * @param {Number} t A number between 0 and 1 which is the basis for determining current position + * @return {Array} An array containing int x and y member data + */ + this.getPosition = function(points, t) { + var n = points.length; + var tmp = []; + + for (var i = 0; i < n; ++i){ + tmp[i] = [points[i][0], points[i][1]]; // save input + } + + for (var j = 1; j < n; ++j) { + for (i = 0; i < n - j; ++i) { + tmp[i][0] = (1 - t) * tmp[i][0] + t * tmp[parseInt(i + 1, 10)][0]; + tmp[i][1] = (1 - t) * tmp[i][1] + t * tmp[parseInt(i + 1, 10)][1]; + } + } + + return [ tmp[0][0], tmp[0][1] ]; + + }; +}; +(function() { +/** + * Anim subclass for color transitions. + *

    Usage: var myAnim = new Y.ColorAnim(el, { backgroundColor: { from: '#FF0000', to: '#FFFFFF' } }, 1, Y.Easing.easeOut); Color values can be specified with either 112233, #112233, + * [255,255,255], or rgb(255,255,255)

    + * @class ColorAnim + * @namespace YAHOO.util + * @requires YAHOO.util.Anim + * @requires YAHOO.util.AnimMgr + * @requires YAHOO.util.Easing + * @requires YAHOO.util.Bezier + * @requires YAHOO.util.Dom + * @requires YAHOO.util.Event + * @constructor + * @extends YAHOO.util.Anim + * @param {HTMLElement | String} el Reference to the element that will be animated + * @param {Object} attributes The attribute(s) to be animated. + * Each attribute is an object with at minimum a "to" or "by" member defined. + * Additional optional members are "from" (defaults to current value), "units" (defaults to "px"). + * All attribute names use camelCase. + * @param {Number} duration (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based + * @param {Function} method (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method) + */ + var ColorAnim = function(el, attributes, duration, method) { + ColorAnim.superclass.constructor.call(this, el, attributes, duration, method); + }; + + ColorAnim.NAME = 'ColorAnim'; + + ColorAnim.DEFAULT_BGCOLOR = '#fff'; + // shorthand + var Y = YAHOO.util; + YAHOO.extend(ColorAnim, Y.Anim); + + var superclass = ColorAnim.superclass; + var proto = ColorAnim.prototype; + + proto.patterns.color = /color$/i; + proto.patterns.rgb = /^rgb\(([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\)$/i; + proto.patterns.hex = /^#?([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})$/i; + proto.patterns.hex3 = /^#?([0-9A-F]{1})([0-9A-F]{1})([0-9A-F]{1})$/i; + proto.patterns.transparent = /^transparent|rgba\(0, 0, 0, 0\)$/; // need rgba for safari + + /** + * Attempts to parse the given string and return a 3-tuple. + * @method parseColor + * @param {String} s The string to parse. + * @return {Array} The 3-tuple of rgb values. + */ + proto.parseColor = function(s) { + if (s.length == 3) { return s; } + + var c = this.patterns.hex.exec(s); + if (c && c.length == 4) { + return [ parseInt(c[1], 16), parseInt(c[2], 16), parseInt(c[3], 16) ]; + } + + c = this.patterns.rgb.exec(s); + if (c && c.length == 4) { + return [ parseInt(c[1], 10), parseInt(c[2], 10), parseInt(c[3], 10) ]; + } + + c = this.patterns.hex3.exec(s); + if (c && c.length == 4) { + return [ parseInt(c[1] + c[1], 16), parseInt(c[2] + c[2], 16), parseInt(c[3] + c[3], 16) ]; + } + + return null; + }; + + proto.getAttribute = function(attr) { + var el = this.getEl(); + if (this.patterns.color.test(attr) ) { + var val = YAHOO.util.Dom.getStyle(el, attr); + + var that = this; + if (this.patterns.transparent.test(val)) { // bgcolor default + var parent = YAHOO.util.Dom.getAncestorBy(el, function(node) { + return !that.patterns.transparent.test(val); + }); + + if (parent) { + val = Y.Dom.getStyle(parent, attr); + } else { + val = ColorAnim.DEFAULT_BGCOLOR; + } + } + } else { + val = superclass.getAttribute.call(this, attr); + } + + return val; + }; + + proto.doMethod = function(attr, start, end) { + var val; + + if ( this.patterns.color.test(attr) ) { + val = []; + for (var i = 0, len = start.length; i < len; ++i) { + val[i] = superclass.doMethod.call(this, attr, start[i], end[i]); + } + + val = 'rgb('+Math.floor(val[0])+','+Math.floor(val[1])+','+Math.floor(val[2])+')'; + } + else { + val = superclass.doMethod.call(this, attr, start, end); + } + + return val; + }; + + proto.setRuntimeAttribute = function(attr) { + superclass.setRuntimeAttribute.call(this, attr); + + if ( this.patterns.color.test(attr) ) { + var attributes = this.attributes; + var start = this.parseColor(this.runtimeAttributes[attr].start); + var end = this.parseColor(this.runtimeAttributes[attr].end); + // fix colors if going "by" + if ( typeof attributes[attr]['to'] === 'undefined' && typeof attributes[attr]['by'] !== 'undefined' ) { + end = this.parseColor(attributes[attr].by); + + for (var i = 0, len = start.length; i < len; ++i) { + end[i] = start[i] + end[i]; + } + } + + this.runtimeAttributes[attr].start = start; + this.runtimeAttributes[attr].end = end; + } + }; + + Y.ColorAnim = ColorAnim; +})(); +/*! +TERMS OF USE - EASING EQUATIONS +Open source under the BSD License. +Copyright 2001 Robert Penner All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + * Neither the name of the author nor the names of contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/** + * Singleton that determines how an animation proceeds from start to end. + * @class Easing + * @namespace YAHOO.util +*/ + +YAHOO.util.Easing = { + + /** + * Uniform speed between points. + * @method easeNone + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeNone: function (t, b, c, d) { + return c*t/d + b; + }, + + /** + * Begins slowly and accelerates towards end. + * @method easeIn + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeIn: function (t, b, c, d) { + return c*(t/=d)*t + b; + }, + + /** + * Begins quickly and decelerates towards end. + * @method easeOut + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeOut: function (t, b, c, d) { + return -c *(t/=d)*(t-2) + b; + }, + + /** + * Begins slowly and decelerates towards end. + * @method easeBoth + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeBoth: function (t, b, c, d) { + if ((t/=d/2) < 1) { + return c/2*t*t + b; + } + + return -c/2 * ((--t)*(t-2) - 1) + b; + }, + + /** + * Begins slowly and accelerates towards end. + * @method easeInStrong + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeInStrong: function (t, b, c, d) { + return c*(t/=d)*t*t*t + b; + }, + + /** + * Begins quickly and decelerates towards end. + * @method easeOutStrong + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeOutStrong: function (t, b, c, d) { + return -c * ((t=t/d-1)*t*t*t - 1) + b; + }, + + /** + * Begins slowly and decelerates towards end. + * @method easeBothStrong + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeBothStrong: function (t, b, c, d) { + if ((t/=d/2) < 1) { + return c/2*t*t*t*t + b; + } + + return -c/2 * ((t-=2)*t*t*t - 2) + b; + }, + + /** + * Snap in elastic effect. + * @method elasticIn + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @param {Number} a Amplitude (optional) + * @param {Number} p Period (optional) + * @return {Number} The computed value for the current animation frame + */ + + elasticIn: function (t, b, c, d, a, p) { + if (t == 0) { + return b; + } + if ( (t /= d) == 1 ) { + return b+c; + } + if (!p) { + p=d*.3; + } + + if (!a || a < Math.abs(c)) { + a = c; + var s = p/4; + } + else { + var s = p/(2*Math.PI) * Math.asin (c/a); + } + + return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b; + }, + + /** + * Snap out elastic effect. + * @method elasticOut + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @param {Number} a Amplitude (optional) + * @param {Number} p Period (optional) + * @return {Number} The computed value for the current animation frame + */ + elasticOut: function (t, b, c, d, a, p) { + if (t == 0) { + return b; + } + if ( (t /= d) == 1 ) { + return b+c; + } + if (!p) { + p=d*.3; + } + + if (!a || a < Math.abs(c)) { + a = c; + var s = p / 4; + } + else { + var s = p/(2*Math.PI) * Math.asin (c/a); + } + + return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b; + }, + + /** + * Snap both elastic effect. + * @method elasticBoth + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @param {Number} a Amplitude (optional) + * @param {Number} p Period (optional) + * @return {Number} The computed value for the current animation frame + */ + elasticBoth: function (t, b, c, d, a, p) { + if (t == 0) { + return b; + } + + if ( (t /= d/2) == 2 ) { + return b+c; + } + + if (!p) { + p = d*(.3*1.5); + } + + if ( !a || a < Math.abs(c) ) { + a = c; + var s = p/4; + } + else { + var s = p/(2*Math.PI) * Math.asin (c/a); + } + + if (t < 1) { + return -.5*(a*Math.pow(2,10*(t-=1)) * + Math.sin( (t*d-s)*(2*Math.PI)/p )) + b; + } + return a*Math.pow(2,-10*(t-=1)) * + Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b; + }, + + + /** + * Backtracks slightly, then reverses direction and moves to end. + * @method backIn + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @param {Number} s Overshoot (optional) + * @return {Number} The computed value for the current animation frame + */ + backIn: function (t, b, c, d, s) { + if (typeof s == 'undefined') { + s = 1.70158; + } + return c*(t/=d)*t*((s+1)*t - s) + b; + }, + + /** + * Overshoots end, then reverses and comes back to end. + * @method backOut + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @param {Number} s Overshoot (optional) + * @return {Number} The computed value for the current animation frame + */ + backOut: function (t, b, c, d, s) { + if (typeof s == 'undefined') { + s = 1.70158; + } + return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b; + }, + + /** + * Backtracks slightly, then reverses direction, overshoots end, + * then reverses and comes back to end. + * @method backBoth + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @param {Number} s Overshoot (optional) + * @return {Number} The computed value for the current animation frame + */ + backBoth: function (t, b, c, d, s) { + if (typeof s == 'undefined') { + s = 1.70158; + } + + if ((t /= d/2 ) < 1) { + return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b; + } + return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b; + }, + + /** + * Bounce off of start. + * @method bounceIn + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + bounceIn: function (t, b, c, d) { + return c - YAHOO.util.Easing.bounceOut(d-t, 0, c, d) + b; + }, + + /** + * Bounces off end. + * @method bounceOut + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + bounceOut: function (t, b, c, d) { + if ((t/=d) < (1/2.75)) { + return c*(7.5625*t*t) + b; + } else if (t < (2/2.75)) { + return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b; + } else if (t < (2.5/2.75)) { + return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b; + } + return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b; + }, + + /** + * Bounces off start and end. + * @method bounceBoth + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + bounceBoth: function (t, b, c, d) { + if (t < d/2) { + return YAHOO.util.Easing.bounceIn(t*2, 0, c, d) * .5 + b; + } + return YAHOO.util.Easing.bounceOut(t*2-d, 0, c, d) * .5 + c*.5 + b; + } +}; + +(function() { +/** + * Anim subclass for moving elements along a path defined by the "points" + * member of "attributes". All "points" are arrays with x, y coordinates. + *

    Usage: var myAnim = new YAHOO.util.Motion(el, { points: { to: [800, 800] } }, 1, YAHOO.util.Easing.easeOut);

    + * @class Motion + * @namespace YAHOO.util + * @requires YAHOO.util.Anim + * @requires YAHOO.util.AnimMgr + * @requires YAHOO.util.Easing + * @requires YAHOO.util.Bezier + * @requires YAHOO.util.Dom + * @requires YAHOO.util.Event + * @requires YAHOO.util.CustomEvent + * @constructor + * @extends YAHOO.util.ColorAnim + * @param {String | HTMLElement} el Reference to the element that will be animated + * @param {Object} attributes The attribute(s) to be animated. + * Each attribute is an object with at minimum a "to" or "by" member defined. + * Additional optional members are "from" (defaults to current value), "units" (defaults to "px"). + * All attribute names use camelCase. + * @param {Number} duration (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based + * @param {Function} method (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method) + */ + var Motion = function(el, attributes, duration, method) { + if (el) { // dont break existing subclasses not using YAHOO.extend + Motion.superclass.constructor.call(this, el, attributes, duration, method); + } + }; + + + Motion.NAME = 'Motion'; + + // shorthand + var Y = YAHOO.util; + YAHOO.extend(Motion, Y.ColorAnim); + + var superclass = Motion.superclass; + var proto = Motion.prototype; + + proto.patterns.points = /^points$/i; + + proto.setAttribute = function(attr, val, unit) { + if ( this.patterns.points.test(attr) ) { + unit = unit || 'px'; + superclass.setAttribute.call(this, 'left', val[0], unit); + superclass.setAttribute.call(this, 'top', val[1], unit); + } else { + superclass.setAttribute.call(this, attr, val, unit); + } + }; + + proto.getAttribute = function(attr) { + if ( this.patterns.points.test(attr) ) { + var val = [ + superclass.getAttribute.call(this, 'left'), + superclass.getAttribute.call(this, 'top') + ]; + } else { + val = superclass.getAttribute.call(this, attr); + } + + return val; + }; + + proto.doMethod = function(attr, start, end) { + var val = null; + + if ( this.patterns.points.test(attr) ) { + var t = this.method(this.currentFrame, 0, 100, this.totalFrames) / 100; + val = Y.Bezier.getPosition(this.runtimeAttributes[attr], t); + } else { + val = superclass.doMethod.call(this, attr, start, end); + } + return val; + }; + + proto.setRuntimeAttribute = function(attr) { + if ( this.patterns.points.test(attr) ) { + var el = this.getEl(); + var attributes = this.attributes; + var start; + var control = attributes['points']['control'] || []; + var end; + var i, len; + + if (control.length > 0 && !(control[0] instanceof Array) ) { // could be single point or array of points + control = [control]; + } else { // break reference to attributes.points.control + var tmp = []; + for (i = 0, len = control.length; i< len; ++i) { + tmp[i] = control[i]; + } + control = tmp; + } + + if (Y.Dom.getStyle(el, 'position') == 'static') { // default to relative + Y.Dom.setStyle(el, 'position', 'relative'); + } + + if ( isset(attributes['points']['from']) ) { + Y.Dom.setXY(el, attributes['points']['from']); // set position to from point + } + else { Y.Dom.setXY( el, Y.Dom.getXY(el) ); } // set it to current position + + start = this.getAttribute('points'); // get actual top & left + + // TO beats BY, per SMIL 2.1 spec + if ( isset(attributes['points']['to']) ) { + end = translateValues.call(this, attributes['points']['to'], start); + + var pageXY = Y.Dom.getXY(this.getEl()); + for (i = 0, len = control.length; i < len; ++i) { + control[i] = translateValues.call(this, control[i], start); + } + + + } else if ( isset(attributes['points']['by']) ) { + end = [ start[0] + attributes['points']['by'][0], start[1] + attributes['points']['by'][1] ]; + + for (i = 0, len = control.length; i < len; ++i) { + control[i] = [ start[0] + control[i][0], start[1] + control[i][1] ]; + } + } + + this.runtimeAttributes[attr] = [start]; + + if (control.length > 0) { + this.runtimeAttributes[attr] = this.runtimeAttributes[attr].concat(control); + } + + this.runtimeAttributes[attr][this.runtimeAttributes[attr].length] = end; + } + else { + superclass.setRuntimeAttribute.call(this, attr); + } + }; + + var translateValues = function(val, start) { + var pageXY = Y.Dom.getXY(this.getEl()); + val = [ val[0] - pageXY[0] + start[0], val[1] - pageXY[1] + start[1] ]; + + return val; + }; + + var isset = function(prop) { + return (typeof prop !== 'undefined'); + }; + + Y.Motion = Motion; +})(); +(function() { +/** + * Anim subclass for scrolling elements to a position defined by the "scroll" + * member of "attributes". All "scroll" members are arrays with x, y scroll positions. + *

    Usage: var myAnim = new YAHOO.util.Scroll(el, { scroll: { to: [0, 800] } }, 1, YAHOO.util.Easing.easeOut);

    + * @class Scroll + * @namespace YAHOO.util + * @requires YAHOO.util.Anim + * @requires YAHOO.util.AnimMgr + * @requires YAHOO.util.Easing + * @requires YAHOO.util.Bezier + * @requires YAHOO.util.Dom + * @requires YAHOO.util.Event + * @requires YAHOO.util.CustomEvent + * @extends YAHOO.util.ColorAnim + * @constructor + * @param {String or HTMLElement} el Reference to the element that will be animated + * @param {Object} attributes The attribute(s) to be animated. + * Each attribute is an object with at minimum a "to" or "by" member defined. + * Additional optional members are "from" (defaults to current value), "units" (defaults to "px"). + * All attribute names use camelCase. + * @param {Number} duration (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based + * @param {Function} method (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method) + */ + var Scroll = function(el, attributes, duration, method) { + if (el) { // dont break existing subclasses not using YAHOO.extend + Scroll.superclass.constructor.call(this, el, attributes, duration, method); + } + }; + + Scroll.NAME = 'Scroll'; + + // shorthand + var Y = YAHOO.util; + YAHOO.extend(Scroll, Y.ColorAnim); + + var superclass = Scroll.superclass; + var proto = Scroll.prototype; + + proto.doMethod = function(attr, start, end) { + var val = null; + + if (attr == 'scroll') { + val = [ + this.method(this.currentFrame, start[0], end[0] - start[0], this.totalFrames), + this.method(this.currentFrame, start[1], end[1] - start[1], this.totalFrames) + ]; + + } else { + val = superclass.doMethod.call(this, attr, start, end); + } + return val; + }; + + proto.getAttribute = function(attr) { + var val = null; + var el = this.getEl(); + + if (attr == 'scroll') { + val = [ el.scrollLeft, el.scrollTop ]; + } else { + val = superclass.getAttribute.call(this, attr); + } + + return val; + }; + + proto.setAttribute = function(attr, val, unit) { + var el = this.getEl(); + + if (attr == 'scroll') { + el.scrollLeft = val[0]; + el.scrollTop = val[1]; + } else { + superclass.setAttribute.call(this, attr, val, unit); + } + }; + + Y.Scroll = Scroll; +})(); +YAHOO.register("animation", YAHOO.util.Anim, {version: "2.6.0", build: "1321"}); diff --git a/webdir/javascript/yui/animation/animation-min.js b/webdir/javascript/yui/animation/animation-min.js new file mode 100644 index 0000000..47fa162 --- /dev/null +++ b/webdir/javascript/yui/animation/animation-min.js @@ -0,0 +1,23 @@ +/* +Copyright (c) 2008, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.6.0 +*/ +(function(){var B=YAHOO.util;var A=function(D,C,E,F){if(!D){}this.init(D,C,E,F);};A.NAME="Anim";A.prototype={toString:function(){var C=this.getEl()||{};var D=C.id||C.tagName;return(this.constructor.NAME+": "+D);},patterns:{noNegatives:/width|height|opacity|padding/i,offsetAttribute:/^((width|height)|(top|left))$/,defaultUnit:/width|height|top$|bottom$|left$|right$/i,offsetUnit:/\d+(em|%|en|ex|pt|in|cm|mm|pc)$/i},doMethod:function(C,E,D){return this.method(this.currentFrame,E,D-E,this.totalFrames);},setAttribute:function(C,E,D){if(this.patterns.noNegatives.test(C)){E=(E>0)?E:0;}B.Dom.setStyle(this.getEl(),C,E+D);},getAttribute:function(C){var E=this.getEl();var G=B.Dom.getStyle(E,C);if(G!=="auto"&&!this.patterns.offsetUnit.test(G)){return parseFloat(G);}var D=this.patterns.offsetAttribute.exec(C)||[];var H=!!(D[3]);var F=!!(D[2]);if(F||(B.Dom.getStyle(E,"position")=="absolute"&&H)){G=E["offset"+D[0].charAt(0).toUpperCase()+D[0].substr(1)];}else{G=0;}return G;},getDefaultUnit:function(C){if(this.patterns.defaultUnit.test(C)){return"px";}return"";},setRuntimeAttribute:function(D){var I;var E;var F=this.attributes;this.runtimeAttributes[D]={};var H=function(J){return(typeof J!=="undefined");};if(!H(F[D]["to"])&&!H(F[D]["by"])){return false;}I=(H(F[D]["from"]))?F[D]["from"]:this.getAttribute(D);if(H(F[D]["to"])){E=F[D]["to"];}else{if(H(F[D]["by"])){if(I.constructor==Array){E=[];for(var G=0,C=I.length;G0&&isFinite(K)){if(G.currentFrame+K>=J){K=J-(I+1);}G.currentFrame+=K;}};};YAHOO.util.Bezier=new function(){this.getPosition=function(E,D){var F=E.length;var C=[];for(var B=0;B0&&!(L[0] instanceof Array)){L=[L];}else{var K=[];for(M=0,O=L.length;M0){this.runtimeAttributes[P]=this.runtimeAttributes[P].concat(L);}this.runtimeAttributes[P][this.runtimeAttributes[P].length]=I;}else{F.setRuntimeAttribute.call(this,P);}};var B=function(G,I){var H=E.Dom.getXY(this.getEl());G=[G[0]-H[0]+I[0],G[1]-H[1]+I[1]];return G;};var D=function(G){return(typeof G!=="undefined");};E.Motion=A;})();(function(){var D=function(F,E,G,H){if(F){D.superclass.constructor.call(this,F,E,G,H);}};D.NAME="Scroll";var B=YAHOO.util;YAHOO.extend(D,B.ColorAnim);var C=D.superclass;var A=D.prototype;A.doMethod=function(E,H,F){var G=null;if(E=="scroll"){G=[this.method(this.currentFrame,H[0],F[0]-H[0],this.totalFrames),this.method(this.currentFrame,H[1],F[1]-H[1],this.totalFrames)];}else{G=C.doMethod.call(this,E,H,F);}return G;};A.getAttribute=function(E){var G=null;var F=this.getEl();if(E=="scroll"){G=[F.scrollLeft,F.scrollTop];}else{G=C.getAttribute.call(this,E);}return G;};A.setAttribute=function(E,H,G){var F=this.getEl();if(E=="scroll"){F.scrollLeft=H[0];F.scrollTop=H[1];}else{C.setAttribute.call(this,E,H,G);}};B.Scroll=D;})();YAHOO.register("animation",YAHOO.util.Anim,{version:"2.6.0",build:"1321"}); \ No newline at end of file diff --git a/webdir/javascript/yui/animation/animation.js b/webdir/javascript/yui/animation/animation.js new file mode 100644 index 0000000..a198559 --- /dev/null +++ b/webdir/javascript/yui/animation/animation.js @@ -0,0 +1,1381 @@ +/* +Copyright (c) 2008, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.6.0 +*/ +(function() { + +var Y = YAHOO.util; + +/* +Copyright (c) 2006, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +*/ + +/** + * The animation module provides allows effects to be added to HTMLElements. + * @module animation + * @requires yahoo, event, dom + */ + +/** + * + * Base animation class that provides the interface for building animated effects. + *

    Usage: var myAnim = new YAHOO.util.Anim(el, { width: { from: 10, to: 100 } }, 1, YAHOO.util.Easing.easeOut);

    + * @class Anim + * @namespace YAHOO.util + * @requires YAHOO.util.AnimMgr + * @requires YAHOO.util.Easing + * @requires YAHOO.util.Dom + * @requires YAHOO.util.Event + * @requires YAHOO.util.CustomEvent + * @constructor + * @param {String | HTMLElement} el Reference to the element that will be animated + * @param {Object} attributes The attribute(s) to be animated. + * Each attribute is an object with at minimum a "to" or "by" member defined. + * Additional optional members are "from" (defaults to current value), "units" (defaults to "px"). + * All attribute names use camelCase. + * @param {Number} duration (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based + * @param {Function} method (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method) + */ + +var Anim = function(el, attributes, duration, method) { + if (!el) { + } + this.init(el, attributes, duration, method); +}; + +Anim.NAME = 'Anim'; + +Anim.prototype = { + /** + * Provides a readable name for the Anim instance. + * @method toString + * @return {String} + */ + toString: function() { + var el = this.getEl() || {}; + var id = el.id || el.tagName; + return (this.constructor.NAME + ': ' + id); + }, + + patterns: { // cached for performance + noNegatives: /width|height|opacity|padding/i, // keep at zero or above + offsetAttribute: /^((width|height)|(top|left))$/, // use offsetValue as default + defaultUnit: /width|height|top$|bottom$|left$|right$/i, // use 'px' by default + offsetUnit: /\d+(em|%|en|ex|pt|in|cm|mm|pc)$/i // IE may return these, so convert these to offset + }, + + /** + * Returns the value computed by the animation's "method". + * @method doMethod + * @param {String} attr The name of the attribute. + * @param {Number} start The value this attribute should start from for this animation. + * @param {Number} end The value this attribute should end at for this animation. + * @return {Number} The Value to be applied to the attribute. + */ + doMethod: function(attr, start, end) { + return this.method(this.currentFrame, start, end - start, this.totalFrames); + }, + + /** + * Applies a value to an attribute. + * @method setAttribute + * @param {String} attr The name of the attribute. + * @param {Number} val The value to be applied to the attribute. + * @param {String} unit The unit ('px', '%', etc.) of the value. + */ + setAttribute: function(attr, val, unit) { + if ( this.patterns.noNegatives.test(attr) ) { + val = (val > 0) ? val : 0; + } + + Y.Dom.setStyle(this.getEl(), attr, val + unit); + }, + + /** + * Returns current value of the attribute. + * @method getAttribute + * @param {String} attr The name of the attribute. + * @return {Number} val The current value of the attribute. + */ + getAttribute: function(attr) { + var el = this.getEl(); + var val = Y.Dom.getStyle(el, attr); + + if (val !== 'auto' && !this.patterns.offsetUnit.test(val)) { + return parseFloat(val); + } + + var a = this.patterns.offsetAttribute.exec(attr) || []; + var pos = !!( a[3] ); // top or left + var box = !!( a[2] ); // width or height + + // use offsets for width/height and abs pos top/left + if ( box || (Y.Dom.getStyle(el, 'position') == 'absolute' && pos) ) { + val = el['offset' + a[0].charAt(0).toUpperCase() + a[0].substr(1)]; + } else { // default to zero for other 'auto' + val = 0; + } + + return val; + }, + + /** + * Returns the unit to use when none is supplied. + * @method getDefaultUnit + * @param {attr} attr The name of the attribute. + * @return {String} The default unit to be used. + */ + getDefaultUnit: function(attr) { + if ( this.patterns.defaultUnit.test(attr) ) { + return 'px'; + } + + return ''; + }, + + /** + * Sets the actual values to be used during the animation. Should only be needed for subclass use. + * @method setRuntimeAttribute + * @param {Object} attr The attribute object + * @private + */ + setRuntimeAttribute: function(attr) { + var start; + var end; + var attributes = this.attributes; + + this.runtimeAttributes[attr] = {}; + + var isset = function(prop) { + return (typeof prop !== 'undefined'); + }; + + if ( !isset(attributes[attr]['to']) && !isset(attributes[attr]['by']) ) { + return false; // note return; nothing to animate to + } + + start = ( isset(attributes[attr]['from']) ) ? attributes[attr]['from'] : this.getAttribute(attr); + + // To beats by, per SMIL 2.1 spec + if ( isset(attributes[attr]['to']) ) { + end = attributes[attr]['to']; + } else if ( isset(attributes[attr]['by']) ) { + if (start.constructor == Array) { + end = []; + for (var i = 0, len = start.length; i < len; ++i) { + end[i] = start[i] + attributes[attr]['by'][i] * 1; // times 1 to cast "by" + } + } else { + end = start + attributes[attr]['by'] * 1; + } + } + + this.runtimeAttributes[attr].start = start; + this.runtimeAttributes[attr].end = end; + + // set units if needed + this.runtimeAttributes[attr].unit = ( isset(attributes[attr].unit) ) ? + attributes[attr]['unit'] : this.getDefaultUnit(attr); + return true; + }, + + /** + * Constructor for Anim instance. + * @method init + * @param {String | HTMLElement} el Reference to the element that will be animated + * @param {Object} attributes The attribute(s) to be animated. + * Each attribute is an object with at minimum a "to" or "by" member defined. + * Additional optional members are "from" (defaults to current value), "units" (defaults to "px"). + * All attribute names use camelCase. + * @param {Number} duration (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based + * @param {Function} method (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method) + */ + init: function(el, attributes, duration, method) { + /** + * Whether or not the animation is running. + * @property isAnimated + * @private + * @type Boolean + */ + var isAnimated = false; + + /** + * A Date object that is created when the animation begins. + * @property startTime + * @private + * @type Date + */ + var startTime = null; + + /** + * The number of frames this animation was able to execute. + * @property actualFrames + * @private + * @type Int + */ + var actualFrames = 0; + + /** + * The element to be animated. + * @property el + * @private + * @type HTMLElement + */ + el = Y.Dom.get(el); + + /** + * The collection of attributes to be animated. + * Each attribute must have at least a "to" or "by" defined in order to animate. + * If "to" is supplied, the animation will end with the attribute at that value. + * If "by" is supplied, the animation will end at that value plus its starting value. + * If both are supplied, "to" is used, and "by" is ignored. + * Optional additional member include "from" (the value the attribute should start animating from, defaults to current value), and "unit" (the units to apply to the values). + * @property attributes + * @type Object + */ + this.attributes = attributes || {}; + + /** + * The length of the animation. Defaults to "1" (second). + * @property duration + * @type Number + */ + this.duration = !YAHOO.lang.isUndefined(duration) ? duration : 1; + + /** + * The method that will provide values to the attribute(s) during the animation. + * Defaults to "YAHOO.util.Easing.easeNone". + * @property method + * @type Function + */ + this.method = method || Y.Easing.easeNone; + + /** + * Whether or not the duration should be treated as seconds. + * Defaults to true. + * @property useSeconds + * @type Boolean + */ + this.useSeconds = true; // default to seconds + + /** + * The location of the current animation on the timeline. + * In time-based animations, this is used by AnimMgr to ensure the animation finishes on time. + * @property currentFrame + * @type Int + */ + this.currentFrame = 0; + + /** + * The total number of frames to be executed. + * In time-based animations, this is used by AnimMgr to ensure the animation finishes on time. + * @property totalFrames + * @type Int + */ + this.totalFrames = Y.AnimMgr.fps; + + /** + * Changes the animated element + * @method setEl + */ + this.setEl = function(element) { + el = Y.Dom.get(element); + }; + + /** + * Returns a reference to the animated element. + * @method getEl + * @return {HTMLElement} + */ + this.getEl = function() { return el; }; + + /** + * Checks whether the element is currently animated. + * @method isAnimated + * @return {Boolean} current value of isAnimated. + */ + this.isAnimated = function() { + return isAnimated; + }; + + /** + * Returns the animation start time. + * @method getStartTime + * @return {Date} current value of startTime. + */ + this.getStartTime = function() { + return startTime; + }; + + this.runtimeAttributes = {}; + + + + /** + * Starts the animation by registering it with the animation manager. + * @method animate + */ + this.animate = function() { + if ( this.isAnimated() ) { + return false; + } + + this.currentFrame = 0; + + this.totalFrames = ( this.useSeconds ) ? Math.ceil(Y.AnimMgr.fps * this.duration) : this.duration; + + if (this.duration === 0 && this.useSeconds) { // jump to last frame if zero second duration + this.totalFrames = 1; + } + Y.AnimMgr.registerElement(this); + return true; + }; + + /** + * Stops the animation. Normally called by AnimMgr when animation completes. + * @method stop + * @param {Boolean} finish (optional) If true, animation will jump to final frame. + */ + this.stop = function(finish) { + if (!this.isAnimated()) { // nothing to stop + return false; + } + + if (finish) { + this.currentFrame = this.totalFrames; + this._onTween.fire(); + } + Y.AnimMgr.stop(this); + }; + + var onStart = function() { + this.onStart.fire(); + + this.runtimeAttributes = {}; + for (var attr in this.attributes) { + this.setRuntimeAttribute(attr); + } + + isAnimated = true; + actualFrames = 0; + startTime = new Date(); + }; + + /** + * Feeds the starting and ending values for each animated attribute to doMethod once per frame, then applies the resulting value to the attribute(s). + * @private + */ + + var onTween = function() { + var data = { + duration: new Date() - this.getStartTime(), + currentFrame: this.currentFrame + }; + + data.toString = function() { + return ( + 'duration: ' + data.duration + + ', currentFrame: ' + data.currentFrame + ); + }; + + this.onTween.fire(data); + + var runtimeAttributes = this.runtimeAttributes; + + for (var attr in runtimeAttributes) { + this.setAttribute(attr, this.doMethod(attr, runtimeAttributes[attr].start, runtimeAttributes[attr].end), runtimeAttributes[attr].unit); + } + + actualFrames += 1; + }; + + var onComplete = function() { + var actual_duration = (new Date() - startTime) / 1000 ; + + var data = { + duration: actual_duration, + frames: actualFrames, + fps: actualFrames / actual_duration + }; + + data.toString = function() { + return ( + 'duration: ' + data.duration + + ', frames: ' + data.frames + + ', fps: ' + data.fps + ); + }; + + isAnimated = false; + actualFrames = 0; + this.onComplete.fire(data); + }; + + /** + * Custom event that fires after onStart, useful in subclassing + * @private + */ + this._onStart = new Y.CustomEvent('_start', this, true); + + /** + * Custom event that fires when animation begins + * Listen via subscribe method (e.g. myAnim.onStart.subscribe(someFunction) + * @event onStart + */ + this.onStart = new Y.CustomEvent('start', this); + + /** + * Custom event that fires between each frame + * Listen via subscribe method (e.g. myAnim.onTween.subscribe(someFunction) + * @event onTween + */ + this.onTween = new Y.CustomEvent('tween', this); + + /** + * Custom event that fires after onTween + * @private + */ + this._onTween = new Y.CustomEvent('_tween', this, true); + + /** + * Custom event that fires when animation ends + * Listen via subscribe method (e.g. myAnim.onComplete.subscribe(someFunction) + * @event onComplete + */ + this.onComplete = new Y.CustomEvent('complete', this); + /** + * Custom event that fires after onComplete + * @private + */ + this._onComplete = new Y.CustomEvent('_complete', this, true); + + this._onStart.subscribe(onStart); + this._onTween.subscribe(onTween); + this._onComplete.subscribe(onComplete); + } +}; + + Y.Anim = Anim; +})(); +/** + * Handles animation queueing and threading. + * Used by Anim and subclasses. + * @class AnimMgr + * @namespace YAHOO.util + */ +YAHOO.util.AnimMgr = new function() { + /** + * Reference to the animation Interval. + * @property thread + * @private + * @type Int + */ + var thread = null; + + /** + * The current queue of registered animation objects. + * @property queue + * @private + * @type Array + */ + var queue = []; + + /** + * The number of active animations. + * @property tweenCount + * @private + * @type Int + */ + var tweenCount = 0; + + /** + * Base frame rate (frames per second). + * Arbitrarily high for better x-browser calibration (slower browsers drop more frames). + * @property fps + * @type Int + * + */ + this.fps = 1000; + + /** + * Interval delay in milliseconds, defaults to fastest possible. + * @property delay + * @type Int + * + */ + this.delay = 1; + + /** + * Adds an animation instance to the animation queue. + * All animation instances must be registered in order to animate. + * @method registerElement + * @param {object} tween The Anim instance to be be registered + */ + this.registerElement = function(tween) { + queue[queue.length] = tween; + tweenCount += 1; + tween._onStart.fire(); + this.start(); + }; + + /** + * removes an animation instance from the animation queue. + * All animation instances must be registered in order to animate. + * @method unRegister + * @param {object} tween The Anim instance to be be registered + * @param {Int} index The index of the Anim instance + * @private + */ + this.unRegister = function(tween, index) { + index = index || getIndex(tween); + if (!tween.isAnimated() || index == -1) { + return false; + } + + tween._onComplete.fire(); + queue.splice(index, 1); + + tweenCount -= 1; + if (tweenCount <= 0) { + this.stop(); + } + + return true; + }; + + /** + * Starts the animation thread. + * Only one thread can run at a time. + * @method start + */ + this.start = function() { + if (thread === null) { + thread = setInterval(this.run, this.delay); + } + }; + + /** + * Stops the animation thread or a specific animation instance. + * @method stop + * @param {object} tween A specific Anim instance to stop (optional) + * If no instance given, Manager stops thread and all animations. + */ + this.stop = function(tween) { + if (!tween) { + clearInterval(thread); + + for (var i = 0, len = queue.length; i < len; ++i) { + this.unRegister(queue[0], 0); + } + + queue = []; + thread = null; + tweenCount = 0; + } + else { + this.unRegister(tween); + } + }; + + /** + * Called per Interval to handle each animation frame. + * @method run + */ + this.run = function() { + for (var i = 0, len = queue.length; i < len; ++i) { + var tween = queue[i]; + if ( !tween || !tween.isAnimated() ) { continue; } + + if (tween.currentFrame < tween.totalFrames || tween.totalFrames === null) + { + tween.currentFrame += 1; + + if (tween.useSeconds) { + correctFrame(tween); + } + tween._onTween.fire(); + } + else { YAHOO.util.AnimMgr.stop(tween, i); } + } + }; + + var getIndex = function(anim) { + for (var i = 0, len = queue.length; i < len; ++i) { + if (queue[i] == anim) { + return i; // note return; + } + } + return -1; + }; + + /** + * On the fly frame correction to keep animation on time. + * @method correctFrame + * @private + * @param {Object} tween The Anim instance being corrected. + */ + var correctFrame = function(tween) { + var frames = tween.totalFrames; + var frame = tween.currentFrame; + var expected = (tween.currentFrame * tween.duration * 1000 / tween.totalFrames); + var elapsed = (new Date() - tween.getStartTime()); + var tweak = 0; + + if (elapsed < tween.duration * 1000) { // check if falling behind + tweak = Math.round((elapsed / expected - 1) * tween.currentFrame); + } else { // went over duration, so jump to end + tweak = frames - (frame + 1); + } + if (tweak > 0 && isFinite(tweak)) { // adjust if needed + if (tween.currentFrame + tweak >= frames) {// dont go past last frame + tweak = frames - (frame + 1); + } + + tween.currentFrame += tweak; + } + }; +}; +/** + * Used to calculate Bezier splines for any number of control points. + * @class Bezier + * @namespace YAHOO.util + * + */ +YAHOO.util.Bezier = new function() { + /** + * Get the current position of the animated element based on t. + * Each point is an array of "x" and "y" values (0 = x, 1 = y) + * At least 2 points are required (start and end). + * First point is start. Last point is end. + * Additional control points are optional. + * @method getPosition + * @param {Array} points An array containing Bezier points + * @param {Number} t A number between 0 and 1 which is the basis for determining current position + * @return {Array} An array containing int x and y member data + */ + this.getPosition = function(points, t) { + var n = points.length; + var tmp = []; + + for (var i = 0; i < n; ++i){ + tmp[i] = [points[i][0], points[i][1]]; // save input + } + + for (var j = 1; j < n; ++j) { + for (i = 0; i < n - j; ++i) { + tmp[i][0] = (1 - t) * tmp[i][0] + t * tmp[parseInt(i + 1, 10)][0]; + tmp[i][1] = (1 - t) * tmp[i][1] + t * tmp[parseInt(i + 1, 10)][1]; + } + } + + return [ tmp[0][0], tmp[0][1] ]; + + }; +}; +(function() { +/** + * Anim subclass for color transitions. + *

    Usage: var myAnim = new Y.ColorAnim(el, { backgroundColor: { from: '#FF0000', to: '#FFFFFF' } }, 1, Y.Easing.easeOut); Color values can be specified with either 112233, #112233, + * [255,255,255], or rgb(255,255,255)

    + * @class ColorAnim + * @namespace YAHOO.util + * @requires YAHOO.util.Anim + * @requires YAHOO.util.AnimMgr + * @requires YAHOO.util.Easing + * @requires YAHOO.util.Bezier + * @requires YAHOO.util.Dom + * @requires YAHOO.util.Event + * @constructor + * @extends YAHOO.util.Anim + * @param {HTMLElement | String} el Reference to the element that will be animated + * @param {Object} attributes The attribute(s) to be animated. + * Each attribute is an object with at minimum a "to" or "by" member defined. + * Additional optional members are "from" (defaults to current value), "units" (defaults to "px"). + * All attribute names use camelCase. + * @param {Number} duration (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based + * @param {Function} method (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method) + */ + var ColorAnim = function(el, attributes, duration, method) { + ColorAnim.superclass.constructor.call(this, el, attributes, duration, method); + }; + + ColorAnim.NAME = 'ColorAnim'; + + ColorAnim.DEFAULT_BGCOLOR = '#fff'; + // shorthand + var Y = YAHOO.util; + YAHOO.extend(ColorAnim, Y.Anim); + + var superclass = ColorAnim.superclass; + var proto = ColorAnim.prototype; + + proto.patterns.color = /color$/i; + proto.patterns.rgb = /^rgb\(([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\)$/i; + proto.patterns.hex = /^#?([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})$/i; + proto.patterns.hex3 = /^#?([0-9A-F]{1})([0-9A-F]{1})([0-9A-F]{1})$/i; + proto.patterns.transparent = /^transparent|rgba\(0, 0, 0, 0\)$/; // need rgba for safari + + /** + * Attempts to parse the given string and return a 3-tuple. + * @method parseColor + * @param {String} s The string to parse. + * @return {Array} The 3-tuple of rgb values. + */ + proto.parseColor = function(s) { + if (s.length == 3) { return s; } + + var c = this.patterns.hex.exec(s); + if (c && c.length == 4) { + return [ parseInt(c[1], 16), parseInt(c[2], 16), parseInt(c[3], 16) ]; + } + + c = this.patterns.rgb.exec(s); + if (c && c.length == 4) { + return [ parseInt(c[1], 10), parseInt(c[2], 10), parseInt(c[3], 10) ]; + } + + c = this.patterns.hex3.exec(s); + if (c && c.length == 4) { + return [ parseInt(c[1] + c[1], 16), parseInt(c[2] + c[2], 16), parseInt(c[3] + c[3], 16) ]; + } + + return null; + }; + + proto.getAttribute = function(attr) { + var el = this.getEl(); + if (this.patterns.color.test(attr) ) { + var val = YAHOO.util.Dom.getStyle(el, attr); + + var that = this; + if (this.patterns.transparent.test(val)) { // bgcolor default + var parent = YAHOO.util.Dom.getAncestorBy(el, function(node) { + return !that.patterns.transparent.test(val); + }); + + if (parent) { + val = Y.Dom.getStyle(parent, attr); + } else { + val = ColorAnim.DEFAULT_BGCOLOR; + } + } + } else { + val = superclass.getAttribute.call(this, attr); + } + + return val; + }; + + proto.doMethod = function(attr, start, end) { + var val; + + if ( this.patterns.color.test(attr) ) { + val = []; + for (var i = 0, len = start.length; i < len; ++i) { + val[i] = superclass.doMethod.call(this, attr, start[i], end[i]); + } + + val = 'rgb('+Math.floor(val[0])+','+Math.floor(val[1])+','+Math.floor(val[2])+')'; + } + else { + val = superclass.doMethod.call(this, attr, start, end); + } + + return val; + }; + + proto.setRuntimeAttribute = function(attr) { + superclass.setRuntimeAttribute.call(this, attr); + + if ( this.patterns.color.test(attr) ) { + var attributes = this.attributes; + var start = this.parseColor(this.runtimeAttributes[attr].start); + var end = this.parseColor(this.runtimeAttributes[attr].end); + // fix colors if going "by" + if ( typeof attributes[attr]['to'] === 'undefined' && typeof attributes[attr]['by'] !== 'undefined' ) { + end = this.parseColor(attributes[attr].by); + + for (var i = 0, len = start.length; i < len; ++i) { + end[i] = start[i] + end[i]; + } + } + + this.runtimeAttributes[attr].start = start; + this.runtimeAttributes[attr].end = end; + } + }; + + Y.ColorAnim = ColorAnim; +})(); +/*! +TERMS OF USE - EASING EQUATIONS +Open source under the BSD License. +Copyright 2001 Robert Penner All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + * Neither the name of the author nor the names of contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/** + * Singleton that determines how an animation proceeds from start to end. + * @class Easing + * @namespace YAHOO.util +*/ + +YAHOO.util.Easing = { + + /** + * Uniform speed between points. + * @method easeNone + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeNone: function (t, b, c, d) { + return c*t/d + b; + }, + + /** + * Begins slowly and accelerates towards end. + * @method easeIn + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeIn: function (t, b, c, d) { + return c*(t/=d)*t + b; + }, + + /** + * Begins quickly and decelerates towards end. + * @method easeOut + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeOut: function (t, b, c, d) { + return -c *(t/=d)*(t-2) + b; + }, + + /** + * Begins slowly and decelerates towards end. + * @method easeBoth + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeBoth: function (t, b, c, d) { + if ((t/=d/2) < 1) { + return c/2*t*t + b; + } + + return -c/2 * ((--t)*(t-2) - 1) + b; + }, + + /** + * Begins slowly and accelerates towards end. + * @method easeInStrong + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeInStrong: function (t, b, c, d) { + return c*(t/=d)*t*t*t + b; + }, + + /** + * Begins quickly and decelerates towards end. + * @method easeOutStrong + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeOutStrong: function (t, b, c, d) { + return -c * ((t=t/d-1)*t*t*t - 1) + b; + }, + + /** + * Begins slowly and decelerates towards end. + * @method easeBothStrong + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeBothStrong: function (t, b, c, d) { + if ((t/=d/2) < 1) { + return c/2*t*t*t*t + b; + } + + return -c/2 * ((t-=2)*t*t*t - 2) + b; + }, + + /** + * Snap in elastic effect. + * @method elasticIn + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @param {Number} a Amplitude (optional) + * @param {Number} p Period (optional) + * @return {Number} The computed value for the current animation frame + */ + + elasticIn: function (t, b, c, d, a, p) { + if (t == 0) { + return b; + } + if ( (t /= d) == 1 ) { + return b+c; + } + if (!p) { + p=d*.3; + } + + if (!a || a < Math.abs(c)) { + a = c; + var s = p/4; + } + else { + var s = p/(2*Math.PI) * Math.asin (c/a); + } + + return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b; + }, + + /** + * Snap out elastic effect. + * @method elasticOut + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @param {Number} a Amplitude (optional) + * @param {Number} p Period (optional) + * @return {Number} The computed value for the current animation frame + */ + elasticOut: function (t, b, c, d, a, p) { + if (t == 0) { + return b; + } + if ( (t /= d) == 1 ) { + return b+c; + } + if (!p) { + p=d*.3; + } + + if (!a || a < Math.abs(c)) { + a = c; + var s = p / 4; + } + else { + var s = p/(2*Math.PI) * Math.asin (c/a); + } + + return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b; + }, + + /** + * Snap both elastic effect. + * @method elasticBoth + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @param {Number} a Amplitude (optional) + * @param {Number} p Period (optional) + * @return {Number} The computed value for the current animation frame + */ + elasticBoth: function (t, b, c, d, a, p) { + if (t == 0) { + return b; + } + + if ( (t /= d/2) == 2 ) { + return b+c; + } + + if (!p) { + p = d*(.3*1.5); + } + + if ( !a || a < Math.abs(c) ) { + a = c; + var s = p/4; + } + else { + var s = p/(2*Math.PI) * Math.asin (c/a); + } + + if (t < 1) { + return -.5*(a*Math.pow(2,10*(t-=1)) * + Math.sin( (t*d-s)*(2*Math.PI)/p )) + b; + } + return a*Math.pow(2,-10*(t-=1)) * + Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b; + }, + + + /** + * Backtracks slightly, then reverses direction and moves to end. + * @method backIn + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @param {Number} s Overshoot (optional) + * @return {Number} The computed value for the current animation frame + */ + backIn: function (t, b, c, d, s) { + if (typeof s == 'undefined') { + s = 1.70158; + } + return c*(t/=d)*t*((s+1)*t - s) + b; + }, + + /** + * Overshoots end, then reverses and comes back to end. + * @method backOut + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @param {Number} s Overshoot (optional) + * @return {Number} The computed value for the current animation frame + */ + backOut: function (t, b, c, d, s) { + if (typeof s == 'undefined') { + s = 1.70158; + } + return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b; + }, + + /** + * Backtracks slightly, then reverses direction, overshoots end, + * then reverses and comes back to end. + * @method backBoth + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @param {Number} s Overshoot (optional) + * @return {Number} The computed value for the current animation frame + */ + backBoth: function (t, b, c, d, s) { + if (typeof s == 'undefined') { + s = 1.70158; + } + + if ((t /= d/2 ) < 1) { + return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b; + } + return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b; + }, + + /** + * Bounce off of start. + * @method bounceIn + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + bounceIn: function (t, b, c, d) { + return c - YAHOO.util.Easing.bounceOut(d-t, 0, c, d) + b; + }, + + /** + * Bounces off end. + * @method bounceOut + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + bounceOut: function (t, b, c, d) { + if ((t/=d) < (1/2.75)) { + return c*(7.5625*t*t) + b; + } else if (t < (2/2.75)) { + return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b; + } else if (t < (2.5/2.75)) { + return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b; + } + return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b; + }, + + /** + * Bounces off start and end. + * @method bounceBoth + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + bounceBoth: function (t, b, c, d) { + if (t < d/2) { + return YAHOO.util.Easing.bounceIn(t*2, 0, c, d) * .5 + b; + } + return YAHOO.util.Easing.bounceOut(t*2-d, 0, c, d) * .5 + c*.5 + b; + } +}; + +(function() { +/** + * Anim subclass for moving elements along a path defined by the "points" + * member of "attributes". All "points" are arrays with x, y coordinates. + *

    Usage: var myAnim = new YAHOO.util.Motion(el, { points: { to: [800, 800] } }, 1, YAHOO.util.Easing.easeOut);

    + * @class Motion + * @namespace YAHOO.util + * @requires YAHOO.util.Anim + * @requires YAHOO.util.AnimMgr + * @requires YAHOO.util.Easing + * @requires YAHOO.util.Bezier + * @requires YAHOO.util.Dom + * @requires YAHOO.util.Event + * @requires YAHOO.util.CustomEvent + * @constructor + * @extends YAHOO.util.ColorAnim + * @param {String | HTMLElement} el Reference to the element that will be animated + * @param {Object} attributes The attribute(s) to be animated. + * Each attribute is an object with at minimum a "to" or "by" member defined. + * Additional optional members are "from" (defaults to current value), "units" (defaults to "px"). + * All attribute names use camelCase. + * @param {Number} duration (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based + * @param {Function} method (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method) + */ + var Motion = function(el, attributes, duration, method) { + if (el) { // dont break existing subclasses not using YAHOO.extend + Motion.superclass.constructor.call(this, el, attributes, duration, method); + } + }; + + + Motion.NAME = 'Motion'; + + // shorthand + var Y = YAHOO.util; + YAHOO.extend(Motion, Y.ColorAnim); + + var superclass = Motion.superclass; + var proto = Motion.prototype; + + proto.patterns.points = /^points$/i; + + proto.setAttribute = function(attr, val, unit) { + if ( this.patterns.points.test(attr) ) { + unit = unit || 'px'; + superclass.setAttribute.call(this, 'left', val[0], unit); + superclass.setAttribute.call(this, 'top', val[1], unit); + } else { + superclass.setAttribute.call(this, attr, val, unit); + } + }; + + proto.getAttribute = function(attr) { + if ( this.patterns.points.test(attr) ) { + var val = [ + superclass.getAttribute.call(this, 'left'), + superclass.getAttribute.call(this, 'top') + ]; + } else { + val = superclass.getAttribute.call(this, attr); + } + + return val; + }; + + proto.doMethod = function(attr, start, end) { + var val = null; + + if ( this.patterns.points.test(attr) ) { + var t = this.method(this.currentFrame, 0, 100, this.totalFrames) / 100; + val = Y.Bezier.getPosition(this.runtimeAttributes[attr], t); + } else { + val = superclass.doMethod.call(this, attr, start, end); + } + return val; + }; + + proto.setRuntimeAttribute = function(attr) { + if ( this.patterns.points.test(attr) ) { + var el = this.getEl(); + var attributes = this.attributes; + var start; + var control = attributes['points']['control'] || []; + var end; + var i, len; + + if (control.length > 0 && !(control[0] instanceof Array) ) { // could be single point or array of points + control = [control]; + } else { // break reference to attributes.points.control + var tmp = []; + for (i = 0, len = control.length; i< len; ++i) { + tmp[i] = control[i]; + } + control = tmp; + } + + if (Y.Dom.getStyle(el, 'position') == 'static') { // default to relative + Y.Dom.setStyle(el, 'position', 'relative'); + } + + if ( isset(attributes['points']['from']) ) { + Y.Dom.setXY(el, attributes['points']['from']); // set position to from point + } + else { Y.Dom.setXY( el, Y.Dom.getXY(el) ); } // set it to current position + + start = this.getAttribute('points'); // get actual top & left + + // TO beats BY, per SMIL 2.1 spec + if ( isset(attributes['points']['to']) ) { + end = translateValues.call(this, attributes['points']['to'], start); + + var pageXY = Y.Dom.getXY(this.getEl()); + for (i = 0, len = control.length; i < len; ++i) { + control[i] = translateValues.call(this, control[i], start); + } + + + } else if ( isset(attributes['points']['by']) ) { + end = [ start[0] + attributes['points']['by'][0], start[1] + attributes['points']['by'][1] ]; + + for (i = 0, len = control.length; i < len; ++i) { + control[i] = [ start[0] + control[i][0], start[1] + control[i][1] ]; + } + } + + this.runtimeAttributes[attr] = [start]; + + if (control.length > 0) { + this.runtimeAttributes[attr] = this.runtimeAttributes[attr].concat(control); + } + + this.runtimeAttributes[attr][this.runtimeAttributes[attr].length] = end; + } + else { + superclass.setRuntimeAttribute.call(this, attr); + } + }; + + var translateValues = function(val, start) { + var pageXY = Y.Dom.getXY(this.getEl()); + val = [ val[0] - pageXY[0] + start[0], val[1] - pageXY[1] + start[1] ]; + + return val; + }; + + var isset = function(prop) { + return (typeof prop !== 'undefined'); + }; + + Y.Motion = Motion; +})(); +(function() { +/** + * Anim subclass for scrolling elements to a position defined by the "scroll" + * member of "attributes". All "scroll" members are arrays with x, y scroll positions. + *

    Usage: var myAnim = new YAHOO.util.Scroll(el, { scroll: { to: [0, 800] } }, 1, YAHOO.util.Easing.easeOut);

    + * @class Scroll + * @namespace YAHOO.util + * @requires YAHOO.util.Anim + * @requires YAHOO.util.AnimMgr + * @requires YAHOO.util.Easing + * @requires YAHOO.util.Bezier + * @requires YAHOO.util.Dom + * @requires YAHOO.util.Event + * @requires YAHOO.util.CustomEvent + * @extends YAHOO.util.ColorAnim + * @constructor + * @param {String or HTMLElement} el Reference to the element that will be animated + * @param {Object} attributes The attribute(s) to be animated. + * Each attribute is an object with at minimum a "to" or "by" member defined. + * Additional optional members are "from" (defaults to current value), "units" (defaults to "px"). + * All attribute names use camelCase. + * @param {Number} duration (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based + * @param {Function} method (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method) + */ + var Scroll = function(el, attributes, duration, method) { + if (el) { // dont break existing subclasses not using YAHOO.extend + Scroll.superclass.constructor.call(this, el, attributes, duration, method); + } + }; + + Scroll.NAME = 'Scroll'; + + // shorthand + var Y = YAHOO.util; + YAHOO.extend(Scroll, Y.ColorAnim); + + var superclass = Scroll.superclass; + var proto = Scroll.prototype; + + proto.doMethod = function(attr, start, end) { + var val = null; + + if (attr == 'scroll') { + val = [ + this.method(this.currentFrame, start[0], end[0] - start[0], this.totalFrames), + this.method(this.currentFrame, start[1], end[1] - start[1], this.totalFrames) + ]; + + } else { + val = superclass.doMethod.call(this, attr, start, end); + } + return val; + }; + + proto.getAttribute = function(attr) { + var val = null; + var el = this.getEl(); + + if (attr == 'scroll') { + val = [ el.scrollLeft, el.scrollTop ]; + } else { + val = superclass.getAttribute.call(this, attr); + } + + return val; + }; + + proto.setAttribute = function(attr, val, unit) { + var el = this.getEl(); + + if (attr == 'scroll') { + el.scrollLeft = val[0]; + el.scrollTop = val[1]; + } else { + superclass.setAttribute.call(this, attr, val, unit); + } + }; + + Y.Scroll = Scroll; +})(); +YAHOO.register("animation", YAHOO.util.Anim, {version: "2.6.0", build: "1321"}); diff --git a/webdir/javascript/yui/assets/skins/sam/asc.gif b/webdir/javascript/yui/assets/skins/sam/asc.gif new file mode 100644 index 0000000..a1fe738 Binary files /dev/null and b/webdir/javascript/yui/assets/skins/sam/asc.gif differ diff --git a/webdir/javascript/yui/assets/skins/sam/autocomplete.css b/webdir/javascript/yui/assets/skins/sam/autocomplete.css new file mode 100644 index 0000000..82cf7e5 --- /dev/null +++ b/webdir/javascript/yui/assets/skins/sam/autocomplete.css @@ -0,0 +1,7 @@ +/* +Copyright (c) 2008, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.6.0 +*/ +.yui-skin-sam .yui-ac{position:relative;font-family:arial;font-size:100%;}.yui-skin-sam .yui-ac-input{position:absolute;width:100%;}.yui-skin-sam .yui-ac-container{position:absolute;top:1.6em;width:100%;}.yui-skin-sam .yui-ac-content{position:absolute;width:100%;border:1px solid #808080;background:#fff;overflow:hidden;z-index:9050;}.yui-skin-sam .yui-ac-shadow{position:absolute;margin:.3em;width:100%;background:#000;-moz-opacity:0.10;opacity:.10;filter:alpha(opacity=10);z-index:9049;}.yui-skin-sam .yui-ac iframe{opacity:0;filter:alpha(opacity=0);padding-right:.3em;padding-bottom:.3em;}.yui-skin-sam .yui-ac-content ul{margin:0;padding:0;width:100%;}.yui-skin-sam .yui-ac-content li{margin:0;padding:2px 5px;cursor:default;white-space:nowrap;list-style:none;zoom:1;}.yui-skin-sam .yui-ac-content li.yui-ac-prehighlight{background:#B3D4FF;}.yui-skin-sam .yui-ac-content li.yui-ac-highlight{background:#426FD9;color:#FFF;} diff --git a/webdir/javascript/yui/assets/skins/sam/blankimage.png b/webdir/javascript/yui/assets/skins/sam/blankimage.png new file mode 100644 index 0000000..b87bb24 Binary files /dev/null and b/webdir/javascript/yui/assets/skins/sam/blankimage.png differ diff --git a/webdir/javascript/yui/assets/skins/sam/button.css b/webdir/javascript/yui/assets/skins/sam/button.css new file mode 100644 index 0000000..bfe8488 --- /dev/null +++ b/webdir/javascript/yui/assets/skins/sam/button.css @@ -0,0 +1,7 @@ +/* +Copyright (c) 2008, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.6.0 +*/ +.yui-button{display:-moz-inline-box;display:inline-block;vertical-align:text-bottom;}.yui-button .first-child{display:block;*display:inline-block;}.yui-button button,.yui-button a{display:block;*display:inline-block;border:none;margin:0;}.yui-button button{background-color:transparent;*overflow:visible;cursor:pointer;}.yui-button a{text-decoration:none;}.yui-skin-sam .yui-button{border-width:1px 0;border-style:solid;border-color:#808080;background:url(sprite.png) repeat-x 0 0;margin:auto .25em;}.yui-skin-sam .yui-button .first-child{border-width:0 1px;border-style:solid;border-color:#808080;margin:0 -1px;*position:relative;*left:-1px;_margin:0;_position:static;}.yui-skin-sam .yui-button button,.yui-skin-sam .yui-button a{padding:0 10px;font-size:93%;line-height:2;*line-height:1.7;min-height:2em;*min-height:auto;color:#000;}.yui-skin-sam .yui-button a{*line-height:1.875;*padding-bottom:1px;}.yui-skin-sam .yui-split-button button,.yui-skin-sam .yui-menu-button button{padding-right:20px;background-position:right center;background-repeat:no-repeat;}.yui-skin-sam .yui-menu-button button{background-image:url(menu-button-arrow.png);}.yui-skin-sam .yui-split-button button{background-image:url(split-button-arrow.png);}.yui-skin-sam .yui-button-focus{border-color:#7D98B8;background-position:0 -1300px;}.yui-skin-sam .yui-button-focus .first-child{border-color:#7D98B8;}.yui-skin-sam .yui-button-focus button,.yui-skin-sam .yui-button-focus a{color:#000;}.yui-skin-sam .yui-split-button-focus button{background-image:url(split-button-arrow-focus.png);}.yui-skin-sam .yui-button-hover{border-color:#7D98B8;background-position:0 -1300px;}.yui-skin-sam .yui-button-hover .first-child{border-color:#7D98B8;}.yui-skin-sam .yui-button-hover button,.yui-skin-sam .yui-button-hover a{color:#000;}.yui-skin-sam .yui-split-button-hover button{background-image:url(split-button-arrow-hover.png);}.yui-skin-sam .yui-button-active{border-color:#7D98B8;background-position:0 -1700px;}.yui-skin-sam .yui-button-active .first-child{border-color:#7D98B8;}.yui-skin-sam .yui-button-active button,.yui-skin-sam .yui-button-active a{color:#000;}.yui-skin-sam .yui-split-button-activeoption{border-color:#808080;background-position:0 0;}.yui-skin-sam .yui-split-button-activeoption .first-child{border-color:#808080;}.yui-skin-sam .yui-split-button-activeoption button{background-image:url(split-button-arrow-active.png);}.yui-skin-sam .yui-radio-button-checked,.yui-skin-sam .yui-checkbox-button-checked{border-color:#304369;background-position:0 -1400px;}.yui-skin-sam .yui-radio-button-checked .first-child,.yui-skin-sam .yui-checkbox-button-checked .first-child{border-color:#304369;}.yui-skin-sam .yui-radio-button-checked button,.yui-skin-sam .yui-checkbox-button-checked button{color:#fff;}.yui-skin-sam .yui-button-disabled{border-color:#ccc;background-position:0 -1500px;}.yui-skin-sam .yui-button-disabled .first-child{border-color:#ccc;}.yui-skin-sam .yui-button-disabled button,.yui-skin-sam .yui-button-disabled a{color:#A6A6A6;cursor:default;}.yui-skin-sam .yui-menu-button-disabled button{background-image:url(menu-button-arrow-disabled.png);}.yui-skin-sam .yui-split-button-disabled button{background-image:url(split-button-arrow-disabled.png);} diff --git a/webdir/javascript/yui/assets/skins/sam/calendar.css b/webdir/javascript/yui/assets/skins/sam/calendar.css new file mode 100644 index 0000000..aad1782 --- /dev/null +++ b/webdir/javascript/yui/assets/skins/sam/calendar.css @@ -0,0 +1,7 @@ +/* +Copyright (c) 2008, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.6.0 +*/ +.yui-calcontainer{position:relative;float:left;_overflow:hidden;}.yui-calcontainer iframe{position:absolute;border:none;margin:0;padding:0;z-index:0;width:100%;height:100%;left:0px;top:0px;}.yui-calcontainer iframe.fixedsize{width:50em;height:50em;top:-1px;left:-1px;}.yui-calcontainer.multi .groupcal{z-index:1;float:left;position:relative;}.yui-calcontainer .title{position:relative;z-index:1;}.yui-calcontainer .close-icon{position:absolute;z-index:1;text-indent:-10000em;overflow:hidden;}.yui-calendar{position:relative;}.yui-calendar .calnavleft{position:absolute;z-index:1;text-indent:-10000em;overflow:hidden;}.yui-calendar .calnavright{position:absolute;z-index:1;text-indent:-10000em;overflow:hidden;}.yui-calendar .calheader{position:relative;width:100%;text-align:center;}.yui-calcontainer .yui-cal-nav-mask{position:absolute;z-index:2;margin:0;padding:0;width:100%;height:100%;_width:0;_height:0;left:0;top:0;display:none;}.yui-calcontainer .yui-cal-nav{position:absolute;z-index:3;top:0;display:none;}.yui-calcontainer .yui-cal-nav .yui-cal-nav-btn{display:-moz-inline-box;display:inline-block;}.yui-calcontainer .yui-cal-nav .yui-cal-nav-btn button{display:block;*display:inline-block;*overflow:visible;border:none;background-color:transparent;cursor:pointer;}.yui-calendar .calbody a:hover{background:inherit;}p#clear{clear:left;padding-top:10px;}.yui-skin-sam .yui-calcontainer{background-color:#f2f2f2;border:1px solid #808080;padding:10px;}.yui-skin-sam .yui-calcontainer.multi{padding:0 5px 0 5px;}.yui-skin-sam .yui-calcontainer.multi .groupcal{background-color:transparent;border:none;padding:10px 5px 10px 5px;margin:0;}.yui-skin-sam .yui-calcontainer .title{background:url(sprite.png) repeat-x 0 0;border-bottom:1px solid #cccccc;font:100% sans-serif;color:#000;font-weight:bold;height:auto;padding:.4em;margin:0 -10px 10px -10px;top:0;left:0;text-align:left;}.yui-skin-sam .yui-calcontainer.multi .title{margin:0 -5px 0 -5px;}.yui-skin-sam .yui-calcontainer.withtitle{padding-top:0;}.yui-skin-sam .yui-calcontainer .calclose{background:url(sprite.png) no-repeat 0 -300px;width:25px;height:15px;top:.4em;right:.4em;cursor:pointer;}.yui-skin-sam .yui-calendar{border-spacing:0;border-collapse:collapse;font:100% sans-serif;text-align:center;margin:0;}.yui-skin-sam .yui-calendar .calhead{background:transparent;border:none;vertical-align:middle;padding:0;}.yui-skin-sam .yui-calendar .calheader{background:transparent;font-weight:bold;padding:0 0 .6em 0;text-align:center;}.yui-skin-sam .yui-calendar .calheader img{border:none;}.yui-skin-sam .yui-calendar .calnavleft{background:url(sprite.png) no-repeat 0 -450px;width:25px;height:15px;top:0;bottom:0;left:-10px;margin-left:.4em;cursor:pointer;}.yui-skin-sam .yui-calendar .calnavright{background:url(sprite.png) no-repeat 0 -500px;width:25px;height:15px;top:0;bottom:0;right:-10px;margin-right:.4em;cursor:pointer;}.yui-skin-sam .yui-calendar .calweekdayrow{height:2em;}.yui-skin-sam .yui-calendar .calweekdayrow th{padding:0;border:none;}.yui-skin-sam .yui-calendar .calweekdaycell{color:#000;font-weight:bold;text-align:center;width:2em;}.yui-skin-sam .yui-calendar .calfoot{background-color:#f2f2f2;}.yui-skin-sam .yui-calendar .calrowhead,.yui-skin-sam .yui-calendar .calrowfoot{color:#a6a6a6;font-size:85%;font-style:normal;font-weight:normal;border:none;}.yui-skin-sam .yui-calendar .calrowhead{text-align:right;padding:0 2px 0 0;}.yui-skin-sam .yui-calendar .calrowfoot{text-align:left;padding:0 0 0 2px;}.yui-skin-sam .yui-calendar td.calcell{border:1px solid #cccccc;background:#fff;padding:1px;height:1.6em;line-height:1.6em;text-align:center;white-space:nowrap;}.yui-skin-sam .yui-calendar td.calcell a{color:#0066cc;display:block;height:100%;text-decoration:none;}.yui-skin-sam .yui-calendar td.calcell.today{background-color:#000;}.yui-skin-sam .yui-calendar td.calcell.today a{background-color:#fff;}.yui-skin-sam .yui-calendar td.calcell.oom{background-color:#cccccc;color:#a6a6a6;cursor:default;}.yui-skin-sam .yui-calendar td.calcell.selected{background-color:#fff;color:#000;}.yui-skin-sam .yui-calendar td.calcell.selected a{background-color:#b3d4ff;color:#000;}.yui-skin-sam .yui-calendar td.calcell.calcellhover{background-color:#426fd9;color:#fff;cursor:pointer;}.yui-skin-sam .yui-calendar td.calcell.calcellhover a{background-color:#426fd9;color:#fff;}.yui-skin-sam .yui-calendar td.calcell.previous{color:#e0e0e0;}.yui-skin-sam .yui-calendar td.calcell.restricted{text-decoration:line-through;}.yui-skin-sam .yui-calendar td.calcell.highlight1{background-color:#ccff99;}.yui-skin-sam .yui-calendar td.calcell.highlight2{background-color:#99ccff;}.yui-skin-sam .yui-calendar td.calcell.highlight3{background-color:#ffcccc;}.yui-skin-sam .yui-calendar td.calcell.highlight4{background-color:#ccff99;}.yui-skin-sam .yui-calendar a.calnav{border:1px solid #f2f2f2;padding:0 4px;text-decoration:none;color:#000;zoom:1;}.yui-skin-sam .yui-calendar a.calnav:hover{background:url(sprite.png) repeat-x 0 0;border-color:#A0A0A0;cursor:pointer;}.yui-skin-sam .yui-calcontainer .yui-cal-nav-mask{background-color:#000;opacity:0.25;*filter:alpha(opacity=25);}.yui-skin-sam .yui-calcontainer .yui-cal-nav{font-family:arial,helvetica,clean,sans-serif;font-size:93%;border:1px solid #808080;left:50%;margin-left:-7em;width:14em;padding:0;top:2.5em;background-color:#f2f2f2;}.yui-skin-sam .yui-calcontainer.withtitle .yui-cal-nav{top:4.5em;}.yui-skin-sam .yui-calcontainer.multi .yui-cal-nav{width:16em;margin-left:-8em;}.yui-skin-sam .yui-calcontainer .yui-cal-nav-y,.yui-skin-sam .yui-calcontainer .yui-cal-nav-m,.yui-skin-sam .yui-calcontainer .yui-cal-nav-b{padding:5px 10px 5px 10px;}.yui-skin-sam .yui-calcontainer .yui-cal-nav-b{text-align:center;}.yui-skin-sam .yui-calcontainer .yui-cal-nav-e{margin-top:5px;padding:5px;background-color:#EDF5FF;border-top:1px solid black;display:none;}.yui-skin-sam .yui-calcontainer .yui-cal-nav label{display:block;font-weight:bold;}.yui-skin-sam .yui-calcontainer .yui-cal-nav-mc{width:100%;_width:auto;}.yui-skin-sam .yui-calcontainer .yui-cal-nav-y input.yui-invalid{background-color:#FFEE69;border:1px solid #000;}.yui-skin-sam .yui-calcontainer .yui-cal-nav-yc{width:4em;}.yui-skin-sam .yui-calcontainer .yui-cal-nav .yui-cal-nav-btn{border:1px solid #808080;background:url(sprite.png) repeat-x 0 0;background-color:#ccc;margin:auto .15em;}.yui-skin-sam .yui-calcontainer .yui-cal-nav .yui-cal-nav-btn button{padding:0 8px;font-size:93%;line-height:2;*line-height:1.7;min-height:2em;*min-height:auto;color:#000;}.yui-skin-sam .yui-calcontainer .yui-cal-nav .yui-cal-nav-btn.yui-default{border:1px solid #304369;background-color:#426fd9;background:url(sprite.png) repeat-x 0 -1400px;}.yui-skin-sam .yui-calcontainer .yui-cal-nav .yui-cal-nav-btn.yui-default button{color:#fff;} diff --git a/webdir/javascript/yui/assets/skins/sam/carousel.css b/webdir/javascript/yui/assets/skins/sam/carousel.css new file mode 100644 index 0000000..9d85d72 --- /dev/null +++ b/webdir/javascript/yui/assets/skins/sam/carousel.css @@ -0,0 +1,7 @@ +/* +Copyright (c) 2008, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.6.0 +*/ +.yui-carousel{visibility:hidden;overflow:hidden;position:relative;}.yui-carousel.yui-carousel-visible{visibility:visible;}.yui-carousel-content{overflow:hidden;position:relative;}.yui-carousel-element{margin:5px 0;overflow:hidden;padding:0;position:relative;width:32000px;z-index:1;}.yui-carousel-vertical .yui-carousel-element{margin:0 5px;}.yui-carousel-element li{border:1px solid #ccc;float:left;list-style:none;margin:1px;overflow:hidden;padding:0;text-align:center;*float:none;*display:inline-block;*zoom:1;*display:inline;}.yui-carousel .yui-carousel-item-selected{border:1px dashed #000;margin:1px;}.yui-carousel-vertical{height:32000px;margin:0 5px;width:auto;}.yui-carousel-vertical .yui-carousel-element li{display:block;float:none;}.yui-log .carousel{background:#f2e886;}.yui-carousel-nav{zoom:1;}.yui-carousel-nav:after{clear:both;content:"";display:block;}.yui-carousel-button-focus{outline:1px dotted #000;}.yui-skin-sam .yui-carousel,.yui-skin-sam .yui-carousel-vertical{border:1px solid #808080;}.yui-skin-sam .yui-carousel-nav{background:url(sprite.png) repeat-x 0 0;padding:3px;text-align:right;}.yui-skin-sam .yui-carousel-button{background:url(sprite.png) no-repeat 0 -600px;float:right;height:19px;margin:5px;overflow:hidden;width:40px;}.yui-skin-sam .yui-carousel-vertical .yui-carousel-button{background-position:0 -800px;}.yui-skin-sam .yui-carousel-button-disabled{background-position:0 -2000px;}.yui-skin-sam .yui-carousel-vertical .yui-carousel-button-disabled{background-position:0 -2100px;}.yui-skin-sam .yui-carousel-button input{background-color:transparent;border:0;cursor:pointer;display:block;height:44px;margin:-2px 0 0 -2px;padding:0 0 0 50px;}.yui-skin-sam span.yui-carousel-first-button{background-position:0px -550px;margin-left:-100px;margin-right:50px;*margin:5px 5px 5px -90px;}.yui-skin-sam .yui-carousel-vertical span.yui-carousel-first-button{background-position:0px -750px;}.yui-skin-sam span.yui-carousel-first-button-disabled{background-position:0 -1950px;}.yui-skin-sam .yui-carousel-vertical span.yui-carousel-first-button-disabled{background-position:0 -2050px;}.yui-skin-sam .yui-carousel-nav ul{float:right;margin:0;margin-left:-220px;margin-right:100px;*margin-left:-160px;*margin-right:0;padding:0;}.yui-skin-sam .yui-carousel-nav select{position:relative;*right:50px;top:4px;}.yui-skin-sam .yui-carousel-vertical .yui-carousel-nav ul,.yui-skin-sam .yui-carousel-vertical .yui-carousel-nav select{float:none;margin:0;*zoom:1;}.yui-skin-sam .yui-carousel-nav ul li{float:left;height:19px;list-style:none;}.yui-skin-sam .yui-carousel-nav ul:after{clear:both;content:"";display:block;}.yui-skin-sam .yui-carousel-nav ul li a{background:url(sprite.png) no-repeat 0 -650px;display:block;height:9px;margin:10px 0 0 5px;overflow:hidden;width:9px;}.yui-skin-sam .yui-carousel-nav ul li a em{left:-10000px;position:absolute;}.yui-skin-sam .yui-carousel-nav ul li.yui-carousel-nav-page-selected a{background-position:0 -700px;} diff --git a/webdir/javascript/yui/assets/skins/sam/colorpicker.css b/webdir/javascript/yui/assets/skins/sam/colorpicker.css new file mode 100644 index 0000000..82c6cfd --- /dev/null +++ b/webdir/javascript/yui/assets/skins/sam/colorpicker.css @@ -0,0 +1,7 @@ +/* +Copyright (c) 2008, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.6.0 +*/ +.yui-picker-panel{background:#e3e3e3;border-color:#888;}.yui-picker-panel .hd{background-color:#ccc;font-size:100%;line-height:100%;border:1px solid #e3e3e3;font-weight:bold;overflow:hidden;padding:6px;color:#000;}.yui-picker-panel .bd{background:#e8e8e8;margin:1px;height:200px;}.yui-picker-panel .ft{background:#e8e8e8;margin:1px;padding:1px;}.yui-picker{position:relative;}.yui-picker-hue-thumb{cursor:default;width:18px;height:18px;top:-8px;left:-2px;z-index:9;position:absolute;}.yui-picker-hue-bg{-moz-outline:none;outline:0px none;position:absolute;left:200px;height:183px;width:14px;background:url(hue_bg.png) no-repeat;top:4px;}.yui-picker-bg{-moz-outline:none;outline:0px none;position:absolute;top:4px;left:4px;height:182px;width:182px;background-color:#F00;background-image:url(picker_mask.png);}*html .yui-picker-bg{background-image:none;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='../../build/colorpicker/assets/picker_mask.png',sizingMethod='scale');}.yui-picker-mask{position:absolute;z-index:1;top:0px;left:0px;}.yui-picker-thumb{cursor:default;width:11px;height:11px;z-index:9;position:absolute;top:-4px;left:-4px;}.yui-picker-swatch{position:absolute;left:240px;top:4px;height:60px;width:55px;border:1px solid #888;}.yui-picker-websafe-swatch{position:absolute;left:304px;top:4px;height:24px;width:24px;border:1px solid #888;}.yui-picker-controls{position:absolute;top:72px;left:226px;font:1em monospace;}.yui-picker-controls .hd{background:transparent;border-width:0px !important;}.yui-picker-controls .bd{height:100px;border-width:0px !important;}.yui-picker-controls ul{float:left;padding:0 2px 0 0;margin:0}.yui-picker-controls li{padding:2px;list-style:none;margin:0}.yui-picker-controls input{font-size:0.85em;width:2.4em;}.yui-picker-hex-controls{clear:both;padding:2px;}.yui-picker-hex-controls input{width:4.6em;}.yui-picker-controls a{font:1em arial,helvetica,clean,sans-serif;display:block;*display:inline-block;padding:0;color:#000;} diff --git a/webdir/javascript/yui/assets/skins/sam/container.css b/webdir/javascript/yui/assets/skins/sam/container.css new file mode 100644 index 0000000..5023824 --- /dev/null +++ b/webdir/javascript/yui/assets/skins/sam/container.css @@ -0,0 +1,7 @@ +/* +Copyright (c) 2008, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.6.0 +*/ +.yui-overlay,.yui-panel-container{visibility:hidden;position:absolute;z-index:2;}.yui-panel-container form{margin:0;}.mask{z-index:1;display:none;position:absolute;top:0;left:0;right:0;bottom:0;}.mask.block-scrollbars{overflow:auto;}.masked select,.drag select,.hide-select select{_visibility:hidden;}.yui-panel-container select{_visibility:inherit;}.hide-scrollbars,.hide-scrollbars *{overflow:hidden;}.hide-scrollbars select{display:none;}.show-scrollbars{overflow:auto;}.yui-panel-container.show-scrollbars,.yui-tt.show-scrollbars{overflow:visible;}.yui-panel-container.show-scrollbars .underlay,.yui-tt.show-scrollbars .yui-tt-shadow{overflow:auto;}.yui-panel-container.shadow .underlay.yui-force-redraw{padding-bottom:1px;}.yui-effect-fade .underlay{display:none;}.yui-tt-shadow{position:absolute;}.yui-override-padding{padding:0 !important;}.yui-panel-container .container-close{overflow:hidden;text-indent:-10000em;text-decoration:none;}.yui-skin-sam .mask{background-color:#000;opacity:.25;*filter:alpha(opacity=25);}.yui-skin-sam .yui-panel-container{padding:0 1px;*padding:2px;}.yui-skin-sam .yui-panel{position:relative;left:0;top:0;border-style:solid;border-width:1px 0;border-color:#808080;z-index:1;*border-width:1px;*zoom:1;_zoom:normal;}.yui-skin-sam .yui-panel .hd,.yui-skin-sam .yui-panel .bd,.yui-skin-sam .yui-panel .ft{border-style:solid;border-width:0 1px;border-color:#808080;margin:0 -1px;*margin:0;*border:0;}.yui-skin-sam .yui-panel .hd{border-bottom:solid 1px #ccc;}.yui-skin-sam .yui-panel .bd,.yui-skin-sam .yui-panel .ft{background-color:#F2F2F2;}.yui-skin-sam .yui-panel .hd{padding:0 10px;font-size:93%;line-height:2;*line-height:1.9;font-weight:bold;color:#000;background:url(sprite.png) repeat-x 0 -200px;}.yui-skin-sam .yui-panel .bd{padding:10px;}.yui-skin-sam .yui-panel .ft{border-top:solid 1px #808080;padding:5px 10px;font-size:77%;}.yui-skin-sam .yui-panel-container.focused .yui-panel .hd{}.yui-skin-sam .container-close{position:absolute;top:5px;right:6px;width:25px;height:15px;background:url(sprite.png) no-repeat 0 -300px;cursor:pointer;}.yui-skin-sam .yui-panel-container .underlay{right:-1px;left:-1px;}.yui-skin-sam .yui-panel-container.matte{padding:9px 10px;background-color:#fff;}.yui-skin-sam .yui-panel-container.shadow{_padding:2px 4px 0 2px;}.yui-skin-sam .yui-panel-container.shadow .underlay{position:absolute;top:2px;left:-3px;right:-3px;bottom:-3px;*top:4px;*left:-1px;*right:-1px;*bottom:-1px;_top:0;_left:0;_right:0;_bottom:0;_margin-top:3px;_margin-left:-1px;background-color:#000;opacity:.12;*filter:alpha(opacity=12);}.yui-skin-sam .yui-dialog .ft{border-top:none;padding:0 10px 10px 10px;font-size:100%;}.yui-skin-sam .yui-dialog .ft .button-group{display:block;text-align:right;}.yui-skin-sam .yui-dialog .ft button.default{font-weight:bold;}.yui-skin-sam .yui-dialog .ft span.default{border-color:#304369;background-position:0 -1400px;}.yui-skin-sam .yui-dialog .ft span.default .first-child{border-color:#304369;}.yui-skin-sam .yui-dialog .ft span.default button{color:#fff;}.yui-skin-sam .yui-dialog .ft span.yui-button-disabled{background-position:0pt -1500px;border-color:#ccc;}.yui-skin-sam .yui-dialog .ft span.yui-button-disabled .first-child{border-color:#ccc;}.yui-skin-sam .yui-dialog .ft span.yui-button-disabled button{color:#a6a6a6;}.yui-skin-sam .yui-simple-dialog .bd .yui-icon{background:url(sprite.png) no-repeat 0 0;width:16px;height:16px;margin-right:10px;float:left;}.yui-skin-sam .yui-simple-dialog .bd span.blckicon{background-position:0 -1100px;}.yui-skin-sam .yui-simple-dialog .bd span.alrticon{background-position:0 -1050px;}.yui-skin-sam .yui-simple-dialog .bd span.hlpicon{background-position:0 -1150px;}.yui-skin-sam .yui-simple-dialog .bd span.infoicon{background-position:0 -1200px;}.yui-skin-sam .yui-simple-dialog .bd span.warnicon{background-position:0 -1900px;}.yui-skin-sam .yui-simple-dialog .bd span.tipicon{background-position:0 -1250px;}.yui-skin-sam .yui-tt .bd{position:relative;top:0;left:0;z-index:1;color:#000;padding:2px 5px;border-color:#D4C237 #A6982B #A6982B #A6982B;border-width:1px;border-style:solid;background-color:#FFEE69;}.yui-skin-sam .yui-tt.show-scrollbars .bd{overflow:auto;}.yui-skin-sam .yui-tt-shadow{top:2px;right:-3px;left:-3px;bottom:-3px;background-color:#000;}.yui-skin-sam .yui-tt-shadow-visible{opacity:.12;*filter:alpha(opacity=12);} diff --git a/webdir/javascript/yui/assets/skins/sam/datatable.css b/webdir/javascript/yui/assets/skins/sam/datatable.css new file mode 100644 index 0000000..55dc58d --- /dev/null +++ b/webdir/javascript/yui/assets/skins/sam/datatable.css @@ -0,0 +1,7 @@ +/* +Copyright (c) 2008, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.6.0 +*/ +.yui-skin-sam .yui-dt-mask{position:absolute;z-index:9500;}.yui-dt-tmp{position:absolute;left:-9000px;}.yui-dt-scrollable .yui-dt-bd{overflow:auto;}.yui-dt-scrollable .yui-dt-hd{overflow:hidden;position:relative;}.yui-dt-scrollable .yui-dt-bd thead tr,.yui-dt-scrollable .yui-dt-bd thead th{position:absolute;left:-1500px;}.yui-dt-scrollable tbody{-moz-outline:none;}.yui-dt-draggable{cursor:move;}.yui-dt-coltarget{position:absolute;z-index:999;}.yui-dt-hd{zoom:1;}th.yui-dt-resizeable .yui-dt-resizerliner{position:relative;}.yui-dt-resizer{position:absolute;right:0;bottom:0;height:100%;cursor:e-resize;cursor:col-resize;background-color:#CCC;opacity:0;filter:alpha(opacity=0);}.yui-dt-resizerproxy{visibility:hidden;position:absolute;z-index:9000;}th.yui-dt-hidden .yui-dt-liner,td.yui-dt-hidden .yui-dt-liner,th.yui-dt-hidden .yui-dt-resizer{display:none;}.yui-dt-editor{position:absolute;z-index:9000;}.yui-skin-sam .yui-dt table{margin:0;padding:0;font-family:arial;font-size:inherit;border-collapse:separate;*border-collapse:collapse;border-spacing:0;border:1px solid #7F7F7F;}.yui-skin-sam .yui-dt thead{border-spacing:0;}.yui-skin-sam .yui-dt caption{color:#000000;font-size:85%;font-weight:normal;font-style:italic;line-height:1;padding:1em 0pt;text-align:center;}.yui-skin-sam .yui-dt th{background:#D8D8DA url(sprite.png) repeat-x 0 0;}.yui-skin-sam .yui-dt th,.yui-skin-sam .yui-dt th a{font-weight:normal;text-decoration:none;color:#000;vertical-align:bottom;}.yui-skin-sam .yui-dt th{margin:0;padding:0;border:none;border-right:1px solid #CBCBCB;}.yui-skin-sam .yui-dt tr.yui-dt-first td{border-top:1px solid #7F7F7F;}.yui-skin-sam .yui-dt th .yui-dt-liner{white-space:nowrap;}.yui-skin-sam .yui-dt-liner{margin:0;padding:0;padding:4px 10px 4px 10px;}.yui-skin-sam .yui-dt-coltarget{width:5px;background-color:red;}.yui-skin-sam .yui-dt td{margin:0;padding:0;border:none;border-right:1px solid #CBCBCB;text-align:left;}.yui-skin-sam .yui-dt-list td{border-right:none;}.yui-skin-sam .yui-dt-resizer{width:6px;}.yui-skin-sam .yui-dt-mask{background-color:#000;opacity:.25;*filter:alpha(opacity=25);}.yui-skin-sam .yui-dt-message{background-color:#FFF;}.yui-skin-sam .yui-dt-scrollable table{border:none;}.yui-skin-sam .yui-dt-scrollable .yui-dt-hd{border-left:1px solid #7F7F7F;border-top:1px solid #7F7F7F;border-right:1px solid #7F7F7F;}.yui-skin-sam .yui-dt-scrollable .yui-dt-bd{border-left:1px solid #7F7F7F;border-bottom:1px solid #7F7F7F;border-right:1px solid #7F7F7F;background-color:#FFF;}.yui-skin-sam .yui-dt-scrollable .yui-dt-data tr.yui-dt-last td{border-bottom:1px solid #7F7F7F;}.yui-skin-sam thead .yui-dt-sortable{cursor:pointer;}.yui-skin-sam th.yui-dt-asc,.yui-skin-sam th.yui-dt-desc{background:url(sprite.png) repeat-x 0 -100px;}.yui-skin-sam th.yui-dt-sortable .yui-dt-label{margin-right:10px;}.yui-skin-sam th.yui-dt-asc .yui-dt-liner{background:url(dt-arrow-up.png) no-repeat right;}.yui-skin-sam th.yui-dt-desc .yui-dt-liner{background:url(dt-arrow-dn.png) no-repeat right;}tbody .yui-dt-editable{cursor:pointer;}.yui-dt-editor{text-align:left;background-color:#F2F2F2;border:1px solid #808080;padding:6px;}.yui-dt-editor label{padding-left:4px;padding-right:6px;}.yui-dt-editor .yui-dt-button{padding-top:6px;text-align:right;}.yui-dt-editor .yui-dt-button button{background:url(sprite.png) repeat-x 0 0;border:1px solid #999;width:4em;height:1.8em;margin-left:6px;}.yui-dt-editor .yui-dt-button button.yui-dt-default{background:url(sprite.png) repeat-x 0 -1400px;background-color:#5584E0;border:1px solid #304369;color:#FFF}.yui-dt-editor .yui-dt-button button:hover{background:url(sprite.png) repeat-x 0 -1300px;color:#000;}.yui-dt-editor .yui-dt-button button:active{background:url(sprite.png) repeat-x 0 -1700px;color:#000;}.yui-skin-sam tr.yui-dt-even{background-color:#FFF;}.yui-skin-sam tr.yui-dt-odd{background-color:#EDF5FF;}.yui-skin-sam tr.yui-dt-even td.yui-dt-asc,.yui-skin-sam tr.yui-dt-even td.yui-dt-desc{background-color:#EDF5FF;}.yui-skin-sam tr.yui-dt-odd td.yui-dt-asc,.yui-skin-sam tr.yui-dt-odd td.yui-dt-desc{background-color:#DBEAFF;}.yui-skin-sam .yui-dt-list tr.yui-dt-even{background-color:#FFF;}.yui-skin-sam .yui-dt-list tr.yui-dt-odd{background-color:#FFF;}.yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-asc,.yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-desc{background-color:#EDF5FF;}.yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-asc,.yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-desc{background-color:#EDF5FF;}.yui-skin-sam th.yui-dt-highlighted,.yui-skin-sam th.yui-dt-highlighted a{background-color:#B2D2FF;}.yui-skin-sam tr.yui-dt-highlighted,.yui-skin-sam tr.yui-dt-highlighted td.yui-dt-asc,.yui-skin-sam tr.yui-dt-highlighted td.yui-dt-desc,.yui-skin-sam tr.yui-dt-even td.yui-dt-highlighted,.yui-skin-sam tr.yui-dt-odd td.yui-dt-highlighted{cursor:pointer;background-color:#B2D2FF;}.yui-skin-sam .yui-dt-list th.yui-dt-highlighted,.yui-skin-sam .yui-dt-list th.yui-dt-highlighted a{background-color:#B2D2FF;}.yui-skin-sam .yui-dt-list tr.yui-dt-highlighted,.yui-skin-sam .yui-dt-list tr.yui-dt-highlighted td.yui-dt-asc,.yui-skin-sam .yui-dt-list tr.yui-dt-highlighted td.yui-dt-desc,.yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-highlighted,.yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-highlighted{cursor:pointer;background-color:#B2D2FF;}.yui-skin-sam th.yui-dt-selected,.yui-skin-sam th.yui-dt-selected a{background-color:#446CD7;}.yui-skin-sam tr.yui-dt-selected td,.yui-skin-sam tr.yui-dt-selected td.yui-dt-asc,.yui-skin-sam tr.yui-dt-selected td.yui-dt-desc{background-color:#426FD9;color:#FFF;}.yui-skin-sam tr.yui-dt-even td.yui-dt-selected,.yui-skin-sam tr.yui-dt-odd td.yui-dt-selected{background-color:#446CD7;color:#FFF;}.yui-skin-sam .yui-dt-list th.yui-dt-selected,.yui-skin-sam .yui-dt-list th.yui-dt-selected a{background-color:#446CD7;}.yui-skin-sam .yui-dt-list tr.yui-dt-selected td,.yui-skin-sam .yui-dt-list tr.yui-dt-selected td.yui-dt-asc,.yui-skin-sam .yui-dt-list tr.yui-dt-selected td.yui-dt-desc{background-color:#426FD9;color:#FFF;}.yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-selected,.yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-selected{background-color:#446CD7;color:#FFF;}.yui-skin-sam .yui-dt-paginator{display:block;margin:6px 0;white-space:nowrap;}.yui-skin-sam .yui-dt-paginator .yui-dt-first,.yui-skin-sam .yui-dt-paginator .yui-dt-last,.yui-skin-sam .yui-dt-paginator .yui-dt-selected{padding:2px 6px;}.yui-skin-sam .yui-dt-paginator a.yui-dt-first,.yui-skin-sam .yui-dt-paginator a.yui-dt-last{text-decoration:none;}.yui-skin-sam .yui-dt-paginator .yui-dt-previous,.yui-skin-sam .yui-dt-paginator .yui-dt-next{display:none;}.yui-skin-sam a.yui-dt-page{border:1px solid #CBCBCB;padding:2px 6px;text-decoration:none;background-color:#fff}.yui-skin-sam .yui-dt-selected{border:1px solid #fff;background-color:#fff;} diff --git a/webdir/javascript/yui/assets/skins/sam/desc.gif b/webdir/javascript/yui/assets/skins/sam/desc.gif new file mode 100644 index 0000000..c114f29 Binary files /dev/null and b/webdir/javascript/yui/assets/skins/sam/desc.gif differ diff --git a/webdir/javascript/yui/assets/skins/sam/dt-arrow-dn.png b/webdir/javascript/yui/assets/skins/sam/dt-arrow-dn.png new file mode 100644 index 0000000..85fda0b Binary files /dev/null and b/webdir/javascript/yui/assets/skins/sam/dt-arrow-dn.png differ diff --git a/webdir/javascript/yui/assets/skins/sam/dt-arrow-up.png b/webdir/javascript/yui/assets/skins/sam/dt-arrow-up.png new file mode 100644 index 0000000..1c67431 Binary files /dev/null and b/webdir/javascript/yui/assets/skins/sam/dt-arrow-up.png differ diff --git a/webdir/javascript/yui/assets/skins/sam/editor-knob.gif b/webdir/javascript/yui/assets/skins/sam/editor-knob.gif new file mode 100644 index 0000000..03feab3 Binary files /dev/null and b/webdir/javascript/yui/assets/skins/sam/editor-knob.gif differ diff --git a/webdir/javascript/yui/assets/skins/sam/editor-sprite-active.gif b/webdir/javascript/yui/assets/skins/sam/editor-sprite-active.gif new file mode 100644 index 0000000..3e9d420 Binary files /dev/null and b/webdir/javascript/yui/assets/skins/sam/editor-sprite-active.gif differ diff --git a/webdir/javascript/yui/assets/skins/sam/editor-sprite.gif b/webdir/javascript/yui/assets/skins/sam/editor-sprite.gif new file mode 100644 index 0000000..02042fa Binary files /dev/null and b/webdir/javascript/yui/assets/skins/sam/editor-sprite.gif differ diff --git a/webdir/javascript/yui/assets/skins/sam/editor.css b/webdir/javascript/yui/assets/skins/sam/editor.css new file mode 100644 index 0000000..780c387 --- /dev/null +++ b/webdir/javascript/yui/assets/skins/sam/editor.css @@ -0,0 +1,7 @@ +/* +Copyright (c) 2008, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.6.0 +*/ +.yui-busy{cursor:wait !important;}.yui-toolbar-container fieldset{padding:0;margin:0;border:0;}.yui-toolbar-container legend{display:none;}.yui-toolbar-container .yui-toolbar-subcont{padding:.25em 0;zoom:1;}.yui-toolbar-container-collapsed .yui-toolbar-subcont{display:none;}.yui-toolbar-container .yui-toolbar-subcont:after{display:block;clear:both;visibility:hidden;content:'.';height:0;}.yui-toolbar-container span.yui-toolbar-draghandle{cursor:move;border-left:1px solid #999;border-right:1px solid #999;overflow:hidden;text-indent:77777px;width:2px;height:20px;display:block;clear:none;float:left;margin:0 0 0 .2em;}.yui-toolbar-container .yui-toolbar-titlebar.draggable{cursor:move;}.yui-toolbar-container .yui-toolbar-titlebar{position:relative;}.yui-toolbar-container .yui-toolbar-titlebar h2{font-weight:bold;letter-spacing:0;border:none;color:#000;margin:0;padding:.2em;}.yui-toolbar-container .yui-toolbar-titlebar h2 a{text-decoration:none;color:#000;cursor:default;}.yui-toolbar-container.yui-toolbar-grouped span.yui-toolbar-draghandle{height:40px;}.yui-toolbar-container .yui-toolbar-group{float:left;margin-right:.5em;zoom:1;}.yui-toolbar-container .yui-toolbar-group:after{display:block;clear:both;visibility:hidden;content:'.';height:0;}.yui-toolbar-container .yui-toolbar-group h3{font-size:75%;padding:0 0 0 .25em;margin:0;}.yui-toolbar-container span.yui-toolbar-separator{width:2px;padding:0;height:18px;margin:.2em 0 .2em .1em;display:none;float:left;}.yui-toolbar-container.yui-toolbar-grouped span.yui-toolbar-separator{height:45px;*height:50px;}.yui-toolbar-container.yui-toolbar-grouped .yui-toolbar-group span.yui-toolbar-separator{height:18px;display:block;}.yui-toolbar-container ul li{margin:0;padding:0;list-style-type:none;}.yui-toolbar-container .yui-toolbar-nogrouplabels h3{display:none;}.yui-toolbar-container .yui-push-button,.yui-toolbar-container .yui-color-button,.yui-toolbar-container .yui-menu-button{position:relative;cursor:pointer;}.yui-toolbar-container .yui-button .first-child,.yui-toolbar-container .yui-button .first-child a{height:100%;width:100%;overflow:hidden;font-size:0px;}.yui-toolbar-container .yui-button-disabled{cursor:default;}.yui-toolbar-container .yui-button-disabled .yui-toolbar-icon{opacity:.5;filter:alpha(opacity=50);}.yui-toolbar-container .yui-button-disabled .up,.yui-toolbar-container .yui-button-disabled .down{opacity:.5;filter:alpha(opacity=50);}.yui-toolbar-container .yui-button a{overflow:hidden;}.yui-toolbar-container .yui-toolbar-select .first-child a{cursor:pointer;}.yui-toolbar-fontname-arial{font-family:Arial;}.yui-toolbar-fontname-arial-black{font-family:Arial Black;}.yui-toolbar-fontname-comic-sans-ms{font-family:Comic Sans MS;}.yui-toolbar-fontname-courier-new{font-family:Courier New;}.yui-toolbar-fontname-times-new-roman{font-family:Times New Roman;}.yui-toolbar-fontname-verdana{font-family:Verdana;}.yui-toolbar-fontname-impact{font-family:Impact;}.yui-toolbar-fontname-lucida-console{font-family:Lucida Console;}.yui-toolbar-fontname-tahoma{font-family:Tahoma;}.yui-toolbar-fontname-trebuchet-ms{font-family:Trebuchet MS;}.yui-toolbar-container .yui-toolbar-spinbutton{position:relative;}.yui-toolbar-container .yui-toolbar-spinbutton .first-child a{z-index:0;opacity:1;}.yui-toolbar-container .yui-toolbar-spinbutton a.up,.yui-toolbar-container .yui-toolbar-spinbutton a.down{position:absolute;display:block right:0;cursor:pointer;z-index:1;padding:0;margin:0;}.yui-toolbar-container .yui-overlay{position:absolute;}.yui-toolbar-container .yui-overlay ul li{margin:0;list-style-type:none;}.yui-toolbar-container{z-index:1;}.yui-editor-container .yui-editor-editable-container{position:relative;z-index:0;width:100%;}.yui-editor-container .yui-editor-masked{background-color:#CCC;}.yui-editor-container iframe{border:0px;padding:0;margin:0;zoom:1;display:block;}.yui-editor-container .yui-editor-editable{padding:0;margin:0;}.yui-editor-container .dompath{font-size:85%;}.yui-editor-panel .hd{text-align:left;position:relative;}.yui-editor-panel .hd h3{font-weight:bold;padding:0.25em 0pt 0.25em 0.25em;margin:0;}.yui-editor-panel .bd{width:100%;zoom:1;position:relative;}.yui-editor-panel .bd div.yui-editor-body-cont{padding:.25em .1em;zoom:1;}.yui-editor-panel .bd .gecko form{overflow:auto;}.yui-editor-panel .bd div.yui-editor-body-cont:after{display:block;clear:both;visibility:hidden;content:'.';height:0;}.yui-editor-panel .ft{text-align:right;width:99%;float:left;clear:both;}.yui-editor-panel .ft span.tip{display:block;position:relative;padding:.5em .5em .5em 23px;text-align:left;zoom:1;}.yui-editor-panel label{clear:both;float:left;padding:0;width:100%;text-align:left;zoom:1;}.yui-editor-panel .gecko label{overflow:auto;}.yui-editor-panel label strong{float:left;width:6em;}.yui-editor-panel .removeLink{width:80%;text-align:right;}.yui-editor-panel label input{margin-left:.25em;float:left;}.yui-editor-panel .yui-toolbar-group{margin-bottom:0.75em;}.yui-editor-panel .yui-toolbar-group-padding{}.yui-editor-panel .yui-toolbar-group-border{}.yui-editor-panel .yui-toolbar-group-textflow{}.yui-editor-panel .height-width{float:left;}.yui-editor-panel .height-width h3{}.yui-editor-panel .height-width span{font-style:italic;display:block;float:left;overflow:visible;}.yui-editor-panel .height-width span.info{font-size:70%;margin-top:3px;}.yui-editor-panel .yui-toolbar-bordersize,.yui-editor-panel .yui-toolbar-bordertype{font-size:75%;}.yui-editor-panel .yui-toolbar-container span.yui-toolbar-separator{border:none;}.yui-editor-panel .yui-toolbar-bordersize span a span,.yui-editor-panel .yui-toolbar-bordertype span a span{display:block;height:8px;left:4px;position:absolute;top:3px;_top:-5px;width:24px;text-indent:52px;font-size:0%;}.yui-editor-panel .yui-toolbar-bordertype span a span.yui-toolbar-bordertype-solid{border-bottom:1px solid black;}.yui-editor-panel .yui-toolbar-bordertype span a span.yui-toolbar-bordertype-dotted{border-bottom:1px dotted black;}.yui-editor-panel .yui-toolbar-bordertype span a span.yui-toolbar-bordertype-dashed{border-bottom:1px dashed black;}.yui-editor-panel .yui-toolbar-bordersize span a span.yui-toolbar-bordersize-0{*top:0px;text-indent:0px;font-size:75%;}.yui-editor-panel .yui-toolbar-bordersize span a span.yui-toolbar-bordersize-1{border-bottom:1px solid black;}.yui-editor-panel .yui-toolbar-bordersize span a span.yui-toolbar-bordersize-2{border-bottom:2px solid black;}.yui-editor-panel .yui-toolbar-bordersize span a span.yui-toolbar-bordersize-3{top:2px;*top:-5px;border-bottom:3px solid black;}.yui-editor-panel .yui-toolbar-bordersize span a span.yui-toolbar-bordersize-4{top:1px;*top:-5px;border-bottom:4px solid black;}.yui-editor-panel .yui-toolbar-bordersize span a span.yui-toolbar-bordersize-5{top:1px;*top:-5px;border-bottom:5px solid black;}.yui-toolbar-container .yui-toolbar-bordersize-menu,.yui-toolbar-container .yui-toolbar-bordertype-menu{width:95px !important;}.yui-toolbar-bordersize-menu .yuimenuitemlabel,.yui-toolbar-bordertype-menu .yuimenuitemlabel,.yui-toolbar-bordersize-menu .yuimenuitemlabel,.yui-toolbar-bordertype-menu .yuimenuitemlabel:hover{margin:0px 3px 7px 17px;}.yui-toolbar-bordersize-menu .yuimenuitemlabel .checkedindicator,.yui-toolbar-bordertype-menu .yuimenuitemlabel .checkedindicator{position:absolute;left:-12px;*top:14px;*left:0px;}.yui-toolbar-bordersize-menu li.yui-toolbar-bordersize-1 a{border-bottom:1px solid black;height:14px;}.yui-toolbar-bordersize-menu li.yui-toolbar-bordersize-2 a{border-bottom:2px solid black;height:14px;}.yui-toolbar-bordersize-menu li.yui-toolbar-bordersize-3 a{border-bottom:3px solid black;height:14px;}.yui-toolbar-bordersize-menu li.yui-toolbar-bordersize-4 a{border-bottom:4px solid black;height:14px;}.yui-toolbar-bordersize-menu li.yui-toolbar-bordersize-5 a{border-bottom:5px solid black;height:14px;}.yui-toolbar-bordertype-menu li.yui-toolbar-bordertype-solid a{border-bottom:1px solid black;height:14px;}.yui-toolbar-bordertype-menu li.yui-toolbar-bordertype-dashed a{border-bottom:1px dashed black;height:14px;}.yui-toolbar-bordertype-menu li.yui-toolbar-bordertype-dotted a{border-bottom:1px dotted black;height:14px;}h2.yui-editor-skipheader,h3.yui-editor-skipheader{height:0;margin:0;padding:0;border:none;width:0;overflow:hidden;position:absolute;}.yui-toolbar-colors{width:133px;zoom:1;display:none;z-index:100;overflow:hidden;}.yui-toolbar-colors:after{display:block;clear:both;visibility:hidden;content:'.';height:0;}.yui-toolbar-colors a{height:9px;width:9px;float:left;display:block;overflow:hidden;text-indent:999px;margin:0;cursor:pointer;border:1px solid #F6F7EE;}.yui-toolbar-colors a:hover{border:1px solid black;}.yui-color-button-menu{overflow:visible;background-color:transparent;}.yui-toolbar-colors span{position:relative;display:block;padding:3px;overflow:hidden;float:left;width:100%;zoom:1;}.yui-toolbar-colors span:after{display:block;clear:both;visibility:hidden;content:'.';height:0;}.yui-toolbar-colors span em{height:35px;width:30px;float:left;display:block;overflow:hidden;text-indent:999px;margin:0.75px;border:1px solid black;}.yui-toolbar-colors span strong{font-weight:normal;padding-left:3px;display:block;font-size:85%;float:left;width:65%;}.yui-toolbar-group-undoredo h3,.yui-toolbar-group-insertitem h3,.yui-toolbar-group-indentlist h3{width:68px;}.yui-toolbar-group-indentlist2 h3{width:122px;}.yui-toolbar-group-alignment h3{width:130px;}.yui-skin-sam .yui-editor-container{border:1px solid #808080;}.yui-skin-sam .yui-toolbar-container{zoom:1;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-titlebar{background:url(sprite.png) repeat-x 0 -200px;position:relative;}.yui-skin-sam .yui-editor-container .draggable .yui-toolbar-titlebar{cursor:move;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-titlebar h2{color:#000000;font-weight:bold;margin:0;padding:0.3em 1em;font-size:100%;text-align:left;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-group h3{color:#808080;font-size:75%;margin:1em 0 0;padding-bottom:0;padding-left:0.25em;text-align:left;}.yui-toolbar-container span.yui-toolbar-separator{border:none;text-indent:33px;overflow:hidden;margin:0 .25em;}.yui-skin-sam .yui-toolbar-container{background-color:#F2F2F2;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-subcont{padding:0 1em 0.35em;border-bottom:1px solid #808080;}.yui-skin-sam .yui-toolbar-container-collapsed .yui-toolbar-titlebar{border-bottom:1px solid #808080;}.yui-skin-sam .yui-editor-container .visible .yui-menu-shadow,.yui-skin-sam .yui-editor-panel .visible .yui-menu-shadow{display:none;}.yui-skin-sam .yui-editor-container ul{list-style-type:none;margin:0;padding:0;}.yui-skin-sam .yui-editor-container ul li{list-style-type:none;margin:0;padding:0;}.yui-skin-sam .yui-toolbar-group ul li.yui-toolbar-groupitem{float:left;}.yui-skin-sam .yui-editor-container .dompath{background-color:#F2F2F2;border-top:1px solid #808080;color:#999;text-align:left;padding:0.25em;}.yui-skin-sam .yui-toolbar-container .collapse{background:url(sprite.png) no-repeat 0 -400px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-titlebar span.collapse{cursor:pointer;position:absolute;top:4px;right:2px;display:block;overflow:hidden;height:15px;width:15px;text-indent:9999px;}.yui-skin-sam .yui-toolbar-container .yui-push-button,.yui-skin-sam .yui-toolbar-container .yui-color-button,.yui-skin-sam .yui-toolbar-container .yui-menu-button{background:url(sprite.png) repeat-x 0 0;position:relative;display:block;height:22px;width:30px;_font-size:0;margin:0;border-color:#808080;color:#f2f2f2;border-style:solid;border-width:1px 0;zoom:1;}.yui-skin-sam .yui-toolbar-container .yui-push-button a,.yui-skin-sam .yui-toolbar-container .yui-color-button a,.yui-skin-sam .yui-toolbar-container .yui-menu-button a{padding-left:35px;height:20px;text-decoration:none;font-size:0px;line-height:2;display:block;color:#000;overflow:hidden;white-space:nowrap;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-spinbutton a,.yui-skin-sam .yui-toolbar-container .yui-toolbar-select a{font-size:12px;}.yui-skin-sam .yui-toolbar-container .yui-push-button .first-child,.yui-skin-sam .yui-toolbar-container .yui-color-button .first-child,.yui-skin-sam .yui-toolbar-container .yui-menu-button .first-child{border-color:#808080;border-style:solid;border-width:0 1px;margin:0 -1px;display:block;position:relative;}.yui-skin-sam .yui-toolbar-container .yui-push-button-disabled .first-child,.yui-skin-sam .yui-toolbar-container .yui-color-button-disabled .first-child,.yui-skin-sam .yui-toolbar-container .yui-menu-button-disabled .first-child{border-color:#ccc;}.yui-skin-sam .yui-toolbar-container .yui-push-button-disabled a,.yui-skin-sam .yui-toolbar-container .yui-color-button-disabled a,.yui-skin-sam .yui-toolbar-container .yui-menu-button-disabled a{color:#A6A6A6;cursor:default;}.yui-skin-sam .yui-toolbar-container .yui-push-button-disabled,.yui-skin-sam .yui-toolbar-container .yui-color-button-disabled,.yui-skin-sam .yui-toolbar-container .yui-menu-button-disabled{border-color:#ccc;}.yui-skin-sam .yui-toolbar-container .yui-button .first-child{*left:0px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-fontname{width:135px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-heading{width:92px;}.yui-skin-sam .yui-toolbar-container .yui-button-hover{background:url(sprite.png) repeat-x 0 -1300px;border-color:#808080;}.yui-skin-sam .yui-toolbar-container .yui-button-selected{background:url(sprite.png) repeat-x 0 -1700px;border-color:#808080;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-nogrouplabels h3{display:none;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-nogrouplabels .yui-toolbar-group{margin-top:.75em;}.yui-skin-sam .yui-toolbar-container .yui-push-button span.yui-toolbar-icon,.yui-skin-sam .yui-toolbar-container .yui-color-button span.yui-toolbar-icon,.yui-skin-sam .yui-toolbar-container .yui-menu-button span.yui-toolbar-icon{display:block;position:absolute;top:2px;height:18px;width:18px;overflow:hidden;background:url(editor-sprite.gif) no-repeat 30px 30px;}.yui-skin-sam .yui-toolbar-container .yui-button-selected span.yui-toolbar-icon,.yui-skin-sam .yui-toolbar-container .yui-button-hover span.yui-toolbar-icon{background-image:url(editor-sprite-active.gif);}.yui-skin-sam .yui-toolbar-container .visible .yuimenuitemlabel{cursor:pointer;color:#000;*position:relative;}.yui-skin-sam .yui-toolbar-container .yui-button-menu{background-color:#fff;}.yui-skin-sam .yui-toolbar-container .yui-button-menu .yui-menu-body-scrolled{position:relative;}.yui-skin-sam div.yuimenu li.selected{background-color:#B3D4FF;}.yui-skin-sam div.yuimenu li.selected a.selected{color:#000;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-bold span.yui-toolbar-icon{background-position:0 0;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-strikethrough span.yui-toolbar-icon{background-position:0 -108px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-italic span.yui-toolbar-icon{background-position:0 -36px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-undo span.yui-toolbar-icon{background-position:0 -1326px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-redo span.yui-toolbar-icon{background-position:0 -1355px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-underline span.yui-toolbar-icon{background-position:0 -72px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-subscript span.yui-toolbar-icon{background-position:0 -180px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-superscript span.yui-toolbar-icon{background-position:0 -144px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-forecolor span.yui-toolbar-icon{background-position:0 -216px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-backcolor span.yui-toolbar-icon{background-position:0 -288px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-justifyleft span.yui-toolbar-icon{background-position:0 -324px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-justifycenter span.yui-toolbar-icon{background-position:0 -360px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-justifyright span.yui-toolbar-icon{background-position:0 -396px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-justifyfull span.yui-toolbar-icon{background-position:0 -432px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-indent span.yui-toolbar-icon{background-position:0 -720px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-outdent span.yui-toolbar-icon{background-position:0 -684px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-createlink span.yui-toolbar-icon{background-position:0 -792px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-insertimage span.yui-toolbar-icon{background-position:1px -756px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-left span.yui-toolbar-icon{background-position:0 -972px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-right span.yui-toolbar-icon{background-position:0 -936px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-inline span.yui-toolbar-icon{background-position:0 -900px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-block span.yui-toolbar-icon{background-position:0 -864px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-bordercolor span.yui-toolbar-icon{background-position:0 -252px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-removeformat span.yui-toolbar-icon{background-position:0 -1080px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-hiddenelements span.yui-toolbar-icon{background-position:0 -1044px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-insertunorderedlist span.yui-toolbar-icon{background-position:0 -468px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-insertorderedlist span.yui-toolbar-icon{background-position:0 -504px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-spinbutton,.yui-skin-sam .yui-toolbar-container .yui-toolbar-spinbutton .first-child{width:35px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-spinbutton .first-child a{padding-left:2px;text-align:left;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-spinbutton span.yui-toolbar-icon{display:none;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-spinbutton a.up,.yui-skin-sam .yui-toolbar-container .yui-toolbar-spinbutton a.down{right:2px;background:url(editor-sprite.gif) no-repeat 0 -1222px;overflow:hidden;height:6px;width:7px;min-height:0;padding:0;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-spinbutton a.up{top:2px;background-position:0 -1222px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-spinbutton a.down{bottom:2px;background-position:0 -1187px;}.yui-skin-sam .yui-toolbar-container select{height:22px;border:1px solid #808080;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-select .first-child a{padding-left:5px;text-align:left;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-select span.yui-toolbar-icon{background:url( editor-sprite.gif ) no-repeat 0 -1144px;overflow:hidden;right:-2px;top:0px;height:20px;}.yui-skin-sam .yui-editor-panel .yui-color-button-menu .bd{background-color:transparent;border:none;width:135px;}.yui-skin-sam .yui-color-button-menu .yui-toolbar-colors{border:1px solid #808080;}.yui-skin-sam .yui-editor-panel{padding:0;margin:0;border:none;background-color:transparent;overflow:visible;position:absolute;}.yui-skin-sam .yui-editor-panel .hd{margin:10px 0 0;padding:0;border:none;}.yui-skin-sam .yui-editor-panel .hd h3{color:#000;border:1px solid #808080;background:url(sprite.png) repeat-x 0 -200px;width:99%;position:relative;margin:0;padding:3px 0 0 0;font-size:93%;text-indent:5px;height:20px;}.yui-skin-sam .yui-editor-panel .bd{background-color:#F2F2F2;border-left:1px solid #808080;border-right:1px solid #808080;width:99%;margin:0;padding:0;overflow:visible;}.yui-skin-sam .yui-editor-panel ul{list-style-type:none;margin:0;padding:0;}.yui-skin-sam .yui-editor-panel ul li{margin:0;padding:0;}.yui-skin-sam .yui-editor-panel .yuimenu{}.yui-skin-sam .yui-editor-panel .yui-toolbar-container .yui-toolbar-subcont{padding:0;border:none;margin-top:0.35em;}.yui-skin-sam .yui-editor-panel .yui-toolbar-bordersize,.yui-skin-sam .yui-editor-panel .yui-toolbar-bordertype{width:50px;}.yui-skin-sam .yui-editor-panel label{display:block;float:none;padding:4px 0;margin-bottom:7px;}.yui-skin-sam .yui-editor-panel label strong{font-weight:normal;font-size:93%;text-align:right;padding-top:2px;}.yui-skin-sam .yui-editor-panel label input{width:75%;}.yui-skin-sam .yui-editor-panel .createlink_target,.yui-skin-sam .yui-editor-panel .insertimage_target{width:auto;margin-right:5px;}.yui-skin-sam .yui-editor-panel .removeLink{width:98%;}.yui-skin-sam .yui-editor-panel label input.warning{background-color:#FFEE69;}.yui-skin-sam .yui-editor-panel .yui-toolbar-group h3{color:#000;float:left;font-weight:normal;font-size:93%;margin:5px 0 0 0;padding:0 3px 0 0;text-align:right;}.yui-skin-sam .yui-editor-panel .height-width h3{margin:3px 0 0 10px;}.yui-skin-sam .yui-editor-panel .height-width{margin:3px 0 0 35px;*margin-left:14px;width:42%;*width:44%;}.yui-skin-sam .yui-editor-panel .yui-toolbar-group-border{width:190px;}.yui-skin-sam .yui-editor-panel .no-button .yui-toolbar-group-border{width:210px;}.yui-skin-sam .yui-editor-panel .yui-toolbar-group-padding{width:203px;_width:198px;}.yui-skin-sam .yui-editor-panel .no-button .yui-toolbar-group-padding{width:172px;}.yui-skin-sam .yui-editor-panel .yui-toolbar-group-padding h3{margin-left:25px;*margin-left:12px;}.yui-skin-sam .yui-editor-panel .yui-toolbar-group-textflow{width:182px;}.yui-skin-sam .yui-editor-panel .hd{background:none;}.yui-skin-sam .yui-editor-panel .ft{background-color:#F2F2F2;border:1px solid #808080;border-top:none;padding:0;margin:0 0 2px 0;}.yui-skin-sam .yui-editor-panel .hd span.close{background:url(sprite.png) no-repeat 0 -300px;cursor:pointer;display:block;height:16px;overflow:hidden;position:absolute;right:5px;text-indent:500px;top:2px;width:26px;}.yui-skin-sam .yui-editor-panel .ft span.tip{background-color:#EDF5FF;border-top:1px solid #808080;font-size:85%;}.yui-skin-sam .yui-editor-panel .ft span.tip strong{display:block;float:left;margin:0 2px 8px 0;}.yui-skin-sam .yui-editor-panel .ft span.tip span.icon{background:url( editor-sprite.gif ) no-repeat 0 -1260px;display:block;height:20px;left:2px;position:absolute;top:8px;width:20px;}.yui-skin-sam .yui-editor-panel .ft span.tip span.icon-info{background-position:2px -1260px;}.yui-skin-sam .yui-editor-panel .ft span.tip span.icon-warn{background-position:2px -1296px;}.yui-skin-sam .yui-editor-panel .hd span.knob{position:absolute;height:10px;width:28px;top:-10px;left:25px;text-indent:9999px;overflow:hidden;background:url( editor-knob.gif ) no-repeat 0 0;}.yui-skin-sam .yui-editor-panel .yui-toolbar-container{float:left;width:100%;background-image:none;border:none;}.yui-skin-sam .yui-editor-panel .yui-toolbar-container .bd{background-color:#ffffff;}.yui-editor-blankimage{background-image:url( blankimage.png );}.yui-skin-sam .yui-editor-container .yui-resize-handle-br{height:11px;width:11px;background-position:-20px -60px;background-color:transparent;} diff --git a/webdir/javascript/yui/assets/skins/sam/header_background.png b/webdir/javascript/yui/assets/skins/sam/header_background.png new file mode 100644 index 0000000..3ef7909 Binary files /dev/null and b/webdir/javascript/yui/assets/skins/sam/header_background.png differ diff --git a/webdir/javascript/yui/assets/skins/sam/hue_bg.png b/webdir/javascript/yui/assets/skins/sam/hue_bg.png new file mode 100644 index 0000000..d9bcdeb Binary files /dev/null and b/webdir/javascript/yui/assets/skins/sam/hue_bg.png differ diff --git a/webdir/javascript/yui/assets/skins/sam/imagecropper.css b/webdir/javascript/yui/assets/skins/sam/imagecropper.css new file mode 100644 index 0000000..73d3216 --- /dev/null +++ b/webdir/javascript/yui/assets/skins/sam/imagecropper.css @@ -0,0 +1,7 @@ +/* +Copyright (c) 2008, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.6.0 +*/ +.yui-crop{position:relative;}.yui-crop .yui-crop-mask{position:absolute;top:0;left:0;height:100%;width:100%;}.yui-crop .yui-resize{position:absolute;top:10px;left:10px;border:0;}.yui-crop .yui-crop-resize-mask{position:absolute;top:0;left:0;height:100%;width:100%;background-position:-10px -10px;overflow:hidden;}.yui-skin-sam .yui-crop .yui-crop-mask{background-color:#000;opacity:.5;filter:alpha(opacity=50);}.yui-skin-sam .yui-crop .yui-resize{border:1px dashed #fff;} diff --git a/webdir/javascript/yui/assets/skins/sam/layout.css b/webdir/javascript/yui/assets/skins/sam/layout.css new file mode 100644 index 0000000..d4c1fe3 --- /dev/null +++ b/webdir/javascript/yui/assets/skins/sam/layout.css @@ -0,0 +1,7 @@ +/* +Copyright (c) 2008, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.6.0 +*/ +.yui-layout-loading{visibility:hidden;}body.yui-layout{overflow:hidden;position:relative;padding:0;margin:0;}.yui-layout-doc{position:relative;overflow:hidden;padding:0;margin:0;}.yui-layout-unit{height:50px;width:50px;padding:0;margin:0;float:none;z-index:0;}.yui-layout-unit-top{position:absolute;top:0;left:0;width:100%;}.yui-layout-unit-left{position:absolute;top:0;left:0;}.yui-layout-unit-right{position:absolute;top:0;right:0;}.yui-layout-unit-bottom{position:absolute;bottom:0;left:0;width:100%;}.yui-layout-unit-center{position:absolute;top:0;left:0;width:100%;}.yui-layout div.yui-layout-hd{position:absolute;top:0;left:0;zoom:1;width:100%;}.yui-layout div.yui-layout-bd{position:absolute;top:0;left:0;zoom:1;width:100%;}.yui-layout .yui-layout-noscroll div.yui-layout-bd{overflow:hidden;}.yui-layout .yui-layout-scroll div.yui-layout-bd{overflow:auto;}.yui-layout div.yui-layout-ft{position:absolute;bottom:0;left:0;width:100%;zoom:1;}.yui-layout .yui-layout-unit div.yui-layout-hd h2{text-align:left;}.yui-layout .yui-layout-unit div.yui-layout-hd .collapse{cursor:pointer;height:13px;position:absolute;right:2px;top:2px;width:17px;font-size:0;}.yui-layout .yui-layout-unit div.yui-layout-hd .close{cursor:pointer;height:13px;position:absolute;right:2px;top:2px;width:17px;font-size:0;}.yui-layout .yui-layout-unit div.yui-layout-hd .collapse-close{right:25px;}.yui-layout .yui-layout-clip{position:absolute;height:20px;background-color:#c0c0c0;display:none;}.yui-layout .yui-layout-clip .collapse{cursor:pointer;height:13px;position:absolute;right:2px;top:2px;width:17px;font-size:0px;}.yui-layout .yui-layout-wrap{height:100%;width:100%;position:absolute;left:0;}.yui-skin-sam .yui-layout .yui-resize-proxy{border:none;font-size:0;margin:0;padding:0;}.yui-skin-sam .yui-layout .yui-resize-resizing .yui-resize-handle{visibility:hidden;}.yui-skin-sam .yui-layout .yui-resize-proxy div{position:absolute;border:1px solid #808080;background-color:#EDF5FF;}.yui-skin-sam .yui-layout .yui-resize .yui-resize-handle-active{}.yui-skin-sam .yui-layout .yui-resize-proxy .yui-layout-handle-l{width:5px;height:100%;top:0;left:0;}.yui-skin-sam .yui-layout .yui-resize-proxy .yui-layout-handle-r{width:5px;top:0;right:0;height:100%;position:absolute;zoom:1;}.yui-skin-sam .yui-layout .yui-resize-proxy .yui-layout-handle-b{width:100%;bottom:0;left:0;height:5px;}.yui-skin-sam .yui-layout .yui-resize-proxy .yui-layout-handle-t{width:100%;top:0;left:0;height:5px;}.yui-skin-sam .yui-layout .yui-layout-unit-left div.yui-layout-hd .collapse{background:transparent url(layout_sprite.png) no-repeat -20px -160px;border:1px solid #808080;}.yui-skin-sam .yui-layout .yui-layout-clip-left .collapse{background:transparent url(layout_sprite.png) no-repeat -20px -140px;border:1px solid #808080;}.yui-skin-sam .yui-layout .yui-layout-unit-right div.yui-layout-hd .collapse{background:transparent url(layout_sprite.png) no-repeat -20px -200px;border:1px solid #808080;}.yui-skin-sam .yui-layout .yui-layout-clip-right .collapse{background:transparent url(layout_sprite.png) no-repeat -20px -120px;border:1px solid #808080;}.yui-skin-sam .yui-layout .yui-layout-unit-top div.yui-layout-hd .collapse{background:transparent url(layout_sprite.png) no-repeat -20px -220px;border:1px solid #808080;}.yui-skin-sam .yui-layout .yui-layout-clip-top .collapse{background:transparent url(layout_sprite.png) no-repeat -20px -240px;border:1px solid #808080;}.yui-skin-sam .yui-layout .yui-layout-unit-bottom div.yui-layout-hd .collapse{background:transparent url(layout_sprite.png) no-repeat -20px -260px;border:1px solid #808080;}.yui-skin-sam .yui-layout .yui-layout-clip-bottom .collapse{background:transparent url(layout_sprite.png) no-repeat -20px -180px;border:1px solid #808080;}.yui-skin-sam .yui-layout .yui-layout-unit div.yui-layout-hd .close{background:transparent url(layout_sprite.png) no-repeat -20px -100px;border:1px solid #808080;}.yui-skin-sam .yui-layout .yui-layout-hd{background:url(sprite.png) repeat-x 0 -1400px;border:1px solid #808080;}.yui-skin-sam .yui-layout{background-color:#EDF5FF;}.yui-skin-sam .yui-layout .yui-layout-unit div.yui-layout-hd h2{font-weight:bold;color:#fff;padding:3px;}.yui-skin-sam .yui-layout .yui-layout-unit div.yui-layout-bd{border:1px solid #808080;border-bottom:none;border-top:none;*border-bottom-width:0;*border-top-width:0;background-color:#f2f2f2;text-align:left;}.yui-skin-sam .yui-layout .yui-layout-unit div.yui-layout-bd-noft{border-bottom:1px solid #808080;}.yui-skin-sam .yui-layout .yui-layout-unit div.yui-layout-bd-nohd{border-top:1px solid #808080;}.yui-skin-sam .yui-layout .yui-layout-clip{position:absolute;height:20px;background-color:#EDF5FF;display:none;border:1px solid #808080;}.yui-skin-sam .yui-layout div.yui-layout-ft{border:1px solid #808080;border-top:none;*border-top-width:0;background-color:#f2f2f2;}.yui-skin-sam .yui-layout-unit .yui-resize-handle{background-color:transparent;}.yui-skin-sam .yui-layout-unit .yui-resize-handle-r{right:0;top:0;background-image:none;}.yui-skin-sam .yui-layout-unit .yui-resize-handle-l{left:0;top:0;background-image:none;}.yui-skin-sam .yui-layout-unit .yui-resize-handle-b{right:0;bottom:0;background-image:none;}.yui-skin-sam .yui-layout-unit .yui-resize-handle-t{right:0;top:0;background-image:none;}.yui-skin-sam .yui-layout-unit .yui-resize-handle-r .yui-layout-resize-knob,.yui-skin-sam .yui-layout-unit .yui-resize-handle-l .yui-layout-resize-knob{position:absolute;height:16px;width:6px;top:45%;left:0px;background:transparent url(layout_sprite.png) no-repeat 0 -5px;}.yui-skin-sam .yui-layout-unit .yui-resize-handle-t .yui-layout-resize-knob,.yui-skin-sam .yui-layout-unit .yui-resize-handle-b .yui-layout-resize-knob{position:absolute;height:6px;width:16px;left:45%;background:transparent url(layout_sprite.png) no-repeat -20px 0;} diff --git a/webdir/javascript/yui/assets/skins/sam/layout_sprite.png b/webdir/javascript/yui/assets/skins/sam/layout_sprite.png new file mode 100644 index 0000000..d6fce3c Binary files /dev/null and b/webdir/javascript/yui/assets/skins/sam/layout_sprite.png differ diff --git a/webdir/javascript/yui/assets/skins/sam/loading.gif b/webdir/javascript/yui/assets/skins/sam/loading.gif new file mode 100644 index 0000000..0bbf3bc Binary files /dev/null and b/webdir/javascript/yui/assets/skins/sam/loading.gif differ diff --git a/webdir/javascript/yui/assets/skins/sam/logger.css b/webdir/javascript/yui/assets/skins/sam/logger.css new file mode 100644 index 0000000..f145cf8 --- /dev/null +++ b/webdir/javascript/yui/assets/skins/sam/logger.css @@ -0,0 +1,7 @@ +/* +Copyright (c) 2008, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.6.0 +*/ +.yui-skin-sam .yui-log{padding:1em;width:31em;background-color:#AAA;color:#000;border:1px solid black;font-family:monospace;font-size:77%;text-align:left;z-index:9000;}.yui-skin-sam .yui-log-container{position:absolute;top:1em;right:1em;}.yui-skin-sam .yui-log input{margin:0;padding:0;font-family:arial;font-size:100%;font-weight:normal;}.yui-skin-sam .yui-log .yui-log-btns{position:relative;float:right;bottom:.25em;}.yui-skin-sam .yui-log .yui-log-hd{margin-top:1em;padding:.5em;background-color:#575757;}.yui-skin-sam .yui-log .yui-log-hd h4{margin:0;padding:0;font-size:108%;font-weight:bold;color:#FFF;}.yui-skin-sam .yui-log .yui-log-bd{width:100%;height:20em;background-color:#FFF;border:1px solid gray;overflow:auto;}.yui-skin-sam .yui-log p{margin:1px;padding:.1em;}.yui-skin-sam .yui-log pre{margin:0;padding:0;}.yui-skin-sam .yui-log pre.yui-log-verbose{white-space:pre-wrap;white-space:-moz-pre-wrap !important;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word;}.yui-skin-sam .yui-log .yui-log-ft{margin-top:.5em;}.yui-skin-sam .yui-log .yui-log-ft .yui-log-categoryfilters{}.yui-skin-sam .yui-log .yui-log-ft .yui-log-sourcefilters{width:100%;border-top:1px solid #575757;margin-top:.75em;padding-top:.75em;}.yui-skin-sam .yui-log .yui-log-filtergrp{margin-right:.5em;}.yui-skin-sam .yui-log .info{background-color:#A7CC25;}.yui-skin-sam .yui-log .warn{background-color:#F58516;}.yui-skin-sam .yui-log .error{background-color:#E32F0B;}.yui-skin-sam .yui-log .time{background-color:#A6C9D7;}.yui-skin-sam .yui-log .window{background-color:#F2E886;} diff --git a/webdir/javascript/yui/assets/skins/sam/menu-button-arrow-disabled.png b/webdir/javascript/yui/assets/skins/sam/menu-button-arrow-disabled.png new file mode 100644 index 0000000..8cef2ab Binary files /dev/null and b/webdir/javascript/yui/assets/skins/sam/menu-button-arrow-disabled.png differ diff --git a/webdir/javascript/yui/assets/skins/sam/menu-button-arrow.png b/webdir/javascript/yui/assets/skins/sam/menu-button-arrow.png new file mode 100644 index 0000000..f03dfee Binary files /dev/null and b/webdir/javascript/yui/assets/skins/sam/menu-button-arrow.png differ diff --git a/webdir/javascript/yui/assets/skins/sam/menu.css b/webdir/javascript/yui/assets/skins/sam/menu.css new file mode 100644 index 0000000..ba0e8f3 --- /dev/null +++ b/webdir/javascript/yui/assets/skins/sam/menu.css @@ -0,0 +1,7 @@ +/* +Copyright (c) 2008, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.6.0 +*/ +.yuimenu{top:-999em;left:-999em;}.yuimenubar{position:static;}.yuimenu .yuimenu,.yuimenubar .yuimenu{position:absolute;}.yuimenubar li,.yuimenu li{list-style-type:none;}.yuimenubar ul,.yuimenu ul,.yuimenubar li,.yuimenu li,.yuimenu h6,.yuimenubar h6{margin:0;padding:0;}.yuimenuitemlabel,.yuimenubaritemlabel{text-align:left;white-space:nowrap;}.yuimenubar ul{*zoom:1;}.yuimenubar .yuimenu ul{*zoom:normal;}.yuimenubar>.bd>ul:after{content:".";display:block;clear:both;visibility:hidden;height:0;line-height:0;}.yuimenubaritem{float:left;}.yuimenubaritemlabel,.yuimenuitemlabel{display:block;}.yuimenuitemlabel .helptext{font-style:normal;display:block;margin:-1em 0 0 10em;}.yui-menu-shadow{position:absolute;visibility:hidden;z-index:-1;}.yui-menu-shadow-visible{top:2px;right:-3px;left:-3px;bottom:-3px;visibility:visible;}.hide-scrollbars *{overflow:hidden;}.hide-scrollbars select{display:none;}.yuimenu.show-scrollbars,.yuimenubar.show-scrollbars{overflow:visible;}.yuimenu.hide-scrollbars .yui-menu-shadow,.yuimenubar.hide-scrollbars .yui-menu-shadow{overflow:hidden;}.yuimenu.show-scrollbars .yui-menu-shadow,.yuimenubar.show-scrollbars .yui-menu-shadow{overflow:auto;}.yui-skin-sam .yuimenubar{font-size:93%;line-height:2;*line-height:1.9;border:solid 1px #808080;background:url(sprite.png) repeat-x 0 0;}.yui-skin-sam .yuimenubarnav .yuimenubaritem{border-right:solid 1px #ccc;}.yui-skin-sam .yuimenubaritemlabel{padding:0 10px;color:#000;text-decoration:none;cursor:default;border-style:solid;border-color:#808080;border-width:1px 0;*position:relative;margin:-1px 0;}.yui-skin-sam .yuimenubarnav .yuimenubaritemlabel{padding-right:20px;*display:inline-block;}.yui-skin-sam .yuimenubarnav .yuimenubaritemlabel-hassubmenu{background:url(menubaritem_submenuindicator.png) right center no-repeat;}.yui-skin-sam .yuimenubaritem-selected{background:url(sprite.png) repeat-x 0 -1700px;}.yui-skin-sam .yuimenubaritemlabel-selected{border-color:#7D98B8;}.yui-skin-sam .yuimenubarnav .yuimenubaritemlabel-selected{border-left-width:1px;margin-left:-1px;*left:-1px;}.yui-skin-sam .yuimenubaritemlabel-disabled{cursor:default;color:#A6A6A6;}.yui-skin-sam .yuimenubarnav .yuimenubaritemlabel-hassubmenu-disabled{background-image:url(menubaritem_submenuindicator_disabled.png);}.yui-skin-sam .yuimenu{font-size:93%;line-height:1.5;*line-height:1.45;}.yui-skin-sam .yuimenubar .yuimenu,.yui-skin-sam .yuimenu .yuimenu{font-size:100%;}.yui-skin-sam .yuimenu .bd{*zoom:1;_zoom:normal;border:solid 1px #808080;background-color:#fff;}.yui-skin-sam .yuimenu .yuimenu .bd{*zoom:normal;}.yui-skin-sam .yuimenu ul{padding:3px 0;border-width:1px 0 0 0;border-color:#ccc;border-style:solid;}.yui-skin-sam .yuimenu ul.first-of-type{border-width:0;}.yui-skin-sam .yuimenu h6{font-weight:bold;border-style:solid;border-color:#ccc;border-width:1px 0 0 0;color:#a4a4a4;padding:3px 10px 0 10px;}.yui-skin-sam .yuimenu ul.hastitle,.yui-skin-sam .yuimenu h6.first-of-type{border-width:0;}.yui-skin-sam .yuimenu .yui-menu-body-scrolled{border-color:#ccc #808080;overflow:hidden;}.yui-skin-sam .yuimenu .topscrollbar,.yui-skin-sam .yuimenu .bottomscrollbar{height:16px;border:solid 1px #808080;background:#fff url(sprite.png) no-repeat 0 0;}.yui-skin-sam .yuimenu .topscrollbar{border-bottom-width:0;background-position:center -950px;}.yui-skin-sam .yuimenu .topscrollbar_disabled{background-position:center -975px;}.yui-skin-sam .yuimenu .bottomscrollbar{border-top-width:0;background-position:center -850px;}.yui-skin-sam .yuimenu .bottomscrollbar_disabled{background-position:center -875px;}.yui-skin-sam .yuimenuitem{_border-bottom:solid 1px #fff;}.yui-skin-sam .yuimenuitemlabel{padding:0 20px;color:#000;text-decoration:none;cursor:default;}.yui-skin-sam .yuimenuitemlabel .helptext{margin-top:-1.5em;*margin-top:-1.45em;}.yui-skin-sam .yuimenuitem-hassubmenu{background-image:url(menuitem_submenuindicator.png);background-position:right center;background-repeat:no-repeat;}.yui-skin-sam .yuimenuitem-checked{background-image:url(menuitem_checkbox.png);background-position:left center;background-repeat:no-repeat;}.yui-skin-sam .yui-menu-shadow-visible{background-color:#000;opacity:.12;*filter:alpha(opacity=12);}.yui-skin-sam .yuimenuitem-selected{background-color:#B3D4FF;}.yui-skin-sam .yuimenuitemlabel-disabled{cursor:default;color:#A6A6A6;}.yui-skin-sam .yuimenuitem-hassubmenu-disabled{background-image:url(menuitem_submenuindicator_disabled.png);}.yui-skin-sam .yuimenuitem-checked-disabled{background-image:url(menuitem_checkbox_disabled.png);} diff --git a/webdir/javascript/yui/assets/skins/sam/menubaritem_submenuindicator.png b/webdir/javascript/yui/assets/skins/sam/menubaritem_submenuindicator.png new file mode 100644 index 0000000..030941c Binary files /dev/null and b/webdir/javascript/yui/assets/skins/sam/menubaritem_submenuindicator.png differ diff --git a/webdir/javascript/yui/assets/skins/sam/menubaritem_submenuindicator_disabled.png b/webdir/javascript/yui/assets/skins/sam/menubaritem_submenuindicator_disabled.png new file mode 100644 index 0000000..6c16122 Binary files /dev/null and b/webdir/javascript/yui/assets/skins/sam/menubaritem_submenuindicator_disabled.png differ diff --git a/webdir/javascript/yui/assets/skins/sam/menuitem_checkbox.png b/webdir/javascript/yui/assets/skins/sam/menuitem_checkbox.png new file mode 100644 index 0000000..1437a4f Binary files /dev/null and b/webdir/javascript/yui/assets/skins/sam/menuitem_checkbox.png differ diff --git a/webdir/javascript/yui/assets/skins/sam/menuitem_checkbox_disabled.png b/webdir/javascript/yui/assets/skins/sam/menuitem_checkbox_disabled.png new file mode 100644 index 0000000..5d5b998 Binary files /dev/null and b/webdir/javascript/yui/assets/skins/sam/menuitem_checkbox_disabled.png differ diff --git a/webdir/javascript/yui/assets/skins/sam/menuitem_submenuindicator.png b/webdir/javascript/yui/assets/skins/sam/menuitem_submenuindicator.png new file mode 100644 index 0000000..ea4f660 Binary files /dev/null and b/webdir/javascript/yui/assets/skins/sam/menuitem_submenuindicator.png differ diff --git a/webdir/javascript/yui/assets/skins/sam/menuitem_submenuindicator_disabled.png b/webdir/javascript/yui/assets/skins/sam/menuitem_submenuindicator_disabled.png new file mode 100644 index 0000000..427d60a Binary files /dev/null and b/webdir/javascript/yui/assets/skins/sam/menuitem_submenuindicator_disabled.png differ diff --git a/webdir/javascript/yui/assets/skins/sam/paginator.css b/webdir/javascript/yui/assets/skins/sam/paginator.css new file mode 100644 index 0000000..fab4258 --- /dev/null +++ b/webdir/javascript/yui/assets/skins/sam/paginator.css @@ -0,0 +1,7 @@ +/* +Copyright (c) 2008, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.6.0 +*/ +.yui-skin-sam .yui-pg-container{display:block;margin:6px 0;white-space:nowrap;}.yui-skin-sam .yui-pg-first,.yui-skin-sam .yui-pg-previous,.yui-skin-sam .yui-pg-next,.yui-skin-sam .yui-pg-last,.yui-skin-sam .yui-pg-current,.yui-skin-sam .yui-pg-pages,.yui-skin-sam .yui-pg-page{display:inline-block;font-family:arial,helvetica,clean,sans-serif;padding:3px 6px;zoom:1;}.yui-skin-sam .yui-pg-pages{padding:0;}.yui-skin-sam .yui-pg-current{padding:3px 0;}.yui-skin-sam a.yui-pg-first:link,.yui-skin-sam a.yui-pg-first:visited,.yui-skin-sam a.yui-pg-first:active,.yui-skin-sam a.yui-pg-first:hover,.yui-skin-sam a.yui-pg-previous:link,.yui-skin-sam a.yui-pg-previous:visited,.yui-skin-sam a.yui-pg-previous:active,.yui-skin-sam a.yui-pg-previous:hover,.yui-skin-sam a.yui-pg-next:link,.yui-skin-sam a.yui-pg-next:visited,.yui-skin-sam a.yui-pg-next:active,.yui-skin-sam a.yui-pg-next:hover,.yui-skin-sam a.yui-pg-last:link,.yui-skin-sam a.yui-pg-last:visited,.yui-skin-sam a.yui-pg-last:active,.yui-skin-sam a.yui-pg-last:hover,.yui-skin-sam a.yui-pg-page:link,.yui-skin-sam a.yui-pg-page:visited,.yui-skin-sam a.yui-pg-page:active,.yui-skin-sam a.yui-pg-page:hover{color:#06c;text-decoration:underline;outline:0;}.yui-skin-sam span.yui-pg-first,.yui-skin-sam span.yui-pg-previous,.yui-skin-sam span.yui-pg-next,.yui-skin-sam span.yui-pg-last{color:#a6a6a6;}.yui-skin-sam .yui-pg-page{background-color:#fff;border:1px solid #CBCBCB;padding:2px 6px;text-decoration:none;}.yui-skin-sam .yui-pg-current-page{background-color:transparent;border:none;font-weight:bold;padding:3px 6px;}.yui-skin-sam .yui-pg-page{margin-left:1px;margin-right:1px;}.yui-skin-sam .yui-pg-first,.yui-skin-sam .yui-pg-previous{padding-left:0;}.yui-skin-sam .yui-pg-next,.yui-skin-sam .yui-pg-last{padding-right:0;}.yui-skin-sam .yui-pg-current,.yui-skin-sam .yui-pg-rpp-options{margin-left:1em;margin-right:1em;} diff --git a/webdir/javascript/yui/assets/skins/sam/picker_mask.png b/webdir/javascript/yui/assets/skins/sam/picker_mask.png new file mode 100644 index 0000000..f8d9193 Binary files /dev/null and b/webdir/javascript/yui/assets/skins/sam/picker_mask.png differ diff --git a/webdir/javascript/yui/assets/skins/sam/profilerviewer.css b/webdir/javascript/yui/assets/skins/sam/profilerviewer.css new file mode 100644 index 0000000..8305335 --- /dev/null +++ b/webdir/javascript/yui/assets/skins/sam/profilerviewer.css @@ -0,0 +1,7 @@ +/* +Copyright (c) 2008, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.6.0 +*/ +.yui-skin-sam .yui-pv{background-color:#4a4a4a;font:arial;position:relative;width:99%;z-index:1000;margin-bottom:1em;overflow:hidden;}.yui-skin-sam .yui-pv .hd{background:url(header_background.png) repeat-x;min-height:30px;overflow:hidden;zoom:1;padding:2px 0;}.yui-skin-sam .yui-pv .hd h4{padding:8px 10px;margin:0;font:bold 14px arial;color:#fff;}.yui-skin-sam .yui-pv .hd a{background:#3f6bc3;font:bold 11px arial;color:#fff;padding:4px;margin:3px 10px 0 0;border:1px solid #3f567d;cursor:pointer;display:block;float:right;}.yui-skin-sam .yui-pv .hd span{display:none;}.yui-skin-sam .yui-pv .hd span.yui-pv-busy{height:18px;width:18px;background:url(wait.gif) no-repeat;overflow:hidden;display:block;float:right;margin:4px 10px 0 0;}.yui-skin-sam .yui-pv .hd:after,.yui-pv .bd:after,.yui-skin-sam .yui-pv-chartlegend dl:after{content:'.';visibility:hidden;clear:left;height:0;display:block;}.yui-skin-sam .yui-pv .bd{position:relative;zoom:1;overflow-x:auto;overflow-y:hidden;}.yui-skin-sam .yui-pv .yui-pv-table{padding:0 10px;margin:5px 0 10px 0;}.yui-skin-sam .yui-pv .yui-pv-table .yui-dt-bd td{color:#eeee5c;font:12px arial;}.yui-skin-sam .yui-pv .yui-pv-table tr.yui-dt-odd{background:#929292;}.yui-skin-sam .yui-pv .yui-pv-table tr.yui-dt-even{background:#58637a;}.yui-skin-sam .yui-pv .yui-pv-table tr.yui-dt-even td.yui-dt-asc,.yui-skin-sam .yui-pv .yui-pv-table tr.yui-dt-even td.yui-dt-desc{background:#384970;}.yui-skin-sam .yui-pv .yui-pv-table tr.yui-dt-odd td.yui-dt-asc,.yui-skin-sam .yui-pv .yui-pv-table tr.yui-dt-odd td.yui-dt-desc{background:#6F6E6E;}.yui-skin-sam .yui-pv .yui-pv-table .yui-dt-hd th{background-image:none;background:#2E2D2D;}.yui-skin-sam .yui-pv th.yui-dt-asc .yui-dt-liner{background:transparent url(asc.gif) no-repeat scroll right center;}.yui-skin-sam .yui-pv th.yui-dt-desc .yui-dt-liner{background:transparent url(desc.gif) no-repeat scroll right center;}.yui-skin-sam .yui-pv .yui-pv-table .yui-dt-hd th a{color:#fff;font:bold 12px arial;}.yui-skin-sam .yui-pv .yui-pv-table .yui-dt-hd th.yui-dt-asc,.yui-skin-sam .yui-pv .yui-pv-table .yui-dt-hd th.yui-dt-desc{background:#333;}.yui-skin-sam .yui-pv-chartcontainer{padding:0 10px;}.yui-skin-sam .yui-pv-chart{height:250px;clear:right;margin:5px 0 0 0;color:#fff;}.yui-skin-sam .yui-pv-chartlegend div{float:right;margin:0 0 0 10px;_width:250px;}.yui-skin-sam .yui-pv-chartlegend dl{border:1px solid #999;padding:.2em 0 .2em .5em;zoom:1;margin:5px 0;}.yui-skin-sam .yui-pv-chartlegend dt{float:left;display:block;height:.7em;width:.7em;padding:0;}.yui-skin-sam .yui-pv-chartlegend dd{float:left;display:block;color:#fff;margin:0 1em 0 .5em;padding:0;font:11px arial;}.yui-skin-sam .yui-pv-minimized{height:35px;}.yui-skin-sam .yui-pv-minimized .bd{top:-3000px;}.yui-skin-sam .yui-pv-minimized .hd a.yui-pv-refresh{display:none;} diff --git a/webdir/javascript/yui/assets/skins/sam/resize.css b/webdir/javascript/yui/assets/skins/sam/resize.css new file mode 100644 index 0000000..01e7918 --- /dev/null +++ b/webdir/javascript/yui/assets/skins/sam/resize.css @@ -0,0 +1,7 @@ +/* +Copyright (c) 2008, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.6.0 +*/ +.yui-resize{position:relative;zoom:1;z-index:0;}.yui-resize-wrap{zoom:1;}.yui-draggable{cursor:move;}.yui-resize .yui-resize-handle{position:absolute;z-index:1;font-size:0;margin:0;padding:0;zoom:1;height:1px;width:1px;}.yui-resize .yui-resize-handle-br{height:5px;width:5px;bottom:0;right:0;cursor:se-resize;z-index:2;zoom:1;}.yui-resize .yui-resize-handle-bl{height:5px;width:5px;bottom:0;left:0;cursor:sw-resize;z-index:2;zoom:1;}.yui-resize .yui-resize-handle-tl{height:5px;width:5px;top:0;left:0;cursor:nw-resize;z-index:2;zoom:1;}.yui-resize .yui-resize-handle-tr{height:5px;width:5px;top:0;right:0;cursor:ne-resize;z-index:2;zoom:1;}.yui-resize .yui-resize-handle-r{width:5px;height:100%;top:0;right:0;cursor:e-resize;zoom:1;}.yui-resize .yui-resize-handle-l{height:100%;width:5px;top:0;left:0;cursor:w-resize;zoom:1;}.yui-resize .yui-resize-handle-b{width:100%;height:5px;bottom:0;right:0;cursor:s-resize;zoom:1;}.yui-resize .yui-resize-handle-t{width:100%;height:5px;top:0;right:0;cursor:n-resize;zoom:1;}.yui-resize-proxy{position:absolute;border:1px dashed #000;visibility:hidden;z-index:1000;}.yui-resize-hover .yui-resize-handle,.yui-resize-hidden .yui-resize-handle{opacity:0;filter:alpha(opacity=0);}.yui-resize-ghost{opacity:.5;filter:alpha(opacity=50);}.yui-resize-knob .yui-resize-handle{height:6px;width:6px;}.yui-resize-knob .yui-resize-handle-tr{right:-3px;top:-3px;}.yui-resize-knob .yui-resize-handle-tl{left:-3px;top:-3px;}.yui-resize-knob .yui-resize-handle-bl{left:-3px;bottom:-3px;}.yui-resize-knob .yui-resize-handle-br{right:-3px;bottom:-3px;}.yui-resize-knob .yui-resize-handle-t{left:45%;top:-3px;}.yui-resize-knob .yui-resize-handle-r{right:-3px;top:45%;}.yui-resize-knob .yui-resize-handle-l{left:-3px;top:45%;}.yui-resize-knob .yui-resize-handle-b{left:45%;bottom:-3px;}.yui-resize-status{position:absolute;top:-999px;left:-999px;padding:2px;font-size:80%;display:none;zoom:1;z-index:9999;}.yui-resize-status strong,.yui-resize-status em{font-weight:normal;font-style:normal;padding:1px;zoom:1;}.yui-skin-sam .yui-resize .yui-resize-handle{background-color:#F2F2F2;}.yui-skin-sam .yui-resize .yui-resize-handle-active{background-color:#7D98B8;zoom:1;}.yui-skin-sam .yui-resize .yui-resize-handle-l,.yui-skin-sam .yui-resize .yui-resize-handle-r,.yui-skin-sam .yui-resize .yui-resize-handle-l-active,.yui-skin-sam .yui-resize .yui-resize-handle-r-active{height:100%;}.yui-skin-sam .yui-resize-knob .yui-resize-handle{border:1px solid #808080;}.yui-skin-sam .yui-resize-hover .yui-resize-handle-active{opacity:1;filter:alpha(opacity=100);}.yui-skin-sam .yui-resize-proxy{border:1px dashed #426FD9;}.yui-skin-sam .yui-resize-status{border:1px solid #A6982B;border-top:1px solid #D4C237;background-color:#FFEE69;color:#000;}.yui-skin-sam .yui-resize-status strong,.yui-skin-sam .yui-resize-status em{float:left;display:block;clear:both;padding:1px;text-align:center;}.yui-skin-sam .yui-resize .yui-resize-handle-inner-r,.yui-skin-sam .yui-resize .yui-resize-handle-inner-l{background:transparent url( layout_sprite.png) no-repeat 0 -5px;height:16px;width:5px;position:absolute;top:45%;}.yui-skin-sam .yui-resize .yui-resize-handle-inner-t,.yui-skin-sam .yui-resize .yui-resize-handle-inner-b{background:transparent url(layout_sprite.png) no-repeat -20px 0;height:5px;width:16px;position:absolute;left:50%;}.yui-skin-sam .yui-resize .yui-resize-handle-br{background-image:url( layout_sprite.png );background-repeat:no-repeat;background-position:-22px -62px;}.yui-skin-sam .yui-resize .yui-resize-handle-tr{background-image:url( layout_sprite.png );background-repeat:no-repeat;background-position:-22px -42px;}.yui-skin-sam .yui-resize .yui-resize-handle-tl{background-image:url( layout_sprite.png );background-repeat:no-repeat;background-position:-22px -82px;}.yui-skin-sam .yui-resize .yui-resize-handle-bl{background-image:url( layout_sprite.png );background-repeat:no-repeat;background-position:-22px -23px;}.yui-skin-sam .yui-resize-knob .yui-resize-handle-t,.yui-skin-sam .yui-resize-knob .yui-resize-handle-r,.yui-skin-sam .yui-resize-knob .yui-resize-handle-b,.yui-skin-sam .yui-resize-knob .yui-resize-handle-l,.yui-skin-sam .yui-resize-knob .yui-resize-handle-tl,.yui-skin-sam .yui-resize-knob .yui-resize-handle-tr,.yui-skin-sam .yui-resize-knob .yui-resize-handle-bl,.yui-skin-sam .yui-resize-knob .yui-resize-handle-br,.yui-skin-sam .yui-resize-knob .yui-resize-handle-inner-t,.yui-skin-sam .yui-resize-knob .yui-resize-handle-inner-r,.yui-skin-sam .yui-resize-knob .yui-resize-handle-inner-b,.yui-skin-sam .yui-resize-knob .yui-resize-handle-inner-l,.yui-skin-sam .yui-resize-knob .yui-resize-handle-inner-tl,.yui-skin-sam .yui-resize-knob .yui-resize-handle-inner-tr,.yui-skin-sam .yui-resize-knob .yui-resize-handle-inner-bl,.yui-skin-sam .yui-resize-knob .yui-resize-handle-inner-br{background-image:none;}.yui-skin-sam .yui-resize-knob .yui-resize-handle-l,.yui-skin-sam .yui-resize-knob .yui-resize-handle-r,.yui-skin-sam .yui-resize-knob .yui-resize-handle-l-active,.yui-skin-sam .yui-resize-knob .yui-resize-handle-r-active{height:6px;width:6px;} diff --git a/webdir/javascript/yui/assets/skins/sam/simpleeditor.css b/webdir/javascript/yui/assets/skins/sam/simpleeditor.css new file mode 100644 index 0000000..780c387 --- /dev/null +++ b/webdir/javascript/yui/assets/skins/sam/simpleeditor.css @@ -0,0 +1,7 @@ +/* +Copyright (c) 2008, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.6.0 +*/ +.yui-busy{cursor:wait !important;}.yui-toolbar-container fieldset{padding:0;margin:0;border:0;}.yui-toolbar-container legend{display:none;}.yui-toolbar-container .yui-toolbar-subcont{padding:.25em 0;zoom:1;}.yui-toolbar-container-collapsed .yui-toolbar-subcont{display:none;}.yui-toolbar-container .yui-toolbar-subcont:after{display:block;clear:both;visibility:hidden;content:'.';height:0;}.yui-toolbar-container span.yui-toolbar-draghandle{cursor:move;border-left:1px solid #999;border-right:1px solid #999;overflow:hidden;text-indent:77777px;width:2px;height:20px;display:block;clear:none;float:left;margin:0 0 0 .2em;}.yui-toolbar-container .yui-toolbar-titlebar.draggable{cursor:move;}.yui-toolbar-container .yui-toolbar-titlebar{position:relative;}.yui-toolbar-container .yui-toolbar-titlebar h2{font-weight:bold;letter-spacing:0;border:none;color:#000;margin:0;padding:.2em;}.yui-toolbar-container .yui-toolbar-titlebar h2 a{text-decoration:none;color:#000;cursor:default;}.yui-toolbar-container.yui-toolbar-grouped span.yui-toolbar-draghandle{height:40px;}.yui-toolbar-container .yui-toolbar-group{float:left;margin-right:.5em;zoom:1;}.yui-toolbar-container .yui-toolbar-group:after{display:block;clear:both;visibility:hidden;content:'.';height:0;}.yui-toolbar-container .yui-toolbar-group h3{font-size:75%;padding:0 0 0 .25em;margin:0;}.yui-toolbar-container span.yui-toolbar-separator{width:2px;padding:0;height:18px;margin:.2em 0 .2em .1em;display:none;float:left;}.yui-toolbar-container.yui-toolbar-grouped span.yui-toolbar-separator{height:45px;*height:50px;}.yui-toolbar-container.yui-toolbar-grouped .yui-toolbar-group span.yui-toolbar-separator{height:18px;display:block;}.yui-toolbar-container ul li{margin:0;padding:0;list-style-type:none;}.yui-toolbar-container .yui-toolbar-nogrouplabels h3{display:none;}.yui-toolbar-container .yui-push-button,.yui-toolbar-container .yui-color-button,.yui-toolbar-container .yui-menu-button{position:relative;cursor:pointer;}.yui-toolbar-container .yui-button .first-child,.yui-toolbar-container .yui-button .first-child a{height:100%;width:100%;overflow:hidden;font-size:0px;}.yui-toolbar-container .yui-button-disabled{cursor:default;}.yui-toolbar-container .yui-button-disabled .yui-toolbar-icon{opacity:.5;filter:alpha(opacity=50);}.yui-toolbar-container .yui-button-disabled .up,.yui-toolbar-container .yui-button-disabled .down{opacity:.5;filter:alpha(opacity=50);}.yui-toolbar-container .yui-button a{overflow:hidden;}.yui-toolbar-container .yui-toolbar-select .first-child a{cursor:pointer;}.yui-toolbar-fontname-arial{font-family:Arial;}.yui-toolbar-fontname-arial-black{font-family:Arial Black;}.yui-toolbar-fontname-comic-sans-ms{font-family:Comic Sans MS;}.yui-toolbar-fontname-courier-new{font-family:Courier New;}.yui-toolbar-fontname-times-new-roman{font-family:Times New Roman;}.yui-toolbar-fontname-verdana{font-family:Verdana;}.yui-toolbar-fontname-impact{font-family:Impact;}.yui-toolbar-fontname-lucida-console{font-family:Lucida Console;}.yui-toolbar-fontname-tahoma{font-family:Tahoma;}.yui-toolbar-fontname-trebuchet-ms{font-family:Trebuchet MS;}.yui-toolbar-container .yui-toolbar-spinbutton{position:relative;}.yui-toolbar-container .yui-toolbar-spinbutton .first-child a{z-index:0;opacity:1;}.yui-toolbar-container .yui-toolbar-spinbutton a.up,.yui-toolbar-container .yui-toolbar-spinbutton a.down{position:absolute;display:block right:0;cursor:pointer;z-index:1;padding:0;margin:0;}.yui-toolbar-container .yui-overlay{position:absolute;}.yui-toolbar-container .yui-overlay ul li{margin:0;list-style-type:none;}.yui-toolbar-container{z-index:1;}.yui-editor-container .yui-editor-editable-container{position:relative;z-index:0;width:100%;}.yui-editor-container .yui-editor-masked{background-color:#CCC;}.yui-editor-container iframe{border:0px;padding:0;margin:0;zoom:1;display:block;}.yui-editor-container .yui-editor-editable{padding:0;margin:0;}.yui-editor-container .dompath{font-size:85%;}.yui-editor-panel .hd{text-align:left;position:relative;}.yui-editor-panel .hd h3{font-weight:bold;padding:0.25em 0pt 0.25em 0.25em;margin:0;}.yui-editor-panel .bd{width:100%;zoom:1;position:relative;}.yui-editor-panel .bd div.yui-editor-body-cont{padding:.25em .1em;zoom:1;}.yui-editor-panel .bd .gecko form{overflow:auto;}.yui-editor-panel .bd div.yui-editor-body-cont:after{display:block;clear:both;visibility:hidden;content:'.';height:0;}.yui-editor-panel .ft{text-align:right;width:99%;float:left;clear:both;}.yui-editor-panel .ft span.tip{display:block;position:relative;padding:.5em .5em .5em 23px;text-align:left;zoom:1;}.yui-editor-panel label{clear:both;float:left;padding:0;width:100%;text-align:left;zoom:1;}.yui-editor-panel .gecko label{overflow:auto;}.yui-editor-panel label strong{float:left;width:6em;}.yui-editor-panel .removeLink{width:80%;text-align:right;}.yui-editor-panel label input{margin-left:.25em;float:left;}.yui-editor-panel .yui-toolbar-group{margin-bottom:0.75em;}.yui-editor-panel .yui-toolbar-group-padding{}.yui-editor-panel .yui-toolbar-group-border{}.yui-editor-panel .yui-toolbar-group-textflow{}.yui-editor-panel .height-width{float:left;}.yui-editor-panel .height-width h3{}.yui-editor-panel .height-width span{font-style:italic;display:block;float:left;overflow:visible;}.yui-editor-panel .height-width span.info{font-size:70%;margin-top:3px;}.yui-editor-panel .yui-toolbar-bordersize,.yui-editor-panel .yui-toolbar-bordertype{font-size:75%;}.yui-editor-panel .yui-toolbar-container span.yui-toolbar-separator{border:none;}.yui-editor-panel .yui-toolbar-bordersize span a span,.yui-editor-panel .yui-toolbar-bordertype span a span{display:block;height:8px;left:4px;position:absolute;top:3px;_top:-5px;width:24px;text-indent:52px;font-size:0%;}.yui-editor-panel .yui-toolbar-bordertype span a span.yui-toolbar-bordertype-solid{border-bottom:1px solid black;}.yui-editor-panel .yui-toolbar-bordertype span a span.yui-toolbar-bordertype-dotted{border-bottom:1px dotted black;}.yui-editor-panel .yui-toolbar-bordertype span a span.yui-toolbar-bordertype-dashed{border-bottom:1px dashed black;}.yui-editor-panel .yui-toolbar-bordersize span a span.yui-toolbar-bordersize-0{*top:0px;text-indent:0px;font-size:75%;}.yui-editor-panel .yui-toolbar-bordersize span a span.yui-toolbar-bordersize-1{border-bottom:1px solid black;}.yui-editor-panel .yui-toolbar-bordersize span a span.yui-toolbar-bordersize-2{border-bottom:2px solid black;}.yui-editor-panel .yui-toolbar-bordersize span a span.yui-toolbar-bordersize-3{top:2px;*top:-5px;border-bottom:3px solid black;}.yui-editor-panel .yui-toolbar-bordersize span a span.yui-toolbar-bordersize-4{top:1px;*top:-5px;border-bottom:4px solid black;}.yui-editor-panel .yui-toolbar-bordersize span a span.yui-toolbar-bordersize-5{top:1px;*top:-5px;border-bottom:5px solid black;}.yui-toolbar-container .yui-toolbar-bordersize-menu,.yui-toolbar-container .yui-toolbar-bordertype-menu{width:95px !important;}.yui-toolbar-bordersize-menu .yuimenuitemlabel,.yui-toolbar-bordertype-menu .yuimenuitemlabel,.yui-toolbar-bordersize-menu .yuimenuitemlabel,.yui-toolbar-bordertype-menu .yuimenuitemlabel:hover{margin:0px 3px 7px 17px;}.yui-toolbar-bordersize-menu .yuimenuitemlabel .checkedindicator,.yui-toolbar-bordertype-menu .yuimenuitemlabel .checkedindicator{position:absolute;left:-12px;*top:14px;*left:0px;}.yui-toolbar-bordersize-menu li.yui-toolbar-bordersize-1 a{border-bottom:1px solid black;height:14px;}.yui-toolbar-bordersize-menu li.yui-toolbar-bordersize-2 a{border-bottom:2px solid black;height:14px;}.yui-toolbar-bordersize-menu li.yui-toolbar-bordersize-3 a{border-bottom:3px solid black;height:14px;}.yui-toolbar-bordersize-menu li.yui-toolbar-bordersize-4 a{border-bottom:4px solid black;height:14px;}.yui-toolbar-bordersize-menu li.yui-toolbar-bordersize-5 a{border-bottom:5px solid black;height:14px;}.yui-toolbar-bordertype-menu li.yui-toolbar-bordertype-solid a{border-bottom:1px solid black;height:14px;}.yui-toolbar-bordertype-menu li.yui-toolbar-bordertype-dashed a{border-bottom:1px dashed black;height:14px;}.yui-toolbar-bordertype-menu li.yui-toolbar-bordertype-dotted a{border-bottom:1px dotted black;height:14px;}h2.yui-editor-skipheader,h3.yui-editor-skipheader{height:0;margin:0;padding:0;border:none;width:0;overflow:hidden;position:absolute;}.yui-toolbar-colors{width:133px;zoom:1;display:none;z-index:100;overflow:hidden;}.yui-toolbar-colors:after{display:block;clear:both;visibility:hidden;content:'.';height:0;}.yui-toolbar-colors a{height:9px;width:9px;float:left;display:block;overflow:hidden;text-indent:999px;margin:0;cursor:pointer;border:1px solid #F6F7EE;}.yui-toolbar-colors a:hover{border:1px solid black;}.yui-color-button-menu{overflow:visible;background-color:transparent;}.yui-toolbar-colors span{position:relative;display:block;padding:3px;overflow:hidden;float:left;width:100%;zoom:1;}.yui-toolbar-colors span:after{display:block;clear:both;visibility:hidden;content:'.';height:0;}.yui-toolbar-colors span em{height:35px;width:30px;float:left;display:block;overflow:hidden;text-indent:999px;margin:0.75px;border:1px solid black;}.yui-toolbar-colors span strong{font-weight:normal;padding-left:3px;display:block;font-size:85%;float:left;width:65%;}.yui-toolbar-group-undoredo h3,.yui-toolbar-group-insertitem h3,.yui-toolbar-group-indentlist h3{width:68px;}.yui-toolbar-group-indentlist2 h3{width:122px;}.yui-toolbar-group-alignment h3{width:130px;}.yui-skin-sam .yui-editor-container{border:1px solid #808080;}.yui-skin-sam .yui-toolbar-container{zoom:1;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-titlebar{background:url(sprite.png) repeat-x 0 -200px;position:relative;}.yui-skin-sam .yui-editor-container .draggable .yui-toolbar-titlebar{cursor:move;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-titlebar h2{color:#000000;font-weight:bold;margin:0;padding:0.3em 1em;font-size:100%;text-align:left;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-group h3{color:#808080;font-size:75%;margin:1em 0 0;padding-bottom:0;padding-left:0.25em;text-align:left;}.yui-toolbar-container span.yui-toolbar-separator{border:none;text-indent:33px;overflow:hidden;margin:0 .25em;}.yui-skin-sam .yui-toolbar-container{background-color:#F2F2F2;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-subcont{padding:0 1em 0.35em;border-bottom:1px solid #808080;}.yui-skin-sam .yui-toolbar-container-collapsed .yui-toolbar-titlebar{border-bottom:1px solid #808080;}.yui-skin-sam .yui-editor-container .visible .yui-menu-shadow,.yui-skin-sam .yui-editor-panel .visible .yui-menu-shadow{display:none;}.yui-skin-sam .yui-editor-container ul{list-style-type:none;margin:0;padding:0;}.yui-skin-sam .yui-editor-container ul li{list-style-type:none;margin:0;padding:0;}.yui-skin-sam .yui-toolbar-group ul li.yui-toolbar-groupitem{float:left;}.yui-skin-sam .yui-editor-container .dompath{background-color:#F2F2F2;border-top:1px solid #808080;color:#999;text-align:left;padding:0.25em;}.yui-skin-sam .yui-toolbar-container .collapse{background:url(sprite.png) no-repeat 0 -400px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-titlebar span.collapse{cursor:pointer;position:absolute;top:4px;right:2px;display:block;overflow:hidden;height:15px;width:15px;text-indent:9999px;}.yui-skin-sam .yui-toolbar-container .yui-push-button,.yui-skin-sam .yui-toolbar-container .yui-color-button,.yui-skin-sam .yui-toolbar-container .yui-menu-button{background:url(sprite.png) repeat-x 0 0;position:relative;display:block;height:22px;width:30px;_font-size:0;margin:0;border-color:#808080;color:#f2f2f2;border-style:solid;border-width:1px 0;zoom:1;}.yui-skin-sam .yui-toolbar-container .yui-push-button a,.yui-skin-sam .yui-toolbar-container .yui-color-button a,.yui-skin-sam .yui-toolbar-container .yui-menu-button a{padding-left:35px;height:20px;text-decoration:none;font-size:0px;line-height:2;display:block;color:#000;overflow:hidden;white-space:nowrap;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-spinbutton a,.yui-skin-sam .yui-toolbar-container .yui-toolbar-select a{font-size:12px;}.yui-skin-sam .yui-toolbar-container .yui-push-button .first-child,.yui-skin-sam .yui-toolbar-container .yui-color-button .first-child,.yui-skin-sam .yui-toolbar-container .yui-menu-button .first-child{border-color:#808080;border-style:solid;border-width:0 1px;margin:0 -1px;display:block;position:relative;}.yui-skin-sam .yui-toolbar-container .yui-push-button-disabled .first-child,.yui-skin-sam .yui-toolbar-container .yui-color-button-disabled .first-child,.yui-skin-sam .yui-toolbar-container .yui-menu-button-disabled .first-child{border-color:#ccc;}.yui-skin-sam .yui-toolbar-container .yui-push-button-disabled a,.yui-skin-sam .yui-toolbar-container .yui-color-button-disabled a,.yui-skin-sam .yui-toolbar-container .yui-menu-button-disabled a{color:#A6A6A6;cursor:default;}.yui-skin-sam .yui-toolbar-container .yui-push-button-disabled,.yui-skin-sam .yui-toolbar-container .yui-color-button-disabled,.yui-skin-sam .yui-toolbar-container .yui-menu-button-disabled{border-color:#ccc;}.yui-skin-sam .yui-toolbar-container .yui-button .first-child{*left:0px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-fontname{width:135px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-heading{width:92px;}.yui-skin-sam .yui-toolbar-container .yui-button-hover{background:url(sprite.png) repeat-x 0 -1300px;border-color:#808080;}.yui-skin-sam .yui-toolbar-container .yui-button-selected{background:url(sprite.png) repeat-x 0 -1700px;border-color:#808080;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-nogrouplabels h3{display:none;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-nogrouplabels .yui-toolbar-group{margin-top:.75em;}.yui-skin-sam .yui-toolbar-container .yui-push-button span.yui-toolbar-icon,.yui-skin-sam .yui-toolbar-container .yui-color-button span.yui-toolbar-icon,.yui-skin-sam .yui-toolbar-container .yui-menu-button span.yui-toolbar-icon{display:block;position:absolute;top:2px;height:18px;width:18px;overflow:hidden;background:url(editor-sprite.gif) no-repeat 30px 30px;}.yui-skin-sam .yui-toolbar-container .yui-button-selected span.yui-toolbar-icon,.yui-skin-sam .yui-toolbar-container .yui-button-hover span.yui-toolbar-icon{background-image:url(editor-sprite-active.gif);}.yui-skin-sam .yui-toolbar-container .visible .yuimenuitemlabel{cursor:pointer;color:#000;*position:relative;}.yui-skin-sam .yui-toolbar-container .yui-button-menu{background-color:#fff;}.yui-skin-sam .yui-toolbar-container .yui-button-menu .yui-menu-body-scrolled{position:relative;}.yui-skin-sam div.yuimenu li.selected{background-color:#B3D4FF;}.yui-skin-sam div.yuimenu li.selected a.selected{color:#000;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-bold span.yui-toolbar-icon{background-position:0 0;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-strikethrough span.yui-toolbar-icon{background-position:0 -108px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-italic span.yui-toolbar-icon{background-position:0 -36px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-undo span.yui-toolbar-icon{background-position:0 -1326px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-redo span.yui-toolbar-icon{background-position:0 -1355px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-underline span.yui-toolbar-icon{background-position:0 -72px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-subscript span.yui-toolbar-icon{background-position:0 -180px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-superscript span.yui-toolbar-icon{background-position:0 -144px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-forecolor span.yui-toolbar-icon{background-position:0 -216px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-backcolor span.yui-toolbar-icon{background-position:0 -288px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-justifyleft span.yui-toolbar-icon{background-position:0 -324px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-justifycenter span.yui-toolbar-icon{background-position:0 -360px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-justifyright span.yui-toolbar-icon{background-position:0 -396px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-justifyfull span.yui-toolbar-icon{background-position:0 -432px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-indent span.yui-toolbar-icon{background-position:0 -720px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-outdent span.yui-toolbar-icon{background-position:0 -684px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-createlink span.yui-toolbar-icon{background-position:0 -792px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-insertimage span.yui-toolbar-icon{background-position:1px -756px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-left span.yui-toolbar-icon{background-position:0 -972px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-right span.yui-toolbar-icon{background-position:0 -936px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-inline span.yui-toolbar-icon{background-position:0 -900px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-block span.yui-toolbar-icon{background-position:0 -864px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-bordercolor span.yui-toolbar-icon{background-position:0 -252px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-removeformat span.yui-toolbar-icon{background-position:0 -1080px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-hiddenelements span.yui-toolbar-icon{background-position:0 -1044px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-insertunorderedlist span.yui-toolbar-icon{background-position:0 -468px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-insertorderedlist span.yui-toolbar-icon{background-position:0 -504px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-spinbutton,.yui-skin-sam .yui-toolbar-container .yui-toolbar-spinbutton .first-child{width:35px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-spinbutton .first-child a{padding-left:2px;text-align:left;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-spinbutton span.yui-toolbar-icon{display:none;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-spinbutton a.up,.yui-skin-sam .yui-toolbar-container .yui-toolbar-spinbutton a.down{right:2px;background:url(editor-sprite.gif) no-repeat 0 -1222px;overflow:hidden;height:6px;width:7px;min-height:0;padding:0;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-spinbutton a.up{top:2px;background-position:0 -1222px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-spinbutton a.down{bottom:2px;background-position:0 -1187px;}.yui-skin-sam .yui-toolbar-container select{height:22px;border:1px solid #808080;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-select .first-child a{padding-left:5px;text-align:left;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-select span.yui-toolbar-icon{background:url( editor-sprite.gif ) no-repeat 0 -1144px;overflow:hidden;right:-2px;top:0px;height:20px;}.yui-skin-sam .yui-editor-panel .yui-color-button-menu .bd{background-color:transparent;border:none;width:135px;}.yui-skin-sam .yui-color-button-menu .yui-toolbar-colors{border:1px solid #808080;}.yui-skin-sam .yui-editor-panel{padding:0;margin:0;border:none;background-color:transparent;overflow:visible;position:absolute;}.yui-skin-sam .yui-editor-panel .hd{margin:10px 0 0;padding:0;border:none;}.yui-skin-sam .yui-editor-panel .hd h3{color:#000;border:1px solid #808080;background:url(sprite.png) repeat-x 0 -200px;width:99%;position:relative;margin:0;padding:3px 0 0 0;font-size:93%;text-indent:5px;height:20px;}.yui-skin-sam .yui-editor-panel .bd{background-color:#F2F2F2;border-left:1px solid #808080;border-right:1px solid #808080;width:99%;margin:0;padding:0;overflow:visible;}.yui-skin-sam .yui-editor-panel ul{list-style-type:none;margin:0;padding:0;}.yui-skin-sam .yui-editor-panel ul li{margin:0;padding:0;}.yui-skin-sam .yui-editor-panel .yuimenu{}.yui-skin-sam .yui-editor-panel .yui-toolbar-container .yui-toolbar-subcont{padding:0;border:none;margin-top:0.35em;}.yui-skin-sam .yui-editor-panel .yui-toolbar-bordersize,.yui-skin-sam .yui-editor-panel .yui-toolbar-bordertype{width:50px;}.yui-skin-sam .yui-editor-panel label{display:block;float:none;padding:4px 0;margin-bottom:7px;}.yui-skin-sam .yui-editor-panel label strong{font-weight:normal;font-size:93%;text-align:right;padding-top:2px;}.yui-skin-sam .yui-editor-panel label input{width:75%;}.yui-skin-sam .yui-editor-panel .createlink_target,.yui-skin-sam .yui-editor-panel .insertimage_target{width:auto;margin-right:5px;}.yui-skin-sam .yui-editor-panel .removeLink{width:98%;}.yui-skin-sam .yui-editor-panel label input.warning{background-color:#FFEE69;}.yui-skin-sam .yui-editor-panel .yui-toolbar-group h3{color:#000;float:left;font-weight:normal;font-size:93%;margin:5px 0 0 0;padding:0 3px 0 0;text-align:right;}.yui-skin-sam .yui-editor-panel .height-width h3{margin:3px 0 0 10px;}.yui-skin-sam .yui-editor-panel .height-width{margin:3px 0 0 35px;*margin-left:14px;width:42%;*width:44%;}.yui-skin-sam .yui-editor-panel .yui-toolbar-group-border{width:190px;}.yui-skin-sam .yui-editor-panel .no-button .yui-toolbar-group-border{width:210px;}.yui-skin-sam .yui-editor-panel .yui-toolbar-group-padding{width:203px;_width:198px;}.yui-skin-sam .yui-editor-panel .no-button .yui-toolbar-group-padding{width:172px;}.yui-skin-sam .yui-editor-panel .yui-toolbar-group-padding h3{margin-left:25px;*margin-left:12px;}.yui-skin-sam .yui-editor-panel .yui-toolbar-group-textflow{width:182px;}.yui-skin-sam .yui-editor-panel .hd{background:none;}.yui-skin-sam .yui-editor-panel .ft{background-color:#F2F2F2;border:1px solid #808080;border-top:none;padding:0;margin:0 0 2px 0;}.yui-skin-sam .yui-editor-panel .hd span.close{background:url(sprite.png) no-repeat 0 -300px;cursor:pointer;display:block;height:16px;overflow:hidden;position:absolute;right:5px;text-indent:500px;top:2px;width:26px;}.yui-skin-sam .yui-editor-panel .ft span.tip{background-color:#EDF5FF;border-top:1px solid #808080;font-size:85%;}.yui-skin-sam .yui-editor-panel .ft span.tip strong{display:block;float:left;margin:0 2px 8px 0;}.yui-skin-sam .yui-editor-panel .ft span.tip span.icon{background:url( editor-sprite.gif ) no-repeat 0 -1260px;display:block;height:20px;left:2px;position:absolute;top:8px;width:20px;}.yui-skin-sam .yui-editor-panel .ft span.tip span.icon-info{background-position:2px -1260px;}.yui-skin-sam .yui-editor-panel .ft span.tip span.icon-warn{background-position:2px -1296px;}.yui-skin-sam .yui-editor-panel .hd span.knob{position:absolute;height:10px;width:28px;top:-10px;left:25px;text-indent:9999px;overflow:hidden;background:url( editor-knob.gif ) no-repeat 0 0;}.yui-skin-sam .yui-editor-panel .yui-toolbar-container{float:left;width:100%;background-image:none;border:none;}.yui-skin-sam .yui-editor-panel .yui-toolbar-container .bd{background-color:#ffffff;}.yui-editor-blankimage{background-image:url( blankimage.png );}.yui-skin-sam .yui-editor-container .yui-resize-handle-br{height:11px;width:11px;background-position:-20px -60px;background-color:transparent;} diff --git a/webdir/javascript/yui/assets/skins/sam/skin.css b/webdir/javascript/yui/assets/skins/sam/skin.css new file mode 100644 index 0000000..d1ac6d7 --- /dev/null +++ b/webdir/javascript/yui/assets/skins/sam/skin.css @@ -0,0 +1,26 @@ +/* +Copyright (c) 2008, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.6.0 +*/ +.yui-skin-sam .yui-ac{position:relative;font-family:arial;font-size:100%;}.yui-skin-sam .yui-ac-input{position:absolute;width:100%;}.yui-skin-sam .yui-ac-container{position:absolute;top:1.6em;width:100%;}.yui-skin-sam .yui-ac-content{position:absolute;width:100%;border:1px solid #808080;background:#fff;overflow:hidden;z-index:9050;}.yui-skin-sam .yui-ac-shadow{position:absolute;margin:.3em;width:100%;background:#000;-moz-opacity:0.10;opacity:.10;filter:alpha(opacity=10);z-index:9049;}.yui-skin-sam .yui-ac iframe{opacity:0;filter:alpha(opacity=0);padding-right:.3em;padding-bottom:.3em;}.yui-skin-sam .yui-ac-content ul{margin:0;padding:0;width:100%;}.yui-skin-sam .yui-ac-content li{margin:0;padding:2px 5px;cursor:default;white-space:nowrap;list-style:none;zoom:1;}.yui-skin-sam .yui-ac-content li.yui-ac-prehighlight{background:#B3D4FF;}.yui-skin-sam .yui-ac-content li.yui-ac-highlight{background:#426FD9;color:#FFF;} +.yui-button{display:-moz-inline-box;display:inline-block;vertical-align:text-bottom;}.yui-button .first-child{display:block;*display:inline-block;}.yui-button button,.yui-button a{display:block;*display:inline-block;border:none;margin:0;}.yui-button button{background-color:transparent;*overflow:visible;cursor:pointer;}.yui-button a{text-decoration:none;}.yui-skin-sam .yui-button{border-width:1px 0;border-style:solid;border-color:#808080;background:url(sprite.png) repeat-x 0 0;margin:auto .25em;}.yui-skin-sam .yui-button .first-child{border-width:0 1px;border-style:solid;border-color:#808080;margin:0 -1px;*position:relative;*left:-1px;_margin:0;_position:static;}.yui-skin-sam .yui-button button,.yui-skin-sam .yui-button a{padding:0 10px;font-size:93%;line-height:2;*line-height:1.7;min-height:2em;*min-height:auto;color:#000;}.yui-skin-sam .yui-button a{*line-height:1.875;*padding-bottom:1px;}.yui-skin-sam .yui-split-button button,.yui-skin-sam .yui-menu-button button{padding-right:20px;background-position:right center;background-repeat:no-repeat;}.yui-skin-sam .yui-menu-button button{background-image:url(menu-button-arrow.png);}.yui-skin-sam .yui-split-button button{background-image:url(split-button-arrow.png);}.yui-skin-sam .yui-button-focus{border-color:#7D98B8;background-position:0 -1300px;}.yui-skin-sam .yui-button-focus .first-child{border-color:#7D98B8;}.yui-skin-sam .yui-button-focus button,.yui-skin-sam .yui-button-focus a{color:#000;}.yui-skin-sam .yui-split-button-focus button{background-image:url(split-button-arrow-focus.png);}.yui-skin-sam .yui-button-hover{border-color:#7D98B8;background-position:0 -1300px;}.yui-skin-sam .yui-button-hover .first-child{border-color:#7D98B8;}.yui-skin-sam .yui-button-hover button,.yui-skin-sam .yui-button-hover a{color:#000;}.yui-skin-sam .yui-split-button-hover button{background-image:url(split-button-arrow-hover.png);}.yui-skin-sam .yui-button-active{border-color:#7D98B8;background-position:0 -1700px;}.yui-skin-sam .yui-button-active .first-child{border-color:#7D98B8;}.yui-skin-sam .yui-button-active button,.yui-skin-sam .yui-button-active a{color:#000;}.yui-skin-sam .yui-split-button-activeoption{border-color:#808080;background-position:0 0;}.yui-skin-sam .yui-split-button-activeoption .first-child{border-color:#808080;}.yui-skin-sam .yui-split-button-activeoption button{background-image:url(split-button-arrow-active.png);}.yui-skin-sam .yui-radio-button-checked,.yui-skin-sam .yui-checkbox-button-checked{border-color:#304369;background-position:0 -1400px;}.yui-skin-sam .yui-radio-button-checked .first-child,.yui-skin-sam .yui-checkbox-button-checked .first-child{border-color:#304369;}.yui-skin-sam .yui-radio-button-checked button,.yui-skin-sam .yui-checkbox-button-checked button{color:#fff;}.yui-skin-sam .yui-button-disabled{border-color:#ccc;background-position:0 -1500px;}.yui-skin-sam .yui-button-disabled .first-child{border-color:#ccc;}.yui-skin-sam .yui-button-disabled button,.yui-skin-sam .yui-button-disabled a{color:#A6A6A6;cursor:default;}.yui-skin-sam .yui-menu-button-disabled button{background-image:url(menu-button-arrow-disabled.png);}.yui-skin-sam .yui-split-button-disabled button{background-image:url(split-button-arrow-disabled.png);} +.yui-calcontainer{position:relative;float:left;_overflow:hidden;}.yui-calcontainer iframe{position:absolute;border:none;margin:0;padding:0;z-index:0;width:100%;height:100%;left:0px;top:0px;}.yui-calcontainer iframe.fixedsize{width:50em;height:50em;top:-1px;left:-1px;}.yui-calcontainer.multi .groupcal{z-index:1;float:left;position:relative;}.yui-calcontainer .title{position:relative;z-index:1;}.yui-calcontainer .close-icon{position:absolute;z-index:1;text-indent:-10000em;overflow:hidden;}.yui-calendar{position:relative;}.yui-calendar .calnavleft{position:absolute;z-index:1;text-indent:-10000em;overflow:hidden;}.yui-calendar .calnavright{position:absolute;z-index:1;text-indent:-10000em;overflow:hidden;}.yui-calendar .calheader{position:relative;width:100%;text-align:center;}.yui-calcontainer .yui-cal-nav-mask{position:absolute;z-index:2;margin:0;padding:0;width:100%;height:100%;_width:0;_height:0;left:0;top:0;display:none;}.yui-calcontainer .yui-cal-nav{position:absolute;z-index:3;top:0;display:none;}.yui-calcontainer .yui-cal-nav .yui-cal-nav-btn{display:-moz-inline-box;display:inline-block;}.yui-calcontainer .yui-cal-nav .yui-cal-nav-btn button{display:block;*display:inline-block;*overflow:visible;border:none;background-color:transparent;cursor:pointer;}.yui-calendar .calbody a:hover{background:inherit;}p#clear{clear:left;padding-top:10px;}.yui-skin-sam .yui-calcontainer{background-color:#f2f2f2;border:1px solid #808080;padding:10px;}.yui-skin-sam .yui-calcontainer.multi{padding:0 5px 0 5px;}.yui-skin-sam .yui-calcontainer.multi .groupcal{background-color:transparent;border:none;padding:10px 5px 10px 5px;margin:0;}.yui-skin-sam .yui-calcontainer .title{background:url(sprite.png) repeat-x 0 0;border-bottom:1px solid #cccccc;font:100% sans-serif;color:#000;font-weight:bold;height:auto;padding:.4em;margin:0 -10px 10px -10px;top:0;left:0;text-align:left;}.yui-skin-sam .yui-calcontainer.multi .title{margin:0 -5px 0 -5px;}.yui-skin-sam .yui-calcontainer.withtitle{padding-top:0;}.yui-skin-sam .yui-calcontainer .calclose{background:url(sprite.png) no-repeat 0 -300px;width:25px;height:15px;top:.4em;right:.4em;cursor:pointer;}.yui-skin-sam .yui-calendar{border-spacing:0;border-collapse:collapse;font:100% sans-serif;text-align:center;margin:0;}.yui-skin-sam .yui-calendar .calhead{background:transparent;border:none;vertical-align:middle;padding:0;}.yui-skin-sam .yui-calendar .calheader{background:transparent;font-weight:bold;padding:0 0 .6em 0;text-align:center;}.yui-skin-sam .yui-calendar .calheader img{border:none;}.yui-skin-sam .yui-calendar .calnavleft{background:url(sprite.png) no-repeat 0 -450px;width:25px;height:15px;top:0;bottom:0;left:-10px;margin-left:.4em;cursor:pointer;}.yui-skin-sam .yui-calendar .calnavright{background:url(sprite.png) no-repeat 0 -500px;width:25px;height:15px;top:0;bottom:0;right:-10px;margin-right:.4em;cursor:pointer;}.yui-skin-sam .yui-calendar .calweekdayrow{height:2em;}.yui-skin-sam .yui-calendar .calweekdayrow th{padding:0;border:none;}.yui-skin-sam .yui-calendar .calweekdaycell{color:#000;font-weight:bold;text-align:center;width:2em;}.yui-skin-sam .yui-calendar .calfoot{background-color:#f2f2f2;}.yui-skin-sam .yui-calendar .calrowhead,.yui-skin-sam .yui-calendar .calrowfoot{color:#a6a6a6;font-size:85%;font-style:normal;font-weight:normal;border:none;}.yui-skin-sam .yui-calendar .calrowhead{text-align:right;padding:0 2px 0 0;}.yui-skin-sam .yui-calendar .calrowfoot{text-align:left;padding:0 0 0 2px;}.yui-skin-sam .yui-calendar td.calcell{border:1px solid #cccccc;background:#fff;padding:1px;height:1.6em;line-height:1.6em;text-align:center;white-space:nowrap;}.yui-skin-sam .yui-calendar td.calcell a{color:#0066cc;display:block;height:100%;text-decoration:none;}.yui-skin-sam .yui-calendar td.calcell.today{background-color:#000;}.yui-skin-sam .yui-calendar td.calcell.today a{background-color:#fff;}.yui-skin-sam .yui-calendar td.calcell.oom{background-color:#cccccc;color:#a6a6a6;cursor:default;}.yui-skin-sam .yui-calendar td.calcell.selected{background-color:#fff;color:#000;}.yui-skin-sam .yui-calendar td.calcell.selected a{background-color:#b3d4ff;color:#000;}.yui-skin-sam .yui-calendar td.calcell.calcellhover{background-color:#426fd9;color:#fff;cursor:pointer;}.yui-skin-sam .yui-calendar td.calcell.calcellhover a{background-color:#426fd9;color:#fff;}.yui-skin-sam .yui-calendar td.calcell.previous{color:#e0e0e0;}.yui-skin-sam .yui-calendar td.calcell.restricted{text-decoration:line-through;}.yui-skin-sam .yui-calendar td.calcell.highlight1{background-color:#ccff99;}.yui-skin-sam .yui-calendar td.calcell.highlight2{background-color:#99ccff;}.yui-skin-sam .yui-calendar td.calcell.highlight3{background-color:#ffcccc;}.yui-skin-sam .yui-calendar td.calcell.highlight4{background-color:#ccff99;}.yui-skin-sam .yui-calendar a.calnav{border:1px solid #f2f2f2;padding:0 4px;text-decoration:none;color:#000;zoom:1;}.yui-skin-sam .yui-calendar a.calnav:hover{background:url(sprite.png) repeat-x 0 0;border-color:#A0A0A0;cursor:pointer;}.yui-skin-sam .yui-calcontainer .yui-cal-nav-mask{background-color:#000;opacity:0.25;*filter:alpha(opacity=25);}.yui-skin-sam .yui-calcontainer .yui-cal-nav{font-family:arial,helvetica,clean,sans-serif;font-size:93%;border:1px solid #808080;left:50%;margin-left:-7em;width:14em;padding:0;top:2.5em;background-color:#f2f2f2;}.yui-skin-sam .yui-calcontainer.withtitle .yui-cal-nav{top:4.5em;}.yui-skin-sam .yui-calcontainer.multi .yui-cal-nav{width:16em;margin-left:-8em;}.yui-skin-sam .yui-calcontainer .yui-cal-nav-y,.yui-skin-sam .yui-calcontainer .yui-cal-nav-m,.yui-skin-sam .yui-calcontainer .yui-cal-nav-b{padding:5px 10px 5px 10px;}.yui-skin-sam .yui-calcontainer .yui-cal-nav-b{text-align:center;}.yui-skin-sam .yui-calcontainer .yui-cal-nav-e{margin-top:5px;padding:5px;background-color:#EDF5FF;border-top:1px solid black;display:none;}.yui-skin-sam .yui-calcontainer .yui-cal-nav label{display:block;font-weight:bold;}.yui-skin-sam .yui-calcontainer .yui-cal-nav-mc{width:100%;_width:auto;}.yui-skin-sam .yui-calcontainer .yui-cal-nav-y input.yui-invalid{background-color:#FFEE69;border:1px solid #000;}.yui-skin-sam .yui-calcontainer .yui-cal-nav-yc{width:4em;}.yui-skin-sam .yui-calcontainer .yui-cal-nav .yui-cal-nav-btn{border:1px solid #808080;background:url(sprite.png) repeat-x 0 0;background-color:#ccc;margin:auto .15em;}.yui-skin-sam .yui-calcontainer .yui-cal-nav .yui-cal-nav-btn button{padding:0 8px;font-size:93%;line-height:2;*line-height:1.7;min-height:2em;*min-height:auto;color:#000;}.yui-skin-sam .yui-calcontainer .yui-cal-nav .yui-cal-nav-btn.yui-default{border:1px solid #304369;background-color:#426fd9;background:url(sprite.png) repeat-x 0 -1400px;}.yui-skin-sam .yui-calcontainer .yui-cal-nav .yui-cal-nav-btn.yui-default button{color:#fff;} +.yui-carousel{visibility:hidden;overflow:hidden;position:relative;}.yui-carousel.yui-carousel-visible{visibility:visible;}.yui-carousel-content{overflow:hidden;position:relative;}.yui-carousel-element{margin:5px 0;overflow:hidden;padding:0;position:relative;width:32000px;z-index:1;}.yui-carousel-vertical .yui-carousel-element{margin:0 5px;}.yui-carousel-element li{border:1px solid #ccc;float:left;list-style:none;margin:1px;overflow:hidden;padding:0;text-align:center;*float:none;*display:inline-block;*zoom:1;*display:inline;}.yui-carousel .yui-carousel-item-selected{border:1px dashed #000;margin:1px;}.yui-carousel-vertical{height:32000px;margin:0 5px;width:auto;}.yui-carousel-vertical .yui-carousel-element li{display:block;float:none;}.yui-log .carousel{background:#f2e886;}.yui-carousel-nav{zoom:1;}.yui-carousel-nav:after{clear:both;content:"";display:block;}.yui-carousel-button-focus{outline:1px dotted #000;}.yui-skin-sam .yui-carousel,.yui-skin-sam .yui-carousel-vertical{border:1px solid #808080;}.yui-skin-sam .yui-carousel-nav{background:url(sprite.png) repeat-x 0 0;padding:3px;text-align:right;}.yui-skin-sam .yui-carousel-button{background:url(sprite.png) no-repeat 0 -600px;float:right;height:19px;margin:5px;overflow:hidden;width:40px;}.yui-skin-sam .yui-carousel-vertical .yui-carousel-button{background-position:0 -800px;}.yui-skin-sam .yui-carousel-button-disabled{background-position:0 -2000px;}.yui-skin-sam .yui-carousel-vertical .yui-carousel-button-disabled{background-position:0 -2100px;}.yui-skin-sam .yui-carousel-button input{background-color:transparent;border:0;cursor:pointer;display:block;height:44px;margin:-2px 0 0 -2px;padding:0 0 0 50px;}.yui-skin-sam span.yui-carousel-first-button{background-position:0px -550px;margin-left:-100px;margin-right:50px;*margin:5px 5px 5px -90px;}.yui-skin-sam .yui-carousel-vertical span.yui-carousel-first-button{background-position:0px -750px;}.yui-skin-sam span.yui-carousel-first-button-disabled{background-position:0 -1950px;}.yui-skin-sam .yui-carousel-vertical span.yui-carousel-first-button-disabled{background-position:0 -2050px;}.yui-skin-sam .yui-carousel-nav ul{float:right;margin:0;margin-left:-220px;margin-right:100px;*margin-left:-160px;*margin-right:0;padding:0;}.yui-skin-sam .yui-carousel-nav select{position:relative;*right:50px;top:4px;}.yui-skin-sam .yui-carousel-vertical .yui-carousel-nav ul,.yui-skin-sam .yui-carousel-vertical .yui-carousel-nav select{float:none;margin:0;*zoom:1;}.yui-skin-sam .yui-carousel-nav ul li{float:left;height:19px;list-style:none;}.yui-skin-sam .yui-carousel-nav ul:after{clear:both;content:"";display:block;}.yui-skin-sam .yui-carousel-nav ul li a{background:url(sprite.png) no-repeat 0 -650px;display:block;height:9px;margin:10px 0 0 5px;overflow:hidden;width:9px;}.yui-skin-sam .yui-carousel-nav ul li a em{left:-10000px;position:absolute;}.yui-skin-sam .yui-carousel-nav ul li.yui-carousel-nav-page-selected a{background-position:0 -700px;} +.yui-picker-panel{background:#e3e3e3;border-color:#888;}.yui-picker-panel .hd{background-color:#ccc;font-size:100%;line-height:100%;border:1px solid #e3e3e3;font-weight:bold;overflow:hidden;padding:6px;color:#000;}.yui-picker-panel .bd{background:#e8e8e8;margin:1px;height:200px;}.yui-picker-panel .ft{background:#e8e8e8;margin:1px;padding:1px;}.yui-picker{position:relative;}.yui-picker-hue-thumb{cursor:default;width:18px;height:18px;top:-8px;left:-2px;z-index:9;position:absolute;}.yui-picker-hue-bg{-moz-outline:none;outline:0px none;position:absolute;left:200px;height:183px;width:14px;background:url(hue_bg.png) no-repeat;top:4px;}.yui-picker-bg{-moz-outline:none;outline:0px none;position:absolute;top:4px;left:4px;height:182px;width:182px;background-color:#F00;background-image:url(picker_mask.png);}*html .yui-picker-bg{background-image:none;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='../../build/colorpicker/assets/picker_mask.png',sizingMethod='scale');}.yui-picker-mask{position:absolute;z-index:1;top:0px;left:0px;}.yui-picker-thumb{cursor:default;width:11px;height:11px;z-index:9;position:absolute;top:-4px;left:-4px;}.yui-picker-swatch{position:absolute;left:240px;top:4px;height:60px;width:55px;border:1px solid #888;}.yui-picker-websafe-swatch{position:absolute;left:304px;top:4px;height:24px;width:24px;border:1px solid #888;}.yui-picker-controls{position:absolute;top:72px;left:226px;font:1em monospace;}.yui-picker-controls .hd{background:transparent;border-width:0px !important;}.yui-picker-controls .bd{height:100px;border-width:0px !important;}.yui-picker-controls ul{float:left;padding:0 2px 0 0;margin:0}.yui-picker-controls li{padding:2px;list-style:none;margin:0}.yui-picker-controls input{font-size:0.85em;width:2.4em;}.yui-picker-hex-controls{clear:both;padding:2px;}.yui-picker-hex-controls input{width:4.6em;}.yui-picker-controls a{font:1em arial,helvetica,clean,sans-serif;display:block;*display:inline-block;padding:0;color:#000;} +.yui-overlay,.yui-panel-container{visibility:hidden;position:absolute;z-index:2;}.yui-panel-container form{margin:0;}.mask{z-index:1;display:none;position:absolute;top:0;left:0;right:0;bottom:0;}.mask.block-scrollbars{overflow:auto;}.masked select,.drag select,.hide-select select{_visibility:hidden;}.yui-panel-container select{_visibility:inherit;}.hide-scrollbars,.hide-scrollbars *{overflow:hidden;}.hide-scrollbars select{display:none;}.show-scrollbars{overflow:auto;}.yui-panel-container.show-scrollbars,.yui-tt.show-scrollbars{overflow:visible;}.yui-panel-container.show-scrollbars .underlay,.yui-tt.show-scrollbars .yui-tt-shadow{overflow:auto;}.yui-panel-container.shadow .underlay.yui-force-redraw{padding-bottom:1px;}.yui-effect-fade .underlay{display:none;}.yui-tt-shadow{position:absolute;}.yui-override-padding{padding:0 !important;}.yui-panel-container .container-close{overflow:hidden;text-indent:-10000em;text-decoration:none;}.yui-skin-sam .mask{background-color:#000;opacity:.25;*filter:alpha(opacity=25);}.yui-skin-sam .yui-panel-container{padding:0 1px;*padding:2px;}.yui-skin-sam .yui-panel{position:relative;left:0;top:0;border-style:solid;border-width:1px 0;border-color:#808080;z-index:1;*border-width:1px;*zoom:1;_zoom:normal;}.yui-skin-sam .yui-panel .hd,.yui-skin-sam .yui-panel .bd,.yui-skin-sam .yui-panel .ft{border-style:solid;border-width:0 1px;border-color:#808080;margin:0 -1px;*margin:0;*border:0;}.yui-skin-sam .yui-panel .hd{border-bottom:solid 1px #ccc;}.yui-skin-sam .yui-panel .bd,.yui-skin-sam .yui-panel .ft{background-color:#F2F2F2;}.yui-skin-sam .yui-panel .hd{padding:0 10px;font-size:93%;line-height:2;*line-height:1.9;font-weight:bold;color:#000;background:url(sprite.png) repeat-x 0 -200px;}.yui-skin-sam .yui-panel .bd{padding:10px;}.yui-skin-sam .yui-panel .ft{border-top:solid 1px #808080;padding:5px 10px;font-size:77%;}.yui-skin-sam .yui-panel-container.focused .yui-panel .hd{}.yui-skin-sam .container-close{position:absolute;top:5px;right:6px;width:25px;height:15px;background:url(sprite.png) no-repeat 0 -300px;cursor:pointer;}.yui-skin-sam .yui-panel-container .underlay{right:-1px;left:-1px;}.yui-skin-sam .yui-panel-container.matte{padding:9px 10px;background-color:#fff;}.yui-skin-sam .yui-panel-container.shadow{_padding:2px 4px 0 2px;}.yui-skin-sam .yui-panel-container.shadow .underlay{position:absolute;top:2px;left:-3px;right:-3px;bottom:-3px;*top:4px;*left:-1px;*right:-1px;*bottom:-1px;_top:0;_left:0;_right:0;_bottom:0;_margin-top:3px;_margin-left:-1px;background-color:#000;opacity:.12;*filter:alpha(opacity=12);}.yui-skin-sam .yui-dialog .ft{border-top:none;padding:0 10px 10px 10px;font-size:100%;}.yui-skin-sam .yui-dialog .ft .button-group{display:block;text-align:right;}.yui-skin-sam .yui-dialog .ft button.default{font-weight:bold;}.yui-skin-sam .yui-dialog .ft span.default{border-color:#304369;background-position:0 -1400px;}.yui-skin-sam .yui-dialog .ft span.default .first-child{border-color:#304369;}.yui-skin-sam .yui-dialog .ft span.default button{color:#fff;}.yui-skin-sam .yui-dialog .ft span.yui-button-disabled{background-position:0pt -1500px;border-color:#ccc;}.yui-skin-sam .yui-dialog .ft span.yui-button-disabled .first-child{border-color:#ccc;}.yui-skin-sam .yui-dialog .ft span.yui-button-disabled button{color:#a6a6a6;}.yui-skin-sam .yui-simple-dialog .bd .yui-icon{background:url(sprite.png) no-repeat 0 0;width:16px;height:16px;margin-right:10px;float:left;}.yui-skin-sam .yui-simple-dialog .bd span.blckicon{background-position:0 -1100px;}.yui-skin-sam .yui-simple-dialog .bd span.alrticon{background-position:0 -1050px;}.yui-skin-sam .yui-simple-dialog .bd span.hlpicon{background-position:0 -1150px;}.yui-skin-sam .yui-simple-dialog .bd span.infoicon{background-position:0 -1200px;}.yui-skin-sam .yui-simple-dialog .bd span.warnicon{background-position:0 -1900px;}.yui-skin-sam .yui-simple-dialog .bd span.tipicon{background-position:0 -1250px;}.yui-skin-sam .yui-tt .bd{position:relative;top:0;left:0;z-index:1;color:#000;padding:2px 5px;border-color:#D4C237 #A6982B #A6982B #A6982B;border-width:1px;border-style:solid;background-color:#FFEE69;}.yui-skin-sam .yui-tt.show-scrollbars .bd{overflow:auto;}.yui-skin-sam .yui-tt-shadow{top:2px;right:-3px;left:-3px;bottom:-3px;background-color:#000;}.yui-skin-sam .yui-tt-shadow-visible{opacity:.12;*filter:alpha(opacity=12);} +.yui-skin-sam .yui-dt-mask{position:absolute;z-index:9500;}.yui-dt-tmp{position:absolute;left:-9000px;}.yui-dt-scrollable .yui-dt-bd{overflow:auto;}.yui-dt-scrollable .yui-dt-hd{overflow:hidden;position:relative;}.yui-dt-scrollable .yui-dt-bd thead tr,.yui-dt-scrollable .yui-dt-bd thead th{position:absolute;left:-1500px;}.yui-dt-scrollable tbody{-moz-outline:none;}.yui-dt-draggable{cursor:move;}.yui-dt-coltarget{position:absolute;z-index:999;}.yui-dt-hd{zoom:1;}th.yui-dt-resizeable .yui-dt-resizerliner{position:relative;}.yui-dt-resizer{position:absolute;right:0;bottom:0;height:100%;cursor:e-resize;cursor:col-resize;background-color:#CCC;opacity:0;filter:alpha(opacity=0);}.yui-dt-resizerproxy{visibility:hidden;position:absolute;z-index:9000;}th.yui-dt-hidden .yui-dt-liner,td.yui-dt-hidden .yui-dt-liner,th.yui-dt-hidden .yui-dt-resizer{display:none;}.yui-dt-editor{position:absolute;z-index:9000;}.yui-skin-sam .yui-dt table{margin:0;padding:0;font-family:arial;font-size:inherit;border-collapse:separate;*border-collapse:collapse;border-spacing:0;border:1px solid #7F7F7F;}.yui-skin-sam .yui-dt thead{border-spacing:0;}.yui-skin-sam .yui-dt caption{color:#000000;font-size:85%;font-weight:normal;font-style:italic;line-height:1;padding:1em 0pt;text-align:center;}.yui-skin-sam .yui-dt th{background:#D8D8DA url(sprite.png) repeat-x 0 0;}.yui-skin-sam .yui-dt th,.yui-skin-sam .yui-dt th a{font-weight:normal;text-decoration:none;color:#000;vertical-align:bottom;}.yui-skin-sam .yui-dt th{margin:0;padding:0;border:none;border-right:1px solid #CBCBCB;}.yui-skin-sam .yui-dt tr.yui-dt-first td{border-top:1px solid #7F7F7F;}.yui-skin-sam .yui-dt th .yui-dt-liner{white-space:nowrap;}.yui-skin-sam .yui-dt-liner{margin:0;padding:0;padding:4px 10px 4px 10px;}.yui-skin-sam .yui-dt-coltarget{width:5px;background-color:red;}.yui-skin-sam .yui-dt td{margin:0;padding:0;border:none;border-right:1px solid #CBCBCB;text-align:left;}.yui-skin-sam .yui-dt-list td{border-right:none;}.yui-skin-sam .yui-dt-resizer{width:6px;}.yui-skin-sam .yui-dt-mask{background-color:#000;opacity:.25;*filter:alpha(opacity=25);}.yui-skin-sam .yui-dt-message{background-color:#FFF;}.yui-skin-sam .yui-dt-scrollable table{border:none;}.yui-skin-sam .yui-dt-scrollable .yui-dt-hd{border-left:1px solid #7F7F7F;border-top:1px solid #7F7F7F;border-right:1px solid #7F7F7F;}.yui-skin-sam .yui-dt-scrollable .yui-dt-bd{border-left:1px solid #7F7F7F;border-bottom:1px solid #7F7F7F;border-right:1px solid #7F7F7F;background-color:#FFF;}.yui-skin-sam .yui-dt-scrollable .yui-dt-data tr.yui-dt-last td{border-bottom:1px solid #7F7F7F;}.yui-skin-sam thead .yui-dt-sortable{cursor:pointer;}.yui-skin-sam th.yui-dt-asc,.yui-skin-sam th.yui-dt-desc{background:url(sprite.png) repeat-x 0 -100px;}.yui-skin-sam th.yui-dt-sortable .yui-dt-label{margin-right:10px;}.yui-skin-sam th.yui-dt-asc .yui-dt-liner{background:url(dt-arrow-up.png) no-repeat right;}.yui-skin-sam th.yui-dt-desc .yui-dt-liner{background:url(dt-arrow-dn.png) no-repeat right;}tbody .yui-dt-editable{cursor:pointer;}.yui-dt-editor{text-align:left;background-color:#F2F2F2;border:1px solid #808080;padding:6px;}.yui-dt-editor label{padding-left:4px;padding-right:6px;}.yui-dt-editor .yui-dt-button{padding-top:6px;text-align:right;}.yui-dt-editor .yui-dt-button button{background:url(sprite.png) repeat-x 0 0;border:1px solid #999;width:4em;height:1.8em;margin-left:6px;}.yui-dt-editor .yui-dt-button button.yui-dt-default{background:url(sprite.png) repeat-x 0 -1400px;background-color:#5584E0;border:1px solid #304369;color:#FFF}.yui-dt-editor .yui-dt-button button:hover{background:url(sprite.png) repeat-x 0 -1300px;color:#000;}.yui-dt-editor .yui-dt-button button:active{background:url(sprite.png) repeat-x 0 -1700px;color:#000;}.yui-skin-sam tr.yui-dt-even{background-color:#FFF;}.yui-skin-sam tr.yui-dt-odd{background-color:#EDF5FF;}.yui-skin-sam tr.yui-dt-even td.yui-dt-asc,.yui-skin-sam tr.yui-dt-even td.yui-dt-desc{background-color:#EDF5FF;}.yui-skin-sam tr.yui-dt-odd td.yui-dt-asc,.yui-skin-sam tr.yui-dt-odd td.yui-dt-desc{background-color:#DBEAFF;}.yui-skin-sam .yui-dt-list tr.yui-dt-even{background-color:#FFF;}.yui-skin-sam .yui-dt-list tr.yui-dt-odd{background-color:#FFF;}.yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-asc,.yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-desc{background-color:#EDF5FF;}.yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-asc,.yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-desc{background-color:#EDF5FF;}.yui-skin-sam th.yui-dt-highlighted,.yui-skin-sam th.yui-dt-highlighted a{background-color:#B2D2FF;}.yui-skin-sam tr.yui-dt-highlighted,.yui-skin-sam tr.yui-dt-highlighted td.yui-dt-asc,.yui-skin-sam tr.yui-dt-highlighted td.yui-dt-desc,.yui-skin-sam tr.yui-dt-even td.yui-dt-highlighted,.yui-skin-sam tr.yui-dt-odd td.yui-dt-highlighted{cursor:pointer;background-color:#B2D2FF;}.yui-skin-sam .yui-dt-list th.yui-dt-highlighted,.yui-skin-sam .yui-dt-list th.yui-dt-highlighted a{background-color:#B2D2FF;}.yui-skin-sam .yui-dt-list tr.yui-dt-highlighted,.yui-skin-sam .yui-dt-list tr.yui-dt-highlighted td.yui-dt-asc,.yui-skin-sam .yui-dt-list tr.yui-dt-highlighted td.yui-dt-desc,.yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-highlighted,.yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-highlighted{cursor:pointer;background-color:#B2D2FF;}.yui-skin-sam th.yui-dt-selected,.yui-skin-sam th.yui-dt-selected a{background-color:#446CD7;}.yui-skin-sam tr.yui-dt-selected td,.yui-skin-sam tr.yui-dt-selected td.yui-dt-asc,.yui-skin-sam tr.yui-dt-selected td.yui-dt-desc{background-color:#426FD9;color:#FFF;}.yui-skin-sam tr.yui-dt-even td.yui-dt-selected,.yui-skin-sam tr.yui-dt-odd td.yui-dt-selected{background-color:#446CD7;color:#FFF;}.yui-skin-sam .yui-dt-list th.yui-dt-selected,.yui-skin-sam .yui-dt-list th.yui-dt-selected a{background-color:#446CD7;}.yui-skin-sam .yui-dt-list tr.yui-dt-selected td,.yui-skin-sam .yui-dt-list tr.yui-dt-selected td.yui-dt-asc,.yui-skin-sam .yui-dt-list tr.yui-dt-selected td.yui-dt-desc{background-color:#426FD9;color:#FFF;}.yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-selected,.yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-selected{background-color:#446CD7;color:#FFF;}.yui-skin-sam .yui-dt-paginator{display:block;margin:6px 0;white-space:nowrap;}.yui-skin-sam .yui-dt-paginator .yui-dt-first,.yui-skin-sam .yui-dt-paginator .yui-dt-last,.yui-skin-sam .yui-dt-paginator .yui-dt-selected{padding:2px 6px;}.yui-skin-sam .yui-dt-paginator a.yui-dt-first,.yui-skin-sam .yui-dt-paginator a.yui-dt-last{text-decoration:none;}.yui-skin-sam .yui-dt-paginator .yui-dt-previous,.yui-skin-sam .yui-dt-paginator .yui-dt-next{display:none;}.yui-skin-sam a.yui-dt-page{border:1px solid #CBCBCB;padding:2px 6px;text-decoration:none;background-color:#fff}.yui-skin-sam .yui-dt-selected{border:1px solid #fff;background-color:#fff;} +.yui-busy{cursor:wait !important;}.yui-toolbar-container fieldset{padding:0;margin:0;border:0;}.yui-toolbar-container legend{display:none;}.yui-toolbar-container .yui-toolbar-subcont{padding:.25em 0;zoom:1;}.yui-toolbar-container-collapsed .yui-toolbar-subcont{display:none;}.yui-toolbar-container .yui-toolbar-subcont:after{display:block;clear:both;visibility:hidden;content:'.';height:0;}.yui-toolbar-container span.yui-toolbar-draghandle{cursor:move;border-left:1px solid #999;border-right:1px solid #999;overflow:hidden;text-indent:77777px;width:2px;height:20px;display:block;clear:none;float:left;margin:0 0 0 .2em;}.yui-toolbar-container .yui-toolbar-titlebar.draggable{cursor:move;}.yui-toolbar-container .yui-toolbar-titlebar{position:relative;}.yui-toolbar-container .yui-toolbar-titlebar h2{font-weight:bold;letter-spacing:0;border:none;color:#000;margin:0;padding:.2em;}.yui-toolbar-container .yui-toolbar-titlebar h2 a{text-decoration:none;color:#000;cursor:default;}.yui-toolbar-container.yui-toolbar-grouped span.yui-toolbar-draghandle{height:40px;}.yui-toolbar-container .yui-toolbar-group{float:left;margin-right:.5em;zoom:1;}.yui-toolbar-container .yui-toolbar-group:after{display:block;clear:both;visibility:hidden;content:'.';height:0;}.yui-toolbar-container .yui-toolbar-group h3{font-size:75%;padding:0 0 0 .25em;margin:0;}.yui-toolbar-container span.yui-toolbar-separator{width:2px;padding:0;height:18px;margin:.2em 0 .2em .1em;display:none;float:left;}.yui-toolbar-container.yui-toolbar-grouped span.yui-toolbar-separator{height:45px;*height:50px;}.yui-toolbar-container.yui-toolbar-grouped .yui-toolbar-group span.yui-toolbar-separator{height:18px;display:block;}.yui-toolbar-container ul li{margin:0;padding:0;list-style-type:none;}.yui-toolbar-container .yui-toolbar-nogrouplabels h3{display:none;}.yui-toolbar-container .yui-push-button,.yui-toolbar-container .yui-color-button,.yui-toolbar-container .yui-menu-button{position:relative;cursor:pointer;}.yui-toolbar-container .yui-button .first-child,.yui-toolbar-container .yui-button .first-child a{height:100%;width:100%;overflow:hidden;font-size:0px;}.yui-toolbar-container .yui-button-disabled{cursor:default;}.yui-toolbar-container .yui-button-disabled .yui-toolbar-icon{opacity:.5;filter:alpha(opacity=50);}.yui-toolbar-container .yui-button-disabled .up,.yui-toolbar-container .yui-button-disabled .down{opacity:.5;filter:alpha(opacity=50);}.yui-toolbar-container .yui-button a{overflow:hidden;}.yui-toolbar-container .yui-toolbar-select .first-child a{cursor:pointer;}.yui-toolbar-fontname-arial{font-family:Arial;}.yui-toolbar-fontname-arial-black{font-family:Arial Black;}.yui-toolbar-fontname-comic-sans-ms{font-family:Comic Sans MS;}.yui-toolbar-fontname-courier-new{font-family:Courier New;}.yui-toolbar-fontname-times-new-roman{font-family:Times New Roman;}.yui-toolbar-fontname-verdana{font-family:Verdana;}.yui-toolbar-fontname-impact{font-family:Impact;}.yui-toolbar-fontname-lucida-console{font-family:Lucida Console;}.yui-toolbar-fontname-tahoma{font-family:Tahoma;}.yui-toolbar-fontname-trebuchet-ms{font-family:Trebuchet MS;}.yui-toolbar-container .yui-toolbar-spinbutton{position:relative;}.yui-toolbar-container .yui-toolbar-spinbutton .first-child a{z-index:0;opacity:1;}.yui-toolbar-container .yui-toolbar-spinbutton a.up,.yui-toolbar-container .yui-toolbar-spinbutton a.down{position:absolute;display:block right:0;cursor:pointer;z-index:1;padding:0;margin:0;}.yui-toolbar-container .yui-overlay{position:absolute;}.yui-toolbar-container .yui-overlay ul li{margin:0;list-style-type:none;}.yui-toolbar-container{z-index:1;}.yui-editor-container .yui-editor-editable-container{position:relative;z-index:0;width:100%;}.yui-editor-container .yui-editor-masked{background-color:#CCC;}.yui-editor-container iframe{border:0px;padding:0;margin:0;zoom:1;display:block;}.yui-editor-container .yui-editor-editable{padding:0;margin:0;}.yui-editor-container .dompath{font-size:85%;}.yui-editor-panel .hd{text-align:left;position:relative;}.yui-editor-panel .hd h3{font-weight:bold;padding:0.25em 0pt 0.25em 0.25em;margin:0;}.yui-editor-panel .bd{width:100%;zoom:1;position:relative;}.yui-editor-panel .bd div.yui-editor-body-cont{padding:.25em .1em;zoom:1;}.yui-editor-panel .bd .gecko form{overflow:auto;}.yui-editor-panel .bd div.yui-editor-body-cont:after{display:block;clear:both;visibility:hidden;content:'.';height:0;}.yui-editor-panel .ft{text-align:right;width:99%;float:left;clear:both;}.yui-editor-panel .ft span.tip{display:block;position:relative;padding:.5em .5em .5em 23px;text-align:left;zoom:1;}.yui-editor-panel label{clear:both;float:left;padding:0;width:100%;text-align:left;zoom:1;}.yui-editor-panel .gecko label{overflow:auto;}.yui-editor-panel label strong{float:left;width:6em;}.yui-editor-panel .removeLink{width:80%;text-align:right;}.yui-editor-panel label input{margin-left:.25em;float:left;}.yui-editor-panel .yui-toolbar-group{margin-bottom:0.75em;}.yui-editor-panel .yui-toolbar-group-padding{}.yui-editor-panel .yui-toolbar-group-border{}.yui-editor-panel .yui-toolbar-group-textflow{}.yui-editor-panel .height-width{float:left;}.yui-editor-panel .height-width h3{}.yui-editor-panel .height-width span{font-style:italic;display:block;float:left;overflow:visible;}.yui-editor-panel .height-width span.info{font-size:70%;margin-top:3px;}.yui-editor-panel .yui-toolbar-bordersize,.yui-editor-panel .yui-toolbar-bordertype{font-size:75%;}.yui-editor-panel .yui-toolbar-container span.yui-toolbar-separator{border:none;}.yui-editor-panel .yui-toolbar-bordersize span a span,.yui-editor-panel .yui-toolbar-bordertype span a span{display:block;height:8px;left:4px;position:absolute;top:3px;_top:-5px;width:24px;text-indent:52px;font-size:0%;}.yui-editor-panel .yui-toolbar-bordertype span a span.yui-toolbar-bordertype-solid{border-bottom:1px solid black;}.yui-editor-panel .yui-toolbar-bordertype span a span.yui-toolbar-bordertype-dotted{border-bottom:1px dotted black;}.yui-editor-panel .yui-toolbar-bordertype span a span.yui-toolbar-bordertype-dashed{border-bottom:1px dashed black;}.yui-editor-panel .yui-toolbar-bordersize span a span.yui-toolbar-bordersize-0{*top:0px;text-indent:0px;font-size:75%;}.yui-editor-panel .yui-toolbar-bordersize span a span.yui-toolbar-bordersize-1{border-bottom:1px solid black;}.yui-editor-panel .yui-toolbar-bordersize span a span.yui-toolbar-bordersize-2{border-bottom:2px solid black;}.yui-editor-panel .yui-toolbar-bordersize span a span.yui-toolbar-bordersize-3{top:2px;*top:-5px;border-bottom:3px solid black;}.yui-editor-panel .yui-toolbar-bordersize span a span.yui-toolbar-bordersize-4{top:1px;*top:-5px;border-bottom:4px solid black;}.yui-editor-panel .yui-toolbar-bordersize span a span.yui-toolbar-bordersize-5{top:1px;*top:-5px;border-bottom:5px solid black;}.yui-toolbar-container .yui-toolbar-bordersize-menu,.yui-toolbar-container .yui-toolbar-bordertype-menu{width:95px !important;}.yui-toolbar-bordersize-menu .yuimenuitemlabel,.yui-toolbar-bordertype-menu .yuimenuitemlabel,.yui-toolbar-bordersize-menu .yuimenuitemlabel,.yui-toolbar-bordertype-menu .yuimenuitemlabel:hover{margin:0px 3px 7px 17px;}.yui-toolbar-bordersize-menu .yuimenuitemlabel .checkedindicator,.yui-toolbar-bordertype-menu .yuimenuitemlabel .checkedindicator{position:absolute;left:-12px;*top:14px;*left:0px;}.yui-toolbar-bordersize-menu li.yui-toolbar-bordersize-1 a{border-bottom:1px solid black;height:14px;}.yui-toolbar-bordersize-menu li.yui-toolbar-bordersize-2 a{border-bottom:2px solid black;height:14px;}.yui-toolbar-bordersize-menu li.yui-toolbar-bordersize-3 a{border-bottom:3px solid black;height:14px;}.yui-toolbar-bordersize-menu li.yui-toolbar-bordersize-4 a{border-bottom:4px solid black;height:14px;}.yui-toolbar-bordersize-menu li.yui-toolbar-bordersize-5 a{border-bottom:5px solid black;height:14px;}.yui-toolbar-bordertype-menu li.yui-toolbar-bordertype-solid a{border-bottom:1px solid black;height:14px;}.yui-toolbar-bordertype-menu li.yui-toolbar-bordertype-dashed a{border-bottom:1px dashed black;height:14px;}.yui-toolbar-bordertype-menu li.yui-toolbar-bordertype-dotted a{border-bottom:1px dotted black;height:14px;}h2.yui-editor-skipheader,h3.yui-editor-skipheader{height:0;margin:0;padding:0;border:none;width:0;overflow:hidden;position:absolute;}.yui-toolbar-colors{width:133px;zoom:1;display:none;z-index:100;overflow:hidden;}.yui-toolbar-colors:after{display:block;clear:both;visibility:hidden;content:'.';height:0;}.yui-toolbar-colors a{height:9px;width:9px;float:left;display:block;overflow:hidden;text-indent:999px;margin:0;cursor:pointer;border:1px solid #F6F7EE;}.yui-toolbar-colors a:hover{border:1px solid black;}.yui-color-button-menu{overflow:visible;background-color:transparent;}.yui-toolbar-colors span{position:relative;display:block;padding:3px;overflow:hidden;float:left;width:100%;zoom:1;}.yui-toolbar-colors span:after{display:block;clear:both;visibility:hidden;content:'.';height:0;}.yui-toolbar-colors span em{height:35px;width:30px;float:left;display:block;overflow:hidden;text-indent:999px;margin:0.75px;border:1px solid black;}.yui-toolbar-colors span strong{font-weight:normal;padding-left:3px;display:block;font-size:85%;float:left;width:65%;}.yui-toolbar-group-undoredo h3,.yui-toolbar-group-insertitem h3,.yui-toolbar-group-indentlist h3{width:68px;}.yui-toolbar-group-indentlist2 h3{width:122px;}.yui-toolbar-group-alignment h3{width:130px;}.yui-skin-sam .yui-editor-container{border:1px solid #808080;}.yui-skin-sam .yui-toolbar-container{zoom:1;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-titlebar{background:url(sprite.png) repeat-x 0 -200px;position:relative;}.yui-skin-sam .yui-editor-container .draggable .yui-toolbar-titlebar{cursor:move;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-titlebar h2{color:#000000;font-weight:bold;margin:0;padding:0.3em 1em;font-size:100%;text-align:left;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-group h3{color:#808080;font-size:75%;margin:1em 0 0;padding-bottom:0;padding-left:0.25em;text-align:left;}.yui-toolbar-container span.yui-toolbar-separator{border:none;text-indent:33px;overflow:hidden;margin:0 .25em;}.yui-skin-sam .yui-toolbar-container{background-color:#F2F2F2;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-subcont{padding:0 1em 0.35em;border-bottom:1px solid #808080;}.yui-skin-sam .yui-toolbar-container-collapsed .yui-toolbar-titlebar{border-bottom:1px solid #808080;}.yui-skin-sam .yui-editor-container .visible .yui-menu-shadow,.yui-skin-sam .yui-editor-panel .visible .yui-menu-shadow{display:none;}.yui-skin-sam .yui-editor-container ul{list-style-type:none;margin:0;padding:0;}.yui-skin-sam .yui-editor-container ul li{list-style-type:none;margin:0;padding:0;}.yui-skin-sam .yui-toolbar-group ul li.yui-toolbar-groupitem{float:left;}.yui-skin-sam .yui-editor-container .dompath{background-color:#F2F2F2;border-top:1px solid #808080;color:#999;text-align:left;padding:0.25em;}.yui-skin-sam .yui-toolbar-container .collapse{background:url(sprite.png) no-repeat 0 -400px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-titlebar span.collapse{cursor:pointer;position:absolute;top:4px;right:2px;display:block;overflow:hidden;height:15px;width:15px;text-indent:9999px;}.yui-skin-sam .yui-toolbar-container .yui-push-button,.yui-skin-sam .yui-toolbar-container .yui-color-button,.yui-skin-sam .yui-toolbar-container .yui-menu-button{background:url(sprite.png) repeat-x 0 0;position:relative;display:block;height:22px;width:30px;_font-size:0;margin:0;border-color:#808080;color:#f2f2f2;border-style:solid;border-width:1px 0;zoom:1;}.yui-skin-sam .yui-toolbar-container .yui-push-button a,.yui-skin-sam .yui-toolbar-container .yui-color-button a,.yui-skin-sam .yui-toolbar-container .yui-menu-button a{padding-left:35px;height:20px;text-decoration:none;font-size:0px;line-height:2;display:block;color:#000;overflow:hidden;white-space:nowrap;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-spinbutton a,.yui-skin-sam .yui-toolbar-container .yui-toolbar-select a{font-size:12px;}.yui-skin-sam .yui-toolbar-container .yui-push-button .first-child,.yui-skin-sam .yui-toolbar-container .yui-color-button .first-child,.yui-skin-sam .yui-toolbar-container .yui-menu-button .first-child{border-color:#808080;border-style:solid;border-width:0 1px;margin:0 -1px;display:block;position:relative;}.yui-skin-sam .yui-toolbar-container .yui-push-button-disabled .first-child,.yui-skin-sam .yui-toolbar-container .yui-color-button-disabled .first-child,.yui-skin-sam .yui-toolbar-container .yui-menu-button-disabled .first-child{border-color:#ccc;}.yui-skin-sam .yui-toolbar-container .yui-push-button-disabled a,.yui-skin-sam .yui-toolbar-container .yui-color-button-disabled a,.yui-skin-sam .yui-toolbar-container .yui-menu-button-disabled a{color:#A6A6A6;cursor:default;}.yui-skin-sam .yui-toolbar-container .yui-push-button-disabled,.yui-skin-sam .yui-toolbar-container .yui-color-button-disabled,.yui-skin-sam .yui-toolbar-container .yui-menu-button-disabled{border-color:#ccc;}.yui-skin-sam .yui-toolbar-container .yui-button .first-child{*left:0px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-fontname{width:135px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-heading{width:92px;}.yui-skin-sam .yui-toolbar-container .yui-button-hover{background:url(sprite.png) repeat-x 0 -1300px;border-color:#808080;}.yui-skin-sam .yui-toolbar-container .yui-button-selected{background:url(sprite.png) repeat-x 0 -1700px;border-color:#808080;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-nogrouplabels h3{display:none;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-nogrouplabels .yui-toolbar-group{margin-top:.75em;}.yui-skin-sam .yui-toolbar-container .yui-push-button span.yui-toolbar-icon,.yui-skin-sam .yui-toolbar-container .yui-color-button span.yui-toolbar-icon,.yui-skin-sam .yui-toolbar-container .yui-menu-button span.yui-toolbar-icon{display:block;position:absolute;top:2px;height:18px;width:18px;overflow:hidden;background:url(editor-sprite.gif) no-repeat 30px 30px;}.yui-skin-sam .yui-toolbar-container .yui-button-selected span.yui-toolbar-icon,.yui-skin-sam .yui-toolbar-container .yui-button-hover span.yui-toolbar-icon{background-image:url(editor-sprite-active.gif);}.yui-skin-sam .yui-toolbar-container .visible .yuimenuitemlabel{cursor:pointer;color:#000;*position:relative;}.yui-skin-sam .yui-toolbar-container .yui-button-menu{background-color:#fff;}.yui-skin-sam .yui-toolbar-container .yui-button-menu .yui-menu-body-scrolled{position:relative;}.yui-skin-sam div.yuimenu li.selected{background-color:#B3D4FF;}.yui-skin-sam div.yuimenu li.selected a.selected{color:#000;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-bold span.yui-toolbar-icon{background-position:0 0;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-strikethrough span.yui-toolbar-icon{background-position:0 -108px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-italic span.yui-toolbar-icon{background-position:0 -36px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-undo span.yui-toolbar-icon{background-position:0 -1326px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-redo span.yui-toolbar-icon{background-position:0 -1355px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-underline span.yui-toolbar-icon{background-position:0 -72px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-subscript span.yui-toolbar-icon{background-position:0 -180px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-superscript span.yui-toolbar-icon{background-position:0 -144px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-forecolor span.yui-toolbar-icon{background-position:0 -216px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-backcolor span.yui-toolbar-icon{background-position:0 -288px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-justifyleft span.yui-toolbar-icon{background-position:0 -324px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-justifycenter span.yui-toolbar-icon{background-position:0 -360px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-justifyright span.yui-toolbar-icon{background-position:0 -396px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-justifyfull span.yui-toolbar-icon{background-position:0 -432px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-indent span.yui-toolbar-icon{background-position:0 -720px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-outdent span.yui-toolbar-icon{background-position:0 -684px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-createlink span.yui-toolbar-icon{background-position:0 -792px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-insertimage span.yui-toolbar-icon{background-position:1px -756px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-left span.yui-toolbar-icon{background-position:0 -972px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-right span.yui-toolbar-icon{background-position:0 -936px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-inline span.yui-toolbar-icon{background-position:0 -900px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-block span.yui-toolbar-icon{background-position:0 -864px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-bordercolor span.yui-toolbar-icon{background-position:0 -252px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-removeformat span.yui-toolbar-icon{background-position:0 -1080px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-hiddenelements span.yui-toolbar-icon{background-position:0 -1044px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-insertunorderedlist span.yui-toolbar-icon{background-position:0 -468px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-insertorderedlist span.yui-toolbar-icon{background-position:0 -504px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-spinbutton,.yui-skin-sam .yui-toolbar-container .yui-toolbar-spinbutton .first-child{width:35px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-spinbutton .first-child a{padding-left:2px;text-align:left;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-spinbutton span.yui-toolbar-icon{display:none;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-spinbutton a.up,.yui-skin-sam .yui-toolbar-container .yui-toolbar-spinbutton a.down{right:2px;background:url(editor-sprite.gif) no-repeat 0 -1222px;overflow:hidden;height:6px;width:7px;min-height:0;padding:0;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-spinbutton a.up{top:2px;background-position:0 -1222px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-spinbutton a.down{bottom:2px;background-position:0 -1187px;}.yui-skin-sam .yui-toolbar-container select{height:22px;border:1px solid #808080;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-select .first-child a{padding-left:5px;text-align:left;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-select span.yui-toolbar-icon{background:url( editor-sprite.gif ) no-repeat 0 -1144px;overflow:hidden;right:-2px;top:0px;height:20px;}.yui-skin-sam .yui-editor-panel .yui-color-button-menu .bd{background-color:transparent;border:none;width:135px;}.yui-skin-sam .yui-color-button-menu .yui-toolbar-colors{border:1px solid #808080;}.yui-skin-sam .yui-editor-panel{padding:0;margin:0;border:none;background-color:transparent;overflow:visible;position:absolute;}.yui-skin-sam .yui-editor-panel .hd{margin:10px 0 0;padding:0;border:none;}.yui-skin-sam .yui-editor-panel .hd h3{color:#000;border:1px solid #808080;background:url(sprite.png) repeat-x 0 -200px;width:99%;position:relative;margin:0;padding:3px 0 0 0;font-size:93%;text-indent:5px;height:20px;}.yui-skin-sam .yui-editor-panel .bd{background-color:#F2F2F2;border-left:1px solid #808080;border-right:1px solid #808080;width:99%;margin:0;padding:0;overflow:visible;}.yui-skin-sam .yui-editor-panel ul{list-style-type:none;margin:0;padding:0;}.yui-skin-sam .yui-editor-panel ul li{margin:0;padding:0;}.yui-skin-sam .yui-editor-panel .yuimenu{}.yui-skin-sam .yui-editor-panel .yui-toolbar-container .yui-toolbar-subcont{padding:0;border:none;margin-top:0.35em;}.yui-skin-sam .yui-editor-panel .yui-toolbar-bordersize,.yui-skin-sam .yui-editor-panel .yui-toolbar-bordertype{width:50px;}.yui-skin-sam .yui-editor-panel label{display:block;float:none;padding:4px 0;margin-bottom:7px;}.yui-skin-sam .yui-editor-panel label strong{font-weight:normal;font-size:93%;text-align:right;padding-top:2px;}.yui-skin-sam .yui-editor-panel label input{width:75%;}.yui-skin-sam .yui-editor-panel .createlink_target,.yui-skin-sam .yui-editor-panel .insertimage_target{width:auto;margin-right:5px;}.yui-skin-sam .yui-editor-panel .removeLink{width:98%;}.yui-skin-sam .yui-editor-panel label input.warning{background-color:#FFEE69;}.yui-skin-sam .yui-editor-panel .yui-toolbar-group h3{color:#000;float:left;font-weight:normal;font-size:93%;margin:5px 0 0 0;padding:0 3px 0 0;text-align:right;}.yui-skin-sam .yui-editor-panel .height-width h3{margin:3px 0 0 10px;}.yui-skin-sam .yui-editor-panel .height-width{margin:3px 0 0 35px;*margin-left:14px;width:42%;*width:44%;}.yui-skin-sam .yui-editor-panel .yui-toolbar-group-border{width:190px;}.yui-skin-sam .yui-editor-panel .no-button .yui-toolbar-group-border{width:210px;}.yui-skin-sam .yui-editor-panel .yui-toolbar-group-padding{width:203px;_width:198px;}.yui-skin-sam .yui-editor-panel .no-button .yui-toolbar-group-padding{width:172px;}.yui-skin-sam .yui-editor-panel .yui-toolbar-group-padding h3{margin-left:25px;*margin-left:12px;}.yui-skin-sam .yui-editor-panel .yui-toolbar-group-textflow{width:182px;}.yui-skin-sam .yui-editor-panel .hd{background:none;}.yui-skin-sam .yui-editor-panel .ft{background-color:#F2F2F2;border:1px solid #808080;border-top:none;padding:0;margin:0 0 2px 0;}.yui-skin-sam .yui-editor-panel .hd span.close{background:url(sprite.png) no-repeat 0 -300px;cursor:pointer;display:block;height:16px;overflow:hidden;position:absolute;right:5px;text-indent:500px;top:2px;width:26px;}.yui-skin-sam .yui-editor-panel .ft span.tip{background-color:#EDF5FF;border-top:1px solid #808080;font-size:85%;}.yui-skin-sam .yui-editor-panel .ft span.tip strong{display:block;float:left;margin:0 2px 8px 0;}.yui-skin-sam .yui-editor-panel .ft span.tip span.icon{background:url( editor-sprite.gif ) no-repeat 0 -1260px;display:block;height:20px;left:2px;position:absolute;top:8px;width:20px;}.yui-skin-sam .yui-editor-panel .ft span.tip span.icon-info{background-position:2px -1260px;}.yui-skin-sam .yui-editor-panel .ft span.tip span.icon-warn{background-position:2px -1296px;}.yui-skin-sam .yui-editor-panel .hd span.knob{position:absolute;height:10px;width:28px;top:-10px;left:25px;text-indent:9999px;overflow:hidden;background:url( editor-knob.gif ) no-repeat 0 0;}.yui-skin-sam .yui-editor-panel .yui-toolbar-container{float:left;width:100%;background-image:none;border:none;}.yui-skin-sam .yui-editor-panel .yui-toolbar-container .bd{background-color:#ffffff;}.yui-editor-blankimage{background-image:url( blankimage.png );}.yui-skin-sam .yui-editor-container .yui-resize-handle-br{height:11px;width:11px;background-position:-20px -60px;background-color:transparent;} +.yui-crop{position:relative;}.yui-crop .yui-crop-mask{position:absolute;top:0;left:0;height:100%;width:100%;}.yui-crop .yui-resize{position:absolute;top:10px;left:10px;border:0;}.yui-crop .yui-crop-resize-mask{position:absolute;top:0;left:0;height:100%;width:100%;background-position:-10px -10px;overflow:hidden;}.yui-skin-sam .yui-crop .yui-crop-mask{background-color:#000;opacity:.5;filter:alpha(opacity=50);}.yui-skin-sam .yui-crop .yui-resize{border:1px dashed #fff;} +.yui-layout-loading{visibility:hidden;}body.yui-layout{overflow:hidden;position:relative;padding:0;margin:0;}.yui-layout-doc{position:relative;overflow:hidden;padding:0;margin:0;}.yui-layout-unit{height:50px;width:50px;padding:0;margin:0;float:none;z-index:0;}.yui-layout-unit-top{position:absolute;top:0;left:0;width:100%;}.yui-layout-unit-left{position:absolute;top:0;left:0;}.yui-layout-unit-right{position:absolute;top:0;right:0;}.yui-layout-unit-bottom{position:absolute;bottom:0;left:0;width:100%;}.yui-layout-unit-center{position:absolute;top:0;left:0;width:100%;}.yui-layout div.yui-layout-hd{position:absolute;top:0;left:0;zoom:1;width:100%;}.yui-layout div.yui-layout-bd{position:absolute;top:0;left:0;zoom:1;width:100%;}.yui-layout .yui-layout-noscroll div.yui-layout-bd{overflow:hidden;}.yui-layout .yui-layout-scroll div.yui-layout-bd{overflow:auto;}.yui-layout div.yui-layout-ft{position:absolute;bottom:0;left:0;width:100%;zoom:1;}.yui-layout .yui-layout-unit div.yui-layout-hd h2{text-align:left;}.yui-layout .yui-layout-unit div.yui-layout-hd .collapse{cursor:pointer;height:13px;position:absolute;right:2px;top:2px;width:17px;font-size:0;}.yui-layout .yui-layout-unit div.yui-layout-hd .close{cursor:pointer;height:13px;position:absolute;right:2px;top:2px;width:17px;font-size:0;}.yui-layout .yui-layout-unit div.yui-layout-hd .collapse-close{right:25px;}.yui-layout .yui-layout-clip{position:absolute;height:20px;background-color:#c0c0c0;display:none;}.yui-layout .yui-layout-clip .collapse{cursor:pointer;height:13px;position:absolute;right:2px;top:2px;width:17px;font-size:0px;}.yui-layout .yui-layout-wrap{height:100%;width:100%;position:absolute;left:0;}.yui-skin-sam .yui-layout .yui-resize-proxy{border:none;font-size:0;margin:0;padding:0;}.yui-skin-sam .yui-layout .yui-resize-resizing .yui-resize-handle{visibility:hidden;}.yui-skin-sam .yui-layout .yui-resize-proxy div{position:absolute;border:1px solid #808080;background-color:#EDF5FF;}.yui-skin-sam .yui-layout .yui-resize .yui-resize-handle-active{}.yui-skin-sam .yui-layout .yui-resize-proxy .yui-layout-handle-l{width:5px;height:100%;top:0;left:0;}.yui-skin-sam .yui-layout .yui-resize-proxy .yui-layout-handle-r{width:5px;top:0;right:0;height:100%;position:absolute;zoom:1;}.yui-skin-sam .yui-layout .yui-resize-proxy .yui-layout-handle-b{width:100%;bottom:0;left:0;height:5px;}.yui-skin-sam .yui-layout .yui-resize-proxy .yui-layout-handle-t{width:100%;top:0;left:0;height:5px;}.yui-skin-sam .yui-layout .yui-layout-unit-left div.yui-layout-hd .collapse{background:transparent url(layout_sprite.png) no-repeat -20px -160px;border:1px solid #808080;}.yui-skin-sam .yui-layout .yui-layout-clip-left .collapse{background:transparent url(layout_sprite.png) no-repeat -20px -140px;border:1px solid #808080;}.yui-skin-sam .yui-layout .yui-layout-unit-right div.yui-layout-hd .collapse{background:transparent url(layout_sprite.png) no-repeat -20px -200px;border:1px solid #808080;}.yui-skin-sam .yui-layout .yui-layout-clip-right .collapse{background:transparent url(layout_sprite.png) no-repeat -20px -120px;border:1px solid #808080;}.yui-skin-sam .yui-layout .yui-layout-unit-top div.yui-layout-hd .collapse{background:transparent url(layout_sprite.png) no-repeat -20px -220px;border:1px solid #808080;}.yui-skin-sam .yui-layout .yui-layout-clip-top .collapse{background:transparent url(layout_sprite.png) no-repeat -20px -240px;border:1px solid #808080;}.yui-skin-sam .yui-layout .yui-layout-unit-bottom div.yui-layout-hd .collapse{background:transparent url(layout_sprite.png) no-repeat -20px -260px;border:1px solid #808080;}.yui-skin-sam .yui-layout .yui-layout-clip-bottom .collapse{background:transparent url(layout_sprite.png) no-repeat -20px -180px;border:1px solid #808080;}.yui-skin-sam .yui-layout .yui-layout-unit div.yui-layout-hd .close{background:transparent url(layout_sprite.png) no-repeat -20px -100px;border:1px solid #808080;}.yui-skin-sam .yui-layout .yui-layout-hd{background:url(sprite.png) repeat-x 0 -1400px;border:1px solid #808080;}.yui-skin-sam .yui-layout{background-color:#EDF5FF;}.yui-skin-sam .yui-layout .yui-layout-unit div.yui-layout-hd h2{font-weight:bold;color:#fff;padding:3px;}.yui-skin-sam .yui-layout .yui-layout-unit div.yui-layout-bd{border:1px solid #808080;border-bottom:none;border-top:none;*border-bottom-width:0;*border-top-width:0;background-color:#f2f2f2;text-align:left;}.yui-skin-sam .yui-layout .yui-layout-unit div.yui-layout-bd-noft{border-bottom:1px solid #808080;}.yui-skin-sam .yui-layout .yui-layout-unit div.yui-layout-bd-nohd{border-top:1px solid #808080;}.yui-skin-sam .yui-layout .yui-layout-clip{position:absolute;height:20px;background-color:#EDF5FF;display:none;border:1px solid #808080;}.yui-skin-sam .yui-layout div.yui-layout-ft{border:1px solid #808080;border-top:none;*border-top-width:0;background-color:#f2f2f2;}.yui-skin-sam .yui-layout-unit .yui-resize-handle{background-color:transparent;}.yui-skin-sam .yui-layout-unit .yui-resize-handle-r{right:0;top:0;background-image:none;}.yui-skin-sam .yui-layout-unit .yui-resize-handle-l{left:0;top:0;background-image:none;}.yui-skin-sam .yui-layout-unit .yui-resize-handle-b{right:0;bottom:0;background-image:none;}.yui-skin-sam .yui-layout-unit .yui-resize-handle-t{right:0;top:0;background-image:none;}.yui-skin-sam .yui-layout-unit .yui-resize-handle-r .yui-layout-resize-knob,.yui-skin-sam .yui-layout-unit .yui-resize-handle-l .yui-layout-resize-knob{position:absolute;height:16px;width:6px;top:45%;left:0px;background:transparent url(layout_sprite.png) no-repeat 0 -5px;}.yui-skin-sam .yui-layout-unit .yui-resize-handle-t .yui-layout-resize-knob,.yui-skin-sam .yui-layout-unit .yui-resize-handle-b .yui-layout-resize-knob{position:absolute;height:6px;width:16px;left:45%;background:transparent url(layout_sprite.png) no-repeat -20px 0;} +.yui-skin-sam .yui-log{padding:1em;width:31em;background-color:#AAA;color:#000;border:1px solid black;font-family:monospace;font-size:77%;text-align:left;z-index:9000;}.yui-skin-sam .yui-log-container{position:absolute;top:1em;right:1em;}.yui-skin-sam .yui-log input{margin:0;padding:0;font-family:arial;font-size:100%;font-weight:normal;}.yui-skin-sam .yui-log .yui-log-btns{position:relative;float:right;bottom:.25em;}.yui-skin-sam .yui-log .yui-log-hd{margin-top:1em;padding:.5em;background-color:#575757;}.yui-skin-sam .yui-log .yui-log-hd h4{margin:0;padding:0;font-size:108%;font-weight:bold;color:#FFF;}.yui-skin-sam .yui-log .yui-log-bd{width:100%;height:20em;background-color:#FFF;border:1px solid gray;overflow:auto;}.yui-skin-sam .yui-log p{margin:1px;padding:.1em;}.yui-skin-sam .yui-log pre{margin:0;padding:0;}.yui-skin-sam .yui-log pre.yui-log-verbose{white-space:pre-wrap;white-space:-moz-pre-wrap !important;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word;}.yui-skin-sam .yui-log .yui-log-ft{margin-top:.5em;}.yui-skin-sam .yui-log .yui-log-ft .yui-log-categoryfilters{}.yui-skin-sam .yui-log .yui-log-ft .yui-log-sourcefilters{width:100%;border-top:1px solid #575757;margin-top:.75em;padding-top:.75em;}.yui-skin-sam .yui-log .yui-log-filtergrp{margin-right:.5em;}.yui-skin-sam .yui-log .info{background-color:#A7CC25;}.yui-skin-sam .yui-log .warn{background-color:#F58516;}.yui-skin-sam .yui-log .error{background-color:#E32F0B;}.yui-skin-sam .yui-log .time{background-color:#A6C9D7;}.yui-skin-sam .yui-log .window{background-color:#F2E886;} +.yuimenu{top:-999em;left:-999em;}.yuimenubar{position:static;}.yuimenu .yuimenu,.yuimenubar .yuimenu{position:absolute;}.yuimenubar li,.yuimenu li{list-style-type:none;}.yuimenubar ul,.yuimenu ul,.yuimenubar li,.yuimenu li,.yuimenu h6,.yuimenubar h6{margin:0;padding:0;}.yuimenuitemlabel,.yuimenubaritemlabel{text-align:left;white-space:nowrap;}.yuimenubar ul{*zoom:1;}.yuimenubar .yuimenu ul{*zoom:normal;}.yuimenubar>.bd>ul:after{content:".";display:block;clear:both;visibility:hidden;height:0;line-height:0;}.yuimenubaritem{float:left;}.yuimenubaritemlabel,.yuimenuitemlabel{display:block;}.yuimenuitemlabel .helptext{font-style:normal;display:block;margin:-1em 0 0 10em;}.yui-menu-shadow{position:absolute;visibility:hidden;z-index:-1;}.yui-menu-shadow-visible{top:2px;right:-3px;left:-3px;bottom:-3px;visibility:visible;}.hide-scrollbars *{overflow:hidden;}.hide-scrollbars select{display:none;}.yuimenu.show-scrollbars,.yuimenubar.show-scrollbars{overflow:visible;}.yuimenu.hide-scrollbars .yui-menu-shadow,.yuimenubar.hide-scrollbars .yui-menu-shadow{overflow:hidden;}.yuimenu.show-scrollbars .yui-menu-shadow,.yuimenubar.show-scrollbars .yui-menu-shadow{overflow:auto;}.yui-skin-sam .yuimenubar{font-size:93%;line-height:2;*line-height:1.9;border:solid 1px #808080;background:url(sprite.png) repeat-x 0 0;}.yui-skin-sam .yuimenubarnav .yuimenubaritem{border-right:solid 1px #ccc;}.yui-skin-sam .yuimenubaritemlabel{padding:0 10px;color:#000;text-decoration:none;cursor:default;border-style:solid;border-color:#808080;border-width:1px 0;*position:relative;margin:-1px 0;}.yui-skin-sam .yuimenubarnav .yuimenubaritemlabel{padding-right:20px;*display:inline-block;}.yui-skin-sam .yuimenubarnav .yuimenubaritemlabel-hassubmenu{background:url(menubaritem_submenuindicator.png) right center no-repeat;}.yui-skin-sam .yuimenubaritem-selected{background:url(sprite.png) repeat-x 0 -1700px;}.yui-skin-sam .yuimenubaritemlabel-selected{border-color:#7D98B8;}.yui-skin-sam .yuimenubarnav .yuimenubaritemlabel-selected{border-left-width:1px;margin-left:-1px;*left:-1px;}.yui-skin-sam .yuimenubaritemlabel-disabled{cursor:default;color:#A6A6A6;}.yui-skin-sam .yuimenubarnav .yuimenubaritemlabel-hassubmenu-disabled{background-image:url(menubaritem_submenuindicator_disabled.png);}.yui-skin-sam .yuimenu{font-size:93%;line-height:1.5;*line-height:1.45;}.yui-skin-sam .yuimenubar .yuimenu,.yui-skin-sam .yuimenu .yuimenu{font-size:100%;}.yui-skin-sam .yuimenu .bd{*zoom:1;_zoom:normal;border:solid 1px #808080;background-color:#fff;}.yui-skin-sam .yuimenu .yuimenu .bd{*zoom:normal;}.yui-skin-sam .yuimenu ul{padding:3px 0;border-width:1px 0 0 0;border-color:#ccc;border-style:solid;}.yui-skin-sam .yuimenu ul.first-of-type{border-width:0;}.yui-skin-sam .yuimenu h6{font-weight:bold;border-style:solid;border-color:#ccc;border-width:1px 0 0 0;color:#a4a4a4;padding:3px 10px 0 10px;}.yui-skin-sam .yuimenu ul.hastitle,.yui-skin-sam .yuimenu h6.first-of-type{border-width:0;}.yui-skin-sam .yuimenu .yui-menu-body-scrolled{border-color:#ccc #808080;overflow:hidden;}.yui-skin-sam .yuimenu .topscrollbar,.yui-skin-sam .yuimenu .bottomscrollbar{height:16px;border:solid 1px #808080;background:#fff url(sprite.png) no-repeat 0 0;}.yui-skin-sam .yuimenu .topscrollbar{border-bottom-width:0;background-position:center -950px;}.yui-skin-sam .yuimenu .topscrollbar_disabled{background-position:center -975px;}.yui-skin-sam .yuimenu .bottomscrollbar{border-top-width:0;background-position:center -850px;}.yui-skin-sam .yuimenu .bottomscrollbar_disabled{background-position:center -875px;}.yui-skin-sam .yuimenuitem{_border-bottom:solid 1px #fff;}.yui-skin-sam .yuimenuitemlabel{padding:0 20px;color:#000;text-decoration:none;cursor:default;}.yui-skin-sam .yuimenuitemlabel .helptext{margin-top:-1.5em;*margin-top:-1.45em;}.yui-skin-sam .yuimenuitem-hassubmenu{background-image:url(menuitem_submenuindicator.png);background-position:right center;background-repeat:no-repeat;}.yui-skin-sam .yuimenuitem-checked{background-image:url(menuitem_checkbox.png);background-position:left center;background-repeat:no-repeat;}.yui-skin-sam .yui-menu-shadow-visible{background-color:#000;opacity:.12;*filter:alpha(opacity=12);}.yui-skin-sam .yuimenuitem-selected{background-color:#B3D4FF;}.yui-skin-sam .yuimenuitemlabel-disabled{cursor:default;color:#A6A6A6;}.yui-skin-sam .yuimenuitem-hassubmenu-disabled{background-image:url(menuitem_submenuindicator_disabled.png);}.yui-skin-sam .yuimenuitem-checked-disabled{background-image:url(menuitem_checkbox_disabled.png);} +.yui-skin-sam .yui-pg-container{display:block;margin:6px 0;white-space:nowrap;}.yui-skin-sam .yui-pg-first,.yui-skin-sam .yui-pg-previous,.yui-skin-sam .yui-pg-next,.yui-skin-sam .yui-pg-last,.yui-skin-sam .yui-pg-current,.yui-skin-sam .yui-pg-pages,.yui-skin-sam .yui-pg-page{display:inline-block;font-family:arial,helvetica,clean,sans-serif;padding:3px 6px;zoom:1;}.yui-skin-sam .yui-pg-pages{padding:0;}.yui-skin-sam .yui-pg-current{padding:3px 0;}.yui-skin-sam a.yui-pg-first:link,.yui-skin-sam a.yui-pg-first:visited,.yui-skin-sam a.yui-pg-first:active,.yui-skin-sam a.yui-pg-first:hover,.yui-skin-sam a.yui-pg-previous:link,.yui-skin-sam a.yui-pg-previous:visited,.yui-skin-sam a.yui-pg-previous:active,.yui-skin-sam a.yui-pg-previous:hover,.yui-skin-sam a.yui-pg-next:link,.yui-skin-sam a.yui-pg-next:visited,.yui-skin-sam a.yui-pg-next:active,.yui-skin-sam a.yui-pg-next:hover,.yui-skin-sam a.yui-pg-last:link,.yui-skin-sam a.yui-pg-last:visited,.yui-skin-sam a.yui-pg-last:active,.yui-skin-sam a.yui-pg-last:hover,.yui-skin-sam a.yui-pg-page:link,.yui-skin-sam a.yui-pg-page:visited,.yui-skin-sam a.yui-pg-page:active,.yui-skin-sam a.yui-pg-page:hover{color:#06c;text-decoration:underline;outline:0;}.yui-skin-sam span.yui-pg-first,.yui-skin-sam span.yui-pg-previous,.yui-skin-sam span.yui-pg-next,.yui-skin-sam span.yui-pg-last{color:#a6a6a6;}.yui-skin-sam .yui-pg-page{background-color:#fff;border:1px solid #CBCBCB;padding:2px 6px;text-decoration:none;}.yui-skin-sam .yui-pg-current-page{background-color:transparent;border:none;font-weight:bold;padding:3px 6px;}.yui-skin-sam .yui-pg-page{margin-left:1px;margin-right:1px;}.yui-skin-sam .yui-pg-first,.yui-skin-sam .yui-pg-previous{padding-left:0;}.yui-skin-sam .yui-pg-next,.yui-skin-sam .yui-pg-last{padding-right:0;}.yui-skin-sam .yui-pg-current,.yui-skin-sam .yui-pg-rpp-options{margin-left:1em;margin-right:1em;} +.yui-skin-sam .yui-pv{background-color:#4a4a4a;font:arial;position:relative;width:99%;z-index:1000;margin-bottom:1em;overflow:hidden;}.yui-skin-sam .yui-pv .hd{background:url(header_background.png) repeat-x;min-height:30px;overflow:hidden;zoom:1;padding:2px 0;}.yui-skin-sam .yui-pv .hd h4{padding:8px 10px;margin:0;font:bold 14px arial;color:#fff;}.yui-skin-sam .yui-pv .hd a{background:#3f6bc3;font:bold 11px arial;color:#fff;padding:4px;margin:3px 10px 0 0;border:1px solid #3f567d;cursor:pointer;display:block;float:right;}.yui-skin-sam .yui-pv .hd span{display:none;}.yui-skin-sam .yui-pv .hd span.yui-pv-busy{height:18px;width:18px;background:url(wait.gif) no-repeat;overflow:hidden;display:block;float:right;margin:4px 10px 0 0;}.yui-skin-sam .yui-pv .hd:after,.yui-pv .bd:after,.yui-skin-sam .yui-pv-chartlegend dl:after{content:'.';visibility:hidden;clear:left;height:0;display:block;}.yui-skin-sam .yui-pv .bd{position:relative;zoom:1;overflow-x:auto;overflow-y:hidden;}.yui-skin-sam .yui-pv .yui-pv-table{padding:0 10px;margin:5px 0 10px 0;}.yui-skin-sam .yui-pv .yui-pv-table .yui-dt-bd td{color:#eeee5c;font:12px arial;}.yui-skin-sam .yui-pv .yui-pv-table tr.yui-dt-odd{background:#929292;}.yui-skin-sam .yui-pv .yui-pv-table tr.yui-dt-even{background:#58637a;}.yui-skin-sam .yui-pv .yui-pv-table tr.yui-dt-even td.yui-dt-asc,.yui-skin-sam .yui-pv .yui-pv-table tr.yui-dt-even td.yui-dt-desc{background:#384970;}.yui-skin-sam .yui-pv .yui-pv-table tr.yui-dt-odd td.yui-dt-asc,.yui-skin-sam .yui-pv .yui-pv-table tr.yui-dt-odd td.yui-dt-desc{background:#6F6E6E;}.yui-skin-sam .yui-pv .yui-pv-table .yui-dt-hd th{background-image:none;background:#2E2D2D;}.yui-skin-sam .yui-pv th.yui-dt-asc .yui-dt-liner{background:transparent url(asc.gif) no-repeat scroll right center;}.yui-skin-sam .yui-pv th.yui-dt-desc .yui-dt-liner{background:transparent url(desc.gif) no-repeat scroll right center;}.yui-skin-sam .yui-pv .yui-pv-table .yui-dt-hd th a{color:#fff;font:bold 12px arial;}.yui-skin-sam .yui-pv .yui-pv-table .yui-dt-hd th.yui-dt-asc,.yui-skin-sam .yui-pv .yui-pv-table .yui-dt-hd th.yui-dt-desc{background:#333;}.yui-skin-sam .yui-pv-chartcontainer{padding:0 10px;}.yui-skin-sam .yui-pv-chart{height:250px;clear:right;margin:5px 0 0 0;color:#fff;}.yui-skin-sam .yui-pv-chartlegend div{float:right;margin:0 0 0 10px;_width:250px;}.yui-skin-sam .yui-pv-chartlegend dl{border:1px solid #999;padding:.2em 0 .2em .5em;zoom:1;margin:5px 0;}.yui-skin-sam .yui-pv-chartlegend dt{float:left;display:block;height:.7em;width:.7em;padding:0;}.yui-skin-sam .yui-pv-chartlegend dd{float:left;display:block;color:#fff;margin:0 1em 0 .5em;padding:0;font:11px arial;}.yui-skin-sam .yui-pv-minimized{height:35px;}.yui-skin-sam .yui-pv-minimized .bd{top:-3000px;}.yui-skin-sam .yui-pv-minimized .hd a.yui-pv-refresh{display:none;} +.yui-resize{position:relative;zoom:1;z-index:0;}.yui-resize-wrap{zoom:1;}.yui-draggable{cursor:move;}.yui-resize .yui-resize-handle{position:absolute;z-index:1;font-size:0;margin:0;padding:0;zoom:1;height:1px;width:1px;}.yui-resize .yui-resize-handle-br{height:5px;width:5px;bottom:0;right:0;cursor:se-resize;z-index:2;zoom:1;}.yui-resize .yui-resize-handle-bl{height:5px;width:5px;bottom:0;left:0;cursor:sw-resize;z-index:2;zoom:1;}.yui-resize .yui-resize-handle-tl{height:5px;width:5px;top:0;left:0;cursor:nw-resize;z-index:2;zoom:1;}.yui-resize .yui-resize-handle-tr{height:5px;width:5px;top:0;right:0;cursor:ne-resize;z-index:2;zoom:1;}.yui-resize .yui-resize-handle-r{width:5px;height:100%;top:0;right:0;cursor:e-resize;zoom:1;}.yui-resize .yui-resize-handle-l{height:100%;width:5px;top:0;left:0;cursor:w-resize;zoom:1;}.yui-resize .yui-resize-handle-b{width:100%;height:5px;bottom:0;right:0;cursor:s-resize;zoom:1;}.yui-resize .yui-resize-handle-t{width:100%;height:5px;top:0;right:0;cursor:n-resize;zoom:1;}.yui-resize-proxy{position:absolute;border:1px dashed #000;visibility:hidden;z-index:1000;}.yui-resize-hover .yui-resize-handle,.yui-resize-hidden .yui-resize-handle{opacity:0;filter:alpha(opacity=0);}.yui-resize-ghost{opacity:.5;filter:alpha(opacity=50);}.yui-resize-knob .yui-resize-handle{height:6px;width:6px;}.yui-resize-knob .yui-resize-handle-tr{right:-3px;top:-3px;}.yui-resize-knob .yui-resize-handle-tl{left:-3px;top:-3px;}.yui-resize-knob .yui-resize-handle-bl{left:-3px;bottom:-3px;}.yui-resize-knob .yui-resize-handle-br{right:-3px;bottom:-3px;}.yui-resize-knob .yui-resize-handle-t{left:45%;top:-3px;}.yui-resize-knob .yui-resize-handle-r{right:-3px;top:45%;}.yui-resize-knob .yui-resize-handle-l{left:-3px;top:45%;}.yui-resize-knob .yui-resize-handle-b{left:45%;bottom:-3px;}.yui-resize-status{position:absolute;top:-999px;left:-999px;padding:2px;font-size:80%;display:none;zoom:1;z-index:9999;}.yui-resize-status strong,.yui-resize-status em{font-weight:normal;font-style:normal;padding:1px;zoom:1;}.yui-skin-sam .yui-resize .yui-resize-handle{background-color:#F2F2F2;}.yui-skin-sam .yui-resize .yui-resize-handle-active{background-color:#7D98B8;zoom:1;}.yui-skin-sam .yui-resize .yui-resize-handle-l,.yui-skin-sam .yui-resize .yui-resize-handle-r,.yui-skin-sam .yui-resize .yui-resize-handle-l-active,.yui-skin-sam .yui-resize .yui-resize-handle-r-active{height:100%;}.yui-skin-sam .yui-resize-knob .yui-resize-handle{border:1px solid #808080;}.yui-skin-sam .yui-resize-hover .yui-resize-handle-active{opacity:1;filter:alpha(opacity=100);}.yui-skin-sam .yui-resize-proxy{border:1px dashed #426FD9;}.yui-skin-sam .yui-resize-status{border:1px solid #A6982B;border-top:1px solid #D4C237;background-color:#FFEE69;color:#000;}.yui-skin-sam .yui-resize-status strong,.yui-skin-sam .yui-resize-status em{float:left;display:block;clear:both;padding:1px;text-align:center;}.yui-skin-sam .yui-resize .yui-resize-handle-inner-r,.yui-skin-sam .yui-resize .yui-resize-handle-inner-l{background:transparent url( layout_sprite.png) no-repeat 0 -5px;height:16px;width:5px;position:absolute;top:45%;}.yui-skin-sam .yui-resize .yui-resize-handle-inner-t,.yui-skin-sam .yui-resize .yui-resize-handle-inner-b{background:transparent url(layout_sprite.png) no-repeat -20px 0;height:5px;width:16px;position:absolute;left:50%;}.yui-skin-sam .yui-resize .yui-resize-handle-br{background-image:url( layout_sprite.png );background-repeat:no-repeat;background-position:-22px -62px;}.yui-skin-sam .yui-resize .yui-resize-handle-tr{background-image:url( layout_sprite.png );background-repeat:no-repeat;background-position:-22px -42px;}.yui-skin-sam .yui-resize .yui-resize-handle-tl{background-image:url( layout_sprite.png );background-repeat:no-repeat;background-position:-22px -82px;}.yui-skin-sam .yui-resize .yui-resize-handle-bl{background-image:url( layout_sprite.png );background-repeat:no-repeat;background-position:-22px -23px;}.yui-skin-sam .yui-resize-knob .yui-resize-handle-t,.yui-skin-sam .yui-resize-knob .yui-resize-handle-r,.yui-skin-sam .yui-resize-knob .yui-resize-handle-b,.yui-skin-sam .yui-resize-knob .yui-resize-handle-l,.yui-skin-sam .yui-resize-knob .yui-resize-handle-tl,.yui-skin-sam .yui-resize-knob .yui-resize-handle-tr,.yui-skin-sam .yui-resize-knob .yui-resize-handle-bl,.yui-skin-sam .yui-resize-knob .yui-resize-handle-br,.yui-skin-sam .yui-resize-knob .yui-resize-handle-inner-t,.yui-skin-sam .yui-resize-knob .yui-resize-handle-inner-r,.yui-skin-sam .yui-resize-knob .yui-resize-handle-inner-b,.yui-skin-sam .yui-resize-knob .yui-resize-handle-inner-l,.yui-skin-sam .yui-resize-knob .yui-resize-handle-inner-tl,.yui-skin-sam .yui-resize-knob .yui-resize-handle-inner-tr,.yui-skin-sam .yui-resize-knob .yui-resize-handle-inner-bl,.yui-skin-sam .yui-resize-knob .yui-resize-handle-inner-br{background-image:none;}.yui-skin-sam .yui-resize-knob .yui-resize-handle-l,.yui-skin-sam .yui-resize-knob .yui-resize-handle-r,.yui-skin-sam .yui-resize-knob .yui-resize-handle-l-active,.yui-skin-sam .yui-resize-knob .yui-resize-handle-r-active{height:6px;width:6px;} +.yui-busy{cursor:wait !important;}.yui-toolbar-container fieldset{padding:0;margin:0;border:0;}.yui-toolbar-container legend{display:none;}.yui-toolbar-container .yui-toolbar-subcont{padding:.25em 0;zoom:1;}.yui-toolbar-container-collapsed .yui-toolbar-subcont{display:none;}.yui-toolbar-container .yui-toolbar-subcont:after{display:block;clear:both;visibility:hidden;content:'.';height:0;}.yui-toolbar-container span.yui-toolbar-draghandle{cursor:move;border-left:1px solid #999;border-right:1px solid #999;overflow:hidden;text-indent:77777px;width:2px;height:20px;display:block;clear:none;float:left;margin:0 0 0 .2em;}.yui-toolbar-container .yui-toolbar-titlebar.draggable{cursor:move;}.yui-toolbar-container .yui-toolbar-titlebar{position:relative;}.yui-toolbar-container .yui-toolbar-titlebar h2{font-weight:bold;letter-spacing:0;border:none;color:#000;margin:0;padding:.2em;}.yui-toolbar-container .yui-toolbar-titlebar h2 a{text-decoration:none;color:#000;cursor:default;}.yui-toolbar-container.yui-toolbar-grouped span.yui-toolbar-draghandle{height:40px;}.yui-toolbar-container .yui-toolbar-group{float:left;margin-right:.5em;zoom:1;}.yui-toolbar-container .yui-toolbar-group:after{display:block;clear:both;visibility:hidden;content:'.';height:0;}.yui-toolbar-container .yui-toolbar-group h3{font-size:75%;padding:0 0 0 .25em;margin:0;}.yui-toolbar-container span.yui-toolbar-separator{width:2px;padding:0;height:18px;margin:.2em 0 .2em .1em;display:none;float:left;}.yui-toolbar-container.yui-toolbar-grouped span.yui-toolbar-separator{height:45px;*height:50px;}.yui-toolbar-container.yui-toolbar-grouped .yui-toolbar-group span.yui-toolbar-separator{height:18px;display:block;}.yui-toolbar-container ul li{margin:0;padding:0;list-style-type:none;}.yui-toolbar-container .yui-toolbar-nogrouplabels h3{display:none;}.yui-toolbar-container .yui-push-button,.yui-toolbar-container .yui-color-button,.yui-toolbar-container .yui-menu-button{position:relative;cursor:pointer;}.yui-toolbar-container .yui-button .first-child,.yui-toolbar-container .yui-button .first-child a{height:100%;width:100%;overflow:hidden;font-size:0px;}.yui-toolbar-container .yui-button-disabled{cursor:default;}.yui-toolbar-container .yui-button-disabled .yui-toolbar-icon{opacity:.5;filter:alpha(opacity=50);}.yui-toolbar-container .yui-button-disabled .up,.yui-toolbar-container .yui-button-disabled .down{opacity:.5;filter:alpha(opacity=50);}.yui-toolbar-container .yui-button a{overflow:hidden;}.yui-toolbar-container .yui-toolbar-select .first-child a{cursor:pointer;}.yui-toolbar-fontname-arial{font-family:Arial;}.yui-toolbar-fontname-arial-black{font-family:Arial Black;}.yui-toolbar-fontname-comic-sans-ms{font-family:Comic Sans MS;}.yui-toolbar-fontname-courier-new{font-family:Courier New;}.yui-toolbar-fontname-times-new-roman{font-family:Times New Roman;}.yui-toolbar-fontname-verdana{font-family:Verdana;}.yui-toolbar-fontname-impact{font-family:Impact;}.yui-toolbar-fontname-lucida-console{font-family:Lucida Console;}.yui-toolbar-fontname-tahoma{font-family:Tahoma;}.yui-toolbar-fontname-trebuchet-ms{font-family:Trebuchet MS;}.yui-toolbar-container .yui-toolbar-spinbutton{position:relative;}.yui-toolbar-container .yui-toolbar-spinbutton .first-child a{z-index:0;opacity:1;}.yui-toolbar-container .yui-toolbar-spinbutton a.up,.yui-toolbar-container .yui-toolbar-spinbutton a.down{position:absolute;display:block right:0;cursor:pointer;z-index:1;padding:0;margin:0;}.yui-toolbar-container .yui-overlay{position:absolute;}.yui-toolbar-container .yui-overlay ul li{margin:0;list-style-type:none;}.yui-toolbar-container{z-index:1;}.yui-editor-container .yui-editor-editable-container{position:relative;z-index:0;width:100%;}.yui-editor-container .yui-editor-masked{background-color:#CCC;}.yui-editor-container iframe{border:0px;padding:0;margin:0;zoom:1;display:block;}.yui-editor-container .yui-editor-editable{padding:0;margin:0;}.yui-editor-container .dompath{font-size:85%;}.yui-editor-panel .hd{text-align:left;position:relative;}.yui-editor-panel .hd h3{font-weight:bold;padding:0.25em 0pt 0.25em 0.25em;margin:0;}.yui-editor-panel .bd{width:100%;zoom:1;position:relative;}.yui-editor-panel .bd div.yui-editor-body-cont{padding:.25em .1em;zoom:1;}.yui-editor-panel .bd .gecko form{overflow:auto;}.yui-editor-panel .bd div.yui-editor-body-cont:after{display:block;clear:both;visibility:hidden;content:'.';height:0;}.yui-editor-panel .ft{text-align:right;width:99%;float:left;clear:both;}.yui-editor-panel .ft span.tip{display:block;position:relative;padding:.5em .5em .5em 23px;text-align:left;zoom:1;}.yui-editor-panel label{clear:both;float:left;padding:0;width:100%;text-align:left;zoom:1;}.yui-editor-panel .gecko label{overflow:auto;}.yui-editor-panel label strong{float:left;width:6em;}.yui-editor-panel .removeLink{width:80%;text-align:right;}.yui-editor-panel label input{margin-left:.25em;float:left;}.yui-editor-panel .yui-toolbar-group{margin-bottom:0.75em;}.yui-editor-panel .yui-toolbar-group-padding{}.yui-editor-panel .yui-toolbar-group-border{}.yui-editor-panel .yui-toolbar-group-textflow{}.yui-editor-panel .height-width{float:left;}.yui-editor-panel .height-width h3{}.yui-editor-panel .height-width span{font-style:italic;display:block;float:left;overflow:visible;}.yui-editor-panel .height-width span.info{font-size:70%;margin-top:3px;}.yui-editor-panel .yui-toolbar-bordersize,.yui-editor-panel .yui-toolbar-bordertype{font-size:75%;}.yui-editor-panel .yui-toolbar-container span.yui-toolbar-separator{border:none;}.yui-editor-panel .yui-toolbar-bordersize span a span,.yui-editor-panel .yui-toolbar-bordertype span a span{display:block;height:8px;left:4px;position:absolute;top:3px;_top:-5px;width:24px;text-indent:52px;font-size:0%;}.yui-editor-panel .yui-toolbar-bordertype span a span.yui-toolbar-bordertype-solid{border-bottom:1px solid black;}.yui-editor-panel .yui-toolbar-bordertype span a span.yui-toolbar-bordertype-dotted{border-bottom:1px dotted black;}.yui-editor-panel .yui-toolbar-bordertype span a span.yui-toolbar-bordertype-dashed{border-bottom:1px dashed black;}.yui-editor-panel .yui-toolbar-bordersize span a span.yui-toolbar-bordersize-0{*top:0px;text-indent:0px;font-size:75%;}.yui-editor-panel .yui-toolbar-bordersize span a span.yui-toolbar-bordersize-1{border-bottom:1px solid black;}.yui-editor-panel .yui-toolbar-bordersize span a span.yui-toolbar-bordersize-2{border-bottom:2px solid black;}.yui-editor-panel .yui-toolbar-bordersize span a span.yui-toolbar-bordersize-3{top:2px;*top:-5px;border-bottom:3px solid black;}.yui-editor-panel .yui-toolbar-bordersize span a span.yui-toolbar-bordersize-4{top:1px;*top:-5px;border-bottom:4px solid black;}.yui-editor-panel .yui-toolbar-bordersize span a span.yui-toolbar-bordersize-5{top:1px;*top:-5px;border-bottom:5px solid black;}.yui-toolbar-container .yui-toolbar-bordersize-menu,.yui-toolbar-container .yui-toolbar-bordertype-menu{width:95px !important;}.yui-toolbar-bordersize-menu .yuimenuitemlabel,.yui-toolbar-bordertype-menu .yuimenuitemlabel,.yui-toolbar-bordersize-menu .yuimenuitemlabel,.yui-toolbar-bordertype-menu .yuimenuitemlabel:hover{margin:0px 3px 7px 17px;}.yui-toolbar-bordersize-menu .yuimenuitemlabel .checkedindicator,.yui-toolbar-bordertype-menu .yuimenuitemlabel .checkedindicator{position:absolute;left:-12px;*top:14px;*left:0px;}.yui-toolbar-bordersize-menu li.yui-toolbar-bordersize-1 a{border-bottom:1px solid black;height:14px;}.yui-toolbar-bordersize-menu li.yui-toolbar-bordersize-2 a{border-bottom:2px solid black;height:14px;}.yui-toolbar-bordersize-menu li.yui-toolbar-bordersize-3 a{border-bottom:3px solid black;height:14px;}.yui-toolbar-bordersize-menu li.yui-toolbar-bordersize-4 a{border-bottom:4px solid black;height:14px;}.yui-toolbar-bordersize-menu li.yui-toolbar-bordersize-5 a{border-bottom:5px solid black;height:14px;}.yui-toolbar-bordertype-menu li.yui-toolbar-bordertype-solid a{border-bottom:1px solid black;height:14px;}.yui-toolbar-bordertype-menu li.yui-toolbar-bordertype-dashed a{border-bottom:1px dashed black;height:14px;}.yui-toolbar-bordertype-menu li.yui-toolbar-bordertype-dotted a{border-bottom:1px dotted black;height:14px;}h2.yui-editor-skipheader,h3.yui-editor-skipheader{height:0;margin:0;padding:0;border:none;width:0;overflow:hidden;position:absolute;}.yui-toolbar-colors{width:133px;zoom:1;display:none;z-index:100;overflow:hidden;}.yui-toolbar-colors:after{display:block;clear:both;visibility:hidden;content:'.';height:0;}.yui-toolbar-colors a{height:9px;width:9px;float:left;display:block;overflow:hidden;text-indent:999px;margin:0;cursor:pointer;border:1px solid #F6F7EE;}.yui-toolbar-colors a:hover{border:1px solid black;}.yui-color-button-menu{overflow:visible;background-color:transparent;}.yui-toolbar-colors span{position:relative;display:block;padding:3px;overflow:hidden;float:left;width:100%;zoom:1;}.yui-toolbar-colors span:after{display:block;clear:both;visibility:hidden;content:'.';height:0;}.yui-toolbar-colors span em{height:35px;width:30px;float:left;display:block;overflow:hidden;text-indent:999px;margin:0.75px;border:1px solid black;}.yui-toolbar-colors span strong{font-weight:normal;padding-left:3px;display:block;font-size:85%;float:left;width:65%;}.yui-toolbar-group-undoredo h3,.yui-toolbar-group-insertitem h3,.yui-toolbar-group-indentlist h3{width:68px;}.yui-toolbar-group-indentlist2 h3{width:122px;}.yui-toolbar-group-alignment h3{width:130px;}.yui-skin-sam .yui-editor-container{border:1px solid #808080;}.yui-skin-sam .yui-toolbar-container{zoom:1;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-titlebar{background:url(sprite.png) repeat-x 0 -200px;position:relative;}.yui-skin-sam .yui-editor-container .draggable .yui-toolbar-titlebar{cursor:move;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-titlebar h2{color:#000000;font-weight:bold;margin:0;padding:0.3em 1em;font-size:100%;text-align:left;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-group h3{color:#808080;font-size:75%;margin:1em 0 0;padding-bottom:0;padding-left:0.25em;text-align:left;}.yui-toolbar-container span.yui-toolbar-separator{border:none;text-indent:33px;overflow:hidden;margin:0 .25em;}.yui-skin-sam .yui-toolbar-container{background-color:#F2F2F2;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-subcont{padding:0 1em 0.35em;border-bottom:1px solid #808080;}.yui-skin-sam .yui-toolbar-container-collapsed .yui-toolbar-titlebar{border-bottom:1px solid #808080;}.yui-skin-sam .yui-editor-container .visible .yui-menu-shadow,.yui-skin-sam .yui-editor-panel .visible .yui-menu-shadow{display:none;}.yui-skin-sam .yui-editor-container ul{list-style-type:none;margin:0;padding:0;}.yui-skin-sam .yui-editor-container ul li{list-style-type:none;margin:0;padding:0;}.yui-skin-sam .yui-toolbar-group ul li.yui-toolbar-groupitem{float:left;}.yui-skin-sam .yui-editor-container .dompath{background-color:#F2F2F2;border-top:1px solid #808080;color:#999;text-align:left;padding:0.25em;}.yui-skin-sam .yui-toolbar-container .collapse{background:url(sprite.png) no-repeat 0 -400px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-titlebar span.collapse{cursor:pointer;position:absolute;top:4px;right:2px;display:block;overflow:hidden;height:15px;width:15px;text-indent:9999px;}.yui-skin-sam .yui-toolbar-container .yui-push-button,.yui-skin-sam .yui-toolbar-container .yui-color-button,.yui-skin-sam .yui-toolbar-container .yui-menu-button{background:url(sprite.png) repeat-x 0 0;position:relative;display:block;height:22px;width:30px;_font-size:0;margin:0;border-color:#808080;color:#f2f2f2;border-style:solid;border-width:1px 0;zoom:1;}.yui-skin-sam .yui-toolbar-container .yui-push-button a,.yui-skin-sam .yui-toolbar-container .yui-color-button a,.yui-skin-sam .yui-toolbar-container .yui-menu-button a{padding-left:35px;height:20px;text-decoration:none;font-size:0px;line-height:2;display:block;color:#000;overflow:hidden;white-space:nowrap;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-spinbutton a,.yui-skin-sam .yui-toolbar-container .yui-toolbar-select a{font-size:12px;}.yui-skin-sam .yui-toolbar-container .yui-push-button .first-child,.yui-skin-sam .yui-toolbar-container .yui-color-button .first-child,.yui-skin-sam .yui-toolbar-container .yui-menu-button .first-child{border-color:#808080;border-style:solid;border-width:0 1px;margin:0 -1px;display:block;position:relative;}.yui-skin-sam .yui-toolbar-container .yui-push-button-disabled .first-child,.yui-skin-sam .yui-toolbar-container .yui-color-button-disabled .first-child,.yui-skin-sam .yui-toolbar-container .yui-menu-button-disabled .first-child{border-color:#ccc;}.yui-skin-sam .yui-toolbar-container .yui-push-button-disabled a,.yui-skin-sam .yui-toolbar-container .yui-color-button-disabled a,.yui-skin-sam .yui-toolbar-container .yui-menu-button-disabled a{color:#A6A6A6;cursor:default;}.yui-skin-sam .yui-toolbar-container .yui-push-button-disabled,.yui-skin-sam .yui-toolbar-container .yui-color-button-disabled,.yui-skin-sam .yui-toolbar-container .yui-menu-button-disabled{border-color:#ccc;}.yui-skin-sam .yui-toolbar-container .yui-button .first-child{*left:0px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-fontname{width:135px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-heading{width:92px;}.yui-skin-sam .yui-toolbar-container .yui-button-hover{background:url(sprite.png) repeat-x 0 -1300px;border-color:#808080;}.yui-skin-sam .yui-toolbar-container .yui-button-selected{background:url(sprite.png) repeat-x 0 -1700px;border-color:#808080;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-nogrouplabels h3{display:none;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-nogrouplabels .yui-toolbar-group{margin-top:.75em;}.yui-skin-sam .yui-toolbar-container .yui-push-button span.yui-toolbar-icon,.yui-skin-sam .yui-toolbar-container .yui-color-button span.yui-toolbar-icon,.yui-skin-sam .yui-toolbar-container .yui-menu-button span.yui-toolbar-icon{display:block;position:absolute;top:2px;height:18px;width:18px;overflow:hidden;background:url(editor-sprite.gif) no-repeat 30px 30px;}.yui-skin-sam .yui-toolbar-container .yui-button-selected span.yui-toolbar-icon,.yui-skin-sam .yui-toolbar-container .yui-button-hover span.yui-toolbar-icon{background-image:url(editor-sprite-active.gif);}.yui-skin-sam .yui-toolbar-container .visible .yuimenuitemlabel{cursor:pointer;color:#000;*position:relative;}.yui-skin-sam .yui-toolbar-container .yui-button-menu{background-color:#fff;}.yui-skin-sam .yui-toolbar-container .yui-button-menu .yui-menu-body-scrolled{position:relative;}.yui-skin-sam div.yuimenu li.selected{background-color:#B3D4FF;}.yui-skin-sam div.yuimenu li.selected a.selected{color:#000;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-bold span.yui-toolbar-icon{background-position:0 0;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-strikethrough span.yui-toolbar-icon{background-position:0 -108px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-italic span.yui-toolbar-icon{background-position:0 -36px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-undo span.yui-toolbar-icon{background-position:0 -1326px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-redo span.yui-toolbar-icon{background-position:0 -1355px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-underline span.yui-toolbar-icon{background-position:0 -72px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-subscript span.yui-toolbar-icon{background-position:0 -180px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-superscript span.yui-toolbar-icon{background-position:0 -144px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-forecolor span.yui-toolbar-icon{background-position:0 -216px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-backcolor span.yui-toolbar-icon{background-position:0 -288px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-justifyleft span.yui-toolbar-icon{background-position:0 -324px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-justifycenter span.yui-toolbar-icon{background-position:0 -360px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-justifyright span.yui-toolbar-icon{background-position:0 -396px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-justifyfull span.yui-toolbar-icon{background-position:0 -432px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-indent span.yui-toolbar-icon{background-position:0 -720px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-outdent span.yui-toolbar-icon{background-position:0 -684px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-createlink span.yui-toolbar-icon{background-position:0 -792px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-insertimage span.yui-toolbar-icon{background-position:1px -756px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-left span.yui-toolbar-icon{background-position:0 -972px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-right span.yui-toolbar-icon{background-position:0 -936px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-inline span.yui-toolbar-icon{background-position:0 -900px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-block span.yui-toolbar-icon{background-position:0 -864px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-bordercolor span.yui-toolbar-icon{background-position:0 -252px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-removeformat span.yui-toolbar-icon{background-position:0 -1080px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-hiddenelements span.yui-toolbar-icon{background-position:0 -1044px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-insertunorderedlist span.yui-toolbar-icon{background-position:0 -468px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-insertorderedlist span.yui-toolbar-icon{background-position:0 -504px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-spinbutton,.yui-skin-sam .yui-toolbar-container .yui-toolbar-spinbutton .first-child{width:35px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-spinbutton .first-child a{padding-left:2px;text-align:left;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-spinbutton span.yui-toolbar-icon{display:none;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-spinbutton a.up,.yui-skin-sam .yui-toolbar-container .yui-toolbar-spinbutton a.down{right:2px;background:url(editor-sprite.gif) no-repeat 0 -1222px;overflow:hidden;height:6px;width:7px;min-height:0;padding:0;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-spinbutton a.up{top:2px;background-position:0 -1222px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-spinbutton a.down{bottom:2px;background-position:0 -1187px;}.yui-skin-sam .yui-toolbar-container select{height:22px;border:1px solid #808080;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-select .first-child a{padding-left:5px;text-align:left;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-select span.yui-toolbar-icon{background:url( editor-sprite.gif ) no-repeat 0 -1144px;overflow:hidden;right:-2px;top:0px;height:20px;}.yui-skin-sam .yui-editor-panel .yui-color-button-menu .bd{background-color:transparent;border:none;width:135px;}.yui-skin-sam .yui-color-button-menu .yui-toolbar-colors{border:1px solid #808080;}.yui-skin-sam .yui-editor-panel{padding:0;margin:0;border:none;background-color:transparent;overflow:visible;position:absolute;}.yui-skin-sam .yui-editor-panel .hd{margin:10px 0 0;padding:0;border:none;}.yui-skin-sam .yui-editor-panel .hd h3{color:#000;border:1px solid #808080;background:url(sprite.png) repeat-x 0 -200px;width:99%;position:relative;margin:0;padding:3px 0 0 0;font-size:93%;text-indent:5px;height:20px;}.yui-skin-sam .yui-editor-panel .bd{background-color:#F2F2F2;border-left:1px solid #808080;border-right:1px solid #808080;width:99%;margin:0;padding:0;overflow:visible;}.yui-skin-sam .yui-editor-panel ul{list-style-type:none;margin:0;padding:0;}.yui-skin-sam .yui-editor-panel ul li{margin:0;padding:0;}.yui-skin-sam .yui-editor-panel .yuimenu{}.yui-skin-sam .yui-editor-panel .yui-toolbar-container .yui-toolbar-subcont{padding:0;border:none;margin-top:0.35em;}.yui-skin-sam .yui-editor-panel .yui-toolbar-bordersize,.yui-skin-sam .yui-editor-panel .yui-toolbar-bordertype{width:50px;}.yui-skin-sam .yui-editor-panel label{display:block;float:none;padding:4px 0;margin-bottom:7px;}.yui-skin-sam .yui-editor-panel label strong{font-weight:normal;font-size:93%;text-align:right;padding-top:2px;}.yui-skin-sam .yui-editor-panel label input{width:75%;}.yui-skin-sam .yui-editor-panel .createlink_target,.yui-skin-sam .yui-editor-panel .insertimage_target{width:auto;margin-right:5px;}.yui-skin-sam .yui-editor-panel .removeLink{width:98%;}.yui-skin-sam .yui-editor-panel label input.warning{background-color:#FFEE69;}.yui-skin-sam .yui-editor-panel .yui-toolbar-group h3{color:#000;float:left;font-weight:normal;font-size:93%;margin:5px 0 0 0;padding:0 3px 0 0;text-align:right;}.yui-skin-sam .yui-editor-panel .height-width h3{margin:3px 0 0 10px;}.yui-skin-sam .yui-editor-panel .height-width{margin:3px 0 0 35px;*margin-left:14px;width:42%;*width:44%;}.yui-skin-sam .yui-editor-panel .yui-toolbar-group-border{width:190px;}.yui-skin-sam .yui-editor-panel .no-button .yui-toolbar-group-border{width:210px;}.yui-skin-sam .yui-editor-panel .yui-toolbar-group-padding{width:203px;_width:198px;}.yui-skin-sam .yui-editor-panel .no-button .yui-toolbar-group-padding{width:172px;}.yui-skin-sam .yui-editor-panel .yui-toolbar-group-padding h3{margin-left:25px;*margin-left:12px;}.yui-skin-sam .yui-editor-panel .yui-toolbar-group-textflow{width:182px;}.yui-skin-sam .yui-editor-panel .hd{background:none;}.yui-skin-sam .yui-editor-panel .ft{background-color:#F2F2F2;border:1px solid #808080;border-top:none;padding:0;margin:0 0 2px 0;}.yui-skin-sam .yui-editor-panel .hd span.close{background:url(sprite.png) no-repeat 0 -300px;cursor:pointer;display:block;height:16px;overflow:hidden;position:absolute;right:5px;text-indent:500px;top:2px;width:26px;}.yui-skin-sam .yui-editor-panel .ft span.tip{background-color:#EDF5FF;border-top:1px solid #808080;font-size:85%;}.yui-skin-sam .yui-editor-panel .ft span.tip strong{display:block;float:left;margin:0 2px 8px 0;}.yui-skin-sam .yui-editor-panel .ft span.tip span.icon{background:url( editor-sprite.gif ) no-repeat 0 -1260px;display:block;height:20px;left:2px;position:absolute;top:8px;width:20px;}.yui-skin-sam .yui-editor-panel .ft span.tip span.icon-info{background-position:2px -1260px;}.yui-skin-sam .yui-editor-panel .ft span.tip span.icon-warn{background-position:2px -1296px;}.yui-skin-sam .yui-editor-panel .hd span.knob{position:absolute;height:10px;width:28px;top:-10px;left:25px;text-indent:9999px;overflow:hidden;background:url( editor-knob.gif ) no-repeat 0 0;}.yui-skin-sam .yui-editor-panel .yui-toolbar-container{float:left;width:100%;background-image:none;border:none;}.yui-skin-sam .yui-editor-panel .yui-toolbar-container .bd{background-color:#ffffff;}.yui-editor-blankimage{background-image:url( blankimage.png );}.yui-skin-sam .yui-editor-container .yui-resize-handle-br{height:11px;width:11px;background-position:-20px -60px;background-color:transparent;} +.yui-h-slider,.yui-v-slider{position:relative;}.yui-h-slider .yui-slider-thumb,.yui-v-slider .yui-slider-thumb{position:absolute;cursor:default;}.yui-skin-sam .yui-h-slider{background:url(../../bg-h.gif) no-repeat 5px 0;height:28px;width:228px;}.yui-skin-sam .yui-h-slider .yui-slider-thumb{top:4px;}.yui-skin-sam .yui-v-slider{background:url(../../bg-v.gif) no-repeat 12px 0;height:228px;width:48px;} +.yui-navset .yui-nav li,.yui-navset .yui-navset-top .yui-nav li,.yui-navset .yui-navset-bottom .yui-nav li{margin:0 0.5em 0 0;}.yui-navset-left .yui-nav li,.yui-navset-right .yui-nav li{margin:0 0 0.5em;}.yui-navset .yui-content .yui-hidden{display:none;}.yui-navset .yui-navset-left .yui-nav,.yui-navset .yui-navset-right .yui-nav,.yui-navset-left .yui-nav,.yui-navset-right .yui-nav{width:6em;}.yui-navset-top .yui-nav,.yui-navset-bottom .yui-nav{width:auto;}.yui-navset .yui-navset-left,.yui-navset-left{padding:0 0 0 6em;}.yui-navset-right{padding:0 6em 0 0;}.yui-navset-top,.yui-navset-bottom{padding:auto;}.yui-nav,.yui-nav li{margin:0;padding:0;list-style:none;}.yui-navset li em{font-style:normal;}.yui-navset{position:relative;zoom:1;}.yui-navset .yui-content{zoom:1;}.yui-navset .yui-nav li,.yui-navset .yui-navset-top .yui-nav li,.yui-navset .yui-navset-bottom .yui-nav li{display:inline-block;display:-moz-inline-stack;*display:inline;vertical-align:bottom;cursor:pointer;zoom:1;}.yui-navset-left .yui-nav li,.yui-navset-right .yui-nav li{display:block;}.yui-navset .yui-nav a{position:relative;}.yui-navset .yui-nav li a,.yui-navset-top .yui-nav li a,.yui-navset-bottom .yui-nav li a{display:block;display:inline-block;vertical-align:bottom;zoom:1;}.yui-navset-left .yui-nav li a,.yui-navset-right .yui-nav li a{display:block;}.yui-navset-bottom .yui-nav li a{vertical-align:text-top;}.yui-navset .yui-nav li a em,.yui-navset-top .yui-nav li a em,.yui-navset-bottom .yui-nav li a em{display:block;}.yui-navset .yui-navset-left .yui-nav,.yui-navset .yui-navset-right .yui-nav,.yui-navset-left .yui-nav,.yui-navset-right .yui-nav{position:absolute;z-index:1;}.yui-navset-top .yui-nav,.yui-navset-bottom .yui-nav{position:static;}.yui-navset .yui-navset-left .yui-nav,.yui-navset-left .yui-nav{left:0;right:auto;}.yui-navset .yui-navset-right .yui-nav,.yui-navset-right .yui-nav{right:0;left:auto;}.yui-skin-sam .yui-navset .yui-nav,.yui-skin-sam .yui-navset .yui-navset-top .yui-nav{border:solid #2647a0;border-width:0 0 5px;Xposition:relative;zoom:1;}.yui-skin-sam .yui-navset .yui-nav li,.yui-skin-sam .yui-navset .yui-navset-top .yui-nav li{margin:0 0.16em 0 0;padding:1px 0 0;zoom:1;}.yui-skin-sam .yui-navset .yui-nav .selected,.yui-skin-sam .yui-navset .yui-navset-top .yui-nav .selected{margin:0 0.16em -1px 0;}.yui-skin-sam .yui-navset .yui-nav a,.yui-skin-sam .yui-navset .yui-navset-top .yui-nav a{background:#d8d8d8 url(sprite.png) repeat-x;border:solid #a3a3a3;border-width:0 1px;color:#000;position:relative;text-decoration:none;}.yui-skin-sam .yui-navset .yui-nav a em,.yui-skin-sam .yui-navset .yui-navset-top .yui-nav a em{border:solid #a3a3a3;border-width:1px 0 0;cursor:hand;padding:0.25em .75em;left:0;right:0;bottom:0;top:-1px;position:relative;}.yui-skin-sam .yui-navset .yui-nav .selected a,.yui-skin-sam .yui-navset .yui-nav .selected a:focus,.yui-skin-sam .yui-navset .yui-nav .selected a:hover{background:#2647a0 url(sprite.png) repeat-x left -1400px;color:#fff;}.yui-skin-sam .yui-navset .yui-nav a:hover,.yui-skin-sam .yui-navset .yui-nav a:focus{background:#bfdaff url(sprite.png) repeat-x left -1300px;outline:0;}.yui-skin-sam .yui-navset .yui-nav .selected a em{padding:0.35em 0.75em;}.yui-skin-sam .yui-navset .yui-nav .selected a,.yui-skin-sam .yui-navset .yui-nav .selected a em{border-color:#243356;}.yui-skin-sam .yui-navset .yui-content{background:#edf5ff;}.yui-skin-sam .yui-navset .yui-content,.yui-skin-sam .yui-navset .yui-navset-top .yui-content{border:1px solid #808080;border-top-color:#243356;padding:0.25em 0.5em;}.yui-skin-sam .yui-navset-left .yui-nav,.yui-skin-sam .yui-navset .yui-navset-left .yui-nav,.yui-skin-sam .yui-navset .yui-navset-right .yui-nav,.yui-skin-sam .yui-navset-right .yui-nav{border-width:0 5px 0 0;Xposition:absolute;top:0;bottom:0;}.yui-skin-sam .yui-navset .yui-navset-right .yui-nav,.yui-skin-sam .yui-navset-right .yui-nav{border-width:0 0 0 5px;}.yui-skin-sam .yui-navset-left .yui-nav li,.yui-skin-sam .yui-navset .yui-navset-left .yui-nav li,.yui-skin-sam .yui-navset-right .yui-nav li{margin:0 0 0.16em;padding:0 0 0 1px;}.yui-skin-sam .yui-navset-right .yui-nav li{padding:0 1px 0 0;}.yui-skin-sam .yui-navset-left .yui-nav .selected,.yui-skin-sam .yui-navset .yui-navset-left .yui-nav .selected{margin:0 -1px 0.16em 0;}.yui-skin-sam .yui-navset-right .yui-nav .selected{margin:0 0 0.16em -1px;}.yui-skin-sam .yui-navset-left .yui-nav a,.yui-skin-sam .yui-navset-right .yui-nav a{border-width:1px 0;}.yui-skin-sam .yui-navset-left .yui-nav a em,.yui-skin-sam .yui-navset .yui-navset-left .yui-nav a em,.yui-skin-sam .yui-navset-right .yui-nav a em{border-width:0 0 0 1px;padding:0.2em .75em;top:auto;left:-1px;}.yui-skin-sam .yui-navset-right .yui-nav a em{border-width:0 1px 0 0;left:auto;right:-1px;}.yui-skin-sam .yui-navset-left .yui-nav a,.yui-skin-sam .yui-navset-left .yui-nav .selected a,.yui-skin-sam .yui-navset-left .yui-nav a:hover,.yui-skin-sam .yui-navset-right .yui-nav a,.yui-skin-sam .yui-navset-right .yui-nav .selected a,.yui-skin-sam .yui-navset-right .yui-nav a:hover,.yui-skin-sam .yui-navset-bottom .yui-nav a,.yui-skin-sam .yui-navset-bottom .yui-nav .selected a,.yui-skin-sam .yui-navset-bottom .yui-nav a:hover{background-image:none;}.yui-skin-sam .yui-navset-left .yui-content{border:1px solid #808080;border-left-color:#243356;}.yui-skin-sam .yui-navset-bottom .yui-nav,.yui-skin-sam .yui-navset .yui-navset-bottom .yui-nav{border-width:5px 0 0;}.yui-skin-sam .yui-navset .yui-navset-bottom .yui-nav .selected,.yui-skin-sam .yui-navset-bottom .yui-nav .selected{margin:-1px 0.16em 0 0;}.yui-skin-sam .yui-navset .yui-navset-bottom .yui-nav li,.yui-skin-sam .yui-navset-bottom .yui-nav li{padding:0 0 1px 0;vertical-align:top;}.yui-skin-sam .yui-navset .yui-navset-bottom .yui-nav li a,.yui-skin-sam .yui-navset-bottom .yui-nav li a{}.yui-skin-sam .yui-navset .yui-navset-bottom .yui-nav a em,.yui-skin-sam .yui-navset-bottom .yui-nav a em{border-width:0 0 1px;top:auto;bottom:-1px;}.yui-skin-sam .yui-navset-bottom .yui-content,.yui-skin-sam .yui-navset .yui-navset-bottom .yui-content{border:1px solid #808080;border-bottom-color:#243356;} +.ygtvitem{}.ygtvitem table{margin-bottom:0;border:none;}.ygtvrow td{border:none;padding:0;}.ygtvrow td a{text-decoration:none;}.ygtvtn{width:18px;height:22px;background:url(treeview-sprite.gif) 0 -5600px no-repeat;}.ygtvtm{width:18px;height:22px;cursor:pointer;background:url(treeview-sprite.gif) 0 -4000px no-repeat;}.ygtvtmh,.ygtvtmhh{width:18px;height:22px;cursor:pointer;background:url(treeview-sprite.gif) 0 -4800px no-repeat;}.ygtvtp{width:18px;height:22px;cursor:pointer;background:url(treeview-sprite.gif) 0 -6400px no-repeat;}.ygtvtph,.ygtvtphh{width:18px;height:22px;cursor:pointer;background:url(treeview-sprite.gif) 0 -7200px no-repeat;}.ygtvln{width:18px;height:22px;background:url(treeview-sprite.gif) 0 -1600px no-repeat;}.ygtvlm{width:18px;height:22px;cursor:pointer;background:url(treeview-sprite.gif) 0 0px no-repeat;}.ygtvlmh,.ygtvlmhh{width:18px;height:22px;cursor:pointer;background:url(treeview-sprite.gif) 0 -800px no-repeat;}.ygtvlp{width:18px;height:22px;cursor:pointer;background:url(treeview-sprite.gif) 0 -2400px no-repeat;}.ygtvlph,.ygtvlphh{width:18px;height:22px;cursor:pointer;background:url(treeview-sprite.gif) 0 -3200px no-repeat;}.ygtvloading{width:18px;height:22px;background:url(treeview-loading.gif) 0 0 no-repeat;}.ygtvdepthcell{width:18px;height:22px;background:url(treeview-sprite.gif) 0 -8000px no-repeat;}.ygtvblankdepthcell{width:18px;height:22px;}.ygtvchildren{}* html .ygtvchildren{height:2%;}.ygtvlabel,.ygtvlabel:link,.ygtvlabel:visited,.ygtvlabel:hover{margin-left:2px;text-decoration:none;background-color:white;cursor:pointer;}.ygtvcontent{cursor:default;}.ygtvspacer{height:22px;width:12px;}.ygtvfocus{background-color:#c0e0e0;border:none;}.ygtvfocus .ygtvlabel,.ygtvfocus .ygtvlabel:link,.ygtvfocus .ygtvlabel:visited,.ygtvfocus .ygtvlabel:hover{background-color:#c0e0e0;}.ygtvfocus a,.ygtvrow td a{outline-style:none;}.ygtvok{width:18px;height:22px;background:url(treeview-sprite.gif) 0 -8800px no-repeat;}.ygtvok:hover{background:url(treeview-sprite.gif) 0 -8844px no-repeat;}.ygtvcancel{width:18px;height:22px;background:url(treeview-sprite.gif) 0 -8822px no-repeat;}.ygtvcancel:hover{background:url(treeview-sprite.gif) 0 -8866px no-repeat;}.ygtv-label-editor{background-color:#f2f2f2;border:1px solid silver;position:absolute;display:none;overflow:hidden;margin:auto;z-index:9000;}.ygtv-edit-TextNode{width:190px;}.ygtv-edit-TextNode .ygtvcancel,.ygtv-edit-TextNode .ygtvok{border:none;}.ygtv-edit-TextNode .ygtv-button-container{float:right;}.ygtv-edit-TextNode .ygtv-input input{width:140px;}.ygtv-edit-DateNode .ygtvcancel{border:none;}.ygtv-edit-DateNode .ygtvok{display:none;}.ygtv-edit-DateNode .ygtv-button-container{text-align:right;margin:auto;} + diff --git a/webdir/javascript/yui/assets/skins/sam/slider.css b/webdir/javascript/yui/assets/skins/sam/slider.css new file mode 100644 index 0000000..073d43e --- /dev/null +++ b/webdir/javascript/yui/assets/skins/sam/slider.css @@ -0,0 +1,7 @@ +/* +Copyright (c) 2008, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.6.0 +*/ +.yui-h-slider,.yui-v-slider{position:relative;}.yui-h-slider .yui-slider-thumb,.yui-v-slider .yui-slider-thumb{position:absolute;cursor:default;}.yui-skin-sam .yui-h-slider{background:url(../../bg-h.gif) no-repeat 5px 0;height:28px;width:228px;}.yui-skin-sam .yui-h-slider .yui-slider-thumb{top:4px;}.yui-skin-sam .yui-v-slider{background:url(../../bg-v.gif) no-repeat 12px 0;height:228px;width:48px;} diff --git a/webdir/javascript/yui/assets/skins/sam/split-button-arrow-active.png b/webdir/javascript/yui/assets/skins/sam/split-button-arrow-active.png new file mode 100644 index 0000000..fa58c50 Binary files /dev/null and b/webdir/javascript/yui/assets/skins/sam/split-button-arrow-active.png differ diff --git a/webdir/javascript/yui/assets/skins/sam/split-button-arrow-disabled.png b/webdir/javascript/yui/assets/skins/sam/split-button-arrow-disabled.png new file mode 100644 index 0000000..0a6a82c Binary files /dev/null and b/webdir/javascript/yui/assets/skins/sam/split-button-arrow-disabled.png differ diff --git a/webdir/javascript/yui/assets/skins/sam/split-button-arrow-focus.png b/webdir/javascript/yui/assets/skins/sam/split-button-arrow-focus.png new file mode 100644 index 0000000..167d71e Binary files /dev/null and b/webdir/javascript/yui/assets/skins/sam/split-button-arrow-focus.png differ diff --git a/webdir/javascript/yui/assets/skins/sam/split-button-arrow-hover.png b/webdir/javascript/yui/assets/skins/sam/split-button-arrow-hover.png new file mode 100644 index 0000000..167d71e Binary files /dev/null and b/webdir/javascript/yui/assets/skins/sam/split-button-arrow-hover.png differ diff --git a/webdir/javascript/yui/assets/skins/sam/split-button-arrow.png b/webdir/javascript/yui/assets/skins/sam/split-button-arrow.png new file mode 100644 index 0000000..b33a93f Binary files /dev/null and b/webdir/javascript/yui/assets/skins/sam/split-button-arrow.png differ diff --git a/webdir/javascript/yui/assets/skins/sam/sprite.png b/webdir/javascript/yui/assets/skins/sam/sprite.png new file mode 100644 index 0000000..73634d6 Binary files /dev/null and b/webdir/javascript/yui/assets/skins/sam/sprite.png differ diff --git a/webdir/javascript/yui/assets/skins/sam/sprite.psd b/webdir/javascript/yui/assets/skins/sam/sprite.psd new file mode 100644 index 0000000..fff2c34 Binary files /dev/null and b/webdir/javascript/yui/assets/skins/sam/sprite.psd differ diff --git a/webdir/javascript/yui/assets/skins/sam/tabview.css b/webdir/javascript/yui/assets/skins/sam/tabview.css new file mode 100644 index 0000000..ece4ebd --- /dev/null +++ b/webdir/javascript/yui/assets/skins/sam/tabview.css @@ -0,0 +1,7 @@ +/* +Copyright (c) 2008, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.6.0 +*/ +.yui-navset .yui-nav li,.yui-navset .yui-navset-top .yui-nav li,.yui-navset .yui-navset-bottom .yui-nav li{margin:0 0.5em 0 0;}.yui-navset-left .yui-nav li,.yui-navset-right .yui-nav li{margin:0 0 0.5em;}.yui-navset .yui-content .yui-hidden{display:none;}.yui-navset .yui-navset-left .yui-nav,.yui-navset .yui-navset-right .yui-nav,.yui-navset-left .yui-nav,.yui-navset-right .yui-nav{width:6em;}.yui-navset-top .yui-nav,.yui-navset-bottom .yui-nav{width:auto;}.yui-navset .yui-navset-left,.yui-navset-left{padding:0 0 0 6em;}.yui-navset-right{padding:0 6em 0 0;}.yui-navset-top,.yui-navset-bottom{padding:auto;}.yui-nav,.yui-nav li{margin:0;padding:0;list-style:none;}.yui-navset li em{font-style:normal;}.yui-navset{position:relative;zoom:1;}.yui-navset .yui-content{zoom:1;}.yui-navset .yui-nav li,.yui-navset .yui-navset-top .yui-nav li,.yui-navset .yui-navset-bottom .yui-nav li{display:inline-block;display:-moz-inline-stack;*display:inline;vertical-align:bottom;cursor:pointer;zoom:1;}.yui-navset-left .yui-nav li,.yui-navset-right .yui-nav li{display:block;}.yui-navset .yui-nav a{position:relative;}.yui-navset .yui-nav li a,.yui-navset-top .yui-nav li a,.yui-navset-bottom .yui-nav li a{display:block;display:inline-block;vertical-align:bottom;zoom:1;}.yui-navset-left .yui-nav li a,.yui-navset-right .yui-nav li a{display:block;}.yui-navset-bottom .yui-nav li a{vertical-align:text-top;}.yui-navset .yui-nav li a em,.yui-navset-top .yui-nav li a em,.yui-navset-bottom .yui-nav li a em{display:block;}.yui-navset .yui-navset-left .yui-nav,.yui-navset .yui-navset-right .yui-nav,.yui-navset-left .yui-nav,.yui-navset-right .yui-nav{position:absolute;z-index:1;}.yui-navset-top .yui-nav,.yui-navset-bottom .yui-nav{position:static;}.yui-navset .yui-navset-left .yui-nav,.yui-navset-left .yui-nav{left:0;right:auto;}.yui-navset .yui-navset-right .yui-nav,.yui-navset-right .yui-nav{right:0;left:auto;}.yui-skin-sam .yui-navset .yui-nav,.yui-skin-sam .yui-navset .yui-navset-top .yui-nav{border:solid #2647a0;border-width:0 0 5px;Xposition:relative;zoom:1;}.yui-skin-sam .yui-navset .yui-nav li,.yui-skin-sam .yui-navset .yui-navset-top .yui-nav li{margin:0 0.16em 0 0;padding:1px 0 0;zoom:1;}.yui-skin-sam .yui-navset .yui-nav .selected,.yui-skin-sam .yui-navset .yui-navset-top .yui-nav .selected{margin:0 0.16em -1px 0;}.yui-skin-sam .yui-navset .yui-nav a,.yui-skin-sam .yui-navset .yui-navset-top .yui-nav a{background:#d8d8d8 url(sprite.png) repeat-x;border:solid #a3a3a3;border-width:0 1px;color:#000;position:relative;text-decoration:none;}.yui-skin-sam .yui-navset .yui-nav a em,.yui-skin-sam .yui-navset .yui-navset-top .yui-nav a em{border:solid #a3a3a3;border-width:1px 0 0;cursor:hand;padding:0.25em .75em;left:0;right:0;bottom:0;top:-1px;position:relative;}.yui-skin-sam .yui-navset .yui-nav .selected a,.yui-skin-sam .yui-navset .yui-nav .selected a:focus,.yui-skin-sam .yui-navset .yui-nav .selected a:hover{background:#2647a0 url(sprite.png) repeat-x left -1400px;color:#fff;}.yui-skin-sam .yui-navset .yui-nav a:hover,.yui-skin-sam .yui-navset .yui-nav a:focus{background:#bfdaff url(sprite.png) repeat-x left -1300px;outline:0;}.yui-skin-sam .yui-navset .yui-nav .selected a em{padding:0.35em 0.75em;}.yui-skin-sam .yui-navset .yui-nav .selected a,.yui-skin-sam .yui-navset .yui-nav .selected a em{border-color:#243356;}.yui-skin-sam .yui-navset .yui-content{background:#edf5ff;}.yui-skin-sam .yui-navset .yui-content,.yui-skin-sam .yui-navset .yui-navset-top .yui-content{border:1px solid #808080;border-top-color:#243356;padding:0.25em 0.5em;}.yui-skin-sam .yui-navset-left .yui-nav,.yui-skin-sam .yui-navset .yui-navset-left .yui-nav,.yui-skin-sam .yui-navset .yui-navset-right .yui-nav,.yui-skin-sam .yui-navset-right .yui-nav{border-width:0 5px 0 0;Xposition:absolute;top:0;bottom:0;}.yui-skin-sam .yui-navset .yui-navset-right .yui-nav,.yui-skin-sam .yui-navset-right .yui-nav{border-width:0 0 0 5px;}.yui-skin-sam .yui-navset-left .yui-nav li,.yui-skin-sam .yui-navset .yui-navset-left .yui-nav li,.yui-skin-sam .yui-navset-right .yui-nav li{margin:0 0 0.16em;padding:0 0 0 1px;}.yui-skin-sam .yui-navset-right .yui-nav li{padding:0 1px 0 0;}.yui-skin-sam .yui-navset-left .yui-nav .selected,.yui-skin-sam .yui-navset .yui-navset-left .yui-nav .selected{margin:0 -1px 0.16em 0;}.yui-skin-sam .yui-navset-right .yui-nav .selected{margin:0 0 0.16em -1px;}.yui-skin-sam .yui-navset-left .yui-nav a,.yui-skin-sam .yui-navset-right .yui-nav a{border-width:1px 0;}.yui-skin-sam .yui-navset-left .yui-nav a em,.yui-skin-sam .yui-navset .yui-navset-left .yui-nav a em,.yui-skin-sam .yui-navset-right .yui-nav a em{border-width:0 0 0 1px;padding:0.2em .75em;top:auto;left:-1px;}.yui-skin-sam .yui-navset-right .yui-nav a em{border-width:0 1px 0 0;left:auto;right:-1px;}.yui-skin-sam .yui-navset-left .yui-nav a,.yui-skin-sam .yui-navset-left .yui-nav .selected a,.yui-skin-sam .yui-navset-left .yui-nav a:hover,.yui-skin-sam .yui-navset-right .yui-nav a,.yui-skin-sam .yui-navset-right .yui-nav .selected a,.yui-skin-sam .yui-navset-right .yui-nav a:hover,.yui-skin-sam .yui-navset-bottom .yui-nav a,.yui-skin-sam .yui-navset-bottom .yui-nav .selected a,.yui-skin-sam .yui-navset-bottom .yui-nav a:hover{background-image:none;}.yui-skin-sam .yui-navset-left .yui-content{border:1px solid #808080;border-left-color:#243356;}.yui-skin-sam .yui-navset-bottom .yui-nav,.yui-skin-sam .yui-navset .yui-navset-bottom .yui-nav{border-width:5px 0 0;}.yui-skin-sam .yui-navset .yui-navset-bottom .yui-nav .selected,.yui-skin-sam .yui-navset-bottom .yui-nav .selected{margin:-1px 0.16em 0 0;}.yui-skin-sam .yui-navset .yui-navset-bottom .yui-nav li,.yui-skin-sam .yui-navset-bottom .yui-nav li{padding:0 0 1px 0;vertical-align:top;}.yui-skin-sam .yui-navset .yui-navset-bottom .yui-nav li a,.yui-skin-sam .yui-navset-bottom .yui-nav li a{}.yui-skin-sam .yui-navset .yui-navset-bottom .yui-nav a em,.yui-skin-sam .yui-navset-bottom .yui-nav a em{border-width:0 0 1px;top:auto;bottom:-1px;}.yui-skin-sam .yui-navset-bottom .yui-content,.yui-skin-sam .yui-navset .yui-navset-bottom .yui-content{border:1px solid #808080;border-bottom-color:#243356;} diff --git a/webdir/javascript/yui/assets/skins/sam/treeview-loading.gif b/webdir/javascript/yui/assets/skins/sam/treeview-loading.gif new file mode 100644 index 0000000..0bbf3bc Binary files /dev/null and b/webdir/javascript/yui/assets/skins/sam/treeview-loading.gif differ diff --git a/webdir/javascript/yui/assets/skins/sam/treeview-sprite.gif b/webdir/javascript/yui/assets/skins/sam/treeview-sprite.gif new file mode 100644 index 0000000..8fb3f01 Binary files /dev/null and b/webdir/javascript/yui/assets/skins/sam/treeview-sprite.gif differ diff --git a/webdir/javascript/yui/assets/skins/sam/treeview.css b/webdir/javascript/yui/assets/skins/sam/treeview.css new file mode 100644 index 0000000..5798ff7 --- /dev/null +++ b/webdir/javascript/yui/assets/skins/sam/treeview.css @@ -0,0 +1,7 @@ +/* +Copyright (c) 2008, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.6.0 +*/ +.ygtvitem{}.ygtvitem table{margin-bottom:0;border:none;}.ygtvrow td{border:none;padding:0;}.ygtvrow td a{text-decoration:none;}.ygtvtn{width:18px;height:22px;background:url(treeview-sprite.gif) 0 -5600px no-repeat;}.ygtvtm{width:18px;height:22px;cursor:pointer;background:url(treeview-sprite.gif) 0 -4000px no-repeat;}.ygtvtmh,.ygtvtmhh{width:18px;height:22px;cursor:pointer;background:url(treeview-sprite.gif) 0 -4800px no-repeat;}.ygtvtp{width:18px;height:22px;cursor:pointer;background:url(treeview-sprite.gif) 0 -6400px no-repeat;}.ygtvtph,.ygtvtphh{width:18px;height:22px;cursor:pointer;background:url(treeview-sprite.gif) 0 -7200px no-repeat;}.ygtvln{width:18px;height:22px;background:url(treeview-sprite.gif) 0 -1600px no-repeat;}.ygtvlm{width:18px;height:22px;cursor:pointer;background:url(treeview-sprite.gif) 0 0px no-repeat;}.ygtvlmh,.ygtvlmhh{width:18px;height:22px;cursor:pointer;background:url(treeview-sprite.gif) 0 -800px no-repeat;}.ygtvlp{width:18px;height:22px;cursor:pointer;background:url(treeview-sprite.gif) 0 -2400px no-repeat;}.ygtvlph,.ygtvlphh{width:18px;height:22px;cursor:pointer;background:url(treeview-sprite.gif) 0 -3200px no-repeat;}.ygtvloading{width:18px;height:22px;background:url(treeview-loading.gif) 0 0 no-repeat;}.ygtvdepthcell{width:18px;height:22px;background:url(treeview-sprite.gif) 0 -8000px no-repeat;}.ygtvblankdepthcell{width:18px;height:22px;}.ygtvchildren{}* html .ygtvchildren{height:2%;}.ygtvlabel,.ygtvlabel:link,.ygtvlabel:visited,.ygtvlabel:hover{margin-left:2px;text-decoration:none;background-color:white;cursor:pointer;}.ygtvcontent{cursor:default;}.ygtvspacer{height:22px;width:12px;}.ygtvfocus{background-color:#c0e0e0;border:none;}.ygtvfocus .ygtvlabel,.ygtvfocus .ygtvlabel:link,.ygtvfocus .ygtvlabel:visited,.ygtvfocus .ygtvlabel:hover{background-color:#c0e0e0;}.ygtvfocus a,.ygtvrow td a{outline-style:none;}.ygtvok{width:18px;height:22px;background:url(treeview-sprite.gif) 0 -8800px no-repeat;}.ygtvok:hover{background:url(treeview-sprite.gif) 0 -8844px no-repeat;}.ygtvcancel{width:18px;height:22px;background:url(treeview-sprite.gif) 0 -8822px no-repeat;}.ygtvcancel:hover{background:url(treeview-sprite.gif) 0 -8866px no-repeat;}.ygtv-label-editor{background-color:#f2f2f2;border:1px solid silver;position:absolute;display:none;overflow:hidden;margin:auto;z-index:9000;}.ygtv-edit-TextNode{width:190px;}.ygtv-edit-TextNode .ygtvcancel,.ygtv-edit-TextNode .ygtvok{border:none;}.ygtv-edit-TextNode .ygtv-button-container{float:right;}.ygtv-edit-TextNode .ygtv-input input{width:140px;}.ygtv-edit-DateNode .ygtvcancel{border:none;}.ygtv-edit-DateNode .ygtvok{display:none;}.ygtv-edit-DateNode .ygtv-button-container{text-align:right;margin:auto;} diff --git a/webdir/javascript/yui/assets/skins/sam/wait.gif b/webdir/javascript/yui/assets/skins/sam/wait.gif new file mode 100644 index 0000000..471c1a4 Binary files /dev/null and b/webdir/javascript/yui/assets/skins/sam/wait.gif differ diff --git a/webdir/javascript/yui/assets/skins/sam/yuitest.css b/webdir/javascript/yui/assets/skins/sam/yuitest.css new file mode 100644 index 0000000..85d776e --- /dev/null +++ b/webdir/javascript/yui/assets/skins/sam/yuitest.css @@ -0,0 +1,7 @@ +/* +Copyright (c) 2008, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.6.0 +*/ + diff --git a/webdir/javascript/yui/autocomplete/README b/webdir/javascript/yui/autocomplete/README new file mode 100644 index 0000000..e56bf80 --- /dev/null +++ b/webdir/javascript/yui/autocomplete/README @@ -0,0 +1,212 @@ +AutoComplete Release Notes + +*** version 2.6.0 *** + +* AutoComplete has a new required dependency on YAHOO.util.DataSource, +and the class YAHOO.widget.DataSource has been deprecated. As a result, +the following YAHOO.widget.DataSource properties have been ported to YAHOO.widget.AutoComplete: + - queryMatchCase + - queryMatchContains + - queryMatchSubset + +* The following YAHOO.widget.DS_XHR properties have been deprecated in favor of +the new customizeable YAHOO.widget.AutoComplete method generateRequest: + - scriptQueryParam + - scriptQueryAppend + +* The YAHOO.widget.DS_XHR property responseStripAfter has been deprecated in favor +of the new customizeable YAHOO.util.DataSource method doBeforeParseData. + +* Now always fires either dataReturnEvent or dataErrorEvent upon a DataSource +response, whether container opens or not due to instance losing focus. + +* Added textboxChangeEvent and containerPopulateEvent Custom Events. + +* As a convenience, the formatResult() method now receives a third parameter which +is the query matching string for the result. + +* In order to eliminate certain race conditions with the typeAhead feature, added +typeAheadDelay of default 0.5. + +* Added new method filterResults() for an easily customizeable local string- +matching algorithm. + +* The dataRequestEvent now passes along the request as well as the query string. + +* The style list-style:none has been set in the default CSS. + + +*** version 2.5.2 *** + +* Empty responses of TYPE_FLAT no longer open empty container. + +* Mac FF no longer submits form on enter-to-select suggestion. + + + +*** version 2.5.1 *** + +* No changes. + + + +*** version 2.5.0 *** + +* Fixed bug where Mac users were not able to input "&" or "(" characters. + + + +*** version 2.4.0 *** + +* Support for YUI JSON Utility. + +* The allowBrowserAutocomplete property now supports cases when the user navigates +away from page via mean other than a form submission. + +* Added support for integration with the Get Utility, for proxyless data +retrieval from dynamically loaded script nodes. + +* Typing 'Enter' to select item no longer causes automatic form submission on +Mac browsers. + + + +*** version 2.3.1 *** + +* AutoComplete no longer throw a JavaScript error due to an invalid or +non-existent parent container. While a wrapper DIV element is still expected in +order to enable skinning (see 2.3.0 release note), a lack of such will not +cause an error. + +* When suggestion container is collapsed, Mac users no longer need to type +Enter twice to submit input. + + + +*** version 2.3.0 *** + +* Applied new skinning model. Please note that in order to enable skinning, +AutoComplete now expects a wrapper DIV element around the INPUT element and the +container DIV element, in this fashion: + +
    + +
    +
    + +* The default queryDelay value has been changed to 0.2. In low-latency +implementations (e.g., when queryDelay is set to 0 against a local +JavaScript DataSource), typeAhead functionality may experience a race condition +when retrieving the value of the textbox. To avoid this problem, implementers +are advised not to set the queryDelay value too low. + +* Fixed runtime property value validation. + +* Implemented new method doBeforeSendQuery(). + +* Implemented new method destroy(). + +* Added support for latest JSON lib http://www.json.org/json.js. + +* Fixed forceSelection issues with matched selections and multiple selections. + +* No longer create var oAnim in global scope. + +* The properties alwaysShowContainer and useShadow should not be enabled together. + +* There is a known issue in Firefox where the native browser autocomplete +attribute cannot be disabled programmatically on input boxes that are in use. + + + + + +**** version 2.2.2 *** + +* No changes. + + + +*** version 2.2.1 *** + +* Fixed form submission in Safari bug. +* Fixed broken DS_JSArray support for minQueryLength=0. +* Improved type checking with YAHOO.lang. + + + +*** version 2.2.0 *** + +* No changes. + + + +*** version 0.12.2 *** + +* No changes. + + + +*** version 0.12.1 *** + +* No longer trigger typeAhead feature when user is backspacing on input text. + + + +*** version 0.12.0 *** + +* The following constants must be defined as static class properties and are no longer +available as instance properties: + +YAHOO.widget.DataSource.ERROR_DATANULL +YAHOO.widget.DataSource.ERROR_DATAPARSE +YAHOO.widget.DS_XHR.TYPE_JSON +YAHOO.widget.DS_XHR.TYPE_XML +YAHOO.widget.DS_XHR.TYPE_FLAT +YAHOO.widget.DS_XHR.ERROR_DATAXHR + +* The property minQueryLength now supports zero and negative number values for +DS_JSFunction and DS_XHR objects, to enable null or empty string queries and to disable +AutoComplete functionality altogether, respectively. + +* Enabling the alwaysShowContainer feature will no longer send containerExpandEvent or +containerCollapseEvent. + + + +**** version 0.11.3 *** + +* The iFrameSrc property has been deprecated. Implementers no longer need to +specify an https URL to avoid IE security warnings when working with sites over +SSL. + + + +*** version 0.11.0 *** + +* The method getListIds() has been deprecated for getListItems(), which returns +an array of DOM references. + +* All classnames have been prefixed with "yui-ac-". + +* Container elements should no longer have CSS property "display" set to "none". + +* The useIFrame property can now be set after instantiation. + +* On some browsers, the unmatchedItemSelectEvent may not be fired properly when +delimiter characters are defined. + +* On some browsers, defining delimiter characters while enabling forceSelection +may result in unexpected behavior. + + + +*** version 0.10.0 *** + +* Initial release + +* In order to enable the useIFrame property, it should be set in the +constructor. + +* On some browsers, defining delimiter characters while enabling forceSelection +may result in unexpected behavior. diff --git a/webdir/javascript/yui/autocomplete/assets/autocomplete-core.css b/webdir/javascript/yui/autocomplete/assets/autocomplete-core.css new file mode 100644 index 0000000..5ebab9a --- /dev/null +++ b/webdir/javascript/yui/autocomplete/assets/autocomplete-core.css @@ -0,0 +1,7 @@ +/* +Copyright (c) 2008, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.6.0 +*/ +/* This file intentionally left blank */ diff --git a/webdir/javascript/yui/autocomplete/assets/skins/sam/autocomplete-skin.css b/webdir/javascript/yui/autocomplete/assets/skins/sam/autocomplete-skin.css new file mode 100644 index 0000000..c559bff --- /dev/null +++ b/webdir/javascript/yui/autocomplete/assets/skins/sam/autocomplete-skin.css @@ -0,0 +1,57 @@ +/* +Copyright (c) 2008, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.6.0 +*/ +/* styles for entire widget */ +.yui-skin-sam .yui-ac { + position:relative;font-family:arial;font-size:100%; +} + +/* styles for input field */ +.yui-skin-sam .yui-ac-input { + position:absolute;width:100%; +} + +/* styles for results container */ +.yui-skin-sam .yui-ac-container { + position:absolute;top:1.6em;width:100%; +} + +/* styles for header/body/footer wrapper within container */ +.yui-skin-sam .yui-ac-content { + position:absolute;width:100%;border:1px solid #808080;background:#fff;overflow:hidden;z-index:9050; +} + +/* styles for container shadow */ +.yui-skin-sam .yui-ac-shadow { + position:absolute;margin:.3em;width:100%;background:#000;-moz-opacity: 0.10;opacity:.10;filter:alpha(opacity=10);z-index:9049; +} + +/* styles for container iframe */ +.yui-skin-sam .yui-ac iframe { + opacity:0;filter: alpha(opacity=0); + padding-right:.3em; padding-bottom:.3em; /* Bug 2026798: extend iframe to shim the shadow */ +} + +/* styles for results list */ +.yui-skin-sam .yui-ac-content ul{ + margin:0;padding:0;width:100%; +} + +/* styles for result item */ +.yui-skin-sam .yui-ac-content li { + margin:0;padding:2px 5px;cursor:default;white-space:nowrap;list-style:none; + zoom:1; /* For IE to trigger mouse events on LI */ +} + +/* styles for prehighlighted result item */ +.yui-skin-sam .yui-ac-content li.yui-ac-prehighlight { + background:#B3D4FF; +} + +/* styles for highlighted result item */ +.yui-skin-sam .yui-ac-content li.yui-ac-highlight { + background:#426FD9;color:#FFF; +} diff --git a/webdir/javascript/yui/autocomplete/assets/skins/sam/autocomplete.css b/webdir/javascript/yui/autocomplete/assets/skins/sam/autocomplete.css new file mode 100644 index 0000000..82cf7e5 --- /dev/null +++ b/webdir/javascript/yui/autocomplete/assets/skins/sam/autocomplete.css @@ -0,0 +1,7 @@ +/* +Copyright (c) 2008, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.6.0 +*/ +.yui-skin-sam .yui-ac{position:relative;font-family:arial;font-size:100%;}.yui-skin-sam .yui-ac-input{position:absolute;width:100%;}.yui-skin-sam .yui-ac-container{position:absolute;top:1.6em;width:100%;}.yui-skin-sam .yui-ac-content{position:absolute;width:100%;border:1px solid #808080;background:#fff;overflow:hidden;z-index:9050;}.yui-skin-sam .yui-ac-shadow{position:absolute;margin:.3em;width:100%;background:#000;-moz-opacity:0.10;opacity:.10;filter:alpha(opacity=10);z-index:9049;}.yui-skin-sam .yui-ac iframe{opacity:0;filter:alpha(opacity=0);padding-right:.3em;padding-bottom:.3em;}.yui-skin-sam .yui-ac-content ul{margin:0;padding:0;width:100%;}.yui-skin-sam .yui-ac-content li{margin:0;padding:2px 5px;cursor:default;white-space:nowrap;list-style:none;zoom:1;}.yui-skin-sam .yui-ac-content li.yui-ac-prehighlight{background:#B3D4FF;}.yui-skin-sam .yui-ac-content li.yui-ac-highlight{background:#426FD9;color:#FFF;} diff --git a/webdir/javascript/yui/autocomplete/autocomplete-debug.js b/webdir/javascript/yui/autocomplete/autocomplete-debug.js new file mode 100644 index 0000000..56e2ace --- /dev/null +++ b/webdir/javascript/yui/autocomplete/autocomplete-debug.js @@ -0,0 +1,2917 @@ +/* +Copyright (c) 2008, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.6.0 +*/ +///////////////////////////////////////////////////////////////////////////// +// +// YAHOO.widget.DataSource Backwards Compatibility +// +///////////////////////////////////////////////////////////////////////////// + +YAHOO.widget.DS_JSArray = YAHOO.util.LocalDataSource; + +YAHOO.widget.DS_JSFunction = YAHOO.util.FunctionDataSource; + +YAHOO.widget.DS_XHR = function(sScriptURI, aSchema, oConfigs) { + var DS = new YAHOO.util.XHRDataSource(sScriptURI, oConfigs); + DS._aDeprecatedSchema = aSchema; + return DS; +}; + +YAHOO.widget.DS_ScriptNode = function(sScriptURI, aSchema, oConfigs) { + var DS = new YAHOO.util.ScriptNodeDataSource(sScriptURI, oConfigs); + DS._aDeprecatedSchema = aSchema; + return DS; +}; + +YAHOO.widget.DS_XHR.TYPE_JSON = YAHOO.util.DataSourceBase.TYPE_JSON; +YAHOO.widget.DS_XHR.TYPE_XML = YAHOO.util.DataSourceBase.TYPE_XML; +YAHOO.widget.DS_XHR.TYPE_FLAT = YAHOO.util.DataSourceBase.TYPE_TEXT; + +// TODO: widget.DS_ScriptNode.scriptCallbackParam + + + + /** + * The AutoComplete control provides the front-end logic for text-entry suggestion and + * completion functionality. + * + * @module autocomplete + * @requires yahoo, dom, event, datasource + * @optional animation + * @namespace YAHOO.widget + * @title AutoComplete Widget + */ + +/****************************************************************************/ +/****************************************************************************/ +/****************************************************************************/ + +/** + * The AutoComplete class provides the customizable functionality of a plug-and-play DHTML + * auto completion widget. Some key features: + *
      + *
    • Navigate with up/down arrow keys and/or mouse to pick a selection
    • + *
    • The drop down container can "roll down" or "fly out" via configurable + * animation
    • + *
    • UI look-and-feel customizable through CSS, including container + * attributes, borders, position, fonts, etc
    • + *
    + * + * @class AutoComplete + * @constructor + * @param elInput {HTMLElement} DOM element reference of an input field. + * @param elInput {String} String ID of an input field. + * @param elContainer {HTMLElement} DOM element reference of an existing DIV. + * @param elContainer {String} String ID of an existing DIV. + * @param oDataSource {YAHOO.widget.DataSource} DataSource instance. + * @param oConfigs {Object} (optional) Object literal of configuration params. + */ +YAHOO.widget.AutoComplete = function(elInput,elContainer,oDataSource,oConfigs) { + if(elInput && elContainer && oDataSource) { + // Validate DataSource + if(oDataSource instanceof YAHOO.util.DataSourceBase) { + this.dataSource = oDataSource; + } + else { + YAHOO.log("Could not instantiate AutoComplete due to an invalid DataSource", "error", this.toString()); + return; + } + + // YAHOO.widget.DataSource schema backwards compatibility + // Converted deprecated schema into supported schema + // First assume key data is held in position 0 of results array + this.key = 0; + var schema = oDataSource.responseSchema; + // An old school schema has been defined in the deprecated DataSource constructor + if(oDataSource._aDeprecatedSchema) { + var aDeprecatedSchema = oDataSource._aDeprecatedSchema; + if(YAHOO.lang.isArray(aDeprecatedSchema)) { + + if((oDataSource.responseType === YAHOO.util.DataSourceBase.TYPE_JSON) || + (oDataSource.responseType === YAHOO.util.DataSourceBase.TYPE_UNKNOWN)) { // Used to default to unknown + // Store the resultsList + schema.resultsList = aDeprecatedSchema[0]; + // Store the key + this.key = aDeprecatedSchema[1]; + // Only resultsList and key are defined, so grab all the data + schema.fields = (aDeprecatedSchema.length < 3) ? null : aDeprecatedSchema.slice(1); + } + else if(oDataSource.responseType === YAHOO.util.DataSourceBase.TYPE_XML) { + schema.resultNode = aDeprecatedSchema[0]; + this.key = aDeprecatedSchema[1]; + schema.fields = aDeprecatedSchema.slice(1); + } + else if(oDataSource.responseType === YAHOO.util.DataSourceBase.TYPE_TEXT) { + schema.recordDelim = aDeprecatedSchema[0]; + schema.fieldDelim = aDeprecatedSchema[1]; + } + oDataSource.responseSchema = schema; + } + } + + // Validate input element + if(YAHOO.util.Dom.inDocument(elInput)) { + if(YAHOO.lang.isString(elInput)) { + this._sName = "instance" + YAHOO.widget.AutoComplete._nIndex + " " + elInput; + this._elTextbox = document.getElementById(elInput); + } + else { + this._sName = (elInput.id) ? + "instance" + YAHOO.widget.AutoComplete._nIndex + " " + elInput.id: + "instance" + YAHOO.widget.AutoComplete._nIndex; + this._elTextbox = elInput; + } + YAHOO.util.Dom.addClass(this._elTextbox, "yui-ac-input"); + } + else { + YAHOO.log("Could not instantiate AutoComplete due to an invalid input element", "error", this.toString()); + return; + } + + // Validate container element + if(YAHOO.util.Dom.inDocument(elContainer)) { + if(YAHOO.lang.isString(elContainer)) { + this._elContainer = document.getElementById(elContainer); + } + else { + this._elContainer = elContainer; + } + if(this._elContainer.style.display == "none") { + YAHOO.log("The container may not display properly if display is set to \"none\" in CSS", "warn", this.toString()); + } + + // For skinning + var elParent = this._elContainer.parentNode; + var elTag = elParent.tagName.toLowerCase(); + if(elTag == "div") { + YAHOO.util.Dom.addClass(elParent, "yui-ac"); + } + else { + YAHOO.log("Could not find the wrapper element for skinning", "warn", this.toString()); + } + } + else { + YAHOO.log("Could not instantiate AutoComplete due to an invalid container element", "error", this.toString()); + return; + } + + // Default applyLocalFilter setting is to enable for local sources + if(this.dataSource.dataType === YAHOO.util.DataSourceBase.TYPE_LOCAL) { + this.applyLocalFilter = true; + } + + // Set any config params passed in to override defaults + if(oConfigs && (oConfigs.constructor == Object)) { + for(var sConfig in oConfigs) { + if(sConfig) { + this[sConfig] = oConfigs[sConfig]; + } + } + } + + // Initialization sequence + this._initContainerEl(); + this._initProps(); + this._initListEl(); + this._initContainerHelperEls(); + + // Set up events + var oSelf = this; + var elTextbox = this._elTextbox; + + // Dom events + YAHOO.util.Event.addListener(elTextbox,"keyup",oSelf._onTextboxKeyUp,oSelf); + YAHOO.util.Event.addListener(elTextbox,"keydown",oSelf._onTextboxKeyDown,oSelf); + YAHOO.util.Event.addListener(elTextbox,"focus",oSelf._onTextboxFocus,oSelf); + YAHOO.util.Event.addListener(elTextbox,"blur",oSelf._onTextboxBlur,oSelf); + YAHOO.util.Event.addListener(elContainer,"mouseover",oSelf._onContainerMouseover,oSelf); + YAHOO.util.Event.addListener(elContainer,"mouseout",oSelf._onContainerMouseout,oSelf); + YAHOO.util.Event.addListener(elContainer,"click",oSelf._onContainerClick,oSelf); + YAHOO.util.Event.addListener(elContainer,"scroll",oSelf._onContainerScroll,oSelf); + YAHOO.util.Event.addListener(elContainer,"resize",oSelf._onContainerResize,oSelf); + YAHOO.util.Event.addListener(elTextbox,"keypress",oSelf._onTextboxKeyPress,oSelf); + YAHOO.util.Event.addListener(window,"unload",oSelf._onWindowUnload,oSelf); + + // Custom events + this.textboxFocusEvent = new YAHOO.util.CustomEvent("textboxFocus", this); + this.textboxKeyEvent = new YAHOO.util.CustomEvent("textboxKey", this); + this.dataRequestEvent = new YAHOO.util.CustomEvent("dataRequest", this); + this.dataReturnEvent = new YAHOO.util.CustomEvent("dataReturn", this); + this.dataErrorEvent = new YAHOO.util.CustomEvent("dataError", this); + this.containerPopulateEvent = new YAHOO.util.CustomEvent("containerPopulate", this); + this.containerExpandEvent = new YAHOO.util.CustomEvent("containerExpand", this); + this.typeAheadEvent = new YAHOO.util.CustomEvent("typeAhead", this); + this.itemMouseOverEvent = new YAHOO.util.CustomEvent("itemMouseOver", this); + this.itemMouseOutEvent = new YAHOO.util.CustomEvent("itemMouseOut", this); + this.itemArrowToEvent = new YAHOO.util.CustomEvent("itemArrowTo", this); + this.itemArrowFromEvent = new YAHOO.util.CustomEvent("itemArrowFrom", this); + this.itemSelectEvent = new YAHOO.util.CustomEvent("itemSelect", this); + this.unmatchedItemSelectEvent = new YAHOO.util.CustomEvent("unmatchedItemSelect", this); + this.selectionEnforceEvent = new YAHOO.util.CustomEvent("selectionEnforce", this); + this.containerCollapseEvent = new YAHOO.util.CustomEvent("containerCollapse", this); + this.textboxBlurEvent = new YAHOO.util.CustomEvent("textboxBlur", this); + this.textboxChangeEvent = new YAHOO.util.CustomEvent("textboxChange", this); + + // Finish up + elTextbox.setAttribute("autocomplete","off"); + YAHOO.widget.AutoComplete._nIndex++; + YAHOO.log("AutoComplete initialized","info",this.toString()); + } + // Required arguments were not found + else { + YAHOO.log("Could not instantiate AutoComplete due invalid arguments", "error", this.toString()); + } +}; + +///////////////////////////////////////////////////////////////////////////// +// +// Public member variables +// +///////////////////////////////////////////////////////////////////////////// + +/** + * The DataSource object that encapsulates the data used for auto completion. + * This object should be an inherited object from YAHOO.widget.DataSource. + * + * @property dataSource + * @type YAHOO.widget.DataSource + */ +YAHOO.widget.AutoComplete.prototype.dataSource = null; + +/** + * By default, results from local DataSources will pass through the filterResults + * method to apply a client-side matching algorithm. + * + * @property applyLocalFilter + * @type Boolean + * @default true for local arrays and json, otherwise false + */ +YAHOO.widget.AutoComplete.prototype.applyLocalFilter = null; + +/** + * When applyLocalFilter is true, the local filtering algorthim can have case sensitivity + * enabled. + * + * @property queryMatchCase + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.queryMatchCase = false; + +/** + * When applyLocalFilter is true, results can be locally filtered to return + * matching strings that "contain" the query string rather than simply "start with" + * the query string. + * + * @property queryMatchContains + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.queryMatchContains = false; + +/** + * Enables query subset matching. When the DataSource's cache is enabled and queryMatchSubset is + * true, substrings of queries will return matching cached results. For + * instance, if the first query is for "abc" susequent queries that start with + * "abc", like "abcd", will be queried against the cache, and not the live data + * source. Recommended only for DataSources that return comprehensive results + * for queries with very few characters. + * + * @property queryMatchSubset + * @type Boolean + * @default false + * + */ +YAHOO.widget.AutoComplete.prototype.queryMatchSubset = false; + +/** + * Number of characters that must be entered before querying for results. A negative value + * effectively turns off the widget. A value of 0 allows queries of null or empty string + * values. + * + * @property minQueryLength + * @type Number + * @default 1 + */ +YAHOO.widget.AutoComplete.prototype.minQueryLength = 1; + +/** + * Maximum number of results to display in results container. + * + * @property maxResultsDisplayed + * @type Number + * @default 10 + */ +YAHOO.widget.AutoComplete.prototype.maxResultsDisplayed = 10; + +/** + * Number of seconds to delay before submitting a query request. If a query + * request is received before a previous one has completed its delay, the + * previous request is cancelled and the new request is set to the delay. If + * typeAhead is also enabled, this value must always be less than the typeAheadDelay + * in order to avoid certain race conditions. + * + * @property queryDelay + * @type Number + * @default 0.2 + */ +YAHOO.widget.AutoComplete.prototype.queryDelay = 0.2; + +/** + * If typeAhead is true, number of seconds to delay before updating input with + * typeAhead value. In order to prevent certain race conditions, this value must + * always be greater than the queryDelay. + * + * @property typeAheadDelay + * @type Number + * @default 0.5 + */ +YAHOO.widget.AutoComplete.prototype.typeAheadDelay = 0.5; + +/** + * When IME usage is detected, AutoComplete will switch to querying the input + * value at the given interval rather than per key event. + * + * @property queryInterval + * @type Number + * @default 500 + */ +YAHOO.widget.AutoComplete.prototype.queryInterval = 500; + +/** + * Class name of a highlighted item within results container. + * + * @property highlightClassName + * @type String + * @default "yui-ac-highlight" + */ +YAHOO.widget.AutoComplete.prototype.highlightClassName = "yui-ac-highlight"; + +/** + * Class name of a pre-highlighted item within results container. + * + * @property prehighlightClassName + * @type String + */ +YAHOO.widget.AutoComplete.prototype.prehighlightClassName = null; + +/** + * Query delimiter. A single character separator for multiple delimited + * selections. Multiple delimiter characteres may be defined as an array of + * strings. A null value or empty string indicates that query results cannot + * be delimited. This feature is not recommended if you need forceSelection to + * be true. + * + * @property delimChar + * @type String | String[] + */ +YAHOO.widget.AutoComplete.prototype.delimChar = null; + +/** + * Whether or not the first item in results container should be automatically highlighted + * on expand. + * + * @property autoHighlight + * @type Boolean + * @default true + */ +YAHOO.widget.AutoComplete.prototype.autoHighlight = true; + +/** + * If autohighlight is enabled, whether or not the input field should be automatically updated + * with the first query result as the user types, auto-selecting the substring portion + * of the first result that the user has not yet typed. + * + * @property typeAhead + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.typeAhead = false; + +/** + * Whether or not to animate the expansion/collapse of the results container in the + * horizontal direction. + * + * @property animHoriz + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.animHoriz = false; + +/** + * Whether or not to animate the expansion/collapse of the results container in the + * vertical direction. + * + * @property animVert + * @type Boolean + * @default true + */ +YAHOO.widget.AutoComplete.prototype.animVert = true; + +/** + * Speed of container expand/collapse animation, in seconds.. + * + * @property animSpeed + * @type Number + * @default 0.3 + */ +YAHOO.widget.AutoComplete.prototype.animSpeed = 0.3; + +/** + * Whether or not to force the user's selection to match one of the query + * results. Enabling this feature essentially transforms the input field into a + * <select> field. This feature is not recommended with delimiter character(s) + * defined. + * + * @property forceSelection + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.forceSelection = false; + +/** + * Whether or not to allow browsers to cache user-typed input in the input + * field. Disabling this feature will prevent the widget from setting the + * autocomplete="off" on the input field. When autocomplete="off" + * and users click the back button after form submission, user-typed input can + * be prefilled by the browser from its cache. This caching of user input may + * not be desired for sensitive data, such as credit card numbers, in which + * case, implementers should consider setting allowBrowserAutocomplete to false. + * + * @property allowBrowserAutocomplete + * @type Boolean + * @default true + */ +YAHOO.widget.AutoComplete.prototype.allowBrowserAutocomplete = true; + +/** + * Enabling this feature prevents the toggling of the container to a collapsed state. + * Setting to true does not automatically trigger the opening of the container. + * Implementers are advised to pre-load the container with an explicit "sendQuery()" call. + * + * @property alwaysShowContainer + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.alwaysShowContainer = false; + +/** + * Whether or not to use an iFrame to layer over Windows form elements in + * IE. Set to true only when the results container will be on top of a + * <select> field in IE and thus exposed to the IE z-index bug (i.e., + * 5.5 < IE < 7). + * + * @property useIFrame + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.useIFrame = false; + +/** + * Whether or not the results container should have a shadow. + * + * @property useShadow + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.useShadow = false; + +/** + * Whether or not the input field should be updated with selections. + * + * @property supressInputUpdate + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.suppressInputUpdate = false; + +/** + * For backward compatibility to pre-2.6.0 formatResults() signatures, setting + * resultsTypeList to true will take each object literal result returned by + * DataSource and flatten into an array. + * + * @property resultTypeList + * @type Boolean + * @default true + */ +YAHOO.widget.AutoComplete.prototype.resultTypeList = true; + +/** + * For XHR DataSources, AutoComplete will automatically insert a "?" between the server URI and + * the "query" param/value pair. To prevent this behavior, implementers should + * set this value to false. To more fully customize the query syntax, implementers + * should override the generateRequest() method. + * + * @property queryQuestionMark + * @type Boolean + * @default true + */ +YAHOO.widget.AutoComplete.prototype.queryQuestionMark = true; + +///////////////////////////////////////////////////////////////////////////// +// +// Public methods +// +///////////////////////////////////////////////////////////////////////////// + + /** + * Public accessor to the unique name of the AutoComplete instance. + * + * @method toString + * @return {String} Unique name of the AutoComplete instance. + */ +YAHOO.widget.AutoComplete.prototype.toString = function() { + return "AutoComplete " + this._sName; +}; + + /** + * Returns DOM reference to input element. + * + * @method getInputEl + * @return {HTMLELement} DOM reference to input element. + */ +YAHOO.widget.AutoComplete.prototype.getInputEl = function() { + return this._elTextbox; +}; + + /** + * Returns DOM reference to container element. + * + * @method getContainerEl + * @return {HTMLELement} DOM reference to container element. + */ +YAHOO.widget.AutoComplete.prototype.getContainerEl = function() { + return this._elContainer; +}; + + /** + * Returns true if widget instance is currently focused. + * + * @method isFocused + * @return {Boolean} Returns true if widget instance is currently focused. + */ +YAHOO.widget.AutoComplete.prototype.isFocused = function() { + return (this._bFocused === null) ? false : this._bFocused; +}; + + /** + * Returns true if container is in an expanded state, false otherwise. + * + * @method isContainerOpen + * @return {Boolean} Returns true if container is in an expanded state, false otherwise. + */ +YAHOO.widget.AutoComplete.prototype.isContainerOpen = function() { + return this._bContainerOpen; +}; + +/** + * Public accessor to the <ul> element that displays query results within the results container. + * + * @method getListEl + * @return {HTMLElement[]} Reference to <ul> element within the results container. + */ +YAHOO.widget.AutoComplete.prototype.getListEl = function() { + return this._elList; +}; + +/** + * Public accessor to the matching string associated with a given <li> result. + * + * @method getListItemMatch + * @param elListItem {HTMLElement} Reference to <LI> element. + * @return {String} Matching string. + */ +YAHOO.widget.AutoComplete.prototype.getListItemMatch = function(elListItem) { + if(elListItem._sResultMatch) { + return elListItem._sResultMatch; + } + else { + return null; + } +}; + +/** + * Public accessor to the result data associated with a given <li> result. + * + * @method getListItemData + * @param elListItem {HTMLElement} Reference to <LI> element. + * @return {Object} Result data. + */ +YAHOO.widget.AutoComplete.prototype.getListItemData = function(elListItem) { + if(elListItem._oResultData) { + return elListItem._oResultData; + } + else { + return null; + } +}; + +/** + * Public accessor to the index of the associated with a given <li> result. + * + * @method getListItemIndex + * @param elListItem {HTMLElement} Reference to <LI> element. + * @return {Number} Index. + */ +YAHOO.widget.AutoComplete.prototype.getListItemIndex = function(elListItem) { + if(YAHOO.lang.isNumber(elListItem._nItemIndex)) { + return elListItem._nItemIndex; + } + else { + return null; + } +}; + +/** + * Sets HTML markup for the results container header. This markup will be + * inserted within a <div> tag with a class of "yui-ac-hd". + * + * @method setHeader + * @param sHeader {String} HTML markup for results container header. + */ +YAHOO.widget.AutoComplete.prototype.setHeader = function(sHeader) { + if(this._elHeader) { + var elHeader = this._elHeader; + if(sHeader) { + elHeader.innerHTML = sHeader; + elHeader.style.display = "block"; + } + else { + elHeader.innerHTML = ""; + elHeader.style.display = "none"; + } + } +}; + +/** + * Sets HTML markup for the results container footer. This markup will be + * inserted within a <div> tag with a class of "yui-ac-ft". + * + * @method setFooter + * @param sFooter {String} HTML markup for results container footer. + */ +YAHOO.widget.AutoComplete.prototype.setFooter = function(sFooter) { + if(this._elFooter) { + var elFooter = this._elFooter; + if(sFooter) { + elFooter.innerHTML = sFooter; + elFooter.style.display = "block"; + } + else { + elFooter.innerHTML = ""; + elFooter.style.display = "none"; + } + } +}; + +/** + * Sets HTML markup for the results container body. This markup will be + * inserted within a <div> tag with a class of "yui-ac-bd". + * + * @method setBody + * @param sBody {String} HTML markup for results container body. + */ +YAHOO.widget.AutoComplete.prototype.setBody = function(sBody) { + if(this._elBody) { + var elBody = this._elBody; + YAHOO.util.Event.purgeElement(elBody, true); + if(sBody) { + elBody.innerHTML = sBody; + elBody.style.display = "block"; + } + else { + elBody.innerHTML = ""; + elBody.style.display = "none"; + } + this._elList = null; + } +}; + +/** +* A function that converts an AutoComplete query into a request value which is then +* passed to the DataSource's sendRequest method in order to retrieve data for +* the query. By default, returns a String with the syntax: "query={query}" +* Implementers can customize this method for custom request syntaxes. +* +* @method generateRequest +* @param sQuery {String} Query string +*/ +YAHOO.widget.AutoComplete.prototype.generateRequest = function(sQuery) { + var dataType = this.dataSource.dataType; + + // Transform query string in to a request for remote data + // By default, local data doesn't need a transformation, just passes along the query as is. + if(dataType === YAHOO.util.DataSourceBase.TYPE_XHR) { + // By default, XHR GET requests look like "{scriptURI}?{scriptQueryParam}={sQuery}&{scriptQueryAppend}" + if(!this.dataSource.connMethodPost) { + sQuery = (this.queryQuestionMark ? "?" : "") + (this.dataSource.scriptQueryParam || "query") + "=" + sQuery + + (this.dataSource.scriptQueryAppend ? ("&" + this.dataSource.scriptQueryAppend) : ""); + } + // By default, XHR POST bodies are sent to the {scriptURI} like "{scriptQueryParam}={sQuery}&{scriptQueryAppend}" + else { + sQuery = (this.dataSource.scriptQueryParam || "query") + "=" + sQuery + + (this.dataSource.scriptQueryAppend ? ("&" + this.dataSource.scriptQueryAppend) : ""); + } + } + // By default, remote script node requests look like "{scriptURI}&{scriptCallbackParam}={callbackString}&{scriptQueryParam}={sQuery}&{scriptQueryAppend}" + else if(dataType === YAHOO.util.DataSourceBase.TYPE_SCRIPTNODE) { + sQuery = "&" + (this.dataSource.scriptQueryParam || "query") + "=" + sQuery + + (this.dataSource.scriptQueryAppend ? ("&" + this.dataSource.scriptQueryAppend) : ""); + } + + return sQuery; +}; + +/** + * Makes query request to the DataSource. + * + * @method sendQuery + * @param sQuery {String} Query string. + */ +YAHOO.widget.AutoComplete.prototype.sendQuery = function(sQuery) { + // Adjust programatically sent queries to look like they input by user + // when delimiters are enabled + var newQuery = (this.delimChar) ? this._elTextbox.value + sQuery : sQuery; + this._sendQuery(newQuery); +}; + +/** + * Collapses container. + * + * @method collapseContainer + */ +YAHOO.widget.AutoComplete.prototype.collapseContainer = function() { + this._toggleContainer(false); +}; + +/** + * Handles subset matching for when queryMatchSubset is enabled. + * + * @method getSubsetMatches + * @param sQuery {String} Query string. + * @return {Object} oParsedResponse or null. + */ +YAHOO.widget.AutoComplete.prototype.getSubsetMatches = function(sQuery) { + var subQuery, oCachedResponse, subRequest; + // Loop through substrings of each cached element's query property... + for(var i = sQuery.length; i >= this.minQueryLength ; i--) { + subRequest = this.generateRequest(sQuery.substr(0,i)); + this.dataRequestEvent.fire(this, subQuery, subRequest); + YAHOO.log("Searching for query subset \"" + subQuery + "\" in cache", "info", this.toString()); + + // If a substring of the query is found in the cache + oCachedResponse = this.dataSource.getCachedResponse(subRequest); + if(oCachedResponse) { + YAHOO.log("Found match for query subset \"" + subQuery + "\": " + YAHOO.lang.dump(oCachedResponse), "info", this.toString()); + return this.filterResults.apply(this.dataSource, [sQuery, oCachedResponse, oCachedResponse, {scope:this}]); + } + } + YAHOO.log("Did not find subset match for query subset \"" + sQuery + "\"" , "info", this.toString()); + return null; +}; + +/** + * Executed by DataSource (within DataSource scope via doBeforeParseData()) to + * handle responseStripAfter cleanup. + * + * @method preparseRawResponse + * @param sQuery {String} Query string. + * @return {Object} oParsedResponse or null. + */ +YAHOO.widget.AutoComplete.prototype.preparseRawResponse = function(oRequest, oFullResponse, oCallback) { + var nEnd = ((this.responseStripAfter !== "") && (oFullResponse.indexOf)) ? + oFullResponse.indexOf(this.responseStripAfter) : -1; + if(nEnd != -1) { + oFullResponse = oFullResponse.substring(0,nEnd); + } + return oFullResponse; +}; + +/** + * Executed by DataSource (within DataSource scope via doBeforeCallback()) to + * filter results through a simple client-side matching algorithm. + * + * @method filterResults + * @param sQuery {String} Original request. + * @param oFullResponse {Object} Full response object. + * @param oParsedResponse {Object} Parsed response object. + * @param oCallback {Object} Callback object. + * @return {Object} Filtered response object. + */ + +YAHOO.widget.AutoComplete.prototype.filterResults = function(sQuery, oFullResponse, oParsedResponse, oCallback) { + // Only if a query string is available to match against + if(sQuery && sQuery !== "") { + // First make a copy of the oParseResponse + oParsedResponse = YAHOO.widget.AutoComplete._cloneObject(oParsedResponse); + + var oAC = oCallback.scope, + oDS = this, + allResults = oParsedResponse.results, // the array of results + filteredResults = [], // container for filtered results + bMatchFound = false, + bMatchCase = (oDS.queryMatchCase || oAC.queryMatchCase), // backward compat + bMatchContains = (oDS.queryMatchContains || oAC.queryMatchContains); // backward compat + + // Loop through each result object... + for(var i = allResults.length-1; i >= 0; i--) { + var oResult = allResults[i]; + + // Grab the data to match against from the result object... + var sResult = null; + + // Result object is a simple string already + if(YAHOO.lang.isString(oResult)) { + sResult = oResult; + } + // Result object is an array of strings + else if(YAHOO.lang.isArray(oResult)) { + sResult = oResult[0]; + + } + // Result object is an object literal of strings + else if(this.responseSchema.fields) { + var key = this.responseSchema.fields[0].key || this.responseSchema.fields[0]; + sResult = oResult[key]; + } + // Backwards compatibility + else if(this.key) { + sResult = oResult[this.key]; + } + + if(YAHOO.lang.isString(sResult)) { + + var sKeyIndex = (bMatchCase) ? + sResult.indexOf(decodeURIComponent(sQuery)) : + sResult.toLowerCase().indexOf(decodeURIComponent(sQuery).toLowerCase()); + + // A STARTSWITH match is when the query is found at the beginning of the key string... + if((!bMatchContains && (sKeyIndex === 0)) || + // A CONTAINS match is when the query is found anywhere within the key string... + (bMatchContains && (sKeyIndex > -1))) { + // Stash the match + filteredResults.unshift(oResult); + } + } + } + oParsedResponse.results = filteredResults; + YAHOO.log("Filtered " + filteredResults.length + " results against query \"" + sQuery + "\": " + YAHOO.lang.dump(filteredResults), "info", this.toString()); + } + else { + YAHOO.log("Did not filter results against query", "info", this.toString()); + } + + return oParsedResponse; +}; + +/** + * Handles response for display. This is the callback function method passed to + * YAHOO.util.DataSourceBase#sendRequest so results from the DataSource are + * returned to the AutoComplete instance. + * + * @method handleResponse + * @param sQuery {String} Original request. + * @param oResponse {Object} Response object. + * @param oPayload {MIXED} (optional) Additional argument(s) + */ +YAHOO.widget.AutoComplete.prototype.handleResponse = function(sQuery, oResponse, oPayload) { + if((this instanceof YAHOO.widget.AutoComplete) && this._sName) { + this._populateList(sQuery, oResponse, oPayload); + } +}; + +/** + * Overridable method called before container is loaded with result data. + * + * @method doBeforeLoadData + * @param sQuery {String} Original request. + * @param oResponse {Object} Response object. + * @param oPayload {MIXED} (optional) Additional argument(s) + * @return {Boolean} Return true to continue loading data, false to cancel. + */ +YAHOO.widget.AutoComplete.prototype.doBeforeLoadData = function(sQuery, oResponse, oPayload) { + return true; +}; + +/** + * Overridable method that returns HTML markup for one result to be populated + * as innerHTML of an <LI> element. + * + * @method formatResult + * @param oResultData {Object} Result data object. + * @param sQuery {String} The corresponding query string. + * @param sResultMatch {HTMLElement} The current query string. + * @return {String} HTML markup of formatted result data. + */ +YAHOO.widget.AutoComplete.prototype.formatResult = function(oResultData, sQuery, sResultMatch) { + var sMarkup = (sResultMatch) ? sResultMatch : ""; + return sMarkup; +}; + +/** + * Overridable method called before container expands allows implementers to access data + * and DOM elements. + * + * @method doBeforeExpandContainer + * @param elTextbox {HTMLElement} The text input box. + * @param elContainer {HTMLElement} The container element. + * @param sQuery {String} The query string. + * @param aResults {Object[]} An array of query results. + * @return {Boolean} Return true to continue expanding container, false to cancel the expand. + */ +YAHOO.widget.AutoComplete.prototype.doBeforeExpandContainer = function(elTextbox, elContainer, sQuery, aResults) { + return true; +}; + + +/** + * Nulls out the entire AutoComplete instance and related objects, removes attached + * event listeners, and clears out DOM elements inside the container. After + * calling this method, the instance reference should be expliclitly nulled by + * implementer, as in myDataTable = null. Use with caution! + * + * @method destroy + */ +YAHOO.widget.AutoComplete.prototype.destroy = function() { + var instanceName = this.toString(); + var elInput = this._elTextbox; + var elContainer = this._elContainer; + + // Unhook custom events + this.textboxFocusEvent.unsubscribeAll(); + this.textboxKeyEvent.unsubscribeAll(); + this.dataRequestEvent.unsubscribeAll(); + this.dataReturnEvent.unsubscribeAll(); + this.dataErrorEvent.unsubscribeAll(); + this.containerPopulateEvent.unsubscribeAll(); + this.containerExpandEvent.unsubscribeAll(); + this.typeAheadEvent.unsubscribeAll(); + this.itemMouseOverEvent.unsubscribeAll(); + this.itemMouseOutEvent.unsubscribeAll(); + this.itemArrowToEvent.unsubscribeAll(); + this.itemArrowFromEvent.unsubscribeAll(); + this.itemSelectEvent.unsubscribeAll(); + this.unmatchedItemSelectEvent.unsubscribeAll(); + this.selectionEnforceEvent.unsubscribeAll(); + this.containerCollapseEvent.unsubscribeAll(); + this.textboxBlurEvent.unsubscribeAll(); + this.textboxChangeEvent.unsubscribeAll(); + + // Unhook DOM events + YAHOO.util.Event.purgeElement(elInput, true); + YAHOO.util.Event.purgeElement(elContainer, true); + + // Remove DOM elements + elContainer.innerHTML = ""; + + // Null out objects + for(var key in this) { + if(YAHOO.lang.hasOwnProperty(this, key)) { + this[key] = null; + } + } + + YAHOO.log("AutoComplete instance destroyed: " + instanceName); +}; + +///////////////////////////////////////////////////////////////////////////// +// +// Public events +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Fired when the input field receives focus. + * + * @event textboxFocusEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + */ +YAHOO.widget.AutoComplete.prototype.textboxFocusEvent = null; + +/** + * Fired when the input field receives key input. + * + * @event textboxKeyEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param nKeycode {Number} The keycode number. + */ +YAHOO.widget.AutoComplete.prototype.textboxKeyEvent = null; + +/** + * Fired when the AutoComplete instance makes a request to the DataSource. + * + * @event dataRequestEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param sQuery {String} The query string. + * @param oRequest {Object} The request. + */ +YAHOO.widget.AutoComplete.prototype.dataRequestEvent = null; + +/** + * Fired when the AutoComplete instance receives query results from the data + * source. + * + * @event dataReturnEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param sQuery {String} The query string. + * @param aResults {Object[]} Results array. + */ +YAHOO.widget.AutoComplete.prototype.dataReturnEvent = null; + +/** + * Fired when the AutoComplete instance does not receive query results from the + * DataSource due to an error. + * + * @event dataErrorEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param sQuery {String} The query string. + */ +YAHOO.widget.AutoComplete.prototype.dataErrorEvent = null; + +/** + * Fired when the results container is populated. + * + * @event containerPopulateEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + */ +YAHOO.widget.AutoComplete.prototype.containerPopulateEvent = null; + +/** + * Fired when the results container is expanded. + * + * @event containerExpandEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param sQuery {String} The query string. + * @param aResults {Object[]} Results array. + */ +YAHOO.widget.AutoComplete.prototype.containerExpandEvent = null; + +/** + * Fired when the input field has been prefilled by the type-ahead + * feature. + * + * @event typeAheadEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param sQuery {String} The query string. + * @param sPrefill {String} The prefill string. + */ +YAHOO.widget.AutoComplete.prototype.typeAheadEvent = null; + +/** + * Fired when result item has been moused over. + * + * @event itemMouseOverEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param elItem {HTMLElement} The <li> element item moused to. + */ +YAHOO.widget.AutoComplete.prototype.itemMouseOverEvent = null; + +/** + * Fired when result item has been moused out. + * + * @event itemMouseOutEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param elItem {HTMLElement} The <li> element item moused from. + */ +YAHOO.widget.AutoComplete.prototype.itemMouseOutEvent = null; + +/** + * Fired when result item has been arrowed to. + * + * @event itemArrowToEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param elItem {HTMLElement} The <li> element item arrowed to. + */ +YAHOO.widget.AutoComplete.prototype.itemArrowToEvent = null; + +/** + * Fired when result item has been arrowed away from. + * + * @event itemArrowFromEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param elItem {HTMLElement} The <li> element item arrowed from. + */ +YAHOO.widget.AutoComplete.prototype.itemArrowFromEvent = null; + +/** + * Fired when an item is selected via mouse click, ENTER key, or TAB key. + * + * @event itemSelectEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param elItem {HTMLElement} The selected <li> element item. + * @param oData {Object} The data returned for the item, either as an object, + * or mapped from the schema into an array. + */ +YAHOO.widget.AutoComplete.prototype.itemSelectEvent = null; + +/** + * Fired when a user selection does not match any of the displayed result items. + * + * @event unmatchedItemSelectEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param sSelection {String} The selected string. + */ +YAHOO.widget.AutoComplete.prototype.unmatchedItemSelectEvent = null; + +/** + * Fired if forceSelection is enabled and the user's input has been cleared + * because it did not match one of the returned query results. + * + * @event selectionEnforceEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + */ +YAHOO.widget.AutoComplete.prototype.selectionEnforceEvent = null; + +/** + * Fired when the results container is collapsed. + * + * @event containerCollapseEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + */ +YAHOO.widget.AutoComplete.prototype.containerCollapseEvent = null; + +/** + * Fired when the input field loses focus. + * + * @event textboxBlurEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + */ +YAHOO.widget.AutoComplete.prototype.textboxBlurEvent = null; + +/** + * Fired when the input field value has changed when it loses focus. + * + * @event textboxChangeEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + */ +YAHOO.widget.AutoComplete.prototype.textboxChangeEvent = null; + +///////////////////////////////////////////////////////////////////////////// +// +// Private member variables +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Internal class variable to index multiple AutoComplete instances. + * + * @property _nIndex + * @type Number + * @default 0 + * @private + */ +YAHOO.widget.AutoComplete._nIndex = 0; + +/** + * Name of AutoComplete instance. + * + * @property _sName + * @type String + * @private + */ +YAHOO.widget.AutoComplete.prototype._sName = null; + +/** + * Text input field DOM element. + * + * @property _elTextbox + * @type HTMLElement + * @private + */ +YAHOO.widget.AutoComplete.prototype._elTextbox = null; + +/** + * Container DOM element. + * + * @property _elContainer + * @type HTMLElement + * @private + */ +YAHOO.widget.AutoComplete.prototype._elContainer = null; + +/** + * Reference to content element within container element. + * + * @property _elContent + * @type HTMLElement + * @private + */ +YAHOO.widget.AutoComplete.prototype._elContent = null; + +/** + * Reference to header element within content element. + * + * @property _elHeader + * @type HTMLElement + * @private + */ +YAHOO.widget.AutoComplete.prototype._elHeader = null; + +/** + * Reference to body element within content element. + * + * @property _elBody + * @type HTMLElement + * @private + */ +YAHOO.widget.AutoComplete.prototype._elBody = null; + +/** + * Reference to footer element within content element. + * + * @property _elFooter + * @type HTMLElement + * @private + */ +YAHOO.widget.AutoComplete.prototype._elFooter = null; + +/** + * Reference to shadow element within container element. + * + * @property _elShadow + * @type HTMLElement + * @private + */ +YAHOO.widget.AutoComplete.prototype._elShadow = null; + +/** + * Reference to iframe element within container element. + * + * @property _elIFrame + * @type HTMLElement + * @private + */ +YAHOO.widget.AutoComplete.prototype._elIFrame = null; + +/** + * Whether or not the input field is currently in focus. If query results come back + * but the user has already moved on, do not proceed with auto complete behavior. + * + * @property _bFocused + * @type Boolean + * @private + */ +YAHOO.widget.AutoComplete.prototype._bFocused = null; + +/** + * Animation instance for container expand/collapse. + * + * @property _oAnim + * @type Boolean + * @private + */ +YAHOO.widget.AutoComplete.prototype._oAnim = null; + +/** + * Whether or not the results container is currently open. + * + * @property _bContainerOpen + * @type Boolean + * @private + */ +YAHOO.widget.AutoComplete.prototype._bContainerOpen = false; + +/** + * Whether or not the mouse is currently over the results + * container. This is necessary in order to prevent clicks on container items + * from being text input field blur events. + * + * @property _bOverContainer + * @type Boolean + * @private + */ +YAHOO.widget.AutoComplete.prototype._bOverContainer = false; + +/** + * Internal reference to <ul> elements that contains query results within the + * results container. + * + * @property _elList + * @type HTMLElement + * @private + */ +YAHOO.widget.AutoComplete.prototype._elList = null; + +/* + * Array of <li> elements references that contain query results within the + * results container. + * + * @property _aListItemEls + * @type HTMLElement[] + * @private + */ +//YAHOO.widget.AutoComplete.prototype._aListItemEls = null; + +/** + * Number of <li> elements currently displayed in results container. + * + * @property _nDisplayedItems + * @type Number + * @private + */ +YAHOO.widget.AutoComplete.prototype._nDisplayedItems = 0; + +/* + * Internal count of <li> elements displayed and hidden in results container. + * + * @property _maxResultsDisplayed + * @type Number + * @private + */ +//YAHOO.widget.AutoComplete.prototype._maxResultsDisplayed = 0; + +/** + * Current query string + * + * @property _sCurQuery + * @type String + * @private + */ +YAHOO.widget.AutoComplete.prototype._sCurQuery = null; + +/** + * Selections from previous queries (for saving delimited queries). + * + * @property _sPastSelections + * @type String + * @default "" + * @private + */ +YAHOO.widget.AutoComplete.prototype._sPastSelections = ""; + +/** + * Stores initial input value used to determine if textboxChangeEvent should be fired. + * + * @property _sInitInputValue + * @type String + * @private + */ +YAHOO.widget.AutoComplete.prototype._sInitInputValue = null; + +/** + * Pointer to the currently highlighted <li> element in the container. + * + * @property _elCurListItem + * @type HTMLElement + * @private + */ +YAHOO.widget.AutoComplete.prototype._elCurListItem = null; + +/** + * Whether or not an item has been selected since the container was populated + * with results. Reset to false by _populateList, and set to true when item is + * selected. + * + * @property _bItemSelected + * @type Boolean + * @private + */ +YAHOO.widget.AutoComplete.prototype._bItemSelected = false; + +/** + * Key code of the last key pressed in textbox. + * + * @property _nKeyCode + * @type Number + * @private + */ +YAHOO.widget.AutoComplete.prototype._nKeyCode = null; + +/** + * Delay timeout ID. + * + * @property _nDelayID + * @type Number + * @private + */ +YAHOO.widget.AutoComplete.prototype._nDelayID = -1; + +/** + * TypeAhead delay timeout ID. + * + * @property _nTypeAheadDelayID + * @type Number + * @private + */ +YAHOO.widget.AutoComplete.prototype._nTypeAheadDelayID = -1; + +/** + * Src to iFrame used when useIFrame = true. Supports implementations over SSL + * as well. + * + * @property _iFrameSrc + * @type String + * @private + */ +YAHOO.widget.AutoComplete.prototype._iFrameSrc = "javascript:false;"; + +/** + * For users typing via certain IMEs, queries must be triggered by intervals, + * since key events yet supported across all browsers for all IMEs. + * + * @property _queryInterval + * @type Object + * @private + */ +YAHOO.widget.AutoComplete.prototype._queryInterval = null; + +/** + * Internal tracker to last known textbox value, used to determine whether or not + * to trigger a query via interval for certain IME users. + * + * @event _sLastTextboxValue + * @type String + * @private + */ +YAHOO.widget.AutoComplete.prototype._sLastTextboxValue = null; + +///////////////////////////////////////////////////////////////////////////// +// +// Private methods +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Updates and validates latest public config properties. + * + * @method __initProps + * @private + */ +YAHOO.widget.AutoComplete.prototype._initProps = function() { + // Correct any invalid values + var minQueryLength = this.minQueryLength; + if(!YAHOO.lang.isNumber(minQueryLength)) { + this.minQueryLength = 1; + } + var maxResultsDisplayed = this.maxResultsDisplayed; + if(!YAHOO.lang.isNumber(maxResultsDisplayed) || (maxResultsDisplayed < 1)) { + this.maxResultsDisplayed = 10; + } + var queryDelay = this.queryDelay; + if(!YAHOO.lang.isNumber(queryDelay) || (queryDelay < 0)) { + this.queryDelay = 0.2; + } + var typeAheadDelay = this.typeAheadDelay; + if(!YAHOO.lang.isNumber(typeAheadDelay) || (typeAheadDelay < 0)) { + this.typeAheadDelay = 0.2; + } + var delimChar = this.delimChar; + if(YAHOO.lang.isString(delimChar) && (delimChar.length > 0)) { + this.delimChar = [delimChar]; + } + else if(!YAHOO.lang.isArray(delimChar)) { + this.delimChar = null; + } + var animSpeed = this.animSpeed; + if((this.animHoriz || this.animVert) && YAHOO.util.Anim) { + if(!YAHOO.lang.isNumber(animSpeed) || (animSpeed < 0)) { + this.animSpeed = 0.3; + } + if(!this._oAnim ) { + this._oAnim = new YAHOO.util.Anim(this._elContent, {}, this.animSpeed); + } + else { + this._oAnim.duration = this.animSpeed; + } + } + if(this.forceSelection && delimChar) { + YAHOO.log("The forceSelection feature has been enabled with delimChar defined.","warn", this.toString()); + } +}; + +/** + * Initializes the results container helpers if they are enabled and do + * not exist + * + * @method _initContainerHelperEls + * @private + */ +YAHOO.widget.AutoComplete.prototype._initContainerHelperEls = function() { + if(this.useShadow && !this._elShadow) { + var elShadow = document.createElement("div"); + elShadow.className = "yui-ac-shadow"; + elShadow.style.width = 0; + elShadow.style.height = 0; + this._elShadow = this._elContainer.appendChild(elShadow); + } + if(this.useIFrame && !this._elIFrame) { + var elIFrame = document.createElement("iframe"); + elIFrame.src = this._iFrameSrc; + elIFrame.frameBorder = 0; + elIFrame.scrolling = "no"; + elIFrame.style.position = "absolute"; + elIFrame.style.width = 0; + elIFrame.style.height = 0; + elIFrame.tabIndex = -1; + elIFrame.style.padding = 0; + this._elIFrame = this._elContainer.appendChild(elIFrame); + } +}; + +/** + * Initializes the results container once at object creation + * + * @method _initContainerEl + * @private + */ +YAHOO.widget.AutoComplete.prototype._initContainerEl = function() { + YAHOO.util.Dom.addClass(this._elContainer, "yui-ac-container"); + + if(!this._elContent) { + // The elContent div is assigned DOM listeners and + // helps size the iframe and shadow properly + var elContent = document.createElement("div"); + elContent.className = "yui-ac-content"; + elContent.style.display = "none"; + + this._elContent = this._elContainer.appendChild(elContent); + + var elHeader = document.createElement("div"); + elHeader.className = "yui-ac-hd"; + elHeader.style.display = "none"; + this._elHeader = this._elContent.appendChild(elHeader); + + var elBody = document.createElement("div"); + elBody.className = "yui-ac-bd"; + this._elBody = this._elContent.appendChild(elBody); + + var elFooter = document.createElement("div"); + elFooter.className = "yui-ac-ft"; + elFooter.style.display = "none"; + this._elFooter = this._elContent.appendChild(elFooter); + } + else { + YAHOO.log("Could not initialize the container","warn",this.toString()); + } +}; + +/** + * Clears out contents of container body and creates up to + * YAHOO.widget.AutoComplete#maxResultsDisplayed <li> elements in an + * <ul> element. + * + * @method _initListEl + * @private + */ +YAHOO.widget.AutoComplete.prototype._initListEl = function() { + var nListLength = this.maxResultsDisplayed; + + var elList = this._elList || document.createElement("ul"); + var elListItem; + while(elList.childNodes.length < nListLength) { + elListItem = document.createElement("li"); + elListItem.style.display = "none"; + elListItem._nItemIndex = elList.childNodes.length; + elList.appendChild(elListItem); + } + if(!this._elList) { + var elBody = this._elBody; + YAHOO.util.Event.purgeElement(elBody, true); + elBody.innerHTML = ""; + this._elList = elBody.appendChild(elList); + } + +}; + +/** + * Enables interval detection for IME support. + * + * @method _enableIntervalDetection + * @re + * @private + */ +YAHOO.widget.AutoComplete.prototype._enableIntervalDetection = function() { + var oSelf = this; + if(!oSelf._queryInterval && oSelf.queryInterval) { + oSelf._queryInterval = setInterval(function() { oSelf._onInterval(); }, oSelf.queryInterval); + YAHOO.log("Interval set", "info", this.toString()); + } +}; + +/** + * Enables query triggers based on text input detection by intervals (rather + * than by key events). + * + * @method _onInterval + * @private + */ +YAHOO.widget.AutoComplete.prototype._onInterval = function() { + var currValue = this._elTextbox.value; + var lastValue = this._sLastTextboxValue; + if(currValue != lastValue) { + this._sLastTextboxValue = currValue; + this._sendQuery(currValue); + } +}; + +/** + * Cancels text input detection by intervals. + * + * @method _clearInterval + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._clearInterval = function() { + if(this._queryInterval) { + clearInterval(this._queryInterval); + this._queryInterval = null; + YAHOO.log("Interval cleared", "info", this.toString()); + } +}; + +/** + * Whether or not key is functional or should be ignored. Note that the right + * arrow key is NOT an ignored key since it triggers queries for certain intl + * charsets. + * + * @method _isIgnoreKey + * @param nKeycode {Number} Code of key pressed. + * @return {Boolean} True if key should be ignored, false otherwise. + * @private + */ +YAHOO.widget.AutoComplete.prototype._isIgnoreKey = function(nKeyCode) { + if((nKeyCode == 9) || (nKeyCode == 13) || // tab, enter + (nKeyCode == 16) || (nKeyCode == 17) || // shift, ctl + (nKeyCode >= 18 && nKeyCode <= 20) || // alt, pause/break,caps lock + (nKeyCode == 27) || // esc + (nKeyCode >= 33 && nKeyCode <= 35) || // page up,page down,end + /*(nKeyCode >= 36 && nKeyCode <= 38) || // home,left,up + (nKeyCode == 40) || // down*/ + (nKeyCode >= 36 && nKeyCode <= 40) || // home,left,up, right, down + (nKeyCode >= 44 && nKeyCode <= 45) || // print screen,insert + (nKeyCode == 229) // Bug 2041973: Korean XP fires 2 keyup events, the key and 229 + ) { + return true; + } + return false; +}; + +/** + * Makes query request to the DataSource. + * + * @method _sendQuery + * @param sQuery {String} Query string. + * @private + */ +YAHOO.widget.AutoComplete.prototype._sendQuery = function(sQuery) { + // Widget has been effectively turned off + if(this.minQueryLength < 0) { + this._toggleContainer(false); + YAHOO.log("Property minQueryLength is less than 0", "info", this.toString()); + return; + } + // Delimiter has been enabled + var aDelimChar = (this.delimChar) ? this.delimChar : null; + if(aDelimChar) { + // Loop through all possible delimiters and find the rightmost one in the query + // A " " may be a false positive if they are defined as delimiters AND + // are used to separate delimited queries + var nDelimIndex = -1; + for(var i = aDelimChar.length-1; i >= 0; i--) { + var nNewIndex = sQuery.lastIndexOf(aDelimChar[i]); + if(nNewIndex > nDelimIndex) { + nDelimIndex = nNewIndex; + } + } + // If we think the last delimiter is a space (" "), make sure it is NOT + // a false positive by also checking the char directly before it + if(aDelimChar[i] == " ") { + for (var j = aDelimChar.length-1; j >= 0; j--) { + if(sQuery[nDelimIndex - 1] == aDelimChar[j]) { + nDelimIndex--; + break; + } + } + } + // A delimiter has been found in the query so extract the latest query from past selections + if(nDelimIndex > -1) { + var nQueryStart = nDelimIndex + 1; + // Trim any white space from the beginning... + while(sQuery.charAt(nQueryStart) == " ") { + nQueryStart += 1; + } + // ...and save the rest of the string for later + this._sPastSelections = sQuery.substring(0,nQueryStart); + // Here is the query itself + sQuery = sQuery.substr(nQueryStart); + } + // No delimiter found in the query, so there are no selections from past queries + else { + this._sPastSelections = ""; + } + } + + // Don't search queries that are too short + if((sQuery && (sQuery.length < this.minQueryLength)) || (!sQuery && this.minQueryLength > 0)) { + if(this._nDelayID != -1) { + clearTimeout(this._nDelayID); + } + this._toggleContainer(false); + YAHOO.log("Query \"" + sQuery + "\" is too short", "info", this.toString()); + return; + } + + sQuery = encodeURIComponent(sQuery); + this._nDelayID = -1; // Reset timeout ID because request is being made + + // Subset matching + if(this.dataSource.queryMatchSubset || this.queryMatchSubset) { // backward compat + var oResponse = this.getSubsetMatches(sQuery); + if(oResponse) { + this.handleResponse(sQuery, oResponse, {query: sQuery}); + return; + } + } + + if(this.responseStripAfter) { + this.dataSource.doBeforeParseData = this.preparseRawResponse; + } + if(this.applyLocalFilter) { + this.dataSource.doBeforeCallback = this.filterResults; + } + + var sRequest = this.generateRequest(sQuery); + this.dataRequestEvent.fire(this, sQuery, sRequest); + YAHOO.log("Sending query \"" + sRequest + "\"", "info", this.toString()); + + this.dataSource.sendRequest(sRequest, { + success : this.handleResponse, + failure : this.handleResponse, + scope : this, + argument: { + query: sQuery + } + }); +}; + +/** + * Populates the array of <li> elements in the container with query + * results. + * + * @method _populateList + * @param sQuery {String} Original request. + * @param oResponse {Object} Response object. + * @param oPayload {MIXED} (optional) Additional argument(s) + * @private + */ +YAHOO.widget.AutoComplete.prototype._populateList = function(sQuery, oResponse, oPayload) { + // Clear previous timeout + if(this._nTypeAheadDelayID != -1) { + clearTimeout(this._nTypeAheadDelayID); + } + + sQuery = (oPayload && oPayload.query) ? oPayload.query : sQuery; + + // Pass data through abstract method for any transformations + var ok = this.doBeforeLoadData(sQuery, oResponse, oPayload); + + // Data is ok + if(ok && !oResponse.error) { + this.dataReturnEvent.fire(this, sQuery, oResponse.results); + + // Continue only if instance is still focused (i.e., user hasn't already moved on) + // Null indicates initialized state, which is ok too + if(this._bFocused || (this._bFocused === null)) { + + //TODO: is this still necessary? + /*var isOpera = (YAHOO.env.ua.opera); + var contentStyle = this._elContent.style; + contentStyle.width = (!isOpera) ? null : ""; + contentStyle.height = (!isOpera) ? null : "";*/ + + // Store state for this interaction + var sCurQuery = decodeURIComponent(sQuery); + this._sCurQuery = sCurQuery; + this._bItemSelected = false; + + var allResults = oResponse.results, + nItemsToShow = Math.min(allResults.length,this.maxResultsDisplayed), + sMatchKey = (this.dataSource.responseSchema.fields) ? + (this.dataSource.responseSchema.fields[0].key || this.dataSource.responseSchema.fields[0]) : 0; + + if(nItemsToShow > 0) { + // Make sure container and helpers are ready to go + if(!this._elList || (this._elList.childNodes.length < nItemsToShow)) { + this._initListEl(); + } + this._initContainerHelperEls(); + + var allListItemEls = this._elList.childNodes; + // Fill items with data from the bottom up + for(var i = nItemsToShow-1; i >= 0; i--) { + var elListItem = allListItemEls[i], + oResult = allResults[i]; + + // Backward compatibility + if(this.resultTypeList) { + // Results need to be converted back to an array + var aResult = []; + // Match key is first + aResult[0] = (YAHOO.lang.isString(oResult)) ? oResult : oResult[sMatchKey] || oResult[this.key]; + // Add additional data to the result array + var fields = this.dataSource.responseSchema.fields; + if(YAHOO.lang.isArray(fields) && (fields.length > 1)) { + for(var k=1, len=fields.length; k= nItemsToShow; j--) { + extraListItem = allListItemEls[j]; + extraListItem.style.display = "none"; + } + } + + this._nDisplayedItems = nItemsToShow; + + this.containerPopulateEvent.fire(this, sQuery, allResults); + + // Highlight the first item + if(this.autoHighlight) { + var elFirstListItem = this._elList.firstChild; + this._toggleHighlight(elFirstListItem,"to"); + this.itemArrowToEvent.fire(this, elFirstListItem); + YAHOO.log("Arrowed to first item", "info", this.toString()); + this._typeAhead(elFirstListItem,sQuery); + } + // Unhighlight any previous time + else { + this._toggleHighlight(this._elCurListItem,"from"); + } + + // Expand the container + ok = this.doBeforeExpandContainer(this._elTextbox, this._elContainer, sQuery, allResults); + this._toggleContainer(ok); + } + else { + this._toggleContainer(false); + } + + YAHOO.log("Container populated with " + nItemsToShow + " list items", "info", this.toString()); + return; + } + } + // Error + else { + this.dataErrorEvent.fire(this, sQuery); + } + + YAHOO.log("Could not populate list", "info", this.toString()); +}; + +/** + * When forceSelection is true and the user attempts + * leave the text input box without selecting an item from the query results, + * the user selection is cleared. + * + * @method _clearSelection + * @private + */ +YAHOO.widget.AutoComplete.prototype._clearSelection = function() { + var sValue = this._elTextbox.value; + //TODO: need to check against all delimChars? + var sChar = (this.delimChar) ? this.delimChar[0] : null; + var nIndex = (sChar) ? sValue.lastIndexOf(sChar, sValue.length-2) : -1; + if(nIndex > -1) { + this._elTextbox.value = sValue.substring(0,nIndex); + } + else { + this._elTextbox.value = ""; + } + this._sPastSelections = this._elTextbox.value; + + // Fire custom event + this.selectionEnforceEvent.fire(this); + YAHOO.log("Selection enforced", "info", this.toString()); +}; + +/** + * Whether or not user-typed value in the text input box matches any of the + * query results. + * + * @method _textMatchesOption + * @return {HTMLElement} Matching list item element if user-input text matches + * a result, null otherwise. + * @private + */ +YAHOO.widget.AutoComplete.prototype._textMatchesOption = function() { + var elMatch = null; + + for(var i = this._nDisplayedItems-1; i >= 0 ; i--) { + var elListItem = this._elList.childNodes[i]; + var sMatch = ("" + elListItem._sResultMatch).toLowerCase(); + if(sMatch == this._sCurQuery.toLowerCase()) { + elMatch = elListItem; + break; + } + } + return(elMatch); +}; + +/** + * Updates in the text input box with the first query result as the user types, + * selecting the substring that the user has not typed. + * + * @method _typeAhead + * @param elListItem {HTMLElement} The <li> element item whose data populates the input field. + * @param sQuery {String} Query string. + * @private + */ +YAHOO.widget.AutoComplete.prototype._typeAhead = function(elListItem, sQuery) { + // Don't typeAhead if turned off or is backspace + if(!this.typeAhead || (this._nKeyCode == 8)) { + return; + } + + var oSelf = this, + elTextbox = this._elTextbox; + + // Only if text selection is supported + if(elTextbox.setSelectionRange || elTextbox.createTextRange) { + // Set and store timeout for this typeahead + this._nTypeAheadDelayID = setTimeout(function() { + // Select the portion of text that the user has not typed + var nStart = elTextbox.value.length; // any saved queries plus what user has typed + oSelf._updateValue(elListItem); + var nEnd = elTextbox.value.length; + oSelf._selectText(elTextbox,nStart,nEnd); + var sPrefill = elTextbox.value.substr(nStart,nEnd); + oSelf.typeAheadEvent.fire(oSelf,sQuery,sPrefill); + YAHOO.log("Typeahead occured with prefill string \"" + sPrefill + "\"", "info", oSelf.toString()); + },(this.typeAheadDelay*1000)); + } +}; + +/** + * Selects text in the input field. + * + * @method _selectText + * @param elTextbox {HTMLElement} Text input box element in which to select text. + * @param nStart {Number} Starting index of text string to select. + * @param nEnd {Number} Ending index of text selection. + * @private + */ +YAHOO.widget.AutoComplete.prototype._selectText = function(elTextbox, nStart, nEnd) { + if(elTextbox.setSelectionRange) { // For Mozilla + elTextbox.setSelectionRange(nStart,nEnd); + } + else if(elTextbox.createTextRange) { // For IE + var oTextRange = elTextbox.createTextRange(); + oTextRange.moveStart("character", nStart); + oTextRange.moveEnd("character", nEnd-elTextbox.value.length); + oTextRange.select(); + } + else { + elTextbox.select(); + } +}; + +/** + * Syncs results container with its helpers. + * + * @method _toggleContainerHelpers + * @param bShow {Boolean} True if container is expanded, false if collapsed + * @private + */ +YAHOO.widget.AutoComplete.prototype._toggleContainerHelpers = function(bShow) { + var width = this._elContent.offsetWidth + "px"; + var height = this._elContent.offsetHeight + "px"; + + if(this.useIFrame && this._elIFrame) { + var elIFrame = this._elIFrame; + if(bShow) { + elIFrame.style.width = width; + elIFrame.style.height = height; + elIFrame.style.padding = ""; + YAHOO.log("Iframe expanded", "info", this.toString()); + } + else { + elIFrame.style.width = 0; + elIFrame.style.height = 0; + elIFrame.style.padding = 0; + YAHOO.log("Iframe collapsed", "info", this.toString()); + } + } + if(this.useShadow && this._elShadow) { + var elShadow = this._elShadow; + if(bShow) { + elShadow.style.width = width; + elShadow.style.height = height; + YAHOO.log("Shadow expanded", "info", this.toString()); + } + else { + elShadow.style.width = 0; + elShadow.style.height = 0; + YAHOO.log("Shadow collapsed", "info", this.toString()); + } + } +}; + +/** + * Animates expansion or collapse of the container. + * + * @method _toggleContainer + * @param bShow {Boolean} True if container should be expanded, false if container should be collapsed + * @private + */ +YAHOO.widget.AutoComplete.prototype._toggleContainer = function(bShow) { + var elContainer = this._elContainer; + + // If implementer has container always open and it's already open, don't mess with it + // Container is initialized with display "none" so it may need to be shown first time through + if(this.alwaysShowContainer && this._bContainerOpen) { + return; + } + + // Reset states + if(!bShow) { + this._toggleHighlight(this._elCurListItem,"from"); + this._nDisplayedItems = 0; + this._sCurQuery = null; + + // Container is already closed, so don't bother with changing the UI + if(!this._bContainerOpen) { + this._elContent.style.display = "none"; + return; + } + } + + // If animation is enabled... + var oAnim = this._oAnim; + if(oAnim && oAnim.getEl() && (this.animHoriz || this.animVert)) { + if(oAnim.isAnimated()) { + oAnim.stop(true); + } + + // Clone container to grab current size offscreen + var oClone = this._elContent.cloneNode(true); + elContainer.appendChild(oClone); + oClone.style.top = "-9000px"; + oClone.style.width = ""; + oClone.style.height = ""; + oClone.style.display = ""; + + // Current size of the container is the EXPANDED size + var wExp = oClone.offsetWidth; + var hExp = oClone.offsetHeight; + + // Calculate COLLAPSED sizes based on horiz and vert anim + var wColl = (this.animHoriz) ? 0 : wExp; + var hColl = (this.animVert) ? 0 : hExp; + + // Set animation sizes + oAnim.attributes = (bShow) ? + {width: { to: wExp }, height: { to: hExp }} : + {width: { to: wColl}, height: { to: hColl }}; + + // If opening anew, set to a collapsed size... + if(bShow && !this._bContainerOpen) { + this._elContent.style.width = wColl+"px"; + this._elContent.style.height = hColl+"px"; + } + // Else, set it to its last known size. + else { + this._elContent.style.width = wExp+"px"; + this._elContent.style.height = hExp+"px"; + } + + elContainer.removeChild(oClone); + oClone = null; + + var oSelf = this; + var onAnimComplete = function() { + // Finish the collapse + oAnim.onComplete.unsubscribeAll(); + + if(bShow) { + oSelf._toggleContainerHelpers(true); + oSelf._bContainerOpen = bShow; + oSelf.containerExpandEvent.fire(oSelf); + YAHOO.log("Container expanded", "info", oSelf.toString()); + } + else { + oSelf._elContent.style.display = "none"; + oSelf._bContainerOpen = bShow; + oSelf.containerCollapseEvent.fire(oSelf); + YAHOO.log("Container collapsed", "info", oSelf.toString()); + } + }; + + // Display container and animate it + this._toggleContainerHelpers(false); // Bug 1424486: Be early to hide, late to show; + this._elContent.style.display = ""; + oAnim.onComplete.subscribe(onAnimComplete); + oAnim.animate(); + } + // Else don't animate, just show or hide + else { + if(bShow) { + this._elContent.style.display = ""; + this._toggleContainerHelpers(true); + this._bContainerOpen = bShow; + this.containerExpandEvent.fire(this); + YAHOO.log("Container expanded", "info", this.toString()); + } + else { + this._toggleContainerHelpers(false); + this._elContent.style.display = "none"; + this._bContainerOpen = bShow; + this.containerCollapseEvent.fire(this); + YAHOO.log("Container collapsed", "info", this.toString()); + } + } + +}; + +/** + * Toggles the highlight on or off for an item in the container, and also cleans + * up highlighting of any previous item. + * + * @method _toggleHighlight + * @param elNewListItem {HTMLElement} The <li> element item to receive highlight behavior. + * @param sType {String} Type "mouseover" will toggle highlight on, and "mouseout" will toggle highlight off. + * @private + */ +YAHOO.widget.AutoComplete.prototype._toggleHighlight = function(elNewListItem, sType) { + if(elNewListItem) { + var sHighlight = this.highlightClassName; + if(this._elCurListItem) { + // Remove highlight from old item + YAHOO.util.Dom.removeClass(this._elCurListItem, sHighlight); + this._elCurListItem = null; + } + + if((sType == "to") && sHighlight) { + // Apply highlight to new item + YAHOO.util.Dom.addClass(elNewListItem, sHighlight); + this._elCurListItem = elNewListItem; + } + } +}; + +/** + * Toggles the pre-highlight on or off for an item in the container. + * + * @method _togglePrehighlight + * @param elNewListItem {HTMLElement} The <li> element item to receive highlight behavior. + * @param sType {String} Type "mouseover" will toggle highlight on, and "mouseout" will toggle highlight off. + * @private + */ +YAHOO.widget.AutoComplete.prototype._togglePrehighlight = function(elNewListItem, sType) { + if(elNewListItem == this._elCurListItem) { + return; + } + + var sPrehighlight = this.prehighlightClassName; + if((sType == "mouseover") && sPrehighlight) { + // Apply prehighlight to new item + YAHOO.util.Dom.addClass(elNewListItem, sPrehighlight); + } + else { + // Remove prehighlight from old item + YAHOO.util.Dom.removeClass(elNewListItem, sPrehighlight); + } +}; + +/** + * Updates the text input box value with selected query result. If a delimiter + * has been defined, then the value gets appended with the delimiter. + * + * @method _updateValue + * @param elListItem {HTMLElement} The <li> element item with which to update the value. + * @private + */ +YAHOO.widget.AutoComplete.prototype._updateValue = function(elListItem) { + if(!this.suppressInputUpdate) { + var elTextbox = this._elTextbox; + var sDelimChar = (this.delimChar) ? (this.delimChar[0] || this.delimChar) : null; + var sResultMatch = elListItem._sResultMatch; + + // Calculate the new value + var sNewValue = ""; + if(sDelimChar) { + // Preserve selections from past queries + sNewValue = this._sPastSelections; + // Add new selection plus delimiter + sNewValue += sResultMatch + sDelimChar; + if(sDelimChar != " ") { + sNewValue += " "; + } + } + else { + sNewValue = sResultMatch; + } + + // Update input field + elTextbox.value = sNewValue; + + // Scroll to bottom of textarea if necessary + if(elTextbox.type == "textarea") { + elTextbox.scrollTop = elTextbox.scrollHeight; + } + + // Move cursor to end + var end = elTextbox.value.length; + this._selectText(elTextbox,end,end); + + this._elCurListItem = elListItem; + } +}; + +/** + * Selects a result item from the container + * + * @method _selectItem + * @param elListItem {HTMLElement} The selected <li> element item. + * @private + */ +YAHOO.widget.AutoComplete.prototype._selectItem = function(elListItem) { + this._bItemSelected = true; + this._updateValue(elListItem); + this._sPastSelections = this._elTextbox.value; + this._clearInterval(); + this.itemSelectEvent.fire(this, elListItem, elListItem._oResultData); + YAHOO.log("Item selected: " + YAHOO.lang.dump(elListItem._oResultData), "info", this.toString()); + this._toggleContainer(false); +}; + +/** + * If an item is highlighted in the container, the right arrow key jumps to the + * end of the textbox and selects the highlighted item, otherwise the container + * is closed. + * + * @method _jumpSelection + * @private + */ +YAHOO.widget.AutoComplete.prototype._jumpSelection = function() { + if(this._elCurListItem) { + this._selectItem(this._elCurListItem); + } + else { + this._toggleContainer(false); + } +}; + +/** + * Triggered by up and down arrow keys, changes the current highlighted + * <li> element item. Scrolls container if necessary. + * + * @method _moveSelection + * @param nKeyCode {Number} Code of key pressed. + * @private + */ +YAHOO.widget.AutoComplete.prototype._moveSelection = function(nKeyCode) { + if(this._bContainerOpen) { + // Determine current item's id number + var elCurListItem = this._elCurListItem; + var nCurItemIndex = -1; + + if(elCurListItem) { + nCurItemIndex = elCurListItem._nItemIndex; + } + + var nNewItemIndex = (nKeyCode == 40) ? + (nCurItemIndex + 1) : (nCurItemIndex - 1); + + // Out of bounds + if(nNewItemIndex < -2 || nNewItemIndex >= this._nDisplayedItems) { + return; + } + + if(elCurListItem) { + // Unhighlight current item + this._toggleHighlight(elCurListItem, "from"); + this.itemArrowFromEvent.fire(this, elCurListItem); + YAHOO.log("Item arrowed from: " + elCurListItem._nItemIndex, "info", this.toString()); + } + if(nNewItemIndex == -1) { + // Go back to query (remove type-ahead string) + if(this.delimChar) { + this._elTextbox.value = this._sPastSelections + this._sCurQuery; + } + else { + this._elTextbox.value = this._sCurQuery; + } + return; + } + if(nNewItemIndex == -2) { + // Close container + this._toggleContainer(false); + return; + } + + var elNewListItem = this._elList.childNodes[nNewItemIndex]; + + // Scroll the container if necessary + var elContent = this._elContent; + var scrollOn = ((YAHOO.util.Dom.getStyle(elContent,"overflow") == "auto") || + (YAHOO.util.Dom.getStyle(elContent,"overflowY") == "auto")); + if(scrollOn && (nNewItemIndex > -1) && + (nNewItemIndex < this._nDisplayedItems)) { + // User is keying down + if(nKeyCode == 40) { + // Bottom of selected item is below scroll area... + if((elNewListItem.offsetTop+elNewListItem.offsetHeight) > (elContent.scrollTop + elContent.offsetHeight)) { + // Set bottom of scroll area to bottom of selected item + elContent.scrollTop = (elNewListItem.offsetTop+elNewListItem.offsetHeight) - elContent.offsetHeight; + } + // Bottom of selected item is above scroll area... + else if((elNewListItem.offsetTop+elNewListItem.offsetHeight) < elContent.scrollTop) { + // Set top of selected item to top of scroll area + elContent.scrollTop = elNewListItem.offsetTop; + + } + } + // User is keying up + else { + // Top of selected item is above scroll area + if(elNewListItem.offsetTop < elContent.scrollTop) { + // Set top of scroll area to top of selected item + this._elContent.scrollTop = elNewListItem.offsetTop; + } + // Top of selected item is below scroll area + else if(elNewListItem.offsetTop > (elContent.scrollTop + elContent.offsetHeight)) { + // Set bottom of selected item to bottom of scroll area + this._elContent.scrollTop = (elNewListItem.offsetTop+elNewListItem.offsetHeight) - elContent.offsetHeight; + } + } + } + + this._toggleHighlight(elNewListItem, "to"); + this.itemArrowToEvent.fire(this, elNewListItem); + YAHOO.log("Item arrowed to " + elNewListItem._nItemIndex, "info", this.toString()); + if(this.typeAhead) { + this._updateValue(elNewListItem); + } + } +}; + +///////////////////////////////////////////////////////////////////////////// +// +// Private event handlers +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Handles <li> element mouseover events in the container. + * + * @method _onItemMouseover + * @param v {HTMLEvent} The mouseover event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +/*YAHOO.widget.AutoComplete.prototype._onItemMouseover = function(v,oSelf) { + if(oSelf.prehighlightClassName) { + oSelf._togglePrehighlight(this,"mouseover"); + } + else { + oSelf._toggleHighlight(this,"to"); + } + + oSelf.itemMouseOverEvent.fire(oSelf, this); + YAHOO.log("Item moused over", "info", oSelf.toString()); +};*/ + +/** + * Handles <li> element mouseout events in the container. + * + * @method _onItemMouseout + * @param v {HTMLEvent} The mouseout event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +/*YAHOO.widget.AutoComplete.prototype._onItemMouseout = function(v,oSelf) { + if(oSelf.prehighlightClassName) { + oSelf._togglePrehighlight(this,"mouseout"); + } + else { + oSelf._toggleHighlight(this,"from"); + } + + oSelf.itemMouseOutEvent.fire(oSelf, this); + YAHOO.log("Item moused out", "info", oSelf.toString()); +};*/ + +/** + * Handles <li> element click events in the container. + * + * @method _onItemMouseclick + * @param v {HTMLEvent} The click event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +/*YAHOO.widget.AutoComplete.prototype._onItemMouseclick = function(v,oSelf) { + // In case item has not been moused over + oSelf._toggleHighlight(this,"to"); + oSelf._selectItem(this); +};*/ + +/** + * Handles container mouseover events. + * + * @method _onContainerMouseover + * @param v {HTMLEvent} The mouseover event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onContainerMouseover = function(v,oSelf) { + var elTarget = YAHOO.util.Event.getTarget(v); + var elTag = elTarget.nodeName.toLowerCase(); + while(elTarget && (elTag != "table")) { + switch(elTag) { + case "body": + return; + case "li": + if(oSelf.prehighlightClassName) { + oSelf._togglePrehighlight(elTarget,"mouseover"); + } + else { + oSelf._toggleHighlight(elTarget,"to"); + } + + oSelf.itemMouseOverEvent.fire(oSelf, elTarget); + YAHOO.log("Item moused over " + elTarget._nItemIndex, "info", oSelf.toString()); + break; + case "div": + if(YAHOO.util.Dom.hasClass(elTarget,"yui-ac-container")) { + oSelf._bOverContainer = true; + return; + } + break; + default: + break; + } + + elTarget = elTarget.parentNode; + if(elTarget) { + elTag = elTarget.nodeName.toLowerCase(); + } + } +}; + +/** + * Handles container mouseout events. + * + * @method _onContainerMouseout + * @param v {HTMLEvent} The mouseout event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onContainerMouseout = function(v,oSelf) { + var elTarget = YAHOO.util.Event.getTarget(v); + var elTag = elTarget.nodeName.toLowerCase(); + while(elTarget && (elTag != "table")) { + switch(elTag) { + case "body": + return; + case "li": + if(oSelf.prehighlightClassName) { + oSelf._togglePrehighlight(elTarget,"mouseout"); + } + else { + oSelf._toggleHighlight(elTarget,"from"); + } + + oSelf.itemMouseOutEvent.fire(oSelf, elTarget); + YAHOO.log("Item moused out " + elTarget._nItemIndex, "info", oSelf.toString()); + break; + case "ul": + oSelf._toggleHighlight(oSelf._elCurListItem,"to"); + break; + case "div": + if(YAHOO.util.Dom.hasClass(elTarget,"yui-ac-container")) { + oSelf._bOverContainer = false; + return; + } + break; + default: + break; + } + + elTarget = elTarget.parentNode; + if(elTarget) { + elTag = elTarget.nodeName.toLowerCase(); + } + } +}; + +/** + * Handles container click events. + * + * @method _onContainerClick + * @param v {HTMLEvent} The click event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onContainerClick = function(v,oSelf) { + var elTarget = YAHOO.util.Event.getTarget(v); + var elTag = elTarget.nodeName.toLowerCase(); + while(elTarget && (elTag != "table")) { + switch(elTag) { + case "body": + return; + case "li": + // In case item has not been moused over + oSelf._toggleHighlight(elTarget,"to"); + oSelf._selectItem(elTarget); + return; + default: + break; + } + + elTarget = elTarget.parentNode; + if(elTarget) { + elTag = elTarget.nodeName.toLowerCase(); + } + } +}; + + +/** + * Handles container scroll events. + * + * @method _onContainerScroll + * @param v {HTMLEvent} The scroll event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onContainerScroll = function(v,oSelf) { + oSelf._elTextbox.focus(); +}; + +/** + * Handles container resize events. + * + * @method _onContainerResize + * @param v {HTMLEvent} The resize event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onContainerResize = function(v,oSelf) { + oSelf._toggleContainerHelpers(oSelf._bContainerOpen); +}; + + +/** + * Handles textbox keydown events of functional keys, mainly for UI behavior. + * + * @method _onTextboxKeyDown + * @param v {HTMLEvent} The keydown event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onTextboxKeyDown = function(v,oSelf) { + var nKeyCode = v.keyCode; + + // Clear timeout + if(oSelf._nTypeAheadDelayID != -1) { + clearTimeout(oSelf._nTypeAheadDelayID); + } + + switch (nKeyCode) { + case 9: // tab + if(!YAHOO.env.ua.opera && (navigator.userAgent.toLowerCase().indexOf("mac") == -1) || (YAHOO.env.ua.webkit>420)) { + // select an item or clear out + if(oSelf._elCurListItem) { + if(oSelf.delimChar && (oSelf._nKeyCode != nKeyCode)) { + if(oSelf._bContainerOpen) { + YAHOO.util.Event.stopEvent(v); + } + } + oSelf._selectItem(oSelf._elCurListItem); + } + else { + oSelf._toggleContainer(false); + } + } + break; + case 13: // enter + if(!YAHOO.env.ua.opera && (navigator.userAgent.toLowerCase().indexOf("mac") == -1) || (YAHOO.env.ua.webkit>420)) { + if(oSelf._elCurListItem) { + if(oSelf._nKeyCode != nKeyCode) { + if(oSelf._bContainerOpen) { + YAHOO.util.Event.stopEvent(v); + } + } + oSelf._selectItem(oSelf._elCurListItem); + } + else { + oSelf._toggleContainer(false); + } + } + break; + case 27: // esc + oSelf._toggleContainer(false); + return; + case 39: // right + oSelf._jumpSelection(); + break; + case 38: // up + if(oSelf._bContainerOpen) { + YAHOO.util.Event.stopEvent(v); + oSelf._moveSelection(nKeyCode); + } + break; + case 40: // down + if(oSelf._bContainerOpen) { + YAHOO.util.Event.stopEvent(v); + oSelf._moveSelection(nKeyCode); + } + break; + default: + oSelf._bItemSelected = false; + oSelf._toggleHighlight(oSelf._elCurListItem, "from"); + + oSelf.textboxKeyEvent.fire(oSelf, nKeyCode); + YAHOO.log("Textbox keyed", "info", oSelf.toString()); + break; + } + + if(nKeyCode === 18){ + oSelf._enableIntervalDetection(); + } + oSelf._nKeyCode = nKeyCode; +}; + +/** + * Handles textbox keypress events. + * @method _onTextboxKeyPress + * @param v {HTMLEvent} The keypress event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onTextboxKeyPress = function(v,oSelf) { + var nKeyCode = v.keyCode; + + // Expose only to non SF3 (bug 1978549) Mac browsers (bug 790337) and Opera browsers (bug 583531), + // where stopEvent is ineffective on keydown events + if(YAHOO.env.ua.opera || (navigator.userAgent.toLowerCase().indexOf("mac") != -1) && (YAHOO.env.ua.webkit < 420)) { + switch (nKeyCode) { + case 9: // tab + // select an item or clear out + if(oSelf._bContainerOpen) { + if(oSelf.delimChar) { + YAHOO.util.Event.stopEvent(v); + } + if(oSelf._elCurListItem) { + oSelf._selectItem(oSelf._elCurListItem); + } + else { + oSelf._toggleContainer(false); + } + } + break; + case 13: // enter + if(oSelf._bContainerOpen) { + YAHOO.util.Event.stopEvent(v); + if(oSelf._elCurListItem) { + oSelf._selectItem(oSelf._elCurListItem); + } + else { + oSelf._toggleContainer(false); + } + } + break; + default: + break; + } + } + + //TODO: (?) limit only to non-IE, non-Mac-FF for Korean IME support (bug 811948) + // Korean IME detected + else if(nKeyCode == 229) { + oSelf._enableIntervalDetection(); + } +}; + +/** + * Handles textbox keyup events to trigger queries. + * + * @method _onTextboxKeyUp + * @param v {HTMLEvent} The keyup event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onTextboxKeyUp = function(v,oSelf) { + var sText = this.value; //string in textbox + + // Check to see if any of the public properties have been updated + oSelf._initProps(); + + // Filter out chars that don't trigger queries + var nKeyCode = v.keyCode; + if(oSelf._isIgnoreKey(nKeyCode)) { + return; + } + + // Clear previous timeout + /*if(oSelf._nTypeAheadDelayID != -1) { + clearTimeout(oSelf._nTypeAheadDelayID); + }*/ + if(oSelf._nDelayID != -1) { + clearTimeout(oSelf._nDelayID); + } + + // Set new timeout + oSelf._nDelayID = setTimeout(function(){ + oSelf._sendQuery(sText); + },(oSelf.queryDelay * 1000)); + + //= nDelayID; + //else { + // No delay so send request immediately + //oSelf._sendQuery(sText); + //} +}; + +/** + * Handles text input box receiving focus. + * + * @method _onTextboxFocus + * @param v {HTMLEvent} The focus event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onTextboxFocus = function (v,oSelf) { + // Start of a new interaction + if(!oSelf._bFocused) { + oSelf._elTextbox.setAttribute("autocomplete","off"); + oSelf._bFocused = true; + oSelf._sInitInputValue = oSelf._elTextbox.value; + oSelf.textboxFocusEvent.fire(oSelf); + YAHOO.log("Textbox focused", "info", oSelf.toString()); + } +}; + +/** + * Handles text input box losing focus. + * + * @method _onTextboxBlur + * @param v {HTMLEvent} The focus event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onTextboxBlur = function (v,oSelf) { + // Don't treat as a blur if it was a selection via mouse click + if(!oSelf._bOverContainer || (oSelf._nKeyCode == 9)) { + // Current query needs to be validated as a selection + if(!oSelf._bItemSelected) { + var elMatchListItem = oSelf._textMatchesOption(); + // Container is closed or current query doesn't match any result + if(!oSelf._bContainerOpen || (oSelf._bContainerOpen && (elMatchListItem === null))) { + // Force selection is enabled so clear the current query + if(oSelf.forceSelection) { + oSelf._clearSelection(); + } + // Treat current query as a valid selection + else { + oSelf.unmatchedItemSelectEvent.fire(oSelf, oSelf._sCurQuery); + YAHOO.log("Unmatched item selected: " + oSelf._sCurQuery, "info", oSelf.toString()); + } + } + // Container is open and current query matches a result + else { + // Force a selection when textbox is blurred with a match + if(oSelf.forceSelection) { + oSelf._selectItem(elMatchListItem); + } + } + } + + if(oSelf._bContainerOpen) { + oSelf._toggleContainer(false); + } + oSelf._clearInterval(); + oSelf._bFocused = false; + if(oSelf._sInitInputValue !== oSelf._elTextbox.value) { + oSelf.textboxChangeEvent.fire(oSelf); + } + oSelf.textboxBlurEvent.fire(oSelf); + YAHOO.log("Textbox blurred", "info", oSelf.toString()); + } +}; + +/** + * Handles window unload event. + * + * @method _onWindowUnload + * @param v {HTMLEvent} The unload event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onWindowUnload = function(v,oSelf) { + if(oSelf && oSelf._elTextbox && oSelf.allowBrowserAutocomplete) { + oSelf._elTextbox.setAttribute("autocomplete","on"); + } +}; + +///////////////////////////////////////////////////////////////////////////// +// +// Deprecated for Backwards Compatibility +// +///////////////////////////////////////////////////////////////////////////// +/** + * @method doBeforeSendQuery + * @deprecated Use generateRequest. + */ +YAHOO.widget.AutoComplete.prototype.doBeforeSendQuery = function(sQuery) { + return this.generateRequest(sQuery); +}; + +/** + * @method getListItems + * @deprecated Use getListEl().childNodes. + */ +YAHOO.widget.AutoComplete.prototype.getListItems = function() { + var allListItemEls = [], + els = this._elList.childNodes; + for(var i=els.length-1; i>=0; i--) { + allListItemEls[i] = els[i]; + } + return allListItemEls; +}; + +///////////////////////////////////////////////////////////////////////// +// +// Private static methods +// +///////////////////////////////////////////////////////////////////////// + +/** + * Clones object literal or array of object literals. + * + * @method AutoComplete._cloneObject + * @param o {Object} Object. + * @private + * @static + */ +YAHOO.widget.AutoComplete._cloneObject = function(o) { + if(!YAHOO.lang.isValue(o)) { + return o; + } + + var copy = {}; + + if(YAHOO.lang.isFunction(o)) { + copy = o; + } + else if(YAHOO.lang.isArray(o)) { + var array = []; + for(var i=0,len=o.length;i=this.minQueryLength;B--){A=this.generateRequest(E.substr(0,B));this.dataRequestEvent.fire(this,D,A);C=this.dataSource.getCachedResponse(A);if(C){return this.filterResults.apply(this.dataSource,[E,C,C,{scope:this}]);}}return null;};YAHOO.widget.AutoComplete.prototype.preparseRawResponse=function(C,B,A){var D=((this.responseStripAfter!=="")&&(B.indexOf))?B.indexOf(this.responseStripAfter):-1;if(D!=-1){B=B.substring(0,D);}return B;};YAHOO.widget.AutoComplete.prototype.filterResults=function(J,L,P,K){if(J&&J!==""){P=YAHOO.widget.AutoComplete._cloneObject(P);var H=K.scope,O=this,B=P.results,M=[],D=false,I=(O.queryMatchCase||H.queryMatchCase),A=(O.queryMatchContains||H.queryMatchContains);for(var C=B.length-1;C>=0;C--){var F=B[C];var E=null;if(YAHOO.lang.isString(F)){E=F;}else{if(YAHOO.lang.isArray(F)){E=F[0];}else{if(this.responseSchema.fields){var N=this.responseSchema.fields[0].key||this.responseSchema.fields[0];E=F[N];}else{if(this.key){E=F[this.key];}}}}if(YAHOO.lang.isString(E)){var G=(I)?E.indexOf(decodeURIComponent(J)):E.toLowerCase().indexOf(decodeURIComponent(J).toLowerCase());if((!A&&(G===0))||(A&&(G>-1))){M.unshift(F);}}}P.results=M;}else{}return P;};YAHOO.widget.AutoComplete.prototype.handleResponse=function(C,A,B){if((this instanceof YAHOO.widget.AutoComplete)&&this._sName){this._populateList(C,A,B);}};YAHOO.widget.AutoComplete.prototype.doBeforeLoadData=function(C,A,B){return true;};YAHOO.widget.AutoComplete.prototype.formatResult=function(B,D,A){var C=(A)?A:"";return C;};YAHOO.widget.AutoComplete.prototype.doBeforeExpandContainer=function(D,A,C,B){return true;};YAHOO.widget.AutoComplete.prototype.destroy=function(){var B=this.toString();var A=this._elTextbox;var D=this._elContainer;this.textboxFocusEvent.unsubscribeAll();this.textboxKeyEvent.unsubscribeAll();this.dataRequestEvent.unsubscribeAll();this.dataReturnEvent.unsubscribeAll();this.dataErrorEvent.unsubscribeAll();this.containerPopulateEvent.unsubscribeAll();this.containerExpandEvent.unsubscribeAll();this.typeAheadEvent.unsubscribeAll();this.itemMouseOverEvent.unsubscribeAll();this.itemMouseOutEvent.unsubscribeAll();this.itemArrowToEvent.unsubscribeAll();this.itemArrowFromEvent.unsubscribeAll();this.itemSelectEvent.unsubscribeAll();this.unmatchedItemSelectEvent.unsubscribeAll();this.selectionEnforceEvent.unsubscribeAll();this.containerCollapseEvent.unsubscribeAll();this.textboxBlurEvent.unsubscribeAll();this.textboxChangeEvent.unsubscribeAll();YAHOO.util.Event.purgeElement(A,true);YAHOO.util.Event.purgeElement(D,true);D.innerHTML="";for(var C in this){if(YAHOO.lang.hasOwnProperty(this,C)){this[C]=null;}}};YAHOO.widget.AutoComplete.prototype.textboxFocusEvent=null;YAHOO.widget.AutoComplete.prototype.textboxKeyEvent=null;YAHOO.widget.AutoComplete.prototype.dataRequestEvent=null;YAHOO.widget.AutoComplete.prototype.dataReturnEvent=null;YAHOO.widget.AutoComplete.prototype.dataErrorEvent=null;YAHOO.widget.AutoComplete.prototype.containerPopulateEvent=null;YAHOO.widget.AutoComplete.prototype.containerExpandEvent=null;YAHOO.widget.AutoComplete.prototype.typeAheadEvent=null;YAHOO.widget.AutoComplete.prototype.itemMouseOverEvent=null;YAHOO.widget.AutoComplete.prototype.itemMouseOutEvent=null;YAHOO.widget.AutoComplete.prototype.itemArrowToEvent=null;YAHOO.widget.AutoComplete.prototype.itemArrowFromEvent=null;YAHOO.widget.AutoComplete.prototype.itemSelectEvent=null;YAHOO.widget.AutoComplete.prototype.unmatchedItemSelectEvent=null;YAHOO.widget.AutoComplete.prototype.selectionEnforceEvent=null;YAHOO.widget.AutoComplete.prototype.containerCollapseEvent=null;YAHOO.widget.AutoComplete.prototype.textboxBlurEvent=null;YAHOO.widget.AutoComplete.prototype.textboxChangeEvent=null;YAHOO.widget.AutoComplete._nIndex=0; +YAHOO.widget.AutoComplete.prototype._sName=null;YAHOO.widget.AutoComplete.prototype._elTextbox=null;YAHOO.widget.AutoComplete.prototype._elContainer=null;YAHOO.widget.AutoComplete.prototype._elContent=null;YAHOO.widget.AutoComplete.prototype._elHeader=null;YAHOO.widget.AutoComplete.prototype._elBody=null;YAHOO.widget.AutoComplete.prototype._elFooter=null;YAHOO.widget.AutoComplete.prototype._elShadow=null;YAHOO.widget.AutoComplete.prototype._elIFrame=null;YAHOO.widget.AutoComplete.prototype._bFocused=null;YAHOO.widget.AutoComplete.prototype._oAnim=null;YAHOO.widget.AutoComplete.prototype._bContainerOpen=false;YAHOO.widget.AutoComplete.prototype._bOverContainer=false;YAHOO.widget.AutoComplete.prototype._elList=null;YAHOO.widget.AutoComplete.prototype._nDisplayedItems=0;YAHOO.widget.AutoComplete.prototype._sCurQuery=null;YAHOO.widget.AutoComplete.prototype._sPastSelections="";YAHOO.widget.AutoComplete.prototype._sInitInputValue=null;YAHOO.widget.AutoComplete.prototype._elCurListItem=null;YAHOO.widget.AutoComplete.prototype._bItemSelected=false;YAHOO.widget.AutoComplete.prototype._nKeyCode=null;YAHOO.widget.AutoComplete.prototype._nDelayID=-1;YAHOO.widget.AutoComplete.prototype._nTypeAheadDelayID=-1;YAHOO.widget.AutoComplete.prototype._iFrameSrc="javascript:false;";YAHOO.widget.AutoComplete.prototype._queryInterval=null;YAHOO.widget.AutoComplete.prototype._sLastTextboxValue=null;YAHOO.widget.AutoComplete.prototype._initProps=function(){var B=this.minQueryLength;if(!YAHOO.lang.isNumber(B)){this.minQueryLength=1;}var E=this.maxResultsDisplayed;if(!YAHOO.lang.isNumber(E)||(E<1)){this.maxResultsDisplayed=10;}var F=this.queryDelay;if(!YAHOO.lang.isNumber(F)||(F<0)){this.queryDelay=0.2;}var C=this.typeAheadDelay;if(!YAHOO.lang.isNumber(C)||(C<0)){this.typeAheadDelay=0.2;}var A=this.delimChar;if(YAHOO.lang.isString(A)&&(A.length>0)){this.delimChar=[A];}else{if(!YAHOO.lang.isArray(A)){this.delimChar=null;}}var D=this.animSpeed;if((this.animHoriz||this.animVert)&&YAHOO.util.Anim){if(!YAHOO.lang.isNumber(D)||(D<0)){this.animSpeed=0.3;}if(!this._oAnim){this._oAnim=new YAHOO.util.Anim(this._elContent,{},this.animSpeed);}else{this._oAnim.duration=this.animSpeed;}}if(this.forceSelection&&A){}};YAHOO.widget.AutoComplete.prototype._initContainerHelperEls=function(){if(this.useShadow&&!this._elShadow){var A=document.createElement("div");A.className="yui-ac-shadow";A.style.width=0;A.style.height=0;this._elShadow=this._elContainer.appendChild(A);}if(this.useIFrame&&!this._elIFrame){var B=document.createElement("iframe");B.src=this._iFrameSrc;B.frameBorder=0;B.scrolling="no";B.style.position="absolute";B.style.width=0;B.style.height=0;B.tabIndex=-1;B.style.padding=0;this._elIFrame=this._elContainer.appendChild(B);}};YAHOO.widget.AutoComplete.prototype._initContainerEl=function(){YAHOO.util.Dom.addClass(this._elContainer,"yui-ac-container");if(!this._elContent){var C=document.createElement("div");C.className="yui-ac-content";C.style.display="none";this._elContent=this._elContainer.appendChild(C);var B=document.createElement("div");B.className="yui-ac-hd";B.style.display="none";this._elHeader=this._elContent.appendChild(B);var D=document.createElement("div");D.className="yui-ac-bd";this._elBody=this._elContent.appendChild(D);var A=document.createElement("div");A.className="yui-ac-ft";A.style.display="none";this._elFooter=this._elContent.appendChild(A);}else{}};YAHOO.widget.AutoComplete.prototype._initListEl=function(){var C=this.maxResultsDisplayed;var A=this._elList||document.createElement("ul");var B;while(A.childNodes.length=18&&A<=20)||(A==27)||(A>=33&&A<=35)||(A>=36&&A<=40)||(A>=44&&A<=45)||(A==229)){return true;}return false;};YAHOO.widget.AutoComplete.prototype._sendQuery=function(G){if(this.minQueryLength<0){this._toggleContainer(false);return ;}var I=(this.delimChar)?this.delimChar:null;if(I){var B=-1;for(var F=I.length-1;F>=0;F--){var D=G.lastIndexOf(I[F]);if(D>B){B=D;}}if(I[F]==" "){for(var E=I.length-1;E>=0;E--){if(G[B-1]==I[E]){B--;break;}}}if(B>-1){var H=B+1;while(G.charAt(H)==" "){H+=1;}this._sPastSelections=G.substring(0,H);G=G.substr(H);}else{this._sPastSelections="";}}if((G&&(G.length0)){if(this._nDelayID!=-1){clearTimeout(this._nDelayID);}this._toggleContainer(false);return ;}G=encodeURIComponent(G);this._nDelayID=-1;if(this.dataSource.queryMatchSubset||this.queryMatchSubset){var A=this.getSubsetMatches(G);if(A){this.handleResponse(G,A,{query:G});return ;}}if(this.responseStripAfter){this.dataSource.doBeforeParseData=this.preparseRawResponse;}if(this.applyLocalFilter){this.dataSource.doBeforeCallback=this.filterResults;}var C=this.generateRequest(G);this.dataRequestEvent.fire(this,G,C);this.dataSource.sendRequest(C,{success:this.handleResponse,failure:this.handleResponse,scope:this,argument:{query:G}});};YAHOO.widget.AutoComplete.prototype._populateList=function(K,F,C){if(this._nTypeAheadDelayID!=-1){clearTimeout(this._nTypeAheadDelayID);}K=(C&&C.query)?C.query:K;var H=this.doBeforeLoadData(K,F,C);if(H&&!F.error){this.dataReturnEvent.fire(this,K,F.results);if(this._bFocused||(this._bFocused===null)){var M=decodeURIComponent(K); +this._sCurQuery=M;this._bItemSelected=false;var R=F.results,A=Math.min(R.length,this.maxResultsDisplayed),J=(this.dataSource.responseSchema.fields)?(this.dataSource.responseSchema.fields[0].key||this.dataSource.responseSchema.fields[0]):0;if(A>0){if(!this._elList||(this._elList.childNodes.length=0;Q--){var P=I[Q],E=R[Q];if(this.resultTypeList){var B=[];B[0]=(YAHOO.lang.isString(E))?E:E[J]||E[this.key];var L=this.dataSource.responseSchema.fields;if(YAHOO.lang.isArray(L)&&(L.length>1)){for(var N=1,S=L.length;N=A;O--){G=I[O];G.style.display="none";}}this._nDisplayedItems=A;this.containerPopulateEvent.fire(this,K,R);if(this.autoHighlight){var D=this._elList.firstChild;this._toggleHighlight(D,"to");this.itemArrowToEvent.fire(this,D);this._typeAhead(D,K);}else{this._toggleHighlight(this._elCurListItem,"from");}H=this.doBeforeExpandContainer(this._elTextbox,this._elContainer,K,R);this._toggleContainer(H);}else{this._toggleContainer(false);}return ;}}else{this.dataErrorEvent.fire(this,K);}};YAHOO.widget.AutoComplete.prototype._clearSelection=function(){var C=this._elTextbox.value;var B=(this.delimChar)?this.delimChar[0]:null;var A=(B)?C.lastIndexOf(B,C.length-2):-1;if(A>-1){this._elTextbox.value=C.substring(0,A);}else{this._elTextbox.value="";}this._sPastSelections=this._elTextbox.value;this.selectionEnforceEvent.fire(this);};YAHOO.widget.AutoComplete.prototype._textMatchesOption=function(){var A=null;for(var B=this._nDisplayedItems-1;B>=0;B--){var C=this._elList.childNodes[B];var D=(""+C._sResultMatch).toLowerCase();if(D==this._sCurQuery.toLowerCase()){A=C;break;}}return(A);};YAHOO.widget.AutoComplete.prototype._typeAhead=function(B,D){if(!this.typeAhead||(this._nKeyCode==8)){return ;}var A=this,C=this._elTextbox;if(C.setSelectionRange||C.createTextRange){this._nTypeAheadDelayID=setTimeout(function(){var F=C.value.length;A._updateValue(B);var G=C.value.length;A._selectText(C,F,G);var E=C.value.substr(F,G);A.typeAheadEvent.fire(A,D,E);},(this.typeAheadDelay*1000));}};YAHOO.widget.AutoComplete.prototype._selectText=function(D,A,B){if(D.setSelectionRange){D.setSelectionRange(A,B);}else{if(D.createTextRange){var C=D.createTextRange();C.moveStart("character",A);C.moveEnd("character",B-D.value.length);C.select();}else{D.select();}}};YAHOO.widget.AutoComplete.prototype._toggleContainerHelpers=function(D){var E=this._elContent.offsetWidth+"px";var B=this._elContent.offsetHeight+"px";if(this.useIFrame&&this._elIFrame){var C=this._elIFrame;if(D){C.style.width=E;C.style.height=B;C.style.padding="";}else{C.style.width=0;C.style.height=0;C.style.padding=0;}}if(this.useShadow&&this._elShadow){var A=this._elShadow;if(D){A.style.width=E;A.style.height=B;}else{A.style.width=0;A.style.height=0;}}};YAHOO.widget.AutoComplete.prototype._toggleContainer=function(I){var D=this._elContainer;if(this.alwaysShowContainer&&this._bContainerOpen){return ;}if(!I){this._toggleHighlight(this._elCurListItem,"from");this._nDisplayedItems=0;this._sCurQuery=null;if(!this._bContainerOpen){this._elContent.style.display="none";return ;}}var A=this._oAnim;if(A&&A.getEl()&&(this.animHoriz||this.animVert)){if(A.isAnimated()){A.stop(true);}var G=this._elContent.cloneNode(true);D.appendChild(G);G.style.top="-9000px";G.style.width="";G.style.height="";G.style.display="";var F=G.offsetWidth;var C=G.offsetHeight;var B=(this.animHoriz)?0:F;var E=(this.animVert)?0:C;A.attributes=(I)?{width:{to:F},height:{to:C}}:{width:{to:B},height:{to:E}};if(I&&!this._bContainerOpen){this._elContent.style.width=B+"px";this._elContent.style.height=E+"px";}else{this._elContent.style.width=F+"px";this._elContent.style.height=C+"px";}D.removeChild(G);G=null;var H=this;var J=function(){A.onComplete.unsubscribeAll();if(I){H._toggleContainerHelpers(true);H._bContainerOpen=I;H.containerExpandEvent.fire(H);}else{H._elContent.style.display="none";H._bContainerOpen=I;H.containerCollapseEvent.fire(H);}};this._toggleContainerHelpers(false);this._elContent.style.display="";A.onComplete.subscribe(J);A.animate();}else{if(I){this._elContent.style.display="";this._toggleContainerHelpers(true);this._bContainerOpen=I;this.containerExpandEvent.fire(this);}else{this._toggleContainerHelpers(false);this._elContent.style.display="none";this._bContainerOpen=I;this.containerCollapseEvent.fire(this);}}};YAHOO.widget.AutoComplete.prototype._toggleHighlight=function(A,C){if(A){var B=this.highlightClassName;if(this._elCurListItem){YAHOO.util.Dom.removeClass(this._elCurListItem,B);this._elCurListItem=null;}if((C=="to")&&B){YAHOO.util.Dom.addClass(A,B);this._elCurListItem=A;}}};YAHOO.widget.AutoComplete.prototype._togglePrehighlight=function(B,C){if(B==this._elCurListItem){return ;}var A=this.prehighlightClassName;if((C=="mouseover")&&A){YAHOO.util.Dom.addClass(B,A);}else{YAHOO.util.Dom.removeClass(B,A);}};YAHOO.widget.AutoComplete.prototype._updateValue=function(C){if(!this.suppressInputUpdate){var F=this._elTextbox;var E=(this.delimChar)?(this.delimChar[0]||this.delimChar):null;var B=C._sResultMatch;var D="";if(E){D=this._sPastSelections;D+=B+E;if(E!=" "){D+=" ";}}else{D=B;}F.value=D;if(F.type=="textarea"){F.scrollTop=F.scrollHeight;}var A=F.value.length;this._selectText(F,A,A);this._elCurListItem=C;}};YAHOO.widget.AutoComplete.prototype._selectItem=function(A){this._bItemSelected=true;this._updateValue(A);this._sPastSelections=this._elTextbox.value;this._clearInterval();this.itemSelectEvent.fire(this,A,A._oResultData);this._toggleContainer(false);};YAHOO.widget.AutoComplete.prototype._jumpSelection=function(){if(this._elCurListItem){this._selectItem(this._elCurListItem); +}else{this._toggleContainer(false);}};YAHOO.widget.AutoComplete.prototype._moveSelection=function(G){if(this._bContainerOpen){var F=this._elCurListItem;var E=-1;if(F){E=F._nItemIndex;}var C=(G==40)?(E+1):(E-1);if(C<-2||C>=this._nDisplayedItems){return ;}if(F){this._toggleHighlight(F,"from");this.itemArrowFromEvent.fire(this,F);}if(C==-1){if(this.delimChar){this._elTextbox.value=this._sPastSelections+this._sCurQuery;}else{this._elTextbox.value=this._sCurQuery;}return ;}if(C==-2){this._toggleContainer(false);return ;}var D=this._elList.childNodes[C];var A=this._elContent;var B=((YAHOO.util.Dom.getStyle(A,"overflow")=="auto")||(YAHOO.util.Dom.getStyle(A,"overflowY")=="auto"));if(B&&(C>-1)&&(C(A.scrollTop+A.offsetHeight)){A.scrollTop=(D.offsetTop+D.offsetHeight)-A.offsetHeight;}else{if((D.offsetTop+D.offsetHeight)(A.scrollTop+A.offsetHeight)){this._elContent.scrollTop=(D.offsetTop+D.offsetHeight)-A.offsetHeight;}}}}this._toggleHighlight(D,"to");this.itemArrowToEvent.fire(this,D);if(this.typeAhead){this._updateValue(D);}}};YAHOO.widget.AutoComplete.prototype._onContainerMouseover=function(A,C){var D=YAHOO.util.Event.getTarget(A);var B=D.nodeName.toLowerCase();while(D&&(B!="table")){switch(B){case"body":return ;case"li":if(C.prehighlightClassName){C._togglePrehighlight(D,"mouseover");}else{C._toggleHighlight(D,"to");}C.itemMouseOverEvent.fire(C,D);break;case"div":if(YAHOO.util.Dom.hasClass(D,"yui-ac-container")){C._bOverContainer=true;return ;}break;default:break;}D=D.parentNode;if(D){B=D.nodeName.toLowerCase();}}};YAHOO.widget.AutoComplete.prototype._onContainerMouseout=function(A,C){var D=YAHOO.util.Event.getTarget(A);var B=D.nodeName.toLowerCase();while(D&&(B!="table")){switch(B){case"body":return ;case"li":if(C.prehighlightClassName){C._togglePrehighlight(D,"mouseout");}else{C._toggleHighlight(D,"from");}C.itemMouseOutEvent.fire(C,D);break;case"ul":C._toggleHighlight(C._elCurListItem,"to");break;case"div":if(YAHOO.util.Dom.hasClass(D,"yui-ac-container")){C._bOverContainer=false;return ;}break;default:break;}D=D.parentNode;if(D){B=D.nodeName.toLowerCase();}}};YAHOO.widget.AutoComplete.prototype._onContainerClick=function(A,C){var D=YAHOO.util.Event.getTarget(A);var B=D.nodeName.toLowerCase();while(D&&(B!="table")){switch(B){case"body":return ;case"li":C._toggleHighlight(D,"to");C._selectItem(D);return ;default:break;}D=D.parentNode;if(D){B=D.nodeName.toLowerCase();}}};YAHOO.widget.AutoComplete.prototype._onContainerScroll=function(A,B){B._elTextbox.focus();};YAHOO.widget.AutoComplete.prototype._onContainerResize=function(A,B){B._toggleContainerHelpers(B._bContainerOpen);};YAHOO.widget.AutoComplete.prototype._onTextboxKeyDown=function(A,B){var C=A.keyCode;if(B._nTypeAheadDelayID!=-1){clearTimeout(B._nTypeAheadDelayID);}switch(C){case 9:if(!YAHOO.env.ua.opera&&(navigator.userAgent.toLowerCase().indexOf("mac")==-1)||(YAHOO.env.ua.webkit>420)){if(B._elCurListItem){if(B.delimChar&&(B._nKeyCode!=C)){if(B._bContainerOpen){YAHOO.util.Event.stopEvent(A);}}B._selectItem(B._elCurListItem);}else{B._toggleContainer(false);}}break;case 13:if(!YAHOO.env.ua.opera&&(navigator.userAgent.toLowerCase().indexOf("mac")==-1)||(YAHOO.env.ua.webkit>420)){if(B._elCurListItem){if(B._nKeyCode!=C){if(B._bContainerOpen){YAHOO.util.Event.stopEvent(A);}}B._selectItem(B._elCurListItem);}else{B._toggleContainer(false);}}break;case 27:B._toggleContainer(false);return ;case 39:B._jumpSelection();break;case 38:if(B._bContainerOpen){YAHOO.util.Event.stopEvent(A);B._moveSelection(C);}break;case 40:if(B._bContainerOpen){YAHOO.util.Event.stopEvent(A);B._moveSelection(C);}break;default:B._bItemSelected=false;B._toggleHighlight(B._elCurListItem,"from");B.textboxKeyEvent.fire(B,C);break;}if(C===18){B._enableIntervalDetection();}B._nKeyCode=C;};YAHOO.widget.AutoComplete.prototype._onTextboxKeyPress=function(A,B){var C=A.keyCode;if(YAHOO.env.ua.opera||(navigator.userAgent.toLowerCase().indexOf("mac")!=-1)&&(YAHOO.env.ua.webkit<420)){switch(C){case 9:if(B._bContainerOpen){if(B.delimChar){YAHOO.util.Event.stopEvent(A);}if(B._elCurListItem){B._selectItem(B._elCurListItem);}else{B._toggleContainer(false);}}break;case 13:if(B._bContainerOpen){YAHOO.util.Event.stopEvent(A);if(B._elCurListItem){B._selectItem(B._elCurListItem);}else{B._toggleContainer(false);}}break;default:break;}}else{if(C==229){B._enableIntervalDetection();}}};YAHOO.widget.AutoComplete.prototype._onTextboxKeyUp=function(A,C){var B=this.value;C._initProps();var D=A.keyCode;if(C._isIgnoreKey(D)){return ;}if(C._nDelayID!=-1){clearTimeout(C._nDelayID);}C._nDelayID=setTimeout(function(){C._sendQuery(B);},(C.queryDelay*1000));};YAHOO.widget.AutoComplete.prototype._onTextboxFocus=function(A,B){if(!B._bFocused){B._elTextbox.setAttribute("autocomplete","off");B._bFocused=true;B._sInitInputValue=B._elTextbox.value;B.textboxFocusEvent.fire(B);}};YAHOO.widget.AutoComplete.prototype._onTextboxBlur=function(A,C){if(!C._bOverContainer||(C._nKeyCode==9)){if(!C._bItemSelected){var B=C._textMatchesOption();if(!C._bContainerOpen||(C._bContainerOpen&&(B===null))){if(C.forceSelection){C._clearSelection();}else{C.unmatchedItemSelectEvent.fire(C,C._sCurQuery);}}else{if(C.forceSelection){C._selectItem(B);}}}if(C._bContainerOpen){C._toggleContainer(false);}C._clearInterval();C._bFocused=false;if(C._sInitInputValue!==C._elTextbox.value){C.textboxChangeEvent.fire(C);}C.textboxBlurEvent.fire(C);}};YAHOO.widget.AutoComplete.prototype._onWindowUnload=function(A,B){if(B&&B._elTextbox&&B.allowBrowserAutocomplete){B._elTextbox.setAttribute("autocomplete","on");}};YAHOO.widget.AutoComplete.prototype.doBeforeSendQuery=function(A){return this.generateRequest(A);};YAHOO.widget.AutoComplete.prototype.getListItems=function(){var C=[],B=this._elList.childNodes;for(var A=B.length-1;A>=0;A--){C[A]=B[A];}return C;};YAHOO.widget.AutoComplete._cloneObject=function(D){if(!YAHOO.lang.isValue(D)){return D; +}var F={};if(YAHOO.lang.isFunction(D)){F=D;}else{if(YAHOO.lang.isArray(D)){var E=[];for(var C=0,B=D.length;C + *
  • Navigate with up/down arrow keys and/or mouse to pick a selection
  • + *
  • The drop down container can "roll down" or "fly out" via configurable + * animation
  • + *
  • UI look-and-feel customizable through CSS, including container + * attributes, borders, position, fonts, etc
  • + * + * + * @class AutoComplete + * @constructor + * @param elInput {HTMLElement} DOM element reference of an input field. + * @param elInput {String} String ID of an input field. + * @param elContainer {HTMLElement} DOM element reference of an existing DIV. + * @param elContainer {String} String ID of an existing DIV. + * @param oDataSource {YAHOO.widget.DataSource} DataSource instance. + * @param oConfigs {Object} (optional) Object literal of configuration params. + */ +YAHOO.widget.AutoComplete = function(elInput,elContainer,oDataSource,oConfigs) { + if(elInput && elContainer && oDataSource) { + // Validate DataSource + if(oDataSource instanceof YAHOO.util.DataSourceBase) { + this.dataSource = oDataSource; + } + else { + return; + } + + // YAHOO.widget.DataSource schema backwards compatibility + // Converted deprecated schema into supported schema + // First assume key data is held in position 0 of results array + this.key = 0; + var schema = oDataSource.responseSchema; + // An old school schema has been defined in the deprecated DataSource constructor + if(oDataSource._aDeprecatedSchema) { + var aDeprecatedSchema = oDataSource._aDeprecatedSchema; + if(YAHOO.lang.isArray(aDeprecatedSchema)) { + + if((oDataSource.responseType === YAHOO.util.DataSourceBase.TYPE_JSON) || + (oDataSource.responseType === YAHOO.util.DataSourceBase.TYPE_UNKNOWN)) { // Used to default to unknown + // Store the resultsList + schema.resultsList = aDeprecatedSchema[0]; + // Store the key + this.key = aDeprecatedSchema[1]; + // Only resultsList and key are defined, so grab all the data + schema.fields = (aDeprecatedSchema.length < 3) ? null : aDeprecatedSchema.slice(1); + } + else if(oDataSource.responseType === YAHOO.util.DataSourceBase.TYPE_XML) { + schema.resultNode = aDeprecatedSchema[0]; + this.key = aDeprecatedSchema[1]; + schema.fields = aDeprecatedSchema.slice(1); + } + else if(oDataSource.responseType === YAHOO.util.DataSourceBase.TYPE_TEXT) { + schema.recordDelim = aDeprecatedSchema[0]; + schema.fieldDelim = aDeprecatedSchema[1]; + } + oDataSource.responseSchema = schema; + } + } + + // Validate input element + if(YAHOO.util.Dom.inDocument(elInput)) { + if(YAHOO.lang.isString(elInput)) { + this._sName = "instance" + YAHOO.widget.AutoComplete._nIndex + " " + elInput; + this._elTextbox = document.getElementById(elInput); + } + else { + this._sName = (elInput.id) ? + "instance" + YAHOO.widget.AutoComplete._nIndex + " " + elInput.id: + "instance" + YAHOO.widget.AutoComplete._nIndex; + this._elTextbox = elInput; + } + YAHOO.util.Dom.addClass(this._elTextbox, "yui-ac-input"); + } + else { + return; + } + + // Validate container element + if(YAHOO.util.Dom.inDocument(elContainer)) { + if(YAHOO.lang.isString(elContainer)) { + this._elContainer = document.getElementById(elContainer); + } + else { + this._elContainer = elContainer; + } + if(this._elContainer.style.display == "none") { + } + + // For skinning + var elParent = this._elContainer.parentNode; + var elTag = elParent.tagName.toLowerCase(); + if(elTag == "div") { + YAHOO.util.Dom.addClass(elParent, "yui-ac"); + } + else { + } + } + else { + return; + } + + // Default applyLocalFilter setting is to enable for local sources + if(this.dataSource.dataType === YAHOO.util.DataSourceBase.TYPE_LOCAL) { + this.applyLocalFilter = true; + } + + // Set any config params passed in to override defaults + if(oConfigs && (oConfigs.constructor == Object)) { + for(var sConfig in oConfigs) { + if(sConfig) { + this[sConfig] = oConfigs[sConfig]; + } + } + } + + // Initialization sequence + this._initContainerEl(); + this._initProps(); + this._initListEl(); + this._initContainerHelperEls(); + + // Set up events + var oSelf = this; + var elTextbox = this._elTextbox; + + // Dom events + YAHOO.util.Event.addListener(elTextbox,"keyup",oSelf._onTextboxKeyUp,oSelf); + YAHOO.util.Event.addListener(elTextbox,"keydown",oSelf._onTextboxKeyDown,oSelf); + YAHOO.util.Event.addListener(elTextbox,"focus",oSelf._onTextboxFocus,oSelf); + YAHOO.util.Event.addListener(elTextbox,"blur",oSelf._onTextboxBlur,oSelf); + YAHOO.util.Event.addListener(elContainer,"mouseover",oSelf._onContainerMouseover,oSelf); + YAHOO.util.Event.addListener(elContainer,"mouseout",oSelf._onContainerMouseout,oSelf); + YAHOO.util.Event.addListener(elContainer,"click",oSelf._onContainerClick,oSelf); + YAHOO.util.Event.addListener(elContainer,"scroll",oSelf._onContainerScroll,oSelf); + YAHOO.util.Event.addListener(elContainer,"resize",oSelf._onContainerResize,oSelf); + YAHOO.util.Event.addListener(elTextbox,"keypress",oSelf._onTextboxKeyPress,oSelf); + YAHOO.util.Event.addListener(window,"unload",oSelf._onWindowUnload,oSelf); + + // Custom events + this.textboxFocusEvent = new YAHOO.util.CustomEvent("textboxFocus", this); + this.textboxKeyEvent = new YAHOO.util.CustomEvent("textboxKey", this); + this.dataRequestEvent = new YAHOO.util.CustomEvent("dataRequest", this); + this.dataReturnEvent = new YAHOO.util.CustomEvent("dataReturn", this); + this.dataErrorEvent = new YAHOO.util.CustomEvent("dataError", this); + this.containerPopulateEvent = new YAHOO.util.CustomEvent("containerPopulate", this); + this.containerExpandEvent = new YAHOO.util.CustomEvent("containerExpand", this); + this.typeAheadEvent = new YAHOO.util.CustomEvent("typeAhead", this); + this.itemMouseOverEvent = new YAHOO.util.CustomEvent("itemMouseOver", this); + this.itemMouseOutEvent = new YAHOO.util.CustomEvent("itemMouseOut", this); + this.itemArrowToEvent = new YAHOO.util.CustomEvent("itemArrowTo", this); + this.itemArrowFromEvent = new YAHOO.util.CustomEvent("itemArrowFrom", this); + this.itemSelectEvent = new YAHOO.util.CustomEvent("itemSelect", this); + this.unmatchedItemSelectEvent = new YAHOO.util.CustomEvent("unmatchedItemSelect", this); + this.selectionEnforceEvent = new YAHOO.util.CustomEvent("selectionEnforce", this); + this.containerCollapseEvent = new YAHOO.util.CustomEvent("containerCollapse", this); + this.textboxBlurEvent = new YAHOO.util.CustomEvent("textboxBlur", this); + this.textboxChangeEvent = new YAHOO.util.CustomEvent("textboxChange", this); + + // Finish up + elTextbox.setAttribute("autocomplete","off"); + YAHOO.widget.AutoComplete._nIndex++; + } + // Required arguments were not found + else { + } +}; + +///////////////////////////////////////////////////////////////////////////// +// +// Public member variables +// +///////////////////////////////////////////////////////////////////////////// + +/** + * The DataSource object that encapsulates the data used for auto completion. + * This object should be an inherited object from YAHOO.widget.DataSource. + * + * @property dataSource + * @type YAHOO.widget.DataSource + */ +YAHOO.widget.AutoComplete.prototype.dataSource = null; + +/** + * By default, results from local DataSources will pass through the filterResults + * method to apply a client-side matching algorithm. + * + * @property applyLocalFilter + * @type Boolean + * @default true for local arrays and json, otherwise false + */ +YAHOO.widget.AutoComplete.prototype.applyLocalFilter = null; + +/** + * When applyLocalFilter is true, the local filtering algorthim can have case sensitivity + * enabled. + * + * @property queryMatchCase + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.queryMatchCase = false; + +/** + * When applyLocalFilter is true, results can be locally filtered to return + * matching strings that "contain" the query string rather than simply "start with" + * the query string. + * + * @property queryMatchContains + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.queryMatchContains = false; + +/** + * Enables query subset matching. When the DataSource's cache is enabled and queryMatchSubset is + * true, substrings of queries will return matching cached results. For + * instance, if the first query is for "abc" susequent queries that start with + * "abc", like "abcd", will be queried against the cache, and not the live data + * source. Recommended only for DataSources that return comprehensive results + * for queries with very few characters. + * + * @property queryMatchSubset + * @type Boolean + * @default false + * + */ +YAHOO.widget.AutoComplete.prototype.queryMatchSubset = false; + +/** + * Number of characters that must be entered before querying for results. A negative value + * effectively turns off the widget. A value of 0 allows queries of null or empty string + * values. + * + * @property minQueryLength + * @type Number + * @default 1 + */ +YAHOO.widget.AutoComplete.prototype.minQueryLength = 1; + +/** + * Maximum number of results to display in results container. + * + * @property maxResultsDisplayed + * @type Number + * @default 10 + */ +YAHOO.widget.AutoComplete.prototype.maxResultsDisplayed = 10; + +/** + * Number of seconds to delay before submitting a query request. If a query + * request is received before a previous one has completed its delay, the + * previous request is cancelled and the new request is set to the delay. If + * typeAhead is also enabled, this value must always be less than the typeAheadDelay + * in order to avoid certain race conditions. + * + * @property queryDelay + * @type Number + * @default 0.2 + */ +YAHOO.widget.AutoComplete.prototype.queryDelay = 0.2; + +/** + * If typeAhead is true, number of seconds to delay before updating input with + * typeAhead value. In order to prevent certain race conditions, this value must + * always be greater than the queryDelay. + * + * @property typeAheadDelay + * @type Number + * @default 0.5 + */ +YAHOO.widget.AutoComplete.prototype.typeAheadDelay = 0.5; + +/** + * When IME usage is detected, AutoComplete will switch to querying the input + * value at the given interval rather than per key event. + * + * @property queryInterval + * @type Number + * @default 500 + */ +YAHOO.widget.AutoComplete.prototype.queryInterval = 500; + +/** + * Class name of a highlighted item within results container. + * + * @property highlightClassName + * @type String + * @default "yui-ac-highlight" + */ +YAHOO.widget.AutoComplete.prototype.highlightClassName = "yui-ac-highlight"; + +/** + * Class name of a pre-highlighted item within results container. + * + * @property prehighlightClassName + * @type String + */ +YAHOO.widget.AutoComplete.prototype.prehighlightClassName = null; + +/** + * Query delimiter. A single character separator for multiple delimited + * selections. Multiple delimiter characteres may be defined as an array of + * strings. A null value or empty string indicates that query results cannot + * be delimited. This feature is not recommended if you need forceSelection to + * be true. + * + * @property delimChar + * @type String | String[] + */ +YAHOO.widget.AutoComplete.prototype.delimChar = null; + +/** + * Whether or not the first item in results container should be automatically highlighted + * on expand. + * + * @property autoHighlight + * @type Boolean + * @default true + */ +YAHOO.widget.AutoComplete.prototype.autoHighlight = true; + +/** + * If autohighlight is enabled, whether or not the input field should be automatically updated + * with the first query result as the user types, auto-selecting the substring portion + * of the first result that the user has not yet typed. + * + * @property typeAhead + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.typeAhead = false; + +/** + * Whether or not to animate the expansion/collapse of the results container in the + * horizontal direction. + * + * @property animHoriz + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.animHoriz = false; + +/** + * Whether or not to animate the expansion/collapse of the results container in the + * vertical direction. + * + * @property animVert + * @type Boolean + * @default true + */ +YAHOO.widget.AutoComplete.prototype.animVert = true; + +/** + * Speed of container expand/collapse animation, in seconds.. + * + * @property animSpeed + * @type Number + * @default 0.3 + */ +YAHOO.widget.AutoComplete.prototype.animSpeed = 0.3; + +/** + * Whether or not to force the user's selection to match one of the query + * results. Enabling this feature essentially transforms the input field into a + * <select> field. This feature is not recommended with delimiter character(s) + * defined. + * + * @property forceSelection + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.forceSelection = false; + +/** + * Whether or not to allow browsers to cache user-typed input in the input + * field. Disabling this feature will prevent the widget from setting the + * autocomplete="off" on the input field. When autocomplete="off" + * and users click the back button after form submission, user-typed input can + * be prefilled by the browser from its cache. This caching of user input may + * not be desired for sensitive data, such as credit card numbers, in which + * case, implementers should consider setting allowBrowserAutocomplete to false. + * + * @property allowBrowserAutocomplete + * @type Boolean + * @default true + */ +YAHOO.widget.AutoComplete.prototype.allowBrowserAutocomplete = true; + +/** + * Enabling this feature prevents the toggling of the container to a collapsed state. + * Setting to true does not automatically trigger the opening of the container. + * Implementers are advised to pre-load the container with an explicit "sendQuery()" call. + * + * @property alwaysShowContainer + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.alwaysShowContainer = false; + +/** + * Whether or not to use an iFrame to layer over Windows form elements in + * IE. Set to true only when the results container will be on top of a + * <select> field in IE and thus exposed to the IE z-index bug (i.e., + * 5.5 < IE < 7). + * + * @property useIFrame + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.useIFrame = false; + +/** + * Whether or not the results container should have a shadow. + * + * @property useShadow + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.useShadow = false; + +/** + * Whether or not the input field should be updated with selections. + * + * @property supressInputUpdate + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.suppressInputUpdate = false; + +/** + * For backward compatibility to pre-2.6.0 formatResults() signatures, setting + * resultsTypeList to true will take each object literal result returned by + * DataSource and flatten into an array. + * + * @property resultTypeList + * @type Boolean + * @default true + */ +YAHOO.widget.AutoComplete.prototype.resultTypeList = true; + +/** + * For XHR DataSources, AutoComplete will automatically insert a "?" between the server URI and + * the "query" param/value pair. To prevent this behavior, implementers should + * set this value to false. To more fully customize the query syntax, implementers + * should override the generateRequest() method. + * + * @property queryQuestionMark + * @type Boolean + * @default true + */ +YAHOO.widget.AutoComplete.prototype.queryQuestionMark = true; + +///////////////////////////////////////////////////////////////////////////// +// +// Public methods +// +///////////////////////////////////////////////////////////////////////////// + + /** + * Public accessor to the unique name of the AutoComplete instance. + * + * @method toString + * @return {String} Unique name of the AutoComplete instance. + */ +YAHOO.widget.AutoComplete.prototype.toString = function() { + return "AutoComplete " + this._sName; +}; + + /** + * Returns DOM reference to input element. + * + * @method getInputEl + * @return {HTMLELement} DOM reference to input element. + */ +YAHOO.widget.AutoComplete.prototype.getInputEl = function() { + return this._elTextbox; +}; + + /** + * Returns DOM reference to container element. + * + * @method getContainerEl + * @return {HTMLELement} DOM reference to container element. + */ +YAHOO.widget.AutoComplete.prototype.getContainerEl = function() { + return this._elContainer; +}; + + /** + * Returns true if widget instance is currently focused. + * + * @method isFocused + * @return {Boolean} Returns true if widget instance is currently focused. + */ +YAHOO.widget.AutoComplete.prototype.isFocused = function() { + return (this._bFocused === null) ? false : this._bFocused; +}; + + /** + * Returns true if container is in an expanded state, false otherwise. + * + * @method isContainerOpen + * @return {Boolean} Returns true if container is in an expanded state, false otherwise. + */ +YAHOO.widget.AutoComplete.prototype.isContainerOpen = function() { + return this._bContainerOpen; +}; + +/** + * Public accessor to the <ul> element that displays query results within the results container. + * + * @method getListEl + * @return {HTMLElement[]} Reference to <ul> element within the results container. + */ +YAHOO.widget.AutoComplete.prototype.getListEl = function() { + return this._elList; +}; + +/** + * Public accessor to the matching string associated with a given <li> result. + * + * @method getListItemMatch + * @param elListItem {HTMLElement} Reference to <LI> element. + * @return {String} Matching string. + */ +YAHOO.widget.AutoComplete.prototype.getListItemMatch = function(elListItem) { + if(elListItem._sResultMatch) { + return elListItem._sResultMatch; + } + else { + return null; + } +}; + +/** + * Public accessor to the result data associated with a given <li> result. + * + * @method getListItemData + * @param elListItem {HTMLElement} Reference to <LI> element. + * @return {Object} Result data. + */ +YAHOO.widget.AutoComplete.prototype.getListItemData = function(elListItem) { + if(elListItem._oResultData) { + return elListItem._oResultData; + } + else { + return null; + } +}; + +/** + * Public accessor to the index of the associated with a given <li> result. + * + * @method getListItemIndex + * @param elListItem {HTMLElement} Reference to <LI> element. + * @return {Number} Index. + */ +YAHOO.widget.AutoComplete.prototype.getListItemIndex = function(elListItem) { + if(YAHOO.lang.isNumber(elListItem._nItemIndex)) { + return elListItem._nItemIndex; + } + else { + return null; + } +}; + +/** + * Sets HTML markup for the results container header. This markup will be + * inserted within a <div> tag with a class of "yui-ac-hd". + * + * @method setHeader + * @param sHeader {String} HTML markup for results container header. + */ +YAHOO.widget.AutoComplete.prototype.setHeader = function(sHeader) { + if(this._elHeader) { + var elHeader = this._elHeader; + if(sHeader) { + elHeader.innerHTML = sHeader; + elHeader.style.display = "block"; + } + else { + elHeader.innerHTML = ""; + elHeader.style.display = "none"; + } + } +}; + +/** + * Sets HTML markup for the results container footer. This markup will be + * inserted within a <div> tag with a class of "yui-ac-ft". + * + * @method setFooter + * @param sFooter {String} HTML markup for results container footer. + */ +YAHOO.widget.AutoComplete.prototype.setFooter = function(sFooter) { + if(this._elFooter) { + var elFooter = this._elFooter; + if(sFooter) { + elFooter.innerHTML = sFooter; + elFooter.style.display = "block"; + } + else { + elFooter.innerHTML = ""; + elFooter.style.display = "none"; + } + } +}; + +/** + * Sets HTML markup for the results container body. This markup will be + * inserted within a <div> tag with a class of "yui-ac-bd". + * + * @method setBody + * @param sBody {String} HTML markup for results container body. + */ +YAHOO.widget.AutoComplete.prototype.setBody = function(sBody) { + if(this._elBody) { + var elBody = this._elBody; + YAHOO.util.Event.purgeElement(elBody, true); + if(sBody) { + elBody.innerHTML = sBody; + elBody.style.display = "block"; + } + else { + elBody.innerHTML = ""; + elBody.style.display = "none"; + } + this._elList = null; + } +}; + +/** +* A function that converts an AutoComplete query into a request value which is then +* passed to the DataSource's sendRequest method in order to retrieve data for +* the query. By default, returns a String with the syntax: "query={query}" +* Implementers can customize this method for custom request syntaxes. +* +* @method generateRequest +* @param sQuery {String} Query string +*/ +YAHOO.widget.AutoComplete.prototype.generateRequest = function(sQuery) { + var dataType = this.dataSource.dataType; + + // Transform query string in to a request for remote data + // By default, local data doesn't need a transformation, just passes along the query as is. + if(dataType === YAHOO.util.DataSourceBase.TYPE_XHR) { + // By default, XHR GET requests look like "{scriptURI}?{scriptQueryParam}={sQuery}&{scriptQueryAppend}" + if(!this.dataSource.connMethodPost) { + sQuery = (this.queryQuestionMark ? "?" : "") + (this.dataSource.scriptQueryParam || "query") + "=" + sQuery + + (this.dataSource.scriptQueryAppend ? ("&" + this.dataSource.scriptQueryAppend) : ""); + } + // By default, XHR POST bodies are sent to the {scriptURI} like "{scriptQueryParam}={sQuery}&{scriptQueryAppend}" + else { + sQuery = (this.dataSource.scriptQueryParam || "query") + "=" + sQuery + + (this.dataSource.scriptQueryAppend ? ("&" + this.dataSource.scriptQueryAppend) : ""); + } + } + // By default, remote script node requests look like "{scriptURI}&{scriptCallbackParam}={callbackString}&{scriptQueryParam}={sQuery}&{scriptQueryAppend}" + else if(dataType === YAHOO.util.DataSourceBase.TYPE_SCRIPTNODE) { + sQuery = "&" + (this.dataSource.scriptQueryParam || "query") + "=" + sQuery + + (this.dataSource.scriptQueryAppend ? ("&" + this.dataSource.scriptQueryAppend) : ""); + } + + return sQuery; +}; + +/** + * Makes query request to the DataSource. + * + * @method sendQuery + * @param sQuery {String} Query string. + */ +YAHOO.widget.AutoComplete.prototype.sendQuery = function(sQuery) { + // Adjust programatically sent queries to look like they input by user + // when delimiters are enabled + var newQuery = (this.delimChar) ? this._elTextbox.value + sQuery : sQuery; + this._sendQuery(newQuery); +}; + +/** + * Collapses container. + * + * @method collapseContainer + */ +YAHOO.widget.AutoComplete.prototype.collapseContainer = function() { + this._toggleContainer(false); +}; + +/** + * Handles subset matching for when queryMatchSubset is enabled. + * + * @method getSubsetMatches + * @param sQuery {String} Query string. + * @return {Object} oParsedResponse or null. + */ +YAHOO.widget.AutoComplete.prototype.getSubsetMatches = function(sQuery) { + var subQuery, oCachedResponse, subRequest; + // Loop through substrings of each cached element's query property... + for(var i = sQuery.length; i >= this.minQueryLength ; i--) { + subRequest = this.generateRequest(sQuery.substr(0,i)); + this.dataRequestEvent.fire(this, subQuery, subRequest); + + // If a substring of the query is found in the cache + oCachedResponse = this.dataSource.getCachedResponse(subRequest); + if(oCachedResponse) { + return this.filterResults.apply(this.dataSource, [sQuery, oCachedResponse, oCachedResponse, {scope:this}]); + } + } + return null; +}; + +/** + * Executed by DataSource (within DataSource scope via doBeforeParseData()) to + * handle responseStripAfter cleanup. + * + * @method preparseRawResponse + * @param sQuery {String} Query string. + * @return {Object} oParsedResponse or null. + */ +YAHOO.widget.AutoComplete.prototype.preparseRawResponse = function(oRequest, oFullResponse, oCallback) { + var nEnd = ((this.responseStripAfter !== "") && (oFullResponse.indexOf)) ? + oFullResponse.indexOf(this.responseStripAfter) : -1; + if(nEnd != -1) { + oFullResponse = oFullResponse.substring(0,nEnd); + } + return oFullResponse; +}; + +/** + * Executed by DataSource (within DataSource scope via doBeforeCallback()) to + * filter results through a simple client-side matching algorithm. + * + * @method filterResults + * @param sQuery {String} Original request. + * @param oFullResponse {Object} Full response object. + * @param oParsedResponse {Object} Parsed response object. + * @param oCallback {Object} Callback object. + * @return {Object} Filtered response object. + */ + +YAHOO.widget.AutoComplete.prototype.filterResults = function(sQuery, oFullResponse, oParsedResponse, oCallback) { + // Only if a query string is available to match against + if(sQuery && sQuery !== "") { + // First make a copy of the oParseResponse + oParsedResponse = YAHOO.widget.AutoComplete._cloneObject(oParsedResponse); + + var oAC = oCallback.scope, + oDS = this, + allResults = oParsedResponse.results, // the array of results + filteredResults = [], // container for filtered results + bMatchFound = false, + bMatchCase = (oDS.queryMatchCase || oAC.queryMatchCase), // backward compat + bMatchContains = (oDS.queryMatchContains || oAC.queryMatchContains); // backward compat + + // Loop through each result object... + for(var i = allResults.length-1; i >= 0; i--) { + var oResult = allResults[i]; + + // Grab the data to match against from the result object... + var sResult = null; + + // Result object is a simple string already + if(YAHOO.lang.isString(oResult)) { + sResult = oResult; + } + // Result object is an array of strings + else if(YAHOO.lang.isArray(oResult)) { + sResult = oResult[0]; + + } + // Result object is an object literal of strings + else if(this.responseSchema.fields) { + var key = this.responseSchema.fields[0].key || this.responseSchema.fields[0]; + sResult = oResult[key]; + } + // Backwards compatibility + else if(this.key) { + sResult = oResult[this.key]; + } + + if(YAHOO.lang.isString(sResult)) { + + var sKeyIndex = (bMatchCase) ? + sResult.indexOf(decodeURIComponent(sQuery)) : + sResult.toLowerCase().indexOf(decodeURIComponent(sQuery).toLowerCase()); + + // A STARTSWITH match is when the query is found at the beginning of the key string... + if((!bMatchContains && (sKeyIndex === 0)) || + // A CONTAINS match is when the query is found anywhere within the key string... + (bMatchContains && (sKeyIndex > -1))) { + // Stash the match + filteredResults.unshift(oResult); + } + } + } + oParsedResponse.results = filteredResults; + } + else { + } + + return oParsedResponse; +}; + +/** + * Handles response for display. This is the callback function method passed to + * YAHOO.util.DataSourceBase#sendRequest so results from the DataSource are + * returned to the AutoComplete instance. + * + * @method handleResponse + * @param sQuery {String} Original request. + * @param oResponse {Object} Response object. + * @param oPayload {MIXED} (optional) Additional argument(s) + */ +YAHOO.widget.AutoComplete.prototype.handleResponse = function(sQuery, oResponse, oPayload) { + if((this instanceof YAHOO.widget.AutoComplete) && this._sName) { + this._populateList(sQuery, oResponse, oPayload); + } +}; + +/** + * Overridable method called before container is loaded with result data. + * + * @method doBeforeLoadData + * @param sQuery {String} Original request. + * @param oResponse {Object} Response object. + * @param oPayload {MIXED} (optional) Additional argument(s) + * @return {Boolean} Return true to continue loading data, false to cancel. + */ +YAHOO.widget.AutoComplete.prototype.doBeforeLoadData = function(sQuery, oResponse, oPayload) { + return true; +}; + +/** + * Overridable method that returns HTML markup for one result to be populated + * as innerHTML of an <LI> element. + * + * @method formatResult + * @param oResultData {Object} Result data object. + * @param sQuery {String} The corresponding query string. + * @param sResultMatch {HTMLElement} The current query string. + * @return {String} HTML markup of formatted result data. + */ +YAHOO.widget.AutoComplete.prototype.formatResult = function(oResultData, sQuery, sResultMatch) { + var sMarkup = (sResultMatch) ? sResultMatch : ""; + return sMarkup; +}; + +/** + * Overridable method called before container expands allows implementers to access data + * and DOM elements. + * + * @method doBeforeExpandContainer + * @param elTextbox {HTMLElement} The text input box. + * @param elContainer {HTMLElement} The container element. + * @param sQuery {String} The query string. + * @param aResults {Object[]} An array of query results. + * @return {Boolean} Return true to continue expanding container, false to cancel the expand. + */ +YAHOO.widget.AutoComplete.prototype.doBeforeExpandContainer = function(elTextbox, elContainer, sQuery, aResults) { + return true; +}; + + +/** + * Nulls out the entire AutoComplete instance and related objects, removes attached + * event listeners, and clears out DOM elements inside the container. After + * calling this method, the instance reference should be expliclitly nulled by + * implementer, as in myDataTable = null. Use with caution! + * + * @method destroy + */ +YAHOO.widget.AutoComplete.prototype.destroy = function() { + var instanceName = this.toString(); + var elInput = this._elTextbox; + var elContainer = this._elContainer; + + // Unhook custom events + this.textboxFocusEvent.unsubscribeAll(); + this.textboxKeyEvent.unsubscribeAll(); + this.dataRequestEvent.unsubscribeAll(); + this.dataReturnEvent.unsubscribeAll(); + this.dataErrorEvent.unsubscribeAll(); + this.containerPopulateEvent.unsubscribeAll(); + this.containerExpandEvent.unsubscribeAll(); + this.typeAheadEvent.unsubscribeAll(); + this.itemMouseOverEvent.unsubscribeAll(); + this.itemMouseOutEvent.unsubscribeAll(); + this.itemArrowToEvent.unsubscribeAll(); + this.itemArrowFromEvent.unsubscribeAll(); + this.itemSelectEvent.unsubscribeAll(); + this.unmatchedItemSelectEvent.unsubscribeAll(); + this.selectionEnforceEvent.unsubscribeAll(); + this.containerCollapseEvent.unsubscribeAll(); + this.textboxBlurEvent.unsubscribeAll(); + this.textboxChangeEvent.unsubscribeAll(); + + // Unhook DOM events + YAHOO.util.Event.purgeElement(elInput, true); + YAHOO.util.Event.purgeElement(elContainer, true); + + // Remove DOM elements + elContainer.innerHTML = ""; + + // Null out objects + for(var key in this) { + if(YAHOO.lang.hasOwnProperty(this, key)) { + this[key] = null; + } + } + +}; + +///////////////////////////////////////////////////////////////////////////// +// +// Public events +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Fired when the input field receives focus. + * + * @event textboxFocusEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + */ +YAHOO.widget.AutoComplete.prototype.textboxFocusEvent = null; + +/** + * Fired when the input field receives key input. + * + * @event textboxKeyEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param nKeycode {Number} The keycode number. + */ +YAHOO.widget.AutoComplete.prototype.textboxKeyEvent = null; + +/** + * Fired when the AutoComplete instance makes a request to the DataSource. + * + * @event dataRequestEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param sQuery {String} The query string. + * @param oRequest {Object} The request. + */ +YAHOO.widget.AutoComplete.prototype.dataRequestEvent = null; + +/** + * Fired when the AutoComplete instance receives query results from the data + * source. + * + * @event dataReturnEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param sQuery {String} The query string. + * @param aResults {Object[]} Results array. + */ +YAHOO.widget.AutoComplete.prototype.dataReturnEvent = null; + +/** + * Fired when the AutoComplete instance does not receive query results from the + * DataSource due to an error. + * + * @event dataErrorEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param sQuery {String} The query string. + */ +YAHOO.widget.AutoComplete.prototype.dataErrorEvent = null; + +/** + * Fired when the results container is populated. + * + * @event containerPopulateEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + */ +YAHOO.widget.AutoComplete.prototype.containerPopulateEvent = null; + +/** + * Fired when the results container is expanded. + * + * @event containerExpandEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param sQuery {String} The query string. + * @param aResults {Object[]} Results array. + */ +YAHOO.widget.AutoComplete.prototype.containerExpandEvent = null; + +/** + * Fired when the input field has been prefilled by the type-ahead + * feature. + * + * @event typeAheadEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param sQuery {String} The query string. + * @param sPrefill {String} The prefill string. + */ +YAHOO.widget.AutoComplete.prototype.typeAheadEvent = null; + +/** + * Fired when result item has been moused over. + * + * @event itemMouseOverEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param elItem {HTMLElement} The <li> element item moused to. + */ +YAHOO.widget.AutoComplete.prototype.itemMouseOverEvent = null; + +/** + * Fired when result item has been moused out. + * + * @event itemMouseOutEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param elItem {HTMLElement} The <li> element item moused from. + */ +YAHOO.widget.AutoComplete.prototype.itemMouseOutEvent = null; + +/** + * Fired when result item has been arrowed to. + * + * @event itemArrowToEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param elItem {HTMLElement} The <li> element item arrowed to. + */ +YAHOO.widget.AutoComplete.prototype.itemArrowToEvent = null; + +/** + * Fired when result item has been arrowed away from. + * + * @event itemArrowFromEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param elItem {HTMLElement} The <li> element item arrowed from. + */ +YAHOO.widget.AutoComplete.prototype.itemArrowFromEvent = null; + +/** + * Fired when an item is selected via mouse click, ENTER key, or TAB key. + * + * @event itemSelectEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param elItem {HTMLElement} The selected <li> element item. + * @param oData {Object} The data returned for the item, either as an object, + * or mapped from the schema into an array. + */ +YAHOO.widget.AutoComplete.prototype.itemSelectEvent = null; + +/** + * Fired when a user selection does not match any of the displayed result items. + * + * @event unmatchedItemSelectEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param sSelection {String} The selected string. + */ +YAHOO.widget.AutoComplete.prototype.unmatchedItemSelectEvent = null; + +/** + * Fired if forceSelection is enabled and the user's input has been cleared + * because it did not match one of the returned query results. + * + * @event selectionEnforceEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + */ +YAHOO.widget.AutoComplete.prototype.selectionEnforceEvent = null; + +/** + * Fired when the results container is collapsed. + * + * @event containerCollapseEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + */ +YAHOO.widget.AutoComplete.prototype.containerCollapseEvent = null; + +/** + * Fired when the input field loses focus. + * + * @event textboxBlurEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + */ +YAHOO.widget.AutoComplete.prototype.textboxBlurEvent = null; + +/** + * Fired when the input field value has changed when it loses focus. + * + * @event textboxChangeEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + */ +YAHOO.widget.AutoComplete.prototype.textboxChangeEvent = null; + +///////////////////////////////////////////////////////////////////////////// +// +// Private member variables +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Internal class variable to index multiple AutoComplete instances. + * + * @property _nIndex + * @type Number + * @default 0 + * @private + */ +YAHOO.widget.AutoComplete._nIndex = 0; + +/** + * Name of AutoComplete instance. + * + * @property _sName + * @type String + * @private + */ +YAHOO.widget.AutoComplete.prototype._sName = null; + +/** + * Text input field DOM element. + * + * @property _elTextbox + * @type HTMLElement + * @private + */ +YAHOO.widget.AutoComplete.prototype._elTextbox = null; + +/** + * Container DOM element. + * + * @property _elContainer + * @type HTMLElement + * @private + */ +YAHOO.widget.AutoComplete.prototype._elContainer = null; + +/** + * Reference to content element within container element. + * + * @property _elContent + * @type HTMLElement + * @private + */ +YAHOO.widget.AutoComplete.prototype._elContent = null; + +/** + * Reference to header element within content element. + * + * @property _elHeader + * @type HTMLElement + * @private + */ +YAHOO.widget.AutoComplete.prototype._elHeader = null; + +/** + * Reference to body element within content element. + * + * @property _elBody + * @type HTMLElement + * @private + */ +YAHOO.widget.AutoComplete.prototype._elBody = null; + +/** + * Reference to footer element within content element. + * + * @property _elFooter + * @type HTMLElement + * @private + */ +YAHOO.widget.AutoComplete.prototype._elFooter = null; + +/** + * Reference to shadow element within container element. + * + * @property _elShadow + * @type HTMLElement + * @private + */ +YAHOO.widget.AutoComplete.prototype._elShadow = null; + +/** + * Reference to iframe element within container element. + * + * @property _elIFrame + * @type HTMLElement + * @private + */ +YAHOO.widget.AutoComplete.prototype._elIFrame = null; + +/** + * Whether or not the input field is currently in focus. If query results come back + * but the user has already moved on, do not proceed with auto complete behavior. + * + * @property _bFocused + * @type Boolean + * @private + */ +YAHOO.widget.AutoComplete.prototype._bFocused = null; + +/** + * Animation instance for container expand/collapse. + * + * @property _oAnim + * @type Boolean + * @private + */ +YAHOO.widget.AutoComplete.prototype._oAnim = null; + +/** + * Whether or not the results container is currently open. + * + * @property _bContainerOpen + * @type Boolean + * @private + */ +YAHOO.widget.AutoComplete.prototype._bContainerOpen = false; + +/** + * Whether or not the mouse is currently over the results + * container. This is necessary in order to prevent clicks on container items + * from being text input field blur events. + * + * @property _bOverContainer + * @type Boolean + * @private + */ +YAHOO.widget.AutoComplete.prototype._bOverContainer = false; + +/** + * Internal reference to <ul> elements that contains query results within the + * results container. + * + * @property _elList + * @type HTMLElement + * @private + */ +YAHOO.widget.AutoComplete.prototype._elList = null; + +/* + * Array of <li> elements references that contain query results within the + * results container. + * + * @property _aListItemEls + * @type HTMLElement[] + * @private + */ +//YAHOO.widget.AutoComplete.prototype._aListItemEls = null; + +/** + * Number of <li> elements currently displayed in results container. + * + * @property _nDisplayedItems + * @type Number + * @private + */ +YAHOO.widget.AutoComplete.prototype._nDisplayedItems = 0; + +/* + * Internal count of <li> elements displayed and hidden in results container. + * + * @property _maxResultsDisplayed + * @type Number + * @private + */ +//YAHOO.widget.AutoComplete.prototype._maxResultsDisplayed = 0; + +/** + * Current query string + * + * @property _sCurQuery + * @type String + * @private + */ +YAHOO.widget.AutoComplete.prototype._sCurQuery = null; + +/** + * Selections from previous queries (for saving delimited queries). + * + * @property _sPastSelections + * @type String + * @default "" + * @private + */ +YAHOO.widget.AutoComplete.prototype._sPastSelections = ""; + +/** + * Stores initial input value used to determine if textboxChangeEvent should be fired. + * + * @property _sInitInputValue + * @type String + * @private + */ +YAHOO.widget.AutoComplete.prototype._sInitInputValue = null; + +/** + * Pointer to the currently highlighted <li> element in the container. + * + * @property _elCurListItem + * @type HTMLElement + * @private + */ +YAHOO.widget.AutoComplete.prototype._elCurListItem = null; + +/** + * Whether or not an item has been selected since the container was populated + * with results. Reset to false by _populateList, and set to true when item is + * selected. + * + * @property _bItemSelected + * @type Boolean + * @private + */ +YAHOO.widget.AutoComplete.prototype._bItemSelected = false; + +/** + * Key code of the last key pressed in textbox. + * + * @property _nKeyCode + * @type Number + * @private + */ +YAHOO.widget.AutoComplete.prototype._nKeyCode = null; + +/** + * Delay timeout ID. + * + * @property _nDelayID + * @type Number + * @private + */ +YAHOO.widget.AutoComplete.prototype._nDelayID = -1; + +/** + * TypeAhead delay timeout ID. + * + * @property _nTypeAheadDelayID + * @type Number + * @private + */ +YAHOO.widget.AutoComplete.prototype._nTypeAheadDelayID = -1; + +/** + * Src to iFrame used when useIFrame = true. Supports implementations over SSL + * as well. + * + * @property _iFrameSrc + * @type String + * @private + */ +YAHOO.widget.AutoComplete.prototype._iFrameSrc = "javascript:false;"; + +/** + * For users typing via certain IMEs, queries must be triggered by intervals, + * since key events yet supported across all browsers for all IMEs. + * + * @property _queryInterval + * @type Object + * @private + */ +YAHOO.widget.AutoComplete.prototype._queryInterval = null; + +/** + * Internal tracker to last known textbox value, used to determine whether or not + * to trigger a query via interval for certain IME users. + * + * @event _sLastTextboxValue + * @type String + * @private + */ +YAHOO.widget.AutoComplete.prototype._sLastTextboxValue = null; + +///////////////////////////////////////////////////////////////////////////// +// +// Private methods +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Updates and validates latest public config properties. + * + * @method __initProps + * @private + */ +YAHOO.widget.AutoComplete.prototype._initProps = function() { + // Correct any invalid values + var minQueryLength = this.minQueryLength; + if(!YAHOO.lang.isNumber(minQueryLength)) { + this.minQueryLength = 1; + } + var maxResultsDisplayed = this.maxResultsDisplayed; + if(!YAHOO.lang.isNumber(maxResultsDisplayed) || (maxResultsDisplayed < 1)) { + this.maxResultsDisplayed = 10; + } + var queryDelay = this.queryDelay; + if(!YAHOO.lang.isNumber(queryDelay) || (queryDelay < 0)) { + this.queryDelay = 0.2; + } + var typeAheadDelay = this.typeAheadDelay; + if(!YAHOO.lang.isNumber(typeAheadDelay) || (typeAheadDelay < 0)) { + this.typeAheadDelay = 0.2; + } + var delimChar = this.delimChar; + if(YAHOO.lang.isString(delimChar) && (delimChar.length > 0)) { + this.delimChar = [delimChar]; + } + else if(!YAHOO.lang.isArray(delimChar)) { + this.delimChar = null; + } + var animSpeed = this.animSpeed; + if((this.animHoriz || this.animVert) && YAHOO.util.Anim) { + if(!YAHOO.lang.isNumber(animSpeed) || (animSpeed < 0)) { + this.animSpeed = 0.3; + } + if(!this._oAnim ) { + this._oAnim = new YAHOO.util.Anim(this._elContent, {}, this.animSpeed); + } + else { + this._oAnim.duration = this.animSpeed; + } + } + if(this.forceSelection && delimChar) { + } +}; + +/** + * Initializes the results container helpers if they are enabled and do + * not exist + * + * @method _initContainerHelperEls + * @private + */ +YAHOO.widget.AutoComplete.prototype._initContainerHelperEls = function() { + if(this.useShadow && !this._elShadow) { + var elShadow = document.createElement("div"); + elShadow.className = "yui-ac-shadow"; + elShadow.style.width = 0; + elShadow.style.height = 0; + this._elShadow = this._elContainer.appendChild(elShadow); + } + if(this.useIFrame && !this._elIFrame) { + var elIFrame = document.createElement("iframe"); + elIFrame.src = this._iFrameSrc; + elIFrame.frameBorder = 0; + elIFrame.scrolling = "no"; + elIFrame.style.position = "absolute"; + elIFrame.style.width = 0; + elIFrame.style.height = 0; + elIFrame.tabIndex = -1; + elIFrame.style.padding = 0; + this._elIFrame = this._elContainer.appendChild(elIFrame); + } +}; + +/** + * Initializes the results container once at object creation + * + * @method _initContainerEl + * @private + */ +YAHOO.widget.AutoComplete.prototype._initContainerEl = function() { + YAHOO.util.Dom.addClass(this._elContainer, "yui-ac-container"); + + if(!this._elContent) { + // The elContent div is assigned DOM listeners and + // helps size the iframe and shadow properly + var elContent = document.createElement("div"); + elContent.className = "yui-ac-content"; + elContent.style.display = "none"; + + this._elContent = this._elContainer.appendChild(elContent); + + var elHeader = document.createElement("div"); + elHeader.className = "yui-ac-hd"; + elHeader.style.display = "none"; + this._elHeader = this._elContent.appendChild(elHeader); + + var elBody = document.createElement("div"); + elBody.className = "yui-ac-bd"; + this._elBody = this._elContent.appendChild(elBody); + + var elFooter = document.createElement("div"); + elFooter.className = "yui-ac-ft"; + elFooter.style.display = "none"; + this._elFooter = this._elContent.appendChild(elFooter); + } + else { + } +}; + +/** + * Clears out contents of container body and creates up to + * YAHOO.widget.AutoComplete#maxResultsDisplayed <li> elements in an + * <ul> element. + * + * @method _initListEl + * @private + */ +YAHOO.widget.AutoComplete.prototype._initListEl = function() { + var nListLength = this.maxResultsDisplayed; + + var elList = this._elList || document.createElement("ul"); + var elListItem; + while(elList.childNodes.length < nListLength) { + elListItem = document.createElement("li"); + elListItem.style.display = "none"; + elListItem._nItemIndex = elList.childNodes.length; + elList.appendChild(elListItem); + } + if(!this._elList) { + var elBody = this._elBody; + YAHOO.util.Event.purgeElement(elBody, true); + elBody.innerHTML = ""; + this._elList = elBody.appendChild(elList); + } + +}; + +/** + * Enables interval detection for IME support. + * + * @method _enableIntervalDetection + * @re + * @private + */ +YAHOO.widget.AutoComplete.prototype._enableIntervalDetection = function() { + var oSelf = this; + if(!oSelf._queryInterval && oSelf.queryInterval) { + oSelf._queryInterval = setInterval(function() { oSelf._onInterval(); }, oSelf.queryInterval); + } +}; + +/** + * Enables query triggers based on text input detection by intervals (rather + * than by key events). + * + * @method _onInterval + * @private + */ +YAHOO.widget.AutoComplete.prototype._onInterval = function() { + var currValue = this._elTextbox.value; + var lastValue = this._sLastTextboxValue; + if(currValue != lastValue) { + this._sLastTextboxValue = currValue; + this._sendQuery(currValue); + } +}; + +/** + * Cancels text input detection by intervals. + * + * @method _clearInterval + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._clearInterval = function() { + if(this._queryInterval) { + clearInterval(this._queryInterval); + this._queryInterval = null; + } +}; + +/** + * Whether or not key is functional or should be ignored. Note that the right + * arrow key is NOT an ignored key since it triggers queries for certain intl + * charsets. + * + * @method _isIgnoreKey + * @param nKeycode {Number} Code of key pressed. + * @return {Boolean} True if key should be ignored, false otherwise. + * @private + */ +YAHOO.widget.AutoComplete.prototype._isIgnoreKey = function(nKeyCode) { + if((nKeyCode == 9) || (nKeyCode == 13) || // tab, enter + (nKeyCode == 16) || (nKeyCode == 17) || // shift, ctl + (nKeyCode >= 18 && nKeyCode <= 20) || // alt, pause/break,caps lock + (nKeyCode == 27) || // esc + (nKeyCode >= 33 && nKeyCode <= 35) || // page up,page down,end + /*(nKeyCode >= 36 && nKeyCode <= 38) || // home,left,up + (nKeyCode == 40) || // down*/ + (nKeyCode >= 36 && nKeyCode <= 40) || // home,left,up, right, down + (nKeyCode >= 44 && nKeyCode <= 45) || // print screen,insert + (nKeyCode == 229) // Bug 2041973: Korean XP fires 2 keyup events, the key and 229 + ) { + return true; + } + return false; +}; + +/** + * Makes query request to the DataSource. + * + * @method _sendQuery + * @param sQuery {String} Query string. + * @private + */ +YAHOO.widget.AutoComplete.prototype._sendQuery = function(sQuery) { + // Widget has been effectively turned off + if(this.minQueryLength < 0) { + this._toggleContainer(false); + return; + } + // Delimiter has been enabled + var aDelimChar = (this.delimChar) ? this.delimChar : null; + if(aDelimChar) { + // Loop through all possible delimiters and find the rightmost one in the query + // A " " may be a false positive if they are defined as delimiters AND + // are used to separate delimited queries + var nDelimIndex = -1; + for(var i = aDelimChar.length-1; i >= 0; i--) { + var nNewIndex = sQuery.lastIndexOf(aDelimChar[i]); + if(nNewIndex > nDelimIndex) { + nDelimIndex = nNewIndex; + } + } + // If we think the last delimiter is a space (" "), make sure it is NOT + // a false positive by also checking the char directly before it + if(aDelimChar[i] == " ") { + for (var j = aDelimChar.length-1; j >= 0; j--) { + if(sQuery[nDelimIndex - 1] == aDelimChar[j]) { + nDelimIndex--; + break; + } + } + } + // A delimiter has been found in the query so extract the latest query from past selections + if(nDelimIndex > -1) { + var nQueryStart = nDelimIndex + 1; + // Trim any white space from the beginning... + while(sQuery.charAt(nQueryStart) == " ") { + nQueryStart += 1; + } + // ...and save the rest of the string for later + this._sPastSelections = sQuery.substring(0,nQueryStart); + // Here is the query itself + sQuery = sQuery.substr(nQueryStart); + } + // No delimiter found in the query, so there are no selections from past queries + else { + this._sPastSelections = ""; + } + } + + // Don't search queries that are too short + if((sQuery && (sQuery.length < this.minQueryLength)) || (!sQuery && this.minQueryLength > 0)) { + if(this._nDelayID != -1) { + clearTimeout(this._nDelayID); + } + this._toggleContainer(false); + return; + } + + sQuery = encodeURIComponent(sQuery); + this._nDelayID = -1; // Reset timeout ID because request is being made + + // Subset matching + if(this.dataSource.queryMatchSubset || this.queryMatchSubset) { // backward compat + var oResponse = this.getSubsetMatches(sQuery); + if(oResponse) { + this.handleResponse(sQuery, oResponse, {query: sQuery}); + return; + } + } + + if(this.responseStripAfter) { + this.dataSource.doBeforeParseData = this.preparseRawResponse; + } + if(this.applyLocalFilter) { + this.dataSource.doBeforeCallback = this.filterResults; + } + + var sRequest = this.generateRequest(sQuery); + this.dataRequestEvent.fire(this, sQuery, sRequest); + + this.dataSource.sendRequest(sRequest, { + success : this.handleResponse, + failure : this.handleResponse, + scope : this, + argument: { + query: sQuery + } + }); +}; + +/** + * Populates the array of <li> elements in the container with query + * results. + * + * @method _populateList + * @param sQuery {String} Original request. + * @param oResponse {Object} Response object. + * @param oPayload {MIXED} (optional) Additional argument(s) + * @private + */ +YAHOO.widget.AutoComplete.prototype._populateList = function(sQuery, oResponse, oPayload) { + // Clear previous timeout + if(this._nTypeAheadDelayID != -1) { + clearTimeout(this._nTypeAheadDelayID); + } + + sQuery = (oPayload && oPayload.query) ? oPayload.query : sQuery; + + // Pass data through abstract method for any transformations + var ok = this.doBeforeLoadData(sQuery, oResponse, oPayload); + + // Data is ok + if(ok && !oResponse.error) { + this.dataReturnEvent.fire(this, sQuery, oResponse.results); + + // Continue only if instance is still focused (i.e., user hasn't already moved on) + // Null indicates initialized state, which is ok too + if(this._bFocused || (this._bFocused === null)) { + + //TODO: is this still necessary? + /*var isOpera = (YAHOO.env.ua.opera); + var contentStyle = this._elContent.style; + contentStyle.width = (!isOpera) ? null : ""; + contentStyle.height = (!isOpera) ? null : "";*/ + + // Store state for this interaction + var sCurQuery = decodeURIComponent(sQuery); + this._sCurQuery = sCurQuery; + this._bItemSelected = false; + + var allResults = oResponse.results, + nItemsToShow = Math.min(allResults.length,this.maxResultsDisplayed), + sMatchKey = (this.dataSource.responseSchema.fields) ? + (this.dataSource.responseSchema.fields[0].key || this.dataSource.responseSchema.fields[0]) : 0; + + if(nItemsToShow > 0) { + // Make sure container and helpers are ready to go + if(!this._elList || (this._elList.childNodes.length < nItemsToShow)) { + this._initListEl(); + } + this._initContainerHelperEls(); + + var allListItemEls = this._elList.childNodes; + // Fill items with data from the bottom up + for(var i = nItemsToShow-1; i >= 0; i--) { + var elListItem = allListItemEls[i], + oResult = allResults[i]; + + // Backward compatibility + if(this.resultTypeList) { + // Results need to be converted back to an array + var aResult = []; + // Match key is first + aResult[0] = (YAHOO.lang.isString(oResult)) ? oResult : oResult[sMatchKey] || oResult[this.key]; + // Add additional data to the result array + var fields = this.dataSource.responseSchema.fields; + if(YAHOO.lang.isArray(fields) && (fields.length > 1)) { + for(var k=1, len=fields.length; k= nItemsToShow; j--) { + extraListItem = allListItemEls[j]; + extraListItem.style.display = "none"; + } + } + + this._nDisplayedItems = nItemsToShow; + + this.containerPopulateEvent.fire(this, sQuery, allResults); + + // Highlight the first item + if(this.autoHighlight) { + var elFirstListItem = this._elList.firstChild; + this._toggleHighlight(elFirstListItem,"to"); + this.itemArrowToEvent.fire(this, elFirstListItem); + this._typeAhead(elFirstListItem,sQuery); + } + // Unhighlight any previous time + else { + this._toggleHighlight(this._elCurListItem,"from"); + } + + // Expand the container + ok = this.doBeforeExpandContainer(this._elTextbox, this._elContainer, sQuery, allResults); + this._toggleContainer(ok); + } + else { + this._toggleContainer(false); + } + + return; + } + } + // Error + else { + this.dataErrorEvent.fire(this, sQuery); + } + +}; + +/** + * When forceSelection is true and the user attempts + * leave the text input box without selecting an item from the query results, + * the user selection is cleared. + * + * @method _clearSelection + * @private + */ +YAHOO.widget.AutoComplete.prototype._clearSelection = function() { + var sValue = this._elTextbox.value; + //TODO: need to check against all delimChars? + var sChar = (this.delimChar) ? this.delimChar[0] : null; + var nIndex = (sChar) ? sValue.lastIndexOf(sChar, sValue.length-2) : -1; + if(nIndex > -1) { + this._elTextbox.value = sValue.substring(0,nIndex); + } + else { + this._elTextbox.value = ""; + } + this._sPastSelections = this._elTextbox.value; + + // Fire custom event + this.selectionEnforceEvent.fire(this); +}; + +/** + * Whether or not user-typed value in the text input box matches any of the + * query results. + * + * @method _textMatchesOption + * @return {HTMLElement} Matching list item element if user-input text matches + * a result, null otherwise. + * @private + */ +YAHOO.widget.AutoComplete.prototype._textMatchesOption = function() { + var elMatch = null; + + for(var i = this._nDisplayedItems-1; i >= 0 ; i--) { + var elListItem = this._elList.childNodes[i]; + var sMatch = ("" + elListItem._sResultMatch).toLowerCase(); + if(sMatch == this._sCurQuery.toLowerCase()) { + elMatch = elListItem; + break; + } + } + return(elMatch); +}; + +/** + * Updates in the text input box with the first query result as the user types, + * selecting the substring that the user has not typed. + * + * @method _typeAhead + * @param elListItem {HTMLElement} The <li> element item whose data populates the input field. + * @param sQuery {String} Query string. + * @private + */ +YAHOO.widget.AutoComplete.prototype._typeAhead = function(elListItem, sQuery) { + // Don't typeAhead if turned off or is backspace + if(!this.typeAhead || (this._nKeyCode == 8)) { + return; + } + + var oSelf = this, + elTextbox = this._elTextbox; + + // Only if text selection is supported + if(elTextbox.setSelectionRange || elTextbox.createTextRange) { + // Set and store timeout for this typeahead + this._nTypeAheadDelayID = setTimeout(function() { + // Select the portion of text that the user has not typed + var nStart = elTextbox.value.length; // any saved queries plus what user has typed + oSelf._updateValue(elListItem); + var nEnd = elTextbox.value.length; + oSelf._selectText(elTextbox,nStart,nEnd); + var sPrefill = elTextbox.value.substr(nStart,nEnd); + oSelf.typeAheadEvent.fire(oSelf,sQuery,sPrefill); + },(this.typeAheadDelay*1000)); + } +}; + +/** + * Selects text in the input field. + * + * @method _selectText + * @param elTextbox {HTMLElement} Text input box element in which to select text. + * @param nStart {Number} Starting index of text string to select. + * @param nEnd {Number} Ending index of text selection. + * @private + */ +YAHOO.widget.AutoComplete.prototype._selectText = function(elTextbox, nStart, nEnd) { + if(elTextbox.setSelectionRange) { // For Mozilla + elTextbox.setSelectionRange(nStart,nEnd); + } + else if(elTextbox.createTextRange) { // For IE + var oTextRange = elTextbox.createTextRange(); + oTextRange.moveStart("character", nStart); + oTextRange.moveEnd("character", nEnd-elTextbox.value.length); + oTextRange.select(); + } + else { + elTextbox.select(); + } +}; + +/** + * Syncs results container with its helpers. + * + * @method _toggleContainerHelpers + * @param bShow {Boolean} True if container is expanded, false if collapsed + * @private + */ +YAHOO.widget.AutoComplete.prototype._toggleContainerHelpers = function(bShow) { + var width = this._elContent.offsetWidth + "px"; + var height = this._elContent.offsetHeight + "px"; + + if(this.useIFrame && this._elIFrame) { + var elIFrame = this._elIFrame; + if(bShow) { + elIFrame.style.width = width; + elIFrame.style.height = height; + elIFrame.style.padding = ""; + } + else { + elIFrame.style.width = 0; + elIFrame.style.height = 0; + elIFrame.style.padding = 0; + } + } + if(this.useShadow && this._elShadow) { + var elShadow = this._elShadow; + if(bShow) { + elShadow.style.width = width; + elShadow.style.height = height; + } + else { + elShadow.style.width = 0; + elShadow.style.height = 0; + } + } +}; + +/** + * Animates expansion or collapse of the container. + * + * @method _toggleContainer + * @param bShow {Boolean} True if container should be expanded, false if container should be collapsed + * @private + */ +YAHOO.widget.AutoComplete.prototype._toggleContainer = function(bShow) { + var elContainer = this._elContainer; + + // If implementer has container always open and it's already open, don't mess with it + // Container is initialized with display "none" so it may need to be shown first time through + if(this.alwaysShowContainer && this._bContainerOpen) { + return; + } + + // Reset states + if(!bShow) { + this._toggleHighlight(this._elCurListItem,"from"); + this._nDisplayedItems = 0; + this._sCurQuery = null; + + // Container is already closed, so don't bother with changing the UI + if(!this._bContainerOpen) { + this._elContent.style.display = "none"; + return; + } + } + + // If animation is enabled... + var oAnim = this._oAnim; + if(oAnim && oAnim.getEl() && (this.animHoriz || this.animVert)) { + if(oAnim.isAnimated()) { + oAnim.stop(true); + } + + // Clone container to grab current size offscreen + var oClone = this._elContent.cloneNode(true); + elContainer.appendChild(oClone); + oClone.style.top = "-9000px"; + oClone.style.width = ""; + oClone.style.height = ""; + oClone.style.display = ""; + + // Current size of the container is the EXPANDED size + var wExp = oClone.offsetWidth; + var hExp = oClone.offsetHeight; + + // Calculate COLLAPSED sizes based on horiz and vert anim + var wColl = (this.animHoriz) ? 0 : wExp; + var hColl = (this.animVert) ? 0 : hExp; + + // Set animation sizes + oAnim.attributes = (bShow) ? + {width: { to: wExp }, height: { to: hExp }} : + {width: { to: wColl}, height: { to: hColl }}; + + // If opening anew, set to a collapsed size... + if(bShow && !this._bContainerOpen) { + this._elContent.style.width = wColl+"px"; + this._elContent.style.height = hColl+"px"; + } + // Else, set it to its last known size. + else { + this._elContent.style.width = wExp+"px"; + this._elContent.style.height = hExp+"px"; + } + + elContainer.removeChild(oClone); + oClone = null; + + var oSelf = this; + var onAnimComplete = function() { + // Finish the collapse + oAnim.onComplete.unsubscribeAll(); + + if(bShow) { + oSelf._toggleContainerHelpers(true); + oSelf._bContainerOpen = bShow; + oSelf.containerExpandEvent.fire(oSelf); + } + else { + oSelf._elContent.style.display = "none"; + oSelf._bContainerOpen = bShow; + oSelf.containerCollapseEvent.fire(oSelf); + } + }; + + // Display container and animate it + this._toggleContainerHelpers(false); // Bug 1424486: Be early to hide, late to show; + this._elContent.style.display = ""; + oAnim.onComplete.subscribe(onAnimComplete); + oAnim.animate(); + } + // Else don't animate, just show or hide + else { + if(bShow) { + this._elContent.style.display = ""; + this._toggleContainerHelpers(true); + this._bContainerOpen = bShow; + this.containerExpandEvent.fire(this); + } + else { + this._toggleContainerHelpers(false); + this._elContent.style.display = "none"; + this._bContainerOpen = bShow; + this.containerCollapseEvent.fire(this); + } + } + +}; + +/** + * Toggles the highlight on or off for an item in the container, and also cleans + * up highlighting of any previous item. + * + * @method _toggleHighlight + * @param elNewListItem {HTMLElement} The <li> element item to receive highlight behavior. + * @param sType {String} Type "mouseover" will toggle highlight on, and "mouseout" will toggle highlight off. + * @private + */ +YAHOO.widget.AutoComplete.prototype._toggleHighlight = function(elNewListItem, sType) { + if(elNewListItem) { + var sHighlight = this.highlightClassName; + if(this._elCurListItem) { + // Remove highlight from old item + YAHOO.util.Dom.removeClass(this._elCurListItem, sHighlight); + this._elCurListItem = null; + } + + if((sType == "to") && sHighlight) { + // Apply highlight to new item + YAHOO.util.Dom.addClass(elNewListItem, sHighlight); + this._elCurListItem = elNewListItem; + } + } +}; + +/** + * Toggles the pre-highlight on or off for an item in the container. + * + * @method _togglePrehighlight + * @param elNewListItem {HTMLElement} The <li> element item to receive highlight behavior. + * @param sType {String} Type "mouseover" will toggle highlight on, and "mouseout" will toggle highlight off. + * @private + */ +YAHOO.widget.AutoComplete.prototype._togglePrehighlight = function(elNewListItem, sType) { + if(elNewListItem == this._elCurListItem) { + return; + } + + var sPrehighlight = this.prehighlightClassName; + if((sType == "mouseover") && sPrehighlight) { + // Apply prehighlight to new item + YAHOO.util.Dom.addClass(elNewListItem, sPrehighlight); + } + else { + // Remove prehighlight from old item + YAHOO.util.Dom.removeClass(elNewListItem, sPrehighlight); + } +}; + +/** + * Updates the text input box value with selected query result. If a delimiter + * has been defined, then the value gets appended with the delimiter. + * + * @method _updateValue + * @param elListItem {HTMLElement} The <li> element item with which to update the value. + * @private + */ +YAHOO.widget.AutoComplete.prototype._updateValue = function(elListItem) { + if(!this.suppressInputUpdate) { + var elTextbox = this._elTextbox; + var sDelimChar = (this.delimChar) ? (this.delimChar[0] || this.delimChar) : null; + var sResultMatch = elListItem._sResultMatch; + + // Calculate the new value + var sNewValue = ""; + if(sDelimChar) { + // Preserve selections from past queries + sNewValue = this._sPastSelections; + // Add new selection plus delimiter + sNewValue += sResultMatch + sDelimChar; + if(sDelimChar != " ") { + sNewValue += " "; + } + } + else { + sNewValue = sResultMatch; + } + + // Update input field + elTextbox.value = sNewValue; + + // Scroll to bottom of textarea if necessary + if(elTextbox.type == "textarea") { + elTextbox.scrollTop = elTextbox.scrollHeight; + } + + // Move cursor to end + var end = elTextbox.value.length; + this._selectText(elTextbox,end,end); + + this._elCurListItem = elListItem; + } +}; + +/** + * Selects a result item from the container + * + * @method _selectItem + * @param elListItem {HTMLElement} The selected <li> element item. + * @private + */ +YAHOO.widget.AutoComplete.prototype._selectItem = function(elListItem) { + this._bItemSelected = true; + this._updateValue(elListItem); + this._sPastSelections = this._elTextbox.value; + this._clearInterval(); + this.itemSelectEvent.fire(this, elListItem, elListItem._oResultData); + this._toggleContainer(false); +}; + +/** + * If an item is highlighted in the container, the right arrow key jumps to the + * end of the textbox and selects the highlighted item, otherwise the container + * is closed. + * + * @method _jumpSelection + * @private + */ +YAHOO.widget.AutoComplete.prototype._jumpSelection = function() { + if(this._elCurListItem) { + this._selectItem(this._elCurListItem); + } + else { + this._toggleContainer(false); + } +}; + +/** + * Triggered by up and down arrow keys, changes the current highlighted + * <li> element item. Scrolls container if necessary. + * + * @method _moveSelection + * @param nKeyCode {Number} Code of key pressed. + * @private + */ +YAHOO.widget.AutoComplete.prototype._moveSelection = function(nKeyCode) { + if(this._bContainerOpen) { + // Determine current item's id number + var elCurListItem = this._elCurListItem; + var nCurItemIndex = -1; + + if(elCurListItem) { + nCurItemIndex = elCurListItem._nItemIndex; + } + + var nNewItemIndex = (nKeyCode == 40) ? + (nCurItemIndex + 1) : (nCurItemIndex - 1); + + // Out of bounds + if(nNewItemIndex < -2 || nNewItemIndex >= this._nDisplayedItems) { + return; + } + + if(elCurListItem) { + // Unhighlight current item + this._toggleHighlight(elCurListItem, "from"); + this.itemArrowFromEvent.fire(this, elCurListItem); + } + if(nNewItemIndex == -1) { + // Go back to query (remove type-ahead string) + if(this.delimChar) { + this._elTextbox.value = this._sPastSelections + this._sCurQuery; + } + else { + this._elTextbox.value = this._sCurQuery; + } + return; + } + if(nNewItemIndex == -2) { + // Close container + this._toggleContainer(false); + return; + } + + var elNewListItem = this._elList.childNodes[nNewItemIndex]; + + // Scroll the container if necessary + var elContent = this._elContent; + var scrollOn = ((YAHOO.util.Dom.getStyle(elContent,"overflow") == "auto") || + (YAHOO.util.Dom.getStyle(elContent,"overflowY") == "auto")); + if(scrollOn && (nNewItemIndex > -1) && + (nNewItemIndex < this._nDisplayedItems)) { + // User is keying down + if(nKeyCode == 40) { + // Bottom of selected item is below scroll area... + if((elNewListItem.offsetTop+elNewListItem.offsetHeight) > (elContent.scrollTop + elContent.offsetHeight)) { + // Set bottom of scroll area to bottom of selected item + elContent.scrollTop = (elNewListItem.offsetTop+elNewListItem.offsetHeight) - elContent.offsetHeight; + } + // Bottom of selected item is above scroll area... + else if((elNewListItem.offsetTop+elNewListItem.offsetHeight) < elContent.scrollTop) { + // Set top of selected item to top of scroll area + elContent.scrollTop = elNewListItem.offsetTop; + + } + } + // User is keying up + else { + // Top of selected item is above scroll area + if(elNewListItem.offsetTop < elContent.scrollTop) { + // Set top of scroll area to top of selected item + this._elContent.scrollTop = elNewListItem.offsetTop; + } + // Top of selected item is below scroll area + else if(elNewListItem.offsetTop > (elContent.scrollTop + elContent.offsetHeight)) { + // Set bottom of selected item to bottom of scroll area + this._elContent.scrollTop = (elNewListItem.offsetTop+elNewListItem.offsetHeight) - elContent.offsetHeight; + } + } + } + + this._toggleHighlight(elNewListItem, "to"); + this.itemArrowToEvent.fire(this, elNewListItem); + if(this.typeAhead) { + this._updateValue(elNewListItem); + } + } +}; + +///////////////////////////////////////////////////////////////////////////// +// +// Private event handlers +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Handles <li> element mouseover events in the container. + * + * @method _onItemMouseover + * @param v {HTMLEvent} The mouseover event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +/*YAHOO.widget.AutoComplete.prototype._onItemMouseover = function(v,oSelf) { + if(oSelf.prehighlightClassName) { + oSelf._togglePrehighlight(this,"mouseover"); + } + else { + oSelf._toggleHighlight(this,"to"); + } + + oSelf.itemMouseOverEvent.fire(oSelf, this); +};*/ + +/** + * Handles <li> element mouseout events in the container. + * + * @method _onItemMouseout + * @param v {HTMLEvent} The mouseout event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +/*YAHOO.widget.AutoComplete.prototype._onItemMouseout = function(v,oSelf) { + if(oSelf.prehighlightClassName) { + oSelf._togglePrehighlight(this,"mouseout"); + } + else { + oSelf._toggleHighlight(this,"from"); + } + + oSelf.itemMouseOutEvent.fire(oSelf, this); +};*/ + +/** + * Handles <li> element click events in the container. + * + * @method _onItemMouseclick + * @param v {HTMLEvent} The click event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +/*YAHOO.widget.AutoComplete.prototype._onItemMouseclick = function(v,oSelf) { + // In case item has not been moused over + oSelf._toggleHighlight(this,"to"); + oSelf._selectItem(this); +};*/ + +/** + * Handles container mouseover events. + * + * @method _onContainerMouseover + * @param v {HTMLEvent} The mouseover event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onContainerMouseover = function(v,oSelf) { + var elTarget = YAHOO.util.Event.getTarget(v); + var elTag = elTarget.nodeName.toLowerCase(); + while(elTarget && (elTag != "table")) { + switch(elTag) { + case "body": + return; + case "li": + if(oSelf.prehighlightClassName) { + oSelf._togglePrehighlight(elTarget,"mouseover"); + } + else { + oSelf._toggleHighlight(elTarget,"to"); + } + + oSelf.itemMouseOverEvent.fire(oSelf, elTarget); + break; + case "div": + if(YAHOO.util.Dom.hasClass(elTarget,"yui-ac-container")) { + oSelf._bOverContainer = true; + return; + } + break; + default: + break; + } + + elTarget = elTarget.parentNode; + if(elTarget) { + elTag = elTarget.nodeName.toLowerCase(); + } + } +}; + +/** + * Handles container mouseout events. + * + * @method _onContainerMouseout + * @param v {HTMLEvent} The mouseout event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onContainerMouseout = function(v,oSelf) { + var elTarget = YAHOO.util.Event.getTarget(v); + var elTag = elTarget.nodeName.toLowerCase(); + while(elTarget && (elTag != "table")) { + switch(elTag) { + case "body": + return; + case "li": + if(oSelf.prehighlightClassName) { + oSelf._togglePrehighlight(elTarget,"mouseout"); + } + else { + oSelf._toggleHighlight(elTarget,"from"); + } + + oSelf.itemMouseOutEvent.fire(oSelf, elTarget); + break; + case "ul": + oSelf._toggleHighlight(oSelf._elCurListItem,"to"); + break; + case "div": + if(YAHOO.util.Dom.hasClass(elTarget,"yui-ac-container")) { + oSelf._bOverContainer = false; + return; + } + break; + default: + break; + } + + elTarget = elTarget.parentNode; + if(elTarget) { + elTag = elTarget.nodeName.toLowerCase(); + } + } +}; + +/** + * Handles container click events. + * + * @method _onContainerClick + * @param v {HTMLEvent} The click event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onContainerClick = function(v,oSelf) { + var elTarget = YAHOO.util.Event.getTarget(v); + var elTag = elTarget.nodeName.toLowerCase(); + while(elTarget && (elTag != "table")) { + switch(elTag) { + case "body": + return; + case "li": + // In case item has not been moused over + oSelf._toggleHighlight(elTarget,"to"); + oSelf._selectItem(elTarget); + return; + default: + break; + } + + elTarget = elTarget.parentNode; + if(elTarget) { + elTag = elTarget.nodeName.toLowerCase(); + } + } +}; + + +/** + * Handles container scroll events. + * + * @method _onContainerScroll + * @param v {HTMLEvent} The scroll event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onContainerScroll = function(v,oSelf) { + oSelf._elTextbox.focus(); +}; + +/** + * Handles container resize events. + * + * @method _onContainerResize + * @param v {HTMLEvent} The resize event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onContainerResize = function(v,oSelf) { + oSelf._toggleContainerHelpers(oSelf._bContainerOpen); +}; + + +/** + * Handles textbox keydown events of functional keys, mainly for UI behavior. + * + * @method _onTextboxKeyDown + * @param v {HTMLEvent} The keydown event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onTextboxKeyDown = function(v,oSelf) { + var nKeyCode = v.keyCode; + + // Clear timeout + if(oSelf._nTypeAheadDelayID != -1) { + clearTimeout(oSelf._nTypeAheadDelayID); + } + + switch (nKeyCode) { + case 9: // tab + if(!YAHOO.env.ua.opera && (navigator.userAgent.toLowerCase().indexOf("mac") == -1) || (YAHOO.env.ua.webkit>420)) { + // select an item or clear out + if(oSelf._elCurListItem) { + if(oSelf.delimChar && (oSelf._nKeyCode != nKeyCode)) { + if(oSelf._bContainerOpen) { + YAHOO.util.Event.stopEvent(v); + } + } + oSelf._selectItem(oSelf._elCurListItem); + } + else { + oSelf._toggleContainer(false); + } + } + break; + case 13: // enter + if(!YAHOO.env.ua.opera && (navigator.userAgent.toLowerCase().indexOf("mac") == -1) || (YAHOO.env.ua.webkit>420)) { + if(oSelf._elCurListItem) { + if(oSelf._nKeyCode != nKeyCode) { + if(oSelf._bContainerOpen) { + YAHOO.util.Event.stopEvent(v); + } + } + oSelf._selectItem(oSelf._elCurListItem); + } + else { + oSelf._toggleContainer(false); + } + } + break; + case 27: // esc + oSelf._toggleContainer(false); + return; + case 39: // right + oSelf._jumpSelection(); + break; + case 38: // up + if(oSelf._bContainerOpen) { + YAHOO.util.Event.stopEvent(v); + oSelf._moveSelection(nKeyCode); + } + break; + case 40: // down + if(oSelf._bContainerOpen) { + YAHOO.util.Event.stopEvent(v); + oSelf._moveSelection(nKeyCode); + } + break; + default: + oSelf._bItemSelected = false; + oSelf._toggleHighlight(oSelf._elCurListItem, "from"); + + oSelf.textboxKeyEvent.fire(oSelf, nKeyCode); + break; + } + + if(nKeyCode === 18){ + oSelf._enableIntervalDetection(); + } + oSelf._nKeyCode = nKeyCode; +}; + +/** + * Handles textbox keypress events. + * @method _onTextboxKeyPress + * @param v {HTMLEvent} The keypress event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onTextboxKeyPress = function(v,oSelf) { + var nKeyCode = v.keyCode; + + // Expose only to non SF3 (bug 1978549) Mac browsers (bug 790337) and Opera browsers (bug 583531), + // where stopEvent is ineffective on keydown events + if(YAHOO.env.ua.opera || (navigator.userAgent.toLowerCase().indexOf("mac") != -1) && (YAHOO.env.ua.webkit < 420)) { + switch (nKeyCode) { + case 9: // tab + // select an item or clear out + if(oSelf._bContainerOpen) { + if(oSelf.delimChar) { + YAHOO.util.Event.stopEvent(v); + } + if(oSelf._elCurListItem) { + oSelf._selectItem(oSelf._elCurListItem); + } + else { + oSelf._toggleContainer(false); + } + } + break; + case 13: // enter + if(oSelf._bContainerOpen) { + YAHOO.util.Event.stopEvent(v); + if(oSelf._elCurListItem) { + oSelf._selectItem(oSelf._elCurListItem); + } + else { + oSelf._toggleContainer(false); + } + } + break; + default: + break; + } + } + + //TODO: (?) limit only to non-IE, non-Mac-FF for Korean IME support (bug 811948) + // Korean IME detected + else if(nKeyCode == 229) { + oSelf._enableIntervalDetection(); + } +}; + +/** + * Handles textbox keyup events to trigger queries. + * + * @method _onTextboxKeyUp + * @param v {HTMLEvent} The keyup event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onTextboxKeyUp = function(v,oSelf) { + var sText = this.value; //string in textbox + + // Check to see if any of the public properties have been updated + oSelf._initProps(); + + // Filter out chars that don't trigger queries + var nKeyCode = v.keyCode; + if(oSelf._isIgnoreKey(nKeyCode)) { + return; + } + + // Clear previous timeout + /*if(oSelf._nTypeAheadDelayID != -1) { + clearTimeout(oSelf._nTypeAheadDelayID); + }*/ + if(oSelf._nDelayID != -1) { + clearTimeout(oSelf._nDelayID); + } + + // Set new timeout + oSelf._nDelayID = setTimeout(function(){ + oSelf._sendQuery(sText); + },(oSelf.queryDelay * 1000)); + + //= nDelayID; + //else { + // No delay so send request immediately + //oSelf._sendQuery(sText); + //} +}; + +/** + * Handles text input box receiving focus. + * + * @method _onTextboxFocus + * @param v {HTMLEvent} The focus event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onTextboxFocus = function (v,oSelf) { + // Start of a new interaction + if(!oSelf._bFocused) { + oSelf._elTextbox.setAttribute("autocomplete","off"); + oSelf._bFocused = true; + oSelf._sInitInputValue = oSelf._elTextbox.value; + oSelf.textboxFocusEvent.fire(oSelf); + } +}; + +/** + * Handles text input box losing focus. + * + * @method _onTextboxBlur + * @param v {HTMLEvent} The focus event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onTextboxBlur = function (v,oSelf) { + // Don't treat as a blur if it was a selection via mouse click + if(!oSelf._bOverContainer || (oSelf._nKeyCode == 9)) { + // Current query needs to be validated as a selection + if(!oSelf._bItemSelected) { + var elMatchListItem = oSelf._textMatchesOption(); + // Container is closed or current query doesn't match any result + if(!oSelf._bContainerOpen || (oSelf._bContainerOpen && (elMatchListItem === null))) { + // Force selection is enabled so clear the current query + if(oSelf.forceSelection) { + oSelf._clearSelection(); + } + // Treat current query as a valid selection + else { + oSelf.unmatchedItemSelectEvent.fire(oSelf, oSelf._sCurQuery); + } + } + // Container is open and current query matches a result + else { + // Force a selection when textbox is blurred with a match + if(oSelf.forceSelection) { + oSelf._selectItem(elMatchListItem); + } + } + } + + if(oSelf._bContainerOpen) { + oSelf._toggleContainer(false); + } + oSelf._clearInterval(); + oSelf._bFocused = false; + if(oSelf._sInitInputValue !== oSelf._elTextbox.value) { + oSelf.textboxChangeEvent.fire(oSelf); + } + oSelf.textboxBlurEvent.fire(oSelf); + } +}; + +/** + * Handles window unload event. + * + * @method _onWindowUnload + * @param v {HTMLEvent} The unload event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onWindowUnload = function(v,oSelf) { + if(oSelf && oSelf._elTextbox && oSelf.allowBrowserAutocomplete) { + oSelf._elTextbox.setAttribute("autocomplete","on"); + } +}; + +///////////////////////////////////////////////////////////////////////////// +// +// Deprecated for Backwards Compatibility +// +///////////////////////////////////////////////////////////////////////////// +/** + * @method doBeforeSendQuery + * @deprecated Use generateRequest. + */ +YAHOO.widget.AutoComplete.prototype.doBeforeSendQuery = function(sQuery) { + return this.generateRequest(sQuery); +}; + +/** + * @method getListItems + * @deprecated Use getListEl().childNodes. + */ +YAHOO.widget.AutoComplete.prototype.getListItems = function() { + var allListItemEls = [], + els = this._elList.childNodes; + for(var i=els.length-1; i>=0; i--) { + allListItemEls[i] = els[i]; + } + return allListItemEls; +}; + +///////////////////////////////////////////////////////////////////////// +// +// Private static methods +// +///////////////////////////////////////////////////////////////////////// + +/** + * Clones object literal or array of object literals. + * + * @method AutoComplete._cloneObject + * @param o {Object} Object. + * @private + * @static + */ +YAHOO.widget.AutoComplete._cloneObject = function(o) { + if(!YAHOO.lang.isValue(o)) { + return o; + } + + var copy = {}; + + if(YAHOO.lang.isFunction(o)) { + copy = o; + } + else if(YAHOO.lang.isArray(o)) { + var array = []; + for(var i=0,len=o.length;i is clicked. + ++ The name and value of selected MenuItems in submenus of a Button's Menu are now part of their + parent form's data when the form is submitted. + ++ For Button's of type "menu" and "split" created using an existing or + - + - ... TEXT/HTML ... + - ... ... + - ... ... + ++ The id of a Button instance can now match that of its source element. + ++ CSS changes: + + 1) All Buttons have a "yui-" prefix as opposed to "yui": + + 2.2.2 | 2.3 + ------------------------- + .yuibutton | .yui-button + + + 2) Each Button type has its own class name with a "yui-" prefix and + "-button" suffix IN ADDITION TO the default "yui-button" class name: + + 2.2.2 | 2.3 + ------------------------------------------ + .yuibutton.splitbutton | .yui-split-button + .yuibutton.menubutton | .yui-menu-button + + * Allows for the definition of generic styles that apply to all buttons, + while providing a means for uniquely styling buttons of a specific type. + + + 3) For states that are common to all Buttons, two classes are applied: a + generic class name (i.e. yui-button-[state]) and a type-specific state class + name (yui-[type]-button-[state]): + + 2.2.2 | 2.3 + ------------------------------------------- + .yuibutton.focus | .yui-button-focus + .yuibutton.radio.focus | .yui-radio-button-focus + + * States common to all Button types are: + + focus + + hover + + active + + disabled + + ** Allows for the definition of generic styles that apply to all states of + all buttons, while providing a means for uniquely styling states for + buttons of a specific type. + + + 4) Buttons of type "radio" and "checkbox" have two classes applied to + represent their "checked" state: a generic class name + (i.e. yui-button-checked) and a type-specific class + name (yui-[type]-button-checked): + + 2.2.2 | 2.3 + ------------------------------------------- + .yuibutton.checked | .yui-button-checked + .yuibutton.radio.checked | .yui-radio-button-checked + .yuibutton.checkbox.checked | .yui-checkbox-button-checked + + ** This allows for the definition of a universal style for all Buttons that + have a "checked" state or the ability to define a type-specific style for + the "checked" state. + + + 5) States that are specific to a particular type only get a type-specific + state class name. Currently this only applies to the "splitbutton" type: + + 2.2.2 | 2.3 + ------------------------------------------- + .yuibutton.activeoption | .yui-split-button-activeoption + + + 6) The "ie6" class name is removed. + + +*** Version 2.2.2 *** + ++ No changes + + +*** Version 2.2.1 *** + +Added the following features: +----------------------------- + ++ Added "getHiddenField" method to YAHOO.widget.Button. + + +Fixed the following bugs: +------------------------- + ++ Removed built-in use of the Event utility's "onAvailable" method from the + constructor of Button and ButtonGroup as it was preventing the addition of + event listeners on instances created from existing markup. Going forward + Button and ButtonGroup instances created from existing markup can only be + instantiated once their source HTML element is available in the DOM. The + Button examples illustrate how this can be accomplished. + ++ Modified code so that disabled Button instances no longer fire DOM events. + ++ Pressing the enter key while focused on a form field whose parent form + contains a Button instance of type "submit" will now automatically submit + the form using the first Button instance of type "submit". + ++ Clicking a Button instance of type="submit" will now cause the Button's + parent form's "submit" event to fire. + ++ Modified Button CSS so that the filter used to apply alpha transparency to + a Button's background PNG is only used by IE 6. The previous code was + enabling IE's Alpha image loader for IE 7 in Quirks mode. + ++ Fixed documentation error for "getForm" method. + + +Changes: +-------- + ++ Made the "submitForm" method of YAHOO.widget.Button public (was + previously protected). + ++ Removed "init" event and corresponding "oninit" configuration attribute + from YAHOO.widget.Button and YAHOO.widget.ButtonGroup. + ++ Added the CSS class "ie6" to button.css. This classname is append to root + DOM element of Button instances created with IE 6. By default this class + is used to apply a filter that gives alpha transparency to a Button's + background PNG. + + + +*** Version 2.2.0 *** + +* Button Control introduced diff --git a/webdir/javascript/yui/button/assets/button-core.css b/webdir/javascript/yui/button/assets/button-core.css new file mode 100644 index 0000000..1304886 --- /dev/null +++ b/webdir/javascript/yui/button/assets/button-core.css @@ -0,0 +1,44 @@ +/* +Copyright (c) 2008, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.6.0 +*/ +.yui-button { + + display: -moz-inline-box; /* Gecko */ + display: inline-block; /* IE, Opera and Safari */ + vertical-align: text-bottom; + +} + +.yui-button .first-child { + + display: block; + *display: inline-block; /* IE */ + +} + +.yui-button button, +.yui-button a { + + display: block; + *display: inline-block; /* IE */ + border: none; + margin: 0; + +} + +.yui-button button { + + background-color: transparent; + *overflow: visible; /* Remove superfluous padding for IE */ + cursor: pointer; + +} + +.yui-button a { + + text-decoration: none; + +} \ No newline at end of file diff --git a/webdir/javascript/yui/button/assets/skins/sam/button-skin.css b/webdir/javascript/yui/button/assets/skins/sam/button-skin.css new file mode 100644 index 0000000..721d5ff --- /dev/null +++ b/webdir/javascript/yui/button/assets/skins/sam/button-skin.css @@ -0,0 +1,240 @@ +/* +Copyright (c) 2008, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.6.0 +*/ +.yui-skin-sam .yui-button { + + border-width: 1px 0; + border-style: solid; + border-color: #808080; + background: url(../../../../assets/skins/sam/sprite.png) repeat-x 0 0; + margin: auto .25em; + +} + +.yui-skin-sam .yui-button .first-child { + + border-width: 0 1px; + border-style: solid; + border-color: #808080; + margin: 0 -1px; + *position: relative; /* Necessary to get negative margins working in IE */ + *left: -1px; + + /* + Don't apply rounded corners for IE 6 (Quirks and Standards Mode) and IE 7 Quirks Mode + since it causes more problems than its worth. + */ + _margin: 0; + _position: static; + +} + +.yui-skin-sam .yui-button button, +.yui-skin-sam .yui-button a { + + padding: 0 10px; + font-size: 93%; /* 12px */ + line-height: 2; /* ~24px */ + *line-height: 1.7; /* For IE */ + min-height: 2em; /* For Gecko */ + *min-height: auto; /* For IE */ + color: #000; + +} + +.yui-skin-sam .yui-button a { + + /* + Necessary to get Buttons of type "link" to be the correct + height in IE. + */ + *line-height: 1.875; + *padding-bottom: 1px; + +} + +.yui-skin-sam .yui-split-button button, +.yui-skin-sam .yui-menu-button button { + + padding-right: 20px; + background-position: right center; + background-repeat: no-repeat; + +} + +.yui-skin-sam .yui-menu-button button { + + background-image: url(menu-button-arrow.png); + +} + +.yui-skin-sam .yui-split-button button { + + background-image: url(split-button-arrow.png); + +} + + +/* Focus state */ + + +.yui-skin-sam .yui-button-focus { + + border-color: #7D98B8; + background-position: 0 -1300px; + +} + +.yui-skin-sam .yui-button-focus .first-child { + + border-color: #7D98B8; + +} + +.yui-skin-sam .yui-button-focus button, +.yui-skin-sam .yui-button-focus a { + + color: #000; + +} + +.yui-skin-sam .yui-split-button-focus button { + + background-image: url(split-button-arrow-focus.png); + +} + + +/* Hover state */ + +.yui-skin-sam .yui-button-hover { + + border-color: #7D98B8; + background-position: 0 -1300px; + +} + +.yui-skin-sam .yui-button-hover .first-child { + + border-color: #7D98B8; + +} + +.yui-skin-sam .yui-button-hover button, +.yui-skin-sam .yui-button-hover a { + + color: #000; + +} + +.yui-skin-sam .yui-split-button-hover button { + + background-image: url(split-button-arrow-hover.png); + +} + + +/* Active state */ + +.yui-skin-sam .yui-button-active { + + border-color: #7D98B8; + background-position: 0 -1700px; + +} + +.yui-skin-sam .yui-button-active .first-child { + + border-color: #7D98B8; + +} + +.yui-skin-sam .yui-button-active button, +.yui-skin-sam .yui-button-active a { + + color: #000; + +} + +.yui-skin-sam .yui-split-button-activeoption { + + border-color: #808080; + background-position: 0 0; + +} + +.yui-skin-sam .yui-split-button-activeoption .first-child { + + border-color: #808080; + +} + +.yui-skin-sam .yui-split-button-activeoption button { + + background-image: url(split-button-arrow-active.png); + +} + + +/* Checked state */ + +.yui-skin-sam .yui-radio-button-checked, +.yui-skin-sam .yui-checkbox-button-checked { + + border-color: #304369; + background-position: 0 -1400px; + +} + +.yui-skin-sam .yui-radio-button-checked .first-child, +.yui-skin-sam .yui-checkbox-button-checked .first-child { + + border-color: #304369; + +} + +.yui-skin-sam .yui-radio-button-checked button, +.yui-skin-sam .yui-checkbox-button-checked button { + + color: #fff; + +} + + +/* Disabled state */ + +.yui-skin-sam .yui-button-disabled { + + border-color: #ccc; + background-position: 0 -1500px; + +} + +.yui-skin-sam .yui-button-disabled .first-child { + + border-color: #ccc; + +} + +.yui-skin-sam .yui-button-disabled button, +.yui-skin-sam .yui-button-disabled a { + + color: #A6A6A6; + cursor: default; + +} + +.yui-skin-sam .yui-menu-button-disabled button { + + background-image: url(menu-button-arrow-disabled.png); + +} + +.yui-skin-sam .yui-split-button-disabled button { + + background-image: url(split-button-arrow-disabled.png); + +} \ No newline at end of file diff --git a/webdir/javascript/yui/button/assets/skins/sam/button.css b/webdir/javascript/yui/button/assets/skins/sam/button.css new file mode 100644 index 0000000..96033e2 --- /dev/null +++ b/webdir/javascript/yui/button/assets/skins/sam/button.css @@ -0,0 +1,7 @@ +/* +Copyright (c) 2008, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.6.0 +*/ +.yui-button{display:-moz-inline-box;display:inline-block;vertical-align:text-bottom;}.yui-button .first-child{display:block;*display:inline-block;}.yui-button button,.yui-button a{display:block;*display:inline-block;border:none;margin:0;}.yui-button button{background-color:transparent;*overflow:visible;cursor:pointer;}.yui-button a{text-decoration:none;}.yui-skin-sam .yui-button{border-width:1px 0;border-style:solid;border-color:#808080;background:url(../../../../assets/skins/sam/sprite.png) repeat-x 0 0;margin:auto .25em;}.yui-skin-sam .yui-button .first-child{border-width:0 1px;border-style:solid;border-color:#808080;margin:0 -1px;*position:relative;*left:-1px;_margin:0;_position:static;}.yui-skin-sam .yui-button button,.yui-skin-sam .yui-button a{padding:0 10px;font-size:93%;line-height:2;*line-height:1.7;min-height:2em;*min-height:auto;color:#000;}.yui-skin-sam .yui-button a{*line-height:1.875;*padding-bottom:1px;}.yui-skin-sam .yui-split-button button,.yui-skin-sam .yui-menu-button button{padding-right:20px;background-position:right center;background-repeat:no-repeat;}.yui-skin-sam .yui-menu-button button{background-image:url(menu-button-arrow.png);}.yui-skin-sam .yui-split-button button{background-image:url(split-button-arrow.png);}.yui-skin-sam .yui-button-focus{border-color:#7D98B8;background-position:0 -1300px;}.yui-skin-sam .yui-button-focus .first-child{border-color:#7D98B8;}.yui-skin-sam .yui-button-focus button,.yui-skin-sam .yui-button-focus a{color:#000;}.yui-skin-sam .yui-split-button-focus button{background-image:url(split-button-arrow-focus.png);}.yui-skin-sam .yui-button-hover{border-color:#7D98B8;background-position:0 -1300px;}.yui-skin-sam .yui-button-hover .first-child{border-color:#7D98B8;}.yui-skin-sam .yui-button-hover button,.yui-skin-sam .yui-button-hover a{color:#000;}.yui-skin-sam .yui-split-button-hover button{background-image:url(split-button-arrow-hover.png);}.yui-skin-sam .yui-button-active{border-color:#7D98B8;background-position:0 -1700px;}.yui-skin-sam .yui-button-active .first-child{border-color:#7D98B8;}.yui-skin-sam .yui-button-active button,.yui-skin-sam .yui-button-active a{color:#000;}.yui-skin-sam .yui-split-button-activeoption{border-color:#808080;background-position:0 0;}.yui-skin-sam .yui-split-button-activeoption .first-child{border-color:#808080;}.yui-skin-sam .yui-split-button-activeoption button{background-image:url(split-button-arrow-active.png);}.yui-skin-sam .yui-radio-button-checked,.yui-skin-sam .yui-checkbox-button-checked{border-color:#304369;background-position:0 -1400px;}.yui-skin-sam .yui-radio-button-checked .first-child,.yui-skin-sam .yui-checkbox-button-checked .first-child{border-color:#304369;}.yui-skin-sam .yui-radio-button-checked button,.yui-skin-sam .yui-checkbox-button-checked button{color:#fff;}.yui-skin-sam .yui-button-disabled{border-color:#ccc;background-position:0 -1500px;}.yui-skin-sam .yui-button-disabled .first-child{border-color:#ccc;}.yui-skin-sam .yui-button-disabled button,.yui-skin-sam .yui-button-disabled a{color:#A6A6A6;cursor:default;}.yui-skin-sam .yui-menu-button-disabled button{background-image:url(menu-button-arrow-disabled.png);}.yui-skin-sam .yui-split-button-disabled button{background-image:url(split-button-arrow-disabled.png);} diff --git a/webdir/javascript/yui/button/assets/skins/sam/menu-button-arrow-disabled.png b/webdir/javascript/yui/button/assets/skins/sam/menu-button-arrow-disabled.png new file mode 100644 index 0000000..8cef2ab Binary files /dev/null and b/webdir/javascript/yui/button/assets/skins/sam/menu-button-arrow-disabled.png differ diff --git a/webdir/javascript/yui/button/assets/skins/sam/menu-button-arrow.png b/webdir/javascript/yui/button/assets/skins/sam/menu-button-arrow.png new file mode 100644 index 0000000..f03dfee Binary files /dev/null and b/webdir/javascript/yui/button/assets/skins/sam/menu-button-arrow.png differ diff --git a/webdir/javascript/yui/button/assets/skins/sam/split-button-arrow-active.png b/webdir/javascript/yui/button/assets/skins/sam/split-button-arrow-active.png new file mode 100644 index 0000000..fa58c50 Binary files /dev/null and b/webdir/javascript/yui/button/assets/skins/sam/split-button-arrow-active.png differ diff --git a/webdir/javascript/yui/button/assets/skins/sam/split-button-arrow-disabled.png b/webdir/javascript/yui/button/assets/skins/sam/split-button-arrow-disabled.png new file mode 100644 index 0000000..0a6a82c Binary files /dev/null and b/webdir/javascript/yui/button/assets/skins/sam/split-button-arrow-disabled.png differ diff --git a/webdir/javascript/yui/button/assets/skins/sam/split-button-arrow-focus.png b/webdir/javascript/yui/button/assets/skins/sam/split-button-arrow-focus.png new file mode 100644 index 0000000..167d71e Binary files /dev/null and b/webdir/javascript/yui/button/assets/skins/sam/split-button-arrow-focus.png differ diff --git a/webdir/javascript/yui/button/assets/skins/sam/split-button-arrow-hover.png b/webdir/javascript/yui/button/assets/skins/sam/split-button-arrow-hover.png new file mode 100644 index 0000000..167d71e Binary files /dev/null and b/webdir/javascript/yui/button/assets/skins/sam/split-button-arrow-hover.png differ diff --git a/webdir/javascript/yui/button/assets/skins/sam/split-button-arrow.png b/webdir/javascript/yui/button/assets/skins/sam/split-button-arrow.png new file mode 100644 index 0000000..b33a93f Binary files /dev/null and b/webdir/javascript/yui/button/assets/skins/sam/split-button-arrow.png differ diff --git a/webdir/javascript/yui/button/button-debug.js b/webdir/javascript/yui/button/button-debug.js new file mode 100644 index 0000000..d96ebb4 --- /dev/null +++ b/webdir/javascript/yui/button/button-debug.js @@ -0,0 +1,4859 @@ +/* +Copyright (c) 2008, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.6.0 +*/ +/** +* @module button +* @description

    The Button Control enables the creation of rich, graphical +* buttons that function like traditional HTML form buttons. Unlike +* tradition HTML form buttons, buttons created with the Button Control can have +* a label that is different from its value. With the inclusion of the optional +* Menu Control, the Button Control can also be +* used to create menu buttons and split buttons, controls that are not +* available natively in HTML. The Button Control can also be thought of as a +* way to create more visually engaging implementations of the browser's +* default radio-button and check-box controls.

    +*

    The Button Control supports the following types:

    +*
    +*
    push
    +*
    Basic push button that can execute a user-specified command when +* pressed.
    +*
    link
    +*
    Navigates to a specified url when pressed.
    +*
    submit
    +*
    Submits the parent form when pressed.
    +*
    reset
    +*
    Resets the parent form when pressed.
    +*
    checkbox
    +*
    Maintains a "checked" state that can be toggled on and off.
    +*
    radio
    +*
    Maintains a "checked" state that can be toggled on and off. Use with +* the ButtonGroup class to create a set of controls that are mutually +* exclusive; checking one button in the set will uncheck all others in +* the group.
    +*
    menu
    +*
    When pressed will show/hide a menu.
    +*
    split
    +*
    Can execute a user-specified command or display a menu when pressed.
    +*
    +* @title Button +* @namespace YAHOO.widget +* @requires yahoo, dom, element, event +* @optional container, menu +*/ + + +(function () { + + + /** + * The Button class creates a rich, graphical button. + * @param {String} p_oElement String specifying the id attribute of the + * <input>, <button>, + * <a>, or <span> element to + * be used to create the button. + * @param {HTMLInputElement| + * HTMLButtonElement|HTMLElement} p_oElement Object reference for the + * <input>, <button>, + * <a>, or <span> element to be + * used to create the button. + * @param {Object} p_oElement Object literal specifying a set of + * configuration attributes used to create the button. + * @param {Object} p_oAttributes Optional. Object literal specifying a set + * of configuration attributes used to create the button. + * @namespace YAHOO.widget + * @class Button + * @constructor + * @extends YAHOO.util.Element + */ + + + + // Shorthard for utilities + + var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event, + Lang = YAHOO.lang, + UA = YAHOO.env.ua, + Overlay = YAHOO.widget.Overlay, + Menu = YAHOO.widget.Menu, + + + // Private member variables + + m_oButtons = {}, // Collection of all Button instances + m_oOverlayManager = null, // YAHOO.widget.OverlayManager instance + m_oSubmitTrigger = null, // The button that submitted the form + m_oFocusedButton = null; // The button that has focus + + + + // Private methods + + + + /** + * @method createInputElement + * @description Creates an <input> element of the + * specified type. + * @private + * @param {String} p_sType String specifying the type of + * <input> element to create. + * @param {String} p_sName String specifying the name of + * <input> element to create. + * @param {String} p_sValue String specifying the value of + * <input> element to create. + * @param {String} p_bChecked Boolean specifying if the + * <input> element is to be checked. + * @return {HTMLInputElement} + */ + function createInputElement(p_sType, p_sName, p_sValue, p_bChecked) { + + var oInput, + sInput; + + if (Lang.isString(p_sType) && Lang.isString(p_sName)) { + + if (UA.ie) { + + /* + For IE it is necessary to create the element with the + "type," "name," "value," and "checked" properties set all + at once. + */ + + sInput = "<input> or <a>) that + * map to Button configuration attributes and sets them into a collection + * that is passed to the Button constructor. + * @private + * @param {HTMLInputElement|HTMLAnchorElement} p_oElement Object reference to the HTML + * element (either <input> or <span> + * ) used to create the button. + * @param {Object} p_oAttributes Object reference for the collection of + * configuration attributes used to create the button. + */ + function setAttributesFromSrcElement(p_oElement, p_oAttributes) { + + var sSrcElementNodeName = p_oElement.nodeName.toUpperCase(), + me = this, + oAttribute, + oRootNode, + sText; + + + /** + * @method setAttributeFromDOMAttribute + * @description Gets the value of the specified DOM attribute and sets it + * into the collection of configuration attributes used to configure + * the button. + * @private + * @param {String} p_sAttribute String representing the name of the + * attribute to retrieve from the DOM element. + */ + function setAttributeFromDOMAttribute(p_sAttribute) { + + if (!(p_sAttribute in p_oAttributes)) { + + /* + Need to use "getAttributeNode" instead of "getAttribute" + because using "getAttribute," IE will return the innerText + of a <button> for the value attribute + rather than the value of the "value" attribute. + */ + + oAttribute = p_oElement.getAttributeNode(p_sAttribute); + + + if (oAttribute && ("value" in oAttribute)) { + + YAHOO.log("Setting attribute \"" + p_sAttribute + + "\" using source element's attribute value of \"" + + oAttribute.value + "\"", "info", me.toString()); + + p_oAttributes[p_sAttribute] = oAttribute.value; + + } + + } + + } + + + /** + * @method setFormElementProperties + * @description Gets the value of the attributes from the form element + * and sets them into the collection of configuration attributes used to + * configure the button. + * @private + */ + function setFormElementProperties() { + + setAttributeFromDOMAttribute("type"); + + if (p_oAttributes.type == "button") { + + p_oAttributes.type = "push"; + + } + + if (!("disabled" in p_oAttributes)) { + + p_oAttributes.disabled = p_oElement.disabled; + + } + + setAttributeFromDOMAttribute("name"); + setAttributeFromDOMAttribute("value"); + setAttributeFromDOMAttribute("title"); + + } + + + switch (sSrcElementNodeName) { + + case "A": + + p_oAttributes.type = "link"; + + setAttributeFromDOMAttribute("href"); + setAttributeFromDOMAttribute("target"); + + break; + + case "INPUT": + + setFormElementProperties(); + + if (!("checked" in p_oAttributes)) { + + p_oAttributes.checked = p_oElement.checked; + + } + + break; + + case "BUTTON": + + setFormElementProperties(); + + oRootNode = p_oElement.parentNode.parentNode; + + if (Dom.hasClass(oRootNode, this.CSS_CLASS_NAME + "-checked")) { + + p_oAttributes.checked = true; + + } + + if (Dom.hasClass(oRootNode, this.CSS_CLASS_NAME + "-disabled")) { + + p_oAttributes.disabled = true; + + } + + p_oElement.removeAttribute("value"); + + p_oElement.setAttribute("type", "button"); + + break; + + } + + p_oElement.removeAttribute("id"); + p_oElement.removeAttribute("name"); + + if (!("tabindex" in p_oAttributes)) { + + p_oAttributes.tabindex = p_oElement.tabIndex; + + } + + if (!("label" in p_oAttributes)) { + + // Set the "label" property + + sText = sSrcElementNodeName == "INPUT" ? + p_oElement.value : p_oElement.innerHTML; + + + if (sText && sText.length > 0) { + + p_oAttributes.label = sText; + + } + + } + + } + + + /** + * @method initConfig + * @description Initializes the set of configuration attributes that are + * used to instantiate the button. + * @private + * @param {Object} Object representing the button's set of + * configuration attributes. + */ + function initConfig(p_oConfig) { + + var oAttributes = p_oConfig.attributes, + oSrcElement = oAttributes.srcelement, + sSrcElementNodeName = oSrcElement.nodeName.toUpperCase(), + me = this; + + + if (sSrcElementNodeName == this.NODE_NAME) { + + p_oConfig.element = oSrcElement; + p_oConfig.id = oSrcElement.id; + + Dom.getElementsBy(function (p_oElement) { + + switch (p_oElement.nodeName.toUpperCase()) { + + case "BUTTON": + case "A": + case "INPUT": + + setAttributesFromSrcElement.call(me, p_oElement, + oAttributes); + + break; + + } + + }, "*", oSrcElement); + + } + else { + + switch (sSrcElementNodeName) { + + case "BUTTON": + case "A": + case "INPUT": + + setAttributesFromSrcElement.call(this, oSrcElement, + oAttributes); + + break; + + } + + } + + } + + + + // Constructor + + YAHOO.widget.Button = function (p_oElement, p_oAttributes) { + + if (!Overlay && YAHOO.widget.Overlay) { + + Overlay = YAHOO.widget.Overlay; + + } + + + if (!Menu && YAHOO.widget.Menu) { + + Menu = YAHOO.widget.Menu; + + } + + + var fnSuperClass = YAHOO.widget.Button.superclass.constructor, + oConfig, + oElement; + + + if (arguments.length == 1 && !Lang.isString(p_oElement) && !p_oElement.nodeName) { + + if (!p_oElement.id) { + + p_oElement.id = Dom.generateId(); + + YAHOO.log("No value specified for the button's \"id\" " + + "attribute. Setting button id to \"" + p_oElement.id + + "\".", "info", this.toString()); + + } + + YAHOO.log("No source HTML element. Building the button " + + "using the set of configuration attributes.", "info", this.toString()); + + fnSuperClass.call(this, (this.createButtonElement(p_oElement.type)), p_oElement); + + } + else { + + oConfig = { element: null, attributes: (p_oAttributes || {}) }; + + + if (Lang.isString(p_oElement)) { + + oElement = Dom.get(p_oElement); + + if (oElement) { + + if (!oConfig.attributes.id) { + + oConfig.attributes.id = p_oElement; + + } + + YAHOO.log("Building the button using an existing " + + "HTML element as a source element.", "info", this.toString()); + + + oConfig.attributes.srcelement = oElement; + + initConfig.call(this, oConfig); + + + if (!oConfig.element) { + + YAHOO.log("Source element could not be used " + + "as is. Creating a new HTML element for " + + "the button.", "info", this.toString()); + + oConfig.element = this.createButtonElement(oConfig.attributes.type); + + } + + fnSuperClass.call(this, oConfig.element, oConfig.attributes); + + } + + } + else if (p_oElement.nodeName) { + + if (!oConfig.attributes.id) { + + if (p_oElement.id) { + + oConfig.attributes.id = p_oElement.id; + + } + else { + + oConfig.attributes.id = Dom.generateId(); + + YAHOO.log("No value specified for the button's " + + "\"id\" attribute. Setting button id to \"" + + oConfig.attributes.id + "\".", "info", this.toString()); + + } + + } + + YAHOO.log("Building the button using an existing HTML " + + "element as a source element.", "info", this.toString()); + + + oConfig.attributes.srcelement = p_oElement; + + initConfig.call(this, oConfig); + + + if (!oConfig.element) { + + YAHOO.log("Source element could not be used as is." + + " Creating a new HTML element for the button.", + "info", this.toString()); + + oConfig.element = this.createButtonElement(oConfig.attributes.type); + + } + + fnSuperClass.call(this, oConfig.element, oConfig.attributes); + + } + + } + + }; + + + + YAHOO.extend(YAHOO.widget.Button, YAHOO.util.Element, { + + + // Protected properties + + + /** + * @property _button + * @description Object reference to the button's internal + * <a> or <button> element. + * @default null + * @protected + * @type HTMLAnchorElement|HTMLButtonElement + */ + _button: null, + + + /** + * @property _menu + * @description Object reference to the button's menu. + * @default null + * @protected + * @type {YAHOO.widget.Overlay| + * YAHOO.widget.Menu} + */ + _menu: null, + + + /** + * @property _hiddenFields + * @description Object reference to the <input> + * element, or array of HTML form elements used to represent the button + * when its parent form is submitted. + * @default null + * @protected + * @type HTMLInputElement|Array + */ + _hiddenFields: null, + + + /** + * @property _onclickAttributeValue + * @description Object reference to the button's current value for the + * "onclick" configuration attribute. + * @default null + * @protected + * @type Object + */ + _onclickAttributeValue: null, + + + /** + * @property _activationKeyPressed + * @description Boolean indicating if the key(s) that toggle the button's + * "active" state have been pressed. + * @default false + * @protected + * @type Boolean + */ + _activationKeyPressed: false, + + + /** + * @property _activationButtonPressed + * @description Boolean indicating if the mouse button that toggles + * the button's "active" state has been pressed. + * @default false + * @protected + * @type Boolean + */ + _activationButtonPressed: false, + + + /** + * @property _hasKeyEventHandlers + * @description Boolean indicating if the button's "blur", "keydown" and + * "keyup" event handlers are assigned + * @default false + * @protected + * @type Boolean + */ + _hasKeyEventHandlers: false, + + + /** + * @property _hasMouseEventHandlers + * @description Boolean indicating if the button's "mouseout," + * "mousedown," and "mouseup" event handlers are assigned + * @default false + * @protected + * @type Boolean + */ + _hasMouseEventHandlers: false, + + + /** + * @property _nOptionRegionX + * @description Number representing the X coordinate of the leftmost edge of the Button's + * option region. Applies only to Buttons of type "split". + * @default 0 + * @protected + * @type Number + */ + _nOptionRegionX: 0, + + + + // Constants + + + /** + * @property NODE_NAME + * @description The name of the node to be used for the button's + * root element. + * @default "SPAN" + * @final + * @type String + */ + NODE_NAME: "SPAN", + + + /** + * @property CHECK_ACTIVATION_KEYS + * @description Array of numbers representing keys that (when pressed) + * toggle the button's "checked" attribute. + * @default [32] + * @final + * @type Array + */ + CHECK_ACTIVATION_KEYS: [32], + + + /** + * @property ACTIVATION_KEYS + * @description Array of numbers representing keys that (when presed) + * toggle the button's "active" state. + * @default [13, 32] + * @final + * @type Array + */ + ACTIVATION_KEYS: [13, 32], + + + /** + * @property OPTION_AREA_WIDTH + * @description Width (in pixels) of the area of a split button that + * when pressed will display a menu. + * @default 20 + * @final + * @type Number + */ + OPTION_AREA_WIDTH: 20, + + + /** + * @property CSS_CLASS_NAME + * @description String representing the CSS class(es) to be applied to + * the button's root element. + * @default "yui-button" + * @final + * @type String + */ + CSS_CLASS_NAME: "yui-button", + + + /** + * @property RADIO_DEFAULT_TITLE + * @description String representing the default title applied to buttons + * of type "radio." + * @default "Unchecked. Click to check." + * @final + * @type String + */ + RADIO_DEFAULT_TITLE: "Unchecked. Click to check.", + + + /** + * @property RADIO_CHECKED_TITLE + * @description String representing the title applied to buttons of + * type "radio" when checked. + * @default "Checked. Click another button to uncheck" + * @final + * @type String + */ + RADIO_CHECKED_TITLE: "Checked. Click another button to uncheck", + + + /** + * @property CHECKBOX_DEFAULT_TITLE + * @description String representing the default title applied to + * buttons of type "checkbox." + * @default "Unchecked. Click to check." + * @final + * @type String + */ + CHECKBOX_DEFAULT_TITLE: "Unchecked. Click to check.", + + + /** + * @property CHECKBOX_CHECKED_TITLE + * @description String representing the title applied to buttons of type + * "checkbox" when checked. + * @default "Checked. Click to uncheck." + * @final + * @type String + */ + CHECKBOX_CHECKED_TITLE: "Checked. Click to uncheck.", + + + /** + * @property MENUBUTTON_DEFAULT_TITLE + * @description String representing the default title applied to + * buttons of type "menu." + * @default "Menu collapsed. Click to expand." + * @final + * @type String + */ + MENUBUTTON_DEFAULT_TITLE: "Menu collapsed. Click to expand.", + + + /** + * @property MENUBUTTON_MENU_VISIBLE_TITLE + * @description String representing the title applied to buttons of type + * "menu" when the button's menu is visible. + * @default "Menu expanded. Click or press Esc to collapse." + * @final + * @type String + */ + MENUBUTTON_MENU_VISIBLE_TITLE: + "Menu expanded. Click or press Esc to collapse.", + + + /** + * @property SPLITBUTTON_DEFAULT_TITLE + * @description String representing the default title applied to + * buttons of type "split." + * @default "Menu collapsed. Click inside option region or press + * Ctrl + Shift + M to show the menu." + * @final + * @type String + */ + SPLITBUTTON_DEFAULT_TITLE: ("Menu collapsed. Click inside option " + + "region or press down arrow key to show the menu."), + + + /** + * @property SPLITBUTTON_OPTION_VISIBLE_TITLE + * @description String representing the title applied to buttons of type + * "split" when the button's menu is visible. + * @default "Menu expanded. Press Esc or Ctrl + Shift + M to hide + * the menu." + * @final + * @type String + */ + SPLITBUTTON_OPTION_VISIBLE_TITLE: + "Menu expanded. Press Esc to hide the menu.", + + + /** + * @property SUBMIT_TITLE + * @description String representing the title applied to buttons of + * type "submit." + * @default "Click to submit form." + * @final + * @type String + */ + SUBMIT_TITLE: "Click to submit form.", + + + + // Protected attribute setter methods + + + /** + * @method _setType + * @description Sets the value of the button's "type" attribute. + * @protected + * @param {String} p_sType String indicating the value for the button's + * "type" attribute. + */ + _setType: function (p_sType) { + + if (p_sType == "split") { + + this.on("option", this._onOption); + + } + + }, + + + /** + * @method _setLabel + * @description Sets the value of the button's "label" attribute. + * @protected + * @param {String} p_sLabel String indicating the value for the button's + * "label" attribute. + */ + _setLabel: function (p_sLabel) { + + this._button.innerHTML = p_sLabel; + + + /* + Remove and add the default class name from the root element + for Gecko to ensure that the button shrinkwraps to the label. + Without this the button will not be rendered at the correct + width when the label changes. The most likely cause for this + bug is button's use of the Gecko-specific CSS display type of + "-moz-inline-box" to simulate "inline-block" supported by IE, + Safari and Opera. + */ + + var sClass, + nGeckoVersion = UA.gecko; + + + if (nGeckoVersion && nGeckoVersion < 1.9 && Dom.inDocument(this.get("element"))) { + + sClass = this.CSS_CLASS_NAME; + + this.removeClass(sClass); + + Lang.later(0, this, this.addClass, sClass); + + } + + }, + + + /** + * @method _setTabIndex + * @description Sets the value of the button's "tabindex" attribute. + * @protected + * @param {Number} p_nTabIndex Number indicating the value for the + * button's "tabindex" attribute. + */ + _setTabIndex: function (p_nTabIndex) { + + this._button.tabIndex = p_nTabIndex; + + }, + + + /** + * @method _setTitle + * @description Sets the value of the button's "title" attribute. + * @protected + * @param {String} p_nTabIndex Number indicating the value for + * the button's "title" attribute. + */ + _setTitle: function (p_sTitle) { + + var sTitle = p_sTitle; + + if (this.get("type") != "link") { + + if (!sTitle) { + + switch (this.get("type")) { + + case "radio": + + sTitle = this.RADIO_DEFAULT_TITLE; + + break; + + case "checkbox": + + sTitle = this.CHECKBOX_DEFAULT_TITLE; + + break; + + case "menu": + + sTitle = this.MENUBUTTON_DEFAULT_TITLE; + + break; + + case "split": + + sTitle = this.SPLITBUTTON_DEFAULT_TITLE; + + break; + + case "submit": + + sTitle = this.SUBMIT_TITLE; + + break; + + } + + } + + this._button.title = sTitle; + + } + + }, + + + /** + * @method _setDisabled + * @description Sets the value of the button's "disabled" attribute. + * @protected + * @param {Boolean} p_bDisabled Boolean indicating the value for + * the button's "disabled" attribute. + */ + _setDisabled: function (p_bDisabled) { + + if (this.get("type") != "link") { + + if (p_bDisabled) { + + if (this._menu) { + + this._menu.hide(); + + } + + if (this.hasFocus()) { + + this.blur(); + + } + + this._button.setAttribute("disabled", "disabled"); + + this.addStateCSSClasses("disabled"); + + this.removeStateCSSClasses("hover"); + this.removeStateCSSClasses("active"); + this.removeStateCSSClasses("focus"); + + } + else { + + this._button.removeAttribute("disabled"); + + this.removeStateCSSClasses("disabled"); + + } + + } + + }, + + + /** + * @method _setHref + * @description Sets the value of the button's "href" attribute. + * @protected + * @param {String} p_sHref String indicating the value for the button's + * "href" attribute. + */ + _setHref: function (p_sHref) { + + if (this.get("type") == "link") { + + this._button.href = p_sHref; + + } + + }, + + + /** + * @method _setTarget + * @description Sets the value of the button's "target" attribute. + * @protected + * @param {String} p_sTarget String indicating the value for the button's + * "target" attribute. + */ + _setTarget: function (p_sTarget) { + + if (this.get("type") == "link") { + + this._button.setAttribute("target", p_sTarget); + + } + + }, + + + /** + * @method _setChecked + * @description Sets the value of the button's "target" attribute. + * @protected + * @param {Boolean} p_bChecked Boolean indicating the value for + * the button's "checked" attribute. + */ + _setChecked: function (p_bChecked) { + + var sType = this.get("type"), + sTitle; + + if (sType == "checkbox" || sType == "radio") { + + if (p_bChecked) { + + this.addStateCSSClasses("checked"); + + sTitle = (sType == "radio") ? + this.RADIO_CHECKED_TITLE : + this.CHECKBOX_CHECKED_TITLE; + + } + else { + + this.removeStateCSSClasses("checked"); + + sTitle = (sType == "radio") ? + this.RADIO_DEFAULT_TITLE : + this.CHECKBOX_DEFAULT_TITLE; + + } + + + if (!this._hasDefaultTitle) { + + this.set("title", sTitle); + + } + + } + + }, + + + /** + * @method _setMenu + * @description Sets the value of the button's "menu" attribute. + * @protected + * @param {Object} p_oMenu Object indicating the value for the button's + * "menu" attribute. + */ + _setMenu: function (p_oMenu) { + + var bLazyLoad = this.get("lazyloadmenu"), + oButtonElement = this.get("element"), + sMenuCSSClassName, + + /* + Boolean indicating if the value of p_oMenu is an instance + of YAHOO.widget.Menu or YAHOO.widget.Overlay. + */ + + bInstance = false, + + + oMenu, + oMenuElement, + oSrcElement, + aItems, + nItems, + oItem, + i; + + + function onAppendTo() { + + oMenu.render(oButtonElement.parentNode); + + this.removeListener("appendTo", onAppendTo); + + } + + + function setMenuContainer() { + + oMenu.cfg.queueProperty("container", oButtonElement.parentNode); + + this.removeListener("appendTo", setMenuContainer); + + } + + + function initMenu() { + + var oContainer; + + if (oMenu) { + + Dom.addClass(oMenu.element, this.get("menuclassname")); + Dom.addClass(oMenu.element, "yui-" + this.get("type") + "-button-menu"); + + oMenu.showEvent.subscribe(this._onMenuShow, null, this); + oMenu.hideEvent.subscribe(this._onMenuHide, null, this); + oMenu.renderEvent.subscribe(this._onMenuRender, null, this); + + + if (Menu && oMenu instanceof Menu) { + + if (bLazyLoad) { + + oContainer = this.get("container"); + + if (oContainer) { + + oMenu.cfg.queueProperty("container", oContainer); + + } + else { + + this.on("appendTo", setMenuContainer); + + } + + } + + oMenu.cfg.queueProperty("clicktohide", false); + + oMenu.keyDownEvent.subscribe(this._onMenuKeyDown, this, true); + oMenu.subscribe("click", this._onMenuClick, this, true); + oMenu.itemAddedEvent.subscribe(this._onMenuItemAdded, this, true); + + oSrcElement = oMenu.srcElement; + + if (oSrcElement && oSrcElement.nodeName.toUpperCase() == "SELECT") { + + oSrcElement.style.display = "none"; + oSrcElement.parentNode.removeChild(oSrcElement); + + } + + } + else if (Overlay && oMenu instanceof Overlay) { + + if (!m_oOverlayManager) { + + m_oOverlayManager = new YAHOO.widget.OverlayManager(); + + } + + m_oOverlayManager.register(oMenu); + + } + + + this._menu = oMenu; + + + if (!bInstance && !bLazyLoad) { + + if (Dom.inDocument(oButtonElement)) { + + oMenu.render(oButtonElement.parentNode); + + } + else { + + this.on("appendTo", onAppendTo); + + } + + } + + } + + } + + + if (Overlay) { + + if (Menu) { + + sMenuCSSClassName = Menu.prototype.CSS_CLASS_NAME; + + } + + if (p_oMenu && Menu && (p_oMenu instanceof Menu)) { + + oMenu = p_oMenu; + aItems = oMenu.getItems(); + nItems = aItems.length; + bInstance = true; + + + if (nItems > 0) { + + i = nItems - 1; + + do { + + oItem = aItems[i]; + + if (oItem) { + + oItem.cfg.subscribeToConfigEvent("selected", + this._onMenuItemSelected, oItem, this); + + } + + } + while (i--); + + } + + initMenu.call(this); + + } + else if (Overlay && p_oMenu && (p_oMenu instanceof Overlay)) { + + oMenu = p_oMenu; + bInstance = true; + + oMenu.cfg.queueProperty("visible", false); + + initMenu.call(this); + + } + else if (Menu && Lang.isArray(p_oMenu)) { + + oMenu = new Menu(Dom.generateId(), { lazyload: bLazyLoad, itemdata: p_oMenu }); + + this._menu = oMenu; + + this.on("appendTo", initMenu); + + } + else if (Lang.isString(p_oMenu)) { + + oMenuElement = Dom.get(p_oMenu); + + if (oMenuElement) { + + if (Menu && Dom.hasClass(oMenuElement, sMenuCSSClassName) || + oMenuElement.nodeName.toUpperCase() == "SELECT") { + + oMenu = new Menu(p_oMenu, { lazyload: bLazyLoad }); + + initMenu.call(this); + + } + else if (Overlay) { + + oMenu = new Overlay(p_oMenu, { visible: false }); + + initMenu.call(this); + + } + + } + + } + else if (p_oMenu && p_oMenu.nodeName) { + + if (Menu && Dom.hasClass(p_oMenu, sMenuCSSClassName) || + p_oMenu.nodeName.toUpperCase() == "SELECT") { + + oMenu = new Menu(p_oMenu, { lazyload: bLazyLoad }); + + initMenu.call(this); + + } + else if (Overlay) { + + if (!p_oMenu.id) { + + Dom.generateId(p_oMenu); + + } + + oMenu = new Overlay(p_oMenu, { visible: false }); + + initMenu.call(this); + + } + + } + + } + + }, + + + /** + * @method _setOnClick + * @description Sets the value of the button's "onclick" attribute. + * @protected + * @param {Object} p_oObject Object indicating the value for the button's + * "onclick" attribute. + */ + _setOnClick: function (p_oObject) { + + /* + Remove any existing listeners if a "click" event handler + has already been specified. + */ + + if (this._onclickAttributeValue && + (this._onclickAttributeValue != p_oObject)) { + + this.removeListener("click", this._onclickAttributeValue.fn); + + this._onclickAttributeValue = null; + + } + + + if (!this._onclickAttributeValue && + Lang.isObject(p_oObject) && + Lang.isFunction(p_oObject.fn)) { + + this.on("click", p_oObject.fn, p_oObject.obj, p_oObject.scope); + + this._onclickAttributeValue = p_oObject; + + } + + }, + + + /** + * @method _setSelectedMenuItem + * @description Sets the value of the button's + * "selectedMenuItem" attribute. + * @protected + * @param {Number} p_nIndex Number representing the index of the item + * in the button's menu that is currently selected. + */ + _setSelectedMenuItem: function (p_nIndex) { + + var oMenu = this._menu, + oMenuItem; + + + if (Menu && oMenu && oMenu instanceof Menu) { + + oMenuItem = oMenu.getItem(p_nIndex); + + + if (oMenuItem && !oMenuItem.cfg.getProperty("selected")) { + + oMenuItem.cfg.setProperty("selected", true); + + } + + } + + }, + + + // Protected methods + + + + /** + * @method _isActivationKey + * @description Determines if the specified keycode is one that toggles + * the button's "active" state. + * @protected + * @param {Number} p_nKeyCode Number representing the keycode to + * be evaluated. + * @return {Boolean} + */ + _isActivationKey: function (p_nKeyCode) { + + var sType = this.get("type"), + aKeyCodes = (sType == "checkbox" || sType == "radio") ? + this.CHECK_ACTIVATION_KEYS : this.ACTIVATION_KEYS, + + nKeyCodes = aKeyCodes.length, + bReturnVal = false, + i; + + + if (nKeyCodes > 0) { + + i = nKeyCodes - 1; + + do { + + if (p_nKeyCode == aKeyCodes[i]) { + + bReturnVal = true; + break; + + } + + } + while (i--); + + } + + return bReturnVal; + + }, + + + /** + * @method _isSplitButtonOptionKey + * @description Determines if the specified keycode is one that toggles + * the display of the split button's menu. + * @protected + * @param {Event} p_oEvent Object representing the DOM event object + * passed back by the event utility (YAHOO.util.Event). + * @return {Boolean} + */ + _isSplitButtonOptionKey: function (p_oEvent) { + + var bShowMenu = (Event.getCharCode(p_oEvent) == 40); + + + var onKeyPress = function (p_oEvent) { + + Event.preventDefault(p_oEvent); + + this.removeListener("keypress", onKeyPress); + + }; + + + // Prevent the browser from scrolling the window + if (bShowMenu) { + + if (UA.opera) { + + this.on("keypress", onKeyPress); + + } + + Event.preventDefault(p_oEvent); + } + + return bShowMenu; + + }, + + + /** + * @method _addListenersToForm + * @description Adds event handlers to the button's form. + * @protected + */ + _addListenersToForm: function () { + + var oForm = this.getForm(), + onFormKeyPress = YAHOO.widget.Button.onFormKeyPress, + bHasKeyPressListener, + oSrcElement, + aListeners, + nListeners, + i; + + + if (oForm) { + + Event.on(oForm, "reset", this._onFormReset, null, this); + Event.on(oForm, "submit", this._onFormSubmit, null, this); + + oSrcElement = this.get("srcelement"); + + + if (this.get("type") == "submit" || + (oSrcElement && oSrcElement.type == "submit")) + { + + aListeners = Event.getListeners(oForm, "keypress"); + bHasKeyPressListener = false; + + if (aListeners) { + + nListeners = aListeners.length; + + if (nListeners > 0) { + + i = nListeners - 1; + + do { + + if (aListeners[i].fn == onFormKeyPress) { + + bHasKeyPressListener = true; + break; + + } + + } + while (i--); + + } + + } + + + if (!bHasKeyPressListener) { + + Event.on(oForm, "keypress", onFormKeyPress); + + } + + } + + } + + }, + + + + /** + * @method _showMenu + * @description Shows the button's menu. + * @protected + * @param {Event} p_oEvent Object representing the DOM event object + * passed back by the event utility (YAHOO.util.Event) that triggered + * the display of the menu. + */ + _showMenu: function (p_oEvent) { + + if (YAHOO.widget.MenuManager) { + YAHOO.widget.MenuManager.hideVisible(); + } + + + if (m_oOverlayManager) { + m_oOverlayManager.hideAll(); + } + + + var oMenu = this._menu, + aMenuAlignment = this.get("menualignment"), + bFocusMenu = this.get("focusmenu"), + fnFocusMethod; + + + if (this._renderedMenu) { + + oMenu.cfg.setProperty("context", + [this.get("element"), aMenuAlignment[0], aMenuAlignment[1]]); + + oMenu.cfg.setProperty("preventcontextoverlap", true); + oMenu.cfg.setProperty("constraintoviewport", true); + + } + else { + + oMenu.cfg.queueProperty("context", + [this.get("element"), aMenuAlignment[0], aMenuAlignment[1]]); + + oMenu.cfg.queueProperty("preventcontextoverlap", true); + oMenu.cfg.queueProperty("constraintoviewport", true); + + } + + + /* + Refocus the Button before showing its Menu in case the call to + YAHOO.widget.MenuManager.hideVisible() resulted in another element in the + DOM being focused after another Menu was hidden. + */ + + this.focus(); + + + if (Menu && oMenu && (oMenu instanceof Menu)) { + + // Since Menus automatically focus themselves when made visible, temporarily + // replace the Menu focus method so that the value of the Button's "focusmenu" + // attribute determines if the Menu should be focus when made visible. + + fnFocusMethod = oMenu.focus; + + oMenu.focus = function () {}; + + if (this._renderedMenu) { + + oMenu.cfg.setProperty("minscrollheight", this.get("menuminscrollheight")); + oMenu.cfg.setProperty("maxheight", this.get("menumaxheight")); + + } + else { + + oMenu.cfg.queueProperty("minscrollheight", this.get("menuminscrollheight")); + oMenu.cfg.queueProperty("maxheight", this.get("menumaxheight")); + + } + + + oMenu.show(); + + oMenu.focus = fnFocusMethod; + + oMenu.align(); + + + /* + Stop the propagation of the event so that the MenuManager + doesn't blur the menu after it gets focus. + */ + + if (p_oEvent.type == "mousedown") { + Event.stopPropagation(p_oEvent); + } + + + if (bFocusMenu) { + oMenu.focus(); + } + + } + else if (Overlay && oMenu && (oMenu instanceof Overlay)) { + + if (!this._renderedMenu) { + oMenu.render(this.get("element").parentNode); + } + + oMenu.show(); + oMenu.align(); + + } + + }, + + + /** + * @method _hideMenu + * @description Hides the button's menu. + * @protected + */ + _hideMenu: function () { + + var oMenu = this._menu; + + if (oMenu) { + + oMenu.hide(); + + } + + }, + + + + + // Protected event handlers + + + /** + * @method _onMouseOver + * @description "mouseover" event handler for the button. + * @protected + * @param {Event} p_oEvent Object representing the DOM event object + * passed back by the event utility (YAHOO.util.Event). + */ + _onMouseOver: function (p_oEvent) { + + var sType = this.get("type"), + oElement, + nOptionRegionX; + + + if (sType === "split") { + + oElement = this.get("element"); + nOptionRegionX = + (Dom.getX(oElement) + (oElement.offsetWidth - this.OPTION_AREA_WIDTH)); + + this._nOptionRegionX = nOptionRegionX; + + } + + + if (!this._hasMouseEventHandlers) { + + if (sType === "split") { + + this.on("mousemove", this._onMouseMove); + + } + + this.on("mouseout", this._onMouseOut); + + this._hasMouseEventHandlers = true; + + } + + + this.addStateCSSClasses("hover"); + + + if (sType === "split" && (Event.getPageX(p_oEvent) > nOptionRegionX)) { + + this.addStateCSSClasses("hoveroption"); + + } + + + if (this._activationButtonPressed) { + + this.addStateCSSClasses("active"); + + } + + + if (this._bOptionPressed) { + + this.addStateCSSClasses("activeoption"); + + } + + + if (this._activationButtonPressed || this._bOptionPressed) { + + Event.removeListener(document, "mouseup", this._onDocumentMouseUp); + + } + + }, + + + /** + * @method _onMouseMove + * @description "mousemove" event handler for the button. + * @protected + * @param {Event} p_oEvent Object representing the DOM event object + * passed back by the event utility (YAHOO.util.Event). + */ + _onMouseMove: function (p_oEvent) { + + var nOptionRegionX = this._nOptionRegionX; + + if (nOptionRegionX) { + + if (Event.getPageX(p_oEvent) > nOptionRegionX) { + + this.addStateCSSClasses("hoveroption"); + + } + else { + + this.removeStateCSSClasses("hoveroption"); + + } + + } + + }, + + /** + * @method _onMouseOut + * @description "mouseout" event handler for the button. + * @protected + * @param {Event} p_oEvent Object representing the DOM event object + * passed back by the event utility (YAHOO.util.Event). + */ + _onMouseOut: function (p_oEvent) { + + var sType = this.get("type"); + + this.removeStateCSSClasses("hover"); + + + if (sType != "menu") { + + this.removeStateCSSClasses("active"); + + } + + + if (this._activationButtonPressed || this._bOptionPressed) { + + Event.on(document, "mouseup", this._onDocumentMouseUp, null, this); + + } + + + if (sType === "split" && (Event.getPageX(p_oEvent) > this._nOptionRegionX)) { + + this.removeStateCSSClasses("hoveroption"); + + } + + }, + + + /** + * @method _onDocumentMouseUp + * @description "mouseup" event handler for the button. + * @protected + * @param {Event} p_oEvent Object representing the DOM event object + * passed back by the event utility (YAHOO.util.Event). + */ + _onDocumentMouseUp: function (p_oEvent) { + + this._activationButtonPressed = false; + this._bOptionPressed = false; + + var sType = this.get("type"), + oTarget, + oMenuElement; + + if (sType == "menu" || sType == "split") { + + oTarget = Event.getTarget(p_oEvent); + oMenuElement = this._menu.element; + + if (oTarget != oMenuElement && + !Dom.isAncestor(oMenuElement, oTarget)) { + + this.removeStateCSSClasses((sType == "menu" ? + "active" : "activeoption")); + + this._hideMenu(); + + } + + } + + Event.removeListener(document, "mouseup", this._onDocumentMouseUp); + + }, + + + /** + * @method _onMouseDown + * @description "mousedown" event handler for the button. + * @protected + * @param {Event} p_oEvent Object representing the DOM event object + * passed back by the event utility (YAHOO.util.Event). + */ + _onMouseDown: function (p_oEvent) { + + var sType, + bReturnVal = true; + + + function onMouseUp() { + + this._hideMenu(); + this.removeListener("mouseup", onMouseUp); + + } + + + if ((p_oEvent.which || p_oEvent.button) == 1) { + + + if (!this.hasFocus()) { + + this.focus(); + + } + + + sType = this.get("type"); + + + if (sType == "split") { + + if (Event.getPageX(p_oEvent) > this._nOptionRegionX) { + + this.fireEvent("option", p_oEvent); + bReturnVal = false; + + } + else { + + this.addStateCSSClasses("active"); + + this._activationButtonPressed = true; + + } + + } + else if (sType == "menu") { + + if (this.isActive()) { + + this._hideMenu(); + + this._activationButtonPressed = false; + + } + else { + + this._showMenu(p_oEvent); + + this._activationButtonPressed = true; + + } + + } + else { + + this.addStateCSSClasses("active"); + + this._activationButtonPressed = true; + + } + + + + if (sType == "split" || sType == "menu") { + + this._hideMenuTimer = Lang.later(250, this, this.on, ["mouseup", onMouseUp]); + + } + + } + + return bReturnVal; + + }, + + + /** + * @method _onMouseUp + * @description "mouseup" event handler for the button. + * @protected + * @param {Event} p_oEvent Object representing the DOM event object + * passed back by the event utility (YAHOO.util.Event). + */ + _onMouseUp: function (p_oEvent) { + + var sType = this.get("type"), + oHideMenuTimer = this._hideMenuTimer, + bReturnVal = true; + + + if (oHideMenuTimer) { + + oHideMenuTimer.cancel(); + + } + + + if (sType == "checkbox" || sType == "radio") { + + this.set("checked", !(this.get("checked"))); + + } + + + this._activationButtonPressed = false; + + + if (sType != "menu") { + + this.removeStateCSSClasses("active"); + + } + + + if (sType == "split" && Event.getPageX(p_oEvent) > this._nOptionRegionX) { + + bReturnVal = false; + + } + + return bReturnVal; + + }, + + + /** + * @method _onFocus + * @description "focus" event handler for the button. + * @protected + * @param {Event} p_oEvent Object representing the DOM event object + * passed back by the event utility (YAHOO.util.Event). + */ + _onFocus: function (p_oEvent) { + + var oElement; + + this.addStateCSSClasses("focus"); + + if (this._activationKeyPressed) { + + this.addStateCSSClasses("active"); + + } + + m_oFocusedButton = this; + + + if (!this._hasKeyEventHandlers) { + + oElement = this._button; + + Event.on(oElement, "blur", this._onBlur, null, this); + Event.on(oElement, "keydown", this._onKeyDown, null, this); + Event.on(oElement, "keyup", this._onKeyUp, null, this); + + this._hasKeyEventHandlers = true; + + } + + + this.fireEvent("focus", p_oEvent); + + }, + + + /** + * @method _onBlur + * @description "blur" event handler for the button. + * @protected + * @param {Event} p_oEvent Object representing the DOM event object + * passed back by the event utility (YAHOO.util.Event). + */ + _onBlur: function (p_oEvent) { + + this.removeStateCSSClasses("focus"); + + if (this.get("type") != "menu") { + + this.removeStateCSSClasses("active"); + + } + + if (this._activationKeyPressed) { + + Event.on(document, "keyup", this._onDocumentKeyUp, null, this); + + } + + + m_oFocusedButton = null; + + this.fireEvent("blur", p_oEvent); + + }, + + + /** + * @method _onDocumentKeyUp + * @description "keyup" event handler for the document. + * @protected + * @param {Event} p_oEvent Object representing the DOM event object + * passed back by the event utility (YAHOO.util.Event). + */ + _onDocumentKeyUp: function (p_oEvent) { + + if (this._isActivationKey(Event.getCharCode(p_oEvent))) { + + this._activationKeyPressed = false; + + Event.removeListener(document, "keyup", this._onDocumentKeyUp); + + } + + }, + + + /** + * @method _onKeyDown + * @description "keydown" event handler for the button. + * @protected + * @param {Event} p_oEvent Object representing the DOM event object + * passed back by the event utility (YAHOO.util.Event). + */ + _onKeyDown: function (p_oEvent) { + + var oMenu = this._menu; + + + if (this.get("type") == "split" && + this._isSplitButtonOptionKey(p_oEvent)) { + + this.fireEvent("option", p_oEvent); + + } + else if (this._isActivationKey(Event.getCharCode(p_oEvent))) { + + if (this.get("type") == "menu") { + + this._showMenu(p_oEvent); + + } + else { + + this._activationKeyPressed = true; + + this.addStateCSSClasses("active"); + + } + + } + + + if (oMenu && oMenu.cfg.getProperty("visible") && + Event.getCharCode(p_oEvent) == 27) { + + oMenu.hide(); + this.focus(); + + } + + }, + + + /** + * @method _onKeyUp + * @description "keyup" event handler for the button. + * @protected + * @param {Event} p_oEvent Object representing the DOM event object + * passed back by the event utility (YAHOO.util.Event). + */ + _onKeyUp: function (p_oEvent) { + + var sType; + + if (this._isActivationKey(Event.getCharCode(p_oEvent))) { + + sType = this.get("type"); + + if (sType == "checkbox" || sType == "radio") { + + this.set("checked", !(this.get("checked"))); + + } + + this._activationKeyPressed = false; + + if (this.get("type") != "menu") { + + this.removeStateCSSClasses("active"); + + } + + } + + }, + + + /** + * @method _onClick + * @description "click" event handler for the button. + * @protected + * @param {Event} p_oEvent Object representing the DOM event object + * passed back by the event utility (YAHOO.util.Event). + */ + _onClick: function (p_oEvent) { + + var sType = this.get("type"), + sTitle, + oForm, + oSrcElement, + bReturnVal; + + + switch (sType) { + + case "radio": + case "checkbox": + + if (!this._hasDefaultTitle) { + + if (this.get("checked")) { + + sTitle = (sType == "radio") ? + this.RADIO_CHECKED_TITLE : + this.CHECKBOX_CHECKED_TITLE; + + } + else { + + sTitle = (sType == "radio") ? + this.RADIO_DEFAULT_TITLE : + this.CHECKBOX_DEFAULT_TITLE; + + } + + this.set("title", sTitle); + + } + + break; + + case "submit": + + if (p_oEvent.returnValue !== false) { + + this.submitForm(); + + } + + break; + + case "reset": + + oForm = this.getForm(); + + if (oForm) { + + oForm.reset(); + + } + + break; + + case "menu": + + sTitle = this._menu.cfg.getProperty("visible") ? + this.MENUBUTTON_MENU_VISIBLE_TITLE : + this.MENUBUTTON_DEFAULT_TITLE; + + this.set("title", sTitle); + + break; + + case "split": + + if (Event.getPageX(p_oEvent) > this._nOptionRegionX) { + + bReturnVal = false; + + } + else { + + this._hideMenu(); + + oSrcElement = this.get("srcelement"); + + if (oSrcElement && oSrcElement.type == "submit") { + + this.submitForm(); + + } + + } + + sTitle = this._menu.cfg.getProperty("visible") ? + this.SPLITBUTTON_OPTION_VISIBLE_TITLE : + this.SPLITBUTTON_DEFAULT_TITLE; + + this.set("title", sTitle); + + break; + + } + + return bReturnVal; + + }, + + + /** + * @method _onDblClick + * @description "dblclick" event handler for the button. + * @protected + * @param {Event} p_oEvent Object representing the DOM event object + * passed back by the event utility (YAHOO.util.Event). + */ + _onDblClick: function (p_oEvent) { + + var bReturnVal = true; + + if (this.get("type") == "split" && Event.getPageX(p_oEvent) > this._nOptionRegionX) { + + bReturnVal = false; + + } + + return bReturnVal; + + }, + + + /** + * @method _onAppendTo + * @description "appendTo" event handler for the button. + * @protected + * @param {Event} p_oEvent Object representing the DOM event object + * passed back by the event utility (YAHOO.util.Event). + */ + _onAppendTo: function (p_oEvent) { + + /* + It is necessary to call "_addListenersToForm" using + "setTimeout" to make sure that the button's "form" property + returns a node reference. Sometimes, if you try to get the + reference immediately after appending the field, it is null. + */ + + Lang.later(0, this, this._addListenersToForm); + + }, + + + /** + * @method _onFormReset + * @description "reset" event handler for the button's form. + * @protected + * @param {Event} p_oEvent Object representing the DOM event + * object passed back by the event utility (YAHOO.util.Event). + */ + _onFormReset: function (p_oEvent) { + + var sType = this.get("type"), + oMenu = this._menu; + + if (sType == "checkbox" || sType == "radio") { + + this.resetValue("checked"); + + } + + + if (Menu && oMenu && (oMenu instanceof Menu)) { + + this.resetValue("selectedMenuItem"); + + } + + }, + + + /** + * @method _onFormSubmit + * @description "submit" event handler for the button's form. + * @protected + * @param {Event} p_oEvent Object representing the DOM event + * object passed back by the event utility (YAHOO.util.Event). + */ + _onFormSubmit: function (p_oEvent) { + + this.createHiddenFields(); + + }, + + + /** + * @method _onDocumentMouseDown + * @description "mousedown" event handler for the document. + * @protected + * @param {Event} p_oEvent Object representing the DOM event object + * passed back by the event utility (YAHOO.util.Event). + */ + _onDocumentMouseDown: function (p_oEvent) { + + var oTarget = Event.getTarget(p_oEvent), + oButtonElement = this.get("element"), + oMenuElement = this._menu.element; + + + if (oTarget != oButtonElement && + !Dom.isAncestor(oButtonElement, oTarget) && + oTarget != oMenuElement && + !Dom.isAncestor(oMenuElement, oTarget)) { + + this._hideMenu(); + + Event.removeListener(document, "mousedown", + this._onDocumentMouseDown); + + } + + }, + + + /** + * @method _onOption + * @description "option" event handler for the button. + * @protected + * @param {Event} p_oEvent Object representing the DOM event object + * passed back by the event utility (YAHOO.util.Event). + */ + _onOption: function (p_oEvent) { + + if (this.hasClass("yui-split-button-activeoption")) { + + this._hideMenu(); + + this._bOptionPressed = false; + + } + else { + + this._showMenu(p_oEvent); + + this._bOptionPressed = true; + + } + + }, + + + /** + * @method _onMenuShow + * @description "show" event handler for the button's menu. + * @private + * @param {String} p_sType String representing the name of the event + * that was fired. + */ + _onMenuShow: function (p_sType) { + + Event.on(document, "mousedown", this._onDocumentMouseDown, + null, this); + + var sTitle, + sState; + + if (this.get("type") == "split") { + + sTitle = this.SPLITBUTTON_OPTION_VISIBLE_TITLE; + sState = "activeoption"; + + } + else { + + sTitle = this.MENUBUTTON_MENU_VISIBLE_TITLE; + sState = "active"; + + } + + this.addStateCSSClasses(sState); + this.set("title", sTitle); + + }, + + + /** + * @method _onMenuHide + * @description "hide" event handler for the button's menu. + * @private + * @param {String} p_sType String representing the name of the event + * that was fired. + */ + _onMenuHide: function (p_sType) { + + var oMenu = this._menu, + sTitle, + sState; + + + if (this.get("type") == "split") { + + sTitle = this.SPLITBUTTON_DEFAULT_TITLE; + sState = "activeoption"; + + } + else { + + sTitle = this.MENUBUTTON_DEFAULT_TITLE; + sState = "active"; + } + + + this.removeStateCSSClasses(sState); + this.set("title", sTitle); + + + if (this.get("type") == "split") { + + this._bOptionPressed = false; + + } + + }, + + + /** + * @method _onMenuKeyDown + * @description "keydown" event handler for the button's menu. + * @private + * @param {String} p_sType String representing the name of the event + * that was fired. + * @param {Array} p_aArgs Array of arguments sent when the event + * was fired. + */ + _onMenuKeyDown: function (p_sType, p_aArgs) { + + var oEvent = p_aArgs[0]; + + if (Event.getCharCode(oEvent) == 27) { + + this.focus(); + + if (this.get("type") == "split") { + + this._bOptionPressed = false; + + } + + } + + }, + + + /** + * @method _onMenuRender + * @description "render" event handler for the button's menu. + * @private + * @param {String} p_sType String representing the name of the + * event thatwas fired. + */ + _onMenuRender: function (p_sType) { + + var oButtonElement = this.get("element"), + oButtonParent = oButtonElement.parentNode, + oMenuElement = this._menu.element; + + + if (oButtonParent != oMenuElement.parentNode) { + + oButtonParent.appendChild(oMenuElement); + + } + + this._renderedMenu = true; + + this.set("selectedMenuItem", this.get("selectedMenuItem")); + + }, + + + /** + * @method _onMenuItemSelected + * @description "selectedchange" event handler for each item in the + * button's menu. + * @private + * @param {String} p_sType String representing the name of the event + * that was fired. + * @param {Array} p_aArgs Array of arguments sent when the event + * was fired. + * @param {MenuItem} p_oItem Object representing the menu item that + * subscribed to the event. + */ + _onMenuItemSelected: function (p_sType, p_aArgs, p_oItem) { + + var bSelected = p_aArgs[0]; + + if (bSelected) { + + this.set("selectedMenuItem", p_oItem); + + } + + }, + + + /** + * @method _onMenuItemAdded + * @description "itemadded" event handler for the button's menu. + * @private + * @param {String} p_sType String representing the name of the event + * that was fired. + * @param {Array} p_aArgs Array of arguments sent when the event + * was fired. + * @param { + * YAHOO.widget.MenuItem} p_oItem Object representing the menu + * item that subscribed to the event. + */ + _onMenuItemAdded: function (p_sType, p_aArgs, p_oItem) { + + var oItem = p_aArgs[0]; + + oItem.cfg.subscribeToConfigEvent("selected", this._onMenuItemSelected, oItem, this); + + }, + + + /** + * @method _onMenuClick + * @description "click" event handler for the button's menu. + * @private + * @param {String} p_sType String representing the name of the event + * that was fired. + * @param {Array} p_aArgs Array of arguments sent when the event + * was fired. + */ + _onMenuClick: function (p_sType, p_aArgs) { + + var oItem = p_aArgs[1], + oSrcElement; + + if (oItem) { + + this.set("selectedMenuItem", oItem); + + oSrcElement = this.get("srcelement"); + + if (oSrcElement && oSrcElement.type == "submit") { + + this.submitForm(); + + } + + this._hideMenu(); + + } + + }, + + + + // Public methods + + + /** + * @method createButtonElement + * @description Creates the button's HTML elements. + * @param {String} p_sType String indicating the type of element + * to create. + * @return {HTMLElement} + */ + createButtonElement: function (p_sType) { + + var sNodeName = this.NODE_NAME, + oElement = document.createElement(sNodeName); + + oElement.innerHTML = "<" + sNodeName + " class=\"first-child\">" + + (p_sType == "link" ? "" : + "") + ""; + + return oElement; + + }, + + + /** + * @method addStateCSSClasses + * @description Appends state-specific CSS classes to the button's root + * DOM element. + */ + addStateCSSClasses: function (p_sState) { + + var sType = this.get("type"); + + if (Lang.isString(p_sState)) { + + if (p_sState != "activeoption" && p_sState != "hoveroption") { + + this.addClass(this.CSS_CLASS_NAME + ("-" + p_sState)); + + } + + this.addClass("yui-" + sType + ("-button-" + p_sState)); + + } + + }, + + + /** + * @method removeStateCSSClasses + * @description Removes state-specific CSS classes to the button's root + * DOM element. + */ + removeStateCSSClasses: function (p_sState) { + + var sType = this.get("type"); + + if (Lang.isString(p_sState)) { + + this.removeClass(this.CSS_CLASS_NAME + ("-" + p_sState)); + this.removeClass("yui-" + sType + ("-button-" + p_sState)); + + } + + }, + + + /** + * @method createHiddenFields + * @description Creates the button's hidden form field and appends it + * to its parent form. + * @return {HTMLInputElement|Array} + */ + createHiddenFields: function () { + + this.removeHiddenFields(); + + var oForm = this.getForm(), + oButtonField, + sType, + bCheckable, + oMenu, + oMenuItem, + sButtonName, + oValue, + oMenuField, + oReturnVal, + sMenuFieldName, + oMenuSrcElement, + bMenuSrcElementIsSelect = false; + + + if (oForm && !this.get("disabled")) { + + sType = this.get("type"); + bCheckable = (sType == "checkbox" || sType == "radio"); + + + if ((bCheckable && this.get("checked")) || (m_oSubmitTrigger == this)) { + + YAHOO.log("Creating hidden field.", "info", this.toString()); + + oButtonField = createInputElement((bCheckable ? sType : "hidden"), + this.get("name"), this.get("value"), this.get("checked")); + + + if (oButtonField) { + + if (bCheckable) { + + oButtonField.style.display = "none"; + + } + + oForm.appendChild(oButtonField); + + } + + } + + + oMenu = this._menu; + + + if (Menu && oMenu && (oMenu instanceof Menu)) { + + YAHOO.log("Creating hidden field for menu.", "info", this.toString()); + + oMenuItem = this.get("selectedMenuItem"); + oMenuSrcElement = oMenu.srcElement; + bMenuSrcElementIsSelect = (oMenuSrcElement && + oMenuSrcElement.nodeName.toUpperCase() == "SELECT"); + + if (oMenuItem) { + + oValue = (oMenuItem.value === null || oMenuItem.value === "") ? + oMenuItem.cfg.getProperty("text") : oMenuItem.value; + + sButtonName = this.get("name"); + + + if (bMenuSrcElementIsSelect) { + + sMenuFieldName = oMenuSrcElement.name; + + } + else if (sButtonName) { + + sMenuFieldName = (sButtonName + "_options"); + + } + + + if (oValue && sMenuFieldName) { + + oMenuField = createInputElement("hidden", sMenuFieldName, oValue); + oForm.appendChild(oMenuField); + + } + + } + else if (bMenuSrcElementIsSelect) { + + oForm.appendChild(oMenuSrcElement); + + } + + } + + + if (oButtonField && oMenuField) { + + this._hiddenFields = [oButtonField, oMenuField]; + + } + else if (!oButtonField && oMenuField) { + + this._hiddenFields = oMenuField; + + } + else if (oButtonField && !oMenuField) { + + this._hiddenFields = oButtonField; + + } + + oReturnVal = this._hiddenFields; + + } + + return oReturnVal; + + }, + + + /** + * @method removeHiddenFields + * @description Removes the button's hidden form field(s) from its + * parent form. + */ + removeHiddenFields: function () { + + var oField = this._hiddenFields, + nFields, + i; + + function removeChild(p_oElement) { + + if (Dom.inDocument(p_oElement)) { + + p_oElement.parentNode.removeChild(p_oElement); + + } + + } + + + if (oField) { + + if (Lang.isArray(oField)) { + + nFields = oField.length; + + if (nFields > 0) { + + i = nFields - 1; + + do { + + removeChild(oField[i]); + + } + while (i--); + + } + + } + else { + + removeChild(oField); + + } + + this._hiddenFields = null; + + } + + }, + + + /** + * @method submitForm + * @description Submits the form to which the button belongs. Returns + * true if the form was submitted successfully, false if the submission + * was cancelled. + * @protected + * @return {Boolean} + */ + submitForm: function () { + + var oForm = this.getForm(), + + oSrcElement = this.get("srcelement"), + + /* + Boolean indicating if the event fired successfully + (was not cancelled by any handlers) + */ + + bSubmitForm = false, + + oEvent; + + + if (oForm) { + + if (this.get("type") == "submit" || (oSrcElement && oSrcElement.type == "submit")) { + + m_oSubmitTrigger = this; + + } + + + if (UA.ie) { + + bSubmitForm = oForm.fireEvent("onsubmit"); + + } + else { // Gecko, Opera, and Safari + + oEvent = document.createEvent("HTMLEvents"); + oEvent.initEvent("submit", true, true); + + bSubmitForm = oForm.dispatchEvent(oEvent); + + } + + + /* + In IE and Safari, dispatching a "submit" event to a form + WILL cause the form's "submit" event to fire, but WILL NOT + submit the form. Therefore, we need to call the "submit" + method as well. + */ + + if ((UA.ie || UA.webkit) && bSubmitForm) { + + oForm.submit(); + + } + + } + + return bSubmitForm; + + }, + + + /** + * @method init + * @description The Button class's initialization method. + * @param {String} p_oElement String specifying the id attribute of the + * <input>, <button>, + * <a>, or <span> element to + * be used to create the button. + * @param {HTMLInputElement|HTMLButtonElement| + * HTMLElement} p_oElement Object reference for the + * <input>, <button>, + * <a>, or <span> element to be + * used to create the button. + * @param {Object} p_oElement Object literal specifying a set of + * configuration attributes used to create the button. + * @param {Object} p_oAttributes Optional. Object literal specifying a + * set of configuration attributes used to create the button. + */ + init: function (p_oElement, p_oAttributes) { + + var sNodeName = p_oAttributes.type == "link" ? "a" : "button", + oSrcElement = p_oAttributes.srcelement, + oButton = p_oElement.getElementsByTagName(sNodeName)[0], + oInput; + + + if (!oButton) { + + oInput = p_oElement.getElementsByTagName("input")[0]; + + + if (oInput) { + + oButton = document.createElement("button"); + oButton.setAttribute("type", "button"); + + oInput.parentNode.replaceChild(oButton, oInput); + + } + + } + + this._button = oButton; + + /* + Capture if the button has a value for the title attribute. If so, we won't + override it for type of "checkbox" or "radio". + */ + + this._hasDefaultTitle = (p_oAttributes.title && p_oAttributes.title.length > 0); + + YAHOO.widget.Button.superclass.init.call(this, p_oElement, p_oAttributes); + + + var sId = this.get("id"), + sButtonId = sId + "-button"; + + + oButton.id = sButtonId; + + + var aLabels, + oLabel; + + + var hasLabel = function (element) { + + return (element.htmlFor === sId); + + }; + + + var setLabel = function () { + + oLabel.setAttribute((UA.ie ? "htmlFor" : "for"), sButtonId); + + }; + + + if (oSrcElement && this.get("type") != "link") { + + aLabels = Dom.getElementsBy(hasLabel, "label"); + + if (Lang.isArray(aLabels) && aLabels.length > 0) { + + oLabel = aLabels[0]; + + } + + } + + + m_oButtons[sId] = this; + + + this.addClass(this.CSS_CLASS_NAME); + this.addClass("yui-" + this.get("type") + "-button"); + + Event.on(this._button, "focus", this._onFocus, null, this); + this.on("mouseover", this._onMouseOver); + this.on("mousedown", this._onMouseDown); + this.on("mouseup", this._onMouseUp); + this.on("click", this._onClick); + this.on("dblclick", this._onDblClick); + + if (oLabel) { + + this.on("appendTo", setLabel); + + } + + this.on("appendTo", this._onAppendTo); + + + + var oContainer = this.get("container"), + oElement = this.get("element"), + bElInDoc = Dom.inDocument(oElement), + oParentNode; + + + if (oContainer) { + + if (oSrcElement && oSrcElement != oElement) { + + oParentNode = oSrcElement.parentNode; + + if (oParentNode) { + + oParentNode.removeChild(oSrcElement); + + } + + } + + if (Lang.isString(oContainer)) { + + Event.onContentReady(oContainer, this.appendTo, oContainer, this); + + } + else { + + this.on("init", function () { + + Lang.later(0, this, this.appendTo, oContainer); + + }); + + } + + } + else if (!bElInDoc && oSrcElement && oSrcElement != oElement) { + + oParentNode = oSrcElement.parentNode; + + if (oParentNode) { + + this.fireEvent("beforeAppendTo", { + type: "beforeAppendTo", + target: oParentNode + }); + + oParentNode.replaceChild(oElement, oSrcElement); + + this.fireEvent("appendTo", { + type: "appendTo", + target: oParentNode + }); + + } + + } + else if (this.get("type") != "link" && bElInDoc && oSrcElement && + oSrcElement == oElement) { + + this._addListenersToForm(); + + } + + YAHOO.log("Initialization completed.", "info", this.toString()); + + + this.fireEvent("init", { + type: "init", + target: this + }); + + }, + + + /** + * @method initAttributes + * @description Initializes all of the configuration attributes used to + * create the button. + * @param {Object} p_oAttributes Object literal specifying a set of + * configuration attributes used to create the button. + */ + initAttributes: function (p_oAttributes) { + + var oAttributes = p_oAttributes || {}; + + YAHOO.widget.Button.superclass.initAttributes.call(this, + oAttributes); + + + /** + * @attribute type + * @description String specifying the button's type. Possible + * values are: "push," "link," "submit," "reset," "checkbox," + * "radio," "menu," and "split." + * @default "push" + * @type String + */ + this.setAttributeConfig("type", { + + value: (oAttributes.type || "push"), + validator: Lang.isString, + writeOnce: true, + method: this._setType + + }); + + + /** + * @attribute label + * @description String specifying the button's text label + * or innerHTML. + * @default null + * @type String + */ + this.setAttributeConfig("label", { + + value: oAttributes.label, + validator: Lang.isString, + method: this._setLabel + + }); + + + /** + * @attribute value + * @description Object specifying the value for the button. + * @default null + * @type Object + */ + this.setAttributeConfig("value", { + + value: oAttributes.value + + }); + + + /** + * @attribute name + * @description String specifying the name for the button. + * @default null + * @type String + */ + this.setAttributeConfig("name", { + + value: oAttributes.name, + validator: Lang.isString + + }); + + + /** + * @attribute tabindex + * @description Number specifying the tabindex for the button. + * @default null + * @type Number + */ + this.setAttributeConfig("tabindex", { + + value: oAttributes.tabindex, + validator: Lang.isNumber, + method: this._setTabIndex + + }); + + + /** + * @attribute title + * @description String specifying the title for the button. + * @default null + * @type String + */ + this.configureAttribute("title", { + + value: oAttributes.title, + validator: Lang.isString, + method: this._setTitle + + }); + + + /** + * @attribute disabled + * @description Boolean indicating if the button should be disabled. + * (Disabled buttons are dimmed and will not respond to user input + * or fire events. Does not apply to button's of type "link.") + * @default false + * @type Boolean + */ + this.setAttributeConfig("disabled", { + + value: (oAttributes.disabled || false), + validator: Lang.isBoolean, + method: this._setDisabled + + }); + + + /** + * @attribute href + * @description String specifying the href for the button. Applies + * only to buttons of type "link." + * @type String + */ + this.setAttributeConfig("href", { + + value: oAttributes.href, + validator: Lang.isString, + method: this._setHref + + }); + + + /** + * @attribute target + * @description String specifying the target for the button. + * Applies only to buttons of type "link." + * @type String + */ + this.setAttributeConfig("target", { + + value: oAttributes.target, + validator: Lang.isString, + method: this._setTarget + + }); + + + /** + * @attribute checked + * @description Boolean indicating if the button is checked. + * Applies only to buttons of type "radio" and "checkbox." + * @default false + * @type Boolean + */ + this.setAttributeConfig("checked", { + + value: (oAttributes.checked || false), + validator: Lang.isBoolean, + method: this._setChecked + + }); + + + /** + * @attribute container + * @description HTML element reference or string specifying the id + * attribute of the HTML element that the button's markup should be + * rendered into. + * @type HTMLElement|String + * @default null + */ + this.setAttributeConfig("container", { + + value: oAttributes.container, + writeOnce: true + + }); + + + /** + * @attribute srcelement + * @description Object reference to the HTML element (either + * <input> or <span>) + * used to create the button. + * @type HTMLElement|String + * @default null + */ + this.setAttributeConfig("srcelement", { + + value: oAttributes.srcelement, + writeOnce: true + + }); + + + /** + * @attribute menu + * @description Object specifying the menu for the button. + * The value can be one of the following: + *
      + *
    • Object specifying a + * YAHOO.widget.Menu instance.
    • + *
    • Object specifying a + * YAHOO.widget.Overlay instance.
    • + *
    • String specifying the id attribute of the <div> + * element used to create the menu. By default the menu + * will be created as an instance of + * YAHOO.widget.Overlay. + * If the + * default CSS class name for YAHOO.widget.Menu is applied to + * the <div> element, it will be created as an + * instance of YAHOO.widget.Menu + * .
    • String specifying the id attribute of the + * <select> element used to create the menu. + *
    • Object specifying the <div> element + * used to create the menu.
    • + *
    • Object specifying the <select> element + * used to create the menu.
    • + *
    • Array of object literals, each representing a set of + * YAHOO.widget.MenuItem + * configuration attributes.
    • + *
    • Array of strings representing the text labels for each menu + * item in the menu.
    • + *
    + * @type YAHOO.widget.Menu|YAHOO.widget.Overlay|HTMLElement|String|Array + * @default null + */ + this.setAttributeConfig("menu", { + + value: null, + method: this._setMenu, + writeOnce: true + + }); + + + /** + * @attribute lazyloadmenu + * @description Boolean indicating the value to set for the + * "lazyload" + * configuration property of the button's menu. Setting + * "lazyloadmenu" to true will defer rendering of + * the button's menu until the first time it is made visible. + * If "lazyloadmenu" is set to false, the button's + * menu will be rendered immediately if the button is in the + * document, or in response to the button's "appendTo" event if + * the button is not yet in the document. In either case, the + * menu is rendered into the button's parent HTML element. + * This attribute does not apply if a + * YAHOO.widget.Menu or + * YAHOO.widget.Overlay + * instance is passed as the value of the button's "menu" + * configuration attribute. + * YAHOO.widget.Menu or + * YAHOO.widget.Overlay instances should be rendered before + * being set as the value for the "menu" configuration + * attribute. + * @default true + * @type Boolean + */ + this.setAttributeConfig("lazyloadmenu", { + + value: (oAttributes.lazyloadmenu === false ? false : true), + validator: Lang.isBoolean, + writeOnce: true + + }); + + + /** + * @attribute menuclassname + * @description String representing the CSS class name to be + * applied to the root element of the button's menu. + * @type String + * @default "yui-button-menu" + */ + this.setAttributeConfig("menuclassname", { + + value: (oAttributes.menuclassname || "yui-button-menu"), + validator: Lang.isString, + method: this._setMenuClassName, + writeOnce: true + + }); + + + /** + * @attribute menuminscrollheight + * @description Number defining the minimum threshold for the "menumaxheight" + * configuration attribute. When set this attribute is automatically applied + * to all submenus. + * @default 90 + * @type Number + */ + this.setAttributeConfig("menuminscrollheight", { + + value: (oAttributes.menuminscrollheight || 90), + validator: Lang.isNumber + + }); + + + /** + * @attribute menumaxheight + * @description Number defining the maximum height (in pixels) for a menu's + * body element (<div class="bd"<). Once a menu's body + * exceeds this height, the contents of the body are scrolled to maintain + * this value. This value cannot be set lower than the value of the + * "minscrollheight" configuration property. + * @type Number + * @default 0 + */ + this.setAttributeConfig("menumaxheight", { + + value: (oAttributes.menumaxheight || 0), + validator: Lang.isNumber + + }); + + + /** + * @attribute menualignment + * @description Array defining how the Button's Menu is aligned to the Button. + * The default value of ["tl", "bl"] aligns the Menu's top left corner to the Button's + * bottom left corner. + * @type Array + * @default ["tl", "bl"] + */ + this.setAttributeConfig("menualignment", { + + value: (oAttributes.menualignment || ["tl", "bl"]), + validator: Lang.isArray + + }); + + + /** + * @attribute selectedMenuItem + * @description Object representing the item in the button's menu + * that is currently selected. + * @type Number + * @default null + */ + this.setAttributeConfig("selectedMenuItem", { + + value: null, + method: this._setSelectedMenuItem + + }); + + + /** + * @attribute onclick + * @description Object literal representing the code to be executed + * when the button is clicked. Format:
    {
    + * fn: Function, // The handler to call + * when the event fires.
    obj: Object, + * // An object to pass back to the handler.
    + * scope: Object // The object to use + * for the scope of the handler.
    }
    + * @type Object + * @default null + */ + this.setAttributeConfig("onclick", { + + value: oAttributes.onclick, + method: this._setOnClick + + }); + + + /** + * @attribute focusmenu + * @description Boolean indicating whether or not the button's menu + * should be focused when it is made visible. + * @type Boolean + * @default true + */ + this.setAttributeConfig("focusmenu", { + + value: (oAttributes.focusmenu === false ? false : true), + validator: Lang.isBoolean + + }); + + }, + + + /** + * @method focus + * @description Causes the button to receive the focus and fires the + * button's "focus" event. + */ + focus: function () { + + if (!this.get("disabled")) { + + this._button.focus(); + + } + + }, + + + /** + * @method blur + * @description Causes the button to lose focus and fires the button's + * "blur" event. + */ + blur: function () { + + if (!this.get("disabled")) { + + this._button.blur(); + + } + + }, + + + /** + * @method hasFocus + * @description Returns a boolean indicating whether or not the button + * has focus. + * @return {Boolean} + */ + hasFocus: function () { + + return (m_oFocusedButton == this); + + }, + + + /** + * @method isActive + * @description Returns a boolean indicating whether or not the button + * is active. + * @return {Boolean} + */ + isActive: function () { + + return this.hasClass(this.CSS_CLASS_NAME + "-active"); + + }, + + + /** + * @method getMenu + * @description Returns a reference to the button's menu. + * @return { + * YAHOO.widget.Overlay|YAHOO.widget.Menu} + */ + getMenu: function () { + + return this._menu; + + }, + + + /** + * @method getForm + * @description Returns a reference to the button's parent form. + * @return {HTMLFormElement} + */ + getForm: function () { + + var oButton = this._button, + oForm; + + if (oButton) { + + oForm = oButton.form; + + } + + return oForm; + + }, + + + /** + * @method getHiddenFields + * @description Returns an <input> element or + * array of form elements used to represent the button when its parent + * form is submitted. + * @return {HTMLInputElement|Array} + */ + getHiddenFields: function () { + + return this._hiddenFields; + + }, + + + /** + * @method destroy + * @description Removes the button's element from its parent element and + * removes all event handlers. + */ + destroy: function () { + + YAHOO.log("Destroying ...", "info", this.toString()); + + var oElement = this.get("element"), + oParentNode = oElement.parentNode, + oMenu = this._menu, + aButtons; + + if (oMenu) { + + YAHOO.log("Destroying menu.", "info", this.toString()); + + if (m_oOverlayManager && m_oOverlayManager.find(oMenu)) { + + m_oOverlayManager.remove(oMenu); + + } + + oMenu.destroy(); + + } + + YAHOO.log("Removing DOM event listeners.", "info", this.toString()); + + Event.purgeElement(oElement); + Event.purgeElement(this._button); + Event.removeListener(document, "mouseup", this._onDocumentMouseUp); + Event.removeListener(document, "keyup", this._onDocumentKeyUp); + Event.removeListener(document, "mousedown", this._onDocumentMouseDown); + + + var oForm = this.getForm(); + + if (oForm) { + + Event.removeListener(oForm, "reset", this._onFormReset); + Event.removeListener(oForm, "submit", this._onFormSubmit); + + } + + YAHOO.log("Removing CustomEvent listeners.", "info", this.toString()); + + this.unsubscribeAll(); + + if (oParentNode) { + + oParentNode.removeChild(oElement); + + } + + YAHOO.log("Removing from document.", "info", this.toString()); + + delete m_oButtons[this.get("id")]; + + aButtons = Dom.getElementsByClassName(this.CSS_CLASS_NAME, + this.NODE_NAME, oForm); + + if (Lang.isArray(aButtons) && aButtons.length === 0) { + + Event.removeListener(oForm, "keypress", + YAHOO.widget.Button.onFormKeyPress); + + } + + YAHOO.log("Destroyed.", "info", this.toString()); + + }, + + + fireEvent: function (p_sType , p_aArgs) { + + var sType = arguments[0]; + + // Disabled buttons should not respond to DOM events + + if (this.DOM_EVENTS[sType] && this.get("disabled")) { + + return false; + + } + + return YAHOO.widget.Button.superclass.fireEvent.apply(this, arguments); + + }, + + + /** + * @method toString + * @description Returns a string representing the button. + * @return {String} + */ + toString: function () { + + return ("Button " + this.get("id")); + + } + + }); + + + /** + * @method YAHOO.widget.Button.onFormKeyPress + * @description "keypress" event handler for the button's form. + * @param {Event} p_oEvent Object representing the DOM event object passed + * back by the event utility (YAHOO.util.Event). + */ + YAHOO.widget.Button.onFormKeyPress = function (p_oEvent) { + + var oTarget = Event.getTarget(p_oEvent), + nCharCode = Event.getCharCode(p_oEvent), + sNodeName = oTarget.nodeName && oTarget.nodeName.toUpperCase(), + sType = oTarget.type, + + /* + Boolean indicating if the form contains any enabled or + disabled YUI submit buttons + */ + + bFormContainsYUIButtons = false, + + oButton, + + oYUISubmitButton, // The form's first, enabled YUI submit button + + /* + The form's first, enabled HTML submit button that precedes any + YUI submit button + */ + + oPrecedingSubmitButton, + + oEvent; + + + function isSubmitButton(p_oElement) { + + var sId, + oSrcElement; + + switch (p_oElement.nodeName.toUpperCase()) { + + case "INPUT": + case "BUTTON": + + if (p_oElement.type == "submit" && !p_oElement.disabled) { + + if (!bFormContainsYUIButtons && !oPrecedingSubmitButton) { + + oPrecedingSubmitButton = p_oElement; + + } + + } + + break; + + + default: + + sId = p_oElement.id; + + if (sId) { + + oButton = m_oButtons[sId]; + + if (oButton) { + + bFormContainsYUIButtons = true; + + if (!oButton.get("disabled")) { + + oSrcElement = oButton.get("srcelement"); + + if (!oYUISubmitButton && (oButton.get("type") == "submit" || + (oSrcElement && oSrcElement.type == "submit"))) { + + oYUISubmitButton = oButton; + + } + + } + + } + + } + + break; + + } + + } + + + if (nCharCode == 13 && ((sNodeName == "INPUT" && (sType == "text" || + sType == "password" || sType == "checkbox" || sType == "radio" || + sType == "file")) || sNodeName == "SELECT")) { + + Dom.getElementsBy(isSubmitButton, "*", this); + + + if (oPrecedingSubmitButton) { + + /* + Need to set focus to the first enabled submit button + to make sure that IE includes its name and value + in the form's data set. + */ + + oPrecedingSubmitButton.focus(); + + } + else if (!oPrecedingSubmitButton && oYUISubmitButton) { + + /* + Need to call "preventDefault" to ensure that the form doesn't end up getting + submitted twice. + */ + + Event.preventDefault(p_oEvent); + + + if (UA.ie) { + + oYUISubmitButton.get("element").fireEvent("onclick"); + + } + else { + + oEvent = document.createEvent("HTMLEvents"); + oEvent.initEvent("click", true, true); + + + if (UA.gecko < 1.9) { + + oYUISubmitButton.fireEvent("click", oEvent); + + } + else { + + oYUISubmitButton.get("element").dispatchEvent(oEvent); + + } + + } + + } + + } + + }; + + + /** + * @method YAHOO.widget.Button.addHiddenFieldsToForm + * @description Searches the specified form and adds hidden fields for + * instances of YAHOO.widget.Button that are of type "radio," "checkbox," + * "menu," and "split." + * @param {HTMLFormElement} p_oForm Object reference + * for the form to search. + */ + YAHOO.widget.Button.addHiddenFieldsToForm = function (p_oForm) { + + var aButtons = Dom.getElementsByClassName( + YAHOO.widget.Button.prototype.CSS_CLASS_NAME, + "*", + p_oForm), + + nButtons = aButtons.length, + oButton, + sId, + i; + + if (nButtons > 0) { + + YAHOO.log("Form contains " + nButtons + " YUI buttons.", "info", this.toString()); + + for (i = 0; i < nButtons; i++) { + + sId = aButtons[i].id; + + if (sId) { + + oButton = m_oButtons[sId]; + + if (oButton) { + + oButton.createHiddenFields(); + + } + + } + + } + + } + + }; + + + /** + * @method YAHOO.widget.Button.getButton + * @description Returns a button with the specified id. + * @param {String} p_sId String specifying the id of the root node of the + * HTML element representing the button to be retrieved. + * @return {YAHOO.widget.Button} + */ + YAHOO.widget.Button.getButton = function (p_sId) { + + return m_oButtons[p_sId]; + + }; + + + // Events + + + /** + * @event focus + * @description Fires when the menu item receives focus. Passes back a + * single object representing the original DOM event object passed back by + * the event utility (YAHOO.util.Event) when the event was fired. See + * Element.addListener + * for more information on listening for this event. + * @type YAHOO.util.CustomEvent + */ + + + /** + * @event blur + * @description Fires when the menu item loses the input focus. Passes back + * a single object representing the original DOM event object passed back by + * the event utility (YAHOO.util.Event) when the event was fired. See + * Element.addListener for + * more information on listening for this event. + * @type YAHOO.util.CustomEvent + */ + + + /** + * @event option + * @description Fires when the user invokes the button's option. Passes + * back a single object representing the original DOM event (either + * "mousedown" or "keydown") that caused the "option" event to fire. See + * Element.addListener + * for more information on listening for this event. + * @type YAHOO.util.CustomEvent + */ + +})(); +(function () { + + // Shorthard for utilities + + var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event, + Lang = YAHOO.lang, + Button = YAHOO.widget.Button, + + // Private collection of radio buttons + + m_oButtons = {}; + + + + /** + * The ButtonGroup class creates a set of buttons that are mutually + * exclusive; checking one button in the set will uncheck all others in the + * button group. + * @param {String} p_oElement String specifying the id attribute of the + * <div> element of the button group. + * @param {HTMLDivElement} p_oElement Object + * specifying the <div> element of the button group. + * @param {Object} p_oElement Object literal specifying a set of + * configuration attributes used to create the button group. + * @param {Object} p_oAttributes Optional. Object literal specifying a set + * of configuration attributes used to create the button group. + * @namespace YAHOO.widget + * @class ButtonGroup + * @constructor + * @extends YAHOO.util.Element + */ + YAHOO.widget.ButtonGroup = function (p_oElement, p_oAttributes) { + + var fnSuperClass = YAHOO.widget.ButtonGroup.superclass.constructor, + sNodeName, + oElement, + sId; + + if (arguments.length == 1 && !Lang.isString(p_oElement) && + !p_oElement.nodeName) { + + if (!p_oElement.id) { + + sId = Dom.generateId(); + + p_oElement.id = sId; + + YAHOO.log("No value specified for the button group's \"id\"" + + " attribute. Setting button group id to \"" + sId + "\".", + "info"); + + } + + this.logger = new YAHOO.widget.LogWriter("ButtonGroup " + sId); + + this.logger.log("No source HTML element. Building the button " + + "group using the set of configuration attributes."); + + fnSuperClass.call(this, (this._createGroupElement()), p_oElement); + + } + else if (Lang.isString(p_oElement)) { + + oElement = Dom.get(p_oElement); + + if (oElement) { + + if (oElement.nodeName.toUpperCase() == this.NODE_NAME) { + + this.logger = + new YAHOO.widget.LogWriter("ButtonGroup " + p_oElement); + + fnSuperClass.call(this, oElement, p_oAttributes); + + } + + } + + } + else { + + sNodeName = p_oElement.nodeName.toUpperCase(); + + if (sNodeName && sNodeName == this.NODE_NAME) { + + if (!p_oElement.id) { + + p_oElement.id = Dom.generateId(); + + YAHOO.log("No value specified for the button group's" + + " \"id\" attribute. Setting button group id " + + "to \"" + p_oElement.id + "\".", "warn"); + + } + + this.logger = + new YAHOO.widget.LogWriter("ButtonGroup " + p_oElement.id); + + fnSuperClass.call(this, p_oElement, p_oAttributes); + + } + + } + + }; + + + YAHOO.extend(YAHOO.widget.ButtonGroup, YAHOO.util.Element, { + + + // Protected properties + + + /** + * @property _buttons + * @description Array of buttons in the button group. + * @default null + * @protected + * @type Array + */ + _buttons: null, + + + + // Constants + + + /** + * @property NODE_NAME + * @description The name of the tag to be used for the button + * group's element. + * @default "DIV" + * @final + * @type String + */ + NODE_NAME: "DIV", + + + /** + * @property CSS_CLASS_NAME + * @description String representing the CSS class(es) to be applied + * to the button group's element. + * @default "yui-buttongroup" + * @final + * @type String + */ + CSS_CLASS_NAME: "yui-buttongroup", + + + + // Protected methods + + + /** + * @method _createGroupElement + * @description Creates the button group's element. + * @protected + * @return {HTMLDivElement} + */ + _createGroupElement: function () { + + var oElement = document.createElement(this.NODE_NAME); + + return oElement; + + }, + + + + // Protected attribute setter methods + + + /** + * @method _setDisabled + * @description Sets the value of the button groups's + * "disabled" attribute. + * @protected + * @param {Boolean} p_bDisabled Boolean indicating the value for + * the button group's "disabled" attribute. + */ + _setDisabled: function (p_bDisabled) { + + var nButtons = this.getCount(), + i; + + if (nButtons > 0) { + + i = nButtons - 1; + + do { + + this._buttons[i].set("disabled", p_bDisabled); + + } + while (i--); + + } + + }, + + + + // Protected event handlers + + + /** + * @method _onKeyDown + * @description "keydown" event handler for the button group. + * @protected + * @param {Event} p_oEvent Object representing the DOM event object + * passed back by the event utility (YAHOO.util.Event). + */ + _onKeyDown: function (p_oEvent) { + + var oTarget = Event.getTarget(p_oEvent), + nCharCode = Event.getCharCode(p_oEvent), + sId = oTarget.parentNode.parentNode.id, + oButton = m_oButtons[sId], + nIndex = -1; + + + if (nCharCode == 37 || nCharCode == 38) { + + nIndex = (oButton.index === 0) ? + (this._buttons.length - 1) : (oButton.index - 1); + + } + else if (nCharCode == 39 || nCharCode == 40) { + + nIndex = (oButton.index === (this._buttons.length - 1)) ? + 0 : (oButton.index + 1); + + } + + + if (nIndex > -1) { + + this.check(nIndex); + this.getButton(nIndex).focus(); + + } + + }, + + + /** + * @method _onAppendTo + * @description "appendTo" event handler for the button group. + * @protected + * @param {Event} p_oEvent Object representing the event that was fired. + */ + _onAppendTo: function (p_oEvent) { + + var aButtons = this._buttons, + nButtons = aButtons.length, + i; + + for (i = 0; i < nButtons; i++) { + + aButtons[i].appendTo(this.get("element")); + + } + + }, + + + /** + * @method _onButtonCheckedChange + * @description "checkedChange" event handler for each button in the + * button group. + * @protected + * @param {Event} p_oEvent Object representing the event that was fired. + * @param {YAHOO.widget.Button} + * p_oButton Object representing the button that fired the event. + */ + _onButtonCheckedChange: function (p_oEvent, p_oButton) { + + var bChecked = p_oEvent.newValue, + oCheckedButton = this.get("checkedButton"); + + if (bChecked && oCheckedButton != p_oButton) { + + if (oCheckedButton) { + + oCheckedButton.set("checked", false, true); + + } + + this.set("checkedButton", p_oButton); + this.set("value", p_oButton.get("value")); + + } + else if (oCheckedButton && !oCheckedButton.set("checked")) { + + oCheckedButton.set("checked", true, true); + + } + + }, + + + + // Public methods + + + /** + * @method init + * @description The ButtonGroup class's initialization method. + * @param {String} p_oElement String specifying the id attribute of the + * <div> element of the button group. + * @param {HTMLDivElement} p_oElement Object + * specifying the <div> element of the button group. + * @param {Object} p_oElement Object literal specifying a set of + * configuration attributes used to create the button group. + * @param {Object} p_oAttributes Optional. Object literal specifying a + * set of configuration attributes used to create the button group. + */ + init: function (p_oElement, p_oAttributes) { + + this._buttons = []; + + YAHOO.widget.ButtonGroup.superclass.init.call(this, p_oElement, + p_oAttributes); + + this.addClass(this.CSS_CLASS_NAME); + + this.logger.log("Searching for child nodes with the class name " + + "\"yui-radio-button\" to add to the button group."); + + var aButtons = this.getElementsByClassName("yui-radio-button"); + + + if (aButtons.length > 0) { + + this.logger.log("Found " + aButtons.length + + " child nodes with the class name \"yui-radio-button.\"" + + " Attempting to add to button group."); + + this.addButtons(aButtons); + + } + + + this.logger.log("Searching for child nodes with the type of " + + " \"radio\" to add to the button group."); + + function isRadioButton(p_oElement) { + + return (p_oElement.type == "radio"); + + } + + aButtons = + Dom.getElementsBy(isRadioButton, "input", this.get("element")); + + + if (aButtons.length > 0) { + + this.logger.log("Found " + aButtons.length + " child nodes" + + " with the type of \"radio.\" Attempting to add to" + + " button group."); + + this.addButtons(aButtons); + + } + + this.on("keydown", this._onKeyDown); + this.on("appendTo", this._onAppendTo); + + + var oContainer = this.get("container"); + + if (oContainer) { + + if (Lang.isString(oContainer)) { + + Event.onContentReady(oContainer, function () { + + this.appendTo(oContainer); + + }, null, this); + + } + else { + + this.appendTo(oContainer); + + } + + } + + + this.logger.log("Initialization completed."); + + }, + + + /** + * @method initAttributes + * @description Initializes all of the configuration attributes used to + * create the button group. + * @param {Object} p_oAttributes Object literal specifying a set of + * configuration attributes used to create the button group. + */ + initAttributes: function (p_oAttributes) { + + var oAttributes = p_oAttributes || {}; + + YAHOO.widget.ButtonGroup.superclass.initAttributes.call( + this, oAttributes); + + + /** + * @attribute name + * @description String specifying the name for the button group. + * This name will be applied to each button in the button group. + * @default null + * @type String + */ + this.setAttributeConfig("name", { + + value: oAttributes.name, + validator: Lang.isString + + }); + + + /** + * @attribute disabled + * @description Boolean indicating if the button group should be + * disabled. Disabling the button group will disable each button + * in the button group. Disabled buttons are dimmed and will not + * respond to user input or fire events. + * @default false + * @type Boolean + */ + this.setAttributeConfig("disabled", { + + value: (oAttributes.disabled || false), + validator: Lang.isBoolean, + method: this._setDisabled + + }); + + + /** + * @attribute value + * @description Object specifying the value for the button group. + * @default null + * @type Object + */ + this.setAttributeConfig("value", { + + value: oAttributes.value + + }); + + + /** + * @attribute container + * @description HTML element reference or string specifying the id + * attribute of the HTML element that the button group's markup + * should be rendered into. + * @type HTMLElement|String + * @default null + */ + this.setAttributeConfig("container", { + + value: oAttributes.container, + writeOnce: true + + }); + + + /** + * @attribute checkedButton + * @description Reference for the button in the button group that + * is checked. + * @type {YAHOO.widget.Button} + * @default null + */ + this.setAttributeConfig("checkedButton", { + + value: null + + }); + + }, + + + /** + * @method addButton + * @description Adds the button to the button group. + * @param {YAHOO.widget.Button} + * p_oButton Object reference for the + * YAHOO.widget.Button instance to be added to the button group. + * @param {String} p_oButton String specifying the id attribute of the + * <input> or <span> element + * to be used to create the button to be added to the button group. + * @param {HTMLInputElement|HTMLElement} p_oButton Object reference for the + * <input> or <span> element + * to be used to create the button to be added to the button group. + * @param {Object} p_oButton Object literal specifying a set of + * YAHOO.widget.Button + * configuration attributes used to configure the button to be added to + * the button group. + * @return {YAHOO.widget.Button} + */ + addButton: function (p_oButton) { + + var oButton, + oButtonElement, + oGroupElement, + nIndex, + sButtonName, + sGroupName; + + + if (p_oButton instanceof Button && + p_oButton.get("type") == "radio") { + + oButton = p_oButton; + + } + else if (!Lang.isString(p_oButton) && !p_oButton.nodeName) { + + p_oButton.type = "radio"; + + oButton = new Button(p_oButton); + + } + else { + + oButton = new Button(p_oButton, { type: "radio" }); + + } + + + if (oButton) { + + nIndex = this._buttons.length; + sButtonName = oButton.get("name"); + sGroupName = this.get("name"); + + oButton.index = nIndex; + + this._buttons[nIndex] = oButton; + m_oButtons[oButton.get("id")] = oButton; + + + if (sButtonName != sGroupName) { + + oButton.set("name", sGroupName); + + } + + + if (this.get("disabled")) { + + oButton.set("disabled", true); + + } + + + if (oButton.get("checked")) { + + this.set("checkedButton", oButton); + + } + + + oButtonElement = oButton.get("element"); + oGroupElement = this.get("element"); + + if (oButtonElement.parentNode != oGroupElement) { + + oGroupElement.appendChild(oButtonElement); + + } + + + oButton.on("checkedChange", + this._onButtonCheckedChange, oButton, this); + + this.logger.log("Button " + oButton.get("id") + " added."); + + } + + return oButton; + + }, + + + /** + * @method addButtons + * @description Adds the array of buttons to the button group. + * @param {Array} p_aButtons Array of + * YAHOO.widget.Button instances to be added + * to the button group. + * @param {Array} p_aButtons Array of strings specifying the id + * attribute of the <input> or <span> + * elements to be used to create the buttons to be added to the + * button group. + * @param {Array} p_aButtons Array of object references for the + * <input> or <span> elements + * to be used to create the buttons to be added to the button group. + * @param {Array} p_aButtons Array of object literals, each containing + * a set of YAHOO.widget.Button + * configuration attributes used to configure each button to be added + * to the button group. + * @return {Array} + */ + addButtons: function (p_aButtons) { + + var nButtons, + oButton, + aButtons, + i; + + if (Lang.isArray(p_aButtons)) { + + nButtons = p_aButtons.length; + aButtons = []; + + if (nButtons > 0) { + + for (i = 0; i < nButtons; i++) { + + oButton = this.addButton(p_aButtons[i]); + + if (oButton) { + + aButtons[aButtons.length] = oButton; + + } + + } + + } + + } + + return aButtons; + + }, + + + /** + * @method removeButton + * @description Removes the button at the specified index from the + * button group. + * @param {Number} p_nIndex Number specifying the index of the button + * to be removed from the button group. + */ + removeButton: function (p_nIndex) { + + var oButton = this.getButton(p_nIndex), + nButtons, + i; + + if (oButton) { + + this.logger.log("Removing button " + oButton.get("id") + "."); + + this._buttons.splice(p_nIndex, 1); + delete m_oButtons[oButton.get("id")]; + + oButton.removeListener("checkedChange", + this._onButtonCheckedChange); + + oButton.destroy(); + + + nButtons = this._buttons.length; + + if (nButtons > 0) { + + i = this._buttons.length - 1; + + do { + + this._buttons[i].index = i; + + } + while (i--); + + } + + this.logger.log("Button " + oButton.get("id") + " removed."); + + } + + }, + + + /** + * @method getButton + * @description Returns the button at the specified index. + * @param {Number} p_nIndex The index of the button to retrieve from the + * button group. + * @return {YAHOO.widget.Button} + */ + getButton: function (p_nIndex) { + + return this._buttons[p_nIndex]; + + }, + + + /** + * @method getButtons + * @description Returns an array of the buttons in the button group. + * @return {Array} + */ + getButtons: function () { + + return this._buttons; + + }, + + + /** + * @method getCount + * @description Returns the number of buttons in the button group. + * @return {Number} + */ + getCount: function () { + + return this._buttons.length; + + }, + + + /** + * @method focus + * @description Sets focus to the button at the specified index. + * @param {Number} p_nIndex Number indicating the index of the button + * to focus. + */ + focus: function (p_nIndex) { + + var oButton, + nButtons, + i; + + if (Lang.isNumber(p_nIndex)) { + + oButton = this._buttons[p_nIndex]; + + if (oButton) { + + oButton.focus(); + + } + + } + else { + + nButtons = this.getCount(); + + for (i = 0; i < nButtons; i++) { + + oButton = this._buttons[i]; + + if (!oButton.get("disabled")) { + + oButton.focus(); + break; + + } + + } + + } + + }, + + + /** + * @method check + * @description Checks the button at the specified index. + * @param {Number} p_nIndex Number indicating the index of the button + * to check. + */ + check: function (p_nIndex) { + + var oButton = this.getButton(p_nIndex); + + if (oButton) { + + oButton.set("checked", true); + + } + + }, + + + /** + * @method destroy + * @description Removes the button group's element from its parent + * element and removes all event handlers. + */ + destroy: function () { + + this.logger.log("Destroying..."); + + var nButtons = this._buttons.length, + oElement = this.get("element"), + oParentNode = oElement.parentNode, + i; + + if (nButtons > 0) { + + i = this._buttons.length - 1; + + do { + + this._buttons[i].destroy(); + + } + while (i--); + + } + + this.logger.log("Removing DOM event handlers."); + + Event.purgeElement(oElement); + + this.logger.log("Removing from document."); + + oParentNode.removeChild(oElement); + + }, + + + /** + * @method toString + * @description Returns a string representing the button group. + * @return {String} + */ + toString: function () { + + return ("ButtonGroup " + this.get("id")); + + } + + }); + +})(); +YAHOO.register("button", YAHOO.widget.Button, {version: "2.6.0", build: "1321"}); diff --git a/webdir/javascript/yui/button/button-min.js b/webdir/javascript/yui/button/button-min.js new file mode 100644 index 0000000..84fb3fb --- /dev/null +++ b/webdir/javascript/yui/button/button-min.js @@ -0,0 +1,11 @@ +/* +Copyright (c) 2008, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.6.0 +*/ +(function(){var G=YAHOO.util.Dom,M=YAHOO.util.Event,I=YAHOO.lang,L=YAHOO.env.ua,B=YAHOO.widget.Overlay,J=YAHOO.widget.Menu,D={},K=null,E=null,C=null;function F(O,N,R,P){var S,Q;if(I.isString(O)&&I.isString(N)){if(L.ie){Q='0){U.label=Q;}}}function A(P){var O=P.attributes,N=O.srcelement,R=N.nodeName.toUpperCase(),Q=this;if(R==this.NODE_NAME){P.element=N;P.id=N.id;G.getElementsBy(function(S){switch(S.nodeName.toUpperCase()){case"BUTTON":case"A":case"INPUT":H.call(Q,S,O);break;}},"*",N);}else{switch(R){case"BUTTON":case"A":case"INPUT":H.call(this,N,O);break;}}}YAHOO.widget.Button=function(R,O){if(!B&&YAHOO.widget.Overlay){B=YAHOO.widget.Overlay;}if(!J&&YAHOO.widget.Menu){J=YAHOO.widget.Menu;}var Q=YAHOO.widget.Button.superclass.constructor,P,N;if(arguments.length==1&&!I.isString(R)&&!R.nodeName){if(!R.id){R.id=G.generateId();}Q.call(this,(this.createButtonElement(R.type)),R);}else{P={element:null,attributes:(O||{})};if(I.isString(R)){N=G.get(R);if(N){if(!P.attributes.id){P.attributes.id=R;}P.attributes.srcelement=N;A.call(this,P);if(!P.element){P.element=this.createButtonElement(P.attributes.type);}Q.call(this,P.element,P.attributes);}}else{if(R.nodeName){if(!P.attributes.id){if(R.id){P.attributes.id=R.id;}else{P.attributes.id=G.generateId();}}P.attributes.srcelement=R;A.call(this,P);if(!P.element){P.element=this.createButtonElement(P.attributes.type);}Q.call(this,P.element,P.attributes);}}}};YAHOO.extend(YAHOO.widget.Button,YAHOO.util.Element,{_button:null,_menu:null,_hiddenFields:null,_onclickAttributeValue:null,_activationKeyPressed:false,_activationButtonPressed:false,_hasKeyEventHandlers:false,_hasMouseEventHandlers:false,_nOptionRegionX:0,NODE_NAME:"SPAN",CHECK_ACTIVATION_KEYS:[32],ACTIVATION_KEYS:[13,32],OPTION_AREA_WIDTH:20,CSS_CLASS_NAME:"yui-button",RADIO_DEFAULT_TITLE:"Unchecked. Click to check.",RADIO_CHECKED_TITLE:"Checked. Click another button to uncheck",CHECKBOX_DEFAULT_TITLE:"Unchecked. Click to check.",CHECKBOX_CHECKED_TITLE:"Checked. Click to uncheck.",MENUBUTTON_DEFAULT_TITLE:"Menu collapsed. Click to expand.",MENUBUTTON_MENU_VISIBLE_TITLE:"Menu expanded. Click or press Esc to collapse.",SPLITBUTTON_DEFAULT_TITLE:("Menu collapsed. Click inside option "+"region or press down arrow key to show the menu."),SPLITBUTTON_OPTION_VISIBLE_TITLE:"Menu expanded. Press Esc to hide the menu.",SUBMIT_TITLE:"Click to submit form.",_setType:function(N){if(N=="split"){this.on("option",this._onOption);}},_setLabel:function(O){this._button.innerHTML=O;var P,N=L.gecko;if(N&&N<1.9&&G.inDocument(this.get("element"))){P=this.CSS_CLASS_NAME;this.removeClass(P);I.later(0,this,this.addClass,P);}},_setTabIndex:function(N){this._button.tabIndex=N;},_setTitle:function(O){var N=O;if(this.get("type")!="link"){if(!N){switch(this.get("type")){case"radio":N=this.RADIO_DEFAULT_TITLE;break;case"checkbox":N=this.CHECKBOX_DEFAULT_TITLE;break;case"menu":N=this.MENUBUTTON_DEFAULT_TITLE;break;case"split":N=this.SPLITBUTTON_DEFAULT_TITLE;break;case"submit":N=this.SUBMIT_TITLE;break;}}this._button.title=N;}},_setDisabled:function(N){if(this.get("type")!="link"){if(N){if(this._menu){this._menu.hide();}if(this.hasFocus()){this.blur();}this._button.setAttribute("disabled","disabled");this.addStateCSSClasses("disabled");this.removeStateCSSClasses("hover");this.removeStateCSSClasses("active");this.removeStateCSSClasses("focus");}else{this._button.removeAttribute("disabled");this.removeStateCSSClasses("disabled");}}},_setHref:function(N){if(this.get("type")=="link"){this._button.href=N;}},_setTarget:function(N){if(this.get("type")=="link"){this._button.setAttribute("target",N);}},_setChecked:function(O){var P=this.get("type"),N;if(P=="checkbox"||P=="radio"){if(O){this.addStateCSSClasses("checked");N=(P=="radio")?this.RADIO_CHECKED_TITLE:this.CHECKBOX_CHECKED_TITLE;}else{this.removeStateCSSClasses("checked");N=(P=="radio")?this.RADIO_DEFAULT_TITLE:this.CHECKBOX_DEFAULT_TITLE;}if(!this._hasDefaultTitle){this.set("title",N);}}},_setMenu:function(Y){var R=this.get("lazyloadmenu"),U=this.get("element"),N,a=false,b,Q,T,P,O,X,S;function Z(){b.render(U.parentNode);this.removeListener("appendTo",Z);}function W(){b.cfg.queueProperty("container",U.parentNode);this.removeListener("appendTo",W);}function V(){var c;if(b){G.addClass(b.element,this.get("menuclassname"));G.addClass(b.element,"yui-"+this.get("type")+"-button-menu");b.showEvent.subscribe(this._onMenuShow,null,this);b.hideEvent.subscribe(this._onMenuHide,null,this);b.renderEvent.subscribe(this._onMenuRender,null,this);if(J&&b instanceof J){if(R){c=this.get("container");if(c){b.cfg.queueProperty("container",c);}else{this.on("appendTo",W);}}b.cfg.queueProperty("clicktohide",false);b.keyDownEvent.subscribe(this._onMenuKeyDown,this,true);b.subscribe("click",this._onMenuClick,this,true);b.itemAddedEvent.subscribe(this._onMenuItemAdded,this,true);T=b.srcElement;if(T&&T.nodeName.toUpperCase()=="SELECT"){T.style.display="none";T.parentNode.removeChild(T);}}else{if(B&&b instanceof B){if(!K){K=new YAHOO.widget.OverlayManager(); +}K.register(b);}}this._menu=b;if(!a&&!R){if(G.inDocument(U)){b.render(U.parentNode);}else{this.on("appendTo",Z);}}}}if(B){if(J){N=J.prototype.CSS_CLASS_NAME;}if(Y&&J&&(Y instanceof J)){b=Y;P=b.getItems();O=P.length;a=true;if(O>0){S=O-1;do{X=P[S];if(X){X.cfg.subscribeToConfigEvent("selected",this._onMenuItemSelected,X,this);}}while(S--);}V.call(this);}else{if(B&&Y&&(Y instanceof B)){b=Y;a=true;b.cfg.queueProperty("visible",false);V.call(this);}else{if(J&&I.isArray(Y)){b=new J(G.generateId(),{lazyload:R,itemdata:Y});this._menu=b;this.on("appendTo",V);}else{if(I.isString(Y)){Q=G.get(Y);if(Q){if(J&&G.hasClass(Q,N)||Q.nodeName.toUpperCase()=="SELECT"){b=new J(Y,{lazyload:R});V.call(this);}else{if(B){b=new B(Y,{visible:false});V.call(this);}}}}else{if(Y&&Y.nodeName){if(J&&G.hasClass(Y,N)||Y.nodeName.toUpperCase()=="SELECT"){b=new J(Y,{lazyload:R});V.call(this);}else{if(B){if(!Y.id){G.generateId(Y);}b=new B(Y,{visible:false});V.call(this);}}}}}}}}},_setOnClick:function(N){if(this._onclickAttributeValue&&(this._onclickAttributeValue!=N)){this.removeListener("click",this._onclickAttributeValue.fn);this._onclickAttributeValue=null;}if(!this._onclickAttributeValue&&I.isObject(N)&&I.isFunction(N.fn)){this.on("click",N.fn,N.obj,N.scope);this._onclickAttributeValue=N;}},_setSelectedMenuItem:function(O){var N=this._menu,P;if(J&&N&&N instanceof J){P=N.getItem(O);if(P&&!P.cfg.getProperty("selected")){P.cfg.setProperty("selected",true);}}},_isActivationKey:function(N){var S=this.get("type"),O=(S=="checkbox"||S=="radio")?this.CHECK_ACTIVATION_KEYS:this.ACTIVATION_KEYS,Q=O.length,R=false,P;if(Q>0){P=Q-1;do{if(N==O[P]){R=true;break;}}while(P--);}return R;},_isSplitButtonOptionKey:function(P){var O=(M.getCharCode(P)==40);var N=function(Q){M.preventDefault(Q);this.removeListener("keypress",N);};if(O){if(L.opera){this.on("keypress",N);}M.preventDefault(P);}return O;},_addListenersToForm:function(){var T=this.getForm(),S=YAHOO.widget.Button.onFormKeyPress,R,N,Q,P,O;if(T){M.on(T,"reset",this._onFormReset,null,this);M.on(T,"submit",this._onFormSubmit,null,this);N=this.get("srcelement");if(this.get("type")=="submit"||(N&&N.type=="submit")){Q=M.getListeners(T,"keypress");R=false;if(Q){P=Q.length;if(P>0){O=P-1;do{if(Q[O].fn==S){R=true;break;}}while(O--);}}if(!R){M.on(T,"keypress",S);}}}},_showMenu:function(R){if(YAHOO.widget.MenuManager){YAHOO.widget.MenuManager.hideVisible();}if(K){K.hideAll();}var N=this._menu,Q=this.get("menualignment"),P=this.get("focusmenu"),O;if(this._renderedMenu){N.cfg.setProperty("context",[this.get("element"),Q[0],Q[1]]);N.cfg.setProperty("preventcontextoverlap",true);N.cfg.setProperty("constraintoviewport",true);}else{N.cfg.queueProperty("context",[this.get("element"),Q[0],Q[1]]);N.cfg.queueProperty("preventcontextoverlap",true);N.cfg.queueProperty("constraintoviewport",true);}this.focus();if(J&&N&&(N instanceof J)){O=N.focus;N.focus=function(){};if(this._renderedMenu){N.cfg.setProperty("minscrollheight",this.get("menuminscrollheight"));N.cfg.setProperty("maxheight",this.get("menumaxheight"));}else{N.cfg.queueProperty("minscrollheight",this.get("menuminscrollheight"));N.cfg.queueProperty("maxheight",this.get("menumaxheight"));}N.show();N.focus=O;N.align();if(R.type=="mousedown"){M.stopPropagation(R);}if(P){N.focus();}}else{if(B&&N&&(N instanceof B)){if(!this._renderedMenu){N.render(this.get("element").parentNode);}N.show();N.align();}}},_hideMenu:function(){var N=this._menu;if(N){N.hide();}},_onMouseOver:function(O){var Q=this.get("type"),N,P;if(Q==="split"){N=this.get("element");P=(G.getX(N)+(N.offsetWidth-this.OPTION_AREA_WIDTH));this._nOptionRegionX=P;}if(!this._hasMouseEventHandlers){if(Q==="split"){this.on("mousemove",this._onMouseMove);}this.on("mouseout",this._onMouseOut);this._hasMouseEventHandlers=true;}this.addStateCSSClasses("hover");if(Q==="split"&&(M.getPageX(O)>P)){this.addStateCSSClasses("hoveroption");}if(this._activationButtonPressed){this.addStateCSSClasses("active");}if(this._bOptionPressed){this.addStateCSSClasses("activeoption");}if(this._activationButtonPressed||this._bOptionPressed){M.removeListener(document,"mouseup",this._onDocumentMouseUp);}},_onMouseMove:function(N){var O=this._nOptionRegionX;if(O){if(M.getPageX(N)>O){this.addStateCSSClasses("hoveroption");}else{this.removeStateCSSClasses("hoveroption");}}},_onMouseOut:function(N){var O=this.get("type");this.removeStateCSSClasses("hover");if(O!="menu"){this.removeStateCSSClasses("active");}if(this._activationButtonPressed||this._bOptionPressed){M.on(document,"mouseup",this._onDocumentMouseUp,null,this);}if(O==="split"&&(M.getPageX(N)>this._nOptionRegionX)){this.removeStateCSSClasses("hoveroption");}},_onDocumentMouseUp:function(P){this._activationButtonPressed=false;this._bOptionPressed=false;var Q=this.get("type"),N,O;if(Q=="menu"||Q=="split"){N=M.getTarget(P);O=this._menu.element;if(N!=O&&!G.isAncestor(O,N)){this.removeStateCSSClasses((Q=="menu"?"active":"activeoption"));this._hideMenu();}}M.removeListener(document,"mouseup",this._onDocumentMouseUp);},_onMouseDown:function(P){var Q,O=true;function N(){this._hideMenu();this.removeListener("mouseup",N);}if((P.which||P.button)==1){if(!this.hasFocus()){this.focus();}Q=this.get("type");if(Q=="split"){if(M.getPageX(P)>this._nOptionRegionX){this.fireEvent("option",P);O=false;}else{this.addStateCSSClasses("active");this._activationButtonPressed=true;}}else{if(Q=="menu"){if(this.isActive()){this._hideMenu();this._activationButtonPressed=false;}else{this._showMenu(P);this._activationButtonPressed=true;}}else{this.addStateCSSClasses("active");this._activationButtonPressed=true;}}if(Q=="split"||Q=="menu"){this._hideMenuTimer=I.later(250,this,this.on,["mouseup",N]);}}return O;},_onMouseUp:function(P){var Q=this.get("type"),N=this._hideMenuTimer,O=true;if(N){N.cancel();}if(Q=="checkbox"||Q=="radio"){this.set("checked",!(this.get("checked")));}this._activationButtonPressed=false;if(Q!="menu"){this.removeStateCSSClasses("active");}if(Q=="split"&&M.getPageX(P)>this._nOptionRegionX){O=false; +}return O;},_onFocus:function(O){var N;this.addStateCSSClasses("focus");if(this._activationKeyPressed){this.addStateCSSClasses("active");}C=this;if(!this._hasKeyEventHandlers){N=this._button;M.on(N,"blur",this._onBlur,null,this);M.on(N,"keydown",this._onKeyDown,null,this);M.on(N,"keyup",this._onKeyUp,null,this);this._hasKeyEventHandlers=true;}this.fireEvent("focus",O);},_onBlur:function(N){this.removeStateCSSClasses("focus");if(this.get("type")!="menu"){this.removeStateCSSClasses("active");}if(this._activationKeyPressed){M.on(document,"keyup",this._onDocumentKeyUp,null,this);}C=null;this.fireEvent("blur",N);},_onDocumentKeyUp:function(N){if(this._isActivationKey(M.getCharCode(N))){this._activationKeyPressed=false;M.removeListener(document,"keyup",this._onDocumentKeyUp);}},_onKeyDown:function(O){var N=this._menu;if(this.get("type")=="split"&&this._isSplitButtonOptionKey(O)){this.fireEvent("option",O);}else{if(this._isActivationKey(M.getCharCode(O))){if(this.get("type")=="menu"){this._showMenu(O);}else{this._activationKeyPressed=true;this.addStateCSSClasses("active");}}}if(N&&N.cfg.getProperty("visible")&&M.getCharCode(O)==27){N.hide();this.focus();}},_onKeyUp:function(N){var O;if(this._isActivationKey(M.getCharCode(N))){O=this.get("type");if(O=="checkbox"||O=="radio"){this.set("checked",!(this.get("checked")));}this._activationKeyPressed=false;if(this.get("type")!="menu"){this.removeStateCSSClasses("active");}}},_onClick:function(Q){var S=this.get("type"),N,R,O,P;switch(S){case"radio":case"checkbox":if(!this._hasDefaultTitle){if(this.get("checked")){N=(S=="radio")?this.RADIO_CHECKED_TITLE:this.CHECKBOX_CHECKED_TITLE;}else{N=(S=="radio")?this.RADIO_DEFAULT_TITLE:this.CHECKBOX_DEFAULT_TITLE;}this.set("title",N);}break;case"submit":if(Q.returnValue!==false){this.submitForm();}break;case"reset":R=this.getForm();if(R){R.reset();}break;case"menu":N=this._menu.cfg.getProperty("visible")?this.MENUBUTTON_MENU_VISIBLE_TITLE:this.MENUBUTTON_DEFAULT_TITLE;this.set("title",N);break;case"split":if(M.getPageX(Q)>this._nOptionRegionX){P=false;}else{this._hideMenu();O=this.get("srcelement");if(O&&O.type=="submit"){this.submitForm();}}N=this._menu.cfg.getProperty("visible")?this.SPLITBUTTON_OPTION_VISIBLE_TITLE:this.SPLITBUTTON_DEFAULT_TITLE;this.set("title",N);break;}return P;},_onDblClick:function(O){var N=true;if(this.get("type")=="split"&&M.getPageX(O)>this._nOptionRegionX){N=false;}return N;},_onAppendTo:function(N){I.later(0,this,this._addListenersToForm);},_onFormReset:function(O){var P=this.get("type"),N=this._menu;if(P=="checkbox"||P=="radio"){this.resetValue("checked");}if(J&&N&&(N instanceof J)){this.resetValue("selectedMenuItem");}},_onFormSubmit:function(N){this.createHiddenFields();},_onDocumentMouseDown:function(Q){var N=M.getTarget(Q),P=this.get("element"),O=this._menu.element;if(N!=P&&!G.isAncestor(P,N)&&N!=O&&!G.isAncestor(O,N)){this._hideMenu();M.removeListener(document,"mousedown",this._onDocumentMouseDown);}},_onOption:function(N){if(this.hasClass("yui-split-button-activeoption")){this._hideMenu();this._bOptionPressed=false;}else{this._showMenu(N);this._bOptionPressed=true;}},_onMenuShow:function(O){M.on(document,"mousedown",this._onDocumentMouseDown,null,this);var N,P;if(this.get("type")=="split"){N=this.SPLITBUTTON_OPTION_VISIBLE_TITLE;P="activeoption";}else{N=this.MENUBUTTON_MENU_VISIBLE_TITLE;P="active";}this.addStateCSSClasses(P);this.set("title",N);},_onMenuHide:function(P){var O=this._menu,N,Q;if(this.get("type")=="split"){N=this.SPLITBUTTON_DEFAULT_TITLE;Q="activeoption";}else{N=this.MENUBUTTON_DEFAULT_TITLE;Q="active";}this.removeStateCSSClasses(Q);this.set("title",N);if(this.get("type")=="split"){this._bOptionPressed=false;}},_onMenuKeyDown:function(P,O){var N=O[0];if(M.getCharCode(N)==27){this.focus();if(this.get("type")=="split"){this._bOptionPressed=false;}}},_onMenuRender:function(O){var Q=this.get("element"),N=Q.parentNode,P=this._menu.element;if(N!=P.parentNode){N.appendChild(P);}this._renderedMenu=true;this.set("selectedMenuItem",this.get("selectedMenuItem"));},_onMenuItemSelected:function(P,O,N){var Q=O[0];if(Q){this.set("selectedMenuItem",N);}},_onMenuItemAdded:function(P,O,N){var Q=O[0];Q.cfg.subscribeToConfigEvent("selected",this._onMenuItemSelected,Q,this);},_onMenuClick:function(O,N){var Q=N[1],P;if(Q){this.set("selectedMenuItem",Q);P=this.get("srcelement");if(P&&P.type=="submit"){this.submitForm();}this._hideMenu();}},createButtonElement:function(N){var P=this.NODE_NAME,O=document.createElement(P);O.innerHTML="<"+P+' class="first-child">'+(N=="link"?"":'')+"";return O;},addStateCSSClasses:function(N){var O=this.get("type");if(I.isString(N)){if(N!="activeoption"&&N!="hoveroption"){this.addClass(this.CSS_CLASS_NAME+("-"+N));}this.addClass("yui-"+O+("-button-"+N));}},removeStateCSSClasses:function(N){var O=this.get("type");if(I.isString(N)){this.removeClass(this.CSS_CLASS_NAME+("-"+N));this.removeClass("yui-"+O+("-button-"+N));}},createHiddenFields:function(){this.removeHiddenFields();var V=this.getForm(),Z,O,S,X,Y,T,U,N,R,W,P,Q=false;if(V&&!this.get("disabled")){O=this.get("type");S=(O=="checkbox"||O=="radio");if((S&&this.get("checked"))||(E==this)){Z=F((S?O:"hidden"),this.get("name"),this.get("value"),this.get("checked"));if(Z){if(S){Z.style.display="none";}V.appendChild(Z);}}X=this._menu;if(J&&X&&(X instanceof J)){Y=this.get("selectedMenuItem");P=X.srcElement;Q=(P&&P.nodeName.toUpperCase()=="SELECT");if(Y){U=(Y.value===null||Y.value==="")?Y.cfg.getProperty("text"):Y.value;T=this.get("name");if(Q){W=P.name;}else{if(T){W=(T+"_options");}}if(U&&W){N=F("hidden",W,U);V.appendChild(N);}}else{if(Q){V.appendChild(P);}}}if(Z&&N){this._hiddenFields=[Z,N];}else{if(!Z&&N){this._hiddenFields=N;}else{if(Z&&!N){this._hiddenFields=Z;}}}R=this._hiddenFields;}return R;},removeHiddenFields:function(){var Q=this._hiddenFields,O,P;function N(R){if(G.inDocument(R)){R.parentNode.removeChild(R);}}if(Q){if(I.isArray(Q)){O=Q.length;if(O>0){P=O-1; +do{N(Q[P]);}while(P--);}}else{N(Q);}this._hiddenFields=null;}},submitForm:function(){var Q=this.getForm(),P=this.get("srcelement"),O=false,N;if(Q){if(this.get("type")=="submit"||(P&&P.type=="submit")){E=this;}if(L.ie){O=Q.fireEvent("onsubmit");}else{N=document.createEvent("HTMLEvents");N.initEvent("submit",true,true);O=Q.dispatchEvent(N);}if((L.ie||L.webkit)&&O){Q.submit();}}return O;},init:function(O,Z){var Q=Z.type=="link"?"a":"button",V=Z.srcelement,Y=O.getElementsByTagName(Q)[0],X;if(!Y){X=O.getElementsByTagName("input")[0];if(X){Y=document.createElement("button");Y.setAttribute("type","button");X.parentNode.replaceChild(Y,X);}}this._button=Y;this._hasDefaultTitle=(Z.title&&Z.title.length>0);YAHOO.widget.Button.superclass.init.call(this,O,Z);var T=this.get("id"),N=T+"-button";Y.id=N;var U,W;var c=function(d){return(d.htmlFor===T);};var S=function(){W.setAttribute((L.ie?"htmlFor":"for"),N);};if(V&&this.get("type")!="link"){U=G.getElementsBy(c,"label");if(I.isArray(U)&&U.length>0){W=U[0];}}D[T]=this;this.addClass(this.CSS_CLASS_NAME);this.addClass("yui-"+this.get("type")+"-button");M.on(this._button,"focus",this._onFocus,null,this);this.on("mouseover",this._onMouseOver);this.on("mousedown",this._onMouseDown);this.on("mouseup",this._onMouseUp);this.on("click",this._onClick);this.on("dblclick",this._onDblClick);if(W){this.on("appendTo",S);}this.on("appendTo",this._onAppendTo);var b=this.get("container"),P=this.get("element"),a=G.inDocument(P),R;if(b){if(V&&V!=P){R=V.parentNode;if(R){R.removeChild(V);}}if(I.isString(b)){M.onContentReady(b,this.appendTo,b,this);}else{this.on("init",function(){I.later(0,this,this.appendTo,b);});}}else{if(!a&&V&&V!=P){R=V.parentNode;if(R){this.fireEvent("beforeAppendTo",{type:"beforeAppendTo",target:R});R.replaceChild(P,V);this.fireEvent("appendTo",{type:"appendTo",target:R});}}else{if(this.get("type")!="link"&&a&&V&&V==P){this._addListenersToForm();}}}this.fireEvent("init",{type:"init",target:this});},initAttributes:function(O){var N=O||{};YAHOO.widget.Button.superclass.initAttributes.call(this,N);this.setAttributeConfig("type",{value:(N.type||"push"),validator:I.isString,writeOnce:true,method:this._setType});this.setAttributeConfig("label",{value:N.label,validator:I.isString,method:this._setLabel});this.setAttributeConfig("value",{value:N.value});this.setAttributeConfig("name",{value:N.name,validator:I.isString});this.setAttributeConfig("tabindex",{value:N.tabindex,validator:I.isNumber,method:this._setTabIndex});this.configureAttribute("title",{value:N.title,validator:I.isString,method:this._setTitle});this.setAttributeConfig("disabled",{value:(N.disabled||false),validator:I.isBoolean,method:this._setDisabled});this.setAttributeConfig("href",{value:N.href,validator:I.isString,method:this._setHref});this.setAttributeConfig("target",{value:N.target,validator:I.isString,method:this._setTarget});this.setAttributeConfig("checked",{value:(N.checked||false),validator:I.isBoolean,method:this._setChecked});this.setAttributeConfig("container",{value:N.container,writeOnce:true});this.setAttributeConfig("srcelement",{value:N.srcelement,writeOnce:true});this.setAttributeConfig("menu",{value:null,method:this._setMenu,writeOnce:true});this.setAttributeConfig("lazyloadmenu",{value:(N.lazyloadmenu===false?false:true),validator:I.isBoolean,writeOnce:true});this.setAttributeConfig("menuclassname",{value:(N.menuclassname||"yui-button-menu"),validator:I.isString,method:this._setMenuClassName,writeOnce:true});this.setAttributeConfig("menuminscrollheight",{value:(N.menuminscrollheight||90),validator:I.isNumber});this.setAttributeConfig("menumaxheight",{value:(N.menumaxheight||0),validator:I.isNumber});this.setAttributeConfig("menualignment",{value:(N.menualignment||["tl","bl"]),validator:I.isArray});this.setAttributeConfig("selectedMenuItem",{value:null,method:this._setSelectedMenuItem});this.setAttributeConfig("onclick",{value:N.onclick,method:this._setOnClick});this.setAttributeConfig("focusmenu",{value:(N.focusmenu===false?false:true),validator:I.isBoolean});},focus:function(){if(!this.get("disabled")){this._button.focus();}},blur:function(){if(!this.get("disabled")){this._button.blur();}},hasFocus:function(){return(C==this);},isActive:function(){return this.hasClass(this.CSS_CLASS_NAME+"-active");},getMenu:function(){return this._menu;},getForm:function(){var N=this._button,O;if(N){O=N.form;}return O;},getHiddenFields:function(){return this._hiddenFields;},destroy:function(){var P=this.get("element"),O=P.parentNode,N=this._menu,R;if(N){if(K&&K.find(N)){K.remove(N);}N.destroy();}M.purgeElement(P);M.purgeElement(this._button);M.removeListener(document,"mouseup",this._onDocumentMouseUp);M.removeListener(document,"keyup",this._onDocumentKeyUp);M.removeListener(document,"mousedown",this._onDocumentMouseDown);var Q=this.getForm();if(Q){M.removeListener(Q,"reset",this._onFormReset);M.removeListener(Q,"submit",this._onFormSubmit);}this.unsubscribeAll();if(O){O.removeChild(P);}delete D[this.get("id")];R=G.getElementsByClassName(this.CSS_CLASS_NAME,this.NODE_NAME,Q);if(I.isArray(R)&&R.length===0){M.removeListener(Q,"keypress",YAHOO.widget.Button.onFormKeyPress);}},fireEvent:function(O,N){var P=arguments[0];if(this.DOM_EVENTS[P]&&this.get("disabled")){return false;}return YAHOO.widget.Button.superclass.fireEvent.apply(this,arguments);},toString:function(){return("Button "+this.get("id"));}});YAHOO.widget.Button.onFormKeyPress=function(R){var P=M.getTarget(R),S=M.getCharCode(R),Q=P.nodeName&&P.nodeName.toUpperCase(),N=P.type,T=false,V,X,O,W;function U(a){var Z,Y;switch(a.nodeName.toUpperCase()){case"INPUT":case"BUTTON":if(a.type=="submit"&&!a.disabled){if(!T&&!O){O=a;}}break;default:Z=a.id;if(Z){V=D[Z];if(V){T=true;if(!V.get("disabled")){Y=V.get("srcelement");if(!X&&(V.get("type")=="submit"||(Y&&Y.type=="submit"))){X=V;}}}}break;}}if(S==13&&((Q=="INPUT"&&(N=="text"||N=="password"||N=="checkbox"||N=="radio"||N=="file"))||Q=="SELECT")){G.getElementsBy(U,"*",this);if(O){O.focus();}else{if(!O&&X){M.preventDefault(R); +if(L.ie){X.get("element").fireEvent("onclick");}else{W=document.createEvent("HTMLEvents");W.initEvent("click",true,true);if(L.gecko<1.9){X.fireEvent("click",W);}else{X.get("element").dispatchEvent(W);}}}}}};YAHOO.widget.Button.addHiddenFieldsToForm=function(N){var S=G.getElementsByClassName(YAHOO.widget.Button.prototype.CSS_CLASS_NAME,"*",N),Q=S.length,R,O,P;if(Q>0){for(P=0;P0){F=H-1;do{this._buttons[F].set("disabled",G);}while(F--);}},_onKeyDown:function(K){var G=B.getTarget(K),I=B.getCharCode(K),H=G.parentNode.parentNode.id,J=E[H],F=-1;if(I==37||I==38){F=(J.index===0)?(this._buttons.length-1):(J.index-1);}else{if(I==39||I==40){F=(J.index===(this._buttons.length-1))?0:(J.index+1);}}if(F>-1){this.check(F);this.getButton(F).focus();}},_onAppendTo:function(H){var I=this._buttons,G=I.length,F;for(F=0;F0){this.addButtons(J);}function F(K){return(K.type=="radio");}J=C.getElementsBy(F,"input",this.get("element"));if(J.length>0){this.addButtons(J);}this.on("keydown",this._onKeyDown);this.on("appendTo",this._onAppendTo);var G=this.get("container");if(G){if(D.isString(G)){B.onContentReady(G,function(){this.appendTo(G);},null,this);}else{this.appendTo(G);}}},initAttributes:function(G){var F=G||{};YAHOO.widget.ButtonGroup.superclass.initAttributes.call(this,F);this.setAttributeConfig("name",{value:F.name,validator:D.isString});this.setAttributeConfig("disabled",{value:(F.disabled||false),validator:D.isBoolean,method:this._setDisabled});this.setAttributeConfig("value",{value:F.value});this.setAttributeConfig("container",{value:F.container,writeOnce:true});this.setAttributeConfig("checkedButton",{value:null});},addButton:function(J){var L,K,G,F,H,I;if(J instanceof A&&J.get("type")=="radio"){L=J;}else{if(!D.isString(J)&&!J.nodeName){J.type="radio";L=new A(J);}else{L=new A(J,{type:"radio"});}}if(L){F=this._buttons.length;H=L.get("name");I=this.get("name");L.index=F;this._buttons[F]=L;E[L.get("id")]=L;if(H!=I){L.set("name",I);}if(this.get("disabled")){L.set("disabled",true);}if(L.get("checked")){this.set("checkedButton",L);}K=L.get("element");G=this.get("element");if(K.parentNode!=G){G.appendChild(K);}L.on("checkedChange",this._onButtonCheckedChange,L,this);}return L;},addButtons:function(G){var H,I,J,F;if(D.isArray(G)){H=G.length;J=[];if(H>0){for(F=0;F0){F=this._buttons.length-1;do{this._buttons[F].index=F;}while(F--);}}},getButton:function(F){return this._buttons[F];},getButtons:function(){return this._buttons;},getCount:function(){return this._buttons.length;},focus:function(H){var I,G,F;if(D.isNumber(H)){I=this._buttons[H];if(I){I.focus();}}else{G=this.getCount();for(F=0;F0){G=this._buttons.length-1;do{this._buttons[G].destroy();}while(G--);}B.purgeElement(H);F.removeChild(H);},toString:function(){return("ButtonGroup "+this.get("id"));}});})();YAHOO.register("button",YAHOO.widget.Button,{version:"2.6.0",build:"1321"}); \ No newline at end of file diff --git a/webdir/javascript/yui/button/button.js b/webdir/javascript/yui/button/button.js new file mode 100644 index 0000000..544faa0 --- /dev/null +++ b/webdir/javascript/yui/button/button.js @@ -0,0 +1,4798 @@ +/* +Copyright (c) 2008, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.6.0 +*/ +/** +* @module button +* @description

    The Button Control enables the creation of rich, graphical +* buttons that function like traditional HTML form buttons. Unlike +* tradition HTML form buttons, buttons created with the Button Control can have +* a label that is different from its value. With the inclusion of the optional +* Menu Control, the Button Control can also be +* used to create menu buttons and split buttons, controls that are not +* available natively in HTML. The Button Control can also be thought of as a +* way to create more visually engaging implementations of the browser's +* default radio-button and check-box controls.

    +*

    The Button Control supports the following types:

    +*
    +*
    push
    +*
    Basic push button that can execute a user-specified command when +* pressed.
    +*
    link
    +*
    Navigates to a specified url when pressed.
    +*
    submit
    +*
    Submits the parent form when pressed.
    +*
    reset
    +*
    Resets the parent form when pressed.
    +*
    checkbox
    +*
    Maintains a "checked" state that can be toggled on and off.
    +*
    radio
    +*
    Maintains a "checked" state that can be toggled on and off. Use with +* the ButtonGroup class to create a set of controls that are mutually +* exclusive; checking one button in the set will uncheck all others in +* the group.
    +*
    menu
    +*
    When pressed will show/hide a menu.
    +*
    split
    +*
    Can execute a user-specified command or display a menu when pressed.
    +*
    +* @title Button +* @namespace YAHOO.widget +* @requires yahoo, dom, element, event +* @optional container, menu +*/ + + +(function () { + + + /** + * The Button class creates a rich, graphical button. + * @param {String} p_oElement String specifying the id attribute of the + * <input>, <button>, + * <a>, or <span> element to + * be used to create the button. + * @param {HTMLInputElement| + * HTMLButtonElement|HTMLElement} p_oElement Object reference for the + * <input>, <button>, + * <a>, or <span> element to be + * used to create the button. + * @param {Object} p_oElement Object literal specifying a set of + * configuration attributes used to create the button. + * @param {Object} p_oAttributes Optional. Object literal specifying a set + * of configuration attributes used to create the button. + * @namespace YAHOO.widget + * @class Button + * @constructor + * @extends YAHOO.util.Element + */ + + + + // Shorthard for utilities + + var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event, + Lang = YAHOO.lang, + UA = YAHOO.env.ua, + Overlay = YAHOO.widget.Overlay, + Menu = YAHOO.widget.Menu, + + + // Private member variables + + m_oButtons = {}, // Collection of all Button instances + m_oOverlayManager = null, // YAHOO.widget.OverlayManager instance + m_oSubmitTrigger = null, // The button that submitted the form + m_oFocusedButton = null; // The button that has focus + + + + // Private methods + + + + /** + * @method createInputElement + * @description Creates an <input> element of the + * specified type. + * @private + * @param {String} p_sType String specifying the type of + * <input> element to create. + * @param {String} p_sName String specifying the name of + * <input> element to create. + * @param {String} p_sValue String specifying the value of + * <input> element to create. + * @param {String} p_bChecked Boolean specifying if the + * <input> element is to be checked. + * @return {HTMLInputElement} + */ + function createInputElement(p_sType, p_sName, p_sValue, p_bChecked) { + + var oInput, + sInput; + + if (Lang.isString(p_sType) && Lang.isString(p_sName)) { + + if (UA.ie) { + + /* + For IE it is necessary to create the element with the + "type," "name," "value," and "checked" properties set all + at once. + */ + + sInput = "<input> or <a>) that + * map to Button configuration attributes and sets them into a collection + * that is passed to the Button constructor. + * @private + * @param {HTMLInputElement|HTMLAnchorElement} p_oElement Object reference to the HTML + * element (either <input> or <span> + * ) used to create the button. + * @param {Object} p_oAttributes Object reference for the collection of + * configuration attributes used to create the button. + */ + function setAttributesFromSrcElement(p_oElement, p_oAttributes) { + + var sSrcElementNodeName = p_oElement.nodeName.toUpperCase(), + me = this, + oAttribute, + oRootNode, + sText; + + + /** + * @method setAttributeFromDOMAttribute + * @description Gets the value of the specified DOM attribute and sets it + * into the collection of configuration attributes used to configure + * the button. + * @private + * @param {String} p_sAttribute String representing the name of the + * attribute to retrieve from the DOM element. + */ + function setAttributeFromDOMAttribute(p_sAttribute) { + + if (!(p_sAttribute in p_oAttributes)) { + + /* + Need to use "getAttributeNode" instead of "getAttribute" + because using "getAttribute," IE will return the innerText + of a <button> for the value attribute + rather than the value of the "value" attribute. + */ + + oAttribute = p_oElement.getAttributeNode(p_sAttribute); + + + if (oAttribute && ("value" in oAttribute)) { + + + p_oAttributes[p_sAttribute] = oAttribute.value; + + } + + } + + } + + + /** + * @method setFormElementProperties + * @description Gets the value of the attributes from the form element + * and sets them into the collection of configuration attributes used to + * configure the button. + * @private + */ + function setFormElementProperties() { + + setAttributeFromDOMAttribute("type"); + + if (p_oAttributes.type == "button") { + + p_oAttributes.type = "push"; + + } + + if (!("disabled" in p_oAttributes)) { + + p_oAttributes.disabled = p_oElement.disabled; + + } + + setAttributeFromDOMAttribute("name"); + setAttributeFromDOMAttribute("value"); + setAttributeFromDOMAttribute("title"); + + } + + + switch (sSrcElementNodeName) { + + case "A": + + p_oAttributes.type = "link"; + + setAttributeFromDOMAttribute("href"); + setAttributeFromDOMAttribute("target"); + + break; + + case "INPUT": + + setFormElementProperties(); + + if (!("checked" in p_oAttributes)) { + + p_oAttributes.checked = p_oElement.checked; + + } + + break; + + case "BUTTON": + + setFormElementProperties(); + + oRootNode = p_oElement.parentNode.parentNode; + + if (Dom.hasClass(oRootNode, this.CSS_CLASS_NAME + "-checked")) { + + p_oAttributes.checked = true; + + } + + if (Dom.hasClass(oRootNode, this.CSS_CLASS_NAME + "-disabled")) { + + p_oAttributes.disabled = true; + + } + + p_oElement.removeAttribute("value"); + + p_oElement.setAttribute("type", "button"); + + break; + + } + + p_oElement.removeAttribute("id"); + p_oElement.removeAttribute("name"); + + if (!("tabindex" in p_oAttributes)) { + + p_oAttributes.tabindex = p_oElement.tabIndex; + + } + + if (!("label" in p_oAttributes)) { + + // Set the "label" property + + sText = sSrcElementNodeName == "INPUT" ? + p_oElement.value : p_oElement.innerHTML; + + + if (sText && sText.length > 0) { + + p_oAttributes.label = sText; + + } + + } + + } + + + /** + * @method initConfig + * @description Initializes the set of configuration attributes that are + * used to instantiate the button. + * @private + * @param {Object} Object representing the button's set of + * configuration attributes. + */ + function initConfig(p_oConfig) { + + var oAttributes = p_oConfig.attributes, + oSrcElement = oAttributes.srcelement, + sSrcElementNodeName = oSrcElement.nodeName.toUpperCase(), + me = this; + + + if (sSrcElementNodeName == this.NODE_NAME) { + + p_oConfig.element = oSrcElement; + p_oConfig.id = oSrcElement.id; + + Dom.getElementsBy(function (p_oElement) { + + switch (p_oElement.nodeName.toUpperCase()) { + + case "BUTTON": + case "A": + case "INPUT": + + setAttributesFromSrcElement.call(me, p_oElement, + oAttributes); + + break; + + } + + }, "*", oSrcElement); + + } + else { + + switch (sSrcElementNodeName) { + + case "BUTTON": + case "A": + case "INPUT": + + setAttributesFromSrcElement.call(this, oSrcElement, + oAttributes); + + break; + + } + + } + + } + + + + // Constructor + + YAHOO.widget.Button = function (p_oElement, p_oAttributes) { + + if (!Overlay && YAHOO.widget.Overlay) { + + Overlay = YAHOO.widget.Overlay; + + } + + + if (!Menu && YAHOO.widget.Menu) { + + Menu = YAHOO.widget.Menu; + + } + + + var fnSuperClass = YAHOO.widget.Button.superclass.constructor, + oConfig, + oElement; + + + if (arguments.length == 1 && !Lang.isString(p_oElement) && !p_oElement.nodeName) { + + if (!p_oElement.id) { + + p_oElement.id = Dom.generateId(); + + + } + + + fnSuperClass.call(this, (this.createButtonElement(p_oElement.type)), p_oElement); + + } + else { + + oConfig = { element: null, attributes: (p_oAttributes || {}) }; + + + if (Lang.isString(p_oElement)) { + + oElement = Dom.get(p_oElement); + + if (oElement) { + + if (!oConfig.attributes.id) { + + oConfig.attributes.id = p_oElement; + + } + + + + oConfig.attributes.srcelement = oElement; + + initConfig.call(this, oConfig); + + + if (!oConfig.element) { + + + oConfig.element = this.createButtonElement(oConfig.attributes.type); + + } + + fnSuperClass.call(this, oConfig.element, oConfig.attributes); + + } + + } + else if (p_oElement.nodeName) { + + if (!oConfig.attributes.id) { + + if (p_oElement.id) { + + oConfig.attributes.id = p_oElement.id; + + } + else { + + oConfig.attributes.id = Dom.generateId(); + + + } + + } + + + + oConfig.attributes.srcelement = p_oElement; + + initConfig.call(this, oConfig); + + + if (!oConfig.element) { + + + oConfig.element = this.createButtonElement(oConfig.attributes.type); + + } + + fnSuperClass.call(this, oConfig.element, oConfig.attributes); + + } + + } + + }; + + + + YAHOO.extend(YAHOO.widget.Button, YAHOO.util.Element, { + + + // Protected properties + + + /** + * @property _button + * @description Object reference to the button's internal + * <a> or <button> element. + * @default null + * @protected + * @type HTMLAnchorElement|HTMLButtonElement + */ + _button: null, + + + /** + * @property _menu + * @description Object reference to the button's menu. + * @default null + * @protected + * @type {YAHOO.widget.Overlay| + * YAHOO.widget.Menu} + */ + _menu: null, + + + /** + * @property _hiddenFields + * @description Object reference to the <input> + * element, or array of HTML form elements used to represent the button + * when its parent form is submitted. + * @default null + * @protected + * @type HTMLInputElement|Array + */ + _hiddenFields: null, + + + /** + * @property _onclickAttributeValue + * @description Object reference to the button's current value for the + * "onclick" configuration attribute. + * @default null + * @protected + * @type Object + */ + _onclickAttributeValue: null, + + + /** + * @property _activationKeyPressed + * @description Boolean indicating if the key(s) that toggle the button's + * "active" state have been pressed. + * @default false + * @protected + * @type Boolean + */ + _activationKeyPressed: false, + + + /** + * @property _activationButtonPressed + * @description Boolean indicating if the mouse button that toggles + * the button's "active" state has been pressed. + * @default false + * @protected + * @type Boolean + */ + _activationButtonPressed: false, + + + /** + * @property _hasKeyEventHandlers + * @description Boolean indicating if the button's "blur", "keydown" and + * "keyup" event handlers are assigned + * @default false + * @protected + * @type Boolean + */ + _hasKeyEventHandlers: false, + + + /** + * @property _hasMouseEventHandlers + * @description Boolean indicating if the button's "mouseout," + * "mousedown," and "mouseup" event handlers are assigned + * @default false + * @protected + * @type Boolean + */ + _hasMouseEventHandlers: false, + + + /** + * @property _nOptionRegionX + * @description Number representing the X coordinate of the leftmost edge of the Button's + * option region. Applies only to Buttons of type "split". + * @default 0 + * @protected + * @type Number + */ + _nOptionRegionX: 0, + + + + // Constants + + + /** + * @property NODE_NAME + * @description The name of the node to be used for the button's + * root element. + * @default "SPAN" + * @final + * @type String + */ + NODE_NAME: "SPAN", + + + /** + * @property CHECK_ACTIVATION_KEYS + * @description Array of numbers representing keys that (when pressed) + * toggle the button's "checked" attribute. + * @default [32] + * @final + * @type Array + */ + CHECK_ACTIVATION_KEYS: [32], + + + /** + * @property ACTIVATION_KEYS + * @description Array of numbers representing keys that (when presed) + * toggle the button's "active" state. + * @default [13, 32] + * @final + * @type Array + */ + ACTIVATION_KEYS: [13, 32], + + + /** + * @property OPTION_AREA_WIDTH + * @description Width (in pixels) of the area of a split button that + * when pressed will display a menu. + * @default 20 + * @final + * @type Number + */ + OPTION_AREA_WIDTH: 20, + + + /** + * @property CSS_CLASS_NAME + * @description String representing the CSS class(es) to be applied to + * the button's root element. + * @default "yui-button" + * @final + * @type String + */ + CSS_CLASS_NAME: "yui-button", + + + /** + * @property RADIO_DEFAULT_TITLE + * @description String representing the default title applied to buttons + * of type "radio." + * @default "Unchecked. Click to check." + * @final + * @type String + */ + RADIO_DEFAULT_TITLE: "Unchecked. Click to check.", + + + /** + * @property RADIO_CHECKED_TITLE + * @description String representing the title applied to buttons of + * type "radio" when checked. + * @default "Checked. Click another button to uncheck" + * @final + * @type String + */ + RADIO_CHECKED_TITLE: "Checked. Click another button to uncheck", + + + /** + * @property CHECKBOX_DEFAULT_TITLE + * @description String representing the default title applied to + * buttons of type "checkbox." + * @default "Unchecked. Click to check." + * @final + * @type String + */ + CHECKBOX_DEFAULT_TITLE: "Unchecked. Click to check.", + + + /** + * @property CHECKBOX_CHECKED_TITLE + * @description String representing the title applied to buttons of type + * "checkbox" when checked. + * @default "Checked. Click to uncheck." + * @final + * @type String + */ + CHECKBOX_CHECKED_TITLE: "Checked. Click to uncheck.", + + + /** + * @property MENUBUTTON_DEFAULT_TITLE + * @description String representing the default title applied to + * buttons of type "menu." + * @default "Menu collapsed. Click to expand." + * @final + * @type String + */ + MENUBUTTON_DEFAULT_TITLE: "Menu collapsed. Click to expand.", + + + /** + * @property MENUBUTTON_MENU_VISIBLE_TITLE + * @description String representing the title applied to buttons of type + * "menu" when the button's menu is visible. + * @default "Menu expanded. Click or press Esc to collapse." + * @final + * @type String + */ + MENUBUTTON_MENU_VISIBLE_TITLE: + "Menu expanded. Click or press Esc to collapse.", + + + /** + * @property SPLITBUTTON_DEFAULT_TITLE + * @description String representing the default title applied to + * buttons of type "split." + * @default "Menu collapsed. Click inside option region or press + * Ctrl + Shift + M to show the menu." + * @final + * @type String + */ + SPLITBUTTON_DEFAULT_TITLE: ("Menu collapsed. Click inside option " + + "region or press down arrow key to show the menu."), + + + /** + * @property SPLITBUTTON_OPTION_VISIBLE_TITLE + * @description String representing the title applied to buttons of type + * "split" when the button's menu is visible. + * @default "Menu expanded. Press Esc or Ctrl + Shift + M to hide + * the menu." + * @final + * @type String + */ + SPLITBUTTON_OPTION_VISIBLE_TITLE: + "Menu expanded. Press Esc to hide the menu.", + + + /** + * @property SUBMIT_TITLE + * @description String representing the title applied to buttons of + * type "submit." + * @default "Click to submit form." + * @final + * @type String + */ + SUBMIT_TITLE: "Click to submit form.", + + + + // Protected attribute setter methods + + + /** + * @method _setType + * @description Sets the value of the button's "type" attribute. + * @protected + * @param {String} p_sType String indicating the value for the button's + * "type" attribute. + */ + _setType: function (p_sType) { + + if (p_sType == "split") { + + this.on("option", this._onOption); + + } + + }, + + + /** + * @method _setLabel + * @description Sets the value of the button's "label" attribute. + * @protected + * @param {String} p_sLabel String indicating the value for the button's + * "label" attribute. + */ + _setLabel: function (p_sLabel) { + + this._button.innerHTML = p_sLabel; + + + /* + Remove and add the default class name from the root element + for Gecko to ensure that the button shrinkwraps to the label. + Without this the button will not be rendered at the correct + width when the label changes. The most likely cause for this + bug is button's use of the Gecko-specific CSS display type of + "-moz-inline-box" to simulate "inline-block" supported by IE, + Safari and Opera. + */ + + var sClass, + nGeckoVersion = UA.gecko; + + + if (nGeckoVersion && nGeckoVersion < 1.9 && Dom.inDocument(this.get("element"))) { + + sClass = this.CSS_CLASS_NAME; + + this.removeClass(sClass); + + Lang.later(0, this, this.addClass, sClass); + + } + + }, + + + /** + * @method _setTabIndex + * @description Sets the value of the button's "tabindex" attribute. + * @protected + * @param {Number} p_nTabIndex Number indicating the value for the + * button's "tabindex" attribute. + */ + _setTabIndex: function (p_nTabIndex) { + + this._button.tabIndex = p_nTabIndex; + + }, + + + /** + * @method _setTitle + * @description Sets the value of the button's "title" attribute. + * @protected + * @param {String} p_nTabIndex Number indicating the value for + * the button's "title" attribute. + */ + _setTitle: function (p_sTitle) { + + var sTitle = p_sTitle; + + if (this.get("type") != "link") { + + if (!sTitle) { + + switch (this.get("type")) { + + case "radio": + + sTitle = this.RADIO_DEFAULT_TITLE; + + break; + + case "checkbox": + + sTitle = this.CHECKBOX_DEFAULT_TITLE; + + break; + + case "menu": + + sTitle = this.MENUBUTTON_DEFAULT_TITLE; + + break; + + case "split": + + sTitle = this.SPLITBUTTON_DEFAULT_TITLE; + + break; + + case "submit": + + sTitle = this.SUBMIT_TITLE; + + break; + + } + + } + + this._button.title = sTitle; + + } + + }, + + + /** + * @method _setDisabled + * @description Sets the value of the button's "disabled" attribute. + * @protected + * @param {Boolean} p_bDisabled Boolean indicating the value for + * the button's "disabled" attribute. + */ + _setDisabled: function (p_bDisabled) { + + if (this.get("type") != "link") { + + if (p_bDisabled) { + + if (this._menu) { + + this._menu.hide(); + + } + + if (this.hasFocus()) { + + this.blur(); + + } + + this._button.setAttribute("disabled", "disabled"); + + this.addStateCSSClasses("disabled"); + + this.removeStateCSSClasses("hover"); + this.removeStateCSSClasses("active"); + this.removeStateCSSClasses("focus"); + + } + else { + + this._button.removeAttribute("disabled"); + + this.removeStateCSSClasses("disabled"); + + } + + } + + }, + + + /** + * @method _setHref + * @description Sets the value of the button's "href" attribute. + * @protected + * @param {String} p_sHref String indicating the value for the button's + * "href" attribute. + */ + _setHref: function (p_sHref) { + + if (this.get("type") == "link") { + + this._button.href = p_sHref; + + } + + }, + + + /** + * @method _setTarget + * @description Sets the value of the button's "target" attribute. + * @protected + * @param {String} p_sTarget String indicating the value for the button's + * "target" attribute. + */ + _setTarget: function (p_sTarget) { + + if (this.get("type") == "link") { + + this._button.setAttribute("target", p_sTarget); + + } + + }, + + + /** + * @method _setChecked + * @description Sets the value of the button's "target" attribute. + * @protected + * @param {Boolean} p_bChecked Boolean indicating the value for + * the button's "checked" attribute. + */ + _setChecked: function (p_bChecked) { + + var sType = this.get("type"), + sTitle; + + if (sType == "checkbox" || sType == "radio") { + + if (p_bChecked) { + + this.addStateCSSClasses("checked"); + + sTitle = (sType == "radio") ? + this.RADIO_CHECKED_TITLE : + this.CHECKBOX_CHECKED_TITLE; + + } + else { + + this.removeStateCSSClasses("checked"); + + sTitle = (sType == "radio") ? + this.RADIO_DEFAULT_TITLE : + this.CHECKBOX_DEFAULT_TITLE; + + } + + + if (!this._hasDefaultTitle) { + + this.set("title", sTitle); + + } + + } + + }, + + + /** + * @method _setMenu + * @description Sets the value of the button's "menu" attribute. + * @protected + * @param {Object} p_oMenu Object indicating the value for the button's + * "menu" attribute. + */ + _setMenu: function (p_oMenu) { + + var bLazyLoad = this.get("lazyloadmenu"), + oButtonElement = this.get("element"), + sMenuCSSClassName, + + /* + Boolean indicating if the value of p_oMenu is an instance + of YAHOO.widget.Menu or YAHOO.widget.Overlay. + */ + + bInstance = false, + + + oMenu, + oMenuElement, + oSrcElement, + aItems, + nItems, + oItem, + i; + + + function onAppendTo() { + + oMenu.render(oButtonElement.parentNode); + + this.removeListener("appendTo", onAppendTo); + + } + + + function setMenuContainer() { + + oMenu.cfg.queueProperty("container", oButtonElement.parentNode); + + this.removeListener("appendTo", setMenuContainer); + + } + + + function initMenu() { + + var oContainer; + + if (oMenu) { + + Dom.addClass(oMenu.element, this.get("menuclassname")); + Dom.addClass(oMenu.element, "yui-" + this.get("type") + "-button-menu"); + + oMenu.showEvent.subscribe(this._onMenuShow, null, this); + oMenu.hideEvent.subscribe(this._onMenuHide, null, this); + oMenu.renderEvent.subscribe(this._onMenuRender, null, this); + + + if (Menu && oMenu instanceof Menu) { + + if (bLazyLoad) { + + oContainer = this.get("container"); + + if (oContainer) { + + oMenu.cfg.queueProperty("container", oContainer); + + } + else { + + this.on("appendTo", setMenuContainer); + + } + + } + + oMenu.cfg.queueProperty("clicktohide", false); + + oMenu.keyDownEvent.subscribe(this._onMenuKeyDown, this, true); + oMenu.subscribe("click", this._onMenuClick, this, true); + oMenu.itemAddedEvent.subscribe(this._onMenuItemAdded, this, true); + + oSrcElement = oMenu.srcElement; + + if (oSrcElement && oSrcElement.nodeName.toUpperCase() == "SELECT") { + + oSrcElement.style.display = "none"; + oSrcElement.parentNode.removeChild(oSrcElement); + + } + + } + else if (Overlay && oMenu instanceof Overlay) { + + if (!m_oOverlayManager) { + + m_oOverlayManager = new YAHOO.widget.OverlayManager(); + + } + + m_oOverlayManager.register(oMenu); + + } + + + this._menu = oMenu; + + + if (!bInstance && !bLazyLoad) { + + if (Dom.inDocument(oButtonElement)) { + + oMenu.render(oButtonElement.parentNode); + + } + else { + + this.on("appendTo", onAppendTo); + + } + + } + + } + + } + + + if (Overlay) { + + if (Menu) { + + sMenuCSSClassName = Menu.prototype.CSS_CLASS_NAME; + + } + + if (p_oMenu && Menu && (p_oMenu instanceof Menu)) { + + oMenu = p_oMenu; + aItems = oMenu.getItems(); + nItems = aItems.length; + bInstance = true; + + + if (nItems > 0) { + + i = nItems - 1; + + do { + + oItem = aItems[i]; + + if (oItem) { + + oItem.cfg.subscribeToConfigEvent("selected", + this._onMenuItemSelected, oItem, this); + + } + + } + while (i--); + + } + + initMenu.call(this); + + } + else if (Overlay && p_oMenu && (p_oMenu instanceof Overlay)) { + + oMenu = p_oMenu; + bInstance = true; + + oMenu.cfg.queueProperty("visible", false); + + initMenu.call(this); + + } + else if (Menu && Lang.isArray(p_oMenu)) { + + oMenu = new Menu(Dom.generateId(), { lazyload: bLazyLoad, itemdata: p_oMenu }); + + this._menu = oMenu; + + this.on("appendTo", initMenu); + + } + else if (Lang.isString(p_oMenu)) { + + oMenuElement = Dom.get(p_oMenu); + + if (oMenuElement) { + + if (Menu && Dom.hasClass(oMenuElement, sMenuCSSClassName) || + oMenuElement.nodeName.toUpperCase() == "SELECT") { + + oMenu = new Menu(p_oMenu, { lazyload: bLazyLoad }); + + initMenu.call(this); + + } + else if (Overlay) { + + oMenu = new Overlay(p_oMenu, { visible: false }); + + initMenu.call(this); + + } + + } + + } + else if (p_oMenu && p_oMenu.nodeName) { + + if (Menu && Dom.hasClass(p_oMenu, sMenuCSSClassName) || + p_oMenu.nodeName.toUpperCase() == "SELECT") { + + oMenu = new Menu(p_oMenu, { lazyload: bLazyLoad }); + + initMenu.call(this); + + } + else if (Overlay) { + + if (!p_oMenu.id) { + + Dom.generateId(p_oMenu); + + } + + oMenu = new Overlay(p_oMenu, { visible: false }); + + initMenu.call(this); + + } + + } + + } + + }, + + + /** + * @method _setOnClick + * @description Sets the value of the button's "onclick" attribute. + * @protected + * @param {Object} p_oObject Object indicating the value for the button's + * "onclick" attribute. + */ + _setOnClick: function (p_oObject) { + + /* + Remove any existing listeners if a "click" event handler + has already been specified. + */ + + if (this._onclickAttributeValue && + (this._onclickAttributeValue != p_oObject)) { + + this.removeListener("click", this._onclickAttributeValue.fn); + + this._onclickAttributeValue = null; + + } + + + if (!this._onclickAttributeValue && + Lang.isObject(p_oObject) && + Lang.isFunction(p_oObject.fn)) { + + this.on("click", p_oObject.fn, p_oObject.obj, p_oObject.scope); + + this._onclickAttributeValue = p_oObject; + + } + + }, + + + /** + * @method _setSelectedMenuItem + * @description Sets the value of the button's + * "selectedMenuItem" attribute. + * @protected + * @param {Number} p_nIndex Number representing the index of the item + * in the button's menu that is currently selected. + */ + _setSelectedMenuItem: function (p_nIndex) { + + var oMenu = this._menu, + oMenuItem; + + + if (Menu && oMenu && oMenu instanceof Menu) { + + oMenuItem = oMenu.getItem(p_nIndex); + + + if (oMenuItem && !oMenuItem.cfg.getProperty("selected")) { + + oMenuItem.cfg.setProperty("selected", true); + + } + + } + + }, + + + // Protected methods + + + + /** + * @method _isActivationKey + * @description Determines if the specified keycode is one that toggles + * the button's "active" state. + * @protected + * @param {Number} p_nKeyCode Number representing the keycode to + * be evaluated. + * @return {Boolean} + */ + _isActivationKey: function (p_nKeyCode) { + + var sType = this.get("type"), + aKeyCodes = (sType == "checkbox" || sType == "radio") ? + this.CHECK_ACTIVATION_KEYS : this.ACTIVATION_KEYS, + + nKeyCodes = aKeyCodes.length, + bReturnVal = false, + i; + + + if (nKeyCodes > 0) { + + i = nKeyCodes - 1; + + do { + + if (p_nKeyCode == aKeyCodes[i]) { + + bReturnVal = true; + break; + + } + + } + while (i--); + + } + + return bReturnVal; + + }, + + + /** + * @method _isSplitButtonOptionKey + * @description Determines if the specified keycode is one that toggles + * the display of the split button's menu. + * @protected + * @param {Event} p_oEvent Object representing the DOM event object + * passed back by the event utility (YAHOO.util.Event). + * @return {Boolean} + */ + _isSplitButtonOptionKey: function (p_oEvent) { + + var bShowMenu = (Event.getCharCode(p_oEvent) == 40); + + + var onKeyPress = function (p_oEvent) { + + Event.preventDefault(p_oEvent); + + this.removeListener("keypress", onKeyPress); + + }; + + + // Prevent the browser from scrolling the window + if (bShowMenu) { + + if (UA.opera) { + + this.on("keypress", onKeyPress); + + } + + Event.preventDefault(p_oEvent); + } + + return bShowMenu; + + }, + + + /** + * @method _addListenersToForm + * @description Adds event handlers to the button's form. + * @protected + */ + _addListenersToForm: function () { + + var oForm = this.getForm(), + onFormKeyPress = YAHOO.widget.Button.onFormKeyPress, + bHasKeyPressListener, + oSrcElement, + aListeners, + nListeners, + i; + + + if (oForm) { + + Event.on(oForm, "reset", this._onFormReset, null, this); + Event.on(oForm, "submit", this._onFormSubmit, null, this); + + oSrcElement = this.get("srcelement"); + + + if (this.get("type") == "submit" || + (oSrcElement && oSrcElement.type == "submit")) + { + + aListeners = Event.getListeners(oForm, "keypress"); + bHasKeyPressListener = false; + + if (aListeners) { + + nListeners = aListeners.length; + + if (nListeners > 0) { + + i = nListeners - 1; + + do { + + if (aListeners[i].fn == onFormKeyPress) { + + bHasKeyPressListener = true; + break; + + } + + } + while (i--); + + } + + } + + + if (!bHasKeyPressListener) { + + Event.on(oForm, "keypress", onFormKeyPress); + + } + + } + + } + + }, + + + + /** + * @method _showMenu + * @description Shows the button's menu. + * @protected + * @param {Event} p_oEvent Object representing the DOM event object + * passed back by the event utility (YAHOO.util.Event) that triggered + * the display of the menu. + */ + _showMenu: function (p_oEvent) { + + if (YAHOO.widget.MenuManager) { + YAHOO.widget.MenuManager.hideVisible(); + } + + + if (m_oOverlayManager) { + m_oOverlayManager.hideAll(); + } + + + var oMenu = this._menu, + aMenuAlignment = this.get("menualignment"), + bFocusMenu = this.get("focusmenu"), + fnFocusMethod; + + + if (this._renderedMenu) { + + oMenu.cfg.setProperty("context", + [this.get("element"), aMenuAlignment[0], aMenuAlignment[1]]); + + oMenu.cfg.setProperty("preventcontextoverlap", true); + oMenu.cfg.setProperty("constraintoviewport", true); + + } + else { + + oMenu.cfg.queueProperty("context", + [this.get("element"), aMenuAlignment[0], aMenuAlignment[1]]); + + oMenu.cfg.queueProperty("preventcontextoverlap", true); + oMenu.cfg.queueProperty("constraintoviewport", true); + + } + + + /* + Refocus the Button before showing its Menu in case the call to + YAHOO.widget.MenuManager.hideVisible() resulted in another element in the + DOM being focused after another Menu was hidden. + */ + + this.focus(); + + + if (Menu && oMenu && (oMenu instanceof Menu)) { + + // Since Menus automatically focus themselves when made visible, temporarily + // replace the Menu focus method so that the value of the Button's "focusmenu" + // attribute determines if the Menu should be focus when made visible. + + fnFocusMethod = oMenu.focus; + + oMenu.focus = function () {}; + + if (this._renderedMenu) { + + oMenu.cfg.setProperty("minscrollheight", this.get("menuminscrollheight")); + oMenu.cfg.setProperty("maxheight", this.get("menumaxheight")); + + } + else { + + oMenu.cfg.queueProperty("minscrollheight", this.get("menuminscrollheight")); + oMenu.cfg.queueProperty("maxheight", this.get("menumaxheight")); + + } + + + oMenu.show(); + + oMenu.focus = fnFocusMethod; + + oMenu.align(); + + + /* + Stop the propagation of the event so that the MenuManager + doesn't blur the menu after it gets focus. + */ + + if (p_oEvent.type == "mousedown") { + Event.stopPropagation(p_oEvent); + } + + + if (bFocusMenu) { + oMenu.focus(); + } + + } + else if (Overlay && oMenu && (oMenu instanceof Overlay)) { + + if (!this._renderedMenu) { + oMenu.render(this.get("element").parentNode); + } + + oMenu.show(); + oMenu.align(); + + } + + }, + + + /** + * @method _hideMenu + * @description Hides the button's menu. + * @protected + */ + _hideMenu: function () { + + var oMenu = this._menu; + + if (oMenu) { + + oMenu.hide(); + + } + + }, + + + + + // Protected event handlers + + + /** + * @method _onMouseOver + * @description "mouseover" event handler for the button. + * @protected + * @param {Event} p_oEvent Object representing the DOM event object + * passed back by the event utility (YAHOO.util.Event). + */ + _onMouseOver: function (p_oEvent) { + + var sType = this.get("type"), + oElement, + nOptionRegionX; + + + if (sType === "split") { + + oElement = this.get("element"); + nOptionRegionX = + (Dom.getX(oElement) + (oElement.offsetWidth - this.OPTION_AREA_WIDTH)); + + this._nOptionRegionX = nOptionRegionX; + + } + + + if (!this._hasMouseEventHandlers) { + + if (sType === "split") { + + this.on("mousemove", this._onMouseMove); + + } + + this.on("mouseout", this._onMouseOut); + + this._hasMouseEventHandlers = true; + + } + + + this.addStateCSSClasses("hover"); + + + if (sType === "split" && (Event.getPageX(p_oEvent) > nOptionRegionX)) { + + this.addStateCSSClasses("hoveroption"); + + } + + + if (this._activationButtonPressed) { + + this.addStateCSSClasses("active"); + + } + + + if (this._bOptionPressed) { + + this.addStateCSSClasses("activeoption"); + + } + + + if (this._activationButtonPressed || this._bOptionPressed) { + + Event.removeListener(document, "mouseup", this._onDocumentMouseUp); + + } + + }, + + + /** + * @method _onMouseMove + * @description "mousemove" event handler for the button. + * @protected + * @param {Event} p_oEvent Object representing the DOM event object + * passed back by the event utility (YAHOO.util.Event). + */ + _onMouseMove: function (p_oEvent) { + + var nOptionRegionX = this._nOptionRegionX; + + if (nOptionRegionX) { + + if (Event.getPageX(p_oEvent) > nOptionRegionX) { + + this.addStateCSSClasses("hoveroption"); + + } + else { + + this.removeStateCSSClasses("hoveroption"); + + } + + } + + }, + + /** + * @method _onMouseOut + * @description "mouseout" event handler for the button. + * @protected + * @param {Event} p_oEvent Object representing the DOM event object + * passed back by the event utility (YAHOO.util.Event). + */ + _onMouseOut: function (p_oEvent) { + + var sType = this.get("type"); + + this.removeStateCSSClasses("hover"); + + + if (sType != "menu") { + + this.removeStateCSSClasses("active"); + + } + + + if (this._activationButtonPressed || this._bOptionPressed) { + + Event.on(document, "mouseup", this._onDocumentMouseUp, null, this); + + } + + + if (sType === "split" && (Event.getPageX(p_oEvent) > this._nOptionRegionX)) { + + this.removeStateCSSClasses("hoveroption"); + + } + + }, + + + /** + * @method _onDocumentMouseUp + * @description "mouseup" event handler for the button. + * @protected + * @param {Event} p_oEvent Object representing the DOM event object + * passed back by the event utility (YAHOO.util.Event). + */ + _onDocumentMouseUp: function (p_oEvent) { + + this._activationButtonPressed = false; + this._bOptionPressed = false; + + var sType = this.get("type"), + oTarget, + oMenuElement; + + if (sType == "menu" || sType == "split") { + + oTarget = Event.getTarget(p_oEvent); + oMenuElement = this._menu.element; + + if (oTarget != oMenuElement && + !Dom.isAncestor(oMenuElement, oTarget)) { + + this.removeStateCSSClasses((sType == "menu" ? + "active" : "activeoption")); + + this._hideMenu(); + + } + + } + + Event.removeListener(document, "mouseup", this._onDocumentMouseUp); + + }, + + + /** + * @method _onMouseDown + * @description "mousedown" event handler for the button. + * @protected + * @param {Event} p_oEvent Object representing the DOM event object + * passed back by the event utility (YAHOO.util.Event). + */ + _onMouseDown: function (p_oEvent) { + + var sType, + bReturnVal = true; + + + function onMouseUp() { + + this._hideMenu(); + this.removeListener("mouseup", onMouseUp); + + } + + + if ((p_oEvent.which || p_oEvent.button) == 1) { + + + if (!this.hasFocus()) { + + this.focus(); + + } + + + sType = this.get("type"); + + + if (sType == "split") { + + if (Event.getPageX(p_oEvent) > this._nOptionRegionX) { + + this.fireEvent("option", p_oEvent); + bReturnVal = false; + + } + else { + + this.addStateCSSClasses("active"); + + this._activationButtonPressed = true; + + } + + } + else if (sType == "menu") { + + if (this.isActive()) { + + this._hideMenu(); + + this._activationButtonPressed = false; + + } + else { + + this._showMenu(p_oEvent); + + this._activationButtonPressed = true; + + } + + } + else { + + this.addStateCSSClasses("active"); + + this._activationButtonPressed = true; + + } + + + + if (sType == "split" || sType == "menu") { + + this._hideMenuTimer = Lang.later(250, this, this.on, ["mouseup", onMouseUp]); + + } + + } + + return bReturnVal; + + }, + + + /** + * @method _onMouseUp + * @description "mouseup" event handler for the button. + * @protected + * @param {Event} p_oEvent Object representing the DOM event object + * passed back by the event utility (YAHOO.util.Event). + */ + _onMouseUp: function (p_oEvent) { + + var sType = this.get("type"), + oHideMenuTimer = this._hideMenuTimer, + bReturnVal = true; + + + if (oHideMenuTimer) { + + oHideMenuTimer.cancel(); + + } + + + if (sType == "checkbox" || sType == "radio") { + + this.set("checked", !(this.get("checked"))); + + } + + + this._activationButtonPressed = false; + + + if (sType != "menu") { + + this.removeStateCSSClasses("active"); + + } + + + if (sType == "split" && Event.getPageX(p_oEvent) > this._nOptionRegionX) { + + bReturnVal = false; + + } + + return bReturnVal; + + }, + + + /** + * @method _onFocus + * @description "focus" event handler for the button. + * @protected + * @param {Event} p_oEvent Object representing the DOM event object + * passed back by the event utility (YAHOO.util.Event). + */ + _onFocus: function (p_oEvent) { + + var oElement; + + this.addStateCSSClasses("focus"); + + if (this._activationKeyPressed) { + + this.addStateCSSClasses("active"); + + } + + m_oFocusedButton = this; + + + if (!this._hasKeyEventHandlers) { + + oElement = this._button; + + Event.on(oElement, "blur", this._onBlur, null, this); + Event.on(oElement, "keydown", this._onKeyDown, null, this); + Event.on(oElement, "keyup", this._onKeyUp, null, this); + + this._hasKeyEventHandlers = true; + + } + + + this.fireEvent("focus", p_oEvent); + + }, + + + /** + * @method _onBlur + * @description "blur" event handler for the button. + * @protected + * @param {Event} p_oEvent Object representing the DOM event object + * passed back by the event utility (YAHOO.util.Event). + */ + _onBlur: function (p_oEvent) { + + this.removeStateCSSClasses("focus"); + + if (this.get("type") != "menu") { + + this.removeStateCSSClasses("active"); + + } + + if (this._activationKeyPressed) { + + Event.on(document, "keyup", this._onDocumentKeyUp, null, this); + + } + + + m_oFocusedButton = null; + + this.fireEvent("blur", p_oEvent); + + }, + + + /** + * @method _onDocumentKeyUp + * @description "keyup" event handler for the document. + * @protected + * @param {Event} p_oEvent Object representing the DOM event object + * passed back by the event utility (YAHOO.util.Event). + */ + _onDocumentKeyUp: function (p_oEvent) { + + if (this._isActivationKey(Event.getCharCode(p_oEvent))) { + + this._activationKeyPressed = false; + + Event.removeListener(document, "keyup", this._onDocumentKeyUp); + + } + + }, + + + /** + * @method _onKeyDown + * @description "keydown" event handler for the button. + * @protected + * @param {Event} p_oEvent Object representing the DOM event object + * passed back by the event utility (YAHOO.util.Event). + */ + _onKeyDown: function (p_oEvent) { + + var oMenu = this._menu; + + + if (this.get("type") == "split" && + this._isSplitButtonOptionKey(p_oEvent)) { + + this.fireEvent("option", p_oEvent); + + } + else if (this._isActivationKey(Event.getCharCode(p_oEvent))) { + + if (this.get("type") == "menu") { + + this._showMenu(p_oEvent); + + } + else { + + this._activationKeyPressed = true; + + this.addStateCSSClasses("active"); + + } + + } + + + if (oMenu && oMenu.cfg.getProperty("visible") && + Event.getCharCode(p_oEvent) == 27) { + + oMenu.hide(); + this.focus(); + + } + + }, + + + /** + * @method _onKeyUp + * @description "keyup" event handler for the button. + * @protected + * @param {Event} p_oEvent Object representing the DOM event object + * passed back by the event utility (YAHOO.util.Event). + */ + _onKeyUp: function (p_oEvent) { + + var sType; + + if (this._isActivationKey(Event.getCharCode(p_oEvent))) { + + sType = this.get("type"); + + if (sType == "checkbox" || sType == "radio") { + + this.set("checked", !(this.get("checked"))); + + } + + this._activationKeyPressed = false; + + if (this.get("type") != "menu") { + + this.removeStateCSSClasses("active"); + + } + + } + + }, + + + /** + * @method _onClick + * @description "click" event handler for the button. + * @protected + * @param {Event} p_oEvent Object representing the DOM event object + * passed back by the event utility (YAHOO.util.Event). + */ + _onClick: function (p_oEvent) { + + var sType = this.get("type"), + sTitle, + oForm, + oSrcElement, + bReturnVal; + + + switch (sType) { + + case "radio": + case "checkbox": + + if (!this._hasDefaultTitle) { + + if (this.get("checked")) { + + sTitle = (sType == "radio") ? + this.RADIO_CHECKED_TITLE : + this.CHECKBOX_CHECKED_TITLE; + + } + else { + + sTitle = (sType == "radio") ? + this.RADIO_DEFAULT_TITLE : + this.CHECKBOX_DEFAULT_TITLE; + + } + + this.set("title", sTitle); + + } + + break; + + case "submit": + + if (p_oEvent.returnValue !== false) { + + this.submitForm(); + + } + + break; + + case "reset": + + oForm = this.getForm(); + + if (oForm) { + + oForm.reset(); + + } + + break; + + case "menu": + + sTitle = this._menu.cfg.getProperty("visible") ? + this.MENUBUTTON_MENU_VISIBLE_TITLE : + this.MENUBUTTON_DEFAULT_TITLE; + + this.set("title", sTitle); + + break; + + case "split": + + if (Event.getPageX(p_oEvent) > this._nOptionRegionX) { + + bReturnVal = false; + + } + else { + + this._hideMenu(); + + oSrcElement = this.get("srcelement"); + + if (oSrcElement && oSrcElement.type == "submit") { + + this.submitForm(); + + } + + } + + sTitle = this._menu.cfg.getProperty("visible") ? + this.SPLITBUTTON_OPTION_VISIBLE_TITLE : + this.SPLITBUTTON_DEFAULT_TITLE; + + this.set("title", sTitle); + + break; + + } + + return bReturnVal; + + }, + + + /** + * @method _onDblClick + * @description "dblclick" event handler for the button. + * @protected + * @param {Event} p_oEvent Object representing the DOM event object + * passed back by the event utility (YAHOO.util.Event). + */ + _onDblClick: function (p_oEvent) { + + var bReturnVal = true; + + if (this.get("type") == "split" && Event.getPageX(p_oEvent) > this._nOptionRegionX) { + + bReturnVal = false; + + } + + return bReturnVal; + + }, + + + /** + * @method _onAppendTo + * @description "appendTo" event handler for the button. + * @protected + * @param {Event} p_oEvent Object representing the DOM event object + * passed back by the event utility (YAHOO.util.Event). + */ + _onAppendTo: function (p_oEvent) { + + /* + It is necessary to call "_addListenersToForm" using + "setTimeout" to make sure that the button's "form" property + returns a node reference. Sometimes, if you try to get the + reference immediately after appending the field, it is null. + */ + + Lang.later(0, this, this._addListenersToForm); + + }, + + + /** + * @method _onFormReset + * @description "reset" event handler for the button's form. + * @protected + * @param {Event} p_oEvent Object representing the DOM event + * object passed back by the event utility (YAHOO.util.Event). + */ + _onFormReset: function (p_oEvent) { + + var sType = this.get("type"), + oMenu = this._menu; + + if (sType == "checkbox" || sType == "radio") { + + this.resetValue("checked"); + + } + + + if (Menu && oMenu && (oMenu instanceof Menu)) { + + this.resetValue("selectedMenuItem"); + + } + + }, + + + /** + * @method _onFormSubmit + * @description "submit" event handler for the button's form. + * @protected + * @param {Event} p_oEvent Object representing the DOM event + * object passed back by the event utility (YAHOO.util.Event). + */ + _onFormSubmit: function (p_oEvent) { + + this.createHiddenFields(); + + }, + + + /** + * @method _onDocumentMouseDown + * @description "mousedown" event handler for the document. + * @protected + * @param {Event} p_oEvent Object representing the DOM event object + * passed back by the event utility (YAHOO.util.Event). + */ + _onDocumentMouseDown: function (p_oEvent) { + + var oTarget = Event.getTarget(p_oEvent), + oButtonElement = this.get("element"), + oMenuElement = this._menu.element; + + + if (oTarget != oButtonElement && + !Dom.isAncestor(oButtonElement, oTarget) && + oTarget != oMenuElement && + !Dom.isAncestor(oMenuElement, oTarget)) { + + this._hideMenu(); + + Event.removeListener(document, "mousedown", + this._onDocumentMouseDown); + + } + + }, + + + /** + * @method _onOption + * @description "option" event handler for the button. + * @protected + * @param {Event} p_oEvent Object representing the DOM event object + * passed back by the event utility (YAHOO.util.Event). + */ + _onOption: function (p_oEvent) { + + if (this.hasClass("yui-split-button-activeoption")) { + + this._hideMenu(); + + this._bOptionPressed = false; + + } + else { + + this._showMenu(p_oEvent); + + this._bOptionPressed = true; + + } + + }, + + + /** + * @method _onMenuShow + * @description "show" event handler for the button's menu. + * @private + * @param {String} p_sType String representing the name of the event + * that was fired. + */ + _onMenuShow: function (p_sType) { + + Event.on(document, "mousedown", this._onDocumentMouseDown, + null, this); + + var sTitle, + sState; + + if (this.get("type") == "split") { + + sTitle = this.SPLITBUTTON_OPTION_VISIBLE_TITLE; + sState = "activeoption"; + + } + else { + + sTitle = this.MENUBUTTON_MENU_VISIBLE_TITLE; + sState = "active"; + + } + + this.addStateCSSClasses(sState); + this.set("title", sTitle); + + }, + + + /** + * @method _onMenuHide + * @description "hide" event handler for the button's menu. + * @private + * @param {String} p_sType String representing the name of the event + * that was fired. + */ + _onMenuHide: function (p_sType) { + + var oMenu = this._menu, + sTitle, + sState; + + + if (this.get("type") == "split") { + + sTitle = this.SPLITBUTTON_DEFAULT_TITLE; + sState = "activeoption"; + + } + else { + + sTitle = this.MENUBUTTON_DEFAULT_TITLE; + sState = "active"; + } + + + this.removeStateCSSClasses(sState); + this.set("title", sTitle); + + + if (this.get("type") == "split") { + + this._bOptionPressed = false; + + } + + }, + + + /** + * @method _onMenuKeyDown + * @description "keydown" event handler for the button's menu. + * @private + * @param {String} p_sType String representing the name of the event + * that was fired. + * @param {Array} p_aArgs Array of arguments sent when the event + * was fired. + */ + _onMenuKeyDown: function (p_sType, p_aArgs) { + + var oEvent = p_aArgs[0]; + + if (Event.getCharCode(oEvent) == 27) { + + this.focus(); + + if (this.get("type") == "split") { + + this._bOptionPressed = false; + + } + + } + + }, + + + /** + * @method _onMenuRender + * @description "render" event handler for the button's menu. + * @private + * @param {String} p_sType String representing the name of the + * event thatwas fired. + */ + _onMenuRender: function (p_sType) { + + var oButtonElement = this.get("element"), + oButtonParent = oButtonElement.parentNode, + oMenuElement = this._menu.element; + + + if (oButtonParent != oMenuElement.parentNode) { + + oButtonParent.appendChild(oMenuElement); + + } + + this._renderedMenu = true; + + this.set("selectedMenuItem", this.get("selectedMenuItem")); + + }, + + + /** + * @method _onMenuItemSelected + * @description "selectedchange" event handler for each item in the + * button's menu. + * @private + * @param {String} p_sType String representing the name of the event + * that was fired. + * @param {Array} p_aArgs Array of arguments sent when the event + * was fired. + * @param {MenuItem} p_oItem Object representing the menu item that + * subscribed to the event. + */ + _onMenuItemSelected: function (p_sType, p_aArgs, p_oItem) { + + var bSelected = p_aArgs[0]; + + if (bSelected) { + + this.set("selectedMenuItem", p_oItem); + + } + + }, + + + /** + * @method _onMenuItemAdded + * @description "itemadded" event handler for the button's menu. + * @private + * @param {String} p_sType String representing the name of the event + * that was fired. + * @param {Array} p_aArgs Array of arguments sent when the event + * was fired. + * @param { + * YAHOO.widget.MenuItem} p_oItem Object representing the menu + * item that subscribed to the event. + */ + _onMenuItemAdded: function (p_sType, p_aArgs, p_oItem) { + + var oItem = p_aArgs[0]; + + oItem.cfg.subscribeToConfigEvent("selected", this._onMenuItemSelected, oItem, this); + + }, + + + /** + * @method _onMenuClick + * @description "click" event handler for the button's menu. + * @private + * @param {String} p_sType String representing the name of the event + * that was fired. + * @param {Array} p_aArgs Array of arguments sent when the event + * was fired. + */ + _onMenuClick: function (p_sType, p_aArgs) { + + var oItem = p_aArgs[1], + oSrcElement; + + if (oItem) { + + this.set("selectedMenuItem", oItem); + + oSrcElement = this.get("srcelement"); + + if (oSrcElement && oSrcElement.type == "submit") { + + this.submitForm(); + + } + + this._hideMenu(); + + } + + }, + + + + // Public methods + + + /** + * @method createButtonElement + * @description Creates the button's HTML elements. + * @param {String} p_sType String indicating the type of element + * to create. + * @return {HTMLElement} + */ + createButtonElement: function (p_sType) { + + var sNodeName = this.NODE_NAME, + oElement = document.createElement(sNodeName); + + oElement.innerHTML = "<" + sNodeName + " class=\"first-child\">" + + (p_sType == "link" ? "" : + "") + ""; + + return oElement; + + }, + + + /** + * @method addStateCSSClasses + * @description Appends state-specific CSS classes to the button's root + * DOM element. + */ + addStateCSSClasses: function (p_sState) { + + var sType = this.get("type"); + + if (Lang.isString(p_sState)) { + + if (p_sState != "activeoption" && p_sState != "hoveroption") { + + this.addClass(this.CSS_CLASS_NAME + ("-" + p_sState)); + + } + + this.addClass("yui-" + sType + ("-button-" + p_sState)); + + } + + }, + + + /** + * @method removeStateCSSClasses + * @description Removes state-specific CSS classes to the button's root + * DOM element. + */ + removeStateCSSClasses: function (p_sState) { + + var sType = this.get("type"); + + if (Lang.isString(p_sState)) { + + this.removeClass(this.CSS_CLASS_NAME + ("-" + p_sState)); + this.removeClass("yui-" + sType + ("-button-" + p_sState)); + + } + + }, + + + /** + * @method createHiddenFields + * @description Creates the button's hidden form field and appends it + * to its parent form. + * @return {HTMLInputElement|Array} + */ + createHiddenFields: function () { + + this.removeHiddenFields(); + + var oForm = this.getForm(), + oButtonField, + sType, + bCheckable, + oMenu, + oMenuItem, + sButtonName, + oValue, + oMenuField, + oReturnVal, + sMenuFieldName, + oMenuSrcElement, + bMenuSrcElementIsSelect = false; + + + if (oForm && !this.get("disabled")) { + + sType = this.get("type"); + bCheckable = (sType == "checkbox" || sType == "radio"); + + + if ((bCheckable && this.get("checked")) || (m_oSubmitTrigger == this)) { + + + oButtonField = createInputElement((bCheckable ? sType : "hidden"), + this.get("name"), this.get("value"), this.get("checked")); + + + if (oButtonField) { + + if (bCheckable) { + + oButtonField.style.display = "none"; + + } + + oForm.appendChild(oButtonField); + + } + + } + + + oMenu = this._menu; + + + if (Menu && oMenu && (oMenu instanceof Menu)) { + + + oMenuItem = this.get("selectedMenuItem"); + oMenuSrcElement = oMenu.srcElement; + bMenuSrcElementIsSelect = (oMenuSrcElement && + oMenuSrcElement.nodeName.toUpperCase() == "SELECT"); + + if (oMenuItem) { + + oValue = (oMenuItem.value === null || oMenuItem.value === "") ? + oMenuItem.cfg.getProperty("text") : oMenuItem.value; + + sButtonName = this.get("name"); + + + if (bMenuSrcElementIsSelect) { + + sMenuFieldName = oMenuSrcElement.name; + + } + else if (sButtonName) { + + sMenuFieldName = (sButtonName + "_options"); + + } + + + if (oValue && sMenuFieldName) { + + oMenuField = createInputElement("hidden", sMenuFieldName, oValue); + oForm.appendChild(oMenuField); + + } + + } + else if (bMenuSrcElementIsSelect) { + + oForm.appendChild(oMenuSrcElement); + + } + + } + + + if (oButtonField && oMenuField) { + + this._hiddenFields = [oButtonField, oMenuField]; + + } + else if (!oButtonField && oMenuField) { + + this._hiddenFields = oMenuField; + + } + else if (oButtonField && !oMenuField) { + + this._hiddenFields = oButtonField; + + } + + oReturnVal = this._hiddenFields; + + } + + return oReturnVal; + + }, + + + /** + * @method removeHiddenFields + * @description Removes the button's hidden form field(s) from its + * parent form. + */ + removeHiddenFields: function () { + + var oField = this._hiddenFields, + nFields, + i; + + function removeChild(p_oElement) { + + if (Dom.inDocument(p_oElement)) { + + p_oElement.parentNode.removeChild(p_oElement); + + } + + } + + + if (oField) { + + if (Lang.isArray(oField)) { + + nFields = oField.length; + + if (nFields > 0) { + + i = nFields - 1; + + do { + + removeChild(oField[i]); + + } + while (i--); + + } + + } + else { + + removeChild(oField); + + } + + this._hiddenFields = null; + + } + + }, + + + /** + * @method submitForm + * @description Submits the form to which the button belongs. Returns + * true if the form was submitted successfully, false if the submission + * was cancelled. + * @protected + * @return {Boolean} + */ + submitForm: function () { + + var oForm = this.getForm(), + + oSrcElement = this.get("srcelement"), + + /* + Boolean indicating if the event fired successfully + (was not cancelled by any handlers) + */ + + bSubmitForm = false, + + oEvent; + + + if (oForm) { + + if (this.get("type") == "submit" || (oSrcElement && oSrcElement.type == "submit")) { + + m_oSubmitTrigger = this; + + } + + + if (UA.ie) { + + bSubmitForm = oForm.fireEvent("onsubmit"); + + } + else { // Gecko, Opera, and Safari + + oEvent = document.createEvent("HTMLEvents"); + oEvent.initEvent("submit", true, true); + + bSubmitForm = oForm.dispatchEvent(oEvent); + + } + + + /* + In IE and Safari, dispatching a "submit" event to a form + WILL cause the form's "submit" event to fire, but WILL NOT + submit the form. Therefore, we need to call the "submit" + method as well. + */ + + if ((UA.ie || UA.webkit) && bSubmitForm) { + + oForm.submit(); + + } + + } + + return bSubmitForm; + + }, + + + /** + * @method init + * @description The Button class's initialization method. + * @param {String} p_oElement String specifying the id attribute of the + * <input>, <button>, + * <a>, or <span> element to + * be used to create the button. + * @param {HTMLInputElement|HTMLButtonElement| + * HTMLElement} p_oElement Object reference for the + * <input>, <button>, + * <a>, or <span> element to be + * used to create the button. + * @param {Object} p_oElement Object literal specifying a set of + * configuration attributes used to create the button. + * @param {Object} p_oAttributes Optional. Object literal specifying a + * set of configuration attributes used to create the button. + */ + init: function (p_oElement, p_oAttributes) { + + var sNodeName = p_oAttributes.type == "link" ? "a" : "button", + oSrcElement = p_oAttributes.srcelement, + oButton = p_oElement.getElementsByTagName(sNodeName)[0], + oInput; + + + if (!oButton) { + + oInput = p_oElement.getElementsByTagName("input")[0]; + + + if (oInput) { + + oButton = document.createElement("button"); + oButton.setAttribute("type", "button"); + + oInput.parentNode.replaceChild(oButton, oInput); + + } + + } + + this._button = oButton; + + /* + Capture if the button has a value for the title attribute. If so, we won't + override it for type of "checkbox" or "radio". + */ + + this._hasDefaultTitle = (p_oAttributes.title && p_oAttributes.title.length > 0); + + YAHOO.widget.Button.superclass.init.call(this, p_oElement, p_oAttributes); + + + var sId = this.get("id"), + sButtonId = sId + "-button"; + + + oButton.id = sButtonId; + + + var aLabels, + oLabel; + + + var hasLabel = function (element) { + + return (element.htmlFor === sId); + + }; + + + var setLabel = function () { + + oLabel.setAttribute((UA.ie ? "htmlFor" : "for"), sButtonId); + + }; + + + if (oSrcElement && this.get("type") != "link") { + + aLabels = Dom.getElementsBy(hasLabel, "label"); + + if (Lang.isArray(aLabels) && aLabels.length > 0) { + + oLabel = aLabels[0]; + + } + + } + + + m_oButtons[sId] = this; + + + this.addClass(this.CSS_CLASS_NAME); + this.addClass("yui-" + this.get("type") + "-button"); + + Event.on(this._button, "focus", this._onFocus, null, this); + this.on("mouseover", this._onMouseOver); + this.on("mousedown", this._onMouseDown); + this.on("mouseup", this._onMouseUp); + this.on("click", this._onClick); + this.on("dblclick", this._onDblClick); + + if (oLabel) { + + this.on("appendTo", setLabel); + + } + + this.on("appendTo", this._onAppendTo); + + + + var oContainer = this.get("container"), + oElement = this.get("element"), + bElInDoc = Dom.inDocument(oElement), + oParentNode; + + + if (oContainer) { + + if (oSrcElement && oSrcElement != oElement) { + + oParentNode = oSrcElement.parentNode; + + if (oParentNode) { + + oParentNode.removeChild(oSrcElement); + + } + + } + + if (Lang.isString(oContainer)) { + + Event.onContentReady(oContainer, this.appendTo, oContainer, this); + + } + else { + + this.on("init", function () { + + Lang.later(0, this, this.appendTo, oContainer); + + }); + + } + + } + else if (!bElInDoc && oSrcElement && oSrcElement != oElement) { + + oParentNode = oSrcElement.parentNode; + + if (oParentNode) { + + this.fireEvent("beforeAppendTo", { + type: "beforeAppendTo", + target: oParentNode + }); + + oParentNode.replaceChild(oElement, oSrcElement); + + this.fireEvent("appendTo", { + type: "appendTo", + target: oParentNode + }); + + } + + } + else if (this.get("type") != "link" && bElInDoc && oSrcElement && + oSrcElement == oElement) { + + this._addListenersToForm(); + + } + + + + this.fireEvent("init", { + type: "init", + target: this + }); + + }, + + + /** + * @method initAttributes + * @description Initializes all of the configuration attributes used to + * create the button. + * @param {Object} p_oAttributes Object literal specifying a set of + * configuration attributes used to create the button. + */ + initAttributes: function (p_oAttributes) { + + var oAttributes = p_oAttributes || {}; + + YAHOO.widget.Button.superclass.initAttributes.call(this, + oAttributes); + + + /** + * @attribute type + * @description String specifying the button's type. Possible + * values are: "push," "link," "submit," "reset," "checkbox," + * "radio," "menu," and "split." + * @default "push" + * @type String + */ + this.setAttributeConfig("type", { + + value: (oAttributes.type || "push"), + validator: Lang.isString, + writeOnce: true, + method: this._setType + + }); + + + /** + * @attribute label + * @description String specifying the button's text label + * or innerHTML. + * @default null + * @type String + */ + this.setAttributeConfig("label", { + + value: oAttributes.label, + validator: Lang.isString, + method: this._setLabel + + }); + + + /** + * @attribute value + * @description Object specifying the value for the button. + * @default null + * @type Object + */ + this.setAttributeConfig("value", { + + value: oAttributes.value + + }); + + + /** + * @attribute name + * @description String specifying the name for the button. + * @default null + * @type String + */ + this.setAttributeConfig("name", { + + value: oAttributes.name, + validator: Lang.isString + + }); + + + /** + * @attribute tabindex + * @description Number specifying the tabindex for the button. + * @default null + * @type Number + */ + this.setAttributeConfig("tabindex", { + + value: oAttributes.tabindex, + validator: Lang.isNumber, + method: this._setTabIndex + + }); + + + /** + * @attribute title + * @description String specifying the title for the button. + * @default null + * @type String + */ + this.configureAttribute("title", { + + value: oAttributes.title, + validator: Lang.isString, + method: this._setTitle + + }); + + + /** + * @attribute disabled + * @description Boolean indicating if the button should be disabled. + * (Disabled buttons are dimmed and will not respond to user input + * or fire events. Does not apply to button's of type "link.") + * @default false + * @type Boolean + */ + this.setAttributeConfig("disabled", { + + value: (oAttributes.disabled || false), + validator: Lang.isBoolean, + method: this._setDisabled + + }); + + + /** + * @attribute href + * @description String specifying the href for the button. Applies + * only to buttons of type "link." + * @type String + */ + this.setAttributeConfig("href", { + + value: oAttributes.href, + validator: Lang.isString, + method: this._setHref + + }); + + + /** + * @attribute target + * @description String specifying the target for the button. + * Applies only to buttons of type "link." + * @type String + */ + this.setAttributeConfig("target", { + + value: oAttributes.target, + validator: Lang.isString, + method: this._setTarget + + }); + + + /** + * @attribute checked + * @description Boolean indicating if the button is checked. + * Applies only to buttons of type "radio" and "checkbox." + * @default false + * @type Boolean + */ + this.setAttributeConfig("checked", { + + value: (oAttributes.checked || false), + validator: Lang.isBoolean, + method: this._setChecked + + }); + + + /** + * @attribute container + * @description HTML element reference or string specifying the id + * attribute of the HTML element that the button's markup should be + * rendered into. + * @type HTMLElement|String + * @default null + */ + this.setAttributeConfig("container", { + + value: oAttributes.container, + writeOnce: true + + }); + + + /** + * @attribute srcelement + * @description Object reference to the HTML element (either + * <input> or <span>) + * used to create the button. + * @type HTMLElement|String + * @default null + */ + this.setAttributeConfig("srcelement", { + + value: oAttributes.srcelement, + writeOnce: true + + }); + + + /** + * @attribute menu + * @description Object specifying the menu for the button. + * The value can be one of the following: + *
      + *
    • Object specifying a + * YAHOO.widget.Menu instance.
    • + *
    • Object specifying a + * YAHOO.widget.Overlay instance.
    • + *
    • String specifying the id attribute of the <div> + * element used to create the menu. By default the menu + * will be created as an instance of + * YAHOO.widget.Overlay. + * If the + * default CSS class name for YAHOO.widget.Menu is applied to + * the <div> element, it will be created as an + * instance of YAHOO.widget.Menu + * .
    • String specifying the id attribute of the + * <select> element used to create the menu. + *
    • Object specifying the <div> element + * used to create the menu.
    • + *
    • Object specifying the <select> element + * used to create the menu.
    • + *
    • Array of object literals, each representing a set of + * YAHOO.widget.MenuItem + * configuration attributes.
    • + *
    • Array of strings representing the text labels for each menu + * item in the menu.
    • + *
    + * @type YAHOO.widget.Menu|YAHOO.widget.Overlay|HTMLElement|String|Array + * @default null + */ + this.setAttributeConfig("menu", { + + value: null, + method: this._setMenu, + writeOnce: true + + }); + + + /** + * @attribute lazyloadmenu + * @description Boolean indicating the value to set for the + * "lazyload" + * configuration property of the button's menu. Setting + * "lazyloadmenu" to true will defer rendering of + * the button's menu until the first time it is made visible. + * If "lazyloadmenu" is set to false, the button's + * menu will be rendered immediately if the button is in the + * document, or in response to the button's "appendTo" event if + * the button is not yet in the document. In either case, the + * menu is rendered into the button's parent HTML element. + * This attribute does not apply if a + * YAHOO.widget.Menu or + * YAHOO.widget.Overlay + * instance is passed as the value of the button's "menu" + * configuration attribute. + * YAHOO.widget.Menu or + * YAHOO.widget.Overlay instances should be rendered before + * being set as the value for the "menu" configuration + * attribute. + * @default true + * @type Boolean + */ + this.setAttributeConfig("lazyloadmenu", { + + value: (oAttributes.lazyloadmenu === false ? false : true), + validator: Lang.isBoolean, + writeOnce: true + + }); + + + /** + * @attribute menuclassname + * @description String representing the CSS class name to be + * applied to the root element of the button's menu. + * @type String + * @default "yui-button-menu" + */ + this.setAttributeConfig("menuclassname", { + + value: (oAttributes.menuclassname || "yui-button-menu"), + validator: Lang.isString, + method: this._setMenuClassName, + writeOnce: true + + }); + + + /** + * @attribute menuminscrollheight + * @description Number defining the minimum threshold for the "menumaxheight" + * configuration attribute. When set this attribute is automatically applied + * to all submenus. + * @default 90 + * @type Number + */ + this.setAttributeConfig("menuminscrollheight", { + + value: (oAttributes.menuminscrollheight || 90), + validator: Lang.isNumber + + }); + + + /** + * @attribute menumaxheight + * @description Number defining the maximum height (in pixels) for a menu's + * body element (<div class="bd"<). Once a menu's body + * exceeds this height, the contents of the body are scrolled to maintain + * this value. This value cannot be set lower than the value of the + * "minscrollheight" configuration property. + * @type Number + * @default 0 + */ + this.setAttributeConfig("menumaxheight", { + + value: (oAttributes.menumaxheight || 0), + validator: Lang.isNumber + + }); + + + /** + * @attribute menualignment + * @description Array defining how the Button's Menu is aligned to the Button. + * The default value of ["tl", "bl"] aligns the Menu's top left corner to the Button's + * bottom left corner. + * @type Array + * @default ["tl", "bl"] + */ + this.setAttributeConfig("menualignment", { + + value: (oAttributes.menualignment || ["tl", "bl"]), + validator: Lang.isArray + + }); + + + /** + * @attribute selectedMenuItem + * @description Object representing the item in the button's menu + * that is currently selected. + * @type Number + * @default null + */ + this.setAttributeConfig("selectedMenuItem", { + + value: null, + method: this._setSelectedMenuItem + + }); + + + /** + * @attribute onclick + * @description Object literal representing the code to be executed + * when the button is clicked. Format:
    {
    + * fn: Function, // The handler to call + * when the event fires.
    obj: Object, + * // An object to pass back to the handler.
    + * scope: Object // The object to use + * for the scope of the handler.
    }
    + * @type Object + * @default null + */ + this.setAttributeConfig("onclick", { + + value: oAttributes.onclick, + method: this._setOnClick + + }); + + + /** + * @attribute focusmenu + * @description Boolean indicating whether or not the button's menu + * should be focused when it is made visible. + * @type Boolean + * @default true + */ + this.setAttributeConfig("focusmenu", { + + value: (oAttributes.focusmenu === false ? false : true), + validator: Lang.isBoolean + + }); + + }, + + + /** + * @method focus + * @description Causes the button to receive the focus and fires the + * button's "focus" event. + */ + focus: function () { + + if (!this.get("disabled")) { + + this._button.focus(); + + } + + }, + + + /** + * @method blur + * @description Causes the button to lose focus and fires the button's + * "blur" event. + */ + blur: function () { + + if (!this.get("disabled")) { + + this._button.blur(); + + } + + }, + + + /** + * @method hasFocus + * @description Returns a boolean indicating whether or not the button + * has focus. + * @return {Boolean} + */ + hasFocus: function () { + + return (m_oFocusedButton == this); + + }, + + + /** + * @method isActive + * @description Returns a boolean indicating whether or not the button + * is active. + * @return {Boolean} + */ + isActive: function () { + + return this.hasClass(this.CSS_CLASS_NAME + "-active"); + + }, + + + /** + * @method getMenu + * @description Returns a reference to the button's menu. + * @return { + * YAHOO.widget.Overlay|YAHOO.widget.Menu} + */ + getMenu: function () { + + return this._menu; + + }, + + + /** + * @method getForm + * @description Returns a reference to the button's parent form. + * @return {HTMLFormElement} + */ + getForm: function () { + + var oButton = this._button, + oForm; + + if (oButton) { + + oForm = oButton.form; + + } + + return oForm; + + }, + + + /** + * @method getHiddenFields + * @description Returns an <input> element or + * array of form elements used to represent the button when its parent + * form is submitted. + * @return {HTMLInputElement|Array} + */ + getHiddenFields: function () { + + return this._hiddenFields; + + }, + + + /** + * @method destroy + * @description Removes the button's element from its parent element and + * removes all event handlers. + */ + destroy: function () { + + + var oElement = this.get("element"), + oParentNode = oElement.parentNode, + oMenu = this._menu, + aButtons; + + if (oMenu) { + + + if (m_oOverlayManager && m_oOverlayManager.find(oMenu)) { + + m_oOverlayManager.remove(oMenu); + + } + + oMenu.destroy(); + + } + + + Event.purgeElement(oElement); + Event.purgeElement(this._button); + Event.removeListener(document, "mouseup", this._onDocumentMouseUp); + Event.removeListener(document, "keyup", this._onDocumentKeyUp); + Event.removeListener(document, "mousedown", this._onDocumentMouseDown); + + + var oForm = this.getForm(); + + if (oForm) { + + Event.removeListener(oForm, "reset", this._onFormReset); + Event.removeListener(oForm, "submit", this._onFormSubmit); + + } + + + this.unsubscribeAll(); + + if (oParentNode) { + + oParentNode.removeChild(oElement); + + } + + + delete m_oButtons[this.get("id")]; + + aButtons = Dom.getElementsByClassName(this.CSS_CLASS_NAME, + this.NODE_NAME, oForm); + + if (Lang.isArray(aButtons) && aButtons.length === 0) { + + Event.removeListener(oForm, "keypress", + YAHOO.widget.Button.onFormKeyPress); + + } + + + }, + + + fireEvent: function (p_sType , p_aArgs) { + + var sType = arguments[0]; + + // Disabled buttons should not respond to DOM events + + if (this.DOM_EVENTS[sType] && this.get("disabled")) { + + return false; + + } + + return YAHOO.widget.Button.superclass.fireEvent.apply(this, arguments); + + }, + + + /** + * @method toString + * @description Returns a string representing the button. + * @return {String} + */ + toString: function () { + + return ("Button " + this.get("id")); + + } + + }); + + + /** + * @method YAHOO.widget.Button.onFormKeyPress + * @description "keypress" event handler for the button's form. + * @param {Event} p_oEvent Object representing the DOM event object passed + * back by the event utility (YAHOO.util.Event). + */ + YAHOO.widget.Button.onFormKeyPress = function (p_oEvent) { + + var oTarget = Event.getTarget(p_oEvent), + nCharCode = Event.getCharCode(p_oEvent), + sNodeName = oTarget.nodeName && oTarget.nodeName.toUpperCase(), + sType = oTarget.type, + + /* + Boolean indicating if the form contains any enabled or + disabled YUI submit buttons + */ + + bFormContainsYUIButtons = false, + + oButton, + + oYUISubmitButton, // The form's first, enabled YUI submit button + + /* + The form's first, enabled HTML submit button that precedes any + YUI submit button + */ + + oPrecedingSubmitButton, + + oEvent; + + + function isSubmitButton(p_oElement) { + + var sId, + oSrcElement; + + switch (p_oElement.nodeName.toUpperCase()) { + + case "INPUT": + case "BUTTON": + + if (p_oElement.type == "submit" && !p_oElement.disabled) { + + if (!bFormContainsYUIButtons && !oPrecedingSubmitButton) { + + oPrecedingSubmitButton = p_oElement; + + } + + } + + break; + + + default: + + sId = p_oElement.id; + + if (sId) { + + oButton = m_oButtons[sId]; + + if (oButton) { + + bFormContainsYUIButtons = true; + + if (!oButton.get("disabled")) { + + oSrcElement = oButton.get("srcelement"); + + if (!oYUISubmitButton && (oButton.get("type") == "submit" || + (oSrcElement && oSrcElement.type == "submit"))) { + + oYUISubmitButton = oButton; + + } + + } + + } + + } + + break; + + } + + } + + + if (nCharCode == 13 && ((sNodeName == "INPUT" && (sType == "text" || + sType == "password" || sType == "checkbox" || sType == "radio" || + sType == "file")) || sNodeName == "SELECT")) { + + Dom.getElementsBy(isSubmitButton, "*", this); + + + if (oPrecedingSubmitButton) { + + /* + Need to set focus to the first enabled submit button + to make sure that IE includes its name and value + in the form's data set. + */ + + oPrecedingSubmitButton.focus(); + + } + else if (!oPrecedingSubmitButton && oYUISubmitButton) { + + /* + Need to call "preventDefault" to ensure that the form doesn't end up getting + submitted twice. + */ + + Event.preventDefault(p_oEvent); + + + if (UA.ie) { + + oYUISubmitButton.get("element").fireEvent("onclick"); + + } + else { + + oEvent = document.createEvent("HTMLEvents"); + oEvent.initEvent("click", true, true); + + + if (UA.gecko < 1.9) { + + oYUISubmitButton.fireEvent("click", oEvent); + + } + else { + + oYUISubmitButton.get("element").dispatchEvent(oEvent); + + } + + } + + } + + } + + }; + + + /** + * @method YAHOO.widget.Button.addHiddenFieldsToForm + * @description Searches the specified form and adds hidden fields for + * instances of YAHOO.widget.Button that are of type "radio," "checkbox," + * "menu," and "split." + * @param {HTMLFormElement} p_oForm Object reference + * for the form to search. + */ + YAHOO.widget.Button.addHiddenFieldsToForm = function (p_oForm) { + + var aButtons = Dom.getElementsByClassName( + YAHOO.widget.Button.prototype.CSS_CLASS_NAME, + "*", + p_oForm), + + nButtons = aButtons.length, + oButton, + sId, + i; + + if (nButtons > 0) { + + + for (i = 0; i < nButtons; i++) { + + sId = aButtons[i].id; + + if (sId) { + + oButton = m_oButtons[sId]; + + if (oButton) { + + oButton.createHiddenFields(); + + } + + } + + } + + } + + }; + + + /** + * @method YAHOO.widget.Button.getButton + * @description Returns a button with the specified id. + * @param {String} p_sId String specifying the id of the root node of the + * HTML element representing the button to be retrieved. + * @return {YAHOO.widget.Button} + */ + YAHOO.widget.Button.getButton = function (p_sId) { + + return m_oButtons[p_sId]; + + }; + + + // Events + + + /** + * @event focus + * @description Fires when the menu item receives focus. Passes back a + * single object representing the original DOM event object passed back by + * the event utility (YAHOO.util.Event) when the event was fired. See + * Element.addListener + * for more information on listening for this event. + * @type YAHOO.util.CustomEvent + */ + + + /** + * @event blur + * @description Fires when the menu item loses the input focus. Passes back + * a single object representing the original DOM event object passed back by + * the event utility (YAHOO.util.Event) when the event was fired. See + * Element.addListener for + * more information on listening for this event. + * @type YAHOO.util.CustomEvent + */ + + + /** + * @event option + * @description Fires when the user invokes the button's option. Passes + * back a single object representing the original DOM event (either + * "mousedown" or "keydown") that caused the "option" event to fire. See + * Element.addListener + * for more information on listening for this event. + * @type YAHOO.util.CustomEvent + */ + +})(); +(function () { + + // Shorthard for utilities + + var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event, + Lang = YAHOO.lang, + Button = YAHOO.widget.Button, + + // Private collection of radio buttons + + m_oButtons = {}; + + + + /** + * The ButtonGroup class creates a set of buttons that are mutually + * exclusive; checking one button in the set will uncheck all others in the + * button group. + * @param {String} p_oElement String specifying the id attribute of the + * <div> element of the button group. + * @param {HTMLDivElement} p_oElement Object + * specifying the <div> element of the button group. + * @param {Object} p_oElement Object literal specifying a set of + * configuration attributes used to create the button group. + * @param {Object} p_oAttributes Optional. Object literal specifying a set + * of configuration attributes used to create the button group. + * @namespace YAHOO.widget + * @class ButtonGroup + * @constructor + * @extends YAHOO.util.Element + */ + YAHOO.widget.ButtonGroup = function (p_oElement, p_oAttributes) { + + var fnSuperClass = YAHOO.widget.ButtonGroup.superclass.constructor, + sNodeName, + oElement, + sId; + + if (arguments.length == 1 && !Lang.isString(p_oElement) && + !p_oElement.nodeName) { + + if (!p_oElement.id) { + + sId = Dom.generateId(); + + p_oElement.id = sId; + + + } + + + + fnSuperClass.call(this, (this._createGroupElement()), p_oElement); + + } + else if (Lang.isString(p_oElement)) { + + oElement = Dom.get(p_oElement); + + if (oElement) { + + if (oElement.nodeName.toUpperCase() == this.NODE_NAME) { + + + fnSuperClass.call(this, oElement, p_oAttributes); + + } + + } + + } + else { + + sNodeName = p_oElement.nodeName.toUpperCase(); + + if (sNodeName && sNodeName == this.NODE_NAME) { + + if (!p_oElement.id) { + + p_oElement.id = Dom.generateId(); + + + } + + + fnSuperClass.call(this, p_oElement, p_oAttributes); + + } + + } + + }; + + + YAHOO.extend(YAHOO.widget.ButtonGroup, YAHOO.util.Element, { + + + // Protected properties + + + /** + * @property _buttons + * @description Array of buttons in the button group. + * @default null + * @protected + * @type Array + */ + _buttons: null, + + + + // Constants + + + /** + * @property NODE_NAME + * @description The name of the tag to be used for the button + * group's element. + * @default "DIV" + * @final + * @type String + */ + NODE_NAME: "DIV", + + + /** + * @property CSS_CLASS_NAME + * @description String representing the CSS class(es) to be applied + * to the button group's element. + * @default "yui-buttongroup" + * @final + * @type String + */ + CSS_CLASS_NAME: "yui-buttongroup", + + + + // Protected methods + + + /** + * @method _createGroupElement + * @description Creates the button group's element. + * @protected + * @return {HTMLDivElement} + */ + _createGroupElement: function () { + + var oElement = document.createElement(this.NODE_NAME); + + return oElement; + + }, + + + + // Protected attribute setter methods + + + /** + * @method _setDisabled + * @description Sets the value of the button groups's + * "disabled" attribute. + * @protected + * @param {Boolean} p_bDisabled Boolean indicating the value for + * the button group's "disabled" attribute. + */ + _setDisabled: function (p_bDisabled) { + + var nButtons = this.getCount(), + i; + + if (nButtons > 0) { + + i = nButtons - 1; + + do { + + this._buttons[i].set("disabled", p_bDisabled); + + } + while (i--); + + } + + }, + + + + // Protected event handlers + + + /** + * @method _onKeyDown + * @description "keydown" event handler for the button group. + * @protected + * @param {Event} p_oEvent Object representing the DOM event object + * passed back by the event utility (YAHOO.util.Event). + */ + _onKeyDown: function (p_oEvent) { + + var oTarget = Event.getTarget(p_oEvent), + nCharCode = Event.getCharCode(p_oEvent), + sId = oTarget.parentNode.parentNode.id, + oButton = m_oButtons[sId], + nIndex = -1; + + + if (nCharCode == 37 || nCharCode == 38) { + + nIndex = (oButton.index === 0) ? + (this._buttons.length - 1) : (oButton.index - 1); + + } + else if (nCharCode == 39 || nCharCode == 40) { + + nIndex = (oButton.index === (this._buttons.length - 1)) ? + 0 : (oButton.index + 1); + + } + + + if (nIndex > -1) { + + this.check(nIndex); + this.getButton(nIndex).focus(); + + } + + }, + + + /** + * @method _onAppendTo + * @description "appendTo" event handler for the button group. + * @protected + * @param {Event} p_oEvent Object representing the event that was fired. + */ + _onAppendTo: function (p_oEvent) { + + var aButtons = this._buttons, + nButtons = aButtons.length, + i; + + for (i = 0; i < nButtons; i++) { + + aButtons[i].appendTo(this.get("element")); + + } + + }, + + + /** + * @method _onButtonCheckedChange + * @description "checkedChange" event handler for each button in the + * button group. + * @protected + * @param {Event} p_oEvent Object representing the event that was fired. + * @param {YAHOO.widget.Button} + * p_oButton Object representing the button that fired the event. + */ + _onButtonCheckedChange: function (p_oEvent, p_oButton) { + + var bChecked = p_oEvent.newValue, + oCheckedButton = this.get("checkedButton"); + + if (bChecked && oCheckedButton != p_oButton) { + + if (oCheckedButton) { + + oCheckedButton.set("checked", false, true); + + } + + this.set("checkedButton", p_oButton); + this.set("value", p_oButton.get("value")); + + } + else if (oCheckedButton && !oCheckedButton.set("checked")) { + + oCheckedButton.set("checked", true, true); + + } + + }, + + + + // Public methods + + + /** + * @method init + * @description The ButtonGroup class's initialization method. + * @param {String} p_oElement String specifying the id attribute of the + * <div> element of the button group. + * @param {HTMLDivElement} p_oElement Object + * specifying the <div> element of the button group. + * @param {Object} p_oElement Object literal specifying a set of + * configuration attributes used to create the button group. + * @param {Object} p_oAttributes Optional. Object literal specifying a + * set of configuration attributes used to create the button group. + */ + init: function (p_oElement, p_oAttributes) { + + this._buttons = []; + + YAHOO.widget.ButtonGroup.superclass.init.call(this, p_oElement, + p_oAttributes); + + this.addClass(this.CSS_CLASS_NAME); + + + var aButtons = this.getElementsByClassName("yui-radio-button"); + + + if (aButtons.length > 0) { + + + this.addButtons(aButtons); + + } + + + + function isRadioButton(p_oElement) { + + return (p_oElement.type == "radio"); + + } + + aButtons = + Dom.getElementsBy(isRadioButton, "input", this.get("element")); + + + if (aButtons.length > 0) { + + + this.addButtons(aButtons); + + } + + this.on("keydown", this._onKeyDown); + this.on("appendTo", this._onAppendTo); + + + var oContainer = this.get("container"); + + if (oContainer) { + + if (Lang.isString(oContainer)) { + + Event.onContentReady(oContainer, function () { + + this.appendTo(oContainer); + + }, null, this); + + } + else { + + this.appendTo(oContainer); + + } + + } + + + + }, + + + /** + * @method initAttributes + * @description Initializes all of the configuration attributes used to + * create the button group. + * @param {Object} p_oAttributes Object literal specifying a set of + * configuration attributes used to create the button group. + */ + initAttributes: function (p_oAttributes) { + + var oAttributes = p_oAttributes || {}; + + YAHOO.widget.ButtonGroup.superclass.initAttributes.call( + this, oAttributes); + + + /** + * @attribute name + * @description String specifying the name for the button group. + * This name will be applied to each button in the button group. + * @default null + * @type String + */ + this.setAttributeConfig("name", { + + value: oAttributes.name, + validator: Lang.isString + + }); + + + /** + * @attribute disabled + * @description Boolean indicating if the button group should be + * disabled. Disabling the button group will disable each button + * in the button group. Disabled buttons are dimmed and will not + * respond to user input or fire events. + * @default false + * @type Boolean + */ + this.setAttributeConfig("disabled", { + + value: (oAttributes.disabled || false), + validator: Lang.isBoolean, + method: this._setDisabled + + }); + + + /** + * @attribute value + * @description Object specifying the value for the button group. + * @default null + * @type Object + */ + this.setAttributeConfig("value", { + + value: oAttributes.value + + }); + + + /** + * @attribute container + * @description HTML element reference or string specifying the id + * attribute of the HTML element that the button group's markup + * should be rendered into. + * @type HTMLElement|String + * @default null + */ + this.setAttributeConfig("container", { + + value: oAttributes.container, + writeOnce: true + + }); + + + /** + * @attribute checkedButton + * @description Reference for the button in the button group that + * is checked. + * @type {YAHOO.widget.Button} + * @default null + */ + this.setAttributeConfig("checkedButton", { + + value: null + + }); + + }, + + + /** + * @method addButton + * @description Adds the button to the button group. + * @param {YAHOO.widget.Button} + * p_oButton Object reference for the + * YAHOO.widget.Button instance to be added to the button group. + * @param {String} p_oButton String specifying the id attribute of the + * <input> or <span> element + * to be used to create the button to be added to the button group. + * @param {HTMLInputElement|HTMLElement} p_oButton Object reference for the + * <input> or <span> element + * to be used to create the button to be added to the button group. + * @param {Object} p_oButton Object literal specifying a set of + * YAHOO.widget.Button + * configuration attributes used to configure the button to be added to + * the button group. + * @return {YAHOO.widget.Button} + */ + addButton: function (p_oButton) { + + var oButton, + oButtonElement, + oGroupElement, + nIndex, + sButtonName, + sGroupName; + + + if (p_oButton instanceof Button && + p_oButton.get("type") == "radio") { + + oButton = p_oButton; + + } + else if (!Lang.isString(p_oButton) && !p_oButton.nodeName) { + + p_oButton.type = "radio"; + + oButton = new Button(p_oButton); + + } + else { + + oButton = new Button(p_oButton, { type: "radio" }); + + } + + + if (oButton) { + + nIndex = this._buttons.length; + sButtonName = oButton.get("name"); + sGroupName = this.get("name"); + + oButton.index = nIndex; + + this._buttons[nIndex] = oButton; + m_oButtons[oButton.get("id")] = oButton; + + + if (sButtonName != sGroupName) { + + oButton.set("name", sGroupName); + + } + + + if (this.get("disabled")) { + + oButton.set("disabled", true); + + } + + + if (oButton.get("checked")) { + + this.set("checkedButton", oButton); + + } + + + oButtonElement = oButton.get("element"); + oGroupElement = this.get("element"); + + if (oButtonElement.parentNode != oGroupElement) { + + oGroupElement.appendChild(oButtonElement); + + } + + + oButton.on("checkedChange", + this._onButtonCheckedChange, oButton, this); + + + } + + return oButton; + + }, + + + /** + * @method addButtons + * @description Adds the array of buttons to the button group. + * @param {Array} p_aButtons Array of + * YAHOO.widget.Button instances to be added + * to the button group. + * @param {Array} p_aButtons Array of strings specifying the id + * attribute of the <input> or <span> + * elements to be used to create the buttons to be added to the + * button group. + * @param {Array} p_aButtons Array of object references for the + * <input> or <span> elements + * to be used to create the buttons to be added to the button group. + * @param {Array} p_aButtons Array of object literals, each containing + * a set of YAHOO.widget.Button + * configuration attributes used to configure each button to be added + * to the button group. + * @return {Array} + */ + addButtons: function (p_aButtons) { + + var nButtons, + oButton, + aButtons, + i; + + if (Lang.isArray(p_aButtons)) { + + nButtons = p_aButtons.length; + aButtons = []; + + if (nButtons > 0) { + + for (i = 0; i < nButtons; i++) { + + oButton = this.addButton(p_aButtons[i]); + + if (oButton) { + + aButtons[aButtons.length] = oButton; + + } + + } + + } + + } + + return aButtons; + + }, + + + /** + * @method removeButton + * @description Removes the button at the specified index from the + * button group. + * @param {Number} p_nIndex Number specifying the index of the button + * to be removed from the button group. + */ + removeButton: function (p_nIndex) { + + var oButton = this.getButton(p_nIndex), + nButtons, + i; + + if (oButton) { + + + this._buttons.splice(p_nIndex, 1); + delete m_oButtons[oButton.get("id")]; + + oButton.removeListener("checkedChange", + this._onButtonCheckedChange); + + oButton.destroy(); + + + nButtons = this._buttons.length; + + if (nButtons > 0) { + + i = this._buttons.length - 1; + + do { + + this._buttons[i].index = i; + + } + while (i--); + + } + + + } + + }, + + + /** + * @method getButton + * @description Returns the button at the specified index. + * @param {Number} p_nIndex The index of the button to retrieve from the + * button group. + * @return {YAHOO.widget.Button} + */ + getButton: function (p_nIndex) { + + return this._buttons[p_nIndex]; + + }, + + + /** + * @method getButtons + * @description Returns an array of the buttons in the button group. + * @return {Array} + */ + getButtons: function () { + + return this._buttons; + + }, + + + /** + * @method getCount + * @description Returns the number of buttons in the button group. + * @return {Number} + */ + getCount: function () { + + return this._buttons.length; + + }, + + + /** + * @method focus + * @description Sets focus to the button at the specified index. + * @param {Number} p_nIndex Number indicating the index of the button + * to focus. + */ + focus: function (p_nIndex) { + + var oButton, + nButtons, + i; + + if (Lang.isNumber(p_nIndex)) { + + oButton = this._buttons[p_nIndex]; + + if (oButton) { + + oButton.focus(); + + } + + } + else { + + nButtons = this.getCount(); + + for (i = 0; i < nButtons; i++) { + + oButton = this._buttons[i]; + + if (!oButton.get("disabled")) { + + oButton.focus(); + break; + + } + + } + + } + + }, + + + /** + * @method check + * @description Checks the button at the specified index. + * @param {Number} p_nIndex Number indicating the index of the button + * to check. + */ + check: function (p_nIndex) { + + var oButton = this.getButton(p_nIndex); + + if (oButton) { + + oButton.set("checked", true); + + } + + }, + + + /** + * @method destroy + * @description Removes the button group's element from its parent + * element and removes all event handlers. + */ + destroy: function () { + + + var nButtons = this._buttons.length, + oElement = this.get("element"), + oParentNode = oElement.parentNode, + i; + + if (nButtons > 0) { + + i = this._buttons.length - 1; + + do { + + this._buttons[i].destroy(); + + } + while (i--); + + } + + + Event.purgeElement(oElement); + + + oParentNode.removeChild(oElement); + + }, + + + /** + * @method toString + * @description Returns a string representing the button group. + * @return {String} + */ + toString: function () { + + return ("ButtonGroup " + this.get("id")); + + } + + }); + +})(); +YAHOO.register("button", YAHOO.widget.Button, {version: "2.6.0", build: "1321"}); diff --git a/webdir/javascript/yui/calendar/README b/webdir/javascript/yui/calendar/README new file mode 100644 index 0000000..da90268 --- /dev/null +++ b/webdir/javascript/yui/calendar/README @@ -0,0 +1,421 @@ +Calendar Release Notes + +*** version 2.6.0 *** + ++ Fixed incorrect cell index parsing from cell id attribute, when + Calendar id contained "cell". + ++ Added text to previous month, next month and close icons, to + enhance accessibility for screen-readers. + ++ Fixed issue with bubbled previous month, next month click events + missing target information in certain browsers (due to replaced HTML), + by delaying click event handling through a setTimeout. + ++ Added destroy method to Calendar/CalendarGroup + ++ Fixed incorrect clear method behavior for CalendarGroup where all + pages would be set to the same month. + ++ Refactored code to reduce minified Kweight. + +*** version 2.5.2 *** + ++ CalendarGroup toDate method no longer throws javascript exception + +*** version 2.5.1 *** + ++ Fixed bug with mindate, maxdate being applied incorrectly if + set to a day on which time change took place (DST, E.U Summertime) + and the day is not the first day of the week. + ++ Fixed DateMath.getWeekNumber implementation to return correct + week numbers. The older implementation would return Week 0 for + certain weeks (e.g. the week starting Sun Dec 28th 2008) + + To suppor the fix, DateMath.getWeekNumber has a signature + change in 2.5.1 and can now support U.S Week calculations based + on Jan 1st identifying the first week of the year, as well as + ISO8601 week calculations based on Jan 4th identifying the first + week of the year + + The arguments which the method expected prior to 2.5.1 were not + being used in calculating the week number. The new signature is: + + DateMath.getWeekNumber(Date dt, Number firstDayOfWeek, Number janDate) + + Where: + + dt is the date for which week number is required + + firstDayOfWeek is the day index identifying the first + day of the week. Default is 0 (Sunday). + + janDate is the date in the first week of January, which + identifies the first week of the year. + Default is YAHOO.widget.DateMath.WEEK_ONE_JAN_DATE (1) + + NOTE: Calendar instances themselves do not currently expose a + configuration property to change the week numbering system + used. A "janDate" value is not passed to the getWeekNumber + method, when used by Calendar, resulting in it using the default value. + + Therefore, ISO8601 week numbering can be generated for Calendars + by setting the value of YAHOO.widget.DateMath.WEEK_ONE_JAN_DATE + to 4. + +*** version 2.5.0 *** + ++ Prevent default event handling in CalendarNavigator enter key + listener, to prevent automatic form submission when using Calendar + inside a form. + ++ Added workaround to DateMath.add and subtract for Safari 2 (webkit) + bug in Date.setDate(n) which doesn't handle value of n less than -128 + or greater than 127 correctly. + + See: http://brianary.blogspot.com/2006/03/safari-date-bug.html + ++ Added border, padding and margin rules to Calendar Sam Skin to + protect Sam Skin's look and feel when Calendar is used with + YUI base.css + +*** version 2.4.0 *** + ++ Added CalendarNavigator (year selector) feature to allow the user to + jump to a year/month directly without having to scroll through months + sequentially. + + The feature is enabled/configured using the "navigator" configuration + property. + ++ Added Custom Events: + + showNav/beforeShowNav + hideNav/beforeHideNav, + renderNav/beforeRenderNav + + To Calendar/CalendarGroup, in support of the CalendarNavigator + functionality. + ++ Added Custom Events: + + show/beforeShow + hide/beforeHide + + To Calendar and CalendarGroup. Returning false from a + beforeShow/beforeHide listener can be used to prevent the Calendar + from being shown/hidden respectively. + ++ Added Public Methods: + + getCellIndex(date) [ Calendar ] + getCalendarPage(date) [ CalendarGroup ] + toDate(dateArray) [ Calendar/CalendarGroup ] + removeRenderers() [ Calendar/CalendarGroup ] + ++ The Calendar/CalendarGroup constructor is now more flexible: + + * It no longer requires an "id" argument. + + In it's simplest form, a Calendar/CalendarGroup can be + constructed by simply providing a container id or reference. + + var cal = new YAHOO.widget.Calendar("container"); + -or- + var containerDiv = YAHOO.util.Dom.get("container"); + var cal = new YAHOO.widget.Calendar(containerDiv); + + An id for the Calendar does not need to be provided, and will be + generated from the container id by appending an "_t" suffix to the + container id if only the container is provided. + + * The container argument can be either a string, representing the + id of the container, or an HTMLElement referring to the container + element itself, as suggested in the example above. + + * If an HTMLElement is provided for the container argument and the + element does not have an id, one will be generated for it using + YAHOO.util.Dom.generateId(). + + * The older form of Calendar/CalendarGroup signature, expecting + both an id and containerId is still supported and works as it did + prior to 2.4.0. + ++ Fixed performance issue, where the same custom renderer was being + applied multiple times to the same cell. + ++ Added getDate(year, month, date) factory method to the DateMath utility, + which can be used to create JavaScript Date instances for years less + than 100. + + The default Date(year, month, date) constructor implementations across + browsers, assume that if year < 100, the caller is referring to the + nineteen hundreds, and the year is set to 19xx instead of xx (as with + the deprecated setYear method). However Date.setFullYear(xx) can + be used to set dates below 100. The above factory method provides a + construction mechanism consistent with setFullYear. + ++ Changed Calendar/CalendarGroup/DateMath code to use the DateMath.getDate + method, so that 2 digit years are not assumed to be in the 1900's. + + NOTE: Calendar's API already expects 4 digit date strings when referring + to years after 999. + +*** version 2.3.1 *** + ++ Changed Calendar/CalendarGroup to render an empty title bar element + when "close" is set to true, but "title" has not been set, to allow Sam + Skin to render a title bar correctly. + +*** version 2.3.0 *** + ++ Added checks to select, selectCell, deselect and deselectCell methods + to ensure the Calendar/Calendar group was not set to an invalid state + by programmatically selecting unselectable dates or cells. + ++ Added new locale configuration properties for the Month/Year label + used in the Calendar header (MY_LABEL_MONTH_POSITION, + MY_LABEL_YEAR_POSITION, MY_LABEL_YEAR_SUFFIX, MY_LABEL_MONTH_SUFFIX). + Japan is an example locale, where customization of the Month/Year + label is required. + ++ Changed "first", "last" class names to "first-of-type", "last-of-type", + to avoid collision with YUI Grids' use of the "first" class name. + ++ Added public isDateOOB method, to check if a given date is outside of + the minimum/maximum configuration dates of the Calendar. + ++ Deprecated YAHOO.widget.Calendar.browser, refactored to use + YAHOO.env.ua instead. + ++ Removed overflow:hidden from default Calendar/CalendarGroup container + for non-IE6 browsers to fix clipping issue with IE7 when CalendarGroup + was inside a box with a specific width. overflow:hidden is still + required for IE6 with an iframe shim. + ++ Added Opera container width calculation fix to CalendarGroup.show + method, to fix incorrect wrapping when using a CalendarGroup which is + initially rendered hidden (display:none). Previously this fix was + only applied on render. + +*** version 2.2.2 *** + ++ Fixed problem with selected dates being shared across instances, when + more than one Calendar/CalendarGroup was on the page + +*** version 2.2.1 *** + ++ Fixed problem with selectCell adding duplicate selected date entries + for dates which were already selected + ++ Fixed problem with CalendarGroup iframe shim not covering the + CalendarGroup title area + ++ Removed javascript:void(null) from close button and cell links which + was interrupting form submission and firing onbeforeunload in IE + ++ Fixed problem with CalendarGroup getSelectedDates returning invalid + results, when used in conjunction with the "selected" Config property + (either passed in the constructor config argument or set seperately + after construction) + ++ Refactored Calendar and CalendarGroup to improve performance, + especially when working with a large number of instances in + IE6 + +*** version 2.2.0 *** + ++ Image customization can now be done through CSS. Images for Close, + Left and Right Arrows are now pulled in using CSS defined in + calendar.css and by default use relative paths to the images in + the same directory as calendar.css. + ++ Deprecated Calendar.IMG_ROOT and NAV_ARROW_LEFT, NAV_ARROW_RIGHT + configuration properties. Customizations based on older releases + which set these properties will still function as expected. + ++ Deprecated CalendarGroup.CSS_2UPCLOSE. Calendar's Style.CSS_CLOSE + property now represents the new default CSS class (calclose) for + the close button. CSS_2UPCLOSE is still applied along with + CSS_CLOSE to the new markup for the close button to support existing + customizations of the CSS_2UPCLOSE CSS class (close-icon) + ++ Fixed problem with Safari setting Calendar pages to incorrect dates + if the pages spanned a year boundary in CalendarGroups with 3 or more + pages, due to a bug in Safari's implementation of Date setMonth + ++ Fixed problem with CalendarGroup setMonth rendering Calendar pages + with incorrect dates in all browsers if current pages spanned year + boundary + ++ Fixed incorrect CalendarGroup logging statement in calendar-debug.js + ++ Fixed domEventMap support for Safari versions prior to 2.0.2, + caused by hasOwnProperty not being supported + ++ Removed unused private property : _pageDate from Calendar class + +*** version 0.12.2 *** + ++ Corrected documentation for clearTime function to reflect the + change from midnight to noon + +*** version 0.12.1 *** + ++ Calendar and CalendarGroup now automatically parse the argument + passed to setMonth and setYear into an integer, eliminating + potential concatenation bugs. + +*** version 0.12 *** + ++ New documentation format implemented + ++ Calendar2up and Calendar_Core are now deprecated. Now, Calendar alone + represents the single Calendar instance, and CalendarGroup represents + an n-up instance, defaulting to 2up + ++ Added semantic style classes to Calendar elements to allow for + custom styling solely using CSS. + ++ Remapped all configuration properties to use the Config object + (familiar to those who use the Container collection of controls). + Property names are the same as their previous counterparts, but + wrapped into Calendar.cfg, allowing for runtime reconfiguration of + most properties + ++ Added "title" property for setting the Calendar title + ++ Added "close" property for enabling and disabling the close icon + ++ Added "iframe" property for enabling an iframe shim in Internet + Explorer 6 and below to fix the select bleed-through bug + ++ pageDate moved to property: "pagedate" + ++ selectedDates moved to property: "selected" + ++ minDate moved to property : "mindate", which accepts a JavaScript + Date object like its predecessor, but also supports string dates + ++ maxDate moved to property : "maxdate", which accepts a JavaScript + Date object like its predecessor, but also supports string dates + ++ Moved style declarations to initStyles function + ++ Optimized event handling in doSelectCell/doCellMouseOver/ + doCellMouseOut by only attaching the listener to the outer + Calendar container, and only reacting to events on cells with + the "selectable" CSS class. + ++ Added domEventMap field for applying DOM event listeners to cells + containing specific class and tag combinations. + ++ Moved all cell DOM event attachment to applyListeners function + ++ Added getDateByCellId / getDateFieldsByCellId helper functions + ++ Corrected DateMath.getWeekNumber to comply with ISO week number + handling + ++ Separated renderCellDefault style portions into styleCellDefault + function for easy extension + ++ Deprecated onBeforeSelect. Created beforeSelectEvent which + automatically subscribes to its deprecated predecessor. + ++ Deprecated onSelect. Created selectEvent, which automatically + subscribes to its deprecated predecessor. + ++ Deprecated onBeforeDeselect. Created beforeSelectEvent which + automatically subscribes to its deprecated predecessor. + ++ Deprecated onDeselect. Created beforeDeselectEvent, which + automatically subscribes to its deprecated predecessor. + ++ Deprecated onChangePage. Created changePageEvent, which automatically + subscribes to its deprecated predecessor. + ++ Deprecated onRender. Created renderEvent, which automatically + subscribes to its deprecated predecessor. + ++ Deprecated onReset. Created resetEvent, which automatically + subscribes to its deprecated predecessor. + ++ Deprecated onClear. Created clearEvent, which automatically + subscribes to its deprecated predecessor. + ++ Corrected setMonth documentation to refer to 0-11 indexed months. + ++ Added show and hide methods to Calendar for setting the Calendar's + display property. + ++ Optimized internal render classes to use innerHTML and string buffers + ++ Removed wireCustomEvents function + ++ Removed wireDefaultEvents function + ++ Removed doNextMonth / doPreviousMonth + ++ Removed all buildShell (header, body, footer) functions, since + the Calendar shell is now built dynamically on each render + ++ Wired all CalendarGroup events and configuration properties to + be properly delegated to Calendar + ++ Augmented CalendarGroup with all built-in renderers, label functions, + hide, show, and initStyles, creating API transparency between Calendar + and CalendarGroup. + ++ Made all tagName, createElement, and entity references XHTML compliant + ++ Fixed Daylight Saving Time bug for Brazilian time zone + +*** version 0.11.3 *** + ++ Calendar_Core: Added arguments for selected/deselected dates to + onSelect/onDeselect + ++ CalendarGroup: Fixed bug where selected dates passed to constructor + were not represented in selectedDates + ++ Calendar2up: Now displays correctly in Opera 9 + +*** version 0.11.0 *** + ++ DateMath: DateMath.add now properly adds weeks + ++ DateMath: between() function added + ++ DateMath: getWeekNumber() fixed to take starting day of week into + account + ++ All references to Calendar's built in CSS class handlers are + removed, replaced with calls to Dom utility (addClass, removeClass) + ++ Several CSS class constants now have clearer names + ++ All CSS classes are now properly namespaced to avoid CSS conflicts + ++ Fixed table:hover bug in CSS + ++ Calendar no longer requires the container ID and variable name to + match in order for month navigation to function properly + ++ Calendar month navigation arrows are now represented as + background images + +*** version 0.10.0 *** + ++ Major performance improvements from attaching DOM events to + associated table cells only once, when the Calendar shell is built + ++ DOM events for mouseover/mouseout are now fired for all browsers + (not just Internet Explorer) + ++ Reset functionality bug fixed for 2-up Calendar view + +*** version 0.9.0 *** + +* Initial release \ No newline at end of file diff --git a/webdir/javascript/yui/calendar/assets/calendar-core.css b/webdir/javascript/yui/calendar/assets/calendar-core.css new file mode 100644 index 0000000..2fb51e4 --- /dev/null +++ b/webdir/javascript/yui/calendar/assets/calendar-core.css @@ -0,0 +1,132 @@ +/* +Copyright (c) 2008, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.6.0 +*/ +/** + * CORE + * + * This is the set of CSS rules required by Calendar to drive core functionality and structure. + * Changes to these rules may result in the Calendar not functioning or rendering correctly. + * + * They should not be modified for skinning. + **/ + +/* CALENDAR BOUNDING BOX */ +.yui-calcontainer { + position:relative; + float:left; + _overflow:hidden; /* IE6 only, to clip iframe shim */ +} + +/* IFRAME SHIM */ +.yui-calcontainer iframe { + position:absolute; + border:none; + margin:0;padding:0; + z-index:0; + width:100%; + height:100%; + left:0px; + top:0px; +} + +/* IFRAME SHIM IE6 only */ +.yui-calcontainer iframe.fixedsize { + width:50em; + height:50em; + top:-1px; + left:-1px; +} + +/* BOUNDING BOX FOR EACH CALENDAR GROUP PAGE */ +.yui-calcontainer.multi .groupcal { + z-index:1; + float:left; + position:relative; +} + +/* TITLE BAR */ +.yui-calcontainer .title { + position:relative; + z-index:1; +} + +/* CLOSE ICON CONTAINER */ +.yui-calcontainer .close-icon { + position:absolute; + z-index:1; + text-indent:-10000em; + overflow:hidden; +} + +/* CALENDAR TABLE */ +.yui-calendar { + position:relative; +} + +/* NAVBAR LEFT ARROW CONTAINER */ +.yui-calendar .calnavleft { + position:absolute; + z-index:1; + text-indent:-10000em; + overflow:hidden; +} + +/* NAVBAR RIGHT ARROW CONTAINER */ +.yui-calendar .calnavright { + position:absolute; + z-index:1; + text-indent:-10000em; + overflow:hidden; +} + +/* NAVBAR TEXT CONTAINER */ +.yui-calendar .calheader { + position:relative; + width:100%; + text-align:center; +} + +/* CalendarNavigator */ +.yui-calcontainer .yui-cal-nav-mask { + position:absolute; + z-index:2; + margin:0; + padding:0; + width:100%; + height:100%; + _width:0; /* IE6, IE7 quirks - width/height set programmatically to match container */ + _height:0; + left:0; + top:0; + display:none; +} + +/* NAVIGATOR BOUNDING BOX */ +.yui-calcontainer .yui-cal-nav { + position:absolute; + z-index:3; + top:0; + display:none; +} + +/* NAVIGATOR BUTTONS (based on button-core.css) */ +.yui-calcontainer .yui-cal-nav .yui-cal-nav-btn { + display: -moz-inline-box; /* Gecko */ + display: inline-block; /* IE, Opera and Safari */ +} + +.yui-calcontainer .yui-cal-nav .yui-cal-nav-btn button { + display: block; + *display: inline-block; /* IE */ + *overflow: visible; /* Remove superfluous padding for IE */ + border: none; + background-color: transparent; + cursor: pointer; +} + +/* Specific changes for calendar running under fonts/reset */ +.yui-calendar .calbody a:hover {background:inherit;} +p#clear {clear:left; padding-top:10px;} \ No newline at end of file diff --git a/webdir/javascript/yui/calendar/assets/calendar.css b/webdir/javascript/yui/calendar/assets/calendar.css new file mode 100644 index 0000000..f01446f --- /dev/null +++ b/webdir/javascript/yui/calendar/assets/calendar.css @@ -0,0 +1,320 @@ +/* +Copyright (c) 2008, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.6.0 +*/ +.yui-calcontainer { + position:relative; + padding:5px; + background-color:#F7F9FB; + border:1px solid #7B9EBD; + float:left; + _overflow:hidden; /* IE6 only, to clip iframe shim */ +} + +.yui-calcontainer iframe { + position:absolute; + border:none; + margin:0;padding:0; + z-index:0; + width:100%; + height:100%; + left:0px; + top:0px; +} + +/* IE6 only */ +.yui-calcontainer iframe.fixedsize { + width:50em; + height:50em; + top:-1px; + left:-1px; +} + +.yui-calcontainer.multi { + padding:0; +} + +.yui-calcontainer.multi .groupcal { + padding:5px; + background-color:transparent; + z-index:1; + float:left; + position:relative; + border:none; +} + +.yui-calcontainer .title { + font:100% sans-serif; + color:#000; + font-weight:bold; + margin-bottom:5px; + height:25px; + position:absolute; + top:3px;left:5px; + z-index:1; +} + +.yui-calcontainer .close-icon { + position:absolute; + overflow:hidden; + text-indent:-10000em; + right:3px; + top:3px; + border:none; + z-index:1; +} + +.yui-calcontainer .calclose { + background: url("calx.gif") no-repeat; + width:17px; + height:13px; + cursor:pointer; +} + +/* Calendar element styles */ + +.yui-calendar { + font:100% sans-serif; + text-align:center; + border-spacing:0; + border-collapse:separate; + position:relative; +} + +.yui-calcontainer.withtitle { + padding-top:1.5em; +} + +.yui-calendar .calnavleft { + position:absolute; + overflow:hidden; + text-indent:-10000em; + cursor:pointer; + top:2px; + bottom:0; + width:9px; + height:12px; + left:2px; + z-index:1; + background: url("callt.gif") no-repeat; +} + +.yui-calendar .calnavright { + position:absolute; + overflow:hidden; + text-indent:-10000em; + cursor:pointer; + top:2px; + bottom:0; + width:9px; + height:12px; + right:2px; + z-index:1; + background: url("calrt.gif") no-repeat; +} + +.yui-calendar td.calcell { + padding:.1em .2em; + border:1px solid #E0E0E0; + text-align:center; +} + +.yui-calendar td.calcell a { + color:#003DB8; + text-decoration:none; +} + +.yui-calendar td.calcell.today { + border:1px solid #000; +} + +.yui-calendar td.calcell.oom { + cursor:default; + color:#999; + background-color:#EEE; + border:1px solid #E0E0E0; +} + +.yui-calendar td.calcell.selected { + color:#003DB8; + background-color:#FFF19F; + border:1px solid #FF9900; +} + +.yui-calendar td.calcell.calcellhover { + cursor:pointer; + color:#FFF; + background-color:#FF9900; + border:1px solid #FF9900; +} + +.yui-calendar td.calcell.calcellhover a { + color:#FFF; +} + +.yui-calendar td.calcell.restricted { + text-decoration:line-through; +} + +.yui-calendar td.calcell.previous { + color:#CCC; +} + +.yui-calendar td.calcell.highlight1 { background-color:#CCFF99; } +.yui-calendar td.calcell.highlight2 { background-color:#99CCFF; } +.yui-calendar td.calcell.highlight3 { background-color:#FFCCCC; } +.yui-calendar td.calcell.highlight4 { background-color:#CCFF99; } + +.yui-calendar .calhead { + border:1px solid #E0E0E0; + vertical-align:middle; + background-color:#FFF; +} + +.yui-calendar .calheader { + position:relative; + width:100%; + text-align:center; +} + +.yui-calendar .calheader img { + border:none; +} + +.yui-calendar .calweekdaycell { + color:#666; + font-weight:normal; + text-align:center; + width:1.5em; +} + +.yui-calendar .calfoot { + background-color:#EEE; +} + +.yui-calendar .calrowhead, .yui-calendar .calrowfoot { + color:#666; + font-size:9px; + font-style:italic; + font-weight:normal; + width:15px; +} + +.yui-calendar .calrowhead { + border-right-width:2px; +} + +/* CalendarNavigator */ +.yui-calendar a.calnav { + _position:relative; + padding-left:2px; + padding-right:2px; + text-decoration:none; + color:#000; +} + +.yui-calendar a.calnav:hover { + border:1px solid #003366; + background-color:#6699cc; + background: url(calgrad.png) repeat-x; + color:#fff; + cursor:pointer; +} + +.yui-calcontainer .yui-cal-nav-mask { + position:absolute; + z-index:2; + display:none; + + margin:0; + padding:0; + + left:0; + top:0; + width:100%; + height:100%; + _width:0; /* IE6, IE7 Quirks - width/height set programmatically to match container */ + _height:0; + + background-color:#000; + opacity:0.25; + *filter:alpha(opacity=25); +} + +.yui-calcontainer .yui-cal-nav { + position:absolute; + z-index:3; + display:none; + + padding:0; + top:1.5em; + left:50%; + width:12em; + margin-left:-6em; + + border:1px solid #7B9EBD; + background-color:#F7F9FB; + font-size:93%; +} + +.yui-calcontainer.withtitle .yui-cal-nav { + top:3.5em; +} + +.yui-calcontainer .yui-cal-nav-y, +.yui-calcontainer .yui-cal-nav-m, +.yui-calcontainer .yui-cal-nav-b { + padding:2px 5px 2px 5px; +} + +.yui-calcontainer .yui-cal-nav-b { + text-align:center; +} + +.yui-calcontainer .yui-cal-nav-e { + margin-top:2px; + padding:2px; + background-color:#EDF5FF; + border-top:1px solid black; + display:none; +} + +.yui-calcontainer .yui-cal-nav label { + display:block; + font-weight:bold; +} + +.yui-calcontainer .yui-cal-nav-mc { + width:100%; + _width:auto; /* IE6 doesn't like width 100% */ +} + +.yui-calcontainer .yui-cal-nav-y input.yui-invalid { + background-color:#FFEE69; + border: 1px solid #000; +} + +.yui-calcontainer .yui-cal-nav-yc { + width:3em; +} + +.yui-calcontainer .yui-cal-nav-b button { + font-size:93%; + text-decoration:none; + cursor: pointer; + background-color: #79b2ea; + border: 1px solid #003366; + border-top-color:#FFF; + border-left-color:#FFF; + margin:1px; +} + +.yui-calcontainer .yui-cal-nav-b .yui-default button { + /* not implemented */ +} + +/* Specific changes for calendar running under fonts/reset */ +.yui-calendar .calbody a:hover {background:inherit;} +p#clear {clear:left; padding-top:10px;} diff --git a/webdir/javascript/yui/calendar/assets/calgrad.png b/webdir/javascript/yui/calendar/assets/calgrad.png new file mode 100644 index 0000000..9be3d95 Binary files /dev/null and b/webdir/javascript/yui/calendar/assets/calgrad.png differ diff --git a/webdir/javascript/yui/calendar/assets/callt.gif b/webdir/javascript/yui/calendar/assets/callt.gif new file mode 100644 index 0000000..a6cc8da Binary files /dev/null and b/webdir/javascript/yui/calendar/assets/callt.gif differ diff --git a/webdir/javascript/yui/calendar/assets/calrt.gif b/webdir/javascript/yui/calendar/assets/calrt.gif new file mode 100644 index 0000000..ee137b2 Binary files /dev/null and b/webdir/javascript/yui/calendar/assets/calrt.gif differ diff --git a/webdir/javascript/yui/calendar/assets/calx.gif b/webdir/javascript/yui/calendar/assets/calx.gif new file mode 100644 index 0000000..27e7bc3 Binary files /dev/null and b/webdir/javascript/yui/calendar/assets/calx.gif differ diff --git a/webdir/javascript/yui/calendar/assets/skins/sam/calendar-skin.css b/webdir/javascript/yui/calendar/assets/skins/sam/calendar-skin.css new file mode 100644 index 0000000..d498919 --- /dev/null +++ b/webdir/javascript/yui/calendar/assets/skins/sam/calendar-skin.css @@ -0,0 +1,361 @@ +/* +Copyright (c) 2008, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.6.0 +*/ +/** + * SAM + * + * Skin colors used: + * + * - Control Border : 808080 + * - Control Chrome : f2f2f2 + * - Cell Borders : cccccc + * - Normal Cell BG : ffffff + * - Date Links : 0066cc + * - Selected Cells BG : b3d4ff + * - Cell Hover BG : 426fd9 + * - Disabled BG : cccccc + * - Disabled Text Color : a6a6a6 + **/ + +/* CALENDAR BOUNDING BOX */ +.yui-skin-sam .yui-calcontainer { + background-color:#f2f2f2; + border:1px solid #808080; + padding:10px; +} + +/* CALENDARGROUP BOUNDING BOX */ +.yui-skin-sam .yui-calcontainer.multi { + padding:0 5px 0 5px; +} + +/* BOUNDING BOX FOR EACH CALENDAR GROUP PAGE */ +.yui-skin-sam .yui-calcontainer.multi .groupcal { + background-color:transparent; + border:none; + padding:10px 5px 10px 5px; + margin:0; +} + +/* TITLE BAR */ +.yui-skin-sam .yui-calcontainer .title { + background:url(../../../../assets/skins/sam/sprite.png) repeat-x 0 0; + border-bottom:1px solid #cccccc; + font:100% sans-serif; + color:#000; + font-weight:bold; + height:auto; + padding:.4em; + margin:0 -10px 10px -10px; + top:0; + left:0; + text-align:left; +} + +.yui-skin-sam .yui-calcontainer.multi .title { + margin:0 -5px 0 -5px; +} + +.yui-skin-sam .yui-calcontainer.withtitle { + padding-top:0; +} + +/* CLOSE BUTTON */ +.yui-skin-sam .yui-calcontainer .calclose { + background:url(../../../../assets/skins/sam/sprite.png) no-repeat 0 -300px; + width:25px; + height:15px; + top:.4em; + right:.4em; + cursor:pointer; +} + +/* CALENDAR TABLE */ +.yui-skin-sam .yui-calendar { + border-spacing:0; + border-collapse:collapse; + font:100% sans-serif; + text-align:center; + margin:0; +} + +/* NAVBAR BOUNDING BOX */ +.yui-skin-sam .yui-calendar .calhead { + background:transparent; + border:none; + vertical-align:middle; + padding:0; +} + +/* NAVBAR TEXT CONTAINER */ +.yui-skin-sam .yui-calendar .calheader { + background:transparent; + font-weight:bold; + padding:0 0 .6em 0; + text-align:center; +} + +.yui-skin-sam .yui-calendar .calheader img { + border:none; +} + +/* NAVBAR LEFT ARROW */ +.yui-skin-sam .yui-calendar .calnavleft { + background:url(../../../../assets/skins/sam/sprite.png) no-repeat 0 -450px; + width:25px; + height:15px; + top:0; + bottom:0; + left:-10px; + margin-left:.4em; + cursor:pointer; +} + +/* NAVBAR RIGHT ARROW */ +.yui-skin-sam .yui-calendar .calnavright { + background:url(../../../../assets/skins/sam/sprite.png) no-repeat 0 -500px; + width:25px; + height:15px; + top:0; + bottom:0; + right:-10px; + margin-right:.4em; + cursor:pointer; +} + +/* WEEKDAY HEADER ROW */ +.yui-skin-sam .yui-calendar .calweekdayrow { + height:2em; +} + +.yui-skin-sam .yui-calendar .calweekdayrow th { + padding:0; + border:none; +} + +/* WEEKDAY (Su, Mo, Tu...) HEADER CELLS */ +.yui-skin-sam .yui-calendar .calweekdaycell { + color:#000; + font-weight:bold; + text-align:center; + width:2em; +} + +/* CALENDAR FOOTER. NOT IMPLEMENTED BY DEFAULT */ +.yui-skin-sam .yui-calendar .calfoot { + background-color:#f2f2f2; +} + +/* WEEK NUMBERS (ROW HEADERS/FOOTERS) */ +.yui-skin-sam .yui-calendar .calrowhead, .yui-skin-sam .yui-calendar .calrowfoot { + color:#a6a6a6; + font-size:85%; + font-style:normal; + font-weight:normal; + border:none; +} + +.yui-skin-sam .yui-calendar .calrowhead { + text-align:right; + padding:0 2px 0 0; +} + +.yui-skin-sam .yui-calendar .calrowfoot { + text-align:left; + padding:0 0 0 2px; +} + +/* NORMAL CELLS */ +.yui-skin-sam .yui-calendar td.calcell { + border:1px solid #cccccc; + background:#fff; + padding:1px; + height:1.6em; + line-height:1.6em; /* set line height equal to cell height to center vertically */ + text-align:center; + white-space:nowrap; +} + +/* LINK INSIDE NORMAL CELLS */ +.yui-skin-sam .yui-calendar td.calcell a { + color:#0066cc; + display:block; + height:100%; + text-decoration:none; +} + +/* TODAY'S DATE */ +.yui-skin-sam .yui-calendar td.calcell.today { + background-color:#000; +} + +.yui-skin-sam .yui-calendar td.calcell.today a { + background-color:#fff; +} + +/* OOM DATES */ +.yui-skin-sam .yui-calendar td.calcell.oom { + background-color:#cccccc; + color:#a6a6a6; + cursor:default; +} + +/* SELECTED DATE */ +.yui-skin-sam .yui-calendar td.calcell.selected { + background-color:#fff; + color:#000; +} + +.yui-skin-sam .yui-calendar td.calcell.selected a { + background-color:#b3d4ff; + color:#000; +} + +/* HOVER DATE */ +.yui-skin-sam .yui-calendar td.calcell.calcellhover { + background-color:#426fd9; + color:#fff; + cursor:pointer; +} + +.yui-skin-sam .yui-calendar td.calcell.calcellhover a { + background-color:#426fd9; + color:#fff; +} + +/* DEFAULT OOB DATES */ +.yui-skin-sam .yui-calendar td.calcell.previous { + color:#e0e0e0; +} + +/* CUSTOM RENDERERS */ +.yui-skin-sam .yui-calendar td.calcell.restricted { text-decoration:line-through; } +.yui-skin-sam .yui-calendar td.calcell.highlight1 { background-color:#ccff99; } +.yui-skin-sam .yui-calendar td.calcell.highlight2 { background-color:#99ccff; } +.yui-skin-sam .yui-calendar td.calcell.highlight3 { background-color:#ffcccc; } +.yui-skin-sam .yui-calendar td.calcell.highlight4 { background-color:#ccff99; } + +/* CalendarNavigator */ + +/* MONTH/YEAR LABEL */ +.yui-skin-sam .yui-calendar a.calnav { + border: 1px solid #f2f2f2; + padding:0 4px; + text-decoration:none; + color:#000; + zoom:1; +} + +.yui-skin-sam .yui-calendar a.calnav:hover { + background: url(../../../../assets/skins/sam/sprite.png) repeat-x 0 0; + border-color:#A0A0A0; + cursor:pointer; +} + +/* NAVIGATOR MASK */ +.yui-skin-sam .yui-calcontainer .yui-cal-nav-mask { + background-color:#000; + opacity:0.25; + *filter:alpha(opacity=25); /* IE */ +} + +/* NAVIGATOR BOUNDING BOX */ +.yui-skin-sam .yui-calcontainer .yui-cal-nav { + font-family:arial,helvetica,clean,sans-serif; + font-size:93%; + border:1px solid #808080; + left:50%; + margin-left:-7em; + width:14em; + padding:0; + top:2.5em; + background-color:#f2f2f2; +} + +.yui-skin-sam .yui-calcontainer.withtitle .yui-cal-nav { + top:4.5em; +} + +/* NAVIGATOR BOUNDING BOX */ +.yui-skin-sam .yui-calcontainer.multi .yui-cal-nav { + width:16em; + margin-left:-8em; +} + +/* NAVIGATOR YEAR/MONTH/BUTTON/ERROR BOUNDING BLOCKS */ +.yui-skin-sam .yui-calcontainer .yui-cal-nav-y, +.yui-skin-sam .yui-calcontainer .yui-cal-nav-m, +.yui-skin-sam .yui-calcontainer .yui-cal-nav-b { + padding:5px 10px 5px 10px; +} + +.yui-skin-sam .yui-calcontainer .yui-cal-nav-b { + text-align:center; +} + +.yui-skin-sam .yui-calcontainer .yui-cal-nav-e { + margin-top:5px; + padding:5px; + background-color:#EDF5FF; + border-top:1px solid black; + display:none; +} + +/* NAVIGATOR LABELS */ +.yui-skin-sam .yui-calcontainer .yui-cal-nav label { + display:block; + font-weight:bold; +} + +/* NAVIGATOR MONTH CONTROL */ +.yui-skin-sam .yui-calcontainer .yui-cal-nav-mc { + width:100%; + _width:auto; /* IE6, IE7 Quirks don't handle 100% well */ +} + +/* NAVIGATOR MONTH CONTROL, VALIDATION ERROR */ +.yui-skin-sam .yui-calcontainer .yui-cal-nav-y input.yui-invalid { + background-color:#FFEE69; + border: 1px solid #000; +} + +/* NAVIGATOR YEAR CONTROL */ +.yui-skin-sam .yui-calcontainer .yui-cal-nav-yc { + width:4em; +} + +/* NAVIGATOR BUTTONS */ + +/* BUTTON WRAPPER */ +.yui-skin-sam .yui-calcontainer .yui-cal-nav .yui-cal-nav-btn { + border:1px solid #808080; + background: url(../../../../assets/skins/sam/sprite.png) repeat-x 0 0; + background-color:#ccc; + margin: auto .15em; +} + +/* BUTTON (based on button-skin.css) */ +.yui-skin-sam .yui-calcontainer .yui-cal-nav .yui-cal-nav-btn button { + padding:0 8px; + font-size:93%; + line-height: 2; /* ~24px */ + *line-height: 1.7; /* For IE */ + min-height: 2em; /* For Gecko */ + *min-height: auto; /* For IE */ + color: #000; +} + +/* DEFAULT BUTTONS */ +/* NOTE: IE6 will only pickup the yui-default specifier from the multiple class specifier */ +.yui-skin-sam .yui-calcontainer .yui-cal-nav .yui-cal-nav-btn.yui-default { + border:1px solid #304369; + background-color: #426fd9; + background: url(../../../../assets/skins/sam/sprite.png) repeat-x 0 -1400px; +} + +.yui-skin-sam .yui-calcontainer .yui-cal-nav .yui-cal-nav-btn.yui-default button { + color:#fff; +} diff --git a/webdir/javascript/yui/calendar/assets/skins/sam/calendar.css b/webdir/javascript/yui/calendar/assets/skins/sam/calendar.css new file mode 100644 index 0000000..8da25a4 --- /dev/null +++ b/webdir/javascript/yui/calendar/assets/skins/sam/calendar.css @@ -0,0 +1,7 @@ +/* +Copyright (c) 2008, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.6.0 +*/ +.yui-calcontainer{position:relative;float:left;_overflow:hidden;}.yui-calcontainer iframe{position:absolute;border:none;margin:0;padding:0;z-index:0;width:100%;height:100%;left:0px;top:0px;}.yui-calcontainer iframe.fixedsize{width:50em;height:50em;top:-1px;left:-1px;}.yui-calcontainer.multi .groupcal{z-index:1;float:left;position:relative;}.yui-calcontainer .title{position:relative;z-index:1;}.yui-calcontainer .close-icon{position:absolute;z-index:1;text-indent:-10000em;overflow:hidden;}.yui-calendar{position:relative;}.yui-calendar .calnavleft{position:absolute;z-index:1;text-indent:-10000em;overflow:hidden;}.yui-calendar .calnavright{position:absolute;z-index:1;text-indent:-10000em;overflow:hidden;}.yui-calendar .calheader{position:relative;width:100%;text-align:center;}.yui-calcontainer .yui-cal-nav-mask{position:absolute;z-index:2;margin:0;padding:0;width:100%;height:100%;_width:0;_height:0;left:0;top:0;display:none;}.yui-calcontainer .yui-cal-nav{position:absolute;z-index:3;top:0;display:none;}.yui-calcontainer .yui-cal-nav .yui-cal-nav-btn{display:-moz-inline-box;display:inline-block;}.yui-calcontainer .yui-cal-nav .yui-cal-nav-btn button{display:block;*display:inline-block;*overflow:visible;border:none;background-color:transparent;cursor:pointer;}.yui-calendar .calbody a:hover{background:inherit;}p#clear{clear:left;padding-top:10px;}.yui-skin-sam .yui-calcontainer{background-color:#f2f2f2;border:1px solid #808080;padding:10px;}.yui-skin-sam .yui-calcontainer.multi{padding:0 5px 0 5px;}.yui-skin-sam .yui-calcontainer.multi .groupcal{background-color:transparent;border:none;padding:10px 5px 10px 5px;margin:0;}.yui-skin-sam .yui-calcontainer .title{background:url(../../../../assets/skins/sam/sprite.png) repeat-x 0 0;border-bottom:1px solid #cccccc;font:100% sans-serif;color:#000;font-weight:bold;height:auto;padding:.4em;margin:0 -10px 10px -10px;top:0;left:0;text-align:left;}.yui-skin-sam .yui-calcontainer.multi .title{margin:0 -5px 0 -5px;}.yui-skin-sam .yui-calcontainer.withtitle{padding-top:0;}.yui-skin-sam .yui-calcontainer .calclose{background:url(../../../../assets/skins/sam/sprite.png) no-repeat 0 -300px;width:25px;height:15px;top:.4em;right:.4em;cursor:pointer;}.yui-skin-sam .yui-calendar{border-spacing:0;border-collapse:collapse;font:100% sans-serif;text-align:center;margin:0;}.yui-skin-sam .yui-calendar .calhead{background:transparent;border:none;vertical-align:middle;padding:0;}.yui-skin-sam .yui-calendar .calheader{background:transparent;font-weight:bold;padding:0 0 .6em 0;text-align:center;}.yui-skin-sam .yui-calendar .calheader img{border:none;}.yui-skin-sam .yui-calendar .calnavleft{background:url(../../../../assets/skins/sam/sprite.png) no-repeat 0 -450px;width:25px;height:15px;top:0;bottom:0;left:-10px;margin-left:.4em;cursor:pointer;}.yui-skin-sam .yui-calendar .calnavright{background:url(../../../../assets/skins/sam/sprite.png) no-repeat 0 -500px;width:25px;height:15px;top:0;bottom:0;right:-10px;margin-right:.4em;cursor:pointer;}.yui-skin-sam .yui-calendar .calweekdayrow{height:2em;}.yui-skin-sam .yui-calendar .calweekdayrow th{padding:0;border:none;}.yui-skin-sam .yui-calendar .calweekdaycell{color:#000;font-weight:bold;text-align:center;width:2em;}.yui-skin-sam .yui-calendar .calfoot{background-color:#f2f2f2;}.yui-skin-sam .yui-calendar .calrowhead,.yui-skin-sam .yui-calendar .calrowfoot{color:#a6a6a6;font-size:85%;font-style:normal;font-weight:normal;border:none;}.yui-skin-sam .yui-calendar .calrowhead{text-align:right;padding:0 2px 0 0;}.yui-skin-sam .yui-calendar .calrowfoot{text-align:left;padding:0 0 0 2px;}.yui-skin-sam .yui-calendar td.calcell{border:1px solid #cccccc;background:#fff;padding:1px;height:1.6em;line-height:1.6em;text-align:center;white-space:nowrap;}.yui-skin-sam .yui-calendar td.calcell a{color:#0066cc;display:block;height:100%;text-decoration:none;}.yui-skin-sam .yui-calendar td.calcell.today{background-color:#000;}.yui-skin-sam .yui-calendar td.calcell.today a{background-color:#fff;}.yui-skin-sam .yui-calendar td.calcell.oom{background-color:#cccccc;color:#a6a6a6;cursor:default;}.yui-skin-sam .yui-calendar td.calcell.selected{background-color:#fff;color:#000;}.yui-skin-sam .yui-calendar td.calcell.selected a{background-color:#b3d4ff;color:#000;}.yui-skin-sam .yui-calendar td.calcell.calcellhover{background-color:#426fd9;color:#fff;cursor:pointer;}.yui-skin-sam .yui-calendar td.calcell.calcellhover a{background-color:#426fd9;color:#fff;}.yui-skin-sam .yui-calendar td.calcell.previous{color:#e0e0e0;}.yui-skin-sam .yui-calendar td.calcell.restricted{text-decoration:line-through;}.yui-skin-sam .yui-calendar td.calcell.highlight1{background-color:#ccff99;}.yui-skin-sam .yui-calendar td.calcell.highlight2{background-color:#99ccff;}.yui-skin-sam .yui-calendar td.calcell.highlight3{background-color:#ffcccc;}.yui-skin-sam .yui-calendar td.calcell.highlight4{background-color:#ccff99;}.yui-skin-sam .yui-calendar a.calnav{border:1px solid #f2f2f2;padding:0 4px;text-decoration:none;color:#000;zoom:1;}.yui-skin-sam .yui-calendar a.calnav:hover{background:url(../../../../assets/skins/sam/sprite.png) repeat-x 0 0;border-color:#A0A0A0;cursor:pointer;}.yui-skin-sam .yui-calcontainer .yui-cal-nav-mask{background-color:#000;opacity:0.25;*filter:alpha(opacity=25);}.yui-skin-sam .yui-calcontainer .yui-cal-nav{font-family:arial,helvetica,clean,sans-serif;font-size:93%;border:1px solid #808080;left:50%;margin-left:-7em;width:14em;padding:0;top:2.5em;background-color:#f2f2f2;}.yui-skin-sam .yui-calcontainer.withtitle .yui-cal-nav{top:4.5em;}.yui-skin-sam .yui-calcontainer.multi .yui-cal-nav{width:16em;margin-left:-8em;}.yui-skin-sam .yui-calcontainer .yui-cal-nav-y,.yui-skin-sam .yui-calcontainer .yui-cal-nav-m,.yui-skin-sam .yui-calcontainer .yui-cal-nav-b{padding:5px 10px 5px 10px;}.yui-skin-sam .yui-calcontainer .yui-cal-nav-b{text-align:center;}.yui-skin-sam .yui-calcontainer .yui-cal-nav-e{margin-top:5px;padding:5px;background-color:#EDF5FF;border-top:1px solid black;display:none;}.yui-skin-sam .yui-calcontainer .yui-cal-nav label{display:block;font-weight:bold;}.yui-skin-sam .yui-calcontainer .yui-cal-nav-mc{width:100%;_width:auto;}.yui-skin-sam .yui-calcontainer .yui-cal-nav-y input.yui-invalid{background-color:#FFEE69;border:1px solid #000;}.yui-skin-sam .yui-calcontainer .yui-cal-nav-yc{width:4em;}.yui-skin-sam .yui-calcontainer .yui-cal-nav .yui-cal-nav-btn{border:1px solid #808080;background:url(../../../../assets/skins/sam/sprite.png) repeat-x 0 0;background-color:#ccc;margin:auto .15em;}.yui-skin-sam .yui-calcontainer .yui-cal-nav .yui-cal-nav-btn button{padding:0 8px;font-size:93%;line-height:2;*line-height:1.7;min-height:2em;*min-height:auto;color:#000;}.yui-skin-sam .yui-calcontainer .yui-cal-nav .yui-cal-nav-btn.yui-default{border:1px solid #304369;background-color:#426fd9;background:url(../../../../assets/skins/sam/sprite.png) repeat-x 0 -1400px;}.yui-skin-sam .yui-calcontainer .yui-cal-nav .yui-cal-nav-btn.yui-default button{color:#fff;} diff --git a/webdir/javascript/yui/calendar/calendar-debug.js b/webdir/javascript/yui/calendar/calendar-debug.js new file mode 100644 index 0000000..689843c --- /dev/null +++ b/webdir/javascript/yui/calendar/calendar-debug.js @@ -0,0 +1,7168 @@ +/* +Copyright (c) 2008, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.6.0 +*/ +(function () { + + /** + * Config is a utility used within an Object to allow the implementer to + * maintain a list of local configuration properties and listen for changes + * to those properties dynamically using CustomEvent. The initial values are + * also maintained so that the configuration can be reset at any given point + * to its initial state. + * @namespace YAHOO.util + * @class Config + * @constructor + * @param {Object} owner The owner Object to which this Config Object belongs + */ + YAHOO.util.Config = function (owner) { + + if (owner) { + this.init(owner); + } + + if (!owner) { YAHOO.log("No owner specified for Config object", "error", "Config"); } + + }; + + + var Lang = YAHOO.lang, + CustomEvent = YAHOO.util.CustomEvent, + Config = YAHOO.util.Config; + + + /** + * Constant representing the CustomEvent type for the config changed event. + * @property YAHOO.util.Config.CONFIG_CHANGED_EVENT + * @private + * @static + * @final + */ + Config.CONFIG_CHANGED_EVENT = "configChanged"; + + /** + * Constant representing the boolean type string + * @property YAHOO.util.Config.BOOLEAN_TYPE + * @private + * @static + * @final + */ + Config.BOOLEAN_TYPE = "boolean"; + + Config.prototype = { + + /** + * Object reference to the owner of this Config Object + * @property owner + * @type Object + */ + owner: null, + + /** + * Boolean flag that specifies whether a queue is currently + * being executed + * @property queueInProgress + * @type Boolean + */ + queueInProgress: false, + + /** + * Maintains the local collection of configuration property objects and + * their specified values + * @property config + * @private + * @type Object + */ + config: null, + + /** + * Maintains the local collection of configuration property objects as + * they were initially applied. + * This object is used when resetting a property. + * @property initialConfig + * @private + * @type Object + */ + initialConfig: null, + + /** + * Maintains the local, normalized CustomEvent queue + * @property eventQueue + * @private + * @type Object + */ + eventQueue: null, + + /** + * Custom Event, notifying subscribers when Config properties are set + * (setProperty is called without the silent flag + * @event configChangedEvent + */ + configChangedEvent: null, + + /** + * Initializes the configuration Object and all of its local members. + * @method init + * @param {Object} owner The owner Object to which this Config + * Object belongs + */ + init: function (owner) { + + this.owner = owner; + + this.configChangedEvent = + this.createEvent(Config.CONFIG_CHANGED_EVENT); + + this.configChangedEvent.signature = CustomEvent.LIST; + this.queueInProgress = false; + this.config = {}; + this.initialConfig = {}; + this.eventQueue = []; + + }, + + /** + * Validates that the value passed in is a Boolean. + * @method checkBoolean + * @param {Object} val The value to validate + * @return {Boolean} true, if the value is valid + */ + checkBoolean: function (val) { + return (typeof val == Config.BOOLEAN_TYPE); + }, + + /** + * Validates that the value passed in is a number. + * @method checkNumber + * @param {Object} val The value to validate + * @return {Boolean} true, if the value is valid + */ + checkNumber: function (val) { + return (!isNaN(val)); + }, + + /** + * Fires a configuration property event using the specified value. + * @method fireEvent + * @private + * @param {String} key The configuration property's name + * @param {value} Object The value of the correct type for the property + */ + fireEvent: function ( key, value ) { + YAHOO.log("Firing Config event: " + key + "=" + value, "info", "Config"); + var property = this.config[key]; + + if (property && property.event) { + property.event.fire(value); + } + }, + + /** + * Adds a property to the Config Object's private config hash. + * @method addProperty + * @param {String} key The configuration property's name + * @param {Object} propertyObject The Object containing all of this + * property's arguments + */ + addProperty: function ( key, propertyObject ) { + key = key.toLowerCase(); + YAHOO.log("Added property: " + key, "info", "Config"); + + this.config[key] = propertyObject; + + propertyObject.event = this.createEvent(key, { scope: this.owner }); + propertyObject.event.signature = CustomEvent.LIST; + + + propertyObject.key = key; + + if (propertyObject.handler) { + propertyObject.event.subscribe(propertyObject.handler, + this.owner); + } + + this.setProperty(key, propertyObject.value, true); + + if (! propertyObject.suppressEvent) { + this.queueProperty(key, propertyObject.value); + } + + }, + + /** + * Returns a key-value configuration map of the values currently set in + * the Config Object. + * @method getConfig + * @return {Object} The current config, represented in a key-value map + */ + getConfig: function () { + + var cfg = {}, + currCfg = this.config, + prop, + property; + + for (prop in currCfg) { + if (Lang.hasOwnProperty(currCfg, prop)) { + property = currCfg[prop]; + if (property && property.event) { + cfg[prop] = property.value; + } + } + } + + return cfg; + }, + + /** + * Returns the value of specified property. + * @method getProperty + * @param {String} key The name of the property + * @return {Object} The value of the specified property + */ + getProperty: function (key) { + var property = this.config[key.toLowerCase()]; + if (property && property.event) { + return property.value; + } else { + return undefined; + } + }, + + /** + * Resets the specified property's value to its initial value. + * @method resetProperty + * @param {String} key The name of the property + * @return {Boolean} True is the property was reset, false if not + */ + resetProperty: function (key) { + + key = key.toLowerCase(); + + var property = this.config[key]; + + if (property && property.event) { + + if (this.initialConfig[key] && + !Lang.isUndefined(this.initialConfig[key])) { + + this.setProperty(key, this.initialConfig[key]); + + return true; + + } + + } else { + + return false; + } + + }, + + /** + * Sets the value of a property. If the silent property is passed as + * true, the property's event will not be fired. + * @method setProperty + * @param {String} key The name of the property + * @param {String} value The value to set the property to + * @param {Boolean} silent Whether the value should be set silently, + * without firing the property event. + * @return {Boolean} True, if the set was successful, false if it failed. + */ + setProperty: function (key, value, silent) { + + var property; + + key = key.toLowerCase(); + YAHOO.log("setProperty: " + key + "=" + value, "info", "Config"); + + if (this.queueInProgress && ! silent) { + // Currently running through a queue... + this.queueProperty(key,value); + return true; + + } else { + property = this.config[key]; + if (property && property.event) { + if (property.validator && !property.validator(value)) { + return false; + } else { + property.value = value; + if (! silent) { + this.fireEvent(key, value); + this.configChangedEvent.fire([key, value]); + } + return true; + } + } else { + return false; + } + } + }, + + /** + * Sets the value of a property and queues its event to execute. If the + * event is already scheduled to execute, it is + * moved from its current position to the end of the queue. + * @method queueProperty + * @param {String} key The name of the property + * @param {String} value The value to set the property to + * @return {Boolean} true, if the set was successful, false if + * it failed. + */ + queueProperty: function (key, value) { + + key = key.toLowerCase(); + YAHOO.log("queueProperty: " + key + "=" + value, "info", "Config"); + + var property = this.config[key], + foundDuplicate = false, + iLen, + queueItem, + queueItemKey, + queueItemValue, + sLen, + supercedesCheck, + qLen, + queueItemCheck, + queueItemCheckKey, + queueItemCheckValue, + i, + s, + q; + + if (property && property.event) { + + if (!Lang.isUndefined(value) && property.validator && + !property.validator(value)) { // validator + return false; + } else { + + if (!Lang.isUndefined(value)) { + property.value = value; + } else { + value = property.value; + } + + foundDuplicate = false; + iLen = this.eventQueue.length; + + for (i = 0; i < iLen; i++) { + queueItem = this.eventQueue[i]; + + if (queueItem) { + queueItemKey = queueItem[0]; + queueItemValue = queueItem[1]; + + if (queueItemKey == key) { + + /* + found a dupe... push to end of queue, null + current item, and break + */ + + this.eventQueue[i] = null; + + this.eventQueue.push( + [key, (!Lang.isUndefined(value) ? + value : queueItemValue)]); + + foundDuplicate = true; + break; + } + } + } + + // this is a refire, or a new property in the queue + + if (! foundDuplicate && !Lang.isUndefined(value)) { + this.eventQueue.push([key, value]); + } + } + + if (property.supercedes) { + + sLen = property.supercedes.length; + + for (s = 0; s < sLen; s++) { + + supercedesCheck = property.supercedes[s]; + qLen = this.eventQueue.length; + + for (q = 0; q < qLen; q++) { + queueItemCheck = this.eventQueue[q]; + + if (queueItemCheck) { + queueItemCheckKey = queueItemCheck[0]; + queueItemCheckValue = queueItemCheck[1]; + + if (queueItemCheckKey == + supercedesCheck.toLowerCase() ) { + + this.eventQueue.push([queueItemCheckKey, + queueItemCheckValue]); + + this.eventQueue[q] = null; + break; + + } + } + } + } + } + + YAHOO.log("Config event queue: " + this.outputEventQueue(), "info", "Config"); + + return true; + } else { + return false; + } + }, + + /** + * Fires the event for a property using the property's current value. + * @method refireEvent + * @param {String} key The name of the property + */ + refireEvent: function (key) { + + key = key.toLowerCase(); + + var property = this.config[key]; + + if (property && property.event && + + !Lang.isUndefined(property.value)) { + + if (this.queueInProgress) { + + this.queueProperty(key); + + } else { + + this.fireEvent(key, property.value); + + } + + } + }, + + /** + * Applies a key-value Object literal to the configuration, replacing + * any existing values, and queueing the property events. + * Although the values will be set, fireQueue() must be called for their + * associated events to execute. + * @method applyConfig + * @param {Object} userConfig The configuration Object literal + * @param {Boolean} init When set to true, the initialConfig will + * be set to the userConfig passed in, so that calling a reset will + * reset the properties to the passed values. + */ + applyConfig: function (userConfig, init) { + + var sKey, + oConfig; + + if (init) { + oConfig = {}; + for (sKey in userConfig) { + if (Lang.hasOwnProperty(userConfig, sKey)) { + oConfig[sKey.toLowerCase()] = userConfig[sKey]; + } + } + this.initialConfig = oConfig; + } + + for (sKey in userConfig) { + if (Lang.hasOwnProperty(userConfig, sKey)) { + this.queueProperty(sKey, userConfig[sKey]); + } + } + }, + + /** + * Refires the events for all configuration properties using their + * current values. + * @method refresh + */ + refresh: function () { + + var prop; + + for (prop in this.config) { + if (Lang.hasOwnProperty(this.config, prop)) { + this.refireEvent(prop); + } + } + }, + + /** + * Fires the normalized list of queued property change events + * @method fireQueue + */ + fireQueue: function () { + + var i, + queueItem, + key, + value, + property; + + this.queueInProgress = true; + for (i = 0;i < this.eventQueue.length; i++) { + queueItem = this.eventQueue[i]; + if (queueItem) { + + key = queueItem[0]; + value = queueItem[1]; + property = this.config[key]; + + property.value = value; + + this.fireEvent(key,value); + } + } + + this.queueInProgress = false; + this.eventQueue = []; + }, + + /** + * Subscribes an external handler to the change event for any + * given property. + * @method subscribeToConfigEvent + * @param {String} key The property name + * @param {Function} handler The handler function to use subscribe to + * the property's event + * @param {Object} obj The Object to use for scoping the event handler + * (see CustomEvent documentation) + * @param {Boolean} override Optional. If true, will override "this" + * within the handler to map to the scope Object passed into the method. + * @return {Boolean} True, if the subscription was successful, + * otherwise false. + */ + subscribeToConfigEvent: function (key, handler, obj, override) { + + var property = this.config[key.toLowerCase()]; + + if (property && property.event) { + if (!Config.alreadySubscribed(property.event, handler, obj)) { + property.event.subscribe(handler, obj, override); + } + return true; + } else { + return false; + } + + }, + + /** + * Unsubscribes an external handler from the change event for any + * given property. + * @method unsubscribeFromConfigEvent + * @param {String} key The property name + * @param {Function} handler The handler function to use subscribe to + * the property's event + * @param {Object} obj The Object to use for scoping the event + * handler (see CustomEvent documentation) + * @return {Boolean} True, if the unsubscription was successful, + * otherwise false. + */ + unsubscribeFromConfigEvent: function (key, handler, obj) { + var property = this.config[key.toLowerCase()]; + if (property && property.event) { + return property.event.unsubscribe(handler, obj); + } else { + return false; + } + }, + + /** + * Returns a string representation of the Config object + * @method toString + * @return {String} The Config object in string format. + */ + toString: function () { + var output = "Config"; + if (this.owner) { + output += " [" + this.owner.toString() + "]"; + } + return output; + }, + + /** + * Returns a string representation of the Config object's current + * CustomEvent queue + * @method outputEventQueue + * @return {String} The string list of CustomEvents currently queued + * for execution + */ + outputEventQueue: function () { + + var output = "", + queueItem, + q, + nQueue = this.eventQueue.length; + + for (q = 0; q < nQueue; q++) { + queueItem = this.eventQueue[q]; + if (queueItem) { + output += queueItem[0] + "=" + queueItem[1] + ", "; + } + } + return output; + }, + + /** + * Sets all properties to null, unsubscribes all listeners from each + * property's change event and all listeners from the configChangedEvent. + * @method destroy + */ + destroy: function () { + + var oConfig = this.config, + sProperty, + oProperty; + + + for (sProperty in oConfig) { + + if (Lang.hasOwnProperty(oConfig, sProperty)) { + + oProperty = oConfig[sProperty]; + + oProperty.event.unsubscribeAll(); + oProperty.event = null; + + } + + } + + this.configChangedEvent.unsubscribeAll(); + + this.configChangedEvent = null; + this.owner = null; + this.config = null; + this.initialConfig = null; + this.eventQueue = null; + + } + + }; + + + + /** + * Checks to determine if a particular function/Object pair are already + * subscribed to the specified CustomEvent + * @method YAHOO.util.Config.alreadySubscribed + * @static + * @param {YAHOO.util.CustomEvent} evt The CustomEvent for which to check + * the subscriptions + * @param {Function} fn The function to look for in the subscribers list + * @param {Object} obj The execution scope Object for the subscription + * @return {Boolean} true, if the function/Object pair is already subscribed + * to the CustomEvent passed in + */ + Config.alreadySubscribed = function (evt, fn, obj) { + + var nSubscribers = evt.subscribers.length, + subsc, + i; + + if (nSubscribers > 0) { + i = nSubscribers - 1; + do { + subsc = evt.subscribers[i]; + if (subsc && subsc.obj == obj && subsc.fn == fn) { + return true; + } + } + while (i--); + } + + return false; + + }; + + YAHOO.lang.augmentProto(Config, YAHOO.util.EventProvider); + +}()); + +/** +* YAHOO.widget.DateMath is used for simple date manipulation. The class is a static utility +* used for adding, subtracting, and comparing dates. +* @namespace YAHOO.widget +* @class DateMath +*/ +YAHOO.widget.DateMath = { + /** + * Constant field representing Day + * @property DAY + * @static + * @final + * @type String + */ + DAY : "D", + + /** + * Constant field representing Week + * @property WEEK + * @static + * @final + * @type String + */ + WEEK : "W", + + /** + * Constant field representing Year + * @property YEAR + * @static + * @final + * @type String + */ + YEAR : "Y", + + /** + * Constant field representing Month + * @property MONTH + * @static + * @final + * @type String + */ + MONTH : "M", + + /** + * Constant field representing one day, in milliseconds + * @property ONE_DAY_MS + * @static + * @final + * @type Number + */ + ONE_DAY_MS : 1000*60*60*24, + + /** + * Constant field representing the date in first week of January + * which identifies the first week of the year. + *

    + * In the U.S, Jan 1st is normally used based on a Sunday start of week. + * ISO 8601, used widely throughout Europe, uses Jan 4th, based on a Monday start of week. + *

    + * @property WEEK_ONE_JAN_DATE + * @static + * @type Number + */ + WEEK_ONE_JAN_DATE : 1, + + /** + * Adds the specified amount of time to the this instance. + * @method add + * @param {Date} date The JavaScript Date object to perform addition on + * @param {String} field The field constant to be used for performing addition. + * @param {Number} amount The number of units (measured in the field constant) to add to the date. + * @return {Date} The resulting Date object + */ + add : function(date, field, amount) { + var d = new Date(date.getTime()); + switch (field) { + case this.MONTH: + var newMonth = date.getMonth() + amount; + var years = 0; + + if (newMonth < 0) { + while (newMonth < 0) { + newMonth += 12; + years -= 1; + } + } else if (newMonth > 11) { + while (newMonth > 11) { + newMonth -= 12; + years += 1; + } + } + + d.setMonth(newMonth); + d.setFullYear(date.getFullYear() + years); + break; + case this.DAY: + this._addDays(d, amount); + // d.setDate(date.getDate() + amount); + break; + case this.YEAR: + d.setFullYear(date.getFullYear() + amount); + break; + case this.WEEK: + this._addDays(d, (amount * 7)); + // d.setDate(date.getDate() + (amount * 7)); + break; + } + return d; + }, + + /** + * Private helper method to account for bug in Safari 2 (webkit < 420) + * when Date.setDate(n) is called with n less than -128 or greater than 127. + *

    + * Fix approach and original findings are available here: + * http://brianary.blogspot.com/2006/03/safari-date-bug.html + *

    + * @method _addDays + * @param {Date} d JavaScript date object + * @param {Number} nDays The number of days to add to the date object (can be negative) + * @private + */ + _addDays : function(d, nDays) { + if (YAHOO.env.ua.webkit && YAHOO.env.ua.webkit < 420) { + if (nDays < 0) { + // Ensure we don't go below -128 (getDate() is always 1 to 31, so we won't go above 127) + for(var min = -128; nDays < min; nDays -= min) { + d.setDate(d.getDate() + min); + } + } else { + // Ensure we don't go above 96 + 31 = 127 + for(var max = 96; nDays > max; nDays -= max) { + d.setDate(d.getDate() + max); + } + } + // nDays should be remainder between -128 and 96 + } + d.setDate(d.getDate() + nDays); + }, + + /** + * Subtracts the specified amount of time from the this instance. + * @method subtract + * @param {Date} date The JavaScript Date object to perform subtraction on + * @param {Number} field The this field constant to be used for performing subtraction. + * @param {Number} amount The number of units (measured in the field constant) to subtract from the date. + * @return {Date} The resulting Date object + */ + subtract : function(date, field, amount) { + return this.add(date, field, (amount*-1)); + }, + + /** + * Determines whether a given date is before another date on the calendar. + * @method before + * @param {Date} date The Date object to compare with the compare argument + * @param {Date} compareTo The Date object to use for the comparison + * @return {Boolean} true if the date occurs before the compared date; false if not. + */ + before : function(date, compareTo) { + var ms = compareTo.getTime(); + if (date.getTime() < ms) { + return true; + } else { + return false; + } + }, + + /** + * Determines whether a given date is after another date on the calendar. + * @method after + * @param {Date} date The Date object to compare with the compare argument + * @param {Date} compareTo The Date object to use for the comparison + * @return {Boolean} true if the date occurs after the compared date; false if not. + */ + after : function(date, compareTo) { + var ms = compareTo.getTime(); + if (date.getTime() > ms) { + return true; + } else { + return false; + } + }, + + /** + * Determines whether a given date is between two other dates on the calendar. + * @method between + * @param {Date} date The date to check for + * @param {Date} dateBegin The start of the range + * @param {Date} dateEnd The end of the range + * @return {Boolean} true if the date occurs between the compared dates; false if not. + */ + between : function(date, dateBegin, dateEnd) { + if (this.after(date, dateBegin) && this.before(date, dateEnd)) { + return true; + } else { + return false; + } + }, + + /** + * Retrieves a JavaScript Date object representing January 1 of any given year. + * @method getJan1 + * @param {Number} calendarYear The calendar year for which to retrieve January 1 + * @return {Date} January 1 of the calendar year specified. + */ + getJan1 : function(calendarYear) { + return this.getDate(calendarYear,0,1); + }, + + /** + * Calculates the number of days the specified date is from January 1 of the specified calendar year. + * Passing January 1 to this function would return an offset value of zero. + * @method getDayOffset + * @param {Date} date The JavaScript date for which to find the offset + * @param {Number} calendarYear The calendar year to use for determining the offset + * @return {Number} The number of days since January 1 of the given year + */ + getDayOffset : function(date, calendarYear) { + var beginYear = this.getJan1(calendarYear); // Find the start of the year. This will be in week 1. + + // Find the number of days the passed in date is away from the calendar year start + var dayOffset = Math.ceil((date.getTime()-beginYear.getTime()) / this.ONE_DAY_MS); + return dayOffset; + }, + + /** + * Calculates the week number for the given date. Can currently support standard + * U.S. week numbers, based on Jan 1st defining the 1st week of the year, and + * ISO8601 week numbers, based on Jan 4th defining the 1st week of the year. + * + * @method getWeekNumber + * @param {Date} date The JavaScript date for which to find the week number + * @param {Number} firstDayOfWeek The index of the first day of the week (0 = Sun, 1 = Mon ... 6 = Sat). + * Defaults to 0 + * @param {Number} janDate The date in the first week of January which defines week one for the year + * Defaults to the value of YAHOO.widget.DateMath.WEEK_ONE_JAN_DATE, which is 1 (Jan 1st). + * For the U.S, this is normally Jan 1st. ISO8601 uses Jan 4th to define the first week of the year. + * + * @return {Number} The number of the week containing the given date. + */ + getWeekNumber : function(date, firstDayOfWeek, janDate) { + + // Setup Defaults + firstDayOfWeek = firstDayOfWeek || 0; + janDate = janDate || this.WEEK_ONE_JAN_DATE; + + var targetDate = this.clearTime(date), + startOfWeek, + endOfWeek; + + if (targetDate.getDay() === firstDayOfWeek) { + startOfWeek = targetDate; + } else { + startOfWeek = this.getFirstDayOfWeek(targetDate, firstDayOfWeek); + } + + var startYear = startOfWeek.getFullYear(), + startTime = startOfWeek.getTime(); + + // DST shouldn't be a problem here, math is quicker than setDate(); + endOfWeek = new Date(startOfWeek.getTime() + 6*this.ONE_DAY_MS); + + var weekNum; + if (startYear !== endOfWeek.getFullYear() && endOfWeek.getDate() >= janDate) { + // If years don't match, endOfWeek is in Jan. and if the + // week has WEEK_ONE_JAN_DATE in it, it's week one by definition. + weekNum = 1; + } else { + // Get the 1st day of the 1st week, and + // find how many days away we are from it. + var weekOne = this.clearTime(this.getDate(startYear, 0, janDate)), + weekOneDayOne = this.getFirstDayOfWeek(weekOne, firstDayOfWeek); + + // Round days to smoothen out 1 hr DST diff + var daysDiff = Math.round((targetDate.getTime() - weekOneDayOne.getTime())/this.ONE_DAY_MS); + + // Calc. Full Weeks + var rem = daysDiff % 7; + var weeksDiff = (daysDiff - rem)/7; + weekNum = weeksDiff + 1; + } + return weekNum; + }, + + /** + * Get the first day of the week, for the give date. + * @param {Date} dt The date in the week for which the first day is required. + * @param {Number} startOfWeek The index for the first day of the week, 0 = Sun, 1 = Mon ... 6 = Sat (defaults to 0) + * @return {Date} The first day of the week + */ + getFirstDayOfWeek : function (dt, startOfWeek) { + startOfWeek = startOfWeek || 0; + var dayOfWeekIndex = dt.getDay(), + dayOfWeek = (dayOfWeekIndex - startOfWeek + 7) % 7; + + return this.subtract(dt, this.DAY, dayOfWeek); + }, + + /** + * Determines if a given week overlaps two different years. + * @method isYearOverlapWeek + * @param {Date} weekBeginDate The JavaScript Date representing the first day of the week. + * @return {Boolean} true if the date overlaps two different years. + */ + isYearOverlapWeek : function(weekBeginDate) { + var overlaps = false; + var nextWeek = this.add(weekBeginDate, this.DAY, 6); + if (nextWeek.getFullYear() != weekBeginDate.getFullYear()) { + overlaps = true; + } + return overlaps; + }, + + /** + * Determines if a given week overlaps two different months. + * @method isMonthOverlapWeek + * @param {Date} weekBeginDate The JavaScript Date representing the first day of the week. + * @return {Boolean} true if the date overlaps two different months. + */ + isMonthOverlapWeek : function(weekBeginDate) { + var overlaps = false; + var nextWeek = this.add(weekBeginDate, this.DAY, 6); + if (nextWeek.getMonth() != weekBeginDate.getMonth()) { + overlaps = true; + } + return overlaps; + }, + + /** + * Gets the first day of a month containing a given date. + * @method findMonthStart + * @param {Date} date The JavaScript Date used to calculate the month start + * @return {Date} The JavaScript Date representing the first day of the month + */ + findMonthStart : function(date) { + var start = this.getDate(date.getFullYear(), date.getMonth(), 1); + return start; + }, + + /** + * Gets the last day of a month containing a given date. + * @method findMonthEnd + * @param {Date} date The JavaScript Date used to calculate the month end + * @return {Date} The JavaScript Date representing the last day of the month + */ + findMonthEnd : function(date) { + var start = this.findMonthStart(date); + var nextMonth = this.add(start, this.MONTH, 1); + var end = this.subtract(nextMonth, this.DAY, 1); + return end; + }, + + /** + * Clears the time fields from a given date, effectively setting the time to 12 noon. + * @method clearTime + * @param {Date} date The JavaScript Date for which the time fields will be cleared + * @return {Date} The JavaScript Date cleared of all time fields + */ + clearTime : function(date) { + date.setHours(12,0,0,0); + return date; + }, + + /** + * Returns a new JavaScript Date object, representing the given year, month and date. Time fields (hr, min, sec, ms) on the new Date object + * are set to 0. The method allows Date instances to be created with the a year less than 100. "new Date(year, month, date)" implementations + * set the year to 19xx if a year (xx) which is less than 100 is provided. + *

    + * NOTE:Validation on argument values is not performed. It is the caller's responsibility to ensure + * arguments are valid as per the ECMAScript-262 Date object specification for the new Date(year, month[, date]) constructor. + *

    + * @method getDate + * @param {Number} y Year. + * @param {Number} m Month index from 0 (Jan) to 11 (Dec). + * @param {Number} d (optional) Date from 1 to 31. If not provided, defaults to 1. + * @return {Date} The JavaScript date object with year, month, date set as provided. + */ + getDate : function(y, m, d) { + var dt = null; + if (YAHOO.lang.isUndefined(d)) { + d = 1; + } + if (y >= 100) { + dt = new Date(y, m, d); + } else { + dt = new Date(); + dt.setFullYear(y); + dt.setMonth(m); + dt.setDate(d); + dt.setHours(0,0,0,0); + } + return dt; + } +}; + +/** +* The Calendar component is a UI control that enables users to choose one or more dates from a graphical calendar presented in a one-month or +* multi-month interface. Calendars are generated entirely via script and can be navigated without any page refreshes. +* @module calendar +* @title Calendar +* @namespace YAHOO.widget +* @requires yahoo,dom,event +*/ +(function(){ + + var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event, + Lang = YAHOO.lang, + DateMath = YAHOO.widget.DateMath; + +/** +* Calendar is the base class for the Calendar widget. In its most basic +* implementation, it has the ability to render a calendar widget on the page +* that can be manipulated to select a single date, move back and forth between +* months and years. +*

    To construct the placeholder for the calendar widget, the code is as +* follows: +*

    +* <div id="calContainer"></div> +* +*

    +*

    +* NOTE: As of 2.4.0, the constructor's ID argument is optional. +* The Calendar can be constructed by simply providing a container ID string, +* or a reference to a container DIV HTMLElement (the element needs to exist +* in the document). +* +* E.g.: +*

    +* var c = new YAHOO.widget.Calendar("calContainer", configOptions); +* +* or: +* +* var containerDiv = YAHOO.util.Dom.get("calContainer"); +* var c = new YAHOO.widget.Calendar(containerDiv, configOptions); +* +*

    +*

    +* If not provided, the ID will be generated from the container DIV ID by adding an "_t" suffix. +* For example if an ID is not provided, and the container's ID is "calContainer", the Calendar's ID will be set to "calContainer_t". +*

    +* +* @namespace YAHOO.widget +* @class Calendar +* @constructor +* @param {String} id optional The id of the table element that will represent the Calendar widget. As of 2.4.0, this argument is optional. +* @param {String | HTMLElement} container The id of the container div element that will wrap the Calendar table, or a reference to a DIV element which exists in the document. +* @param {Object} config optional The configuration object containing the initial configuration values for the Calendar. +*/ +function Calendar(id, containerId, config) { + this.init.apply(this, arguments); +} + +/** +* The path to be used for images loaded for the Calendar +* @property YAHOO.widget.Calendar.IMG_ROOT +* @static +* @deprecated You can now customize images by overriding the calclose, calnavleft and calnavright default CSS classes for the close icon, left arrow and right arrow respectively +* @type String +*/ +Calendar.IMG_ROOT = null; + +/** +* Type constant used for renderers to represent an individual date (M/D/Y) +* @property YAHOO.widget.Calendar.DATE +* @static +* @final +* @type String +*/ +Calendar.DATE = "D"; + +/** +* Type constant used for renderers to represent an individual date across any year (M/D) +* @property YAHOO.widget.Calendar.MONTH_DAY +* @static +* @final +* @type String +*/ +Calendar.MONTH_DAY = "MD"; + +/** +* Type constant used for renderers to represent a weekday +* @property YAHOO.widget.Calendar.WEEKDAY +* @static +* @final +* @type String +*/ +Calendar.WEEKDAY = "WD"; + +/** +* Type constant used for renderers to represent a range of individual dates (M/D/Y-M/D/Y) +* @property YAHOO.widget.Calendar.RANGE +* @static +* @final +* @type String +*/ +Calendar.RANGE = "R"; + +/** +* Type constant used for renderers to represent a month across any year +* @property YAHOO.widget.Calendar.MONTH +* @static +* @final +* @type String +*/ +Calendar.MONTH = "M"; + +/** +* Constant that represents the total number of date cells that are displayed in a given month +* @property YAHOO.widget.Calendar.DISPLAY_DAYS +* @static +* @final +* @type Number +*/ +Calendar.DISPLAY_DAYS = 42; + +/** +* Constant used for halting the execution of the remainder of the render stack +* @property YAHOO.widget.Calendar.STOP_RENDER +* @static +* @final +* @type String +*/ +Calendar.STOP_RENDER = "S"; + +/** +* Constant used to represent short date field string formats (e.g. Tu or Feb) +* @property YAHOO.widget.Calendar.SHORT +* @static +* @final +* @type String +*/ +Calendar.SHORT = "short"; + +/** +* Constant used to represent long date field string formats (e.g. Monday or February) +* @property YAHOO.widget.Calendar.LONG +* @static +* @final +* @type String +*/ +Calendar.LONG = "long"; + +/** +* Constant used to represent medium date field string formats (e.g. Mon) +* @property YAHOO.widget.Calendar.MEDIUM +* @static +* @final +* @type String +*/ +Calendar.MEDIUM = "medium"; + +/** +* Constant used to represent single character date field string formats (e.g. M, T, W) +* @property YAHOO.widget.Calendar.ONE_CHAR +* @static +* @final +* @type String +*/ +Calendar.ONE_CHAR = "1char"; + +/** +* The set of default Config property keys and values for the Calendar +* @property YAHOO.widget.Calendar._DEFAULT_CONFIG +* @final +* @static +* @private +* @type Object +*/ +Calendar._DEFAULT_CONFIG = { + // Default values for pagedate and selected are not class level constants - they are set during instance creation + PAGEDATE : {key:"pagedate", value:null}, + SELECTED : {key:"selected", value:null}, + TITLE : {key:"title", value:""}, + CLOSE : {key:"close", value:false}, + IFRAME : {key:"iframe", value:(YAHOO.env.ua.ie && YAHOO.env.ua.ie <= 6) ? true : false}, + MINDATE : {key:"mindate", value:null}, + MAXDATE : {key:"maxdate", value:null}, + MULTI_SELECT : {key:"multi_select", value:false}, + START_WEEKDAY : {key:"start_weekday", value:0}, + SHOW_WEEKDAYS : {key:"show_weekdays", value:true}, + SHOW_WEEK_HEADER : {key:"show_week_header", value:false}, + SHOW_WEEK_FOOTER : {key:"show_week_footer", value:false}, + HIDE_BLANK_WEEKS : {key:"hide_blank_weeks", value:false}, + NAV_ARROW_LEFT: {key:"nav_arrow_left", value:null} , + NAV_ARROW_RIGHT : {key:"nav_arrow_right", value:null} , + MONTHS_SHORT : {key:"months_short", value:["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]}, + MONTHS_LONG: {key:"months_long", value:["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]}, + WEEKDAYS_1CHAR: {key:"weekdays_1char", value:["S", "M", "T", "W", "T", "F", "S"]}, + WEEKDAYS_SHORT: {key:"weekdays_short", value:["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]}, + WEEKDAYS_MEDIUM: {key:"weekdays_medium", value:["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]}, + WEEKDAYS_LONG: {key:"weekdays_long", value:["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]}, + LOCALE_MONTHS:{key:"locale_months", value:"long"}, + LOCALE_WEEKDAYS:{key:"locale_weekdays", value:"short"}, + DATE_DELIMITER:{key:"date_delimiter", value:","}, + DATE_FIELD_DELIMITER:{key:"date_field_delimiter", value:"/"}, + DATE_RANGE_DELIMITER:{key:"date_range_delimiter", value:"-"}, + MY_MONTH_POSITION:{key:"my_month_position", value:1}, + MY_YEAR_POSITION:{key:"my_year_position", value:2}, + MD_MONTH_POSITION:{key:"md_month_position", value:1}, + MD_DAY_POSITION:{key:"md_day_position", value:2}, + MDY_MONTH_POSITION:{key:"mdy_month_position", value:1}, + MDY_DAY_POSITION:{key:"mdy_day_position", value:2}, + MDY_YEAR_POSITION:{key:"mdy_year_position", value:3}, + MY_LABEL_MONTH_POSITION:{key:"my_label_month_position", value:1}, + MY_LABEL_YEAR_POSITION:{key:"my_label_year_position", value:2}, + MY_LABEL_MONTH_SUFFIX:{key:"my_label_month_suffix", value:" "}, + MY_LABEL_YEAR_SUFFIX:{key:"my_label_year_suffix", value:""}, + NAV: {key:"navigator", value: null}, + STRINGS : { + key:"strings", + value: { + previousMonth : "Previous Month", + nextMonth : "Next Month", + close: "Close" + }, + supercedes : ["close", "title"] + } +}; + +var DEF_CFG = Calendar._DEFAULT_CONFIG; + +/** +* The set of Custom Event types supported by the Calendar +* @property YAHOO.widget.Calendar._EVENT_TYPES +* @final +* @static +* @private +* @type Object +*/ +Calendar._EVENT_TYPES = { + BEFORE_SELECT : "beforeSelect", + SELECT : "select", + BEFORE_DESELECT : "beforeDeselect", + DESELECT : "deselect", + CHANGE_PAGE : "changePage", + BEFORE_RENDER : "beforeRender", + RENDER : "render", + BEFORE_DESTROY : "beforeDestroy", + DESTROY : "destroy", + RESET : "reset", + CLEAR : "clear", + BEFORE_HIDE : "beforeHide", + HIDE : "hide", + BEFORE_SHOW : "beforeShow", + SHOW : "show", + BEFORE_HIDE_NAV : "beforeHideNav", + HIDE_NAV : "hideNav", + BEFORE_SHOW_NAV : "beforeShowNav", + SHOW_NAV : "showNav", + BEFORE_RENDER_NAV : "beforeRenderNav", + RENDER_NAV : "renderNav" +}; + +/** +* The set of default style constants for the Calendar +* @property YAHOO.widget.Calendar._STYLES +* @final +* @static +* @private +* @type Object +*/ +Calendar._STYLES = { + CSS_ROW_HEADER: "calrowhead", + CSS_ROW_FOOTER: "calrowfoot", + CSS_CELL : "calcell", + CSS_CELL_SELECTOR : "selector", + CSS_CELL_SELECTED : "selected", + CSS_CELL_SELECTABLE : "selectable", + CSS_CELL_RESTRICTED : "restricted", + CSS_CELL_TODAY : "today", + CSS_CELL_OOM : "oom", + CSS_CELL_OOB : "previous", + CSS_HEADER : "calheader", + CSS_HEADER_TEXT : "calhead", + CSS_BODY : "calbody", + CSS_WEEKDAY_CELL : "calweekdaycell", + CSS_WEEKDAY_ROW : "calweekdayrow", + CSS_FOOTER : "calfoot", + CSS_CALENDAR : "yui-calendar", + CSS_SINGLE : "single", + CSS_CONTAINER : "yui-calcontainer", + CSS_NAV_LEFT : "calnavleft", + CSS_NAV_RIGHT : "calnavright", + CSS_NAV : "calnav", + CSS_CLOSE : "calclose", + CSS_CELL_TOP : "calcelltop", + CSS_CELL_LEFT : "calcellleft", + CSS_CELL_RIGHT : "calcellright", + CSS_CELL_BOTTOM : "calcellbottom", + CSS_CELL_HOVER : "calcellhover", + CSS_CELL_HIGHLIGHT1 : "highlight1", + CSS_CELL_HIGHLIGHT2 : "highlight2", + CSS_CELL_HIGHLIGHT3 : "highlight3", + CSS_CELL_HIGHLIGHT4 : "highlight4" +}; + +Calendar.prototype = { + + /** + * The configuration object used to set up the calendars various locale and style options. + * @property Config + * @private + * @deprecated Configuration properties should be set by calling Calendar.cfg.setProperty. + * @type Object + */ + Config : null, + + /** + * The parent CalendarGroup, only to be set explicitly by the parent group + * @property parent + * @type CalendarGroup + */ + parent : null, + + /** + * The index of this item in the parent group + * @property index + * @type Number + */ + index : -1, + + /** + * The collection of calendar table cells + * @property cells + * @type HTMLTableCellElement[] + */ + cells : null, + + /** + * The collection of calendar cell dates that is parallel to the cells collection. The array contains dates field arrays in the format of [YYYY, M, D]. + * @property cellDates + * @type Array[](Number[]) + */ + cellDates : null, + + /** + * The id that uniquely identifies this Calendar. + * @property id + * @type String + */ + id : null, + + /** + * The unique id associated with the Calendar's container + * @property containerId + * @type String + */ + containerId: null, + + /** + * The DOM element reference that points to this calendar's container element. The calendar will be inserted into this element when the shell is rendered. + * @property oDomContainer + * @type HTMLElement + */ + oDomContainer : null, + + /** + * A Date object representing today's date. + * @property today + * @type Date + */ + today : null, + + /** + * The list of render functions, along with required parameters, used to render cells. + * @property renderStack + * @type Array[] + */ + renderStack : null, + + /** + * A copy of the initial render functions created before rendering. + * @property _renderStack + * @private + * @type Array + */ + _renderStack : null, + + /** + * A reference to the CalendarNavigator instance created for this Calendar. + * Will be null if the "navigator" configuration property has not been set + * @property oNavigator + * @type CalendarNavigator + */ + oNavigator : null, + + /** + * The private list of initially selected dates. + * @property _selectedDates + * @private + * @type Array + */ + _selectedDates : null, + + /** + * A map of DOM event handlers to attach to cells associated with specific CSS class names + * @property domEventMap + * @type Object + */ + domEventMap : null, + + /** + * Protected helper used to parse Calendar constructor/init arguments. + * + * As of 2.4.0, Calendar supports a simpler constructor + * signature. This method reconciles arguments + * received in the pre 2.4.0 and 2.4.0 formats. + * + * @protected + * @method _parseArgs + * @param {Array} Function "arguments" array + * @return {Object} Object with id, container, config properties containing + * the reconciled argument values. + **/ + _parseArgs : function(args) { + /* + 2.4.0 Constructors signatures + + new Calendar(String) + new Calendar(HTMLElement) + new Calendar(String, ConfigObject) + new Calendar(HTMLElement, ConfigObject) + + Pre 2.4.0 Constructor signatures + + new Calendar(String, String) + new Calendar(String, HTMLElement) + new Calendar(String, String, ConfigObject) + new Calendar(String, HTMLElement, ConfigObject) + */ + var nArgs = {id:null, container:null, config:null}; + + if (args && args.length && args.length > 0) { + switch (args.length) { + case 1: + nArgs.id = null; + nArgs.container = args[0]; + nArgs.config = null; + break; + case 2: + if (Lang.isObject(args[1]) && !args[1].tagName && !(args[1] instanceof String)) { + nArgs.id = null; + nArgs.container = args[0]; + nArgs.config = args[1]; + } else { + nArgs.id = args[0]; + nArgs.container = args[1]; + nArgs.config = null; + } + break; + default: // 3+ + nArgs.id = args[0]; + nArgs.container = args[1]; + nArgs.config = args[2]; + break; + } + } else { + this.logger.log("Invalid constructor/init arguments", "error"); + } + return nArgs; + }, + + /** + * Initializes the Calendar widget. + * @method init + * + * @param {String} id optional The id of the table element that will represent the Calendar widget. As of 2.4.0, this argument is optional. + * @param {String | HTMLElement} container The id of the container div element that will wrap the Calendar table, or a reference to a DIV element which exists in the document. + * @param {Object} config optional The configuration object containing the initial configuration values for the Calendar. + */ + init : function(id, container, config) { + // Normalize 2.4.0, pre 2.4.0 args + var nArgs = this._parseArgs(arguments); + + id = nArgs.id; + container = nArgs.container; + config = nArgs.config; + + this.oDomContainer = Dom.get(container); + if (!this.oDomContainer) { this.logger.log("Container not found in document.", "error"); } + + if (!this.oDomContainer.id) { + this.oDomContainer.id = Dom.generateId(); + } + if (!id) { + id = this.oDomContainer.id + "_t"; + } + + this.id = id; + this.containerId = this.oDomContainer.id; + + this.logger = new YAHOO.widget.LogWriter("Calendar " + this.id); + this.initEvents(); + + this.today = new Date(); + DateMath.clearTime(this.today); + + /** + * The Config object used to hold the configuration variables for the Calendar + * @property cfg + * @type YAHOO.util.Config + */ + this.cfg = new YAHOO.util.Config(this); + + /** + * The local object which contains the Calendar's options + * @property Options + * @type Object + */ + this.Options = {}; + + /** + * The local object which contains the Calendar's locale settings + * @property Locale + * @type Object + */ + this.Locale = {}; + + this.initStyles(); + + Dom.addClass(this.oDomContainer, this.Style.CSS_CONTAINER); + Dom.addClass(this.oDomContainer, this.Style.CSS_SINGLE); + + this.cellDates = []; + this.cells = []; + this.renderStack = []; + this._renderStack = []; + + this.setupConfig(); + + if (config) { + this.cfg.applyConfig(config, true); + } + + this.cfg.fireQueue(); + }, + + /** + * Default Config listener for the iframe property. If the iframe config property is set to true, + * renders the built-in IFRAME shim if the container is relatively or absolutely positioned. + * + * @method configIframe + */ + configIframe : function(type, args, obj) { + var useIframe = args[0]; + + if (!this.parent) { + if (Dom.inDocument(this.oDomContainer)) { + if (useIframe) { + var pos = Dom.getStyle(this.oDomContainer, "position"); + + if (pos == "absolute" || pos == "relative") { + + if (!Dom.inDocument(this.iframe)) { + this.iframe = document.createElement("iframe"); + this.iframe.src = "javascript:false;"; + + Dom.setStyle(this.iframe, "opacity", "0"); + + if (YAHOO.env.ua.ie && YAHOO.env.ua.ie <= 6) { + Dom.addClass(this.iframe, "fixedsize"); + } + + this.oDomContainer.insertBefore(this.iframe, this.oDomContainer.firstChild); + } + } + } else { + if (this.iframe) { + if (this.iframe.parentNode) { + this.iframe.parentNode.removeChild(this.iframe); + } + this.iframe = null; + } + } + } + } + }, + + /** + * Default handler for the "title" property + * @method configTitle + */ + configTitle : function(type, args, obj) { + var title = args[0]; + + // "" disables title bar + if (title) { + this.createTitleBar(title); + } else { + var close = this.cfg.getProperty(DEF_CFG.CLOSE.key); + if (!close) { + this.removeTitleBar(); + } else { + this.createTitleBar(" "); + } + } + }, + + /** + * Default handler for the "close" property + * @method configClose + */ + configClose : function(type, args, obj) { + var close = args[0], + title = this.cfg.getProperty(DEF_CFG.TITLE.key); + + if (close) { + if (!title) { + this.createTitleBar(" "); + } + this.createCloseButton(); + } else { + this.removeCloseButton(); + if (!title) { + this.removeTitleBar(); + } + } + }, + + /** + * Initializes Calendar's built-in CustomEvents + * @method initEvents + */ + initEvents : function() { + + var defEvents = Calendar._EVENT_TYPES, + CE = YAHOO.util.CustomEvent, + cal = this; // To help with minification + + /** + * Fired before a selection is made + * @event beforeSelectEvent + */ + cal.beforeSelectEvent = new CE(defEvents.BEFORE_SELECT); + + /** + * Fired when a selection is made + * @event selectEvent + * @param {Array} Array of Date field arrays in the format [YYYY, MM, DD]. + */ + cal.selectEvent = new CE(defEvents.SELECT); + + /** + * Fired before a selection is made + * @event beforeDeselectEvent + */ + cal.beforeDeselectEvent = new CE(defEvents.BEFORE_DESELECT); + + /** + * Fired when a selection is made + * @event deselectEvent + * @param {Array} Array of Date field arrays in the format [YYYY, MM, DD]. + */ + cal.deselectEvent = new CE(defEvents.DESELECT); + + /** + * Fired when the Calendar page is changed + * @event changePageEvent + */ + cal.changePageEvent = new CE(defEvents.CHANGE_PAGE); + + /** + * Fired before the Calendar is rendered + * @event beforeRenderEvent + */ + cal.beforeRenderEvent = new CE(defEvents.BEFORE_RENDER); + + /** + * Fired when the Calendar is rendered + * @event renderEvent + */ + cal.renderEvent = new CE(defEvents.RENDER); + + /** + * Fired just before the Calendar is to be destroyed + * @event beforeDestroyEvent + */ + cal.beforeDestroyEvent = new CE(defEvents.BEFORE_DESTROY); + + /** + * Fired after the Calendar is destroyed. This event should be used + * for notification only. When this event is fired, important Calendar instance + * properties, dom references and event listeners have already been + * removed/dereferenced, and hence the Calendar instance is not in a usable + * state. + * + * @event destroyEvent + */ + cal.destroyEvent = new CE(defEvents.DESTROY); + + /** + * Fired when the Calendar is reset + * @event resetEvent + */ + cal.resetEvent = new CE(defEvents.RESET); + + /** + * Fired when the Calendar is cleared + * @event clearEvent + */ + cal.clearEvent = new CE(defEvents.CLEAR); + + /** + * Fired just before the Calendar is to be shown + * @event beforeShowEvent + */ + cal.beforeShowEvent = new CE(defEvents.BEFORE_SHOW); + + /** + * Fired after the Calendar is shown + * @event showEvent + */ + cal.showEvent = new CE(defEvents.SHOW); + + /** + * Fired just before the Calendar is to be hidden + * @event beforeHideEvent + */ + cal.beforeHideEvent = new CE(defEvents.BEFORE_HIDE); + + /** + * Fired after the Calendar is hidden + * @event hideEvent + */ + cal.hideEvent = new CE(defEvents.HIDE); + + /** + * Fired just before the CalendarNavigator is to be shown + * @event beforeShowNavEvent + */ + cal.beforeShowNavEvent = new CE(defEvents.BEFORE_SHOW_NAV); + + /** + * Fired after the CalendarNavigator is shown + * @event showNavEvent + */ + cal.showNavEvent = new CE(defEvents.SHOW_NAV); + + /** + * Fired just before the CalendarNavigator is to be hidden + * @event beforeHideNavEvent + */ + cal.beforeHideNavEvent = new CE(defEvents.BEFORE_HIDE_NAV); + + /** + * Fired after the CalendarNavigator is hidden + * @event hideNavEvent + */ + cal.hideNavEvent = new CE(defEvents.HIDE_NAV); + + /** + * Fired just before the CalendarNavigator is to be rendered + * @event beforeRenderNavEvent + */ + cal.beforeRenderNavEvent = new CE(defEvents.BEFORE_RENDER_NAV); + + /** + * Fired after the CalendarNavigator is rendered + * @event renderNavEvent + */ + cal.renderNavEvent = new CE(defEvents.RENDER_NAV); + + cal.beforeSelectEvent.subscribe(cal.onBeforeSelect, this, true); + cal.selectEvent.subscribe(cal.onSelect, this, true); + cal.beforeDeselectEvent.subscribe(cal.onBeforeDeselect, this, true); + cal.deselectEvent.subscribe(cal.onDeselect, this, true); + cal.changePageEvent.subscribe(cal.onChangePage, this, true); + cal.renderEvent.subscribe(cal.onRender, this, true); + cal.resetEvent.subscribe(cal.onReset, this, true); + cal.clearEvent.subscribe(cal.onClear, this, true); + }, + + /** + * The default event handler for clicks on the "Previous Month" navigation UI + * + * @method doPreviousMonthNav + * @param {DOMEvent} e The DOM event + * @param {Calendar} cal A reference to the calendar + */ + doPreviousMonthNav : function(e, cal) { + Event.preventDefault(e); + // previousMonth invoked in a timeout, to allow + // event to bubble up, with correct target. Calling + // previousMonth, will call render which will remove + // HTML which generated the event, resulting in an + // invalid event target in certain browsers. + setTimeout(function() { + cal.previousMonth(); + var navs = Dom.getElementsByClassName(cal.Style.CSS_NAV_LEFT, "a", cal.oDomContainer); + if (navs && navs[0]) { + try { + navs[0].focus(); + } catch (e) { + // ignore + } + } + }, 0); + }, + + /** + * The default event handler for clicks on the "Next Month" navigation UI + * + * @method doNextMonthNav + * @param {DOMEvent} e The DOM event + * @param {Calendar} cal A reference to the calendar + */ + doNextMonthNav : function(e, cal) { + Event.preventDefault(e); + setTimeout(function() { + cal.nextMonth(); + var navs = Dom.getElementsByClassName(cal.Style.CSS_NAV_RIGHT, "a", cal.oDomContainer); + if (navs && navs[0]) { + try { + navs[0].focus(); + } catch (e) { + // ignore + } + } + }, 0); + }, + + /** + * The default event handler for date cell selection. Currently attached to + * the Calendar's bounding box, referenced by it's oDomContainer property. + * + * @method doSelectCell + * @param {DOMEvent} e The DOM event + * @param {Calendar} cal A reference to the calendar + */ + doSelectCell : function(e, cal) { + var cell, d, date, index; + + var target = Event.getTarget(e), + tagName = target.tagName.toLowerCase(), + defSelector = false; + + while (tagName != "td" && !Dom.hasClass(target, cal.Style.CSS_CELL_SELECTABLE)) { + + if (!defSelector && tagName == "a" && Dom.hasClass(target, cal.Style.CSS_CELL_SELECTOR)) { + defSelector = true; + } + + target = target.parentNode; + tagName = target.tagName.toLowerCase(); + + if (target == this.oDomContainer || tagName == "html") { + return; + } + } + + if (defSelector) { + // Stop link href navigation for default renderer + Event.preventDefault(e); + } + + cell = target; + + if (Dom.hasClass(cell, cal.Style.CSS_CELL_SELECTABLE)) { + index = cal.getIndexFromId(cell.id); + if (index > -1) { + d = cal.cellDates[index]; + if (d) { + date = DateMath.getDate(d[0],d[1]-1,d[2]); + + var link; + + cal.logger.log("Selecting cell " + index + " via click", "info"); + if (cal.Options.MULTI_SELECT) { + link = cell.getElementsByTagName("a")[0]; + if (link) { + link.blur(); + } + + var cellDate = cal.cellDates[index]; + var cellDateIndex = cal._indexOfSelectedFieldArray(cellDate); + + if (cellDateIndex > -1) { + cal.deselectCell(index); + } else { + cal.selectCell(index); + } + + } else { + link = cell.getElementsByTagName("a")[0]; + if (link) { + link.blur(); + } + cal.selectCell(index); + } + } + } + } + }, + + /** + * The event that is executed when the user hovers over a cell + * @method doCellMouseOver + * @param {DOMEvent} e The event + * @param {Calendar} cal A reference to the calendar passed by the Event utility + */ + doCellMouseOver : function(e, cal) { + var target; + if (e) { + target = Event.getTarget(e); + } else { + target = this; + } + + while (target.tagName && target.tagName.toLowerCase() != "td") { + target = target.parentNode; + if (!target.tagName || target.tagName.toLowerCase() == "html") { + return; + } + } + + if (Dom.hasClass(target, cal.Style.CSS_CELL_SELECTABLE)) { + Dom.addClass(target, cal.Style.CSS_CELL_HOVER); + } + }, + + /** + * The event that is executed when the user moves the mouse out of a cell + * @method doCellMouseOut + * @param {DOMEvent} e The event + * @param {Calendar} cal A reference to the calendar passed by the Event utility + */ + doCellMouseOut : function(e, cal) { + var target; + if (e) { + target = Event.getTarget(e); + } else { + target = this; + } + + while (target.tagName && target.tagName.toLowerCase() != "td") { + target = target.parentNode; + if (!target.tagName || target.tagName.toLowerCase() == "html") { + return; + } + } + + if (Dom.hasClass(target, cal.Style.CSS_CELL_SELECTABLE)) { + Dom.removeClass(target, cal.Style.CSS_CELL_HOVER); + } + }, + + setupConfig : function() { + var cfg = this.cfg; + + /** + * The month/year representing the current visible Calendar date (mm/yyyy) + * @config pagedate + * @type String | Date + * @default today's date + */ + cfg.addProperty(DEF_CFG.PAGEDATE.key, { value:new Date(), handler:this.configPageDate } ); + + /** + * The date or range of dates representing the current Calendar selection + * @config selected + * @type String + * @default [] + */ + cfg.addProperty(DEF_CFG.SELECTED.key, { value:[], handler:this.configSelected } ); + + /** + * The title to display above the Calendar's month header + * @config title + * @type String + * @default "" + */ + cfg.addProperty(DEF_CFG.TITLE.key, { value:DEF_CFG.TITLE.value, handler:this.configTitle } ); + + /** + * Whether or not a close button should be displayed for this Calendar + * @config close + * @type Boolean + * @default false + */ + cfg.addProperty(DEF_CFG.CLOSE.key, { value:DEF_CFG.CLOSE.value, handler:this.configClose } ); + + /** + * Whether or not an iframe shim should be placed under the Calendar to prevent select boxes from bleeding through in Internet Explorer 6 and below. + * This property is enabled by default for IE6 and below. It is disabled by default for other browsers for performance reasons, but can be + * enabled if required. + * + * @config iframe + * @type Boolean + * @default true for IE6 and below, false for all other browsers + */ + cfg.addProperty(DEF_CFG.IFRAME.key, { value:DEF_CFG.IFRAME.value, handler:this.configIframe, validator:cfg.checkBoolean } ); + + /** + * The minimum selectable date in the current Calendar (mm/dd/yyyy) + * @config mindate + * @type String | Date + * @default null + */ + cfg.addProperty(DEF_CFG.MINDATE.key, { value:DEF_CFG.MINDATE.value, handler:this.configMinDate } ); + + /** + * The maximum selectable date in the current Calendar (mm/dd/yyyy) + * @config maxdate + * @type String | Date + * @default null + */ + cfg.addProperty(DEF_CFG.MAXDATE.key, { value:DEF_CFG.MAXDATE.value, handler:this.configMaxDate } ); + + + // Options properties + + /** + * True if the Calendar should allow multiple selections. False by default. + * @config MULTI_SELECT + * @type Boolean + * @default false + */ + cfg.addProperty(DEF_CFG.MULTI_SELECT.key, { value:DEF_CFG.MULTI_SELECT.value, handler:this.configOptions, validator:cfg.checkBoolean } ); + + /** + * The weekday the week begins on. Default is 0 (Sunday = 0, Monday = 1 ... Saturday = 6). + * @config START_WEEKDAY + * @type number + * @default 0 + */ + cfg.addProperty(DEF_CFG.START_WEEKDAY.key, { value:DEF_CFG.START_WEEKDAY.value, handler:this.configOptions, validator:cfg.checkNumber } ); + + /** + * True if the Calendar should show weekday labels. True by default. + * @config SHOW_WEEKDAYS + * @type Boolean + * @default true + */ + cfg.addProperty(DEF_CFG.SHOW_WEEKDAYS.key, { value:DEF_CFG.SHOW_WEEKDAYS.value, handler:this.configOptions, validator:cfg.checkBoolean } ); + + /** + * True if the Calendar should show week row headers. False by default. + * @config SHOW_WEEK_HEADER + * @type Boolean + * @default false + */ + cfg.addProperty(DEF_CFG.SHOW_WEEK_HEADER.key, { value:DEF_CFG.SHOW_WEEK_HEADER.value, handler:this.configOptions, validator:cfg.checkBoolean } ); + + /** + * True if the Calendar should show week row footers. False by default. + * @config SHOW_WEEK_FOOTER + * @type Boolean + * @default false + */ + cfg.addProperty(DEF_CFG.SHOW_WEEK_FOOTER.key,{ value:DEF_CFG.SHOW_WEEK_FOOTER.value, handler:this.configOptions, validator:cfg.checkBoolean } ); + + /** + * True if the Calendar should suppress weeks that are not a part of the current month. False by default. + * @config HIDE_BLANK_WEEKS + * @type Boolean + * @default false + */ + cfg.addProperty(DEF_CFG.HIDE_BLANK_WEEKS.key, { value:DEF_CFG.HIDE_BLANK_WEEKS.value, handler:this.configOptions, validator:cfg.checkBoolean } ); + + /** + * The image that should be used for the left navigation arrow. + * @config NAV_ARROW_LEFT + * @type String + * @deprecated You can customize the image by overriding the default CSS class for the left arrow - "calnavleft" + * @default null + */ + cfg.addProperty(DEF_CFG.NAV_ARROW_LEFT.key, { value:DEF_CFG.NAV_ARROW_LEFT.value, handler:this.configOptions } ); + + /** + * The image that should be used for the right navigation arrow. + * @config NAV_ARROW_RIGHT + * @type String + * @deprecated You can customize the image by overriding the default CSS class for the right arrow - "calnavright" + * @default null + */ + cfg.addProperty(DEF_CFG.NAV_ARROW_RIGHT.key, { value:DEF_CFG.NAV_ARROW_RIGHT.value, handler:this.configOptions } ); + + // Locale properties + + /** + * The short month labels for the current locale. + * @config MONTHS_SHORT + * @type String[] + * @default ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] + */ + cfg.addProperty(DEF_CFG.MONTHS_SHORT.key, { value:DEF_CFG.MONTHS_SHORT.value, handler:this.configLocale } ); + + /** + * The long month labels for the current locale. + * @config MONTHS_LONG + * @type String[] + * @default ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" + */ + cfg.addProperty(DEF_CFG.MONTHS_LONG.key, { value:DEF_CFG.MONTHS_LONG.value, handler:this.configLocale } ); + + /** + * The 1-character weekday labels for the current locale. + * @config WEEKDAYS_1CHAR + * @type String[] + * @default ["S", "M", "T", "W", "T", "F", "S"] + */ + cfg.addProperty(DEF_CFG.WEEKDAYS_1CHAR.key, { value:DEF_CFG.WEEKDAYS_1CHAR.value, handler:this.configLocale } ); + + /** + * The short weekday labels for the current locale. + * @config WEEKDAYS_SHORT + * @type String[] + * @default ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"] + */ + cfg.addProperty(DEF_CFG.WEEKDAYS_SHORT.key, { value:DEF_CFG.WEEKDAYS_SHORT.value, handler:this.configLocale } ); + + /** + * The medium weekday labels for the current locale. + * @config WEEKDAYS_MEDIUM + * @type String[] + * @default ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"] + */ + cfg.addProperty(DEF_CFG.WEEKDAYS_MEDIUM.key, { value:DEF_CFG.WEEKDAYS_MEDIUM.value, handler:this.configLocale } ); + + /** + * The long weekday labels for the current locale. + * @config WEEKDAYS_LONG + * @type String[] + * @default ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"] + */ + cfg.addProperty(DEF_CFG.WEEKDAYS_LONG.key, { value:DEF_CFG.WEEKDAYS_LONG.value, handler:this.configLocale } ); + + /** + * Refreshes the locale values used to build the Calendar. + * @method refreshLocale + * @private + */ + var refreshLocale = function() { + cfg.refireEvent(DEF_CFG.LOCALE_MONTHS.key); + cfg.refireEvent(DEF_CFG.LOCALE_WEEKDAYS.key); + }; + + cfg.subscribeToConfigEvent(DEF_CFG.START_WEEKDAY.key, refreshLocale, this, true); + cfg.subscribeToConfigEvent(DEF_CFG.MONTHS_SHORT.key, refreshLocale, this, true); + cfg.subscribeToConfigEvent(DEF_CFG.MONTHS_LONG.key, refreshLocale, this, true); + cfg.subscribeToConfigEvent(DEF_CFG.WEEKDAYS_1CHAR.key, refreshLocale, this, true); + cfg.subscribeToConfigEvent(DEF_CFG.WEEKDAYS_SHORT.key, refreshLocale, this, true); + cfg.subscribeToConfigEvent(DEF_CFG.WEEKDAYS_MEDIUM.key, refreshLocale, this, true); + cfg.subscribeToConfigEvent(DEF_CFG.WEEKDAYS_LONG.key, refreshLocale, this, true); + + /** + * The setting that determines which length of month labels should be used. Possible values are "short" and "long". + * @config LOCALE_MONTHS + * @type String + * @default "long" + */ + cfg.addProperty(DEF_CFG.LOCALE_MONTHS.key, { value:DEF_CFG.LOCALE_MONTHS.value, handler:this.configLocaleValues } ); + + /** + * The setting that determines which length of weekday labels should be used. Possible values are "1char", "short", "medium", and "long". + * @config LOCALE_WEEKDAYS + * @type String + * @default "short" + */ + cfg.addProperty(DEF_CFG.LOCALE_WEEKDAYS.key, { value:DEF_CFG.LOCALE_WEEKDAYS.value, handler:this.configLocaleValues } ); + + /** + * The value used to delimit individual dates in a date string passed to various Calendar functions. + * @config DATE_DELIMITER + * @type String + * @default "," + */ + cfg.addProperty(DEF_CFG.DATE_DELIMITER.key, { value:DEF_CFG.DATE_DELIMITER.value, handler:this.configLocale } ); + + /** + * The value used to delimit date fields in a date string passed to various Calendar functions. + * @config DATE_FIELD_DELIMITER + * @type String + * @default "/" + */ + cfg.addProperty(DEF_CFG.DATE_FIELD_DELIMITER.key, { value:DEF_CFG.DATE_FIELD_DELIMITER.value, handler:this.configLocale } ); + + /** + * The value used to delimit date ranges in a date string passed to various Calendar functions. + * @config DATE_RANGE_DELIMITER + * @type String + * @default "-" + */ + cfg.addProperty(DEF_CFG.DATE_RANGE_DELIMITER.key, { value:DEF_CFG.DATE_RANGE_DELIMITER.value, handler:this.configLocale } ); + + /** + * The position of the month in a month/year date string + * @config MY_MONTH_POSITION + * @type Number + * @default 1 + */ + cfg.addProperty(DEF_CFG.MY_MONTH_POSITION.key, { value:DEF_CFG.MY_MONTH_POSITION.value, handler:this.configLocale, validator:cfg.checkNumber } ); + + /** + * The position of the year in a month/year date string + * @config MY_YEAR_POSITION + * @type Number + * @default 2 + */ + cfg.addProperty(DEF_CFG.MY_YEAR_POSITION.key, { value:DEF_CFG.MY_YEAR_POSITION.value, handler:this.configLocale, validator:cfg.checkNumber } ); + + /** + * The position of the month in a month/day date string + * @config MD_MONTH_POSITION + * @type Number + * @default 1 + */ + cfg.addProperty(DEF_CFG.MD_MONTH_POSITION.key, { value:DEF_CFG.MD_MONTH_POSITION.value, handler:this.configLocale, validator:cfg.checkNumber } ); + + /** + * The position of the day in a month/year date string + * @config MD_DAY_POSITION + * @type Number + * @default 2 + */ + cfg.addProperty(DEF_CFG.MD_DAY_POSITION.key, { value:DEF_CFG.MD_DAY_POSITION.value, handler:this.configLocale, validator:cfg.checkNumber } ); + + /** + * The position of the month in a month/day/year date string + * @config MDY_MONTH_POSITION + * @type Number + * @default 1 + */ + cfg.addProperty(DEF_CFG.MDY_MONTH_POSITION.key, { value:DEF_CFG.MDY_MONTH_POSITION.value, handler:this.configLocale, validator:cfg.checkNumber } ); + + /** + * The position of the day in a month/day/year date string + * @config MDY_DAY_POSITION + * @type Number + * @default 2 + */ + cfg.addProperty(DEF_CFG.MDY_DAY_POSITION.key, { value:DEF_CFG.MDY_DAY_POSITION.value, handler:this.configLocale, validator:cfg.checkNumber } ); + + /** + * The position of the year in a month/day/year date string + * @config MDY_YEAR_POSITION + * @type Number + * @default 3 + */ + cfg.addProperty(DEF_CFG.MDY_YEAR_POSITION.key, { value:DEF_CFG.MDY_YEAR_POSITION.value, handler:this.configLocale, validator:cfg.checkNumber } ); + + /** + * The position of the month in the month year label string used as the Calendar header + * @config MY_LABEL_MONTH_POSITION + * @type Number + * @default 1 + */ + cfg.addProperty(DEF_CFG.MY_LABEL_MONTH_POSITION.key, { value:DEF_CFG.MY_LABEL_MONTH_POSITION.value, handler:this.configLocale, validator:cfg.checkNumber } ); + + /** + * The position of the year in the month year label string used as the Calendar header + * @config MY_LABEL_YEAR_POSITION + * @type Number + * @default 2 + */ + cfg.addProperty(DEF_CFG.MY_LABEL_YEAR_POSITION.key, { value:DEF_CFG.MY_LABEL_YEAR_POSITION.value, handler:this.configLocale, validator:cfg.checkNumber } ); + + /** + * The suffix used after the month when rendering the Calendar header + * @config MY_LABEL_MONTH_SUFFIX + * @type String + * @default " " + */ + cfg.addProperty(DEF_CFG.MY_LABEL_MONTH_SUFFIX.key, { value:DEF_CFG.MY_LABEL_MONTH_SUFFIX.value, handler:this.configLocale } ); + + /** + * The suffix used after the year when rendering the Calendar header + * @config MY_LABEL_YEAR_SUFFIX + * @type String + * @default "" + */ + cfg.addProperty(DEF_CFG.MY_LABEL_YEAR_SUFFIX.key, { value:DEF_CFG.MY_LABEL_YEAR_SUFFIX.value, handler:this.configLocale } ); + + /** + * Configuration for the Month/Year CalendarNavigator UI which allows the user to jump directly to a + * specific Month/Year without having to scroll sequentially through months. + *

    + * Setting this property to null (default value) or false, will disable the CalendarNavigator UI. + *

    + *

    + * Setting this property to true will enable the CalendarNavigatior UI with the default CalendarNavigator configuration values. + *

    + *

    + * This property can also be set to an object literal containing configuration properties for the CalendarNavigator UI. + * The configuration object expects the the following case-sensitive properties, with the "strings" property being a nested object. + * Any properties which are not provided will use the default values (defined in the CalendarNavigator class). + *

    + *
    + *
    strings
    + *
    Object : An object with the properties shown below, defining the string labels to use in the Navigator's UI + *
    + *
    month
    String : The string to use for the month label. Defaults to "Month".
    + *
    year
    String : The string to use for the year label. Defaults to "Year".
    + *
    submit
    String : The string to use for the submit button label. Defaults to "Okay".
    + *
    cancel
    String : The string to use for the cancel button label. Defaults to "Cancel".
    + *
    invalidYear
    String : The string to use for invalid year values. Defaults to "Year needs to be a number".
    + *
    + *
    + *
    monthFormat
    String : The month format to use. Either YAHOO.widget.Calendar.LONG, or YAHOO.widget.Calendar.SHORT. Defaults to YAHOO.widget.Calendar.LONG
    + *
    initialFocus
    String : Either "year" or "month" specifying which input control should get initial focus. Defaults to "year"
    + *
    + *

    E.g.

    + *
    +		* var navConfig = {
    +		*	  strings: {
    +		*		  month:"Calendar Month",
    +		*		  year:"Calendar Year",
    +		*		  submit: "Submit",
    +		*		  cancel: "Cancel",
    +		*		  invalidYear: "Please enter a valid year"
    +		*	  },
    +		*	  monthFormat: YAHOO.widget.Calendar.SHORT,
    +		*	  initialFocus: "month"
    +		* }
    +		* 
    + * @config navigator + * @type {Object|Boolean} + * @default null + */ + cfg.addProperty(DEF_CFG.NAV.key, { value:DEF_CFG.NAV.value, handler:this.configNavigator } ); + + /** + * The map of UI strings which the Calendar UI uses. + * + * @config strings + * @type {Object} + * @default An object with the properties shown below: + *
    + *
    previousMonth
    String : The string to use for the "Previous Month" navigation UI. Defaults to "Previous Month".
    + *
    nextMonth
    String : The string to use for the "Next Month" navigation UI. Defaults to "Next Month".
    + *
    close
    String : The string to use for the close button label. Defaults to "Close".
    + *
    + */ + cfg.addProperty(DEF_CFG.STRINGS.key, { + value:DEF_CFG.STRINGS.value, + handler:this.configStrings, + validator: function(val) { + return Lang.isObject(val); + }, + supercedes:DEF_CFG.STRINGS.supercedes + }); + }, + + /** + * The default handler for the "strings" property + * @method configStrings + */ + configStrings : function(type, args, obj) { + var val = Lang.merge(DEF_CFG.STRINGS.value, args[0]); + this.cfg.setProperty(DEF_CFG.STRINGS.key, val, true); + }, + + /** + * The default handler for the "pagedate" property + * @method configPageDate + */ + configPageDate : function(type, args, obj) { + this.cfg.setProperty(DEF_CFG.PAGEDATE.key, this._parsePageDate(args[0]), true); + }, + + /** + * The default handler for the "mindate" property + * @method configMinDate + */ + configMinDate : function(type, args, obj) { + var val = args[0]; + if (Lang.isString(val)) { + val = this._parseDate(val); + this.cfg.setProperty(DEF_CFG.MINDATE.key, DateMath.getDate(val[0],(val[1]-1),val[2])); + } + }, + + /** + * The default handler for the "maxdate" property + * @method configMaxDate + */ + configMaxDate : function(type, args, obj) { + var val = args[0]; + if (Lang.isString(val)) { + val = this._parseDate(val); + this.cfg.setProperty(DEF_CFG.MAXDATE.key, DateMath.getDate(val[0],(val[1]-1),val[2])); + } + }, + + /** + * The default handler for the "selected" property + * @method configSelected + */ + configSelected : function(type, args, obj) { + var selected = args[0], + cfgSelected = DEF_CFG.SELECTED.key; + + if (selected) { + if (Lang.isString(selected)) { + this.cfg.setProperty(cfgSelected, this._parseDates(selected), true); + } + } + if (! this._selectedDates) { + this._selectedDates = this.cfg.getProperty(cfgSelected); + } + }, + + /** + * The default handler for all configuration options properties + * @method configOptions + */ + configOptions : function(type, args, obj) { + this.Options[type.toUpperCase()] = args[0]; + }, + + /** + * The default handler for all configuration locale properties + * @method configLocale + */ + configLocale : function(type, args, obj) { + this.Locale[type.toUpperCase()] = args[0]; + + this.cfg.refireEvent(DEF_CFG.LOCALE_MONTHS.key); + this.cfg.refireEvent(DEF_CFG.LOCALE_WEEKDAYS.key); + }, + + /** + * The default handler for all configuration locale field length properties + * @method configLocaleValues + */ + configLocaleValues : function(type, args, obj) { + + type = type.toLowerCase(); + + var val = args[0], + cfg = this.cfg, + Locale = this.Locale; + + switch (type) { + case DEF_CFG.LOCALE_MONTHS.key: + switch (val) { + case Calendar.SHORT: + Locale.LOCALE_MONTHS = cfg.getProperty(DEF_CFG.MONTHS_SHORT.key).concat(); + break; + case Calendar.LONG: + Locale.LOCALE_MONTHS = cfg.getProperty(DEF_CFG.MONTHS_LONG.key).concat(); + break; + } + break; + case DEF_CFG.LOCALE_WEEKDAYS.key: + switch (val) { + case Calendar.ONE_CHAR: + Locale.LOCALE_WEEKDAYS = cfg.getProperty(DEF_CFG.WEEKDAYS_1CHAR.key).concat(); + break; + case Calendar.SHORT: + Locale.LOCALE_WEEKDAYS = cfg.getProperty(DEF_CFG.WEEKDAYS_SHORT.key).concat(); + break; + case Calendar.MEDIUM: + Locale.LOCALE_WEEKDAYS = cfg.getProperty(DEF_CFG.WEEKDAYS_MEDIUM.key).concat(); + break; + case Calendar.LONG: + Locale.LOCALE_WEEKDAYS = cfg.getProperty(DEF_CFG.WEEKDAYS_LONG.key).concat(); + break; + } + + var START_WEEKDAY = cfg.getProperty(DEF_CFG.START_WEEKDAY.key); + + if (START_WEEKDAY > 0) { + for (var w=0; w < START_WEEKDAY; ++w) { + Locale.LOCALE_WEEKDAYS.push(Locale.LOCALE_WEEKDAYS.shift()); + } + } + break; + } + }, + + /** + * The default handler for the "navigator" property + * @method configNavigator + */ + configNavigator : function(type, args, obj) { + var val = args[0]; + if (YAHOO.widget.CalendarNavigator && (val === true || Lang.isObject(val))) { + if (!this.oNavigator) { + this.oNavigator = new YAHOO.widget.CalendarNavigator(this); + // Cleanup DOM Refs/Events before innerHTML is removed. + this.beforeRenderEvent.subscribe(function () { + if (!this.pages) { + this.oNavigator.erase(); + } + }, this, true); + } + } else { + if (this.oNavigator) { + this.oNavigator.destroy(); + this.oNavigator = null; + } + } + }, + + /** + * Defines the style constants for the Calendar + * @method initStyles + */ + initStyles : function() { + + var defStyle = Calendar._STYLES; + + this.Style = { + /** + * @property Style.CSS_ROW_HEADER + */ + CSS_ROW_HEADER: defStyle.CSS_ROW_HEADER, + /** + * @property Style.CSS_ROW_FOOTER + */ + CSS_ROW_FOOTER: defStyle.CSS_ROW_FOOTER, + /** + * @property Style.CSS_CELL + */ + CSS_CELL : defStyle.CSS_CELL, + /** + * @property Style.CSS_CELL_SELECTOR + */ + CSS_CELL_SELECTOR : defStyle.CSS_CELL_SELECTOR, + /** + * @property Style.CSS_CELL_SELECTED + */ + CSS_CELL_SELECTED : defStyle.CSS_CELL_SELECTED, + /** + * @property Style.CSS_CELL_SELECTABLE + */ + CSS_CELL_SELECTABLE : defStyle.CSS_CELL_SELECTABLE, + /** + * @property Style.CSS_CELL_RESTRICTED + */ + CSS_CELL_RESTRICTED : defStyle.CSS_CELL_RESTRICTED, + /** + * @property Style.CSS_CELL_TODAY + */ + CSS_CELL_TODAY : defStyle.CSS_CELL_TODAY, + /** + * @property Style.CSS_CELL_OOM + */ + CSS_CELL_OOM : defStyle.CSS_CELL_OOM, + /** + * @property Style.CSS_CELL_OOB + */ + CSS_CELL_OOB : defStyle.CSS_CELL_OOB, + /** + * @property Style.CSS_HEADER + */ + CSS_HEADER : defStyle.CSS_HEADER, + /** + * @property Style.CSS_HEADER_TEXT + */ + CSS_HEADER_TEXT : defStyle.CSS_HEADER_TEXT, + /** + * @property Style.CSS_BODY + */ + CSS_BODY : defStyle.CSS_BODY, + /** + * @property Style.CSS_WEEKDAY_CELL + */ + CSS_WEEKDAY_CELL : defStyle.CSS_WEEKDAY_CELL, + /** + * @property Style.CSS_WEEKDAY_ROW + */ + CSS_WEEKDAY_ROW : defStyle.CSS_WEEKDAY_ROW, + /** + * @property Style.CSS_FOOTER + */ + CSS_FOOTER : defStyle.CSS_FOOTER, + /** + * @property Style.CSS_CALENDAR + */ + CSS_CALENDAR : defStyle.CSS_CALENDAR, + /** + * @property Style.CSS_SINGLE + */ + CSS_SINGLE : defStyle.CSS_SINGLE, + /** + * @property Style.CSS_CONTAINER + */ + CSS_CONTAINER : defStyle.CSS_CONTAINER, + /** + * @property Style.CSS_NAV_LEFT + */ + CSS_NAV_LEFT : defStyle.CSS_NAV_LEFT, + /** + * @property Style.CSS_NAV_RIGHT + */ + CSS_NAV_RIGHT : defStyle.CSS_NAV_RIGHT, + /** + * @property Style.CSS_NAV + */ + CSS_NAV : defStyle.CSS_NAV, + /** + * @property Style.CSS_CLOSE + */ + CSS_CLOSE : defStyle.CSS_CLOSE, + /** + * @property Style.CSS_CELL_TOP + */ + CSS_CELL_TOP : defStyle.CSS_CELL_TOP, + /** + * @property Style.CSS_CELL_LEFT + */ + CSS_CELL_LEFT : defStyle.CSS_CELL_LEFT, + /** + * @property Style.CSS_CELL_RIGHT + */ + CSS_CELL_RIGHT : defStyle.CSS_CELL_RIGHT, + /** + * @property Style.CSS_CELL_BOTTOM + */ + CSS_CELL_BOTTOM : defStyle.CSS_CELL_BOTTOM, + /** + * @property Style.CSS_CELL_HOVER + */ + CSS_CELL_HOVER : defStyle.CSS_CELL_HOVER, + /** + * @property Style.CSS_CELL_HIGHLIGHT1 + */ + CSS_CELL_HIGHLIGHT1 : defStyle.CSS_CELL_HIGHLIGHT1, + /** + * @property Style.CSS_CELL_HIGHLIGHT2 + */ + CSS_CELL_HIGHLIGHT2 : defStyle.CSS_CELL_HIGHLIGHT2, + /** + * @property Style.CSS_CELL_HIGHLIGHT3 + */ + CSS_CELL_HIGHLIGHT3 : defStyle.CSS_CELL_HIGHLIGHT3, + /** + * @property Style.CSS_CELL_HIGHLIGHT4 + */ + CSS_CELL_HIGHLIGHT4 : defStyle.CSS_CELL_HIGHLIGHT4 + }; + }, + + /** + * Builds the date label that will be displayed in the calendar header or + * footer, depending on configuration. + * @method buildMonthLabel + * @return {String} The formatted calendar month label + */ + buildMonthLabel : function() { + return this._buildMonthLabel(this.cfg.getProperty(DEF_CFG.PAGEDATE.key)); + }, + + /** + * Helper method, to format a Month Year string, given a JavaScript Date, based on the + * Calendar localization settings + * + * @method _buildMonthLabel + * @private + * @param {Date} date + * @return {String} Formated month, year string + */ + _buildMonthLabel : function(date) { + var monthLabel = this.Locale.LOCALE_MONTHS[date.getMonth()] + this.Locale.MY_LABEL_MONTH_SUFFIX, + yearLabel = date.getFullYear() + this.Locale.MY_LABEL_YEAR_SUFFIX; + + if (this.Locale.MY_LABEL_MONTH_POSITION == 2 || this.Locale.MY_LABEL_YEAR_POSITION == 1) { + return yearLabel + monthLabel; + } else { + return monthLabel + yearLabel; + } + }, + + /** + * Builds the date digit that will be displayed in calendar cells + * @method buildDayLabel + * @param {Date} workingDate The current working date + * @return {String} The formatted day label + */ + buildDayLabel : function(workingDate) { + return workingDate.getDate(); + }, + + /** + * Creates the title bar element and adds it to Calendar container DIV + * + * @method createTitleBar + * @param {String} strTitle The title to display in the title bar + * @return The title bar element + */ + createTitleBar : function(strTitle) { + var tDiv = Dom.getElementsByClassName(YAHOO.widget.CalendarGroup.CSS_2UPTITLE, "div", this.oDomContainer)[0] || document.createElement("div"); + tDiv.className = YAHOO.widget.CalendarGroup.CSS_2UPTITLE; + tDiv.innerHTML = strTitle; + this.oDomContainer.insertBefore(tDiv, this.oDomContainer.firstChild); + + Dom.addClass(this.oDomContainer, "withtitle"); + + return tDiv; + }, + + /** + * Removes the title bar element from the DOM + * + * @method removeTitleBar + */ + removeTitleBar : function() { + var tDiv = Dom.getElementsByClassName(YAHOO.widget.CalendarGroup.CSS_2UPTITLE, "div", this.oDomContainer)[0] || null; + if (tDiv) { + Event.purgeElement(tDiv); + this.oDomContainer.removeChild(tDiv); + } + Dom.removeClass(this.oDomContainer, "withtitle"); + }, + + /** + * Creates the close button HTML element and adds it to Calendar container DIV + * + * @method createCloseButton + * @return The close HTML element created + */ + createCloseButton : function() { + var cssClose = YAHOO.widget.CalendarGroup.CSS_2UPCLOSE, + DEPR_CLOSE_PATH = "us/my/bn/x_d.gif", + lnk = Dom.getElementsByClassName("link-close", "a", this.oDomContainer)[0], + strings = this.cfg.getProperty(DEF_CFG.STRINGS.key), + closeStr = (strings && strings.close) ? strings.close : ""; + + if (!lnk) { + lnk = document.createElement("a"); + Event.addListener(lnk, "click", function(e, cal) { + cal.hide(); + Event.preventDefault(e); + }, this); + } + + lnk.href = "#"; + lnk.className = "link-close"; + + if (Calendar.IMG_ROOT !== null) { + var img = Dom.getElementsByClassName(cssClose, "img", lnk)[0] || document.createElement("img"); + img.src = Calendar.IMG_ROOT + DEPR_CLOSE_PATH; + img.className = cssClose; + lnk.appendChild(img); + } else { + lnk.innerHTML = '' + closeStr + ''; + } + this.oDomContainer.appendChild(lnk); + + return lnk; + }, + + /** + * Removes the close button HTML element from the DOM + * + * @method removeCloseButton + */ + removeCloseButton : function() { + var btn = Dom.getElementsByClassName("link-close", "a", this.oDomContainer)[0] || null; + if (btn) { + Event.purgeElement(btn); + this.oDomContainer.removeChild(btn); + } + }, + + /** + * Renders the calendar header. + * @method renderHeader + * @param {Array} html The current working HTML array + * @return {Array} The current working HTML array + */ + renderHeader : function(html) { + + this.logger.log("Rendering header", "render"); + + var colSpan = 7, + DEPR_NAV_LEFT = "us/tr/callt.gif", + DEPR_NAV_RIGHT = "us/tr/calrt.gif", + cfg = this.cfg, + pageDate = cfg.getProperty(DEF_CFG.PAGEDATE.key), + strings= cfg.getProperty(DEF_CFG.STRINGS.key), + prevStr = (strings && strings.previousMonth) ? strings.previousMonth : "", + nextStr = (strings && strings.nextMonth) ? strings.nextMonth : "", + monthLabel; + + if (cfg.getProperty(DEF_CFG.SHOW_WEEK_HEADER.key)) { + colSpan += 1; + } + + if (cfg.getProperty(DEF_CFG.SHOW_WEEK_FOOTER.key)) { + colSpan += 1; + } + + html[html.length] = ""; + html[html.length] = ""; + html[html.length] = ''; + html[html.length] = '
    '; + + var renderLeft, renderRight = false; + + if (this.parent) { + if (this.index === 0) { + renderLeft = true; + } + if (this.index == (this.parent.cfg.getProperty("pages") -1)) { + renderRight = true; + } + } else { + renderLeft = true; + renderRight = true; + } + + if (renderLeft) { + monthLabel = this._buildMonthLabel(DateMath.subtract(pageDate, DateMath.MONTH, 1)); + + var leftArrow = cfg.getProperty(DEF_CFG.NAV_ARROW_LEFT.key); + // Check for deprecated customization - If someone set IMG_ROOT, but didn't set NAV_ARROW_LEFT, then set NAV_ARROW_LEFT to the old deprecated value + if (leftArrow === null && Calendar.IMG_ROOT !== null) { + leftArrow = Calendar.IMG_ROOT + DEPR_NAV_LEFT; + } + var leftStyle = (leftArrow === null) ? "" : ' style="background-image:url(' + leftArrow + ')"'; + html[html.length] = '' + prevStr + ' (' + monthLabel + ')' + ''; + } + + var lbl = this.buildMonthLabel(); + var cal = this.parent || this; + if (cal.cfg.getProperty("navigator")) { + lbl = "" + lbl + ""; + } + html[html.length] = lbl; + + if (renderRight) { + monthLabel = this._buildMonthLabel(DateMath.add(pageDate, DateMath.MONTH, 1)); + + var rightArrow = cfg.getProperty(DEF_CFG.NAV_ARROW_RIGHT.key); + if (rightArrow === null && Calendar.IMG_ROOT !== null) { + rightArrow = Calendar.IMG_ROOT + DEPR_NAV_RIGHT; + } + var rightStyle = (rightArrow === null) ? "" : ' style="background-image:url(' + rightArrow + ')"'; + html[html.length] = '' + nextStr + ' (' + monthLabel + ')' + ''; + } + + html[html.length] = '
    \n\n'; + + if (cfg.getProperty(DEF_CFG.SHOW_WEEKDAYS.key)) { + html = this.buildWeekdays(html); + } + + html[html.length] = ''; + + return html; + }, + + /** + * Renders the Calendar's weekday headers. + * @method buildWeekdays + * @param {Array} html The current working HTML array + * @return {Array} The current working HTML array + */ + buildWeekdays : function(html) { + + html[html.length] = ''; + + if (this.cfg.getProperty(DEF_CFG.SHOW_WEEK_HEADER.key)) { + html[html.length] = ' '; + } + + for(var i=0;i < this.Locale.LOCALE_WEEKDAYS.length; ++i) { + html[html.length] = '' + this.Locale.LOCALE_WEEKDAYS[i] + ''; + } + + if (this.cfg.getProperty(DEF_CFG.SHOW_WEEK_FOOTER.key)) { + html[html.length] = ' '; + } + + html[html.length] = ''; + + return html; + }, + + /** + * Renders the calendar body. + * @method renderBody + * @param {Date} workingDate The current working Date being used for the render process + * @param {Array} html The current working HTML array + * @return {Array} The current working HTML array + */ + renderBody : function(workingDate, html) { + this.logger.log("Rendering body", "render"); + + var startDay = this.cfg.getProperty(DEF_CFG.START_WEEKDAY.key); + + this.preMonthDays = workingDate.getDay(); + if (startDay > 0) { + this.preMonthDays -= startDay; + } + if (this.preMonthDays < 0) { + this.preMonthDays += 7; + } + + this.monthDays = DateMath.findMonthEnd(workingDate).getDate(); + this.postMonthDays = Calendar.DISPLAY_DAYS-this.preMonthDays-this.monthDays; + + this.logger.log(this.preMonthDays + " preciding out-of-month days", "render"); + this.logger.log(this.monthDays + " month days", "render"); + this.logger.log(this.postMonthDays + " post-month days", "render"); + + workingDate = DateMath.subtract(workingDate, DateMath.DAY, this.preMonthDays); + this.logger.log("Calendar page starts on " + workingDate, "render"); + + var weekNum, + weekClass, + weekPrefix = "w", + cellPrefix = "_cell", + workingDayPrefix = "wd", + dayPrefix = "d", + cellRenderers, + renderer, + t = this.today, + cfg = this.cfg, + todayYear = t.getFullYear(), + todayMonth = t.getMonth(), + todayDate = t.getDate(), + useDate = cfg.getProperty(DEF_CFG.PAGEDATE.key), + hideBlankWeeks = cfg.getProperty(DEF_CFG.HIDE_BLANK_WEEKS.key), + showWeekFooter = cfg.getProperty(DEF_CFG.SHOW_WEEK_FOOTER.key), + showWeekHeader = cfg.getProperty(DEF_CFG.SHOW_WEEK_HEADER.key), + mindate = cfg.getProperty(DEF_CFG.MINDATE.key), + maxdate = cfg.getProperty(DEF_CFG.MAXDATE.key); + + if (mindate) { + mindate = DateMath.clearTime(mindate); + } + if (maxdate) { + maxdate = DateMath.clearTime(maxdate); + } + + html[html.length] = ''; + + var i = 0, + tempDiv = document.createElement("div"), + cell = document.createElement("td"); + + tempDiv.appendChild(cell); + + var cal = this.parent || this; + + for (var r=0;r<6;r++) { + weekNum = DateMath.getWeekNumber(workingDate, startDay); + weekClass = weekPrefix + weekNum; + + // Local OOM check for performance, since we already have pagedate + if (r !== 0 && hideBlankWeeks === true && workingDate.getMonth() != useDate.getMonth()) { + break; + } else { + html[html.length] = ''; + + if (showWeekHeader) { html = this.renderRowHeader(weekNum, html); } + + for (var d=0; d < 7; d++){ // Render actual days + + cellRenderers = []; + + this.clearElement(cell); + cell.className = this.Style.CSS_CELL; + cell.id = this.id + cellPrefix + i; + this.logger.log("Rendering cell " + cell.id + " (" + workingDate.getFullYear() + "-" + (workingDate.getMonth()+1) + "-" + workingDate.getDate() + ")", "cellrender"); + + if (workingDate.getDate() == todayDate && + workingDate.getMonth() == todayMonth && + workingDate.getFullYear() == todayYear) { + cellRenderers[cellRenderers.length]=cal.renderCellStyleToday; + } + + var workingArray = [workingDate.getFullYear(),workingDate.getMonth()+1,workingDate.getDate()]; + this.cellDates[this.cellDates.length] = workingArray; // Add this date to cellDates + + // Local OOM check for performance, since we already have pagedate + if (workingDate.getMonth() != useDate.getMonth()) { + cellRenderers[cellRenderers.length]=cal.renderCellNotThisMonth; + } else { + Dom.addClass(cell, workingDayPrefix + workingDate.getDay()); + Dom.addClass(cell, dayPrefix + workingDate.getDate()); + + for (var s=0;s= d1.getTime() && workingDate.getTime() <= d2.getTime()) { + renderer = rArray[2]; + + if (workingDate.getTime()==d2.getTime()) { + this.renderStack.splice(s,1); + } + } + break; + case Calendar.WEEKDAY: + var weekday = rArray[1][0]; + if (workingDate.getDay()+1 == weekday) { + renderer = rArray[2]; + } + break; + case Calendar.MONTH: + month = rArray[1][0]; + if (workingDate.getMonth()+1 == month) { + renderer = rArray[2]; + } + break; + } + + if (renderer) { + cellRenderers[cellRenderers.length]=renderer; + } + } + + } + + if (this._indexOfSelectedFieldArray(workingArray) > -1) { + cellRenderers[cellRenderers.length]=cal.renderCellStyleSelected; + } + + if ((mindate && (workingDate.getTime() < mindate.getTime())) || + (maxdate && (workingDate.getTime() > maxdate.getTime())) + ) { + cellRenderers[cellRenderers.length]=cal.renderOutOfBoundsDate; + } else { + cellRenderers[cellRenderers.length]=cal.styleCellDefault; + cellRenderers[cellRenderers.length]=cal.renderCellDefault; + } + + for (var x=0; x < cellRenderers.length; ++x) { + this.logger.log("renderer[" + x + "] for (" + workingDate.getFullYear() + "-" + (workingDate.getMonth()+1) + "-" + workingDate.getDate() + ")", "cellrender"); + if (cellRenderers[x].call(cal, workingDate, cell) == Calendar.STOP_RENDER) { + break; + } + } + + workingDate.setTime(workingDate.getTime() + DateMath.ONE_DAY_MS); + // Just in case we crossed DST/Summertime boundaries + workingDate = DateMath.clearTime(workingDate); + + if (i >= 0 && i <= 6) { + Dom.addClass(cell, this.Style.CSS_CELL_TOP); + } + if ((i % 7) === 0) { + Dom.addClass(cell, this.Style.CSS_CELL_LEFT); + } + if (((i+1) % 7) === 0) { + Dom.addClass(cell, this.Style.CSS_CELL_RIGHT); + } + + var postDays = this.postMonthDays; + if (hideBlankWeeks && postDays >= 7) { + var blankWeeks = Math.floor(postDays/7); + for (var p=0;p= ((this.preMonthDays+postDays+this.monthDays)-7)) { + Dom.addClass(cell, this.Style.CSS_CELL_BOTTOM); + } + + html[html.length] = tempDiv.innerHTML; + i++; + } + + if (showWeekFooter) { html = this.renderRowFooter(weekNum, html); } + + html[html.length] = ''; + } + } + + html[html.length] = ''; + + return html; + }, + + /** + * Renders the calendar footer. In the default implementation, there is + * no footer. + * @method renderFooter + * @param {Array} html The current working HTML array + * @return {Array} The current working HTML array + */ + renderFooter : function(html) { return html; }, + + /** + * Renders the calendar after it has been configured. The render() method has a specific call chain that will execute + * when the method is called: renderHeader, renderBody, renderFooter. + * Refer to the documentation for those methods for information on + * individual render tasks. + * @method render + */ + render : function() { + this.beforeRenderEvent.fire(); + + // Find starting day of the current month + var workingDate = DateMath.findMonthStart(this.cfg.getProperty(DEF_CFG.PAGEDATE.key)); + + this.resetRenderers(); + this.cellDates.length = 0; + + Event.purgeElement(this.oDomContainer, true); + + var html = []; + + html[html.length] = ''; + html = this.renderHeader(html); + html = this.renderBody(workingDate, html); + html = this.renderFooter(html); + html[html.length] = '
    '; + + this.oDomContainer.innerHTML = html.join("\n"); + + this.applyListeners(); + this.cells = this.oDomContainer.getElementsByTagName("td"); + + this.cfg.refireEvent(DEF_CFG.TITLE.key); + this.cfg.refireEvent(DEF_CFG.CLOSE.key); + this.cfg.refireEvent(DEF_CFG.IFRAME.key); + + this.renderEvent.fire(); + }, + + /** + * Applies the Calendar's DOM listeners to applicable elements. + * @method applyListeners + */ + applyListeners : function() { + var root = this.oDomContainer, + cal = this.parent || this, + anchor = "a", + click = "click"; + + var linkLeft = Dom.getElementsByClassName(this.Style.CSS_NAV_LEFT, anchor, root), + linkRight = Dom.getElementsByClassName(this.Style.CSS_NAV_RIGHT, anchor, root); + + if (linkLeft && linkLeft.length > 0) { + this.linkLeft = linkLeft[0]; + Event.addListener(this.linkLeft, click, this.doPreviousMonthNav, cal, true); + } + + if (linkRight && linkRight.length > 0) { + this.linkRight = linkRight[0]; + Event.addListener(this.linkRight, click, this.doNextMonthNav, cal, true); + } + + if (cal.cfg.getProperty("navigator") !== null) { + this.applyNavListeners(); + } + + if (this.domEventMap) { + var el,elements; + for (var cls in this.domEventMap) { + if (Lang.hasOwnProperty(this.domEventMap, cls)) { + var items = this.domEventMap[cls]; + + if (! (items instanceof Array)) { + items = [items]; + } + + for (var i=0;i 0) { + + Event.addListener(navBtns, "click", function (e, obj) { + var target = Event.getTarget(e); + // this == navBtn + if (this === target || Dom.isAncestor(this, target)) { + Event.preventDefault(e); + } + var navigator = calParent.oNavigator; + if (navigator) { + var pgdate = cal.cfg.getProperty("pagedate"); + navigator.setYear(pgdate.getFullYear()); + navigator.setMonth(pgdate.getMonth()); + navigator.show(); + } + }); + } + }, + + /** + * Retrieves the Date object for the specified Calendar cell + * @method getDateByCellId + * @param {String} id The id of the cell + * @return {Date} The Date object for the specified Calendar cell + */ + getDateByCellId : function(id) { + var date = this.getDateFieldsByCellId(id); + return (date) ? DateMath.getDate(date[0],date[1]-1,date[2]) : null; + }, + + /** + * Retrieves the Date object for the specified Calendar cell + * @method getDateFieldsByCellId + * @param {String} id The id of the cell + * @return {Array} The array of Date fields for the specified Calendar cell + */ + getDateFieldsByCellId : function(id) { + id = this.getIndexFromId(id); + return (id > -1) ? this.cellDates[id] : null; + }, + + /** + * Find the Calendar's cell index for a given date. + * If the date is not found, the method returns -1. + *

    + * The returned index can be used to lookup the cell HTMLElement + * using the Calendar's cells array or passed to selectCell to select + * cells by index. + *

    + * + * See cells, selectCell. + * + * @method getCellIndex + * @param {Date} date JavaScript Date object, for which to find a cell index. + * @return {Number} The index of the date in Calendars cellDates/cells arrays, or -1 if the date + * is not on the curently rendered Calendar page. + */ + getCellIndex : function(date) { + var idx = -1; + if (date) { + var m = date.getMonth(), + y = date.getFullYear(), + d = date.getDate(), + dates = this.cellDates; + + for (var i = 0; i < dates.length; ++i) { + var cellDate = dates[i]; + if (cellDate[0] === y && cellDate[1] === m+1 && cellDate[2] === d) { + idx = i; + break; + } + } + } + return idx; + }, + + /** + * Given the id used to mark each Calendar cell, this method + * extracts the index number from the id. + * + * @param {String} strId The cell id + * @return {Number} The index of the cell, or -1 if id does not contain an index number + */ + getIndexFromId : function(strId) { + var idx = -1, + li = strId.lastIndexOf("_cell"); + + if (li > -1) { + idx = parseInt(strId.substring(li + 5), 10); + } + + return idx; + }, + + // BEGIN BUILT-IN TABLE CELL RENDERERS + + /** + * Renders a cell that falls before the minimum date or after the maximum date. + * widget class. + * @method renderOutOfBoundsDate + * @param {Date} workingDate The current working Date object being used to generate the calendar + * @param {HTMLTableCellElement} cell The current working cell in the calendar + * @return {String} YAHOO.widget.Calendar.STOP_RENDER if rendering should stop with this style, null or nothing if rendering + * should not be terminated + */ + renderOutOfBoundsDate : function(workingDate, cell) { + Dom.addClass(cell, this.Style.CSS_CELL_OOB); + cell.innerHTML = workingDate.getDate(); + return Calendar.STOP_RENDER; + }, + + /** + * Renders the row header for a week. + * @method renderRowHeader + * @param {Number} weekNum The week number of the current row + * @param {Array} cell The current working HTML array + */ + renderRowHeader : function(weekNum, html) { + html[html.length] = '' + weekNum + ''; + return html; + }, + + /** + * Renders the row footer for a week. + * @method renderRowFooter + * @param {Number} weekNum The week number of the current row + * @param {Array} cell The current working HTML array + */ + renderRowFooter : function(weekNum, html) { + html[html.length] = '' + weekNum + ''; + return html; + }, + + /** + * Renders a single standard calendar cell in the calendar widget table. + * All logic for determining how a standard default cell will be rendered is + * encapsulated in this method, and must be accounted for when extending the + * widget class. + * @method renderCellDefault + * @param {Date} workingDate The current working Date object being used to generate the calendar + * @param {HTMLTableCellElement} cell The current working cell in the calendar + */ + renderCellDefault : function(workingDate, cell) { + cell.innerHTML = '' + this.buildDayLabel(workingDate) + ""; + }, + + /** + * Styles a selectable cell. + * @method styleCellDefault + * @param {Date} workingDate The current working Date object being used to generate the calendar + * @param {HTMLTableCellElement} cell The current working cell in the calendar + */ + styleCellDefault : function(workingDate, cell) { + Dom.addClass(cell, this.Style.CSS_CELL_SELECTABLE); + }, + + + /** + * Renders a single standard calendar cell using the CSS hightlight1 style + * @method renderCellStyleHighlight1 + * @param {Date} workingDate The current working Date object being used to generate the calendar + * @param {HTMLTableCellElement} cell The current working cell in the calendar + */ + renderCellStyleHighlight1 : function(workingDate, cell) { + Dom.addClass(cell, this.Style.CSS_CELL_HIGHLIGHT1); + }, + + /** + * Renders a single standard calendar cell using the CSS hightlight2 style + * @method renderCellStyleHighlight2 + * @param {Date} workingDate The current working Date object being used to generate the calendar + * @param {HTMLTableCellElement} cell The current working cell in the calendar + */ + renderCellStyleHighlight2 : function(workingDate, cell) { + Dom.addClass(cell, this.Style.CSS_CELL_HIGHLIGHT2); + }, + + /** + * Renders a single standard calendar cell using the CSS hightlight3 style + * @method renderCellStyleHighlight3 + * @param {Date} workingDate The current working Date object being used to generate the calendar + * @param {HTMLTableCellElement} cell The current working cell in the calendar + */ + renderCellStyleHighlight3 : function(workingDate, cell) { + Dom.addClass(cell, this.Style.CSS_CELL_HIGHLIGHT3); + }, + + /** + * Renders a single standard calendar cell using the CSS hightlight4 style + * @method renderCellStyleHighlight4 + * @param {Date} workingDate The current working Date object being used to generate the calendar + * @param {HTMLTableCellElement} cell The current working cell in the calendar + */ + renderCellStyleHighlight4 : function(workingDate, cell) { + Dom.addClass(cell, this.Style.CSS_CELL_HIGHLIGHT4); + }, + + /** + * Applies the default style used for rendering today's date to the current calendar cell + * @method renderCellStyleToday + * @param {Date} workingDate The current working Date object being used to generate the calendar + * @param {HTMLTableCellElement} cell The current working cell in the calendar + */ + renderCellStyleToday : function(workingDate, cell) { + Dom.addClass(cell, this.Style.CSS_CELL_TODAY); + }, + + /** + * Applies the default style used for rendering selected dates to the current calendar cell + * @method renderCellStyleSelected + * @param {Date} workingDate The current working Date object being used to generate the calendar + * @param {HTMLTableCellElement} cell The current working cell in the calendar + * @return {String} YAHOO.widget.Calendar.STOP_RENDER if rendering should stop with this style, null or nothing if rendering + * should not be terminated + */ + renderCellStyleSelected : function(workingDate, cell) { + Dom.addClass(cell, this.Style.CSS_CELL_SELECTED); + }, + + /** + * Applies the default style used for rendering dates that are not a part of the current + * month (preceding or trailing the cells for the current month) + * @method renderCellNotThisMonth + * @param {Date} workingDate The current working Date object being used to generate the calendar + * @param {HTMLTableCellElement} cell The current working cell in the calendar + * @return {String} YAHOO.widget.Calendar.STOP_RENDER if rendering should stop with this style, null or nothing if rendering + * should not be terminated + */ + renderCellNotThisMonth : function(workingDate, cell) { + Dom.addClass(cell, this.Style.CSS_CELL_OOM); + cell.innerHTML=workingDate.getDate(); + return Calendar.STOP_RENDER; + }, + + /** + * Renders the current calendar cell as a non-selectable "black-out" date using the default + * restricted style. + * @method renderBodyCellRestricted + * @param {Date} workingDate The current working Date object being used to generate the calendar + * @param {HTMLTableCellElement} cell The current working cell in the calendar + * @return {String} YAHOO.widget.Calendar.STOP_RENDER if rendering should stop with this style, null or nothing if rendering + * should not be terminated + */ + renderBodyCellRestricted : function(workingDate, cell) { + Dom.addClass(cell, this.Style.CSS_CELL); + Dom.addClass(cell, this.Style.CSS_CELL_RESTRICTED); + cell.innerHTML=workingDate.getDate(); + return Calendar.STOP_RENDER; + }, + + // END BUILT-IN TABLE CELL RENDERERS + + // BEGIN MONTH NAVIGATION METHODS + + /** + * Adds the designated number of months to the current calendar month, and sets the current + * calendar page date to the new month. + * @method addMonths + * @param {Number} count The number of months to add to the current calendar + */ + addMonths : function(count) { + var cfgPageDate = DEF_CFG.PAGEDATE.key; + this.cfg.setProperty(cfgPageDate, DateMath.add(this.cfg.getProperty(cfgPageDate), DateMath.MONTH, count)); + this.resetRenderers(); + this.changePageEvent.fire(); + }, + + /** + * Subtracts the designated number of months from the current calendar month, and sets the current + * calendar page date to the new month. + * @method subtractMonths + * @param {Number} count The number of months to subtract from the current calendar + */ + subtractMonths : function(count) { + var cfgPageDate = DEF_CFG.PAGEDATE.key; + this.cfg.setProperty(cfgPageDate, DateMath.subtract(this.cfg.getProperty(cfgPageDate), DateMath.MONTH, count)); + this.resetRenderers(); + this.changePageEvent.fire(); + }, + + /** + * Adds the designated number of years to the current calendar, and sets the current + * calendar page date to the new month. + * @method addYears + * @param {Number} count The number of years to add to the current calendar + */ + addYears : function(count) { + var cfgPageDate = DEF_CFG.PAGEDATE.key; + this.cfg.setProperty(cfgPageDate, DateMath.add(this.cfg.getProperty(cfgPageDate), DateMath.YEAR, count)); + this.resetRenderers(); + this.changePageEvent.fire(); + }, + + /** + * Subtcats the designated number of years from the current calendar, and sets the current + * calendar page date to the new month. + * @method subtractYears + * @param {Number} count The number of years to subtract from the current calendar + */ + subtractYears : function(count) { + var cfgPageDate = DEF_CFG.PAGEDATE.key; + this.cfg.setProperty(cfgPageDate, DateMath.subtract(this.cfg.getProperty(cfgPageDate), DateMath.YEAR, count)); + this.resetRenderers(); + this.changePageEvent.fire(); + }, + + /** + * Navigates to the next month page in the calendar widget. + * @method nextMonth + */ + nextMonth : function() { + this.addMonths(1); + }, + + /** + * Navigates to the previous month page in the calendar widget. + * @method previousMonth + */ + previousMonth : function() { + this.subtractMonths(1); + }, + + /** + * Navigates to the next year in the currently selected month in the calendar widget. + * @method nextYear + */ + nextYear : function() { + this.addYears(1); + }, + + /** + * Navigates to the previous year in the currently selected month in the calendar widget. + * @method previousYear + */ + previousYear : function() { + this.subtractYears(1); + }, + + // END MONTH NAVIGATION METHODS + + // BEGIN SELECTION METHODS + + /** + * Resets the calendar widget to the originally selected month and year, and + * sets the calendar to the initial selection(s). + * @method reset + */ + reset : function() { + this.cfg.resetProperty(DEF_CFG.SELECTED.key); + this.cfg.resetProperty(DEF_CFG.PAGEDATE.key); + this.resetEvent.fire(); + }, + + /** + * Clears the selected dates in the current calendar widget and sets the calendar + * to the current month and year. + * @method clear + */ + clear : function() { + this.cfg.setProperty(DEF_CFG.SELECTED.key, []); + this.cfg.setProperty(DEF_CFG.PAGEDATE.key, new Date(this.today.getTime())); + this.clearEvent.fire(); + }, + + /** + * Selects a date or a collection of dates on the current calendar. This method, by default, + * does not call the render method explicitly. Once selection has completed, render must be + * called for the changes to be reflected visually. + * + * Any dates which are OOB (out of bounds, not selectable) will not be selected and the array of + * selected dates passed to the selectEvent will not contain OOB dates. + * + * If all dates are OOB, the no state change will occur; beforeSelect and select events will not be fired. + * + * @method select + * @param {String/Date/Date[]} date The date string of dates to select in the current calendar. Valid formats are + * individual date(s) (12/24/2005,12/26/2005) or date range(s) (12/24/2005-1/1/2006). + * Multiple comma-delimited dates can also be passed to this method (12/24/2005,12/11/2005-12/13/2005). + * This method can also take a JavaScript Date object or an array of Date objects. + * @return {Date[]} Array of JavaScript Date objects representing all individual dates that are currently selected. + */ + select : function(date) { + this.logger.log("Select: " + date, "info"); + + var aToBeSelected = this._toFieldArray(date), + validDates = [], + selected = [], + cfgSelected = DEF_CFG.SELECTED.key; + + this.logger.log("Selection field array: " + aToBeSelected, "info"); + + for (var a=0; a < aToBeSelected.length; ++a) { + var toSelect = aToBeSelected[a]; + + if (!this.isDateOOB(this._toDate(toSelect))) { + + if (validDates.length === 0) { + this.beforeSelectEvent.fire(); + selected = this.cfg.getProperty(cfgSelected); + } + validDates.push(toSelect); + + if (this._indexOfSelectedFieldArray(toSelect) == -1) { + selected[selected.length] = toSelect; + } + } + } + + if (validDates.length === 0) { this.logger.log("All provided dates were OOB. beforeSelect and select events not fired", "info"); } + + if (validDates.length > 0) { + if (this.parent) { + this.parent.cfg.setProperty(cfgSelected, selected); + } else { + this.cfg.setProperty(cfgSelected, selected); + } + this.selectEvent.fire(validDates); + } + + return this.getSelectedDates(); + }, + + /** + * Selects a date on the current calendar by referencing the index of the cell that should be selected. + * This method is used to easily select a single cell (usually with a mouse click) without having to do + * a full render. The selected style is applied to the cell directly. + * + * If the cell is not marked with the CSS_CELL_SELECTABLE class (as is the case by default for out of month + * or out of bounds cells), it will not be selected and in such a case beforeSelect and select events will not be fired. + * + * @method selectCell + * @param {Number} cellIndex The index of the cell to select in the current calendar. + * @return {Date[]} Array of JavaScript Date objects representing all individual dates that are currently selected. + */ + selectCell : function(cellIndex) { + + var cell = this.cells[cellIndex], + cellDate = this.cellDates[cellIndex], + dCellDate = this._toDate(cellDate), + selectable = Dom.hasClass(cell, this.Style.CSS_CELL_SELECTABLE); + + this.logger.log("Select: " + dCellDate, "info"); + if (!selectable) {this.logger.log("The cell at cellIndex:" + cellIndex + " is not a selectable cell. beforeSelect, select events not fired", "info"); } + + if (selectable) { + + this.beforeSelectEvent.fire(); + + var cfgSelected = DEF_CFG.SELECTED.key; + var selected = this.cfg.getProperty(cfgSelected); + + var selectDate = cellDate.concat(); + + if (this._indexOfSelectedFieldArray(selectDate) == -1) { + selected[selected.length] = selectDate; + } + if (this.parent) { + this.parent.cfg.setProperty(cfgSelected, selected); + } else { + this.cfg.setProperty(cfgSelected, selected); + } + this.renderCellStyleSelected(dCellDate,cell); + this.selectEvent.fire([selectDate]); + + this.doCellMouseOut.call(cell, null, this); + } + + return this.getSelectedDates(); + }, + + /** + * Deselects a date or a collection of dates on the current calendar. This method, by default, + * does not call the render method explicitly. Once deselection has completed, render must be + * called for the changes to be reflected visually. + * + * The method will not attempt to deselect any dates which are OOB (out of bounds, and hence not selectable) + * and the array of deselected dates passed to the deselectEvent will not contain any OOB dates. + * + * If all dates are OOB, beforeDeselect and deselect events will not be fired. + * + * @method deselect + * @param {String/Date/Date[]} date The date string of dates to deselect in the current calendar. Valid formats are + * individual date(s) (12/24/2005,12/26/2005) or date range(s) (12/24/2005-1/1/2006). + * Multiple comma-delimited dates can also be passed to this method (12/24/2005,12/11/2005-12/13/2005). + * This method can also take a JavaScript Date object or an array of Date objects. + * @return {Date[]} Array of JavaScript Date objects representing all individual dates that are currently selected. + */ + deselect : function(date) { + this.logger.log("Deselect: " + date, "info"); + + var aToBeDeselected = this._toFieldArray(date), + validDates = [], + selected = [], + cfgSelected = DEF_CFG.SELECTED.key; + + this.logger.log("Deselection field array: " + aToBeDeselected, "info"); + + for (var a=0; a < aToBeDeselected.length; ++a) { + var toDeselect = aToBeDeselected[a]; + + if (!this.isDateOOB(this._toDate(toDeselect))) { + + if (validDates.length === 0) { + this.beforeDeselectEvent.fire(); + selected = this.cfg.getProperty(cfgSelected); + } + + validDates.push(toDeselect); + + var index = this._indexOfSelectedFieldArray(toDeselect); + if (index != -1) { + selected.splice(index,1); + } + } + } + + if (validDates.length === 0) { this.logger.log("All provided dates were OOB. beforeDeselect and deselect events not fired");} + + if (validDates.length > 0) { + if (this.parent) { + this.parent.cfg.setProperty(cfgSelected, selected); + } else { + this.cfg.setProperty(cfgSelected, selected); + } + this.deselectEvent.fire(validDates); + } + + return this.getSelectedDates(); + }, + + /** + * Deselects a date on the current calendar by referencing the index of the cell that should be deselected. + * This method is used to easily deselect a single cell (usually with a mouse click) without having to do + * a full render. The selected style is removed from the cell directly. + * + * If the cell is not marked with the CSS_CELL_SELECTABLE class (as is the case by default for out of month + * or out of bounds cells), the method will not attempt to deselect it and in such a case, beforeDeselect and + * deselect events will not be fired. + * + * @method deselectCell + * @param {Number} cellIndex The index of the cell to deselect in the current calendar. + * @return {Date[]} Array of JavaScript Date objects representing all individual dates that are currently selected. + */ + deselectCell : function(cellIndex) { + var cell = this.cells[cellIndex], + cellDate = this.cellDates[cellIndex], + cellDateIndex = this._indexOfSelectedFieldArray(cellDate); + + var selectable = Dom.hasClass(cell, this.Style.CSS_CELL_SELECTABLE); + if (!selectable) { this.logger.log("The cell at cellIndex:" + cellIndex + " is not a selectable/deselectable cell", "info"); } + + if (selectable) { + + this.beforeDeselectEvent.fire(); + + var selected = this.cfg.getProperty(DEF_CFG.SELECTED.key), + dCellDate = this._toDate(cellDate), + selectDate = cellDate.concat(); + + if (cellDateIndex > -1) { + if (this.cfg.getProperty(DEF_CFG.PAGEDATE.key).getMonth() == dCellDate.getMonth() && + this.cfg.getProperty(DEF_CFG.PAGEDATE.key).getFullYear() == dCellDate.getFullYear()) { + Dom.removeClass(cell, this.Style.CSS_CELL_SELECTED); + } + selected.splice(cellDateIndex, 1); + } + + if (this.parent) { + this.parent.cfg.setProperty(DEF_CFG.SELECTED.key, selected); + } else { + this.cfg.setProperty(DEF_CFG.SELECTED.key, selected); + } + + this.deselectEvent.fire(selectDate); + } + + return this.getSelectedDates(); + }, + + /** + * Deselects all dates on the current calendar. + * @method deselectAll + * @return {Date[]} Array of JavaScript Date objects representing all individual dates that are currently selected. + * Assuming that this function executes properly, the return value should be an empty array. + * However, the empty array is returned for the sake of being able to check the selection status + * of the calendar. + */ + deselectAll : function() { + this.beforeDeselectEvent.fire(); + + var cfgSelected = DEF_CFG.SELECTED.key, + selected = this.cfg.getProperty(cfgSelected), + count = selected.length, + sel = selected.concat(); + + if (this.parent) { + this.parent.cfg.setProperty(cfgSelected, []); + } else { + this.cfg.setProperty(cfgSelected, []); + } + + if (count > 0) { + this.deselectEvent.fire(sel); + } + + return this.getSelectedDates(); + }, + + // END SELECTION METHODS + + // BEGIN TYPE CONVERSION METHODS + + /** + * Converts a date (either a JavaScript Date object, or a date string) to the internal data structure + * used to represent dates: [[yyyy,mm,dd],[yyyy,mm,dd]]. + * @method _toFieldArray + * @private + * @param {String/Date/Date[]} date The date string of dates to deselect in the current calendar. Valid formats are + * individual date(s) (12/24/2005,12/26/2005) or date range(s) (12/24/2005-1/1/2006). + * Multiple comma-delimited dates can also be passed to this method (12/24/2005,12/11/2005-12/13/2005). + * This method can also take a JavaScript Date object or an array of Date objects. + * @return {Array[](Number[])} Array of date field arrays + */ + _toFieldArray : function(date) { + var returnDate = []; + + if (date instanceof Date) { + returnDate = [[date.getFullYear(), date.getMonth()+1, date.getDate()]]; + } else if (Lang.isString(date)) { + returnDate = this._parseDates(date); + } else if (Lang.isArray(date)) { + for (var i=0;i maxDate.getTime())); + }, + + /** + * Parses a pagedate configuration property value. The value can either be specified as a string of form "mm/yyyy" or a Date object + * and is parsed into a Date object normalized to the first day of the month. If no value is passed in, the month and year from today's date are used to create the Date object + * @method _parsePageDate + * @private + * @param {Date|String} date Pagedate value which needs to be parsed + * @return {Date} The Date object representing the pagedate + */ + _parsePageDate : function(date) { + var parsedDate; + + if (date) { + if (date instanceof Date) { + parsedDate = DateMath.findMonthStart(date); + } else { + var month, year, aMonthYear; + aMonthYear = date.split(this.cfg.getProperty(DEF_CFG.DATE_FIELD_DELIMITER.key)); + month = parseInt(aMonthYear[this.cfg.getProperty(DEF_CFG.MY_MONTH_POSITION.key)-1], 10)-1; + year = parseInt(aMonthYear[this.cfg.getProperty(DEF_CFG.MY_YEAR_POSITION.key)-1], 10); + + parsedDate = DateMath.getDate(year, month, 1); + } + } else { + parsedDate = DateMath.getDate(this.today.getFullYear(), this.today.getMonth(), 1); + } + return parsedDate; + }, + + // END UTILITY METHODS + + // BEGIN EVENT HANDLERS + + /** + * Event executed before a date is selected in the calendar widget. + * @deprecated Event handlers for this event should be susbcribed to beforeSelectEvent. + */ + onBeforeSelect : function() { + if (this.cfg.getProperty(DEF_CFG.MULTI_SELECT.key) === false) { + if (this.parent) { + this.parent.callChildFunction("clearAllBodyCellStyles", this.Style.CSS_CELL_SELECTED); + this.parent.deselectAll(); + } else { + this.clearAllBodyCellStyles(this.Style.CSS_CELL_SELECTED); + this.deselectAll(); + } + } + }, + + /** + * Event executed when a date is selected in the calendar widget. + * @param {Array} selected An array of date field arrays representing which date or dates were selected. Example: [ [2006,8,6],[2006,8,7],[2006,8,8] ] + * @deprecated Event handlers for this event should be susbcribed to selectEvent. + */ + onSelect : function(selected) { }, + + /** + * Event executed before a date is deselected in the calendar widget. + * @deprecated Event handlers for this event should be susbcribed to beforeDeselectEvent. + */ + onBeforeDeselect : function() { }, + + /** + * Event executed when a date is deselected in the calendar widget. + * @param {Array} selected An array of date field arrays representing which date or dates were deselected. Example: [ [2006,8,6],[2006,8,7],[2006,8,8] ] + * @deprecated Event handlers for this event should be susbcribed to deselectEvent. + */ + onDeselect : function(deselected) { }, + + /** + * Event executed when the user navigates to a different calendar page. + * @deprecated Event handlers for this event should be susbcribed to changePageEvent. + */ + onChangePage : function() { + this.render(); + }, + + /** + * Event executed when the calendar widget is rendered. + * @deprecated Event handlers for this event should be susbcribed to renderEvent. + */ + onRender : function() { }, + + /** + * Event executed when the calendar widget is reset to its original state. + * @deprecated Event handlers for this event should be susbcribed to resetEvemt. + */ + onReset : function() { this.render(); }, + + /** + * Event executed when the calendar widget is completely cleared to the current month with no selections. + * @deprecated Event handlers for this event should be susbcribed to clearEvent. + */ + onClear : function() { this.render(); }, + + /** + * Validates the calendar widget. This method has no default implementation + * and must be extended by subclassing the widget. + * @return Should return true if the widget validates, and false if + * it doesn't. + * @type Boolean + */ + validate : function() { return true; }, + + // END EVENT HANDLERS + + // BEGIN DATE PARSE METHODS + + /** + * Converts a date string to a date field array + * @private + * @param {String} sDate Date string. Valid formats are mm/dd and mm/dd/yyyy. + * @return A date field array representing the string passed to the method + * @type Array[](Number[]) + */ + _parseDate : function(sDate) { + var aDate = sDate.split(this.Locale.DATE_FIELD_DELIMITER), + rArray; + + if (aDate.length == 2) { + rArray = [aDate[this.Locale.MD_MONTH_POSITION-1],aDate[this.Locale.MD_DAY_POSITION-1]]; + rArray.type = Calendar.MONTH_DAY; + } else { + rArray = [aDate[this.Locale.MDY_YEAR_POSITION-1],aDate[this.Locale.MDY_MONTH_POSITION-1],aDate[this.Locale.MDY_DAY_POSITION-1]]; + rArray.type = Calendar.DATE; + } + + for (var i=0;i +*
    +*
    +* +* The tables for the calendars ("cal1_0" and "cal1_1") will be inserted into those containers. +* +*

    +* NOTE: As of 2.4.0, the constructor's ID argument is optional. +* The CalendarGroup can be constructed by simply providing a container ID string, +* or a reference to a container DIV HTMLElement (the element needs to exist +* in the document). +* +* E.g.: +*

    +* var c = new YAHOO.widget.CalendarGroup("calContainer", configOptions); +* +* or: +* +* var containerDiv = YAHOO.util.Dom.get("calContainer"); +* var c = new YAHOO.widget.CalendarGroup(containerDiv, configOptions); +* +*

    +*

    +* If not provided, the ID will be generated from the container DIV ID by adding an "_t" suffix. +* For example if an ID is not provided, and the container's ID is "calContainer", the CalendarGroup's ID will be set to "calContainer_t". +*

    +* +* @namespace YAHOO.widget +* @class CalendarGroup +* @constructor +* @param {String} id optional The id of the table element that will represent the CalendarGroup widget. As of 2.4.0, this argument is optional. +* @param {String | HTMLElement} container The id of the container div element that will wrap the CalendarGroup table, or a reference to a DIV element which exists in the document. +* @param {Object} config optional The configuration object containing the initial configuration values for the CalendarGroup. +*/ +function CalendarGroup(id, containerId, config) { + if (arguments.length > 0) { + this.init.apply(this, arguments); + } +} + +/** +* The set of default Config property keys and values for the CalendarGroup +* @property YAHOO.widget.CalendarGroup._DEFAULT_CONFIG +* @final +* @static +* @private +* @type Object +*/ +CalendarGroup._DEFAULT_CONFIG = Calendar._DEFAULT_CONFIG; +CalendarGroup._DEFAULT_CONFIG.PAGES = {key:"pages", value:2}; + +var DEF_CFG = CalendarGroup._DEFAULT_CONFIG; + +CalendarGroup.prototype = { + + /** + * Initializes the calendar group. All subclasses must call this method in order for the + * group to be initialized properly. + * @method init + * @param {String} id optional The id of the table element that will represent the CalendarGroup widget. As of 2.4.0, this argument is optional. + * @param {String | HTMLElement} container The id of the container div element that will wrap the CalendarGroup table, or a reference to a DIV element which exists in the document. + * @param {Object} config optional The configuration object containing the initial configuration values for the CalendarGroup. + */ + init : function(id, container, config) { + + // Normalize 2.4.0, pre 2.4.0 args + var nArgs = this._parseArgs(arguments); + + id = nArgs.id; + container = nArgs.container; + config = nArgs.config; + + this.oDomContainer = Dom.get(container); + if (!this.oDomContainer) { this.logger.log("Container not found in document.", "error"); } + + if (!this.oDomContainer.id) { + this.oDomContainer.id = Dom.generateId(); + } + if (!id) { + id = this.oDomContainer.id + "_t"; + } + + /** + * The unique id associated with the CalendarGroup + * @property id + * @type String + */ + this.id = id; + + /** + * The unique id associated with the CalendarGroup container + * @property containerId + * @type String + */ + this.containerId = this.oDomContainer.id; + + this.logger = new YAHOO.widget.LogWriter("CalendarGroup " + this.id); + this.initEvents(); + this.initStyles(); + + /** + * The collection of Calendar pages contained within the CalendarGroup + * @property pages + * @type YAHOO.widget.Calendar[] + */ + this.pages = []; + + Dom.addClass(this.oDomContainer, CalendarGroup.CSS_CONTAINER); + Dom.addClass(this.oDomContainer, CalendarGroup.CSS_MULTI_UP); + + /** + * The Config object used to hold the configuration variables for the CalendarGroup + * @property cfg + * @type YAHOO.util.Config + */ + this.cfg = new YAHOO.util.Config(this); + + /** + * The local object which contains the CalendarGroup's options + * @property Options + * @type Object + */ + this.Options = {}; + + /** + * The local object which contains the CalendarGroup's locale settings + * @property Locale + * @type Object + */ + this.Locale = {}; + + this.setupConfig(); + + if (config) { + this.cfg.applyConfig(config, true); + } + + this.cfg.fireQueue(); + + // OPERA HACK FOR MISWRAPPED FLOATS + if (YAHOO.env.ua.opera){ + this.renderEvent.subscribe(this._fixWidth, this, true); + this.showEvent.subscribe(this._fixWidth, this, true); + } + + this.logger.log("Initialized " + this.pages.length + "-page CalendarGroup", "info"); + }, + + setupConfig : function() { + + var cfg = this.cfg; + + /** + * The number of pages to include in the CalendarGroup. This value can only be set once, in the CalendarGroup's constructor arguments. + * @config pages + * @type Number + * @default 2 + */ + cfg.addProperty(DEF_CFG.PAGES.key, { value:DEF_CFG.PAGES.value, validator:cfg.checkNumber, handler:this.configPages } ); + + /** + * The month/year representing the current visible Calendar date (mm/yyyy) + * @config pagedate + * @type String | Date + * @default today's date + */ + cfg.addProperty(DEF_CFG.PAGEDATE.key, { value:new Date(), handler:this.configPageDate } ); + + /** + * The date or range of dates representing the current Calendar selection + * + * @config selected + * @type String + * @default [] + */ + cfg.addProperty(DEF_CFG.SELECTED.key, { value:[], handler:this.configSelected } ); + + /** + * The title to display above the CalendarGroup's month header + * @config title + * @type String + * @default "" + */ + cfg.addProperty(DEF_CFG.TITLE.key, { value:DEF_CFG.TITLE.value, handler:this.configTitle } ); + + /** + * Whether or not a close button should be displayed for this CalendarGroup + * @config close + * @type Boolean + * @default false + */ + cfg.addProperty(DEF_CFG.CLOSE.key, { value:DEF_CFG.CLOSE.value, handler:this.configClose } ); + + /** + * Whether or not an iframe shim should be placed under the Calendar to prevent select boxes from bleeding through in Internet Explorer 6 and below. + * This property is enabled by default for IE6 and below. It is disabled by default for other browsers for performance reasons, but can be + * enabled if required. + * + * @config iframe + * @type Boolean + * @default true for IE6 and below, false for all other browsers + */ + cfg.addProperty(DEF_CFG.IFRAME.key, { value:DEF_CFG.IFRAME.value, handler:this.configIframe, validator:cfg.checkBoolean } ); + + /** + * The minimum selectable date in the current Calendar (mm/dd/yyyy) + * @config mindate + * @type String | Date + * @default null + */ + cfg.addProperty(DEF_CFG.MINDATE.key, { value:DEF_CFG.MINDATE.value, handler:this.delegateConfig } ); + + /** + * The maximum selectable date in the current Calendar (mm/dd/yyyy) + * @config maxdate + * @type String | Date + * @default null + */ + cfg.addProperty(DEF_CFG.MAXDATE.key, { value:DEF_CFG.MAXDATE.value, handler:this.delegateConfig } ); + + // Options properties + + /** + * True if the Calendar should allow multiple selections. False by default. + * @config MULTI_SELECT + * @type Boolean + * @default false + */ + cfg.addProperty(DEF_CFG.MULTI_SELECT.key, { value:DEF_CFG.MULTI_SELECT.value, handler:this.delegateConfig, validator:cfg.checkBoolean } ); + + /** + * The weekday the week begins on. Default is 0 (Sunday). + * @config START_WEEKDAY + * @type number + * @default 0 + */ + cfg.addProperty(DEF_CFG.START_WEEKDAY.key, { value:DEF_CFG.START_WEEKDAY.value, handler:this.delegateConfig, validator:cfg.checkNumber } ); + + /** + * True if the Calendar should show weekday labels. True by default. + * @config SHOW_WEEKDAYS + * @type Boolean + * @default true + */ + cfg.addProperty(DEF_CFG.SHOW_WEEKDAYS.key, { value:DEF_CFG.SHOW_WEEKDAYS.value, handler:this.delegateConfig, validator:cfg.checkBoolean } ); + + /** + * True if the Calendar should show week row headers. False by default. + * @config SHOW_WEEK_HEADER + * @type Boolean + * @default false + */ + cfg.addProperty(DEF_CFG.SHOW_WEEK_HEADER.key,{ value:DEF_CFG.SHOW_WEEK_HEADER.value, handler:this.delegateConfig, validator:cfg.checkBoolean } ); + + /** + * True if the Calendar should show week row footers. False by default. + * @config SHOW_WEEK_FOOTER + * @type Boolean + * @default false + */ + cfg.addProperty(DEF_CFG.SHOW_WEEK_FOOTER.key,{ value:DEF_CFG.SHOW_WEEK_FOOTER.value, handler:this.delegateConfig, validator:cfg.checkBoolean } ); + + /** + * True if the Calendar should suppress weeks that are not a part of the current month. False by default. + * @config HIDE_BLANK_WEEKS + * @type Boolean + * @default false + */ + cfg.addProperty(DEF_CFG.HIDE_BLANK_WEEKS.key,{ value:DEF_CFG.HIDE_BLANK_WEEKS.value, handler:this.delegateConfig, validator:cfg.checkBoolean } ); + + /** + * The image that should be used for the left navigation arrow. + * @config NAV_ARROW_LEFT + * @type String + * @deprecated You can customize the image by overriding the default CSS class for the left arrow - "calnavleft" + * @default null + */ + cfg.addProperty(DEF_CFG.NAV_ARROW_LEFT.key, { value:DEF_CFG.NAV_ARROW_LEFT.value, handler:this.delegateConfig } ); + + /** + * The image that should be used for the right navigation arrow. + * @config NAV_ARROW_RIGHT + * @type String + * @deprecated You can customize the image by overriding the default CSS class for the right arrow - "calnavright" + * @default null + */ + cfg.addProperty(DEF_CFG.NAV_ARROW_RIGHT.key, { value:DEF_CFG.NAV_ARROW_RIGHT.value, handler:this.delegateConfig } ); + + // Locale properties + + /** + * The short month labels for the current locale. + * @config MONTHS_SHORT + * @type String[] + * @default ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] + */ + cfg.addProperty(DEF_CFG.MONTHS_SHORT.key, { value:DEF_CFG.MONTHS_SHORT.value, handler:this.delegateConfig } ); + + /** + * The long month labels for the current locale. + * @config MONTHS_LONG + * @type String[] + * @default ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" + */ + cfg.addProperty(DEF_CFG.MONTHS_LONG.key, { value:DEF_CFG.MONTHS_LONG.value, handler:this.delegateConfig } ); + + /** + * The 1-character weekday labels for the current locale. + * @config WEEKDAYS_1CHAR + * @type String[] + * @default ["S", "M", "T", "W", "T", "F", "S"] + */ + cfg.addProperty(DEF_CFG.WEEKDAYS_1CHAR.key, { value:DEF_CFG.WEEKDAYS_1CHAR.value, handler:this.delegateConfig } ); + + /** + * The short weekday labels for the current locale. + * @config WEEKDAYS_SHORT + * @type String[] + * @default ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"] + */ + cfg.addProperty(DEF_CFG.WEEKDAYS_SHORT.key, { value:DEF_CFG.WEEKDAYS_SHORT.value, handler:this.delegateConfig } ); + + /** + * The medium weekday labels for the current locale. + * @config WEEKDAYS_MEDIUM + * @type String[] + * @default ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"] + */ + cfg.addProperty(DEF_CFG.WEEKDAYS_MEDIUM.key, { value:DEF_CFG.WEEKDAYS_MEDIUM.value, handler:this.delegateConfig } ); + + /** + * The long weekday labels for the current locale. + * @config WEEKDAYS_LONG + * @type String[] + * @default ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"] + */ + cfg.addProperty(DEF_CFG.WEEKDAYS_LONG.key, { value:DEF_CFG.WEEKDAYS_LONG.value, handler:this.delegateConfig } ); + + /** + * The setting that determines which length of month labels should be used. Possible values are "short" and "long". + * @config LOCALE_MONTHS + * @type String + * @default "long" + */ + cfg.addProperty(DEF_CFG.LOCALE_MONTHS.key, { value:DEF_CFG.LOCALE_MONTHS.value, handler:this.delegateConfig } ); + + /** + * The setting that determines which length of weekday labels should be used. Possible values are "1char", "short", "medium", and "long". + * @config LOCALE_WEEKDAYS + * @type String + * @default "short" + */ + cfg.addProperty(DEF_CFG.LOCALE_WEEKDAYS.key, { value:DEF_CFG.LOCALE_WEEKDAYS.value, handler:this.delegateConfig } ); + + /** + * The value used to delimit individual dates in a date string passed to various Calendar functions. + * @config DATE_DELIMITER + * @type String + * @default "," + */ + cfg.addProperty(DEF_CFG.DATE_DELIMITER.key, { value:DEF_CFG.DATE_DELIMITER.value, handler:this.delegateConfig } ); + + /** + * The value used to delimit date fields in a date string passed to various Calendar functions. + * @config DATE_FIELD_DELIMITER + * @type String + * @default "/" + */ + cfg.addProperty(DEF_CFG.DATE_FIELD_DELIMITER.key,{ value:DEF_CFG.DATE_FIELD_DELIMITER.value, handler:this.delegateConfig } ); + + /** + * The value used to delimit date ranges in a date string passed to various Calendar functions. + * @config DATE_RANGE_DELIMITER + * @type String + * @default "-" + */ + cfg.addProperty(DEF_CFG.DATE_RANGE_DELIMITER.key,{ value:DEF_CFG.DATE_RANGE_DELIMITER.value, handler:this.delegateConfig } ); + + /** + * The position of the month in a month/year date string + * @config MY_MONTH_POSITION + * @type Number + * @default 1 + */ + cfg.addProperty(DEF_CFG.MY_MONTH_POSITION.key, { value:DEF_CFG.MY_MONTH_POSITION.value, handler:this.delegateConfig, validator:cfg.checkNumber } ); + + /** + * The position of the year in a month/year date string + * @config MY_YEAR_POSITION + * @type Number + * @default 2 + */ + cfg.addProperty(DEF_CFG.MY_YEAR_POSITION.key, { value:DEF_CFG.MY_YEAR_POSITION.value, handler:this.delegateConfig, validator:cfg.checkNumber } ); + + /** + * The position of the month in a month/day date string + * @config MD_MONTH_POSITION + * @type Number + * @default 1 + */ + cfg.addProperty(DEF_CFG.MD_MONTH_POSITION.key, { value:DEF_CFG.MD_MONTH_POSITION.value, handler:this.delegateConfig, validator:cfg.checkNumber } ); + + /** + * The position of the day in a month/year date string + * @config MD_DAY_POSITION + * @type Number + * @default 2 + */ + cfg.addProperty(DEF_CFG.MD_DAY_POSITION.key, { value:DEF_CFG.MD_DAY_POSITION.value, handler:this.delegateConfig, validator:cfg.checkNumber } ); + + /** + * The position of the month in a month/day/year date string + * @config MDY_MONTH_POSITION + * @type Number + * @default 1 + */ + cfg.addProperty(DEF_CFG.MDY_MONTH_POSITION.key, { value:DEF_CFG.MDY_MONTH_POSITION.value, handler:this.delegateConfig, validator:cfg.checkNumber } ); + + /** + * The position of the day in a month/day/year date string + * @config MDY_DAY_POSITION + * @type Number + * @default 2 + */ + cfg.addProperty(DEF_CFG.MDY_DAY_POSITION.key, { value:DEF_CFG.MDY_DAY_POSITION.value, handler:this.delegateConfig, validator:cfg.checkNumber } ); + + /** + * The position of the year in a month/day/year date string + * @config MDY_YEAR_POSITION + * @type Number + * @default 3 + */ + cfg.addProperty(DEF_CFG.MDY_YEAR_POSITION.key, { value:DEF_CFG.MDY_YEAR_POSITION.value, handler:this.delegateConfig, validator:cfg.checkNumber } ); + + /** + * The position of the month in the month year label string used as the Calendar header + * @config MY_LABEL_MONTH_POSITION + * @type Number + * @default 1 + */ + cfg.addProperty(DEF_CFG.MY_LABEL_MONTH_POSITION.key, { value:DEF_CFG.MY_LABEL_MONTH_POSITION.value, handler:this.delegateConfig, validator:cfg.checkNumber } ); + + /** + * The position of the year in the month year label string used as the Calendar header + * @config MY_LABEL_YEAR_POSITION + * @type Number + * @default 2 + */ + cfg.addProperty(DEF_CFG.MY_LABEL_YEAR_POSITION.key, { value:DEF_CFG.MY_LABEL_YEAR_POSITION.value, handler:this.delegateConfig, validator:cfg.checkNumber } ); + + /** + * The suffix used after the month when rendering the Calendar header + * @config MY_LABEL_MONTH_SUFFIX + * @type String + * @default " " + */ + cfg.addProperty(DEF_CFG.MY_LABEL_MONTH_SUFFIX.key, { value:DEF_CFG.MY_LABEL_MONTH_SUFFIX.value, handler:this.delegateConfig } ); + + /** + * The suffix used after the year when rendering the Calendar header + * @config MY_LABEL_YEAR_SUFFIX + * @type String + * @default "" + */ + cfg.addProperty(DEF_CFG.MY_LABEL_YEAR_SUFFIX.key, { value:DEF_CFG.MY_LABEL_YEAR_SUFFIX.value, handler:this.delegateConfig } ); + + /** + * Configuration for the Month Year Navigation UI. By default it is disabled + * @config NAV + * @type Object + * @default null + */ + cfg.addProperty(DEF_CFG.NAV.key, { value:DEF_CFG.NAV.value, handler:this.configNavigator } ); + + /** + * The map of UI strings which the CalendarGroup UI uses. + * + * @config strings + * @type {Object} + * @default An object with the properties shown below: + *
    + *
    previousMonth
    String : The string to use for the "Previous Month" navigation UI. Defaults to "Previous Month".
    + *
    nextMonth
    String : The string to use for the "Next Month" navigation UI. Defaults to "Next Month".
    + *
    close
    String : The string to use for the close button label. Defaults to "Close".
    + *
    + */ + cfg.addProperty(DEF_CFG.STRINGS.key, { + value:DEF_CFG.STRINGS.value, + handler:this.configStrings, + validator: function(val) { + return Lang.isObject(val); + }, + supercedes: DEF_CFG.STRINGS.supercedes + }); + }, + + /** + * Initializes CalendarGroup's built-in CustomEvents + * @method initEvents + */ + initEvents : function() { + + var me = this, + strEvent = "Event", + CE = YAHOO.util.CustomEvent; + + /** + * Proxy subscriber to subscribe to the CalendarGroup's child Calendars' CustomEvents + * @method sub + * @private + * @param {Function} fn The function to subscribe to this CustomEvent + * @param {Object} obj The CustomEvent's scope object + * @param {Boolean} bOverride Whether or not to apply scope correction + */ + var sub = function(fn, obj, bOverride) { + for (var p=0;p