From b484e522e82c38a066be18e40269a0c530b2a71c Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Wed, 17 Jul 2019 22:08:50 +0200 Subject: [PATCH] import v1.0.0-RC4 | 2009-05-20 --- Acl.php | 111 + BUGS | 0 CHANGELOG | 16 + CONTRIBUTORS | 19 + INSTALL | 5 + README | 1 + Setup.php | 261 + bootstrap.php | 26 + config.default.php | 94 + config.template.php | 95 + index.html | 43 + languages/de/lang.mo | Bin 0 -> 15318 bytes languages/de/lang.po | 887 + languages/en/lang.mo | Bin 0 -> 12643 bytes languages/en/lang.po | 764 + languages/es/lang.mo | Bin 0 -> 15320 bytes languages/es/lang.po | 871 + languages/nl/lang.mo | Bin 0 -> 12670 bytes languages/nl/lang.po | 722 + languages/pl/lang.mo | Bin 0 -> 13021 bytes languages/pl/lang.po | 774 + libs/MODIFICATIONS.txt | 5 + libs/Monkeys/AccessDeniedException.php | 18 + libs/Monkeys/BadUrlException.php | 19 + libs/Monkeys/Captcha/Image.php | 104 + libs/Monkeys/Controller/Action.php | 163 + libs/Monkeys/Controller/Error.php | 118 + libs/Monkeys/Controller/Plugin/Auth.php | 72 + libs/Monkeys/Db/Profiler.php | 24 + libs/Monkeys/Db/Table/Gateway.php | 18 + libs/Monkeys/Form/Decorator/Composite.php | 136 + libs/Monkeys/Form/Element/Captcha.php | 38 + libs/Monkeys/Form/Element/Checkbox.php | 23 + libs/Monkeys/Form/Element/Country.php | 41 + libs/Monkeys/Form/Element/Date.php | 164 + libs/Monkeys/Form/Element/File.php | 23 + libs/Monkeys/Form/Element/Language.php | 41 + libs/Monkeys/Form/Element/Password.php | 13 + libs/Monkeys/Form/Element/Radio.php | 23 + libs/Monkeys/Form/Element/Text.php | 22 + libs/Monkeys/Form/Element/Textarea.php | 23 + libs/Monkeys/Form/Element/Timezone.php | 54 + libs/Monkeys/Form/Element/zone.tab | 425 + .../OpenId/Provider/Storage/Database.php | 129 + .../Monkeys/Validate/PasswordConfirmation.php | 38 + libs/Monkeys/View/Helper/FormDateSelects.php | 281 + libs/Monkeys/View/Helper/GetBase.php | 26 + libs/Monkeys/fonts/Verdana.ttf | Bin 0 -> 139640 bytes libs/Monkeys/tests/names.txt | 14371 + libs/Monkeys/tests/words.txt | 234935 +++++++++++++++ libs/Zend/Acl.php | 1036 + libs/Zend/Acl/Assert/Interface.php | 64 + libs/Zend/Acl/Exception.php | 36 + libs/Zend/Acl/Resource.php | 65 + libs/Zend/Acl/Resource/Interface.php | 37 + libs/Zend/Acl/Role.php | 65 + libs/Zend/Acl/Role/Interface.php | 37 + libs/Zend/Acl/Role/Registry.php | 266 + libs/Zend/Acl/Role/Registry/Exception.php | 36 + libs/Zend/Amf/Constants.php | 79 + libs/Zend/Amf/Exception.php | 33 + libs/Zend/Amf/Parse/Amf0/Deserializer.php | 321 + libs/Zend/Amf/Parse/Amf0/Serializer.php | 289 + libs/Zend/Amf/Parse/Amf3/Deserializer.php | 410 + libs/Zend/Amf/Parse/Amf3/Serializer.php | 317 + libs/Zend/Amf/Parse/Deserializer.php | 64 + libs/Zend/Amf/Parse/InputStream.php | 38 + libs/Zend/Amf/Parse/OutputStream.php | 48 + libs/Zend/Amf/Parse/Serializer.php | 58 + libs/Zend/Amf/Parse/TypeLoader.php | 133 + libs/Zend/Amf/Request.php | 249 + libs/Zend/Amf/Request/Http.php | 79 + libs/Zend/Amf/Response.php | 193 + libs/Zend/Amf/Response/Http.php | 47 + libs/Zend/Amf/Server.php | 627 + libs/Zend/Amf/Server/Exception.php | 35 + libs/Zend/Amf/Util/BinaryStream.php | 278 + libs/Zend/Amf/Value/ByteArray.php | 57 + libs/Zend/Amf/Value/MessageBody.php | 181 + libs/Zend/Amf/Value/MessageHeader.php | 80 + .../Amf/Value/Messaging/AbstractMessage.php | 91 + .../Value/Messaging/AcknowledgeMessage.php | 59 + .../Zend/Amf/Value/Messaging/AsyncMessage.php | 42 + .../Amf/Value/Messaging/CommandMessage.php | 127 + .../Zend/Amf/Value/Messaging/ErrorMessage.php | 66 + .../Amf/Value/Messaging/RemotingMessage.php | 72 + libs/Zend/Amf/Value/TraitsInfo.php | 153 + libs/Zend/Auth.php | 161 + libs/Zend/Auth/Adapter/DbTable.php | 461 + libs/Zend/Auth/Adapter/Digest.php | 230 + libs/Zend/Auth/Adapter/Exception.php | 38 + libs/Zend/Auth/Adapter/Http.php | 847 + .../Auth/Adapter/Http/Resolver/Exception.php | 40 + libs/Zend/Auth/Adapter/Http/Resolver/File.php | 167 + .../Auth/Adapter/Http/Resolver/Interface.php | 47 + libs/Zend/Auth/Adapter/InfoCard.php | 261 + libs/Zend/Auth/Adapter/Interface.php | 46 + libs/Zend/Auth/Adapter/Ldap.php | 329 + libs/Zend/Auth/Adapter/OpenId.php | 284 + libs/Zend/Auth/Exception.php | 36 + libs/Zend/Auth/Result.php | 148 + libs/Zend/Auth/Storage/Exception.php | 38 + libs/Zend/Auth/Storage/Interface.php | 67 + libs/Zend/Auth/Storage/NonPersistent.php | 96 + libs/Zend/Auth/Storage/Session.php | 150 + libs/Zend/Cache.php | 245 + libs/Zend/Cache/Backend.php | 222 + libs/Zend/Cache/Backend/Apc.php | 354 + libs/Zend/Cache/Backend/ExtendedInterface.php | 125 + libs/Zend/Cache/Backend/File.php | 1003 + libs/Zend/Cache/Backend/Interface.php | 98 + libs/Zend/Cache/Backend/Memcached.php | 447 + libs/Zend/Cache/Backend/Sqlite.php | 678 + libs/Zend/Cache/Backend/Test.php | 269 + libs/Zend/Cache/Backend/TwoLevels.php | 501 + libs/Zend/Cache/Backend/Xcache.php | 215 + libs/Zend/Cache/Backend/ZendPlatform.php | 316 + libs/Zend/Cache/Core.php | 634 + libs/Zend/Cache/Exception.php | 31 + libs/Zend/Cache/Frontend/Class.php | 242 + libs/Zend/Cache/Frontend/File.php | 145 + libs/Zend/Cache/Frontend/Function.php | 130 + libs/Zend/Cache/Frontend/Output.php | 105 + libs/Zend/Cache/Frontend/Page.php | 395 + libs/Zend/Captcha/Adapter.php | 76 + libs/Zend/Captcha/Base.php | 176 + libs/Zend/Captcha/Dumb.php | 52 + libs/Zend/Captcha/Exception.php | 34 + libs/Zend/Captcha/Figlet.php | 85 + libs/Zend/Captcha/Image.php | 589 + libs/Zend/Captcha/ReCaptcha.php | 259 + libs/Zend/Captcha/Word.php | 356 + libs/Zend/Config.php | 433 + libs/Zend/Config/Exception.php | 32 + libs/Zend/Config/Ini.php | 254 + libs/Zend/Config/Writer.php | 101 + libs/Zend/Config/Writer/Array.php | 101 + libs/Zend/Config/Writer/Ini.php | 174 + libs/Zend/Config/Writer/Xml.php | 140 + libs/Zend/Config/Xml.php | 230 + libs/Zend/Console/Getopt.php | 954 + libs/Zend/Console/Getopt/Exception.php | 65 + libs/Zend/Controller/Action.php | 678 + libs/Zend/Controller/Action/Exception.php | 37 + .../Controller/Action/Helper/Abstract.php | 164 + .../Controller/Action/Helper/ActionStack.php | 138 + .../Controller/Action/Helper/AjaxContext.php | 77 + .../Action/Helper/AutoComplete/Abstract.php | 149 + .../Action/Helper/AutoCompleteDojo.php | 87 + .../Helper/AutoCompleteScriptaculous.php | 82 + .../Action/Helper/ContextSwitch.php | 1368 + .../Action/Helper/FlashMessenger.php | 266 + libs/Zend/Controller/Action/Helper/Json.php | 117 + .../Controller/Action/Helper/Redirector.php | 510 + libs/Zend/Controller/Action/Helper/Url.php | 117 + .../Controller/Action/Helper/ViewRenderer.php | 994 + libs/Zend/Controller/Action/HelperBroker.php | 380 + .../Action/HelperBroker/PriorityStack.php | 280 + libs/Zend/Controller/Dispatcher/Abstract.php | 439 + libs/Zend/Controller/Dispatcher/Exception.php | 36 + libs/Zend/Controller/Dispatcher/Interface.php | 204 + libs/Zend/Controller/Dispatcher/Standard.php | 488 + libs/Zend/Controller/Exception.php | 34 + libs/Zend/Controller/Front.php | 974 + libs/Zend/Controller/Plugin/Abstract.php | 150 + libs/Zend/Controller/Plugin/ActionStack.php | 245 + libs/Zend/Controller/Plugin/Broker.php | 363 + libs/Zend/Controller/Plugin/ErrorHandler.php | 257 + libs/Zend/Controller/Request/Abstract.php | 338 + libs/Zend/Controller/Request/Apache404.php | 84 + libs/Zend/Controller/Request/Exception.php | 36 + libs/Zend/Controller/Request/Http.php | 995 + libs/Zend/Controller/Request/HttpTestCase.php | 275 + libs/Zend/Controller/Request/Simple.php | 54 + libs/Zend/Controller/Response/Abstract.php | 755 + libs/Zend/Controller/Response/Cli.php | 67 + libs/Zend/Controller/Response/Exception.php | 34 + libs/Zend/Controller/Response/Http.php | 37 + .../Zend/Controller/Response/HttpTestCase.php | 129 + libs/Zend/Controller/Router/Abstract.php | 169 + libs/Zend/Controller/Router/Exception.php | 35 + libs/Zend/Controller/Router/Interface.php | 122 + libs/Zend/Controller/Router/Rewrite.php | 399 + libs/Zend/Controller/Router/Route.php | 313 + .../Zend/Controller/Router/Route/Abstract.php | 52 + libs/Zend/Controller/Router/Route/Chain.php | 135 + .../Zend/Controller/Router/Route/Hostname.php | 341 + .../Controller/Router/Route/Interface.php | 36 + libs/Zend/Controller/Router/Route/Module.php | 274 + libs/Zend/Controller/Router/Route/Regex.php | 230 + libs/Zend/Controller/Router/Route/Static.php | 116 + libs/Zend/Currency.php | 609 + libs/Zend/Currency/Exception.php | 37 + libs/Zend/Date.php | 4686 + libs/Zend/Date/Cities.php | 322 + libs/Zend/Date/DateObject.php | 1044 + libs/Zend/Date/Exception.php | 49 + libs/Zend/Db.php | 269 + libs/Zend/Db/Adapter/Abstract.php | 1144 + libs/Zend/Db/Adapter/Db2.php | 630 + libs/Zend/Db/Adapter/Db2/Exception.php | 43 + libs/Zend/Db/Adapter/Exception.php | 52 + libs/Zend/Db/Adapter/Mysqli.php | 498 + libs/Zend/Db/Adapter/Mysqli/Exception.php | 39 + libs/Zend/Db/Adapter/Oracle.php | 628 + libs/Zend/Db/Adapter/Oracle/Exception.php | 59 + libs/Zend/Db/Adapter/Pdo/Abstract.php | 326 + libs/Zend/Db/Adapter/Pdo/Ibm.php | 336 + libs/Zend/Db/Adapter/Pdo/Ibm/Db2.php | 228 + libs/Zend/Db/Adapter/Pdo/Ibm/Ids.php | 301 + libs/Zend/Db/Adapter/Pdo/Mssql.php | 363 + libs/Zend/Db/Adapter/Pdo/Mysql.php | 233 + libs/Zend/Db/Adapter/Pdo/Oci.php | 344 + libs/Zend/Db/Adapter/Pdo/Pgsql.php | 306 + libs/Zend/Db/Adapter/Pdo/Sqlite.php | 295 + libs/Zend/Db/Exception.php | 34 + libs/Zend/Db/Expr.php | 77 + libs/Zend/Db/Profiler.php | 460 + libs/Zend/Db/Profiler/Exception.php | 40 + libs/Zend/Db/Profiler/Firebug.php | 159 + libs/Zend/Db/Profiler/Query.php | 199 + libs/Zend/Db/Select.php | 1239 + libs/Zend/Db/Select/Exception.php | 38 + libs/Zend/Db/Statement.php | 448 + libs/Zend/Db/Statement/Db2.php | 354 + libs/Zend/Db/Statement/Db2/Exception.php | 56 + libs/Zend/Db/Statement/Exception.php | 38 + libs/Zend/Db/Statement/Interface.php | 202 + libs/Zend/Db/Statement/Mysqli.php | 363 + libs/Zend/Db/Statement/Mysqli/Exception.php | 36 + libs/Zend/Db/Statement/Oracle.php | 531 + libs/Zend/Db/Statement/Oracle/Exception.php | 58 + libs/Zend/Db/Statement/Pdo.php | 433 + libs/Zend/Db/Statement/Pdo/Ibm.php | 94 + libs/Zend/Db/Table.php | 39 + libs/Zend/Db/Table/Abstract.php | 1335 + libs/Zend/Db/Table/Exception.php | 37 + libs/Zend/Db/Table/Row.php | 42 + libs/Zend/Db/Table/Row/Abstract.php | 1121 + libs/Zend/Db/Table/Row/Exception.php | 37 + libs/Zend/Db/Table/Rowset.php | 43 + libs/Zend/Db/Table/Rowset/Abstract.php | 421 + libs/Zend/Db/Table/Rowset/Exception.php | 36 + libs/Zend/Db/Table/Select.php | 219 + libs/Zend/Db/Table/Select/Exception.php | 38 + libs/Zend/Debug.php | 107 + libs/Zend/Dojo.php | 87 + libs/Zend/Dojo/Data.php | 563 + libs/Zend/Dojo/Exception.php | 35 + libs/Zend/Dojo/Form.php | 89 + .../Form/Decorator/AccordionContainer.php | 43 + .../Dojo/Form/Decorator/AccordionPane.php | 43 + .../Dojo/Form/Decorator/BorderContainer.php | 43 + libs/Zend/Dojo/Form/Decorator/ContentPane.php | 43 + .../Dojo/Form/Decorator/DijitContainer.php | 200 + .../Zend/Dojo/Form/Decorator/DijitElement.php | 195 + libs/Zend/Dojo/Form/Decorator/DijitForm.php | 61 + .../Dojo/Form/Decorator/SplitContainer.php | 43 + .../Dojo/Form/Decorator/StackContainer.php | 44 + .../Zend/Dojo/Form/Decorator/TabContainer.php | 43 + libs/Zend/Dojo/Form/DisplayGroup.php | 68 + libs/Zend/Dojo/Form/Element/Button.php | 121 + libs/Zend/Dojo/Form/Element/CheckBox.php | 212 + libs/Zend/Dojo/Form/Element/ComboBox.php | 186 + .../Dojo/Form/Element/CurrencyTextBox.php | 120 + libs/Zend/Dojo/Form/Element/DateTextBox.php | 214 + libs/Zend/Dojo/Form/Element/Dijit.php | 188 + libs/Zend/Dojo/Form/Element/DijitMulti.php | 304 + libs/Zend/Dojo/Form/Element/Editor.php | 598 + .../Dojo/Form/Element/FilteringSelect.php | 48 + .../Dojo/Form/Element/HorizontalSlider.php | 208 + libs/Zend/Dojo/Form/Element/NumberSpinner.php | 245 + libs/Zend/Dojo/Form/Element/NumberTextBox.php | 173 + .../Dojo/Form/Element/PasswordTextBox.php | 42 + libs/Zend/Dojo/Form/Element/RadioButton.php | 42 + libs/Zend/Dojo/Form/Element/Slider.php | 199 + libs/Zend/Dojo/Form/Element/SubmitButton.php | 42 + libs/Zend/Dojo/Form/Element/TextBox.php | 164 + libs/Zend/Dojo/Form/Element/Textarea.php | 42 + libs/Zend/Dojo/Form/Element/TimeTextBox.php | 152 + .../Dojo/Form/Element/ValidationTextBox.php | 218 + .../Zend/Dojo/Form/Element/VerticalSlider.php | 208 + libs/Zend/Dojo/Form/SubForm.php | 94 + libs/Zend/Dojo/View/Exception.php | 6 + .../Dojo/View/Helper/AccordionContainer.php | 66 + libs/Zend/Dojo/View/Helper/AccordionPane.php | 66 + .../Zend/Dojo/View/Helper/BorderContainer.php | 79 + libs/Zend/Dojo/View/Helper/Button.php | 68 + libs/Zend/Dojo/View/Helper/CheckBox.php | 100 + libs/Zend/Dojo/View/Helper/ComboBox.php | 151 + libs/Zend/Dojo/View/Helper/ContentPane.php | 66 + .../Zend/Dojo/View/Helper/CurrencyTextBox.php | 68 + libs/Zend/Dojo/View/Helper/DateTextBox.php | 68 + libs/Zend/Dojo/View/Helper/Dijit.php | 311 + libs/Zend/Dojo/View/Helper/DijitContainer.php | 92 + libs/Zend/Dojo/View/Helper/Dojo.php | 176 + libs/Zend/Dojo/View/Helper/Dojo/Container.php | 1070 + libs/Zend/Dojo/View/Helper/Editor.php | 132 + .../Zend/Dojo/View/Helper/FilteringSelect.php | 63 + libs/Zend/Dojo/View/Helper/Form.php | 96 + .../Dojo/View/Helper/HorizontalSlider.php | 62 + libs/Zend/Dojo/View/Helper/NumberSpinner.php | 90 + libs/Zend/Dojo/View/Helper/NumberTextBox.php | 68 + .../Zend/Dojo/View/Helper/PasswordTextBox.php | 56 + libs/Zend/Dojo/View/Helper/RadioButton.php | 89 + libs/Zend/Dojo/View/Helper/SimpleTextarea.php | 77 + libs/Zend/Dojo/View/Helper/Slider.php | 239 + libs/Zend/Dojo/View/Helper/SplitContainer.php | 66 + libs/Zend/Dojo/View/Helper/StackContainer.php | 66 + libs/Zend/Dojo/View/Helper/SubmitButton.php | 58 + libs/Zend/Dojo/View/Helper/TabContainer.php | 66 + libs/Zend/Dojo/View/Helper/TextBox.php | 68 + libs/Zend/Dojo/View/Helper/Textarea.php | 80 + libs/Zend/Dojo/View/Helper/TimeTextBox.php | 68 + .../Dojo/View/Helper/ValidationTextBox.php | 68 + libs/Zend/Dojo/View/Helper/VerticalSlider.php | 62 + libs/Zend/Dom/Exception.php | 7 + libs/Zend/Dom/Query.php | 221 + libs/Zend/Dom/Query/Css2Xpath.php | 141 + libs/Zend/Dom/Query/Result.php | 183 + libs/Zend/Exception.php | 30 + libs/Zend/Feed.php | 404 + libs/Zend/Feed/Abstract.php | 259 + libs/Zend/Feed/Atom.php | 390 + libs/Zend/Feed/Builder.php | 395 + libs/Zend/Feed/Builder/Entry.php | 285 + libs/Zend/Feed/Builder/Exception.php | 40 + libs/Zend/Feed/Builder/Header.php | 420 + libs/Zend/Feed/Builder/Header/Itunes.php | 285 + libs/Zend/Feed/Builder/Interface.php | 52 + libs/Zend/Feed/Element.php | 408 + libs/Zend/Feed/Entry/Abstract.php | 124 + libs/Zend/Feed/Entry/Atom.php | 274 + libs/Zend/Feed/Entry/Rss.php | 122 + libs/Zend/Feed/Exception.php | 42 + libs/Zend/Feed/Rss.php | 504 + libs/Zend/File/Transfer.php | 57 + libs/Zend/File/Transfer/Adapter/Abstract.php | 1250 + libs/Zend/File/Transfer/Adapter/Http.php | 231 + libs/Zend/File/Transfer/Exception.php | 55 + libs/Zend/Filter.php | 115 + libs/Zend/Filter/Alnum.php | 115 + libs/Zend/Filter/Alpha.php | 115 + libs/Zend/Filter/BaseName.php | 50 + libs/Zend/Filter/Digits.php | 82 + libs/Zend/Filter/Dir.php | 50 + libs/Zend/Filter/Exception.php | 37 + libs/Zend/Filter/File/LowerCase.php | 72 + libs/Zend/Filter/File/Rename.php | 282 + libs/Zend/Filter/File/UpperCase.php | 72 + libs/Zend/Filter/HtmlEntities.php | 122 + libs/Zend/Filter/Inflector.php | 497 + libs/Zend/Filter/Input.php | 926 + libs/Zend/Filter/Int.php | 50 + libs/Zend/Filter/Interface.php | 40 + libs/Zend/Filter/PregReplace.php | 156 + libs/Zend/Filter/RealPath.php | 50 + libs/Zend/Filter/StringToLower.php | 76 + libs/Zend/Filter/StringToUpper.php | 76 + libs/Zend/Filter/StringTrim.php | 97 + libs/Zend/Filter/StripNewlines.php | 48 + libs/Zend/Filter/StripTags.php | 284 + libs/Zend/Filter/Word/CamelCaseToDash.php | 44 + .../Zend/Filter/Word/CamelCaseToSeparator.php | 49 + .../Filter/Word/CamelCaseToUnderscore.php | 44 + libs/Zend/Filter/Word/DashToCamelCase.php | 44 + libs/Zend/Filter/Word/DashToSeparator.php | 42 + libs/Zend/Filter/Word/DashToUnderscore.php | 45 + libs/Zend/Filter/Word/Separator/Abstract.php | 76 + .../Zend/Filter/Word/SeparatorToCamelCase.php | 52 + libs/Zend/Filter/Word/SeparatorToDash.php | 46 + .../Zend/Filter/Word/SeparatorToSeparator.php | 129 + .../Filter/Word/UnderscoreToCamelCase.php | 44 + libs/Zend/Filter/Word/UnderscoreToDash.php | 45 + .../Filter/Word/UnderscoreToSeparator.php | 45 + libs/Zend/Form.php | 3049 + libs/Zend/Form/Decorator/Abstract.php | 254 + libs/Zend/Form/Decorator/Callback.php | 136 + libs/Zend/Form/Decorator/Captcha.php | 72 + libs/Zend/Form/Decorator/Captcha/Word.php | 73 + libs/Zend/Form/Decorator/Description.php | 199 + libs/Zend/Form/Decorator/DtDdWrapper.php | 60 + libs/Zend/Form/Decorator/Errors.php | 69 + libs/Zend/Form/Decorator/Exception.php | 37 + libs/Zend/Form/Decorator/Fieldset.php | 155 + libs/Zend/Form/Decorator/File.php | 128 + libs/Zend/Form/Decorator/Form.php | 134 + libs/Zend/Form/Decorator/FormElements.php | 112 + libs/Zend/Form/Decorator/FormErrors.php | 397 + libs/Zend/Form/Decorator/HtmlTag.php | 219 + libs/Zend/Form/Decorator/Image.php | 154 + libs/Zend/Form/Decorator/Interface.php | 123 + libs/Zend/Form/Decorator/Label.php | 327 + libs/Zend/Form/Decorator/PrepareElements.php | 90 + libs/Zend/Form/Decorator/ViewHelper.php | 251 + libs/Zend/Form/Decorator/ViewScript.php | 144 + libs/Zend/Form/DisplayGroup.php | 1127 + libs/Zend/Form/Element.php | 2122 + libs/Zend/Form/Element/Button.php | 42 + libs/Zend/Form/Element/Captcha.php | 260 + libs/Zend/Form/Element/Checkbox.php | 209 + libs/Zend/Form/Element/Exception.php | 37 + libs/Zend/Form/Element/File.php | 615 + libs/Zend/Form/Element/Hash.php | 259 + libs/Zend/Form/Element/Hidden.php | 42 + libs/Zend/Form/Element/Image.php | 129 + libs/Zend/Form/Element/Multi.php | 318 + libs/Zend/Form/Element/MultiCheckbox.php | 52 + libs/Zend/Form/Element/Multiselect.php | 54 + libs/Zend/Form/Element/Password.php | 88 + libs/Zend/Form/Element/Radio.php | 42 + libs/Zend/Form/Element/Reset.php | 42 + libs/Zend/Form/Element/Select.php | 42 + libs/Zend/Form/Element/Submit.php | 121 + libs/Zend/Form/Element/Text.php | 42 + libs/Zend/Form/Element/Textarea.php | 42 + libs/Zend/Form/Element/Xhtml.php | 37 + libs/Zend/Form/Exception.php | 35 + libs/Zend/Form/SubForm.php | 60 + libs/Zend/Gdata.php | 223 + libs/Zend/Gdata/App.php | 1067 + libs/Zend/Gdata/App/AuthException.php | 40 + .../Zend/Gdata/App/BadMethodCallException.php | 40 + libs/Zend/Gdata/App/Base.php | 511 + libs/Zend/Gdata/App/BaseMediaSource.php | 177 + .../Gdata/App/CaptchaRequiredException.php | 92 + libs/Zend/Gdata/App/Entry.php | 367 + libs/Zend/Gdata/App/Exception.php | 41 + libs/Zend/Gdata/App/Extension.php | 38 + libs/Zend/Gdata/App/Extension/Author.php | 41 + libs/Zend/Gdata/App/Extension/Category.php | 138 + libs/Zend/Gdata/App/Extension/Content.php | 86 + libs/Zend/Gdata/App/Extension/Contributor.php | 41 + libs/Zend/Gdata/App/Extension/Control.php | 96 + libs/Zend/Gdata/App/Extension/Draft.php | 48 + libs/Zend/Gdata/App/Extension/Element.php | 56 + libs/Zend/Gdata/App/Extension/Email.php | 47 + libs/Zend/Gdata/App/Extension/Generator.php | 113 + libs/Zend/Gdata/App/Extension/Icon.php | 47 + libs/Zend/Gdata/App/Extension/Id.php | 47 + libs/Zend/Gdata/App/Extension/Link.php | 217 + libs/Zend/Gdata/App/Extension/Logo.php | 47 + libs/Zend/Gdata/App/Extension/Name.php | 46 + libs/Zend/Gdata/App/Extension/Person.php | 161 + libs/Zend/Gdata/App/Extension/Published.php | 47 + libs/Zend/Gdata/App/Extension/Rights.php | 47 + libs/Zend/Gdata/App/Extension/Source.php | 44 + libs/Zend/Gdata/App/Extension/Subtitle.php | 41 + libs/Zend/Gdata/App/Extension/Summary.php | 41 + libs/Zend/Gdata/App/Extension/Text.php | 88 + libs/Zend/Gdata/App/Extension/Title.php | 41 + libs/Zend/Gdata/App/Extension/Updated.php | 47 + libs/Zend/Gdata/App/Extension/Uri.php | 47 + libs/Zend/Gdata/App/Feed.php | 311 + libs/Zend/Gdata/App/FeedEntryParent.php | 576 + libs/Zend/Gdata/App/FeedSourceParent.php | 265 + libs/Zend/Gdata/App/HttpException.php | 119 + libs/Zend/Gdata/App/IOException.php | 41 + .../Gdata/App/InvalidArgumentException.php | 40 + .../App/LoggingHttpClientAdapterSocket.php | 116 + libs/Zend/Gdata/App/MediaEntry.php | 161 + libs/Zend/Gdata/App/MediaFileSource.php | 144 + libs/Zend/Gdata/App/MediaSource.php | 71 + libs/Zend/Gdata/App/Util.php | 110 + libs/Zend/Gdata/AuthSub.php | 243 + libs/Zend/Gdata/Books.php | 194 + libs/Zend/Gdata/Books/CollectionEntry.php | 58 + libs/Zend/Gdata/Books/CollectionFeed.php | 64 + .../Gdata/Books/Extension/AnnotationLink.php | 65 + .../Gdata/Books/Extension/BooksCategory.php | 61 + libs/Zend/Gdata/Books/Extension/BooksLink.php | 63 + .../Gdata/Books/Extension/Embeddability.php | 124 + libs/Zend/Gdata/Books/Extension/InfoLink.php | 62 + .../Gdata/Books/Extension/PreviewLink.php | 62 + libs/Zend/Gdata/Books/Extension/Review.php | 154 + .../Gdata/Books/Extension/ThumbnailLink.php | 62 + .../Gdata/Books/Extension/Viewability.php | 125 + libs/Zend/Gdata/Books/VolumeEntry.php | 689 + libs/Zend/Gdata/Books/VolumeFeed.php | 64 + libs/Zend/Gdata/Books/VolumeQuery.php | 110 + libs/Zend/Gdata/Calendar.php | 161 + libs/Zend/Gdata/Calendar/EventEntry.php | 160 + libs/Zend/Gdata/Calendar/EventFeed.php | 107 + libs/Zend/Gdata/Calendar/EventQuery.php | 445 + .../Gdata/Calendar/Extension/AccessLevel.php | 129 + libs/Zend/Gdata/Calendar/Extension/Color.php | 124 + libs/Zend/Gdata/Calendar/Extension/Hidden.php | 133 + libs/Zend/Gdata/Calendar/Extension/Link.php | 125 + .../Gdata/Calendar/Extension/QuickAdd.php | 131 + .../Gdata/Calendar/Extension/Selected.php | 132 + .../Extension/SendEventNotifications.php | 131 + .../Gdata/Calendar/Extension/Timezone.php | 123 + .../Gdata/Calendar/Extension/WebContent.php | 176 + libs/Zend/Gdata/Calendar/ListEntry.php | 246 + libs/Zend/Gdata/Calendar/ListFeed.php | 106 + libs/Zend/Gdata/ClientLogin.php | 180 + libs/Zend/Gdata/Docs.php | 255 + libs/Zend/Gdata/Docs/DocumentListEntry.php | 54 + libs/Zend/Gdata/Docs/DocumentListFeed.php | 68 + libs/Zend/Gdata/Docs/Query.php | 220 + libs/Zend/Gdata/DublinCore.php | 58 + .../Gdata/DublinCore/Extension/Creator.php | 60 + libs/Zend/Gdata/DublinCore/Extension/Date.php | 62 + .../DublinCore/Extension/Description.php | 60 + .../Gdata/DublinCore/Extension/Format.php | 60 + .../Gdata/DublinCore/Extension/Identifier.php | 60 + .../Gdata/DublinCore/Extension/Language.php | 60 + .../Gdata/DublinCore/Extension/Publisher.php | 60 + .../Gdata/DublinCore/Extension/Rights.php | 60 + .../Gdata/DublinCore/Extension/Subject.php | 60 + .../Zend/Gdata/DublinCore/Extension/Title.php | 60 + libs/Zend/Gdata/Entry.php | 126 + libs/Zend/Gdata/Exif.php | 57 + libs/Zend/Gdata/Exif/Entry.php | 145 + libs/Zend/Gdata/Exif/Extension/Distance.php | 61 + libs/Zend/Gdata/Exif/Extension/Exposure.php | 61 + libs/Zend/Gdata/Exif/Extension/FStop.php | 61 + libs/Zend/Gdata/Exif/Extension/Flash.php | 61 + .../Zend/Gdata/Exif/Extension/FocalLength.php | 61 + .../Gdata/Exif/Extension/ImageUniqueId.php | 61 + libs/Zend/Gdata/Exif/Extension/Iso.php | 61 + libs/Zend/Gdata/Exif/Extension/Make.php | 61 + libs/Zend/Gdata/Exif/Extension/Model.php | 61 + libs/Zend/Gdata/Exif/Extension/Tags.php | 549 + libs/Zend/Gdata/Exif/Extension/Time.php | 61 + libs/Zend/Gdata/Exif/Feed.php | 70 + libs/Zend/Gdata/Extension.php | 52 + libs/Zend/Gdata/Extension/AttendeeStatus.php | 120 + libs/Zend/Gdata/Extension/AttendeeType.php | 120 + libs/Zend/Gdata/Extension/Comments.php | 114 + libs/Zend/Gdata/Extension/EntryLink.php | 164 + libs/Zend/Gdata/Extension/EventStatus.php | 98 + .../Zend/Gdata/Extension/ExtendedProperty.php | 103 + libs/Zend/Gdata/Extension/FeedLink.php | 172 + .../Extension/OpenSearchItemsPerPage.php | 47 + .../Gdata/Extension/OpenSearchStartIndex.php | 47 + .../Extension/OpenSearchTotalResults.php | 47 + libs/Zend/Gdata/Extension/OriginalEvent.php | 139 + libs/Zend/Gdata/Extension/Rating.php | 238 + libs/Zend/Gdata/Extension/Recurrence.php | 46 + .../Gdata/Extension/RecurrenceException.php | 202 + libs/Zend/Gdata/Extension/Reminder.php | 168 + libs/Zend/Gdata/Extension/Transparency.php | 120 + libs/Zend/Gdata/Extension/Visibility.php | 120 + libs/Zend/Gdata/Extension/When.php | 166 + libs/Zend/Gdata/Extension/Where.php | 163 + libs/Zend/Gdata/Extension/Who.php | 291 + libs/Zend/Gdata/Feed.php | 167 + libs/Zend/Gdata/Gapps.php | 1076 + libs/Zend/Gdata/Gapps/EmailListEntry.php | 214 + libs/Zend/Gdata/Gapps/EmailListFeed.php | 51 + libs/Zend/Gdata/Gapps/EmailListQuery.php | 185 + .../Gdata/Gapps/EmailListRecipientEntry.php | 146 + .../Gdata/Gapps/EmailListRecipientFeed.php | 51 + .../Gdata/Gapps/EmailListRecipientQuery.php | 151 + libs/Zend/Gdata/Gapps/Error.php | 231 + libs/Zend/Gdata/Gapps/Extension/EmailList.php | 144 + libs/Zend/Gdata/Gapps/Extension/Login.php | 485 + libs/Zend/Gdata/Gapps/Extension/Name.php | 181 + libs/Zend/Gdata/Gapps/Extension/Nickname.php | 142 + libs/Zend/Gdata/Gapps/Extension/Quota.php | 142 + libs/Zend/Gdata/Gapps/NicknameEntry.php | 189 + libs/Zend/Gdata/Gapps/NicknameFeed.php | 51 + libs/Zend/Gdata/Gapps/NicknameQuery.php | 184 + libs/Zend/Gdata/Gapps/Query.php | 121 + libs/Zend/Gdata/Gapps/ServiceException.php | 206 + libs/Zend/Gdata/Gapps/UserEntry.php | 295 + libs/Zend/Gdata/Gapps/UserFeed.php | 51 + libs/Zend/Gdata/Gapps/UserQuery.php | 145 + libs/Zend/Gdata/Gbase.php | 201 + libs/Zend/Gdata/Gbase/Entry.php | 151 + .../Gdata/Gbase/Extension/BaseAttribute.php | 116 + libs/Zend/Gdata/Gbase/Feed.php | 60 + libs/Zend/Gdata/Gbase/ItemEntry.php | 159 + libs/Zend/Gdata/Gbase/ItemFeed.php | 46 + libs/Zend/Gdata/Gbase/ItemQuery.php | 99 + libs/Zend/Gdata/Gbase/Query.php | 266 + libs/Zend/Gdata/Gbase/SnippetEntry.php | 46 + libs/Zend/Gdata/Gbase/SnippetFeed.php | 46 + libs/Zend/Gdata/Gbase/SnippetQuery.php | 72 + libs/Zend/Gdata/Geo.php | 61 + libs/Zend/Gdata/Geo/Entry.php | 97 + libs/Zend/Gdata/Geo/Extension/GeoRssWhere.php | 135 + libs/Zend/Gdata/Geo/Extension/GmlPoint.php | 136 + libs/Zend/Gdata/Geo/Extension/GmlPos.php | 61 + libs/Zend/Gdata/Geo/Feed.php | 64 + libs/Zend/Gdata/HttpClient.php | 245 + libs/Zend/Gdata/Kind/EventEntry.php | 430 + libs/Zend/Gdata/Media.php | 57 + libs/Zend/Gdata/Media/Entry.php | 134 + .../Gdata/Media/Extension/MediaCategory.php | 148 + .../Gdata/Media/Extension/MediaContent.php | 522 + .../Gdata/Media/Extension/MediaCopyright.php | 116 + .../Gdata/Media/Extension/MediaCredit.php | 149 + .../Media/Extension/MediaDescription.php | 116 + .../Zend/Gdata/Media/Extension/MediaGroup.php | 566 + libs/Zend/Gdata/Media/Extension/MediaHash.php | 115 + .../Gdata/Media/Extension/MediaKeywords.php | 52 + .../Gdata/Media/Extension/MediaPlayer.php | 178 + .../Gdata/Media/Extension/MediaRating.php | 118 + .../Media/Extension/MediaRestriction.php | 149 + libs/Zend/Gdata/Media/Extension/MediaText.php | 211 + .../Gdata/Media/Extension/MediaThumbnail.php | 210 + .../Zend/Gdata/Media/Extension/MediaTitle.php | 118 + libs/Zend/Gdata/Media/Feed.php | 70 + libs/Zend/Gdata/Photos.php | 568 + libs/Zend/Gdata/Photos/AlbumEntry.php | 610 + libs/Zend/Gdata/Photos/AlbumFeed.php | 509 + libs/Zend/Gdata/Photos/AlbumQuery.php | 147 + libs/Zend/Gdata/Photos/CommentEntry.php | 195 + libs/Zend/Gdata/Photos/Extension/Access.php | 63 + libs/Zend/Gdata/Photos/Extension/AlbumId.php | 63 + .../Zend/Gdata/Photos/Extension/BytesUsed.php | 62 + libs/Zend/Gdata/Photos/Extension/Checksum.php | 63 + libs/Zend/Gdata/Photos/Extension/Client.php | 63 + .../Gdata/Photos/Extension/CommentCount.php | 63 + .../Photos/Extension/CommentingEnabled.php | 64 + libs/Zend/Gdata/Photos/Extension/Height.php | 62 + libs/Zend/Gdata/Photos/Extension/Id.php | 62 + libs/Zend/Gdata/Photos/Extension/Location.php | 62 + .../Photos/Extension/MaxPhotosPerAlbum.php | 63 + libs/Zend/Gdata/Photos/Extension/Name.php | 62 + libs/Zend/Gdata/Photos/Extension/Nickname.php | 62 + .../Zend/Gdata/Photos/Extension/NumPhotos.php | 62 + .../Photos/Extension/NumPhotosRemaining.php | 62 + libs/Zend/Gdata/Photos/Extension/PhotoId.php | 61 + libs/Zend/Gdata/Photos/Extension/Position.php | 62 + .../Gdata/Photos/Extension/QuotaCurrent.php | 62 + .../Gdata/Photos/Extension/QuotaLimit.php | 63 + libs/Zend/Gdata/Photos/Extension/Rotation.php | 63 + libs/Zend/Gdata/Photos/Extension/Size.php | 62 + .../Zend/Gdata/Photos/Extension/Thumbnail.php | 62 + .../Zend/Gdata/Photos/Extension/Timestamp.php | 63 + libs/Zend/Gdata/Photos/Extension/User.php | 62 + libs/Zend/Gdata/Photos/Extension/Version.php | 63 + libs/Zend/Gdata/Photos/Extension/Weight.php | 63 + libs/Zend/Gdata/Photos/Extension/Width.php | 62 + libs/Zend/Gdata/Photos/PhotoEntry.php | 691 + libs/Zend/Gdata/Photos/PhotoFeed.php | 559 + libs/Zend/Gdata/Photos/PhotoQuery.php | 96 + libs/Zend/Gdata/Photos/TagEntry.php | 140 + libs/Zend/Gdata/Photos/UserEntry.php | 366 + libs/Zend/Gdata/Photos/UserFeed.php | 247 + libs/Zend/Gdata/Photos/UserQuery.php | 353 + libs/Zend/Gdata/Query.php | 415 + libs/Zend/Gdata/Spreadsheets.php | 436 + libs/Zend/Gdata/Spreadsheets/CellEntry.php | 103 + libs/Zend/Gdata/Spreadsheets/CellFeed.php | 158 + libs/Zend/Gdata/Spreadsheets/CellQuery.php | 415 + .../Zend/Gdata/Spreadsheets/DocumentQuery.php | 286 + .../Gdata/Spreadsheets/Extension/Cell.php | 201 + .../Gdata/Spreadsheets/Extension/ColCount.php | 59 + .../Gdata/Spreadsheets/Extension/Custom.php | 100 + .../Gdata/Spreadsheets/Extension/RowCount.php | 60 + libs/Zend/Gdata/Spreadsheets/ListEntry.php | 208 + libs/Zend/Gdata/Spreadsheets/ListFeed.php | 64 + libs/Zend/Gdata/Spreadsheets/ListQuery.php | 303 + .../Gdata/Spreadsheets/SpreadsheetEntry.php | 64 + .../Gdata/Spreadsheets/SpreadsheetFeed.php | 64 + .../Gdata/Spreadsheets/WorksheetEntry.php | 187 + .../Zend/Gdata/Spreadsheets/WorksheetFeed.php | 64 + libs/Zend/Gdata/YouTube.php | 590 + libs/Zend/Gdata/YouTube/CommentEntry.php | 46 + libs/Zend/Gdata/YouTube/CommentFeed.php | 66 + libs/Zend/Gdata/YouTube/ContactEntry.php | 136 + libs/Zend/Gdata/YouTube/ContactFeed.php | 68 + libs/Zend/Gdata/YouTube/Extension/Age.php | 51 + libs/Zend/Gdata/YouTube/Extension/Books.php | 51 + libs/Zend/Gdata/YouTube/Extension/Company.php | 51 + libs/Zend/Gdata/YouTube/Extension/Control.php | 133 + .../Gdata/YouTube/Extension/Description.php | 51 + .../Zend/Gdata/YouTube/Extension/Duration.php | 126 + libs/Zend/Gdata/YouTube/Extension/Gender.php | 51 + libs/Zend/Gdata/YouTube/Extension/Hobbies.php | 51 + .../Zend/Gdata/YouTube/Extension/Hometown.php | 51 + libs/Zend/Gdata/YouTube/Extension/Link.php | 133 + .../Zend/Gdata/YouTube/Extension/Location.php | 51 + .../Gdata/YouTube/Extension/MediaContent.php | 120 + .../Gdata/YouTube/Extension/MediaGroup.php | 159 + libs/Zend/Gdata/YouTube/Extension/Movies.php | 51 + libs/Zend/Gdata/YouTube/Extension/Music.php | 51 + libs/Zend/Gdata/YouTube/Extension/NoEmbed.php | 54 + .../Gdata/YouTube/Extension/Occupation.php | 51 + .../Zend/Gdata/YouTube/Extension/Position.php | 90 + libs/Zend/Gdata/YouTube/Extension/Private.php | 81 + libs/Zend/Gdata/YouTube/Extension/Racy.php | 124 + .../Zend/Gdata/YouTube/Extension/Recorded.php | 51 + .../Gdata/YouTube/Extension/Relationship.php | 51 + .../Gdata/YouTube/Extension/ReleaseDate.php | 51 + libs/Zend/Gdata/YouTube/Extension/School.php | 51 + libs/Zend/Gdata/YouTube/Extension/State.php | 193 + .../Gdata/YouTube/Extension/Statistics.php | 158 + libs/Zend/Gdata/YouTube/Extension/Status.php | 51 + libs/Zend/Gdata/YouTube/Extension/Token.php | 70 + .../Zend/Gdata/YouTube/Extension/Username.php | 51 + libs/Zend/Gdata/YouTube/MediaEntry.php | 79 + libs/Zend/Gdata/YouTube/PlaylistListEntry.php | 206 + libs/Zend/Gdata/YouTube/PlaylistListFeed.php | 68 + .../Zend/Gdata/YouTube/PlaylistVideoEntry.php | 132 + libs/Zend/Gdata/YouTube/PlaylistVideoFeed.php | 68 + libs/Zend/Gdata/YouTube/SubscriptionEntry.php | 154 + libs/Zend/Gdata/YouTube/SubscriptionFeed.php | 68 + libs/Zend/Gdata/YouTube/UserProfileEntry.php | 782 + libs/Zend/Gdata/YouTube/VideoEntry.php | 1031 + libs/Zend/Gdata/YouTube/VideoFeed.php | 65 + libs/Zend/Gdata/YouTube/VideoQuery.php | 297 + libs/Zend/Http/Client.php | 1199 + libs/Zend/Http/Client/Adapter/Exception.php | 33 + libs/Zend/Http/Client/Adapter/Interface.php | 78 + libs/Zend/Http/Client/Adapter/Proxy.php | 269 + libs/Zend/Http/Client/Adapter/Socket.php | 338 + libs/Zend/Http/Client/Adapter/Test.php | 193 + libs/Zend/Http/Client/Exception.php | 33 + libs/Zend/Http/Cookie.php | 327 + libs/Zend/Http/CookieJar.php | 350 + libs/Zend/Http/Exception.php | 33 + libs/Zend/Http/Response.php | 624 + libs/Zend/InfoCard.php | 488 + libs/Zend/InfoCard/Adapter/Default.php | 84 + libs/Zend/InfoCard/Adapter/Exception.php | 36 + libs/Zend/InfoCard/Adapter/Interface.php | 63 + libs/Zend/InfoCard/Cipher.php | 103 + libs/Zend/InfoCard/Cipher/Exception.php | 38 + .../InfoCard/Cipher/Pki/Adapter/Abstract.php | 91 + libs/Zend/InfoCard/Cipher/Pki/Adapter/Rsa.php | 117 + libs/Zend/InfoCard/Cipher/Pki/Interface.php | 33 + .../InfoCard/Cipher/Pki/Rsa/Interface.php | 50 + .../Cipher/Symmetric/Adapter/Abstract.php | 38 + .../Cipher/Symmetric/Adapter/Aes128cbc.php | 40 + .../Cipher/Symmetric/Adapter/Aes256cbc.php | 114 + .../Cipher/Symmetric/Aes128cbc/Interface.php | 38 + .../Cipher/Symmetric/Aes256cbc/Interface.php | 33 + .../InfoCard/Cipher/Symmetric/Interface.php | 32 + libs/Zend/InfoCard/Claims.php | 309 + libs/Zend/InfoCard/Exception.php | 43 + libs/Zend/InfoCard/Xml/Assertion.php | 91 + .../Zend/InfoCard/Xml/Assertion/Interface.php | 69 + libs/Zend/InfoCard/Xml/Assertion/Saml.php | 284 + libs/Zend/InfoCard/Xml/Element.php | 112 + libs/Zend/InfoCard/Xml/Element/Interface.php | 44 + libs/Zend/InfoCard/Xml/EncryptedData.php | 77 + .../InfoCard/Xml/EncryptedData/Abstract.php | 92 + .../InfoCard/Xml/EncryptedData/XmlEnc.php | 64 + libs/Zend/InfoCard/Xml/EncryptedKey.php | 174 + libs/Zend/InfoCard/Xml/Exception.php | 37 + libs/Zend/InfoCard/Xml/KeyInfo.php | 90 + libs/Zend/InfoCard/Xml/KeyInfo/Abstract.php | 37 + libs/Zend/InfoCard/Xml/KeyInfo/Default.php | 64 + libs/Zend/InfoCard/Xml/KeyInfo/Interface.php | 38 + libs/Zend/InfoCard/Xml/KeyInfo/XmlDSig.php | 76 + libs/Zend/InfoCard/Xml/Security.php | 292 + libs/Zend/InfoCard/Xml/Security/Exception.php | 37 + libs/Zend/InfoCard/Xml/Security/Transform.php | 116 + .../Security/Transform/EnvelopedSignature.php | 64 + .../Xml/Security/Transform/Exception.php | 37 + .../Xml/Security/Transform/Interface.php | 43 + .../Xml/Security/Transform/XmlExcC14N.php | 63 + .../InfoCard/Xml/SecurityTokenReference.php | 173 + libs/Zend/Json.php | 246 + libs/Zend/Json/Decoder.php | 457 + libs/Zend/Json/Encoder.php | 438 + libs/Zend/Json/Exception.php | 36 + libs/Zend/Json/Server.php | 537 + libs/Zend/Json/Server/Cache.php | 102 + libs/Zend/Json/Server/Error.php | 197 + libs/Zend/Json/Server/Exception.php | 35 + libs/Zend/Json/Server/Request.php | 288 + libs/Zend/Json/Server/Request/Http.php | 65 + libs/Zend/Json/Server/Response.php | 247 + libs/Zend/Json/Server/Response/Http.php | 80 + libs/Zend/Json/Server/Smd.php | 479 + libs/Zend/Json/Server/Smd/Service.php | 473 + libs/Zend/Layout.php | 787 + .../Controller/Action/Helper/Layout.php | 186 + libs/Zend/Layout/Controller/Plugin/Layout.php | 155 + libs/Zend/Layout/Exception.php | 34 + libs/Zend/Ldap.php | 759 + libs/Zend/Ldap/Exception.php | 205 + libs/Zend/Loader.php | 263 + libs/Zend/Loader/Exception.php | 35 + libs/Zend/Loader/PluginLoader.php | 460 + libs/Zend/Loader/PluginLoader/Exception.php | 38 + libs/Zend/Loader/PluginLoader/Interface.php | 74 + libs/Zend/Locale.php | 922 + libs/Zend/Locale/Data.php | 1208 + libs/Zend/Locale/Data/Translation.php | 96 + libs/Zend/Locale/Data/aa.xml | 260 + libs/Zend/Locale/Data/aa_DJ.xml | 35 + libs/Zend/Locale/Data/aa_ER.xml | 20 + libs/Zend/Locale/Data/aa_ET.xml | 10 + libs/Zend/Locale/Data/af.xml | 827 + libs/Zend/Locale/Data/af_NA.xml | 76 + libs/Zend/Locale/Data/af_ZA.xml | 10 + libs/Zend/Locale/Data/ak.xml | 195 + libs/Zend/Locale/Data/ak_GH.xml | 10 + libs/Zend/Locale/Data/am.xml | 1416 + libs/Zend/Locale/Data/am_ET.xml | 10 + libs/Zend/Locale/Data/ar.xml | 3107 + libs/Zend/Locale/Data/ar_AE.xml | 15 + libs/Zend/Locale/Data/ar_BH.xml | 15 + libs/Zend/Locale/Data/ar_DZ.xml | 20 + libs/Zend/Locale/Data/ar_EG.xml | 10 + libs/Zend/Locale/Data/ar_IQ.xml | 15 + libs/Zend/Locale/Data/ar_JO.xml | 66 + libs/Zend/Locale/Data/ar_KW.xml | 15 + libs/Zend/Locale/Data/ar_LB.xml | 72 + libs/Zend/Locale/Data/ar_LY.xml | 15 + libs/Zend/Locale/Data/ar_MA.xml | 20 + libs/Zend/Locale/Data/ar_OM.xml | 15 + libs/Zend/Locale/Data/ar_QA.xml | 50 + libs/Zend/Locale/Data/ar_SA.xml | 50 + libs/Zend/Locale/Data/ar_SD.xml | 15 + libs/Zend/Locale/Data/ar_SY.xml | 82 + libs/Zend/Locale/Data/ar_TN.xml | 54 + libs/Zend/Locale/Data/ar_YE.xml | 50 + libs/Zend/Locale/Data/as.xml | 280 + libs/Zend/Locale/Data/as_IN.xml | 10 + libs/Zend/Locale/Data/az.xml | 2752 + libs/Zend/Locale/Data/az_AZ.xml | 11 + libs/Zend/Locale/Data/az_Cyrl.xml | 85 + libs/Zend/Locale/Data/az_Cyrl_AZ.xml | 11 + libs/Zend/Locale/Data/az_Latn.xml | 10 + libs/Zend/Locale/Data/az_Latn_AZ.xml | 11 + libs/Zend/Locale/Data/be.xml | 1191 + libs/Zend/Locale/Data/be_BY.xml | 10 + libs/Zend/Locale/Data/bg.xml | 3014 + libs/Zend/Locale/Data/bg_BG.xml | 10 + libs/Zend/Locale/Data/bn.xml | 2919 + libs/Zend/Locale/Data/bn_BD.xml | 10 + libs/Zend/Locale/Data/bn_IN.xml | 194 + libs/Zend/Locale/Data/bs.xml | 337 + libs/Zend/Locale/Data/bs_BA.xml | 10 + libs/Zend/Locale/Data/byn.xml | 508 + libs/Zend/Locale/Data/byn_ER.xml | 10 + libs/Zend/Locale/Data/ca.xml | 1644 + libs/Zend/Locale/Data/ca_ES.xml | 10 + libs/Zend/Locale/Data/cch.xml | 194 + libs/Zend/Locale/Data/cch_NG.xml | 10 + libs/Zend/Locale/Data/characters.xml | 1888 + libs/Zend/Locale/Data/cop.xml | 203 + libs/Zend/Locale/Data/cs.xml | 2205 + libs/Zend/Locale/Data/cs_CZ.xml | 10 + libs/Zend/Locale/Data/cy.xml | 790 + libs/Zend/Locale/Data/cy_GB.xml | 10 + libs/Zend/Locale/Data/da.xml | 2979 + libs/Zend/Locale/Data/da_DK.xml | 10 + libs/Zend/Locale/Data/de.xml | 3025 + libs/Zend/Locale/Data/de_AT.xml | 71 + libs/Zend/Locale/Data/de_BE.xml | 121 + libs/Zend/Locale/Data/de_CH.xml | 55 + libs/Zend/Locale/Data/de_DE.xml | 10 + libs/Zend/Locale/Data/de_LI.xml | 24 + libs/Zend/Locale/Data/de_LU.xml | 19 + libs/Zend/Locale/Data/dv.xml | 231 + libs/Zend/Locale/Data/dv_MV.xml | 10 + libs/Zend/Locale/Data/dz.xml | 419 + libs/Zend/Locale/Data/dz_BT.xml | 10 + libs/Zend/Locale/Data/ee.xml | 199 + libs/Zend/Locale/Data/ee_GH.xml | 10 + libs/Zend/Locale/Data/ee_TG.xml | 10 + libs/Zend/Locale/Data/el.xml | 2642 + libs/Zend/Locale/Data/el_CY.xml | 19 + libs/Zend/Locale/Data/el_GR.xml | 10 + libs/Zend/Locale/Data/el_POLYTON.xml | 546 + libs/Zend/Locale/Data/en.xml | 4051 + libs/Zend/Locale/Data/en_AS.xml | 10 + libs/Zend/Locale/Data/en_AU.xml | 161 + libs/Zend/Locale/Data/en_BE.xml | 158 + libs/Zend/Locale/Data/en_BW.xml | 130 + libs/Zend/Locale/Data/en_BZ.xml | 160 + libs/Zend/Locale/Data/en_CA.xml | 126 + libs/Zend/Locale/Data/en_GB.xml | 170 + libs/Zend/Locale/Data/en_GU.xml | 10 + libs/Zend/Locale/Data/en_HK.xml | 134 + libs/Zend/Locale/Data/en_IE.xml | 157 + libs/Zend/Locale/Data/en_IN.xml | 146 + libs/Zend/Locale/Data/en_JM.xml | 19 + libs/Zend/Locale/Data/en_MH.xml | 10 + libs/Zend/Locale/Data/en_MP.xml | 10 + libs/Zend/Locale/Data/en_MT.xml | 154 + libs/Zend/Locale/Data/en_NA.xml | 19 + libs/Zend/Locale/Data/en_NZ.xml | 159 + libs/Zend/Locale/Data/en_PH.xml | 17 + libs/Zend/Locale/Data/en_PK.xml | 146 + libs/Zend/Locale/Data/en_SG.xml | 161 + libs/Zend/Locale/Data/en_Shaw.xml | 186 + libs/Zend/Locale/Data/en_TT.xml | 19 + libs/Zend/Locale/Data/en_UM.xml | 10 + libs/Zend/Locale/Data/en_US.xml | 10 + libs/Zend/Locale/Data/en_US_POSIX.xml | 45 + libs/Zend/Locale/Data/en_VI.xml | 10 + libs/Zend/Locale/Data/en_ZA.xml | 153 + libs/Zend/Locale/Data/en_ZW.xml | 149 + libs/Zend/Locale/Data/eo.xml | 638 + libs/Zend/Locale/Data/es.xml | 3683 + libs/Zend/Locale/Data/es_AR.xml | 134 + libs/Zend/Locale/Data/es_BO.xml | 10 + libs/Zend/Locale/Data/es_CL.xml | 166 + libs/Zend/Locale/Data/es_CO.xml | 133 + libs/Zend/Locale/Data/es_CR.xml | 17 + libs/Zend/Locale/Data/es_DO.xml | 16 + libs/Zend/Locale/Data/es_EC.xml | 127 + libs/Zend/Locale/Data/es_ES.xml | 11 + libs/Zend/Locale/Data/es_GT.xml | 109 + libs/Zend/Locale/Data/es_HN.xml | 109 + libs/Zend/Locale/Data/es_MX.xml | 21 + libs/Zend/Locale/Data/es_NI.xml | 16 + libs/Zend/Locale/Data/es_PA.xml | 112 + libs/Zend/Locale/Data/es_PE.xml | 111 + libs/Zend/Locale/Data/es_PR.xml | 117 + libs/Zend/Locale/Data/es_PY.xml | 20 + libs/Zend/Locale/Data/es_SV.xml | 16 + libs/Zend/Locale/Data/es_US.xml | 139 + libs/Zend/Locale/Data/es_UY.xml | 25 + libs/Zend/Locale/Data/es_VE.xml | 20 + libs/Zend/Locale/Data/et.xml | 1947 + libs/Zend/Locale/Data/et_EE.xml | 10 + libs/Zend/Locale/Data/eu.xml | 584 + libs/Zend/Locale/Data/eu_ES.xml | 10 + libs/Zend/Locale/Data/fa.xml | 3361 + libs/Zend/Locale/Data/fa_AF.xml | 304 + libs/Zend/Locale/Data/fa_IR.xml | 10 + libs/Zend/Locale/Data/fi.xml | 3424 + libs/Zend/Locale/Data/fi_FI.xml | 10 + libs/Zend/Locale/Data/fil.xml | 1005 + libs/Zend/Locale/Data/fil_PH.xml | 10 + libs/Zend/Locale/Data/fo.xml | 636 + libs/Zend/Locale/Data/fo_FO.xml | 10 + libs/Zend/Locale/Data/fr.xml | 5572 + libs/Zend/Locale/Data/fr_BE.xml | 104 + libs/Zend/Locale/Data/fr_CA.xml | 155 + libs/Zend/Locale/Data/fr_CH.xml | 125 + libs/Zend/Locale/Data/fr_FR.xml | 10 + libs/Zend/Locale/Data/fr_LU.xml | 23 + libs/Zend/Locale/Data/fr_MC.xml | 10 + libs/Zend/Locale/Data/fr_SN.xml | 10 + libs/Zend/Locale/Data/fur.xml | 1087 + libs/Zend/Locale/Data/fur_IT.xml | 10 + libs/Zend/Locale/Data/ga.xml | 1602 + libs/Zend/Locale/Data/ga_IE.xml | 10 + libs/Zend/Locale/Data/gaa.xml | 200 + libs/Zend/Locale/Data/gaa_GH.xml | 10 + libs/Zend/Locale/Data/gez.xml | 514 + libs/Zend/Locale/Data/gez_ER.xml | 10 + libs/Zend/Locale/Data/gez_ET.xml | 20 + libs/Zend/Locale/Data/gl.xml | 1367 + libs/Zend/Locale/Data/gl_ES.xml | 10 + libs/Zend/Locale/Data/gu.xml | 364 + libs/Zend/Locale/Data/gu_IN.xml | 10 + libs/Zend/Locale/Data/gv.xml | 205 + libs/Zend/Locale/Data/gv_GB.xml | 10 + libs/Zend/Locale/Data/ha.xml | 376 + libs/Zend/Locale/Data/ha_Arab.xml | 95 + libs/Zend/Locale/Data/ha_Arab_NG.xml | 11 + libs/Zend/Locale/Data/ha_Arab_SD.xml | 11 + libs/Zend/Locale/Data/ha_GH.xml | 11 + libs/Zend/Locale/Data/ha_Latn.xml | 10 + libs/Zend/Locale/Data/ha_Latn_GH.xml | 11 + libs/Zend/Locale/Data/ha_Latn_NE.xml | 11 + libs/Zend/Locale/Data/ha_Latn_NG.xml | 11 + libs/Zend/Locale/Data/ha_NE.xml | 11 + libs/Zend/Locale/Data/ha_NG.xml | 11 + libs/Zend/Locale/Data/ha_SD.xml | 11 + libs/Zend/Locale/Data/haw.xml | 223 + libs/Zend/Locale/Data/haw_US.xml | 10 + libs/Zend/Locale/Data/he.xml | 2814 + libs/Zend/Locale/Data/he_IL.xml | 10 + libs/Zend/Locale/Data/hi.xml | 3005 + libs/Zend/Locale/Data/hi_IN.xml | 10 + libs/Zend/Locale/Data/hr.xml | 1704 + libs/Zend/Locale/Data/hr_HR.xml | 10 + libs/Zend/Locale/Data/hu.xml | 4057 + libs/Zend/Locale/Data/hu_HU.xml | 10 + libs/Zend/Locale/Data/hy.xml | 598 + libs/Zend/Locale/Data/hy_AM.xml | 10 + libs/Zend/Locale/Data/hy_AM_REVISED.xml | 40 + libs/Zend/Locale/Data/ia.xml | 558 + libs/Zend/Locale/Data/id.xml | 1317 + libs/Zend/Locale/Data/id_ID.xml | 10 + libs/Zend/Locale/Data/ig.xml | 197 + libs/Zend/Locale/Data/ig_NG.xml | 10 + libs/Zend/Locale/Data/ii.xml | 255 + libs/Zend/Locale/Data/ii_CN.xml | 10 + libs/Zend/Locale/Data/in.xml | 10 + libs/Zend/Locale/Data/is.xml | 2169 + libs/Zend/Locale/Data/is_IS.xml | 10 + libs/Zend/Locale/Data/it.xml | 3070 + libs/Zend/Locale/Data/it_CH.xml | 117 + libs/Zend/Locale/Data/it_IT.xml | 10 + libs/Zend/Locale/Data/iu.xml | 187 + libs/Zend/Locale/Data/iw.xml | 10 + libs/Zend/Locale/Data/ja.xml | 3891 + libs/Zend/Locale/Data/ja_JP.xml | 10 + libs/Zend/Locale/Data/ka.xml | 2168 + libs/Zend/Locale/Data/ka_GE.xml | 10 + libs/Zend/Locale/Data/kaj.xml | 194 + libs/Zend/Locale/Data/kaj_NG.xml | 10 + libs/Zend/Locale/Data/kam.xml | 194 + libs/Zend/Locale/Data/kam_KE.xml | 10 + libs/Zend/Locale/Data/kcg.xml | 194 + libs/Zend/Locale/Data/kcg_NG.xml | 10 + libs/Zend/Locale/Data/kfo.xml | 194 + libs/Zend/Locale/Data/kfo_CI.xml | 10 + libs/Zend/Locale/Data/kk.xml | 397 + libs/Zend/Locale/Data/kk_Cyrl.xml | 10 + libs/Zend/Locale/Data/kk_Cyrl_KZ.xml | 11 + libs/Zend/Locale/Data/kk_KZ.xml | 11 + libs/Zend/Locale/Data/kl.xml | 213 + libs/Zend/Locale/Data/kl_GL.xml | 10 + libs/Zend/Locale/Data/km.xml | 660 + libs/Zend/Locale/Data/km_KH.xml | 10 + libs/Zend/Locale/Data/kn.xml | 463 + libs/Zend/Locale/Data/kn_IN.xml | 10 + libs/Zend/Locale/Data/ko.xml | 4218 + libs/Zend/Locale/Data/ko_KR.xml | 10 + libs/Zend/Locale/Data/kok.xml | 368 + libs/Zend/Locale/Data/kok_IN.xml | 10 + libs/Zend/Locale/Data/kpe.xml | 182 + libs/Zend/Locale/Data/kpe_GN.xml | 10 + libs/Zend/Locale/Data/kpe_LR.xml | 10 + libs/Zend/Locale/Data/ku.xml | 136 + libs/Zend/Locale/Data/ku_Arab.xml | 10 + libs/Zend/Locale/Data/ku_Latn.xml | 187 + libs/Zend/Locale/Data/ku_Latn_TR.xml | 11 + libs/Zend/Locale/Data/ku_TR.xml | 11 + libs/Zend/Locale/Data/kw.xml | 205 + libs/Zend/Locale/Data/kw_GB.xml | 10 + libs/Zend/Locale/Data/ky.xml | 281 + libs/Zend/Locale/Data/ky_KG.xml | 10 + libs/Zend/Locale/Data/ln.xml | 493 + libs/Zend/Locale/Data/ln_CD.xml | 10 + libs/Zend/Locale/Data/ln_CG.xml | 10 + libs/Zend/Locale/Data/lo.xml | 620 + libs/Zend/Locale/Data/lo_LA.xml | 10 + libs/Zend/Locale/Data/lt.xml | 2454 + libs/Zend/Locale/Data/lt_LT.xml | 10 + libs/Zend/Locale/Data/lv.xml | 2414 + libs/Zend/Locale/Data/lv_LV.xml | 10 + libs/Zend/Locale/Data/mk.xml | 1272 + libs/Zend/Locale/Data/mk_MK.xml | 10 + libs/Zend/Locale/Data/ml.xml | 4520 + libs/Zend/Locale/Data/ml_IN.xml | 10 + libs/Zend/Locale/Data/mn.xml | 326 + libs/Zend/Locale/Data/mn_CN.xml | 11 + libs/Zend/Locale/Data/mn_Cyrl.xml | 10 + libs/Zend/Locale/Data/mn_Cyrl_MN.xml | 11 + libs/Zend/Locale/Data/mn_MN.xml | 11 + libs/Zend/Locale/Data/mn_Mong.xml | 17 + libs/Zend/Locale/Data/mn_Mong_CN.xml | 11 + libs/Zend/Locale/Data/mo.xml | 10 + libs/Zend/Locale/Data/mr.xml | 388 + libs/Zend/Locale/Data/mr_IN.xml | 10 + libs/Zend/Locale/Data/ms.xml | 563 + libs/Zend/Locale/Data/ms_BN.xml | 135 + libs/Zend/Locale/Data/ms_MY.xml | 10 + libs/Zend/Locale/Data/mt.xml | 1147 + libs/Zend/Locale/Data/mt_MT.xml | 10 + libs/Zend/Locale/Data/my.xml | 1597 + libs/Zend/Locale/Data/my_MM.xml | 10 + libs/Zend/Locale/Data/nb.xml | 2652 + libs/Zend/Locale/Data/nb_NO.xml | 10 + libs/Zend/Locale/Data/ne.xml | 1388 + libs/Zend/Locale/Data/ne_IN.xml | 10 + libs/Zend/Locale/Data/ne_NP.xml | 10 + libs/Zend/Locale/Data/nl.xml | 3877 + libs/Zend/Locale/Data/nl_BE.xml | 81 + libs/Zend/Locale/Data/nl_NL.xml | 10 + libs/Zend/Locale/Data/nn.xml | 1640 + libs/Zend/Locale/Data/nn_NO.xml | 10 + libs/Zend/Locale/Data/no.xml | 10 + libs/Zend/Locale/Data/nr.xml | 236 + libs/Zend/Locale/Data/nr_ZA.xml | 10 + libs/Zend/Locale/Data/nso.xml | 238 + libs/Zend/Locale/Data/nso_ZA.xml | 10 + libs/Zend/Locale/Data/ny.xml | 195 + libs/Zend/Locale/Data/ny_MW.xml | 10 + libs/Zend/Locale/Data/om.xml | 336 + libs/Zend/Locale/Data/om_ET.xml | 10 + libs/Zend/Locale/Data/om_KE.xml | 17 + libs/Zend/Locale/Data/or.xml | 234 + libs/Zend/Locale/Data/or_IN.xml | 10 + libs/Zend/Locale/Data/pa.xml | 329 + libs/Zend/Locale/Data/pa_Arab.xml | 130 + libs/Zend/Locale/Data/pa_Arab_PK.xml | 11 + libs/Zend/Locale/Data/pa_Guru.xml | 10 + libs/Zend/Locale/Data/pa_Guru_IN.xml | 11 + libs/Zend/Locale/Data/pa_IN.xml | 11 + libs/Zend/Locale/Data/pa_PK.xml | 11 + libs/Zend/Locale/Data/pl.xml | 3228 + libs/Zend/Locale/Data/pl_PL.xml | 10 + libs/Zend/Locale/Data/plurals.xml | 76 + libs/Zend/Locale/Data/ps.xml | 434 + libs/Zend/Locale/Data/ps_AF.xml | 10 + libs/Zend/Locale/Data/pt.xml | 4344 + libs/Zend/Locale/Data/pt_BR.xml | 10 + libs/Zend/Locale/Data/pt_PT.xml | 1962 + libs/Zend/Locale/Data/ro.xml | 1792 + libs/Zend/Locale/Data/ro_MD.xml | 10 + libs/Zend/Locale/Data/ro_RO.xml | 10 + libs/Zend/Locale/Data/root.xml | 2554 + libs/Zend/Locale/Data/ru.xml | 4048 + libs/Zend/Locale/Data/ru_RU.xml | 10 + libs/Zend/Locale/Data/ru_UA.xml | 117 + libs/Zend/Locale/Data/rw.xml | 311 + libs/Zend/Locale/Data/rw_RW.xml | 10 + libs/Zend/Locale/Data/sa.xml | 259 + libs/Zend/Locale/Data/sa_IN.xml | 10 + libs/Zend/Locale/Data/se.xml | 656 + libs/Zend/Locale/Data/se_FI.xml | 248 + libs/Zend/Locale/Data/se_NO.xml | 10 + libs/Zend/Locale/Data/sh.xml | 10 + libs/Zend/Locale/Data/sh_BA.xml | 11 + libs/Zend/Locale/Data/sh_CS.xml | 11 + libs/Zend/Locale/Data/sh_YU.xml | 11 + libs/Zend/Locale/Data/si.xml | 239 + libs/Zend/Locale/Data/si_LK.xml | 10 + libs/Zend/Locale/Data/sid.xml | 256 + libs/Zend/Locale/Data/sid_ET.xml | 10 + libs/Zend/Locale/Data/sk.xml | 1805 + libs/Zend/Locale/Data/sk_SK.xml | 10 + libs/Zend/Locale/Data/sl.xml | 1380 + libs/Zend/Locale/Data/sl_SI.xml | 10 + libs/Zend/Locale/Data/so.xml | 568 + libs/Zend/Locale/Data/so_DJ.xml | 20 + libs/Zend/Locale/Data/so_ET.xml | 20 + libs/Zend/Locale/Data/so_KE.xml | 17 + libs/Zend/Locale/Data/so_SO.xml | 10 + libs/Zend/Locale/Data/sq.xml | 662 + libs/Zend/Locale/Data/sq_AL.xml | 10 + libs/Zend/Locale/Data/sr.xml | 2300 + libs/Zend/Locale/Data/sr_BA.xml | 11 + libs/Zend/Locale/Data/sr_CS.xml | 11 + libs/Zend/Locale/Data/sr_Cyrl.xml | 10 + libs/Zend/Locale/Data/sr_Cyrl_BA.xml | 103 + libs/Zend/Locale/Data/sr_Cyrl_CS.xml | 12 + libs/Zend/Locale/Data/sr_Cyrl_ME.xml | 11 + libs/Zend/Locale/Data/sr_Cyrl_RS.xml | 11 + libs/Zend/Locale/Data/sr_Cyrl_YU.xml | 12 + libs/Zend/Locale/Data/sr_Latn.xml | 1701 + libs/Zend/Locale/Data/sr_Latn_BA.xml | 11 + libs/Zend/Locale/Data/sr_Latn_CS.xml | 12 + libs/Zend/Locale/Data/sr_Latn_ME.xml | 69 + libs/Zend/Locale/Data/sr_Latn_RS.xml | 12 + libs/Zend/Locale/Data/sr_Latn_YU.xml | 12 + libs/Zend/Locale/Data/sr_ME.xml | 11 + libs/Zend/Locale/Data/sr_RS.xml | 11 + libs/Zend/Locale/Data/sr_YU.xml | 11 + libs/Zend/Locale/Data/ss.xml | 236 + libs/Zend/Locale/Data/ss_SZ.xml | 10 + libs/Zend/Locale/Data/ss_ZA.xml | 10 + libs/Zend/Locale/Data/st.xml | 330 + libs/Zend/Locale/Data/st_LS.xml | 10 + libs/Zend/Locale/Data/st_ZA.xml | 10 + libs/Zend/Locale/Data/supplementalData.xml | 4688 + libs/Zend/Locale/Data/sv.xml | 4420 + libs/Zend/Locale/Data/sv_FI.xml | 57 + libs/Zend/Locale/Data/sv_SE.xml | 10 + libs/Zend/Locale/Data/sw.xml | 408 + libs/Zend/Locale/Data/sw_KE.xml | 19 + libs/Zend/Locale/Data/sw_TZ.xml | 10 + libs/Zend/Locale/Data/syr.xml | 221 + libs/Zend/Locale/Data/syr_SY.xml | 10 + libs/Zend/Locale/Data/ta.xml | 614 + libs/Zend/Locale/Data/ta_IN.xml | 10 + libs/Zend/Locale/Data/te.xml | 337 + libs/Zend/Locale/Data/te_IN.xml | 10 + libs/Zend/Locale/Data/telephoneCodeData.xml | 747 + libs/Zend/Locale/Data/tg.xml | 269 + libs/Zend/Locale/Data/tg_Cyrl.xml | 10 + libs/Zend/Locale/Data/tg_Cyrl_TJ.xml | 11 + libs/Zend/Locale/Data/tg_TJ.xml | 11 + libs/Zend/Locale/Data/th.xml | 3825 + libs/Zend/Locale/Data/th_TH.xml | 10 + libs/Zend/Locale/Data/ti.xml | 333 + libs/Zend/Locale/Data/ti_ER.xml | 133 + libs/Zend/Locale/Data/ti_ET.xml | 10 + libs/Zend/Locale/Data/tig.xml | 509 + libs/Zend/Locale/Data/tig_ER.xml | 10 + libs/Zend/Locale/Data/tl.xml | 10 + libs/Zend/Locale/Data/tn.xml | 317 + libs/Zend/Locale/Data/tn_ZA.xml | 10 + libs/Zend/Locale/Data/to.xml | 617 + libs/Zend/Locale/Data/to_TO.xml | 10 + libs/Zend/Locale/Data/tr.xml | 3837 + libs/Zend/Locale/Data/tr_TR.xml | 10 + libs/Zend/Locale/Data/ts.xml | 260 + libs/Zend/Locale/Data/ts_ZA.xml | 10 + libs/Zend/Locale/Data/tt.xml | 214 + libs/Zend/Locale/Data/tt_RU.xml | 10 + libs/Zend/Locale/Data/ug.xml | 190 + libs/Zend/Locale/Data/ug_Arab.xml | 11 + libs/Zend/Locale/Data/ug_Arab_CN.xml | 11 + libs/Zend/Locale/Data/ug_CN.xml | 11 + libs/Zend/Locale/Data/uk.xml | 3923 + libs/Zend/Locale/Data/uk_UA.xml | 10 + libs/Zend/Locale/Data/ur.xml | 1054 + libs/Zend/Locale/Data/ur_IN.xml | 34 + libs/Zend/Locale/Data/ur_PK.xml | 10 + libs/Zend/Locale/Data/uz.xml | 264 + libs/Zend/Locale/Data/uz_AF.xml | 11 + libs/Zend/Locale/Data/uz_Arab.xml | 166 + libs/Zend/Locale/Data/uz_Arab_AF.xml | 11 + libs/Zend/Locale/Data/uz_Cyrl.xml | 10 + libs/Zend/Locale/Data/uz_Cyrl_UZ.xml | 11 + libs/Zend/Locale/Data/uz_Latn.xml | 169 + libs/Zend/Locale/Data/uz_Latn_UZ.xml | 11 + libs/Zend/Locale/Data/uz_UZ.xml | 11 + libs/Zend/Locale/Data/ve.xml | 237 + libs/Zend/Locale/Data/ve_ZA.xml | 10 + libs/Zend/Locale/Data/vi.xml | 1086 + libs/Zend/Locale/Data/vi_VN.xml | 10 + libs/Zend/Locale/Data/wal.xml | 380 + libs/Zend/Locale/Data/wal_ET.xml | 10 + libs/Zend/Locale/Data/wo.xml | 200 + libs/Zend/Locale/Data/wo_Latn.xml | 10 + libs/Zend/Locale/Data/wo_Latn_SN.xml | 11 + libs/Zend/Locale/Data/wo_SN.xml | 10 + libs/Zend/Locale/Data/xh.xml | 348 + libs/Zend/Locale/Data/xh_ZA.xml | 10 + libs/Zend/Locale/Data/yo.xml | 328 + libs/Zend/Locale/Data/yo_NG.xml | 10 + libs/Zend/Locale/Data/zh.xml | 4509 + libs/Zend/Locale/Data/zh_CN.xml | 11 + libs/Zend/Locale/Data/zh_HK.xml | 11 + libs/Zend/Locale/Data/zh_Hans.xml | 10 + libs/Zend/Locale/Data/zh_Hans_CN.xml | 11 + libs/Zend/Locale/Data/zh_Hans_HK.xml | 11 + libs/Zend/Locale/Data/zh_Hans_MO.xml | 11 + libs/Zend/Locale/Data/zh_Hans_SG.xml | 105 + libs/Zend/Locale/Data/zh_Hant.xml | 3705 + libs/Zend/Locale/Data/zh_Hant_HK.xml | 187 + libs/Zend/Locale/Data/zh_Hant_MO.xml | 124 + libs/Zend/Locale/Data/zh_Hant_TW.xml | 11 + libs/Zend/Locale/Data/zh_MO.xml | 11 + libs/Zend/Locale/Data/zh_SG.xml | 11 + libs/Zend/Locale/Data/zh_TW.xml | 11 + libs/Zend/Locale/Data/zu.xml | 362 + libs/Zend/Locale/Data/zu_ZA.xml | 10 + libs/Zend/Locale/Exception.php | 37 + libs/Zend/Locale/Format.php | 1064 + libs/Zend/Locale/Math.php | 154 + libs/Zend/Locale/Math/Exception.php | 53 + libs/Zend/Locale/Math/PhpMath.php | 247 + libs/Zend/Log.php | 223 + libs/Zend/Log/Exception.php | 33 + libs/Zend/Log/Filter/Interface.php | 41 + libs/Zend/Log/Filter/Message.php | 66 + libs/Zend/Log/Filter/Priority.php | 75 + libs/Zend/Log/Filter/Suppress.php | 66 + libs/Zend/Log/Formatter/Interface.php | 41 + libs/Zend/Log/Formatter/Simple.php | 87 + libs/Zend/Log/Formatter/Xml.php | 90 + libs/Zend/Log/Writer/Abstract.php | 109 + libs/Zend/Log/Writer/Db.php | 111 + libs/Zend/Log/Writer/Firebug.php | 187 + libs/Zend/Log/Writer/Mock.php | 66 + libs/Zend/Log/Writer/Null.php | 46 + libs/Zend/Log/Writer/Stream.php | 100 + libs/Zend/Mail.php | 739 + libs/Zend/Mail/Exception.php | 37 + libs/Zend/Mail/Message.php | 112 + libs/Zend/Mail/Message/File.php | 96 + libs/Zend/Mail/Message/Interface.php | 55 + libs/Zend/Mail/Part.php | 489 + libs/Zend/Mail/Part/File.php | 198 + libs/Zend/Mail/Part/Interface.php | 136 + libs/Zend/Mail/Protocol/Abstract.php | 385 + libs/Zend/Mail/Protocol/Exception.php | 39 + libs/Zend/Mail/Protocol/Imap.php | 837 + libs/Zend/Mail/Protocol/Pop3.php | 471 + libs/Zend/Mail/Protocol/Smtp.php | 443 + libs/Zend/Mail/Protocol/Smtp/Auth/Crammd5.php | 108 + libs/Zend/Mail/Protocol/Smtp/Auth/Login.php | 98 + libs/Zend/Mail/Protocol/Smtp/Auth/Plain.php | 96 + libs/Zend/Mail/Storage.php | 39 + libs/Zend/Mail/Storage/Abstract.php | 366 + libs/Zend/Mail/Storage/Exception.php | 39 + libs/Zend/Mail/Storage/Folder.php | 236 + libs/Zend/Mail/Storage/Folder/Interface.php | 60 + libs/Zend/Mail/Storage/Folder/Maildir.php | 265 + libs/Zend/Mail/Storage/Folder/Mbox.php | 264 + libs/Zend/Mail/Storage/Imap.php | 644 + libs/Zend/Mail/Storage/Maildir.php | 475 + libs/Zend/Mail/Storage/Mbox.php | 447 + libs/Zend/Mail/Storage/Pop3.php | 328 + libs/Zend/Mail/Storage/Writable/Interface.php | 108 + libs/Zend/Mail/Storage/Writable/Maildir.php | 1049 + libs/Zend/Mail/Transport/Abstract.php | 350 + libs/Zend/Mail/Transport/Exception.php | 39 + libs/Zend/Mail/Transport/Sendmail.php | 170 + libs/Zend/Mail/Transport/Smtp.php | 241 + libs/Zend/Measure/Abstract.php | 376 + libs/Zend/Measure/Acceleration.php | 92 + libs/Zend/Measure/Angle.php | 79 + libs/Zend/Measure/Area.php | 311 + libs/Zend/Measure/Binary.php | 123 + libs/Zend/Measure/Capacitance.php | 99 + libs/Zend/Measure/Cooking/Volume.php | 191 + libs/Zend/Measure/Cooking/Weight.php | 71 + libs/Zend/Measure/Current.php | 103 + libs/Zend/Measure/Density.php | 207 + libs/Zend/Measure/Energy.php | 253 + libs/Zend/Measure/Exception.php | 37 + libs/Zend/Measure/Flow/Mass.php | 123 + libs/Zend/Measure/Flow/Mole.php | 91 + libs/Zend/Measure/Flow/Volume.php | 403 + libs/Zend/Measure/Force.php | 127 + libs/Zend/Measure/Frequency.php | 87 + libs/Zend/Measure/Illumination.php | 73 + libs/Zend/Measure/Length.php | 675 + libs/Zend/Measure/Lightness.php | 81 + libs/Zend/Measure/Number.php | 420 + libs/Zend/Measure/Power.php | 189 + libs/Zend/Measure/Pressure.php | 251 + libs/Zend/Measure/Speed.php | 191 + libs/Zend/Measure/Temperature.php | 61 + libs/Zend/Measure/Time.php | 118 + libs/Zend/Measure/Torque.php | 83 + libs/Zend/Measure/Viscosity/Dynamic.php | 121 + libs/Zend/Measure/Viscosity/Kinematic.php | 107 + libs/Zend/Measure/Volume.php | 214 + libs/Zend/Measure/Weight.php | 481 + libs/Zend/Memory.php | 75 + libs/Zend/Memory/AccessController.php | 147 + libs/Zend/Memory/Container.php | 37 + libs/Zend/Memory/Container/Interface.php | 64 + libs/Zend/Memory/Container/Locked.php | 115 + libs/Zend/Memory/Container/Movable.php | 298 + libs/Zend/Memory/Exception.php | 33 + libs/Zend/Memory/Manager.php | 460 + libs/Zend/Memory/Value.php | 174 + libs/Zend/Mime.php | 252 + libs/Zend/Mime/Decode.php | 243 + libs/Zend/Mime/Exception.php | 36 + libs/Zend/Mime/Message.php | 286 + libs/Zend/Mime/Part.php | 218 + libs/Zend/OpenId.php | 715 + libs/Zend/OpenId/Consumer.php | 921 + libs/Zend/OpenId/Consumer/Storage.php | 132 + libs/Zend/OpenId/Consumer/Storage/File.php | 453 + libs/Zend/OpenId/Exception.php | 58 + libs/Zend/OpenId/Extension.php | 137 + libs/Zend/OpenId/Extension/Sreg.php | 300 + libs/Zend/OpenId/Provider.php | 781 + libs/Zend/OpenId/Provider/Storage.php | 106 + libs/Zend/OpenId/Provider/Storage/File.php | 397 + libs/Zend/OpenId/Provider/User.php | 57 + libs/Zend/OpenId/Provider/User/Session.php | 104 + libs/Zend/Paginator.php | 918 + libs/Zend/Paginator/Adapter/Array.php | 81 + libs/Zend/Paginator/Adapter/DbSelect.php | 203 + libs/Zend/Paginator/Adapter/DbTableSelect.php | 48 + libs/Zend/Paginator/Adapter/Interface.php | 47 + libs/Zend/Paginator/Adapter/Iterator.php | 95 + libs/Zend/Paginator/Adapter/Null.php | 73 + libs/Zend/Paginator/Exception.php | 35 + libs/Zend/Paginator/ScrollingStyle/All.php | 50 + .../Zend/Paginator/ScrollingStyle/Elastic.php | 61 + .../Paginator/ScrollingStyle/Interface.php | 38 + .../Zend/Paginator/ScrollingStyle/Jumping.php | 63 + .../Zend/Paginator/ScrollingStyle/Sliding.php | 78 + libs/Zend/Pdf.php | 900 + libs/Zend/Pdf/Cmap.php | 337 + libs/Zend/Pdf/Cmap/ByteEncoding.php | 442 + libs/Zend/Pdf/Cmap/ByteEncoding/Static.php | 59 + libs/Zend/Pdf/Cmap/SegmentToDelta.php | 401 + libs/Zend/Pdf/Cmap/TrimmedTable.php | 224 + libs/Zend/Pdf/Color.php | 44 + libs/Zend/Pdf/Color/Cmyk.php | 119 + libs/Zend/Pdf/Color/GrayScale.php | 81 + libs/Zend/Pdf/Color/Html.php | 407 + libs/Zend/Pdf/Color/Rgb.php | 106 + libs/Zend/Pdf/Element.php | 159 + libs/Zend/Pdf/Element/Array.php | 151 + libs/Zend/Pdf/Element/Boolean.php | 81 + libs/Zend/Pdf/Element/Dictionary.php | 181 + libs/Zend/Pdf/Element/Name.php | 159 + libs/Zend/Pdf/Element/Null.php | 74 + libs/Zend/Pdf/Element/Numeric.php | 93 + libs/Zend/Pdf/Element/Object.php | 250 + libs/Zend/Pdf/Element/Object/Stream.php | 409 + libs/Zend/Pdf/Element/Reference.php | 280 + libs/Zend/Pdf/Element/Reference/Context.php | 89 + libs/Zend/Pdf/Element/Reference/Table.php | 193 + libs/Zend/Pdf/Element/Stream.php | 124 + libs/Zend/Pdf/Element/String.php | 246 + libs/Zend/Pdf/Element/String/Binary.php | 110 + libs/Zend/Pdf/ElementFactory.php | 441 + libs/Zend/Pdf/ElementFactory/Interface.php | 142 + libs/Zend/Pdf/ElementFactory/Proxy.php | 212 + libs/Zend/Pdf/Exception.php | 341 + libs/Zend/Pdf/FileParser.php | 480 + libs/Zend/Pdf/FileParser/Font.php | 209 + libs/Zend/Pdf/FileParser/Font/OpenType.php | 1109 + .../Pdf/FileParser/Font/OpenType/TrueType.php | 87 + libs/Zend/Pdf/FileParser/Image.php | 56 + libs/Zend/Pdf/FileParser/Image/Png.php | 324 + libs/Zend/Pdf/FileParserDataSource.php | 205 + libs/Zend/Pdf/FileParserDataSource/File.php | 188 + libs/Zend/Pdf/FileParserDataSource/String.php | 126 + libs/Zend/Pdf/Filter/Ascii85.php | 59 + libs/Zend/Pdf/Filter/AsciiHex.php | 132 + libs/Zend/Pdf/Filter/Compression.php | 380 + libs/Zend/Pdf/Filter/Compression/Flate.php | 97 + libs/Zend/Pdf/Filter/Compression/Lzw.php | 91 + libs/Zend/Pdf/Filter/Interface.php | 53 + libs/Zend/Pdf/Font.php | 775 + libs/Zend/Pdf/Image.php | 244 + libs/Zend/Pdf/Page.php | 1450 + libs/Zend/Pdf/Parser.php | 467 + libs/Zend/Pdf/Parser/Stream.php | 59 + libs/Zend/Pdf/PhpArray.php | 128 + libs/Zend/Pdf/Resource.php | 108 + libs/Zend/Pdf/Resource/Font.php | 524 + libs/Zend/Pdf/Resource/Font/CidFont.php | 482 + .../Pdf/Resource/Font/CidFont/TrueType.php | 81 + libs/Zend/Pdf/Resource/Font/Extracted.php | 261 + .../Zend/Pdf/Resource/Font/FontDescriptor.php | 199 + libs/Zend/Pdf/Resource/Font/Simple.php | 281 + libs/Zend/Pdf/Resource/Font/Simple/Parsed.php | 101 + .../Resource/Font/Simple/Parsed/TrueType.php | 62 + .../Pdf/Resource/Font/Simple/Standard.php | 77 + .../Resource/Font/Simple/Standard/Courier.php | 289 + .../Font/Simple/Standard/CourierBold.php | 290 + .../Simple/Standard/CourierBoldOblique.php | 291 + .../Font/Simple/Standard/CourierOblique.php | 291 + .../Font/Simple/Standard/Helvetica.php | 299 + .../Font/Simple/Standard/HelveticaBold.php | 300 + .../Simple/Standard/HelveticaBoldOblique.php | 302 + .../Font/Simple/Standard/HelveticaOblique.php | 301 + .../Resource/Font/Simple/Standard/Symbol.php | 459 + .../Font/Simple/Standard/TimesBold.php | 298 + .../Font/Simple/Standard/TimesBoldItalic.php | 299 + .../Font/Simple/Standard/TimesItalic.php | 299 + .../Font/Simple/Standard/TimesRoman.php | 299 + .../Font/Simple/Standard/ZapfDingbats.php | 485 + libs/Zend/Pdf/Resource/Font/Type0.php | 256 + libs/Zend/Pdf/Resource/Image.php | 78 + libs/Zend/Pdf/Resource/Image/Jpeg.php | 138 + libs/Zend/Pdf/Resource/Image/Png.php | 359 + libs/Zend/Pdf/Resource/Image/Tiff.php | 431 + libs/Zend/Pdf/Resource/ImageFactory.php | 68 + libs/Zend/Pdf/StringParser.php | 709 + libs/Zend/Pdf/Style.php | 302 + libs/Zend/Pdf/Trailer.php | 127 + libs/Zend/Pdf/Trailer/Generator.php | 74 + libs/Zend/Pdf/Trailer/Keeper.php | 145 + libs/Zend/Pdf/UpdateInfoContainer.php | 137 + libs/Zend/ProgressBar.php | 205 + libs/Zend/ProgressBar/Adapter.php | 113 + libs/Zend/ProgressBar/Adapter/Console.php | 481 + libs/Zend/ProgressBar/Adapter/Exception.php | 38 + libs/Zend/ProgressBar/Adapter/JsPull.php | 117 + libs/Zend/ProgressBar/Adapter/JsPush.php | 148 + libs/Zend/ProgressBar/Exception.php | 38 + libs/Zend/Registry.php | 207 + libs/Zend/Request/Interface.php | 112 + libs/Zend/Rest/Client.php | 252 + libs/Zend/Rest/Client/Exception.php | 39 + libs/Zend/Rest/Client/Result.php | 224 + libs/Zend/Rest/Client/Result/Exception.php | 27 + libs/Zend/Rest/Exception.php | 36 + libs/Zend/Rest/Server.php | 610 + libs/Zend/Rest/Server/Exception.php | 39 + libs/Zend/Search/Exception.php | 36 + libs/Zend/Search/Lucene.php | 1524 + libs/Zend/Search/Lucene/Analysis/Analyzer.php | 176 + .../Lucene/Analysis/Analyzer/Common.php | 80 + .../Lucene/Analysis/Analyzer/Common/Text.php | 95 + .../Analyzer/Common/Text/CaseInsensitive.php | 46 + .../Analysis/Analyzer/Common/TextNum.php | 94 + .../Common/TextNum/CaseInsensitive.php | 46 + .../Lucene/Analysis/Analyzer/Common/Utf8.php | 125 + .../Analyzer/Common/Utf8/CaseInsensitive.php | 48 + .../Analysis/Analyzer/Common/Utf8Num.php | 125 + .../Common/Utf8Num/CaseInsensitive.php | 48 + libs/Zend/Search/Lucene/Analysis/Token.php | 153 + .../Search/Lucene/Analysis/TokenFilter.php | 47 + .../Lucene/Analysis/TokenFilter/LowerCase.php | 57 + .../Analysis/TokenFilter/LowerCaseUtf8.php | 69 + .../Analysis/TokenFilter/ShortWords.php | 68 + .../Lucene/Analysis/TokenFilter/StopWords.php | 100 + libs/Zend/Search/Lucene/Document.php | 129 + libs/Zend/Search/Lucene/Document/Docx.php | 119 + libs/Zend/Search/Lucene/Document/Html.php | 343 + libs/Zend/Search/Lucene/Document/OpenXml.php | 131 + libs/Zend/Search/Lucene/Document/Pptx.php | 192 + libs/Zend/Search/Lucene/Document/Xlsx.php | 255 + libs/Zend/Search/Lucene/Exception.php | 36 + libs/Zend/Search/Lucene/FSM.php | 433 + libs/Zend/Search/Lucene/FSMAction.php | 65 + libs/Zend/Search/Lucene/Field.php | 225 + .../Search/Lucene/Index/DictionaryLoader.php | 266 + libs/Zend/Search/Lucene/Index/DocsFilter.php | 58 + libs/Zend/Search/Lucene/Index/FieldInfo.php | 49 + libs/Zend/Search/Lucene/Index/SegmentInfo.php | 2005 + .../Lucene/Index/SegmentInfoPriorityQueue.php | 53 + .../Search/Lucene/Index/SegmentMerger.php | 273 + .../Search/Lucene/Index/SegmentWriter.php | 631 + .../Index/SegmentWriter/DocumentWriter.php | 217 + .../Index/SegmentWriter/StreamWriter.php | 98 + libs/Zend/Search/Lucene/Index/Term.php | 143 + libs/Zend/Search/Lucene/Index/TermInfo.php | 79 + libs/Zend/Search/Lucene/Index/Writer.php | 867 + libs/Zend/Search/Lucene/Interface.php | 437 + libs/Zend/Search/Lucene/LockManager.php | 240 + libs/Zend/Search/Lucene/PriorityQueue.php | 170 + libs/Zend/Search/Lucene/Proxy.php | 611 + .../Search/BooleanExpressionRecognizer.php | 280 + libs/Zend/Search/Lucene/Search/Query.php | 227 + .../Search/Lucene/Search/Query/Boolean.php | 806 + .../Zend/Search/Lucene/Search/Query/Empty.php | 140 + .../Zend/Search/Lucene/Search/Query/Fuzzy.php | 391 + .../Lucene/Search/Query/Insignificant.php | 141 + .../Search/Lucene/Search/Query/MultiTerm.php | 656 + .../Search/Lucene/Search/Query/Phrase.php | 568 + .../Zend/Search/Lucene/Search/Query/Range.php | 332 + libs/Zend/Search/Lucene/Search/Query/Term.php | 225 + .../Search/Lucene/Search/Query/Wildcard.php | 298 + libs/Zend/Search/Lucene/Search/QueryEntry.php | 87 + .../Lucene/Search/QueryEntry/Phrase.php | 149 + .../Lucene/Search/QueryEntry/Subquery.php | 86 + .../Search/Lucene/Search/QueryEntry/Term.php | 203 + libs/Zend/Search/Lucene/Search/QueryHit.php | 108 + libs/Zend/Search/Lucene/Search/QueryLexer.php | 511 + .../Zend/Search/Lucene/Search/QueryParser.php | 630 + .../Lucene/Search/QueryParserContext.php | 416 + .../Lucene/Search/QueryParserException.php | 40 + libs/Zend/Search/Lucene/Search/QueryToken.php | 228 + libs/Zend/Search/Lucene/Search/Similarity.php | 553 + .../Lucene/Search/Similarity/Default.php | 109 + libs/Zend/Search/Lucene/Search/Weight.php | 84 + .../Search/Lucene/Search/Weight/Boolean.php | 136 + .../Search/Lucene/Search/Weight/Empty.php | 56 + .../Search/Lucene/Search/Weight/MultiTerm.php | 137 + .../Search/Lucene/Search/Weight/Phrase.php | 107 + .../Zend/Search/Lucene/Search/Weight/Term.php | 124 + libs/Zend/Search/Lucene/Storage/Directory.php | 135 + .../Lucene/Storage/Directory/Filesystem.php | 362 + libs/Zend/Search/Lucene/Storage/File.php | 427 + .../Search/Lucene/Storage/File/Filesystem.php | 222 + .../Search/Lucene/Storage/File/Memory.php | 555 + libs/Zend/Server/Abstract.php | 242 + libs/Zend/Server/Cache.php | 147 + libs/Zend/Server/Definition.php | 267 + libs/Zend/Server/Exception.php | 35 + libs/Zend/Server/Interface.php | 118 + libs/Zend/Server/Method/Callback.php | 205 + libs/Zend/Server/Method/Definition.php | 293 + libs/Zend/Server/Method/Parameter.php | 214 + libs/Zend/Server/Method/Prototype.php | 208 + libs/Zend/Server/Reflection.php | 112 + libs/Zend/Server/Reflection/Class.php | 201 + libs/Zend/Server/Reflection/Exception.php | 38 + libs/Zend/Server/Reflection/Function.php | 39 + .../Server/Reflection/Function/Abstract.php | 502 + libs/Zend/Server/Reflection/Method.php | 110 + libs/Zend/Server/Reflection/Node.php | 201 + libs/Zend/Server/Reflection/Parameter.php | 163 + libs/Zend/Server/Reflection/Prototype.php | 106 + libs/Zend/Server/Reflection/ReturnValue.php | 113 + libs/Zend/Service/Abstract.php | 71 + libs/Zend/Service/Akismet.php | 387 + libs/Zend/Service/Amazon.php | 238 + libs/Zend/Service/Amazon/Accessories.php | 48 + libs/Zend/Service/Amazon/CustomerReview.php | 51 + libs/Zend/Service/Amazon/EditorialReview.php | 48 + libs/Zend/Service/Amazon/Image.php | 69 + libs/Zend/Service/Amazon/Item.php | 199 + libs/Zend/Service/Amazon/ListmaniaList.php | 48 + libs/Zend/Service/Amazon/Offer.php | 56 + libs/Zend/Service/Amazon/OfferSet.php | 73 + libs/Zend/Service/Amazon/Query.php | 98 + libs/Zend/Service/Amazon/ResultSet.php | 170 + libs/Zend/Service/Amazon/SimilarProduct.php | 48 + libs/Zend/Service/Audioscrobbler.php | 626 + libs/Zend/Service/Delicious.php | 616 + libs/Zend/Service/Delicious/Exception.php | 39 + libs/Zend/Service/Delicious/Post.php | 292 + libs/Zend/Service/Delicious/PostList.php | 300 + libs/Zend/Service/Delicious/SimplePost.php | 123 + libs/Zend/Service/Exception.php | 37 + libs/Zend/Service/Flickr.php | 627 + libs/Zend/Service/Flickr/Image.php | 76 + libs/Zend/Service/Flickr/Result.php | 195 + libs/Zend/Service/Flickr/ResultSet.php | 188 + libs/Zend/Service/Nirvanix.php | 108 + libs/Zend/Service/Nirvanix/Exception.php | 35 + libs/Zend/Service/Nirvanix/Namespace/Base.php | 171 + libs/Zend/Service/Nirvanix/Namespace/Imfs.php | 104 + libs/Zend/Service/Nirvanix/Response.php | 122 + libs/Zend/Service/ReCaptcha.php | 506 + libs/Zend/Service/ReCaptcha/Exception.php | 36 + libs/Zend/Service/ReCaptcha/MailHide.php | 300 + .../Service/ReCaptcha/MailHide/Exception.php | 36 + libs/Zend/Service/ReCaptcha/Response.php | 159 + libs/Zend/Service/Simpy.php | 421 + libs/Zend/Service/Simpy/Link.php | 215 + libs/Zend/Service/Simpy/LinkQuery.php | 200 + libs/Zend/Service/Simpy/LinkSet.php | 83 + libs/Zend/Service/Simpy/Note.php | 215 + libs/Zend/Service/Simpy/NoteSet.php | 83 + libs/Zend/Service/Simpy/Tag.php | 81 + libs/Zend/Service/Simpy/TagSet.php | 83 + libs/Zend/Service/Simpy/Watchlist.php | 191 + libs/Zend/Service/Simpy/WatchlistFilter.php | 81 + .../Zend/Service/Simpy/WatchlistFilterSet.php | 77 + libs/Zend/Service/Simpy/WatchlistSet.php | 82 + libs/Zend/Service/SlideShare.php | 609 + libs/Zend/Service/SlideShare/Exception.php | 38 + libs/Zend/Service/SlideShare/SlideShow.php | 437 + libs/Zend/Service/StrikeIron.php | 95 + libs/Zend/Service/StrikeIron/Base.php | 274 + libs/Zend/Service/StrikeIron/Decorator.php | 143 + libs/Zend/Service/StrikeIron/Exception.php | 34 + .../Service/StrikeIron/SalesUseTaxBasic.php | 45 + .../StrikeIron/USAddressVerification.php | 45 + libs/Zend/Service/StrikeIron/ZipCodeInfo.php | 45 + libs/Zend/Service/Technorati.php | 1028 + libs/Zend/Service/Technorati/Author.php | 242 + .../Service/Technorati/BlogInfoResult.php | 161 + libs/Zend/Service/Technorati/CosmosResult.php | 152 + .../Service/Technorati/CosmosResultSet.php | 176 + .../Service/Technorati/DailyCountsResult.php | 93 + .../Technorati/DailyCountsResultSet.php | 125 + libs/Zend/Service/Technorati/Exception.php | 39 + .../Zend/Service/Technorati/GetInfoResult.php | 103 + .../Zend/Service/Technorati/KeyInfoResult.php | 118 + libs/Zend/Service/Technorati/Result.php | 121 + libs/Zend/Service/Technorati/ResultSet.php | 290 + libs/Zend/Service/Technorati/SearchResult.php | 150 + .../Service/Technorati/SearchResultSet.php | 79 + libs/Zend/Service/Technorati/TagResult.php | 171 + libs/Zend/Service/Technorati/TagResultSet.php | 110 + libs/Zend/Service/Technorati/TagsResult.php | 93 + .../Zend/Service/Technorati/TagsResultSet.php | 67 + libs/Zend/Service/Technorati/Utils.php | 136 + libs/Zend/Service/Technorati/Weblog.php | 486 + libs/Zend/Service/Twitter.php | 762 + libs/Zend/Service/Twitter/Exception.php | 32 + libs/Zend/Service/Twitter/Search.php | 173 + libs/Zend/Service/Yahoo.php | 947 + libs/Zend/Service/Yahoo/Image.php | 71 + libs/Zend/Service/Yahoo/ImageResult.php | 111 + libs/Zend/Service/Yahoo/ImageResultSet.php | 63 + libs/Zend/Service/Yahoo/InlinkDataResult.php | 58 + .../Service/Yahoo/InlinkDataResultSet.php | 62 + libs/Zend/Service/Yahoo/LocalResult.php | 124 + libs/Zend/Service/Yahoo/LocalResultSet.php | 84 + libs/Zend/Service/Yahoo/NewsResult.php | 112 + libs/Zend/Service/Yahoo/NewsResultSet.php | 63 + libs/Zend/Service/Yahoo/PageDataResult.php | 58 + libs/Zend/Service/Yahoo/PageDataResultSet.php | 62 + libs/Zend/Service/Yahoo/Result.php | 126 + libs/Zend/Service/Yahoo/ResultSet.php | 195 + libs/Zend/Service/Yahoo/VideoResult.php | 132 + libs/Zend/Service/Yahoo/VideoResultSet.php | 63 + libs/Zend/Service/Yahoo/WebResult.php | 100 + libs/Zend/Service/Yahoo/WebResultSet.php | 63 + libs/Zend/Session.php | 832 + libs/Zend/Session/Abstract.php | 185 + libs/Zend/Session/Exception.php | 74 + libs/Zend/Session/Namespace.php | 490 + libs/Zend/Session/SaveHandler/DbTable.php | 589 + libs/Zend/Session/SaveHandler/Exception.php | 37 + libs/Zend/Session/SaveHandler/Interface.php | 81 + libs/Zend/Session/Validator/Abstract.php | 69 + libs/Zend/Session/Validator/HttpUserAgent.php | 66 + libs/Zend/Session/Validator/Interface.php | 52 + libs/Zend/Soap/AutoDiscover.php | 398 + libs/Zend/Soap/AutoDiscover/Exception.php | 23 + libs/Zend/Soap/Client.php | 937 + libs/Zend/Soap/Client/Common.php | 73 + libs/Zend/Soap/Client/DotNet.php | 88 + libs/Zend/Soap/Client/Exception.php | 33 + libs/Zend/Soap/Client/Local.php | 95 + libs/Zend/Soap/Server.php | 849 + libs/Zend/Soap/Server/Exception.php | 35 + libs/Zend/Soap/Wsdl.php | 579 + libs/Zend/Soap/Wsdl/CodeGenerator.php | 127 + libs/Zend/Soap/Wsdl/Exception.php | 25 + libs/Zend/Soap/Wsdl/Parser.php | 173 + libs/Zend/Soap/Wsdl/Parser/Result.php | 52 + libs/Zend/Soap/Wsdl/Strategy/Abstract.php | 27 + libs/Zend/Soap/Wsdl/Strategy/AnyType.php | 45 + .../Soap/Wsdl/Strategy/ArrayOfTypeComplex.php | 133 + .../Wsdl/Strategy/ArrayOfTypeSequence.php | 148 + .../Soap/Wsdl/Strategy/DefaultComplexType.php | 69 + libs/Zend/Soap/Wsdl/Strategy/Interface.php | 35 + .../Zend/Test/PHPUnit/Constraint/DomQuery.php | 379 + .../Test/PHPUnit/Constraint/Exception.php | 16 + .../Zend/Test/PHPUnit/Constraint/Redirect.php | 260 + .../PHPUnit/Constraint/ResponseHeader.php | 378 + libs/Zend/Test/PHPUnit/ControllerTestCase.php | 1107 + libs/Zend/Text/Exception.php | 38 + libs/Zend/Text/Figlet.php | 1232 + libs/Zend/Text/Figlet/Exception.php | 38 + libs/Zend/Text/Figlet/zend-framework.flf | 753 + libs/Zend/Text/Table.php | 532 + libs/Zend/Text/Table/Column.php | 238 + libs/Zend/Text/Table/Decorator/Ascii.php | 147 + libs/Zend/Text/Table/Decorator/Interface.php | 108 + libs/Zend/Text/Table/Decorator/Unicode.php | 176 + libs/Zend/Text/Table/Exception.php | 38 + libs/Zend/Text/Table/Row.php | 215 + libs/Zend/TimeSync.php | 306 + libs/Zend/TimeSync/Exception.php | 64 + libs/Zend/TimeSync/Ntp.php | 400 + libs/Zend/TimeSync/Protocol.php | 148 + libs/Zend/TimeSync/Sntp.php | 119 + libs/Zend/Translate.php | 176 + libs/Zend/Translate/Adapter.php | 652 + libs/Zend/Translate/Adapter/Array.php | 89 + libs/Zend/Translate/Adapter/Csv.php | 98 + libs/Zend/Translate/Adapter/Gettext.php | 169 + libs/Zend/Translate/Adapter/Ini.php | 81 + libs/Zend/Translate/Adapter/Qt.php | 176 + libs/Zend/Translate/Adapter/Tbx.php | 181 + libs/Zend/Translate/Adapter/Tmx.php | 183 + libs/Zend/Translate/Adapter/Xliff.php | 215 + libs/Zend/Translate/Adapter/XmlTm.php | 155 + libs/Zend/Translate/Exception.php | 37 + libs/Zend/Uri.php | 185 + libs/Zend/Uri/Exception.php | 37 + libs/Zend/Uri/Http.php | 725 + libs/Zend/Validate.php | 171 + libs/Zend/Validate/Abstract.php | 348 + libs/Zend/Validate/Alnum.php | 120 + libs/Zend/Validate/Alpha.php | 120 + libs/Zend/Validate/Barcode.php | 99 + libs/Zend/Validate/Barcode/Ean13.php | 112 + libs/Zend/Validate/Barcode/UpcA.php | 100 + libs/Zend/Validate/Between.php | 200 + libs/Zend/Validate/Ccnum.php | 111 + libs/Zend/Validate/Date.php | 250 + libs/Zend/Validate/Digits.php | 100 + libs/Zend/Validate/EmailAddress.php | 245 + libs/Zend/Validate/Exception.php | 37 + libs/Zend/Validate/File/Count.php | 262 + libs/Zend/Validate/File/Crc32.php | 179 + libs/Zend/Validate/File/ExcludeExtension.php | 94 + libs/Zend/Validate/File/ExcludeMimeType.php | 91 + libs/Zend/Validate/File/Exists.php | 203 + libs/Zend/Validate/File/Extension.php | 234 + libs/Zend/Validate/File/FilesSize.php | 163 + libs/Zend/Validate/File/Hash.php | 195 + libs/Zend/Validate/File/ImageSize.php | 370 + libs/Zend/Validate/File/IsCompressed.php | 133 + libs/Zend/Validate/File/IsImage.php | 137 + libs/Zend/Validate/File/Md5.php | 183 + libs/Zend/Validate/File/MimeType.php | 231 + libs/Zend/Validate/File/NotExists.php | 84 + libs/Zend/Validate/File/Sha1.php | 181 + libs/Zend/Validate/File/Size.php | 395 + libs/Zend/Validate/File/Upload.php | 216 + libs/Zend/Validate/Float.php | 75 + libs/Zend/Validate/GreaterThan.php | 114 + libs/Zend/Validate/Hex.php | 74 + libs/Zend/Validate/Hostname.php | 444 + libs/Zend/Validate/Hostname/At.php | 50 + libs/Zend/Validate/Hostname/Ch.php | 50 + libs/Zend/Validate/Hostname/De.php | 58 + libs/Zend/Validate/Hostname/Fi.php | 50 + libs/Zend/Validate/Hostname/Hu.php | 50 + libs/Zend/Validate/Hostname/Interface.php | 52 + libs/Zend/Validate/Hostname/Li.php | 50 + libs/Zend/Validate/Hostname/No.php | 52 + libs/Zend/Validate/Hostname/Se.php | 50 + libs/Zend/Validate/Identical.php | 117 + libs/Zend/Validate/InArray.php | 138 + libs/Zend/Validate/Int.php | 73 + libs/Zend/Validate/Interface.php | 71 + libs/Zend/Validate/Ip.php | 66 + libs/Zend/Validate/LessThan.php | 113 + libs/Zend/Validate/NotEmpty.php | 74 + libs/Zend/Validate/Regex.php | 125 + libs/Zend/Validate/StringLength.php | 180 + libs/Zend/Version.php | 51 + libs/Zend/View.php | 110 + libs/Zend/View/Abstract.php | 1085 + libs/Zend/View/Exception.php | 51 + libs/Zend/View/Helper/Abstract.php | 64 + libs/Zend/View/Helper/Action.php | 160 + libs/Zend/View/Helper/DeclareVars.php | 95 + libs/Zend/View/Helper/Doctype.php | 191 + libs/Zend/View/Helper/Fieldset.php | 79 + libs/Zend/View/Helper/Form.php | 71 + libs/Zend/View/Helper/FormButton.php | 104 + libs/Zend/View/Helper/FormCheckbox.php | 162 + libs/Zend/View/Helper/FormElement.php | 165 + libs/Zend/View/Helper/FormErrors.php | 156 + libs/Zend/View/Helper/FormFile.php | 80 + libs/Zend/View/Helper/FormHidden.php | 65 + libs/Zend/View/Helper/FormImage.php | 100 + libs/Zend/View/Helper/FormLabel.php | 64 + libs/Zend/View/Helper/FormMultiCheckbox.php | 73 + libs/Zend/View/Helper/FormNote.php | 60 + libs/Zend/View/Helper/FormPassword.php | 94 + libs/Zend/View/Helper/FormRadio.php | 182 + libs/Zend/View/Helper/FormReset.php | 87 + libs/Zend/View/Helper/FormSelect.php | 173 + libs/Zend/View/Helper/FormSubmit.php | 83 + libs/Zend/View/Helper/FormText.php | 83 + libs/Zend/View/Helper/FormTextarea.php | 103 + libs/Zend/View/Helper/HeadLink.php | 396 + libs/Zend/View/Helper/HeadMeta.php | 359 + libs/Zend/View/Helper/HeadScript.php | 470 + libs/Zend/View/Helper/HeadStyle.php | 377 + libs/Zend/View/Helper/HeadTitle.php | 177 + libs/Zend/View/Helper/HtmlElement.php | 141 + libs/Zend/View/Helper/HtmlFlash.php | 60 + libs/Zend/View/Helper/HtmlList.php | 86 + libs/Zend/View/Helper/HtmlObject.php | 80 + libs/Zend/View/Helper/HtmlPage.php | 75 + libs/Zend/View/Helper/HtmlQuicktime.php | 82 + libs/Zend/View/Helper/InlineScript.php | 60 + libs/Zend/View/Helper/Interface.php | 46 + libs/Zend/View/Helper/Json.php | 66 + libs/Zend/View/Helper/Layout.php | 81 + libs/Zend/View/Helper/PaginationControl.php | 141 + libs/Zend/View/Helper/Partial.php | 147 + libs/Zend/View/Helper/Partial/Exception.php | 39 + libs/Zend/View/Helper/PartialLoop.php | 94 + libs/Zend/View/Helper/Placeholder.php | 86 + .../View/Helper/Placeholder/Container.php | 35 + .../Helper/Placeholder/Container/Abstract.php | 375 + .../Placeholder/Container/Exception.php | 39 + .../Placeholder/Container/Standalone.php | 319 + .../Zend/View/Helper/Placeholder/Registry.php | 183 + .../Helper/Placeholder/Registry/Exception.php | 39 + libs/Zend/View/Helper/RenderToPlaceholder.php | 44 + libs/Zend/View/Helper/Translate.php | 178 + libs/Zend/View/Helper/Url.php | 51 + libs/Zend/View/Interface.php | 136 + libs/Zend/View/Stream.php | 182 + libs/Zend/Wildfire/Channel/HttpHeaders.php | 289 + libs/Zend/Wildfire/Channel/Interface.php | 37 + libs/Zend/Wildfire/Exception.php | 35 + libs/Zend/Wildfire/Plugin/FirePhp.php | 610 + libs/Zend/Wildfire/Plugin/FirePhp/Message.php | 195 + .../Wildfire/Plugin/FirePhp/TableMessage.php | 98 + libs/Zend/Wildfire/Plugin/Interface.php | 47 + libs/Zend/Wildfire/Protocol/JsonStream.php | 235 + libs/Zend/XmlRpc/Client.php | 355 + libs/Zend/XmlRpc/Client/Exception.php | 39 + libs/Zend/XmlRpc/Client/FaultException.php | 37 + libs/Zend/XmlRpc/Client/HttpException.php | 40 + .../XmlRpc/Client/IntrospectException.php | 39 + .../XmlRpc/Client/ServerIntrospection.php | 162 + libs/Zend/XmlRpc/Client/ServerProxy.php | 94 + libs/Zend/XmlRpc/Exception.php | 36 + libs/Zend/XmlRpc/Fault.php | 307 + libs/Zend/XmlRpc/Request.php | 443 + libs/Zend/XmlRpc/Request/Http.php | 129 + libs/Zend/XmlRpc/Request/Stdin.php | 84 + libs/Zend/XmlRpc/Response.php | 249 + libs/Zend/XmlRpc/Response/Http.php | 51 + libs/Zend/XmlRpc/Server.php | 581 + libs/Zend/XmlRpc/Server/Cache.php | 46 + libs/Zend/XmlRpc/Server/Exception.php | 42 + libs/Zend/XmlRpc/Server/Fault.php | 201 + libs/Zend/XmlRpc/Server/System.php | 149 + libs/Zend/XmlRpc/Value.php | 401 + libs/Zend/XmlRpc/Value/Array.php | 78 + libs/Zend/XmlRpc/Value/Base64.php | 89 + libs/Zend/XmlRpc/Value/Boolean.php | 84 + libs/Zend/XmlRpc/Value/Collection.php | 79 + libs/Zend/XmlRpc/Value/DateTime.php | 81 + libs/Zend/XmlRpc/Value/Double.php | 62 + libs/Zend/XmlRpc/Value/Exception.php | 39 + libs/Zend/XmlRpc/Value/Integer.php | 62 + libs/Zend/XmlRpc/Value/Nil.php | 79 + libs/Zend/XmlRpc/Value/Scalar.php | 60 + libs/Zend/XmlRpc/Value/String.php | 74 + libs/Zend/XmlRpc/Value/Struct.php | 79 + libs/jpgraph/CHANGELOG-2.3.3.txt | 77 + libs/jpgraph/QPL.txt | 119 + libs/jpgraph/README | 152 + libs/jpgraph/VERSION | 1 + libs/jpgraph/gd_image.inc.php | 1619 + libs/jpgraph/imgdata_balls.inc.php | 1061 + libs/jpgraph/imgdata_bevels.inc.php | 104 + libs/jpgraph/imgdata_diamonds.inc.php | 177 + libs/jpgraph/imgdata_pushpins.inc.php | 517 + libs/jpgraph/imgdata_squares.inc.php | 150 + libs/jpgraph/imgdata_stars.inc.php | 144 + libs/jpgraph/jpg-config.inc.php | 227 + libs/jpgraph/jpgraph.php | 6391 + libs/jpgraph/jpgraph_antispam-digits.php | 205 + libs/jpgraph/jpgraph_antispam.php | 615 + libs/jpgraph/jpgraph_bar.php | 1009 + libs/jpgraph/jpgraph_canvas.php | 95 + libs/jpgraph/jpgraph_canvtools.php | 515 + libs/jpgraph/jpgraph_date.php | 499 + libs/jpgraph/jpgraph_errhandler.inc.php | 278 + libs/jpgraph/jpgraph_error.php | 156 + libs/jpgraph/jpgraph_flags.php | 376 + libs/jpgraph/jpgraph_gantt.php | 3803 + libs/jpgraph/jpgraph_gb2312.php | 1552 + libs/jpgraph/jpgraph_gradient.php | 423 + libs/jpgraph/jpgraph_iconplot.php | 190 + libs/jpgraph/jpgraph_imgtrans.php | 223 + libs/jpgraph/jpgraph_led.php | 316 + libs/jpgraph/jpgraph_line.php | 632 + libs/jpgraph/jpgraph_log.php | 283 + libs/jpgraph/jpgraph_mgraph.php | 387 + libs/jpgraph/jpgraph_pie.php | 1439 + libs/jpgraph/jpgraph_pie3d.php | 923 + libs/jpgraph/jpgraph_plotband.php | 635 + libs/jpgraph/jpgraph_plotmark.inc.php | 497 + libs/jpgraph/jpgraph_polar.php | 841 + libs/jpgraph/jpgraph_radar.php | 732 + libs/jpgraph/jpgraph_regstat.php | 202 + libs/jpgraph/jpgraph_scatter.php | 231 + libs/jpgraph/jpgraph_stock.php | 183 + libs/jpgraph/jpgraph_ttf.inc.php | 339 + libs/jpgraph/jpgraph_utils.inc.php | 526 + libs/jpgraph/lang/de.inc.php | 500 + libs/jpgraph/lang/en.inc.php | 500 + libs/jpgraph/lang/prod.inc.php | 357 + .../default/controllers/AboutController.php | 36 + .../default/controllers/ErrorController.php | 14 + .../controllers/FeedbackController.php | 111 + .../default/controllers/HistoryController.php | 64 + .../controllers/IdentityController.php | 58 + .../default/controllers/IndexController.php | 87 + .../controllers/LearnmoreController.php | 37 + .../controllers/MaintenancemodeController.php | 35 + .../controllers/MessageusersController.php | 130 + .../default/controllers/OpenidController.php | 178 + .../default/controllers/PrivacyController.php | 32 + .../default/controllers/SitesController.php | 121 + modules/default/forms/ErrorMessages.php | 25 + modules/default/forms/FeedbackForm.php | 61 + modules/default/forms/MessageUsersForm.php | 34 + modules/default/forms/OpenidLoginForm.php | 28 + modules/default/models/Association.php | 15 + modules/default/models/Associations.php | 26 + modules/default/models/Field.php | 68 + modules/default/models/Fields.php | 55 + modules/default/models/FieldsValue.php | 15 + modules/default/models/FieldsValues.php | 24 + modules/default/models/Histories.php | 51 + modules/default/models/History.php | 17 + modules/default/models/Settings.php | 38 + modules/default/models/Site.php | 15 + modules/default/models/Sites.php | 52 + .../views/scripts/about/index-de.phtml | 22 + .../views/scripts/about/index-en.phtml | 22 + .../views/scripts/about/index-es.phtml | 22 + .../default/views/scripts/about/index.phtml | 22 + .../default/views/scripts/error/error.phtml | 18 + .../views/scripts/feedback/index.phtml | 11 + .../default/views/scripts/history/index.phtml | 25 + .../default/views/scripts/identity/id.phtml | 4 + .../views/scripts/index/index-de.phtml | 40 + .../views/scripts/index/index-en.phtml | 40 + .../views/scripts/index/index-es.phtml | 40 + .../views/scripts/index/subheader-de.phtml | 1 + .../views/scripts/index/subheader-en.phtml | 1 + .../views/scripts/index/subheader-es.phtml | 1 + .../views/scripts/messageusers/index.phtml | 54 + .../default/views/scripts/openid/login.phtml | 10 + .../default/views/scripts/openid/trust.phtml | 35 + .../default/views/scripts/privacy/index.phtml | 4 + .../default/views/scripts/sites/index.phtml | 35 + .../controllers/CompleteController.php | 19 + .../controllers/CredentialsController.php | 205 + .../install/controllers/IndexController.php | 19 + .../controllers/PermissionsController.php | 20 + modules/install/forms/InstallForm.php | 44 + .../views/scripts/complete/index.phtml | 20 + .../views/scripts/credentials/index.phtml | 16 + .../install/views/scripts/index/index.phtml | 14 + .../views/scripts/permissions/index.phtml | 19 + .../controllers/AuthorizationsController.php | 106 + modules/stats/controllers/IndexController.php | 19 + .../controllers/RegistrationsController.php | 130 + modules/stats/controllers/SitesController.php | 168 + modules/stats/controllers/TopController.php | 19 + modules/stats/models/Stats.php | 161 + .../views/scripts/authorizations/index.phtml | 10 + modules/stats/views/scripts/index/index.phtml | 24 + .../views/scripts/registrations/index.phtml | 10 + modules/stats/views/scripts/sites/index.phtml | 9 + modules/stats/views/scripts/top/index.phtml | 10 + modules/users/controllers/LoginController.php | 89 + .../controllers/ManageusersController.php | 33 + .../controllers/PersonalinfoController.php | 72 + .../users/controllers/ProfileController.php | 22 + .../controllers/ProfilegeneralController.php | 307 + .../controllers/RecoverpasswordController.php | 141 + .../users/controllers/RegisterController.php | 227 + .../users/controllers/UserslistController.php | 67 + modules/users/forms/AccountInfoForm.php | 63 + modules/users/forms/ChangePasswordForm.php | 30 + modules/users/forms/LoginForm.php | 22 + modules/users/forms/PersonalInfoForm.php | 65 + modules/users/forms/RecoverPasswordForm.php | 25 + modules/users/forms/RegisterForm.php | 76 + modules/users/models/OpenIdUser.php | 53 + modules/users/models/User.php | 59 + modules/users/models/Users.php | 347 + modules/users/views/scripts/login/index.phtml | 79 + .../views/scripts/manageusers/index.phtml | 53 + .../views/scripts/personalinfo/edit.phtml | 60 + .../views/scripts/personalinfo/index.phtml | 28 + .../views/scripts/personalinfo/show.phtml | 12 + .../users/views/scripts/profile/index.phtml | 44 + .../scripts/profilegeneral/accountinfo.phtml | 34 + .../profilegeneral/changepassword.phtml | 56 + .../profilegeneral/confirmdelete.phtml | 37 + .../profilegeneral/editaccountinfo.phtml | 35 + .../views/scripts/recoverpassword/index.phtml | 8 + .../users/views/scripts/register/eula.phtml | 30 + .../users/views/scripts/register/index.phtml | 14 + resources/de/eula.txt | 30 + resources/de/passwordreset2_mail.txt | 8 + resources/de/passwordreset_mail.txt | 14 + resources/de/privacy.txt | 15 + resources/de/registration_mail.txt | 12 + resources/en/eula.txt | 30 + resources/en/passwordreset2_mail.txt | 8 + resources/en/passwordreset_mail.txt | 13 + resources/en/privacy.txt | 13 + resources/en/registration_mail.txt | 11 + resources/es/eula.txt | 30 + resources/es/passwordreset2_mail.txt | 8 + resources/es/passwordreset_mail.txt | 13 + resources/es/privacy.txt | 14 + resources/es/registration_mail.txt | 11 + resources/nl/eula.txt | 30 + resources/nl/privacy.txt | 15 + resources/pl/eula.txt | 30 + resources/pl/privacy.txt | 15 + scripts/clear_logs.php | 33 + setup/final.sql | 97 + tests/AllTests.php | 39 + tests/CaptchaImageTestSessionContainer.php | 56 + tests/TestHarness.php | 55 + tests/TestRequest.php | 21 + tests/Zend_Mail_Transport_Mock.php | 34 + .../controllers/FeedbackControllerTests.php | 146 + .../controllers/HistoryControllerTests.php | 80 + .../controllers/IdentityControllerTests.php | 50 + .../MessageusersControllerTests.php | 139 + .../controllers/OpenidControllerTests.php | 403 + .../ProfilegeneralControllerTests.php | 52 + .../controllers/RegisterControllerTests.php | 311 + tests/modules/users/models/UsersTests.php | 57 + utilities/deleteTestUsers.php | 26 + utilities/generateRandomHistory.php | 65 + utilities/generateRandomTrustedSites.php | 64 + utilities/generateRandomUsers.php | 66 + utilities/lighttpd_mod_rewrite.txt | 12 + views/layouts/layout.phtml | 87 + webdir/.htaccess | 6 + webdir/favicon.ico | Bin 0 -> 1150 bytes webdir/images/bg_content.jpg | Bin 0 -> 3764 bytes webdir/images/bg_foot.jpg | Bin 0 -> 5908 bytes webdir/images/bg_panel.gif | Bin 0 -> 13956 bytes webdir/images/bg_panel.png | Bin 0 -> 1185 bytes webdir/images/bg_panel_title.gif | Bin 0 -> 158 bytes webdir/images/bg_title_article.gif | Bin 0 -> 379 bytes webdir/images/bg_title_article_span.gif | Bin 0 -> 5633 bytes webdir/images/button_register_a.png | Bin 0 -> 553 bytes webdir/images/button_register_span.png | Bin 0 -> 781 bytes webdir/images/content_background.png | Bin 0 -> 3693 bytes webdir/images/footer_background.png | Bin 0 -> 3686 bytes webdir/images/h2.png | Bin 0 -> 2552 bytes webdir/images/header_background.png | Bin 0 -> 3671 bytes webdir/images/logo.gif | Bin 0 -> 4714 bytes webdir/images/openid_small_logo.png | Bin 0 -> 916 bytes webdir/images/progress.gif | Bin 0 -> 734 bytes webdir/images/sidebar_border_left.png | Bin 0 -> 3787 bytes webdir/images/topnav_background.png | Bin 0 -> 3513 bytes webdir/images/topnav_background_hover.png | Bin 0 -> 3513 bytes webdir/index.php | 17 + webdir/javascript/communityid.js | 815 + webdir/javascript/language.php | 65 + webdir/javascript/tools-min.js | 105 + webdir/javascript/yui/animation/README | 71 + .../yui/animation/animation-debug.js | 1385 + .../javascript/yui/animation/animation-min.js | 23 + webdir/javascript/yui/animation/animation.js | 1381 + .../javascript/yui/assets/skins/sam/asc.gif | Bin 0 -> 177 bytes .../yui/assets/skins/sam/autocomplete.css | 7 + .../yui/assets/skins/sam/blankimage.png | Bin 0 -> 2314 bytes .../yui/assets/skins/sam/button.css | 7 + .../yui/assets/skins/sam/calendar.css | 7 + .../yui/assets/skins/sam/carousel.css | 7 + .../yui/assets/skins/sam/colorpicker.css | 7 + .../yui/assets/skins/sam/container.css | 7 + .../yui/assets/skins/sam/datatable.css | 7 + .../javascript/yui/assets/skins/sam/desc.gif | Bin 0 -> 177 bytes .../yui/assets/skins/sam/dt-arrow-dn.png | Bin 0 -> 116 bytes .../yui/assets/skins/sam/dt-arrow-up.png | Bin 0 -> 116 bytes .../yui/assets/skins/sam/editor-knob.gif | Bin 0 -> 138 bytes .../assets/skins/sam/editor-sprite-active.gif | Bin 0 -> 5614 bytes .../yui/assets/skins/sam/editor-sprite.gif | Bin 0 -> 5690 bytes .../yui/assets/skins/sam/editor.css | 7 + .../assets/skins/sam/header_background.png | Bin 0 -> 158 bytes .../yui/assets/skins/sam/hue_bg.png | Bin 0 -> 1120 bytes .../yui/assets/skins/sam/imagecropper.css | 7 + .../yui/assets/skins/sam/layout.css | 7 + .../yui/assets/skins/sam/layout_sprite.png | Bin 0 -> 1409 bytes .../yui/assets/skins/sam/loading.gif | Bin 0 -> 2673 bytes .../yui/assets/skins/sam/logger.css | 7 + .../skins/sam/menu-button-arrow-disabled.png | Bin 0 -> 173 bytes .../assets/skins/sam/menu-button-arrow.png | Bin 0 -> 173 bytes .../javascript/yui/assets/skins/sam/menu.css | 7 + .../sam/menubaritem_submenuindicator.png | Bin 0 -> 3618 bytes .../menubaritem_submenuindicator_disabled.png | Bin 0 -> 3618 bytes .../assets/skins/sam/menuitem_checkbox.png | Bin 0 -> 3625 bytes .../skins/sam/menuitem_checkbox_disabled.png | Bin 0 -> 3625 bytes .../skins/sam/menuitem_submenuindicator.png | Bin 0 -> 3617 bytes .../menuitem_submenuindicator_disabled.png | Bin 0 -> 3617 bytes .../yui/assets/skins/sam/paginator.css | 7 + .../yui/assets/skins/sam/picker_mask.png | Bin 0 -> 12174 bytes .../yui/assets/skins/sam/profilerviewer.css | 7 + .../yui/assets/skins/sam/resize.css | 7 + .../yui/assets/skins/sam/simpleeditor.css | 7 + .../javascript/yui/assets/skins/sam/skin.css | 26 + .../yui/assets/skins/sam/slider.css | 7 + .../skins/sam/split-button-arrow-active.png | Bin 0 -> 280 bytes .../skins/sam/split-button-arrow-disabled.png | Bin 0 -> 185 bytes .../skins/sam/split-button-arrow-focus.png | Bin 0 -> 185 bytes .../skins/sam/split-button-arrow-hover.png | Bin 0 -> 185 bytes .../assets/skins/sam/split-button-arrow.png | Bin 0 -> 185 bytes .../yui/assets/skins/sam/sprite.png | Bin 0 -> 3745 bytes .../yui/assets/skins/sam/sprite.psd | Bin 0 -> 118162 bytes .../yui/assets/skins/sam/tabview.css | 7 + .../yui/assets/skins/sam/treeview-loading.gif | Bin 0 -> 2673 bytes .../yui/assets/skins/sam/treeview-sprite.gif | Bin 0 -> 4326 bytes .../yui/assets/skins/sam/treeview.css | 7 + .../javascript/yui/assets/skins/sam/wait.gif | Bin 0 -> 1100 bytes .../yui/assets/skins/sam/yuitest.css | 7 + webdir/javascript/yui/autocomplete/README | 212 + .../autocomplete/assets/autocomplete-core.css | 7 + .../assets/skins/sam/autocomplete-skin.css | 57 + .../assets/skins/sam/autocomplete.css | 7 + .../yui/autocomplete/autocomplete-debug.js | 2917 + .../yui/autocomplete/autocomplete-min.js | 12 + .../yui/autocomplete/autocomplete.js | 2873 + webdir/javascript/yui/base/README | 29 + webdir/javascript/yui/base/base-min.css | 7 + webdir/javascript/yui/base/base.css | 82 + webdir/javascript/yui/button/README | 436 + .../yui/button/assets/button-core.css | 44 + .../button/assets/skins/sam/button-skin.css | 240 + .../yui/button/assets/skins/sam/button.css | 7 + .../skins/sam/menu-button-arrow-disabled.png | Bin 0 -> 173 bytes .../assets/skins/sam/menu-button-arrow.png | Bin 0 -> 173 bytes .../skins/sam/split-button-arrow-active.png | Bin 0 -> 280 bytes .../skins/sam/split-button-arrow-disabled.png | Bin 0 -> 185 bytes .../skins/sam/split-button-arrow-focus.png | Bin 0 -> 185 bytes .../skins/sam/split-button-arrow-hover.png | Bin 0 -> 185 bytes .../assets/skins/sam/split-button-arrow.png | Bin 0 -> 185 bytes webdir/javascript/yui/button/button-debug.js | 4859 + webdir/javascript/yui/button/button-min.js | 11 + webdir/javascript/yui/button/button.js | 4798 + webdir/javascript/yui/calendar/README | 421 + .../yui/calendar/assets/calendar-core.css | 132 + .../yui/calendar/assets/calendar.css | 320 + .../yui/calendar/assets/calgrad.png | Bin 0 -> 497 bytes .../javascript/yui/calendar/assets/callt.gif | Bin 0 -> 93 bytes .../javascript/yui/calendar/assets/calrt.gif | Bin 0 -> 94 bytes .../javascript/yui/calendar/assets/calx.gif | Bin 0 -> 88 bytes .../assets/skins/sam/calendar-skin.css | 361 + .../calendar/assets/skins/sam/calendar.css | 7 + .../javascript/yui/calendar/calendar-debug.js | 7168 + .../javascript/yui/calendar/calendar-min.js | 18 + webdir/javascript/yui/calendar/calendar.js | 7138 + webdir/javascript/yui/carousel/README | 5 + .../yui/carousel/assets/ajax-loader.gif | Bin 0 -> 3208 bytes .../yui/carousel/assets/carousel-core.css | 82 + .../assets/skins/sam/carousel-skin.css | 119 + .../carousel/assets/skins/sam/carousel.css | 7 + .../yui/carousel/carousel-beta-debug.js | 2945 + .../yui/carousel/carousel-beta-min.js | 11 + .../javascript/yui/carousel/carousel-beta.js | 2913 + webdir/javascript/yui/charts/README | 38 + .../javascript/yui/charts/assets/charts.swf | Bin 0 -> 67900 bytes .../yui/charts/charts-experimental-debug.js | 2291 + .../yui/charts/charts-experimental-min.js | 16 + .../yui/charts/charts-experimental.js | 2287 + webdir/javascript/yui/colorpicker/README | 21 + .../colorpicker/assets/colorpicker-core.css | 6 + .../yui/colorpicker/assets/hue_thumb.png | Bin 0 -> 195 bytes .../yui/colorpicker/assets/picker_mask.png | Bin 0 -> 12174 bytes .../yui/colorpicker/assets/picker_thumb.png | Bin 0 -> 192 bytes .../assets/skins/sam/colorpicker-skin.css | 105 + .../assets/skins/sam/colorpicker.css | 7 + .../colorpicker/assets/skins/sam/hue_bg.png | Bin 0 -> 1120 bytes .../assets/skins/sam/picker_mask.png | Bin 0 -> 12174 bytes .../yui/colorpicker/colorpicker-debug.js | 1755 + .../yui/colorpicker/colorpicker-min.js | 9 + .../javascript/yui/colorpicker/colorpicker.js | 1735 + webdir/javascript/yui/connection/README | 302 + .../yui/connection/connection-debug.js | 1409 + .../yui/connection/connection-min.js | 8 + .../javascript/yui/connection/connection.js | 1379 + webdir/javascript/yui/container/README | 1129 + .../yui/container/assets/alrt16_1.gif | Bin 0 -> 971 bytes .../yui/container/assets/blck16_1.gif | Bin 0 -> 591 bytes .../yui/container/assets/close12_1.gif | Bin 0 -> 85 bytes .../yui/container/assets/container-core.css | 168 + .../yui/container/assets/container.css | 325 + .../yui/container/assets/hlp16_1.gif | Bin 0 -> 928 bytes .../yui/container/assets/info16_1.gif | Bin 0 -> 601 bytes .../assets/skins/sam/container-skin.css | 242 + .../container/assets/skins/sam/container.css | 7 + .../yui/container/assets/tip16_1.gif | Bin 0 -> 552 bytes .../yui/container/assets/warn16_1.gif | Bin 0 -> 580 bytes .../yui/container/container-debug.js | 8861 + .../javascript/yui/container/container-min.js | 19 + webdir/javascript/yui/container/container.js | 8837 + .../yui/container/container_core-debug.js | 5059 + .../yui/container/container_core-min.js | 13 + .../yui/container/container_core.js | 5049 + webdir/javascript/yui/cookie/README | 20 + webdir/javascript/yui/cookie/cookie-debug.js | 424 + webdir/javascript/yui/cookie/cookie-min.js | 7 + webdir/javascript/yui/cookie/cookie.js | 424 + webdir/javascript/yui/datasource/README | 140 + .../yui/datasource/datasource-debug.js | 2886 + .../yui/datasource/datasource-min.js | 11 + .../javascript/yui/datasource/datasource.js | 2816 + webdir/javascript/yui/datatable/README | 446 + .../yui/datatable/assets/datatable-core.css | 86 + .../yui/datatable/assets/datatable.css | 49 + .../assets/skins/sam/datatable-skin.css | 243 + .../datatable/assets/skins/sam/datatable.css | 7 + .../assets/skins/sam/dt-arrow-dn.png | Bin 0 -> 116 bytes .../assets/skins/sam/dt-arrow-up.png | Bin 0 -> 116 bytes .../yui/datatable/datatable-debug.js | 16962 ++ .../javascript/yui/datatable/datatable-min.js | 29 + webdir/javascript/yui/datatable/datatable.js | 16725 + webdir/javascript/yui/dom/README | 135 + webdir/javascript/yui/dom/dom-debug.js | 1277 + webdir/javascript/yui/dom/dom-min.js | 8 + webdir/javascript/yui/dom/dom.js | 1241 + webdir/javascript/yui/dragdrop/README | 180 + .../javascript/yui/dragdrop/dragdrop-debug.js | 3731 + .../javascript/yui/dragdrop/dragdrop-min.js | 10 + webdir/javascript/yui/dragdrop/dragdrop.js | 3622 + webdir/javascript/yui/editor/README | 270 + .../yui/editor/assets/editor-core.css | 573 + .../yui/editor/assets/simpleeditor-core.css | 573 + .../editor/assets/skins/sam/blankimage.png | Bin 0 -> 2314 bytes .../editor/assets/skins/sam/editor-knob.gif | Bin 0 -> 138 bytes .../editor/assets/skins/sam/editor-skin.css | 707 + .../assets/skins/sam/editor-sprite-active.gif | Bin 0 -> 5614 bytes .../editor/assets/skins/sam/editor-sprite.gif | Bin 0 -> 5690 bytes .../yui/editor/assets/skins/sam/editor.css | 7 + .../assets/skins/sam/simpleeditor-skin.css | 707 + .../editor/assets/skins/sam/simpleeditor.css | 7 + webdir/javascript/yui/editor/editor-debug.js | 8994 + webdir/javascript/yui/editor/editor-min.js | 28 + webdir/javascript/yui/editor/editor.js | 8891 + .../yui/editor/simpleeditor-debug.js | 6971 + .../javascript/yui/editor/simpleeditor-min.js | 23 + webdir/javascript/yui/editor/simpleeditor.js | 6890 + webdir/javascript/yui/element/README | 34 + .../yui/element/element-beta-debug.js | 1017 + .../yui/element/element-beta-min.js | 8 + webdir/javascript/yui/element/element-beta.js | 1003 + webdir/javascript/yui/event/README | 252 + webdir/javascript/yui/event/event-debug.js | 2587 + webdir/javascript/yui/event/event-min.js | 11 + webdir/javascript/yui/event/event.js | 2562 + webdir/javascript/yui/fonts/README | 50 + webdir/javascript/yui/fonts/fonts-min.css | 7 + webdir/javascript/yui/fonts/fonts.css | 46 + webdir/javascript/yui/get/README | 25 + webdir/javascript/yui/get/get-debug.js | 742 + webdir/javascript/yui/get/get-min.js | 7 + webdir/javascript/yui/get/get.js | 724 + webdir/javascript/yui/grids/README | 86 + webdir/javascript/yui/grids/grids-min.css | 7 + webdir/javascript/yui/grids/grids.css | 285 + webdir/javascript/yui/history/README | 62 + .../javascript/yui/history/assets/blank.html | 1 + .../javascript/yui/history/history-debug.js | 789 + webdir/javascript/yui/history/history-min.js | 7 + webdir/javascript/yui/history/history.js | 788 + webdir/javascript/yui/imagecropper/README | 22 + .../imagecropper/assets/imagecropper-core.css | 33 + .../assets/skins/sam/imagecropper-skin.css | 16 + .../assets/skins/sam/imagecropper.css | 7 + .../imagecropper/imagecropper-beta-debug.js | 907 + .../yui/imagecropper/imagecropper-beta-min.js | 8 + .../yui/imagecropper/imagecropper-beta.js | 889 + webdir/javascript/yui/imageloader/README | 23 + .../yui/imageloader/imageloader-debug.js | 487 + .../yui/imageloader/imageloader-min.js | 7 + .../javascript/yui/imageloader/imageloader.js | 481 + webdir/javascript/yui/json/README | 22 + webdir/javascript/yui/json/json-debug.js | 396 + webdir/javascript/yui/json/json-min.js | 7 + webdir/javascript/yui/json/json.js | 396 + webdir/javascript/yui/layout/README | 28 + .../yui/layout/assets/layout-core.css | 158 + .../layout/assets/skins/sam/layout-skin.css | 198 + .../yui/layout/assets/skins/sam/layout.css | 7 + .../layout/assets/skins/sam/layout_sprite.png | Bin 0 -> 1409 bytes webdir/javascript/yui/layout/layout-debug.js | 2245 + webdir/javascript/yui/layout/layout-min.js | 11 + webdir/javascript/yui/layout/layout.js | 2230 + webdir/javascript/yui/logger/README | 116 + .../yui/logger/assets/logger-core.css | 7 + .../javascript/yui/logger/assets/logger.css | 57 + .../logger/assets/skins/sam/logger-skin.css | 55 + .../yui/logger/assets/skins/sam/logger.css | 7 + webdir/javascript/yui/logger/logger-debug.js | 2044 + webdir/javascript/yui/logger/logger-min.js | 9 + webdir/javascript/yui/logger/logger.js | 2044 + webdir/javascript/yui/menu/README | 1130 + .../javascript/yui/menu/assets/menu-core.css | 238 + webdir/javascript/yui/menu/assets/menu.css | 497 + .../yui/menu/assets/menu_down_arrow.png | Bin 0 -> 3624 bytes .../menu/assets/menu_down_arrow_disabled.png | Bin 0 -> 3621 bytes .../yui/menu/assets/menu_up_arrow.png | Bin 0 -> 936 bytes .../menu/assets/menu_up_arrow_disabled.png | Bin 0 -> 936 bytes .../assets/menubaritem_submenuindicator.png | Bin 0 -> 3623 bytes .../menubaritem_submenuindicator_disabled.png | Bin 0 -> 3623 bytes .../menubaritem_submenuindicator_selected.png | Bin 0 -> 3623 bytes .../yui/menu/assets/menuitem_checkbox.png | Bin 0 -> 956 bytes .../assets/menuitem_checkbox_disabled.png | Bin 0 -> 956 bytes .../assets/menuitem_checkbox_selected.png | Bin 0 -> 956 bytes .../menu/assets/menuitem_submenuindicator.png | Bin 0 -> 942 bytes .../menuitem_submenuindicator_disabled.png | Bin 0 -> 942 bytes .../menuitem_submenuindicator_selected.png | Bin 0 -> 942 bytes .../yui/menu/assets/skins/sam/menu-skin.css | 325 + .../yui/menu/assets/skins/sam/menu.css | 7 + .../sam/menubaritem_submenuindicator.png | Bin 0 -> 3618 bytes .../menubaritem_submenuindicator_disabled.png | Bin 0 -> 3618 bytes .../assets/skins/sam/menuitem_checkbox.png | Bin 0 -> 3625 bytes .../skins/sam/menuitem_checkbox_disabled.png | Bin 0 -> 3625 bytes .../skins/sam/menuitem_submenuindicator.png | Bin 0 -> 3617 bytes .../menuitem_submenuindicator_disabled.png | Bin 0 -> 3617 bytes webdir/javascript/yui/menu/menu-debug.js | 9666 + webdir/javascript/yui/menu/menu-min.js | 15 + webdir/javascript/yui/menu/menu.js | 9619 + webdir/javascript/yui/paginator/README | 5 + .../yui/paginator/assets/paginator-core.css | 6 + .../assets/skins/sam/paginator-skin.css | 78 + .../paginator/assets/skins/sam/paginator.css | 7 + .../yui/paginator/paginator-debug.js | 2314 + .../javascript/yui/paginator/paginator-min.js | 10 + webdir/javascript/yui/paginator/paginator.js | 2314 + webdir/javascript/yui/profiler/README | 14 + .../javascript/yui/profiler/profiler-debug.js | 380 + .../javascript/yui/profiler/profiler-min.js | 7 + webdir/javascript/yui/profiler/profiler.js | 380 + webdir/javascript/yui/profilerviewer/README | 9 + .../profilerviewer/assets/skins/sam/asc.gif | Bin 0 -> 177 bytes .../profilerviewer/assets/skins/sam/desc.gif | Bin 0 -> 177 bytes .../assets/skins/sam/header_background.png | Bin 0 -> 158 bytes .../assets/skins/sam/profilerviewer.css | 7 + .../profilerviewer/assets/skins/sam/wait.gif | Bin 0 -> 1100 bytes .../profilerviewer-beta-debug.js | 1227 + .../profilerviewer/profilerviewer-beta-min.js | 9 + .../yui/profilerviewer/profilerviewer-beta.js | 1190 + .../javascript/yui/reset-fonts-grids/README | 32 + .../reset-fonts-grids/reset-fonts-grids.css | 7 + webdir/javascript/yui/reset-fonts/README | 19 + .../yui/reset-fonts/reset-fonts.css | 7 + webdir/javascript/yui/reset/README | 64 + webdir/javascript/yui/reset/reset-min.css | 7 + webdir/javascript/yui/reset/reset.css | 25 + webdir/javascript/yui/resize/README | 24 + .../yui/resize/assets/resize-core.css | 173 + .../resize/assets/skins/sam/layout_sprite.png | Bin 0 -> 1409 bytes .../resize/assets/skins/sam/resize-skin.css | 129 + .../yui/resize/assets/skins/sam/resize.css | 7 + webdir/javascript/yui/resize/resize-debug.js | 1740 + webdir/javascript/yui/resize/resize-min.js | 10 + webdir/javascript/yui/resize/resize.js | 1680 + webdir/javascript/yui/selector/README | 23 + .../yui/selector/selector-beta-debug.js | 673 + .../yui/selector/selector-beta-min.js | 8 + .../javascript/yui/selector/selector-beta.js | 666 + webdir/javascript/yui/slider/README | 114 + .../javascript/yui/slider/assets/bg-fader.gif | Bin 0 -> 433 bytes webdir/javascript/yui/slider/assets/bg-h.gif | Bin 0 -> 212 bytes .../javascript/yui/slider/assets/bg-v-e.gif | Bin 0 -> 476 bytes webdir/javascript/yui/slider/assets/bg-v.gif | Bin 0 -> 481 bytes .../yui/slider/assets/left-thumb.png | Bin 0 -> 348 bytes .../yui/slider/assets/right-thumb.png | Bin 0 -> 356 bytes .../slider/assets/skins/sam/slider-skin.css | 20 + .../yui/slider/assets/skins/sam/slider.css | 7 + .../yui/slider/assets/slider-core.css | 15 + .../yui/slider/assets/thumb-bar.gif | Bin 0 -> 580 bytes .../javascript/yui/slider/assets/thumb-e.gif | Bin 0 -> 340 bytes .../yui/slider/assets/thumb-fader.gif | Bin 0 -> 645 bytes .../javascript/yui/slider/assets/thumb-n.gif | Bin 0 -> 612 bytes .../javascript/yui/slider/assets/thumb-s.gif | Bin 0 -> 615 bytes .../javascript/yui/slider/assets/thumb-w.gif | Bin 0 -> 340 bytes webdir/javascript/yui/slider/slider-debug.js | 1976 + webdir/javascript/yui/slider/slider-min.js | 9 + webdir/javascript/yui/slider/slider.js | 1935 + webdir/javascript/yui/tabview/README | 51 + .../yui/tabview/assets/border_tabs.css | 58 + .../javascript/yui/tabview/assets/loading.gif | Bin 0 -> 729 bytes .../yui/tabview/assets/skin-sam.css | 77 + .../tabview/assets/skins/sam/tabview-skin.css | 187 + .../yui/tabview/assets/skins/sam/tabview.css | 7 + .../yui/tabview/assets/tabview-core.css | 122 + .../javascript/yui/tabview/assets/tabview.css | 113 + .../javascript/yui/tabview/tabview-debug.js | 949 + webdir/javascript/yui/tabview/tabview-min.js | 8 + webdir/javascript/yui/tabview/tabview.js | 941 + webdir/javascript/yui/treeview/README | 211 + .../yui/treeview/assets/skins/sam/loading.gif | Bin 0 -> 2673 bytes .../assets/skins/sam/treeview-loading.gif | Bin 0 -> 2673 bytes .../assets/skins/sam/treeview-skin.css | 198 + .../assets/skins/sam/treeview-sprite.gif | Bin 0 -> 4326 bytes .../treeview/assets/skins/sam/treeview.css | 7 + .../yui/treeview/assets/sprite-menu.gif | Bin 0 -> 452 bytes .../yui/treeview/assets/sprite-orig.gif | Bin 0 -> 3289 bytes .../yui/treeview/assets/treeview-core.css | 6 + .../yui/treeview/assets/treeview-loading.gif | Bin 0 -> 2673 bytes .../yui/treeview/assets/treeview-menu.css | 65 + .../yui/treeview/assets/treeview.css | 7 + .../javascript/yui/treeview/treeview-debug.js | 3435 + .../javascript/yui/treeview/treeview-min.js | 11 + webdir/javascript/yui/treeview/treeview.js | 3366 + webdir/javascript/yui/uploader/README | 30 + .../yui/uploader/assets/uploader.swf | Bin 0 -> 6754 bytes .../uploader/uploader-experimental-debug.js | 1069 + .../yui/uploader/uploader-experimental-min.js | 14 + .../yui/uploader/uploader-experimental.js | 1066 + webdir/javascript/yui/utilities/README | 40 + webdir/javascript/yui/utilities/utilities.js | 36 + webdir/javascript/yui/yahoo-dom-event/README | 35 + .../yui/yahoo-dom-event/yahoo-dom-event.js | 12 + webdir/javascript/yui/yahoo/README | 106 + webdir/javascript/yui/yahoo/yahoo-debug.js | 986 + webdir/javascript/yui/yahoo/yahoo-min.js | 7 + webdir/javascript/yui/yahoo/yahoo.js | 986 + .../javascript/yui/yuiloader-dom-event/README | 13 + .../yuiloader-dom-event.js | 15 + webdir/javascript/yui/yuiloader/README | 83 + .../yui/yuiloader/yuiloader-debug.js | 3677 + .../javascript/yui/yuiloader/yuiloader-min.js | 10 + webdir/javascript/yui/yuiloader/yuiloader.js | 3677 + webdir/javascript/yui/yuitest/README | 34 + .../yuitest/assets/skins/sam/yuitest-skin.css | 7 + .../yui/yuitest/assets/skins/sam/yuitest.css | 7 + .../yui/yuitest/assets/testlogger.css | 33 + .../yui/yuitest/assets/yuitest-core.css | 7 + .../javascript/yui/yuitest/yuitest-debug.js | 3370 + webdir/javascript/yui/yuitest/yuitest-min.js | 11 + webdir/javascript/yui/yuitest/yuitest.js | 3370 + .../yui/yuitest/yuitest_core-debug.js | 1991 + .../yui/yuitest/yuitest_core-min.js | 9 + webdir/javascript/yui/yuitest/yuitest_core.js | 1991 + webdir/styles/style.css | 498 + 2459 files changed, 1038434 insertions(+) create mode 100755 Acl.php create mode 100644 BUGS create mode 100644 CHANGELOG create mode 100644 CONTRIBUTORS create mode 100644 INSTALL create mode 100644 README create mode 100755 Setup.php create mode 100755 bootstrap.php create mode 100644 config.default.php create mode 100644 config.template.php create mode 100644 index.html create mode 100644 languages/de/lang.mo create mode 100644 languages/de/lang.po create mode 100644 languages/en/lang.mo create mode 100644 languages/en/lang.po create mode 100644 languages/es/lang.mo create mode 100644 languages/es/lang.po create mode 100644 languages/nl/lang.mo create mode 100644 languages/nl/lang.po create mode 100644 languages/pl/lang.mo create mode 100644 languages/pl/lang.po create mode 100644 libs/MODIFICATIONS.txt create mode 100644 libs/Monkeys/AccessDeniedException.php create mode 100755 libs/Monkeys/BadUrlException.php create mode 100644 libs/Monkeys/Captcha/Image.php create mode 100755 libs/Monkeys/Controller/Action.php create mode 100644 libs/Monkeys/Controller/Error.php create mode 100755 libs/Monkeys/Controller/Plugin/Auth.php create mode 100755 libs/Monkeys/Db/Profiler.php create mode 100755 libs/Monkeys/Db/Table/Gateway.php create mode 100644 libs/Monkeys/Form/Decorator/Composite.php create mode 100644 libs/Monkeys/Form/Element/Captcha.php create mode 100644 libs/Monkeys/Form/Element/Checkbox.php create mode 100644 libs/Monkeys/Form/Element/Country.php create mode 100644 libs/Monkeys/Form/Element/Date.php create mode 100644 libs/Monkeys/Form/Element/File.php create mode 100644 libs/Monkeys/Form/Element/Language.php create mode 100644 libs/Monkeys/Form/Element/Password.php create mode 100644 libs/Monkeys/Form/Element/Radio.php create mode 100644 libs/Monkeys/Form/Element/Text.php create mode 100644 libs/Monkeys/Form/Element/Textarea.php create mode 100644 libs/Monkeys/Form/Element/Timezone.php create mode 100644 libs/Monkeys/Form/Element/zone.tab create mode 100644 libs/Monkeys/OpenId/Provider/Storage/Database.php create mode 100644 libs/Monkeys/Validate/PasswordConfirmation.php create mode 100644 libs/Monkeys/View/Helper/FormDateSelects.php create mode 100755 libs/Monkeys/View/Helper/GetBase.php create mode 100644 libs/Monkeys/fonts/Verdana.ttf create mode 100755 libs/Monkeys/tests/names.txt create mode 100755 libs/Monkeys/tests/words.txt create mode 100644 libs/Zend/Acl.php create mode 100644 libs/Zend/Acl/Assert/Interface.php create mode 100644 libs/Zend/Acl/Exception.php create mode 100644 libs/Zend/Acl/Resource.php create mode 100644 libs/Zend/Acl/Resource/Interface.php create mode 100644 libs/Zend/Acl/Role.php create mode 100644 libs/Zend/Acl/Role/Interface.php create mode 100644 libs/Zend/Acl/Role/Registry.php create mode 100644 libs/Zend/Acl/Role/Registry/Exception.php create mode 100644 libs/Zend/Amf/Constants.php create mode 100644 libs/Zend/Amf/Exception.php create mode 100644 libs/Zend/Amf/Parse/Amf0/Deserializer.php create mode 100644 libs/Zend/Amf/Parse/Amf0/Serializer.php create mode 100644 libs/Zend/Amf/Parse/Amf3/Deserializer.php create mode 100644 libs/Zend/Amf/Parse/Amf3/Serializer.php create mode 100644 libs/Zend/Amf/Parse/Deserializer.php create mode 100644 libs/Zend/Amf/Parse/InputStream.php create mode 100644 libs/Zend/Amf/Parse/OutputStream.php create mode 100644 libs/Zend/Amf/Parse/Serializer.php create mode 100644 libs/Zend/Amf/Parse/TypeLoader.php create mode 100644 libs/Zend/Amf/Request.php create mode 100644 libs/Zend/Amf/Request/Http.php create mode 100644 libs/Zend/Amf/Response.php create mode 100644 libs/Zend/Amf/Response/Http.php create mode 100644 libs/Zend/Amf/Server.php create mode 100644 libs/Zend/Amf/Server/Exception.php create mode 100644 libs/Zend/Amf/Util/BinaryStream.php create mode 100644 libs/Zend/Amf/Value/ByteArray.php create mode 100644 libs/Zend/Amf/Value/MessageBody.php create mode 100644 libs/Zend/Amf/Value/MessageHeader.php create mode 100644 libs/Zend/Amf/Value/Messaging/AbstractMessage.php create mode 100644 libs/Zend/Amf/Value/Messaging/AcknowledgeMessage.php create mode 100644 libs/Zend/Amf/Value/Messaging/AsyncMessage.php create mode 100644 libs/Zend/Amf/Value/Messaging/CommandMessage.php create mode 100644 libs/Zend/Amf/Value/Messaging/ErrorMessage.php create mode 100644 libs/Zend/Amf/Value/Messaging/RemotingMessage.php create mode 100644 libs/Zend/Amf/Value/TraitsInfo.php create mode 100644 libs/Zend/Auth.php create mode 100644 libs/Zend/Auth/Adapter/DbTable.php create mode 100644 libs/Zend/Auth/Adapter/Digest.php create mode 100644 libs/Zend/Auth/Adapter/Exception.php create mode 100644 libs/Zend/Auth/Adapter/Http.php create mode 100644 libs/Zend/Auth/Adapter/Http/Resolver/Exception.php create mode 100644 libs/Zend/Auth/Adapter/Http/Resolver/File.php create mode 100644 libs/Zend/Auth/Adapter/Http/Resolver/Interface.php create mode 100644 libs/Zend/Auth/Adapter/InfoCard.php create mode 100644 libs/Zend/Auth/Adapter/Interface.php create mode 100644 libs/Zend/Auth/Adapter/Ldap.php create mode 100644 libs/Zend/Auth/Adapter/OpenId.php create mode 100644 libs/Zend/Auth/Exception.php create mode 100644 libs/Zend/Auth/Result.php create mode 100644 libs/Zend/Auth/Storage/Exception.php create mode 100644 libs/Zend/Auth/Storage/Interface.php create mode 100644 libs/Zend/Auth/Storage/NonPersistent.php create mode 100644 libs/Zend/Auth/Storage/Session.php create mode 100644 libs/Zend/Cache.php create mode 100644 libs/Zend/Cache/Backend.php create mode 100644 libs/Zend/Cache/Backend/Apc.php create mode 100644 libs/Zend/Cache/Backend/ExtendedInterface.php create mode 100644 libs/Zend/Cache/Backend/File.php create mode 100644 libs/Zend/Cache/Backend/Interface.php create mode 100644 libs/Zend/Cache/Backend/Memcached.php create mode 100644 libs/Zend/Cache/Backend/Sqlite.php create mode 100644 libs/Zend/Cache/Backend/Test.php create mode 100644 libs/Zend/Cache/Backend/TwoLevels.php create mode 100644 libs/Zend/Cache/Backend/Xcache.php create mode 100644 libs/Zend/Cache/Backend/ZendPlatform.php create mode 100644 libs/Zend/Cache/Core.php create mode 100644 libs/Zend/Cache/Exception.php create mode 100644 libs/Zend/Cache/Frontend/Class.php create mode 100644 libs/Zend/Cache/Frontend/File.php create mode 100644 libs/Zend/Cache/Frontend/Function.php create mode 100644 libs/Zend/Cache/Frontend/Output.php create mode 100644 libs/Zend/Cache/Frontend/Page.php create mode 100644 libs/Zend/Captcha/Adapter.php create mode 100644 libs/Zend/Captcha/Base.php create mode 100644 libs/Zend/Captcha/Dumb.php create mode 100755 libs/Zend/Captcha/Exception.php create mode 100644 libs/Zend/Captcha/Figlet.php create mode 100644 libs/Zend/Captcha/Image.php create mode 100644 libs/Zend/Captcha/ReCaptcha.php create mode 100644 libs/Zend/Captcha/Word.php create mode 100644 libs/Zend/Config.php create mode 100644 libs/Zend/Config/Exception.php create mode 100644 libs/Zend/Config/Ini.php create mode 100644 libs/Zend/Config/Writer.php create mode 100644 libs/Zend/Config/Writer/Array.php create mode 100644 libs/Zend/Config/Writer/Ini.php create mode 100644 libs/Zend/Config/Writer/Xml.php create mode 100644 libs/Zend/Config/Xml.php create mode 100644 libs/Zend/Console/Getopt.php create mode 100644 libs/Zend/Console/Getopt/Exception.php create mode 100644 libs/Zend/Controller/Action.php create mode 100644 libs/Zend/Controller/Action/Exception.php create mode 100644 libs/Zend/Controller/Action/Helper/Abstract.php create mode 100644 libs/Zend/Controller/Action/Helper/ActionStack.php create mode 100644 libs/Zend/Controller/Action/Helper/AjaxContext.php create mode 100644 libs/Zend/Controller/Action/Helper/AutoComplete/Abstract.php create mode 100644 libs/Zend/Controller/Action/Helper/AutoCompleteDojo.php create mode 100644 libs/Zend/Controller/Action/Helper/AutoCompleteScriptaculous.php create mode 100644 libs/Zend/Controller/Action/Helper/ContextSwitch.php create mode 100644 libs/Zend/Controller/Action/Helper/FlashMessenger.php create mode 100644 libs/Zend/Controller/Action/Helper/Json.php create mode 100644 libs/Zend/Controller/Action/Helper/Redirector.php create mode 100644 libs/Zend/Controller/Action/Helper/Url.php create mode 100644 libs/Zend/Controller/Action/Helper/ViewRenderer.php create mode 100644 libs/Zend/Controller/Action/HelperBroker.php create mode 100644 libs/Zend/Controller/Action/HelperBroker/PriorityStack.php create mode 100644 libs/Zend/Controller/Dispatcher/Abstract.php create mode 100644 libs/Zend/Controller/Dispatcher/Exception.php create mode 100644 libs/Zend/Controller/Dispatcher/Interface.php create mode 100644 libs/Zend/Controller/Dispatcher/Standard.php create mode 100644 libs/Zend/Controller/Exception.php create mode 100644 libs/Zend/Controller/Front.php create mode 100644 libs/Zend/Controller/Plugin/Abstract.php create mode 100644 libs/Zend/Controller/Plugin/ActionStack.php create mode 100644 libs/Zend/Controller/Plugin/Broker.php create mode 100644 libs/Zend/Controller/Plugin/ErrorHandler.php create mode 100644 libs/Zend/Controller/Request/Abstract.php create mode 100644 libs/Zend/Controller/Request/Apache404.php create mode 100644 libs/Zend/Controller/Request/Exception.php create mode 100644 libs/Zend/Controller/Request/Http.php create mode 100644 libs/Zend/Controller/Request/HttpTestCase.php create mode 100644 libs/Zend/Controller/Request/Simple.php create mode 100644 libs/Zend/Controller/Response/Abstract.php create mode 100644 libs/Zend/Controller/Response/Cli.php create mode 100644 libs/Zend/Controller/Response/Exception.php create mode 100644 libs/Zend/Controller/Response/Http.php create mode 100644 libs/Zend/Controller/Response/HttpTestCase.php create mode 100644 libs/Zend/Controller/Router/Abstract.php create mode 100644 libs/Zend/Controller/Router/Exception.php create mode 100644 libs/Zend/Controller/Router/Interface.php create mode 100644 libs/Zend/Controller/Router/Rewrite.php create mode 100644 libs/Zend/Controller/Router/Route.php create mode 100644 libs/Zend/Controller/Router/Route/Abstract.php create mode 100644 libs/Zend/Controller/Router/Route/Chain.php create mode 100644 libs/Zend/Controller/Router/Route/Hostname.php create mode 100644 libs/Zend/Controller/Router/Route/Interface.php create mode 100644 libs/Zend/Controller/Router/Route/Module.php create mode 100644 libs/Zend/Controller/Router/Route/Regex.php create mode 100644 libs/Zend/Controller/Router/Route/Static.php create mode 100644 libs/Zend/Currency.php create mode 100644 libs/Zend/Currency/Exception.php create mode 100644 libs/Zend/Date.php create mode 100644 libs/Zend/Date/Cities.php create mode 100644 libs/Zend/Date/DateObject.php create mode 100644 libs/Zend/Date/Exception.php create mode 100644 libs/Zend/Db.php create mode 100644 libs/Zend/Db/Adapter/Abstract.php create mode 100644 libs/Zend/Db/Adapter/Db2.php create mode 100644 libs/Zend/Db/Adapter/Db2/Exception.php create mode 100644 libs/Zend/Db/Adapter/Exception.php create mode 100644 libs/Zend/Db/Adapter/Mysqli.php create mode 100644 libs/Zend/Db/Adapter/Mysqli/Exception.php create mode 100644 libs/Zend/Db/Adapter/Oracle.php create mode 100644 libs/Zend/Db/Adapter/Oracle/Exception.php create mode 100644 libs/Zend/Db/Adapter/Pdo/Abstract.php create mode 100644 libs/Zend/Db/Adapter/Pdo/Ibm.php create mode 100644 libs/Zend/Db/Adapter/Pdo/Ibm/Db2.php create mode 100644 libs/Zend/Db/Adapter/Pdo/Ibm/Ids.php create mode 100644 libs/Zend/Db/Adapter/Pdo/Mssql.php create mode 100644 libs/Zend/Db/Adapter/Pdo/Mysql.php create mode 100644 libs/Zend/Db/Adapter/Pdo/Oci.php create mode 100644 libs/Zend/Db/Adapter/Pdo/Pgsql.php create mode 100644 libs/Zend/Db/Adapter/Pdo/Sqlite.php create mode 100644 libs/Zend/Db/Exception.php create mode 100644 libs/Zend/Db/Expr.php create mode 100644 libs/Zend/Db/Profiler.php create mode 100644 libs/Zend/Db/Profiler/Exception.php create mode 100644 libs/Zend/Db/Profiler/Firebug.php create mode 100644 libs/Zend/Db/Profiler/Query.php create mode 100644 libs/Zend/Db/Select.php create mode 100644 libs/Zend/Db/Select/Exception.php create mode 100644 libs/Zend/Db/Statement.php create mode 100644 libs/Zend/Db/Statement/Db2.php create mode 100644 libs/Zend/Db/Statement/Db2/Exception.php create mode 100644 libs/Zend/Db/Statement/Exception.php create mode 100644 libs/Zend/Db/Statement/Interface.php create mode 100644 libs/Zend/Db/Statement/Mysqli.php create mode 100644 libs/Zend/Db/Statement/Mysqli/Exception.php create mode 100644 libs/Zend/Db/Statement/Oracle.php create mode 100644 libs/Zend/Db/Statement/Oracle/Exception.php create mode 100644 libs/Zend/Db/Statement/Pdo.php create mode 100644 libs/Zend/Db/Statement/Pdo/Ibm.php create mode 100644 libs/Zend/Db/Table.php create mode 100644 libs/Zend/Db/Table/Abstract.php create mode 100644 libs/Zend/Db/Table/Exception.php create mode 100644 libs/Zend/Db/Table/Row.php create mode 100644 libs/Zend/Db/Table/Row/Abstract.php create mode 100644 libs/Zend/Db/Table/Row/Exception.php create mode 100644 libs/Zend/Db/Table/Rowset.php create mode 100644 libs/Zend/Db/Table/Rowset/Abstract.php create mode 100644 libs/Zend/Db/Table/Rowset/Exception.php create mode 100644 libs/Zend/Db/Table/Select.php create mode 100644 libs/Zend/Db/Table/Select/Exception.php create mode 100644 libs/Zend/Debug.php create mode 100644 libs/Zend/Dojo.php create mode 100644 libs/Zend/Dojo/Data.php create mode 100644 libs/Zend/Dojo/Exception.php create mode 100644 libs/Zend/Dojo/Form.php create mode 100644 libs/Zend/Dojo/Form/Decorator/AccordionContainer.php create mode 100644 libs/Zend/Dojo/Form/Decorator/AccordionPane.php create mode 100644 libs/Zend/Dojo/Form/Decorator/BorderContainer.php create mode 100644 libs/Zend/Dojo/Form/Decorator/ContentPane.php create mode 100644 libs/Zend/Dojo/Form/Decorator/DijitContainer.php create mode 100644 libs/Zend/Dojo/Form/Decorator/DijitElement.php create mode 100644 libs/Zend/Dojo/Form/Decorator/DijitForm.php create mode 100644 libs/Zend/Dojo/Form/Decorator/SplitContainer.php create mode 100644 libs/Zend/Dojo/Form/Decorator/StackContainer.php create mode 100644 libs/Zend/Dojo/Form/Decorator/TabContainer.php create mode 100644 libs/Zend/Dojo/Form/DisplayGroup.php create mode 100644 libs/Zend/Dojo/Form/Element/Button.php create mode 100644 libs/Zend/Dojo/Form/Element/CheckBox.php create mode 100644 libs/Zend/Dojo/Form/Element/ComboBox.php create mode 100644 libs/Zend/Dojo/Form/Element/CurrencyTextBox.php create mode 100644 libs/Zend/Dojo/Form/Element/DateTextBox.php create mode 100644 libs/Zend/Dojo/Form/Element/Dijit.php create mode 100644 libs/Zend/Dojo/Form/Element/DijitMulti.php create mode 100644 libs/Zend/Dojo/Form/Element/Editor.php create mode 100644 libs/Zend/Dojo/Form/Element/FilteringSelect.php create mode 100644 libs/Zend/Dojo/Form/Element/HorizontalSlider.php create mode 100644 libs/Zend/Dojo/Form/Element/NumberSpinner.php create mode 100644 libs/Zend/Dojo/Form/Element/NumberTextBox.php create mode 100644 libs/Zend/Dojo/Form/Element/PasswordTextBox.php create mode 100644 libs/Zend/Dojo/Form/Element/RadioButton.php create mode 100644 libs/Zend/Dojo/Form/Element/Slider.php create mode 100644 libs/Zend/Dojo/Form/Element/SubmitButton.php create mode 100644 libs/Zend/Dojo/Form/Element/TextBox.php create mode 100644 libs/Zend/Dojo/Form/Element/Textarea.php create mode 100644 libs/Zend/Dojo/Form/Element/TimeTextBox.php create mode 100644 libs/Zend/Dojo/Form/Element/ValidationTextBox.php create mode 100644 libs/Zend/Dojo/Form/Element/VerticalSlider.php create mode 100644 libs/Zend/Dojo/Form/SubForm.php create mode 100644 libs/Zend/Dojo/View/Exception.php create mode 100644 libs/Zend/Dojo/View/Helper/AccordionContainer.php create mode 100644 libs/Zend/Dojo/View/Helper/AccordionPane.php create mode 100644 libs/Zend/Dojo/View/Helper/BorderContainer.php create mode 100644 libs/Zend/Dojo/View/Helper/Button.php create mode 100644 libs/Zend/Dojo/View/Helper/CheckBox.php create mode 100644 libs/Zend/Dojo/View/Helper/ComboBox.php create mode 100644 libs/Zend/Dojo/View/Helper/ContentPane.php create mode 100644 libs/Zend/Dojo/View/Helper/CurrencyTextBox.php create mode 100644 libs/Zend/Dojo/View/Helper/DateTextBox.php create mode 100644 libs/Zend/Dojo/View/Helper/Dijit.php create mode 100644 libs/Zend/Dojo/View/Helper/DijitContainer.php create mode 100644 libs/Zend/Dojo/View/Helper/Dojo.php create mode 100644 libs/Zend/Dojo/View/Helper/Dojo/Container.php create mode 100644 libs/Zend/Dojo/View/Helper/Editor.php create mode 100644 libs/Zend/Dojo/View/Helper/FilteringSelect.php create mode 100644 libs/Zend/Dojo/View/Helper/Form.php create mode 100644 libs/Zend/Dojo/View/Helper/HorizontalSlider.php create mode 100644 libs/Zend/Dojo/View/Helper/NumberSpinner.php create mode 100644 libs/Zend/Dojo/View/Helper/NumberTextBox.php create mode 100644 libs/Zend/Dojo/View/Helper/PasswordTextBox.php create mode 100644 libs/Zend/Dojo/View/Helper/RadioButton.php create mode 100644 libs/Zend/Dojo/View/Helper/SimpleTextarea.php create mode 100644 libs/Zend/Dojo/View/Helper/Slider.php create mode 100644 libs/Zend/Dojo/View/Helper/SplitContainer.php create mode 100644 libs/Zend/Dojo/View/Helper/StackContainer.php create mode 100644 libs/Zend/Dojo/View/Helper/SubmitButton.php create mode 100644 libs/Zend/Dojo/View/Helper/TabContainer.php create mode 100644 libs/Zend/Dojo/View/Helper/TextBox.php create mode 100644 libs/Zend/Dojo/View/Helper/Textarea.php create mode 100644 libs/Zend/Dojo/View/Helper/TimeTextBox.php create mode 100644 libs/Zend/Dojo/View/Helper/ValidationTextBox.php create mode 100644 libs/Zend/Dojo/View/Helper/VerticalSlider.php create mode 100644 libs/Zend/Dom/Exception.php create mode 100644 libs/Zend/Dom/Query.php create mode 100644 libs/Zend/Dom/Query/Css2Xpath.php create mode 100644 libs/Zend/Dom/Query/Result.php create mode 100644 libs/Zend/Exception.php create mode 100644 libs/Zend/Feed.php create mode 100644 libs/Zend/Feed/Abstract.php create mode 100644 libs/Zend/Feed/Atom.php create mode 100644 libs/Zend/Feed/Builder.php create mode 100644 libs/Zend/Feed/Builder/Entry.php create mode 100644 libs/Zend/Feed/Builder/Exception.php create mode 100644 libs/Zend/Feed/Builder/Header.php create mode 100644 libs/Zend/Feed/Builder/Header/Itunes.php create mode 100644 libs/Zend/Feed/Builder/Interface.php create mode 100644 libs/Zend/Feed/Element.php create mode 100644 libs/Zend/Feed/Entry/Abstract.php create mode 100644 libs/Zend/Feed/Entry/Atom.php create mode 100644 libs/Zend/Feed/Entry/Rss.php create mode 100644 libs/Zend/Feed/Exception.php create mode 100644 libs/Zend/Feed/Rss.php create mode 100644 libs/Zend/File/Transfer.php create mode 100644 libs/Zend/File/Transfer/Adapter/Abstract.php create mode 100644 libs/Zend/File/Transfer/Adapter/Http.php create mode 100644 libs/Zend/File/Transfer/Exception.php create mode 100644 libs/Zend/Filter.php create mode 100644 libs/Zend/Filter/Alnum.php create mode 100644 libs/Zend/Filter/Alpha.php create mode 100644 libs/Zend/Filter/BaseName.php create mode 100644 libs/Zend/Filter/Digits.php create mode 100644 libs/Zend/Filter/Dir.php create mode 100644 libs/Zend/Filter/Exception.php create mode 100644 libs/Zend/Filter/File/LowerCase.php create mode 100644 libs/Zend/Filter/File/Rename.php create mode 100644 libs/Zend/Filter/File/UpperCase.php create mode 100644 libs/Zend/Filter/HtmlEntities.php create mode 100644 libs/Zend/Filter/Inflector.php create mode 100644 libs/Zend/Filter/Input.php create mode 100644 libs/Zend/Filter/Int.php create mode 100644 libs/Zend/Filter/Interface.php create mode 100644 libs/Zend/Filter/PregReplace.php create mode 100644 libs/Zend/Filter/RealPath.php create mode 100644 libs/Zend/Filter/StringToLower.php create mode 100644 libs/Zend/Filter/StringToUpper.php create mode 100644 libs/Zend/Filter/StringTrim.php create mode 100644 libs/Zend/Filter/StripNewlines.php create mode 100644 libs/Zend/Filter/StripTags.php create mode 100644 libs/Zend/Filter/Word/CamelCaseToDash.php create mode 100644 libs/Zend/Filter/Word/CamelCaseToSeparator.php create mode 100644 libs/Zend/Filter/Word/CamelCaseToUnderscore.php create mode 100644 libs/Zend/Filter/Word/DashToCamelCase.php create mode 100644 libs/Zend/Filter/Word/DashToSeparator.php create mode 100644 libs/Zend/Filter/Word/DashToUnderscore.php create mode 100644 libs/Zend/Filter/Word/Separator/Abstract.php create mode 100644 libs/Zend/Filter/Word/SeparatorToCamelCase.php create mode 100644 libs/Zend/Filter/Word/SeparatorToDash.php create mode 100644 libs/Zend/Filter/Word/SeparatorToSeparator.php create mode 100644 libs/Zend/Filter/Word/UnderscoreToCamelCase.php create mode 100644 libs/Zend/Filter/Word/UnderscoreToDash.php create mode 100644 libs/Zend/Filter/Word/UnderscoreToSeparator.php create mode 100644 libs/Zend/Form.php create mode 100644 libs/Zend/Form/Decorator/Abstract.php create mode 100644 libs/Zend/Form/Decorator/Callback.php create mode 100644 libs/Zend/Form/Decorator/Captcha.php create mode 100644 libs/Zend/Form/Decorator/Captcha/Word.php create mode 100644 libs/Zend/Form/Decorator/Description.php create mode 100644 libs/Zend/Form/Decorator/DtDdWrapper.php create mode 100644 libs/Zend/Form/Decorator/Errors.php create mode 100644 libs/Zend/Form/Decorator/Exception.php create mode 100644 libs/Zend/Form/Decorator/Fieldset.php create mode 100644 libs/Zend/Form/Decorator/File.php create mode 100644 libs/Zend/Form/Decorator/Form.php create mode 100644 libs/Zend/Form/Decorator/FormElements.php create mode 100644 libs/Zend/Form/Decorator/FormErrors.php create mode 100644 libs/Zend/Form/Decorator/HtmlTag.php create mode 100644 libs/Zend/Form/Decorator/Image.php create mode 100644 libs/Zend/Form/Decorator/Interface.php create mode 100644 libs/Zend/Form/Decorator/Label.php create mode 100644 libs/Zend/Form/Decorator/PrepareElements.php create mode 100644 libs/Zend/Form/Decorator/ViewHelper.php create mode 100644 libs/Zend/Form/Decorator/ViewScript.php create mode 100644 libs/Zend/Form/DisplayGroup.php create mode 100644 libs/Zend/Form/Element.php create mode 100644 libs/Zend/Form/Element/Button.php create mode 100644 libs/Zend/Form/Element/Captcha.php create mode 100644 libs/Zend/Form/Element/Checkbox.php create mode 100644 libs/Zend/Form/Element/Exception.php create mode 100644 libs/Zend/Form/Element/File.php create mode 100644 libs/Zend/Form/Element/Hash.php create mode 100644 libs/Zend/Form/Element/Hidden.php create mode 100644 libs/Zend/Form/Element/Image.php create mode 100644 libs/Zend/Form/Element/Multi.php create mode 100644 libs/Zend/Form/Element/MultiCheckbox.php create mode 100644 libs/Zend/Form/Element/Multiselect.php create mode 100644 libs/Zend/Form/Element/Password.php create mode 100644 libs/Zend/Form/Element/Radio.php create mode 100644 libs/Zend/Form/Element/Reset.php create mode 100644 libs/Zend/Form/Element/Select.php create mode 100644 libs/Zend/Form/Element/Submit.php create mode 100644 libs/Zend/Form/Element/Text.php create mode 100644 libs/Zend/Form/Element/Textarea.php create mode 100644 libs/Zend/Form/Element/Xhtml.php create mode 100644 libs/Zend/Form/Exception.php create mode 100644 libs/Zend/Form/SubForm.php create mode 100644 libs/Zend/Gdata.php create mode 100644 libs/Zend/Gdata/App.php create mode 100644 libs/Zend/Gdata/App/AuthException.php create mode 100644 libs/Zend/Gdata/App/BadMethodCallException.php create mode 100644 libs/Zend/Gdata/App/Base.php create mode 100644 libs/Zend/Gdata/App/BaseMediaSource.php create mode 100644 libs/Zend/Gdata/App/CaptchaRequiredException.php create mode 100644 libs/Zend/Gdata/App/Entry.php create mode 100644 libs/Zend/Gdata/App/Exception.php create mode 100644 libs/Zend/Gdata/App/Extension.php create mode 100644 libs/Zend/Gdata/App/Extension/Author.php create mode 100644 libs/Zend/Gdata/App/Extension/Category.php create mode 100644 libs/Zend/Gdata/App/Extension/Content.php create mode 100644 libs/Zend/Gdata/App/Extension/Contributor.php create mode 100644 libs/Zend/Gdata/App/Extension/Control.php create mode 100644 libs/Zend/Gdata/App/Extension/Draft.php create mode 100644 libs/Zend/Gdata/App/Extension/Element.php create mode 100644 libs/Zend/Gdata/App/Extension/Email.php create mode 100644 libs/Zend/Gdata/App/Extension/Generator.php create mode 100644 libs/Zend/Gdata/App/Extension/Icon.php create mode 100644 libs/Zend/Gdata/App/Extension/Id.php create mode 100644 libs/Zend/Gdata/App/Extension/Link.php create mode 100644 libs/Zend/Gdata/App/Extension/Logo.php create mode 100644 libs/Zend/Gdata/App/Extension/Name.php create mode 100644 libs/Zend/Gdata/App/Extension/Person.php create mode 100644 libs/Zend/Gdata/App/Extension/Published.php create mode 100644 libs/Zend/Gdata/App/Extension/Rights.php create mode 100644 libs/Zend/Gdata/App/Extension/Source.php create mode 100644 libs/Zend/Gdata/App/Extension/Subtitle.php create mode 100644 libs/Zend/Gdata/App/Extension/Summary.php create mode 100644 libs/Zend/Gdata/App/Extension/Text.php create mode 100644 libs/Zend/Gdata/App/Extension/Title.php create mode 100644 libs/Zend/Gdata/App/Extension/Updated.php create mode 100644 libs/Zend/Gdata/App/Extension/Uri.php create mode 100644 libs/Zend/Gdata/App/Feed.php create mode 100644 libs/Zend/Gdata/App/FeedEntryParent.php create mode 100644 libs/Zend/Gdata/App/FeedSourceParent.php create mode 100644 libs/Zend/Gdata/App/HttpException.php create mode 100644 libs/Zend/Gdata/App/IOException.php create mode 100644 libs/Zend/Gdata/App/InvalidArgumentException.php create mode 100644 libs/Zend/Gdata/App/LoggingHttpClientAdapterSocket.php create mode 100644 libs/Zend/Gdata/App/MediaEntry.php create mode 100644 libs/Zend/Gdata/App/MediaFileSource.php create mode 100644 libs/Zend/Gdata/App/MediaSource.php create mode 100644 libs/Zend/Gdata/App/Util.php create mode 100644 libs/Zend/Gdata/AuthSub.php create mode 100755 libs/Zend/Gdata/Books.php create mode 100644 libs/Zend/Gdata/Books/CollectionEntry.php create mode 100644 libs/Zend/Gdata/Books/CollectionFeed.php create mode 100644 libs/Zend/Gdata/Books/Extension/AnnotationLink.php create mode 100644 libs/Zend/Gdata/Books/Extension/BooksCategory.php create mode 100644 libs/Zend/Gdata/Books/Extension/BooksLink.php create mode 100644 libs/Zend/Gdata/Books/Extension/Embeddability.php create mode 100644 libs/Zend/Gdata/Books/Extension/InfoLink.php create mode 100644 libs/Zend/Gdata/Books/Extension/PreviewLink.php create mode 100644 libs/Zend/Gdata/Books/Extension/Review.php create mode 100644 libs/Zend/Gdata/Books/Extension/ThumbnailLink.php create mode 100644 libs/Zend/Gdata/Books/Extension/Viewability.php create mode 100644 libs/Zend/Gdata/Books/VolumeEntry.php create mode 100644 libs/Zend/Gdata/Books/VolumeFeed.php create mode 100755 libs/Zend/Gdata/Books/VolumeQuery.php create mode 100644 libs/Zend/Gdata/Calendar.php create mode 100644 libs/Zend/Gdata/Calendar/EventEntry.php create mode 100644 libs/Zend/Gdata/Calendar/EventFeed.php create mode 100644 libs/Zend/Gdata/Calendar/EventQuery.php create mode 100644 libs/Zend/Gdata/Calendar/Extension/AccessLevel.php create mode 100644 libs/Zend/Gdata/Calendar/Extension/Color.php create mode 100644 libs/Zend/Gdata/Calendar/Extension/Hidden.php create mode 100644 libs/Zend/Gdata/Calendar/Extension/Link.php create mode 100644 libs/Zend/Gdata/Calendar/Extension/QuickAdd.php create mode 100644 libs/Zend/Gdata/Calendar/Extension/Selected.php create mode 100644 libs/Zend/Gdata/Calendar/Extension/SendEventNotifications.php create mode 100644 libs/Zend/Gdata/Calendar/Extension/Timezone.php create mode 100644 libs/Zend/Gdata/Calendar/Extension/WebContent.php create mode 100644 libs/Zend/Gdata/Calendar/ListEntry.php create mode 100644 libs/Zend/Gdata/Calendar/ListFeed.php create mode 100644 libs/Zend/Gdata/ClientLogin.php create mode 100755 libs/Zend/Gdata/Docs.php create mode 100755 libs/Zend/Gdata/Docs/DocumentListEntry.php create mode 100755 libs/Zend/Gdata/Docs/DocumentListFeed.php create mode 100755 libs/Zend/Gdata/Docs/Query.php create mode 100755 libs/Zend/Gdata/DublinCore.php create mode 100644 libs/Zend/Gdata/DublinCore/Extension/Creator.php create mode 100644 libs/Zend/Gdata/DublinCore/Extension/Date.php create mode 100644 libs/Zend/Gdata/DublinCore/Extension/Description.php create mode 100644 libs/Zend/Gdata/DublinCore/Extension/Format.php create mode 100644 libs/Zend/Gdata/DublinCore/Extension/Identifier.php create mode 100644 libs/Zend/Gdata/DublinCore/Extension/Language.php create mode 100644 libs/Zend/Gdata/DublinCore/Extension/Publisher.php create mode 100644 libs/Zend/Gdata/DublinCore/Extension/Rights.php create mode 100644 libs/Zend/Gdata/DublinCore/Extension/Subject.php create mode 100644 libs/Zend/Gdata/DublinCore/Extension/Title.php create mode 100644 libs/Zend/Gdata/Entry.php create mode 100755 libs/Zend/Gdata/Exif.php create mode 100755 libs/Zend/Gdata/Exif/Entry.php create mode 100755 libs/Zend/Gdata/Exif/Extension/Distance.php create mode 100755 libs/Zend/Gdata/Exif/Extension/Exposure.php create mode 100755 libs/Zend/Gdata/Exif/Extension/FStop.php create mode 100755 libs/Zend/Gdata/Exif/Extension/Flash.php create mode 100755 libs/Zend/Gdata/Exif/Extension/FocalLength.php create mode 100755 libs/Zend/Gdata/Exif/Extension/ImageUniqueId.php create mode 100755 libs/Zend/Gdata/Exif/Extension/Iso.php create mode 100755 libs/Zend/Gdata/Exif/Extension/Make.php create mode 100755 libs/Zend/Gdata/Exif/Extension/Model.php create mode 100755 libs/Zend/Gdata/Exif/Extension/Tags.php create mode 100755 libs/Zend/Gdata/Exif/Extension/Time.php create mode 100755 libs/Zend/Gdata/Exif/Feed.php create mode 100644 libs/Zend/Gdata/Extension.php create mode 100644 libs/Zend/Gdata/Extension/AttendeeStatus.php create mode 100644 libs/Zend/Gdata/Extension/AttendeeType.php create mode 100644 libs/Zend/Gdata/Extension/Comments.php create mode 100644 libs/Zend/Gdata/Extension/EntryLink.php create mode 100644 libs/Zend/Gdata/Extension/EventStatus.php create mode 100644 libs/Zend/Gdata/Extension/ExtendedProperty.php create mode 100644 libs/Zend/Gdata/Extension/FeedLink.php create mode 100644 libs/Zend/Gdata/Extension/OpenSearchItemsPerPage.php create mode 100644 libs/Zend/Gdata/Extension/OpenSearchStartIndex.php create mode 100644 libs/Zend/Gdata/Extension/OpenSearchTotalResults.php create mode 100644 libs/Zend/Gdata/Extension/OriginalEvent.php create mode 100644 libs/Zend/Gdata/Extension/Rating.php create mode 100644 libs/Zend/Gdata/Extension/Recurrence.php create mode 100644 libs/Zend/Gdata/Extension/RecurrenceException.php create mode 100644 libs/Zend/Gdata/Extension/Reminder.php create mode 100644 libs/Zend/Gdata/Extension/Transparency.php create mode 100644 libs/Zend/Gdata/Extension/Visibility.php create mode 100644 libs/Zend/Gdata/Extension/When.php create mode 100644 libs/Zend/Gdata/Extension/Where.php create mode 100644 libs/Zend/Gdata/Extension/Who.php create mode 100644 libs/Zend/Gdata/Feed.php create mode 100644 libs/Zend/Gdata/Gapps.php create mode 100644 libs/Zend/Gdata/Gapps/EmailListEntry.php create mode 100644 libs/Zend/Gdata/Gapps/EmailListFeed.php create mode 100644 libs/Zend/Gdata/Gapps/EmailListQuery.php create mode 100644 libs/Zend/Gdata/Gapps/EmailListRecipientEntry.php create mode 100644 libs/Zend/Gdata/Gapps/EmailListRecipientFeed.php create mode 100644 libs/Zend/Gdata/Gapps/EmailListRecipientQuery.php create mode 100644 libs/Zend/Gdata/Gapps/Error.php create mode 100644 libs/Zend/Gdata/Gapps/Extension/EmailList.php create mode 100644 libs/Zend/Gdata/Gapps/Extension/Login.php create mode 100644 libs/Zend/Gdata/Gapps/Extension/Name.php create mode 100644 libs/Zend/Gdata/Gapps/Extension/Nickname.php create mode 100644 libs/Zend/Gdata/Gapps/Extension/Quota.php create mode 100644 libs/Zend/Gdata/Gapps/NicknameEntry.php create mode 100644 libs/Zend/Gdata/Gapps/NicknameFeed.php create mode 100644 libs/Zend/Gdata/Gapps/NicknameQuery.php create mode 100644 libs/Zend/Gdata/Gapps/Query.php create mode 100644 libs/Zend/Gdata/Gapps/ServiceException.php create mode 100644 libs/Zend/Gdata/Gapps/UserEntry.php create mode 100644 libs/Zend/Gdata/Gapps/UserFeed.php create mode 100644 libs/Zend/Gdata/Gapps/UserQuery.php create mode 100644 libs/Zend/Gdata/Gbase.php create mode 100644 libs/Zend/Gdata/Gbase/Entry.php create mode 100644 libs/Zend/Gdata/Gbase/Extension/BaseAttribute.php create mode 100644 libs/Zend/Gdata/Gbase/Feed.php create mode 100644 libs/Zend/Gdata/Gbase/ItemEntry.php create mode 100644 libs/Zend/Gdata/Gbase/ItemFeed.php create mode 100644 libs/Zend/Gdata/Gbase/ItemQuery.php create mode 100644 libs/Zend/Gdata/Gbase/Query.php create mode 100644 libs/Zend/Gdata/Gbase/SnippetEntry.php create mode 100644 libs/Zend/Gdata/Gbase/SnippetFeed.php create mode 100644 libs/Zend/Gdata/Gbase/SnippetQuery.php create mode 100755 libs/Zend/Gdata/Geo.php create mode 100755 libs/Zend/Gdata/Geo/Entry.php create mode 100755 libs/Zend/Gdata/Geo/Extension/GeoRssWhere.php create mode 100755 libs/Zend/Gdata/Geo/Extension/GmlPoint.php create mode 100755 libs/Zend/Gdata/Geo/Extension/GmlPos.php create mode 100755 libs/Zend/Gdata/Geo/Feed.php create mode 100644 libs/Zend/Gdata/HttpClient.php create mode 100644 libs/Zend/Gdata/Kind/EventEntry.php create mode 100755 libs/Zend/Gdata/Media.php create mode 100755 libs/Zend/Gdata/Media/Entry.php create mode 100755 libs/Zend/Gdata/Media/Extension/MediaCategory.php create mode 100755 libs/Zend/Gdata/Media/Extension/MediaContent.php create mode 100755 libs/Zend/Gdata/Media/Extension/MediaCopyright.php create mode 100755 libs/Zend/Gdata/Media/Extension/MediaCredit.php create mode 100755 libs/Zend/Gdata/Media/Extension/MediaDescription.php create mode 100755 libs/Zend/Gdata/Media/Extension/MediaGroup.php create mode 100755 libs/Zend/Gdata/Media/Extension/MediaHash.php create mode 100755 libs/Zend/Gdata/Media/Extension/MediaKeywords.php create mode 100755 libs/Zend/Gdata/Media/Extension/MediaPlayer.php create mode 100755 libs/Zend/Gdata/Media/Extension/MediaRating.php create mode 100755 libs/Zend/Gdata/Media/Extension/MediaRestriction.php create mode 100755 libs/Zend/Gdata/Media/Extension/MediaText.php create mode 100755 libs/Zend/Gdata/Media/Extension/MediaThumbnail.php create mode 100755 libs/Zend/Gdata/Media/Extension/MediaTitle.php create mode 100755 libs/Zend/Gdata/Media/Feed.php create mode 100755 libs/Zend/Gdata/Photos.php create mode 100755 libs/Zend/Gdata/Photos/AlbumEntry.php create mode 100755 libs/Zend/Gdata/Photos/AlbumFeed.php create mode 100755 libs/Zend/Gdata/Photos/AlbumQuery.php create mode 100755 libs/Zend/Gdata/Photos/CommentEntry.php create mode 100755 libs/Zend/Gdata/Photos/Extension/Access.php create mode 100755 libs/Zend/Gdata/Photos/Extension/AlbumId.php create mode 100755 libs/Zend/Gdata/Photos/Extension/BytesUsed.php create mode 100755 libs/Zend/Gdata/Photos/Extension/Checksum.php create mode 100755 libs/Zend/Gdata/Photos/Extension/Client.php create mode 100755 libs/Zend/Gdata/Photos/Extension/CommentCount.php create mode 100755 libs/Zend/Gdata/Photos/Extension/CommentingEnabled.php create mode 100755 libs/Zend/Gdata/Photos/Extension/Height.php create mode 100755 libs/Zend/Gdata/Photos/Extension/Id.php create mode 100755 libs/Zend/Gdata/Photos/Extension/Location.php create mode 100755 libs/Zend/Gdata/Photos/Extension/MaxPhotosPerAlbum.php create mode 100755 libs/Zend/Gdata/Photos/Extension/Name.php create mode 100755 libs/Zend/Gdata/Photos/Extension/Nickname.php create mode 100755 libs/Zend/Gdata/Photos/Extension/NumPhotos.php create mode 100755 libs/Zend/Gdata/Photos/Extension/NumPhotosRemaining.php create mode 100755 libs/Zend/Gdata/Photos/Extension/PhotoId.php create mode 100755 libs/Zend/Gdata/Photos/Extension/Position.php create mode 100755 libs/Zend/Gdata/Photos/Extension/QuotaCurrent.php create mode 100755 libs/Zend/Gdata/Photos/Extension/QuotaLimit.php create mode 100755 libs/Zend/Gdata/Photos/Extension/Rotation.php create mode 100755 libs/Zend/Gdata/Photos/Extension/Size.php create mode 100755 libs/Zend/Gdata/Photos/Extension/Thumbnail.php create mode 100755 libs/Zend/Gdata/Photos/Extension/Timestamp.php create mode 100755 libs/Zend/Gdata/Photos/Extension/User.php create mode 100755 libs/Zend/Gdata/Photos/Extension/Version.php create mode 100755 libs/Zend/Gdata/Photos/Extension/Weight.php create mode 100755 libs/Zend/Gdata/Photos/Extension/Width.php create mode 100755 libs/Zend/Gdata/Photos/PhotoEntry.php create mode 100755 libs/Zend/Gdata/Photos/PhotoFeed.php create mode 100755 libs/Zend/Gdata/Photos/PhotoQuery.php create mode 100755 libs/Zend/Gdata/Photos/TagEntry.php create mode 100755 libs/Zend/Gdata/Photos/UserEntry.php create mode 100755 libs/Zend/Gdata/Photos/UserFeed.php create mode 100755 libs/Zend/Gdata/Photos/UserQuery.php create mode 100644 libs/Zend/Gdata/Query.php create mode 100644 libs/Zend/Gdata/Spreadsheets.php create mode 100644 libs/Zend/Gdata/Spreadsheets/CellEntry.php create mode 100644 libs/Zend/Gdata/Spreadsheets/CellFeed.php create mode 100644 libs/Zend/Gdata/Spreadsheets/CellQuery.php create mode 100644 libs/Zend/Gdata/Spreadsheets/DocumentQuery.php create mode 100644 libs/Zend/Gdata/Spreadsheets/Extension/Cell.php create mode 100644 libs/Zend/Gdata/Spreadsheets/Extension/ColCount.php create mode 100644 libs/Zend/Gdata/Spreadsheets/Extension/Custom.php create mode 100644 libs/Zend/Gdata/Spreadsheets/Extension/RowCount.php create mode 100644 libs/Zend/Gdata/Spreadsheets/ListEntry.php create mode 100644 libs/Zend/Gdata/Spreadsheets/ListFeed.php create mode 100644 libs/Zend/Gdata/Spreadsheets/ListQuery.php create mode 100644 libs/Zend/Gdata/Spreadsheets/SpreadsheetEntry.php create mode 100644 libs/Zend/Gdata/Spreadsheets/SpreadsheetFeed.php create mode 100644 libs/Zend/Gdata/Spreadsheets/WorksheetEntry.php create mode 100644 libs/Zend/Gdata/Spreadsheets/WorksheetFeed.php create mode 100644 libs/Zend/Gdata/YouTube.php create mode 100644 libs/Zend/Gdata/YouTube/CommentEntry.php create mode 100644 libs/Zend/Gdata/YouTube/CommentFeed.php create mode 100644 libs/Zend/Gdata/YouTube/ContactEntry.php create mode 100644 libs/Zend/Gdata/YouTube/ContactFeed.php create mode 100644 libs/Zend/Gdata/YouTube/Extension/Age.php create mode 100644 libs/Zend/Gdata/YouTube/Extension/Books.php create mode 100644 libs/Zend/Gdata/YouTube/Extension/Company.php create mode 100755 libs/Zend/Gdata/YouTube/Extension/Control.php create mode 100644 libs/Zend/Gdata/YouTube/Extension/Description.php create mode 100644 libs/Zend/Gdata/YouTube/Extension/Duration.php create mode 100644 libs/Zend/Gdata/YouTube/Extension/Gender.php create mode 100644 libs/Zend/Gdata/YouTube/Extension/Hobbies.php create mode 100644 libs/Zend/Gdata/YouTube/Extension/Hometown.php create mode 100755 libs/Zend/Gdata/YouTube/Extension/Link.php create mode 100644 libs/Zend/Gdata/YouTube/Extension/Location.php create mode 100755 libs/Zend/Gdata/YouTube/Extension/MediaContent.php create mode 100755 libs/Zend/Gdata/YouTube/Extension/MediaGroup.php create mode 100644 libs/Zend/Gdata/YouTube/Extension/Movies.php create mode 100644 libs/Zend/Gdata/YouTube/Extension/Music.php create mode 100644 libs/Zend/Gdata/YouTube/Extension/NoEmbed.php create mode 100644 libs/Zend/Gdata/YouTube/Extension/Occupation.php create mode 100644 libs/Zend/Gdata/YouTube/Extension/Position.php create mode 100755 libs/Zend/Gdata/YouTube/Extension/Private.php create mode 100644 libs/Zend/Gdata/YouTube/Extension/Racy.php create mode 100644 libs/Zend/Gdata/YouTube/Extension/Recorded.php create mode 100644 libs/Zend/Gdata/YouTube/Extension/Relationship.php create mode 100644 libs/Zend/Gdata/YouTube/Extension/ReleaseDate.php create mode 100644 libs/Zend/Gdata/YouTube/Extension/School.php create mode 100644 libs/Zend/Gdata/YouTube/Extension/State.php create mode 100644 libs/Zend/Gdata/YouTube/Extension/Statistics.php create mode 100644 libs/Zend/Gdata/YouTube/Extension/Status.php create mode 100755 libs/Zend/Gdata/YouTube/Extension/Token.php create mode 100644 libs/Zend/Gdata/YouTube/Extension/Username.php create mode 100755 libs/Zend/Gdata/YouTube/MediaEntry.php create mode 100644 libs/Zend/Gdata/YouTube/PlaylistListEntry.php create mode 100644 libs/Zend/Gdata/YouTube/PlaylistListFeed.php create mode 100644 libs/Zend/Gdata/YouTube/PlaylistVideoEntry.php create mode 100644 libs/Zend/Gdata/YouTube/PlaylistVideoFeed.php create mode 100644 libs/Zend/Gdata/YouTube/SubscriptionEntry.php create mode 100644 libs/Zend/Gdata/YouTube/SubscriptionFeed.php create mode 100644 libs/Zend/Gdata/YouTube/UserProfileEntry.php create mode 100644 libs/Zend/Gdata/YouTube/VideoEntry.php create mode 100644 libs/Zend/Gdata/YouTube/VideoFeed.php create mode 100644 libs/Zend/Gdata/YouTube/VideoQuery.php create mode 100644 libs/Zend/Http/Client.php create mode 100644 libs/Zend/Http/Client/Adapter/Exception.php create mode 100644 libs/Zend/Http/Client/Adapter/Interface.php create mode 100644 libs/Zend/Http/Client/Adapter/Proxy.php create mode 100644 libs/Zend/Http/Client/Adapter/Socket.php create mode 100644 libs/Zend/Http/Client/Adapter/Test.php create mode 100644 libs/Zend/Http/Client/Exception.php create mode 100644 libs/Zend/Http/Cookie.php create mode 100644 libs/Zend/Http/CookieJar.php create mode 100644 libs/Zend/Http/Exception.php create mode 100644 libs/Zend/Http/Response.php create mode 100644 libs/Zend/InfoCard.php create mode 100644 libs/Zend/InfoCard/Adapter/Default.php create mode 100644 libs/Zend/InfoCard/Adapter/Exception.php create mode 100644 libs/Zend/InfoCard/Adapter/Interface.php create mode 100644 libs/Zend/InfoCard/Cipher.php create mode 100644 libs/Zend/InfoCard/Cipher/Exception.php create mode 100644 libs/Zend/InfoCard/Cipher/Pki/Adapter/Abstract.php create mode 100644 libs/Zend/InfoCard/Cipher/Pki/Adapter/Rsa.php create mode 100644 libs/Zend/InfoCard/Cipher/Pki/Interface.php create mode 100644 libs/Zend/InfoCard/Cipher/Pki/Rsa/Interface.php create mode 100644 libs/Zend/InfoCard/Cipher/Symmetric/Adapter/Abstract.php create mode 100644 libs/Zend/InfoCard/Cipher/Symmetric/Adapter/Aes128cbc.php create mode 100644 libs/Zend/InfoCard/Cipher/Symmetric/Adapter/Aes256cbc.php create mode 100644 libs/Zend/InfoCard/Cipher/Symmetric/Aes128cbc/Interface.php create mode 100644 libs/Zend/InfoCard/Cipher/Symmetric/Aes256cbc/Interface.php create mode 100644 libs/Zend/InfoCard/Cipher/Symmetric/Interface.php create mode 100644 libs/Zend/InfoCard/Claims.php create mode 100644 libs/Zend/InfoCard/Exception.php create mode 100644 libs/Zend/InfoCard/Xml/Assertion.php create mode 100644 libs/Zend/InfoCard/Xml/Assertion/Interface.php create mode 100644 libs/Zend/InfoCard/Xml/Assertion/Saml.php create mode 100644 libs/Zend/InfoCard/Xml/Element.php create mode 100644 libs/Zend/InfoCard/Xml/Element/Interface.php create mode 100644 libs/Zend/InfoCard/Xml/EncryptedData.php create mode 100644 libs/Zend/InfoCard/Xml/EncryptedData/Abstract.php create mode 100644 libs/Zend/InfoCard/Xml/EncryptedData/XmlEnc.php create mode 100644 libs/Zend/InfoCard/Xml/EncryptedKey.php create mode 100644 libs/Zend/InfoCard/Xml/Exception.php create mode 100644 libs/Zend/InfoCard/Xml/KeyInfo.php create mode 100644 libs/Zend/InfoCard/Xml/KeyInfo/Abstract.php create mode 100644 libs/Zend/InfoCard/Xml/KeyInfo/Default.php create mode 100644 libs/Zend/InfoCard/Xml/KeyInfo/Interface.php create mode 100644 libs/Zend/InfoCard/Xml/KeyInfo/XmlDSig.php create mode 100644 libs/Zend/InfoCard/Xml/Security.php create mode 100644 libs/Zend/InfoCard/Xml/Security/Exception.php create mode 100644 libs/Zend/InfoCard/Xml/Security/Transform.php create mode 100644 libs/Zend/InfoCard/Xml/Security/Transform/EnvelopedSignature.php create mode 100644 libs/Zend/InfoCard/Xml/Security/Transform/Exception.php create mode 100644 libs/Zend/InfoCard/Xml/Security/Transform/Interface.php create mode 100644 libs/Zend/InfoCard/Xml/Security/Transform/XmlExcC14N.php create mode 100644 libs/Zend/InfoCard/Xml/SecurityTokenReference.php create mode 100644 libs/Zend/Json.php create mode 100644 libs/Zend/Json/Decoder.php create mode 100644 libs/Zend/Json/Encoder.php create mode 100644 libs/Zend/Json/Exception.php create mode 100644 libs/Zend/Json/Server.php create mode 100644 libs/Zend/Json/Server/Cache.php create mode 100644 libs/Zend/Json/Server/Error.php create mode 100644 libs/Zend/Json/Server/Exception.php create mode 100644 libs/Zend/Json/Server/Request.php create mode 100644 libs/Zend/Json/Server/Request/Http.php create mode 100644 libs/Zend/Json/Server/Response.php create mode 100644 libs/Zend/Json/Server/Response/Http.php create mode 100644 libs/Zend/Json/Server/Smd.php create mode 100644 libs/Zend/Json/Server/Smd/Service.php create mode 100644 libs/Zend/Layout.php create mode 100644 libs/Zend/Layout/Controller/Action/Helper/Layout.php create mode 100644 libs/Zend/Layout/Controller/Plugin/Layout.php create mode 100644 libs/Zend/Layout/Exception.php create mode 100644 libs/Zend/Ldap.php create mode 100644 libs/Zend/Ldap/Exception.php create mode 100644 libs/Zend/Loader.php create mode 100644 libs/Zend/Loader/Exception.php create mode 100644 libs/Zend/Loader/PluginLoader.php create mode 100644 libs/Zend/Loader/PluginLoader/Exception.php create mode 100644 libs/Zend/Loader/PluginLoader/Interface.php create mode 100644 libs/Zend/Locale.php create mode 100644 libs/Zend/Locale/Data.php create mode 100644 libs/Zend/Locale/Data/Translation.php create mode 100644 libs/Zend/Locale/Data/aa.xml create mode 100644 libs/Zend/Locale/Data/aa_DJ.xml create mode 100644 libs/Zend/Locale/Data/aa_ER.xml create mode 100644 libs/Zend/Locale/Data/aa_ET.xml create mode 100644 libs/Zend/Locale/Data/af.xml create mode 100644 libs/Zend/Locale/Data/af_NA.xml create mode 100644 libs/Zend/Locale/Data/af_ZA.xml create mode 100644 libs/Zend/Locale/Data/ak.xml create mode 100644 libs/Zend/Locale/Data/ak_GH.xml create mode 100644 libs/Zend/Locale/Data/am.xml create mode 100644 libs/Zend/Locale/Data/am_ET.xml create mode 100644 libs/Zend/Locale/Data/ar.xml create mode 100644 libs/Zend/Locale/Data/ar_AE.xml create mode 100644 libs/Zend/Locale/Data/ar_BH.xml create mode 100644 libs/Zend/Locale/Data/ar_DZ.xml create mode 100644 libs/Zend/Locale/Data/ar_EG.xml create mode 100644 libs/Zend/Locale/Data/ar_IQ.xml create mode 100644 libs/Zend/Locale/Data/ar_JO.xml create mode 100644 libs/Zend/Locale/Data/ar_KW.xml create mode 100644 libs/Zend/Locale/Data/ar_LB.xml create mode 100644 libs/Zend/Locale/Data/ar_LY.xml create mode 100644 libs/Zend/Locale/Data/ar_MA.xml create mode 100644 libs/Zend/Locale/Data/ar_OM.xml create mode 100644 libs/Zend/Locale/Data/ar_QA.xml create mode 100644 libs/Zend/Locale/Data/ar_SA.xml create mode 100644 libs/Zend/Locale/Data/ar_SD.xml create mode 100644 libs/Zend/Locale/Data/ar_SY.xml create mode 100644 libs/Zend/Locale/Data/ar_TN.xml create mode 100644 libs/Zend/Locale/Data/ar_YE.xml create mode 100644 libs/Zend/Locale/Data/as.xml create mode 100644 libs/Zend/Locale/Data/as_IN.xml create mode 100644 libs/Zend/Locale/Data/az.xml create mode 100644 libs/Zend/Locale/Data/az_AZ.xml create mode 100644 libs/Zend/Locale/Data/az_Cyrl.xml create mode 100644 libs/Zend/Locale/Data/az_Cyrl_AZ.xml create mode 100644 libs/Zend/Locale/Data/az_Latn.xml create mode 100644 libs/Zend/Locale/Data/az_Latn_AZ.xml create mode 100644 libs/Zend/Locale/Data/be.xml create mode 100644 libs/Zend/Locale/Data/be_BY.xml create mode 100644 libs/Zend/Locale/Data/bg.xml create mode 100644 libs/Zend/Locale/Data/bg_BG.xml create mode 100644 libs/Zend/Locale/Data/bn.xml create mode 100644 libs/Zend/Locale/Data/bn_BD.xml create mode 100644 libs/Zend/Locale/Data/bn_IN.xml create mode 100644 libs/Zend/Locale/Data/bs.xml create mode 100644 libs/Zend/Locale/Data/bs_BA.xml create mode 100644 libs/Zend/Locale/Data/byn.xml create mode 100644 libs/Zend/Locale/Data/byn_ER.xml create mode 100644 libs/Zend/Locale/Data/ca.xml create mode 100644 libs/Zend/Locale/Data/ca_ES.xml create mode 100644 libs/Zend/Locale/Data/cch.xml create mode 100644 libs/Zend/Locale/Data/cch_NG.xml create mode 100644 libs/Zend/Locale/Data/characters.xml create mode 100644 libs/Zend/Locale/Data/cop.xml create mode 100644 libs/Zend/Locale/Data/cs.xml create mode 100644 libs/Zend/Locale/Data/cs_CZ.xml create mode 100644 libs/Zend/Locale/Data/cy.xml create mode 100644 libs/Zend/Locale/Data/cy_GB.xml create mode 100644 libs/Zend/Locale/Data/da.xml create mode 100644 libs/Zend/Locale/Data/da_DK.xml create mode 100644 libs/Zend/Locale/Data/de.xml create mode 100644 libs/Zend/Locale/Data/de_AT.xml create mode 100644 libs/Zend/Locale/Data/de_BE.xml create mode 100644 libs/Zend/Locale/Data/de_CH.xml create mode 100644 libs/Zend/Locale/Data/de_DE.xml create mode 100644 libs/Zend/Locale/Data/de_LI.xml create mode 100644 libs/Zend/Locale/Data/de_LU.xml create mode 100644 libs/Zend/Locale/Data/dv.xml create mode 100644 libs/Zend/Locale/Data/dv_MV.xml create mode 100644 libs/Zend/Locale/Data/dz.xml create mode 100644 libs/Zend/Locale/Data/dz_BT.xml create mode 100644 libs/Zend/Locale/Data/ee.xml create mode 100644 libs/Zend/Locale/Data/ee_GH.xml create mode 100644 libs/Zend/Locale/Data/ee_TG.xml create mode 100644 libs/Zend/Locale/Data/el.xml create mode 100644 libs/Zend/Locale/Data/el_CY.xml create mode 100644 libs/Zend/Locale/Data/el_GR.xml create mode 100644 libs/Zend/Locale/Data/el_POLYTON.xml create mode 100644 libs/Zend/Locale/Data/en.xml create mode 100644 libs/Zend/Locale/Data/en_AS.xml create mode 100644 libs/Zend/Locale/Data/en_AU.xml create mode 100644 libs/Zend/Locale/Data/en_BE.xml create mode 100644 libs/Zend/Locale/Data/en_BW.xml create mode 100644 libs/Zend/Locale/Data/en_BZ.xml create mode 100644 libs/Zend/Locale/Data/en_CA.xml create mode 100644 libs/Zend/Locale/Data/en_GB.xml create mode 100644 libs/Zend/Locale/Data/en_GU.xml create mode 100644 libs/Zend/Locale/Data/en_HK.xml create mode 100644 libs/Zend/Locale/Data/en_IE.xml create mode 100644 libs/Zend/Locale/Data/en_IN.xml create mode 100644 libs/Zend/Locale/Data/en_JM.xml create mode 100644 libs/Zend/Locale/Data/en_MH.xml create mode 100644 libs/Zend/Locale/Data/en_MP.xml create mode 100644 libs/Zend/Locale/Data/en_MT.xml create mode 100644 libs/Zend/Locale/Data/en_NA.xml create mode 100644 libs/Zend/Locale/Data/en_NZ.xml create mode 100644 libs/Zend/Locale/Data/en_PH.xml create mode 100644 libs/Zend/Locale/Data/en_PK.xml create mode 100644 libs/Zend/Locale/Data/en_SG.xml create mode 100644 libs/Zend/Locale/Data/en_Shaw.xml create mode 100644 libs/Zend/Locale/Data/en_TT.xml create mode 100644 libs/Zend/Locale/Data/en_UM.xml create mode 100644 libs/Zend/Locale/Data/en_US.xml create mode 100644 libs/Zend/Locale/Data/en_US_POSIX.xml create mode 100644 libs/Zend/Locale/Data/en_VI.xml create mode 100644 libs/Zend/Locale/Data/en_ZA.xml create mode 100644 libs/Zend/Locale/Data/en_ZW.xml create mode 100644 libs/Zend/Locale/Data/eo.xml create mode 100644 libs/Zend/Locale/Data/es.xml create mode 100644 libs/Zend/Locale/Data/es_AR.xml create mode 100644 libs/Zend/Locale/Data/es_BO.xml create mode 100644 libs/Zend/Locale/Data/es_CL.xml create mode 100644 libs/Zend/Locale/Data/es_CO.xml create mode 100644 libs/Zend/Locale/Data/es_CR.xml create mode 100644 libs/Zend/Locale/Data/es_DO.xml create mode 100644 libs/Zend/Locale/Data/es_EC.xml create mode 100644 libs/Zend/Locale/Data/es_ES.xml create mode 100644 libs/Zend/Locale/Data/es_GT.xml create mode 100644 libs/Zend/Locale/Data/es_HN.xml create mode 100644 libs/Zend/Locale/Data/es_MX.xml create mode 100644 libs/Zend/Locale/Data/es_NI.xml create mode 100644 libs/Zend/Locale/Data/es_PA.xml create mode 100644 libs/Zend/Locale/Data/es_PE.xml create mode 100644 libs/Zend/Locale/Data/es_PR.xml create mode 100644 libs/Zend/Locale/Data/es_PY.xml create mode 100644 libs/Zend/Locale/Data/es_SV.xml create mode 100644 libs/Zend/Locale/Data/es_US.xml create mode 100644 libs/Zend/Locale/Data/es_UY.xml create mode 100644 libs/Zend/Locale/Data/es_VE.xml create mode 100644 libs/Zend/Locale/Data/et.xml create mode 100644 libs/Zend/Locale/Data/et_EE.xml create mode 100644 libs/Zend/Locale/Data/eu.xml create mode 100644 libs/Zend/Locale/Data/eu_ES.xml create mode 100644 libs/Zend/Locale/Data/fa.xml create mode 100644 libs/Zend/Locale/Data/fa_AF.xml create mode 100644 libs/Zend/Locale/Data/fa_IR.xml create mode 100644 libs/Zend/Locale/Data/fi.xml create mode 100644 libs/Zend/Locale/Data/fi_FI.xml create mode 100644 libs/Zend/Locale/Data/fil.xml create mode 100644 libs/Zend/Locale/Data/fil_PH.xml create mode 100644 libs/Zend/Locale/Data/fo.xml create mode 100644 libs/Zend/Locale/Data/fo_FO.xml create mode 100644 libs/Zend/Locale/Data/fr.xml create mode 100644 libs/Zend/Locale/Data/fr_BE.xml create mode 100644 libs/Zend/Locale/Data/fr_CA.xml create mode 100644 libs/Zend/Locale/Data/fr_CH.xml create mode 100644 libs/Zend/Locale/Data/fr_FR.xml create mode 100644 libs/Zend/Locale/Data/fr_LU.xml create mode 100644 libs/Zend/Locale/Data/fr_MC.xml create mode 100644 libs/Zend/Locale/Data/fr_SN.xml create mode 100644 libs/Zend/Locale/Data/fur.xml create mode 100644 libs/Zend/Locale/Data/fur_IT.xml create mode 100644 libs/Zend/Locale/Data/ga.xml create mode 100644 libs/Zend/Locale/Data/ga_IE.xml create mode 100644 libs/Zend/Locale/Data/gaa.xml create mode 100644 libs/Zend/Locale/Data/gaa_GH.xml create mode 100644 libs/Zend/Locale/Data/gez.xml create mode 100644 libs/Zend/Locale/Data/gez_ER.xml create mode 100644 libs/Zend/Locale/Data/gez_ET.xml create mode 100644 libs/Zend/Locale/Data/gl.xml create mode 100644 libs/Zend/Locale/Data/gl_ES.xml create mode 100644 libs/Zend/Locale/Data/gu.xml create mode 100644 libs/Zend/Locale/Data/gu_IN.xml create mode 100644 libs/Zend/Locale/Data/gv.xml create mode 100644 libs/Zend/Locale/Data/gv_GB.xml create mode 100644 libs/Zend/Locale/Data/ha.xml create mode 100644 libs/Zend/Locale/Data/ha_Arab.xml create mode 100644 libs/Zend/Locale/Data/ha_Arab_NG.xml create mode 100644 libs/Zend/Locale/Data/ha_Arab_SD.xml create mode 100644 libs/Zend/Locale/Data/ha_GH.xml create mode 100644 libs/Zend/Locale/Data/ha_Latn.xml create mode 100644 libs/Zend/Locale/Data/ha_Latn_GH.xml create mode 100644 libs/Zend/Locale/Data/ha_Latn_NE.xml create mode 100644 libs/Zend/Locale/Data/ha_Latn_NG.xml create mode 100644 libs/Zend/Locale/Data/ha_NE.xml create mode 100644 libs/Zend/Locale/Data/ha_NG.xml create mode 100644 libs/Zend/Locale/Data/ha_SD.xml create mode 100644 libs/Zend/Locale/Data/haw.xml create mode 100644 libs/Zend/Locale/Data/haw_US.xml create mode 100644 libs/Zend/Locale/Data/he.xml create mode 100644 libs/Zend/Locale/Data/he_IL.xml create mode 100644 libs/Zend/Locale/Data/hi.xml create mode 100644 libs/Zend/Locale/Data/hi_IN.xml create mode 100644 libs/Zend/Locale/Data/hr.xml create mode 100644 libs/Zend/Locale/Data/hr_HR.xml create mode 100644 libs/Zend/Locale/Data/hu.xml create mode 100644 libs/Zend/Locale/Data/hu_HU.xml create mode 100644 libs/Zend/Locale/Data/hy.xml create mode 100644 libs/Zend/Locale/Data/hy_AM.xml create mode 100644 libs/Zend/Locale/Data/hy_AM_REVISED.xml create mode 100644 libs/Zend/Locale/Data/ia.xml create mode 100644 libs/Zend/Locale/Data/id.xml create mode 100644 libs/Zend/Locale/Data/id_ID.xml create mode 100644 libs/Zend/Locale/Data/ig.xml create mode 100644 libs/Zend/Locale/Data/ig_NG.xml create mode 100644 libs/Zend/Locale/Data/ii.xml create mode 100644 libs/Zend/Locale/Data/ii_CN.xml create mode 100644 libs/Zend/Locale/Data/in.xml create mode 100644 libs/Zend/Locale/Data/is.xml create mode 100644 libs/Zend/Locale/Data/is_IS.xml create mode 100644 libs/Zend/Locale/Data/it.xml create mode 100644 libs/Zend/Locale/Data/it_CH.xml create mode 100644 libs/Zend/Locale/Data/it_IT.xml create mode 100644 libs/Zend/Locale/Data/iu.xml create mode 100644 libs/Zend/Locale/Data/iw.xml create mode 100644 libs/Zend/Locale/Data/ja.xml create mode 100644 libs/Zend/Locale/Data/ja_JP.xml create mode 100644 libs/Zend/Locale/Data/ka.xml create mode 100644 libs/Zend/Locale/Data/ka_GE.xml create mode 100644 libs/Zend/Locale/Data/kaj.xml create mode 100644 libs/Zend/Locale/Data/kaj_NG.xml create mode 100644 libs/Zend/Locale/Data/kam.xml create mode 100644 libs/Zend/Locale/Data/kam_KE.xml create mode 100644 libs/Zend/Locale/Data/kcg.xml create mode 100644 libs/Zend/Locale/Data/kcg_NG.xml create mode 100644 libs/Zend/Locale/Data/kfo.xml create mode 100644 libs/Zend/Locale/Data/kfo_CI.xml create mode 100644 libs/Zend/Locale/Data/kk.xml create mode 100644 libs/Zend/Locale/Data/kk_Cyrl.xml create mode 100644 libs/Zend/Locale/Data/kk_Cyrl_KZ.xml create mode 100644 libs/Zend/Locale/Data/kk_KZ.xml create mode 100644 libs/Zend/Locale/Data/kl.xml create mode 100644 libs/Zend/Locale/Data/kl_GL.xml create mode 100644 libs/Zend/Locale/Data/km.xml create mode 100644 libs/Zend/Locale/Data/km_KH.xml create mode 100644 libs/Zend/Locale/Data/kn.xml create mode 100644 libs/Zend/Locale/Data/kn_IN.xml create mode 100644 libs/Zend/Locale/Data/ko.xml create mode 100644 libs/Zend/Locale/Data/ko_KR.xml create mode 100644 libs/Zend/Locale/Data/kok.xml create mode 100644 libs/Zend/Locale/Data/kok_IN.xml create mode 100644 libs/Zend/Locale/Data/kpe.xml create mode 100644 libs/Zend/Locale/Data/kpe_GN.xml create mode 100644 libs/Zend/Locale/Data/kpe_LR.xml create mode 100644 libs/Zend/Locale/Data/ku.xml create mode 100644 libs/Zend/Locale/Data/ku_Arab.xml create mode 100644 libs/Zend/Locale/Data/ku_Latn.xml create mode 100644 libs/Zend/Locale/Data/ku_Latn_TR.xml create mode 100644 libs/Zend/Locale/Data/ku_TR.xml create mode 100644 libs/Zend/Locale/Data/kw.xml create mode 100644 libs/Zend/Locale/Data/kw_GB.xml create mode 100644 libs/Zend/Locale/Data/ky.xml create mode 100644 libs/Zend/Locale/Data/ky_KG.xml create mode 100644 libs/Zend/Locale/Data/ln.xml create mode 100644 libs/Zend/Locale/Data/ln_CD.xml create mode 100644 libs/Zend/Locale/Data/ln_CG.xml create mode 100644 libs/Zend/Locale/Data/lo.xml create mode 100644 libs/Zend/Locale/Data/lo_LA.xml create mode 100644 libs/Zend/Locale/Data/lt.xml create mode 100644 libs/Zend/Locale/Data/lt_LT.xml create mode 100644 libs/Zend/Locale/Data/lv.xml create mode 100644 libs/Zend/Locale/Data/lv_LV.xml create mode 100644 libs/Zend/Locale/Data/mk.xml create mode 100644 libs/Zend/Locale/Data/mk_MK.xml create mode 100644 libs/Zend/Locale/Data/ml.xml create mode 100644 libs/Zend/Locale/Data/ml_IN.xml create mode 100644 libs/Zend/Locale/Data/mn.xml create mode 100644 libs/Zend/Locale/Data/mn_CN.xml create mode 100644 libs/Zend/Locale/Data/mn_Cyrl.xml create mode 100644 libs/Zend/Locale/Data/mn_Cyrl_MN.xml create mode 100644 libs/Zend/Locale/Data/mn_MN.xml create mode 100644 libs/Zend/Locale/Data/mn_Mong.xml create mode 100644 libs/Zend/Locale/Data/mn_Mong_CN.xml create mode 100644 libs/Zend/Locale/Data/mo.xml create mode 100644 libs/Zend/Locale/Data/mr.xml create mode 100644 libs/Zend/Locale/Data/mr_IN.xml create mode 100644 libs/Zend/Locale/Data/ms.xml create mode 100644 libs/Zend/Locale/Data/ms_BN.xml create mode 100644 libs/Zend/Locale/Data/ms_MY.xml create mode 100644 libs/Zend/Locale/Data/mt.xml create mode 100644 libs/Zend/Locale/Data/mt_MT.xml create mode 100644 libs/Zend/Locale/Data/my.xml create mode 100644 libs/Zend/Locale/Data/my_MM.xml create mode 100644 libs/Zend/Locale/Data/nb.xml create mode 100644 libs/Zend/Locale/Data/nb_NO.xml create mode 100644 libs/Zend/Locale/Data/ne.xml create mode 100644 libs/Zend/Locale/Data/ne_IN.xml create mode 100644 libs/Zend/Locale/Data/ne_NP.xml create mode 100644 libs/Zend/Locale/Data/nl.xml create mode 100644 libs/Zend/Locale/Data/nl_BE.xml create mode 100644 libs/Zend/Locale/Data/nl_NL.xml create mode 100644 libs/Zend/Locale/Data/nn.xml create mode 100644 libs/Zend/Locale/Data/nn_NO.xml create mode 100644 libs/Zend/Locale/Data/no.xml create mode 100644 libs/Zend/Locale/Data/nr.xml create mode 100644 libs/Zend/Locale/Data/nr_ZA.xml create mode 100644 libs/Zend/Locale/Data/nso.xml create mode 100644 libs/Zend/Locale/Data/nso_ZA.xml create mode 100644 libs/Zend/Locale/Data/ny.xml create mode 100644 libs/Zend/Locale/Data/ny_MW.xml create mode 100644 libs/Zend/Locale/Data/om.xml create mode 100644 libs/Zend/Locale/Data/om_ET.xml create mode 100644 libs/Zend/Locale/Data/om_KE.xml create mode 100644 libs/Zend/Locale/Data/or.xml create mode 100644 libs/Zend/Locale/Data/or_IN.xml create mode 100644 libs/Zend/Locale/Data/pa.xml create mode 100644 libs/Zend/Locale/Data/pa_Arab.xml create mode 100644 libs/Zend/Locale/Data/pa_Arab_PK.xml create mode 100644 libs/Zend/Locale/Data/pa_Guru.xml create mode 100644 libs/Zend/Locale/Data/pa_Guru_IN.xml create mode 100644 libs/Zend/Locale/Data/pa_IN.xml create mode 100644 libs/Zend/Locale/Data/pa_PK.xml create mode 100644 libs/Zend/Locale/Data/pl.xml create mode 100644 libs/Zend/Locale/Data/pl_PL.xml create mode 100644 libs/Zend/Locale/Data/plurals.xml create mode 100644 libs/Zend/Locale/Data/ps.xml create mode 100644 libs/Zend/Locale/Data/ps_AF.xml create mode 100644 libs/Zend/Locale/Data/pt.xml create mode 100644 libs/Zend/Locale/Data/pt_BR.xml create mode 100644 libs/Zend/Locale/Data/pt_PT.xml create mode 100644 libs/Zend/Locale/Data/ro.xml create mode 100644 libs/Zend/Locale/Data/ro_MD.xml create mode 100644 libs/Zend/Locale/Data/ro_RO.xml create mode 100644 libs/Zend/Locale/Data/root.xml create mode 100644 libs/Zend/Locale/Data/ru.xml create mode 100644 libs/Zend/Locale/Data/ru_RU.xml create mode 100644 libs/Zend/Locale/Data/ru_UA.xml create mode 100644 libs/Zend/Locale/Data/rw.xml create mode 100644 libs/Zend/Locale/Data/rw_RW.xml create mode 100644 libs/Zend/Locale/Data/sa.xml create mode 100644 libs/Zend/Locale/Data/sa_IN.xml create mode 100644 libs/Zend/Locale/Data/se.xml create mode 100644 libs/Zend/Locale/Data/se_FI.xml create mode 100644 libs/Zend/Locale/Data/se_NO.xml create mode 100644 libs/Zend/Locale/Data/sh.xml create mode 100644 libs/Zend/Locale/Data/sh_BA.xml create mode 100644 libs/Zend/Locale/Data/sh_CS.xml create mode 100644 libs/Zend/Locale/Data/sh_YU.xml create mode 100644 libs/Zend/Locale/Data/si.xml create mode 100644 libs/Zend/Locale/Data/si_LK.xml create mode 100644 libs/Zend/Locale/Data/sid.xml create mode 100644 libs/Zend/Locale/Data/sid_ET.xml create mode 100644 libs/Zend/Locale/Data/sk.xml create mode 100644 libs/Zend/Locale/Data/sk_SK.xml create mode 100644 libs/Zend/Locale/Data/sl.xml create mode 100644 libs/Zend/Locale/Data/sl_SI.xml create mode 100644 libs/Zend/Locale/Data/so.xml create mode 100644 libs/Zend/Locale/Data/so_DJ.xml create mode 100644 libs/Zend/Locale/Data/so_ET.xml create mode 100644 libs/Zend/Locale/Data/so_KE.xml create mode 100644 libs/Zend/Locale/Data/so_SO.xml create mode 100644 libs/Zend/Locale/Data/sq.xml create mode 100644 libs/Zend/Locale/Data/sq_AL.xml create mode 100644 libs/Zend/Locale/Data/sr.xml create mode 100644 libs/Zend/Locale/Data/sr_BA.xml create mode 100644 libs/Zend/Locale/Data/sr_CS.xml create mode 100644 libs/Zend/Locale/Data/sr_Cyrl.xml create mode 100644 libs/Zend/Locale/Data/sr_Cyrl_BA.xml create mode 100644 libs/Zend/Locale/Data/sr_Cyrl_CS.xml create mode 100644 libs/Zend/Locale/Data/sr_Cyrl_ME.xml create mode 100644 libs/Zend/Locale/Data/sr_Cyrl_RS.xml create mode 100644 libs/Zend/Locale/Data/sr_Cyrl_YU.xml create mode 100644 libs/Zend/Locale/Data/sr_Latn.xml create mode 100644 libs/Zend/Locale/Data/sr_Latn_BA.xml create mode 100644 libs/Zend/Locale/Data/sr_Latn_CS.xml create mode 100644 libs/Zend/Locale/Data/sr_Latn_ME.xml create mode 100644 libs/Zend/Locale/Data/sr_Latn_RS.xml create mode 100644 libs/Zend/Locale/Data/sr_Latn_YU.xml create mode 100644 libs/Zend/Locale/Data/sr_ME.xml create mode 100644 libs/Zend/Locale/Data/sr_RS.xml create mode 100644 libs/Zend/Locale/Data/sr_YU.xml create mode 100644 libs/Zend/Locale/Data/ss.xml create mode 100644 libs/Zend/Locale/Data/ss_SZ.xml create mode 100644 libs/Zend/Locale/Data/ss_ZA.xml create mode 100644 libs/Zend/Locale/Data/st.xml create mode 100644 libs/Zend/Locale/Data/st_LS.xml create mode 100644 libs/Zend/Locale/Data/st_ZA.xml create mode 100644 libs/Zend/Locale/Data/supplementalData.xml create mode 100644 libs/Zend/Locale/Data/sv.xml create mode 100644 libs/Zend/Locale/Data/sv_FI.xml create mode 100644 libs/Zend/Locale/Data/sv_SE.xml create mode 100644 libs/Zend/Locale/Data/sw.xml create mode 100644 libs/Zend/Locale/Data/sw_KE.xml create mode 100644 libs/Zend/Locale/Data/sw_TZ.xml create mode 100644 libs/Zend/Locale/Data/syr.xml create mode 100644 libs/Zend/Locale/Data/syr_SY.xml create mode 100644 libs/Zend/Locale/Data/ta.xml create mode 100644 libs/Zend/Locale/Data/ta_IN.xml create mode 100644 libs/Zend/Locale/Data/te.xml create mode 100644 libs/Zend/Locale/Data/te_IN.xml create mode 100644 libs/Zend/Locale/Data/telephoneCodeData.xml create mode 100644 libs/Zend/Locale/Data/tg.xml create mode 100644 libs/Zend/Locale/Data/tg_Cyrl.xml create mode 100644 libs/Zend/Locale/Data/tg_Cyrl_TJ.xml create mode 100644 libs/Zend/Locale/Data/tg_TJ.xml create mode 100644 libs/Zend/Locale/Data/th.xml create mode 100644 libs/Zend/Locale/Data/th_TH.xml create mode 100644 libs/Zend/Locale/Data/ti.xml create mode 100644 libs/Zend/Locale/Data/ti_ER.xml create mode 100644 libs/Zend/Locale/Data/ti_ET.xml create mode 100644 libs/Zend/Locale/Data/tig.xml create mode 100644 libs/Zend/Locale/Data/tig_ER.xml create mode 100644 libs/Zend/Locale/Data/tl.xml create mode 100644 libs/Zend/Locale/Data/tn.xml create mode 100644 libs/Zend/Locale/Data/tn_ZA.xml create mode 100644 libs/Zend/Locale/Data/to.xml create mode 100644 libs/Zend/Locale/Data/to_TO.xml create mode 100644 libs/Zend/Locale/Data/tr.xml create mode 100644 libs/Zend/Locale/Data/tr_TR.xml create mode 100644 libs/Zend/Locale/Data/ts.xml create mode 100644 libs/Zend/Locale/Data/ts_ZA.xml create mode 100644 libs/Zend/Locale/Data/tt.xml create mode 100644 libs/Zend/Locale/Data/tt_RU.xml create mode 100644 libs/Zend/Locale/Data/ug.xml create mode 100644 libs/Zend/Locale/Data/ug_Arab.xml create mode 100644 libs/Zend/Locale/Data/ug_Arab_CN.xml create mode 100644 libs/Zend/Locale/Data/ug_CN.xml create mode 100644 libs/Zend/Locale/Data/uk.xml create mode 100644 libs/Zend/Locale/Data/uk_UA.xml create mode 100644 libs/Zend/Locale/Data/ur.xml create mode 100644 libs/Zend/Locale/Data/ur_IN.xml create mode 100644 libs/Zend/Locale/Data/ur_PK.xml create mode 100644 libs/Zend/Locale/Data/uz.xml create mode 100644 libs/Zend/Locale/Data/uz_AF.xml create mode 100644 libs/Zend/Locale/Data/uz_Arab.xml create mode 100644 libs/Zend/Locale/Data/uz_Arab_AF.xml create mode 100644 libs/Zend/Locale/Data/uz_Cyrl.xml create mode 100644 libs/Zend/Locale/Data/uz_Cyrl_UZ.xml create mode 100644 libs/Zend/Locale/Data/uz_Latn.xml create mode 100644 libs/Zend/Locale/Data/uz_Latn_UZ.xml create mode 100644 libs/Zend/Locale/Data/uz_UZ.xml create mode 100644 libs/Zend/Locale/Data/ve.xml create mode 100644 libs/Zend/Locale/Data/ve_ZA.xml create mode 100644 libs/Zend/Locale/Data/vi.xml create mode 100644 libs/Zend/Locale/Data/vi_VN.xml create mode 100644 libs/Zend/Locale/Data/wal.xml create mode 100644 libs/Zend/Locale/Data/wal_ET.xml create mode 100644 libs/Zend/Locale/Data/wo.xml create mode 100644 libs/Zend/Locale/Data/wo_Latn.xml create mode 100644 libs/Zend/Locale/Data/wo_Latn_SN.xml create mode 100644 libs/Zend/Locale/Data/wo_SN.xml create mode 100644 libs/Zend/Locale/Data/xh.xml create mode 100644 libs/Zend/Locale/Data/xh_ZA.xml create mode 100644 libs/Zend/Locale/Data/yo.xml create mode 100644 libs/Zend/Locale/Data/yo_NG.xml create mode 100644 libs/Zend/Locale/Data/zh.xml create mode 100644 libs/Zend/Locale/Data/zh_CN.xml create mode 100644 libs/Zend/Locale/Data/zh_HK.xml create mode 100644 libs/Zend/Locale/Data/zh_Hans.xml create mode 100644 libs/Zend/Locale/Data/zh_Hans_CN.xml create mode 100644 libs/Zend/Locale/Data/zh_Hans_HK.xml create mode 100644 libs/Zend/Locale/Data/zh_Hans_MO.xml create mode 100644 libs/Zend/Locale/Data/zh_Hans_SG.xml create mode 100644 libs/Zend/Locale/Data/zh_Hant.xml create mode 100644 libs/Zend/Locale/Data/zh_Hant_HK.xml create mode 100644 libs/Zend/Locale/Data/zh_Hant_MO.xml create mode 100644 libs/Zend/Locale/Data/zh_Hant_TW.xml create mode 100644 libs/Zend/Locale/Data/zh_MO.xml create mode 100644 libs/Zend/Locale/Data/zh_SG.xml create mode 100644 libs/Zend/Locale/Data/zh_TW.xml create mode 100644 libs/Zend/Locale/Data/zu.xml create mode 100644 libs/Zend/Locale/Data/zu_ZA.xml create mode 100644 libs/Zend/Locale/Exception.php create mode 100644 libs/Zend/Locale/Format.php create mode 100644 libs/Zend/Locale/Math.php create mode 100644 libs/Zend/Locale/Math/Exception.php create mode 100644 libs/Zend/Locale/Math/PhpMath.php create mode 100644 libs/Zend/Log.php create mode 100644 libs/Zend/Log/Exception.php create mode 100644 libs/Zend/Log/Filter/Interface.php create mode 100644 libs/Zend/Log/Filter/Message.php create mode 100644 libs/Zend/Log/Filter/Priority.php create mode 100644 libs/Zend/Log/Filter/Suppress.php create mode 100644 libs/Zend/Log/Formatter/Interface.php create mode 100644 libs/Zend/Log/Formatter/Simple.php create mode 100644 libs/Zend/Log/Formatter/Xml.php create mode 100644 libs/Zend/Log/Writer/Abstract.php create mode 100644 libs/Zend/Log/Writer/Db.php create mode 100644 libs/Zend/Log/Writer/Firebug.php create mode 100644 libs/Zend/Log/Writer/Mock.php create mode 100644 libs/Zend/Log/Writer/Null.php create mode 100644 libs/Zend/Log/Writer/Stream.php create mode 100644 libs/Zend/Mail.php create mode 100644 libs/Zend/Mail/Exception.php create mode 100644 libs/Zend/Mail/Message.php create mode 100644 libs/Zend/Mail/Message/File.php create mode 100644 libs/Zend/Mail/Message/Interface.php create mode 100644 libs/Zend/Mail/Part.php create mode 100644 libs/Zend/Mail/Part/File.php create mode 100644 libs/Zend/Mail/Part/Interface.php create mode 100644 libs/Zend/Mail/Protocol/Abstract.php create mode 100644 libs/Zend/Mail/Protocol/Exception.php create mode 100644 libs/Zend/Mail/Protocol/Imap.php create mode 100644 libs/Zend/Mail/Protocol/Pop3.php create mode 100644 libs/Zend/Mail/Protocol/Smtp.php create mode 100644 libs/Zend/Mail/Protocol/Smtp/Auth/Crammd5.php create mode 100644 libs/Zend/Mail/Protocol/Smtp/Auth/Login.php create mode 100644 libs/Zend/Mail/Protocol/Smtp/Auth/Plain.php create mode 100644 libs/Zend/Mail/Storage.php create mode 100644 libs/Zend/Mail/Storage/Abstract.php create mode 100644 libs/Zend/Mail/Storage/Exception.php create mode 100644 libs/Zend/Mail/Storage/Folder.php create mode 100644 libs/Zend/Mail/Storage/Folder/Interface.php create mode 100644 libs/Zend/Mail/Storage/Folder/Maildir.php create mode 100644 libs/Zend/Mail/Storage/Folder/Mbox.php create mode 100644 libs/Zend/Mail/Storage/Imap.php create mode 100644 libs/Zend/Mail/Storage/Maildir.php create mode 100644 libs/Zend/Mail/Storage/Mbox.php create mode 100644 libs/Zend/Mail/Storage/Pop3.php create mode 100644 libs/Zend/Mail/Storage/Writable/Interface.php create mode 100644 libs/Zend/Mail/Storage/Writable/Maildir.php create mode 100644 libs/Zend/Mail/Transport/Abstract.php create mode 100644 libs/Zend/Mail/Transport/Exception.php create mode 100644 libs/Zend/Mail/Transport/Sendmail.php create mode 100644 libs/Zend/Mail/Transport/Smtp.php create mode 100644 libs/Zend/Measure/Abstract.php create mode 100644 libs/Zend/Measure/Acceleration.php create mode 100644 libs/Zend/Measure/Angle.php create mode 100644 libs/Zend/Measure/Area.php create mode 100644 libs/Zend/Measure/Binary.php create mode 100644 libs/Zend/Measure/Capacitance.php create mode 100644 libs/Zend/Measure/Cooking/Volume.php create mode 100644 libs/Zend/Measure/Cooking/Weight.php create mode 100644 libs/Zend/Measure/Current.php create mode 100644 libs/Zend/Measure/Density.php create mode 100644 libs/Zend/Measure/Energy.php create mode 100644 libs/Zend/Measure/Exception.php create mode 100644 libs/Zend/Measure/Flow/Mass.php create mode 100644 libs/Zend/Measure/Flow/Mole.php create mode 100644 libs/Zend/Measure/Flow/Volume.php create mode 100644 libs/Zend/Measure/Force.php create mode 100644 libs/Zend/Measure/Frequency.php create mode 100644 libs/Zend/Measure/Illumination.php create mode 100644 libs/Zend/Measure/Length.php create mode 100644 libs/Zend/Measure/Lightness.php create mode 100644 libs/Zend/Measure/Number.php create mode 100644 libs/Zend/Measure/Power.php create mode 100644 libs/Zend/Measure/Pressure.php create mode 100644 libs/Zend/Measure/Speed.php create mode 100644 libs/Zend/Measure/Temperature.php create mode 100644 libs/Zend/Measure/Time.php create mode 100644 libs/Zend/Measure/Torque.php create mode 100644 libs/Zend/Measure/Viscosity/Dynamic.php create mode 100644 libs/Zend/Measure/Viscosity/Kinematic.php create mode 100644 libs/Zend/Measure/Volume.php create mode 100644 libs/Zend/Measure/Weight.php create mode 100644 libs/Zend/Memory.php create mode 100644 libs/Zend/Memory/AccessController.php create mode 100644 libs/Zend/Memory/Container.php create mode 100644 libs/Zend/Memory/Container/Interface.php create mode 100644 libs/Zend/Memory/Container/Locked.php create mode 100644 libs/Zend/Memory/Container/Movable.php create mode 100644 libs/Zend/Memory/Exception.php create mode 100644 libs/Zend/Memory/Manager.php create mode 100644 libs/Zend/Memory/Value.php create mode 100644 libs/Zend/Mime.php create mode 100644 libs/Zend/Mime/Decode.php create mode 100644 libs/Zend/Mime/Exception.php create mode 100644 libs/Zend/Mime/Message.php create mode 100644 libs/Zend/Mime/Part.php create mode 100644 libs/Zend/OpenId.php create mode 100644 libs/Zend/OpenId/Consumer.php create mode 100644 libs/Zend/OpenId/Consumer/Storage.php create mode 100644 libs/Zend/OpenId/Consumer/Storage/File.php create mode 100644 libs/Zend/OpenId/Exception.php create mode 100644 libs/Zend/OpenId/Extension.php create mode 100644 libs/Zend/OpenId/Extension/Sreg.php create mode 100644 libs/Zend/OpenId/Provider.php create mode 100644 libs/Zend/OpenId/Provider/Storage.php create mode 100644 libs/Zend/OpenId/Provider/Storage/File.php create mode 100644 libs/Zend/OpenId/Provider/User.php create mode 100644 libs/Zend/OpenId/Provider/User/Session.php create mode 100644 libs/Zend/Paginator.php create mode 100644 libs/Zend/Paginator/Adapter/Array.php create mode 100644 libs/Zend/Paginator/Adapter/DbSelect.php create mode 100644 libs/Zend/Paginator/Adapter/DbTableSelect.php create mode 100644 libs/Zend/Paginator/Adapter/Interface.php create mode 100644 libs/Zend/Paginator/Adapter/Iterator.php create mode 100644 libs/Zend/Paginator/Adapter/Null.php create mode 100644 libs/Zend/Paginator/Exception.php create mode 100644 libs/Zend/Paginator/ScrollingStyle/All.php create mode 100644 libs/Zend/Paginator/ScrollingStyle/Elastic.php create mode 100644 libs/Zend/Paginator/ScrollingStyle/Interface.php create mode 100644 libs/Zend/Paginator/ScrollingStyle/Jumping.php create mode 100644 libs/Zend/Paginator/ScrollingStyle/Sliding.php create mode 100644 libs/Zend/Pdf.php create mode 100644 libs/Zend/Pdf/Cmap.php create mode 100644 libs/Zend/Pdf/Cmap/ByteEncoding.php create mode 100644 libs/Zend/Pdf/Cmap/ByteEncoding/Static.php create mode 100644 libs/Zend/Pdf/Cmap/SegmentToDelta.php create mode 100644 libs/Zend/Pdf/Cmap/TrimmedTable.php create mode 100644 libs/Zend/Pdf/Color.php create mode 100644 libs/Zend/Pdf/Color/Cmyk.php create mode 100644 libs/Zend/Pdf/Color/GrayScale.php create mode 100644 libs/Zend/Pdf/Color/Html.php create mode 100644 libs/Zend/Pdf/Color/Rgb.php create mode 100644 libs/Zend/Pdf/Element.php create mode 100644 libs/Zend/Pdf/Element/Array.php create mode 100644 libs/Zend/Pdf/Element/Boolean.php create mode 100644 libs/Zend/Pdf/Element/Dictionary.php create mode 100644 libs/Zend/Pdf/Element/Name.php create mode 100644 libs/Zend/Pdf/Element/Null.php create mode 100644 libs/Zend/Pdf/Element/Numeric.php create mode 100644 libs/Zend/Pdf/Element/Object.php create mode 100644 libs/Zend/Pdf/Element/Object/Stream.php create mode 100644 libs/Zend/Pdf/Element/Reference.php create mode 100644 libs/Zend/Pdf/Element/Reference/Context.php create mode 100644 libs/Zend/Pdf/Element/Reference/Table.php create mode 100644 libs/Zend/Pdf/Element/Stream.php create mode 100644 libs/Zend/Pdf/Element/String.php create mode 100644 libs/Zend/Pdf/Element/String/Binary.php create mode 100644 libs/Zend/Pdf/ElementFactory.php create mode 100644 libs/Zend/Pdf/ElementFactory/Interface.php create mode 100644 libs/Zend/Pdf/ElementFactory/Proxy.php create mode 100644 libs/Zend/Pdf/Exception.php create mode 100644 libs/Zend/Pdf/FileParser.php create mode 100644 libs/Zend/Pdf/FileParser/Font.php create mode 100644 libs/Zend/Pdf/FileParser/Font/OpenType.php create mode 100644 libs/Zend/Pdf/FileParser/Font/OpenType/TrueType.php create mode 100644 libs/Zend/Pdf/FileParser/Image.php create mode 100644 libs/Zend/Pdf/FileParser/Image/Png.php create mode 100644 libs/Zend/Pdf/FileParserDataSource.php create mode 100644 libs/Zend/Pdf/FileParserDataSource/File.php create mode 100644 libs/Zend/Pdf/FileParserDataSource/String.php create mode 100644 libs/Zend/Pdf/Filter/Ascii85.php create mode 100644 libs/Zend/Pdf/Filter/AsciiHex.php create mode 100644 libs/Zend/Pdf/Filter/Compression.php create mode 100644 libs/Zend/Pdf/Filter/Compression/Flate.php create mode 100644 libs/Zend/Pdf/Filter/Compression/Lzw.php create mode 100644 libs/Zend/Pdf/Filter/Interface.php create mode 100644 libs/Zend/Pdf/Font.php create mode 100644 libs/Zend/Pdf/Image.php create mode 100644 libs/Zend/Pdf/Page.php create mode 100644 libs/Zend/Pdf/Parser.php create mode 100644 libs/Zend/Pdf/Parser/Stream.php create mode 100644 libs/Zend/Pdf/PhpArray.php create mode 100644 libs/Zend/Pdf/Resource.php create mode 100644 libs/Zend/Pdf/Resource/Font.php create mode 100644 libs/Zend/Pdf/Resource/Font/CidFont.php create mode 100644 libs/Zend/Pdf/Resource/Font/CidFont/TrueType.php create mode 100644 libs/Zend/Pdf/Resource/Font/Extracted.php create mode 100644 libs/Zend/Pdf/Resource/Font/FontDescriptor.php create mode 100644 libs/Zend/Pdf/Resource/Font/Simple.php create mode 100644 libs/Zend/Pdf/Resource/Font/Simple/Parsed.php create mode 100644 libs/Zend/Pdf/Resource/Font/Simple/Parsed/TrueType.php create mode 100644 libs/Zend/Pdf/Resource/Font/Simple/Standard.php create mode 100644 libs/Zend/Pdf/Resource/Font/Simple/Standard/Courier.php create mode 100644 libs/Zend/Pdf/Resource/Font/Simple/Standard/CourierBold.php create mode 100644 libs/Zend/Pdf/Resource/Font/Simple/Standard/CourierBoldOblique.php create mode 100644 libs/Zend/Pdf/Resource/Font/Simple/Standard/CourierOblique.php create mode 100644 libs/Zend/Pdf/Resource/Font/Simple/Standard/Helvetica.php create mode 100644 libs/Zend/Pdf/Resource/Font/Simple/Standard/HelveticaBold.php create mode 100644 libs/Zend/Pdf/Resource/Font/Simple/Standard/HelveticaBoldOblique.php create mode 100644 libs/Zend/Pdf/Resource/Font/Simple/Standard/HelveticaOblique.php create mode 100644 libs/Zend/Pdf/Resource/Font/Simple/Standard/Symbol.php create mode 100644 libs/Zend/Pdf/Resource/Font/Simple/Standard/TimesBold.php create mode 100644 libs/Zend/Pdf/Resource/Font/Simple/Standard/TimesBoldItalic.php create mode 100644 libs/Zend/Pdf/Resource/Font/Simple/Standard/TimesItalic.php create mode 100644 libs/Zend/Pdf/Resource/Font/Simple/Standard/TimesRoman.php create mode 100644 libs/Zend/Pdf/Resource/Font/Simple/Standard/ZapfDingbats.php create mode 100644 libs/Zend/Pdf/Resource/Font/Type0.php create mode 100644 libs/Zend/Pdf/Resource/Image.php create mode 100644 libs/Zend/Pdf/Resource/Image/Jpeg.php create mode 100644 libs/Zend/Pdf/Resource/Image/Png.php create mode 100644 libs/Zend/Pdf/Resource/Image/Tiff.php create mode 100644 libs/Zend/Pdf/Resource/ImageFactory.php create mode 100644 libs/Zend/Pdf/StringParser.php create mode 100644 libs/Zend/Pdf/Style.php create mode 100644 libs/Zend/Pdf/Trailer.php create mode 100644 libs/Zend/Pdf/Trailer/Generator.php create mode 100644 libs/Zend/Pdf/Trailer/Keeper.php create mode 100644 libs/Zend/Pdf/UpdateInfoContainer.php create mode 100644 libs/Zend/ProgressBar.php create mode 100644 libs/Zend/ProgressBar/Adapter.php create mode 100644 libs/Zend/ProgressBar/Adapter/Console.php create mode 100644 libs/Zend/ProgressBar/Adapter/Exception.php create mode 100644 libs/Zend/ProgressBar/Adapter/JsPull.php create mode 100644 libs/Zend/ProgressBar/Adapter/JsPush.php create mode 100644 libs/Zend/ProgressBar/Exception.php create mode 100644 libs/Zend/Registry.php create mode 100644 libs/Zend/Request/Interface.php create mode 100644 libs/Zend/Rest/Client.php create mode 100644 libs/Zend/Rest/Client/Exception.php create mode 100644 libs/Zend/Rest/Client/Result.php create mode 100644 libs/Zend/Rest/Client/Result/Exception.php create mode 100644 libs/Zend/Rest/Exception.php create mode 100644 libs/Zend/Rest/Server.php create mode 100644 libs/Zend/Rest/Server/Exception.php create mode 100644 libs/Zend/Search/Exception.php create mode 100644 libs/Zend/Search/Lucene.php create mode 100644 libs/Zend/Search/Lucene/Analysis/Analyzer.php create mode 100644 libs/Zend/Search/Lucene/Analysis/Analyzer/Common.php create mode 100644 libs/Zend/Search/Lucene/Analysis/Analyzer/Common/Text.php create mode 100644 libs/Zend/Search/Lucene/Analysis/Analyzer/Common/Text/CaseInsensitive.php create mode 100644 libs/Zend/Search/Lucene/Analysis/Analyzer/Common/TextNum.php create mode 100644 libs/Zend/Search/Lucene/Analysis/Analyzer/Common/TextNum/CaseInsensitive.php create mode 100644 libs/Zend/Search/Lucene/Analysis/Analyzer/Common/Utf8.php create mode 100644 libs/Zend/Search/Lucene/Analysis/Analyzer/Common/Utf8/CaseInsensitive.php create mode 100644 libs/Zend/Search/Lucene/Analysis/Analyzer/Common/Utf8Num.php create mode 100644 libs/Zend/Search/Lucene/Analysis/Analyzer/Common/Utf8Num/CaseInsensitive.php create mode 100644 libs/Zend/Search/Lucene/Analysis/Token.php create mode 100644 libs/Zend/Search/Lucene/Analysis/TokenFilter.php create mode 100644 libs/Zend/Search/Lucene/Analysis/TokenFilter/LowerCase.php create mode 100644 libs/Zend/Search/Lucene/Analysis/TokenFilter/LowerCaseUtf8.php create mode 100644 libs/Zend/Search/Lucene/Analysis/TokenFilter/ShortWords.php create mode 100644 libs/Zend/Search/Lucene/Analysis/TokenFilter/StopWords.php create mode 100644 libs/Zend/Search/Lucene/Document.php create mode 100644 libs/Zend/Search/Lucene/Document/Docx.php create mode 100644 libs/Zend/Search/Lucene/Document/Html.php create mode 100644 libs/Zend/Search/Lucene/Document/OpenXml.php create mode 100644 libs/Zend/Search/Lucene/Document/Pptx.php create mode 100644 libs/Zend/Search/Lucene/Document/Xlsx.php create mode 100644 libs/Zend/Search/Lucene/Exception.php create mode 100644 libs/Zend/Search/Lucene/FSM.php create mode 100644 libs/Zend/Search/Lucene/FSMAction.php create mode 100644 libs/Zend/Search/Lucene/Field.php create mode 100644 libs/Zend/Search/Lucene/Index/DictionaryLoader.php create mode 100644 libs/Zend/Search/Lucene/Index/DocsFilter.php create mode 100644 libs/Zend/Search/Lucene/Index/FieldInfo.php create mode 100644 libs/Zend/Search/Lucene/Index/SegmentInfo.php create mode 100644 libs/Zend/Search/Lucene/Index/SegmentInfoPriorityQueue.php create mode 100644 libs/Zend/Search/Lucene/Index/SegmentMerger.php create mode 100644 libs/Zend/Search/Lucene/Index/SegmentWriter.php create mode 100644 libs/Zend/Search/Lucene/Index/SegmentWriter/DocumentWriter.php create mode 100644 libs/Zend/Search/Lucene/Index/SegmentWriter/StreamWriter.php create mode 100644 libs/Zend/Search/Lucene/Index/Term.php create mode 100644 libs/Zend/Search/Lucene/Index/TermInfo.php create mode 100644 libs/Zend/Search/Lucene/Index/Writer.php create mode 100644 libs/Zend/Search/Lucene/Interface.php create mode 100644 libs/Zend/Search/Lucene/LockManager.php create mode 100644 libs/Zend/Search/Lucene/PriorityQueue.php create mode 100644 libs/Zend/Search/Lucene/Proxy.php create mode 100644 libs/Zend/Search/Lucene/Search/BooleanExpressionRecognizer.php create mode 100644 libs/Zend/Search/Lucene/Search/Query.php create mode 100644 libs/Zend/Search/Lucene/Search/Query/Boolean.php create mode 100644 libs/Zend/Search/Lucene/Search/Query/Empty.php create mode 100644 libs/Zend/Search/Lucene/Search/Query/Fuzzy.php create mode 100644 libs/Zend/Search/Lucene/Search/Query/Insignificant.php create mode 100644 libs/Zend/Search/Lucene/Search/Query/MultiTerm.php create mode 100644 libs/Zend/Search/Lucene/Search/Query/Phrase.php create mode 100644 libs/Zend/Search/Lucene/Search/Query/Range.php create mode 100644 libs/Zend/Search/Lucene/Search/Query/Term.php create mode 100644 libs/Zend/Search/Lucene/Search/Query/Wildcard.php create mode 100644 libs/Zend/Search/Lucene/Search/QueryEntry.php create mode 100644 libs/Zend/Search/Lucene/Search/QueryEntry/Phrase.php create mode 100644 libs/Zend/Search/Lucene/Search/QueryEntry/Subquery.php create mode 100644 libs/Zend/Search/Lucene/Search/QueryEntry/Term.php create mode 100644 libs/Zend/Search/Lucene/Search/QueryHit.php create mode 100644 libs/Zend/Search/Lucene/Search/QueryLexer.php create mode 100644 libs/Zend/Search/Lucene/Search/QueryParser.php create mode 100644 libs/Zend/Search/Lucene/Search/QueryParserContext.php create mode 100644 libs/Zend/Search/Lucene/Search/QueryParserException.php create mode 100644 libs/Zend/Search/Lucene/Search/QueryToken.php create mode 100644 libs/Zend/Search/Lucene/Search/Similarity.php create mode 100644 libs/Zend/Search/Lucene/Search/Similarity/Default.php create mode 100644 libs/Zend/Search/Lucene/Search/Weight.php create mode 100644 libs/Zend/Search/Lucene/Search/Weight/Boolean.php create mode 100644 libs/Zend/Search/Lucene/Search/Weight/Empty.php create mode 100644 libs/Zend/Search/Lucene/Search/Weight/MultiTerm.php create mode 100644 libs/Zend/Search/Lucene/Search/Weight/Phrase.php create mode 100644 libs/Zend/Search/Lucene/Search/Weight/Term.php create mode 100644 libs/Zend/Search/Lucene/Storage/Directory.php create mode 100644 libs/Zend/Search/Lucene/Storage/Directory/Filesystem.php create mode 100644 libs/Zend/Search/Lucene/Storage/File.php create mode 100644 libs/Zend/Search/Lucene/Storage/File/Filesystem.php create mode 100644 libs/Zend/Search/Lucene/Storage/File/Memory.php create mode 100644 libs/Zend/Server/Abstract.php create mode 100644 libs/Zend/Server/Cache.php create mode 100644 libs/Zend/Server/Definition.php create mode 100644 libs/Zend/Server/Exception.php create mode 100644 libs/Zend/Server/Interface.php create mode 100644 libs/Zend/Server/Method/Callback.php create mode 100644 libs/Zend/Server/Method/Definition.php create mode 100644 libs/Zend/Server/Method/Parameter.php create mode 100644 libs/Zend/Server/Method/Prototype.php create mode 100644 libs/Zend/Server/Reflection.php create mode 100644 libs/Zend/Server/Reflection/Class.php create mode 100644 libs/Zend/Server/Reflection/Exception.php create mode 100644 libs/Zend/Server/Reflection/Function.php create mode 100644 libs/Zend/Server/Reflection/Function/Abstract.php create mode 100644 libs/Zend/Server/Reflection/Method.php create mode 100644 libs/Zend/Server/Reflection/Node.php create mode 100644 libs/Zend/Server/Reflection/Parameter.php create mode 100644 libs/Zend/Server/Reflection/Prototype.php create mode 100644 libs/Zend/Server/Reflection/ReturnValue.php create mode 100644 libs/Zend/Service/Abstract.php create mode 100644 libs/Zend/Service/Akismet.php create mode 100644 libs/Zend/Service/Amazon.php create mode 100644 libs/Zend/Service/Amazon/Accessories.php create mode 100644 libs/Zend/Service/Amazon/CustomerReview.php create mode 100644 libs/Zend/Service/Amazon/EditorialReview.php create mode 100644 libs/Zend/Service/Amazon/Image.php create mode 100644 libs/Zend/Service/Amazon/Item.php create mode 100644 libs/Zend/Service/Amazon/ListmaniaList.php create mode 100644 libs/Zend/Service/Amazon/Offer.php create mode 100644 libs/Zend/Service/Amazon/OfferSet.php create mode 100644 libs/Zend/Service/Amazon/Query.php create mode 100644 libs/Zend/Service/Amazon/ResultSet.php create mode 100644 libs/Zend/Service/Amazon/SimilarProduct.php create mode 100644 libs/Zend/Service/Audioscrobbler.php create mode 100644 libs/Zend/Service/Delicious.php create mode 100644 libs/Zend/Service/Delicious/Exception.php create mode 100644 libs/Zend/Service/Delicious/Post.php create mode 100644 libs/Zend/Service/Delicious/PostList.php create mode 100644 libs/Zend/Service/Delicious/SimplePost.php create mode 100644 libs/Zend/Service/Exception.php create mode 100644 libs/Zend/Service/Flickr.php create mode 100644 libs/Zend/Service/Flickr/Image.php create mode 100644 libs/Zend/Service/Flickr/Result.php create mode 100644 libs/Zend/Service/Flickr/ResultSet.php create mode 100644 libs/Zend/Service/Nirvanix.php create mode 100644 libs/Zend/Service/Nirvanix/Exception.php create mode 100644 libs/Zend/Service/Nirvanix/Namespace/Base.php create mode 100644 libs/Zend/Service/Nirvanix/Namespace/Imfs.php create mode 100644 libs/Zend/Service/Nirvanix/Response.php create mode 100644 libs/Zend/Service/ReCaptcha.php create mode 100644 libs/Zend/Service/ReCaptcha/Exception.php create mode 100644 libs/Zend/Service/ReCaptcha/MailHide.php create mode 100644 libs/Zend/Service/ReCaptcha/MailHide/Exception.php create mode 100644 libs/Zend/Service/ReCaptcha/Response.php create mode 100644 libs/Zend/Service/Simpy.php create mode 100644 libs/Zend/Service/Simpy/Link.php create mode 100644 libs/Zend/Service/Simpy/LinkQuery.php create mode 100644 libs/Zend/Service/Simpy/LinkSet.php create mode 100644 libs/Zend/Service/Simpy/Note.php create mode 100644 libs/Zend/Service/Simpy/NoteSet.php create mode 100644 libs/Zend/Service/Simpy/Tag.php create mode 100644 libs/Zend/Service/Simpy/TagSet.php create mode 100644 libs/Zend/Service/Simpy/Watchlist.php create mode 100644 libs/Zend/Service/Simpy/WatchlistFilter.php create mode 100644 libs/Zend/Service/Simpy/WatchlistFilterSet.php create mode 100644 libs/Zend/Service/Simpy/WatchlistSet.php create mode 100644 libs/Zend/Service/SlideShare.php create mode 100644 libs/Zend/Service/SlideShare/Exception.php create mode 100644 libs/Zend/Service/SlideShare/SlideShow.php create mode 100644 libs/Zend/Service/StrikeIron.php create mode 100644 libs/Zend/Service/StrikeIron/Base.php create mode 100644 libs/Zend/Service/StrikeIron/Decorator.php create mode 100644 libs/Zend/Service/StrikeIron/Exception.php create mode 100644 libs/Zend/Service/StrikeIron/SalesUseTaxBasic.php create mode 100644 libs/Zend/Service/StrikeIron/USAddressVerification.php create mode 100644 libs/Zend/Service/StrikeIron/ZipCodeInfo.php create mode 100644 libs/Zend/Service/Technorati.php create mode 100644 libs/Zend/Service/Technorati/Author.php create mode 100644 libs/Zend/Service/Technorati/BlogInfoResult.php create mode 100644 libs/Zend/Service/Technorati/CosmosResult.php create mode 100644 libs/Zend/Service/Technorati/CosmosResultSet.php create mode 100644 libs/Zend/Service/Technorati/DailyCountsResult.php create mode 100644 libs/Zend/Service/Technorati/DailyCountsResultSet.php create mode 100644 libs/Zend/Service/Technorati/Exception.php create mode 100644 libs/Zend/Service/Technorati/GetInfoResult.php create mode 100644 libs/Zend/Service/Technorati/KeyInfoResult.php create mode 100644 libs/Zend/Service/Technorati/Result.php create mode 100644 libs/Zend/Service/Technorati/ResultSet.php create mode 100644 libs/Zend/Service/Technorati/SearchResult.php create mode 100644 libs/Zend/Service/Technorati/SearchResultSet.php create mode 100644 libs/Zend/Service/Technorati/TagResult.php create mode 100644 libs/Zend/Service/Technorati/TagResultSet.php create mode 100644 libs/Zend/Service/Technorati/TagsResult.php create mode 100644 libs/Zend/Service/Technorati/TagsResultSet.php create mode 100644 libs/Zend/Service/Technorati/Utils.php create mode 100644 libs/Zend/Service/Technorati/Weblog.php create mode 100755 libs/Zend/Service/Twitter.php create mode 100755 libs/Zend/Service/Twitter/Exception.php create mode 100644 libs/Zend/Service/Twitter/Search.php create mode 100644 libs/Zend/Service/Yahoo.php create mode 100644 libs/Zend/Service/Yahoo/Image.php create mode 100644 libs/Zend/Service/Yahoo/ImageResult.php create mode 100644 libs/Zend/Service/Yahoo/ImageResultSet.php create mode 100644 libs/Zend/Service/Yahoo/InlinkDataResult.php create mode 100644 libs/Zend/Service/Yahoo/InlinkDataResultSet.php create mode 100644 libs/Zend/Service/Yahoo/LocalResult.php create mode 100644 libs/Zend/Service/Yahoo/LocalResultSet.php create mode 100644 libs/Zend/Service/Yahoo/NewsResult.php create mode 100644 libs/Zend/Service/Yahoo/NewsResultSet.php create mode 100644 libs/Zend/Service/Yahoo/PageDataResult.php create mode 100644 libs/Zend/Service/Yahoo/PageDataResultSet.php create mode 100644 libs/Zend/Service/Yahoo/Result.php create mode 100644 libs/Zend/Service/Yahoo/ResultSet.php create mode 100644 libs/Zend/Service/Yahoo/VideoResult.php create mode 100644 libs/Zend/Service/Yahoo/VideoResultSet.php create mode 100644 libs/Zend/Service/Yahoo/WebResult.php create mode 100644 libs/Zend/Service/Yahoo/WebResultSet.php create mode 100644 libs/Zend/Session.php create mode 100644 libs/Zend/Session/Abstract.php create mode 100644 libs/Zend/Session/Exception.php create mode 100644 libs/Zend/Session/Namespace.php create mode 100644 libs/Zend/Session/SaveHandler/DbTable.php create mode 100644 libs/Zend/Session/SaveHandler/Exception.php create mode 100644 libs/Zend/Session/SaveHandler/Interface.php create mode 100644 libs/Zend/Session/Validator/Abstract.php create mode 100644 libs/Zend/Session/Validator/HttpUserAgent.php create mode 100644 libs/Zend/Session/Validator/Interface.php create mode 100644 libs/Zend/Soap/AutoDiscover.php create mode 100644 libs/Zend/Soap/AutoDiscover/Exception.php create mode 100644 libs/Zend/Soap/Client.php create mode 100644 libs/Zend/Soap/Client/Common.php create mode 100644 libs/Zend/Soap/Client/DotNet.php create mode 100644 libs/Zend/Soap/Client/Exception.php create mode 100644 libs/Zend/Soap/Client/Local.php create mode 100644 libs/Zend/Soap/Server.php create mode 100644 libs/Zend/Soap/Server/Exception.php create mode 100644 libs/Zend/Soap/Wsdl.php create mode 100644 libs/Zend/Soap/Wsdl/CodeGenerator.php create mode 100644 libs/Zend/Soap/Wsdl/Exception.php create mode 100644 libs/Zend/Soap/Wsdl/Parser.php create mode 100644 libs/Zend/Soap/Wsdl/Parser/Result.php create mode 100644 libs/Zend/Soap/Wsdl/Strategy/Abstract.php create mode 100644 libs/Zend/Soap/Wsdl/Strategy/AnyType.php create mode 100644 libs/Zend/Soap/Wsdl/Strategy/ArrayOfTypeComplex.php create mode 100644 libs/Zend/Soap/Wsdl/Strategy/ArrayOfTypeSequence.php create mode 100644 libs/Zend/Soap/Wsdl/Strategy/DefaultComplexType.php create mode 100644 libs/Zend/Soap/Wsdl/Strategy/Interface.php create mode 100644 libs/Zend/Test/PHPUnit/Constraint/DomQuery.php create mode 100644 libs/Zend/Test/PHPUnit/Constraint/Exception.php create mode 100644 libs/Zend/Test/PHPUnit/Constraint/Redirect.php create mode 100644 libs/Zend/Test/PHPUnit/Constraint/ResponseHeader.php create mode 100644 libs/Zend/Test/PHPUnit/ControllerTestCase.php create mode 100644 libs/Zend/Text/Exception.php create mode 100644 libs/Zend/Text/Figlet.php create mode 100644 libs/Zend/Text/Figlet/Exception.php create mode 100644 libs/Zend/Text/Figlet/zend-framework.flf create mode 100644 libs/Zend/Text/Table.php create mode 100644 libs/Zend/Text/Table/Column.php create mode 100644 libs/Zend/Text/Table/Decorator/Ascii.php create mode 100644 libs/Zend/Text/Table/Decorator/Interface.php create mode 100644 libs/Zend/Text/Table/Decorator/Unicode.php create mode 100644 libs/Zend/Text/Table/Exception.php create mode 100644 libs/Zend/Text/Table/Row.php create mode 100644 libs/Zend/TimeSync.php create mode 100644 libs/Zend/TimeSync/Exception.php create mode 100644 libs/Zend/TimeSync/Ntp.php create mode 100644 libs/Zend/TimeSync/Protocol.php create mode 100644 libs/Zend/TimeSync/Sntp.php create mode 100644 libs/Zend/Translate.php create mode 100644 libs/Zend/Translate/Adapter.php create mode 100644 libs/Zend/Translate/Adapter/Array.php create mode 100644 libs/Zend/Translate/Adapter/Csv.php create mode 100644 libs/Zend/Translate/Adapter/Gettext.php create mode 100644 libs/Zend/Translate/Adapter/Ini.php create mode 100644 libs/Zend/Translate/Adapter/Qt.php create mode 100644 libs/Zend/Translate/Adapter/Tbx.php create mode 100644 libs/Zend/Translate/Adapter/Tmx.php create mode 100644 libs/Zend/Translate/Adapter/Xliff.php create mode 100644 libs/Zend/Translate/Adapter/XmlTm.php create mode 100644 libs/Zend/Translate/Exception.php create mode 100644 libs/Zend/Uri.php create mode 100644 libs/Zend/Uri/Exception.php create mode 100644 libs/Zend/Uri/Http.php create mode 100644 libs/Zend/Validate.php create mode 100644 libs/Zend/Validate/Abstract.php create mode 100644 libs/Zend/Validate/Alnum.php create mode 100644 libs/Zend/Validate/Alpha.php create mode 100644 libs/Zend/Validate/Barcode.php create mode 100644 libs/Zend/Validate/Barcode/Ean13.php create mode 100644 libs/Zend/Validate/Barcode/UpcA.php create mode 100644 libs/Zend/Validate/Between.php create mode 100644 libs/Zend/Validate/Ccnum.php create mode 100644 libs/Zend/Validate/Date.php create mode 100644 libs/Zend/Validate/Digits.php create mode 100644 libs/Zend/Validate/EmailAddress.php create mode 100644 libs/Zend/Validate/Exception.php create mode 100644 libs/Zend/Validate/File/Count.php create mode 100644 libs/Zend/Validate/File/Crc32.php create mode 100644 libs/Zend/Validate/File/ExcludeExtension.php create mode 100644 libs/Zend/Validate/File/ExcludeMimeType.php create mode 100644 libs/Zend/Validate/File/Exists.php create mode 100644 libs/Zend/Validate/File/Extension.php create mode 100644 libs/Zend/Validate/File/FilesSize.php create mode 100644 libs/Zend/Validate/File/Hash.php create mode 100644 libs/Zend/Validate/File/ImageSize.php create mode 100644 libs/Zend/Validate/File/IsCompressed.php create mode 100644 libs/Zend/Validate/File/IsImage.php create mode 100644 libs/Zend/Validate/File/Md5.php create mode 100644 libs/Zend/Validate/File/MimeType.php create mode 100644 libs/Zend/Validate/File/NotExists.php create mode 100644 libs/Zend/Validate/File/Sha1.php create mode 100644 libs/Zend/Validate/File/Size.php create mode 100644 libs/Zend/Validate/File/Upload.php create mode 100644 libs/Zend/Validate/Float.php create mode 100644 libs/Zend/Validate/GreaterThan.php create mode 100644 libs/Zend/Validate/Hex.php create mode 100644 libs/Zend/Validate/Hostname.php create mode 100644 libs/Zend/Validate/Hostname/At.php create mode 100644 libs/Zend/Validate/Hostname/Ch.php create mode 100644 libs/Zend/Validate/Hostname/De.php create mode 100644 libs/Zend/Validate/Hostname/Fi.php create mode 100644 libs/Zend/Validate/Hostname/Hu.php create mode 100644 libs/Zend/Validate/Hostname/Interface.php create mode 100644 libs/Zend/Validate/Hostname/Li.php create mode 100644 libs/Zend/Validate/Hostname/No.php create mode 100644 libs/Zend/Validate/Hostname/Se.php create mode 100644 libs/Zend/Validate/Identical.php create mode 100644 libs/Zend/Validate/InArray.php create mode 100644 libs/Zend/Validate/Int.php create mode 100644 libs/Zend/Validate/Interface.php create mode 100644 libs/Zend/Validate/Ip.php create mode 100644 libs/Zend/Validate/LessThan.php create mode 100644 libs/Zend/Validate/NotEmpty.php create mode 100644 libs/Zend/Validate/Regex.php create mode 100644 libs/Zend/Validate/StringLength.php create mode 100644 libs/Zend/Version.php create mode 100644 libs/Zend/View.php create mode 100644 libs/Zend/View/Abstract.php create mode 100644 libs/Zend/View/Exception.php create mode 100644 libs/Zend/View/Helper/Abstract.php create mode 100644 libs/Zend/View/Helper/Action.php create mode 100644 libs/Zend/View/Helper/DeclareVars.php create mode 100644 libs/Zend/View/Helper/Doctype.php create mode 100644 libs/Zend/View/Helper/Fieldset.php create mode 100644 libs/Zend/View/Helper/Form.php create mode 100644 libs/Zend/View/Helper/FormButton.php create mode 100644 libs/Zend/View/Helper/FormCheckbox.php create mode 100644 libs/Zend/View/Helper/FormElement.php create mode 100644 libs/Zend/View/Helper/FormErrors.php create mode 100644 libs/Zend/View/Helper/FormFile.php create mode 100644 libs/Zend/View/Helper/FormHidden.php create mode 100644 libs/Zend/View/Helper/FormImage.php create mode 100644 libs/Zend/View/Helper/FormLabel.php create mode 100644 libs/Zend/View/Helper/FormMultiCheckbox.php create mode 100644 libs/Zend/View/Helper/FormNote.php create mode 100644 libs/Zend/View/Helper/FormPassword.php create mode 100644 libs/Zend/View/Helper/FormRadio.php create mode 100644 libs/Zend/View/Helper/FormReset.php create mode 100644 libs/Zend/View/Helper/FormSelect.php create mode 100644 libs/Zend/View/Helper/FormSubmit.php create mode 100644 libs/Zend/View/Helper/FormText.php create mode 100644 libs/Zend/View/Helper/FormTextarea.php create mode 100644 libs/Zend/View/Helper/HeadLink.php create mode 100644 libs/Zend/View/Helper/HeadMeta.php create mode 100644 libs/Zend/View/Helper/HeadScript.php create mode 100644 libs/Zend/View/Helper/HeadStyle.php create mode 100644 libs/Zend/View/Helper/HeadTitle.php create mode 100644 libs/Zend/View/Helper/HtmlElement.php create mode 100644 libs/Zend/View/Helper/HtmlFlash.php create mode 100644 libs/Zend/View/Helper/HtmlList.php create mode 100644 libs/Zend/View/Helper/HtmlObject.php create mode 100644 libs/Zend/View/Helper/HtmlPage.php create mode 100644 libs/Zend/View/Helper/HtmlQuicktime.php create mode 100644 libs/Zend/View/Helper/InlineScript.php create mode 100644 libs/Zend/View/Helper/Interface.php create mode 100644 libs/Zend/View/Helper/Json.php create mode 100644 libs/Zend/View/Helper/Layout.php create mode 100644 libs/Zend/View/Helper/PaginationControl.php create mode 100644 libs/Zend/View/Helper/Partial.php create mode 100644 libs/Zend/View/Helper/Partial/Exception.php create mode 100644 libs/Zend/View/Helper/PartialLoop.php create mode 100644 libs/Zend/View/Helper/Placeholder.php create mode 100644 libs/Zend/View/Helper/Placeholder/Container.php create mode 100644 libs/Zend/View/Helper/Placeholder/Container/Abstract.php create mode 100644 libs/Zend/View/Helper/Placeholder/Container/Exception.php create mode 100644 libs/Zend/View/Helper/Placeholder/Container/Standalone.php create mode 100644 libs/Zend/View/Helper/Placeholder/Registry.php create mode 100644 libs/Zend/View/Helper/Placeholder/Registry/Exception.php create mode 100644 libs/Zend/View/Helper/RenderToPlaceholder.php create mode 100644 libs/Zend/View/Helper/Translate.php create mode 100644 libs/Zend/View/Helper/Url.php create mode 100644 libs/Zend/View/Interface.php create mode 100644 libs/Zend/View/Stream.php create mode 100644 libs/Zend/Wildfire/Channel/HttpHeaders.php create mode 100644 libs/Zend/Wildfire/Channel/Interface.php create mode 100644 libs/Zend/Wildfire/Exception.php create mode 100644 libs/Zend/Wildfire/Plugin/FirePhp.php create mode 100644 libs/Zend/Wildfire/Plugin/FirePhp/Message.php create mode 100644 libs/Zend/Wildfire/Plugin/FirePhp/TableMessage.php create mode 100644 libs/Zend/Wildfire/Plugin/Interface.php create mode 100644 libs/Zend/Wildfire/Protocol/JsonStream.php create mode 100644 libs/Zend/XmlRpc/Client.php create mode 100644 libs/Zend/XmlRpc/Client/Exception.php create mode 100644 libs/Zend/XmlRpc/Client/FaultException.php create mode 100644 libs/Zend/XmlRpc/Client/HttpException.php create mode 100644 libs/Zend/XmlRpc/Client/IntrospectException.php create mode 100644 libs/Zend/XmlRpc/Client/ServerIntrospection.php create mode 100644 libs/Zend/XmlRpc/Client/ServerProxy.php create mode 100644 libs/Zend/XmlRpc/Exception.php create mode 100644 libs/Zend/XmlRpc/Fault.php create mode 100644 libs/Zend/XmlRpc/Request.php create mode 100644 libs/Zend/XmlRpc/Request/Http.php create mode 100644 libs/Zend/XmlRpc/Request/Stdin.php create mode 100644 libs/Zend/XmlRpc/Response.php create mode 100644 libs/Zend/XmlRpc/Response/Http.php create mode 100644 libs/Zend/XmlRpc/Server.php create mode 100644 libs/Zend/XmlRpc/Server/Cache.php create mode 100644 libs/Zend/XmlRpc/Server/Exception.php create mode 100644 libs/Zend/XmlRpc/Server/Fault.php create mode 100644 libs/Zend/XmlRpc/Server/System.php create mode 100644 libs/Zend/XmlRpc/Value.php create mode 100644 libs/Zend/XmlRpc/Value/Array.php create mode 100644 libs/Zend/XmlRpc/Value/Base64.php create mode 100644 libs/Zend/XmlRpc/Value/Boolean.php create mode 100644 libs/Zend/XmlRpc/Value/Collection.php create mode 100644 libs/Zend/XmlRpc/Value/DateTime.php create mode 100644 libs/Zend/XmlRpc/Value/Double.php create mode 100644 libs/Zend/XmlRpc/Value/Exception.php create mode 100644 libs/Zend/XmlRpc/Value/Integer.php create mode 100644 libs/Zend/XmlRpc/Value/Nil.php create mode 100644 libs/Zend/XmlRpc/Value/Scalar.php create mode 100644 libs/Zend/XmlRpc/Value/String.php create mode 100644 libs/Zend/XmlRpc/Value/Struct.php create mode 100644 libs/jpgraph/CHANGELOG-2.3.3.txt create mode 100644 libs/jpgraph/QPL.txt create mode 100644 libs/jpgraph/README create mode 100644 libs/jpgraph/VERSION create mode 100644 libs/jpgraph/gd_image.inc.php create mode 100644 libs/jpgraph/imgdata_balls.inc.php create mode 100644 libs/jpgraph/imgdata_bevels.inc.php create mode 100644 libs/jpgraph/imgdata_diamonds.inc.php create mode 100644 libs/jpgraph/imgdata_pushpins.inc.php create mode 100644 libs/jpgraph/imgdata_squares.inc.php create mode 100644 libs/jpgraph/imgdata_stars.inc.php create mode 100644 libs/jpgraph/jpg-config.inc.php create mode 100644 libs/jpgraph/jpgraph.php create mode 100644 libs/jpgraph/jpgraph_antispam-digits.php create mode 100644 libs/jpgraph/jpgraph_antispam.php create mode 100644 libs/jpgraph/jpgraph_bar.php create mode 100644 libs/jpgraph/jpgraph_canvas.php create mode 100644 libs/jpgraph/jpgraph_canvtools.php create mode 100644 libs/jpgraph/jpgraph_date.php create mode 100644 libs/jpgraph/jpgraph_errhandler.inc.php create mode 100644 libs/jpgraph/jpgraph_error.php create mode 100644 libs/jpgraph/jpgraph_flags.php create mode 100644 libs/jpgraph/jpgraph_gantt.php create mode 100644 libs/jpgraph/jpgraph_gb2312.php create mode 100644 libs/jpgraph/jpgraph_gradient.php create mode 100644 libs/jpgraph/jpgraph_iconplot.php create mode 100644 libs/jpgraph/jpgraph_imgtrans.php create mode 100644 libs/jpgraph/jpgraph_led.php create mode 100644 libs/jpgraph/jpgraph_line.php create mode 100644 libs/jpgraph/jpgraph_log.php create mode 100644 libs/jpgraph/jpgraph_mgraph.php create mode 100644 libs/jpgraph/jpgraph_pie.php create mode 100644 libs/jpgraph/jpgraph_pie3d.php create mode 100644 libs/jpgraph/jpgraph_plotband.php create mode 100644 libs/jpgraph/jpgraph_plotmark.inc.php create mode 100644 libs/jpgraph/jpgraph_polar.php create mode 100644 libs/jpgraph/jpgraph_radar.php create mode 100644 libs/jpgraph/jpgraph_regstat.php create mode 100644 libs/jpgraph/jpgraph_scatter.php create mode 100644 libs/jpgraph/jpgraph_stock.php create mode 100644 libs/jpgraph/jpgraph_ttf.inc.php create mode 100644 libs/jpgraph/jpgraph_utils.inc.php create mode 100644 libs/jpgraph/lang/de.inc.php create mode 100644 libs/jpgraph/lang/en.inc.php create mode 100644 libs/jpgraph/lang/prod.inc.php create mode 100644 modules/default/controllers/AboutController.php create mode 100755 modules/default/controllers/ErrorController.php create mode 100644 modules/default/controllers/FeedbackController.php create mode 100755 modules/default/controllers/HistoryController.php create mode 100644 modules/default/controllers/IdentityController.php create mode 100644 modules/default/controllers/IndexController.php create mode 100644 modules/default/controllers/LearnmoreController.php create mode 100644 modules/default/controllers/MaintenancemodeController.php create mode 100644 modules/default/controllers/MessageusersController.php create mode 100644 modules/default/controllers/OpenidController.php create mode 100644 modules/default/controllers/PrivacyController.php create mode 100644 modules/default/controllers/SitesController.php create mode 100644 modules/default/forms/ErrorMessages.php create mode 100644 modules/default/forms/FeedbackForm.php create mode 100644 modules/default/forms/MessageUsersForm.php create mode 100644 modules/default/forms/OpenidLoginForm.php create mode 100644 modules/default/models/Association.php create mode 100644 modules/default/models/Associations.php create mode 100644 modules/default/models/Field.php create mode 100644 modules/default/models/Fields.php create mode 100644 modules/default/models/FieldsValue.php create mode 100644 modules/default/models/FieldsValues.php create mode 100755 modules/default/models/Histories.php create mode 100755 modules/default/models/History.php create mode 100644 modules/default/models/Settings.php create mode 100644 modules/default/models/Site.php create mode 100644 modules/default/models/Sites.php create mode 100644 modules/default/views/scripts/about/index-de.phtml create mode 100644 modules/default/views/scripts/about/index-en.phtml create mode 100644 modules/default/views/scripts/about/index-es.phtml create mode 100644 modules/default/views/scripts/about/index.phtml create mode 100755 modules/default/views/scripts/error/error.phtml create mode 100644 modules/default/views/scripts/feedback/index.phtml create mode 100755 modules/default/views/scripts/history/index.phtml create mode 100644 modules/default/views/scripts/identity/id.phtml create mode 100644 modules/default/views/scripts/index/index-de.phtml create mode 100644 modules/default/views/scripts/index/index-en.phtml create mode 100644 modules/default/views/scripts/index/index-es.phtml create mode 100755 modules/default/views/scripts/index/subheader-de.phtml create mode 100755 modules/default/views/scripts/index/subheader-en.phtml create mode 100755 modules/default/views/scripts/index/subheader-es.phtml create mode 100644 modules/default/views/scripts/messageusers/index.phtml create mode 100644 modules/default/views/scripts/openid/login.phtml create mode 100644 modules/default/views/scripts/openid/trust.phtml create mode 100644 modules/default/views/scripts/privacy/index.phtml create mode 100644 modules/default/views/scripts/sites/index.phtml create mode 100644 modules/install/controllers/CompleteController.php create mode 100644 modules/install/controllers/CredentialsController.php create mode 100644 modules/install/controllers/IndexController.php create mode 100644 modules/install/controllers/PermissionsController.php create mode 100644 modules/install/forms/InstallForm.php create mode 100644 modules/install/views/scripts/complete/index.phtml create mode 100644 modules/install/views/scripts/credentials/index.phtml create mode 100644 modules/install/views/scripts/index/index.phtml create mode 100644 modules/install/views/scripts/permissions/index.phtml create mode 100644 modules/stats/controllers/AuthorizationsController.php create mode 100644 modules/stats/controllers/IndexController.php create mode 100644 modules/stats/controllers/RegistrationsController.php create mode 100644 modules/stats/controllers/SitesController.php create mode 100644 modules/stats/controllers/TopController.php create mode 100644 modules/stats/models/Stats.php create mode 100644 modules/stats/views/scripts/authorizations/index.phtml create mode 100644 modules/stats/views/scripts/index/index.phtml create mode 100644 modules/stats/views/scripts/registrations/index.phtml create mode 100644 modules/stats/views/scripts/sites/index.phtml create mode 100644 modules/stats/views/scripts/top/index.phtml create mode 100755 modules/users/controllers/LoginController.php create mode 100644 modules/users/controllers/ManageusersController.php create mode 100644 modules/users/controllers/PersonalinfoController.php create mode 100755 modules/users/controllers/ProfileController.php create mode 100644 modules/users/controllers/ProfilegeneralController.php create mode 100755 modules/users/controllers/RecoverpasswordController.php create mode 100755 modules/users/controllers/RegisterController.php create mode 100755 modules/users/controllers/UserslistController.php create mode 100644 modules/users/forms/AccountInfoForm.php create mode 100644 modules/users/forms/ChangePasswordForm.php create mode 100755 modules/users/forms/LoginForm.php create mode 100644 modules/users/forms/PersonalInfoForm.php create mode 100644 modules/users/forms/RecoverPasswordForm.php create mode 100755 modules/users/forms/RegisterForm.php create mode 100644 modules/users/models/OpenIdUser.php create mode 100755 modules/users/models/User.php create mode 100755 modules/users/models/Users.php create mode 100755 modules/users/views/scripts/login/index.phtml create mode 100644 modules/users/views/scripts/manageusers/index.phtml create mode 100644 modules/users/views/scripts/personalinfo/edit.phtml create mode 100644 modules/users/views/scripts/personalinfo/index.phtml create mode 100644 modules/users/views/scripts/personalinfo/show.phtml create mode 100755 modules/users/views/scripts/profile/index.phtml create mode 100644 modules/users/views/scripts/profilegeneral/accountinfo.phtml create mode 100644 modules/users/views/scripts/profilegeneral/changepassword.phtml create mode 100755 modules/users/views/scripts/profilegeneral/confirmdelete.phtml create mode 100644 modules/users/views/scripts/profilegeneral/editaccountinfo.phtml create mode 100755 modules/users/views/scripts/recoverpassword/index.phtml create mode 100755 modules/users/views/scripts/register/eula.phtml create mode 100755 modules/users/views/scripts/register/index.phtml create mode 100755 resources/de/eula.txt create mode 100644 resources/de/passwordreset2_mail.txt create mode 100755 resources/de/passwordreset_mail.txt create mode 100644 resources/de/privacy.txt create mode 100755 resources/de/registration_mail.txt create mode 100755 resources/en/eula.txt create mode 100644 resources/en/passwordreset2_mail.txt create mode 100755 resources/en/passwordreset_mail.txt create mode 100644 resources/en/privacy.txt create mode 100755 resources/en/registration_mail.txt create mode 100755 resources/es/eula.txt create mode 100644 resources/es/passwordreset2_mail.txt create mode 100755 resources/es/passwordreset_mail.txt create mode 100644 resources/es/privacy.txt create mode 100755 resources/es/registration_mail.txt create mode 100755 resources/nl/eula.txt create mode 100644 resources/nl/privacy.txt create mode 100755 resources/pl/eula.txt create mode 100644 resources/pl/privacy.txt create mode 100644 scripts/clear_logs.php create mode 100644 setup/final.sql create mode 100644 tests/AllTests.php create mode 100644 tests/CaptchaImageTestSessionContainer.php create mode 100644 tests/TestHarness.php create mode 100644 tests/TestRequest.php create mode 100755 tests/Zend_Mail_Transport_Mock.php create mode 100644 tests/modules/default/controllers/FeedbackControllerTests.php create mode 100755 tests/modules/default/controllers/HistoryControllerTests.php create mode 100755 tests/modules/default/controllers/IdentityControllerTests.php create mode 100644 tests/modules/default/controllers/MessageusersControllerTests.php create mode 100755 tests/modules/default/controllers/OpenidControllerTests.php create mode 100644 tests/modules/users/controllers/ProfilegeneralControllerTests.php create mode 100644 tests/modules/users/controllers/RegisterControllerTests.php create mode 100644 tests/modules/users/models/UsersTests.php create mode 100644 utilities/deleteTestUsers.php create mode 100644 utilities/generateRandomHistory.php create mode 100644 utilities/generateRandomTrustedSites.php create mode 100755 utilities/generateRandomUsers.php create mode 100644 utilities/lighttpd_mod_rewrite.txt create mode 100644 views/layouts/layout.phtml create mode 100755 webdir/.htaccess create mode 100755 webdir/favicon.ico create mode 100644 webdir/images/bg_content.jpg create mode 100644 webdir/images/bg_foot.jpg create mode 100644 webdir/images/bg_panel.gif create mode 100644 webdir/images/bg_panel.png create mode 100644 webdir/images/bg_panel_title.gif create mode 100644 webdir/images/bg_title_article.gif create mode 100644 webdir/images/bg_title_article_span.gif create mode 100644 webdir/images/button_register_a.png create mode 100644 webdir/images/button_register_span.png create mode 100755 webdir/images/content_background.png create mode 100755 webdir/images/footer_background.png create mode 100755 webdir/images/h2.png create mode 100755 webdir/images/header_background.png create mode 100755 webdir/images/logo.gif create mode 100644 webdir/images/openid_small_logo.png create mode 100644 webdir/images/progress.gif create mode 100755 webdir/images/sidebar_border_left.png create mode 100755 webdir/images/topnav_background.png create mode 100755 webdir/images/topnav_background_hover.png create mode 100755 webdir/index.php create mode 100644 webdir/javascript/communityid.js create mode 100644 webdir/javascript/language.php create mode 100644 webdir/javascript/tools-min.js create mode 100644 webdir/javascript/yui/animation/README create mode 100644 webdir/javascript/yui/animation/animation-debug.js create mode 100644 webdir/javascript/yui/animation/animation-min.js create mode 100644 webdir/javascript/yui/animation/animation.js create mode 100644 webdir/javascript/yui/assets/skins/sam/asc.gif create mode 100644 webdir/javascript/yui/assets/skins/sam/autocomplete.css create mode 100644 webdir/javascript/yui/assets/skins/sam/blankimage.png create mode 100644 webdir/javascript/yui/assets/skins/sam/button.css create mode 100644 webdir/javascript/yui/assets/skins/sam/calendar.css create mode 100644 webdir/javascript/yui/assets/skins/sam/carousel.css create mode 100644 webdir/javascript/yui/assets/skins/sam/colorpicker.css create mode 100644 webdir/javascript/yui/assets/skins/sam/container.css create mode 100644 webdir/javascript/yui/assets/skins/sam/datatable.css create mode 100644 webdir/javascript/yui/assets/skins/sam/desc.gif create mode 100644 webdir/javascript/yui/assets/skins/sam/dt-arrow-dn.png create mode 100644 webdir/javascript/yui/assets/skins/sam/dt-arrow-up.png create mode 100644 webdir/javascript/yui/assets/skins/sam/editor-knob.gif create mode 100644 webdir/javascript/yui/assets/skins/sam/editor-sprite-active.gif create mode 100644 webdir/javascript/yui/assets/skins/sam/editor-sprite.gif create mode 100644 webdir/javascript/yui/assets/skins/sam/editor.css create mode 100644 webdir/javascript/yui/assets/skins/sam/header_background.png create mode 100644 webdir/javascript/yui/assets/skins/sam/hue_bg.png create mode 100644 webdir/javascript/yui/assets/skins/sam/imagecropper.css create mode 100644 webdir/javascript/yui/assets/skins/sam/layout.css create mode 100644 webdir/javascript/yui/assets/skins/sam/layout_sprite.png create mode 100644 webdir/javascript/yui/assets/skins/sam/loading.gif create mode 100644 webdir/javascript/yui/assets/skins/sam/logger.css create mode 100644 webdir/javascript/yui/assets/skins/sam/menu-button-arrow-disabled.png create mode 100644 webdir/javascript/yui/assets/skins/sam/menu-button-arrow.png create mode 100644 webdir/javascript/yui/assets/skins/sam/menu.css create mode 100644 webdir/javascript/yui/assets/skins/sam/menubaritem_submenuindicator.png create mode 100644 webdir/javascript/yui/assets/skins/sam/menubaritem_submenuindicator_disabled.png create mode 100644 webdir/javascript/yui/assets/skins/sam/menuitem_checkbox.png create mode 100644 webdir/javascript/yui/assets/skins/sam/menuitem_checkbox_disabled.png create mode 100644 webdir/javascript/yui/assets/skins/sam/menuitem_submenuindicator.png create mode 100644 webdir/javascript/yui/assets/skins/sam/menuitem_submenuindicator_disabled.png create mode 100644 webdir/javascript/yui/assets/skins/sam/paginator.css create mode 100644 webdir/javascript/yui/assets/skins/sam/picker_mask.png create mode 100644 webdir/javascript/yui/assets/skins/sam/profilerviewer.css create mode 100644 webdir/javascript/yui/assets/skins/sam/resize.css create mode 100644 webdir/javascript/yui/assets/skins/sam/simpleeditor.css create mode 100644 webdir/javascript/yui/assets/skins/sam/skin.css create mode 100644 webdir/javascript/yui/assets/skins/sam/slider.css create mode 100644 webdir/javascript/yui/assets/skins/sam/split-button-arrow-active.png create mode 100644 webdir/javascript/yui/assets/skins/sam/split-button-arrow-disabled.png create mode 100644 webdir/javascript/yui/assets/skins/sam/split-button-arrow-focus.png create mode 100644 webdir/javascript/yui/assets/skins/sam/split-button-arrow-hover.png create mode 100644 webdir/javascript/yui/assets/skins/sam/split-button-arrow.png create mode 100644 webdir/javascript/yui/assets/skins/sam/sprite.png create mode 100644 webdir/javascript/yui/assets/skins/sam/sprite.psd create mode 100644 webdir/javascript/yui/assets/skins/sam/tabview.css create mode 100644 webdir/javascript/yui/assets/skins/sam/treeview-loading.gif create mode 100644 webdir/javascript/yui/assets/skins/sam/treeview-sprite.gif create mode 100644 webdir/javascript/yui/assets/skins/sam/treeview.css create mode 100644 webdir/javascript/yui/assets/skins/sam/wait.gif create mode 100644 webdir/javascript/yui/assets/skins/sam/yuitest.css create mode 100644 webdir/javascript/yui/autocomplete/README create mode 100644 webdir/javascript/yui/autocomplete/assets/autocomplete-core.css create mode 100644 webdir/javascript/yui/autocomplete/assets/skins/sam/autocomplete-skin.css create mode 100644 webdir/javascript/yui/autocomplete/assets/skins/sam/autocomplete.css create mode 100644 webdir/javascript/yui/autocomplete/autocomplete-debug.js create mode 100644 webdir/javascript/yui/autocomplete/autocomplete-min.js create mode 100644 webdir/javascript/yui/autocomplete/autocomplete.js create mode 100644 webdir/javascript/yui/base/README create mode 100644 webdir/javascript/yui/base/base-min.css create mode 100644 webdir/javascript/yui/base/base.css create mode 100644 webdir/javascript/yui/button/README create mode 100644 webdir/javascript/yui/button/assets/button-core.css create mode 100644 webdir/javascript/yui/button/assets/skins/sam/button-skin.css create mode 100644 webdir/javascript/yui/button/assets/skins/sam/button.css create mode 100644 webdir/javascript/yui/button/assets/skins/sam/menu-button-arrow-disabled.png create mode 100644 webdir/javascript/yui/button/assets/skins/sam/menu-button-arrow.png create mode 100644 webdir/javascript/yui/button/assets/skins/sam/split-button-arrow-active.png create mode 100644 webdir/javascript/yui/button/assets/skins/sam/split-button-arrow-disabled.png create mode 100644 webdir/javascript/yui/button/assets/skins/sam/split-button-arrow-focus.png create mode 100644 webdir/javascript/yui/button/assets/skins/sam/split-button-arrow-hover.png create mode 100644 webdir/javascript/yui/button/assets/skins/sam/split-button-arrow.png create mode 100644 webdir/javascript/yui/button/button-debug.js create mode 100644 webdir/javascript/yui/button/button-min.js create mode 100644 webdir/javascript/yui/button/button.js create mode 100644 webdir/javascript/yui/calendar/README create mode 100644 webdir/javascript/yui/calendar/assets/calendar-core.css create mode 100644 webdir/javascript/yui/calendar/assets/calendar.css create mode 100644 webdir/javascript/yui/calendar/assets/calgrad.png create mode 100644 webdir/javascript/yui/calendar/assets/callt.gif create mode 100644 webdir/javascript/yui/calendar/assets/calrt.gif create mode 100644 webdir/javascript/yui/calendar/assets/calx.gif create mode 100644 webdir/javascript/yui/calendar/assets/skins/sam/calendar-skin.css create mode 100644 webdir/javascript/yui/calendar/assets/skins/sam/calendar.css create mode 100644 webdir/javascript/yui/calendar/calendar-debug.js create mode 100644 webdir/javascript/yui/calendar/calendar-min.js create mode 100644 webdir/javascript/yui/calendar/calendar.js create mode 100644 webdir/javascript/yui/carousel/README create mode 100644 webdir/javascript/yui/carousel/assets/ajax-loader.gif create mode 100644 webdir/javascript/yui/carousel/assets/carousel-core.css create mode 100644 webdir/javascript/yui/carousel/assets/skins/sam/carousel-skin.css create mode 100644 webdir/javascript/yui/carousel/assets/skins/sam/carousel.css create mode 100644 webdir/javascript/yui/carousel/carousel-beta-debug.js create mode 100644 webdir/javascript/yui/carousel/carousel-beta-min.js create mode 100644 webdir/javascript/yui/carousel/carousel-beta.js create mode 100644 webdir/javascript/yui/charts/README create mode 100644 webdir/javascript/yui/charts/assets/charts.swf create mode 100644 webdir/javascript/yui/charts/charts-experimental-debug.js create mode 100644 webdir/javascript/yui/charts/charts-experimental-min.js create mode 100644 webdir/javascript/yui/charts/charts-experimental.js create mode 100644 webdir/javascript/yui/colorpicker/README create mode 100644 webdir/javascript/yui/colorpicker/assets/colorpicker-core.css create mode 100644 webdir/javascript/yui/colorpicker/assets/hue_thumb.png create mode 100644 webdir/javascript/yui/colorpicker/assets/picker_mask.png create mode 100644 webdir/javascript/yui/colorpicker/assets/picker_thumb.png create mode 100644 webdir/javascript/yui/colorpicker/assets/skins/sam/colorpicker-skin.css create mode 100644 webdir/javascript/yui/colorpicker/assets/skins/sam/colorpicker.css create mode 100644 webdir/javascript/yui/colorpicker/assets/skins/sam/hue_bg.png create mode 100644 webdir/javascript/yui/colorpicker/assets/skins/sam/picker_mask.png create mode 100644 webdir/javascript/yui/colorpicker/colorpicker-debug.js create mode 100644 webdir/javascript/yui/colorpicker/colorpicker-min.js create mode 100644 webdir/javascript/yui/colorpicker/colorpicker.js create mode 100644 webdir/javascript/yui/connection/README create mode 100644 webdir/javascript/yui/connection/connection-debug.js create mode 100644 webdir/javascript/yui/connection/connection-min.js create mode 100644 webdir/javascript/yui/connection/connection.js create mode 100644 webdir/javascript/yui/container/README create mode 100644 webdir/javascript/yui/container/assets/alrt16_1.gif create mode 100644 webdir/javascript/yui/container/assets/blck16_1.gif create mode 100644 webdir/javascript/yui/container/assets/close12_1.gif create mode 100644 webdir/javascript/yui/container/assets/container-core.css create mode 100644 webdir/javascript/yui/container/assets/container.css create mode 100644 webdir/javascript/yui/container/assets/hlp16_1.gif create mode 100644 webdir/javascript/yui/container/assets/info16_1.gif create mode 100644 webdir/javascript/yui/container/assets/skins/sam/container-skin.css create mode 100644 webdir/javascript/yui/container/assets/skins/sam/container.css create mode 100644 webdir/javascript/yui/container/assets/tip16_1.gif create mode 100644 webdir/javascript/yui/container/assets/warn16_1.gif create mode 100644 webdir/javascript/yui/container/container-debug.js create mode 100644 webdir/javascript/yui/container/container-min.js create mode 100644 webdir/javascript/yui/container/container.js create mode 100644 webdir/javascript/yui/container/container_core-debug.js create mode 100644 webdir/javascript/yui/container/container_core-min.js create mode 100644 webdir/javascript/yui/container/container_core.js create mode 100644 webdir/javascript/yui/cookie/README create mode 100644 webdir/javascript/yui/cookie/cookie-debug.js create mode 100644 webdir/javascript/yui/cookie/cookie-min.js create mode 100644 webdir/javascript/yui/cookie/cookie.js create mode 100644 webdir/javascript/yui/datasource/README create mode 100644 webdir/javascript/yui/datasource/datasource-debug.js create mode 100644 webdir/javascript/yui/datasource/datasource-min.js create mode 100644 webdir/javascript/yui/datasource/datasource.js create mode 100644 webdir/javascript/yui/datatable/README create mode 100644 webdir/javascript/yui/datatable/assets/datatable-core.css create mode 100644 webdir/javascript/yui/datatable/assets/datatable.css create mode 100644 webdir/javascript/yui/datatable/assets/skins/sam/datatable-skin.css create mode 100644 webdir/javascript/yui/datatable/assets/skins/sam/datatable.css create mode 100644 webdir/javascript/yui/datatable/assets/skins/sam/dt-arrow-dn.png create mode 100644 webdir/javascript/yui/datatable/assets/skins/sam/dt-arrow-up.png create mode 100644 webdir/javascript/yui/datatable/datatable-debug.js create mode 100644 webdir/javascript/yui/datatable/datatable-min.js create mode 100644 webdir/javascript/yui/datatable/datatable.js create mode 100644 webdir/javascript/yui/dom/README create mode 100644 webdir/javascript/yui/dom/dom-debug.js create mode 100644 webdir/javascript/yui/dom/dom-min.js create mode 100644 webdir/javascript/yui/dom/dom.js create mode 100644 webdir/javascript/yui/dragdrop/README create mode 100644 webdir/javascript/yui/dragdrop/dragdrop-debug.js create mode 100644 webdir/javascript/yui/dragdrop/dragdrop-min.js create mode 100644 webdir/javascript/yui/dragdrop/dragdrop.js create mode 100644 webdir/javascript/yui/editor/README create mode 100644 webdir/javascript/yui/editor/assets/editor-core.css create mode 100644 webdir/javascript/yui/editor/assets/simpleeditor-core.css create mode 100644 webdir/javascript/yui/editor/assets/skins/sam/blankimage.png create mode 100644 webdir/javascript/yui/editor/assets/skins/sam/editor-knob.gif create mode 100644 webdir/javascript/yui/editor/assets/skins/sam/editor-skin.css create mode 100644 webdir/javascript/yui/editor/assets/skins/sam/editor-sprite-active.gif create mode 100644 webdir/javascript/yui/editor/assets/skins/sam/editor-sprite.gif create mode 100644 webdir/javascript/yui/editor/assets/skins/sam/editor.css create mode 100644 webdir/javascript/yui/editor/assets/skins/sam/simpleeditor-skin.css create mode 100644 webdir/javascript/yui/editor/assets/skins/sam/simpleeditor.css create mode 100644 webdir/javascript/yui/editor/editor-debug.js create mode 100644 webdir/javascript/yui/editor/editor-min.js create mode 100644 webdir/javascript/yui/editor/editor.js create mode 100644 webdir/javascript/yui/editor/simpleeditor-debug.js create mode 100644 webdir/javascript/yui/editor/simpleeditor-min.js create mode 100644 webdir/javascript/yui/editor/simpleeditor.js create mode 100644 webdir/javascript/yui/element/README create mode 100644 webdir/javascript/yui/element/element-beta-debug.js create mode 100644 webdir/javascript/yui/element/element-beta-min.js create mode 100644 webdir/javascript/yui/element/element-beta.js create mode 100644 webdir/javascript/yui/event/README create mode 100644 webdir/javascript/yui/event/event-debug.js create mode 100644 webdir/javascript/yui/event/event-min.js create mode 100644 webdir/javascript/yui/event/event.js create mode 100644 webdir/javascript/yui/fonts/README create mode 100644 webdir/javascript/yui/fonts/fonts-min.css create mode 100644 webdir/javascript/yui/fonts/fonts.css create mode 100644 webdir/javascript/yui/get/README create mode 100644 webdir/javascript/yui/get/get-debug.js create mode 100644 webdir/javascript/yui/get/get-min.js create mode 100644 webdir/javascript/yui/get/get.js create mode 100644 webdir/javascript/yui/grids/README create mode 100644 webdir/javascript/yui/grids/grids-min.css create mode 100644 webdir/javascript/yui/grids/grids.css create mode 100644 webdir/javascript/yui/history/README create mode 100644 webdir/javascript/yui/history/assets/blank.html create mode 100644 webdir/javascript/yui/history/history-debug.js create mode 100644 webdir/javascript/yui/history/history-min.js create mode 100644 webdir/javascript/yui/history/history.js create mode 100644 webdir/javascript/yui/imagecropper/README create mode 100644 webdir/javascript/yui/imagecropper/assets/imagecropper-core.css create mode 100644 webdir/javascript/yui/imagecropper/assets/skins/sam/imagecropper-skin.css create mode 100644 webdir/javascript/yui/imagecropper/assets/skins/sam/imagecropper.css create mode 100644 webdir/javascript/yui/imagecropper/imagecropper-beta-debug.js create mode 100644 webdir/javascript/yui/imagecropper/imagecropper-beta-min.js create mode 100644 webdir/javascript/yui/imagecropper/imagecropper-beta.js create mode 100644 webdir/javascript/yui/imageloader/README create mode 100644 webdir/javascript/yui/imageloader/imageloader-debug.js create mode 100644 webdir/javascript/yui/imageloader/imageloader-min.js create mode 100644 webdir/javascript/yui/imageloader/imageloader.js create mode 100644 webdir/javascript/yui/json/README create mode 100644 webdir/javascript/yui/json/json-debug.js create mode 100644 webdir/javascript/yui/json/json-min.js create mode 100644 webdir/javascript/yui/json/json.js create mode 100644 webdir/javascript/yui/layout/README create mode 100644 webdir/javascript/yui/layout/assets/layout-core.css create mode 100644 webdir/javascript/yui/layout/assets/skins/sam/layout-skin.css create mode 100644 webdir/javascript/yui/layout/assets/skins/sam/layout.css create mode 100644 webdir/javascript/yui/layout/assets/skins/sam/layout_sprite.png create mode 100644 webdir/javascript/yui/layout/layout-debug.js create mode 100644 webdir/javascript/yui/layout/layout-min.js create mode 100644 webdir/javascript/yui/layout/layout.js create mode 100644 webdir/javascript/yui/logger/README create mode 100644 webdir/javascript/yui/logger/assets/logger-core.css create mode 100644 webdir/javascript/yui/logger/assets/logger.css create mode 100644 webdir/javascript/yui/logger/assets/skins/sam/logger-skin.css create mode 100644 webdir/javascript/yui/logger/assets/skins/sam/logger.css create mode 100644 webdir/javascript/yui/logger/logger-debug.js create mode 100644 webdir/javascript/yui/logger/logger-min.js create mode 100644 webdir/javascript/yui/logger/logger.js create mode 100644 webdir/javascript/yui/menu/README create mode 100644 webdir/javascript/yui/menu/assets/menu-core.css create mode 100644 webdir/javascript/yui/menu/assets/menu.css create mode 100644 webdir/javascript/yui/menu/assets/menu_down_arrow.png create mode 100644 webdir/javascript/yui/menu/assets/menu_down_arrow_disabled.png create mode 100644 webdir/javascript/yui/menu/assets/menu_up_arrow.png create mode 100644 webdir/javascript/yui/menu/assets/menu_up_arrow_disabled.png create mode 100644 webdir/javascript/yui/menu/assets/menubaritem_submenuindicator.png create mode 100644 webdir/javascript/yui/menu/assets/menubaritem_submenuindicator_disabled.png create mode 100644 webdir/javascript/yui/menu/assets/menubaritem_submenuindicator_selected.png create mode 100644 webdir/javascript/yui/menu/assets/menuitem_checkbox.png create mode 100644 webdir/javascript/yui/menu/assets/menuitem_checkbox_disabled.png create mode 100644 webdir/javascript/yui/menu/assets/menuitem_checkbox_selected.png create mode 100644 webdir/javascript/yui/menu/assets/menuitem_submenuindicator.png create mode 100644 webdir/javascript/yui/menu/assets/menuitem_submenuindicator_disabled.png create mode 100644 webdir/javascript/yui/menu/assets/menuitem_submenuindicator_selected.png create mode 100644 webdir/javascript/yui/menu/assets/skins/sam/menu-skin.css create mode 100644 webdir/javascript/yui/menu/assets/skins/sam/menu.css create mode 100644 webdir/javascript/yui/menu/assets/skins/sam/menubaritem_submenuindicator.png create mode 100644 webdir/javascript/yui/menu/assets/skins/sam/menubaritem_submenuindicator_disabled.png create mode 100644 webdir/javascript/yui/menu/assets/skins/sam/menuitem_checkbox.png create mode 100644 webdir/javascript/yui/menu/assets/skins/sam/menuitem_checkbox_disabled.png create mode 100644 webdir/javascript/yui/menu/assets/skins/sam/menuitem_submenuindicator.png create mode 100644 webdir/javascript/yui/menu/assets/skins/sam/menuitem_submenuindicator_disabled.png create mode 100644 webdir/javascript/yui/menu/menu-debug.js create mode 100644 webdir/javascript/yui/menu/menu-min.js create mode 100644 webdir/javascript/yui/menu/menu.js create mode 100644 webdir/javascript/yui/paginator/README create mode 100644 webdir/javascript/yui/paginator/assets/paginator-core.css create mode 100644 webdir/javascript/yui/paginator/assets/skins/sam/paginator-skin.css create mode 100644 webdir/javascript/yui/paginator/assets/skins/sam/paginator.css create mode 100644 webdir/javascript/yui/paginator/paginator-debug.js create mode 100644 webdir/javascript/yui/paginator/paginator-min.js create mode 100644 webdir/javascript/yui/paginator/paginator.js create mode 100644 webdir/javascript/yui/profiler/README create mode 100644 webdir/javascript/yui/profiler/profiler-debug.js create mode 100644 webdir/javascript/yui/profiler/profiler-min.js create mode 100644 webdir/javascript/yui/profiler/profiler.js create mode 100644 webdir/javascript/yui/profilerviewer/README create mode 100644 webdir/javascript/yui/profilerviewer/assets/skins/sam/asc.gif create mode 100644 webdir/javascript/yui/profilerviewer/assets/skins/sam/desc.gif create mode 100644 webdir/javascript/yui/profilerviewer/assets/skins/sam/header_background.png create mode 100644 webdir/javascript/yui/profilerviewer/assets/skins/sam/profilerviewer.css create mode 100644 webdir/javascript/yui/profilerviewer/assets/skins/sam/wait.gif create mode 100644 webdir/javascript/yui/profilerviewer/profilerviewer-beta-debug.js create mode 100644 webdir/javascript/yui/profilerviewer/profilerviewer-beta-min.js create mode 100644 webdir/javascript/yui/profilerviewer/profilerviewer-beta.js create mode 100644 webdir/javascript/yui/reset-fonts-grids/README create mode 100644 webdir/javascript/yui/reset-fonts-grids/reset-fonts-grids.css create mode 100644 webdir/javascript/yui/reset-fonts/README create mode 100644 webdir/javascript/yui/reset-fonts/reset-fonts.css create mode 100644 webdir/javascript/yui/reset/README create mode 100644 webdir/javascript/yui/reset/reset-min.css create mode 100644 webdir/javascript/yui/reset/reset.css create mode 100644 webdir/javascript/yui/resize/README create mode 100644 webdir/javascript/yui/resize/assets/resize-core.css create mode 100644 webdir/javascript/yui/resize/assets/skins/sam/layout_sprite.png create mode 100644 webdir/javascript/yui/resize/assets/skins/sam/resize-skin.css create mode 100644 webdir/javascript/yui/resize/assets/skins/sam/resize.css create mode 100644 webdir/javascript/yui/resize/resize-debug.js create mode 100644 webdir/javascript/yui/resize/resize-min.js create mode 100644 webdir/javascript/yui/resize/resize.js create mode 100644 webdir/javascript/yui/selector/README create mode 100644 webdir/javascript/yui/selector/selector-beta-debug.js create mode 100644 webdir/javascript/yui/selector/selector-beta-min.js create mode 100644 webdir/javascript/yui/selector/selector-beta.js create mode 100644 webdir/javascript/yui/slider/README create mode 100644 webdir/javascript/yui/slider/assets/bg-fader.gif create mode 100644 webdir/javascript/yui/slider/assets/bg-h.gif create mode 100644 webdir/javascript/yui/slider/assets/bg-v-e.gif create mode 100644 webdir/javascript/yui/slider/assets/bg-v.gif create mode 100644 webdir/javascript/yui/slider/assets/left-thumb.png create mode 100644 webdir/javascript/yui/slider/assets/right-thumb.png create mode 100644 webdir/javascript/yui/slider/assets/skins/sam/slider-skin.css create mode 100644 webdir/javascript/yui/slider/assets/skins/sam/slider.css create mode 100644 webdir/javascript/yui/slider/assets/slider-core.css create mode 100644 webdir/javascript/yui/slider/assets/thumb-bar.gif create mode 100644 webdir/javascript/yui/slider/assets/thumb-e.gif create mode 100644 webdir/javascript/yui/slider/assets/thumb-fader.gif create mode 100644 webdir/javascript/yui/slider/assets/thumb-n.gif create mode 100644 webdir/javascript/yui/slider/assets/thumb-s.gif create mode 100644 webdir/javascript/yui/slider/assets/thumb-w.gif create mode 100644 webdir/javascript/yui/slider/slider-debug.js create mode 100644 webdir/javascript/yui/slider/slider-min.js create mode 100644 webdir/javascript/yui/slider/slider.js create mode 100644 webdir/javascript/yui/tabview/README create mode 100644 webdir/javascript/yui/tabview/assets/border_tabs.css create mode 100644 webdir/javascript/yui/tabview/assets/loading.gif create mode 100644 webdir/javascript/yui/tabview/assets/skin-sam.css create mode 100644 webdir/javascript/yui/tabview/assets/skins/sam/tabview-skin.css create mode 100644 webdir/javascript/yui/tabview/assets/skins/sam/tabview.css create mode 100644 webdir/javascript/yui/tabview/assets/tabview-core.css create mode 100644 webdir/javascript/yui/tabview/assets/tabview.css create mode 100644 webdir/javascript/yui/tabview/tabview-debug.js create mode 100644 webdir/javascript/yui/tabview/tabview-min.js create mode 100644 webdir/javascript/yui/tabview/tabview.js create mode 100644 webdir/javascript/yui/treeview/README create mode 100644 webdir/javascript/yui/treeview/assets/skins/sam/loading.gif create mode 100644 webdir/javascript/yui/treeview/assets/skins/sam/treeview-loading.gif create mode 100644 webdir/javascript/yui/treeview/assets/skins/sam/treeview-skin.css create mode 100644 webdir/javascript/yui/treeview/assets/skins/sam/treeview-sprite.gif create mode 100644 webdir/javascript/yui/treeview/assets/skins/sam/treeview.css create mode 100644 webdir/javascript/yui/treeview/assets/sprite-menu.gif create mode 100644 webdir/javascript/yui/treeview/assets/sprite-orig.gif create mode 100644 webdir/javascript/yui/treeview/assets/treeview-core.css create mode 100644 webdir/javascript/yui/treeview/assets/treeview-loading.gif create mode 100644 webdir/javascript/yui/treeview/assets/treeview-menu.css create mode 100644 webdir/javascript/yui/treeview/assets/treeview.css create mode 100644 webdir/javascript/yui/treeview/treeview-debug.js create mode 100644 webdir/javascript/yui/treeview/treeview-min.js create mode 100644 webdir/javascript/yui/treeview/treeview.js create mode 100644 webdir/javascript/yui/uploader/README create mode 100644 webdir/javascript/yui/uploader/assets/uploader.swf create mode 100644 webdir/javascript/yui/uploader/uploader-experimental-debug.js create mode 100644 webdir/javascript/yui/uploader/uploader-experimental-min.js create mode 100644 webdir/javascript/yui/uploader/uploader-experimental.js create mode 100644 webdir/javascript/yui/utilities/README create mode 100644 webdir/javascript/yui/utilities/utilities.js create mode 100644 webdir/javascript/yui/yahoo-dom-event/README create mode 100644 webdir/javascript/yui/yahoo-dom-event/yahoo-dom-event.js create mode 100644 webdir/javascript/yui/yahoo/README create mode 100644 webdir/javascript/yui/yahoo/yahoo-debug.js create mode 100644 webdir/javascript/yui/yahoo/yahoo-min.js create mode 100644 webdir/javascript/yui/yahoo/yahoo.js create mode 100644 webdir/javascript/yui/yuiloader-dom-event/README create mode 100644 webdir/javascript/yui/yuiloader-dom-event/yuiloader-dom-event.js create mode 100644 webdir/javascript/yui/yuiloader/README create mode 100644 webdir/javascript/yui/yuiloader/yuiloader-debug.js create mode 100644 webdir/javascript/yui/yuiloader/yuiloader-min.js create mode 100644 webdir/javascript/yui/yuiloader/yuiloader.js create mode 100644 webdir/javascript/yui/yuitest/README create mode 100644 webdir/javascript/yui/yuitest/assets/skins/sam/yuitest-skin.css create mode 100644 webdir/javascript/yui/yuitest/assets/skins/sam/yuitest.css create mode 100644 webdir/javascript/yui/yuitest/assets/testlogger.css create mode 100644 webdir/javascript/yui/yuitest/assets/yuitest-core.css create mode 100644 webdir/javascript/yui/yuitest/yuitest-debug.js create mode 100644 webdir/javascript/yui/yuitest/yuitest-min.js create mode 100644 webdir/javascript/yui/yuitest/yuitest.js create mode 100644 webdir/javascript/yui/yuitest/yuitest_core-debug.js create mode 100644 webdir/javascript/yui/yuitest/yuitest_core-min.js create mode 100644 webdir/javascript/yui/yuitest/yuitest_core.js create mode 100644 webdir/styles/style.css 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 0000000000000000000000000000000000000000..8d5c8cf30511ef5d8f544a46f716dcfaae3462c3 GIT binary patch literal 15318 zcmb7~dz2(qea9~#0*gEa#rFkV*v0K(mj%V)IlJ4tJM7NvI5W$_1~k>()!ntzUENew z&oHAAMFS`%ii(Mf@sSn9L`5a|$g0sH=6G^WVvfcYm+@>;3+jPr27{Jpw%!y7H;UoN$aWH$6?Q#@u?kF(-n{;52wU z_zdu0z-NL#_h`;A=4Cve1FHWa@B}agHPkD8`(5B!Jl_MJ0^ScE2R;NI4}Qku7r?DN zKLTC~{x^6PSUS^~4d4Pe0lppF0)7*`96a&q#;^o40gBJv;5zUXpvFH0s$Un>ybplt z|4~r=9|BJU{}DVH{0=BSe+Fv3zXHzzPhkt) z)I8^al1B;D_b>6!SA(dG*$qk_H-eHw20L9HVNHSViG@pY%idpy3|zyBa8ejfy-FQ4|$p9f#e^CO_f{|)F& z?gey6n z4{DtyP<)SrlK);%<5WQL8G~AH&$qAm=Q}`+b2qpVyw|sX5!Aeoc>Fr}BA$N)UJ9Pd zVzgh|L5)8RN{;(|`^!PCGXi7q1K`KOGcY;}ehGBrf$Mob_4)a@mx45z2-N#K!A0;> z;ML$o7^mzr;txZbH-O^*eo*`OAc)GFzXwqP^IcH#`4y=39cz&lxCxXT4|;5Z;(rm8 z+-?K+gLi|nryqiP|CDoce|8EeIa~v>B_;#Q;G045{SA-D@bMKqmq6)jBR$}*82%i^M3^t-#-L#f##QB?O0=uK?&7fN5~Uk z0;>N*AR;yY3|jEN!0W-&F39(_4oW_^fYPViK+ShAD7k(F6kn^L`2JT=^7%G+JoqC} zdi`@y_P_bUJpMGnah^X1&Vs-4xO;;!lRUp0d@A@;Q2Y1`Q2Zaq=4ss1z#ZV(pzQe| zcoO(>5SL?`p!j+XD8BCjWfva;`DZ@MABHqP244t1?V^0Ywt&*-o52&oCU`M;3#j$I zACw;54VfyZpg_kRa?GtUd)OTn*#TJLde zqVRN3{5}uF#hI<(Y2X~F{j7rGKlbgng4&dnf?I01C(EH zT$by{>p{uugP`Q~4R9lPCQ1V<=1MRIJK!Yveb9m%a5}Q9Nl^1PLABokYW%nQ_a6sO z=lP#N$@kwu@&7D>m)hq+?RN-D-naSoH-XaU_kiN(Tt3$OJ)r#k4d8b0?V$GcTVMnH zEyxy{8k1lO<{cnIm`6bA^Z$b4_hbgqzMKW>`30c%XM=yf1U!!CE5LKWYyA5gK*_t} z+apkNxE<7b-VchOPlCsQy7uN^{?wz!dlmF9=nc?K(1TDJ+6QIOJ0V>uGzPsDdLJ}= zb$Iwo=nhDGlR&z(Uk^bKLl;3I^k!&3Gz}Hk)46#yB)zUe6Hp7%rL{~!_d&NqJD_`^ z;yS|3UqBHg{nGWe9Ngdc58a>2{THAIpfCFN^&amB4?!=7-VPmvbiFAD_gDLhJ9c@> z68MLZY)hB+V#VE&D}%D-_xR^wcrOnhfL5UoLDKn8K^D3J(j|R=J@j`_9n$q~2$OL! zL4M=Y&}q;-^l=DtaMv?Dz5oBUIzaJ>JGh= zzq}CYLGOSbfojmzP;uSD%~{ZGzF{YL7xX&l8t8-2bD=vSU4I50fcEHt>qh7gpf5wu zhW-Y^q+IR-xa(N{KGWZC1kZ*xL7#x$2we&NIi#x%{jIyp^AUgR;Bx++1br6z2=o?c z0eT6v1^Nv1SCFm^Iha>^{1|vQ^d zW;0ZRPJqTCUAv)m&>VCadLc9e>H2HvInWmJMpPBurBq#Wrh(wi2XK)z&*nJIHLS zQw>_BZjfZxHalq+2kp?5N_H-6g;kBSz0-@cWZ9NVBh7n*xX}w5;oA23s2#3!V%I)l z(%6*lH)PN8%;wh(CCu3+q_!^b-GZwruy$?j17| zl}<0S`%^Pft%|P#Sy{bfCTca_g^6w=jTW>RyxnH{bezUE>+f{+f&p4BQD@0abd!kt zB-Dg9?fILfC~exTV*_=vLA5FY@|-ncP3yYm@xQ4dJQmKUPTsqtH0vP3y`9Dr|EL#x zxgaHG*J{(>|FyPPD)D=HbHYu+mXmtgjJkFy%2@CdT3x(sv!s`1PgEXh7}xTl+elGb zgCHmN?#;EARrMN-24u}n60PJs*>0HFTCm)24r^vxr?xz9wr{ufC~VbiTRc<{wA<#O zl!oYWkRh=aBDbBow}Ns>W{~nB9|v(YYysV@+H_{pLq$`&lyu^T+1^C2Lpu|s=~5@D z@f=ncY|sdz*lcfwL1O)8@)Yrgb)=mHJ4vgo5e;9{UJC~=(8OLGWy__>9k%Nyu-Ijo zneD^xlCS~ytV8xNY#elRmVzL-%L42ZQ@}tGg^WH4vm^=^LmP)nSWp(W-CLQj*%4%c z4U?pkjJbP!0CHnna@jZo@;0dVq5C5VZi|wvX?BFwuw6l~cI2vE*q?vgKcuX(z?6P* z1fKwNM`=)Lg?0)lW?`%iuv48{X!5yDd3JW+?3kTLclmaaZD%FDBo0Zy%2=`~$B*+p z!=WQ#8YS#`Ayc}m`EefoX6AjI6%<^!uUw0Bf4m9t8`in2+@qMCVI}DW$aW`_ z_q+i$gGKo{^dbq{PGq*$SqbA5SzcL5?8R5hJT(C>5b+mWruj?xL&rirSi}@?B1>UK z-Ui#>8HTk=P+j1r9kfETQ#QaTIIN(Tb>u*C<*j9mqt)_WBau$#W*W+%Qs)%qEvA+hOHWc)ml#(GB$(W^!pBYqW*3DG)RN)* z%VZTjyrS#23yY!G?hp^V37@aKt`o{!uiM3{%#hUrBV$yB=JPw2wab6qbEO%Z;%LF!X@gJyo~Bq z#x~^=F;&dAHtyVX5dvw)XW?k7_*p(f5vPJ!K0P=5sUWE~X<9Z@-q+{tj2Aq3zzt9ev# z;hl6P=yqF#rQ&5LVHLzir%lQpWP&IevTSQ;w%93M6?^7Y|3jves`6PD-m18!?8Fb6 zzjKD_9d@px&d*fC2sI7}da;X0`Ep$6!o3vZAn8KS3(m^>_fE(Q^eu&ulSOeaG&AIb zq)^-Cs%MgDF{myVXlFXaKRtG|jNCIsvHIsJg_$kynw*<2&)VsI2hKIKnsmd)l3l;k*cp|HtVgL4v&R?8 z{_#NrDJ_#Gx{v%O^LfycIWNn2S;yM9c}6IOMf@(#YroQEp4)lf;b^l&&LAEc2nWHj zXC$NOcDguf7Bp-Dc@pmAA8;bbeK7}vAWlh5`-eH7DR5}&sfMQB%sGAZF^6?$R zBf`->d7VqZ@Tw zjU<(|j_kzwQw(h6mD4T!T^<>63+@Cs2vbSVX=tvz+&XL3miSS|G=W@pF@|G>b5%c+ zwTn^UhgDxEb$3c1?D?=;@Jp)YeUEnVetdQC0v|VlN*KmfBurmZP5v6-s1=hrm`>ev za8CIFvd+mD57s3m=TArO(4-{tRaf1ZX`ut9d3`l#oQO1zGdr+HgDOynU1B|a52(sN9}jXmb{;m z;nKXHxRZ?A*)WQ+67uMVy)tnR*Dh2_?Xha7ef7E`vqk_xyWjb-{iY_T%7fKz8QZ*0 zXL4LwX@0p2)5_s4?n=B@kS_)a$Na1I&+jZS0nUb9#1}puM~jW$SJz&2-2N zvr@szxZM?UDu@Sf_JqqSPo#VC?o8zu7Y;gXBZ=t-S##Wuja|&Y!5hj2DhM!Ud3I`I z`o_VVIkdPMQUMXKB>h<(X8X*{5eci!8OAJa9=9A3daW=$>gz4z*aj7dqrSXkTqy&| z!NrGyMXDxA)E!#!&?H;O$!9C+#hh(O+tPJreQLLbaW7lJAr03%GtxRX)HYU+w6chE zNV&vere!Bw%@bGDc9|u?UjFIY8V6;Jh!W?4)x*seF?KErEhAXOUGwG4HLpTD*G&Sl z{>OWLFpM%^^|YoeZsurVZj6%BXS5Q9DiXC^^|QVDaJ9+H8uM-=LaiQ#Z7E}o$i*rr zo1{zq)lm1un`UEX^*&BKBy6cQg&Y>pxX$R4-4SN4)>ZVe%_v^!)mM)+!q^<_rOdWM z>dspBkl(=`363w0GL3f{R<%*;Gf6AxRrqeg)kxe9=Q=e zsmGT4BGa)!+d9}ZU!&bdZpH^rVR=tPvGYO0C|ykO#Vp(xX?LI;6l!;>PMhmM=B!Lw z=PR}99a{OY(8;IJd4+44a9*&TsBoN(g7J0U)eeqH8{s-cJ;81Gb$uho0P~> zyLtqh=_ad3>U{nf)iQfj!(|mH@h01ATe99d%-}>&^c8*#AV9$+->&T$RF2xunvrZ} zCND>1j0F$Xg@%f~D@dr&QfKv8(#Ti-gv`Xe9`w!39`ra^$gG(TNum0i#{$rBr{cL0 z1eFHgvSeH>4sv?5@dHV04scXvk*UH7r|*!}MZ^vyjvI9; zo7q|3y|+9&j$f1IxPvB1BGE5XkU~5`QjxD+JJ?_-ts&oJ=dl{$(&~{Iy+P~x8-)Ka z%0W&|8~S9Zg<>>$EWPpopNagAIDfoyV@?8Eb$wZ|u$_K;0}gmSo5yyPm$l zZ2KjJp%O6eg{PLj$~U=xVq<08r;QL-+-k`suHgLT@|~kb2fHB;vLTYhboJrbg@f3t z!sUyPFhoGq+S;SK={A1MZ17X7E-Wi{=F8&fzTu*c#0QkhosQv8qi@tkHZKP2-aCS)Pbj0&sjU9SA;Vy27wUKzBYL3EZU zLK~I&5Q(+38T;$>cVx@V$WyKZzNhvFV;KqmqrIJ{bkW?a6Em(pjGw0hm6x9>JhvjN z@^fT-I%M|Bow4a8X+dV>k=z+DZ%*t1{4lj@-|4!bNf|n*g{nbM#BFIW3-ULl92MUr zQy=vVa`tQxx1$Y-0ik=DaU_qtrI7a>Q)KS~Dq#=B%E*HNJ&NY0pb_Lee$w!$duXgNPS1NDm5D+w5d89>Cu~;^S zBdnqg4^G1<(&L?`!-8Z-J(8o`}7Ave6W;W##TTBp+VH9)CRWZ*qS7hUd%e@}c<} zl_$vupw?DrEk8clsdKQzl-M?j(9~~~vmQ|h$tzlJAGJ0c^KFbnk{)4OULO6*J9%JH zdf&$H=wZD+Zm#DSRu;2^Jjoek!64}t=}&G&7?E;(QfM8|#Ije%JSQt8QP^6Mk~ts8 zPrG?WQw;3N=PHPEup%`NBbWNJEQKfx!X2)-*_YH*!l00^|HMEY-=b(V_;w5--FaJyvlEgYn-MkZnJQ&)IK;d48F>mm|i69x|m|2x8=rps&~1 zBBrQHWhPI^vKx|tLUdx+^B))-gCmLg==jcuI)%!8@sM!+$7|BUr6|FDSDWanf{-lC z@r@kT^b}8&E#_RUzR;k)E#;hzhHoFV`{TOfOi{yUPHGRFk$u*N19uexnotxxyDXNy zmjbyTR4I+Ci0|y&ucd$5poYpaRBzRY{`UZB6l07?tFO~U?V+^}LbifxA%5r4-BfZQ z&Q_(2^D5v^_+PwCQDrF#_^j3+v&rcBpAL8@=V#>302==)LCpL3q6{6!C!Y}0_e&aZuy(QA%G3Mj5BeVi z)*i(i_fN=);xcp)DH5;ZSml2i$OA7Dr>HFxRd^()kX@rVZJTx}EV\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 0000000000000000000000000000000000000000..27dd1f1c2a7e2bfc35f7b1283ea653662ef244f4 GIT binary patch literal 12643 zcmeI0e~=u-b;mnMU?D(AfH5)tF~|rBpmZdckI-O3^q5Gw~lLREPJh$6-H`4CR zYG(G16U2^Vn;*f1KujlkfoihOfW)Tw~rq`BHc`+yHg|Hh2Nt1T{yw}Az67P>l2t`}E1<4l0M*X`JOdtpy8k*z(IUHDe`_fX?}8S44d&ok!ja1~q%H$k+ogC_U;>_hr8R zMqht7yqNlr`RiYT(&up~y`P3^??otk{ue|AbN2bgc-{sB%4IkKhoJ2LWvG7t6jtGr za5Y>{BdQ;O8s8YyxQ;@8W|BXR|7NKBZt>+iAtpEXL5=@msPTLWYMhV5)8KdD5%@Ro zjqpnTG`>FgE@+|j`vg?~pM~o0G0!JFzYf*Ux1sL)9+W;WK>5!PeECOk3+10cHxC$1 zez*l{K6;?)4?y*M2%?%f3T4L}s-Ih+^uGsUDswMXf1iVT?orRj;iZ(n0@eP%K*i0E zq5SVWCQswt5BI`JsP-R$vhx#A^Z8Zy^YA-R?YsnKho3;{zZ9cNzg3W-nRh_7vkgkG zUZ`>P`}zaEd<0%j{kSiG1ggKgJwFMrp!^8D3VsjDzAI5i?OqHu-qkRMSHMT$12BNs zzPWh*I9x;dKB#v71S(E`2&dsnjIaaV3Kb_$LfPpBsBtc#pm{h4Vmh-LqKerDHU1H( zaU6vucsrDx{?PO5PK2jPoQe!c@`bUlQd;4vsYAB3oAo`$l+OYq(BqPG=( zHRgE(l%DT}vdb|jd!O)}hVqx2pyJ|vzWy$#dHyKW_#TAn?=dJn{{qUto`p+j;3X(M z|06JF5Bwi^0Peh`sJ{oQy^llLg)gA*Du3KaXE7?)b%T%^yz}qdmmJLN1^N)!&UHuP~*852Jka*0zL^fU!}{6ez(9X znlzEI=rf~Ubgcm(!C z<%Q2fjqlIkyWn$B`dz>ztN*t`^|#J*v**=N{p^9dZv;x8Bk*)s^W|f33*{3~`aBHf zhhK!6k3aJDPr+rB{}O7P&p_Gn-=O+=8A|^%FE9N6Y^eSMxD2lK?1D_4*#_1Admtfg z>QMf7JJfi;0{6n_q1wM}ePQR#Q1e-Vq%6}1)lLs?TO z^)1h*q4fM)D7$AN%?<=<7z~6rEy-1NIxARA{%d3fn#?8m#2F;m!Gu{+2+@fUC1${ zf#~?X0%i(+8hHR2M%d1|<8DvkGyYt5)A1Vx%srl(|8xC0Zerex$R?K{zkuvSE<+9> z4|d<_*kB@QE z^aaK3gUCCPyAaK1FR~uF6?s1rAUZyU+~>}Uztg}~$Sl%AST0>$9ELhp6fmEJHz5zK8So2xebwjT#B5I>_O!J88Ukv2zv&o36iZjC zz;RXqbB*Wq@D?OOCXqW49W~?(MDeR*De?v6jmUeDEr^a^M?Qqyi}WGCg^VJfLkKr_ z?Bjn3xe+Om}M4Rgks($xM_@ z1$h#Lx*UYns>Vz?pF$~(=$cbMQ?qr;ka^UZXkV1&Nje+!CzG%Lp;qiIf_>;+_tsCTQ9;sD-n0)wX7KCAHa#>FEh3B3rKo4Rt<_h26}CrOe`UVUDTl*g8li zyvO#IXdWo7G9YJGiee}nx3gJMz7&8%Vv_aM%h-62jOHG#iplj z!!+=-NGak91IUt;*vP634yS%aea+5aC_I}{^dxZ}R-NniBrV3F=t^y#Mt0f;v7N!= zbK5{)O?NtLc87Tw*fdSjvO6c(7&OK#2Id^z$BeF9_ow0Siqd?_>@NJU9VWhbu*0(y zC>i&~5$XZDjIwaNZi4|vp4(VP3kH&!HAR=EcVuK}q#TUlXgoX3R55^78rxdM^b&BU zH$KJlG{?N!EJ~TDX4}xcuKE;3KLN!(&Sl$LxTjo=OEMjIoM_q1MR(w`N)h;G4}G@0 zlTU@y%0f(GY8$pOF13=AHqNlz)#GWfafd=k?UJA{c3ZiuxTtL9dY%ZU@md0X#*Ql^ z5TARjt&NA(@ z*z}QlQyO&PBkyq?7x!(zjI0UNHPd98`^82@fiL#5XMTcMOY8`WLuP+YJ=piSo1%aFyATO*s7D;QXArRs!VN_8On+| zEK`#QF1F}kXula6?i~!e`StV+9UL4B28Rxtp{9-dcAMeu(b2<0Bb>A&yM3~7X|E+j zmGT}FRh=@!ZGYF~nPD<58LnC+U$=a+5eS>jI@!N{F-cL9wZ}P!R%e9|K7)Z88Lq;N zIUlMLi(Hy}(7K$V$8vk4mJhA_zR}{E3o@Tt3zu^_qG}_&GGuLuUE;^+)`d(u7c*v< z?G77_9%ahmG@1^pvuy^$2}_2GiBu{gG>Ub9vHY5m-o1UJW4$A?=Ot#uhBbUDwVX|| zoUyR6Sy@mB_TZHZYO=XibEKWqnB@_hwd%PUC92FQivebvj_eHQag9G0mqDF;g<2WG z8yvT!CL5B_nWa9KBugBcQIebc%UGB5P^*wHYN=MTG^5PQ>;~LtUgIL|Ra;C~oRjiu z#mYi+xjfJ1JeK()sbc!I%y$xVqe}vv**S^nFUJfd_G;!%Tc9<5j1g6g)}k7TuIhGK ztE3u?OfWodu~55Lppb>*El;I|CrL3A7!v^O?LS!x|^A@ zxZ8r(h)X}cn6+gKi>&2K@$Ak&hj!gr~NXanL(3Ja&B%Pm|^5R8z|c?yTK1 zw=V30I?YVk=}TI3#;KEUwC^6bHV&%V*D$@ZU#C9?Gu*+TJk;LU;5>DPU7O`5jib2Q znT}^zLDer8St;14FIZojNt4WmlARt|>>iy>L-w#m=3*-w#u?kPxfc(=ZnDi!if-Gx z)^?ZdXWiac8~mbue4w^)z_PtJgie)oHAk;DDw+G3cC;axN${^VV-e5XAm<-Tn!%>7 zU`(5CI#N8+cA|_k|CZo-BpO_G=j+453(||biv2q?KasR^sP-`P-og7Co5Hy}_2zTx zn2237vW;d=4jbp?GGvL0OI8(nl_;*a_fzKZ z6xl3sdzTr;E${QMd~O9<;P`$ruQAuN#i}LpeV5+|n$Ank2JS6yeg--N&v#H$Gg_~U zm80{;?bMUwhhH(FUVaT;%fdJ3H>S7@*!{<>j3${d3E}USonV3&C~`!T?IM4P5{}8( zWLDkV@o=3PDUIo=`O1-~I_2tub^FE!`Y$&f&S?w5v6lmBx}vuzYxEtkk1~Nh>A26IFuEU0vHs zUGFSy+8k`!Qt8^tc~=)VmPYJ!q~2crK0U*I+Rc^5e8)*z3A*d{82ipN35IPg4Nr!_ z)oi_rs&cca+BvBg&vG?s?4W^SvxrH;1{x0Z4fM{Bb5pr%x!wy&DW$R5ChBT;vau<{ zzMGv;n6lZ}esFA0Y3uxb(q_V@rCwg;+#V;`Iv(ZAuPY5F?0NE1yUPljH)px|OZ)At zUU0L1Rs{O;|%9qhWS(_D3>?#o4+#3a#5Wc=31$%60kLG)ou2wmp4`1KI7Fd zZmwuKX2ITgES%>3IgOh6a~J?+Dd)ep>wO zwD{R+@w1ciIp4PQLBlQbZtKudp8qDX_}OXkv(w^dr}jsvLHD(3@v{?a>*8mp#m`O) r-VJ}6Z$o^E=={pH_}OXkvlE|07C$>Jes;@Fub literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..db6ef769dde7bc87f8d39df3784d6d845e418f3b GIT binary patch literal 15320 zcmbW73zQ^PdB-oH2+P9@E-49f75HrgwLic`*-Q!Br05$Htp!j;g<0Bsb9uz;{0oCtEp!og;D82cWzd!6`*3A7; zpyt^MO1}p|^}7<3UR@1JZ>|H?F9yX&0!luMp!VTSpyvI6fBtb$>%9j=70rF1*7apj z{CpGCIRE7FU%@lE|1tPt@L4Z#^Iizbp0|OU!B>Kk*UjJ#@Luo&@YkT`-^fGFa|tMY z83Y;9OoCcR1C-oe4QjnNg5v*ep!VYWF~R^m`9*#_a4q+< zpvHX@C_8=7KmQkSf%{`H(#yabK-ueq{9#D*Jy87r2Gl+t6*xP4A&82Y3qi?e1l0Pj z1xw)TK*{mb9=`~R|F40P+oRw#_d_-~I?f?xX!5K&- z-s8@8>skj&etn?$xEQ<$901P;m%st=PVijtXW*saDeH_`5AFuHfv*RT1Rnu$E#~W> z^z3nu{|RpA{x{$eV1-RR3LFBZ7Zae?pMkQ6*Ms8wW{@e(Z6L3juY;QRmmo_qXTg;C z9s#8K>V!-p8;M3vW4bS zQ1878lpeQ0t@|cW>$n-j6wT*A_4^j6evgBggn2s5Ykg;e;`1e-#=jP9gEJtZ*nArl z|33z0M?VL({&|c*eBA_U-uHmVf(JnD_a{KD<4d5%{Whrn-}UW30=3>>f_nc5lxq#R z20RWt5tJRj7(@+C8JqNIJ*e@|2Q~f{P<#x6nr8$& z2D}cGoy__BeW3ci&f}XwjsGt2O7MN4#{Caa@BNp5e&j}HhsT1F!?Qv4I}g-6=Y!gZ z%RF8ON^bi=$>T;)>wOD&BKS5?^1BVxIG+MF&SyO?gObzVfkWU=LA`e|PUb9d1eBe$ zK*g0$gRcZ11?5*R#<-3Lb5QcR0hHam85Ex%1*Ja^f#UBULA#ION!;e_%r$Nc}&7kIeJE-yQ0A=rA0GYxZj3K#ji( z6h9N-Ab1`4YVbqgGI%OZMC$0VTh! z;1S>sP#qgB4@o!m`y&VDb>N>vXG4Dh{TcLbNPBnf-!NvI4}p=C(6{5eQIV-b>0>L(itpzV-;(p~-D=fKu>eVV>qK(5Im1K{rBm=(EsfNWTbr6ZB5#3(&cc zelyU=p(CL`gw{d&-2uGs0ogZkWU=kH#wc0jj7@9(s_9QZQs zpX=L3!7HJ=p<8|1Uwh2JhoLi}tD)yZQ_yu#@p}&!CqaJ$J>55+11>-(`}-k}9|pJh z>$^Pm!k=>UY3MlUg*^|h<+=$C_O$8pMf$Tg588Q@<>u_Q3t_z-tvx%4^B_rEK^V{w z*Mg`K#`Peq)v_qhgE$FV^HDGp=5aNcO|wSW3hHS!te2W$*1CK?&09&>h)k&zOh)yn zs&NL=cGAk0f>LQk^Kh8VwZpmS;P$Dw5$#VC+g=XxxD^F)ElOJP>{6V}1z{e*^gIye zd!w3|2&!o^8;h4X6@TzV7uKfC=tZX(lIdaClsqon4BZXiWz4T3BW4?FE;RqZ)O16uQG7VmdF z1FC8pzSt?r9489!xj>&Bk~}f^;S?R$qaH{ z>fytg^tIen||U0CUHAI8%>;5v16P5^X>* zlGY;Q<~EgyiLr^kU<%#k-37Ltm9(=Ys`Z-+mTW4?A>L;=bR^2-j6E-8N_RCM;?{4b z>tn5;;KIITTdWi8>2ZBK%B|Z7th;g^#cYpevUZ4Uw=;R$8_;~XAU}s*WKqM4EU2aX zqa;U`m&|0rhRbB0ngADw_zNy`_fY=OvM?JiUq#b`#}2HW2rMYWl*x|fSaSdYwh z*#M*9u)=mLl>^0<*OxGkdfj`COgibzG?GE()+x$c2J%Vt!YA4Z%lRw$G0W)rJ2J&x1tOc{A7DDRl4RKUTZ$>MSr-w4Y%f|mAODil}gJ8p*X_Zf3o zGnHmpUR=NRNR~iETQf@+h*9!Tk&TLsB%j~ei|+Po$BKx;==AVmtFjMgg6F8MXpM?i zE4h9%grlhEQVlyK@kH*H=v+iAZA>v_Xk#71>o>c?#46gZc74h0YA2B?!Y>y{eFSeX z?=G!mZR6EZwAZ!m#&215fsrt)&eODHM!es5?Uu<={AVI{8BI}-4CQUt@vm7F zqNHlfqAI(Wvk&ZVA1$rG+9XqrrVGv;ja^~J#w(*inSTQVW7DHk!RXl4W~|yu<*mk= zQ8F}W#>9F-f)hI^ILxN&rBbHl^?OeE@VjQGj*g?TrWqPPEj6H^FvHV?|5eNf9OrUyC|TM0va3GLx9L@mcIb94&I4)cDgREY2{`q;nHN9ghlw zIqoIc8{s^okl2GB3=u{n+=7|J{n|e{=}0S7Q$f$Zv9@$GOShqGm$MV^oZgDoVsh887QN_^HbnrLc(K<^kHTe2M#p>)RWR7Rf2Z zBLm?eI2NtQIGSk_=goq8Ex;w|R{kL;2Iq@8ID|<~>e@N%`AmXCRqCcK&IrYn(oj1k z9JuiGehI^wWe**{~a z@^wBPr`67g_1Wg$!`jLR;)`DHw1j+T)55PRtLthKXJqo_PEVaP58ZhV8N!+G-DS}; zZ1Y7kJz1F;Ess=8PjYUi;io5hKhZtetj8$6Kdky%soPV0ch7s>f?rb2^@0`E7WN*u;kEKEmJje87m6idh) zOgd{)oRd3X&T=xwgEdLn`IE{Wnw&(xYO5dPb#$OKrMJ3`6LEFkwgu~UPK^woV|vuz zDAwX}IAC32)9+vD+a{Z#4iU~dxCCL%M5Hr7X(XSEYo%@Nxx6%$ z_6KXm$EHdHiffEg(n+;HIDg~DEv1bYl{Q@vY}(X+;U=y(Zlq&rB3g(w+v@$!cm0$s zm!{;Em^jV)gK|CEL!zIh!FW{5!u?@z37M^H>T9~D%jZ;4=&PoU%hnXRI3fuf{lOK{ z(o7m=N@o%hiaZ!@)%tpdxP0$Sso~xn85*f{C9VyX zK_z*hnhHr7H>z-E%l9O4H4PS)4^S^nJ2lQKYD2V3CXWM28Is7>n7s%uVKs&=TtdJ(Q61pB9;yVYw!G~} zsfA>dDamXwn&xRMW3>Zqv?nYMp`BrP**_`I5kfg;O*{D*yrwb53n{1^ zg4NCl%;?qV&>Y&%%*Lk3X*-GId!O3+@X2;Jo{})4gpiWCf!VY?+@nL?)Y#zIBvt&b z%2Q9B<77rXoE%N%RKJn9)1bC|SJ-Js-JQQd^{BLw-Gq&18c<%XMfPOC=>|1cEj83u zx*(YswnD~c>#ZmQiLC1QjSvm&)L6qzV-n9bFS3+3lL<;cs6=7_RAC!4S`z|8yYguH z?ocIHw4O$0`FTAq(W+%BvP_^|})qCy9R6Fj9u&6VqLH-=FpD)UGJ7NUg z(ky2`dxEK=M|81Dyn?^p&OET+E;^Rx6JRS@`$VQ9DK8(ONRn_vWn&hrZl-yxq9{Vi zLJUNTN=l9eB1G$SOhx5diGgEhn)j_{)wYaV^az#^Vl5(FeCO3bWPN zorWug)p$42x%Ym;8V}3pEQ!J{n#&ft3l)a*`EVw#bNtIx-L-O~8pNWD=>}F|&ewiX z6cR+ra4eYOZ<-~`_qgIOTD0>?#vMvU%50Z1Np0 zH9MAXN6INBRoUx>~yar8RqX`ofmx z@f_FmU%9!RqyTfYQltotgs4LE*QG#ay55S(WGM3THI;Hcn@4@EK`EH@2~{WLEZmiUSQRrkD-eQzN zDeTC%XK})bLfT+;3KvCg-${sa%GKHaR7Gpd)kWNqPOvS!VWE&V`|^HZlyMa93Hj6rE4EfBzs^IyTG*nr?R_$}?eeyXaxgtw4p7F?sd7->IW|#N zb-S$+rmt=fjEzoBlqW08H?3S-seAYQq>1}8}6Uzk7cY+5&${BqAOBi zNe7Ns=ptF6^#v4%Gv|X;4adRhn=dcbQ|s-*W<92n+IF`a+{AlGH!zZpF3P3a!Z>Tu zwp(9BQ#p4| zUMx6I3}f)A6N7o^fGev{R3`CYQkK)ra0JUE%LnqJcAo0PT;X|OYr<<{=ebMgY^pdB zRolzA^9`+2Sl5p4uzsGhw~kQCF0mg@+8jKb#qfatW>I7o-b)e@Lsd&8iCHQJ_N1XD zv8mO%KE$~&Xgw1CL&qhfL#AG^8IUe)Gu3ZBb$oggC#o^mzBr$!C@mhRmf=BGglf!PAw5J?s?CSFyCd_?$pXl! zcj(9zV&cPicoz+o``H+vLmwdogM0GpN$Hnq+oV=}Fha zJ@Sn!I@pT+L51~BV$c6e$k20Tpvv8Ovq&y9N+%c77`9};a&9VX?8S<-**REOk5+*D z|IXAGjFAvizIU-r%3;4^$RJf#h!^}R&Xw=4Dh~{e*%$BpvMs@cX9**z+S0(FQst9q370u zSICOZEu3f}urLUh@5d|aRJ@u#EZGw?3djU)D&>dl$k=Wxyxwasct@Lxg%Xqt=6bRO zwwsaLiqtL%Ts|Omb|zvymQ4jYq$q*WA<_D?!m>1e6_c`-TNL=66n)WOR)Z1wbi=Zs zw8))d-Rxe;Nre@(Mw0Pk(A%5ww?ll@^)`1fTddE?@2M2h7;3KY-SlHc-}|B|G4HK>aY zcB_h9EVosoLR(zDpceiv@3_i~-svvGvSXLATHEN@$hL_JX>Tw+IbEI@8dHYSvjQ2C z&#;`T9nz!93n*0x`IgX|v{@hH)Uo)o(8&YrHwUbsLC6X?Kk5Gob-hy|32(MyD_Fi= zb_$b9=z4U3FjT0VE#gBsqP7umIt|!3pl64=&DR{-JuZa;K|VunzdLc0MgA_Tkv9W$9Dc0`Zd!+$m&V&sa1nit(tMZyag@z6cj8 zy;4Z_?LtU&I;c+7n=lpHrVLDe!^uOs<324Av0Tlss}06?%8XOa%#eR^ZQ$L0WpIuF zmS*+sA5V)W7zR?g&>dQ+-1y=UweBQ+LTi*{N)~arY4OEjg-IEGU0!h_U2*I&{|Aru B8q@#) literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..027d55ae193954fa8613e13e55cb5691327beef4 GIT binary patch literal 12670 zcmb7~d5|1eeaD|=8?elM8ynJg5SEZ;CE3QF)2tEjs9a~F6m*aNQve+Rq? z{0_Jqe9_aH13Up91m6bU0RAEPT<}p)q+a?AKi_jfeZK_ZX;gJDzFG&w)<`F9OFv&2ue?C`=X9JoBK| zk3jY76z{vm`*(qt^Zx$g`{zN?@kLPdeht)oKL91iM?pw1mpse!aXA?9ycd+br$Mc^ zT;Qug$)^U2{utCeo1pl62dMt{7tbF8#os4E(fhlg`1lgI1N>|74)AZm=YR*9O!S`s zUk=tl(eWUtbw3VjozE5cP=S8}YMrlw>h}#$bbKF_Ui@qE{6p}1o_`FAp8YK9^b3@{ ztDxS`fm(M7q^r3Dl$=sf>%0XN{qF`L-MkmndY=L{?z07c34AfnUja4$4?x+)k3i|w z)7cd9I|ZHqEvWfF18Sch0xtvq9Mt&lg5v)_LDBsfD7v1=CNrhE4Al7jpy)XSil3v! z`xC|UBDjb5w-wL#fLia~0^bkr<@pn! z7kC?Z9ry-NdjAD*6MO``89ey{ulM(YlFO$+@%N{oCI!H_4V_^T)_IE z`1&-?;UxG6;1+mc;Qi(6!PoNqQBd>lxY8I*+UzXwg`o7}0I2;v4vPL|Q2k#8UJus5 z!{7s875sbf8t^iNbp)ISkAnAs$H2b=MgOyL+R~3bpys;{Tm%n;7lQ8wC7<_!h|oL; zN?*SWiqF3UwZGpgzW-N&&%|gX-~AvWFgJo1fh(Zo^y=b$6BIvh1tq8ZK+XRE2n*)Z zpyv4+C_4TDWb4hhi|3z!sIb|w%YT0XsQtJSRKLTZ31i9pF~v%q^m?bo|Nt^Yw#bpICk1n~0(ei;-!e+0f9{0s0x z@Pgf5z88by`+1<&yAFI3cq1r%I|^dr<~C6Kl7gcDO`zoWX7GvNgP`d7Sb?7f`DY&D zkNSNV48X@g(Q)}6zdwuM9X!Y2lfZ{T@$+?1bbY^gzTl;v|ECvt1t|INF7T$}{Q`Ii z@9zX9hbE|fPe9Fo4|ogs4p96)3~IecKmb_yJ@eXY5rN7t~b(NM-%N#?RaIY+?scRy5v`n(WF1a*QTnoy^Cuj}Y zhiJM|59YPtQQ8f(6SPw_`SRiGG!H%6I&F>iR@zOp+i0Jp?V?GJOEmdAU6_v7P4G^d z_E8riHt(R_LJMhcr+tJb{m_-uWLvtfqm8>ezdygq{Ul8~Sfd@H>2kUVUge(rpI-u` z!@o%Tb(-v4K3UgWJUCs@ZA3dso6*D2b#HNhVS&F^;8VbN7x%K;ChY^XrxowchL{&q zv^NiZcpLY!WnG`}V15~V6Yaj@`7pRZ`&jYZ1*NyTHfYoC&i}a?kZ*e*twZ}2ntaCX zwD-_%rR}BNO_Og}rmfJPLwg17$+X|3J&*Qr+9K_pv>R!c(B4JU^+DPL?#}B_tMJi{oLGBJhZ^eiu)IWZQbw6f^KHh%v`-|Gi-J3uB(G63*saX z!hjc1J+SRCY6W4vp4u!6qBzK#Hdqa_s1~dxX*O{7U+ zL`1V{HqOg7oFpB6$V|1>QcHTKigZ{Z$hyT%FUpz{2$D*AVpKAB0)iGXa^(DD>b7O! zl%Y)7BdQj%4wALPVkRpxnT&x94&$0_0iC?obSBkB8MC05CUL_| zG{YFW=EE%OVGTUn+C~sI!YDQqEgPmmv5P!Ke1U;1NwLkW26O20S?}w1@WCrITudZg zh?hyHHcunFX@l7I(C*x}AyTH4Zkc0Y9tJi|lXT48W8rX$1U)xS%M1I^ckBL$=c7@Y zH_b7xe5Gv^kIO^qBel!r&E&$u+`?F}gmy7@ zll_5#ZW`PAxS7Pt%w&9?@l3~N+DtAW=#vn=Y zrq@Y}GuVeeGD9Y9P9{t=h41RJMI%ejpi;F9B3*3~dUEYkwv3g>CEN7!?O*3CcSZ$t}$G>3WHScm< z&>-rColXm%SAI-Vh{WSMgYY^bS23SPn_+D$m``w!TRbKr#fOzB zRzDwX%);b}sl}zq1*29jK2oEZG-=(5?KY_GmkzL@`WV@5&j#dfOA?amYv3j8#*ncn2U}mL>V@h25 z(SvVkUvXA(L10Aji_JV@ZYL?KC(?bFr(iV0pPUTbDR5w)!-iKZP}ejHxjqOCpE!Qn zPCE9-O{i0waYr%J*Bj$W2gqP!f}2U!OoI8l2okK3`QsxxBzXKu|Yt?AwcyH767Oz$y6%4ifyuxU=j{d`J6PM*9nRj-^zJ2AxZQDd5n8=Od3 zQKsry-??BroE$1MStF`fj&>VaWhogCcFxZ&RVL&xnWdtS+JXtR{N>_l#o@HiiMMOJRlOqEkfQ3wyHF=RSyo!x$*9n9`9P@ zmDw1X@Xb5RR1ax{ZHSwhnwcE1cyR2%&I!^#yh&wgs{^IVE%tXL(?jGjVM?lS)AG{s z$_;~lB4o{`l}Sz_E<*`!SdH?Xw^im7GM2njE;&x><%Bl)bjoh&P?k*-3|OmR$qqUk zB}R9`yg43>jqT^(;L9SBqSl<}TjjubKw{Z#*=*a-2ghBuu>Hqt#ubT))%(}OP0oC2 z)X8_6U0Kkut7$jdkjosY+cXp=T-nB!=eAIF8%2dCd6Ys_NTl1gVso0UVYqk(%J`6> zxedFiBP3o`b)SqCVhl_%FH4fR6|HY5BD%@*NXdos4@swC(Y}U@T)}$M?csgPEMlaL zBc-5M8w$mMia2MYbvUtUhqSIqsb`Y+&f#kEGrTJ+I-GW_PQ)!=)UkFg7rkj1Hi&bi zCY-d$gG2>+m8v?9lHrmL&TRXtjysK5b2_n&fyi-R)>Ok7k+gI`!@GnVuuYUWYMT%< zT<5W|(l0lJLrNa3L%e0*94$OBSA+8n`D)9N4V9r2?itR!M1dn_+hO=5QUjNyL~M{{ zLmMPCngp5kqID8E8~?PyNn8pB4hqluxMyHUUjxrsb$g1PoaBnE+vd707(8eAd5HF! z%}%H2(b-b+lOW3t8^`D68*@h+IKeeh7lceHXmY^EfcZ1pRfI=YVW$cAH6;7=Ds{rAFjDTRSOqxSo(SZ=mks)iPIYl2nd!%{nQI45)$9qn0CfN~YvA zf4FpXjC8rE9z||N#oi=d@3Q@7C0aidp*|r@^;lBX9?CgMOL`b54Xm9)6j8$Kgr|f& zg=8f&r&`fQkhIa)76FXYJ?5hFl60s4FgE(#pxYa=pKe)HV#X#XWX{_7 z_U$W6Fk0rWeaE4m-L^SlSK)*N#61mYFY~;?n-L}MYh=a@J&S0O#)?C;NOah+EyRXl zXxB3NWJ=#EBDrc^S!_buBsv%oYTBxES~|*H>Bf0yAVE0YZ6N}blK3{X6L`dN_ieB_ z+r26`ss9bHP)Me9-F_P0$6?qW?uVC?U!w?D_#pSOUw=9+TQSwOHoQY7Le&IRqgy#1 z!mRX_Moyza%7@aQCcPyvqL=E6B=O+rmN}_3Xs8G!x8uA{QHa_gzN|X$O@&EEJV_DX zjAS+?bGO9>cS+zE$_|Q`+ z%iRa-5R3(dx%6t*nHP_UapdYcTOZq(QG>1OUNt~^Gvdroca1V2A`0+nbvt%o#MAES!p%3}+YDv7X4C$$@KM9Z1{6NmgxQSW}-k(H&!KPP-QB3RU(lu*Q<+Sc#K<491#LQDa zi{ZZd%e>D>JIfQFXJqhQVM*fV=-6k~S)HnKJA~N{7wo!Lr23kxu8y@y_lxJOQqxJSITDGh;(OreDV6ZP}Yu2Ugu5TGv2dyMq)Tvqtt!)DC)= z1v{LDJ8%y~-tS}lxxkdOsCLIsmz4Ar?b}h->XHj>x*W}y@A&P$e|TUTWySmwg{-ky b7tpu)tSX)v(p$4?H%L-P(n)!>e$M%S;!@1Z literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..ee4bd982761028f7863306cf820bce62b670f135 GIT binary patch literal 13021 zcma)>dypMRb;cXp7+YY39bN%q+Qz~XXjhVru)MYC@+Y=XC3bmtF8-!}B@HD=7K1jd=q6_B#IXy!H9UTm%N-1Xuyf z;3MFxz{}Sga~rrDRJ#v>&jCLMJ`em%QUB-Q3wi%4cnSFT;Q8PWL8dhS23`yP1biL% ziWeAj6L=fA5qv*53Vs>f2L2M<0dBt3m=}W~D3RX*YP=JmzP}IDJl_B>1pf+D`|p5E zWqtxa7yJb%xh}ZOn3sT;fiDGL16~a70X6P~&|YlpIfhYWK6E{y&TQb-!lJ%c;K<)b}A!@>~N-?gOC43qa|!0V29N4r)Cg z0WJ7ha1s0_sD0T&W6isxz+Ir$vlrAlZUgye?%uo)I5)YYWFvwsD|Ybb11%-v>bL+n<5I4t@>PINt@e{wF}m z{c})q{SU~J%=1yM#<>dA`nQ5w&vixpjm7&ua1-_8#d{0XeD5gmJ>YA3zaM-Z_zh5c z{S~NjFGMJ<_YyD$UkrW$JPulL`^$X)+rbUI9|JYcgP{E32jCI#SKv-CMH%vkFM-n2 zcR;Q4KS1gK7a%G#m+%o0%vGS)e-o&68~}&F9F(3uS>P8z$@z6qdU+h21OE}c65NC^ z`hE!92F`(!^8|=!=21|3_%3(@c>d+yo^};D21?F@p!6~aO5blPFaTvIi=g}=D(X9+ z_W4dw>pKBzzK?>E^I=eSbsGG?XE8sheg3XBW*Gb_cpLcAD~!1stblI($B?^_>JHV;LYGsQ2KlX zM5SguMz3)Jq{knF(#wSm zG6GugI`EC4?D`(?x52*vC&2Anygu#*#h)JspAS9^s{J>>4d72fw$`lQ>f7xAaXm8$ zz8cIy^*dSML!k8V2)G{nOHlLv9SBvL35-nNYoPWg1?86?0@eP@pw{zE@b%!2LAAe} zP1O3Y0-pzN2Bnwli~5_vi+SG%J`0=%wcoQveFIec4k&-P3)DRKgPQjdPXcdc%m4Y*!0&hSdsFc)+x{KOc=3KG_y)=+DblMR@%8l-Ou^-LWl#^M+j~C3ucUaB z9iODgj(?wW8D)&JnetAG>`Jz(=i`(=q&%CV=RAt+=O`toSjyFuc}j!w0*anLrgSKw zUU(KLcT?U$2`I-X_fSqy#1FE0*`b~-l$3IW@<)_6Q7RNYvh~B1gOn;okNjNEG(|qM zT`xSBcrd#PyaPN=S*9#f-b>L_qFhATsTUsE^XDipp}d*0gQDmCl;5R%h_avZG0F_( zK??5Vo_+kCq_il%hFNB#*yhWjT?n$MWEYdP9^|%`l!Dq&BS`a`my;}ygL-H- z?v27)IkQ0;+Mt;yw2Np}Yum-BRtw8ED3y}59K}mEPu!3Vq)6hR#uST*&GICr71Ono zW@<}Gz21zYygh_O>e`I+O=jbwpQIk7RT?j}?Z($^a#N<^+nNyrY%-%Zi}KJ$qmcaz^Vx-kXiB`y}Xo4o(?7nl}wsX^mhRx_g(#-8#W=6dnU37w* z(Q=t@VX7aIMq@>ip6Rm@D(fsMY3Kt3)M_e8%Z#EXrm|VH_|b~8WoZVLB`vL3%6FPV zD6MGMx%-sETF8>=>J+;#k}})&P_p#QJ2m4%BgIys@9gP&%QR$8Pb-^KYZ}&^zO&`1 zVOvqof|sAk>f*M|(`J@GQ+;G%T=qlP(PFR^s^jRPL*DXPRWn~s(x~Hwu^6H)2kl;U zST?(pa(l$=*@N+7)wZt57tpZV*Nlf}Yy#)jlO86D{y#HFwXH1g82 z^Q|UUnb}sF#7kz+au6feRFGvY+=BP8RJFlU5XELsEeujy>>_UwUsynvq&R6-VsRMt z8TI9`|G`@}tJssoc~EkuyC-R~4!L<6=4lij32hvmZJS$yJg{M!Ch4&I zjn}hil<61d48HIgeGlCqEq`~E=F8?5Z--qsDPHFWEK81((Jqb<4`9kD3l?gj9cSfv z7)xn(JSm69Pie-crzfX}?JR~y-y>`l3uvZsSROHBIGh=a&(WXZ*w-)*|50q^W?l@AV6`}UD_jsG;GcWLu)GkIs{E)2wb1O1Vt52d zG0O?@@?K~atqGUdeFo}{PxmI2;hNowRncl+2>on^3iYeuq?u_p8d#ngU=_13VdVYr zXcKV*JR_H`wLejb4^w78oR>17vs-POo7lJ8jQo%>b&WJR0@cb_Ll;{ZN$l5KabLI6 zOP5s{ofZXkj~&IkaHaB^+OS*eXlBIh$8%~~g6+5=VO9|jF|Nzlib35W1IPDhYQ!93 z=q3ch4-`6%KP~&8PHC=kJ`AhA?hf3RUu+Dz$GOa*B#^5P4-fNm3GWg3zeE%>X!3PT zUhIGe;0@&wM^)W0Ks~V-w=F?AbYr8(gIK)g{b{^lIsfKFn}9T8?f*o=ey7CZW(`tF z!+@Bp$~06s&ioz@Q`-ahOm)M&cFjz|ZE#A-)13=ggx;XhsKK}0k4cJju)VVi#Y4Fd#)4+* z88*UJIpZl|{e0?m44s#%TOJ-2VJp%WgZgjIj|wvLwg#~>Sr}oC0c;*SszuwO^Odyc zEM|&KhtR%9+%%O&M}ktji*_o3r1hFeBp=$MSnYklGt*%f1E?w8VrG0 z8D49vAsJa1K%wl?eu6-V1DYA=#Qn*Lgn1y|FJ2WKMNejiU1@JdS$&CpwpVJhU2#sP zSN2@aaJfv*rFsNbPh+V5YW6#cY3RJ)X};jYBxb%GH9)1M%>8Tv&4mgp8Zl!3GCW># zdCiq2A5*g{E&L;r;WL~#&;$!%r@ATR{#$wxyaj=}ctP&i?IzwTR%thG$TpoZU28eS z+}4bSLl)bMTD!@?GZ}i=j^Y^%Sfqqc5HlV_73k)OT&%jhO%eOS@|hV z*G@s5c4pYg3!gdV)F2vVx(i_#+mbQ~wpaQav`5>b1v@LwlVLPny17U+XuGxz**5|; zoL$=zf|30cbgxXAR*17!C$e`%Z)T6LmiHk*UrX&U_no?_1jbWi+2uBkv=0AukcV3w z95gQ<2@#~mYmOC-qyeQNVClY4gno)`wMS=LmDF8P4jI5qg5n@C8`0;mjDI$1*lk}x+rE?W7FnVnxux*V#kp>G|WkVwONE&ZwNT#c8|A(9oX z`yv(syL`mV&5TV?jE;|)ft=6GAYIe*!wgk~Oi5fw$|R>!NGDk;7pN9OnW;R6G=_Ldm=T-aSQ{`DNHFaY;*yb<6sS zLzasmYYe~G%w6UVa;tJ8+jsni(+qxcI&kOM{tgT}UNJ#g!zfVu$T4_Sda9k&0g%lJ zblf!V3~73HW4!19`F2cXG|8e#aDNwe>>@`NIHEzG$e%=nV=_)>C3ha3s<9(Ov+C8a zoQ_J%uFh`UH#>f4lNm5ZqxgeQbEfZQVTz1m@}d3Zq1&-e9C2i=GmXVd9Hp31uIiV* zZaP%rIW(RvMdhL0&82K;HW{(&rY2{H_J}YUWk{!x5qr(nt=A82-9EJK8oTwnk?q&< zd+Syj4o!zgBF*;XcGqkjxpv!Yw{D}I(zv17V&Wtnu~Si!r*=0-yf|rP)yUr1P|ff{ zujXdb_hh(H+ev4iA)=0;j&$Su$H)3>+%~**olarU$DM!fIoYwlE4u)+VC$mFD1Li8$ z6!shJCbBnze0jtU4{zaL|H}-aqO?54x1p^gmVC5X3$wF+-ZtWLjI)2dW<;TwV7;Xh z9O1N@MvZ)(*}$#S>Z9$vnzZ7mdiqpr;Q9#?vK6snBMn+ndG%P*YS+olm4wxclc(88 ziWS&w<#;y=v`ZazY@yWEV{sJ3q3tXsWz}`;Y%7WC5vfev20B55#KirK16xhvQWSER zL~sji(uspo2L@*LPS|nxNty)_IE=@%o5?w_2kvv32-k{&%F6K)vP3KQ*-B7NbaB*Z zb8sfpPV!b1re&-n3OC!;M?-ytJP@ejucX?GQ8ge^`>Ul%8wZ&=h=nBG^Gm4`GLo0l z+>(@o%Ao23S0z1?%8}1;z(?*8Guco-=l+42&pNPaH8F?7PV4lknmK@a!_||7e8h{r zV5McQm^$ca}&6F$QcZcq(!GJvyyu<#;EoVk9}+?3TK6{AtDR z1PkaytCgx&?rVtY*C^|0*4=7ntH-o#&58|`lX|jx(v8>C1cW=VAe>~EITV#T3xTuw zwA~3xl?a2eQ+^jV#X5M#Tm=1ZMzsqvo%C7YtHZX_ll1ZTr2R1YM zR9^iG9sz~Y)XaN}VH|&vfcKb#wWu0L6&sL@>vqc)uNYbTADnX7}o`mE&c{6s6_i{*ZEDF1;~k zkqEt_f{AcI4oL2gZKjEH^}x(v*32v!SiFB>1ZUQ+``V2)hrK&tOG`W6y$RdBde_R`w+!1E>dB}&t@QM%QnY$Z_h9W(1-C!f0Q2x)r@J-hd>Pm) z*FJ+fDqa5dy|}A{WuR6RJXj<8gM(30pOd(v5WRRS$GF-Ur0$;7*|*MFzR&TXkSJzP z7ytu;(0w&7CMK6()S3%~aczWiS@H{#z&ONYsM`hoaq$&Gqzh5V?i_}eSMM%$%zh{8 zL_iFHZ$dsak~)&E9uq$~V})y6E9Q;^=plnQr}(~d!pw74thn2-DcrS0i&n;E3gM%; z4U5=$A0C!gk0F1|)ZG6E9s1X8Eo{JXx)x)P_pLt4tfT-;mv$h64$*e5pQvE07(qeSB@zk-9r!F3@fLP4 zYqzR_*-Zw~NLu7hW_KD?$>OVIV>IJ}4L)hPJS5Zw+sy3z>3gORTW-`2jM;;e6SI?+ z`=QapX5Z+{>Rpp&pC{5D$2mgs2CIPS7vna~o#?Qg!3|C_Hj0?ex?Fs|(Z8rW6-#ZG0w<>Mkx+w2LlTfO|&@*U!VMk~R#5lXllKi*MamJ4hmq z=gFg?0@1O%Y{SLH4bCfBVo>-bp3FUXQtHUTIXz$(dF-eJd29T)U^TG)TCC?F%-fEe zaIn8}!1&>)!=uw<2gYV*r{@mXnf)vGUZL~^pT_W3?kj~AuFn+9Qd$SPAurr4?bfy{ zm`M?XdzEWqFoaStTE#*vigP5m;u$EH7u*HEC9TEoVfd4^h?s+E5bB7Nc#byHZHc&T zu^CrO75x{Y7R$0cyO`ZUhlEp1)0M`(hz161oCwh7KLa|tr0Xrq8w!D_$)MN`h0Np8 zTGR^6B!REP`6#Hsw_A2DtlU@ZGkGl8z=9Lf=It6uZY3sU=4gqf`%H3;ANNj-KDk*d3IG4( z^M4le%o?8AzsNIvx^woU%ZNKALaM%z)0R8pNNfG$AkBj2q7GI%=JTg*VAlq78J4j)S`F5k;x2rl9Z0u2gHo9j?eq^a{nmllVN8EyIgp$ zE8*2UDW%WOypa?>jxGDcudaJtZar`q^#L;@2kD+kpDb|qdQZlrQ~iLZ+eTxPE;%)F znjoi?;#p|~R>YvBjXT1gd Ee+!iC(EtDd literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..754a9b7b39381cc790f17f470212252974904dd7 GIT binary patch literal 139640 zcmeFacbpu>wLe-tIra499D3r;%ud*yjWeqal6Iw)Rv@$rD5ESPl#m37Bt!;*K?DgQ zf&pW&feS*&7!hm?#w25dF$NoxoN>T7n`>a-_f*elS3>vmd++`A;N7b2(_P(Fr>ah! zZ=F-sGqX%!j5$Fxtf_zIl*uohpu3Z)#1)LWT+?RF9Gr9g8zsivO^m6}pFXoxo_yM_ zrx_C-L8&=&`j4Bt^)KhFXUunyG3~p{*Du}lyW_67f-(Kq7}H(3{PeBzw7dI$$yoe8 zl-av#)9Upfbhu|S7Tbz+=jx?fHZdKbBmxe(Sd9wVQiz+0U5x_fuAG z-f-Htx6foM_I<`Id)94SzI63P-#CLYYb)CK@%p9PHW}8ckYCt~^74kI>sNlgYxicf zM@D}x-L!Gb)@QDsJ-~#YZDTAwW7Fo9n;d;lLLQOpk>_1Tvcuu|&&So1q;daXK?80u zcF*?yES(Rm|HZu{`#zm#zRo~7jcA7wkTRG*9Y&k-Bm4gIWAk;KQ|%$0)aTM2&}B@| zPGMSch5R=)5=v#m#>tUZdf6&Sh{to{B^mxQfZfuJ9+u$jaxRZ+A2@nxOvmY z%}ckQym3QO9=~p#Jbd!%HCwmH!z;I}+Pg}Qi^Wk#U+I{5X z4=B9_Jmh9Mb2wABmZ|=%Tx@9@y+v&0lefrA<*l2Su2{K#>E=`9jjN8`GtH56dK&Zw|oG!(klX10y74c*| z+P4npVcc8I*5KI|o?40XN|ZSrbOoEkuc?h2a10~0nw^Gn)aK9DS3N2}aUWZv{(MWV z9n^Z6WsboqdlV<79i!#S=tB!@J7%tWYh~0zeIiM1MSGW`KP&mjY{rx(a~b_Vk=odi z9lfS;KKY1IuRnVaPwLl{Yb6^y=6uwTcs@4o28{lgv?iiy)(mMTYq~)zho4Xl8^Cu= z&ZDlEVjQX88_?VFkilk*-Udix=~4Mc_40q>h51cYn>}5GTui_L96Fkal^~FHsau%Z zJ$k6tXmxsn(PXxWR>@{}I9+a!*XIueL*YnNj>QwnRJtLP%{Ar=#ZpsqxuvzOy`!^I z?HbqJ)7v+G!o>c8Ns|YsOdXnb-0{;-m@zza*6cYa&Yd@Z!NNt0Pg=5+EnB`~<*LrK_&qbZjW4;}o*!{2=5(4&t% z{=~Pw{p5F^diuN1eDB%ko`2!R@4xheAHK|9`O&LCe(fi(zwy(bz4`OE-hPK^w6NIh zB3K$7yqN96dBU~A?ZSRxMD?uddDUBLL9JFB)d}@>^-lGb>f6;n&{#CnH48N-X|9P} z9QjCg%Mm#)r{yNOMXt)@)AVjum5zF!h@cRUeA~QNe05sP}DX#cjd^!hfs2hgQ6SX};cyi_nUz z)L+pE8mnf8X0c{hWJlyS*(rNvnYW@WR}Q!0D`>^NN3>!=trd2(!hg6GE6|F2YON4H z)cgmwd*qjljkwrd?8cFujD0F0HH~c>89$Qw_%@`yq#~dE^piI}dHs{0d~(+>&6K9_ z?#1u!e$V*sMely}-kf*Oc=wyQvkOP(yN&N9-dX$3neVQ7cih{1-oE2)_<3*Ng=6d6 zr@npC+oiXg-n{kAJwN;4%`I;(vV9AF$+x&_UZ8M=YQlS=qaJvAf@)1YO=r~s^$PVG z_32~p(Y1Q5avXghcjqd{XP@9cyg&ps`wFzk_yDL-H@ z!moUZ{T7q`E9{5tWp+QN=MUI5?8od!>{U$a@3TL!%VB&@#)P+?PZqafA~+QWVKb)2 z(=ZX7&dy-JW82tSm~hT!=dyFyH`(p%JhmO$d_Ma<`y)Ff^a}%mN>B?LLCgNbJ{Bek zlZ8QH3j2h8D(D2gU|=J{RAES%CLAXmFH9GVf=Mt77U2Y82Ky)bmoO~M6lMvtg*n2B z!dzjVFke_8EEEBGqEmNvb8PrK)AB<*F5`m8w;$)v7hBlT~X~r>NGc)~hzCHmWwMPE~DIZBcDi zou)cnb%tu2>P*#HsZR&s>gB-AO7$xBYM|$2^;-2Q z>UHY%>J93R>P_lXg=>Us)mzo4sZUp*q28uGlRd}|s5*sK_6_zhds?`TJ;V;O@3ITn zci^G_L)fi8i#^V6WPf5$v9Ag@2{)^{RO3|LsvcFZs!uguH3684*5YKg33~aY>Lm3z zwC@h}Uo=ZKdo)jK-q!p>D{Ifw9@2H{-qaWLcN>}vrx?w~>x|zp{>9X0T4B1!>@@$| zvc&Rpak_Y$_!FzndY1Km>zk5KxuAg+h-}Ui0@3_h1 zt{QjOxIcEY?kU~pc7LP$_dUU$1wGgHe6{DBJume9yjRnEO7BRYqc7QaS>Lb53*+0y zpFIAt36%-+Cv2Z^&xC(YR84eEY?%0A{{#I`_5Zm4xBVXtY#g{`;MRc$2cDjE(qz}< zhRL@~{_3D^@Vddf1|J!Gaqz<_jZ>CRxpvCqQ+_z*y(xd6s+$^^TA125b>`GnQ_q}w z<z%i5-jnmy^XJWf zaQ<@(;tN_9Oj&TpfOK9kPy2i04u%>U#;F_PU`Nf*wuleiAi%$Oe$^Tqy zTN_*3v379ng0&mhesapxQ=T|wWZfm}u38^of7bf%tbcyP<_%|U_~FK`jc0BA{igYw z{2ps1>lxKE?%&q6?b>bow%xJqo^3C0dt=+X+kSWEyffcE^EYRC&RTTV zuCrb`JA3x7vwwBYN$0$DZu_}C=f1Fg+V*wZAK(7n^UmGj-f`TH2hUHRfA;yWUZB3f zd_mI%ofqu8;Q0$)xp3WuTQ9ut!arY>x@h%9PhZ@4@s5lCe#y*Bp19=IOHaIX&84qh z`qrhtzVuI*{^PPMF8k>6>6fp#{DYmToyYGyd*?M*B(4~|V%-%_Tv@qt%aw0@$?~PE z>hUTWmw&%{-ql~e`Wsh2arHC1bh`$2J#kI?nibdFey#D^&DTD8UF&r_u6yPBQ}(RfbK#!dd+you_?}nx{BqB~Z!p~u zy`krZc{i-R;p`js+;IO5-@W0r8~${|$X@T>?B3qJv-hsvd*NZ>~Mjqw}%Zk%=FrW-H6@%9@Zy79#ue|6)>``r85_8q@(<-XJR?b`R%eUI(? z{=Q%A`{*X~O`)3#H}%{!>!y`AopaOmH$8CEvp2nU(+4-Ro9#EpZ*IBy_?uVUeA>-d z+Zir$?G#?bK2kmB?DCX>Tv&klz?C`yWa@m%!ieVI^l0*(7 zm~9kzO{fr+Dy*z6@YhhMjgoZFYBM)k>8hatoJ1j{WJGiAN(r8Z?MWoIB7l2196qQ# zB5HcQY!BJ3@cm4vy?);+ZY|qwR-08s`^2*77i|eKAr=l6$^`+!FpD;8&YCOR^N3+{ z*o?l~ZK6|5JA8HDNtB}_K4ymhO|Vil}*d)W#ZBrqUWt0O6ag)MJ)h6-`J zJz9ViY+}+Rh+>liV$S2Iote_H;Ky94bnH|>-<{0^yIhhmG#oVB7PCd+nYcKPT z{D=9N57f^BpaB*H4RRV{p^^V)VHO6Bun1_B$)GZ)F%}#7h{ahPG{F*}NtOalu{3BJ z^xv$3HGpPV1~kjEpgGnE+6ekDmS=g;0xN(PSrN3vnn0Ua^Tzq2kj4s;yr28Ck?+QWK4ds*+u-&h|T4?3RH z32XwcC$fp4{j7iFuWW!#0-eMrgHGmjkPYH`3Y#+W7rY0U3OdB5flgz`fgZ={@$C4K z57~4!9rOe?19S!(1|0_dGq&btg3e;IKxebrpmW%XpeM4qBOkE2oX%tOa6O;R2VKAx zf-Yo>M*heaak`i-#x9SEfo@@2K)153pr^6Z zMt+Nx{pp}*V8`XRSl<&plbs2A7CUR?H(2YR4SEhc7xY|Cx3lfIK98L@@@uU9cYvPH zE&#oNT?l$1rx&q{Mt;REW*38A!Y%>5lwAgT8K;-C%dzLPlkEh(f?WZ6CHoTSm)KRH zSAqV5UCpir-Nkl+Uc;^dy_Q`EdL8I{?0R-R=x(+fbPwADdIQ@Fx)*y$?_xzrbRWA3 z^d?SWDsg=ayLIFp?3fV!GP@1*HcoG6x8wQ__LY&hu>*4_=$)K?mEDEwyEwg@-97Ra z`x^T?=+`;Dhuw?odpW(2-8b@c?7Z9$dOv#r6#ERI`#F7(Jvj0vJHQTrVg(C&kbMIb zt6I>9L4Stbly8DQ!VZBRVvmA8${quK4D_d14;lQQ?I}Y4-VE=)a54?N8^yGmL52z^1rf+zC?a_WgniHL)nm+ra z*{Y4RgfGu}V3umeOs{5mrbjb#*sYm5Wmq$5N{43hl(J?J$CS2;W?XMs)7{&x>FJGW zCiaFk6MBa=<8k!i=xr-&$}KB2Ep4ruw$@pi*0zY|<<@swKWtS$GV;Mg2UCOXkBq$g z&_P=Q=MVbCgGQ*l`a_pIgl2vC&_g`OfA@_%WK6a{^EA)Qv&)-wY&-6W`V#@@!%(hI`xAeB9 zDrtdGaM?9^S4z|9s%Ua9rzY!iYoe}*CMHkR$gXjk=K}+pKyb1q7#ODsxXKzg@;T95 zhby457l6QsiCOp$)TtbhxYNIsOE{GsQS=QRQ2dkRCstO z%Dy=iefp_f^vQ4MqEGbAc{~<<^iVAN&4*)A?BR>p$``StZ^6dC1^fFJ+v7VPSM?p* zaY!XS-23qKhtGRhBRyQg-!U;0vb z|DK`Yx%+p7=RIOzL$l`Y$7bJE^Y$BtX4WoQBZVznw`}1TN0I&Nf&IFHHB0yF68&2! zVWosM(T|J$5?xD){zhTHYhcZO7p^|TWJ^8Zk@8Tfh+nhQj;f9)sV!U4qQ*W;M|(OI zbvi@~I+mCBt5XAsfyB}^JLQ2j^3Fv6lKw&-y&LEc#$xjdc^S9+<^94Ed0_vf)7SWR z4p4^uj>i3})Bqi8_xD|~1Q&_^SS*Go&e10T%9UdtJ;+ek8i)%gI+m=F_iIp&lOXQY zT0qa%ECEgQqXEafe?$`}B_=J|xpPuNp0snx&ZUox>{ynNZHb)^4h`+xG_XY8&rZOw z;Qpgm1ouz6a^8O1k~KmVJ)=fU8lKx5jM-7o(9FcpjQMlrft^cgU9a8g6gSH)B@crL#Nw-hG#M zRM)TvRBPEZ1Aozjw>S7C4jt;WkiaYSuj#I2PisBwCd18axAtYWMU`fEs_$Umz;PY! z-;L)#QoYZvL;6OXKT+Q?@(bL*TSFo2f zTXFwe$n!DI)7TcxtIAos3-`9MOEe!q3h*+Br~ZAmPonhGYay3@y4Kp*AypZ2`_9Nyn#b99aQ&G6Id+Kd zYu;pQc{$|68!sxqLEXT5@a#e4?M5AQa2`k3npU<*>tg=}Ih=*_V|ex$?>F@w{iZ(G z`m~AK&)Y=pI{KhCqJ3izwCOfgdE^f`{()=l;kHrx#vIhHBMyv{W)2^tFW1KFK8(pB zy4L)Y9m3drnGXHS>>jO06^5+l)7a_XWmb|sp52c0>o_o`f(7N)Y2)l$IPZogQXh9| zzs^oYdMEhafa6TuJ4Jsd`t>GTg!HMTd${)_9G74`evb3sP`0eiu)A>Fk2D`kk`=G> zYPL=PGqx5yZ$$k!s_z^56LfcvDn0Ti=<97YUiWdCW87808X+BI81qMQJcSQn^=nl) z(09^dl=~-m{L_+0n`ta)9O`FWbKP6a@a_is13jcR)DNy_q-!`xFCd?G@ck3cJ{(TS zEQWId$5I?~a6ryNS+gCVUz)^xsOJ*W8PZMC57G_jyjAmSj2qg{`|t*^0Nq5tAR8f} znL`KrAsy)dy|v>?)H{ywLOM(BJj@%qMS4v-R@ZORd+Iy&lk}^8=GZH;b<_rqLFifi zOt?cI@8##k&>N)H_oC0hA?aKFOtK-JBRmo&YUgX~?IC;;M(SrSL()rVGqnZW!%He>5YI%ObYVI34-_1^s=WJ)nI9^V_f3Yns#8 zYc!{+_Ap8F8oO5Y6LujTxPB1lP4)iQWpwzA@h6k8$1s845H$IO8(~c#e66&uf@lFy7zc@+A!a4{|+9zQLpAdRUHidD7Wj zlP}IRCqkFz)b&fX8e>$`1Hv_7vsMS`-vcEP8>H1 z`x)sz4wVCEhPw1R6+X@RPuQs$_~fYt*Ls}sNkz!$MQRJT1-I3(2z{vA0Fo1)1?uy^ zwwZ0_ScKfk4ruZ59n!1XeBTc}cnEzZJZ$IfrMaDSN14-a(~6jwCW3&IZY)UWfR%mH?lp@%(ZScv@iyoG)d?rp|#Gh1qyg!5f2&uz}{ z*;dU{?2!5y^!FoXBpm3Lu~to)jn_t@GdQ@6{>8%DYmxRNO?{^`+0sc0K1sH^N7+W4 z$6-D{qjG#cJemRI8nWjGnIkfy=Yv5zRCrj) z|Mva=VXmsrSvY4k--W;PKjf>;NqcJN2gb_ff3N>n0{?%OK;7mZ`#kdNW8cR-QlC%$ z59gz8c76W&Kb`9~_^?I{jtP<%Ci?TTMs1Wz?T)BffO{g7Ti%`*1wN69Ts8t#(YS1IMRtqMmZwz;x zn)5NBIf#^p>M>A-21GQ5PKfkehYsj8lr-w}8bnShjYev9Mx{&CBr`IowPuJ5f4sa> zfx?SZEuJV5#guA{3SV$lil82J1m)3dorVNUX%$$Zkwz7Yq01z4H8oFf(2^ka_(MW( zG@=h$G+3wAQp*u=hRBVO49O35P=8G(5+CG)Tj)71z>o`!?m}KhaHS@aFu?(o2sojS zkQVr$Km0MqjRuKoG@3zppt*n~N@sdDCe(X*^chV#B9fS>_~$&(@E$83+5LLg>1#A5 z$;5ymt%2|dZ8vDN8b#e{%rJUTW*x>4w2nVg5{x00;OdMgI0K3RuUfCByL#Y{MjIoc zg$`f1pc&8XtWdo6>xokTs{-`Nb0Zk3SA>q$L z0M(iK6aWsyO3^54suJty(^6kC4ImJ{6t4A55Enf%VP4UiAyS@(=pYOe;g2ALK5-U= zKLRL;pO^uEXbwHX1x+*5bo5BcPLSaEGnX?QB2gUvoAPg8*QfG_@jR?n|riMQ)X*C}xup~=K6D|*Y zY>&bp-NS)T2BDA{k;a%8fy$eK5TvO*ak4-~34fGD0}Vh%;LlDy2SB9hmBLv3)eG0o^niy-0gb^9wADRpRB)}koEryrO6^0h(!T{G*ZKfoQgkm3|F@#?78|gmJ zhx4je)ZT zZRP69Z-E6@e2zbGCq1HipqQj=WDd}7>K|_(lo>XU)Dv|P{z&Vzl%@t!V@Qc9Wrfme z^kNNv=S02b@d*6s)e2Y67hLO^M5r@bU@@BvT70Gsk?;sHAaEHOO*)`b5tk9& zg&;^41W^d|a1M@^})v9$a>KRQ2$HE`C zZ9D^bqVrS_6ce|(Rvv}|SRIW&t9C+6#Yc1CC2mcwh zj=>-2TFWG&V;UpJpH9J_5l}K1(MXX%hc4^PCJQf(0pL<0@F1AYs94W)Lkt|DKnecF z;15%#4xg2!{CI>>#+AW@G2|@hELu%K7$i>sqcNjOiO|rE;ty#Be-@q<4uEtN{^&dW zN8_(9ilfh*{}}TB2mH~HDWNv>gg>j>3j6^?M#+Tbx6w@atLGzl!3{E4VN{?dm~UYx z%}_!!jEo6ON9YC>g>*4cSgEVE1~s9FmLABDVTAG`Gcsa+=Yfwe;cv7Ot_si#d`=ol zMIYLRHwL{k(>!km_|XV(!80^NvKp<}3ZQA&NDDD!)M|8Yn$e+aS}n?=zA@YlYMPOF zE1|qJSx`M@Bc>cICCRAMb8`Gh?bI-b@b^qenskWVuu+;aL9xjb#uQ{U*et-GL4u9M zUyT))D{&&dHW?4&56{6_;mY}PpOSMmN`ya?!3rGe=p*brP4f%_^#b3!)?3ULH5Z}@ z(+dOvS@I{qADTnCAO-?0EF6sl@P~V7hQWljvd$*)GA6XrC_x0o11z{e%_b3_yf>Mw zWWcCs%|4<$;Sb%0e+r?IXM&-_W|N2kp}bZb&O8wAP#He&fpy@KfuweO@Ta$!Y-TLkOcvmeul+IJ2#T{NVZ@+w7Jw5oCZb+!eA|YBVXfcXFZ!ORa z9nwe;Ckwt}BEe(RSm32<(LNN{YV=;}A;%xe0)nKjwZQSmF@vhe!!<~#$3n2fL;}OC ztx1QP!tn=unW>A1@keQ1fkmXo>Pdul(O}jZY+6(bR%D=g&rk)ARHTkSJ)VQJ!j^Vh6#!yVBoQT3DcP25@5s9Y-wLl?YWpzkXd2kZ#Hj|C;hh~{+ zV-^{)*W;sk1u5QMK#<(fS}?-!U{k|F`is>g+C=q0+ZE8DIF%*oAYc-KUrGt6rVbTQ z2Y8x92&a%5NiNC0g^XMh}0q?v$hBBX5s7BMaGiA)r!|BxB*2az}& zGz19H0lNwF69z+JK{%9buz(m#lt5`94lF4_FM23N{waD+k7C2ihYv3e0>}ETy^sL}cOHX9P zhGhUs#eGX!L=ygRyB17%Re%jZQXrF=Pu^4ymP9o}W!BZD15M%hgNaAP{yL(9KQO1< zvpgsSh+j zPA7~jNd;}AuY}@Zy21)h-19&evDt-8l4Q1;jA#`Zc=Bd# zs2erfT{Vy92>jKhUOSU$j}=K!V0$P96<-ipJaB5 zgg=Szm>ia(;;cEK_s~4675FnrxU`DkhcUz67;;c%Qyclx2 z&oe?-l!cmdhX$M<4hPCg4yyyM7d06B23TYQ&w8XKC=fVVoencLJGENe!kY+=KkT&z zsfS4M`2x!IS^N>A!JVu#)ng_6iHP7rWnp6IIgAPXQW6!k7n>FE;IIiuX^uad7cg;w zn%p)xh9)O$B>vD?&Wc#j`c;Wz@JE~#uEdwPQi`Gj{m@#>4m(=pkSHPz+lEFuIQ}pJ z;j7NTAKG9A{vZf61HHA_2rO8!qf){jRgUi9Pm(A>xDjc9TrP<^$nl4s19TG2a2OEu zS_C@n7JSWG;bMiCgW8D~CQlj$8~LXuvO?HCsFnDhJn%>LNETQ`iYQJ}p;ad-HNXUX!SqTnHi+B`QkwG8S_us$UM3H|BCj{Q zbnw7An1~fuHR2?pfYky|f=6s1L*zPzE9VQYl%nXgS3}V3ahczRKbiqciMc%pGRD20$fvq;RDaMHg5Cnoi)( z=t9>ijXg%d!sWsu7r!}ahmCaTNQhPmd$)FQ0f+%nyN&QCk|ePz2jnnc(L8}(;vOxe zVeEiEkB4IxCQlME^GIMx!$A`oa0qldtk?#Jbbw+T`KJIYcmd2XjNCuP+5p^XjiIB} zB(C9rd%2aw%tD}nG(9F!dp!d4C84;Z4o z5#SGFh9w9s=b$oB8y*O2c!3A}jRpmOqTB5jMZ3%HMxA&FEx`!eF*6&GMwM6_S?wOT z=%#rX(=eGQYAaqC$cOQVvPa?%+70LcGZ<}=R+wh0$0lOkO1u3iPG#ZZQG1}pSj^ED zke$|Dm~O}llGum|YytI@dTjPN@B+-@)r;8j(JQ}xLkuuU9FBGT!GDIZbqZJFOI+(i z;~fxygz`3Yl)U%NpTt4#tromR<1E)BR~Wehp-u>$^JEk%bD ze9R6o#4-W+bJ7Hhyl($k{9zG!O#Gpt$BHDVvEd7XKZtxxbcppxgFUJjho>Fj&lB_D zovG2}u=;GkpVdM5!%)=%Uo2TX&}h3A%8PXX93}#TL?efp6!^pJ$(Mwfn{{|MPN<~! zYZy5UB}@!0=d3i~JP_76{>UMM5>bFpM2E)%pgY`l50*Z-V}qt)W5A7%Pa%y2akBe7 zRuAD1)3B9ZOd=!j7eiBMM~2TAFo9$)YQaLU)v&>#s4RKM9*>8%IS74NBUw2VXyXGp zfIjR@(oah%_``EpK}wTTVX-@4lHmfNxdA88VDaf;bUB!a6<0N76NPW2&9%6yRhv@b_=^9PP7e7@Wkmr@3CVB z`QrkRqpca-z}gXrwmPt`bGf zV1TS%FM#g!IJ{W;;Evr%KBv=T6^%$cp+Ml|@OvdM&BNF>0CEU_5?-z+Z1AY~n-5?Y z%0=p03!;wv0h%QcXoYFPl5Dz+! zMtZTygkL;&S>O_2+Yw!~;~fnI0a-$NHkT8aXz2JZNqCQNC%UVgZxv>t;EZW5yUFP1wJBL1z!OR2ZP&< z4Dd|6!P<&~;}4rS_&p1(1CI(mMPDUlB~Opp?}CKAEVx%pB) zjz5qG9BVL1ntaVh|yiM58m(ON`Y;_&%U*5!5jP$%xd69xWUUc8Y;8VL!UoB^NY zBm7|+hJ#3ZeG*<~rw-!}*aZZS#2;)wCK$9*q7|m-^ZB5hm`Z56LUB?MxOk)u3jPR; zP8b`gJNH5!k@yG_!3u2 zQS`Ya!k^dcl*~RCML>z{JOalb900e&1N>nQaNs?K%VC2oG237%jG2<~hs_kop5u>h z05a5nmqehzHg_-p;bF?8Sq3wY!|uQs!a9;b9d^Ip>9N`U1Zkky34zf15CP5$WDG|b zd_;^T`Rc%*hbCC$^@X^X3V9Ol(BuEbAEa>X$cGwpoe~v20R{eo*&yDTnk^oC*o6&D zyN6!az<|^Och;n!!|8O}G2UjVp4a8Jxt$KX%Mo0-14vN;dY04|PJ@^Gxy9i!V)MtnKhmBBh8#r)Qe120F zaa4p}T~MTrO>kDY5?|s1|=mwN47SGl9lBGo)jx#$8=fi|Q(dUS|v6^@I zuoutYJ;8_|aARQ$L!&(oC@;*B&FAsjy)IIMFxZhfp&1oE5#FmAO?G35%8`?1_d!kJ z1Cu#(c)YZ$fK z-U;%E=isbx<$S@Fcv1}e9CoA29u9dOV%SF!+bT5AAYhT}aC!W;fF}SK0A2K8pT_5L zdOd)X!{zs(_prj~87_=KB;-va;qy`deGadU+k08|VF19u=5d4^9*@h7G2|?KE{{7B z@djPk21nDeqvMr;bCM+(Suui6hdmY&30D>CNMjT!TC%&G0SqPdGJw)9 zpPyEB2zDZbKNnpfD+1}Mq?o0 zBzRC;vDR!xQ@E~)e!m|OBz3I?hY`lpF8R?)rwg62+wp&jTz;2Gx1ohD3(3Xr_M_cS zC^I}m@&e(NSrM`Q>Jq&$7?c;f=%Uvn;AKyRTwaSKZgQIOk3hhISb>4d=?8B=cO>ih zgZ+k6Y*e^%zTiqcDav4J@;IYWzf+O}6kSfVp8lDVtVb6-KKu^3FN~K6XoFAmc!EB+ z-{(YcJ)r>LXmcSqESn39WHio+8_odWioUx102{ValZgNZ0Hc7ZFzWL8JU)yeXA$uD zys?-+?D53BD2^Z|eFAmNYpzLmh8 zHAf5@?RPr^eo^u|LQukh7yP_2uqAg69v_@8mj!0W>@vzoVV6yGyD+W7b#VvDB>4km z1`!Brc!6g$lAGv4Rs;t>T(Ow!b_eA^46YaM_<~-y!x5BS4iRan9dQaIWOt147X)_; z93x}|{>olA@JaR$*oFDTJLh_E8ey;PG)tg1Ox_L$e&o{~aEo-?Ye#XCjvse`d7#ha zkN`$^z~!|fa{Q6lD6caRbdzTqK$Fv9m(Suznq3x{NpK)mVBmHIz$pL*e)lN;$X_rj zTsdEGtq(>F{V)NBz?~EeQiOQWc{DPnM<2ZYup{h`7)gj;Kg@dwZS&J?;|&Kz5X9^&0)8l;r8-l1XDZnvzDy7cIA4S|C1~xh1iL*FiMUdJe<192 zheI}dz#R>RJ>h`g8}z6AUOy(l2xe65+j*cHCedR`dOcn*b~C)5hzG8c-5Wt^ZzxQw zIs_*XdQsq|3uN_rVHkWkys1>u=Zhr6Db$HO!3beClJK}Bq$5E*^ZUb@q%TD;La?au zitvh1953WL(G=8*0JjbBHPzaWliNgdl0A&wRgV{)ak)~d6uexUpHEIGPI7_chjx41 zCb!vb4|zl0FczKxjjf`6~8nr0RC+f41 zOq{Vm04j{mc)ht?E*J|q6j7mg*dO-GFg*UC-)lj1MuX8HyfO!(Cx9&rN>grMEFM5l z-LYW6+nfqSC2zs%mn1)Nz+++%^v41e<)9pN;Qcj4r!@?tV^O$rzTiqJ#6T_%w<7G% zWnzA3E>1DvHwS|eG%^Px9}LSWZ%R&E!r=(6u|`gyZ8C5Z2&du>G$&{Y;srx6V1Y1U zVgv4=KM{v?gYh7c6UOFOsTdCjWQ>9@8q5Y{IUG&MU=a=k;$b<`n2$At!;KL#i2;Ay zL!%i+@qowePk?1A1wP&cxMRtIkH)0a7`dR&m1`!)h5~^m?w3P!9+f-4BGDczDxw;t zBql2UIS)X_n27(cT8lK)a;P2y5H*kZH!#IXMTWO(?sT{ug98~((?>8cRJGuCr_*VF zF)GW6a3Gm*xaB}YJQ+&L(NH{E07JMNY3!T8d<0>7EViJffE0W)M>v><@`u4P8kNKG zWIV)!kH&@Y7v@P`j~^6Au~-O))5T;Fb%rBh{L@2~) zLC79Pi^E~N#XTt+j*_l9=-(UyzEIbC2w0*%+2>A%Limrt=#1ZAEEdDbu!C;P&`^6c z6b&U{cLCvmC14G>q1v_?b4d@|%Nq$!4iXnhQgESk`VXd>g! zCUO=GL0C>WWVs<8NhZ+Zkeo?7NbtxVgcva8gfYv)_y*G{NH?4cCj)X6TRAN)X*rYt z1K_O?N+jfXLjo-1P$(@YVx^{JE{cC14EcD%L3jq}giK=y7pEZ@31zb3RKVX5!VKj1 z;R9;99A>(3z*B6;=}h&m70-?V)-OTvXMvt|CKq5(sHVSyh?-s5v&>|nJyx{njmOUj+V>K zvYah9lu;+{B(n+VZMG>AbRnHh;#oZ2(AF%MX;lNKD(aBEUVz&ndZ)$lFQ{oUa5pqG zz;lz7<`WG`_;1qzZ$mU1iA2$vV6a>+%MDTd6Y2yaisQdPM;hb?IU+|w5+dwPN^XcG z+zI4~V#|Wk#3a;^jiO8bj2sPC^U;(e)NYG791(CJR>VM#G(;(;@vo?{_T|xQPej03 z;YxgoE2StlgQXOYl$#nN-sUXDXhcNk(a5qH&5x(^!F;+Pkr3l)cOsrc+tQJEG#bxm z-O*@3mgH!}D@Wm^%MpJB+gFin7Sffoawe3BV+GmSkxfL?n3Y1PE}Bj!Qn@r(B%;x5 zJe_Q9Z79YQt%*o9;)_Nyu#XYg#|XOUkL18IpO-V?U=G}U!2n#PVi6-JhkWHOj1CWk zyG$gF-{r+W?mjY*Xpa>YQH@d(6czuR2Owii%tY#u209IUqQodf%_Eap`*1tM%RPTS zUTu*4{&=2t?=V!g;P>bA`EYwGmCnVZxvbZpiWD=AvBq>NmPxgxVptiXD3m`Gm*J{P zPFZS;$Kd6K+;JKI_#^}ioJZ++rZJ<8Oo&c|zc}qMAS*(cAF=lKws<_>-q?;h?MkM?R`Px019h#3h(xoH zKNpM1u{b&t4!5_r!_D)iLTN-4C+Xx8If8IRir6ClOgs~BjHSJ4AC9agB*p`pUwv^o7 z+8Fb<yJ#6ZkQSNY3VF%yjXnzrB|h78D3H`B*kd=epEuXJwB0ELB7` zN=Zyq{Bs_Fj4?4Et4A8>Y_cAqh&8n8_q_nMx*^!FFRQl}aSx6S#f=6fubvo05r0DqKt@<%uoHoLla3 zCfqQSnFO&S2B}0LNim~GBMo#uU5`mD#(2cP@|?J8BKE8T(T>K!W=AB_*x|!gBWy@5L?Rs> z9jS@MVyQLP&{_^himA?WTc)j4%r+M%6thLRkR7l%FdrFTF6Z!O9OH9YED;icT&5#~ zsTwR%I#+IMh5{fYh|oeU2QM>=throc61Aloa}y_yZ*1(C*ftS$;!bl%sWFx6=*y-8 zNOv^jS+UqQIH7T36sww!j!f3q7{NY8BR)H@s+a@pXfkeVYin+9cGNr2*qC;ZOd_q> zY$luQ=)n4L;>3xKt+{ZKiwDJvnPR3DcQUz5%8_!VqUBsU*9N;&LY{0O8)(io=ZHzV zts|Gk22opME_Hl0+w4mXdZ6GLa3Dz&gIuOHN0C_Y4IFIZM7)@2ytI4i%w}XUOEMtw_S#E4AXA0SDvDy*N!rD4= zxl9zY&%nos(~V3=2c(f)2t?xD zO*1-N@pw}=w$0*AheJHx-QArXYH4Y$mKv*_(RgdFx3jCz)!I_*XqnnlY=NKA-PBYl zHIxc4mF_^^J*8BH$!v&}^4dQ8jhK8mz zHFZzz8bY18)6w15l+AVz7PAqgyF2i#rKRhHsZB%h8C~7o`C_ms9!K$@E55m<)WU6B zw5zKN@O2;VK~v7%($LZnuNI5>LJ6J8W`~A`nyRH}OG7IninkP63f1OnsZc89+&ND! z-dXA_broCXR=K627%4_NN*yI)lI!X&71O0uS5ql_;`m}mFgL?j2nGw_z*&JosZcFZ zBoactEs6SjU2L}7cHIRGZQNP z*hFb7wRA>XTY5X2yE+SiQ_J}7Xt9(oxl5%y!~iF~DW9er`JQe_x71zg%C)s%oj7Y| zcWbe;rKKg;S(;Mp>}>787te5tjm*i_1- z^1b<{!i0%U;~KNQg+eKjZNO(B1_nx~DVG?Ui_zhMK+|2UG}C!h?)-{Gd#p%;8XHMa zRQz)ux{70Ccd;I6pexPwScLaM5&w*u&D=f{dseY@f7`rqo^-mcKa!55VMA&mo$l}N zFU+h|s(r0ZeLeAXwK%C~e0hAe($ZZSuC!FJRoUOxR)+a#4!5@X!p*)JNVO&!V{Og- z&CU5Xute$Bp7GtZqfjn4!a6mRqu9oiyq*GRp{-@+%o%NM{lnvDqE6fy*WcAvDD+P+ z7h*{Fk85uSr}6V#lP97KTpw(;d^qME2Q zw!~Uu-EG}%m3$>%8sFbqZfwm?XlpGj9c<~26z2uY;cz)zDRWj}(AwPBN|9K^eM(G+ ztIgo7a3#LPm3Shy4)?b-`zz()>Ep}k;eLuO%^q|fjhyK~^D8}rg(S-U}QwE$WgZ=TA*2XqpYfE#wt<~4u+}4~c!}vD$_xoDW*VYN8Y9$^|FIw1NZRx30 zDy5#*87)0M)ozSoPr2IC(qHNAnseg#X_e}nu5wFrLu>PdJp6~&YFoLjHJ@#s)ZAX4 zGPP|&sW7SB+}2QN^!dWmroq8zD>ckqiqYYLKr^x2+d=11x$`R$?Xe;WYHTDyQSr}t z05ZnJiRF5vq3-Rd$ChR#w&GvCFT8Rg!){w{sJeWjKbNZx#qj=()*ed8R)-c0E<~NxuIj|0@zrv9Xl`dYiS*FK zt}bvITsFVDFqiZDhlbiKu_{_zt;YPhD|@TG)hhNr8wLjl;ko%ZUrt(my-mGMxyhZC z_Rb1AQ!X!DxUf38($L$~hghk`NG_AdO|EuSJ6e1#!Is=Wb)Y)f+1JpAJe6c6Ik7si zN=#Y@hbo<=YH>=nQa<&n-oF6)~uGOs-HQ77acn=H$Ni_7`~hI#iv~+Sl9AkXyZSsIM~6+uPeZP@P{H z80hQA7!GvwRVqWhlO~+BWN>!x_>;zWR5}_f9aEaRy4ov!U7cN(=3@JC?OmNShP$S; zm5=M_s5X|Hd_H;BtSV}1ZCtpni_f6tGJ$4l=cH~rkIJ22)m853vm&ZdN`j)|pYt%- zIW|u1tVbH?N!|5WX|F|AWh?fsV2MOSaky{YlwhIIH%z++eTPG#Fg!fmv7&!q(s8|& zcTZ1aYeR3>a93Ab zZ=rX%zkgEi(DW(ecxWX`+t$4>Q{COrieA{BzP^sWo)s&W_4N%epS}Wh;?9)e$$cFi z!%Mn58jv2If@l5x(@$B}x1v}K28V~cdXjyG0*WVt#l8K#{}*-d9oSZN{tw@C?vSqb zwk%o8@?Nqn$s-=R-Ybr5$96oT*iLN6ah4N1A&FfaAd3}30ttK1uu{UtG!$sqZP{O- zlmda$k_uheC1vGpZ2&6{4h{;7$}_41weTnxlB!FqOPebeg-S!EMfM_RQBG5+ zDHJZN&8*F=4wR>sr#6HdLN&pfU~#yuyv!fU4-4gm6HCe(l8V;2OTFGwZ*?iT6uCgC zbWu5ZkV|CPV~^~_nv#+td+e&@y5y?ln&h#ft-QopUAm$_T$a6}jXcUrp!N08$U!so zqPl5GL040+9flxO)09zD)814OZYr%RFRxkBmQh~r57|TIB{`vTdr64^hGNJMgl`4v zhFU}6;@awrjO?*>Z8hah)ipIR-v-K?nra$g44X=8%gftp7S^p?wP5ADJ|*WeY3G z>vwdQ-VxIN*ds=&?~a5}_mYpTSk+35}zkhaIS2h8Ef>7xhzNgW&1pC)hE5(l}|EjGMGURWGN*qBWzHW@L7% zAUWKmG|A+yggDBIMy$x{WHGXF@!axw)ABJTQqqu;6i+j1%8u-Ib({@37~P{rCuVs@ z^(Z7T8Lf^m8IA~02@&px1v??hhi?q}g&G_rxbJiA** zj`N>T1bJw1fzV!~^bC589(ej`>B++Xu`i29m!g1p@5lus;@`>PUDUi(d<`vGb-^m6 zA%_exDE?&`GSGL3dv=Sx=uYz7jkfGYcZogZxl`N$^uAs^#O&eHU~hFl2<92#@}J1h zw~WPac8_IkE8sL1lxepZGQH}cy3|sd6wItrH(C}ZRb}?b7rPhxdxERwL++vU6`7;C zgA3vu0C7e$jK`7bxz94U$C|R#TW|IX4Qd0Hhh}rY^ z7dG$svO{NFo)fq0K&zEn5;V zE>|t5SnBFCpTQOjC!rV`qyti^K>ZtpjZpMm!CN_-HfWW{K|ErdEnS|XNVlfgYSr~x zA=s(z(vE11TV0!zw`Ok6W0G5abeP68?P}$*me$BKTix+OJdTggYc(puDnWx)nw$&@ zwuZN)WvC#PMqsWH+Ikbg z-YM|sTauBNKld}x(3{8sG5z@k=f0;Wo_YAOr+)VEqfgF&Yd zuCC$1Zsx$*cY)u1@WIEw``|avp7Mcgcn#it1mB=1?%%WLfd_W)7USmL0N0M6`GhmF ze+BAUsT%4NVLcD=Xr-!LbFL$pU0xQp)j7h|TN9L{$^D^8cC&m^yVUpARZ>3e&WotLWv=+kUku*&f?2iZxCBTUWHShr7ov^l&Od_`9i81qub#tVr(fC zaKE$0q_!bQATg(m*XsT$krv3T2QJnF@qxWh!dnW69wLmL>4PufPh#xIS+d5JBO}rv znZ&$=-ezEWYIER9ZM!>FFFXT!2S)F)ey*2|{R7QBUHz8Vas`Kpey;rIsxc%0OBf&9vE=f>P)dV~V*B3AA9WGq=z! z#(uirxRu(B$LKNRW|P@~7}X{U8A1$#Egf9c{fUEmy|a&mW2+qLSu2M_?GB?RZ;We|`fPUa+ zl$jYpvSg#z$fjnaLYDT^$#E>RK@bme7qH@?3iK24q6#$1T_8iN1#t&`-nw_hYtYEM z>wfjCb?=~+;ORGGgir>1 zpG*Ks!}y}fiiKBD#kTbJ?@~o@gOxp{Q{&LraKwf_Z-_W#?WOSrTZqIaCC%6ULy{P zU+jMnIiefz6{Pjo;yjwiU%)lpf(cb>F~V9lOoiD#s*h|gh>5-c4LwO38T8P6bRQnW zd5@CcM&a;hsXZ1!g*%a)%J!iUOi?%;gg5AJUcDdv`Kzzs9CYSW@z?ZHX~q=@$uw;K zjw~n{6;TaTHR?nw(RpYWQXm7Seb5HDx^!zQBnRU4kx0lj8L3qpcracg^n>H7{Be zZv4yM8{S;JsBIAt4?)%nQ_8*zYwrTV%hp0&P+CLRBe_=Z(qk68v){E-(;NI{N`C5MK%HOU?;0*Q4BP=r8t|P4UeY zr=A14-U|1;64op?bx4?OarL_}Y@wvL&}My-zJx7O2Q?u_$XV=aV(Zm4ny@46Y;g6_ z5hlX+@}2s=_+|D;LZ740IZ6+5L;B_B_0BOop`W%*Crmq&DX2t~E%znlY6VgnLfL4< z*wu*SE-d$0Ebf~iUd5G&bvk^lNB2+Y2swZ@C3S{~MluEw=n%*piTs52L<0HqnYlFt zB&CPBa#pwMt=?z%UVCxx+e3=Flj}c6OlC&vs;1Q^R?wa|dLHS1>ci=Yi-gKIy$e2i zrsF_m`Id%Nzi5Zv-wpgS1-&n$t`^3iZm-X#H2cz(DZcd5Qf1JTml*IhDr-ztiB-N% z)XjD)JA9+cVc%%!7UgE&L~ydy7FbZd0GBKPs-SFrHqOpYZ*=i_SgUraF_chiv!I3KbYAWhem(QTmBWWawN)kFH;NiF(z8ZeTUI$;ad%B` zD`)9Ug!yd`N_xqEu2p0sM@elqKtfrpNQRil6+W+Orc18Jg3>VUdhJqDHN)b&s( z4yxhu>IMXxRl>Gy@{l5|z)&y5rNuH8mL_?%zDM4kJ}TcPhwx!r0}%%xl9D}*$($2w6)tG2 zLemI^1ryz22XdG^l-t2mH)m-d{>aZN zYMcB?Zv`6C@-w%Dn@8O#E~^Tkc}SdKnDjv5gY(kxZqVivsX}T{sOBI$sW=(%=E8>L z%Dk$=KGdmhakqGeJe%?~HafilGDzYY9kdn)K{VR3d27v#W|}(SKfs_`%L_#x@s{p z{QNk|KX1ddLVZkY7r*}8AM^&xp1M4;E!%BM%dn)oZhAbJmHt!01=j(mUJYEpQDGsU zM+%&T>QNK!!drnc5ry2aTmt3jMwZ54I=SSNV8&1wGm>e-NY-*O^qlZyR9{Ti(cQX} zyMZ0aas(?Pb9HptyZH6lBlKzJ@253v;zO{OZaec^<_7j_DxOM%k+@12%gzj#{fXeG z^;erK601{d{4M6*_#S(Yt39zVvpcIVuif8X*e_qMS#DS!-|y{D-K^Pcn9SN`aNL`6 zmk*~{6h4M_)ah`r9!APd8IjRQ`4sAO4`oSlQ#Zy&%D%G8Y zgWm7k5L@Oz1(F1f2}Vv*)q_M)hoO@sEC>;L-i{*5DCqgp_79>};{0uwU3K!#?dRXx+LnB2<%)%_*3G`LNYC1*uGs$&y7}j4s8i2Ry$dZznchBhVBL_jgY&i3ow5rGW zxJJ&zGwDoea%pBTXJPWf%&MF&rY|mHZL^P|$z-kGk>6lSZ!mF=xp^DZ^T5cwjk+mD zmMo9$;JJ)U_!xMYh~Be&jA5tU?_{o_FgAY)X(+CX zlEN`s@zH5hx4}fLrfTyZ-&Z_-3kaduT&D9Ns`Nc zBT+5kjtxY+BsZOXc3#62sb+RN^D4~1WrA*;MJ&?}Pyt64<1FflGoK163Tq+lBnKDe zgQ-Yno*+lLazTz6u*xU_wMa^(pGY7{Z3YAmLZot=7I(qg0DtVW-6)cbg2>DxcKhk` znG0t((tDdRn!@N2ag(?S`u`6!${wO0lxP?f+-y6C+Bu@{3Ovds5Fgyj2Ou9NHzYKL z#rf?0fKOryFwxT4L#LN9w~;5Uxg|Pt3(@3M(96A2FZ%`E6pd)69k$EB?Ff2_NH5c% zgDmMK>q0(+SuNaSzLzxVr4QvI0nyTp&))aP`pKgp{2_Ml>GSEmvm2QU@uKLNN6@9{ z(nq3afKe!D5PcGK;snY~trF^p%9UiIgVrz((_yySx|D6Vu3}c{2CWm;i3F8=3@j)P z@~|z2fDOxC9ZtDB)8*n^)9}64%*VN5K&ZHwC?qQ$NEWi@ktswVgNU@`%`JK|vlrI3 zA1ZGa1b{1jvbMNrf7{WDL%9otYqzfXd6A;_z5e(9EpB@4HD-MIwI#)azE4nIa#wa> zedmVt)!x_anQxr>l;E;Q&NyX@phuNdn0i;Zjl)_7wmjjrc1?mdq!ldK#U!wh=apbe zG^M&iu8L%w#bmKQyDuRr(VglG`6}v!>iW)l2kico+TE~@A5yQfjd+GqheN{^6P8K) zSn5RaM2Xe_n`s;B+B7D?Y%er1O!H!Sc6LUqMqZZZY|SgfS}?*{eU%~G)My9+9II`0 zw_V*6EdvobK~Qvv5{y$*lDvtqGq3~@SQw%a0$>2r`67j|kgC6b<;3#k;#b$* zDSkCDw9;bTYt~M097mPUKZ!z{Htm`k8xwya3Yc@mKXTXYcb601v;iKz4Ax^A=#JM2 zt6=Umay2pxrETPRH%tjA2v6|}dN&x#CYV4|+_((W0RY7mV+yi~BS)icAVZ)|7Xl5F zW>r)YRSbO5Lydy@3uUC%K@AC{U^CeQwwdiDjOIZFr#7h15CU$1ay~- z+6ah`hy;C;7db5KRK(+@0q{m1BS@2FZ|#px?SC0Nk$g%#EuKO*iv#Q%vs>_o(PS9z zm!LnH&>u6j!%wvdepY2xrK&n`r+GS_Gw8DdPN&Qfkki=#ncQMFWNEdsWHYrPs0|81 z?94LB)&z9_jOG(76m(u#kt8`zaApF!Nr)#{pI)%=Bz+ zGd1DTx_mAHOlc+##?whUL7wv~GKfYzKZazU#xw~SyqImrKK#=I!>3;t_n?Un5bD0> z@UOOQ?K*zRQ%_y-PWSrt`1h}hkM)LNXhMa3;tTIS^w*mF)YBJb6xV%8^jl~lb0f4+ zNtFm*K1gvo4!l-~4PsgmL~@3b11vKR6{r!%o6s879Iur|V)_E`*#-$hkc<*yn0S~Q zXEW({X8%TO$&-EKh&Xa2`riD#rr};Z6%d?o2P{KDIW3b@G`N~TYaWC$%&@Wn2^6v0 z0PaNeX2RIg@+sW}fG%b_s>QpbTaVL^vmSBjk*FW8N_grs_BPK51nnl`a#$1Iu; zKF3h$+>imbMnFTrd-Q&`_|?m~w-hMTw}h6ig{lDJFEBzEz3{eP^`yp`k(xHKkRG~;+!-KOc9Ybn zyM;~hd?#88ivXX-7x9h!2!9FxKd?6^0;ej9$AFLW#i*DMDjQG(U!z=#hLjtrt#Tch ze0$JKpi&-%X(Q*4VkImsI}}Kc=f(iI8LC06-4G%vP)rNlb{&id`rc?nBKa|cSQ-*Z zR1@#%wx|`biruFsmp4P-SjsKvG0njI1@AaO$qdX~j_@&9aYU$)5h5ecY@Tg9j=yBzIQ8*7U;Pt) zucEdJ-JJ?lgp1e$#d_RNuV?!e(*XNVvttTn2j8jaQPP9-1icA}r@%B%F*+u|R5R_& zCB9+V~3&?6@t+D~x z2AOO#hqMTDE@b8cTs60tTaEg;X*9+u!4JUU9@N1R86*dt0QQYWSZ1WQfCv(l7#kTP zgNPUgqkX=iq>&ppfB^vuywpS>B3ty2X!(=Kk9R!D22PP+0D*ZHBtLle*be|Fj00S` zQ>bJp2JWgf#8Givyei(X1TA3~%ledE>MnhsadDh(Gr!f0?Ey3P1bBtjOpgP|j0mt4 zN~WD=?TCaller)*3Ix-RAPbanlop2XX>t~$4lHvbe*F0q>+Bs^(Y^Hatv8BidU^)> zmv$lcx?9fFiL;-4CPtC`x4%U)Hf2!!?GsOk9}Nr*kE~dM+)qA+JS&%vtcnhxL{tJQ z*l)!TVWo!!bC8i-!DYB3o8;GanWCTvNP5~J9dE{ zia}?{rLGgUg4l9VUc21nN|&culUzx@VtIkC$QX1LWHicabPdKDS7T~*Mi=g|cepyT zSH}MtN*J zHIc8)AIr!5Xx=%1@Ejf-(=v!$Bz{I|Mi2%8|0%KGVh}!P@G;;Gv<_n8k=O--xj7Mw zTN_&5Ie4phW~XKYO1toh*9TTKJ+%DzF;x2Xjj*n2I>bL+dGpWvw+er5yXziw?~=nM zLVan;x66hv8DFuClmW|l_4cQ~D$V+1ecz6e$Y_El&7Acxk+<-V`3vv_iI=h>CddIg zujO43_(D^?$i(!9!MgHAzL5f^fXQJTrNINB^DogqACLYSe(gE+G3z-(uJ$lU$#l3H z(T>x-2Cub@F5?%{3;FYm=f%kr)U+8WW;aorK|^+dhD>Wss@3!QF_DB2Ky{Wn#G(np zvNrE%BOn3@==8eQ=3icX*{|zb>yCR;vkr}}KA4^AIgUGT`&-Mx+Q#~}FYl!%XD7E_ zR$Nh8QCWOoEqw{JY~Ie~sLO=mI#dtL%&;?O1faq#N?=TfD1PLF3 z1&0VkA|{BKm+VV&AnE`tipWo_%IK%!x6x1EMsK0FVEKkXlT)9vPH6X1Sn)3himIrm zg`4W=mGoAcRwE_gZ$(fJYJbjr_0loCAgT*X9Dt4-mh4oY{Jz{wR|C8 zrD#%ipdQ@8^sq~0-F$~)2#w+)W|SS}hlnP?jLWC^jfyE{j>-ggm6=lfh&q-WC-@X#&Ux2gB^q|I0YBrI*6H*$IH{@#qxSNi{&x}U=AFHU3sV! zs(`AaS^%;fhArVC`YxR-=IXgV*tlaD^yLVw3z2+KfWV*tZ9*b|)cuphH6Z;_urlzN z5J4gVTND*B`dl0p`~L^aMD_%_5?u#+x*P1Eq3HGaOZ0|*kE3?B1E^qb?+zki4hq3c0w zn~9F&Ep&Hu7=vR4QRl;W$)UA8)h!f&CCJH*@)UW2yjI>RAC_;1wjBj!TPCAH&R{Gj z1}Th!OvYe-Trw6{Ddt5dQKsk21Zim{%g4!xb@#L24JLjTGpLjD)0^olXRl=1W{2q` zPcW;F96h}sTJe>*1^){swTwy-G;AA2TpLVIiUQ4%;B04+aWHO)fs6kY{T9o`yHJm~ zMRvm#|Gtp)q!ywRo`q}BAj#5bgcT?r0xXJ96Y54IXbZX+y!{4>_Q9zzO{jhdf|!f0 zI444Zusr?j15y7G@z)TZfT;VRWk=^*#Dnq0v=iivjwJ`p91|vrC_}A3bU8#*0eg8X06inJJx4U zDz=%%9FtiJEKe)T)q`CGC5+|a1eB0q4Y`@T3OU$qT5!_pQ?ZS5D5)y}S#t$LK|05- z+zHSc*Z{IvgFu@oI&H+p$un@eMg+JyHW8&DMfdT8@QLa6fT&OcPQ4o;l6;*Rt5WrjG{OV>}|n4RsG zJA`&?oGvx_m^LZZm$QG3=m1%0GR6&b^bder9aB#NRrUeT7y(dj6^a8ms4X$)x~p-G zw#h8Gml#$Wrsb0fu!{~CSE+}1D5t=|_S_~rwGV*)P$JgYd7Ekv#8*I{BM@;06C8pl z0fd3&=$yq?Mr=~zq&37GeliG11=WPv7p|&1JlwapMs;K+{P6nYpFg+bK-)d_E#nP0 z{1g{n_Pd4Qa5f-#rs&%hi^X4yU%d3Ix}xazq=eUjTUVX=J^eLv9_68y2o+jy*o!k! zq9((VWLY&A=XTD(inJI`rbx}QnkiulDbD0u#sk4e{Qa3q!)Gd}#b${Fz z^){ylmAYKogfcViY%L3EVZY6I8+8R3bS^OIXcw{@cFvo05@G{~dFT!T!Ov=CBv{ew zj@hRMGmHd@X<+(iUoI~QT+zAl_j!uG<7>q~iZ7weZ$ACU7#U#t@rl^M%3 z^0OA?R`X59g&CDuO}V`&!uD83(HeHtGR2O$^@*$j%KHdT2EZ_ZR_9chWm*n#o+N{f z;;hvEd{=%bA7|RFJM&;_N)GyY*(8Z3X`T|6Ne1{47@dTW$6(?z$!T$5TUT4SkTY#f#E1p_9a8U!y=B5jT>mS~6ZQGsG;tBDe@o~=@f;s7_ z>#B#Vt3WN4?R#TkT{tx@clKR8km&gJ@tNmBWMzC32BHt;5^1x=yva<%2AY*d zMuU)A4*Y+m)n)CsVx7{a-UA_|F=qxb21#cm?$@7<0fBLdNga!s>61f=(VyX|=G`e7=?hC{e+Kg9^@g?&0Pe%oL(q(i*biZykpbT5MAcYOstdt~3>q=< zQSPVu85`=K2FqoS98@#N_K@__P$og0iRTe+iY|KlZPm;SYkmGyGI+u9ndiiAY?iJX zPc;ZR3N`^!E#@z6DUXL;+_i#C9gahB(+Y@8?6=scens3Eg#GTf69q6I?gOECpg;lp z!E7gY1D=E1NkQu83|)|bsn`q+cP=gyV5eV!ewz~&S(%%HSSEy%p^?AM5Y?r`aAkNJ_cxaZYDure`F?s2krmMOp3Mi zzt1G85ipU+TJZ_90q(B^RI^;jD$xXV0aJ;kNmH$>HZ@t~+7Qo}L$pE#szkgt-W4B; zUmwpH?A%UkY*{<2uR@^gcNpc_cp;)aY!JWv(@F6UDDLE+koCF4hpxT%@HGeT!#My{ zy?{!Q9v)@l^WsVBKl6V5X{HL=6rV*ZZKE6J3-euUp|$f znAde!&~i@N_L!^#Gs~_q*i|Q(m4lcR8VP>Z3>Csm{dG3-cTJLBARp-VdxOC4a ziyB)~(!?zG-eKR-4f1 zCb|NP^^8>jT|ou90{`Q>0&wd0bp;6EAv(@~6ZA7n?jL;dMOw2htCPq??HO=Mnz_NaH-cBfs1uCpsCjWwNd(%Tae zlsG7tR@-u#_oUmc8aw5&%Ba0_W^d)1?J662xB}4p_9^HNSA)#mI?+^iH=Fs z%(EI>EUpnSI#OL7kuu)&d(jW4epRdJ{$OzGvXqoHX%_?!OcpOFdSLb7>(z?-U#?iW zH#1{d;DXGH>grJCwJ(%-->M3?bXF!NT6wD`_0YPSZMnX}JnzfFhVY^quh*ioDx3|C zK&$dIf5cJtCdkOD7qV2W4MGfPrA}6^Rw`Ji)(uK>*fH(E8tO8KT&=Sy3PRLRL6R&1E|Mgfl8cvZlhK$p^Q<0pVkDQ8;+RsP zw8?jqv=ZWp0X~Oi5*(P42nM4IH2LoVetJK%WTx-IRYzW!(b?>sZ4D1J%}h15y!UHx zLhk6;nwgchu!OFJ`-AIS#cfuzU{U1Jno5JqSX3R&YWtiV7m8MyYK8pIlBLKAJWHwzr99=nExm zPxnnEQ*tJq3+(~mC1E|pxCOLiS}c7=484YW5Rm8e?M!5LH@%fmtP|jf0%);{+9Rx0 z(+)ZdW#Du=nMq-j+P_bIM75xNnWG3X3{J3J9 z(y1cdlGy;TqhP7+$I2Gh-hbVd*t zMy^2o=t1!l@v{fS4_J%<#0K<$xEN>ST#~{X{Qz!Q2CD(#NEzVG6^!JsY~lJLd6eU6 z85>W>v9+jy?xL2Ut&ndcBV)+g0DW$tY8gz?5PXPLcmz}>2&7=7u0SM%#F32>PqNhI zVEq6TZDeYgA!ZZM<3c&0cLZ?GlzKyOyt9Ziu%#5q1Y-=tOBgdc@$#?5D#*-5Jxt`3 z486&u&b~myU_w9;SYMw(+j;N^E-=d%&_Q`4T_aygx6AwG)AX2J0SI0>#{z;^ehz}S zSLsrQlzqze%4sEwcSuMci8uaVNFGV(n1k@>&t|vbOQRRjE2A6n&6m=_8+Xl0y3qsT z76?8yfoHE10%jcxWR0>;?@I3`FSo$a=)jHyesL^`K!HrH29(r_VCz>(fOVLUce^wc zFGzk1zaJuD0hT=*-4coARS;t^F{KQ`reZl1@UEZ)K|y2AL7X!X^$f3;62x>LJo@on z_xb(z-SzR&gB$luUU%`u*G=x(C~kRi=IVQo-Ei#Qt7l%k9bHd8O3nb|K&~ z1aY20z=C0$iZdFh#i8VIGEPqB?X3w&(Fzld0#k>I)3{icr^0Ro#n5%{LX@h%RQJET z9J^htci;865JJ7r(!es;UMjtqn}-88nA9+wwX4;KD!C+oT{C3SzH<9QrZkk2l>B* zPEtzsNl4EFV$EZ6a|nZ1iYg^~dCVYY-@xhFITsEt+uuICG=JG3e>YCg%DkjMa-gGS zxNPMBP2arY*{0^M@bFKBhh7+brn#}Vd1QI-EB8`o&cwV!vKCwbjvWfcQF|f!b`xb2 zjI>)%K*llsc1S#=^cqfXS>x{<3jbaS1CE%-cI?sj`zb8(HZ-JIuaT;n7+VZfGF6*9r);l|NCEokBK1qK}N&^AA!UY zHCH9LjErykdgufM4xlpo{cUwN|BLQMYmt|GM06(er^AOS66jsZS3saINs5@ zu>g>Ws1ztUoptl@70*3)#o+B3$k#bO(a||Re)@0t)o2g~eq8L9VhAfB6K%c1O=rT6 z3Yp2u#LNKpD+8HTxJp@*8F6)ax{`ZRmxTs!eDb0Opy*e? z0h@!H@?kGAZCnOf7u`TB-r=p9Ua^Tvzf5OTQ?Zn_J6czreaAcao6QpTr<4$*Fe4W)}QH z@&j;}K}!G!gq+CBKck?vm?|iAq|CSDhv!s%89OIf=+P|Q%pvEM{s?w@Vp;@7-PY)3fJ%_!eL; zkJFf1Fn9YPbdFjjc1s9(5w%_D)h-AxfH1WTSxRz7cCxPo70ZIjCD{RA6AF8Tqd){*P!9#ZD>=nSt+;6acXL2$jijhwxXiEkd23w!!lkC`@m&zoXwp=UA`d4?%r7p z{0-PSS&e_3x96DqKXLZ|0b%zvJ81Ut{mB!+&|Uc>%W150#Qzt}UF+hF#R-IsZ&BD5 zby;#unE4MVJWyN0v?YG1kMRQ}8WVm<^cbx3)c)Z)RdeS+;_iPu=iPtDu9M_8P~W?b z#1FB1?S*qpf||}v?oS4ONS-@Y;(}Yi?5~yD^^U~Zmx~usXbw8-ZFxTbCHVv%F*v3GInpT6D*e|!S1XCDni=avrecE$qJ!H$G- z6MiGnX|kVrM!fo&XC9T{)#qaXD~w|dIVQ8FRT{_l00$t{N{Z8%zoS23QWCY=Vq-lw zv*P2qbH?cV=T!Y)ob&G7ISJMuTt^z~*uD0`Inr1=S{yLej=58%v6iqhj_q9<(s2JVH>ajllGZYuO#FxE39N7jys^XLbv{hrNJB zd&P}}y{PN(YxE4nVi9~XO|Xt?hs@iwo6L;4ou;+zJXV3aXUO1)L?TEcNl=7)oKw*S z0tL@%81&4S_ul*Em-in2{hhmphj(4PVt5y`^qwz&fA2kCetFOErI!wmTznba^Jb_U z)XzQ-mb;gl6go;3A$M+KlOpUE5_`~M{Tei=--4VA`l8PE3xr0*Gp9rb@ z6N6Vsly3?J`GVi8@l=l!XtDZ+XD46jOKKc1@$x zM~gR-I#BLYe@B@Xv_ia<&T_q))yB_0spv@GNmrWQeCE+NVRRv`o4J(z3uvL|2`z3% zz?|=(A;=VV53JBE*7RCdXvXolhPPYUT9VNkhEWIQs6kE~1#U>j*Lq!E?7~*NTh7LF zT8@p^GT2QCK+agb2MFjPrI7(S(vwgo@Tf^i>T^>cmJTrJAUKOaNwHL=d2Ec}N>YZ3 zhq?5$xOwG~BhlAaT_Y&Uuj#z(Qlbz}EvIXK<$mVLOHjc}2qo%&nUQfIDvAIjLV`5G5v4?1lAlAYn0b=LLjDMvC>1=2p^l(ko>e0W*a(TH zBb!$YbX8W=KR31H?xl+GBWrfumYSWuukGEo#T$o*+J!3N#qCS(=~XOvX6y95P=0(z z?@K-1|4MLr90`lEQX{p7a*H*^<*>JArSw;sDslJdZH2O&D|?zR$uBCfyPiwVA6QaU z5g(Uq3beLfu>9U)S?>Ps){6r93lbd9*-Mu$DXxo)OE%|(!{U9OiUt1KIIBygG@JNr ztF1FHzt$S(Rw}GUr4K|Q^&}Jyy8{Z5DJkRQG=!H^99c>7rC5;fPkH)|-&}XyhaX;d z-EZ(g>Gi`835SbUGi?y{qK2%Nq{Z?9fa#z<4+}K|I1V3%iAyR8u;~yKmo9~*^2C!R z2^2}L0JI|o7LtMiq!1U0vh*-*SG{}nFJ}?+HF{ILntSTswIHm%eeG9YlJ=hYlDQoG z&jr+4p`Oh#=j0f(0>#GSKw&|HrnX?QXV^1oR|Wj0GPASPOlMQz-7TZ}6uH%&8=y=o zE&&iJy&a;ka_MAhUs19xWlted!RD$xL?n?4%QoR0DeE|f)Ihr1Ic5cL23QtesO0fo z015=0Ko{mgXlZUi(SXavzkQfBo}|cFQPjB3<8{4t{Ko4nPJ35b@zS*9?3sF@^ysq3 zKi|9Ij-R1V-W5O6s_(QK7UTt{7v6R6!SgQgR=Qw=w$!8@eW!oU6iq!|zM$m6Lt_uS z`Q(oQ`@H!~j%)y8tR*Q9+3ODo+osf0`Z42J+&0@p>Ue=nZDYJno55>J%hGstiKZ-z z$C~5~#TR%R;_DLItgAJHxv!i;z z0r75z2e>rb;k-O&ya3>W=QHSH-gVi4$cop&gGHy&Fg#9Ahz;T^ z@Mu7fqXKw5{_Mx%qqp6Oik59F36*SE;ZE?lYJ*o#m-jea@%V~!e@ZR|znBrLr7KjU znF~Rj-$) zbE>TsN!1zEIqlZ=r1p&VoOyaLw~jgnlj4%6p>AMShSjNhz!@X2&hPePC{fpDcfrOa z04k-odCV<#&;KGauxG?a4rhr>a2ZnN@V}6jl}zEeJo)d$8lkKI|AMUI#?G4;eI|a3 z)W7Y%zg$;vZ};Atuf1yVjrF?!6H%9>rvCGfpCHhI9!;yg@6MYaTo8a2MxlbfYW+p6v5UUrH^}t}jMl?Ktnf!JHIxxHe?>_gpDbvaDSMig7Id<%`S^W9* z=eU8^<5glAdId@*Ju6;_&fgS$6gO=G`G_5?g?@fMa;^?_Qp40{NHn7VL*yJmacOXx zUVW6iOuU4|&Y>RGO8;z5pO-3CR-=B9kd%q!l|#M|L>NLC_Z+H5$^*a{&Z+G5&t7~{ zT=C+I5PIln@#Qz!(G*|A)DqErwnl5$c~r5BRo z3YA2lWiWrCz!UtF>Q4f44eJLKo&2ugBov{9wEO5SBiD|IOV9`H(Kqq3RoAXU_lZf1 zu@8-kKSkjikm?2$7Jqt!_zlq{G%%cNfe*CMudPCup_QDSv9lRWCR@TaGL39A*KAN4 zj1U11zM@U+6o(Z$jR~2@IRp*`0SH5pMQ6}N2aM{VLSba(K|_F}HIRD`bu~*NUWWwL zk&1b_hy;ZAB5}oE#PW6tqz2s~nvz~hB_@HVk_2Edht+0C+Z^xl2-+Q4G_C%;gWHY^U*;!#D4EeQ0eg z-)Zx6ZF_gj46PT}7w_v{_eiBsQ?h_wTDl-QQhH_gy2s0_D)E=G^rr=dCs4{D%6cJ| z0aaM|viQxQ_#Rr2lij>%;pYb+dJ#Qw>4~P9b@`rb<2DC+}1ejLQ12C0n# zM77HE%qj7{bZ<&lNuWBRDbR{LWqpc1O^>nF(rxX?U4hpsR#;Yf*CY*Q4Q5+C5BVRW zIfItxGaj-(WY$hvCvtIW29;}7QP&naGgQ|W5M3Zviv_s9^dtxt;2d}*k`=Opi4s7h zC@G^eA9`Y7B`TebY)qDnBTx%tIYqL*fBb6aZ)?JDU2*KwQ?Km$ZFTsa%a46JI}&=L z|B@S~&s#TDoS00jwr}pbpwa0!mOc&N;zM7F|G0Mlp{tPg-M=8!byps|TKwBpn>O8j z-OjrPmKE2bU3b=P$z7Q>e%@Wc{O?gm*+<#OVE)ty=^DD72o|K4s@us_f*wi1xTLln zu;{>-cO6efGF`5FWN$ zK(aus4~pG8*RmCW9iCI_BZUHAG*!$oQq7MPXcRlwGL}VWTSmuP_PvT9|GjObc~aX* z(T}aOyO|3~+h~L6cpQzQ(Z@x{>_%uCqSk{y5ah#^m`94Qpmg{3+c+zggEGx)HgB^ZI_w~Jzodq+SD;jHs=-2GOXP-)Kt16`h;J&NR{EpcQc4#7?1sPDO{U)79ec%owx{I|nmXV{{( zM(S63ZVqF7(>048U!-h(x&PwV%QGCWmR?hT`8~VGw%?w}De0O!#A_y}mPcPbfjof< zTZ!%cS3-r)Wo56O>inhng0JAQ!&hGW+|N8Mgo~a&Q^j@z7pcGoAB91e*C;Qg->2VF z!qSM8nRGrdNQ53%^eZ8qgO>C1qu|P>l?o+E_xO=-=mChJ1f7C`Bpa+!LB_E{u^KQI z1`2J_JfoBY#)N`O$TA3#)r3@4CUhdjstHR;AE8t=WQ6P{$<-%!Lu}&rKSegM9#R$u z*bSnKJ#6>s<@naF?<6)Z{|q!?)vCB>EpgLA$At}NGc~JgO8r# zg9QnMz$hXObF7=S2HG5aJ0L&1@NBBiBL`ER2C#iENn?CeX& zqeqUv#I9kzrxMr`cM3gBfWl?gS<$(_m-EMudNkn7v{BRYV0=dOJMfUzID za>Xk%V(H8)%&+NVBtTgTQidyE0`bZFz;5+WS%MX2zTl()*$~uf3E}}Ez}s~31jmu4 zC%h1jBbp%LBN=Dbn`GzswF(P@da!uO0>tc7xX0ZW1cD>0W&&&T6rMGS7X$+%BhM@t zE?}3)&1Gd*pT6;zYu70i4@)1I6|b#_4@B=egpKqOupddx^b)8urQkev-r~vOlRX{j z{hI#tG0j-I63dg@NG1oQaV&NNp>r0?Ifp(OXFv)^W(K7s4q;Mg4lo0P6n<}}5KsE| zQZ@i%`_5vXn=NKKc1mphq>mg<$ji!ZZP@-$q+n{66Gn%A}PX@P(MHz766l)M!gXNlk$c`p8znn>=*BA7fFvVdMqu{ERN^0`P)I5tsB@tE{l~N;0u@R* z7IQ%mApg(hYFTLZ_0qz?-p=*!RH_!ev-Yl&3(ZUOLsyL-d~3~6A4<9{Cp~SfG<>v2 zUHHqPo8Ky~dF3bXpMH#m{lwRXcRmt-rOCYN*|zY&#O4)0$G(lX1#+_&2VVDPM?uuG ztRiRDK!ox8pi6roqI-+bNy)V)MSOY+1F0R!SUT_~@>1r=&un&7X39J%)?_B#Ue56b zGec{c^m1AuedkOhY5DM_irSa0&30vnve#!bPP=Mn7IEJHC))$+@5iE(CDQ}w70VL> zC<2P@&o7^G{||3(9vD@1zK`F1_BEL$lgyUMKH0Y+3(1ABg#;4zH4qVyRl>gMC%6Gc zHgUt9x}vsdm($j$e8&z%W@VrzeY{D4d*;m*0|oO{lD z-sO3p_q5T$5X+PIG+c4v{cV!~Tb{PNcFl^L+9zv=bI(uQbYFH%7!k|X)cm;(*FB)a zn2Yj{^W3=iuO=vSaqI_wZh!CXVDRl&%k&>NnFu1+Uyc@4BX@1% zb@CzM8$>4y>HHEVJ1|1kz?U0TgTOP%Ng0e7DDxVy!z&l(EjaiN-GA~0>34Nt$3{C_ z`xh&}R8AplcC1?LF;p2w7*-jOf@4%DyIU}rkmftXxER@|xR^(%Q=EXrU}&%$^XZp; z!Xw&&gK?Yl9gu**b~henNzCXucubUEp4z)m+wuvLK;%Z28^`U6kz(7am@Ro4_5Opn^rx7@@3WykT&2dk=z&6FSYIrl4hKL~O%fa+eZ zwj!LU$aZ6zIa7(q1;&zD(nQy+(8Ty6%lyiXmNk{m{QUCC!9WaO9AFPNn|Cr2&L5tz!Zs(9;i;CMOXWis`z;IJ;S3A4V?=9|Kniy#5 zxoSF|iXxe(ARi(QcWNAoW^rb_u_f8eg5y!_EJ8rAueY9mzVFxi*Squw=!Ya;5C{St zW7xvYXZR|Cv)bhWYy-QBp|JF;UgxTkSNSccuVQRO>?*7?hSj<F7#8KF0#}FxK%ddwoGkwv-pm2a8&nfA?b(;?I_=KGCNyT9eDRppcfnPUJg~px z>kp;UK3O$SB z0M7y#48uBTemRh?#G<^6biPWd+*VoGP+D1DS=~^pN;pUh$Caw(YW29jd&$G?TnwQ;UTa}&3H^$wexacSt8kNeLGn1-bO|!=wa>s#v0nLKdnj7GX{oEcn zIQdFsXX%k82$R5-~aUq@v2={KInY%&Z}=YaL>Md zcL|w`_E%Jtbqsl-sCv_)6&qMOm4~m}xN6BI+82K-y6L7n_g(z@Ywtb(o7Z2%wz)xQ zlr9$D#ytArc$$pZzRb#D;c%vmo>W4=bn&Sy@dKfed5`cJ!v*X!$o^*^IWzm;aKYD= z%8PWd(Eo|}N72hL&jxPdV}c(jRye&re8gl;z%BQoY9c5;{Z>x?R-)gg;kPU}fw~^Z zBZ2+@Pzn%&APWmMk+^}tAua{_@^01s{@LH?Mf@Xj4POxuVHUXSaQ7q0yLUdtNod+m z_wwWRiXS&&eTYz}=vM;$O202Edg=G&SY$%q(P!S9;w^|5rin+izi++kPI^H;D(&yb9+Grk+ZXFg1(vlKb#NjshgkLffM6;!i&PlOdBUXp}|BgDLdb_5>YiYh--%DA#XhSv3IS1P1nGRW`sEhOd<{wG?C*24cp*xgqz z92buF)${LYF)c=@R+fjsa8k1&DZSk8cXXVT)81|GvE%-Bi^PO4LwPZ_6^2zs7#4DM zcmF4ls~IZl%h**g-qB~k&1^S86f+n&G`<@#(QWLc52~&q;uvuew}4+v6wWx$8R11U zJ#5AgFSfCQQ#!*B9cBH0lzs(-R2BEUx@|f#S{^Io#V3QjknoT8PxD{kU+@33|6hIs zU(bzYd_$X1>rN4imCnNbaF@j#osoaJd86C!E^tqGOPt#+di?pwNX`HXNZ<;pcphgY zxG?i0yby~N7E7GNjg*-@tFg$Bg7YF*6pdQ_pr3VC8{l*R3=KA=jyp-oES?~F}!#JZ`^~}86-p0 z5Y;QF;EhgTTqXT#*;D`bxprB_*5Wo;48r>2u6lmW=ev$fc6J`W=$3x2od0dH)(Gt# zEZ)W1u?pUJ-7OD~a5PorA$%mQ^OS*2*1ry`x}dP+m0?3)dT5=$I^Zkytb6>G=AoGD zA8|hr-jkL=D=Jn^tDsG!lp)nhN|4Bb?;8*Ow6;Tv&VZUDyqD5ye!xFEgMZ`~+Ml&Q zqt&O;>W8UTF9z`-wMq&MYgJcT&e3X8IT1cgX(iA_+J6C#nT%g(jP(P^XK4~VdB~pT zW~m8_v)^j`{HCPdzeFFBMIcrJw#wEfp zS=zk#^rS#g^EN?eD z&B)?1JGgyWCTqayc2I8}-$N2TxEqkDtyh;A=qnY|!wy0YmQHVgZm}2wbgd+RLqZyT zIDTc#?N{)v+E38ckA63DZ}DMyxzW08XR*%UP;ulHJFGqQ@5kIl3=5gYO;hVEc8Akt zR804o4eqogD$)!jAc7qz0xvkv=NK>&Pyq^mn}q^Eag*@KFB_cTd_VtJF@QDjE%lU`IHr0^ z{d^`Q(U;m^`8{|ia;5s&k#XkP;ShN~3}~l*2w@ASP9c^Rwug=mK9e130<}dHAZW|L zP59RHG4tP!&SU)$-sfgw0$VcU;|@ zszhjPG&H4Z5oR=cn^N@%3mS8qs3xIaktzb7zf+w;j1ewf=GJ8nc8En9He9C6^8v2~GtdViT)%70!rVch zIm0>pKh`pAN>w_1_9vRY4DKCCTvLX)teOs!5_WqSgul`Gj;Dx2kud$w?m$$JjYc>!`( zc#UPo6tmWL^}7eIk_K{K2rzFPbk&Le{Nz*=eI_$R#2dZxFvyFUk4G2H<)6rIj) zXO9ynjMIjXFx>(3clP~T`kT&ie`f8m`|H-;E^Y(63h4;BdZGh4svu<( zp5v+(?!I%h#d3Do9f#=i!d;l`S0t<_>d+m}zUl-B<@CIw>|{F6xvomxk>|pxwwP1~ zTL@xeI$MbR-`PTNEzj4=F7fxkO)132K0}_WpdzNSNnQ=cb3yDx(sz%H^oefByiTs0 z>p|1M{;Lk!Wzd8ZD{WJC|T;A=(JJu83mlRfU}V!mH@%zq9SK39b4b-nUabvm#?UuU060Ozq(qw z%((l4%C4fa)@W6os7%^_V}5QtKC}J$8}oAt3ulkQX#H|R)R?B34)UW(PUt#G4HGxR zNT8UDT3Z+-)f0)s&{4U_nh z;URcke88EMIwqJnQ@Kf~C^zw)rfyRYrSW+th}J^lAchTFj^`@Aj7P<}3z^{vhHYvX zJzOVFd5hJk{gKMNute;6b1zH$fkocnjSYOCI>-yDGZ6}5qkzDM=9bB zf-++u`6<|%kp`S1KUMZh>+!Vc#2xBv$B?JTpDGw{YR011@&+i1`*mVm4y z1qlNt-ze4|hRmQAy3H!B*R(6|Jwz`$Sdak*F|OORx#C60He%zlOCc#PH6U$1J>7|M zad`GDKshijeHl|^swzc#2kh2G)on#r-fL5CQj|$Eb0)Zq+D5ze);)Pmfy~Cx#POL% zn!!r!(sxq3bTW7W=krU2HT-52CXj`J5p~0&9oVI!KAyq56d+3gEX8*|_`?U-s2Ix? z{ATP^4tGERiIcWqXV}1sSkz!?GtV?{08gi-QF(SBWsG-CSpa(##zU9=!AN}Y!-=*CFZcg9+JFXQ2eH-}9 zJG2iqgMNRZ7FN3jxm&STKqVH-z&7w^RHXrJ6q0O2P)ykNanO6gGYjnd7j)xFFi0aN zf}6sRsRQLGXGFhmLa2T0@DG1@_%U(QRee68d)I9{M1SAPYan+S$1#)6wHUk)e#&u4 zxm#Tk81N)AeifFD1g;5KzVD*e0A*Vxsu6BWW*XtlLS`9dh7L`(RGDnaW)_sxRdoLS zfwhEp)Y3J2OEy%^X4hc#p3ZnTAa>(*P~~hM4i#`{$reru^E!_(bRjlk=0~QuJ!TkR zlm-951HzYL=&Si+2+Nw#n(|>hQDo);wOcjBJI1?ESmcs2L&iqX)di}pVpuP@5eypA zP;(>Sk+0@==ZmJy5P*(`W$;?k98*b2vS-P7CHgU{t4KmQRe=N22O#h>s&J5Xp@YEX z!^uh<$Bt1g4qMv9z|^33@)QRJ2+dz0IcNE7223L z&iILc5?7!Ld<@aIee!F-vzDrUxl^yTdmnE{?k*MCEfSn83z8MsMStla)a&a)&!TE5 ztk6;d&s^Nscf())QL-$QTP$vSN2uK-4C%31oy7&GevA8XFX2AFKtwnQeWoPGlk2bb z)cD(-bDYba3;YW+E_SZvIJw1*Xeb_cZhQx`!#uU=rnA>MUiWl zObt2>2Gmo{3{mkHea89sR9!Z9>C72FD7TG%aN46kK5up6rs0Ug*WTQ8Vc`WAOdi=j zH2i2FcFV=*Uq3Uxu#ol9f#j#pxKc!|y+vZ3IMO;cJlQ%sywo^9cCm3y%$!dyEx1b( z#c|I>hnIJF!;naGy)SwDy^1#)4Nmkbxm0d(qT&b?6?n51|n2XiV6l((g5QVPbUXV!^_hYzW{X2zVm#@Y*?>6(AVx}H5- zdX}EQXxuZ!_OU;l`QXnkoH6$@v7&8db}SmodL*Y|bla51UE@X!9o>}kaAs`#k{PQ4 zM%N0GIRH)>?!Y>z6&m(&h%5bAKw%8thiHk^_Y5kpcm%sqfcLlCE&%FinPpiDejBOF zRfB(AGqC|s3&YOQLX&toTF6r~kPZ)AB*@Z1vhLVVY2eBD+w&EJ8J%%CghKS3AXs$Qyx|rXU1|n7M3Dci787=p$Ij zo+0ENP8OUb`dNxI1~QPnu++6=Q~xUejzHfL0`r7m2ZUsqIJ zTRm({ctrk~qL$jWrV+#Df}3h$<+R!wN`F9C%ssAyKIgF}WOmM281N(9l6OwwscOo?VsMS+K_NCZt%gj>_jva00AL@U&(LJxuRlQbI>Ppxn-(S z6WD^fPIW_@YNSvoyNPjNOiFTK3{f-7ax=NIApu1Sa=Y6d?cw(3_POo7?Q(Ey+kc+< z6dPci(s{p~8DoG1=DTqO_O1}lq{{FV_`W-9;LirFB>0Rz%Qd299pJsD7 zyQO!()LY8UPPPOMhd8!RLc_@fJIxApEK1H>8?!5OnhM(FvDWd~BXc?m2&&cNwt?v@ z;PW~Ce41p440B4NF>g5PA8^}wuP-f23IzClMd706A|aN^o3AL;F_}ztV;Kpg36lv> zM-~?h5i$cPSC5<+gV;5JU&R6MsXC*2rgZYj!{dH<;qgx{%K_c^AN~J$x@UV(-{dOTGXZhcAaCs1%sFqK(4}jAwMA#w z!7~YHa}}y$nThDrv+7>L36#oBvKs6$Dnqiy+DAHO*rz$AWz4|1;a-wp!ab+Z5XZ+eJ2mZGM<>SbdS?u!0)F3V0Ig zku08Xt>SswgP~XRy4B;vxj|iGamn$3+Z!*EM`X{x(2X$$^S*6J_b;sKrJ2BI@X`yu*_{ouADPa z^WRqJz%^)|_`$$Yxm5T5NdKkuK`=FqTJ=B?gruLSA?-g`L+CSSRx&>lvanB=MZj8z zeJ4N6eC zIpYi+p^=fcoSEh&=ALwvj1#@6GiS;g25vQD_HYwiM}pU{1OzFZ*PJJWGbQU4s3i&5 zw_eScCOjoyptqB7A$$kYR#|ew86xH^vVSH2o8J9e-?uXUE9shn|N85{{s-oN%t+E> zB6zt!GoRSA+Fa=c?BNLP-#V+5C6!1+CCOdGIh+nyI3|0IMNF&ln!rhyMIOHlc>ENr zQ#7Zq&UR$;j zFHV;c)drRX^B3k+1yhNxhmxBLyJ-nVK(!2tfsfd%PPK&sA#l6e;-PA(9u*B5Do0RF zgUT7U&Z1?u?)XOAhDtZ`tR@9*d}CErtbAypnY!V2nV4P5EWkVMikAi5sPQ4OTGsgWeV48oj(FRRID*^)IRmyA<`UfEiPa zQo50+`i+&SoQ*>7sj`g)6K}YF3`>39|jW+{z!p=@&V*Tq}#%A$u>4TJJ{7!LqMF2JDnotdVPc9 z4!Y+_ui9yX%@#6DEkimN=8g?eDKP+U#?dH|l&{yMWDYyF@<=hE<4YeA-61)mn?L%9 z1_ZKJOL8>xlA|e60|vjANG5?0*oTsQp09d=qdLnE4=S$mYuM+XvXI&Ti>l z?)K!0g1>kmrh0Zu?`G*O1$=fPwd&4}XuiW32^oi8VV)lNWU*eIn~Qoik@f1GHd(MQ<-CF>XQ$SIc8J<%_56&vA{C7CGG(+zDs2^=^N6vMq0#d0=my?aklCr6=dBsxlBx_3LbJ{;s4CzP3iGWY>_{ zj_g0GxrB*|hq1e!9kbrKQWVG@A8ZcjbjTTEj9pW(#K>E*eIb|AC(6Li#aN6 z5Q}*^^!!m)qb-nO3UWU?HD_5nVKh?qdJIP<>_2C(gl;j{Su{(x+_oG4B%hZvUsrr))9mq_QNZ!1FF{ z0xmKWk%HA~y9K9qkyI2c3e^YeLt}$uLsPQmXDtq`$=VpQhr=PFfDaAgfRFY@g{-Vl z$O$6&s7?gWbr^bq#@UWaKA0&sRbPU|iyW}}S&noH%pZOx-{OBFg@?pT`xavOiy;Qj zO%AV2)Li`EF#a>K0$%R7=XZjIW0nBv6Xn%tXY@c+{F^h%?~U?5!EZXFTcX01PE;A~ ziHe7!N28xb#l83@%%IozqM|d}9o-uhD{$?5QC=@dN*|J=ICoNPqBWcg;b0cHrr@>y zZ{-|a9x#?Y#?LvONewt_bsR}B$(+Ze#+m*0aqlp>$nYjPN%#W0j#|5f$ql`=cc3q_ ztAa^lKX%pG@wQzEMd*kLi!B*T!(8E@929TEncTl9DK`dR#oA&Xu%S#+y~Wj~+DgUc zQf)E(D_VubehWg0BsStH$=ID5w2&?iE;CIlgm8jUX-A)Q zTzs0<{iJ+0Ca2*&rrOB)$ouK|uho%rYr2tkk*C+*O;t%IS~LfhN-lI1@{YoAVRIoX zm0Uo^jUL8JhG{=RUP{u=`z}S3MOgITrEu~O`gRGczjO6uUU>v#U)=whk|X~<$;L8W ztGI~X0Q7E@^0k^~zFaMeZuG0{`{IRJKCnbs5aE^UNYy#%3;I%b}!joUq7rxt++|}eCM03 z9bMwxcZ)M8j(ub2_UGFt%#m)oNt`#n_2u64@2(qCEu7jazh%x9{R0`#PE}Iqy1oYp$HD?#S`c^Ayu=P}& zUw!Iv;iBxYUN#NACmmunbgB$^p|+}pVwN27dGb6B=6ZX5R#UXy+-e`2)e)WKTWa5I z-xS##b=BsL$`gV_l~L`^N(B98S0d;OT4hIClatRw*&LUPC?f-z;9%nR7CD$}YDJOc zaKunS2i_?-W1P%MB z>NKU};A`$}-qI{oWtz4&(Wb_rLQK&y%K|@Cn7}^}{H++Rw$6s2gHfmx{6F*)0;_8k&M~$4ea^tLJbBC$7cg(wUrfv8$^Gn7T#j1vsmn^DTack53qC&8S z=Pnqs@WatIwY(@&kl#C}dvBh>fBEbgYqO(~Xx2+rLr`0wrFiHFhh4nebG+gsyV;}D`wtcYk+Kyt|0;(An2d$RvC6%_{)KID1J*0t%ILV}BC zDHniZmn+*R1!UP8%B)9k_vAV9!g(Ee-FcEDk55OwH{33atewT55I@AUL78d(B#z=` z^iAJ8NJ0Z%oGl-BqROKP*epH@b4NI;P=$B$U$lF*&wqUBI}@hNS$D-Bw_o%7pG4d8 zdFVmUy!W#gUlmlXPdnz&R`I))2_wfI+j<-C-r+i5`|_Tj{7Df%6nO15?c|fcJ@v5p zL+Ea(lsW^IQXjyXU_jK+A#}nbQ#xgv1Ym}YSS}WO6`rnch=H60?h+hJtb8h!Q2o^g z?fwn0#P}GV&f7SRYk@-`i(KO0#OWVWk+~c}@sbrb)PIKg;goxUZ7l1msi7~-(~Uxr zcpRs&mmBvKmrhJR)`W*K`dAZbPxgPM`h1xQ-kD~z87HL)2tyWeoZo3FqCC(?Oy-2G zEDnBG<^rLuh_EvzG7e++oYl}g;_)BYJ>GHZuwBFMzrXGF$v56D6bYVDOLB5zEtP#E z#rqdEjeP2UtcPd&|7iRb#xovz&HHN9;+Mu{@TLC9xG5D&{0l1E9jNeyB%)%I&{ZfR=hsNriGYC>2?)j2?#6i=(}EaVFd<5R1PMFTCK zMqFty*irZ?60h$V+aV;X!vXkxsuX2ZU`VhjfWIy{$>%!e@*Qc}bE|rZ1#wzYS`UUv z+0_upbxbO;lmi^Vmn?KvdgBGx;9)_R+i5Xzv=15>{rt&yn#^r%rPUpmNaMHwHM}&$U8M&e0b!>vT@`3 zUXx!bDKEQv{@ZW6{pC3*PBp$`)EJ-DZw>7hI>xQd2?zV`C@Cvn4sG*${U0k$Z0+h8 z=n`=<)~@_8Dp7Qim*GKJs6&AQt>p-U;p4^;$s+O*U7fM+SZ@qeL7moaYcKLIXi=jo zBmS3@$%E@fbYsC&oDUgs&5#kG%eE#m$bXxxKN6Uk1_{B!P$*pZWd9ec8$@C; zD_%NmYUZZ0wKWo?|A)*A@AA_pC?GVUOzgm^1KH-9U=qqEL<-eHp|G%KLd+a8qQqxb zsImxI19^GHMOh&w5+V9QTLe;%;ztbaTSeN0zGZ>UBI}m6YZpa82xo%#P*gBtj2nbe zV3*`5yK5j6a^~J+8U!AM>080WC84XwAAR$k!^3);?TxGJmiKO6*}5s$F8q@v_z64y zEzd&usk`z|zy9SvqR}5#R$Y7Zb^C|Mghk(!q1^rRXD3z&oTL9kVXOQqW;~8Mv$jdW zdBL76(d)OkD0}uZwF3O4D0XSdLiIP<>vlUPdQG{VvN+nvyWQbJqv}deklQgU6Whip zT8fZ~d-M@!dV)uV7atBHxHRK5Jxtxug`BUBk>I5zz%Gp0@Bks{O83%C=w9xjydiB6 zDv-1-$3vS}bYHaLu3%8%JRyGXmPDxBWwlxDo(o|z3mgnnX}EZZou9d?$M77M?{lL5jT4>7 z69qU$XE>n;4sT`}j?graZS4~eo$72C{q#+of9gZ<31ekkhJ?_GBH^ihDur_(NswTg zEYhy~JMdXyqE;d9)GGLws1K(0C_)``ZV2}0nE_@9xce|1+~Io zru~vn=xw!YzeEon;;+>XjyKLj{LkD& zyzs>1yr5~1KcQ)Y`UJgw;&DymAr1wuhrdr)C>}toK5l_(QJk^7gyQrCD8u=)NALrE zS3UTJ`#A)3oiytUgW2h0Oix%9IM(>3i>|(U(W0yOEpAbVs-T8bs^-fZP-M1a~j|9cK74%Hj@> z-pbi{gA-qHoD13RYF=laz~yBlgc?Ud1oVlu#=Iwa>?C@N;TNd2;xk)gzLQb72ELPj z>a9g`%5wxRC--z~@CQq`uo2=s!@2ebSQ}`BNELP<1j72yqA_fQV_0i%{7WBUb_^J2 zb_HvN`3Ut^-UL^rK0-G|bxya!{7iZ)gpG2jAgasbxx9!6^PrE9wZ+D#xAhj+k!FoG1*#v!5OWwIUhTC&V|mZ?ka(+s!q0s-9^=+ZU?q&2zRX-F)51O zkQY?a>`^r8yMGh2%11HBksmbv49!hv#{d@^5ay)WL6yV)cF`|t6QuuBIQ?wLw0Nl~{7`#u;RQYX_xWYLyy*sa zcwODd2UmQfy#wP!={_<>TPaMM`I|YsILJZ0)Dw5i?LLo>J;N{HZyDP9v44CZT&Nw< zKGojUj^u^-gMVW zRCuhestTQ>(s@M%du&xzod1lX=e6P5=2}+tyoO9U<^&;tA@hPUrHqbk=-cGSC%dVP z5#+`H_af+UTJuuNcP@lp{mAFM>pNFNmv^&V8teh=Ho1ZA+&Ej=C%ARVmF=`59>n$u z)IVu1yQVF94aIB&s+;e~T#szx-j@bh->nX{yLqo< zoCq2p@RVDuat-Hm`UIcF=|i@O6@)FE+u;$#bYTO^HLDq&8OVLH*uA2XZdgVoo5{mK zj#T3+b6hOZa)gdXG(4mTpB$N z(!wL*NOwd?_xMChz~!)QN2)ra6FvgjLwieU<;)dCzM!*|@?;NzHf2`R83nKJzWXp0 zs6D%Yyz~X&SX;GESP^*vm;z3$GCYe@G?!cc6qnimvZ}%_X)ni%)e4AnRu}=MjI508 zi9HS;a0#hW5zQj_mU0Um)-XU${(=l^{&J&bra4^}W@d=X^MIB3q_Xdm$`7C+Kr}!w zRN@~gp(z!VaGZragO39v;YzZyF{uEAvu*)~Uc5%5Ai{}dzc*obDV2kUaE%;KImUzZ|L*$;G*`mH~;XrZ{ z74wbc!$B` zcU-7Hg7R018^LTxcI+0k{I20uj4uP6Tw!Yu7~S07`vxzpj6$mloy?k6=%$gTLC1Gn zGY3|fTU;I(w8G;0Q%No{JQGU%J7cVR-eVQh;cHHh+I;oRH(Y<~$Z@S>QtPMT;7czZ z+`8(*9q1=4Dxq9igiJaYqR1XVg3O&D9F!flLXI{FXDB2BG4u||3?e7o$Jql)FSf{b zx4vL7BYNN1q(FE>vYgQs!ZirxSMJ=gd*85;!$#x-Ke6b>qd&cQ)6#jDeZ8OZdQtCX zE`0idi zZ>LJ##F6+X<`XBaqO7X9IZgoqa>Ak0rwJS>W$rY*iofhPzj+2-yyE6u>WEB(?tehZTe(R&jtZj_&1!#tAnWkNe5qi0|p^=g<9v~h8 zb{78(ey9hPbZEZg*&Mvxe-U(FvJ}b#Y5@3Gt88XkE7s!AaH>6sRcYZaRwon)Z}7iG zN-0%MGIr$}Os8vSqQbi3)0opf<5^M$@B$1^K36DmTjpBv}|OLbticj0_pX zg(E0KEf~ds{5@oX>ItaWzr-j8XB2cE>=>eS-1JYsM7-8upG2lpG{#eQC^Aw}g8IR) zGA73zMBCn)>!?_bVxBtLuJz(*5O!HLH>c`y3 zL)h9NoDzciS1Y6V5z17466%C+{^L zK2}=hqlbvqq{k95X;oFtD3Fvy{qn0;BH=FHwGt>h(((v0HyG6;ZRz8m;;V$qpL+4p z{0X@hZ+)ounjLb}H_yXCbwKL=#((4$qjFHj>P2-deO|acWVFRak2S;VK~=w$_tj=Z z62_!}Ef^F6zN-qt1>FS#9I>|T`E0F2ze`C0=6Hn!kU%p|UT#YBq80AZmAW%JSevL7 z?{NDw=CqAFIPUOarrkaNX#V&-i?=b*exA>pJ5^{Kw=J)zu)X2bPm^BQKF5*g4bIFJb_8N1?aRN9-| z&B<1Zh-c$;E6hsQTY2*Xy_FDEi)2^OIs`}&eIYa&)*&(@$o9^O$TnPoS>KYm0FeB(ICZubR^6dm+>-#I;u047jIo^U^6lyJ=t#xS) z6Rsco=~!As3Z@d#djWD6Ug`Stz#yBc(1tm)aH#l>xK;HQ0SKR*h&f*4VdZRCi7{877$U_+Y1&|y?K>lZ2lnijNiTN~MLH3wr*Kpa)8?&=R zlk#k_SY{D|G%%|WNh>T&hs54j94_uI7Ayhdws`VLfoFz{K7DCo=r~qLd`Of&LSEs) zL&p0-%4tfg7Oz$2KCt-EvBSUO007|+?8<>0nGIOlF19x6**ZPJFHWv7mn|h%!F8e3GRZqrzlN~iY>l11 z21{4^6KkhYzlLEkX&u^hVn^KTY>t5w@93>qjieute1<CTfEOP45N%S?pgBSP(M%Ek4^=Wt4k{GS$67 zST7=x)g z2-(>=D#T(=TA{;H=IC(jaopyR9pLgtgh4fJG3_bc>J*m4a} z6WoO$@!-vJ9K3nsrcsaFGjpj7KgqJtV|BP(bA2`P z6ED0#&yVHV8LFUb5O-Y%cj7UtIm0ZJ)AVhJl{LdYAv$}=V*B~g6?L1P_7$x_x zyfHR;v}75s1~W_<4|@C*)5=aK{HGo)q)VW=!OabWnn^c3Jd`*ii46ZiY5SlSLF6bo z=TP3o!AWF<#Yx4K2x2S+e|%;-S!rS6^5*)*MHQWC=GfwjtlZmHufDZ3cJa0!4*siO9yrDR6!O?z{sQ115=O^>YdQ~x4(%hA3TQ?ZQ)lZrKs~;rDzNHOj3%TzUFLc zylX%jJDlGpjdyWJlI@(nhPA_@Lb_Dn&67VO@{j<~(oxlowe3g)(OKGDknpClmb+@Y zm>$4nJ&P6TvVJ#fJ(T>UbKsNs@EM;wTmHAO>(Y-Hthmxk_NBUn@u8_S-AKE)t#xMY6-fw;+k5aDKfD;Lv2&@ix z0e7`}{xJ6>_pHGA?$yF-_uibx#m93@v4}i@GdhhC)UGmyvrH4nk=<6j6^_VOV{~qCMX)z02F*&EVhpC8qck``9tZR6hXco{`{Dr{quu|a{%(LHe=bd*9t`@#byP99F?Q!(X6i2?4dCBIj zJGb6*x@Pz__;JB)#TK|Pxrh4yB)jBFcpI|0xoX-FTU}Ob)^yvF=%y$V90?>w@$VvF z-ZH|4jy%s|$3}-_gD4FEebH9_`hBsr`^2&ZqVB)}IP_g$3JY z-u9YJ*l_t{O^ppx$GldX;Aio}_hc~L%BIxWSIWwTxGU7*3e{5r#==_}maR51*?weXdn=(5RhScCB!2arL`I-V`@Am`0dp zLHm+%{7TId&4K<;r$QmE4Qzh=H{5pYr{bsJ-uzJYVN;5PCgTWA#)?{UHn{t7(9yOe z##VqJP}!G1@2)Sjzr!60)^~K}|0iBRUU17+QHBSWq&o^U3tWj#Oau@LlN#W~6XlAl zD!_=hh2H|D6z(>wJ`nZN0H4BnovBO6AW<$(kG#qbRD=&RUL!S@|G(s$31Bl-=som4d#YXSP3JcrqKIrOCXTl)Ul zKaz6;n_y?$Hy!rmn#8sEBkzTMmH^uR^W@c^;_8T+&O1bh%jr__M8ja{0tABR0S3fB z*v7Qx@JA_SpN*gMvynlch2!6 z$S1!67~2H2x+8=7oeh?td=Y6YLVh?Ohn0hptWh}=tB>?e-5bHItj`gRn(l5A z9pDEl11vX;FcTM+RH+B`5zp?u@;cp}|1tN(pwAZpAQ#66fno)Flrt-mC1yEFA|;(A z-6cIGdrA}9YO!F`%g!*u6`xK!}nnijwE8QRh!VwkA z=e?#CYsJqA#h=OYHz(y+k|X$%^|*XsMC3L1g1-tuLOTGqG zVQWlASv92*XX#PZOK)TuVp=j8SJ@CWu?eO{R-)aZQqc$|L-&D+L9zz@gD;M9wW!dy zbmZhC(zxnVnc^R-=^Zji`;3Q9tv`g`CG*YD8~AZCf3!w0-;hB0sHX{EAdkFOZiC4I zo3qnI^}LrM6&i-lmn1WZ_a4iVfDTc)fshT->SQXLK62s>MB7!Y?R99IL)%vFV|6qT za;SVd*)rcW-@MRrwdrc}b(T9#cbM<7*c78;@fy9B0x{oMZLYSom|H9}#3_~wEbCAz z^#19Ns=tHrLP{IilyW6x1zkAQ5n1K4Vn2ZJ#(SUyfFLqY9g;~llnO8Cw z7N{b1(oyF&lu@M@7|MkB>skq24Nnsa8LOSjom?j@>pLioIdxPR+qXl!@ky*u`y+=m zCD3;V<_v$xCyP0QR*RpRe$9S{e+55}z#QtUr-9AsBaq-DFsCtYo~q`0azjF&YM~XO$0cbRIodl`>+&xX#~S|MMH)ZyP`1ctdr~ zjq`qf-pw^bYLAP%Z+X3CrK{WvtHTvYd^9jXB0BJ!G7=NEkb+HsDRUP@b*|YP$4as&FQA zA@>#@D3p>FIoXyzM@>%XDtLI`xh!X-?`Y%t;*x6Z?YFh+l9F|eeMk8lZ+VVi&sX5@ z`sZ%pZ{#n_n_ky&+maW*{`$oww>8vF&(kh`;G&uQkf-@{evWp#_SdJiXJ=l7XABwm zKeL~+b;2w^-4FL)tF7QZEX$CrVji*+wLx!rpZs!&n?#MU!AL(~*=y_y$S%49*d&VZ zslz&l^$ZiaVNLFgl+{k`nvBnYKdxUJ)V+LQAxL_)58(G#Gb{Wxyn|Mw?Zz6W3|fPf zB)7mlAL@T!n$7M>s-c&^6%l6#v^C@+XNL_wbPO6O_95MG7mI@?xb

Hv;9;;24|P zlGl=$nzyk~DUH}135LFt>HoZ*NYmUXAB~FfCM#c~A}h=4af1^nQjqC(M~oTBB&!Rf zLX{z4+>R1eL}fyBw-Be~&C&fgv_F^$Mq3+sCxkI(MX*zV9pa8eVquE5w1&LY4Cze) zIUo)6TG`Sr?eiBp4mBU{dw1rw4Rs@~?7i*q(=VcaXhE0|95dVcPM36qTwry`d$q)2t>t+z zY|NCpPX1Oa=6@sQo;oHr($3cAizo2Z%Aj!sM{(1*1qHpX4UvnZN-)rr$(J-c4Awv( z!<_}Y@;#N=66k)G!SbjmRyZn}D?mu*zM`CtAe_YnqUwrMssaoQDsWAXv|JX`X5KOc zA6j4113MSv%Z0}e&9#fFl z=J(3g7$w^a$Yk`gtU!;~v)Uu3V!FK5W`z6jDu3AD?boBZzSL^NoTdV~@HCw(kSonS zJ8cHrz<+kImh_76Aq#gcW}4WVD!64&ab^7{9x=o3`DFhIRmGcV5zO~YdRbV^=QTNU z!Z|`tjuL9BcaL=oZoaswMi~hT6mza0nqpPBs<}$Y$qQ_;?ge6xQoQI1P#HTUhA=lL ztI0u!o}OV%JA=HHH237B_qq)Oc08VfeA?P?;-$5vIrYEZzyH_uxg{leb+2B3{i}7k zr9Y7>B8AI3I+hh?mr25^zTKrc1w9=dJq01SO_I!W$M@=J}@b4o!Hxap@ng}>oA$#zIeui`QpfneLjaStMplrZL zmFFMnpXy)eH)IL*JP;_t_59t!-Tq$)MktTR;Y@<{6u<{eM*eH$g8-5O>*C4&PgT|F zPXMFh_ldq<*v@_MlOl}Fc5lYQ2D3rV?rAZ^0dc96kq)Uw~Ht}Uw9I8|o_H#1> z(sso$ENE1H2t8nIQRETDc(F?AeL;ItyZ#ve%ImL+Lr*;;MR?>V=sRx#B%cS2NX705 z7Pm+*zz(HbWan_%#2L+2UPudY`+Q+vw{Ndcw3!0t?Orz5cp>Bvx#|h;K{^2Q$tQ(; zl`g$OWiKuG(b#R{+cr!-d^mFJtgh{~hu4iCTHD$8x%~C1ALUPMX%tmjb!_(7s++-9 z9rAf47iM!5w?l0N3{x@LGwnH{oPugkZK$?jM8W9BsU=ez7yCB)92x$q=E_QIPIPEC z-`tEezKpEO%2+h&j%Q}UAUL5S0XiW`#z$jW?kyNOO|*r4FWi`Vh{(|hIMUL=(M743 zapq`)SxF}uW8)$_foXLBjSUu-Y|rYH2rSl+fR7Q{tA2bj2OUzx&-{^PUP`W6!yld9 zR$sbv=TptYM^=^>f3N-G>!!{8KpXpac;;O%5rGo%?QNLyyJP zdjXwZ5fL)z$PXtWHH_kk*-;dfA>M%G0nfx3%XdbMC3%itqka6lVRwu6sr(mqp@Z9%lnY>HzGIl)uzf%f7Y|Rq&WWujEm`S z*nvK-Tn&2-G76Q6Q^keiMsYjJ@|rz3`ZB^9yeXh;BOE=mBFlYiLqX4B{`$9m`}*%tp0KxTLuou-TwJ_)rf>=FUXC5M9e1~Ix2vs1 zLawn+s5ZiTVcaMfoY?3Vvmv0!5Mj6i5)AT6wiwL>&6Q+jtTa+tA}vrhp?HW(u6VG?F0(wP85-2R$&w|4t;{9&!*HNJzN^qkhA%@>yTT?^mEzxoae z)B9W)-ytvp`~l;OaZA8gV@iG-{z;`b}nb+z}b5^n3edF8fPUPuyuajH(v$}iZw zL6}eS8I9;TI5(9Se&>xaB;#~&`@9!6|Wq%l{YEo zdev%A_(}fd;7x5NmzkNy)fbw~g#mxs-hu-KM+?M)g65_$1pA8Slp3pBxy;OEo)chD zXvDPXv1J$k^xWJco~R$q8P z6a)Mjx!ieb?t+|kIfA!399BYsnoQADqxj1V%?6_3LIHZ;3?St_?A%KSPy#IPKs(1rhR-|nPto)??N2av5^3N}OsD5PmL(c4i7314h$FkGj2=4G&;UH2NKePw-4WW~1N5)$r%xsW|y^qiXCn_5cZEMA7gRGLJGU>*T+}L|dX- z>nY+UuTwT!W$=2urzRkLc#=So>R`|z78T`Hi-0TosvSZoguEf^gP$p8gC)GHhi^u>^I%-O+^aXI;U0;%k^Ii#|u^hT)bn2^)aIl1oqzg~5( z_UU=&EnYltF7N(-?7atkT*cKld}rqFu69*+)w{H6R_|J^Bum!1$hO=h%T=~zTb5Rq zY)LDt7@KAw)X)r}g6Edd+%y(aPmCQ`@P@q z{eHg>tl7D9=bkw;b7tnunKS3yebF~-91Fg^c;J__XD+vksv}P>pEc*{p`ZS<)iE{K z)!Ws@oDc0_={@WEt8zc`wAD?XeE;zM7rrxdcJrL+M1@kT(R2tjTrFw%cq#AyL?Qy+ zeEx-$oIy7qYkkzw@sL|VSrM39dLEbw_4J32-uD2SF^y)9RA`Y{s@(3l1eXhwMUg8z zq$vJUDkaE5|YZo1~oF zz9s!T-P3AJ8Jpf&@}~b#`-+W)MU%vS#^d5=v6-xR9h-69_`_KsR%$6wYsgPzOXcF8 zf-^qNQk9Vrm!2%pBuPu{%$XhnBN9IN%85(V8^FOOdvvCcjeF=V%duq0P#D6w*NYK_;V+>4Tjf^-Vp(Pvs@ID=X zKC`2`s;ZOehUws4cO5kCO!tRqyZ@T8b=qoc|S{S(Zf9G5(| z;9kiPu6e}p{xF?QCF%toS4v)0vnwm9HH-hkpG_A!{n?M<&c=JDobO8gJ7``z<^)a~ zS*9Y;AbC=n;>qcXWN^NPiw&+2kqi%9Hd}P;QeuMOGRZ?OlW^A*4wGmoeXVOu7_*DP zq+qfLtW=uN5et|$-I$8B3F8mqk4HXctK_8ck~W?`VTp1|VJ~R&!Yf#+XqXHKO&Nqg zW`dv-!~b3DhFr0s#cxFY!(Q!lErzIBRl5+iaGIn6NMw?Lg-fsK|YP?gnDG@^JL>N5T#9d+W!XheNmLeWg>{6{fHp5f|dlfdPdyTEt?X#_Qn~RE=o99-#%*r#FIAV*94Y66m za2L?}OuETbTjPLf!!@q&fN{6Y4)N^mp;AfvXZD&YyE?_&#Ip`H!U?My5O`a{O<8(^3Pv)eP6?}l;nh6 z+wMCOips6ESVrp-qXP}@$vDql4g1;;6{l! zMJW=Iq7&kkw9g>>SL4bWSI%tx^qil4KgZtn?WWmxRaKY6i27yi2OqfqRaZ%|Z{C8l zCzo}{htK`j>8I?PyP)m1)2cS}7Yfeo>AR~f3h zh`GlOCl(rll|MuGPbs_0DlQaYZ z2DBWL4|>y>fBd%d4jialk(ak1Ej%l#>5)Axi<%asrxwOnZCt_c9B&6})y<+3 z*UkvmH~D`}KLYEJ zw4)<;L6hVz2-}tkT>!MK?N2g_9Qq z;#H-*gLqZ#{+rg~x<#NYZ#>+VyJNI%6ZGt(%aTp|F6!03zHk z4xITxch`N5jk6BKWMvI+-1KJK0lqn}pxov9#V|YKU%zZ?S!ror8s7zMu&P<;)^(^- z?Qz<`nun-W%o?K{2#GPFmIq9x@UZmoMrn>vGpYLZVVJA{cP@?o2Gtl0p=I;8D5`}1 z>D)Oube;bX5h#W3KTe`ja3QG*x6!c!u*QT5xD#@x;vthpIzjBHh5Mipvxkz+RIGJU|$eU?moZgLZpHjB`tl9m+;L5i*s2 z+}4!x0ZcE25Y2&xP!U5acY=x-G6CX0)I~pDm4HNGOGE$iUew*3w<)|8J-LcbJ+gZBpZaaf%A#P83xM#5#1jV)##`aopwSRm@lP) zLmnGR1G~+e&FUoLh^Ih)6-u(e1oT3l6@IR&@-#l!Y8G)gcM(b1@iAiL7;#{BLUw{? zcSni>q47nN2HiIJflN?032#YVqc&R;gS_23!z zpR@xP;pR_&Ki9QZN}-^&{u*?^LUCtrooCvX80htyt+8=QDNEzpQ?|x!P6-LCicX7; z5hP6a*=z%BLN~I0 z|91Z~{@?m9;h08bXV06L3s{P zUXLd%4~mwvQdU^n<4w{%eFa!19FEf+LwjVE2flNK5>;gviYYPHs+xsWT?1|GD4LHY zX|Bx>=t2yp4yp}tfkrJQ?>D}`khXxZR6yH5&E9=whKLM4#I006JOKM<)4yaNUUmDL z1+yL>VP72Zzq+)yu%s#{zxb@BymfphAFO=if#KWT6?x;?ydo|&eQ0{?hWw&5tXJ}e zp1K7RT&!HE;V86EPBo`OgRd4llen;Sm)ekDR_jsc=6h-szHb2Ya| zTCD2*uq+WerQCJz{OaZ@{>(=na+f4dPxl{N2p#Mpq$(DkB+fU}RD{hM4NnlS zJd6>KjX$~%3cE0ij<2|4^?xm`$dD9iktby`sVhNrG{t6u6lscZ93&YM9F(zx@^C1M z%7XV~($0kf@+2uuA`44DlqZ>CFJ#A#BM|ChiI`Ko zCTvZqFU(gOLi0Fjvyy#rPZA>8dy0!omHv2h(%Q}?({AlPEoplEyhfG%!Jndf z<|a-{Jf-K>nG4&y64ByQ;dS9j>2+b-LzAk;qE4$9rPRFhFnB^p8FX@TwWn@?=q7m*2OR|#PB`NO7sx=0>p_;#iGjQ*kTRjj^SfN`( z3#VK`$jlze7y{BH2rA{F+QeCM(CVoVw+ZD?U7Do(<(?2Fi6@uMnDL9Y(N}xIn?Ko5 zu_3phqP!q~wCuJ`d1vO~c5`;l%B-GeriU+je9eOErcYZuuxkCutakNTdAZp|B`t zvFOx5(#C6`gQClcOwbgE=Hlg{>A0-Pg(XQnACBY>*OI9mT}mYD93*5>dmbHs=$=RU z^qpeXkw?^yBhQG*7{N3P_LyU(l!$yY{h&lhgPvJ}iGN`=5= z$$ZlGPAUXymK~23_iWO{Jy1XIfa;pg$Y`gJ!LnWT?r;2MJ^S``4Ch58hgV&H`O-x# z?b&(l6b z(`ZMPFV7Ni6j0{mnp~&jFnWacWyi^Nj8$1X|E!S4v9$#|L!Gh@HtWp7;!H}IoSC_( zJaVed76R)Gl~I*bY^p_oHlJ8@?UXy8oi=5DdRiL)1&@fX`10enk9%}leg~L_!DB|W z%UT!OB<83?Vw-9X^%zJuAaV*n#k3V>#R@Rxnrs|Q6`5X8NogFjimF;dttMu%+CpI% z5w(i2M>r$62}^D`DkM2(61ZXNB!;q(4!=g(pz*SOUx70{%)AXs9Ze zThnpn1+E%R=bzwyj|N`cDIPo0gwFw)w4Ap~$cyAUx8dk#VjLQ68OjRJbbD4y)|xB< z_3Ma&xa@>F=8C9`b0svh7Tb)7mbj^KfwLr{k9i|bW+M^NQdw5b$Vh_8AG-o;V9C~V zaPmd0Kz(3aLQ8XyC!6Ed*fcd9ccmB~xxMY=-!?Zd1UJq)A6pRG@!*m>AKH7@Qdx3Z7`XggS7Qd0n!fUQBJA!2b#h6g-HfA8x7ivRR-0X2 z)0{oCM$JxEp0k!GrxmK!q_CRgsOL28?6Afu_C`{7YK4y=lcwG^e%Jx~NDkaGgj~E3 zhuJa!*+PxqI8D@49Z7@}y2)H0u%;P4m%&D?kBT6Xv<|8mHXaKD{gV(T0}A zzy4}LW5exj^JUE0o^u&iziQ_oFe&-(kr>MjiUw!I#sYG|U;i8@) zwQ5&Nx_bot;D>SqP4(Du>k_iDMrKNaXzZZ0LJ$k>Ac)5xCW~-i3ilPDaz?`m*Uo7! zr6WZ-L6Hh#;8+);GPU%`PxtXj`_6;O!Xr&Y_kL26lCrXNloto7K~9)C#av__i%_{W zvJsLpSOrpIXh0=2CNNu)Vs(IDz(Pc8(vJ(vj+d0B?^}7tx;>A>zE9HX#Z9-??_>9; zWbV3?UFCn?b#`{gVC}RThs?S^lrhFQY8GGRIRwWkFJg!Xm;CLR6L% zHc{eslqpQ6NC(~eZNz=@W6G2bjdFijFla2xoblZ?df^i-ZnQeij?wE+0|%0s&GE#J zLGskl0$b0VWM_?urjUj>2%NscJ;_jaa!3;CrX<@hh0H8Ht29eUxtXS?L-zRf4Kh*w zv3nnPKt~61GwoPUw<+uR)z2S{x;g#6Yu8I>od(0eS)e)%c|Hfg?yrvL}$R=5S<0% z{hzTGBNF3B_XfBA+NJ(ZW!{^Rm4~}y>DCLb556gn zltT)@=tea}N1M~(K4nU}dJ~jiY!Ps$6_XN~B(`T|ks+p((&)zMmS_>360L6nuv4c^ z0Np_zSP7T5t2O<=JKlAuZP8J!>N9KYyjZiOj}BRx+{53fHkaKqDK zUeCBInOy#LXwZ@j5t`iqHmGpI*!lYSm_ z-bqrn)Kgt2T-G_F$*P7;(ZyqpajL^)ZA`I|cr2+DrT`!qOHSPGEOj#<42Jao>VJ|sf&FyQQ#9y_WMO>|48x2nol!SP z5!fD01XfS-uLe6f6{|JT$`g}^aPvmW!EB}^(;U+Z(-|; z1$-$(e+%|>`~xa^pmssmbA~A;ZBklZyQ$AKoN7MK-h1hk0;pYu$J*DF_)4~wh?0_U zB`M=Fce;D6JIMNbb&&OUVok9%h1Qysbz)DX-}!)*&Vc-u6hkyC_0S~JG}vO`vc`;i za-^G8z##aos3w0k;&v#)MJFb;&uqPK-af-P{IA#TdJMKSa9d#3%ttoFClt(h?0PGM zG1j?-t!LyH=FhK#5z&Cf_zw@3Zk$^;RJYTAw6%2szwsN^nmM<9YDG$+o#Ro@|WgI2zBeY5u0C3PYLEcus6cNDyJ*E2o5k zuS_LJW(j35@G27G6C5H*xkMY)Nl6-`S*UqE{t+2C2JnRU#AA3)(uqxz7UnBe+k%@; zIqj8s^V*#+n)YK|F5Qml{vw7Hot#4F4Q+wJAYHL;QCvx z-u>K+3ZfTju~SM9bF}*=Hz)1ZDJ~PVTN|^j6RQpx)`V1vG+mP~fJ*hHjdtj`9(20OTzo>y z6-I=mmaANJXge2JLZL}xD91>7V)eutYHad|j-;OJG5b7yT{2e$tx2C5%j<~Fo~bRpC)gS4>#%UGVrEb zn%|NyQWKMsU=&uHGCMHw)3DN7M%xd{n^h-TkV&Yi9TsW}^Dzw&U@*r2j=fyCzBK>H zy38HpU(sU69?+{sa|!0s|4(?00L@F;i5%}y+Iau=8-=WfE2(f6prodlBQ#;H%a@6q&`7rLU7$Dnv`2L1N6Cua_hG7 z(StARH>N|55j?3K-&xqJYA)TL4iY^{j$H2I$tF>*&1`Z)CK575F@^Ahjqr@M4Zg92 z37Y{!f`EN}kQyu9ajV3&c74Y~`jff{!GHEI{XZcY0;Jnv*aOTE`_Py;_r?8%jp%{G zN1%qXUwYm%n-v%4eN!}|uZ##y_GmEvo#%D@PWm&Nt%Rpt%6{$?1qLcKyBfi*8HC<}H$l{-CCLM#cE zItCxT=9!k|Y_WN%#mCl~x50*ZxHa4yofsY$eRAShx;bZ2V`fVx&&*8sM8&w%7nYIs zS|XijRp2>sVKnr;aHWI6f{K!9$7QU{tV~?HKB)#RZJd?tm z2{qEg&KO+Bm_nm+K{r8`D-uUM? z>OJ-UguDnA1roW7Uut>-RtYj-lByLVHo+p`X{SKoB`MfrCl1*JNC zuk@U5y#U|dJywL}ktu)S4dN#BTB^ett-#X9q=rlH}leb z`_!xF-*9)^hVqNu>~Fl`il*M2^#g4)=hQnNNY1?Rm4$KU96E+r zXtpO6^tz)8Y)=*}SGc9FD z*5u~dizZ(Lb*Z8ug?T6X@j1y|NP zaxPy`)RvMOpPri5?wZ^`i7)Zbjwz2=yt&F7U&V9%!09 z)E=82njTxg3)EU(t2P%dFSOC+&`FMJhgxc#6sL;Rg%0joC_s+U&Vum#0&945oNAT_ zw-vhEP)U~Z<_F1Fq>Tb1MQwg^YhK5}@l2dSYqJ$8pig1i8Fa4Uj741bo9pg;Vs(4l z%ty9g`Cw~X=gP;Iwan}&D~_LCQadTZJuQBDL0!$})`bJYwe^;pwzO=Sq~>?e+HmoC zy^W`3sks|jcjfHH>PZbTw)D`P7XQ|Y$!WF}yR)Ng&YA^iP3U!+FNAhU9!_V+Jk~7< zY_oN1EbS=vdz#R`$$c&8kt|p_u-dGq*d%Lg>nrFMf zr90Ui#8DIRp|Rv0blPZRyKTB9J*lgG)%UmD;6J)zMd#X8%bDrgn~%09B*wH%j|;mw zJamiyTmO-dfA1e>As>FoENb)eJGvhBf6(dek=O7Z*~>E4uj}pWOwPzqJu|Xb##>8g zR`j3cznEpR$xvhYP^zxrz?{pw^-r13#yp!3xk7CcnLV$|aOKX)Xv$S%ll#I=ipXfR zs=4sX9^=S|v6f_EPQy`YA^HAmEc6vZK5fR`bnUzZ4e`F-5bzN^{sJ1IFsN>E@!I@k zR2#nhf)_M(lmGKSANK!=#UHL*TiCH;j;!rSf79$I@45Qtci(f(RrkVG`(OM|OIPiY ztikS>I!mwKhBIR3zjNU`uf6uptM9x;a|Z0|o5#%mf=AeSo~i;TEb`?PZb*U4+)1&u z=4SKeSe0zpXFK!lc`PqEMk%%zdy0L<+i+5BA{+KavPvHwe!W9hr~{+#X{wDTJcOX< zIQ>Uyyk5?}M(wgp`LhS9^W;APmey=Gg|)`4g|?G=|9;cUs0@kXAYitVTV88E7Ir1Fl!g>|r$XWo zJ6MOGNxUJ=I(n3+ zn&QM$^7&%gpR;P%(2c>f87m_^%9|mkc7WeCQ4qqJB}5glq_Q9ChDbE6Ma9=zhAiA- zrE}m1k*Lk}g>Sw9X%_C&(P<+VDx5Vk&9_qqtbL1*HE&Kl{@pWAHAQMZoc!M~2+p}8 z(6S%v7|i)01|e1*1M(uRVW4QX_bu{Rl$IJQ9c=WE703 z0&wKpVP_`610B-@d1P)yc12l>^IM7M>xIXVhTd?mOJylZB7p|XIRUZgZOWed0nz9U zT=7HN;VcKO{ddcUsIOD$*6K?Ry=8qZjy5|?&)f`aK{2UqHcxn@+lFoDasBViw=5H#ia}!`rr`AsFshPf55GYB;}_(pq&Y-)rROHP zePj1ESMR=cN!y|&t3kQunYZoRciXAm-KRb%iT4L(JM2_8%);tr`yAU~<02xwAmYDQ zwuOjxqU<)1?L^s2Fl_XaEorEAw$kMR#l=J?*)v%tW`rbnv=Xgj5QS%lJ33lPcceSh zMS6T*YXr53_;I8<4!_VrjX^VsY?jwMUZ6Sa_{PaS0ZmTe9OZVe%FWA6Oi7F3j{1yg z%O)zYvTAx%jn|gpOiT^2EHm4hs26k4i$s^<(92woDJZ_p4t|)YC12+aHYq>ZoSToT9M`;uUq1}?hAQzv2dHsVfEE)j5d!euwr1zh#86zG1l!S_Uy5%2TgDPX7yOzvHEps%K z0;hTASa>|=F{!OiOn8n~i!YwpmKmSIuDBw(^S#ddMC*eTR@hj5Dh0{>nXy!>VH zJHcB8j4BU73DTKonV9LK^I~XbcoTaV*%OgwEcklS+?f-i0Q0P!=PIF4~l$g{!^SL%(TkiCX%(A59LX&xMd;9%NY1^0>9-ibZ zUf_#&IO4Lfk-{i3&lYc>o-{YC@JwlStaWf(>ruhhU}jLrhoRkZlY{#lM=?%)k<5;p z6g;v$qAy|?L*(B~8k;`o*z|fw{Rf+dNkv=VN*FT-DkR>x_r@FVyLE2Iiuo-E&g`|+ zEWhUG%gUCwmmYlk?c?z3_EgfCJRYxzn0A5QSJ&x0$Tt;J;28109#}8%} zNc!Zo_U|yXWaVOh31GPN%mW`yU}%5)*p|yyF7d3B^NTN&*)xYSc_y7U@@P+FtTxlM zTDJ?fQ?T|S!OHET5!CP!Y}eA1)%6(uFn!m8E;qP3iIbA^7~!X|dyl7dkfS zQxM3dW7BGFBH9F^`R`3df$Ei%l+4dcPl-)TLSt4WSI?QKYiD7Ny>ziPEg?QG1eTXW zYLDrgT;+04WO8=vN0@*j;#+-bjLZ>G%eT=Ph61OlsQFI8ze3%eqD*+?xcHqgucZN@ zjS(6)7$X=c)G{wY_?eWKjA<(`;z#DKddFc0{xEZ4uxNj%Kdz!ch5}-fOX@Lmm|OC_ zhLWbS^(TEJ@y0K&yKcv={q^-5Z$07Av6vTcSih_!FR$eL9}FLwC3;N`IZLD}=WDzI z$wGs9BT`HQgM_PBl1HjTyCj2Uu$zWR!2`zD#fh1tR%NX+q=+F|p{hW7>IwGK}_sji5JwXV6C)9F1;kfSt-I=)vQf z9i9IJYKh~^jXFfio}8$I`TIZ}+E53r$Lm;r-4A*(sI}Yw3(yw*m!YjV5j0C$0Jp{e zWoRo;2yLRbmYf(G^_5Xm^wm2w%JjZU^+fYl%-2FmPN5D{^tOaEH}Z`@;Ry zfze~s&)a4&WkwVAnBKZBt*@TLSL6*qvl0fnz(r`XBNl-HqRkN-kYg=$POBBES;6N* zvjR4&(=)T860{t2R&|5KJ5Qe-CSi6+@x-v!REE<125KZAh*e(D>8kcF=8c52Me_T7X z{Ck*3j~x9}T^j_m$i2N&S#&1^OWWk_$pJ$8epS+GZ_t>6=DDn`27L~o+u_4zC>6sn zh5VXnbA`0AAX`zxbb%}*%@YHbE{_TB%xld%BTp!K5qq!(e7aP*H@hl6X-f)eEVr$Lot@pzc46!bD| z``LdCaY@G?tGCK=p|wiue;ey%|Ai7Z$&sR!u<$>ZK(u1?fE+jIWuhxtlAP@!2p39m z3A{3Mqm?FRdm1@`cA}BCzSA7tB0x$paxHP zJk;rcN<3j};o3q2c7Q_77fxV{QE;g?+w;~sOel4=C&rZ%)f29zCCA`OYlmLQ)tZLC{F@pGBuy24wW#wfdNM*GQoHEQeDa z17cvz7Zn@$?FKc#<1c1~8f{isr_Ddk4Dypmt-TBVy$l-oy4PSncU;SHLf^w^v2|J< zS!)*7$E-{VO6y(CA9BD4G5n%v&{C3vJQ^0$HFt+ zE~%wiqn0m;yL7O%xDHa5=g9*B=UcVeN3P}aG$;tVMmv&YfY&F^JP6N#i?w1|h(SH_ z)Fr5t>0B=bPODmT*XD91H<$cq82OJYCAdY((IVw#C$2%DMG6ZH&m0n(<#F_))*^4A zeK*QgqP8f|OLQ(|Cfd>3;Vr#gD<=h@fL?G8rbEH}ulICGY4}7>)7g>%Bhb@%`34L# z*6v^rz|)WZ0ezDUONG*66GHaz(bx9C1s2mAgVx&PeF9Ja0NlZYY^`<3${#-Z!5*vO z2NHSBptesXJ(6z|V0lQR51W-h5Hx1K5TZ}8EmonY};(O2Sa&} z!xwAzA>d2&(Hgcw zO5R-4oUjF%P1!AZ?IC?3Ls8)c58~``VN!g&BY{P$7Uxt4EM!fZX0a6&;)1pvCai&i~s zN>z)@ixjjG`jjg_RW8G=vukjdqEwmhsVvS94dGd-NimTj@uena%FQ=HQ7_(Jo{lTe z6YnCNPUbAgcakn3PEg3D3zTT&X__8~fYAc=0~}7|T5>fvyY5^!G!sZk(;biFXi{9r z4brhvw+|jFnp0J>Ec?*FpW+kZlD_c$IeS@g(ej)xHvKsvAu-k&)v9aT@3a z%GOMUBC(lSSO~K+II3h}ESyC!J9Dr|76rQ$G4MAP2W!j;ERiL#WR`-PWoa-}=42Tx z6WSr!EQd{Exws>j&kCTmTm&l>C9D*e6w6r!43bwd7c5w~Sq-a&1I@`eR&QWroYMn` zn$y^HHiI?6bnGlP8_IHU5Xa`R`D_6Um$$Notc@*Vi`f#`4_(HVvv#%uZa7y#uV*z| z!`5QQzm9dWZrB#>Ve45heBEwf8{w&TfDJMq8)BQ-F#PC_f&|S;syPy4%?O;3EF18y+Mfb1= z*`nF-dz-z(-evEx_t^*VdHfOk9s8Jl!hX;G!2ZZSWuLLn*`L@K?9c2F zJIuahe_>y-zp}rvzq7B|KiD_ypX^^SFYq1vo*iN1%+HQ;2v0ebf;cSKb7<(pJBgLs zcqk9!;XH!dxr0aYC?3sYcr1^@kwXGcG5x{yY9L|AhaZ|AGIJtTOV?`Jea~{LlOlKg_@6f8k&8zw*EFzw@v8 zKlnHNpZs6^TmBvYo*&`k+|Q2+1>#<4DMR#cqC3*C-DnjySiuW}`bvbb3x|jlQ6gHz zh*($viWdnYQ6!0ESjkBhX(AmbOBo_lWQlB%BPNMlktgy+fhZJ3qF9uOQV7_~MFmbq ztAtBb3%95dwW3Z;7WJY*Oo4FSBc_UJV!D_in#4>oOUxF{Vvd+A=85@Y0aTA$#X`|0 z7Kz1T3G5Fo6U#-rSRq!5RiZ(J9u6F3~N#@CvbB^ol;QL2MNLVn7TEA7uKQ z#IP6ir2*J;tlbpcuTx3-VyJL_r&|+1M#8w2xk-@ zi%-Pw1X@elEh_^0@n_*Q%;z86Qt zxbTak@W#vFl}o59bkNOkOBteCaVsWN4O7F_2-U7S)JQc7H>zUPST#Z} z)~S=#dbI%-02<*;bt>-CO^4^6CUvGdOP#GYt8>)3>O8p0T%fk7t?ELx4K{8T!?Vv) z>=Kr%?dl43rMgP(P*&;WfI6u9;Hq_#I;@VU zqtLS7te&K9QMalm!vW{1>S?Bu!Lj~+$DnU;pmTU*-{AUT@95a@plM{Nv&(DtZt3dp z90=Jo<{R~Puj{uBjt#8y4v+M$A2fIS`ujVFEkoYnF7M!|wQ~TmkoIkovvW zq0V9NV86F#)FxxYed~KiLpn!By~BMY8`Yuyu@O_3Z(yL)+`DzC*E?tij6PqtX{5h% zq*p!JJM0s_L9ZA+$!8kv9rmJfzOiAor*E@YjPz|Wjd(YE2TfiAst)!IdI787H)tL4 z4)n>G+V341F?lzQb@p3OuTB(;s(436`+S4EbM$|*=!UKv?(Ev=9i=*1*C8rV4bxL) z{X#oOy88OM`i8s425e)4-Ds9B->}!TezGy82c24AxpPM=*>@EYgSNqbded!JQ5`}B%nESLmeOey9T_p6rK%PMf-R#q{`n0UR zAaK4wR-cx2Ov^f^WgQF3Iu^*<-MN0fci7ww^gud9r6ELl{b(M`h_{QVz`PE`?;RyN zrRop$+VI5ysCZrfh;7)rzK=fec3ZoALtAB&TStdGyS+42OcH|-qqLAg3=yI&zZ?LCtuy1s$l?Z*HZ*XkHN)#!xh3Nz-AH-Jgpcoh{4+S2heVzT?eLX$akueMm zLeerc?CT!u8Wlr*<$yU#&D|gB8}9A_p%dMQAwB?F7(>;(qNR6$cY4h}jWP{-@AjQE zXw!zXjQ0E1_jPsl18WOvL{W23zYpCT+Bt;swn)6JeS=-Y-T|~+`1&zWlXt);DL*3c zq>X5Ae}CT)XwN)V_J?_@)=4e$hqp9wAEuJQZVYO(cYuDvj2VTfI^1~BT39~GIYY)| zqPe?ob6>aD((gOjJGkC!-D)(uwcUt?^k9@wbE!>Z!#;_xoP-FH#8*B^XuPM7_w-ve z`aoAlXwwc+2=#V^ELUb<*E!-1;7Sjn$U55V8 z-7scKE3$QB=njsmG>R?yAP(yt8(iNxJT}nZIW}tct;dAB(bUz6&&=~A37Pw~pG8{Y zi1xEW`#D+uV21K-^bTTn5>2DM!aLe)ZkO1ax5^*W;$9!t6f_({IS@hy#`;J5hWfXL zqP&qY*#X0$nCOjoxSa5fCkt}*cJ}w!@QXns44S$&)JY1=%|*9|b{sT$-?`D2-?wUeb&`!&zd zfOKm=Gh~BVn)FOwJyVnR)~o%@(~9rce&%V3{qjehhZ5C(Dt3YPdQkgWpye8rKh_qI zu1vT3jF`Di%ZQ;slYX0)e^~ojq$Q5XpOD2yyNnv`vRKPDDt}B%h)7Ih6k@F~N*Xg_ z<`o*WljV=Pf-pWAfoWDJrY&^1ceGQq_V$@N`-gfvP2Jx9(N2pOlLS_16BvkrPBGd! zCWdx$?}IHE0XW_~hxcs=9qb(Pjf@Waz%Zb52C1Hy&3%L2*3O>3 zzUuM{_-WQ-HMQp16%}RfO7raU8dsI}<0_X=m6bN%5NK8|0G6p*zgs%B-_Yq3Ln*Xt zBCbxSdUheOH0fVpF(8UDH)#ao)kv?2@_7-2&YJi-bp1qJokcm;BM6yg^u&5S5;}V# zUuf?{T%C;(ruHH*H*4d&PySe%bzJ&%T$(jp`ZQu~*6FZM`wg8l0WoyLL_B1!fyYKY z61I_6&cS}Hhkack^NiR1Mr45z8Pp@9X>h&31Z`>25%TE>wP*P2a;K;6wDKnpiW?dRa|vRk@Y;SuhHCi^)+k z!@Xg0^3>uZp~Nri@i56U8!sg5tt|--IS7LiOryR*-$=NDm3*>IrLiodVNKdlmJcCK zqgtx98B2`zz6CruhK2U9Bq+13Wx%^$%M{s%?8lT~k|n6qFxpKs+moKLG_KDV!K9fWt zj361M+x0BQvrSH08ut3ErBxMZ$cUA2m$8^Jt#-zzGErSeRaj4RA@(sqogPPNQdH?f z(?(eV?5(H*17mz}jBn|)__PX$;a;Cv&XMI79k}QM>L|zLqt*)}7)E*as`nu0X6h5OW7&+T07su396lx-1Y2lu>Pz zQC<~*R~~>;9)MCFfKm~FQW1bsVL&Ov{V^I5RHFdAiU58U0mu~r$Q1#|l>x|=0mzjB z$d!RMs0@@*87QMNP)22-jLJY6m4Py<0%c&t>X=pq%BTvIQ57g-qFt&2WmE;q(APNB zw<=IZbpWgCz!%klFRBArRR_Ls2e5JnaB&B4aR+d52Ozrxklg{u?f_(W0CG(La!sJV zHGwi}0%g<$%BTsHQ4=VmCQwFApp2S88MT2jY6E4|2Fj=nlu;Wfqc%`RZJ>Wkwn0Wkwn0Wkwn0Wkwn0Wkwn0Wkwn0Wkx;9%K~MT2g;bh*=3}a z)oNdWu=Q`N%PU>%d-eF8b!(m{Z0}l~$`VTyYlhh>W3Cls?DMBs?6OVFf z2s}DwU| zWjf^QG97YtnGU(SOov>J-kfS63L%J&vTbUhDz?r*)Dg4`l(ldKNl>(epd7Ns!8v3? zOi+#h;FusdfyCg_Br6mQOD04I!7?z94gzJQg=#w*iD9U=tBz| zeG_=r;Yl3y?_@ke`_3pfLi@~k#3os9T`O_Rk~C~h0iZT-AZl)s;LKk6;|SVsYmFQv zebN$wa%im{ltXLvpd5i>VuEr75`#eSs*%07fhH z88MA+tE&vUbs2Q)GU(P-VH)Z6Ztk>!C+qAP@visvYtbP*_lC;UP1w+kj+lD;hWj>| zMn@ptfYcNjO)`(!c< zC^q?kDNt7lN9-;)L*g;Et{*M5*^EDwt0y34hMW&st@s(~1>}M7LGMXu%}w5Zl5X3O zU$1Gnfvarm2;)g>Ih(}2mzvKp5!G7I(uplEa1JFvIxw4z%chHzNwTf=myVzmnZ-(t zDmx17sJBNeQYH>`4)txaqPexALS>`taoO}*JfzpFMXacg{#tg1o{H|!V`vgB7O0^9 z0v)8qLS_B*RP>P^LkDTGFs+-k2d&YD^wL9&NT}>6{Y!M07K5O5q*sqlG(iYDP$q@| zciF-g)R!pH0-WfVP7ClO8$==(MJEO)^>vT-;y7c255mx4dmu@FCUGFvOFAi0SxMx~l_kb*e+% z^p>oyteL=B-}fL*=V(!GpjT`4y$iiH;MM56Po(MlH^lV)7Ge|BWKap(RR0#S0Ilge z2Ws(Z2t|#R)MvzO;7oNE)CTrck2-=x>>9%mbl{{V1m(~;h@c!A2N9Gb05~QnS0FLC zG>wA@%B67-L9h(Wqk}RTX;hnGO&(0OF`_b6BBiCuXoO4+AQ2(+2Oc#@vT*Gi84Z`; z7^Q{FPmCuBf{oT4Gh#OI`bO)5;Wwg4HBdvU5tXSLmNHetQlXKgUmle=4?OuHd0o|_)3{`l}zc7;dYsF zGu}oj_M@jGbR1oaaM#iE5$={D;S(wGNkz&iZsj@fRW>mB2B8~yvXvScuRZ!S;)G8& zFxiQ486amX%jMg4nZ5$JWh<*>e3uM&%kTji?vc@Tv8-1yAb*3D?J}g=q5lD`M5&PR8Ni_gWj%_pO@_+>vqWh}JC~q; zDSefUUncY4Ec4$Y(|5>}oie^l!rYCpRI#CjOHs;Ngp-h`R4I^QvC@q=m0OC|#_di} z8s)D;y-Lwyl)qi3tde23%t_^zqWvk{CG+f-;T{?8MOcCQeu6MkhSV1ovKK03FI320 zs6fwt0?$m;3zf1LD&;7sMC->OWd^>glx<##cA)rn)T0IQlU1lk|kEj z600O+7wUUGZ2b}yxn#L6zPMG^=>o+bLVVTHg9r(-OG0)5CVjO_Lf9?CJt*CU z(eWs5T@bBS%ihG@RT-~7`UO(jQKM=(2BB>%SZ@-`XNFGMzkCCrFiPm8iZ*w zB&u@*+W8140Z%vjh{6hB<;EEN8lfAdyHN|w3(8E~R&t{*6wblOb)!ZUUm~F`g;uK@ zwIlfLGF&0URWj^AU%QoV34c3g1GjRSEahei`4$Q1UWwrjnZ8q|?2?%8Mpz?TphmVp zjil!q^v)rqQ%!4SO>0rp7ZInL)}p365vIv78*N)F$5buwzaH^687`OUtByW_6zc0* zIlgMqBb0~msYSm~oJM`E9QAdwtU6g%9q_@dB+IIkWz|WFs*`2a$+GHXS#@Zor;(FN ztV2&dfpEKw(}=EERylXGQLE{mttJkqa7%0mnqvNWE$i3Xn%ry zi_A~$UoS^}J=%my*(Kl7O3?s3pGHV?OM{$S8YFHF80p_2g<7UTwoHR;nFfrJw~<0E z-+-2(uc*WZIR+bK%QVQc8stc9knP_f+kXb|{0jHhR{-)1K=?{&l4HL~QezWRzDEkt z;Y?sfAE9!T(w9gYTOwO&iKMY5=&ARSelvP!i5ziDWVN+X$&0mLU(t zcgt`OX76Rl6Qi`F+<6EoXFE!#IL*NAsQZ@)+hj;(wWG%=!h97VSIN4pQWnc}pUgw`S|#hXO4e%? zDEY5Qp|)Bj>jg{vD7OPJzd=YaI{@=*goI}YU{ai5b|^j>-Xc?|rX8}T-Lj_L7%88D z5()oqiN8-m_95kv;*&WqlQeJ{>hg(l8R-8-gv1wJCRfJGWj>g(OItlhG#-LkCRvaH>*tlhG# z-LkCRvaH>*tlhG#-LkCRvaH>*tlhG#-LkCRvaH>*tlhG#2T<1a$^%Hb9&~TV3cCkw zLLsH^!J0XU5I#2%)?p6WgFi}H3ToVg5s-&a`}SUZ^`QLfL7B2wLfb2$?Um_!CA7T~ z+Fl85uY|T&Lfb2$?bW{}XiuTO6xPa+xV5KH(-P%rnU2*}#wq=2nNB+sm^j7%^s7W4 z#cvEHBL2^^v!efQwicW_``mxR(+j`(tmr==>35v5@`$o9bBOka!{bibTC=UtjQcQW zxj9pBZYygoD+)?Uxi#&K6yQz&w?c%2c3q z=8fg)WvOPdM72f7Erp^m&i4nMi-*TXMx6`1IR6^nSRP*%OBq6=Ba941&gQ|clJcUm z0_{bX@xr+nf@YN-Lu*Ek3-~UFIr>!ciIiTY<;g@(MUW(jNcsufUl%1-Cgf zDdNnF(e4-UGtX3BD{+3+dumZ}$(bp;%)9RleJC<~*}IG09{c^l%7Wdme`8%)_4hw* z_glkWelK~&BQJdR&H1}-*neKmpHExv7}>DpH=AO|4=n#C|K8=RuTsa0*F`QrGv)bB zSGfA0P{v##E-=Z@+(j#!Id+f#cT zC(FIT=z$~z@T!Zv{v6YkSO0Xz_ouvZ_t*DrJz_d?Wy7Ydy9@I^x+vOvfxqZHcIk?1 z*F7J3=NVr=^mxoeuPpuf#*lSQ2X4LnUDq~K=7+<@>ba&nPqoJVEN1#w|BRdersb0B z9R17vHrLh9UvSe$>d^HCr*&TP>(4_sU3=HFJ?o}5TzN%i#Wk51{Per-knDfF`W@)^ z1^iWW*wK%?_TA}+Grpg>{Ok*!pLzcFoG)Y69*6P&{WS0&iTJ+q+_D^Pbfg&r;K#?3 zF9B2-7C4fo%=WyPUyk90M)JRCY$_Lp0$ z?=7}|^jBZ*z2OVjnp`d0UR>Pr@fj{euK*~ymP z_S8!yH`RT;?XKl_yp`$w<3;ywxqja}v!?Z~EIw`gLEJbDMouT_fwkZNe9bTV9(e7P zp~7`pX)~M)cVxvrJIcRp{#$O+s{78}u+j_&!cQ1T5 z_VVY&AFVk{&7Up!#jM+3SvK?anx+59c;Tr@lZ$gIUcBy;Cp@#hcza;h=0EN)yUl*a zi`(9weEQAbURh9H82jCGF^50c`KKjQhh`QRonCg9^$z^mZ-)CB&K+BOt{VKw&X@PH zsKFcd@9}O5#+YMP?kxXdtDm@sD$B|>(kTd#&UD=Wz#S53y*n5AdPYyejS*)nj_vwz z-ZnhqoIX{~t2Jd+tmFSU66G_?W@wl>Xua_b50yCAZFRPJdrFFE{V18Ycm}N*)#X#l>NPm78GY;f zMp5hL8P4gr?=s@7bQU}3lLi|ORYxZpV`*o9U$?vn;M`nM9{RtUyVj_tt}L9u4UeRQ z3IxHT96-xsV!T0li{m9+;MzRk-h@Y$)&PlQcmzoR5yur`OMT3$)>`azSsqfbwN#gb zgTsg&mW{)r6A&Peb_T z9rGz#v7f(y0-qKtF-vQ{qFYT;rROzS=&y1T)1r0?=IY_ zyvO_g??ZK?p9=h1kF9>a^p4fALHQfQJeu4syrKOj9`S|}nu-p_c?gzyjRgJ)y%oDP zcL%R4c+oihLE8tix*Mw%SqYZv2kwy>e<-++NFI)tG>_eUcTD|-=%eP2FlEovcOE(i zR6i2NeQZ6Nwu4uk`*4rf&X`+6{vO7QE^E((cKrC~{hPlyr~7@AD(EkQP1~$*R_$uj z@sFneG*K2fUYm2}={k@5S(;$^wG(mqx4r6Lz4}J6%;$K5D;RRKg*S*>c(-h;v)BuB z!a2AAguZwlhQa$h8u6N)Y>A82nDOoA`PFs9ebR}7_nyRbm&897Seo*F21By&oK6BN z!~%@lmiW)ZEC@Sp*o;3%p6i+ zGL;(RR;>6RhS6kkK3!vRKB+3u8&MvlQRsD$c4E>ZNHUpLMy-*xnlh~pew>GxViAJK zW2843QMnPwj0nQM^?9bED!#Ei_t%iYgG>eyf~d+_B!;B3{eohnG+RmtpgMqgCR-j0 z3I!7lPf|q)H``njw)g86GLd)*Y2hNeLB+ zpvb6bN~)4&BSxLLj+Cm9O360iXOJ|-P$>!rdP=E4X*3~KQBo4xK?ibDp%Nq85ER3x zVLU{rRjEoEus45($*Cb>28fcU$*5_b$*eS*WEfU499#ga_c{Zly|K;!B42Fo1}H#NS=*urF~2#=ylO7(cl3WV+78)e z2Jt4n4zD@R?j#7SIf9#Uvx{J3Z7R3cO2U6EaG@g9#SKoGJRa6GRd%ZR~RD8EJCVI`8@h6sGi3M8`4#+qZe-|U&)-C5%3STMjKb~huiT{zgwK6rq=Atv#}=C5xJHicNjJRTnE zU7t5fS#jE-`3sUHJh5?+*_V?6Hx6ZRGoyhU84U-)y{`eDOifG8L99MadnH>~J&USr zc+FH+t~FJaYF9X}DS#Tx!sVFea5O;&FTO96YN|E z@n=;v8~3$O(ODvxEx2+)QD^SR+GIcuKXjC<>59R#A(~Ie z-dPa`iQa}Cm7P8dZugxUx!L)NQBSx}FrNGNER@vOT@v*S rYP+r{e&Z1@JQQ_%qUGhltAllW_T~D&wC2EQberG7&u%Kxw{iXrO&R#2 literal 0 HcmV?d00001 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 = 0×06 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 = 0×08 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 = 0×09 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 + + + DŽ + + + Dž + + + dž + + + 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² + + + m² + + + km² + + + mm³ + + + cm³ + + + m³ + + + 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 + + + kΩ + + + MΩ + + + 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 + pá + 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 + YÅŠ + + + + + + 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 + zÅ‚ + + + 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 + + + dì + 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 + + + + + Ré + + + Bliain + + + Mí + + + Seachtain + + + Lá + 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 + + + + + + TÉ + + + + + + + + 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 + + + + + + + yÅŸ + dÅŸ + sÅŸ + çş + pÅŸ + î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Ä“ + mÄ“ + + + 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ø. + mÃ¥ + 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Å‚ + + + 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 + MÄ“ + Sun + Siu + Ê»Aok + SÄ“p + Ê»Oka + NÅv + Tis + + + SÄnuali + FÄ“pueli + MaÊ»asi + Ê»Epeleli + MÄ“ + 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 + + + MÖ + 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.
    Erklärung:
    HTTP header wurden bereits zum Browser gesendet, wobei die Daten als Text gekennzeichnet wurden, bevor die Bibliothek die Chance hatte, seinen Bild-HTTP-Header zum Browser zu schicken. Dies verhindert, dass die Bibliothek Bilddaten zum Browser schicken kann (weil sie vom Browser als Text interpretiert würden und daher nur Mist dargestellt würde).

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

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

    ',2), + +/* +** Setup Fehler +*/ +11 => array('Es wurde kein Pfad für CACHE_DIR angegeben. Bitte gib einen Pfad CACHE_DIR in der Datei jpg-config.inc an.',0), +12 => array('Es wurde kein Pfad für TTF_DIR angegeben und der Pfad kann nicht automatisch ermittelt werden. Bitte gib den Pfad in der Datei jpg-config.inc an.',0), +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 für ein Balkendiagramm (barplot) müssen numerisch sein. Du hast den Wert nr [%d] == %s angegeben.',2), +2005 => array('Du hast einen leeren Vektor für die Schattierungsfarben im Balkendiagramm (barplot) angegeben.',0), +2006 => array('Unbekannte Position für die Werte der Balken: %s.',1), +2007 => array('Kann GroupBarPlot nicht aus einem leeren Vektor erzeugen.',0), +2008 => array('GroupBarPlot Element nbr %d wurde nicht definiert oder ist leer.',0), +2009 => array('Eins der Objekte, das an GroupBar weitergegeben wurde ist kein Balkendiagramm (BarPlot). Versichere Dich, dass Du den GroupBarPlot aus einem Vektor von Balkendiagrammen (barplot) oder AccBarPlot-Objekten erzeugst. (Class = %s)',1), +2010 => array('Kann AccBarPlot nicht aus einem leeren Vektor erzeugen.',0), +2011 => array('AccBarPlot-Element nbr %d wurde nicht definiert oder ist leer.',1), +2012 => array('Eins der Objekte, das an AccBar weitergegeben wurde ist kein Balkendiagramm (barplot). Versichere Dich, dass Du den AccBar-Plot aus einem Vektor von Balkendiagrammen (barplot) erzeugst. (Class=%s)',1), +2013 => array('Du hast einen leeren Vektor für die Schattierungsfarben im Balkendiagramm (barplot) angegeben.',0), +2014 => array('Die Anzahl der Datenpunkte jeder Datenreihe in AccBarPlot muss gleich sein.',0), + + +/* +** jpgraph_date +*/ + +3001 => array('Es ist nur möglich, 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-Größe (%d).',1), +5002 => array('Der Flaggen-Index %s existiert nicht.',1), +5003 => array('Es wurde eine ungültige Ordnungszahl (%d) für den Flaggen-Index angegeben.',1), +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 Höhe für ActivityTitles ist < 0.',0), +6002 => array('Es dürfen keine negativen Werte für die Gantt-Diagramm-Dimensionen angegeben werden. Verwende 0, wenn die Dimensionen automatisch ermittelt werden sollen.',0), +6003 => array('Ungültiges Format für den Bedingungs-Parameter bei Index=%d in CreateSimple(). Der Parameter muss bei index 0 starten und Vektoren in der Form (Row,Constrain-To,Constrain-Type) enthalten.',1), +6004 => array('Ungültiges Format für den Fortschritts-Parameter bei Index=%d in CreateSimple(). Der Parameter muss bei Index 0 starten und Vektoren in der Form (Row,Progress) enthalten.',1), +6005 => array('SetScale() ist nicht sinnvoll bei Gantt-Diagrammen.',0), +6006 => array('Das Gantt-Diagramm kann nicht automatisch skaliert werden. Es existieren keine Aktivitäten mit Termin. [GetBarMinMax() start >= n]',0), +6007 => array('Plausibiltätsprüfung für die automatische Gantt-Diagramm-Größe schlug fehl. Entweder die Breite (=%d) oder die Höhe (=%d) ist größer als MAX_GANTTIMG_SIZE. Dies kann möglicherweise durch einen falschen Wert bei einer Aktivität hervorgerufen worden sein.',2), +6008 => array('Du hast eine Bedingung angegeben von Reihe=%d bis Reihe=%d, die keine Aktivität hat.',2), +6009 => array('Unbekannter Bedingungstyp von Reihe=%d bis Reihe=%d',2), +6010 => array('Ungültiger Icon-Index für das eingebaute Gantt-Icon [%d]',1), +6011 => array('Argument für IconImage muss entweder ein String oder ein Integer sein.',0), +6012 => array('Unbekannter Typ bei der Gantt-Objekt-Title-Definition.',0), +6015 => array('Ungültige vertikale Position %d',1), +6016 => array('Der eingegebene Datums-String (%s) für eine Gantt-Aktivität kann nicht interpretiert werden. Versichere Dich, dass es ein gültiger Datumsstring ist, z.B. 2005-04-23 13:30',1), +6017 => array('Unbekannter Datumstyp in GanttScale (%s).',1), +6018 => array('Intervall für Minuten muss ein gerader Teiler einer Stunde sein, z.B. 1,5,10,12,15,20,30, etc. Du hast ein Intervall von %d Minuten angegeben.',1), +6019 => array('Die vorhandene Breite (%d) für die Minuten ist zu klein, um angezeigt zu werden. Bitte benutze die automatische Größenermittlung oder vergrößere die Breite des Diagramms.',1), +6020 => array('Das Intervall für die Stunden muss ein gerader Teiler eines Tages sein, z.B. 0:30, 1:00, 1:30, 4:00, etc. Du hast ein Intervall von %d eingegeben.',1), +6021 => array('Unbekanntes Format für die Woche.',0), +6022 => array('Die Gantt-Skala wurde nicht eingegeben.',0), +6023 => array('Wenn Du sowohl Stunden als auch Minuten anzeigen lassen willst, muss das Stunden-Interval gleich 1 sein (anderenfalls ist es nicht sinnvoll, Minuten anzeigen zu lassen).',0), +6024 => array('Das CSIM-Ziel muss als String angegeben werden. Der Start des Ziels ist: %d',1), +6025 => array('Der CSIM-Alt-Text muss als String angegeben werden. Der Beginn des Alt-Textes ist: %d',1), +6027 => array('Der Fortschrittswert muss im Bereich [0, 1] liegen.',0), +6028 => array('Die eingegebene Höhe (%d) für GanttBar ist nicht im zulässigen Bereich.',1), +6029 => array('Der Offset für die vertikale Linie muss im Bereich [0,1] sein.',0), +6030 => array('Unbekannte Pfeilrichtung für eine Verbindung.',0), +6031 => array('Unbekannter Pfeiltyp für eine Verbindung.',0), +6032 => array('Interner Fehler: Unbekannter Pfadtyp (=%d) für eine Verbindung.',1), + +/* +** jpgraph_gradient +*/ + +7001 => array('Unbekannter Gradiententyp (=%d).',1), + +/* +** jpgraph_iconplot +*/ + +8001 => array('Der Mix-Wert für das Icon muss zwischen 0 und 100 sein.',0), +8002 => array('Die Ankerposition für Icons muss entweder "top", "bottom", "left", "right" oder "center" sein.',0), +8003 => array('Es ist nicht möglich, gleichzeitig ein Bild und eine Landesflagge für dasselbe Icon zu definieren',0), +8004 => array('Wenn Du Landesflaggen benutzen willst, musst Du die Datei "jpgraph_flags.php" hinzufügen (per include).',0), + +/* +** jpgraph_imgtrans +*/ + +9001 => array('Der Wert für die Bildtransformation ist außerhalb des zulässigen Bereichs. Der verschwindende Punkt am Horizont muss als Wert zwischen 0 und 1 angegeben werden.',0), + +/* +** jpgraph_lineplot +*/ + +10001 => array('Die Methode LinePlot::SetFilled() sollte nicht mehr benutzt werden. Benutze lieber SetFillColor()',0), +10002 => array('Der Plot ist zu kompliziert für FastLineStroke. Benutze lieber den StandardStroke()',0), +10003 => array('Each plot in an accumulated lineplot must have the same number of data points.',0), +/* +** jpgraph_log +*/ + +11001 => array('Deine Daten enthalten nicht-numerische Werte.',0), +11002 => array('Negative Werte können nicht für logarithmische Achsen verwendet werden.',0), +11003 => array('Deine Daten enthalten nicht-numerische Werte.',0), +11004 => array('Skalierungsfehler für die logarithmische Achse. Es gibt ein Problem mit den Daten der Achse. Der größte Wert muss größer sein als Null. Es ist mathematisch nicht möglich, einen Wert gleich Null in der Skala zu haben.',0), +11005 => array('Das Tick-Intervall für die logarithmische Achse ist nicht definiert. Lösche jeden Aufruf von SetTextLabelStart() oder SetTextTickInterval() bei der logarithmischen Achse.',0), + +/* +** jpgraph_mgraph +*/ + +12001 => array("Du benutzt GD 2.x und versuchst ein Nicht-Truecolor-Bild als Hintergrundbild zu benutzen. Um Hintergrundbilder mit GD 2.x zu benutzen, ist es notwendig Truecolor zu aktivieren, indem die USE_TRUECOLOR-Konstante auf TRUE gesetzt wird. Wegen eines Bugs in GD 2.0.1 ist die Qualität der Truetype-Schriften sehr schlecht, wenn man Truetype-Schriften mit Truecolor-Bildern verwendet.",0), +12002 => array('Ungültiger Dateiname für MGraph::SetBackgroundImage() : %s. Die Datei muss eine gültige Dateierweiterung haben (jpg,gif,png), wenn die automatische Typerkennung verwendet wird.',1), +12003 => array('Unbekannte Dateierweiterung (%s) in MGraph::SetBackgroundImage() für Dateiname: %s',2), +12004 => array('Das Bildformat des Hintergrundbildes (%s) wird von Deiner System-Konfiguration nicht unterstützt. ',1), +12005 => array('Das Hintergrundbild kann nicht gelesen werden: %s',1), +12006 => array('Es wurden ungültige Größen für Breite oder Höhe beim Erstellen des Bildes angegeben, (Breite=%d, Höhe=%d)',2), +12007 => array('Das Argument für MGraph::Add() ist nicht gültig für GD.',0), +12008 => array('Deine PHP- (und GD-lib-) Installation scheint keine bekannten Bildformate zu unterstützen.',0), +12009 => array('Deine PHP-Installation unterstützt das gewählte Bildformat nicht: %s',1), +12010 => array('Es konnte kein Bild als Datei %s erzeugt werden. Überprüfe, ob Du die entsprechenden Schreibrechte im aktuellen Verzeichnis hast.',1), +12011 => array('Es konnte kein Truecolor-Bild erzeugt werden. Überprüfe, ob Du wirklich die GD2-Bibliothek installiert hast.',0), +12012 => array('Es konnte kein Bild erzeugt werden. Überprüfe, ob Du wirklich die GD2-Bibliothek installiert hast.',0), + +/* +** jpgraph_pie3d +*/ + +14001 => array('Pie3D::ShowBorder(). Missbilligte Funktion. Benutze Pie3D::SetEdge(), um die Ecken der Tortenstücke zu kontrollieren.',0), +14002 => array('PiePlot3D::SetAngle() 3D-Torten-Projektionswinkel muss zwischen 5 und 85 Grad sein.',0), +14003 => array('Interne Festlegung schlug fehl. Pie3D::Pie3DSlice',0), +14004 => array('Tortenstück-Startwinkel muss zwischen 0 und 360 Grad sein.',0), +14005 => array('Pie3D Interner Fehler: Versuch, zweimal zu umhüllen bei der Suche nach dem Startindex.',0,), +14006 => array('Pie3D Interner Fehler: Z-Sortier-Algorithmus für 3D-Tortendiagramme funktioniert nicht einwandfrei (2). Versuch, zweimal zu umhüllen beim Erstellen des Bildes.',0), +14007 => array('Die Breite für das 3D-Tortendiagramm ist 0. Gib eine Breite > 0 an.',0), + +/* +** jpgraph_pie +*/ + +15001 => array('PiePLot::SetTheme() Unbekannter Stil: %s',1), +15002 => array('Argument für PiePlot::ExplodeSlice() muss ein Integer-Wert sein',0), +15003 => array('Argument für PiePlot::Explode() muss ein Vektor mit Integer-Werten sein.',0), +15004 => array('Tortenstück-Startwinkel muss zwischen 0 und 360 Grad sein.',0), +15005 => array('PiePlot::SetFont() sollte nicht mehr verwendet werden. Benutze stattdessen PiePlot->value->SetFont().',0), +15006 => array('PiePlot::SetSize() Radius für Tortendiagramm muss entweder als Bruch [0, 0.5] der Bildgröße oder als Absoluwert in Pixel im Bereich [10, 1000] angegeben werden.',0), +15007 => array('PiePlot::SetFontColor() sollte nicht mehr verwendet werden. Benutze stattdessen PiePlot->value->SetColor()..',0), +15008 => array('PiePlot::SetLabelType() der Typ für Tortendiagramme muss entweder 0 or 1 sein (nicht %d).',1), +15009 => array('Ungültiges Tortendiagramm. Die Summe aller Daten ist Null.',0), +15010 => array('Die Summe aller Daten ist Null.',0), +15011 => array('Um Bildtransformationen benutzen zu können, muss die Datei jpgraph_imgtrans.php eingefügt werden (per include).',0), + +/* +** jpgraph_plotband +*/ + +16001 => array('Die Dichte für das Pattern muss zwischen 1 und 100 sein. (Du hast %f eingegeben)',1), +16002 => array('Es wurde keine Position für das Pattern angegeben.',0), +16003 => array('Unbekannte Pattern-Definition (%d)',0), +16004 => array('Der Mindeswert für das PlotBand ist größer als der Maximalwert. Bitte korrigiere dies!',0), + + +/* +** jpgraph_polar +*/ + +17001 => array('PolarPlots müssen eine gerade Anzahl von Datenpunkten haben. Jeder Datenpunkt ist ein Tupel (Winkel, Radius).',0), +17002 => array('Unbekannte Ausrichtung für X-Achsen-Titel. (%s)',1), +//17003 => array('Set90AndMargin() wird für PolarGraph nicht unterstützt.',0), +17004 => array('Unbekannter Achsentyp für PolarGraph. Er muss entweder \'lin\' oder \'log\' sein.',0), + +/* +** jpgraph_radar +*/ + +18001 => array('ClientSideImageMaps werden für RadarPlots nicht unterstützt.',0), +18002 => array('RadarGraph::SupressTickMarks() sollte nicht mehr verwendet werden. Benutze stattdessen HideTickMarks().',0), +18003 => array('Ungültiger Achsentyp für RadarPlot (%s). Er muss entweder \'lin\' oder \'log\' sein.',1), +18004 => array('Die RadarPlot-Größe muss zwischen 0.1 und 1 sein. (Dein Wert=%f)',1), +18005 => array('RadarPlot: nicht unterstützte Tick-Dichte: %d',1), +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('Ungültige Dateneingabe für Spline. Zwei oder mehr aufeinanderfolgende X-Werte sind identisch. Jeder eigegebene X-Wert muss unterschiedlich sein, weil vom mathematischen Standpunkt ein Eins-zu-Eins-Mapping vorliegen muss, d.h. jeder X-Wert korrespondiert mit exakt einem Y-Wert.',0), +19003 => array('Bezier: Anzahl der X- und Y-Koordinaten muss gleich sein.',0), + +/* +** jpgraph_scatter +*/ + +20001 => array('Fieldplots müssen die gleiche Anzahl von X und Y Datenpunkten haben.',0), +20002 => array('Bei Fieldplots muss ein Winkel für jeden X und Y Datenpunkt angegeben werden.',0), +20003 => array('Scatterplots müssen die gleiche Anzahl von X- und Y-Datenpunkten haben.',0), + +/* +** jpgraph_stock +*/ + +21001 => array('Die Anzahl der Datenwerte für Stock-Charts müssen ein Mehrfaches von %d Datenpunkten sein.',1), + +/* +** jpgraph_plotmark +*/ + +23001 => array('Der Marker "%s" existiert nicht in der Farbe: %d',2), +23002 => array('Der Farb-Index ist zu hoch für den Marker "%s"',1), +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-Unterstützung neu, damit JpGraph funktioniert. (Weder die Funktion imagetypes() noch imagecreatefromstring() existiert!)',0), +25002 => array('Diese PHP-Installation scheint nicht die benötigte GD-Bibliothek zu unterstützen. Bitte schau in der PHP-Dokumentation nach, wie man die GD-Bibliothek installiert und aktiviert.',0), +25003 => array('Genereller PHP Fehler : Bei %s:%d : %s',3), +25004 => array('Genereller PHP Fehler : %s ',1), +25005 => array('PHP_SELF, die PHP-Global-Variable kann nicht ermittelt werden. PHP kann nicht von der Kommandozeile gestartet werden, wenn der Cache oder die Bilddateien automatisch benannt werden sollen.',0), +25006 => array('Die Benutzung der FF_CHINESE (FF_BIG5) Schriftfamilie benötigt die iconv() Funktion in Deiner PHP-Konfiguration. Dies wird nicht defaultmäßig in PHP kompiliert (benötigt "--width-iconv" bei der Konfiguration).',0), +25007 => array('Du versuchst das lokale (%s) zu verwenden, was von Deiner PHP-Installation nicht unterstützt wird. Hinweis: Benutze \'\', um das defaultmäßige Lokale für diese geographische Region festzulegen.',1), +25008 => array('Die Bild-Breite und Höhe in Graph::Graph() müssen numerisch sein',0), +25009 => array('Die Skalierung der Achsen muss angegeben werden mit Graph::SetScale()',0), + +25010 => array('Graph::Add() Du hast versucht, einen leeren Plot zum Graph hinzuzufügen.',0), +25011 => array('Graph::AddY2() Du hast versucht, einen leeren Plot zum Graph hinzuzufügen.',0), +25012 => array('Graph::AddYN() Du hast versucht, einen leeren Plot zum Graph hinzuzufügen.',0), +25013 => array('Es können nur Standard-Plots zu multiplen Y-Achsen hinzugefügt werden',0), +25014 => array('Graph::AddText() Du hast versucht, einen leeren Text zum Graph hinzuzufügen.',0), +25015 => array('Graph::AddLine() Du hast versucht, eine leere Linie zum Graph hinzuzufügen.',0), +25016 => array('Graph::AddBand() Du hast versucht, ein leeres Band zum Graph hinzuzufügen.',0), +25017 => array('Du benutzt GD 2.x und versuchst, ein Hintergrundbild in einem Truecolor-Bild zu verwenden. Um Hintergrundbilder mit GD 2.x zu verwenden, ist es notwendig, Truecolor zu aktivieren, indem die USE_TRUECOLOR-Konstante auf TRUE gesetzt wird. Wegen eines Bugs in GD 2.0.1 ist die Qualität der Schrift sehr schlecht, wenn Truetype-Schrift in Truecolor-Bildern verwendet werden.',0), +25018 => array('Falscher Dateiname für Graph::SetBackgroundImage() : "%s" muss eine gültige Dateinamenerweiterung (jpg,gif,png) haben, wenn die automatische Dateityperkennung verwenndet werden soll.',1), +25019 => array('Unbekannte Dateinamenerweiterung (%s) in Graph::SetBackgroundImage() für Dateiname: "%s"',2), + +25020 => array('Graph::SetScale(): Dar Maximalwert muss größer sein als der Mindestwert.',0), +25021 => array('Unbekannte Achsendefinition für die Y-Achse. (%s)',1), +25022 => array('Unbekannte Achsendefinition für die X-Achse. (%s)',1), +25023 => array('Nicht unterstützter Y2-Achsentyp: "%s" muss einer von (lin,log,int) sein.',1), +25024 => array('Nicht unterstützter X-Achsentyp: "%s" muss einer von (lin,log,int) sein.',1), +25025 => array('Nicht unterstützte Tick-Dichte: %d',1), +25026 => array('Nicht unterstützter Typ der nicht angegebenen Y-Achse. Du hast entweder: 1. einen Y-Achsentyp für automatisches Skalieren definiert, aber keine Plots angegeben. 2. eine Achse direkt definiert, aber vergessen, die Tick-Dichte zu festzulegen.',0), +25027 => array('Kann cached CSIM "%s" zum Lesen nicht öffnen.',1), +25028 => array('Apache/PHP hat keine Schreibrechte, in das CSIM-Cache-Verzeichnis (%s) zu schreiben. Überprüfe die Rechte.',1), +25029 => array('Kann nicht in das CSIM "%s" schreiben. Überprüfe die Schreibrechte und den freien Speicherplatz.',1), + +25030 => array('Fehlender Skriptname für StrokeCSIM(). Der Name des aktuellen Skriptes muss als erster Parameter von StrokeCSIM() angegeben werden.',0), +25031 => array('Der Achsentyp muss mittels Graph::SetScale() angegeben werden.',0), +25032 => array('Es existieren keine Plots für die Y-Achse nbr:%d',1), +25033 => array('',0), +25034 => array('Undefinierte X-Achse kann nicht gezeichnet werden. Es wurden keine Plots definiert.',0), +25035 => array('Du hast Clipping aktiviert. Clipping wird nur für Diagramme mit 0 oder 90 Grad Rotation unterstützt. Bitte verändere Deinen Rotationswinkel (=%d Grad) dementsprechend oder deaktiviere Clipping.',1), +25036 => array('Unbekannter Achsentyp AxisStyle() : %s',1), +25037 => array('Das Bildformat Deines Hintergrundbildes (%s) wird von Deiner System-Konfiguration nicht unterstützt. ',1), +25038 => array('Das Hintergrundbild scheint von einem anderen Typ (unterschiedliche Dateierweiterung) zu sein als der angegebene Typ. Angegebenen: %s; Datei: %s',2), +25039 => array('Hintergrundbild kann nicht gelesen werden: "%s"',1), + +25040 => array('Es ist nicht möglich, sowohl ein Hintergrundbild als auch eine Hintergrund-Landesflagge anzugeben.',0), +25041 => array('Um Landesflaggen als Hintergrund benutzen zu können, muss die Datei "jpgraph_flags.php" eingefügt werden (per include).',0), +25042 => array('Unbekanntes Hintergrundbild-Layout',0), +25043 => array('Unbekannter Titelhintergrund-Stil.',0), +25044 => array('Automatisches Skalieren kann nicht verwendet werden, weil es unmöglich ist, einen gültigen min/max Wert für die Y-Achse zu ermitteln (nur Null-Werte).',0), +25045 => array('Die Schriftfamilien FF_HANDWRT und FF_BOOK sind wegen Copyright-Problemen nicht mehr verfügbar. Diese Schriften können nicht mehr mit JpGraph verteilt werden. Bitte lade Dir Schriften von http://corefonts.sourceforge.net/ herunter.',0), +25046 => array('Angegebene TTF-Schriftfamilie (id=%d) ist unbekannt oder existiert nicht. Bitte merke Dir, dass TTF-Schriften wegen Copyright-Problemen nicht mit JpGraph mitgeliefert werden. Du findest MS-TTF-Internetschriften (arial, courier, etc.) zum Herunterladen unter http://corefonts.sourceforge.net/',1), +25047 => array('Stil %s ist nicht verfügbar für Schriftfamilie %s',2), +25048 => array('Unbekannte Schriftstildefinition [%s].',1), +25049 => array('Schriftdatei "%s" ist nicht lesbar oder existiert nicht.',1), + +25050 => array('Erstes Argument für Text::Text() muss ein String sein.',0), +25051 => array('Ungültige Richtung angegeben für Text.',0), +25052 => array('PANIK: Interner Fehler in SuperScript::Stroke(). Unbekannte vertikale Ausrichtung für Text.',0), +25053 => array('PANIK: Interner Fehler in SuperScript::Stroke(). Unbekannte horizontale Ausrichtung für Text.',0), +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 für X-Achsentitel (%s).',1), +25061 => array('Unbekannte Ausrichtung angegeben für Y-Achsentitel (%s).',1), +25062 => array('Label unter einem Winkel werden für die Y-Achse nicht unterstützt.',0), +25063 => array('Ticks::SetPrecision() sollte nicht mehr verwendet werden. Benutze stattdessen Ticks::SetLabelFormat() (oder Ticks::SetFormatCallback()).',0), +25064 => array('Kleinere oder größere Schrittgröße ist 0. Überprüfe, ob Du fälschlicherweise SetTextTicks(0) in Deinem Skript hast. Wenn dies nicht der Fall ist, bist Du eventuell über einen Bug in JpGraph gestolpert. Bitte sende einen Report und füge den Code an, der den Fehler verursacht hat.',0), +25065 => array('Tick-Positionen müssen als array() angegeben werden',0), +25066 => array('Wenn die Tick-Positionen und -Label von Hand eingegeben werden, muss die Anzahl der Ticks und der Label gleich sein.',0), +25067 => array('Deine von Hand eingegebene Achse und Ticks sind nicht korrekt. Die Skala scheint zu klein zu sein für den Tickabstand.',0), +25068 => array('Ein Plot hat eine ungültige Achse. Dies kann beispielsweise der Fall sein, wenn Du automatisches Text-Skalieren verwendest, um ein Liniendiagramm zu zeichnen mit nur einem Datenpunkt, oder wenn die Bildfläche zu klein ist. Es kann auch der Fall sein, dass kein Datenpunkt einen numerischen Wert hat (vielleicht nur \'-\' oder \'x\').',0), +25069 => array('Grace muss größer sein als 0',0), + +25070 => array('Deine Daten enthalten nicht-numerische Werte.',0), +25071 => array('Du hast mit SetAutoMin() einen Mindestwert angegeben, der größer ist als der Maximalwert für die Achse. Dies ist nicht möglich.',0), +25072 => array('Du hast mit SetAutoMax() einen Maximalwert angegeben, der kleiner ist als der Minimalwert der Achse. Dies ist nicht möglich.',0), +25073 => array('Interner Fehler. Der Integer-Skalierungs-Algorithmus-Vergleich ist außerhalb der Grenzen (r=%f).',1), +25074 => array('Interner Fehler. Der Skalierungsbereich ist negativ (%f) [für %s Achse]. Dieses Problem könnte verursacht werden durch den Versuch, \'ungültige\' Werte in die Daten-Vektoren einzugeben (z.B. nur String- oder NULL-Werte), was beim automatischen Skalieren einen Fehler erzeugt.',2), +25075 => array('Die automatischen Ticks können nicht gesetzt werden, weil min==max.',0), +25077 => array('Einstellfaktor für die Farbe muss größer sein als 0',0), +25078 => array('Unbekannte Farbe: %s',1), +25079 => array('Unbekannte Farbdefinition: %s, Größe=%d',2), + +25080 => array('Der Alpha-Parameter für Farben muss zwischen 0.0 und 1.0 liegen.',0), +25081 => array('Das ausgewählte Grafikformat wird entweder nicht unterstützt oder ist unbekannt [%s]',1), +25082 => array('Es wurden ungültige Größen für Breite und Höhe beim Erstellen des Bildes definiert (Breite=%d, Höhe=%d).',2), +25083 => array('Es wurde eine ungültige Größe beim Kopieren des Bildes angegeben. Die Größe für das kopierte Bild wurde auf 1 Pixel oder weniger gesetzt.',0), +25084 => array('Fehler beim Erstellen eines temporären GD-Canvas. Möglicherweise liegt ein Arbeitsspeicherproblem vor.',0), +25085 => array('Ein Bild kann nicht aus dem angegebenen String erzeugt werden. Er ist entweder in einem nicht unterstützen Format oder er represäntiert ein kaputtes Bild.',0), +25086 => array('Du scheinst nur GD 1.x installiert zu haben. Um Alphablending zu aktivieren, ist GD 2.x oder höher notwendig. Bitte installiere GD 2.x oder versichere Dich, dass die Konstante USE_GD2 richtig gesetzt ist. Standardmäßig wird die installierte GD-Version automatisch erkannt. Ganz selten wird GD2 erkannt, obwohl nur GD1 installiert ist. Die Konstante USE_GD2 muss dann zu "false" gesetzt werden.',0), +25087 => array('Diese PHP-Version wurde ohne TTF-Unterstützung konfiguriert. PHP muss mit TTF-Unterstützung neu kompiliert und installiert werden.',0), +25088 => array('Die GD-Schriftunterstützung wurde falsch konfiguriert. Der Aufruf von imagefontwidth() ist fehlerhaft.',0), +25089 => array('Die GD-Schriftunterstützung wurde falsch konfiguriert. Der Aufruf von imagefontheight() ist fehlerhaft.',0), + +25090 => array('Unbekannte Richtung angegeben im Aufruf von StrokeBoxedText() [%s].',1), +25091 => array('Die interne Schrift untestützt das Schreiben von Text in einem beliebigen Winkel nicht. Benutze stattdessen TTF-Schriften.',0), +25092 => array('Es liegt entweder ein Konfigurationsproblem mit TrueType oder ein Problem beim Lesen der Schriftdatei "%s" vor. Versichere Dich, dass die Datei existiert und Leserechte und -pfad vergeben sind. (wenn \'basedir\' restriction in PHP aktiviert ist, muss die Schriftdatei im Dokumentwurzelverzeichnis abgelegt werden). Möglicherweise ist die FreeType-Bibliothek falsch installiert. Versuche, mindestens zur FreeType-Version 2.1.13 zu aktualisieren und kompiliere GD mit einem korrekten Setup neu, damit die FreeType-Bibliothek gefunden werden kann.',1), +25093 => array('Die Schriftdatei "%s" kann nicht gelesen werden beim Aufruf von Image::GetBBoxTTF. Bitte versichere Dich, dass die Schrift gesetzt wurde, bevor diese Methode aufgerufen wird, und dass die Schrift im TTF-Verzeichnis installiert ist.',1), +25094 => array('Die Textrichtung muss in einem Winkel zwischen 0 und 90 engegeben werden.',0), +25095 => array('Unbekannte Schriftfamilien-Definition. ',0), +25096 => array('Der Farbpalette können keine weiteren Farben zugewiesen werden. Dem Bild wurde bereits die größtmögliche Anzahl von Farben (%d) zugewiesen und die Palette ist voll. Verwende stattdessen ein TrueColor-Bild',0), +25097 => array('Eine Farbe wurde als leerer String im Aufruf von PushColor() angegegeben.',0), +25098 => array('Negativer Farbindex. Unpassender Aufruf von PopColor().',0), +25099 => array('Die Parameter für Helligkeit und Kontrast sind außerhalb des zulässigen Bereichs [-1,1]',0), + +25100 => array('Es liegt ein Problem mit der Farbpalette und dem GD-Setup vor. Bitte deaktiviere anti-aliasing oder verwende GD2 mit TrueColor. Wenn die GD2-Bibliothek installiert ist, versichere Dich, dass die Konstante USE_GD2 auf "true" gesetzt und TrueColor aktiviert ist.',0), +25101 => array('Ungültiges numerisches Argument für SetLineStyle(): (%d)',1), +25102 => array('Ungültiges String-Argument für SetLineStyle(): %s',1), +25103 => array('Ungültiges Argument für SetLineStyle %s',1), +25104 => array('Unbekannter Linientyp: %s',1), +25105 => array('Es wurden NULL-Daten für ein gefülltes Polygon angegeben. Sorge dafür, dass keine NULL-Daten angegeben werden.',0), +25106 => array('Image::FillToBorder : es können keine weiteren Farben zugewiesen werden.',0), +25107 => array('In Datei "%s" kann nicht geschrieben werden. Überprüfe die aktuellen Schreibrechte.',1), +25108 => array('Das Bild kann nicht gestreamt werden. Möglicherweise liegt ein Fehler im PHP/GD-Setup vor. Kompiliere PHP neu und verwende die eingebaute GD-Bibliothek, die mit PHP angeboten wird.',0), +25109 => array('Deine PHP- (und GD-lib-) Installation scheint keine bekannten Grafikformate zu unterstützen. Sorge zunächst dafür, dass GD als PHP-Modul kompiliert ist. Wenn Du außerdem JPEG-Bilder verwenden willst, musst Du die JPEG-Bibliothek installieren. Weitere Details sind in der PHP-Dokumentation zu finden.',0), + +25110 => array('Dein PHP-Installation unterstützt das gewählte Grafikformat nicht: %s',1), +25111 => array('Das gecachete Bild %s kann nicht gelöscht werden. Problem mit den Rechten?',1), +25112 => array('Das Datum der gecacheten Datei (%s) liegt in der Zukunft.',1), +25113 => array('Das gecachete Bild %s kann nicht gelöscht werden. Problem mit den Rechten?',1), +25114 => array('PHP hat nicht die erforderlichen Rechte, um in die Cache-Datei %s zu schreiben. Bitte versichere Dich, dass der Benutzer, der PHP anwendet, die entsprechenden Schreibrechte für die Datei hat, wenn Du das Cache-System in JPGraph verwenden willst.',1), +25115 => array('Berechtigung für gecachetes Bild %s kann nicht gesetzt werden. Problem mit den Rechten?',1), +25116 => array('Datei kann nicht aus dem Cache %s geöffnet werden',1), +25117 => array('Gecachetes Bild %s kann nicht zum Lesen geöffnet werden.',1), +25118 => array('Verzeichnis %s kann nicht angelegt werden. Versichere Dich, dass PHP die Schreibrechte in diesem Verzeichnis hat.',1), +25119 => array('Rechte für Datei %s können nicht gesetzt werden. Problem mit den Rechten?',1), + +25120 => array('Die Position für die Legende muss als Prozentwert im Bereich 0-1 angegeben werden.',0), +25121 => array('Eine leerer Datenvektor wurde für den Plot eingegeben. Es muss wenigstens ein Datenpunkt vorliegen.',0), +25122 => array('Stroke() muss als Subklasse der Klasse Plot definiert sein.',0), +25123 => array('Du kannst keine Text-X-Achse mit X-Koordinaten verwenden. Benutze stattdessen eine "int" oder "lin" Achse.',0), +25124 => array('Der Eingabedatenvektor mus aufeinanderfolgende Werte von 0 aufwärts beinhalten. Der angegebene Y-Vektor beginnt mit leeren Werten (NULL).',0), +25125 => array('Ungültige Richtung für statische Linie.',0), +25126 => array('Es kann kein TrueColor-Bild erzeugt werden. Überprüfe, ob die GD2-Bibliothek und PHP korrekt aufgesetzt wurden.',0), +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: Ungültiges Argument für Set(). Das Array-Argument muss 2-- dimensional sein.',0), +27002 => array('GTextTable: Ungültiges Argument für Set()',0), +27003 => array('GTextTable: Falsche Anzahl von Argumenten für GTextTable::SetColor()',0), +27004 => array('GTextTable: Angegebener Zellenbereich, der verschmolzen werden soll, ist ungültig.',0), +27005 => array('GTextTable: Bereits verschmolzene Zellen im Bereich (%d,%d) bis (%d,%d) können nicht ein weiteres Mal verschmolzen werden.',4), +27006 => array('GTextTable: Spalten-Argument = %d liegt außerhalb der festgelegten Tabellengröße.',1), +27007 => array('GTextTable: Zeilen-Argument = %d liegt außerhalb der festgelegten Tabellengröße.',1), +27008 => array('GTextTable: Spalten- und Zeilengröße müssen zu den Dimensionen der Tabelle passen.',0), +27009 => array('GTextTable: Die Anzahl der Tabellenspalten oder -zeilen ist 0. Versichere Dich, dass die Methoden Init() oder Set() aufgerufen werden.',0), +27010 => array('GTextTable: Es wurde keine Ausrichtung beim Aufruf von SetAlign() angegeben.',0), +27011 => array('GTextTable: Es wurde eine unbekannte Ausrichtung beim Aufruf von SetAlign() abgegeben. Horizontal=%s, Vertikal=%s',2), +27012 => array('GTextTable: Interner Fehler. Es wurde ein ungültiges Argument festgeleget %s',1), +27013 => array('GTextTable: Das Argument für FormatNumber() muss ein String sein.',0), +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 für eine Skala. Bitte vergrößere das Bild.',0), +22004 => array('Die Etikettendefinition für Windrosenrichtungen müssen 16 Werte haben (eine für jede Kompassrichtung).',0), +22005 => array('Der Linientyp für radiale Linien muss einer von ("solid","dotted","dashed","longdashed") sein.',0), +22006 => array('Es wurde ein ungültiger Windrosentyp angegeben.',0), +22007 => array('Es wurden zu wenig Werte für die Bereichslegende angegeben.',0), +22008 => array('Interner Fehler: Versuch, eine freie Windrose zu plotten, obwohl der Typ keine freie Windrose ist.',0), +22009 => array('Du hast die gleiche Richtung zweimal angegeben, einmal mit einem Winkel und einmal mit einer Kompassrichtung (%f Grad).',0), +22010 => array('Die Richtung muss entweder ein numerischer Wert sein oder eine der 16 Kompassrichtungen',0), +22011 => array('Der Windrosenindex muss ein numerischer oder Richtungswert sein. Du hast angegeben Index=%d',1), +22012 => array('Die radiale Achsendefinition für die Windrose enthält eine nicht aktivierte Richtung.',0), +22013 => array('Du hast dasselbe Look&Feel für die gleiche Kompassrichtung zweimal engegeben, einmal mit Text und einmal mit einem Index (Index=%d)',1), +22014 => array('Der Index für eine Kompassrichtung muss zwischen 0 und 15 sein.',0), +22015 => array('Du hast einen unbekannten Windrosenplottyp angegeben.',0), +22016 => array('Der Windrosenarmindex muss ein numerischer oder ein Richtungswert sein.',0), +22017 => array('Die Windrosendaten enthalten eine Richtung, die nicht aktiviert ist. Bitte berichtige, welche Label angezeigt werden sollen.',0), +22018 => array('Du hast für dieselbe Kompassrichtung zweimal Daten angegeben, einmal mit Text und einmal mit einem Index (Index=%d)',1), +22019 => array('Der Index für eine Richtung muss zwischen 0 und 15 sein. Winkel dürfen nicht für einen regelmäßigen Windplot angegeben werden, sondern entweder ein Index oder eine Kompassrichtung.',0), +22020 => array('Der Windrosenplot ist zu groß für die angegebene Bildgröße. Benutze entweder WindrosePlot::SetSize(), um den Plot kleiner zu machen oder vergrößere das Bild im ursprünglichen Aufruf von WindroseGraph().',0), +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 für das Odometer (%f) ist außerhalb 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 möglich in Code 128',1), +1004 => array('Interner barcode Fehler. Unbekannter UPC-E Kodiertyp: %s',1), +1005 => array('Interner Fehler. Das Textzeichen-Tupel (%s, %s) kann nicht im Code-128 Zeichensatz C kodiert werden.',2), +1006 => array('Interner Kodierfehler für CODE 128. Es wurde versucht, CTRL in CHARSET != A zu kodieren.',0), +1007 => array('Interner Kodierfehler für CODE 128. Es wurde versucht, DEL in CHARSET != B zu kodieren.',0), +1008 => array('Interner Kodierfehler für CODE 128. Es wurde versucht, kleine Buchstaben in CHARSET != B zu kodieren.',0), +1009 => array('Kodieren mittels CODE 93 wird noch nicht unterstützt.',0), +1010 => array('Kodieren mittels POSTNET wird noch nicht unterstützt.',0), +1011 => array('Nicht untrstütztes Barcode-Backend für den Typ %s',1), + +/* +** 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: Ungültiges Format für Eingabedaten, um sie mit PDF417 zu kodieren.',0), +26004 => array('PDF417: die eigebenen Daten können nicht mit Fehler-Level %d und %d spalten kodiert werden, weil daraus zu viele Symbole oder mehr als 90 Zeilen resultieren.',2), +26005 => array('PDF417: Die Datei "%s" kann nicht zum Schreiben geöffnet werden.',1), +26006 => array('PDF417: Interner Fehler. Die Eingabedatendatei für PDF417-Cluster %d ist fehlerhaft.',1), +26007 => array('PDF417: Interner Fehler. GetPattern: Ungültiger Code-Wert %d (Zeile %d)',2), +26008 => array('PDF417: Interner Fehler. Modus wurde nicht in der Modusliste!! Modus %d',1), +26009 => array('PDF417: Kodierfehler: Ungültiges Zeichen. Zeichen kann nicht mit ASCII-Code %d kodiert werden.',1), +26010 => array('PDF417: Interner Fehler: Keine Eingabedaten beim Dekodieren.',0), +26011 => array('PDF417: Kodierfehler. Numerisches Kodieren bei nicht-numerischen Daten nicht möglich.',0), +26012 => array('PDF417: Interner Fehler. Es wurden für den Binary-Kompressor keine Daten zum Dekodieren eingegeben.',0), +26013 => array('PDF417: Interner Fehler. Checksum Fehler. Koeffiziententabellen sind fehlerhaft.',0), +26014 => array('PDF417: Interner Fehler. Es wurden keine Daten zum Berechnen von Kodewörtern eingegeben.',0), +26015 => array('PDF417: Interner Fehler. Ein Eintrag 0 in die Statusübertragungstabellen ist nicht NULL. Eintrag 1 = (%s)',1), +26016 => array('PDF417: Interner Fehler: Nichtregistrierter Statusübertragungsmodus beim Dekodieren.',0), + + +); + +?> 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 0000000000000000000000000000000000000000..67b1d775c46dd2c5be383ceca59f26cbab9b4d97 GIT binary patch literal 1150 zcmbtSO=uHQ5Z<8T(O$H85bH%eDkZgTv`MQd2;xB@ClB5P5rm#Zil-hti>SSbNYR1^ z|DbMnQxz;yM1z)OcN72GG)4?bn@CI~G@su*c151slN-Lwd*94AZ{Ex^j0k^ST?W4% zIv7;LHs8+=$rQy4F8`%(Vv5sHRa}x{vJiUern^fR3`wS_YLb zlW@%a>2>r;$LvG>n~mmb2CfyuTDyVO;v8Gh zTV+%i?_uG|ZZzv2TJ?NzmmMMcZr0x}q({|RA77s0J*Lp$Hl>DH~YM-trH=Z@4s!uD+5B$3(X!}(^Bthl#9nPTd6>B&dqCYKtFMpU& zeRHh?N+&hsW)GvXIE7`omlZ4UEnN)JZ}CziFXX-O%z4%`_ct6fIxla8F%QWf)%CI` zA0y=4sO~4X)%TsD-K6`2J$()_9qa>3?gSyZV*wXt#qY;iv;)L0B1trf*I^o+V_Yxc f5q=Mqm7Z+ZW7peDEOCyId7mf#c{7Fq{11Ku^&;zk literal 0 HcmV?d00001 diff --git a/webdir/images/bg_content.jpg b/webdir/images/bg_content.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e4f146e6275fdfaf86927050c31e51968955af9c GIT binary patch literal 3764 zcmb`K2{@GN7r@`|`(|I5F+<2Q_N}poK|*626d|IGW+uim7=yGgQlUtarBV_}mo}7k zDJ>E$+PmZm<(6(q`~1JD`_TRWpL_rJxz9cG%san1?>X-|?>X=HJntvFC+h|@A5Weq zfM5Uw=m*G#0Np)>ADa#!fB|wPkUgc$=5e_T0s{R#d43)Mf&id+`-#K}Fb#lsu~ZW1 zHH|epES!aJ2QVN49Iyf)lAoM7J;*Z{T?6nuxU6K9D8EOU883`X1^`2m>!m_| zG|HAJQzXHGT$HB(K%hkZzzct1sc$uX=15UAQPRB~Hqc7nPq7myjZ1B_~Gmg)H`e zAL4)P_(NJh)lB$OjA#!@#gGY>X4e8#4>T$0T7^ zU~(`enEjXrObg}~rUx^O`HH1tHLzw_M=TFJ8ykg9!)9U&v6a|*>_zMyY#;U=4u@00 z8R6`4-ncMa3~nhd2e%VfhdYPs#P#Av@OZo$-VE=I_s2)#rT9#IG5#R_EdD0G5C5J( zCTJ6^37&*-f|#&|P)ImHI77He=qG$4(uf8`N1{JbKujm*5-W&J#2dsu;wKWFWJGc% z1(RY(t4T$qTGB<*Bhni(nXF58AkQR=$g9Xjl^RZ!Qa4kpsTZhEsP7dR3g!wt1%bj!g;IqEg_{a56^V)lif)SY6_+R$ zDjrq5p*Tb%(hO-_S|n`+t(10xc9%9nXV9(a{`7cy4*dZA3VlEcuVkp?p(IesP}-|> zL8+I4F!UH)2A{E(QNg&#=wsrTMobKJuX^_l8v>bul0st-+MPIQ{cpO`iA$ixR4u!gBdpvF>-y&7#ABbr*8UYd!T#hMp1 zhqP3*T(x4f3bf8>4QeyAr)rC|3$)K_KW8bk+*om}B327)SVu$0TPHvSLMk@Prvi}VWgn)QbDwe_d#FVnBle_%i~;21<3Y&U2%7&SC93^iPD*l0Ll zq-w-7T4GdV^vIZM>|&f`TyA{Z1ZToAi8a}2(qRgl+L}h2mYUu$gU#&BL}ok9IwxT# zIZP5yDxY+hO<}vSQ`t4_9&;6QKl3%_jpi>c^ew_Iwpg@Ue6_T-jI*q;d}yU)$j%Yg22!b*c4j8>)?`%}Sf&Hm@g}O%_hxHTj+`!*;sudfR5(FLw5J61!TvL3@4s z2>TuOcR5T>04IlY*#YY?&0(d(DTfb^c8*fVBaW|}*iNxd2b>0`7)=pQshHC1tm_=< zyvMnFDr;)Q)ZJ6NU36R`UCLday6U+KTq|As-AvqK+zz_EoMt&qGOd2vDA$p@oO{k4 zarbi1a&Pxg@|fjO;_<{&*E7nq#&g)q)@!NPId81DulE-3yF5)EpI6Nr_ObU_?$hE+ z@eT4V@qOxN>L>AQnhsC*nZ9-UqZtM>#4{TGfj`fGtN-HwqkyD5gbG}JvbKeT(c#q8y?uZ5|HiNcPD z0rxz$Lh+J?q0viz;aUkMzq<>_2 zf#CU5%DL)O5#{?OM+Iy;)Kpbv&78A?j*;gZArrtUrA*$lsqr_ zxRi-rrrJ`BQ`V*Qq)tsOO?{shl6G`4eX)3PTe@lb#`OLro=f&E#VqA7ZC<9cZ1u99 zz3A)>c2Av3UG^bxDCN-e z!x4wOj`$vFKFT>-d(7b2j(SFYRs+U?kWg64-8W?#77GP9-qqVL7ampm_BXmx8nd)fK& zsVk0GPF&?&ZMvWY?zb-8=H0$_ zXU3h*u3268?#{j2eNS+2;C|fw*AG%3e0sR*5%y8mW7^}wCmK)6e>VBKuG_BrbdP&a z+tZ+@4}1B&FMdh><#S)gGwQR#e(nD10qcQNgPwyO&*wbvdy)9!(@^HG^j~+pG=6#P zmFugv;n~A|uO+W#zvaA9dsFpx^4sQ-fRQKf;@^E5&3do)e*Xu~ht`jwANxP0ea3$- z`eO2>>8tP8N3wXCO!g8exCsW4ApdKZ9X4?za{dhxdf9v5Uxe)onU2%Sa0V-tTD zWaj{#07%FH0?`3XhY&g>YXL&^dIKYWxZ>am5C%t*zYhITXb@_Pr6A*4=rD}2#SL4z zB}ovQWNf`%>S{cJ{y&bg2Y`ZxfawSwxPZ}D4pqS&geuL)T{}1RDJdks>CbtZyZE{0 zdIfmN_}c$6K{Hn5ojiD|so*lZFL!k)n?^0Z?pV3XgY)v`v7rRxyyUX7DN)R&tpP)v mL`KKI9DHm!gi-p;WK~dIh4~8$^L^Ijbbj}&Ywn2b{(k_nAWI+s literal 0 HcmV?d00001 diff --git a/webdir/images/bg_foot.jpg b/webdir/images/bg_foot.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b2126bbffe92227926ba14668999716e0bc5d154 GIT binary patch literal 5908 zcmeH~c{tSD8^F)^`<<1+j2S|fvF}9Lv+qmSl5AInnZa0wtWlw^tD>TkLM1Aa;#Sv^ zNnQ^0CGbemNQwg43yJRj!2A)=IJLSE3cO=BKP)1x(&PZUh5>f6&Ss@}ml8y2#%CtyUU@QO_ z5>Fq;VuYf+3}sS`r-wDlD*+&oLcZakZ#a&%5sec7>!|3Y7O4l(mGNe1O z5+hh~ahh&{jPSr1CfzzJGCGixgl^35Yvy?YVP0)&sqq)iXstd{op!R0~#0I|V6pjHPlny{m=QryS z<<(1QTwJuVwsvA-q86LQ(BdWZi~L7}FP8rrzL`&pH{X}s(QR14f$bY4;!Q4vw` zG4$BzKn9Dh`S(TqUpsyi);Dozc(8(5F)R)`l^0rNY)%Ne-5e%6jvd9JvpN52hyP2r zZ(`u#=ekCLdg2qHt=9tNP8vX7wF3;5A0Ylm(H`i_zPS*+0Po~^%Zz=ldz8`s-`hVm za5nk~$Ff7{JhiolC!G-=lfYy2Oz;{k-~&Q{2E>6hkOwM26X*g1U;-?FEpP&^z!Ug_ zb$|gvK_rL)iC{C>3NkjH0Vo0|Ksl%c=RqyF46cD2;5N7e?t(!u1V+J2FbO_@ zc?g2=kN`x5#330-5mJYAAw$RvvV~kA56Bk^fI=V+6c25NeuA=~eNX{Z43$IYpo`Eo z=qA(!-G_#uap)~H2O}^EromFM608jy!j`Zz>a{)NGsBV3?UQ9M+^=_#n3UD z7!!;GW(|gc*?>vG?7|daPGM>=Etnq6FlG|-2`hk=#HwSBv5r_DYzQ_Hn}N;4mSU^1 z*Rgl8qu38P98MIcj5EMF;CyjmxJ|fSxFfhKTqCXvH-ekSpk#wK*PC!6FNx(wDPasZUk3hLVv%n*PSwX6xmY|~`Q!rJqP_Ra@ zTky3IQAkn9QfQq}vQVDT1))x%2{MtaM7Aael2gcqiRBX3lATK`mvk?g5nC!|A;uER6sr=u zD>f%i7q=A;7vC#hEB;UdBcUeYE|Dm4RN}hC#8TQ)lckKMnM=JimDYOtD~TBur~ zTBka!uCLBkKce2Hfz>e5;AoU+^l6ebEj1G~D>R3-M73PBwrSOBz1CLH_S4?0-Kza* znclL9Wha&m>ImyN>1@-f*Lka}rpwSR)a_j^u-tBW>hikfQ!CV0uvQ#h(XU6=5syppx@#L5v}@h_I&6h)*Vq==KC+Xu3$d%Po3z)n-(=tDfOT+o*z3^e zDCNj-EO(rAGH}}B)Z$EXUhQ1q{KQ4gCB~(G6}-x6)&5lveo*{@^FysGaCLOu@A}Y9 z*=>W{C3l>=n|q=AGY=h)%^t0*sjJtoKE3*brmt@&SueCc zaQ%e41em*T9m%=^)3T!$Fe_YsNvwOQr=gmpRTdW$j~)1)B!%3w|DA8nQoR zJk&fiFLZ)!%`RY1g*k*3h0TP!hL?qNBfKN3A_?vx%{(X|wF+t(%9pSZ*m!fl`7}no{Lc(^E&&?9)zd<=Yy*^|x)yw(Z;Y{wMFB z>eHpt)6z$Nw*R>zLog#Iqi?&(_M#n_9qb()JD2aw-}xz%nRzQ~Syo=w!Y;|eFNCYPR@nfw00`U5xfR^$~OjX(PiI%a74a40XZ+9HIcsya zu2QqIxJtAt>lg4#{4X!g1)RHg-uZmf1;Y!KzbgKExSCp>Sp(H1)lAlg)(+MA)^%NU zy4X~2QeS;Z>r&Ze*~^7jM6P5v@HM12aIYp`oo^(_phtb8m}#OUHHR z>uopeZZx-Awq9*BZM%Ha_~yl1hPP^O>))#^y%(d*cI`|b~SyY8*I*Wc&gH`LGUe||sW{?tIi!2Dp^1MGv$hvbKOk0c+J zJXU>NHKaduW!Pr8{mJSlgCmTQmrrA#E{vu>6L^+4CNoz4T=)6qal7$5FMfP6`ZD_E z{6xkp%B#b#RbK!4#^O!;q|fB&RLm6j?XGv?@5=psxH=la{lyy8_DHzUjso)W>gRhFdNak0K^>x>FDdlUl#bQAYbGU zZy18mUiAB=Kk}gT=uJfsgk_^k*TX z)_gF8ATSpDxf9w8BdamJSW&!J9z|9dr(?MxkUHtUb(nT;xpl6H66GJp;0^#1Iv-3y zD8L-d&$?C}qa5sD4W!B~=21q?dW#A6kGsr@az7$#yF6~@&T_#`|LWm`yBBUGaY41} z+rD$71ue~*C#A)m#Mxz<@|``ms0(R@jem~xfA*w0HnnKR1=-K>In$ur{^k7`^-uMiyT; z^;9rdXS`$72Ae?f)0+9RS9xvx!f_T5V^=)B)h^xmSM zrM1avVt8VA_gs%hkA`9o7fijnH*RpYK2myV;P$uOm5(l2N0c>r+;(tHU$oetB0p6c zS$X9A_LRqA;`T*lMTCX9vb$y$x&0vnx5Vwc2=+5?i|QoPO58H`4%2-aYU{R)J!n?_ zRK$YzaIUFzrw)d^8WZHzX8g*Q2hV^ literal 0 HcmV?d00001 diff --git a/webdir/images/bg_panel.gif b/webdir/images/bg_panel.gif new file mode 100644 index 0000000000000000000000000000000000000000..1365280c950821c3bb4d4d5ea3cc0e53066b29a3 GIT binary patch literal 13956 zcmV-~HhalONk%w1Vfp~{0r&p^YO?rZtn^;0@=l=Xa<=?frS4Rs>rkNSOr7Uos_|2z z>{_VrX0G;ly8Udj_g19tbGZCut@CrZ`%InaZnODVrtMav>|ChtSf%Y^tMhib{%EiE zTc_|)pXpJe>TtFBX|nffvG{em{cN-PaJKnfs_ zx&3am`FFbgdAt5{xBG0f_*tgzaJBkqu=Z=R_hzs4U#js_qU(6N{&Tncce?&ytMXBy z>Uq2WVyyFJuJm!X`e(28T&VC(p6GSC{dT(jZ?*YWr0rv^^Hihkb-Da$vG!Z1?{T*K zYO(iuy#HFK?^mVmRio@(sqk>N`cI$fZL|1JpXqhD{9&u|Z?*bRpz3O}_hhZ~Ua9e3 zs_}BR`(&>4X|eZMrtVUr>u}|98VXX3by#8UV z^KG>FW32N`p6F7c>Q0~NZM6AOpz2+y@K>bmXR!8Nsqtp6^>w)YS*Gt^sqkE>@J*lS zR;BG?tnyHy>RYJqZnXGzx%^_S^I)p-Xt4EBq3d_K{b8%~bh-Rmr|xR8_FAUzRHE!? zvG#Pg{8^{&cf0<0yZ=p|>2bIFZ?yVTqw8j`^lr8Jdc6K|wfbeR^=q;BX|VTCpy^JY z>2kLEbh!IYp6GG6`ck6mX0G&Ar0q?g>1D6SjT&M4Fw);U6mMSElZFyZu(B>~OXFW3Kd5 zqUw3N{&Tkbbh-UkrtMv*@oKX6c)b2^wfk|k`&XpwW3KaPu=i1*>v6UGVXE>^pXgJe z>TI<5Tc_@Cw)$+e`CzQ_WUcjWviMx6@piiWZngScsqtT_@_4%cdAk2#s`Fo}@OHTU zZ?yYww)tbM@=&1bWUlpPuJ(Am|7)`OZM6Dgt@2Qz>u9m}V5{?Mvi5ek{BE@SWv%vL ztn+%j|NsC0A^8LW00930EC2ui0Qvy*0RRa90RIUThyX#I33ZAXoG_t?Lj(-#ASi;c zj>U@#D;7Dpabv=T3@J{SXptmBh$S0F9LcbvMT8zbu2e|z;=zO%YvPo6u;R#?2z?fG zC^4qSmkCvpOxO`-$CpoU-t@>5rcI1X85+dtP^V3+E?3?ZTa)6zv;PKlRa<0`Ten4A z4bn9CZP&YPi=?8fmhM`-c-0EdtH~kT!i8O>auwH9s=JH}v+b(s&SZy=FY7&Q7;xdc zgC6^Z`x$VNJ4H(GotqagW5#Xarha@kvtdniajzX@%JgT}ru9111Uock&A?Nm&2oqN z9aEO?Xv$&=y7WQJADhB%ow+Hwsj@Kt_iieSt1Q^PGe3Wxda65jQbErW{*Eh6j>R{R zUu1k`SN2sm9(DBf_Z)oaIrpA?06N#)AlKQa$$QN?R~~#A3P@dZuDJ4D76u}ypL+9M zI30FwJxAYS(wSGEbK;3to_x&ZHsEsrM(CJji<##mfcRM^UU>9n@!x`343xzcOJ=j= z6->rh$`z$d`D7^rFbU<71Bf?(l~-g#C45?T3FQ@LGN)yfS)N%6mrtTe<(XTy*=06X zF8O4ZPl_j|mRYo^=a%BV`R0~PI!Wi0P#(%F&3` z5{s>{Rfc;-u)SW<#kKnuTPwcyc3`l&xVk$nu-o2>Ewb{~yDXHpf~#v6_m(p4tzFDp z@x1>WV8{VJV0=IxUF2~<7d{v=^2uEof-%Zn)Eu+OE5~ee9x|Kk^U6T`jIqx$=Pa_x zhR|&D&`V=m^U+E7Y;(>!5ADOsS1;{y%{*gm^T;D>?X=7^W1Dl!RIj`>&Na)NG|Nu6 z9W&WmCmpogZa@9?&{U`YjB?LW^9}UYODhd_)jlMihvJDFl6cCF=OKCHiTkj4)_xJYP<`<)K@X_~x9ee);9Q`>?s{ zhS>9a>6-5jeC0fc9=q;cY_9w3uP;9N@uZW^`sFMy9yQ9;C*3;Zk}v*F>CWddz3`Ts zzKRcac+iLkcC^t3`)$8_7{C45!3=FMpbu8jh(^@U4iI#p588mh z04DH)jbPyX;I}zD2rq&V^q>#SusILp&kPW>UkK?Z!2Dg%fBTzY;sV$~-ZgN8J_z6{ z>SqQMp3n{k%%21QA-KQ^s_=gI^WXtfs6zb>u?-r`q5X{bKK3Q z21KCn?zcZ7T5*ch8^Sx$VKka49T$LCGoh&`sE-QZpQIB$bD;&TXD9qw z(Tvh^pdRhSKk;eLgo<>YBK@d9b3h4vnzWuSEoeeBI!}-SRG;yrC@tx^gowg(q5pI! zAXBOUi01RAfLwx5=edNYHdUlcFo091O4X<;l@d?2YA3MTR7!Z&s!nBUC#uTTB~W6k zP93XK)9O^LZdIxZz^VbHdRC=w6{?hg>s)(kR;3!it$*z*Tbr8DulALzd+q8#t4h~? zc9oxKb?a4oTGywZRjq3^>tfA%R;jL4t_o;tW&=CbjXJfSRpo46z3SPk3e>4*Sg;Qq>+%@EO3ALpyad*pG-PYE(!j&y;k4szJ-d4B0 zZR#4R@Qd1RmkPOU?rmc`)!c4(yTgsHd1Z@T+oG4Z(cLX@*{j>|hIh8H{l$01`(5U8 zm%iD(Zh+Y<+vjrEw*aQDZH0RR_fo+EwzYt9sh|rBw89N;(8YFJu?AhZfeIW3Z-;dO z-Xv&P!Wwojhb6oQ4!dE(5>CPzFdShBci6ZPra}^0Vc`eQ7{osQFpqVdVHg{C!)r*w zi>ZL&?PAyhy0~zQ!7JexD|rnPwm=dr@M03Xp%omKvM!YD^+8SA+J zw^$xClUtDl5r>)1SU#@>EUe`{`xwkEp7D&ieBnK3_|P&wa)rU%X4_Vn$s%U*hg+-* zLKwr+ZXiUajj@L$7{d)pPJ*bXA!<)|TGW|7HHMW;h*p>S)uT=VAzlsYOv4((vtD(n zL2Zms`&!hqhIOZP4Qg12+Sa>9b+CbrYEkb&)1saNw0&LdTjyHVd+2qurxEOKfBM$X zp0=iIP3>O0!5EiTGP!>(Yg(T>2~z;|tVvC4Psduxq|S7$_b`PiJiFih=C`y7A#HyH zoZs-?gTNJ@aDMZf5CRW)!5uyYU@IKp{f4;19o}k$cN*XcH@L_#{_Kd)y3-W@4>-yR z{s4n7yx}9Sc*P@5^NIVL;7NFRt7Q)HjOSe91sD0nFYfP)6TIgne|W|XPVj*n9NtWS zI>!5r?W0Tk-y6q30j7X~uJ>E(#AwFW3s3+IQ~(40ZU)+k!SxDEp&3(Pdl|~!Z?exF z?OjLv*5f|+0uY1jQ>Xyo0bX_tuzd<+e|s4MkN7fZz3YD$eBHh7c)9}|?R6hJ*~yLp z$8%lpTZenU7Z3Wluf6b(7rWQLPIkeYUGH2cMg`c8dDe3s@t?>2+|%Cmz4x0KhxdBt zF;Dit;~w{LFMRBAul3x+ef4GMJO*Y^h8a-b`W2{t-(O#b?swnr-gmtJ^=D9k>{Gw{ zX5YN^3o!QzRKWV)*Sg)`-}mlQpZ#<9{tTwie)eZy|M_Qs=SP0-XMWU|eVa#i3)%SkoXLs-yfUS3a-=}rt*LfI- zfci&(7kGjw7=GbrcLl%z=`aI;00`svgFFa?Kj?!qa0xtUgh&VoMmT<#a0yCieN7mI z)<=XwNQ6&leY8-7Lb!!iIE6mwgi~0AJ-CHZID|n+g*}LdQD}XzAcRKfgH#BFaHxf4 z2!&+0hE$k^JUE74Xof_%gk2biMYx1NsE1_ughZGQ41faoAO(~E01LDb363}kfFK31 z00@&X36T&9lRyhS=!BRkiJKUToJb3h7zuz739t|emoN!Z@QSK<36bE5wBU+TFawq- z1+u7#l_&+0I0LHKiLaQ7nOKXL@QS`@iIPYQQV@xmxQerQi=r5dO=yd*xQUr)jhfhr zk${W02n(=aiQza2M%ay#7>=)~iM~jVJ*bPr*o?=Ri8DY8#|Q|kc#p84iNR=!zKDwX zsEXl;iL^kEn&^qHc!`-`G@lru?_MY)uR5R^ull0mtXQ@N5+`H?v3l&{DQT`7`Y$&)47lTOK% zBKea?>66IFlV@p_HF=UZDU?nymTP&ERk@N2@CY0E2sn8N9B>F1aFb5J0Ytz7z;KgW z2@HqOmw&mKBWak6c?gOL3>V;-k-3;0aFdE@nTuJOlDV0K37Aem1RhD5n~9mB*_WgV znUaZ_o#~mV*_Sv;1db_^nTeB`d6Ts11cB+7x*3^&37edWn3U-RlL-usS(~ltk;%E0 zM6j70zyX!1nU{H)h&h_oDVfoUlf6lq!|9lR2@JdcS(&hjn2V{GC}09au%7EF2p7Pf z@VTDvc>(juo`*mL^ogJE8K3m|o`OIG|H+>2nV7W5hn-f}@655~+dI14ip9~71@u{C5N}vtOp!pe~|4E<^Dxdesp&YuNCc2>p`k)UA zm=H>#8fv2j8lv*apC+)88K4J(APC|h2zuZQRbZr5Km>Xqq=HZddQb&Yx}?q!rA9iW zL;$5z3ZPKh2S%EuPnx7mS`Jw%r2rbGLJFl->ZC#{qo>tnVNjjxX zI;75kq~Z{zRnVtbst08Hq;CqSVTz|x+N5p&>I`S92TaPONeZc9I;3A}rCMsKc*>}Y zDy4}EsbHF?O&X_98mW7lq@Nn8XZoc7$*6_esenqUT3Q9-fT~Rz02>(qRS*bO00vVU z2yfb}U=RpkPy)lctH|oBQcA3E+6TTG2)qggeb5KQ%B$77ti8Icyjlfs>Z{W#r6mBY zQmU-k>aD%ntkX)Z&kC)*3arj5t;nja+{&%ZDy`O++d8b@8V11ntikH6|4OaY zx~tOat?vr2RbZ^jDy;cdaU2-tn=!w^BSzmS^~n_t$}b0)Jm-Ls;~h& zve1gFC=dX*5C;D0vi^DtU;qZU0IgvE5C%8fvbW$1FdGKGaI-uMvom|MI12{8K&)Ya z14N6n#M-h+yR_Q|k*|JFG^_v|_uo zN$awK;InG`wrMN2avKI`yR=O^v+6LjGFz>7%eH)bvwHiqRJ*of`?Fdrwm7S`Zu_=4 ztF%_zvN>zGMN74XOS6{ivbTT(DoY1A@VQe9x=9PVq#L@Wd%B`ax=G8ks@uAy+qSQZ zx~QA90x-I=+qSkV0H&+EE-Smf`@7~~yPr$8z5BW5kh-@kx;J~ewQIbxtGhS=y}moT zVIaM!Tf9>Hxv(3(*IT-Du#t5Cun3C)x;>Bpws5|ni@xQH0||fwJ%9s?U<;pnzP2E~ zi}1efYYRPazwi6L`fI*8Ais;yzT?{i=NrHG%f1C%!1~L+2E4xI+rSB6z~;NZpZmU_ zOTh8#zZvYm^qToWJ->!XO;LpF6-FYzr;?z6H#}80@|rEWsqK z!1#;8BkaBcT)^*x&0EX#$}wvSq#SfyT)2f$9X)*di=+2 ztjBTu$31|?SX{?tEXQpBT*l%{$b0<8i2TQX9LQ`u$XMLRB%H^Ne8_Cv$#pEq;9$jD z{0MR&2aoU#Z~zB#00&#}4RWx>{V>W~kjkn22#>JETky)PEX#0k%02MPTfED&{K~hC z%d?OwoXWtw%ArBAtj({y%C}6* z#mvgYEX=}8%F^7+TCB^q%*()h%hBA+UJT6AoXfNv%%*(Iz3k3gyvoa*$^f0q*o@EH ze9Ust1H$ag$Q;Tj01j|a2G&C+n-(j#36E1l6iodLZJ(n7t;D{aymz0yrB z(xjZyAuZG{Ez}k5(Is6782!xF9Mefn)FVC9VLi-0{nI#|)fPR|C0)urUC})));Jy3 zrJMmNT?kvy)FU0!B)!qA?9xQN)_MI1BmL7kEz&a`*CcJxg&@)3KnHXH1dpuMv4Fr|#+MEsBroGyvJ=v9A z*^k}Yu>IPjo!62*+P4kanr+&o&Dokw2TB0iw5}k*k=@yw?c0h#-KY)P z#7)}ufZNIcZP};|*}SdVmmSpNUEJGk*&+;TnG7`mNv= zKH>fC;T_K4`#s<$-rxit;v4?q0UqJ|t>Q4Q;$NWQ{IHSnpafqK0XmN3$dKS)Fa~4r z;~0+P5dh=~4&*pK<71HE5%A+nt^~-S1Vz5uPd)}xj^oszGY=RuC-sDRz=Q>UeRQ}^> z&gW?Vp6E-y=Vu=0M4sPPj^l9-xORYwI1ZR4iB+D z>p)KIy1whQPV20`?39k?n_la>p6$p!3&B1MX~65aj_ij1?7aT#PR{MG{sqfk>*+4* z%`Wb^{sr(5?6UssK)&ulj_%ps>($~3StPbtsPVDGz?##~ZPW}b) zpz5MP>#q>)X+ZI`KJgcS@vIO8uW<1}kOmbW@)!T{Ab;_GkOm+h?X;c-8sG9BU-2vd zzws&$^D`gvEwAz`Kk+iJ^C!;=Dc|!oKl2lx@fGg}7SHk~pY#_0@h?yEP@e`J@9|W> z@-090D$fchU-Mc&@-UzC6kqcs-}O1a@i~w5Cm#ezpYay2^EMv@i--aYa053W3Vy%} zc<%>v?+2cc@-CkSe((x91gvlauOJGBul9(~_8P#C4+HGmppg)85s#+=kXxXYqyB5u8 zL*US|TgM)^eDOKA?rJ-tgOPaL`j4y*EB~Lv6yi-p;NinofKoiyfb5RKSEcDMp7kyAn zKKl%jj7vj&P)|}Y<3)4KhPVUyaaFM;BFfPedv06wy|{ ztTk0J8C5mHChj42*IOY4)X_hOl{8c`)I8MJU^T@QPfhV8qfQh^fdYyqB$4D95TF2o z3`xudK@u{cAmf=PzV*W0Z_{NrUMM6Xl-+aPtrg!rp?K!oZ})6h+;;O#w_JZ0PPbk{ z(S6uobQAV9V1mW%wP1nu_16n@3)UCmc-j57+;sI+7~FinCA4IM6>j%ni3|3k+<)7R zH{qC7ju>Be!}ZtYa|3P{<&-;?xM*>|B?Txlys*KBdF3Vl*b7O#m{;m~v({Q`D7+Yj z;IW~wLEw4wnY!w&!TvgID8|>nEdC<8Xwz<^U*paTb}zW@&Je*m-r1`jCzg97Srg23}12XPTW1xgTr4q&1G zrUtNFFYU*UuZ)c*6@W3 z%wYjR7(o~U@PGqMUU2o=+J=+5s`0XS7V?ygTqG@783Hz90Sj+QpgW(KsJymY}F zT!4rv0Nm6=b~B{N;{1^@tM9*9`$O>1l0+R_%NNWJY^ZA#m*+7_w6)opLrO52-mcCE@q zgi&kDTiW7OsJ%t*b9wvQ+M?B`$2G2TBWqjd(iRVhKrU~e3)I_E0J+<}Epnr~R-=md zw&PvvQ*kTbqgMC1y$xt`Yiiu}b~m^C74T7QAloyXVXa7Tfr1t6f={gV44*gygC)Gy z2qU4wXW#-C8l2z=*TTUIMuLVhoZz*R!@{3XF^FAYVFq*J!nLii3q(9&2}d}>XCOz2 zAN+}0*to%;(D8zE9AOD-Si?d89`S_9(O^z+0tplja&2odWd$Rl79kEYkUy;D2EW+B zpWp(KYawDOFF3;tc5sC?ykj;Kd95O*GLpkwVG2)~6BNcXlwaInC7U?H^N?+c1I>j5 zb3w|SK(v$-EoCGyTFf0r0v9xF=?-()(3h@srwwiCPjk4!pw@JW-E8VpZyM91UbLb+ zjpz=?n$b#Tw5S7J;aQ&=(yK0Yq#a#pOS?JPXMl91LEULi5c}5}hV-m`9qCOwy4Jx) zcBVB<>_!JV%9TzwhhxoYQ&YObSFSLjQ7{iKd;rtkph1V*O@m6mn+6}CLAzs}?sg-g z-tDjg5=a1VB&eGU`Br!TJK+5ReGk0d^rknc>#c5m*Zbc1p7+4ry>NujTjM0?#=s*U zZ-l4Y3Kn;Fha3KFg@3>b@a{&)OKkFVTRhRe`O4QGim%6A?q#O|;Qj9Rw_5@5g+ILAtw8s= z+r98_cf8mYpZLe`{One*_vY1(_|C8W@^NQ;;FoR%5)5AKWEXwm&o1}Fw;uM64}0Y6 zoeQo%J`_)Qg4&<|0CpjeJ@~s1e(=-Y`>%(>_(JHt@|hoeD;(nqaqqp_p&yK~gMIAM z;QjBvj(yDw0r1a%J@)-hcIAKl7~>bhF`)nT-y`4o@Mk{vgOB~;KmPZ35B@RmABdazmeLxEfn1Lmu~ClG^E5Q8UBh2XFI2IKnpoiV?uU7!U&|>;*Bf!5BCN zL_Eb+jDcP_#Z6EJRfqvx>^)pGMOcJFJha1Ad_zCP!8bfbT2w_bIK?TX#a+C?V&p?V zL_!-(#$MP2C|t!!JVjUB1a5r8SZqZ|jDg-m#Z^p3aTLcJG{!DmMI%(jRusczOvV~S zL~e{nT-=0KT*5azg;SWtJ)A{k6a!@BJzUg5d~8BzY(h;$$7!rVeB4KORK**d$5VJi zHbh1LCrrj$6vIuJMQ;>>QAB|^z{MRPNt29$lEg)oOvaK-NmxWlmE1*_M9Cc}$z@nc zF}TT@{KlA!$sI69mQ2Z(gh_K;1_J0wW6a52B*~i;gOW7Iq*Te8+<|4N$)#k;U5rJg zoXL}fMW~cYbDT<{BubKWN|e+|lN`&XoJy6vNu-p@p8U!faLZF1%9X^$kbHw3fB>~* zORJ$;NC+zNE>+EX=|*Ov`*s$plQRtjWYY%#xIV z%!~odG)&MGO2LH5p_Bl|jDgBTO_JnH2mnpSEKJGVOwZiRz|_pgw9L}9%)lHWebk5kUPWEJhT{zJ7+)Ma`&mGWE2-pSHj86egPX=Yq zspL@S+yVGR1@rXJsk8*zABBQ4S*-BKb2&nOL17u8Vz@cdCD zm4F8wQvc-95JgiO?NTC5Qa6227hTdgmC{`pPb|e#BBfGPK+_|g(>iri19ed!P0}O% z(e0ehA*Im~B~v#=1vuTy9JSIRt%Vz90Z7mSB87w|Jyld?0a6v!VbB65Xi`%xRa9No zR4vt5Jylb^Rb4$*Eud9dB~mT8)n7f;SFP1mjnz>#)nNeEAthB(6;>8_)nJ`gSRGPR zbyZbO)nXmiY-Isv=vE@#)@JS1X!TZM?Nwi8)*=0aRc+T)1yvNN1twqySN#KKFaj;W z*I{4+CeVUEV1iL4RVFZkZyi-5z*l!AS9|T%VHnkaWmhfOS6B7dWgS@mRSnjLRn=IX zSZ06(fJIj(_*Z^)R(6%ve(hBw7>0jUReogwBVd6)@YrDegJ|_vnVr~Ig#<`2f|GUC zYh_rTg#? zjaDXT)s&4{XAM|%C0DJ5S*t}?s%2Mr-G_nYSAJ#JgLTywc-WE^SyxS3BM{k<w2el-Gp_*<=Y+b`u-@-Kl_GJS0#b5X3-uW%v`t9D#ZQSxL+{_h$%*9{+-QDsP zUjo)#@l6B-PGInTVEpx71#aNPwcqZ2-}lX61YTdq72x?L;Pf3}1$Ny3W#82m0S_+S z22S9{b>M-O-^8t9$KBjSU0e9nb-ZZU7#z>lZj{Ot5K*mg^UgYaSqLn{I0!XaJIS z=C+<>yq0JlXluF->=!78yxwZWmT0@C?1a{VfnI?IXzOCI>x4dQl&HfH zyB2MmM(vBf?7cp0qQ+~xM(nsY=)8Ub)3)jV6{zd7M(MP6<`pOgyiRFn#%r?f>euG& z%^qmZw(GBs2299o9q8-6=7AOX?c)Az?LO-j=(J zj_>qNZnXaH1}KK=ZUE0F@9P$A{Wfdvu5Rw$Zui!10;IPV z72j|cpY6InYqZwyye{rz=;0Gja3V)<3?J|lfA9qV@gwK%2VZgYCh{RS@&S)>DKBy* z5AOiq?zmR+Cjadxzw);pa2~hvFBfzFD_3tYH}Wi>@-IJgB#-hZ&+;`-@+J@SHFxqN zPjC!}b12t=AO~w0!15Is^zBxLL5BfFH*^?y^A-4kOi=U{h;&2W?np=UbEx#~ZuCK~ zYh@_(6+nkcZ}cB9^hn?CADHw6PxM2FflD{_-*)v!C-P7K^g)kww663|2X#%ibRswO zANcf4kn&8>0T@7sTu*cuNcBv}gjDzSN=NHvA9X`NheKxXD0uWzkAr33bbW95bB}`mNO$%XV0cO&_Jc=tcUSa-hX!7UfhdTBROk0)ANFR) z_a9(*Nf-G=*Z6-2czHa zLXY`KxA%%4^i)@NP=9oipZZJ)^k67;S)loTM|iH6g_~D&k>7WNr}?qJ`I_%{vIlvQ zmxVZRdxVbzxd-`s&w08x_>kB4ng{!X7yGi`_k|aEq`!HVFLi@A`omWNm6v;dxA!PG ze1u>0#=m!e=zDt?_>^CCm7jdFhy2Xv`paMTxp#b#fBet~dCzzJC{O`_7kL#h`yY^n z$M1T~Px-p1`Fp>4tXBd5e=v9zkOfeP0#NV=f7o{z=zYC+{2x$(;qU$4XMBE-g5rmJ z<_CpkuYAUj1LA-D)u(yIm;TCE0Tqz`*Jpj22ZbLX{=yG_e?Wij$9~>7c zPx;3$e(^tkSpWzXQT#=Lq2kBDC@Kj0i{lT*LxoX(#DRfuAVW}5qR2`}@dv~o{`~zw z=+I;wSt?|WEcip?%aUY*=}3lI7ml>bb)(g)7#RljIg)Eptr*ApvznD-+BijDiWRvKl-#Ughq@I=5R^cx zEZe>%sB@q|Sw2DkiQM>->{X5%xt>Kha&SVM1b4#pr?TeNvo;m3q+Hc=%n(v zk*ki^s-CjWNvo~G!7Ao-lkeA(mG1W1AiD?3TOGXh3izz94CbrvbN2$Q z-oMUvJFu(*+gdQa_bD7E!(f(IaKs4nYA3%IZ(3u;8ngJY$Me+(GMpV7NiuOJhis^R z87~a~Ey`A^Y-OfBLb)=9G2A^eusBO*%u4C%TAq(s&jv?9cW+-L!|- zT|>2|Q)7Lh)+~FQXV)Tcy}-d&FQtdg4>9^g!F-eTxJ()w@d zXK8xr=$udMx$BR@PIc<)wNCkxRNsCc<~`S5yPvzq&LMQd4`2A~!vhbX@oEAub@Ikh zd_38BQ%`gBgJ17(_S=)IsClkG-#Oc#Uti_;&cE5bndv)T{(}wYJ~{i|w+z4i*m95m zfBrCr+kO8SRKLlMX@CI)-vRL@KmaC?N(>}k1My?P2zrTsM{?iaKK8&jVK7G%jNk_w z7{UaO@PH)@;0gP;t_~6|h4^_@2C-+suO-ce`ij^!9;Y}8I&g+O?2rx3#-%i|5QV=f z;tz=v#21POiMHF|4c7-nI<@C_iIR^KlgO$mYVm#H>msuj=tD`_Y*kB)VY*6a#ax|{ zdN0bN2)PJGqUq3nENtEMwzfhrrpJJA990{S2dO`93V4C!UC3faNF`zLknbwd8OtcY zG|G{WeXOJ<=cPnUX7Y7o3}YwR<4D(yXptu5WGGdKyica`Zmf)-B}d6QS%NPAPvxTJ z#cGJk)n#p$tz6|7+Xp%H*)edwG?FQg#a}4)PVc{}3 z+Z5e3v1zbi4o!vO6sP6R`AvOwQ$`6pCpv*e&N)_%i|aJiuG-l`H{El4`pldj;Tg|O zzH*@J`KR3wS~*iGbXzdA<{0~_s*W|ZZQ68abaq&+il&XDW;-FnB)YVMYDuKVB&k8Y z#;HY_)Qz2L>5Nb}(s}v`rjQh9O1Fs8oO+U`Vhdn2i{sJ5X%43dTjMx+TA-o&ZDmZw z+U}OePEOiXX+O=+Q}xGCqo!+{S#8=^r3tfeR<%p;3M(3|wac<@OI~dMUDG6UiLsq3 zl~i0!=_udo!MidtS!fknSoL}~z7BMRf{hnp@!6%n?u@ab%4cFh*+r|>H9&5ytWYD{ zS6eyOshY)RXA}9^QJFNf9-CNGtJq2hnO0+Y#i;fUYn{>lvb7dNYe>~fSJJ+7x0qdN z__Foe%=%WYW0NUxYgsATQpdIkbMC+lYs82Sx2V`*?#sLgqUx^Ar#{;lZCm+IsRl2+ zJgQe7(^*`jmDapiGZ}ON7T><9%e}@u9%bfxp=8z%yNk82H`^9edHOe@0FLE>_ggRh zUNvs(E@uy4Jmcn0@u8}di-lfxO_Y{!Y_?4qGr zUPm|1eV^`ar3rV>Q=2i=E6OyJQ_WpAv07EN-s*{MIaX3rk&m|qq^pNz$Y4)b)=RD) zuSNW84n}9$pTc8m*#m3x8C$sqb+%+1JilgP8@$Q3aJQ}h{bNxQTi7!__9ed!t|rcn zqthPQ5w%UAL6S6-$tUjRgo7&P;MkOE22= z?IqK{em<^K8MgAu|KPR6b^edf&r|CgMZxGv zzj^JUGX9R+-=2+h2o~C^F=Vo8c)a^xb%Ve)4?J0SEKkcNgvwhiG*}&f0ChHgfemX85=HLBmR_6h5baHD+OZ~gY!OKy z8MW_!ZWp)fw#ohZn_~l3pRiWyzY<$+wnTI3k>@r($Jh0`*JtRq&U#mM#^&w)JDY#Z vkhHy`=+r-R?f)nH`s7}1Xqgws#KRDABiitMw@fCm%wh0!^>bP0l+XkK=8`3r literal 0 HcmV?d00001 diff --git a/webdir/images/bg_panel_title.gif b/webdir/images/bg_panel_title.gif new file mode 100644 index 0000000000000000000000000000000000000000..a1cb832e91edcc6df168d9c37c6b721523e7e638 GIT binary patch literal 158 zcmV;P0Ac?}Nk%w1VekMW0Du7i|NsC0|NkNR1OWg50RSuj0002+03!eZ0(FdmsmtvT zqnxzbi?iOz91e!!NS5Z=1?bAQ?hC8%OxN~}=lag~{tpZahs2`sh)gP%%%<}RjY_A~ zs`ZM^YPa03_X`e-$K-YS={|^`_I7nD%cz7s-==ZVM M=b`9$=TQIvJN5WfcK`qY literal 0 HcmV?d00001 diff --git a/webdir/images/bg_title_article.gif b/webdir/images/bg_title_article.gif new file mode 100644 index 0000000000000000000000000000000000000000..c8d3c2640881f71398e183a81d442c857c2b3acf GIT binary patch literal 379 zcmV->0fhcXNk%w1VF~~q0M$PLaJBkrvG#1U_;|bice?#{x&3sw{AaKAW3BUey8dgj z_j$Yjb-Dd>xBPOq`*XPaYq9rZtn*>3@@cX6bGQ3)w)%3m`(v&2bh-Rzul8-T_;9xR zZL|4ju=RDh{BE`RVXO0Zy8dUd_IkVjdA$E|w)$bL^JK2{a<}?*xcqs%{&%_ldAt5= zviM=F@@22}aku+wviNVd`g*+ncDejwV;4v65e<^$q4TKFk6b=**B@Q(e7BChLC=~!W z8vp>Anle3~A0MBi0vZCR8XN+u5G^qf3JS103IPEV6Se_4w<013z!@DK2N^s(FUKdx ZJUARsOh5=K8k06TiM`L+f&r&R#cr%v8v;=)Tq;8wyH|)QL1(hIuf%sK_Zm4$g+jR zYPBjuP#KhJC5TXtO+-F@{|Dde=j(djkNa``a$UE+W(; zTg9P`TRw!ltY~xN*~mxE4X$4r$!-t6ldau7@>k1=OxT!mb3=ZTQ!1gtu(_)~?00NgiUC zpEPd;)^GaPu0L%N2i0$eG;T(c#38@=&0D_2wP&q69yLpk39Dhv+g|vU(5B6ZR&hj& zIILyco3Qej@Y}E*+^`YTw&Pp7?oC*IOk53V`c2#L#4USZmm*0!5v{+2tI@4HG31?q z+Ks3-@nhne=kG6CL_rN39yQCp#Pz2nabUwnNW(^O*s%GGwBw0gj%wTS z#;*i7Y{rl!zXkmN>ENam2mrzWga6t8*9jmiNeD}N^5W$yI3hVEH7z~kb!Jv}PHtX) zK_RlJxCDhR#gvu5sX&EQzOSmTNxy(45Nqq|8_@X1hURxIWJ+msdsp{|>+Eb6{}j>oAM`Z5HJpR=5j9^wcH~(v4@xP_zmDRQUiS@0lP0@}7 zxR5CH(Z@6_&%?oBT1@>ABnQDRkF-gAAo^iTcV|2*GiAT7fVB-R!C>A98fS-^O``Og+R)bvVT=zmZ$HaZK|%( zThC_Ps<6+?mZL8FILq9%j-sc0ox6#;Df#j1EAo%PS8X<*uSwhdcz?_A@8;Pfspl7+ zb)PT5DvRoMCqMmj_z~Z_Jm^QM)v3cTy8#7O<<0f-zx#UpUUi}JOwMVL@V=GT`Iqx< zKto+Bqs1`mS8mY-iEmx}(WJd25f#W+ z>OLv8`|<*AspYvn&MV93y1euTez=2v4e#^$xyrJH1XmzDQw&;bf2O#%w0NeTVsOee z+`i8I%rL7%{Cxe_mTpCgDI==<^~HTBDkOhiL`PL*T{yp4o_Su+-G{fYW_2cYaQr0|_Pqpt6)T7fUCi5KzH;$vjlA_;~ zT~V&)mFdHfzQz7a))l4p7D(NKpvx|m6={YyeBXMF3ucg>{xQ1QkxNj1&h0u!qe*p+DtNQ2p6~Y=7=Qa#VbUJ@q`fHb4*kNIiy=Whrei5j3xA&#Nr^% zS4Xk+?aE~}Oe9VPoo|Yo+Fpf#TJj((;1`9prWjr;hA9#|^(8h&O>)yprwF`}*yWC+7Y`Wq zF9f3um@6YTXPd5xQdd3>$(Rv`0yT;k2}&vxMj!WRe2eJm_oV65`@%{HeNYYCXLW&6 zWGv*0bHLh{rwmJl0@MEhMFT`;l3Y$sM#3M~ff<0}i3$g( zp!8zr=5%EnBYIEnO?RkbPHaYkoJt|XWSU%$+2j}X2a{)8-0Y+G)H@lPE~!+YP5Ezb z+LKpuslVF(Fz^DkNrW|R_~^y2LKt*4Gor<_ZiF34@tOPU zDHqH*F3Qope}HE1Tp+XU7*TySV=JMbDZ{J3B4+fp|8tBaL-Yt?%{k~_n0M`hbmEIT z4Q<&7IA!5wNL<^Q2jHOs)8WScSG|+>w*9YnY#d!k)VXT8+;Y8JC|HcvrH!xTv&|Ro zD#!gCa#so{>=KF>U(Hc}{62Z{V6bxh))hb!Hhob~>r|}45f7nK6nPn`3@aDi-^K4W z9WiIZ4k)?Ld9f+q?<)g;8iRCPbb1wmJph6XDDH^{X&LRwN;0U}qnvC7l;~vUoUPCS zSz1}Che@)`jJys}fiE|%)n%Jm@#Xi)1J{#&N!@6%)Y-+ga_y_jI*#B;_v!T69m>wj zJ6m}$Pshs9WH1x2bnNKvFV8POTgt4z^Y*CQ3F=kDu(&uk~J2#OwbzHl% z*ZJ7#LJpaK_8sZVy&GZ3{ExhY7dB}&VcA98BYYEX@{POdIXN%Vyw3*6_qv_GT|hSQ zKAKo%8@p#2jWhE){rn5v(Ih;lp~2@$l{_QhR&J3buF`Ven(6j)PZ>q&*p=r3rswI~ z<*M|@M#WI8H1MrA2K@KuKne8lSK0Z{)yD__5K#Tq2_+L(j~_ng()Y~$R?bVa$M$9N zKv>Leq^yL0#O}VowX|-hoB}by`GcyXVkkyN!Lr7M(g%`$aS8hv2Xg(O?sz!P5`WGa zENd`vSGwUYNE@U7Al<{Uc59WWJz?qA(<;@`cenP{e2wQ`j1zG!kC4!4xyz!{g=TmO zAAC~yP%y$GY2_1=SN%OC{)xk$O)^2^1nGPa=bk=R&3hEqm!jZG*Lqg_LK7z~SIl8F zMGy-23ZMMj#u@(EM96K#g&l5V6T6#a;&6$(o!!`NeRm0knn50$CYxj;=t zH{RvQy1bW$kG4W(x zN$^R<2g=TCBqS~*=|7DTarSxK4jtz&J;!G6D{PwnJ2VW`HnF(2*7a_eVL)=K2UqJt zU7r~DpjiLj%k zLr`8ujm>$xE|Uh|ehSC^NPE1$7g_({T6pmj&1ooGjT*HUR!o}r*$=eRla8&lsEGNO zPK|IfWFjjb-uF9MqbAiq{j+x*F6 zMc}{B3C}+NMm?mxQ7aCdd6ff|Ww?ibIGPdce@Z;^fN@@_iSBdmUyXsE&(08pY11cb zqUT`fb4nYw3o3yzjH@?WN*0tBE#L`&)FKFUEg=%z&?&3iY5HBHwISIJfaIe>5`RKo zzu4UXNb6e0{Y+#gwF@=nVy}0}0jHwKhe6A++KDqFd!W}8y^ygW`hHzIs#B$1`Y_Y% z`$O%G&S}&N@?H0&&FiE-{qcn;S;~a$O=&RDwHAHKV*K2Kh^g4V-c5)TBz^}UxuYd# zSx8x1Z;zv0fvpcUn+YDNY<+kQ+kE-i9F*A^EwK4_vC)S-dGJ(p$8GoR!q?)dpo<&* zDw6G)$e7sU@vvzKwji>oAZqJfd?P$E<^oI?6Z_wEEZrw=@_O7Sc$@_$uCgE|FA`SE z1`jmHef5d|R1gnqj(_fyAUhMIpc{LFlh7=ixTiPv|H;Me<47W>o#Hy%Am zzKc0B6MGC1KPnsh%_(M_9oqztJF^kTXGiJFMcY`#%>5bliyb}W^D^plq5>y!?s`HN zI|}9${ZjVT>bsXsva+EQkWdeBurWN$7#@lNha=$6oZ-O;co+g6QwWcXf(LI%1^2=e zec>tl;n9T%Jq$d~8UFe`A~8xPtp!oIA(g>_Bdiclqu~E;B1lEqDJ?0Jz3IsPscgBF2D!B683@TLjU0toL!{5>ro}|1Zui1PQHbd%xE>Rt zr~@d5W+^fuU}hGWD5F*d*JJ zSNw8MZDt#A^K7ahCh~bV{PGT;$hIQo-to&mLdr3)&I=IapH?d{l+Ou;=4iR(JW$WpAclFZsuM<=4ZL&olDNiv(CP^ng5^)Spd!Vb}6zXW&Z;$iaAkaEnh&Y$|WPS z4yfgsBp16N^V0otDBNs!KS0I-#Dqd*9Hh^xqGUo*e|Z3-Ur;hch>Rub3=wjch&tmS zJ?H|Og`(z2kiA3{TOK_qj~d!UeCqFI`=KbH2=&)u=?WAwDv#zsF$xOh0(q3S0@^g8bl$pj zmmX>ciP<1w#7GHxuYY@n*_k1Y(Ji@BeG`k{uB@-LrGezR6x>33#k2z$5k&eOGS67~IEmbZ;?N+aN>|X{gD%(peyS9bVHYxo9EjRTq zpG_{m)>^*qSMk-l+^eq=d;_y6|5m;ly=MK^(6ww&QTg7!H~afgL49SWu4o+-)Kk~; z1Fe-utIH=z@9gv{nQCu_PrTEs#=u+AvsG_6YGr^zMVd(k)1{(xwh}UeDpQAOD^$D2 z)acwOH!ms|tG#V8f$;qR`AlH9DoB0;+_we(tPZ-I30$_6G4z0VC14FhvBO2Uz7*W4 z3G8Qo3545 zZVmFhB6-@alUv-`>(;?7rYK?CN2uLHv7KGi_OCS(3O|)HVoIJJrF_?D|7l85QlgBf zwtq71mEHxV)@wkU0Ubj%T`R(l55*m``khh+bDY_tr253jXHdQaa~7x%9eUP zlh&@(&nS^;#7a-zqYBb!tp=cBGy0TmzbKI2Y}-GOM*C1g|8$SpN2X02pfwzzPnyv~ z9OylB{h#kK8QV0`0mj#F^c7nM|J#79=mH1F3A>KCQ;Q@00nPY!}mLuT}WUE%>{3WGg2(06ZWpIBz! zNm7Xba3r691$B#tYjReHA;>07wT_efy?1Hh8LQU3wKn9KD=9{y%RN0S$xViBxN28I~ zC%<*xXNQ@yV$-=W94kSSg}Bc_rgIP!PT4%Cc5EbPj0GFxBI)d>W84DNNSXP_hjjK^ z&5@ZPPAPp%Naxhragn&OrzgM9pX4@*x$QVMFP>9w&YIpeBADman6uuUge;)A*z}1= zyYHDn-EC5nXnAAvs7^5dIwol3uLB{w=OZ4Q`P{5x!shR+}8q71zfT&vX{A%rD8}y_-dNMP3>QXS@nZa`%pSi!of4DR0p~b(gHEoQZ3K*Zd3FAFs z@WSzeXBJb&=xHbWS=`Qa!mruq!Gf!>nXBlTi;S6jJ2RH;e3F*H$IzWeh5>=W{1A73 zHGVb`HWvw-i^0#qEaslVri$HX2HmHOF*6g&ybQzH7G++JJFg5s`HwrV$zrj@aM24d mFdv`3<~|#0A!Ge((#~S$2SZS#Jh!)h^4qWZW-U3u^#1_pAl?HC9mkHa*=w%`zqos&Uuh^43ud{~LI;l3k?u@aN8?74zGr(j9Bf-^zgsIH(H zKInr!=!4S@wl#u9bOmdj2$q~9h<5Van#bX}BZ&6F;2X3LVz;iR<|0Tchc0%2bEMyT z5Z@|iuIr5DiD`4BI0E9ru?qvr!;^vg>aoSSzT{7+HcMk212uX*W^uC8g8a(^d`NFX z-wVYcr5cQ8l#9al>JB6pmQxJ8Fgm_#m$s(a)fBibT(R0svwhUSF1ZkawZu9;bNHw9 za3boUx~I@+;#Wgi?6ccGgA2KX^^Rd~f~)kaWSCpl@vJNI40c4H$=Lq(Dl!L!<}CCtXd;vDS!}nV r5Gb`GP*;fM7Dw)?Jb1Ym{s=GtYLFO-)n~;j00000NkvXXu0mjfDyjao literal 0 HcmV?d00001 diff --git a/webdir/images/button_register_span.png b/webdir/images/button_register_span.png new file mode 100644 index 0000000000000000000000000000000000000000..bfc21a9de89a57540e6b2fb07c7604745f9fa8b4 GIT binary patch literal 781 zcmeAS@N?(olHy`uVBq!ia0vp^Uw}B0gAGV>uH`%jq$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~;1Ffgt6ba4!+xb^1FM!(5{5)BV8Gp)U$uz!JIvf>iMJhjv* zj<905K$y821gv_Wy-YG7-zEV z-FkiHES40ZFSq;c)ttAd|89HIT(^10UeV-#7wl%3@t%0l@~-;l*OWbb_gV|r&F!DX zrLwBz>)Bi9f&}ANf2_1Eer(~>R|<6cr@hfT`KlD&{QMEs?|-^OK{NWl&BFBMQV+}C zuKVcVv`_Z!Kih@+$@lh@zjiGC_;7Q;YQGtLDlc9MZ}|G_N=@<0i=XZ7V`Apa=2;?9 zVly{->cmss>b=W1rYJhUQvb60_}A6|$(Qxo86LJT!uGC+-mExzL3dQ@on5>$S#qxe z17usCv!D8xqcc4n>>R)QFx^?$sJO>DdZ*&zskb?K!}1a&!t)%Pr%G=qVh+nYa0(~_ zBqDY)YMUoKWz#mFaOTw8^=lP?itQ~LdcyM5O;WZL?RIu{)84)SXhie{g^UD_@VxSj z0w-W#uDNrdp7pM+J%4iQ;Rczey!UfsOy2kZ{_1~1@x}M~e5cRO{J1XDfz5IMZEMZ- zbw4Auo@Fg+n=zopr0DEXy Apa1{> literal 0 HcmV?d00001 diff --git a/webdir/images/content_background.png b/webdir/images/content_background.png new file mode 100755 index 0000000000000000000000000000000000000000..0902b138b1d3bbe3eff361fa2323b422dd803f51 GIT binary patch literal 3693 zcmeHK-D@LN6wjhmiR=pE%PPX`Ec&9En@rl>c9?X{Cb1jX)@+(36@73zbCV36%uMgx zl4((q6%-NIKVYBqMFf!r!57_K3%>Z|gFeYVi7OSvw)vV&lQ!P@NSa_H1l+fT!2LMq z_dDnQ?wJGk!_3mc>EJWLKp=2BeI=PC<0koS*#nWg+6 zJs+faBo(-9@)bWES;goQ#yST;rBY!kQAR^W5Sg2s17Q}hY>0S-j7=2_W=J*8I}{#A z5*i|sbu4Qt+-_)+}ihZaIu#&xo2ts?w|16UZ?dMV^C7UPGj1oQO@8 z1^K`1*HO>v%IIC*!1qpW!`mZ$gtRcw?_u6G`Q7HB4X#=bjol}n1Q|==iCh!8#!_G` z=Sg)<^}op#Jbnd1l{|ea-9#%J~%jNw=JvX4DC*>-XOc}PUr94Jr+ZP$LXUVHacApYv}+krpU7n}!RI<=Ji>hha6{sHI2OymFn literal 0 HcmV?d00001 diff --git a/webdir/images/footer_background.png b/webdir/images/footer_background.png new file mode 100755 index 0000000000000000000000000000000000000000..1c6cdfe0e3795366e770c974ac54607fd92f3f18 GIT binary patch literal 3686 zcmeHK&ube;6jquZig2Kp7Me?!HKmtIqg~mFy{w!nl3EKQBP1Ccdg*v~EG=H`Zg$6L z?Mp)gg3WDaQ0qtn^ zz3+Q(zIpp#?iAPFy%fD1jYJ}s@~hbr%opJI$x9dE$^G%hI!v$8+$JsS+q8jA5=qPY z7Gd&rTqPxf<-MD~5D~ygsch2C!VN*v>v8P)#O=BP=txAoW*b=AA(Yu7RYgm&Prv=1 zWfVEZZY&lO1tUXh%IdyJ%KK{-X@5srmf347QPCEFpiU@e?7FI1f}LW0UIG4luMx}m zE_5fw21#ueicCf~39}IA<9tj?TuCyE$#`;+zrruP#qf#55=vY}$wZ7>5;$JqmY8s` zD^W%?T`{PJu<3Lm5fjg0*4hb zA=eeqM)VU^m5FJeQHy7yu3PZ=Rft))rVcu`sX?A1n#e7V9wf7>$(-J5JJL8I`?VFG(m(q*X1pkB`*r{*N`3Q;$76I#Z(*jybe z|7Bk{2UcIk;P6JicQ}pU9rO`sVQARHf@2E1&2yW4wVoS$NIVNNmBKT*W^zrXz*Nq& z>YB+ll>$>a&#LQxlPh|53nCg^eHw7b`RJ?n?!x^@E#9c)oaXV#NvqT8!qn~cn#ac{ ztrk2w-7Z+V-Cn!hKJ9eitc->8KdgQI z;N$t9Z_UN-wSVouvTFSO;BEV-5;ynPr+4=|`2HQ1D;IvtWnTaC34afL^YA+U?Adpj bTNfgqS6{yTh^Z0p=9kZ{Wxu%o{)hhnZ0$%4 literal 0 HcmV?d00001 diff --git a/webdir/images/h2.png b/webdir/images/h2.png new file mode 100755 index 0000000000000000000000000000000000000000..5591cda9c021c7a2d3836952b723880bd106a6af GIT binary patch literal 2552 zcmXw52~<r5i_vvcsYXJbD z>+0g{1pw6G#l60U%Hk?YvM*kAv>>MgP5|(<(MB~{vUpw{!SIdv>2zR36#EPZa0)o> z&oOZgV+V1(IP8FPzcz7p0e}kN!SrS*I&EQ5Fj&6?>hmLzaj4fz!QX=~G-0!q^45*e zM;`*6hClrV^&C)qaFTae69h`2lL|fqoBs=&ufe9DDQC*%Ev8_dw!CATyk#BOY)Ie` zfqf=WDKc^yn|lj?ia;mt$aoZN?v1={3o6M)C$iyBk#K(qw$Ka-4#NYdkl}b(cmf^0 zhECo_C3%QATG8z$tJ6RyZXrW4N=X4WTcMnOj85K_@u;#|6=XO85uZbbxUeWdDJeup z|3D{hB15r?ZdZ8VG&*)eIaP{|XF`G_us9kXyok-dl+|hDiazD^6I|W{*6U)kuVl3} zTp_~cAEBQ8vRYMiJOh;$!UJJo(<*c_4;hL>CHb)UJk;xf$y#M~I_OwBB=D8hswrol z$?7!0rqxPmk-Ys|MVB2852It(!DeH5o4LGwD>8T<8U0;Wr%sXtGQ5aWfKFr~;wV|e zGDs98@7#{b+Ti|Q6y5t^@ma8ej)Q!8hb8>!tfJEfY*-F9>BAz9Qd*2Fgo+Q}gN-Xm z0)<6EV3UDz>JixZH9DS!O74O6I;iwM^wFCna9HS1lDOi7gS=%eBsz%=A#Ys|HtON>UPb2)dD|wa*OMeLbTkDS zNyg=TTp>_&yPy*}=)`TfKNJ=PB7+yf#udome{fkdEM&vtDCpxs0$af0LFLSIl29t8 z4^U|l4)tRTErg;M`4mB7a^j1D%BepIN_rPw}5(oL`JTnllPQUCCZr>vN|n!+h%kujU-7K4|ucf zI067_mt38lyrYHwu#MJU%5K0B_%60->&Na_Tew_`o$87E`wnx>wyb|-9P)WAgzmW| zwe;&#kqsk{O9BPgYbGsMiQRN*8w}#;t1ziG?U_!G&PZWFan>Uzfn!Oa2K!M>50|6E zl@_0MPi&0u3fRMI^0;rpi}ik+&)(TtW_E>I$xgETTljRp2TymTWoU=vRx5^zH0_j^ zDM=n}u$+3tiCeYcAnRAgswc8x-# z+upzW{d}2+CqVf+!cFzI?K5dfuplo&K-YT0vSy`?r3T|<%-%=DSK6yw#2M+7{d+dt zu*h2JQVj)hDm2gk@FIAMh-T_AR;$tXJB(+jG6Mh#%`N!o*hWKSyH=8ohNH^F7{b+T zsJcilZ2|UcWDmCXoX|b6#}rxOW|XBdIOJRFp!%1K_Tjao&rim!-!@-O-4M|}0L>XY z0$eZQ?upz&R%N`oS$F~<>k#f9T+>D*uGI@u2t zej;rryUgr4EOv+msQ0aJx;l6`PA`3HlI0TVObOB7Vf)Pv7r(?_rpyn0N%K{{R5==K zneY1M_L7=DM{XTm{rTHejapn zJXRFM7!C5LY}Ylov&3NClje9}qgnV+m`d>-@ze^N8fWm>j?!n`OrPP_3e;Vr>{d`O z6-)@+_Me=Az>CAx_IG1QfU1%4A!7W}0}C^w(j;B?%UyK`E6l1ndO`XnF7}mr76BD8 zk@}_i4$tmAVCqr)`r!@2yhytT;qFH#3-;49xZI24cQOAIeF?+(Ghn4>Wlgaf?(Pzn z)kw-}^!*qtmbz+JXkPQY4f(_^+l6EN*0gvR<4nDmJ*@<*?p+?2)fq=H`F~okS!vE8 zprt0Uj+?@S?hHdmo~Yq_3rc-gtcJkGu`;^n<;hf5wi<2FJ1UQpYR5b=NxNyVO>oY` zP@s5qbqELaq;Dus?fJDf7do9{PwuW*1t#?R+CKjF$YskbNkIMlzu8vZTJ10h!C?3o@hzc;$5NmAY+xaB<(8X9%z*k=ee+en{b*z5 z*I(mw{nq1ew&wSlw-XA+^=QkrndCq1E-v@l^mq5SDmvo_JJ_ZC(x11JEhZ}Qe0D%( zv$kfDmRyDZ$AP8BdQ4~g?+iSn9xfDztgSAeB{a&}<*GNYy)M5>`IA+>JkF)n%={EF8uXEu|0d*S%b_oFtd)g2v6nHz(AY7%a!C$h`W3h25P%fk`Qu^U{vCU@h; z0Jit)?6~q2on?mE>}8bcajj;6M(4HKAA3hGSIr>P3oPO;CF$nzlKjJUH8kvLbVr?i zhwilIC3ZD8$9G#kv?Z=rhCwrl^q5WAY~Ky^;Ms!41tC#THzHEO!GB@fFsF=+m4&;JS# z7T#sV9A!~7Ow=f|B6;m0STLo-Dd_g(m(>iF3H~5_|%8y=>~Sz^FB*;7P)5_We#jU zJLT_QV{Gez$Ln~UYoyjbEKK`?5)qO4@L`CPlPP`W3aXP6cXM!(F5M$+?EHn%?&PV( z?B<_(v+6{mEQbxR$wUfGJ6)Z&sp#L}c>cjnG3wgkQ2F@{XE=$i5nuWZojyNjnzj6> z(X0s4)S|wu&RD6nbaU#8@mvFaskn%dQuU;4EH}h+#p7c?6tgcMqDq86#<#LrmXm&o qyDQbyrukJu@Cu_M3SCsC3J|&Kx+s09S^)^OGM~asLGi;((O^ literal 0 HcmV?d00001 diff --git a/webdir/images/header_background.png b/webdir/images/header_background.png new file mode 100755 index 0000000000000000000000000000000000000000..eb5cf96006fe50122c424cd91ba0d505631e3f5e GIT binary patch literal 3671 zcmeHKO=ufO6jmvPBAQ-H1BGRKD1k^Lt?blZR!$U2jRm%=%1UkMrR&|1w0O0%nH^Uv zAAJbqkk(KNJ@#BeE+x=5g|<*ibLy$3^w2|3ar`4ol_jkt+nxQ9ED7^SN{1^Q`pYK9yK9Qm0OY|HrJ(DnY}va7fhZK6d@5Av#4qYZ$?>%m#6RcXTUO! z3t5k{Zc?j@X(o;^WTt{#kPAqmD-mWo5{yi9SGcLm3>ON`fY7@j5(ohV3SY))|vZICF-Qaj_3%Tk|P-@vNFEK2~Yun09`fN(Gj2K}iL86{sJMjxgb zp2}2jV2V10gaCGYhLCyz5o8pQem=5qcJPBCQ#z5RXk1&+K9;UZa*{QO3(q$2Ld-VIz$U#g>cOZ50_omUwq9&eWAPrV@ANPF2O$l2=77 zA7#ye40Ga!N?70_fUSHFB7k8+n_t3EBnS@#ScbQT0}OHXtPa;8*d`+iQQ-hpFR)h; zBXXUi+6YdfsxmU|Giu>X)SCwV{jv}jjj@9cEvlEN07h~PgWJr)3CXl7-FiKToZwO9S*WfcOk2je*kn;u zo@Kv@dsatAck>4Rce)$yH`+&N3j_Tg=5CYMZC=>msP)3wJ>p4_u@s)jHIZv91;%oo zRM$kVu@o4~c~V`^O)mf0DF|xx=u@I+oZH`g^eH_b<)UqgJnXx?Rg^A2pgsjfQ1e^=`M>Y*h}c)!KhnyIrr> zTlQt`?C!NGOQ&;ue0*|pa(a5&?RM{!7e1sB7gC8>*8Kb4FE?J_qSK#0NTkzWzp~vp zeShnp`5(Ug_Vas>D!+o;cP(_kefQeqqw4mhw;o)~KPY{7{mIV18u-M(+kfpOcHjAf b{mJ*|XRrPC)!`R}68TcerNsT~A8-8+hayC@ literal 0 HcmV?d00001 diff --git a/webdir/images/logo.gif b/webdir/images/logo.gif new file mode 100755 index 0000000000000000000000000000000000000000..f8b0b3c45e8d145bfb53309e9a2223d8f8311b94 GIT binary patch literal 4714 zcmW;Mi6hgEaz5EK;j zxVZSnjT<&LHgR!r6#me~ccb4nw%Ba;Ki^i?ws#(V{r>Rb!>iqs&nAA}8kn7!nBZ_Y z^BY^i!NK0%-gBWl|>2&(y=C-Y^?dKF(ap}?}S65dCgOQt?Yi@4t;^H#3wmG=C ze&);>PfyR0<&BJtjLgBgva+(j{`#x?=i2t}?#pTMN&a9$-}D*baG!Y1q+!s)!s70i z`N_3SgZhEWNpVF*#nRUHk6&BGqVN9x{xllRta0eUg9ov_)4uJZ-Cc>ZvvcYAj~hKx zAAhX2eOq}mzg$1FSTXU_-rjzE^;hnfd3w`l3Wf4(XE$$n!R_s+Xyw<}l?}_L&wqTJ zsGVNC&^nquG@txw#<+f9YiE}(`27CI>dwv%nM@7{2rx7>tgf!U-ZQndw6wOi*4f$l z>({R zFu1U=u)Mtd{Q2|A$;r>3KfinT?!tu&rKP1WUcC7E^Jh*@&fwr+TU(nzAQ%}Lxqtuu z>gwvu%#2Vd{PgM5*4EayZ{Nbg!s_bkPBaWoO-((0`n0I1sJ6DYq@-kSZtng2_lt{* zqobqq^YgQ_vwr`GA|oTCqobKj=GN}+_wV0N@rPc$diCYYm)6!+9*@`5)D-z~vZbZP zxPH*6e&9;iWdGv2^P7>?t(}dX9aH`wt#K%>Z@OkmESz8N6|V{Amfn3^(W&jPs;X*T zSZ-Zd;f{Vw?w=|8`h9YB^TEhBa@_#+^^k#qf#m6Cd1RSy{pjSS8drMI_aJa4V(Ys6_3#hF|P|`ICCNZG)s-lh@k`Hl( z0D&~!BZpi@#h)qu_<#~Gy|b^-#R9>3jo;RktMLz(hknv4vC2S2 z+~G&t5FTTIIl21E6sL|i-XhnPS*v=zIW0K_4bPpbEM^a~U^9T7jWtPJ?H{WdzcL2e zUmlq^g1V-ZH_S7($cfEu8nYNtqw2S#Sc*fM{VmQHX_H&p?jDEo4L`; ze>b~Zm7zZhZ5pnpC3#wDICKdTjEjauxA&6o_g*l!9Dz~HUZfHK3zJoJ{H(uz&eh>Y zv6KUyO6D6-Pe-<}dsSqwMmXsQs3>$mn@1S&zoAj`XwAl4RtIG7w4$tLn|hDUL5_wG zfG&UADkopRXx_Rir5pD#xhf6cO@G8l{mo5ulG8dko7C%XkMZkF0~rGR@Pd06UX$;{s|({+ie;MrNaVc=FVokdauZ+paVHZNd5-(|)Ts_%#4S33J3g{?9jsli? z+heV6YUX&0`qxUc-P8ZXICkku*Zd=+SBg=vJz}wfhm^thG^4dk5|oc?zhD^2{Put% z7t72cEL+zWIxl@BcJHD-5Rr4^*6PnJd(h9JtCd#gVEbaSm3?;QDJ*l6PL^g-i;@Ri za6s>4kSEGFHonM$lt=0DsD9400>Xiu{mX`S2qXR)<*j4`G8~i%^5_B|z}HkTX$m#r zOwP7bGF&b@5rxIdJG0f2^}hdM`ihZaW-5p9NA)JJ#CMox^NXQ(VRdVGT_`+s)Gm(^ z3*UoK_J~J9jx}pD69;v&z^B`+++lSpk~>6GV@;zyODbgCkJ78^-{`@gdEa0TD>&QY%R?RQH;ZqQHsYIsgfNx>NFFRsLRsH@u4?1zL5-0u@WiOA zkkzb=&Iq6f*kcE_G!(U(LvIpbLg+DuvZ;bBJT~~JekX^1sL}AG)a*C?pVe4Iq`1C! zkFVb~-R6Y@0<$qr65&a00#kw+(~8qDk1ooSr~3Kp;Tw+!Kw`5axQZ!r_x(c8vUvs= zNZLRe)l<@j;9eeQM{Z1{?E-A5v}LR*w_6oNcxQKm75ArBb4pQr-0_2sDRo(Xh&sjA zz zu|I$Yg+PRsNBFYfu*rAIj?N(W+rJ@Ngbn&RYINEPq15Fe?GWVOx^Ayp-YL0$f)z)|5fDw%xSK zuiBS&xu93?D2YC8>+?oq^dR{k71WWqa3~V%dpk#-u1RsvcLNH;%azRZ5OOU8@52d4 z`2JKKF@79SSJYNdhY4Kb4kVTn-1IutFpd_z7@;hZYJt1zz$wZ1L;CEYtA>T8YKnYd zn*f!Fak11p=!I*K2P0vQMrju63Z&sfNuIjUxPU`kSyCazQ?{UN*XMST*q7x9dikeh zyIikSDH&Y*Inzg`MUJd)7pzv_*8}4cD6?KLGkuO+S&eEs2_=*23uy3(r3fBE?ey{+ z4VxN0yB%aK>!6f0S;QYIv>`IQJk7Y>P}3~;34O& zICB}9b&wJo<+=lKtI-bx3vE$%vghn$JKm8bzm2qh!-%6D;sQka5$rkOY*ckFqV9K7 zPixNeJcKmLi{=r26o5u8Bc2eFQQpz12i9{jq?4%#4G>zf01S>HgYlmzvG+8*37S8U zukbqm4y8Fd=(>zLQiqM$>l;`csz#*?Kb?N!Lf98&hr3M#Tvj-ef{GX!*}&7%*#}(- z55&c4^$vprgk~F9dk`~&n-Uk$e0#X_T#T*!xQ5J_{;@sDe^x5D>Wbqbew4Uk{bNXz zmUUvqU?NH+j1A^5rmedkGW|i~{JcAT7xyc%19bFMuU;%+Dg+&o`O@4P|~CyHWizQ5z8{PTOFrZCtch3xbEA1& zJds+vmQJXm=rK*saDb>Ugj!Cu8Hw8Gd3Fg7chfRe*G@Vv2BlvV#Wg-%ylGf9hIB_k z@Y$5aNvZ%jjK#+8hlKO?CA=sW3SQh?^k~o@4cb*nChk4?A&&M%&n7oA)Y>UwcXs9j z#;{Xfx@T%Y;6}J~tn+Xx8DMfofW4}82~zVc=kmQ`sI(C`t5kLAcXSKQ{xKBUHJd>6 z_r}>$e2nP;3fXo@I)DZ$-3yH*0p=FA75xBdhShX4vT!k2!VR8qQiTb_{&WWT>-a`P zK*I{Jxi9KQUjW46_cp5_$e2gD7Yi!uAmq_J5H@etaKZj~OSYF8G&~D&iTwx|^ufc{ zBD5|6er)*(79xOcso&*`B_Ts-kR<^wj{#r4Vrj|^oB~}w*@rV0oRX=G*)4Wzuhq}Fk8Mk0|6+$|3AV_T|E;bSsOv0ypQ>3wXO#Dg%^92Kk+rV%)w zMh8epA4bP~g1Kt5XF&Fz5M>XfS?_yRK=fI$eO$zb$qq~(g(Ndbfm_ya=XgkZ&p zfJrF82{|3A>*9=$=rV=y9EFRZ-`LsI#~GoA&X^Wy2lL zmuKCPki7lf@L&7=PWD}d@X#t&Y0#{oLhWl!dpv|xwP^pd?uxlPq)fyZcJeSZnr-Pt zh<0XRe;zh-6(|R^AQs_ZIs-@}rT0$6NkH!YZs{-w^d(DInAb%mD?lgG{^kbWK{u?` z1^-4LAp7GZ*orVJ+Kp~|m5!ga0$z&oMiiMH;kiT(8!C~_++kdU@$U6k!pusdGGk-* zp92VNdDkw8D%+AR0?m_9r`VPuT!zkvmqmIMtD zffAT<_@KF~pILc#2DCD?TpI%y+TVysx#7P*hXnd7Di|)rcun1qhz*O!(nrSGJA}N> zqO<+lu-6;7hhpcY?gF?FOQwSLS#}d__>B0ff8PW98Kh0Lr8_q;h70@$6y6UmR6=Al zXF+`Ez#Zfr1EuqU1GhI9BOzlbO(y;lH(UsY!NGs*ROD7da_n`FNYBNG563-2#T!$TeAX#xPfOX zfV*9&<7^0y12^J8-PmAbF$&B9^%8;m9Plf4sZj-##sZCt9>TQInJiS2J$N7Me7_k~ zo`CS~;zSOhwCurx`O+6}QAAc*QWr;H1eCDAAEHqP49F)lpqv2}q(b(A9wHs28Y*CJ z9Jq}bl_h>w$pXm{5J@CxOR080sBDh_B4QJp@MU*6=};ad}5Zx*&VOYM;urA%H4I zo+E%}?={XhG=96+c#eg%6~A6;kj)oa6?(zY#!Z{|_NTES$>B}r49MmBCRoA#y>k!) R7ABJdU8Y=ilLbI0{s*F!SO)+A literal 0 HcmV?d00001 diff --git a/webdir/images/openid_small_logo.png b/webdir/images/openid_small_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..2829b00358e5e511bd3e02ffcd266b74e7c756c6 GIT binary patch literal 916 zcmV;F18e+=P)!~hmaVPIf9b?zbq)4$(o009IR0gFa6{6BsAGy@Y*of{JqlL!Ml0|WQlTMPgJ z#CYb+83yAyCJYRJ7#M+)|5<0_V3`R4|L5f=d0*Dc01JF>0fB*h5nD(17FmN*bXZXRuc)Iu;15h#8RuEVORP_I1 z`nD#9UknVF)3!7*{r~rk@!#L0Kyjv5Kzr`|XJls7U*uKCz{bF!JI$vK=m;*LMr$Tk zR#q_}<38j6zrRoAUOowQ?mGrv1_tBl#$clX0*DdhI}k9LYYMUKH$xrJM@=B+*^D!A zH!xg|*uns`e;<%(b~$DX!j^RHu8`y22 zuonQDkjVPy+y5`p`bI#pjSSpCZ};he6#xVn3n(r?VGhDTlfc+?1~5(_1|%{3Wat9g z1B@63H&8TONZk!q3j%*Q1Q5Z13{K}?W8ivug+Y69SOm}@VPN3CzZ$!m;hUH?1LLo+ za06g|fB}%5NkGY6OuxT9_$+Pm`;&^bGs71Kh7an_As{|b{60{AD^MLU!7-=-aSq4; zA)w$EP+S0=U(Ue9viL76w=K_;Q>?uAj_+mwCJBL?``3$JU(X5*J%6A&DIi`9#5aMs zmjxI=M}Z6tV0v5tq!a%$GBHS=nav=(rw^1iSt0KH$Hw^k7Xw5SqaiRd5nce=dJmkc z7#U@OY#ye6zZmX2)G(lg4l@IT((VcdzQ-qj{$t@p2`?sgc6M)|<~krYVrFLk3^Zy6 z`{x%{N2{Mo{A1u?hFS&=D~bEV<=w$0000+4ULFya6I z{|pQa5E95x{Lk&@8WQa67~pE8XTZz|68g!)$-uzNpaWzB4HaNuV6okB(sT7*i`QqX zc^L!>4t!=<(wVp51?zD`Kkg=-D~S>;skcR%7#$omMC>21xN*pcHs0c0tRNsF(;}SM ziPc1Fu!&|20tT$-nJa`fCQUjv@kC+C3!quI1U@ISvoqf2Xk|(i=IUl?N@{e_G3Yq3 z;U-H^uFrB+CTuRW+i+5nfx|fagWLs?!jQY{X6=arU0riqs^&x$2`7X};t z37RYmQ;O#*G6uOVn*=nAm7~Q)&(!ybaj}oz`WtJ?PQSHN#^y?3ICf5PGS1Ha8pE+k zgJmJh5y6y1=@^y-ft=a0ZG|ZdPArq?H(+2`(;|7`F{6Xpbl>GI8B?M_My|#ljzAN4 z3Pb@-+?qdUsm6)xA>j@^Y0K7lSt}-Mopvo#qQ-sCkLXFkyF zSLvgkf4d8-w;?feL$4)lp3HYoMI*E5@=0AueT*09aVgICcu;r3k!5-F!GZ%U3=K0F z9S$(a^)KPCsC4r`z65*B*uc`x?)kvPGDl;Yns{Fj0|R3#FisfHGY4!D^0$zExgiAT{>n7i>h8csuR6o$lhm||pLaB*TA zzdQwq;0CS5nz#7d~v(?0s=WJM$&1`G3p0hT-fmun?PLOXBHqvCVQx+>_v15e` zZ#H7I%(YWN&)bD?Xy(M@5K0t5q*5t!%4Qbj7-4ZZ90X}4tX329Few=UGHH{bysA>@ z93G&sGA}`16fl*OX%oAk6UUJqE0A++iCgND6B;we5+DJRK!6HiF0KuU2Dib`CRPDYl@8ooTFPl9YCimM7*!lG5NTCxh{h;k1N zuI-Z^y_7H&0c|13Ky6_K5lTTRR~L+nvJwy#UX=^kRTVLsV<~+t+Eka-m4Nz8pC))! zODe$#F(;ljaiE>)N$t7z4@%E2lb^Xu#D*=%-udwXqdZEI_5aBy&Wd3j@FV}E~tdU|?dVq$J??&#=fcXxMTVPSZ9 zcx-HJc6N4UWo2@5a%pL4b#--oe0*eNWM^k*b8~ZQYATn@jgF2kE-v=>_a7b}_VxAU z^ZB8np}oDmfq?-;_1EcZ4wT7R7;Fil>3_Qn*6&s>Bb4m(xWegy8}~nL=rNpn?DkVO zn{Dad)%SlBPdx}cm(Sg~9Jwpb+3oLs1!k#lV!tatnm&8w=}*2lW`A*g6nPK({9FF( zo6#3;b^K($dHumN{+=%%zY_bShrFHaY5Y0o@JUzx-0nORY|RXEXR?{Q`6o%kOV2<1 V@&{+vUPI9hK5vWX)>~IU{u@z^je!6F literal 0 HcmV?d00001 diff --git a/webdir/images/topnav_background.png b/webdir/images/topnav_background.png new file mode 100755 index 0000000000000000000000000000000000000000..5b93d1c23020ffc2fa174bb2cd7a877ef7f35315 GIT binary patch literal 3513 zcmeHKF>ljA6m~&ED5Bj#43=4m&vDw)Saz$B1RANSq9j!#SnAl9#H#Ic&lkllTZc+8 z@DEt{0W6FRu<{e&H&jAmLQFiLozxKxQY5;?l6^kE_kHi(ch66{*UkOstGNd`K@e8! zyVVwqD{!yfy$#QA?=E~8?z38#wMn0iO^SuGO?p_Yd*%SQuxX#3e8oC|k<;n2Zevfg zh$ow|j~sacpantSi2~C)#!T$tf#Vy}k58W^(XkEbaHF9#f(jlwyJr-)&-Odk*|Al! zrJe1Z9%(?}VP=Yv=lY=*84~B!;646~B$2zYV?#=k>Nc8Ug-|T6%c`vAEoHMPZWQI> zhPtV)KNeL**+R+_R8;bXEv=wxg)K3?r0txjQ@gLVs?XAJFf*hfV}XXycs!QJMVZh6 zDwIkkq^L+$^Wc#WPkm-ac|Uv;GpgWf1I1Ar)qa-SJwFeHqGLlRt%oSHd48?qiS zYaQaof=;opDvKu@G8<(*IGpcO5`CJmc8GgzW-`98RD@|ztvq5wLc=Bromeig$0~}t zZE49`_%xBV?6PE*OkF3|QgcmzU`SEk#(i_-G6|&!6e~Z0=xCNO=C>#|8KIc~ZG18t zV1{dATE7zYAcWtqgQ*uT9CT(;lRR}a zms`(nvsOt|s}LxAi`D%;;Z;5BGAo#tMr v_Vd?ocy-@jp2M(Kua-N}_ukQ$RpHh>L3k*vym)i@3M@jswqO15^yvH#a6Z3F literal 0 HcmV?d00001 diff --git a/webdir/images/topnav_background_hover.png b/webdir/images/topnav_background_hover.png new file mode 100755 index 0000000000000000000000000000000000000000..8486ba5284a0bbd46a4266b035c35c01f531344b GIT binary patch literal 3513 zcmeHK!EVz)5OqO9D5AZCI9TRNypGeB#&TMPB+y7r6(y+}l}k7FHnD1Z-StLs%Z)=N zIPeGj0z%@55L~%(E8l>`FECy^sUsSsNN|fKd%d1{Z)V?)N7~n|{pYK>2RTWSRvWvu zHjFE9uid>3&#QNrJ`DGHy~jKBgpV;JQpKiyA~!rdAZ>!}^RsWn1Tb>CJ>F~X85Z?a z9Q&w|7XVt4%$+E})+ym~p9~zoto-`)MUfr5tQ>AMwPsKyLudDbkUm4sEXo^2wYZ^g z>g$hXUDLLZ_5>BRd|}Hd=tf~nPA_FUC!5SZG1|3fX*igbl_BSWfzWt7R>wt^vH>cT zN+qP}NZ0e=kq^&(j-$LEK8h(4jv5Iq<^4)*|aSq zS&Nt^vQ}K4%#x|=#9A6I_6KDp%G=}wk6f;x6oF#pClC|O62|-%BbZZ`3D6;DvjJwf zCRV|f1;=FE;V#KgO#-JCF(=n;(8d&ry3X9Ruc^&zQ4d1+{knvC;le>@7B$J!M02^# z>^2+KM71h~vbT7{KcS+kXMLQC&FT@yHk(xapZ2Q5&*xj)&?rPX%wca?)P|}|>h%V4 z&gPMKiF-&Hw2T|Ebq_m#vmdaDRmhlZUgm#?-AKMcAAuHzradg#rnKAqw?U}&-`G>) zWsrpwUdpwUYas;|a$Z)~Qm%y*Sjc%((ou tui*9j@aO{!YmHi^8~x}Xe_fSs-IJt;(#p}BpD)28HR}7d_fL;s{RTDfz6JmQ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..a1fe7385d5ac940629233f0dc4bbd61f20959c3b GIT binary patch literal 177 zcmZ?wbhEHbU}|FG@8_44nAqLjosyCg9vmZ){{V zVZwy=_I7V?@1UTd{Jgy0-d;-!i@3Nr8*A&jy1Ge|CjI~ap8*F@{K>+|z#z_`1Cj^X z$-t`jKsD}w@w|)+IvTGc!Y=lCF}Yu=Q8eH=%k0e0mLc1=fuZY=!y%64o~d4Qx%?Cv FtO0P~GlKvC literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..b87bb2485015d12369549a8f88b4b4e6918da8a7 GIT binary patch literal 2314 zcmV+l3HA1gP)002t}0{{R350Hx300004XF*Lt007q5 z)K6G40000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUzfKW_SMepzL z*?5)vnXr^-@mq~v#Is<_TJv!tH9IQe$@Xx30Dl4m?CIp{=H9&7-_qpj z@$&Na_V>}=-P_s8t;X5r<>9oxu=V))t;fI5&dBfV=di}q&Ctl)z^}#1!s6l2^YQNR z_4fPy{pIZK+vn}2t)%$)_toO#;n%^Nt);HK#<#b(?d|Q^-PrN-^x)*+!OF_W$Hdm! z)7aL|?e6dH@9^Q?*SNj5^z`$uytMfH`|DE_v7Q^$@+uYl) zwyn<6!SC?!+19@4>g)FN@VIM;P5=N05J^NqRCwC#*lSzbSQiFhNFotI4oL6_;vuC{b=qK$I+Xz#Vv+gl@7g<|P-q!D?T7b6AA7YNE^pUbd+%Us zvHiGMY?dFDpVm+7|H0xQ7NY(A7RQyM(T<>!bm{vn3=x8=(rL;Q{SFI3)s8?qX$u8u zH@N?3nH4ckx}#Azn*N_G4oMxo<@6I6%H5fJK~aq=_stfD8jQ*iH3XfEFQlfX+!}Qx ze4~YjL@+!_3T(FWE&nOEIN%yOC)PU~H4MJ1yg;_~-0+z22Q16&6NVKzRfjwP1ed_zA3i zg*8U*O1&IMRBp?=xVZQmEHTY-U$r_!L!g-&bz+X`4t(d)WtnwhDFsip&8{Fwn?C$Y-BAJXOA#XK`_RhKI zdKm{RiY;3Snxy>@I2z;yA7(lgGa&E3x|;RV@bB*M9w! z+hA1ns)v#B*^{x*P0SkNT`$lbbO1 zME0ERVyeQj0n}Jv{oq}t;(WYbiBc-f4zs z%YX#}iTOaK;&}X+uf*nSwGJ!E(%mmvP#Eld++;eN$nw9l&R$elfpTnqJ`jt=_)zHh zEEWjIGmI!o&9${JSS8e?pJ6B}4r^%JRure>NuS5FsBIQf4$MD%o3GdOr9Z`r)$Fow z_7)3VDR7fVlvd3Kp3iKn%Jc0jXMc6DrhK_F|4%-@l8@I9{bf-Uea+=ztJ|c9(jI1G zjt{S#Wi`}ip(Oz5kGJ*uO1}QgL#nr|KKb+-)^Zv0xdlz4EyieCK9N;l&1@?$nkRkI zSpY%x{7TzHPCj@rJzbDxabu|&{B_W>aAuQjDtG_l{MF3NbN(t6a;hq(proTr9lj3V zFq0r5Yr-dqvS?jj9=41o8G*_@Oz2l1W@es%^_*o@Cx4b`zeP~{jbE9ZeqdyJV#4Q> zcK=@cLS3bf(PX@q&t4#FW;+xLIh6BCDV)h*M_W5O-6I^ zL?8rB&V;tNuN?bn1f}hMwYen95?IsymMq;u*q~)LN$27Z%ZlT}hgTuT?)!Qs9B$j` zgJRKfeJYExuV7lxqE&?1e{`%aFGmI}i`gU@j)%|Al&f{!0waQoXeKxtSzcSc=lJLY zYXVg^ZH!*rXx>|0jYJ~1;VRVWv$_`xBA>}7|7fET?R99Lt{%b>#H8%gO_B=Uv2 zEZr;OVLH8+?g$J?!XH~++cT_UbLr`l3|9xAPn1NT3|sX&7z{>cA%k_9O)_L-@4W|< zR;$G@Dz;|L6tAUISrR2!1W~qb$W})LQ?s{UYyQtI+$4M+`FW=0_tP{y=53kUUc{s# zj)J%$iGRI26*pvgbU}c}Bv|dpn337yda&vH^B^dlvL7Yi z@mSG(V{GAdZNNf>0fr$@qv3(QOWMNm!`ZQ3CJP5+#k*3l*t}Kjy}A=0vY@brM-Tu) zpX+wmyQJ-?{;c0BBEdO{9*y-|@c|18>k#HI2%TyNO^>vt!|h)Na{HGz1Fvj_hb{D5 zJ%*wsV*087z%uTCq5yIDOd+dU>g5^AA;fan9>~#P zUFIDp*E^prm1K-f+YNrkz>AFelrhp8wtB(G0M676;-~cnG0H;6K!E*vgTNlL6VXu? z+HC^fZvPTp7aBxoqy?Xu1lqCx9<&{!C2rKcXsJrvG#yNhy03)|QoT{41~uw_oBM|R k{QsPv*4L~bm;VVc0HT!-jb!e$TmS$707*qoM6N<$g7zKgCjbBd literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..c114f290c8ba1ff4173e129b1ef7e4f3f5e2bb5d GIT binary patch literal 177 zcmZ?wbhEHbU}|FG@8_44nAqLjosyCg9vmZ){{V zVZwy=_I7V?@1UTd{Jgy0-d;-!i@3Nr8*A&jy1Ge|CjI~ap8*F@{K>+|z#z_`1Cj^X z$-t_&AfWe&MeGaLh@5Q0kS;d8>Ju6P(#(BMdM*5_og0L@6jvQ6(g^H!doZ(#VTvMy FH2`14Gspk{ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..85fda0bbca21cefc6b8cf1726bc83e43bff993c4 GIT binary patch literal 116 zcmeAS@N?(olHy`uVBq!ia0vp@K+M9#3?wzWV%32ZXMj(L>;M1%fy~Ir2;r~IJAo|5 zk|4ie28U-i(tsREPZ!6Kid)Guq>ddput17Y#X`7&C779+nL(zFDdZjVkv^az22WQ% Jmvv4FO#tWt9i9LH literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..1c674316aed41943dae79b01583956db63c8be08 GIT binary patch literal 116 zcmeAS@N?(olHy`uVBq!ia0vp@K+M9#3?wzWV%32ZXMj(L>;M1%fy}VT__niwAVJ2G zAirP+hi5m^fE-Cr7srr_TgeGo2?+@gd>DjQ2|6TYNiZ`ri2h~@(drDS1}b9kboFyt I=akR{0KC>mi#>Q#WroDds`uzFx3^1VhlZBCift5iABmh#&!0aEf z>&{2rQ#+d!lrGr5WpF;$+r>U-p%#pf7j6C(;=#aR4FLK*IpF{R literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..3e9d4200b3e6b124354f12d6c5f90513587315d1 GIT binary patch literal 5614 zcmWlacRbXO1I9o1xjo!{lubD$*{)PZ%E{hmB%^eSjHD|nE1g~Dp{$g<5<)o*8pfR! zLZ>29I-@cghx!`H{rWxsKCkEXdj5IdkF~9pp^@JPz#q9J2HuV@E>Cw=KWalD5brf5 z7wc(%{`^^vGTB!-Q^43kwVXjh56;{r((;NP8t1yuEj})vselgDp zJdb?taWtcvjSfDm=L^V}ZaKLe+_P)9)^>Fo%@uYsXOf}WU+182uy=&5+)M5H!WD-ChUT{vHz`j|Ar-IaI6Ki=Ci-5_eN1`t zGqh`>W~8@LxVW^o{`Ze4xRy(OI#qR0ZT}u!^=kFkuV44|^-VW(Btz1iyzMM)obKr> z>@hSMnO{|4D;zrHm3QOF{rmP4zL>DnXU2Ik4*81aZ0)6&J^|4uvxY=&&B9M@S3dQW ziUtc7dFj7_X7>i-p#Fn&xWUm|4n#*PAbQtP4XXWN4UG`BF5d}9aGRG0^~ zpr!1S43WLO09;BRC&b4t#FN_%}!gCj3UT>=B=4=;^zgX%MjIHDJvZzd?tgq9xj6grWkcJ-Pm!MfLLe zLB-PMcU$GY14L+B-Bd(V_WFAfe6a+CrdtErg- zJ60cq6b0_jPrO9DvQy)e`N=NHS*(n`bM+-dRv|u(=E#jZDelV+9VN?ncp-JgW~V52 zwIVT{rMFy#iB_M(Mw>~mXBU^-bBK=;wyjfDo5?#^YSF?}mRd7wq62j@gZG{qXc5HU zVDBjeF{zt&@luq|SH3a3{425RvT91&_0wC9&PM*qmz8chsA5hT-f15F zrSL(!X;BTwDiiEub(^}Z-R{h)d&0I&fsbtYeAV3}_$8GRD|%|OJ~+h*h`vXEM9QO8dd zYmcYsgDMk9EnNq{G&8{Pb|>275wcZ*`2F&2Ai4O>P`Q}+<5oRx zrPpuMxO3{uh6!dA$rBGk=l*5JDBs_#A7T&8ueX}y@n1tomGnc^+RK`ACK zLffq81Sa`D!bq!B@3l;{`s1Nv*M+7=k&=Y6F+bzvd|`RbLXY;w2Hwl0yKtmbNFX^9+ewfx;t2zs)75Y%Ib|Y(r)JqTX&`@w z%}7=<5c>FQS2}Pq)z64{m*tnb+|YtmHot9pU(gxEHU#q)PVnLF4y=SM0hTI{pnxwV zsN%fK#6Rs1yY}VO6u$x3qEG}|OT8a_iE+05g2z`_)lscjNhbD8G^x8a*2!F>ob6beCvJIleF zH3wh{PTx0X>`mG-?1DAVP|?b?F<%wGUBYg5*s|e-phNX0_gTC@TRNC(j*g~WF;^PL zARucn&XYxOAIIj=V5+@L7RS zldn|5rI%qum$#hk_xd(kb`WaLPcH}E%~bUsZ<1qX#}@XMsqs6Kot`D*wds7)6COlc zokSyrtrAkl?A*_e15eCtwA`Wq&o4ieAI9F%2`_l*J@F&|u;DhH3sEfkW_n?ZcDbo1 z+wN$wWxm0*s`l0k_J_eld4u7A-A{Rh&@pB)Zsm(!X%R#(Tr8P(*iJ#*>OX%|Uu!JA z!esJkcl7(ko9D-SboRK2;U0)YDdnJeqg(8hgx*E=U?|?Tock&cHK~F%Q#bmVAmuK_ zkzF@2vu$L-NkOgb4R^L5(TsMv)Y&Q(cDd4GaUt*G`(yAraq3)7P@Yd?@+NHM@9%6Yxyv$W{ zL_n}T8t;;n^hj5AceT|GzDxF)R7G0AoR{0|@U^U6)%&h#I8H{7yqE~6;QS2^OvDWj zJ*y8$_+H^7;p6>E+#kS^Ialc$oIcDwkYDypr^YP?Kln+r8pGdo>XcWEk8m}-q3vST z=@)6ZjGI!jn?6^29)0=oM>HP$QeDxAW|8 z({W^V@TAnyhTf${o5w#L=I6%#MlbO&y0d_ALl(>;ppG~=%|!16ET-Sp6SM3O%pc1L zkb~>y%25gA(AR%lhrw4-dZ{+&Sdw%_1V50fXJ7T33R4l~TG zCQ1>CD_!B;%-n*KhNp6qZDDm_6v^!q=K8X<2_R*c=DQ{_!?j4)|Gh z$)g16j9v0#70|O28@VGv^YppaKuXHy=nOB|RfDdus0rn?SlP`aY9r1lW%Ig#1PpsM zfkvGKr9>}T){=b~jH-1$amp#i*s^Ilxo>O(5}haa8suA={#qQP1rF=zp6E&#clGlo zQ8#^Un!oYxPd02#rA@Q>ToHN!Z3Va5)I8ncqZFF&W?%U3YtH?^LCKIO?W=Ew`|BAd z6sD@q^O2`VG;1|N{gjWMBj4G)yC%F!HmuXcP0|Z()S-f9ZV|=BT+x% zXXboOg!qK#*HviUOI5r7uwwA4;|uj7yL|%uV%c?-uS4~n2K@zIKG(-2Jx-aOIOT&Q zDb_K?UfdU>8?Gh4`@>OY7$(PD^o#pP>C?eakH(rUUW++#Km1OE|MC6d*WNYOuH-Lq z&&8e1+WU8=<=(W8u6JU=&Qz&#>PU0Cy{xa^uBJ>&S3Sz&xz0GUrVYkQg2rFGXMJ#E zNK0~@49HX(ZjDj>uJHho8!zL3=hpSzlf74PHfcZ*5-4$POOTfA#w*eYLTFXw@`2e&#{y8h!(cGw^KMVz z`~vY!6W(HJ2dq&T{%%v-i+}|iWsvQ=iTJLGr`g z$FzvG#zZJ*%#_r+P0Q-LmUV-YPs%ORQ+i*VFRlJbl==Dfz|LHL^6D#P`7XvKZ~(o| zzO?rBQkQ^mh|CmIne*>1weWylB77GQb%@JMr!Ym#TS&8Kr0gJH$xHrV!*9iE@Gj5SA!KPCO(a5-5Z=GR#69X1tuRPEN8@Pa=pg zPRkf;Okz7F+1)eQEi&mgFV4F%PS+53Q;2=a!fR1d{5?~&m=}WzQ`%vGA#WF8!5_J2hmVjC#P*Y&5v-bEnBvqD&^zCwaB1H9)7 z|L=0PbwxIamOUn55m#8Zg~`VvQ*0{Z21Upz8ZMD45d)A0$P!wR^f4}4)hkymI9Fwb zbmB?w35@gLcG(}7Rp$*^$SBrIr3YTTBC{T(4>Mx%xv=UB_)2PYSYX(<$gB51XN!jO z7Q1lu^t`?XS3CKgp8DB}bbJ%}YT1%6I4_}Xl!7q>eWpno!O$@y*hU5{BnsvqWgmDK zFUv#i9L`6p0AXV~xJoAzB*N%HSqV`;Ku+4Uk%Jy0DOw(XF zjuc{^W^YTqTBzZkGn40py_PTUp5}GU^vX4F`D>j^*Kl>9w@o3c4h(vlFUu=VHi9uU z3J#I4BkI5l8VOH~AT2>bHY2e~1FGtddmx{8bcEz~Ht*2EL)VRpZepWc=1Vfkzk=E zXt-nnAzI#f+8S;my!nO^&oqLjFCe7=iC1g{syKJlt8}^oAtx+QTP__-jI;DiGOE0J zT%+{E%#D<&!reQ!*IK!ek9p zu#KzeqN=j!sy|zySQ_dGrK*Pw(%E2-0P8@98*}Zzc@Po-g-q&K~ z0s92-LQz$%0{YEtO`CU(8ui`~4t0hO=CSXId1zNMW|Ii}35QChB7Zj0n}xOhDwdJBYN@b2o-kp6<2OSrowba)Vix*>@ep&|Ft;TNE~iZs-5A%K!Z_(3RR zI!37)E`PEP4Fek7_8n)y8N6fB#SiXv_}i634*3XeMO%3xI4g4Q7t@KG1rJa;Fd1^X zB3FS=M^c_YlxO07=|oF1kh&ExAGMShMm950xfG;BjIEdjvlVLcp~tyG{6YIiCwb0? z=N?;_KeA;ac0-S|Iv<@r|JY(OD3Dw4IQPincD?^-{h{>7zFG~D&;4U!8n7IHfBX}S z$`c3sC&|_R6#T=;>IYe)J9kt=^9wRE0?^_Cbcu=IKOu8c2p)Sa{cF1Ed1PW2T3#8h;VPZB>pG*PA z3D#$Q-*17oGQc7TALI{Hrm#jPC}CV6j2UDjCTETQAx%$!C6-Vw9jUxX(xu~%?||1c zJdu)3**-1fiyR+yXt_Fh^?A$Ozk|3Q2PpC2-&&B3E$ECE>>39M1!!af3gV;41R5Qf z-41OaAmKthWWsNz0Mbf)IVHXlBcquI+t$ceBJ;N@@g+rkHxYlk_P+>pl+k9e)~Yyx zmt?jXgtqNpL*kfH`;^*2NsLWNdpsM!vDjycgq@m#`nNf}eZ1f3*h6f&@yCfKZ1trop_}aB&Hw!~#wUP{v$j*pA)z z4iDVB152V}6a+F6RE&fGNTQ+%E+{4s?#;pla3M)521(n)q+-sLKpMiEGh#I6E*p>K z!0u9D-n2J*O#>)1^xnS%x)K--7IDiFXp9AJ1Tah?2_}5YWDz$wLYqFmb=m~{CJ$=R z(Y88J0OgJA-+{xY&}_;-3pg$T`;P^NeIG*bVD!I3VHZg=*6*wx0WgOcc?0~9MvAH`;JfA9xZDO0c8ahywf2S^%-iCJ`B^Rh~qv==q;<0+CI6 z0wBWx#0LQJyzhc8^8<1>_yq!2X_-eNP+>wO_>zNNWun7v{++XCF$5OV!U#EVs%Yz} z9dH^8j=BX!Lqt4#44(rlVx7o7;%*2vVh5VmE<*MIf10VD@T8115_s7MT8>? zfpNh&2!ks@U_WC+2!Lo$hisT1TNYrC$s=Mi5WlQd%$r2yAS88L2=VY*HmafqdI%sV RDPx!cToE9&k%xf2{{!Lm*)sqD literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..02042fa1474cd62d7de63588ae536f5495d45be2 GIT binary patch literal 5690 zcmWlc`9D;R!-mf}b7mjrAf%KTkv*d#OKL2MR7O!K8KEpaHR35eVysz;lYJBhC87)o zNg7L8q9!etQe%sx3@ubL@Atiby8eOd^SSQb4tAzy-tvGic2Np^|NaAp;hCA4+S=M- zUAeFK4*dD^XDMRGFF)tw$9*iT2m8w%ty0T!pRs@DFe)ST&@i`OGY$5)F!R^V2D+-9 zZg@L7IKIBEcWPj{KW+DxeB5?3i?Ok>0|yQ^#2W?%p8E2{I7SB+wq81kGr`bJMPCfpVHFOvZPbSo3}h`zLhV!H8<216B~Q^(&dF$yL)XdlGlD+3a#6quf#9v`2K7J<2Qvh%M`N>2e@9|g%tNv1X> z%@3NV#z!Y6u+7cQ_4n?v+1|6$AJ!%tB)**M|2z`V@~mp8w_N<~(OBQ&^2*Pit9f~O z4Gj&<`xCd1>5AXJ%BZTNniHYH1VFz2p zIoa9ws%!=yrAl7s?)TU;FGOb_SAOd&)2`Hh(DdLv&vsy7Kq{5a&CSt&!5{!g0e#?q z`+p|@f)tPvRqX}*);NNK?$L4-Mx-KV7pv9AodM0tRF^uOoUH z{qpr2#ONOcdkP#I?u4mZq$9@Bz&t>9GiE+BKf6U8TrrS8PRhCoA9iNe@?jFTkD@-QkQdL zu=1AHCe`<`YhTRO1hfj{$ZGqW8|TNnGWB+Arz?*a{am zlBD{6nxog<#-w!JbTmHmyV{^y{@un6m)&_vQq2H=+;}y z@qQcx%h0?LO}4x(c}n9P3s5~bJ-Q$NBhJQSLrUJ8v)X0lV=4Oe(_^Vo^fBk7B`&KD z6Ri#6Q?wo~$B~F=mV_#MRD)g0+$xq(jikc<4O#}irK8N7E&-F-ZiSm!I!enn-Eu|3 zZ&a=4*E6_Q3ta~kb&qSZdUjfMWRR2@Zvv(Y!ai1}=?1@Za0?}xTMtqzMY?YZp zBox@RaWPjI4!Wp{i?wzo;gu79ZJp3I7dui*(pOqu$RTbqU8QYvgHl?qea1?vj%uyF zeqKb^7BS6Ix z(jZRMJDqy*$)xu6GoJaMj+A5s>e`gw`hBRf`iXhaZSv?Xz3LWqxJpoiRH8Kyy>fPE z9?Fr`O(1pXTRjh4YQ>*9U~!xIngq*eT_VNbu7B6Fr%f-bC0mFaW)h# zx~QrxZKwG=s2#%s;t&nq(zqRY%c%{-q4$a%4!Wmp#aLK(E91G!re&!Ks%2=eZmQ~_ zF)Cx`&Lr%o#fUI?RSyZ;q2T`xxo4Bbs7cfG_|ESHmoJ6H-DZTgwtw1g-%5aB)3eF9 z3$8gcDXR(2vY#(CGMcO|OfdIt50Bi^ifH+c?s^3|qmNZSaDv;2n|!?;b`Gk-ahgX? z1$S$13w!ZgpGagldIVf%S@urftX}#3QdHXU+B0-sX!25Z;-WlxiH@;Y#gbrFMd}f> zvn2O)8$sMd5ss20iQB^D()Iue!#N1J6KRw8_h+gop$Y#`IxvB$Oc=MjQDYiI^=t$W zu4kl0gb6Ww%JCCx*rqbt-sGe1LQH7VJ*>Ys<($yQT>7zg2Bwjyx>7;;mFKGEmYSYg1rKrMo$=@^)6 z3NMk);xsidVINRyg-sw>Ao)sRi4!gLgK^d;rf4s@Or_dR%eiitt}X`7^x#W=gfC?B zPYtcIBj)M|xY!+ekj>stRJB!X(l!=B&(kacGy9cxH*yj@TlD@(qTSVoX?!mg$vbR%Gl3vzM_FDtyBcvJ=j8dBp|X|N{3Cwl-X|T8q_jG<^mpV|p zbkRXAw^%1DDPP;2$EN0skM zNAd(9nu>)O*C-DxJUUZIA;=?$QjB z`*rJ0g{BFL?CoM9={gqFPLC>JDy&lQg;_0vted^ca!E|Ut^RBZMlRQ|d7BZagr3G!0)QP9+Cy+eJl z^F{E(qHq_`96o*wRpqYe#w&+t0gw~knc zU^?z%GG#P6vPA8G+`Utt|BN-vy3ti~9IHRH(T~6Ic(O^UCMwn7WDN8EP^eXc{&6{F z*_)Gtc6LYvP99`5RJZo!p6&ee?k{t3 zUpZMWmNPi=Az@qd$&tn@rpFDz6{PBMgI)fY*0JhVRLjWb1rWzxWbe@_V#S!wCX^>1^e!x z_aUBZuZ^{zsPM^MnJ=@jH1)Cy;`qo7mYZXcjuMW(bQ>|JNB(1JUGJluPo*S{Oxw>J#^s?PuSFVg`8Wi zTsX6NSM%8GXG=GatSs!&Tz*ygEV;5ebUwC-yb-7Vvzw%$RHkGRY@zzzMK!N-W440w zY;V6Zd+fh|KL|(2Q2JbV?p%~%{#6@8<<2uZ77Cw7oWw`J7(c^YD7v|Q-pJ|ijC6zi zi>?-^-Z1`akhQ{bf>f#w%M+vXq|4L09~pPeQ9UkYC`rAnEQNL4SSfRjkt-T>R6x?D>fP>uVKZl5mUp3u`4W)u>{YEfcq#}o)It4jWb^z zZ@)TTMuOkFgtuFw8YGbqm?pSrCpZlfKIJA%<;F=xgj4~cN=VXUB$lxfPq-z%$xRIO zS8ZS^acbl$QR2E%#0mwT(}1G_FewAUNWc{iVG9S&ti6b*Q?0~Q)eO=wLNY`VD=C+_ z!h-H_x2)rnh%qvAT+&?@gb`D#QQ|NH=ei(+EJy;trR=B*l(ddXDYZvTQJ_-j_A%E$ zNldD+LoC>sVW#mELb$~H zR+!LeG4h8AEr_W~LSlR#A`*cpb8FCGTHZxs5_+(MY0Qg-t_eUxgm6m;zug!ZcvxAo z1eOXlN(3Y&E+plq|L#iP@G;$Wm$DmjMc(YnWpTpsM#wxYst*8OO9*ELlv85aP61wz zq39;WY4b94D>5{HQGJ#&7%G`Q_D=uZIE#@(9i`UkcpmzzG5xRo0jf^KyeZ0>Cn}-D z#U*MDpOnRqw7cp5b#-=~B8sWV{MiWJ6reqw9xi6-)$A<$GEPiM304>un8KLkK zRzw-Nnj8fNxSEl>T9oq;&ZYnF^8s<^!jT}e+-M;7!mpeaK4>e9H#W_~*5r6h=U`)U z41et-Brt-_2UQ{T@9HYLv8X;K-pT~yS=ib*j;CKq8vE~S?VuNuyn zb>L6#hSzZOGzR$-2cvB5GnfacnV5|fLUQVG5@McVX2DpNHTAdS2|Tu zXr1pQQIR3hioRE@H|&X8at~I#QMCN22gB^KLi>M(dcz>ygS11{Ym+-)dx@sn+9n?NfT_i_#Co>&EV-Pyp|Ja%rW? zb({Qh#V7bQDFUUCS$Bsg$ft8=i`jU7#aZ4X)@Pzkw^qm z5#x#jVSP4i$Go*(gg>zXx$J?p2PzMXDr@%K0yPji1IF=j`eL#!2dgV4r?6pT2~eX^ zm56`|EJD|In2PRumG~?cH0cW zUJR1OcMh}hERn1ka$71Y|A7)N2mm_{HiZTBvv4#NyNQ8B(qvTl*c}2OJs(VFVLVZ6 zgD%1l;n#~Wr85`}GUO@1R+u9U4#pkD?BRgQ=>GuQ&P9Y$zQxd8>^3p9uCjc`5${7v zb&-kZ4<-89Rr=w){S3H-3Y1tWCJ||X%^#{d0(YQ5g@9@yBzkfE9Q1%95m+LI+X2}c z7F^F(3DW|SPl9_n1XUs2j@ElQ>RI9%Y8efIj&|xoET~Bit8DNJBF{;nS_U9S8$vA_ zubKc2{Ko$r?c7d~FFpu}{SP_35eN^upL(_Ka8AP@aG&VymvXh?SgM0MjVxl`7t!vK zuH3i#+_cl;0bir;pd(Ta$OIS56mc}jMoWP$oQRt47zK9UHBX}(e><|aTM zuzs+bFX!0=_C17-PhiA=PtJveJ8IUqf1heKdc@Q zeMp+emMtso64I-dmD&Wqq2sU-mNz1u|w~9K|>q6X(l^3C?(5)~zN!nXnEQg(74@A9Wwj zTLhD90B4EFSqxG@k~5>}Wdv&`74#FWuv7%+jbc^- z%5HIeOv@vi8Tb$y=8QKkL=4C>@F#?bjRaS5kZ2=7f*E+MnCdFQg&=s+73hoz^KlWE zjY32^CYuEuK;E1|WbOVz%vr=eUjVnixHBj;igaOvsX7cW^b6IIIS_OKkBxa1xo^Oc zL**7g0istJBUncaaAk&)3vg)+#NJ@&j2K8nsX8chTQmeSvC!yX!N|}uJL<;B&?pmt z3ZS#5x!16zbxQ-=BmHa6goY>S2K9gb`pje_A2 zyttS_PBZjErjiA>Nr-9!(i9i7`YZy8pdtp~V@$rofxVcRysbbnpeIFTybw4f3>o2E z9^$}5+((pRM(Lsw6O|GDReBB(CE`&s9WX(*wOJl9L48PaB#C&8>fo~Bov2KqPd7VLZet6gcnf2 zToyJFQKuxtZ*K5KkpkYCWWj+eX$nL(^d%K}C=^3+I(?`97aHUd8bb}3#CnrUIdHQw cR{5z6xrwa2TLKn}Th16kCL#yxH3(qwf7i6=Gynhq literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..3ef7909d3ed04956a06c5d9017076ea30e0ced27 GIT binary patch literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^j6kf+!2~3434ebKq$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~-c6*+jiIEGZ*s_F9NI$*%V9Q*UX`TlF!Ldi}q7dA02yr`^X zu-PrN{%75tzwegsKk4J*;_R|w)xBe%IT`Nt9oJ`MW0-m*yz~E_s%D^B44$rjF6*2U FngH9xIDh~E literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..d9bcdeb5c49910d5c32c9ebbb134200bf138b7b4 GIT binary patch literal 1120 zcmWkuZA?>V6h6*nD|EKy_G>T#efd;-TcIEZRG=3KG$^eF2Q{FAMV4*KY}f{qh`QSV zerz}DmTbC_Y|fEr#w0P0=t#CW_qsTZ+oCcxM!nmzgkYx0y)F9Qv+IxZJb6w|&dGC5 zaz;Z<^@~z7QUPF5prJObvq_J$hJ`xXo5wcl^n8zhtsmg}%|C)|K3%8x)wT6C_ipWb zw=>oa{%CJkw=1x%v!^@U-5DL&ajAP1z;mggH7#{nz-rJ$faL=7qA45La$rShQh@N! zu%sTCvXE1t{K=eCf%*<$g}~m_lTbYf%#DuhOcn)}oyL+UY!^T)N0SIlg&q}p70^Bg z#v`A*ftBD@6%H#L*N*0!pas#aR&fdVH33r!@M?%V4H}RB^=Q5i+Cy}fVbYD}B4EjH z?P{0x>Acg883%Oa|AzJ?B#N%FVmw`fKNY;g=C3&BXB;Z@Kam~dpydSE;!)KoPs+}MGZ#35TL&dgu1t8ZJCOzunMR5)=3wB`6<04>Wd>fEGNt=fUO7S z2UdorB;0d<%}W2%DB8|}rj&7Bd@G600GiIAl}DfA(T~fGjEtPSpMM-+!RdW!t0gq&tGw>1(Ck!bL+QCwfHM zFSfg6C%J1(_sXrL%2?h=Gs#tB`jY5~^n-B4=5yiEV7#4=o|0Az*Nu@}Ih_Oz$pHOG zC`&0{EO(L#V`PcEmKepS-spt1Gd{>irzEF%o|nyJB4uhF{YR*@P1evnVor$^%6<|| znF`WIVUCMc(=ZuIiR8<#kjLU}uWTnbQf7F06KORJtfO9XHgzgQe;2kI(+lL6NRM$K zObK})t}2X5(vY~u9{XN8DGugG$E0mSB^Mi(>V!GlYlD8E#--~|}G|8JkdYdiH90fD-v+HZu-d;bSJ8}W_+ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..d6fce3c7a5bec2e266531e2b921f6a3bc3572bcb GIT binary patch literal 1409 zcmV-{1%CR8P)Foc7fVkN9ZLH|iPzfUuN*G~E00Ia|@iPD+ScV@e5BCj%&595~Az9JYb1HE%fJ|lvg&G4W z6xqeu5wao}vOGw#oOoq zdC>F%1Q0?EEY*Rd3zq4SGax3LA2VLCrA$0(SkZGRe)Txn3^>fhp`Mk2G^wZ|DoEi^P%kHvUUm}of|3c`UUt&-f|52O4U_0*PV)UriM_~rMM%_(97pUF zgq4T@9=!koXf2}^3PBhQEBt~NN?sh$J8ydbXFQt)$8tiP<$_ov{Q4FXyL>Z8Y{z2V zkaSb@Mp@4L)cu~!F2?_5njt5??aV6VWbNsf=#lQ+PR7RWs~T&qO?1)0;8OP9mr&?_ zEd!{i70@B06_L@4$jDGFl7UgQB&=k~SS7Maj>slCBAcYPu^a+2hmVBJ&?9G-+}TBz zXWWq~l#nFk3zof330q|P#FdpMx?{=@e9y*0nRuG?)9dbIA?=7Zn<-7Ogy z%rLzw;Z+H4qs~_O26Js?Gu0GVXL}YV+@i`mTQ6efT|4_N8}^c}3;8Lx-qSp(>c5yP zv+!2uj`O5iUE1Gh?d8?|Hp~2qjUgL*#Kz|yu(3mIobhzo0%%W3w;50B)}I;aHsc}P zSeq@=3AQYoV9T-zwk(^Ikvv-Un*@E(FC%n|1lUfINU{yq26f#+*Q{GQ%4Xe0YxQpu zv2_#y8&Nz-w%~RHx=DSu0s3URv(}ru4{F`oY^bw)ANJd!RX0b`Dd=_+pdGVqaS#TA zaC#8o%*J|#2HI+&(EtA%Z`Y=G+9q~V=ogzs#Fs&WPiD*-y?Scqb$UUo8r5tsP!;V9 z+So;%!C1xB@h9l0TBW5A>O>nFRjUhLtI#SPHmr5mvtO=H#t?b%!g$d!L~pK&n|i}L z!&%^r^XATaJ(Q)5hg3QzAHz@KF_|6%p4ElhboHes%dnJo?C(gon^x1UVMu9>l+$EM zyYYBITTA&JYj=J;UeH!t2igzSu&1+}ENH*(>w~#T?}~D>R>)!8tQB$?H*0yv+zy3X zp5FpK#BWTE@nL>rYK#x`TfkSiVcaHeL%A7)bE^@*P25(v!8sWU;bx5QQEo#=#9l_Y z9jWsb&xxPHEyHgiDKT#F_ig65r+y1bS-53z`*yvmBxe`^)OW4foqs1^G=pWW+-Vx8O~1UE+HGF@F06NmG=W!zJbw P00000NkvXXu0mjf;Dg73 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..0bbf3bc0c0e5e635553e8d1bf9ceddefbc402396 GIT binary patch literal 2673 zcmchY_gj;P7RTSb83YJ1>=8y5ONL=ZcEgk+C?FydumNNz8c=c6`n&|fmMu_HHG%^w zNLVjHyfy)hAgHK_Kxkz+0Ktm5M|X*?y?g!o_3yv`{_^F^wY9YuFJ3GxEUd1s-nnz<)vH(c?%i8n zUVirM+2rIT007UQKY#e};oRKZty{MqJa}MhYina;bNBAu-+udTYHDhBcJ|n@WA*j* z-+lL;iHS*OX6D|#dm|zu!o$ON?b=mbT)bh!26uP&kdP1u2Zx!N8486$B9X?&$DclZ zdgI28>FMdk#l`#g@Bj4EPc=0)2M!!4EG!%z9?s6rzI5r**|TSdhK8)HtXf)HHgDc+ zZEek9Fk)k4xm@nHZQC3j9o^jACMG6~jg9m3^EYnX2*Yq^XJ>6~?X_#y4jnqQbLUQp zM6z$+zMp^o*}}p?p-?n8H=jOzx~Zv&N~Km+RkgLX9X@>c=FOXxm6dsUd1NvZ zX=yul?BMZua=F~p)O7py?EwJ+w{PD*dGh2hzx?v((WCP6au$mb!vmnqSpF6-9Ona(JQT#e>!KODwxYzG5#S|?M#v6eD#mgO^`=~9EL;yL&>*dd5*+XG=_`^3=CG25PbLa+LJ%N(PW_s z=_-TaM{SB!w(n7k+dMDN2G6VPqUA$u7F4m@ABAZ1D`*UMfe}E6csJU}J1Trmp#~7hZ5QSGpNvd1Uz$!Rf3q28pgSj9o zx?zwoWa8GYK@TOz^)mp#V2_VR5WfJ0W9BSSbn+cKb z7B9l9)K#s!?PSt;g%c8u;y7rd?hkP%>vq5BY=N>c=98V=+T&RSPgSu|E(FAK>B?vNN1 zPszwcbxJ?Oh|1pGd!9?gxzSWOR8o=x5!rGh+6r3hBL-14aTaAQxvJ|Y-S_m4niV2S zK@?}-9Dkhg<+w{Ny!vjyp-QmjyGmIW1DFB{k>P2=8cm~9M^_P#8?JFDumGEPaqJvf zZ{f;B#CG;H7q8a_hQ$pR6%%6So8vKM+W+cNPE_TI46^dn9q@qBr@1bUgxcPGB*b-i z3Hx_0(Esy5KKx^Y0yfgB6~}t>@!ctk>J|!vgVRhE2CPQ;AOKY2y%5nM@YF^ZMS~q}%L-n>Lpor#4w48UHYViOt={{43LMRvkIp+rkbs*s; z14}4q0y6`s8DL?uo-~*R@5tnFsC1DR#BGxT8fA20u_o?`0iDNI6lf;^$@AkR1dPTz z>XF1ZAqNjU95c@Vn59Wo;Z6b(YG+L$xy3(?j2I*vQ>PmzMEdh`yw3=)E}JYMDG|*x mDkGVJ;D)fXhxDI?kcM(ish)C#5QQ<|d}62BjvZR2H60wE-$(3-AeXt*@{D|Np;u@pDC#5QQ<|d}62BjvZR2H60wE-$(3-AeX1=9cj|6h7@{#_u8sU*lR z_&>wb?FL>zp1h}vV@SoVq=W_rH;IG.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 0000000000000000000000000000000000000000..030941c9cffc064276813d7eaab03d8c667ed700 GIT binary patch literal 3618 zcmV+-4&CvIP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=00004XF*Lt006O$eEU(80000WV@Og>004R=004l4008;_004mL004C` z008P>0026e000+nl3&F}00093P)t-s00030|NjC40s{jB1Ox;H1qB8M1_uWR2nYxX z2?+`c3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH z8XFrM92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021 zEG#T7EiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!- zJv}}?K0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)Wt zPESuyP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5d zU|?WjVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&O zadC2Ta&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8 zf`fyDgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@ zl$4Z}m6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*! zrKP5(rl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dk zwzs#pxVX5vxw*Q!y1To(yu7@dCU z$jHda$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~ z>g((4?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF) z{QUg={r&#_{{R2~`6RjA00002bW%=J{{ZE;FiHRb03%66K~#9!Vqky(Mi^jVMCCIw oFfyX>85y7$4gdfE0RR6300puDFk literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..6c1612230550ef09678a38a2e3374585055a07eb GIT binary patch literal 3618 zcmV+-4&CvIP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=00004XF*Lt006O$eEU(80000WV@Og>004R=004l4008;_004mL004C` z008P>0026e000+nl3&F}00093P)t-se}8}f|NjC40s{jB1Ox;H1qB8M1_uWR2nYxX z2?+`c3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH z8XFrM92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021 zEG#T7EiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!- zJv}}?K0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)Wt zPESuyP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5d zU|?WjVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&O zadC2Ta&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8 zf`fyDgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@ zl$4Z}m6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*! zrKP5(rl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dk zwzs#pxVX5vxw*Q!y1To(yu7@dCU z$jHda$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~ z>g((4?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF) z{QUg={r&#_{{R2~9(fUf00002bW%=J{{ZE;FiHRb03%66K~#9!Vqky(Mi^jVMCCIw oFfyX>85y7$4gdfE0RR6300puDFKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=00004XF*Lt006O$eEU(80000WV@Og>004R=004l4008;_004mL004C` z008P>0026e000+nl3&F}00093P)t-s00030|NjC40s{jB1Ox;H1qB8M1_uWR2nYxX z2?+`c3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH z8XFrM92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021 zEG#T7EiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!- zJv}}?K0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)Wt zPESuyP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5d zU|?WjVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&O zadC2Ta&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8 zf`fyDgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@ zl$4Z}m6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*! zrKP5(rl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dk zwzs#pxVX5vxw*Q!y1To(yu7@dCU z$jHda$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~ z>g((4?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF) z{QUg={r&#_{{R2~`6RjA00002bW%=J{{ZE;FiHRb04hmDK~#9!T+A^Jz#tFKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=00004XF*Lt006O$eEU(80000WV@Og>004R=004l4008;_004mL004C` z008P>0026e000+nl3&F}00093P)t-se}8}f|NjC40s{jB1Ox;H1qB8M1_uWR2nYxX z2?+`c3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH z8XFrM92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021 zEG#T7EiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!- zJv}}?K0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)Wt zPESuyP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5d zU|?WjVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&O zadC2Ta&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8 zf`fyDgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@ zl$4Z}m6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*! zrKP5(rl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dk zwzs#pxVX5vxw*Q!y1To(yu7@dCU z$jHda$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~ z>g((4?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF) z{QUg={r&#_{{R2~9(fUf00002bW%=J{{ZE;FiHRb04hmDK~#9!T+A^Jz#tFKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=00004XF*Lt006O$eEU(80000WV@Og>004R=004l4008;_004mL004C` z008P>0026e000+nl3&F}00093P)t-s00030|NjC40s{jB1Ox;H1qB8M1_uWR2nYxX z2?+`c3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH z8XFrM92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021 zEG#T7EiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!- zJv}}?K0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)Wt zPESuyP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5d zU|?WjVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&O zadC2Ta&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8 zf`fyDgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@ zl$4Z}m6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*! zrKP5(rl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dk zwzs#pxVX5vxw*Q!y1To(yu7@dCU z$jHda$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~ z>g((4?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF) z{QUg={r&#_{{R2~`6RjA00002bW%=J{{ZE;FiHRb03u05K~#9!VqjoI00ssI6b=Il nhXI!ivK}PU00000|NjF33?~3ZGNlzM00000NkvXXu0mjf(Ym^p literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..427d60a38af14ac7b530a266dc2e969555d287c7 GIT binary patch literal 3617 zcmV++4&L#JP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=00004XF*Lt006O$eEU(80000WV@Og>004R=004l4008;_004mL004C` z008P>0026e000+nl3&F}00093P)t-se}8}f|NjC40s{jB1Ox;H1qB8M1_uWR2nYxX z2?+`c3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH z8XFrM92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021 zEG#T7EiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!- zJv}}?K0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)Wt zPESuyP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5d zU|?WjVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&O zadC2Ta&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8 zf`fyDgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@ zl$4Z}m6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*! zrKP5(rl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dk zwzs#pxVX5vxw*Q!y1To(yu7@dCU z$jHda$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~ z>g((4?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF) z{QUg={r&#_{{R2~9(fUf00002bW%=J{{ZE;FiHRb03u05K~#9!VqjoI00ssI6b=Il nhXI!ivK}PU00000|NjF33?~3ZGNlzM00000NkvXXu0mjfMZ3C* literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..f8d91932b376af76ccfac030c12eb9fec7ee4c63 GIT binary patch literal 12174 zcmV;9FLBU`P)_6|b&%Dfjpyv}j54LBIXFZqhE-_t{2r7|?ya1%Cs>h{sswI&ir4|Fh z$jAgxe*E!Arq9Rc<1hC3+xpMn|Ni&&sREphKX2dqw+!rCg4fvHA{v>|sAOH9VUq1Wx=i{&V_yqRn;}h7QkI%<-7fW_4(VkZ}j!+ z*W3A4Q2+7AAN1S*{zm`&=RfJ^|M;1H`st@nDf0RFlp-IAiA&;HZ{w3b`^>wEDMb|H zcWo7$YKZ}V2ee&$PJPY#JEPa?S+a1^5~E@1g&W3xW#A&D$3t?w{=G7DSsA*r_4-%Y z`s|z_E&o@}NSYWQ_Q@Xg&3d|Ou zW&0J1V(Gn21@Ok$tl7ApUjkd|>Gf{~b_Mkc=*rd-*uVe&`%Pc}`s=SZK(DV?u$Q+4 zw*GP77{rl7z$bi8N=|4%dgnzQK{K@X9=v7^ctch^o|!a57b!8M)R5bd+^DZB*f)2h zXi(pP{pA7dU4m@DUcq}~?BDNws-MON*}ARvB9}^yYkUl^^T(x&iy;x&pXVP)oMH zG4>x1DYCNm`n+yi_f;$KX~32?&=bL&3KR!`?Ad)hXq&kbL*FF~DPi6Lgmfs6L(D+0 zND0vbo2}RNnI*FeDS>21aabAxyE61@^}W7lp{p^l|7WGkjF52;svSZcA8su7jAYiZ3LweO3*sn5! zSD>!n=?3mEUmKmhK6d%BxhCszn^Za-*h3D(8SY6kiNgaaXQX90(eY3K$c_zH0Bie! zBHJ2UyB-p(7Bef5YbLIag?2iM6)3&}lecGR>8-$C0bN;o1$K2uG_Y5@@20Q6ep|mt z*;#x0tH7=ryq?1awzczFEUg2jL1spUI~;shFFVJMWT3#Y2!p-uSjIu7V%f`fjs-Ap z^O>)I7X@&(g2WB97X@e*&x;21dj4(4t<5d)+aC4x2CzHGU+%zOzu(5F>;Cn4UV*tj zZ$V@8yjpp$fL&R8ZO0o+m)B>04HkLJJo2A^{CRu7ZvXb}emug@Fk>GfXvJPL@_-^q z01_^oksZ=)$m(QUUX;~R(;!CYEsBZDLoIZEb1~!wBOR^fg#bCy%lortW+6TF_FY@w z&6w46@B~bZ!ZnoFU!@$z>E}`k{^oUMnFB{O&3px81f^O z51QS()3a{J?CEH!+pUC&YHNa5>Eykw2XY`qJYY8f?~*Z#9Wbu!EB)#UYzgYy^IbES z3h4T`vT|kq^`Z574Oq_r_AIDJ0c{44L7>OU1PLbsz#Hu@vK`wj512a*;t0UHoeBa? zk6L-sMY|p{s1$`s7O*7~*BX(c{b~v9`g)Thw{{({Us@kq|5b2nV9S~lBm$l;MJBR- zSsN}46ctdtgi9+$xa(0`+j0;b5@@3(htB#Thl4>@u&CE;xE$KTV_CN$*;#_wksf7p zH>9;!8MRBwYyjM)2y#PKP>c6P+kZ7HSsw`0kDr;x8GBY&%c%cEP&e$K0;+W$c6Ga3 z-f4l|(a#9Tgjm>eL6n{@$mNioz>^;m>!~orEy~tWx3~ zOIPqpfCGkR(H?r%tE(Zjv@CMcj9p#<%|dfa05{ue+I>B?x*{YBs9Lr@sIdpzjet7C z(j3YXHqYbA7G>{gy$rQE(#f8iq4wzn3QC-$G_@y1j3806bjQvT*z2!Z!CPeq$}$Qt zKiFGHksaJG`+EfLE_ox5tq+;W^uV3*u}1^OjK^IhVL9wdjz0DhDyAkTJeq`!B#Pcg zhP)_7_7G+P^?uQ&deV!Q8k_%Iz3u(DO+Od8Pl9$mZo9rWlUfCjjYrK(<6~b$ZT0S1 zS3O;Ux%tu+)a&a-3?R6yAif2U*Sn8h->)oR%UIXfo6X1d@8#Re{rTQ*_p!In<@$MS zi0rd9cH9YgPHQJ6i50k+-%kgas7Aw(CeRhp9mnRTLOFML>EN7Z(g?zUW!g!Hg9HcE;V1EAh^ef|OhyG~Aswq6=s?q4)8Rd863y;SWj zSY7I8OIMc~2-fXFMwH5^wNOOZdAr8m>OGbX*q5qptG2GXdan<;-u3UQn|Fkfk?i04PcV*!JYNDjCSSa=A`)xBsyFVf!o zcEj3Z$<&e+vLHr0ak9iY3#aPde)nR zA-C1eupV=%_1K$crutm{Xra05zTK<7Zd!fooV!f@ zjN&Brbhe|X^)|DOW?&^TSXpb-J8|rPncYZ6g>MN)cr9$&910<@S`i zkQl{aQy;-2thth!_d8NT%MNOLaRo zCuFG|O0cz;&U9i--BvN-HZ`yK2WHwUjV^zvpBugv*x@U8x z({-K67HqPx8;i~;!e{od_khhIU{6k}7aYNF7KD;K_3|HlOG;X68|WyQts~R_Ey{93p$q#vLD)BBQJf!DrZ2nhQiG*TS=m|!i=sNPks~sAWNwo((+QeE z#&&JLOxr|mJq#Wvwe^U!h^q1|mxGNOYb!WJG9t^^ z7DMZKI!Lj#PN|b)?X9WqMFoppm0nG~SG!I#I0zVZ`DqtCYId&sD^t_0?Sst)+mcAN zUvx@c>}O&7-Gj-m-xe7Z%Keh9Wq_!IMZnTSjO}I%4>EJ4jWgw@5p#Q)LYiP`6fiQd z^$Ve27n-UX6~u~jBf+k#TtGMMS9dA;lIYZHi)4l30jO7QF&T(%QhouWT^ zynfVSX2S`ZnZPko&ykt#z}4MKa~F_k(OQ~~0%y}dDP!_F!}v#hlq(gM^>trIkoxdHpiniE-2)#zvMuOXYZ z@JTauPGdhoUrzx&2nsFzYz-P9uOq1X=#HU5Icmr1+m7`=TI)3+i)$@z)KfDUFrb|e zMgs?s-Dk1u&Z5gh$7`mpZ50a_t)I09Z_Y2;>j48bSd6fih|8uJJL^RwJv?I9MOj1S zdLU4vQqm5rNLt8_pn<5I7Sa+!IUbUAt>rFsNh$%|eUVd;2@Sq8wo0jAKq5vm`3kt3 z=3N~Rsk>_m9Wl3@TSRJXnS>Dm>Ye59TAeks*WX>pFw%@&JCaPu7;eaM#?H163Yxqm ziO1X{Y;1uY1)XquF~r!S{e#6HD+K5cU}@)0U+V%VRlwA-9$@K^y(J@8pB$}LpzaKz z#@63&zauQRhE`R26msV$Z^{OZT{Yqz~|MKp5@rfxL0c0%O-=ufe>>^uw{kcP3JqOoTg z+bjHcEIkgV+Xd`yFtrAF15DLXpaVjTJA-wc7@{Rz2CcE1z_Vdg<2a#%A@fTHRary$ zx^qPy{_{TkOX+1&?B6kR^}s#nLpfB<^+cJ+!)2=@cHV%N&a^i{jchr@!b(pU4J^^d zO17|ADFAxZ`eGm^1_e)qtT@Ery0EFfmaLv(=|+cN8%Rh$tyRdxLGaieqrB*@ zL#S!P*wWof-%8)Qb4e_g_L$k4z#SDq0S(+`G&PH>PTX|r+7{K~Ti3eID{{XsPtw=} z0bxo@dr1_)!UUvA#=f(B>9TP$k}MsN5fF`Yl1{Sda#ZD%T;wD_* zrR(uRL+ilL+JnOY9wm9-+$udbbEn?0(LOj>$r_hai=7gPtL*qQi|ZPXQR$29gp zkeHn=VZ^I8vx(Xr3C^*P2@HVj>StOa=0bwJ{*liQX>WaLOu?0&v$0Jsj zZGj8Z3^mjKv_3!Zt()Tzw)7pqx@$jMW2a1WYelRebzTA;ZOaH?FNSYztt>#^x{9&}1iB)CrBSv~c-4}XJO4VNu`kuHu8xMR`H+r@WMy3&f@(oD zV-IQUBfyT>ItFjOyTqV&0>y3{a4&QaiC7u|8A%bSB@^2+!6JcGyO0!VK!4kJZHk>1 znNk-3?ybKKaCMsmp|tx{qUMoqf7#pY9YA&lk%ZZwrPU|5J9327sG0NZzDc%Dr%025 zqCIwz@d$Rqv$k9j0=G{sMPM7F99180rOMfIOX{5lSZj~hBGDq+p)@>{DBd>D(nB2@ zz1GjEM9YEo=n!M0*-1Ij*Dw%_*w@JncJ0>&i~KC^eP`rF2U)|W{@J)VA!A!|1Qar* z*jjIw0i|Z_ef0$;GbCeMEUibRZ?mK78J{kaZ6ym=Hg~jl6AQ>=HEZjAwYpG94|(1j zW6N|q-Bz=DfN-cDdxU)xSwru&TsGqlj#fXTK+$96&LKfghSJ8J%i;Ld466Ic7^EwK zuHB7AWfjo^qGj`m7f~6w&sVL%jGPcDOR5_pYDq3q8i?$oc2L&4#06v<775i>3x}i}tq++VK{F93+C@%G zValBBMTkrmmI0*)W{`~}Bamck?hjo=AIT2H;zr=Ov-i5ctc-b|dO^D>y);olB4TMB zC|XiP28;VR$Cqm(8I)rp>kC5c^snH_B6o0E;XOGDq4mJAaYlw*nfA;o{!0X+V9n+`Q=20nuSDlk0 zdgAwJ=+@w{od%FmxoH4qYj6Ry<_6@487vZ>V-HCY_L4Ek;gHVAHhozyMcV2<0vW}W z{7{x50y!yd{Q&F2azst1q4hSTulr-+Tp`h%A*?MwAJ_+zEJ?ObOB4spn(@)R)X>2& zf=kQ!usm=ppk%N<3>mc_`qq7y4os*fgh3{fE%yV-ALNecQ9724spY3iR-n%;mLmd6 zE873Ja6=*qeEPg1Cyb7X=BtLlGg9Z#Gl5!Z*j^VXfzjv;q(@hx2?D~5Jdw7U_P2|X zXdzX>N67uq%&cTd!^|?#(m5pyv#$2jQbRr?MwiJL*{)@0>KMC94OKA3K#t72B8eGQ zho%5VV9w47VpMu*-A$wNL!A%GiU-iw7fW|M05Jh}mf1p5fbI&HM3Gac!nzy#;7ldzS7-AeZ2l+khNtzzZzBJg{dp zb~=mbyw7Y0_M9bK!fawT={_?Rk|qSC2C5A~wb;**BF6L!W`$oc0wS#Y$YvKE zd17j5OQIOlnsscaN0*DLL$AtD>*~b_1WCz@B5FbwppQe4OMr?AbDH21$qb#P1Oo$h z`Jrt*5Px-YLqh0lp~&%y-E2wy05*1A5Qnk%VHvfhCyH zC=hpY#SvhGb9KOVK)%&Y^RnGaB(p=7)*V4_v-Gn7YcXoCFRC_(RZ!S6b8Cfqwbxbv zIj6A?%91d9Xt1|+Of}XTw3;!B44<0% znWwtB|2&P4+P1NSp^2?K9QLkzeJ!ClT9SHNtqA8<27~p{mMh}O4{Na_#LV9CBRDWv z0#Jih47q~#9>@&J3tPNlQHDPawRfPgO~%%`y0s}74Z!7ym6a4BPiw1+ygEt-x+0)F zb#IHD5sR_Ifd)sVNL0&_vGT}Xc+?%csAYn*+Q^s#o56yZ9IR5MSuC&vo8!1&Bi#ab zqlFVvgjB+%|65pFi}1B2Pjo6A6*5T>N(ltKX>(B|m0NHnM|lj~Jr~#sRwic^FJ1-T`NnK`Sm1G_Iw#v}#|WQK-WlSrb8+AYnEC!}nrHzOofG;mq1M+5E# zF0gem)7`OLLSQ3s1BPWaokAx|WSl1)5O_Z6ba(|#QZlH~GNb{nI{^wDZ8k5vpDICX zWG18F@zH)Vr5-va5qopI{6+-mtjzF^x9ma0=x8jY25H&De=xXL-ukp$GA4EJ?nEl- zQ?{Ut(U?OkHjw~DK_d!wv%y_+E+_VTv|H%tHi!TN=lLhqd)(n^$wIw5XbX}6n z`wVcC!1m9<6ftn4w>5(+5MMNCf!6LiiE4Whw^Y6wQ<}v(+fAE42iREv2fEtS=E3Z# z5uh!P+mj_oiZsVqH6tECPhe|8cAs!~*a#jwEAVkGN;B?DgH?WY8pQ;Rv=0J-zk#a?d`U!O06|i&_pC0~% zs`H#tCai{-F-YNecP#Zgvjn-m4!WXHOEei+>hHL2yn0o89qjDD)2se_dhnP@n|qag zq7K&uG4;zpyE+``=ZwZifMAQ|GqM9DW;}m7&*Dql$%OnMBsqMELWGhrj(%q3(o|;F zm3fVvSr`q@)mGl(=b*|dsgt6oOp6bR~u`cPXan(Y?Gyewo|O!dC`^>(LOeEI&2wo%g8#w=7X*X=dws6C9Z=RM)P&R>XeWcW*}*S9|dBO z#E4vw6hn)0PQ$k*rB~U=N_Ki%gBgJqonHde7}bdbG3X-bM%8BGh!5%`glVkCChN}~g3BW$M}kFK2>ONsVtFvIPh8-j|! zP`X_o->~@7R1I1~_EP)g01;!(lkT_dq{zVuDO3BhOrBuw4xoebW0}oV0S%e1I!G@ zS(<=GAhvWhk}V>&+|*Y)b=L0-?9AW-BY4bAxj;rqE3At~Ky}WW0=SHa2iUo(K{h79 zoT?DC0FAa;NfwZ-@hm`!>^_u$QRi@h3rq?mNydOZGE=G{H&Tn{xCKvROl{R@LvI^( zB**_YItF)xh#kMXDH{M%hCO)$0MF=nR&EvuhTU2bMl1Q!wJQMKqreW=pfU8fHKC=;%8?Wy zW7a2QbPj5(!NIjz>u$oivp7#D1d0NoTZEjF9$;1MK(IMCCG zx#4mA491Rzkwx{-qhlU*CEw$JHpIZDM;^H+`-KBjpLq;>6vPe?U29I&lkB=&7dC0T zkL-zu_B9&G9&wIzIR`R>lTzb(!J|=U9R-`&X&KV;#bWceXp7Ay_biXxa!>Y)!Gw|^ zRzPXZRpL4+;23w5y4e9ilxJLLJ(vJZZMK~=hmp~M@T|Zw#n?zU2c03D=h^@)oM4jt zsnM*VVdlh?mfl95dUI}PN`okEK2kL0v3MjOvN9u+K?D|Fd;ZM@K@!6VE-4WpdRjVS z`e9&)&ImiJgbn!Hp)7H-n8gVs%>dH{es0F7IG{|}g8|!fpqD#of!gVkQq&1hX3_GZ z_3_C-5c<`Ii&6%I$Pr){sa-I;}6YGm*O`nF^QD6H`R=aiQ0s=u4 zTza2}Kqg;X`>lWu)lt7?a43FWI*YMWGq5^yjaX|lW+X^@MFS{LxLd9dEvFY2K>Mgp?OA;_w>u?86cFL0 zl^u|i`zRqxP>`3><7&bkb1pweD>LXk79h=KJ3K9)2o~)&cO%)=1g}F zezt&oXXmE4tL+eryM}%D`&caP0o?<5GC3n&x1^uY*oC}O)4&Ny&lDB0x4RvToOh&) zr$x!r&{le0YierKcvjGr`MhwQN2@c|(vL0gU66c2WH&Pd(};GS(b>6m9(kOx2U$5v z@|0jSjm6$YCkMz`nb*JIW&u`KPe-hr@wz*AM^1+0bSRGYKYlwV;Do^T4dXIFHa6J1 z)5oZS&(qlha)lDCehAo6iE0Y?R>0YuTY#ACrKQ=>*;xRyl>~C^y1g2X{k0@ro$W{? zwvM-s$pDz_i65J#OcG%Bz!;8vLC%YD?so%r2z*0VV~N1-I_u_z2H-X|cn0LCMglSM zk_53Mlgw>~!{KUf$8{>kWIt>;QEu|Y(%7QI@3#!A20N#nd+-LJ&->U1fju>|lm~u` zMVtiAa2v1VIPJr2mhANV{@gxO%YTY*rpumms_z`G6*Nz z@vOfDix06fV0>$B$utX(vNk(w-AuBv%gzxK2aX60xFRL6_ufZ}bZ!6>Cu>P8z_~%E zH<=FdoV||Vfm~{K063R%M}Vz=BS&@=XYTJbm>oS$PO`<-#+Jr*?hJ)Bt`PObM)kSZ8H|g?k<=*@;I^`DUND+wP){p6|2G-|G5*}WiV*^B=KId- z;G@Tf8k-jmEBQtPM31$T_1&(cVlBrp3fd&t$w|wntNq&V-IN5&It_E4@Imd|Kl?!< zfuUTc3zAHObCRvo`Z^&~rld%Ai4Mrxfz*f=J2kV1&iOMk#tIN2lVtAiQla>BXSp(9++bG|?7bP^y}FKW_JBeC3hEjw3ZfkQ=ooGj?Ibj8S#saVB*- z(a3wWYzYE&Mi#gdr2U=EcHfQNhXCmfHXuAzgA3lI-REUKqmoum9Ai$?F!CHEmD0~z zqF9XWl^>uxWn#1olpsOM+>$6(x}0oQrzmhdPl^o4kuac)((nmM5;-1}WlGssZT7om z&`$%t(;*_@Mk^abP-k3?V4{ACM!F=WN2VN=j44B&BSj(rM^iD32B1+VaO%L_i|*Y4 zY*t?&sLqff4*OA7!ZgPku1D6@utwCJ{WyPAO_H%kf$k=8h&W*C==PQYs~c!Wj2#U! zFn*)-F|TRRDm+6Dq3p;2+49V@!K-(?{xPPPoF1to z$x0H=yC}mJp~L3**vIz?8MOj$Qro8;i>#|LTTB(5kG`YF^a7^fmu>C|j@F))CsXdp z2*c0Hi~~%Z-PZrVI2D6HRvrQW5r+0;$An*<4jfMfb~Hxr6qu(0VIU{6XB%fdUt+7GKM$ZQ7d z+*G-q^3AhAkG6UGeKe43wk=Z~@{qi^8g4~a7kh3;^x0=fpYx@Ed05BU<|1?Y@y9GNH9cw6|*ydMtC~bu#Ur zW^%V9`U#e%tuqzfu>F?#-9|w@YT*rZk~0~*#cRn2ktxkSAW3Ed%?xnei<~%b>YUvy zQB0iuZb_Yd#{V~D+^D7_lR5mbj7|2~MWfx0!AN^YIy$^?2|Zp0fzVvE@~A_$*cnVA zMw#g)ypCq2vdiFXhx6E0)LqSNUxhI zVW-W=i}3ha-8{;~vjY#ZReptXbC!%U_7TS<<#h*49XcddFz8&+VQpzLHIvtFG}ukc ztmOZTJf~!aiH*rPc@pR;9nD7=JCGdVDq<116>`I1b5xT@tC-Dp5?2cO>`Zi$Oc?Cc z(=Nq~W}cBGvz~W!9>~};tnKM?az?r*E|O;jW_03+7UVQwICongNlHz~C-}PvCLZYw zR_qcowKa`$hP?y!^;8FkQe+UQgE~86O1M%&)(VWI%!rlfG4Y`wbreh^=ZP%0M8brg z;dU5oO-Jt}hg^{e*c8v~l#?WMUt?_~z?@+B^hF06nQ2~sj#!{Wam0bn8hwA4g(GPp zre)|l%aSOn8U*|Kj6IRW895IgvD0rHxqx+pbT_1PaWqhU>-R^eY8dPASqqQe_aWKy zbYM@gdG;KmUU;{SlVCmuzzWeg767aWXd_QWP{P+&9)h)*5Dlk z!wjP}|BcZa_lfvoG{C0G|7UodwcV@AJHfqqjue^oy9ceoY@nI}^Q?wH6;v~TLW`Kr zXy79tKO?#FmJgG$lhVOuZE*2ZjE(?$gwY2R3`cIyVJA+KNNfEK$gcDqZHkf0VMdOe zm>Iv^1hyK8I~oYO9l-Us@yB|M4gsFj<5}h%0zYagcd)ZD(q&^V&IE^>F~$_5al^!k4%1 zJn&9?;+~W-ewCt^;T`NeM?jwi+M(lXmEnk#nsGM*Cu2AujAFmD9g=3^cRpazg{)2P zn8^slCiA+?NR(!+NuZ1{S-MkuZF%6gv9{}!d*XLgzfH?4N!?6zAmK9F0seNx-8fs1 zXDviP*JZL(3;|+<;j`Pb3|s~}q7~H5vaL6j*f~=voG(jG12zp0Lhxjb*#NQD5r-zc z8>nBrJig*G4d%vKNVex5w1@9RM?K}U<_D?ky?<0-r@?(R`7p`ot`?H2s#>^rZ4^=FlN|z7;uANn-1>IN}N2Cr3Zk`BP^T*Bp+h=GXQ?n zq4@~xH~`i&0DT(!&VYJ`-9wFiKyS}TnG}0}0I747b%*zVRH^Xn>CK)NJe~mTrv#t_ zcabwXLIlFM0P-}L$AMa&#=dX$_}d`x3eTZ?RLY=?o8@$7*!k>srvp9PW)jSU?U;_9 z^Qe?K+IdESZGby%u+M1qd$#NeEItDAvw?m9$ftmLQX9{>7*l{gdPf)rHlFHin8at8 zf231nfja`;X`qjQ{TPtT2$-J+=#L;%GCuZM%zFe-GoTq|EqXG0J-rjFA!)YD@D%G+(%jVtWGl1QAU{d2%u&<<*Zbo86f4@e+txxnf@rS&tmU0L4FkI zvtVzu0H1hQIRnIJ0C_feJe#F6_kc5iO=q3M`0__VKFhGvjLYYO_Y5XJ1jJ{7c^Yep zHW&J!52nA`qtNH$?S3o4*oSLk&tTSPNrW?X?<5;9naK^$U}fVxx$Ap|$u2f@bg3gWkxHK%Fp4+8RMf$}i0&g=*$e&(C#qxaD0ZvpHl zv+I6`Mm!BUmxWOUFGBaUp^pXA9e5eL-vl3cNcl?@AS6vgTG5D@?CMq zTi=Sx2mN33JO2+a9~-FUJu&myl|RHap8Fr(82g7GfB2M~pO3%P.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 0000000000000000000000000000000000000000..fa58c5030e76082c84e38342cf6722c723ad2fd2 GIT binary patch literal 280 zcmV+z0q6dSP)N~-|K;%i-0c73 z@c-iO|KRQa-|hd~QeFE1003M`L_t(|+U&?l5`sVg1i`WZK}Epr|6dhmytLs92=mel z9uoULP6;mwyM%qhIpHzkHQ|(SNO(*5TD8?y@wq9xG<+26t_AN^`$=39HtEMPCOjwP e%l`;(0R{kdKn;SADLBOd00006$Gh9E#3p9{H-P6S}q~camLV^=3&tj%#_Xa_x2_Xl57U&w-9pX85Q9;Im dv4Me^VIeE)+1pK9I)PdkJYD@<);T3K0RYcxInw|D literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..167d71eb721ba9b85c6601f9077d5c39faa4ebd2 GIT binary patch literal 185 zcmeAS@N?(olHy`uVBq!ia0vp^0zhoU!3-pmJXhxdDVB6cUq=RpYd5a=M;HP5k|nMY zCBgY=CFO}lsSJ)O`AMk?p1FzXsX?iUDV2pMQ*D5XI0Jk_Tx)0S05bpo|DSu#^)isf zToU9L{Qp10^;5h+0~ypkT^vIyZY3ooII;39W@>hC5M-JVa^Poyu7TYlo?{mkWE>b9 b7?>Frva+7N-L$0>sD;7P)z4*}Q$iB}D9ShR literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..167d71eb721ba9b85c6601f9077d5c39faa4ebd2 GIT binary patch literal 185 zcmeAS@N?(olHy`uVBq!ia0vp^0zhoU!3-pmJXhxdDVB6cUq=RpYd5a=M;HP5k|nMY zCBgY=CFO}lsSJ)O`AMk?p1FzXsX?iUDV2pMQ*D5XI0Jk_Tx)0S05bpo|DSu#^)isf zToU9L{Qp10^;5h+0~ypkT^vIyZY3ooII;39W@>hC5M-JVa^Poyu7TYlo?{mkWE>b9 b7?>Frva+7N-L$0>sD;7P)z4*}Q$iB}D9ShR literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..b33a93ff2dc2039bd24e4ea3b75ecf4bb3295f84 GIT binary patch literal 185 zcmeAS@N?(olHy`uVBq!ia0vp^0zhoU!3-pmJXhxdDVB6cUq=RpYd5a=M;HP5k|nMY zCBgY=CFO}lsSJ)O`AMk?p1FzXsX?iUDV2pMQ*D5XI0Jk_TpJo1fXx5@|JyBHuocK+ zE(!7r{{Nrh`YB$Zfeh-NE{-7;w~`VPoLG4lGc~(62r^9wIqgTe~DWM4f1sXSq literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..73634d6a22c4377060f49217b63f31b59fe22d51 GIT binary patch literal 3745 zcmd^C`B&0g_x=DPilSwrm^nqWnUq#eWm--*^_u07bqmX(Ow1J2va6=14V2nkPNmhY z>pbKX8aQGaYNeQ>fCJzZNCKiJFLv*Dec%7#eSXEiNvKM52X-1&Ks5Iy%nf@%RFP{l#ybSs9bX znx39!vqywNp;#-n3j!vm-TRDQt5)(2~rzV*2|SO56Nspdahr;-Zd(t^W+rlQGslR&tF(rp5JW>HfmW$*F;XK?Y-}yXP~PH%X`W*Y(S$r)L@{ zjk7{I|6FrR>(CIh;$1b5Hz{3Mz<9sg;aNH-5*-Nb{o31i0M}>f-(2&)zWrl|NG#ra zy0NgNbYC#dIlJ#$lc_OtJno%dgL$k5BoeQ{`qAG_A88ZZm-{BkTPN%HPSkCrS8SPA zQHhLkVaRw*@`G^hMGD1Q^X1_Xi zUWE&unOh&s6s4t^9W0!!NNs+kRa-}&?G2tI5Ei| zejK}{Mo&?kr#D=CT5Y)D+G2eC$+(Xbmo<5KwT;H9JRVQt6kiB|S(BD767-I5-vVVZ|jgA2T5P$4tIU|r9SQK>hzc#TLptZ8*+Ul!`b)`vCQ}P z0hEqYj2dd4I|$89%=kg3dSS=@!j73?$C|KXE!eRn>{tXwxF54ik7$E%T!y8j{|k)1 z|0-1@|HP&M%vr!x0X=~otH+L=#Rh1h+QDc80G$g#S5T;3Wa?uw)rmq)B~!I2)HVv$ zheC~~tkU=w?uOJa`|KOdlFD+4X+PI3BC!G6P_+QDhD?2h9n-)F^)NycjL;1ep@V8y zK=WZ}GYU&vm87H^7YMS6A#6ll6-;i$B>x}S>D=qd$wp5Ca+RKF28J6>O#9~?uCEbR zV!E6O(35W+bJVuow=(JdT9@WsK35qz*;(nCk6+uZQ|S<+Q;)6}hn$$J%lY$8&!Zl@ z7(Tmt<+R~vd;oV$`-DfhRyU>B`O*bq^MFK`f zM(ltBp!K{K%Q6z6g@0X_fX3fhdzw!CmKLGbeF3%ABbcSd4pb%PK)Q>ZN{m}iq*MU^ zxM?i~QzQK`7hUfbcN2hX2X0+juvm9nzPUMehR{OVa~68Q+1dHYo9+Y+O|)|Dc}zQM z%?(Bh3L3O0aDZ|nb4_$W&HKjTa_oHlO*1owj#<-i1-5@QzU0XFXM$kx3Cwg~^QP+9 zsOF!yv`D<#r^S9*`r=^+t*e)PKRMlg8alGe(0N-*3xH`jFbF4CDaePf-Lq$+ z_JWWJIAyF4s2>SbA<4EwIu+}0fd}D+BZ4k?f;_pHW%lXAcRWpjqXqXN?Y(dPcturr z8NGFTUYUPOY=32Sj;IN7?DQ+tKi)d|L}Z03^qwkv_FhMxWFvnDIn&tKSOpYwko}qb zxly;Wv{c{|$?2@E@u0sxwj=v&(D_$direR70z3VZANNd)Mx9HNDE8s|BH}l!AZrzd zQUalNCI^9DPg8GXDc;zn0{j8P(m;pYA%|$-PLFdbqP(Y2UU?AkI=Cj&yaJeTo5){2 zR}3k2c`yZ7sE~6te`R8pu+cC|F98?2En&wL%eLaM4+wu87Vo8qZ}}TsS`5BHT4nf= z0I(h=RP0)Bs!&=2l$ZO01e>p~WMKBWwdQk&*kDOd6)j3&?E7wsexnPlXU(O# zuljo1$*Bf4%F4=Zs(G77cyISv`6j5_hOg1kXw|5*Q_2cB!KH^O)fs88-5!20+s+A@ zt{=%a$}-0wlF2Srgt%-)iaGVVqRQvzwCDM7=d@ah>um|??C3nHmk}~l3Q6~;yOg(Tj}AGmP=BBZ6WFh3T>G>E_~0 zV=q;isVW)_KE+Y|5G3X?ue7353?5Jrb^K0XiJBt6gpfE1@hUtOKwlmL<#>et)jQMs zP9@s1sBK_iAkh1R_KwibXvVJJ`nAKzZNyYH-7 zhi$cO?>yczO?*90W))nk{q3pyW{0gCBL)WtA78*;DwF!O-=PU&ilrH~1OnlMf_K_@ zglJW`k*`nnNv?f(?QnKt!5LL{eekGbsROFm4>=Y1>vh^3t|_UmsHlj}RV&8f^y*%9 zeHoZIJ*7mCQu~?DuOj30)8c>lZSJ?4yU}K5is{N9i-OgZTs)lHW`>_HP0aa}n%6Yk zV6-vELYl1nb1J`y_TjCf)Bb@kbu>^|?YQ~eSEtlWr-L6L)BBdFN}-~~G|TOyFNRHu zii+S1UXuoR-?YKhD?gW4o%G??1oq*?i@(#X&(~#USBn-1ZB>ia1_jX(FY3A7@_uze zq%Q1mkV_LPTJS>Sp|wcxd-Z<5;Xk~~eP9N4qO@_{I&G6J(jvu2Hh#;nHCmD>tRw}o zDU{ymFf`QE6xcH3v|B*CS6+VY+K4!AXqTeok*2z8rG)wNbXu&Bnrfj9yimX_JXWiG z&19R>QY{kL|IM>pAHTC+hN6)Vc;Rkpv-< z^ob-bB1w@*QX`UJM3Nqnq(dZuh$IA&w3bLxCX%4UC79}psI0)>Vr)X+i2aoEI6>}f z8^&VE1|{8&lI}rWHb$+BLlCd(5wAjsS3$(9P$Frys+uj-aX-Q_PQfuw$#EI_|21-* z5TBMFPQ(JPC&`gyA}9;2nEFqdMPkPuV#mOk5qYfyp&ut?@Dno(k}@Bb;(yn( zzhaY<@5iXhwGuOnwIR+>4o308=v)P}oP$xe0GbIw^A*sKuVr*lSl2nKn23$2%Wxt_ zwFx6;%MbAaTB4Z5%z!Wz5KM0b^9_QzfMB|+F>}n%$G&w-RGl`sHbqp235x$P&5;k)YU@q zX~|W0i~~FFP(c5lWc2I#uITH5^p)tlV8!RdP9>4uKJAn2xd_I#4K1pNO?5X7eS$$g zh- z3`S&i*Iv?T3X*;?B0=v2-|IE^hO&gQTJLW{5jDf@y-#Ph^7@Q^F70D{FSTsU*EW4i=9hj%JltBYw_d$-48>? zj67G@+QG#0!q)P?`BuOGf9?&FMG;WsvPY65^mUaonrGoX-b8F za^G3nBtU5zoGYm>j(H>Y1+6GqIoRSXPk7}IEELd7aSKMHpI@$Yce!a3;6(Pgqj8z0 zFYS5p_vVr3*$;S`>A$)NBjbd!Bwi14|EVS+`9BbFad1CWY>!R+4|+`f{{R30 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..fff2c3471308fed4c93ef4961ea1cd729b41bdca GIT binary patch literal 118162 zcmeHw2|yG_)^PRAa0+;!CWb_jV8ja;4!IPfAjk@dK}|H9F9`x7%3(M}-9+PVqMs)J zy2>uQ@yNy_my%?KjYd|Jc;wQ2L|F}Kj|doG02Kxph8dg{HZ@|`(%9%2yxr$ESZ2{>JlC6e=~WyQWT!y^^rC^Uq}bv&t`GlBilw4hZh zqGOiFr8_Q;i%&?N?o{)iFPt0`Vy8Pj;~nW9xgt1jX~OI^sd4kxJTX6J&GHz(Sf`*s z>uIa}S0$}Tic61nT$PlVoaVo3x>Iy)%HlYGa1*qflOqk1zI?jV4C3LqFmkSAa7t>N zqnE34N{qYbR7bC=t{y&9eLUPJJ4U7?JBG$Bc2xQ~dbqp$IC^;aD?R?r!ZVL&Rx-^bbyri%yRVfjbb&<2wcZmCE@_D3yo5m(LV;AAfiEX(YNdWJk_4 zjmVVPge9xHq~Yc7=?=`1rXdO0ISr_a*y!|VgHn-(?UW8JPfF_il$69kzB=bFO-WBl zTbi=MF?gP*V`OwpLNb9Rg%W}bDNS=DOqMX6)+pguCwy;}5gXH97b`MS6KR#l#<;~L z#wEoir>8-ED0S;2HpYKRN@`McdSLX56^RKk(WJ`VRwl;^6}dtz$uzf)pnXksdnWC~ z>j+Z2cUN(0_wo-;NlZzFx{eFQ)b5m26BqYWKrbUI#bPS&rJXPs8 zb?OukSEV!=Nw{v)nVpc9o|3w{t2}#q@Ur;WqpSP^LLnc=v=yld>2aUR8 z#e&z20BJ*jw(aAu6dFR;h-tBoY0)dYiKip{y~L9iP9(mss})*sWMubMD)tRYNxI@l zqxgp>r=>?H$Haw)1ZHF;#QKL!_4HGQczb(!P4x>2Q7UJ62D{Ht`b-U(8al&oW+>lT zL`F*E^>ta&6P9%Jr#jL}e7XuI!TLX$ngFeiHmN`mr!F{&C{e$KQE_Q0i5a8`213sd ze{M?h6rxJKJ4apAb5yB!=cpYq7bGX72YLv(bwYQJ^#l}aWn4%?d|VpD@t!)_!`laL zU%34ydrbA1?BU}DH{g7|CVP9j!>t52;C($Od-zSA?CGwY?5XsH+i$YB2i%?>fP-{= z+~J0>J_Pm#f4DupJUs$t`hl?eLOuB?J@}^w#qdv0zNC$aBczF7er!RzrC&|kbWQ9CQE}kGm zh>j1KcEwyG>o4&xP3eb-Up-&o*)L4&F&dWZ08N!#TTl=S}_=VB_HP(q&?oQ5-NTut~a1>@tc2Mg=xWmx*0Qaloj+ zCh0P<%P0;Q71$(QCUzOc0iyz&q|3xEqc~txV3Ty2*ku$4j0$X$E)%14aclNtcOTMsdKXz$WQ3vCAk97!|lj>9X!v>=~B~D?Bq{DJNMA zDz74IK_46f-bsm$E8|kh5{~Iku(Hv~F)ld<)*&XxPj^}{KXi&OUHmyV5g+3%!~*Rc66HJ<~9RX*u}ZIh0G6eoEs57Z@wd09qBgf2`5MCLQS#`FODvt zgn(&ousm%=Tx$C22uN%SL~xBwkA)SL)A-bN$N_9@LQHy~wbiucajOGi4W=uf7_2x; zPIsLf9Um7;*ZR56jhvm5ny@AX7AGabI-hB7Bs@eDqIVxZJ%Ox*b&VmbH&ar@I9Air z(jobHNp{Op7V}}Jxe0#ORy`&O>*11Sq^3r%?npG6fIt#N6p7N4M(@QUi2%`wu%-&u zLJ$W@w?~R#{aJckXkv7HJ4Fy4m>3ryml_C5a6~61&`qRpnwv;Atd=yiCM1i*#LU`@ z+-*Jn8tS2&LJ^LOY=ad^qVry=ig_{7i6F}NPc?KZP+g~D6s)~A?vW;uma%v~KhCa*hH?LegybbDFNmXQccb*&$hmVv z=8~|%u=xFn=%hHY`;v^D#*8C|4(L6OpIt|Et7+ocNLVh8n8Zy=)k7&r5aBZ-A}&2W z4!%4(zAD7{oxgR2F|xa1ykivVG>%)f589Ap`$#Uq3Y5-INQsZ89RKxlTTdAzyiSgu zl6ViWyK}|reC^GMU6zrS9v4fHQE@TpzedTwy#kVolC&p)=y>k#3Nqa>viE}a@$~90 zw71Vx9kiq^-2LWeAbX(uyUzuna|!iGz!asgPUQ)Lp$F~b)4c@v>7ws32>@1v!>|ay zVt>`Wa97dpsbIf`uDOH$1`pnu)n z^NJO*_iq=iuW*uXdci!$d*KI5=V3S!OmDSVF z$Mn@JB)>R?IGyvP<1`tw`QNsZwA+7k^^`|fTE$<4ok{H}6)B}+{H}zGbL5>V6$yon z)5yGjpf%ME+#tFEGz86tCj*!8rh7;}M*ZyQlRko8MTo|_NkLni`Ki&#X)B^rL5;AQ z`Y1+FpV9ENMe|WAiblyO4XuE8DvASl3|cLuQA0yQ>KIcOLa_{=hBt+W!V~tu?Be?f z^@UwA`E(Sv?eJ(y^(b9fUQb~w`hdC;&A5tn=hJa}#pP~63o z;D|(|q6Cx9 z4IoA*A2aF)=wWbMP#`=+lD0*BYD&fm9h5mJwqUE)xa5o^h+{Kr9!VY45r6~OHaa6c zB@A|5Oa=W;EFjQ)=)Z)()_h=sAwJtZ6);^TBM z=Fy4i^P}T+aCR|q5HD_3dU)FG`H>NeVLMWiprwe`32e1AC3Ve=#DsW}Q-k@!gIXi)&-Zw0Ll1U)(?ZAIj~P*O(-wg`13dxi2T(I>FE@khS) z{ySy%Tt`QVpCQhnF)LDm%gkH|>=_GN?}Ga^a3^M_uON6r_3*{ZiCadR-0)N&5Zn(E zcRcT&OvCW*$B8>ODH#M@Mrd9Un-ojjr@;NcD>I1T%Ok+OVP!&GCb-Xo+c_~KDFNK1 zhaH|27Y&V3L3rkz9v8C|-0tAENu3`R4DM+lRW|Vw_hN}V9V8IKqTrMjt7)A$y2MO? zy^H;P9cRa7k~zgGb74>A=+s!)@i=KkbTW)+e3?lsG_1=$tQ5^Zdi0cp>&Z##miMoJ ziq;u3^7{^4N6Zdf${y&KVKkHfr31J4Erbrg4t4<-J8;hLAT;0RcZ|tM zUC9Sgke3;V!Pr4#UaHh#eWqgidqF{W^4Aa*(5W6vv9M8X7Og3W*f}1 z&E7Nn)a)y>3ua|zjppX&BhAN~`DKeDmszj3{)hF))?Zm)wyqyEXpqw& zzd=t8N*MI&pnnYd*Pw3)l?-aO8D=xlCfMdVn+%&j+q`e{r44ISZ)+r`?gv)f^J$ga@t=3uMA;|9+d{QTfGgR=+c4gO*9^&wV6 z9vc!oBznl&Av=Z~8B#PvGt_>la_EyolZL)IbpO!rhN^~H40~+YtYNXkUK_S|*vVnn z?B({4+6UXm*#F6XpZ!<%Wy8&fj~^aBeA)0fhJQ4?V0i6_VI#aoJUwF7h#e!2jVK-| zANknG@R5llw~Wjk`Qylz2OfD~#shH=YCU>Y?in!yN(~VjMO*zFUbR5^}toZ*=0 z_z%ZZjHM#^~VJ@eSc#|}TH8vo$<@bPQL9~ghx#nvUr#M zxQ=vhFd)j)2 zdam>Q%v0?($t%w5ZLgoa?Y$$tH+rA&)=u@AnmYC4sg*v?J}>(0^eOTk?mO4_P2X?* z%=~8ht@AtT*X%#lKixmqzb0Tx!193o0jg=^r^QX%H|^SVr|HqtcTX=4bPRkk@SVWo zps_*GL3@HqAAj`m*vH>{ykf?L8Ovtm%(ywzeP-&+PiNi=_78p~_{$J^NLa|`kb+sm zW-XYteb&#RPNDIk2SRJZyuh%Zom~|ENO(;6hvBuq^ZDH?zdJR@X3o4h z+vk){*LvpMLheXEnc{_4~j5zU(>g=Qcd|CL^7730?E<9~6Ix`NN5q$G*J&<&sxsys~>Ovv%>?6YCyb_u9I$SHoWYV7>MF zo;o{F0eRl51?~a_v56J)Y zKd%3I|LEAGJC2Pww&io{&tLl-f3fBZ&6g{_yna0X__Y%+oVavy;mPx-o;p?V)ts-s z{W|pPli$qv=8JEqe|z*h|L=~R_C0<0%+xc7zW4tA)Bp4SzfTLM799G)=ZDYE`kl=` zH|^Z#g+YbK{~Pk(ug`~{KXc)U3+H}Z@Z(QK&lMH_6#J8kO=Q&2mYmHILVPU%RljOr5I6b#K;>s(-)1tKo!ZuIA^)q{h}; zo0~>8ebDUN{7uUDph32FwnOaf zh77l}vl~txcEkB7Lk&p)e~E@#LUH7B#tF%WGV-Aez5+7>3_isK0hMO(sRDmMF!_^1 z;S^@(7M51lgJ7ae*ONgqx#&3rF$zX5Q^?FL%q`92HlE-)RIV61Oldabsc3trm)3ij z58t}`;LJyzM?@W8?CF*I$8*6J>H~!fO5^JC zUOV~UjBE9wZyqxM1PTf!mg ze>J1hQ=Nh;pVWNuhx(|eG(mr@DZiz)c%|(XwEB2g*V2%95)pG5VyD?h-id)4Of7v!|ZQ#U` z+Uh6qSRJK8?0X5}h=S2PmQZw3++p~Z|tyL%bq zB7}hsfl<1F=1F@a9Mk+}QdK8vi|UPTDzVug2)C($5s-iSZ^E0vB) z;oJ~tr0*~tw7ny1Pv7Mox#;Gn@E|{P27V5}n}Hb;NjaF&9pzvila@oqh-omcvW~PN z3Hk@U9_0gllfHEDI|R?zBt<7Dghz!&5pRN@ksLxM3X9<$LIS`If5L<%p$N?gohO|~ zLZM(T(Czf17z?873OQGJV^K;@*~d?q1*<{ zi7{csSp#ktq#zmr$14Qy@;nLcl0?#Qd6A@@49f#B2r2xj$OHad$b7mXw?#zs>bO)# zB}peSBbm@f}5Du9~5K8)hLmsrm`Z(m#D~ITp#ogf0 zM_=V2gE6qbOVLvv3dp~2TB!bV^kp8s(|V`nF(kerVS1v}T&LCv)Klo&^Se8F^iJEI zmd%j(hJ@*zQa%LXn{hQ_d<@+dZwO_^$1t9%+lyfd-%6x~8&(G-T<UK9oLsZy!Ifx!+Ab-_5+F^`VBEtp)SAHe7>h5C`gV zSYQDvbZMBL-FKb>0;Mem#XN^EBQ5B`$(z6g-*eu)@14fyOU##^=LBCSL-OXs+<6ME zP}*YD2IYp<2C63x-b8oA;j2(LKSK-TfHOpyblD)D^hJ8DKtTy8Dk0Zas>dovGH^Fj zcLf+Lpj((hFbon$ncipDp^8t~aQ5~bk^_o<5pw7AY6S+i0bOlaOW#_6TL9*O@+SI5 zKyd}QG2kk|PfOpe@YVt>#^+PxOULKZGbM)lV#u)+s7oOMP*#>b4eI+_iRtMt!4W*-}a9W^|aJ3OWbr5O*uJF$~tU~&3X*fP6pGr^p z819FG4<$fFGw|USaHR9i`|zQ9eriFmuNu^h44|&pVYv5?f_@EQXgTkfav1Ot*022T zosYk*8tI)M0~_MERU4=kMv!a5$Rds}%`kdvpRehxbed?4BR6s1SzG8XHpzo1h{W=ON`ENzJ$vjgQfxC?+mx?)u!u$1t9%+lxVJrSFX!hCmIII<|#NZ0n?r-)Zaa z;4hI_k_+iSNDd?)-aQE19pUc8MN%3B7fGAEtzpSKxyaIYD=5vKq%Fp^p`{?)A{Qyq zuy(gipX4B;JqW1@{^ENRVtPW#)OR%^mdNxralpg@69?{X4p`CNkMxM-%ZK#3~&Vfma!%5W%j25ybPOBDFHf5*kZVTX0HIn7uh2A zJbRY?p8bwJ#eU9y#^$j(?7IVY8CD7sim!)e_7>EGhOL8|sHJsL%~r7$Y&q1(HCocE zP|`~Sa2Zq*gsYCLF*;racb(+jjG2QP4l|mA&4N!0wmg{hx&~`rPdeDrfdlaM>u_sC zTr)NYTpD1+m`zx5JuNBidXo^VYY0fYOFDqtCFHkDOuGfkG`oN-@)U8MD5vFVZ!HG# zKwoHtHOI?=W)0jGl6M=%No@kId$;U3#?7$An8cI1(eduX>*71*N2$<9qp^5>W$Kit zP-ZFZQg>ILbRVD3%~%@sh1VymjYLdu0keq!-@=DV*h;Xw2i@}?*d{q$rzCdYNeLQds%tvp=U!o%to0lp;*M#>~c%!6C$6*g4ObVk`X3kwF3r)EtvkRU-g( zZSrNvNmVQGqfX$5THuFT;76UnkJ?-Ev#@bmoxl&Zz>hkCA9Vsh)B->1YUE3h)8$%$ zAL{E&_{EyL!w!rU`(SL@Rg5k0>)9o^B>VLe%k+SVvP> zXG{tRU4&+F339&-wk=oao4^DwrB$CBt%LaMApSatzYgNVo4^FGFOC$?mzXa-&k3F@ z(l9-{Aq6NgqyVLd6o3;vS9*>m^=*aH7Gvn(;7QE5ICz5t-dCY+euhmtIN%IHT{fsp zkls3)9z4-HNDtn49i*}j(pyK<15QDDz$+;oQa9LhRhM8J482xMb#+x$3s`!UV>2G) zsuYz3QGqQgz`LqhQ^i%vz<{a(QnjLRWu;10UIrkpl4DI}rB=lQOtYpK^644^q~RyAu>Dy~9SUeXNtiXd0clr+QleF+DC+Hz1i0})82DM6|V z3^bRN=q-`7bcVR$2UT;Mww`Hg{sl_GG}m)Yid*%X#^y3?hMVh~nr?9oSi>|@@&MGd za-b0B8WGT^Xl-oNv}!SG0Jxz7%j;WtZ*3#f)L4Pd0ft{4x7r$U6Yq=L8WoymP1AWO zj;5v247?i&fE%?b9L4E^HtSQ8beCodl*Pv1ME?2V7$g$y;*BjRb{368fMh3+A1yB0sMlw zD!CeCwYK~hECWvb(TLhtOi?wE)hU33!djfb|hq*N|zRZm!NQN6N7+KH?nm zl;=LY&&|!n@kj->#I7NcZf>XXY0iyt83%~hJfHJ~BT1v8v~G;!S{0TBc!qFpvb49; z0O2wP5YGOdfPg4~a2-Vu&rRbIZEnaOU`G)qF$f|cDw1=vgcxqFE-qt88fycd<6LPP zE{uJq3g{RY65!%O=x||1*;f!sM>)Ejujj^}?s2rHc ztewKyGgC7AP&j_k7NM&pK+UDH=4N$uQ9&uT`lXC(ZdBJ-6%|~=Rz=Ottpun%1wvD# z<{A|MlmlQ@RIgUIv{YA?e+0nQqUvh3y0ZKf#IeK$MU`rG`Kf=GLLtlwE~?cRKcXL2 zto9=Mx8T~%yIRW$Z1%(MqKmt!ms$Bor%vtufeO;@t9>FMAVMnPs-P1|{8UmYOqpF3 zCd@9d=hz?EGwe4oW%k7YT!xl&Cd*$l*ct5O^a^5w*y(Hl>j#$)>j{@T>&i}IUD(G4 z;4-uv(r{z~mQ4MLld$~sADM`)WpA+6P;=!2a7iibAGcU;e(G7A^z0~eDM;rfn9RMi z%P`vWLFP|^^q+xNaE`qId0vE;aTQufDNMSSQT~&*BetWv{Wh!=9igO?`nQD1WFkuy zP?lmS*+5+#6!z$9g+aKi494j;Y}Qm(TU*vdMqo45ja%@&MMhwYhB6J--Y9D*BS6K? zTNvL^!8aL)t<U0HwQ25#YQFr`)SS%X{3 zYQf!di@PDKxZI=yjH;4gYHt!uaXAcLKmvC|ezU2eLR-RIP*-9`RjGxqK8)K+nBpHR zF)D2>VH(t}CFp!5mX#M5YcIE6z~>S1GHso7Z|lf@z0~nmM<(k+Lu!!cRcC8ClXYQt zyz8)L>&!2cbzx_Ib@0k$U1*GzmGQQM#>colTR{@5b1mzKN$CEyE*uQD8|32c{`$+h zkfd)%tqX}oV_#br5(^ZQb)kMKGWnP|VB&y@1HUc~bZ1>?597#Sz1D@qs;w5R3#(v4 zr4+37el6C8#J=!qyLBO%EG=M9vtO~t+5fPgvY)UY4A|AVSyK-apEpI)qi2}V*I zDmpEE4eEq1=|D^m8B`K|7F#CkLKYNUChJ0dR+4(G2|HV2_OWGT_cnGW>q2T7*~R`( z*RHa&`QUHNy08LFb1HhaE<7i(E~J)DdaVmsV5xV4SQlnueD=hNW5>>7oC#KbJjfkW z93}{`F5Cy+$5dyIaffAR@jhx@Na4eWb8~l68^U99eCF_BE*EX%K}L0k%f$y!CIt`6 zE}qHd4lw&DC_kKg<_vcL?<2nESe2_fbKn5CPqs5t1(}N=x0A^PV?vb4fuD9K-iCk@ zbU>4dwowzq%)T)#BWwT@!=o>0qnMYDQWL|YQCzfQK~$L6QDS0vG%7lJ0hfWp7_Xy1 z9s$EHfYsa<&I=s{6T@}OmW5pagSiZVGeFxOwT}1JdNIykU}6X`#$PRH18@WcC*T^b zmm=(|EzXu;DHyh_)yr%P#%o3ZguS%RC4e9MSI%K$#gjbNf7 zZ^f2DgDfF$1|QXqz+nn!0#ZA}qb-9NOCTHU439o-ZE0!!G!&_Gt=}FDc80~;0;aH- z+8Gv@6@B?-etsdCj1?AXztrZVLa;OZQeKF0AxOb?FfIgdAiXd*cQXLRg@wSgLhgOE zfm#}Zi`f8CfN{K&S{lAD+rFWYS{iN#Uuqz>oq1X6pq7T4MV#p1UPch;_R6Ij3rz4f z26Gdc;EmMMFyF^#(Nn>JJ`*RiO~i!&g)bd2ctz?plrk54S-Ni0z-?5k->m~D1h*BAc(b3@rbrSWCyUb z2$L8D5gfCW3$%n7fj&y5Gf87z@LJA?rlDl)(ut+vq(#9>C80yfIM@+O!+Zy4rE+h< zUZv8(?jUKf*7=hhoF^$KIosJCq?U&3CUJJmr1U-%j{epO%qGD}v&-3K zaK*E6Yz!OCzQFz-uBX{3_6atE4I6;V&~iw_i57RiWlO^r$?|Hl(49<0U!yj0cRCp@ z<+OhHPayMGU^1E56_!(r!b+fmw2zy#t?;czY(sbdt)KGleRM4i#SH|A)hgLQ;L3nq z-Ba5I3zmj?OPA(ROT(h2+q0KaTYs}{Z=A|a-$pGBzg?P(Yc?(YmRcIF-Es=!P3iDy z29}0->3eel+O#x}S{hcRbKA`!=%&@tU|0y2h99inyJ-`y;5ISQTgiA>v2^JOP z;x@_FMivoE!)>dx!FT%>f?2c@1}`9i+a%vo^zB-1jVx1{2d0MGR%_SFc7mzl8fMWn zfTPpF^=%$J(k;Q*aOI*!+Q?QVwnX4*GBz~AbmP~hY#V55c{3N2v7sUL!1JoJ@tn!n zushy$7|?a**RRjmkl!k?|F%o);FZbP&=?~<<4p&Rk6|)4?5=fp;G|m_-Y>?6#3a+S zm0?F6n_MOim^fhKK!0#Rzp!|cD<0|RzRY3$^2UZ_GefeXnQUgr zmvkWJhGp+E_x-k&;dOCOzTehXhS%?}tqiNftMzYX2s;}( zsd_dxENnM6Y*bK#A9W*dH>j@Tw>E6w%CJ^`g=}TmVQhFQ{8IZ?hN5LpnP7A{fX0T^ z`nNKq{OG~huuy7jDDb0B;0J7FNOo2$Y2V6_8XI1zl^7ddYTwGRf7t=XhVOQ4Wmt+! zJ8xxJ3R@YL>TG2wVx(Ic3K9ExE5lP<4mwGU4G*7$ZQ4$PS{k2(-NsIWd0|cs&{>lM zrWHA`KG>lI2Y3U!mZr8_PYdSD7tk%DQA;_1c!5M5~*hqHwyVlqU?JvAR z5I5Msuq3<$HZX)|`v!*kObiFO)pciLr~(s1)$N!VHd>Hw2>!3tx3@eqXnD}|#I8t9 zx+1455);Eq?Hd^OZ_AU)m&wG?WMU|l2dNuO484hop##R-y}f;Wwqxu7W^_Er`6zq| z0!$32gSXG22p`T@wjEC=%4I7G`}+F(2T>zJA32Wj_2vB0OdezoMR5K&069?5SN2MT zKNrAEr=Z-|KO%w)z|)DZIX>inC?X($n=T7-I0TuCAQ!|q90I#K2M+wSL3kztN>G5t z0nMZ)h7NsWQ%2Z9Obj!%VN9lAVi?9fuUHT!niz&X|Gd=15WpTy48uB^7y>LcF(ja9 zV#w&27y=|QF?55%W_Dv@_`G0Z$mp6FG94y{j9_B;%pist^h{rx7`~~U#w>i3nix(q zn>%5`xN!@?R&3#1?F8*Ov=B@TC&(9KypS7>Mu1fzc!P=I!qKDc0C;oZLNGC0$T=W$ zYGMd3#vG!6i6QT#CWa2O5#|f2iQx$FrIukM7;CA6ni$%NIMKmbBM2mw?AvvNiQ(}b z+*W4CacW{%v~y?Pp`4tZTeFIYiDA*!ysvXE;Y&F=S?i04NyW~*lQ}t+xRT3ZvNn>f z@pDddIkG%3uFPT9=YT=Qj+{I|6r3vnMAmW@X13;Pb7T+$;GN4Lz}C};AOIlRa?l)r z*NZTTKoC3f;d25kEh=+%W@TkU60)2fr@5UpjVxwP7O^ngn71P0Py;>J7UzWKsYh&h|Ij5+FVa{@H4zoO~4=oH=YF$tUu`rB`{NPZi zw@UytN(KMelB3w^I`1;)vyLZ9hndl$t+EhaBEQ4sN+~ zdspLVx?e(zv-+)YKoOZw7WqnMk;xvB19ch5U$8LTs8DRA7KWcIye2C?r+XRB9Q*15 zyP4F&aF1dEE_G1sp%#V@On4Q(`Rw4!3@i*c+662C$U(7@S{Ponyn@EYsjaQaowLH2;+b7EmQbNFQN^_oC1GFKS9fCSD#KH>8{ z4{*a|4$MZdD4aQ5`+zJ6EDVP+GDm=Ihk|R*MtBTmz{1c~CetdK83bNnUntr+NZ+Eh zL|^HB46*GnBur2A7!u!*Fu#gC`trDJ*3hHIdkKf=2Kv2^r$V@1QtO#2Q(kb`0D{)r zofcI%5U$TGXFGZZ{!mdny7?D*+DLkjp4v_Ces?zybD*8rEZM^~R8j^)Menrs6r!UX z#6=D#<~Pu>mF99E?S|WXb2lsmOvD~XaKsjf_3`eWH^~WJwbZkQKfjBdNr#Tt3Wrkh zkXnHFfNK8at{NIp*Go4VpW-e)jhpnuF5az&8cM5S<4=5rOgPhuB zP%+4PT?R6yBSmsf7oXL@m6y-C7OHmFE{#}yW^gbYl$tTkmQb zO-!SSX*7`zop*6Gu`!J%oj4%v=?D6U$$c}mW$c)tFMR)vCD#q=gvqz;eelbKnBV=j zewkdSho1jNewj!M+s9)G%yYq?@67PXxzXwAqB}G)Z8^AY;KWKY6Gr|#OsnNP4J_UN zurOhb=YVOoyx}}Et(G^ISLDEvU;k=(8)Qu{8#r#nx*vKX(`tDlSK^Na!(~j==JIbt z;u#;qc&ctMM*kko!yjwY-$(PGSQhOxXd&1D$EG1FWI;gUE~8^SR@jPWxQ#>X(8s@sdvzjGO;V}^T^D$`s> zZyYlDn>b+NfQbWr%Yp9ZGE9cX-Sb%dvLJ8MTt@diGGTwa95Bsg7+&|LxeQ}@b$`rd zm`*V;yxzr-;h@xo<}&n42(ic@H?jG+8+I9{Qw;Rig~`Xn z0TTyI9Ox?!=%33lEpzM4WAV#^yiIc%ow;Lzf9o7DN4nqlQs_?ir4f0nKaal3foOH5 zluO-rBM$}SFP8Ss-ulbYmwEI~4{R(r+3sefqDvkdwzE(kKSp!)3O;7 z-;gl9Q_6=Rd^4^_jE~V#_rzrgWyZ%ao~ql6(LZw;WVbYHp(c2`cnUA$3 zZ%Cc=9)_f)5Yp$<6;l`Ay{FMz2r*q<2@$cq#Wu{Jq}GwXn6~&fEDcjA69-HjFmd31 z;egotN#9~0*;i#WWVACROi%O}65o(8zkxj3H@y+}J`~mC18a&u7bUg^|vcyd|*?zB!roy<5%E# zqNMKL9FMQzWL4o+`cK*{hXd=%dp>FNZ2L)@8sQ{KP5Vik#Spz%Jl?LhMt+%`v{@r$ zeO-1j{9^k_n-v0~*M#>~c%vlPH5&>-3S&(1yM{HGA!?3Es?vYbCgn#DCvBdUp0p|O zqfX!loU}>#(SFiqjeH4mx?C&pLw%hIzu11#X8*DS&c@u=anfc9F6n&IW(k~NS)y~& zrihWAv?)aF=aV)+;*wD|Ical!Hpy^39NLtPO1O7r71`Nvwq|lk+q+CjGI3#W)lrv- zlZK=T)bR;ml+CBwRaEX2W3Z^fnVVJm&)ft_lQg~V&)h79=2c1`4Y&Aa)1V<|ZkA{? zCFIOaLGa+r&EoK4ICB%8?PqQZQg`LL(BAr2;0$I;cV}*v!7mPRx1ZX^J1)Hb08IBTJ?=>~YUaZSuENLa3EBI%%J@P&L80G@|@ z84L)lfk5YhEZD=dxrI2%DOncH)m7)uS5-r4r1gCJZb)4N>``mzNt^X%tyNW(m1;OM zQQfMo(pDlhoU~abS7WT!mc!AS;0a`_%gcWOK%-Uzv(%gl7147x!Nn9o1mGC&q~~m^ zWaUL_dd_A!_|o$c%bD+`4tmb!FCtEKaNi>cbo(XihzaLxz7_z-n+Ci_&)GcU>KZc5 z)6Lb{0c|Paq<`xnarFCN* z*TS)40iGe8n=I|^G(fma0fe)^CmGOgEFp%Q ztBcDRlE&JA=QvlIh6`h#NeY@TTX!DmcuDMZNUsY59 zCukNmH@6a?@)QV7k(z5%08kEqRZ+cK-O^HBS^g0KSBt8v)#}RfQxL}z7Zg>h)#a!D zO%K{ExTscN{D>T>syS?pBse zJ@cg|hl`43CI>=Zg2~)Fy9}c}A7uU%NdFmV1?S)Z*CLokz6|*n!?Bdt*fPp}(ssml zbhqDzm7*h*bW;BoNE4Y%CVZ`cvJ^wf2I}gdut%5an6xhJfuD({W71$&P&^{ebW9pd ziRzsD)p_&%ZcYyC=6o@TWjZEJdInrqcORSz*Z#FG?U>0hPX@f}px-0sA72?jUF%Qn z6n5!(bbNSiE3btVwXNjiv4B0ze#IVV{{!cof5Lt+U{}x7OMP{ zQW$$hm1h@ysDd1Fsu8K{tWIsj^52rSwE|QX6+LTP&q=hcRO6x6r){m}wXLIDSG1jBDmD`r23Iq6i8yIUnm{w307m=yRP~Qzx9elD zVzFm!D@dB8>2ki4F?t%B6GYg_wQ;0$I;ciPqp(6(0es%`Dc z4A8cc1_=M9`n9d3Qvz+Pzz!X4YyYxDDqkjTt4Z4`l?SOCw5=zIwlx#uvnNg*J9ZZ1 zOwfArAa_i0m>@vgx(~dMsm>hZ4$IEseN@{@;lqb>b9Yjm>M=P!bNDcqi?;C~qdLRo z;sYp?f`?@n&*X9kn0*wKAI?2x(m4p6xseMuX|ymXYRT#rU^(TW98VO~dx%Jpbebo2r) z1BWqQM}a&7hFt(H;ug*e9R-!^x@F74E`S0t1Kx?o$>*_Va6$<+jr~ns0+VU+U1}y{l zC^v$MhP)M91`V==ycv8{I|7F(oC!$vu18x2F_u6!=v|LKZEb03{WKIwTI09x24z>V zwty)trh3-`v!XA*%+D_b6%sOELEh!Y*$%LoG9e%U%= zg64H&FgKA2-bgjC`9402o(c~1nW)Ssn%De^i&BCQ-~)kyO6Po{dG%SeG%&CL7jS`$ zauOgm2Coec3|tfwqYY%7*QqcLMvJ&W*@nFv0HK@&TGNS5`TF!^2p=9jRiRN|EqF|+x(4k};?1<(y-@#d_ z+*`0$sdTVANHwqdlN_8UDJMDG*&U>s*L9OPJ7!XPABsnTHV=JAG_PNtu2!8tk#`U@ zuLY;Is^aqnU*;VGm1IMPwvq5a~&U3{I0CEAa$}2d3zM|qpe(nYUzRNpt;=+ae z+-!(ri4W%GU$~H)okcaT2lrmMuy+I1w|=eNi?Re)8t-boNHwpA)AIJFQ7^NL8?v+0 z4pTu&>od)39Zd1@ml~#+$RtxOdlROa$V5{m=#z*(mP|BVh3UVG18^DI5K>tFN@kPU zBsP&<&Mt#1o{eK;*l6|z_V;i-%|@|Lun}z709=NaLmE!hK>n6BuPyDGS2aw3@>9{* zsE+VX7yd{&t>66<$ov(MexheBryABupn|lIo3yR)twwA^cmJ)Q^6q`46Z}M{%`d1T zT70sg>dJs!-Ba5I3!2xwrAza!;Wlhmv~+v+Qfm8Tw(X5mx#`=;2yF4~(p+4#Y3a9R z1X#P}6vms<;nR$RemQ+_E=8?|}rYfD=ZVo{=t&XlDgNpeFtM_i&ge$mBO!QVV z9#$;f{>G+F6{omOvbB*#DlEs_R%e6n_ALanXeA6@KmxZ(zNP5fwcHw6rZTS*Guu{c z*UENc+_r{UG!5YBbZ~u}2aj~iN-SHsXpuIuRf#PTcy zR}9nByV}pVCv(-+)nvk&M|D<4chXhYf^q1sU7A{nLZ6qcF3&7NS7v4`1zu?Gh1GOQFN6t8?0zdahL zeG;#HC5v5&#akKuDkdczh%wWkl9-gQ`bSlh@>QyEmAdaYI8nkQdhF_uB3gbD^SFSRdq?O%3)^7Y-0rLLv8wDVHeQdsI*slI2Y3U!mZr8_P?INgLtMxB%1^JRR zID=KLjbwrAwZ=whf8h;+xWNL~lJF8(;0n+71+My3t^?fax>LETK;^2s9hGaN1?h(1 z|5|-}%QJ(P2Tf1xiqxbla=Ic>xn62t;M%_}Pbyy~m8(hRDwPMR8&s~|MCIy$@pf-- zAD`_QJAhh|2RR>wFF}CHbvk(a9E$Mad}Z75bTZjyMPXlGfBzt=RP~YL2wz{$AI;=J z=1>IZj{}ec1$||&MEG+7%ybIMef=XMxBxtz_?qKG{)Zw00=Vh2AcsScxd?JWjKd+& zGdghKrwzh05m15xG!AGcRk=F!jgF15gQ#3HwP8%ApmGi4o>wdg6IHHZ&p$6!xdPau z$~CN$$`xR#%9Vhk%9YVkxdJ3nxw=7NGrLi_J};kE4UbQhyp5C-bq!i4zdyE3#rO=1o%=-*$Bp3>YyrDI}s;3IBNuf zq>_ERZcw=%-@$EVb{wZF*P@*}^A6?Y?A)4FL{zRtTl2ooxr8s}YPIEc3JWw|0Fza(*f_XDGrH=(Gtg$)HMg`QT6@0mh94sc{MA<|zOe4Sd+_Q9bJ$T3a+*aM|&$*5g#; zy3x+X){c6a9d{Zz(rzP_BfCD+xb}&h-L8E0VLVp&BkLc3gf)rhVVMP4XmN)97S<}B zV2{G}DV^_ok9}tVuG`_WuEv$$a*(WbCCgxV?IT%bdAG0IDT#4$#B#R^Ykb8OzG9iL zQQe?88+^NO<7m2HLW>&LR$&!!#}<}kQPtG}yA0$nXk0fc6dS3=^>c;SWX0!X05+RB z_SFS;GpWXPk75BXbx`b~8rKIVyb9lZcJO5e8rO|>0Sf?fP;8_c*Q<7%mpKG=7;bx& z3@YZ)!vh=~V2cF@#x|M^ho==@V;vk$zsfnt9#DKvG_Es;PX=GF2?Qf^g~1C*;2h)= zKHu{IH%#WhYy=JK%;DMxWI>>D9mdEU0k$0qu00#!F_Zy~tE)_=RWvgQy!xv5>py+# z^%|;jQVVmHyaK9LfXEsRbi4+1Q!r1-12^ds5#HTJH^na%>;nx|Z{@vBeJh!xFBbSiTGNb|PcQHhedG(#ze2@`_q!iIT9B0|9NQ28! zJ?sHy%+1H@Ep0>n?+qI6joP?3sDKg6fOduu4QFV(?KYf{Mz3wUFYE87jMmha1@3?2eUV-(P*8&8Bv(*FK-T3*2Cru7u0RY%uzVfCFi0F_ zdY@f~Dn8-v$i5vM2NeAx_GGBcQkf+!)*y;HRbU zR(NXx7UT1&@ulN)xgGkt#=($dDO70_zJ?lsb}i7+25*k$Pu_(7UqBpMi7z~_!LtqG z5c*1Vo~#bU`*+RJc#IZkBwTHTT1Th>xWYf{U^7#Fw=^6dlTXF?+`Ef`fe$4>MKkc> z7I38V&HM17dVXp_u&)}_jJl(v6Ry``cz{2?4K3&WQVs(?!b~;NCmb+LvhEkTx=+f{ z3M0rhVPp}z>% literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..0bbf3bc0c0e5e635553e8d1bf9ceddefbc402396 GIT binary patch literal 2673 zcmchY_gj;P7RTSb83YJ1>=8y5ONL=ZcEgk+C?FydumNNz8c=c6`n&|fmMu_HHG%^w zNLVjHyfy)hAgHK_Kxkz+0Ktm5M|X*?y?g!o_3yv`{_^F^wY9YuFJ3GxEUd1s-nnz<)vH(c?%i8n zUVirM+2rIT007UQKY#e};oRKZty{MqJa}MhYina;bNBAu-+udTYHDhBcJ|n@WA*j* z-+lL;iHS*OX6D|#dm|zu!o$ON?b=mbT)bh!26uP&kdP1u2Zx!N8486$B9X?&$DclZ zdgI28>FMdk#l`#g@Bj4EPc=0)2M!!4EG!%z9?s6rzI5r**|TSdhK8)HtXf)HHgDc+ zZEek9Fk)k4xm@nHZQC3j9o^jACMG6~jg9m3^EYnX2*Yq^XJ>6~?X_#y4jnqQbLUQp zM6z$+zMp^o*}}p?p-?n8H=jOzx~Zv&N~Km+RkgLX9X@>c=FOXxm6dsUd1NvZ zX=yul?BMZua=F~p)O7py?EwJ+w{PD*dGh2hzx?v((WCP6au$mb!vmnqSpF6-9Ona(JQT#e>!KODwxYzG5#S|?M#v6eD#mgO^`=~9EL;yL&>*dd5*+XG=_`^3=CG25PbLa+LJ%N(PW_s z=_-TaM{SB!w(n7k+dMDN2G6VPqUA$u7F4m@ABAZ1D`*UMfe}E6csJU}J1Trmp#~7hZ5QSGpNvd1Uz$!Rf3q28pgSj9o zx?zwoWa8GYK@TOz^)mp#V2_VR5WfJ0W9BSSbn+cKb z7B9l9)K#s!?PSt;g%c8u;y7rd?hkP%>vq5BY=N>c=98V=+T&RSPgSu|E(FAK>B?vNN1 zPszwcbxJ?Oh|1pGd!9?gxzSWOR8o=x5!rGh+6r3hBL-14aTaAQxvJ|Y-S_m4niV2S zK@?}-9Dkhg<+w{Ny!vjyp-QmjyGmIW1DFB{k>P2=8cm~9M^_P#8?JFDumGEPaqJvf zZ{f;B#CG;H7q8a_hQ$pR6%%6So8vKM+W+cNPE_TI46^dn9q@qBr@1bUgxcPGB*b-i z3Hx_0(Esy5KKx^Y0yfgB6~}t>@!ctk>J|!vgVRhE2CPQ;AOKY2y%5nM@YF^ZMS~q}%L-n>Lpor#4w48UHYViOt={{43LMRvkIp+rkbs*s; z14}4q0y6`s8DL?uo-~*R@5tnFsC1DR#BGxT8fA20u_o?`0iDNI6lf;^$@AkR1dPTz z>XF1ZAqNjU95c@Vn59Wo;Z6b(YG+L$xy3(?j2I*vQ>PmzMEdh`yw3=)E}JYMDG|*x mDkGVJ;D)fXhxDI?kcM(ish)HppA z|KIKZ;^O4y=I80^>g(+6?eFj4?f>KM|K#xh=JEgV@$vHV^!4@i_V)Mp`T6?#`uqF) z|Ns900000000000A^8LW0012TEC2ui01^PWA^-*cU?+}bX_CaLu56dKMJ&&8S!{T& z;{|zVyNyP}^JR`lOa_A)YI>srb4tZrE>Kb7GQE1e*-pV?37F63OQkSyi7OQ}8g7Hw z?~lsk9xgl_4}pS%eGZ0)h<|+zjE#07FJR?dF`%c< zpFK+qpg^>!QKD@|3_Z#;sfeKxh(@I_HLBAN1EOlxI-%=?t63$8l@MX*~B&;C>oFt6t5zwd>cgW6PdRySDAyxO3~?&AYen-@t4~RHm#vzLM@W_}AL{iC_m#oNQiEOs%=9_TFDd(JY z)@kRRc;>0+o_zM{=bwNED(Iku7Ha6Bh$gD&qKr1`=%bKED(R$@R%+>`&!l*YrkioL z7*kDs3aU|HQ6-fbQX%!}R%S%y6+QGThAZy4+ZYo z#w+i<^ww+dz4+#<@4o!@>+ipGYHCUVo2WTMi!tT^V-7&P=mQQ&ED>=AJ62&akY8M3 z1sFb9aKVve^Z`K`bB$bpdj;50B?NllapfQ|2T}-_U4|J2nU9!xCM9VaT!VVD2waNL zq!2xd(V`$7iqfDk{fX0_K;4PdoKU@q)h%Gng4Qc=t%BDlfNg@ z(6$?Dr>&FRue@zH-Q?kIp5Ey34RqXq&mDN(ezR9Niie|e_uzRmzPICjL;knmloKww z;g=(xx#Ed$+PNwIi&x&b=#P^gx#^QzjymS6Yu-BNn|mHR=${W=d(pQaoqN)|FWr07 zzds#()Wc6*eAUNaoqX2IZ{2*?&wm|#*wc?)ec9KaJ-hAOY4<<2WzT>GblU+Hm_WD1rd2GO@c^>vVaA9P;`;WtA0m5_cXv|kGGw?h53kbf`qUkm}Lx*Cqo zhNZ*d>2#R78~QMZKipvudkDlL3eku}Jfael$VArh(1}BYA`+#zL@GAXbx*`%6ty@- zE>_WtSA_oE3=ud+2A0u*SrlU$1-M26o-uT7gkT&cI7bTB(SmoxU>-HNM-KMUgMS2J zAVoMx5*E^gheTl_Rk%nNHqwQUgkdCQI7u3AQH_^mV6WW)+ICLMP-(hq$71EIaRq*R<_iYFNI}HWjRw?*3_0a#br))xzll; zRHZ+)W>8JpQ(qPpm`4?6Qi-`#V>T6;LoH`iSvpmhRu!gKm1$OKx>cKY6{la-X;^tW zR-dL+sAnZ=S&h0@q_$P5Z)Iv+ojO;jrd6tUrD|TSx>v0BRjYsHYGA!OSg;mWtcN9Q zV$EvB#)8qYCS5FBCF@qo!qu{J#VlPlYgfpk)U!b4EHs}w+Paojw9+JPYE8RZ)QZ!! zaGYjrRr^}dqSdx)h3x`s``F$_7Poi>u3m-9SK|8BxPV2jV3kW)<{H+yh=s0V{-w)U z-+tD*p{4F*wOd*4Ue>#r1@C6X+ga@1*1WkT?`hTBTK4kxx9AOSe1|*V;@0=L_f2ko zm%HEQ_V>B}jc$OaJK*ZV_rTXhaCQs4T?Tj8!QX{&cqKeu3YS;G=f!Y(ExcY1x7Wk( zO|Xa;tYP_(CjI?wsTb;k3ZLmX!&_u0vRhH{{#JZLHx+RBH=I&UL)GqiUu~Lh3#l!L)zGqzO}ObjO!pzO}t?Zui^U{|0x! z#XWFx7u?(jM|Z;2y>NE(`{DkEIKU+?aEcS$;s(b!!ZogNjx*fj4v)CVCqD9um;B-< z&v?o=zVeQ@{NpbVImu^ka+;&u<|@ZI%XRK@p2OVdGOxMNZ$AF?oELrPNAG#kf4=mf z6aDE%hdR=wu5_w1-Re${y4I(@^{RLM>R-<~*T?R4vV-01VlTVe&%XAwv;FOEkNdkD zK6jAUJ?3`@dfuD9cdYk4?0-jl;M+cUxEEgT@uqv??Y?-tH(u|L=X>P+K6$`bUhtPE zeC7?mdBo3K@tA`CEx&rqw_fwF=X~rvUvJRYUi7yoeeO-ad(`({ z^}lC*@LfNA*cV^+$EW?hZNGfnH(&S9=Y8~jKYid=U-;K2e)f&OedKpv`T2H!_@O_3 z>6f4S=eK_PvA=%px1am(_kR4ruj*^pAK&+9{`?Qm|NhSRfA;^Ed;$1<1Gs6opeBO_XoC)jgW5xCC}e8x!-Fd1gDFUZr9dz+;4^8GFbeZ94C5jT zg9K(^BNXEUJQ4s^fH7XsBO6mBA2Syr10^K07I1JfOQJGT5&$dn056jzXt*U&kO*Ib z2#bI-jNkw|von@p14!sH~{iM*(bkLZh$2#k{`i=jx2qiBq!h>WMGjHyVAi^z<(2#vWYjk_p}y-1C} zh>gLhjl<}SpU92Z=#8r=j;%o+kTk2Sh?Rbpun2hnbjPuxx?0AoVh>vfi zkD*kL(dduU2$0nXj@DR^1bL7GnT-j#jSJb0{3u%wNm~sWjuFX+73qijn2#EnksR5N z7a52jIfx-yh$DH3C7Fl_d6Ko5k{jufEeVk?DUmAqj1y^)HOZ1436nV~lQC(LJ&BPn zxsyIAlt8JIL3xx$nUp+9lpy(&P05u0BI%S-36&%%l~qZVCTW#fiIpgMlU_NK-}seU z*_B{9j%8VnXL*iknT~6@j$^r!V#$?o*_Q4|m+)vgK*&Nu=uLXIO~%7&B^gp8r4;R? zDuh{>utEV7KoqEAD)U5`6W}Ula8F;6PiE07W)VG157#(#PAQe(WiIhvpo4cu$zuB9>S(L(AoWXgV#EG0w z>6^*foXa_!&uN^_IhD*Aoytj_(21SWX`Rz~mDQ=8*Xf{Y=Sh}tNt1RdkM&89_i6r*^BI=;`H%e>kpDT5ahaa(xt{VVm-M-xW~rcP$)IZK zplk`DZi%4$DWP>~p?8U)_Nk%x$)Wm5p$iJ44Jx7!N}>^Jq7zD>2dbiT>7oAVq5uk` z0vezSNuvyDqYf#fHL9aG%A+}oq8AFJ87ib3N~9fXq#w$n35ujI%A_&sq%-QH6e*=P ziK9~rr8|nHJ*uTYs-zXlrB~{uAu6ULN~R@hrYDM~DcYVZ%BC#}rd3L%IH{&VN~c3= zr$vgVM_Ng!22OwZgMC?l-E^mJx}Any0V2r?HBtt!k*V%BZ*MsJRNM zr5dKYDyqLqs=;ciwW_GY>Z`>{smW@o%ZjPZs;SS)sRrt*(Tb|os;bj!tJeyv+bXNw zN~_swtlx^OuMx|y6YH#_vvvDC`4CkwL(YqJWAvkWV<0IRbh>$4*Zv?WWk>e{PC z+pZ1Sr=|9%{_vBRF0_}&2nHL!OSV?)wP*{sZL0-VJGOEQwrX3od&{?O`?Yi1w}RUF7eEFUAToD=26qs;P;!Q(3ju2A1A%Y` zt*a$76NiQ{C3Yw#bO;GPfQLMzhlfiN0PwrO8@#_;0sx?dH~;`7P`phT1jsuA${R6C z5HZaw0svq!Q}DYOFuffB02!k(zk3DR3jmz^1-}cr;R^x3dk5)j2NrO?=nDYv8zm1A zzJdUAyfG8LhyVaJ;{f4%yNnRNx;qKlyS>6&z$H<@2AsUcy8+>=0}ZnS4a~p*U?abK z1mVjBz>C4yo4v{F1qJNE$veKm`?+M`zIG72rE9_ktTOaFzrPy@_B+4HYY4xazX0$D U{p-H~9KZ}Pzz8h7+YkZ(JNT^25dZ)H literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..471c1a4f93f2cabf0b3a85c3ff8e0a8aadefc548 GIT binary patch literal 1100 zcmZwFZA@EL90u^)S14;kcS~P51JcqXyBK7YjR|$m*3qt)1nqFnf*+(nyIT_zZIrbc zP70+hE$ePOAcE2K4FU;V;KM+=xUiQtnG(k(Qx;;(oQVNl47kM11c$9(j7iV=cuw*= z&;L26aeaM*8AVX!4nUmF3luezO5JukyN8Fbj*JY)E9#Hd|0*@ZIv{eO*Nb# z12yCIrOhLLJlbn33DTB}t(F_b2bV4~y*j=}%v9m90(t13QX1^b_==P$D+H{5*5Mu? z8gKY>BXXf^7@!+sCzFj+>XgJsqfc(1Ya(r=#J=3 zlZtj9{~(p*xA$9X2mMtN6e0bM#^36uHAhJ9Q&;+@HQ_ThCJ=yPPcaaStzMs1DHP_0 zvw_E92pgO+s83$0SnZp{u*pvQ$A3#Rftg(VD(=52XCTzUftd4T-22$PQrgIR*gHx4 z{43C_yk?5j?(i$Mual4dFf?{<9Wn}qfaB%>iNwkdu&q!m&h2IcZ$2Th!C8}<*_&Pr zyKl`OZw8N)3D^4?RK}UoD=o00gbKYHy=yv32mZ9Dl8aIS8x^Z$2?NwcBLzFmZOtoW zzN62&u*QDIz{Fy}^YAXY&Txmg7ATSAhAr8K5fZbFZ*SFa$_qE2L|VVFHOI{wKE8B_ zGXV2p-56OO`rc4Z7g3zbj)2_3YjK$((`OUqD%*mgvS`YELYsVW1or1)YW%;)D$oE>#r zQ3z|D(W$Eg`c?NY^+fD&+nctrc25@u47U__J8-QW7NqK!$T9C@*SpuaHyFRRpIGae rj_Lao#za}+eaj_<`F9!mRdtBiaY8;H + +
    +
    + +* 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 0000000000000000000000000000000000000000..8cef2abb31170a370c7062c839ea9d5e9de18948 GIT binary patch literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~d!3-ofWcl9%anc=q9T^y|-MHc(VFct$mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-$(3-AeXt*@{D|Np;u@pDC#5QQ<|d}62BjvZR2H60wE-$(3-AeX1=9cj|6h7@{#_u8sU*lR z_&>wb?FL>zp1h}vV@SoVq=W_rH;IGN~-|K;%i-0c73 z@c-iO|KRQa-|hd~QeFE1003M`L_t(|+U&?l5`sVg1i`WZK}Epr|6dhmytLs92=mel z9uoULP6;mwyM%qhIpHzkHQ|(SNO(*5TD8?y@wq9xG<+26t_AN^`$=39HtEMPCOjwP e%l`;(0R{kdKn;SADLBOd00006$Gh9E#3p9{H-P6S}q~camLV^=3&tj%#_Xa_x2_Xl57U&w-9pX85Q9;Im dv4Me^VIeE)+1pK9I)PdkJYD@<);T3K0RYcxInw|D literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..167d71eb721ba9b85c6601f9077d5c39faa4ebd2 GIT binary patch literal 185 zcmeAS@N?(olHy`uVBq!ia0vp^0zhoU!3-pmJXhxdDVB6cUq=RpYd5a=M;HP5k|nMY zCBgY=CFO}lsSJ)O`AMk?p1FzXsX?iUDV2pMQ*D5XI0Jk_Tx)0S05bpo|DSu#^)isf zToU9L{Qp10^;5h+0~ypkT^vIyZY3ooII;39W@>hC5M-JVa^Poyu7TYlo?{mkWE>b9 b7?>Frva+7N-L$0>sD;7P)z4*}Q$iB}D9ShR literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..167d71eb721ba9b85c6601f9077d5c39faa4ebd2 GIT binary patch literal 185 zcmeAS@N?(olHy`uVBq!ia0vp^0zhoU!3-pmJXhxdDVB6cUq=RpYd5a=M;HP5k|nMY zCBgY=CFO}lsSJ)O`AMk?p1FzXsX?iUDV2pMQ*D5XI0Jk_Tx)0S05bpo|DSu#^)isf zToU9L{Qp10^;5h+0~ypkT^vIyZY3ooII;39W@>hC5M-JVa^Poyu7TYlo?{mkWE>b9 b7?>Frva+7N-L$0>sD;7P)z4*}Q$iB}D9ShR literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..b33a93ff2dc2039bd24e4ea3b75ecf4bb3295f84 GIT binary patch literal 185 zcmeAS@N?(olHy`uVBq!ia0vp^0zhoU!3-pmJXhxdDVB6cUq=RpYd5a=M;HP5k|nMY zCBgY=CFO}lsSJ)O`AMk?p1FzXsX?iUDV2pMQ*D5XI0Jk_TpJo1fXx5@|JyBHuocK+ zE(!7r{{Nrh`YB$Zfeh-NE{-7;w~`VPoLG4lGc~(62r^9wIqgTe~DWM4f1sXSq literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..9be3d958c746ded4969acf34d7f86d76c3687314 GIT binary patch literal 497 zcmVAX0@tbEX_lf-Yf{5=MAjkHT4uzgdmI zVwT8Zl*V3>#8-;EVU)*XmdRX?!7^l*JaD3Am&;?8$YhtwBUOl7kHTJ&#b1%cRED}r zeXuHBkTqzV98ZEVWS3@{%zNWqssI20$4Nv%RCwBK#_1M9P!t8=ouU##rbL>|G)VLG z{%_T}mesGmz0bZEpCA1H))mLq99Pv9j;WKTM`ycr;Fe`pW^R_b$n&dq(ejI?Av#l{ z9R+b5C#*>V6etQh0H$f)#wLS)r_&bdsG+JO+<%}b%7D;dIH9naz*<@Jxn z0=kUdwQU>IXKRZ6yFm{Y3u8kuj13-*85N=^dKA&~z>^b&=dtWDOM+Kx{empZK_Cb8 nz}J19Rre7}k`%I$z5)yYWr-#SjNuqv00000NkvXXu0mjfG2YZl literal 0 HcmV?d00001 diff --git a/webdir/javascript/yui/calendar/assets/callt.gif b/webdir/javascript/yui/calendar/assets/callt.gif new file mode 100644 index 0000000000000000000000000000000000000000..a6cc8da5b221d372ea075b3a4a10211d3a23cb51 GIT binary patch literal 93 zcmZ?wbhEHb|1*Gr;!hSv1_o9J9S{$smVsF* qV%6o-OdT896eo&R8_GI9Z+s-tb-65V<*lvjzBf272=!xPum%9G>mWw} literal 0 HcmV?d00001 diff --git a/webdir/javascript/yui/calendar/assets/calrt.gif b/webdir/javascript/yui/calendar/assets/calrt.gif new file mode 100644 index 0000000000000000000000000000000000000000..ee137b2ff769d99132234b67f1e528daf65cb397 GIT binary patch literal 94 zcmZ?wbhEHb|1*Gr;!hSv1_o9J9S{$smVsG0 rV)Ip7rjCbGR9fsBH@3+N1|(QayL)o!6Ro<}FL)f+p7oi^z+epk(%c}| literal 0 HcmV?d00001 diff --git a/webdir/javascript/yui/calendar/assets/calx.gif b/webdir/javascript/yui/calendar/assets/calx.gif new file mode 100644 index 0000000000000000000000000000000000000000..27e7bc36e4524623db3c43f4d86717a703f37406 GIT binary patch literal 88 zcmZ?wbhEHb6lCCKn8?J?-rj!k;>G{}|1&T!DE?$&WME)o&;ha;K=KSsnmzrMhu-GT qE4kQMmbu}I7_0#*o**Fr literal 0 HcmV?d00001 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